From fe57465faf9591f2b33de2a9697c243b77b9ab1b Mon Sep 17 00:00:00 2001 From: Michael Lustfield Date: Wed, 25 Oct 2017 19:16:22 -0500 Subject: [PATCH] New upstream version 1.2.1+dfsg --- .drone.yml | 100 +- .drone.yml.sig | 1 - .editorconfig | 6 +- .github/issue_template.md | 17 +- .gitignore | 4 +- CHANGELOG.md | 512 +- CONTRIBUTING.md | 21 +- Dockerfile | 13 +- Dockerfile.aarch64 | 40 + Dockerfile.rpi | 13 +- MAINTAINERS | 4 + Makefile | 237 +- README.md | 10 +- README_ZH.md | 9 +- assets/logo.svg | 160 + cmd/admin.go | 56 +- cmd/dump.go | 6 + cmd/hook.go | 50 +- cmd/serv.go | 39 +- cmd/web.go | 597 +- cmd/web_graceful.go | 1 + conf/app.ini | 92 +- {scripts => contrib}/README | 0 {scripts => contrib}/autoboot.sh | 0 {scripts => contrib}/init/centos/gitea | 0 {scripts => contrib}/init/debian/gitea | 2 +- {scripts => contrib}/init/freebsd/gitea | 0 {scripts => contrib}/init/gentoo/gitea | 0 {scripts => contrib}/init/openbsd/gitea | 0 {scripts => contrib}/init/suse/gitea | 0 .../launchd/io.gitea.web.plist | 0 {scripts => contrib}/migrate/gogs_migrate.sh | 0 {scripts => contrib}/mysql.sql | 0 {scripts => contrib}/supervisor/gitea | 0 {scripts => contrib}/systemd/gitea.service | 0 .../windows/install-as-service.bat | 0 docker/etc/templates/app.ini | 2 +- integrations/api_branch_test.go | 44 + integrations/api_comment_test.go | 125 + integrations/api_fork_test.go | 18 + integrations/api_issue_label_test.go | 62 + integrations/api_issue_test.go | 63 + integrations/api_keys_test.go | 39 + integrations/api_pull_test.go | 30 + integrations/api_repo_test.go | 94 + integrations/api_team_test.go | 31 + integrations/bare_repo_test.go | 28 + integrations/change_default_branch_test.go | 38 + integrations/delete_user_test.go | 27 + integrations/editor_test.go | 154 + integrations/explore_repos_test.go | 17 + .../gitea-repositories/user2/repo1.git/HEAD | 1 + .../gitea-repositories/user2/repo1.git/config | 4 + .../user2/repo1.git/description | 1 + .../repo1.git/hooks/applypatch-msg.sample | 15 + .../user2/repo1.git/hooks/commit-msg.sample | 24 + .../user2/repo1.git/hooks/post-receive | 7 + .../repo1.git/hooks/post-receive.d/gitea | 2 + .../user2/repo1.git/hooks/post-update.sample | 8 + .../repo1.git/hooks/pre-applypatch.sample | 14 + .../user2/repo1.git/hooks/pre-commit.sample | 49 + .../user2/repo1.git/hooks/pre-push.sample | 53 + .../user2/repo1.git/hooks/pre-rebase.sample | 169 + .../user2/repo1.git/hooks/pre-receive | 7 + .../user2/repo1.git/hooks/pre-receive.d/gitea | 2 + .../repo1.git/hooks/prepare-commit-msg.sample | 36 + .../user2/repo1.git/hooks/update | 7 + .../user2/repo1.git/hooks/update.d/gitea | 2 + .../user2/repo1.git/hooks/update.sample | 128 + .../user2/repo1.git/info/exclude | 6 + .../user2/repo1.git/info/refs | 1 + .../2a/2f1d4670728a2e10049e345bd7a276468beab6 | Bin 0 -> 54 bytes .../4b/4851ad51df6a7d9f25c979345979eaeb5b349f | Bin 0 -> 42 bytes .../65/f1bf27bc3bf70f64657658635e66094edbcb4d | Bin 0 -> 150 bytes .../user2/repo1.git/objects/info/packs | 1 + .../user2/repo1.git/refs/heads/DefaultBranch | 1 + .../user2/repo1.git/refs/heads/develop | 1 + .../user2/repo1.git/refs/heads/feature/1 | 1 + .../user2/repo1.git/refs/heads/master | 1 + .../gitea-repositories/user2/repo15.git/HEAD | 1 + .../user2/repo15.git/config | 4 + .../user2/repo15.git/description | 1 + .../repo15.git/hooks/applypatch-msg.sample | 15 + .../user2/repo15.git/hooks/commit-msg.sample | 24 + .../user2/repo15.git/hooks/post-receive | 7 + .../repo15.git/hooks/post-receive.d/gitea | 2 + .../user2/repo15.git/hooks/post-update.sample | 8 + .../repo15.git/hooks/pre-applypatch.sample | 14 + .../user2/repo15.git/hooks/pre-commit.sample | 49 + .../user2/repo15.git/hooks/pre-push.sample | 53 + .../user2/repo15.git/hooks/pre-rebase.sample | 169 + .../user2/repo15.git/hooks/pre-receive | 7 + .../repo15.git/hooks/pre-receive.d/gitea | 2 + .../hooks/prepare-commit-msg.sample | 36 + .../user2/repo15.git/hooks/update | 7 + .../user2/repo15.git/hooks/update.d/gitea | 2 + .../user2/repo15.git/hooks/update.sample | 128 + .../user2/repo15.git/info/exclude | 6 + .../gitea-repositories/user3/repo3.git/HEAD | 1 + .../gitea-repositories/user3/repo3.git/config | 6 + .../user3/repo3.git/description | 1 + .../repo3.git/hooks/applypatch-msg.sample | 15 + .../user3/repo3.git/hooks/commit-msg.sample | 24 + .../user3/repo3.git/hooks/post-receive | 7 + .../repo3.git/hooks/post-receive.d/gitea | 2 + .../user3/repo3.git/hooks/post-update.sample | 8 + .../repo3.git/hooks/pre-applypatch.sample | 14 + .../user3/repo3.git/hooks/pre-commit.sample | 49 + .../user3/repo3.git/hooks/pre-push.sample | 53 + .../user3/repo3.git/hooks/pre-rebase.sample | 169 + .../user3/repo3.git/hooks/pre-receive | 7 + .../user3/repo3.git/hooks/pre-receive.d/gitea | 2 + .../user3/repo3.git/hooks/pre-receive.sample | 24 + .../repo3.git/hooks/prepare-commit-msg.sample | 36 + .../user3/repo3.git/hooks/update | 7 + .../user3/repo3.git/hooks/update.d/gitea | 2 + .../user3/repo3.git/hooks/update.sample | 128 + .../user3/repo3.git/info/exclude | 6 + .../20/ade30d25e0ecaeec84e7f542a8456900858240 | Bin 0 -> 84 bytes .../27/74debeea6dc742cc4971a92db0e08b95b60588 | Bin 0 -> 51 bytes .../2a/47ca4b614a9f5a43abbd5ad851a54a616ffee6 | Bin 0 -> 760 bytes .../2f/9b22fd3159a43b7b4e5dd806fcd544edf8716f | Bin 0 -> 37 bytes .../d5/6a3073c1dbb7b15963110a049d50cdb5db99fc | Bin 0 -> 42 bytes .../user3/repo3.git/refs/heads/master | 1 + integrations/html_helper.go | 42 + integrations/install_test.go | 91 - integrations/integration_test.go | 296 + integrations/internal/utils/utils.go | 125 - integrations/internal_test.go | 44 + integrations/issue_test.go | 99 + integrations/links_test.go | 130 + integrations/mysql.ini | 59 + integrations/pgsql.ini | 58 + integrations/pull_compare_test.go | 27 + integrations/pull_create_test.go | 52 + integrations/pull_merge_test.go | 93 + integrations/release_test.go | 116 + integrations/repo_commits_test.go | 89 + integrations/repo_fork_test.go | 73 + integrations/repo_migrate_test.go | 67 + integrations/repo_test.go | 76 + integrations/setting_test.go | 70 + integrations/signin_test.go | 60 + integrations/signup_test.go | 30 + integrations/sqlite.ini | 54 + integrations/user_test.go | 99 + integrations/version_test.go | 75 +- integrations/xss_test.go | 37 + main.go | 2 +- models/access.go | 24 +- models/access_test.go | 20 +- models/action.go | 248 +- models/action_test.go | 136 +- models/admin.go | 23 +- models/attachment.go | 31 +- models/attachment_test.go | 60 + models/branches.go | 38 +- .../{consistency_test.go => consistency.go} | 32 +- models/error.go | 109 + models/error_oauth2.go | 24 + models/external_login_user.go | 6 +- models/fixtures/access.yml | 6 + models/fixtures/action.yml | 11 +- models/fixtures/attachment.yml | 71 + models/fixtures/comment.yml | 14 +- models/fixtures/commit_status.yml | 54 + models/fixtures/follow.yml | 14 + models/fixtures/issue.yml | 2 +- models/fixtures/issue_watch.yml | 15 + models/fixtures/protected_branch.yml | 1 + models/fixtures/pull_request.yml | 2 +- models/fixtures/release.yml | 1 + models/fixtures/repo_unit.yml | 79 + models/fixtures/repository.yml | 7 + models/fixtures/team.yml | 4 + models/fixtures/user.yml | 67 +- models/fixtures/user_open_id.yml | 17 + models/git_diff.go | 14 +- models/git_diff_test.go | 3 +- models/gpg_key.go | 465 + models/gpg_key_test.go | 224 + models/issue.go | 264 +- models/issue_comment.go | 121 +- models/issue_comment_test.go | 41 + models/issue_indexer.go | 2 +- models/issue_label.go | 33 +- models/issue_label_test.go | 2 +- models/issue_list.go | 22 +- models/issue_list_test.go | 65 + models/issue_mail.go | 40 +- models/issue_milestone.go | 6 +- models/issue_milestone_test.go | 4 +- models/issue_test.go | 125 + models/issue_user.go | 2 +- models/issue_watch.go | 96 + models/issue_watch_test.go | 51 + models/lfs.go | 4 +- models/login_source.go | 162 +- models/mail.go | 28 +- models/main_test.go | 35 + models/migrations/migrations.go | 60 +- models/migrations/v13.go | 2 +- models/migrations/v14.go | 2 +- models/migrations/v15.go | 19 +- models/migrations/v16.go | 76 +- models/migrations/v21.go | 5 +- models/migrations/v23.go | 25 + models/migrations/v24.go | 50 + models/migrations/v25.go | 18 + models/migrations/v26.go | 87 + models/migrations/v27.go | 74 + models/migrations/v28.go | 76 + models/migrations/v29.go | 34 + models/migrations/v30.go | 38 + models/migrations/v31.go | 35 + models/migrations/v32.go | 23 + models/migrations/v33.go | 32 + models/migrations/v34.go | 25 + models/migrations/v35.go | 25 + models/migrations/v36.go | 15 + models/migrations/v37.go | 35 + models/migrations/v38.go | 70 + models/migrations/v42.go | 57 + models/migrations/v43.go | 18 + models/migrations/v44.go | 69 + models/models.go | 22 +- models/models_test.go | 50 +- models/notification.go | 42 +- models/oauth2.go | 117 + models/org.go | 48 +- models/org_team.go | 70 +- models/org_team_test.go | 8 +- models/org_test.go | 4 +- models/pull.go | 95 +- models/release.go | 131 +- models/repo.go | 226 +- models/repo_branch.go | 2 +- models/repo_collaboration.go | 6 +- models/repo_editor.go | 122 +- models/repo_list.go | 134 +- models/repo_list_test.go | 2 + models/repo_mirror.go | 26 +- models/repo_test.go | 22 + models/repo_unit.go | 17 +- models/ssh_key.go | 88 +- models/status.go | 304 + models/status_test.go | 39 + models/test_fixtures.go | 23 + models/unit.go | 106 +- models/{setup_for_test.go => unit_tests.go} | 87 +- models/update.go | 165 +- models/user.go | 310 +- models/user_follow.go | 70 + models/user_follow_test.go | 45 + models/user_mail.go | 4 +- models/user_openid.go | 124 + models/user_openid_test.go | 82 + models/user_test.go | 33 +- models/webhook.go | 31 +- models/webhook_test.go | 5 +- models/wiki.go | 10 +- modules/auth/admin.go | 2 +- modules/auth/auth.go | 3 + modules/auth/auth_form.go | 63 +- modules/auth/ldap/ldap.go | 127 +- modules/auth/oauth2/oauth2.go | 133 +- modules/auth/openid/discovery_cache.go | 58 + modules/auth/openid/discovery_cache_test.go | 48 + modules/auth/openid/openid.go | 35 + modules/auth/org.go | 11 +- modules/auth/repo_form.go | 64 +- modules/auth/user_form.go | 56 +- modules/auth/user_form_auth_openid.go | 43 + modules/base/tool.go | 112 +- modules/base/tool_test.go | 28 +- modules/context/api.go | 40 +- modules/context/context.go | 47 +- modules/context/repo.go | 206 +- modules/cron/cron.go | 11 + modules/highlight/highlight.go | 74 +- modules/httplib/httplib.go | 7 +- modules/lfs/content_store.go | 7 +- modules/lfs/server.go | 6 +- modules/log/conn.go | 4 +- modules/log/file.go | 5 +- modules/log/log.go | 62 +- modules/log/xorm.go | 2 +- modules/mailer/mailer.go | 32 +- modules/markdown/markdown.go | 191 +- modules/markdown/markdown_test.go | 161 +- modules/markdown/sanitizer.go | 9 +- modules/markup/markup.go | 83 + modules/markup/markup_test.go | 37 + modules/options/dynamic.go | 2 +- modules/options/static.go | 2 +- modules/private/branch.go | 40 + modules/private/internal.go | 70 + modules/private/push_update.go | 40 + modules/setting/setting.go | 276 +- modules/sync/exclusive_pool.go | 2 +- modules/sync/status_pool.go | 12 + modules/sync/status_pool_test.go | 9 + modules/sync/unique_queue.go | 2 +- modules/templates/helper.go | 18 + modules/test/context_tests.go | 150 + modules/util/remove.go | 14 + modules/util/remove_windows.go | 16 + modules/validation/binding.go | 102 + modules/validation/binding_test.go | 62 + modules/validation/refname_test.go | 142 + modules/validation/validurl_test.go | 111 + options/gitignore/Actionscript | 8 + options/gitignore/Android | 25 +- options/gitignore/Ansible | 1 + options/gitignore/Autotools | 19 + options/gitignore/Bazaar | 2 + options/gitignore/C | 19 + options/gitignore/C Sharp | 108 - options/gitignore/C++ | 4 + options/gitignore/CMake | 3 + options/gitignore/CVS | 2 +- options/gitignore/CakePHP | 14 +- options/gitignore/Calabash | 10 + options/gitignore/Clojure | 13 - options/gitignore/CodeIgniter | 11 + options/gitignore/CommonLisp | 14 + options/gitignore/Composer | 2 +- options/gitignore/Concrete5 | 1 + options/gitignore/Coq | 29 +- options/gitignore/D | 24 + options/gitignore/Dart | 21 +- options/gitignore/Delphi | 11 +- options/gitignore/Dreamweaver | 4 + options/gitignore/Dropbox | 4 + options/gitignore/Drupal | 2 +- options/gitignore/Eagle | 8 + options/gitignore/Eclipse | 25 +- options/gitignore/EiffelStudio | 2 +- options/gitignore/Elisp | 6 + options/gitignore/Elixir | 2 + options/gitignore/Elm | 4 + options/gitignore/Emacs | 13 + options/gitignore/Erlang | 2 +- options/gitignore/ExtJs | 8 + options/gitignore/FSharp | 114 - options/gitignore/Fortran | 0 options/gitignore/FuelPHP | 23 +- options/gitignore/GPG | 2 + options/gitignore/Go | 34 +- options/gitignore/Gradle | 8 +- options/gitignore/Haskell | 4 + options/gitignore/IPythonNotebook | 2 - options/gitignore/Java | 10 + options/gitignore/JetBrains | 38 +- options/gitignore/Joomla | 62 +- options/gitignore/Julia | 4 + options/gitignore/KiCAD | 12 +- options/gitignore/Laravel | 18 +- options/gitignore/Leiningen | 3 +- options/gitignore/Linux | 6 + options/gitignore/Magento | 142 +- options/gitignore/Matlab | 6 + options/gitignore/Maven | 3 + options/gitignore/MicrosoftOffice | 6 + options/gitignore/Nanoc | 4 +- options/gitignore/NetBeans | 2 - options/gitignore/Node | 37 +- options/gitignore/Objective-C | 32 +- options/gitignore/OpenCart | 9 + options/gitignore/Otto | 1 + options/gitignore/Perl | 39 +- options/gitignore/PlayFramework | 1 - options/gitignore/Prestashop | 13 +- options/gitignore/PureScript | 8 + options/gitignore/Python | 36 + options/gitignore/Qt | 8 +- options/gitignore/R | 17 + options/gitignore/Rails | 17 +- options/gitignore/Ruby | 16 +- options/gitignore/Rust | 17 +- options/gitignore/SBT | 3 + options/gitignore/Scala | 15 - options/gitignore/Scheme | 7 + options/gitignore/Smalltalk | 18 + options/gitignore/Stata | 24 + options/gitignore/SublimeText | 16 + options/gitignore/SugarCRM | 2 + options/gitignore/Swift | 34 +- options/gitignore/Symfony | 12 +- options/gitignore/Tags | 3 + options/gitignore/TeX | 101 +- options/gitignore/Terraform | 6 + options/gitignore/Typo3 | 2 +- options/gitignore/Umbraco | 8 +- options/gitignore/Unity | 15 +- options/gitignore/UnrealEngine | 70 + options/gitignore/Vim | 12 +- options/gitignore/VirtualEnv | 2 + options/gitignore/VisualStudio | 84 +- options/gitignore/VisualStudioCode | 7 +- options/gitignore/Waf | 12 +- options/gitignore/Windows | 3 +- options/gitignore/WordPress | 8 +- options/gitignore/Xcode | 8 +- options/gitignore/XilinxISE | 10 + options/gitignore/ZendFramework | 5 + options/gitignore/{OSX => macOS} | 50 +- options/license/0BSD | 5 + options/license/AAL | 23 + options/license/ADSL | 1 + .../{Academic Free License v1.1 => AFL-1.1} | 19 +- .../{Academic Free License v1.2 => AFL-1.2} | 9 +- options/license/AFL-2.0 | 45 + options/license/AFL-2.1 | 45 + .../{Academic Free License v3.0 => AFL-3.0} | 43 +- ...o General Public License v1.0 => AGPL-1.0} | 22 +- options/license/AGPL-3.0 | 235 + options/license/AMDPLPA | 19 + options/license/AML | 9 + options/license/AMPAS | 13 + options/license/ANTLR-PD | 5 + options/license/APAFML | 3 + options/license/APL-1.0 | 295 + options/license/APSL-1.0 | 109 + options/license/APSL-1.1 | 108 + options/license/APSL-1.2 | 103 + options/license/APSL-2.0 | 102 + .../license/{Abstyles License => Abstyles} | 9 +- options/license/Adobe-2006 | 12 + options/license/Adobe-Glyph | 10 + options/license/Afmparse | 10 + options/license/Aladdin | 62 + options/license/Apache License 1.0 | 19 - options/license/Apache License 1.1 | 20 - options/license/Apache-1.0 | 20 + options/license/Apache-1.1 | 21 + .../{Apache License 2.0 => Apache-2.0} | 31 +- options/license/Artistic License 1.0 | 48 - options/license/Artistic License 2.0 | 84 - options/license/Artistic-1.0 | 49 + options/license/Artistic-1.0-Perl | 51 + options/license/Artistic-1.0-cl8 | 51 + options/license/Artistic-2.0 | 85 + options/license/BSD 2-clause License | 8 - options/license/BSD 4-clause License | 13 - options/license/BSD-2-Clause | 9 + options/license/BSD-2-Clause-FreeBSD | 13 + options/license/BSD-2-Clause-NetBSD | 11 + options/license/BSD-3-Clause | 11 + ...lause License => BSD-3-Clause-Attribution} | 11 +- options/license/BSD-3-Clause-Clear | 14 + options/license/BSD-3-Clause-LBNL | 12 + .../license/BSD-3-Clause-No-Nuclear-License | 14 + .../BSD-3-Clause-No-Nuclear-License-2014 | 16 + .../license/BSD-3-Clause-No-Nuclear-Warranty | 14 + options/license/BSD-4-Clause | 14 + options/license/BSD-4-Clause-UC | 1 + options/license/BSD-Protection | 53 + options/license/BSD-Source-Code | 10 + options/license/BSL-1.0 | 7 + options/license/Bahyph | 11 + options/license/Barr | 1 + options/license/Beerware | 1 + options/license/BitTorrent-1.0 | 140 + options/license/BitTorrent-1.1 | 137 + options/license/Borceux | 19 + options/license/CATOSL-1.1 | 114 + options/license/CC-BY-1.0 | 80 + options/license/CC-BY-2.0 | 81 + options/license/CC-BY-3.0 | 93 + options/license/CC-BY-4.0 | 154 + options/license/CC-BY-NC-1.0 | 75 + options/license/CC-BY-NC-2.0 | 81 + options/license/CC-BY-NC-3.0 | 95 + options/license/CC-BY-NC-4.0 | 156 + options/license/CC-BY-NC-ND-1.0 | 75 + options/license/CC-BY-NC-ND-2.0 | 77 + options/license/CC-BY-NC-ND-3.0 | 89 + options/license/CC-BY-NC-ND-4.0 | 153 + options/license/CC-BY-NC-SA-1.0 | 83 + options/license/CC-BY-NC-SA-2.0 | 87 + options/license/CC-BY-NC-SA-3.0 | 99 + options/license/CC-BY-NC-SA-4.0 | 168 + options/license/CC-BY-ND-1.0 | 73 + options/license/CC-BY-ND-2.0 | 75 + options/license/CC-BY-ND-3.0 | 87 + options/license/CC-BY-ND-4.0 | 152 + options/license/CC-BY-SA-1.0 | 81 + options/license/CC-BY-SA-2.0 | 85 + options/license/CC-BY-SA-3.0 | 99 + options/license/CC-BY-SA-4.0 | 168 + ...tive Commons CC0 1.0 Universal => CC0-1.0} | 26 +- options/license/CDDL-1.0 | 119 + options/license/CDDL-1.1 | 123 + options/license/CECILL-1.0 | 216 + options/license/CECILL-1.1 | 229 + options/license/CECILL-2.0 | 241 + options/license/CECILL-2.1 | 249 + options/license/CECILL-B | 245 + options/license/CECILL-C | 239 + options/license/CNRI-Jython | 10 + options/license/CNRI-Python | 25 + options/license/CNRI-Python-GPL-Compatible | 23 + options/license/CPAL-1.0 | 172 + options/license/CPL-1.0 | 87 + options/license/CPOL-1.02 | 98 + ...Mozilla Public License 1.1 => CUA-OPL-1.0} | 89 +- options/license/Caldera | 25 + options/license/ClArtistic | 61 + options/license/Condor-1.1 | 39 + options/license/Crossword | 5 + options/license/CrystalStacker | 7 + options/license/Cube | 17 + options/license/D-FSL-1.0 | 147 + options/license/DOC | 16 + options/license/DSDP | 18 + options/license/Dotseqn | 5 + ...ational Community License v1.0 => ECL-1.0} | 17 +- ...ational Community License v2.0 => ECL-2.0} | 47 +- options/license/EFL-1.0 | 13 + options/license/EFL-2.0 | 9 + .../{Eclipse Public License 1.0 => EPL-1.0} | 51 +- options/license/EUDatagrid | 24 + options/license/EUPL-1.0 | 154 + options/license/EUPL-1.1 | 157 + options/license/Entessa | 22 + options/license/ErlPL-1.1 | 93 + options/license/Eurosym | 18 + options/license/FSFAP | 1 + options/license/FSFUL | 3 + options/license/FSFULLR | 3 + options/license/FTL | 79 + options/license/Fair | 9 + options/license/Frameworx-1.0 | 69 + options/license/FreeImage | 117 + ...ee Documentation License v1.1 => GFDL-1.1} | 59 +- ...ee Documentation License v1.2 => GFDL-1.2} | 65 +- ...ee Documentation License v1.3 => GFDL-1.3} | 59 +- options/license/GL2PS | 13 + .../GNU Affero General Public License v3.0 | 241 - .../license/GNU General Public License v3.0 | 231 - ...NU General Public License v1.0 => GPL-1.0} | 33 +- ...NU General Public License v2.0 => GPL-2.0} | 33 +- options/license/GPL-3.0 | 15 + options/license/Giftware | 9 + options/license/Glide | 95 + options/license/Glulxe | 3 + options/license/HPND | 7 + options/license/HaskellReport | 6 + options/license/IBM-pibs | 8 + options/license/ICU | 12 + options/license/IJG | 38 + options/license/IPA | 83 + options/license/IPL-1.0 | 215 + options/license/{ISC license => ISC} | 6 +- options/license/ImageMagick | 98 + options/license/Imlib2 | 9 + options/license/Info-ZIP | 16 + options/license/Intel | 13 + options/license/Intel-ACPI | 34 + options/license/Interbase-1.0 | 199 + options/license/JSON | 11 + options/license/JasPer-2.0 | 17 + options/license/LAL-1.2 | 67 + options/license/LAL-1.3 | 88 + ...y General Public License v2.0 => LGPL-2.0} | 51 +- ...r General Public License v2.1 => LGPL-2.1} | 51 +- ...r General Public License v3.0 => LGPL-3.0} | 51 +- options/license/LGPLLR | 89 + options/license/LPL-1.0 | 81 + options/license/LPL-1.02 | 85 + options/license/LPPL-1.0 | 103 + options/license/LPPL-1.1 | 141 + options/license/LPPL-1.2 | 140 + options/license/LPPL-1.3a | 176 + options/license/LPPL-1.3c | 184 + options/license/Latex2e | 9 + options/license/Leptonica | 10 + options/license/LiLiQ-P-1.1 | 70 + options/license/LiLiQ-R-1.1 | 94 + options/license/LiLiQ-Rplus-1.1 | 88 + options/license/Libpng | 76 + options/license/{MIT License => MIT} | 3 +- options/license/MIT-CMU | 9 + options/license/MIT-advertising | 7 + options/license/MIT-enna | 9 + options/license/MIT-feh | 5 + options/license/MITNFA | 7 + options/license/MPL-1.0 | 123 + options/license/MPL-1.1 | 143 + options/license/MPL-2.0 | 144 + options/license/MPL-2.0-no-copyleft-exception | 144 + options/license/MS-PL | 22 + options/license/MS-RL | 30 + options/license/MTLL | 24 + options/license/MakeIndex | 19 + options/license/MirOS | 28 + options/license/Motosoto | 110 + options/license/Mozilla Public License 1.0 | 122 - options/license/Mozilla Public License 2.0 | 143 - options/license/Multics | 13 + options/license/Mup | 13 + options/license/NASA-1.3 | 85 + options/license/NBPL-1.0 | 59 + options/license/NCSA | 15 + options/license/NGPL | 39 + options/license/NLOD-1.0 | 80 + options/license/NLPL | 14 + options/license/NOSL | 151 + options/license/NPL-1.0 | 99 + options/license/NPL-1.1 | 176 + options/license/NPOSL-3.0 | 59 + options/license/NRL | 28 + options/license/NTP | 5 + options/license/Naumen | 21 + options/license/Net-SNMP | 107 + options/license/NetCDF | 7 + options/license/Newsletr | 7 + options/license/Nokia | 159 + options/license/Noweb | 9 + options/license/Nunit | 14 + options/license/OCCT-PL | 112 + options/license/OCLC-2.0 | 76 + options/license/ODbL-1.0 | 243 + options/license/OFL-1.0 | 49 + options/license/OFL-1.1 | 43 + options/license/OGTSL | 55 + options/license/OLDAP-1.1 | 61 + options/license/OLDAP-1.2 | 61 + options/license/OLDAP-1.3 | 63 + options/license/OLDAP-1.4 | 63 + options/license/OLDAP-2.0 | 19 + options/license/OLDAP-2.0.1 | 19 + options/license/OLDAP-2.1 | 21 + options/license/OLDAP-2.2 | 23 + options/license/OLDAP-2.2.1 | 23 + options/license/OLDAP-2.2.2 | 25 + options/license/OLDAP-2.3 | 25 + options/license/OLDAP-2.4 | 23 + options/license/OLDAP-2.7 | 20 + options/license/OML | 5 + options/license/OPL-1.0 | 136 + options/license/OSET-PL-2.1 | 138 + options/license/OSL-1.0 | 45 + options/license/OSL-1.1 | 47 + .../{Academic Free License v2.0 => OSL-2.0} | 32 +- .../{Academic Free License v2.1 => OSL-2.1} | 31 +- options/license/OSL-3.0 | 47 + options/license/OpenSSL | 49 + options/license/PDDL-1.0 | 136 + options/license/PHP-3.0 | 28 + options/license/PHP-3.01 | 27 + options/license/Plexus | 15 + options/license/PostgreSQL | 12 + options/license/Python-2.0 | 72 + options/license/QPL-1.0 | 50 + options/license/Qhull | 17 + options/license/RHeCos-1.1 | 137 + options/license/RPL-1.1 | 177 + options/license/RPSL-1.0 | 179 + options/license/RSA-MD | 9 + options/license/RSCPL | 128 + options/license/Rdisc | 13 + options/license/Ruby | 29 + options/license/SAX-PD | 31 + options/license/SCEA | 60 + options/license/SGI-B-1.0 | 82 + options/license/SGI-B-1.1 | 84 + options/license/SGI-B-2.0 | 13 + options/license/SISSL | 116 + options/license/SISSL-1.2 | 115 + options/license/SMLNJ | 7 + options/license/SMPPL | 29 + options/license/SNIA | 122 + options/license/SPL-1.0 | 149 + options/license/SWL | 7 + options/license/Saxpath | 19 + options/license/Sendmail | 36 + options/license/SimPL-2.0 | 37 + options/license/Sleepycat | 37 + options/license/Spencer-86 | 11 + options/license/Spencer-94 | 12 + options/license/Spencer-99 | 9 + options/license/SugarCRM-1.1.3 | 149 + options/license/TCL | 9 + options/license/TCP-wrappers | 7 + options/license/TMate | 21 + options/license/TORQUE-1.1 | 25 + options/license/TOSL | 9 + options/license/UPL-1.0 | 19 + options/license/Unicode-DFS-2015 | 19 + options/license/Unicode-DFS-2016 | 22 + options/license/Unicode-TOU | 51 + options/license/Unlicense | 10 + options/license/Updating the SPDX Licenses | 29 + options/license/VOSTROM | 27 + options/license/VSL-1.0 | 18 + options/license/Vim | 30 + options/license/W3C | 29 + options/license/W3C-19980720 | 23 + options/license/W3C-20150513 | 17 + options/license/WTFPL | 11 + options/license/Watcom-1.0 | 106 + options/license/Wsuipa | 5 + options/license/X11 | 13 + options/license/XFree86-1.1 | 16 + options/license/XSkat | 10 + options/license/Xerox | 5 + options/license/Xnet | 11 + options/license/YPL-1.0 | 47 + options/license/YPL-1.1 | 47 + options/license/ZPL-1.1 | 33 + options/license/ZPL-2.0 | 23 + options/license/ZPL-2.1 | 21 + options/license/Zed | 3 + options/license/Zend-2.0 | 18 + options/license/Zimbra-1.3 | 47 + options/license/Zimbra-1.4 | 47 + options/license/Zlib | 11 + options/license/curl | 10 + options/license/diffmark | 2 + options/license/dvipdfm | 1 + options/license/eGenix | 40 + options/license/gSOAP-1.3b | 148 + options/license/gnuplot | 14 + options/license/iMatix | 39 + options/license/libtiff | 8 + options/license/mpich2 | 18 + options/license/psfrag | 5 + options/license/psutils | 29 + options/license/xinetd | 25 + options/license/xpp | 21 + options/license/zlib-acknowledgement | 15 + options/locale/locale_bg-BG.ini | 237 +- options/locale/locale_cs-CZ.ini | 239 +- options/locale/locale_de-DE.ini | 495 +- options/locale/locale_en-US.ini | 518 +- options/locale/locale_es-ES.ini | 299 +- options/locale/locale_fi-FI.ini | 239 +- options/locale/locale_fr-FR.ini | 489 +- options/locale/locale_hu-HU.ini | 1446 + options/locale/locale_it-IT.ini | 217 +- options/locale/locale_ja-JP.ini | 209 +- options/locale/locale_ko-KR.ini | 237 +- options/locale/locale_lt-LT.ini | 344 + options/locale/locale_lv-LV.ini | 603 +- options/locale/locale_nb-NO.ini | 156 + options/locale/locale_nl-NL.ini | 472 +- options/locale/locale_pl-PL.ini | 237 +- options/locale/locale_pt-BR.ini | 427 +- options/locale/locale_ru-RU.ini | 298 +- options/locale/locale_sr-SP.ini | 237 +- options/locale/locale_sv-SE.ini | 443 +- options/locale/locale_tr-TR.ini | 235 +- options/locale/locale_zh-CN.ini | 427 +- options/locale/locale_zh-HK.ini | 245 +- options/locale/locale_zh-TW.ini | 570 +- .../css/font-awesome.min.css | 4 - .../font-awesome-4.6.3/fonts/FontAwesome.otf | Bin 124988 -> 0 bytes .../fonts/fontawesome-webfont.eot | Bin 76518 -> 0 bytes .../fonts/fontawesome-webfont.svg | 685 - .../fonts/fontawesome-webfont.ttf | Bin 152796 -> 0 bytes .../fonts/fontawesome-webfont.woff | Bin 90412 -> 0 bytes .../fonts/fontawesome-webfont.woff2 | Bin 71896 -> 0 bytes public/assets/octicons-4.3.0/octicons.eot | Bin 44098 -> 0 bytes public/assets/octicons-4.3.0/octicons.min.css | 1 - public/assets/octicons-4.3.0/octicons.svg | 429 - public/assets/octicons-4.3.0/octicons.ttf | Bin 43920 -> 0 bytes public/assets/octicons-4.3.0/octicons.woff | Bin 24004 -> 0 bytes public/assets/octicons-4.3.0/octicons.woff2 | Bin 20248 -> 0 bytes public/css/gitgraph.css | 16 - public/css/github.min.css | 1 - public/css/index.css | 306 +- public/css/semantic-2.2.1.min.css | 11 - .../css/themes/basic/assets/fonts/icons.eot | Bin 40166 -> 0 bytes .../css/themes/basic/assets/fonts/icons.svg | 450 - .../css/themes/basic/assets/fonts/icons.ttf | Bin 39924 -> 0 bytes .../css/themes/basic/assets/fonts/icons.woff | Bin 24676 -> 0 bytes .../css/themes/default/assets/fonts/icons.eot | Bin 76518 -> 0 bytes .../css/themes/default/assets/fonts/icons.otf | Bin 93888 -> 0 bytes .../css/themes/default/assets/fonts/icons.svg | 685 - .../css/themes/default/assets/fonts/icons.ttf | Bin 152796 -> 0 bytes .../themes/default/assets/fonts/icons.woff | Bin 90412 -> 0 bytes .../themes/default/assets/fonts/icons.woff2 | Bin 71896 -> 0 bytes .../themes/default/assets/images/flags.png | Bin 28123 -> 0 bytes public/img/404.png | Bin 4583 -> 4516 bytes public/img/500.png | Bin 5276 -> 5230 bytes public/img/auth/bitbucket.png | Bin 0 -> 2161 bytes public/img/auth/dropbox.png | Bin 0 -> 1427 bytes public/img/auth/facebook.png | Bin 0 -> 2327 bytes public/img/{ => auth}/github.png | Bin public/img/auth/gitlab.png | Bin 0 -> 3616 bytes public/img/auth/google_plus.png | Bin 0 -> 4366 bytes public/img/auth/openid_connect.png | Bin 0 -> 12921 bytes public/img/auth/twitter.png | Bin 0 -> 3110 bytes public/img/avatar_default.png | Bin 35142 -> 9080 bytes public/img/emoji/+1.png | Bin 2900 -> 0 bytes public/img/emoji/-1.png | Bin 5070 -> 0 bytes public/img/emoji/100.png | Bin 2630 -> 0 bytes public/img/emoji/1234.png | Bin 2698 -> 0 bytes public/img/emoji/8ball.png | Bin 3219 -> 0 bytes public/img/emoji/a.png | Bin 2374 -> 0 bytes public/img/emoji/ab.png | Bin 2630 -> 0 bytes public/img/emoji/abc.png | Bin 2550 -> 0 bytes public/img/emoji/abcd.png | Bin 2670 -> 0 bytes public/img/emoji/accept.png | Bin 2681 -> 0 bytes public/img/emoji/aerial_tramway.png | Bin 2166 -> 0 bytes public/img/emoji/airplane.png | Bin 2529 -> 0 bytes public/img/emoji/alarm_clock.png | Bin 3383 -> 0 bytes public/img/emoji/alien.png | Bin 3115 -> 0 bytes public/img/emoji/ambulance.png | Bin 2512 -> 0 bytes public/img/emoji/anchor.png | Bin 2414 -> 0 bytes public/img/emoji/angel.png | Bin 3034 -> 0 bytes public/img/emoji/anger.png | Bin 2494 -> 0 bytes public/img/emoji/angry.png | Bin 2945 -> 0 bytes public/img/emoji/anguished.png | Bin 2931 -> 0 bytes public/img/emoji/ant.png | Bin 2154 -> 0 bytes public/img/emoji/apple.png | Bin 3281 -> 0 bytes public/img/emoji/aquarius.png | Bin 2831 -> 0 bytes public/img/emoji/aries.png | Bin 2729 -> 0 bytes public/img/emoji/arrow_backward.png | Bin 2213 -> 0 bytes public/img/emoji/arrow_double_down.png | Bin 2207 -> 0 bytes public/img/emoji/arrow_double_up.png | Bin 2339 -> 0 bytes public/img/emoji/arrow_down.png | Bin 2236 -> 0 bytes public/img/emoji/arrow_down_small.png | Bin 2172 -> 0 bytes public/img/emoji/arrow_forward.png | Bin 2216 -> 0 bytes public/img/emoji/arrow_heading_down.png | Bin 2305 -> 0 bytes public/img/emoji/arrow_heading_up.png | Bin 2335 -> 0 bytes public/img/emoji/arrow_left.png | Bin 2177 -> 0 bytes public/img/emoji/arrow_lower_left.png | Bin 2287 -> 0 bytes public/img/emoji/arrow_lower_right.png | Bin 2293 -> 0 bytes public/img/emoji/arrow_right.png | Bin 2169 -> 0 bytes public/img/emoji/arrow_right_hook.png | Bin 2355 -> 0 bytes public/img/emoji/arrow_up.png | Bin 2214 -> 0 bytes public/img/emoji/arrow_up_down.png | Bin 2362 -> 0 bytes public/img/emoji/arrow_up_small.png | Bin 2248 -> 0 bytes public/img/emoji/arrow_upper_left.png | Bin 2278 -> 0 bytes public/img/emoji/arrow_upper_right.png | Bin 2273 -> 0 bytes public/img/emoji/arrows_clockwise.png | Bin 1399 -> 0 bytes public/img/emoji/arrows_counterclockwise.png | Bin 2676 -> 0 bytes public/img/emoji/art.png | Bin 3033 -> 0 bytes public/img/emoji/articulated_lorry.png | Bin 2178 -> 0 bytes public/img/emoji/astonished.png | Bin 3121 -> 0 bytes public/img/emoji/atm.png | Bin 2337 -> 0 bytes public/img/emoji/b.png | Bin 2426 -> 0 bytes public/img/emoji/baby.png | Bin 2878 -> 0 bytes public/img/emoji/baby_bottle.png | Bin 2353 -> 0 bytes public/img/emoji/baby_chick.png | Bin 2459 -> 0 bytes public/img/emoji/baby_symbol.png | Bin 2178 -> 0 bytes public/img/emoji/back.png | Bin 2449 -> 0 bytes public/img/emoji/baggage_claim.png | Bin 2324 -> 0 bytes public/img/emoji/balloon.png | Bin 1933 -> 0 bytes public/img/emoji/ballot_box_with_check.png | Bin 1829 -> 0 bytes public/img/emoji/bamboo.png | Bin 2482 -> 0 bytes public/img/emoji/banana.png | Bin 2431 -> 0 bytes public/img/emoji/bangbang.png | Bin 1387 -> 0 bytes public/img/emoji/bank.png | Bin 2834 -> 0 bytes public/img/emoji/bar_chart.png | Bin 2341 -> 0 bytes public/img/emoji/barber.png | Bin 2405 -> 0 bytes public/img/emoji/baseball.png | Bin 3528 -> 0 bytes public/img/emoji/basketball.png | Bin 3238 -> 0 bytes public/img/emoji/bath.png | Bin 2292 -> 0 bytes public/img/emoji/bathtub.png | Bin 2188 -> 0 bytes public/img/emoji/battery.png | Bin 2387 -> 0 bytes public/img/emoji/bear.png | Bin 3164 -> 0 bytes public/img/emoji/bee.png | Bin 2835 -> 0 bytes public/img/emoji/beer.png | Bin 3345 -> 0 bytes public/img/emoji/beers.png | Bin 3255 -> 0 bytes public/img/emoji/beetle.png | Bin 2744 -> 0 bytes public/img/emoji/beginner.png | Bin 2074 -> 0 bytes public/img/emoji/bell.png | Bin 2752 -> 0 bytes public/img/emoji/bento.png | Bin 2930 -> 0 bytes public/img/emoji/bicyclist.png | Bin 3144 -> 0 bytes public/img/emoji/bike.png | Bin 2675 -> 0 bytes public/img/emoji/bikini.png | Bin 2248 -> 0 bytes public/img/emoji/bird.png | Bin 2667 -> 0 bytes public/img/emoji/birthday.png | Bin 3167 -> 0 bytes public/img/emoji/black_circle.png | Bin 2346 -> 0 bytes public/img/emoji/black_joker.png | Bin 2528 -> 0 bytes .../img/emoji/black_medium_small_square.png | Bin 1865 -> 0 bytes public/img/emoji/black_medium_square.png | Bin 2358 -> 0 bytes public/img/emoji/black_nib.png | Bin 2352 -> 0 bytes public/img/emoji/black_small_square.png | Bin 1569 -> 0 bytes public/img/emoji/black_square.png | Bin 1332 -> 0 bytes public/img/emoji/black_square_button.png | Bin 1337 -> 0 bytes public/img/emoji/blossom.png | Bin 2590 -> 0 bytes public/img/emoji/blowfish.png | Bin 2160 -> 0 bytes public/img/emoji/blue_book.png | Bin 2925 -> 0 bytes public/img/emoji/blue_car.png | Bin 2604 -> 0 bytes public/img/emoji/blue_heart.png | Bin 2477 -> 0 bytes public/img/emoji/blush.png | Bin 2986 -> 0 bytes public/img/emoji/boar.png | Bin 2974 -> 0 bytes public/img/emoji/boat.png | Bin 2401 -> 0 bytes public/img/emoji/bomb.png | Bin 3002 -> 0 bytes public/img/emoji/book.png | Bin 3244 -> 0 bytes public/img/emoji/bookmark.png | Bin 2619 -> 0 bytes public/img/emoji/bookmark_tabs.png | Bin 2519 -> 0 bytes public/img/emoji/books.png | Bin 2968 -> 0 bytes public/img/emoji/boom.png | Bin 2439 -> 0 bytes public/img/emoji/boot.png | Bin 2310 -> 0 bytes public/img/emoji/bouquet.png | Bin 3079 -> 0 bytes public/img/emoji/bow.png | Bin 2743 -> 0 bytes public/img/emoji/bowling.png | Bin 3081 -> 0 bytes public/img/emoji/bowtie.png | Bin 2793 -> 0 bytes public/img/emoji/boy.png | Bin 2976 -> 0 bytes public/img/emoji/bread.png | Bin 3454 -> 0 bytes public/img/emoji/bride_with_veil.png | Bin 3773 -> 0 bytes public/img/emoji/bridge_at_night.png | Bin 2751 -> 0 bytes public/img/emoji/briefcase.png | Bin 2120 -> 0 bytes public/img/emoji/broken_heart.png | Bin 2804 -> 0 bytes public/img/emoji/bug.png | Bin 2974 -> 0 bytes public/img/emoji/bulb.png | Bin 2631 -> 0 bytes public/img/emoji/bullettrain_front.png | Bin 2686 -> 0 bytes public/img/emoji/bullettrain_side.png | Bin 2400 -> 0 bytes public/img/emoji/bus.png | Bin 2394 -> 0 bytes public/img/emoji/busstop.png | Bin 1662 -> 0 bytes public/img/emoji/bust_in_silhouette.png | Bin 1694 -> 0 bytes public/img/emoji/busts_in_silhouette.png | Bin 2067 -> 0 bytes public/img/emoji/cactus.png | Bin 2812 -> 0 bytes public/img/emoji/cake.png | Bin 2950 -> 0 bytes public/img/emoji/calendar.png | Bin 2545 -> 0 bytes public/img/emoji/calling.png | Bin 2591 -> 0 bytes public/img/emoji/camel.png | Bin 2562 -> 0 bytes public/img/emoji/camera.png | Bin 2686 -> 0 bytes public/img/emoji/cancer.png | Bin 2792 -> 0 bytes public/img/emoji/candy.png | Bin 2424 -> 0 bytes public/img/emoji/capital_abcd.png | Bin 2861 -> 0 bytes public/img/emoji/capricorn.png | Bin 2616 -> 0 bytes public/img/emoji/car.png | Bin 2680 -> 0 bytes public/img/emoji/card_index.png | Bin 2901 -> 0 bytes public/img/emoji/carousel_horse.png | Bin 2945 -> 0 bytes public/img/emoji/cat.png | Bin 3215 -> 0 bytes public/img/emoji/cat2.png | Bin 2794 -> 0 bytes public/img/emoji/cd.png | Bin 3334 -> 0 bytes public/img/emoji/chart.png | Bin 2712 -> 0 bytes .../img/emoji/chart_with_downwards_trend.png | Bin 2334 -> 0 bytes public/img/emoji/chart_with_upwards_trend.png | Bin 2310 -> 0 bytes public/img/emoji/checkered_flag.png | Bin 1675 -> 0 bytes public/img/emoji/cherries.png | Bin 2991 -> 0 bytes public/img/emoji/cherry_blossom.png | Bin 3423 -> 0 bytes public/img/emoji/chestnut.png | Bin 3231 -> 0 bytes public/img/emoji/chicken.png | Bin 2670 -> 0 bytes public/img/emoji/children_crossing.png | Bin 2216 -> 0 bytes public/img/emoji/chocolate_bar.png | Bin 2477 -> 0 bytes public/img/emoji/christmas_tree.png | Bin 2495 -> 0 bytes public/img/emoji/church.png | Bin 2787 -> 0 bytes public/img/emoji/cinema.png | Bin 2310 -> 0 bytes public/img/emoji/circus_tent.png | Bin 2553 -> 0 bytes public/img/emoji/city_sunrise.png | Bin 3103 -> 0 bytes public/img/emoji/city_sunset.png | Bin 2815 -> 0 bytes public/img/emoji/cl.png | Bin 2429 -> 0 bytes public/img/emoji/clap.png | Bin 3508 -> 0 bytes public/img/emoji/clapper.png | Bin 2587 -> 0 bytes public/img/emoji/clipboard.png | Bin 3012 -> 0 bytes public/img/emoji/clock1.png | Bin 2590 -> 0 bytes public/img/emoji/clock10.png | Bin 2590 -> 0 bytes public/img/emoji/clock1030.png | Bin 2817 -> 0 bytes public/img/emoji/clock11.png | Bin 2587 -> 0 bytes public/img/emoji/clock1130.png | Bin 2854 -> 0 bytes public/img/emoji/clock12.png | Bin 2504 -> 0 bytes public/img/emoji/clock1230.png | Bin 2797 -> 0 bytes public/img/emoji/clock130.png | Bin 2837 -> 0 bytes public/img/emoji/clock2.png | Bin 2595 -> 0 bytes public/img/emoji/clock230.png | Bin 2853 -> 0 bytes public/img/emoji/clock3.png | Bin 2492 -> 0 bytes public/img/emoji/clock330.png | Bin 2739 -> 0 bytes public/img/emoji/clock4.png | Bin 2619 -> 0 bytes public/img/emoji/clock430.png | Bin 2803 -> 0 bytes public/img/emoji/clock5.png | Bin 2624 -> 0 bytes public/img/emoji/clock530.png | Bin 2832 -> 0 bytes public/img/emoji/clock6.png | Bin 2577 -> 0 bytes public/img/emoji/clock630.png | Bin 2730 -> 0 bytes public/img/emoji/clock7.png | Bin 2615 -> 0 bytes public/img/emoji/clock730.png | Bin 2794 -> 0 bytes public/img/emoji/clock8.png | Bin 2603 -> 0 bytes public/img/emoji/clock830.png | Bin 2792 -> 0 bytes public/img/emoji/clock9.png | Bin 2486 -> 0 bytes public/img/emoji/clock930.png | Bin 2746 -> 0 bytes public/img/emoji/closed_book.png | Bin 2647 -> 0 bytes public/img/emoji/closed_lock_with_key.png | Bin 2920 -> 0 bytes public/img/emoji/closed_umbrella.png | Bin 2278 -> 0 bytes public/img/emoji/cloud.png | Bin 2456 -> 0 bytes public/img/emoji/clubs.png | Bin 1685 -> 0 bytes public/img/emoji/cn.png | Bin 2624 -> 0 bytes public/img/emoji/cocktail.png | Bin 1934 -> 0 bytes public/img/emoji/coffee.png | Bin 2960 -> 0 bytes public/img/emoji/cold_sweat.png | Bin 2722 -> 0 bytes public/img/emoji/collision.png | Bin 2439 -> 0 bytes public/img/emoji/computer.png | Bin 1705 -> 0 bytes public/img/emoji/confetti_ball.png | Bin 2678 -> 0 bytes public/img/emoji/confounded.png | Bin 3140 -> 0 bytes public/img/emoji/confused.png | Bin 2808 -> 0 bytes public/img/emoji/congratulations.png | Bin 2998 -> 0 bytes public/img/emoji/construction.png | Bin 2229 -> 0 bytes public/img/emoji/construction_worker.png | Bin 3027 -> 0 bytes public/img/emoji/convenience_store.png | Bin 2356 -> 0 bytes public/img/emoji/cookie.png | Bin 3810 -> 0 bytes public/img/emoji/cool.png | Bin 2517 -> 0 bytes public/img/emoji/cop.png | Bin 3238 -> 0 bytes public/img/emoji/copyright.png | Bin 1579 -> 0 bytes public/img/emoji/corn.png | Bin 3057 -> 0 bytes public/img/emoji/couple.png | Bin 3465 -> 0 bytes public/img/emoji/couple_with_heart.png | Bin 3164 -> 0 bytes public/img/emoji/couplekiss.png | Bin 3259 -> 0 bytes public/img/emoji/cow.png | Bin 2933 -> 0 bytes public/img/emoji/cow2.png | Bin 2788 -> 0 bytes public/img/emoji/credit_card.png | Bin 2052 -> 0 bytes public/img/emoji/crescent_moon.png | Bin 2282 -> 0 bytes public/img/emoji/crocodile.png | Bin 3267 -> 0 bytes public/img/emoji/crossed_flags.png | Bin 2426 -> 0 bytes public/img/emoji/crown.png | Bin 2815 -> 0 bytes public/img/emoji/cry.png | Bin 2960 -> 0 bytes public/img/emoji/crying_cat_face.png | Bin 3200 -> 0 bytes public/img/emoji/crystal_ball.png | Bin 3073 -> 0 bytes public/img/emoji/cupid.png | Bin 2805 -> 0 bytes public/img/emoji/curly_loop.png | Bin 1129 -> 0 bytes public/img/emoji/currency_exchange.png | Bin 1959 -> 0 bytes public/img/emoji/curry.png | Bin 2940 -> 0 bytes public/img/emoji/custard.png | Bin 2944 -> 0 bytes public/img/emoji/customs.png | Bin 2414 -> 0 bytes public/img/emoji/cyclone.png | Bin 2753 -> 0 bytes public/img/emoji/dancer.png | Bin 2536 -> 0 bytes public/img/emoji/dancers.png | Bin 3290 -> 0 bytes public/img/emoji/dango.png | Bin 2439 -> 0 bytes public/img/emoji/dart.png | Bin 2996 -> 0 bytes public/img/emoji/dash.png | Bin 2984 -> 0 bytes public/img/emoji/date.png | Bin 2596 -> 0 bytes public/img/emoji/de.png | Bin 2220 -> 0 bytes public/img/emoji/deciduous_tree.png | Bin 3517 -> 0 bytes public/img/emoji/department_store.png | Bin 2829 -> 0 bytes .../emoji/diamond_shape_with_a_dot_inside.png | Bin 3097 -> 0 bytes public/img/emoji/diamonds.png | Bin 2405 -> 0 bytes public/img/emoji/disappointed.png | Bin 2904 -> 0 bytes public/img/emoji/disappointed_relieved.png | Bin 3160 -> 0 bytes public/img/emoji/dizzy.png | Bin 2045 -> 0 bytes public/img/emoji/dizzy_face.png | Bin 3191 -> 0 bytes public/img/emoji/do_not_litter.png | Bin 2994 -> 0 bytes public/img/emoji/dog.png | Bin 3050 -> 0 bytes public/img/emoji/dog2.png | Bin 3039 -> 0 bytes public/img/emoji/dollar.png | Bin 2687 -> 0 bytes public/img/emoji/dolls.png | Bin 3476 -> 0 bytes public/img/emoji/dolphin.png | Bin 2457 -> 0 bytes public/img/emoji/donut.png | Bin 2926 -> 0 bytes public/img/emoji/door.png | Bin 2729 -> 0 bytes public/img/emoji/doughnut.png | Bin 2926 -> 0 bytes public/img/emoji/dragon.png | Bin 3595 -> 0 bytes public/img/emoji/dragon_face.png | Bin 3357 -> 0 bytes public/img/emoji/dress.png | Bin 2414 -> 0 bytes public/img/emoji/dromedary_camel.png | Bin 2665 -> 0 bytes public/img/emoji/droplet.png | Bin 2282 -> 0 bytes public/img/emoji/dvd.png | Bin 3405 -> 0 bytes public/img/emoji/e-mail.png | Bin 2059 -> 0 bytes public/img/emoji/ear.png | Bin 2668 -> 0 bytes public/img/emoji/ear_of_rice.png | Bin 2598 -> 0 bytes public/img/emoji/earth_africa.png | Bin 3066 -> 0 bytes public/img/emoji/earth_americas.png | Bin 3193 -> 0 bytes public/img/emoji/earth_asia.png | Bin 3315 -> 0 bytes public/img/emoji/egg.png | Bin 3063 -> 0 bytes public/img/emoji/eggplant.png | Bin 2735 -> 0 bytes public/img/emoji/eight.png | Bin 2379 -> 0 bytes public/img/emoji/eight_pointed_black_star.png | Bin 2337 -> 0 bytes public/img/emoji/eight_spoked_asterisk.png | Bin 2769 -> 0 bytes public/img/emoji/electric_plug.png | Bin 2180 -> 0 bytes public/img/emoji/elephant.png | Bin 2994 -> 0 bytes public/img/emoji/email.png | Bin 2543 -> 0 bytes public/img/emoji/end.png | Bin 1134 -> 0 bytes public/img/emoji/envelope.png | Bin 1655 -> 0 bytes public/img/emoji/es.png | Bin 2472 -> 0 bytes public/img/emoji/euro.png | Bin 2409 -> 0 bytes public/img/emoji/european_castle.png | Bin 3093 -> 0 bytes public/img/emoji/european_post_office.png | Bin 2751 -> 0 bytes public/img/emoji/evergreen_tree.png | Bin 2603 -> 0 bytes public/img/emoji/exclamation.png | Bin 1175 -> 0 bytes public/img/emoji/expressionless.png | Bin 2719 -> 0 bytes public/img/emoji/eyeglasses.png | Bin 2945 -> 0 bytes public/img/emoji/eyes.png | Bin 2844 -> 0 bytes public/img/emoji/facepunch.png | Bin 2908 -> 0 bytes public/img/emoji/factory.png | Bin 3014 -> 0 bytes public/img/emoji/fallen_leaf.png | Bin 2618 -> 0 bytes public/img/emoji/family.png | Bin 3220 -> 0 bytes public/img/emoji/fast_forward.png | Bin 2252 -> 0 bytes public/img/emoji/fax.png | Bin 2579 -> 0 bytes public/img/emoji/fearful.png | Bin 2918 -> 0 bytes public/img/emoji/feelsgood.png | Bin 1145 -> 0 bytes public/img/emoji/feet.png | Bin 1529 -> 0 bytes public/img/emoji/ferris_wheel.png | Bin 2903 -> 0 bytes public/img/emoji/file_folder.png | Bin 2805 -> 0 bytes public/img/emoji/finnadie.png | Bin 1169 -> 0 bytes public/img/emoji/fire.png | Bin 2778 -> 0 bytes public/img/emoji/fire_engine.png | Bin 2781 -> 0 bytes public/img/emoji/fireworks.png | Bin 3197 -> 0 bytes public/img/emoji/first_quarter_moon.png | Bin 3076 -> 0 bytes .../emoji/first_quarter_moon_with_face.png | Bin 2468 -> 0 bytes public/img/emoji/fish.png | Bin 2508 -> 0 bytes public/img/emoji/fish_cake.png | Bin 3327 -> 0 bytes public/img/emoji/fishing_pole_and_fish.png | Bin 2481 -> 0 bytes public/img/emoji/fist.png | Bin 3282 -> 0 bytes public/img/emoji/five.png | Bin 2342 -> 0 bytes public/img/emoji/flags.png | Bin 2648 -> 0 bytes public/img/emoji/flashlight.png | Bin 2699 -> 0 bytes public/img/emoji/floppy_disk.png | Bin 2966 -> 0 bytes public/img/emoji/flower_playing_cards.png | Bin 2354 -> 0 bytes public/img/emoji/flushed.png | Bin 3106 -> 0 bytes public/img/emoji/foggy.png | Bin 2932 -> 0 bytes public/img/emoji/football.png | Bin 3110 -> 0 bytes public/img/emoji/fork_and_knife.png | Bin 2296 -> 0 bytes public/img/emoji/fountain.png | Bin 2885 -> 0 bytes public/img/emoji/four.png | Bin 2238 -> 0 bytes public/img/emoji/four_leaf_clover.png | Bin 3159 -> 0 bytes public/img/emoji/fr.png | Bin 2398 -> 0 bytes public/img/emoji/free.png | Bin 2304 -> 0 bytes public/img/emoji/fried_shrimp.png | Bin 3561 -> 0 bytes public/img/emoji/fries.png | Bin 3243 -> 0 bytes public/img/emoji/frog.png | Bin 2844 -> 0 bytes public/img/emoji/frowning.png | Bin 2877 -> 0 bytes public/img/emoji/fu.png | Bin 2614 -> 0 bytes public/img/emoji/fuelpump.png | Bin 2540 -> 0 bytes public/img/emoji/full_moon.png | Bin 3601 -> 0 bytes public/img/emoji/full_moon_with_face.png | Bin 3688 -> 0 bytes public/img/emoji/game_die.png | Bin 2273 -> 0 bytes public/img/emoji/gb.png | Bin 2832 -> 0 bytes public/img/emoji/gem.png | Bin 2708 -> 0 bytes public/img/emoji/gemini.png | Bin 2607 -> 0 bytes public/img/emoji/ghost.png | Bin 3315 -> 0 bytes public/img/emoji/gift.png | Bin 3159 -> 0 bytes public/img/emoji/gift_heart.png | Bin 2841 -> 0 bytes public/img/emoji/girl.png | Bin 3221 -> 0 bytes public/img/emoji/globe_with_meridians.png | Bin 3431 -> 0 bytes public/img/emoji/goat.png | Bin 2813 -> 0 bytes public/img/emoji/goberserk.png | Bin 1334 -> 0 bytes public/img/emoji/godmode.png | Bin 1031 -> 0 bytes public/img/emoji/golf.png | Bin 2335 -> 0 bytes public/img/emoji/grapes.png | Bin 2966 -> 0 bytes public/img/emoji/green_apple.png | Bin 3140 -> 0 bytes public/img/emoji/green_book.png | Bin 2744 -> 0 bytes public/img/emoji/green_heart.png | Bin 2467 -> 0 bytes public/img/emoji/grey_exclamation.png | Bin 790 -> 0 bytes public/img/emoji/grey_question.png | Bin 1057 -> 0 bytes public/img/emoji/grimacing.png | Bin 2778 -> 0 bytes public/img/emoji/grin.png | Bin 2914 -> 0 bytes public/img/emoji/grinning.png | Bin 2890 -> 0 bytes public/img/emoji/guardsman.png | Bin 2753 -> 0 bytes public/img/emoji/guitar.png | Bin 2349 -> 0 bytes public/img/emoji/gun.png | Bin 2088 -> 0 bytes public/img/emoji/haircut.png | Bin 3268 -> 0 bytes public/img/emoji/hamburger.png | Bin 2932 -> 0 bytes public/img/emoji/hammer.png | Bin 2260 -> 0 bytes public/img/emoji/hamster.png | Bin 3281 -> 0 bytes public/img/emoji/hand.png | Bin 2703 -> 0 bytes public/img/emoji/handbag.png | Bin 2934 -> 0 bytes public/img/emoji/hankey.png | Bin 2711 -> 0 bytes public/img/emoji/hash.png | Bin 2426 -> 0 bytes public/img/emoji/hatched_chick.png | Bin 2941 -> 0 bytes public/img/emoji/hatching_chick.png | Bin 3226 -> 0 bytes public/img/emoji/headphones.png | Bin 1910 -> 0 bytes public/img/emoji/hear_no_evil.png | Bin 3457 -> 0 bytes public/img/emoji/heart.png | Bin 2435 -> 0 bytes public/img/emoji/heart_decoration.png | Bin 2277 -> 0 bytes public/img/emoji/heart_eyes.png | Bin 3004 -> 0 bytes public/img/emoji/heart_eyes_cat.png | Bin 3033 -> 0 bytes public/img/emoji/heartbeat.png | Bin 2282 -> 0 bytes public/img/emoji/heartpulse.png | Bin 2825 -> 0 bytes public/img/emoji/hearts.png | Bin 2395 -> 0 bytes public/img/emoji/heavy_check_mark.png | Bin 924 -> 0 bytes public/img/emoji/heavy_division_sign.png | Bin 264 -> 0 bytes public/img/emoji/heavy_dollar_sign.png | Bin 1150 -> 0 bytes public/img/emoji/heavy_exclamation_mark.png | Bin 1315 -> 0 bytes public/img/emoji/heavy_minus_sign.png | Bin 176 -> 0 bytes public/img/emoji/heavy_multiplication_x.png | Bin 591 -> 0 bytes public/img/emoji/heavy_plus_sign.png | Bin 264 -> 0 bytes public/img/emoji/helicopter.png | Bin 2258 -> 0 bytes public/img/emoji/herb.png | Bin 2914 -> 0 bytes public/img/emoji/hibiscus.png | Bin 3768 -> 0 bytes public/img/emoji/high_brightness.png | Bin 2590 -> 0 bytes public/img/emoji/high_heel.png | Bin 2705 -> 0 bytes public/img/emoji/hocho.png | Bin 1991 -> 0 bytes public/img/emoji/honey_pot.png | Bin 3059 -> 0 bytes public/img/emoji/honeybee.png | Bin 2835 -> 0 bytes public/img/emoji/horse.png | Bin 2744 -> 0 bytes public/img/emoji/horse_racing.png | Bin 2945 -> 0 bytes public/img/emoji/hospital.png | Bin 2895 -> 0 bytes public/img/emoji/hotel.png | Bin 2965 -> 0 bytes public/img/emoji/hotsprings.png | Bin 2446 -> 0 bytes public/img/emoji/hourglass.png | Bin 2490 -> 0 bytes public/img/emoji/hourglass_flowing_sand.png | Bin 2461 -> 0 bytes public/img/emoji/house.png | Bin 2222 -> 0 bytes public/img/emoji/house_with_garden.png | Bin 2874 -> 0 bytes public/img/emoji/hurtrealbad.png | Bin 1454 -> 0 bytes public/img/emoji/hushed.png | Bin 2904 -> 0 bytes public/img/emoji/ice_cream.png | Bin 3069 -> 0 bytes public/img/emoji/icecream.png | Bin 2587 -> 0 bytes public/img/emoji/id.png | Bin 2477 -> 0 bytes public/img/emoji/ideograph_advantage.png | Bin 2598 -> 0 bytes public/img/emoji/imp.png | Bin 3399 -> 0 bytes public/img/emoji/inbox_tray.png | Bin 2340 -> 0 bytes public/img/emoji/incoming_envelope.png | Bin 2180 -> 0 bytes public/img/emoji/information_desk_person.png | Bin 3132 -> 0 bytes public/img/emoji/information_source.png | Bin 2391 -> 0 bytes public/img/emoji/innocent.png | Bin 3260 -> 0 bytes public/img/emoji/interrobang.png | Bin 2099 -> 0 bytes public/img/emoji/iphone.png | Bin 2478 -> 0 bytes public/img/emoji/it.png | Bin 2305 -> 0 bytes public/img/emoji/izakaya_lantern.png | Bin 2680 -> 0 bytes public/img/emoji/jack_o_lantern.png | Bin 3178 -> 0 bytes public/img/emoji/japan.png | Bin 2773 -> 0 bytes public/img/emoji/japanese_castle.png | Bin 2749 -> 0 bytes public/img/emoji/japanese_goblin.png | Bin 2673 -> 0 bytes public/img/emoji/japanese_ogre.png | Bin 3546 -> 0 bytes public/img/emoji/jeans.png | Bin 2696 -> 0 bytes public/img/emoji/joy.png | Bin 3031 -> 0 bytes public/img/emoji/joy_cat.png | Bin 3239 -> 0 bytes public/img/emoji/jp.png | Bin 2606 -> 0 bytes public/img/emoji/key.png | Bin 2125 -> 0 bytes public/img/emoji/keycap_ten.png | Bin 2547 -> 0 bytes public/img/emoji/kimono.png | Bin 2721 -> 0 bytes public/img/emoji/kiss.png | Bin 2969 -> 0 bytes public/img/emoji/kissing.png | Bin 2872 -> 0 bytes public/img/emoji/kissing_cat.png | Bin 3257 -> 0 bytes public/img/emoji/kissing_closed_eyes.png | Bin 3056 -> 0 bytes public/img/emoji/kissing_face.png | Bin 3056 -> 0 bytes public/img/emoji/kissing_heart.png | Bin 3068 -> 0 bytes public/img/emoji/kissing_smiling_eyes.png | Bin 2882 -> 0 bytes public/img/emoji/koala.png | Bin 3376 -> 0 bytes public/img/emoji/koko.png | Bin 2228 -> 0 bytes public/img/emoji/kr.png | Bin 2880 -> 0 bytes public/img/emoji/large_blue_circle.png | Bin 2799 -> 0 bytes public/img/emoji/large_blue_diamond.png | Bin 2269 -> 0 bytes public/img/emoji/large_orange_diamond.png | Bin 2313 -> 0 bytes public/img/emoji/last_quarter_moon.png | Bin 3287 -> 0 bytes .../img/emoji/last_quarter_moon_with_face.png | Bin 2547 -> 0 bytes public/img/emoji/laughing.png | Bin 3113 -> 0 bytes public/img/emoji/leaves.png | Bin 3038 -> 0 bytes public/img/emoji/ledger.png | Bin 3388 -> 0 bytes public/img/emoji/left_luggage.png | Bin 2491 -> 0 bytes public/img/emoji/left_right_arrow.png | Bin 2289 -> 0 bytes .../img/emoji/leftwards_arrow_with_hook.png | Bin 2386 -> 0 bytes public/img/emoji/lemon.png | Bin 3314 -> 0 bytes public/img/emoji/leo.png | Bin 2689 -> 0 bytes public/img/emoji/leopard.png | Bin 2575 -> 0 bytes public/img/emoji/libra.png | Bin 2499 -> 0 bytes public/img/emoji/light_rail.png | Bin 2389 -> 0 bytes public/img/emoji/link.png | Bin 2619 -> 0 bytes public/img/emoji/lips.png | Bin 2367 -> 0 bytes public/img/emoji/lipstick.png | Bin 2310 -> 0 bytes public/img/emoji/lock.png | Bin 2476 -> 0 bytes public/img/emoji/lock_with_ink_pen.png | Bin 2887 -> 0 bytes public/img/emoji/lollipop.png | Bin 2560 -> 0 bytes public/img/emoji/loop.png | Bin 2339 -> 0 bytes public/img/emoji/loudspeaker.png | Bin 2871 -> 0 bytes public/img/emoji/love_hotel.png | Bin 2847 -> 0 bytes public/img/emoji/love_letter.png | Bin 2065 -> 0 bytes public/img/emoji/low_brightness.png | Bin 1959 -> 0 bytes public/img/emoji/m.png | Bin 2738 -> 0 bytes public/img/emoji/mag.png | Bin 2808 -> 0 bytes public/img/emoji/mag_right.png | Bin 2604 -> 0 bytes public/img/emoji/mahjong.png | Bin 2282 -> 0 bytes public/img/emoji/mailbox.png | Bin 2472 -> 0 bytes public/img/emoji/mailbox_closed.png | Bin 2327 -> 0 bytes public/img/emoji/mailbox_with_mail.png | Bin 2674 -> 0 bytes public/img/emoji/mailbox_with_no_mail.png | Bin 2240 -> 0 bytes public/img/emoji/man.png | Bin 3031 -> 0 bytes public/img/emoji/man_with_gua_pi_mao.png | Bin 2896 -> 0 bytes public/img/emoji/man_with_turban.png | Bin 3334 -> 0 bytes public/img/emoji/mans_shoe.png | Bin 2626 -> 0 bytes public/img/emoji/maple_leaf.png | Bin 2471 -> 0 bytes public/img/emoji/mask.png | Bin 2809 -> 0 bytes public/img/emoji/massage.png | Bin 3025 -> 0 bytes public/img/emoji/meat_on_bone.png | Bin 2895 -> 0 bytes public/img/emoji/mega.png | Bin 2743 -> 0 bytes public/img/emoji/melon.png | Bin 3638 -> 0 bytes public/img/emoji/memo.png | Bin 2859 -> 0 bytes public/img/emoji/mens.png | Bin 2334 -> 0 bytes public/img/emoji/metal.png | Bin 2200 -> 0 bytes public/img/emoji/metro.png | Bin 2385 -> 0 bytes public/img/emoji/microphone.png | Bin 2417 -> 0 bytes public/img/emoji/microscope.png | Bin 2711 -> 0 bytes public/img/emoji/milky_way.png | Bin 3190 -> 0 bytes public/img/emoji/minibus.png | Bin 2293 -> 0 bytes public/img/emoji/minidisc.png | Bin 3036 -> 0 bytes public/img/emoji/mobile_phone_off.png | Bin 2541 -> 0 bytes public/img/emoji/money_with_wings.png | Bin 3389 -> 0 bytes public/img/emoji/moneybag.png | Bin 2839 -> 0 bytes public/img/emoji/monkey.png | Bin 2649 -> 0 bytes public/img/emoji/monkey_face.png | Bin 2961 -> 0 bytes public/img/emoji/monorail.png | Bin 2493 -> 0 bytes public/img/emoji/mortar_board.png | Bin 2497 -> 0 bytes public/img/emoji/mount_fuji.png | Bin 2765 -> 0 bytes public/img/emoji/mountain_bicyclist.png | Bin 3733 -> 0 bytes public/img/emoji/mountain_cableway.png | Bin 2604 -> 0 bytes public/img/emoji/mountain_railway.png | Bin 3100 -> 0 bytes public/img/emoji/mouse.png | Bin 3419 -> 0 bytes public/img/emoji/mouse2.png | Bin 2519 -> 0 bytes public/img/emoji/movie_camera.png | Bin 2956 -> 0 bytes public/img/emoji/moyai.png | Bin 2166 -> 0 bytes public/img/emoji/muscle.png | Bin 2678 -> 0 bytes public/img/emoji/mushroom.png | Bin 2587 -> 0 bytes public/img/emoji/musical_keyboard.png | Bin 1944 -> 0 bytes public/img/emoji/musical_note.png | Bin 2308 -> 0 bytes public/img/emoji/musical_score.png | Bin 1497 -> 0 bytes public/img/emoji/mute.png | Bin 3285 -> 0 bytes public/img/emoji/nail_care.png | Bin 2825 -> 0 bytes public/img/emoji/name_badge.png | Bin 2800 -> 0 bytes public/img/emoji/neckbeard.png | Bin 3167 -> 0 bytes public/img/emoji/necktie.png | Bin 3336 -> 0 bytes .../img/emoji/negative_squared_cross_mark.png | Bin 2332 -> 0 bytes public/img/emoji/neutral_face.png | Bin 2906 -> 0 bytes public/img/emoji/new.png | Bin 2517 -> 0 bytes public/img/emoji/new_moon.png | Bin 3604 -> 0 bytes public/img/emoji/new_moon_with_face.png | Bin 3662 -> 0 bytes public/img/emoji/newspaper.png | Bin 3557 -> 0 bytes public/img/emoji/ng.png | Bin 2554 -> 0 bytes public/img/emoji/nine.png | Bin 2397 -> 0 bytes public/img/emoji/no_bell.png | Bin 2700 -> 0 bytes public/img/emoji/no_bicycles.png | Bin 3080 -> 0 bytes public/img/emoji/no_entry.png | Bin 2310 -> 0 bytes public/img/emoji/no_entry_sign.png | Bin 2357 -> 0 bytes public/img/emoji/no_good.png | Bin 3137 -> 0 bytes public/img/emoji/no_mobile_phones.png | Bin 2954 -> 0 bytes public/img/emoji/no_mouth.png | Bin 2891 -> 0 bytes public/img/emoji/no_pedestrians.png | Bin 3064 -> 0 bytes public/img/emoji/no_smoking.png | Bin 2404 -> 0 bytes public/img/emoji/non-potable_water.png | Bin 2952 -> 0 bytes public/img/emoji/nose.png | Bin 2524 -> 0 bytes public/img/emoji/notebook.png | Bin 3506 -> 0 bytes .../emoji/notebook_with_decorative_cover.png | Bin 2991 -> 0 bytes public/img/emoji/notes.png | Bin 1536 -> 0 bytes public/img/emoji/nut_and_bolt.png | Bin 2169 -> 0 bytes public/img/emoji/o.png | Bin 2163 -> 0 bytes public/img/emoji/o2.png | Bin 2418 -> 0 bytes public/img/emoji/ocean.png | Bin 2834 -> 0 bytes public/img/emoji/octocat.png | Bin 2520 -> 0 bytes public/img/emoji/octopus.png | Bin 3115 -> 0 bytes public/img/emoji/oden.png | Bin 2661 -> 0 bytes public/img/emoji/office.png | Bin 3058 -> 0 bytes public/img/emoji/ok.png | Bin 2498 -> 0 bytes public/img/emoji/ok_hand.png | Bin 2606 -> 0 bytes public/img/emoji/ok_woman.png | Bin 3544 -> 0 bytes public/img/emoji/older_man.png | Bin 3169 -> 0 bytes public/img/emoji/older_woman.png | Bin 3314 -> 0 bytes public/img/emoji/on.png | Bin 1472 -> 0 bytes public/img/emoji/oncoming_automobile.png | Bin 3289 -> 0 bytes public/img/emoji/oncoming_bus.png | Bin 2551 -> 0 bytes public/img/emoji/oncoming_police_car.png | Bin 2886 -> 0 bytes public/img/emoji/oncoming_taxi.png | Bin 2895 -> 0 bytes public/img/emoji/one.png | Bin 2171 -> 0 bytes public/img/emoji/open_file_folder.png | Bin 2840 -> 0 bytes public/img/emoji/open_hands.png | Bin 2812 -> 0 bytes public/img/emoji/open_mouth.png | Bin 2809 -> 0 bytes public/img/emoji/ophiuchus.png | Bin 2567 -> 0 bytes public/img/emoji/orange_book.png | Bin 2757 -> 0 bytes public/img/emoji/outbox_tray.png | Bin 2349 -> 0 bytes public/img/emoji/ox.png | Bin 3212 -> 0 bytes public/img/emoji/package.png | Bin 2895 -> 0 bytes public/img/emoji/page_facing_up.png | Bin 2178 -> 0 bytes public/img/emoji/page_with_curl.png | Bin 2945 -> 0 bytes public/img/emoji/pager.png | Bin 2502 -> 0 bytes public/img/emoji/palm_tree.png | Bin 2326 -> 0 bytes public/img/emoji/panda_face.png | Bin 3183 -> 0 bytes public/img/emoji/paperclip.png | Bin 1995 -> 0 bytes public/img/emoji/parking.png | Bin 2241 -> 0 bytes public/img/emoji/part_alternation_mark.png | Bin 1947 -> 0 bytes public/img/emoji/partly_sunny.png | Bin 2838 -> 0 bytes public/img/emoji/passport_control.png | Bin 2426 -> 0 bytes public/img/emoji/paw_prints.png | Bin 2016 -> 0 bytes public/img/emoji/peach.png | Bin 3109 -> 0 bytes public/img/emoji/pear.png | Bin 3482 -> 0 bytes public/img/emoji/pencil.png | Bin 2859 -> 0 bytes public/img/emoji/pencil2.png | Bin 2398 -> 0 bytes public/img/emoji/penguin.png | Bin 2640 -> 0 bytes public/img/emoji/pensive.png | Bin 2920 -> 0 bytes public/img/emoji/performing_arts.png | Bin 2979 -> 0 bytes public/img/emoji/persevere.png | Bin 3076 -> 0 bytes public/img/emoji/person_frowning.png | Bin 2631 -> 0 bytes public/img/emoji/person_with_blond_hair.png | Bin 2985 -> 0 bytes public/img/emoji/person_with_pouting_face.png | Bin 2839 -> 0 bytes public/img/emoji/phone.png | Bin 2727 -> 0 bytes public/img/emoji/pig.png | Bin 3027 -> 0 bytes public/img/emoji/pig2.png | Bin 2733 -> 0 bytes public/img/emoji/pig_nose.png | Bin 2668 -> 0 bytes public/img/emoji/pill.png | Bin 2770 -> 0 bytes public/img/emoji/pineapple.png | Bin 2759 -> 0 bytes public/img/emoji/pisces.png | Bin 2612 -> 0 bytes public/img/emoji/pizza.png | Bin 2770 -> 0 bytes public/img/emoji/plus1.png | Bin 2900 -> 0 bytes public/img/emoji/point_down.png | Bin 2200 -> 0 bytes public/img/emoji/point_left.png | Bin 2207 -> 0 bytes public/img/emoji/point_right.png | Bin 2228 -> 0 bytes public/img/emoji/point_up.png | Bin 2268 -> 0 bytes public/img/emoji/point_up_2.png | Bin 2227 -> 0 bytes public/img/emoji/police_car.png | Bin 2571 -> 0 bytes public/img/emoji/poodle.png | Bin 3264 -> 0 bytes public/img/emoji/poop.png | Bin 2711 -> 0 bytes public/img/emoji/post_office.png | Bin 2668 -> 0 bytes public/img/emoji/postal_horn.png | Bin 2550 -> 0 bytes public/img/emoji/postbox.png | Bin 2454 -> 0 bytes public/img/emoji/potable_water.png | Bin 2479 -> 0 bytes public/img/emoji/pouch.png | Bin 2829 -> 0 bytes public/img/emoji/poultry_leg.png | Bin 2505 -> 0 bytes public/img/emoji/pound.png | Bin 2570 -> 0 bytes public/img/emoji/pouting_cat.png | Bin 2899 -> 0 bytes public/img/emoji/pray.png | Bin 3136 -> 0 bytes public/img/emoji/princess.png | Bin 3489 -> 0 bytes public/img/emoji/punch.png | Bin 2908 -> 0 bytes public/img/emoji/purple_heart.png | Bin 2460 -> 0 bytes public/img/emoji/purse.png | Bin 2824 -> 0 bytes public/img/emoji/pushpin.png | Bin 2376 -> 0 bytes public/img/emoji/put_litter_in_its_place.png | Bin 2554 -> 0 bytes public/img/emoji/question.png | Bin 1640 -> 0 bytes public/img/emoji/rabbit.png | Bin 3238 -> 0 bytes public/img/emoji/rabbit2.png | Bin 2529 -> 0 bytes public/img/emoji/racehorse.png | Bin 2597 -> 0 bytes public/img/emoji/radio.png | Bin 3248 -> 0 bytes public/img/emoji/radio_button.png | Bin 2198 -> 0 bytes public/img/emoji/rage.png | Bin 3117 -> 0 bytes public/img/emoji/rage1.png | Bin 1082 -> 0 bytes public/img/emoji/rage2.png | Bin 1087 -> 0 bytes public/img/emoji/rage3.png | Bin 1119 -> 0 bytes public/img/emoji/rage4.png | Bin 1270 -> 0 bytes public/img/emoji/railway_car.png | Bin 2299 -> 0 bytes public/img/emoji/rainbow.png | Bin 2623 -> 0 bytes public/img/emoji/raised_hand.png | Bin 2703 -> 0 bytes public/img/emoji/raised_hands.png | Bin 3122 -> 0 bytes public/img/emoji/raising_hand.png | Bin 2993 -> 0 bytes public/img/emoji/ram.png | Bin 3315 -> 0 bytes public/img/emoji/ramen.png | Bin 3209 -> 0 bytes public/img/emoji/rat.png | Bin 3014 -> 0 bytes public/img/emoji/recycle.png | Bin 2369 -> 0 bytes public/img/emoji/red_car.png | Bin 2680 -> 0 bytes public/img/emoji/red_circle.png | Bin 2905 -> 0 bytes public/img/emoji/registered.png | Bin 1613 -> 0 bytes public/img/emoji/relaxed.png | Bin 3002 -> 0 bytes public/img/emoji/relieved.png | Bin 3078 -> 0 bytes public/img/emoji/repeat.png | Bin 2454 -> 0 bytes public/img/emoji/repeat_one.png | Bin 2537 -> 0 bytes public/img/emoji/restroom.png | Bin 2558 -> 0 bytes public/img/emoji/revolving_hearts.png | Bin 2703 -> 0 bytes public/img/emoji/rewind.png | Bin 2223 -> 0 bytes public/img/emoji/ribbon.png | Bin 2859 -> 0 bytes public/img/emoji/rice.png | Bin 3468 -> 0 bytes public/img/emoji/rice_ball.png | Bin 3171 -> 0 bytes public/img/emoji/rice_cracker.png | Bin 3413 -> 0 bytes public/img/emoji/rice_scene.png | Bin 3006 -> 0 bytes public/img/emoji/ring.png | Bin 2683 -> 0 bytes public/img/emoji/rocket.png | Bin 2751 -> 0 bytes public/img/emoji/roller_coaster.png | Bin 2798 -> 0 bytes public/img/emoji/rooster.png | Bin 3162 -> 0 bytes public/img/emoji/rose.png | Bin 2753 -> 0 bytes public/img/emoji/rotating_light.png | Bin 3101 -> 0 bytes public/img/emoji/round_pushpin.png | Bin 1732 -> 0 bytes public/img/emoji/rowboat.png | Bin 2803 -> 0 bytes public/img/emoji/ru.png | Bin 2349 -> 0 bytes public/img/emoji/rugby_football.png | Bin 3735 -> 0 bytes public/img/emoji/runner.png | Bin 2217 -> 0 bytes public/img/emoji/running.png | Bin 2217 -> 0 bytes public/img/emoji/running_shirt_with_sash.png | Bin 3162 -> 0 bytes public/img/emoji/sa.png | Bin 2341 -> 0 bytes public/img/emoji/sagittarius.png | Bin 2556 -> 0 bytes public/img/emoji/sailboat.png | Bin 2401 -> 0 bytes public/img/emoji/sake.png | Bin 2955 -> 0 bytes public/img/emoji/sandal.png | Bin 2364 -> 0 bytes public/img/emoji/santa.png | Bin 3168 -> 0 bytes public/img/emoji/satellite.png | Bin 3429 -> 0 bytes public/img/emoji/satisfied.png | Bin 3113 -> 0 bytes public/img/emoji/saxophone.png | Bin 2415 -> 0 bytes public/img/emoji/school.png | Bin 2739 -> 0 bytes public/img/emoji/school_satchel.png | Bin 3273 -> 0 bytes public/img/emoji/scissors.png | Bin 2492 -> 0 bytes public/img/emoji/scorpius.png | Bin 2683 -> 0 bytes public/img/emoji/scream.png | Bin 3028 -> 0 bytes public/img/emoji/scream_cat.png | Bin 3328 -> 0 bytes public/img/emoji/scroll.png | Bin 3595 -> 0 bytes public/img/emoji/seat.png | Bin 2951 -> 0 bytes public/img/emoji/secret.png | Bin 3158 -> 0 bytes public/img/emoji/see_no_evil.png | Bin 3313 -> 0 bytes public/img/emoji/seedling.png | Bin 1720 -> 0 bytes public/img/emoji/seven.png | Bin 2207 -> 0 bytes public/img/emoji/shaved_ice.png | Bin 2890 -> 0 bytes public/img/emoji/sheep.png | Bin 2549 -> 0 bytes public/img/emoji/shell.png | Bin 3045 -> 0 bytes public/img/emoji/ship.png | Bin 2636 -> 0 bytes public/img/emoji/shipit.png | Bin 4598 -> 0 bytes public/img/emoji/shirt.png | Bin 2794 -> 0 bytes public/img/emoji/shit.png | Bin 2711 -> 0 bytes public/img/emoji/shoe.png | Bin 2825 -> 0 bytes public/img/emoji/shower.png | Bin 3273 -> 0 bytes public/img/emoji/signal_strength.png | Bin 2339 -> 0 bytes public/img/emoji/six.png | Bin 2395 -> 0 bytes public/img/emoji/six_pointed_star.png | Bin 2630 -> 0 bytes public/img/emoji/ski.png | Bin 2388 -> 0 bytes public/img/emoji/skull.png | Bin 2428 -> 0 bytes public/img/emoji/sleeping.png | Bin 3010 -> 0 bytes public/img/emoji/sleepy.png | Bin 3009 -> 0 bytes public/img/emoji/slot_machine.png | Bin 2861 -> 0 bytes public/img/emoji/small_blue_diamond.png | Bin 1555 -> 0 bytes public/img/emoji/small_orange_diamond.png | Bin 1559 -> 0 bytes public/img/emoji/small_red_triangle.png | Bin 1764 -> 0 bytes public/img/emoji/small_red_triangle_down.png | Bin 1774 -> 0 bytes public/img/emoji/smile.png | Bin 3076 -> 0 bytes public/img/emoji/smile_cat.png | Bin 3130 -> 0 bytes public/img/emoji/smiley.png | Bin 3041 -> 0 bytes public/img/emoji/smiley_cat.png | Bin 3104 -> 0 bytes public/img/emoji/smiling_imp.png | Bin 3502 -> 0 bytes public/img/emoji/smirk.png | Bin 2973 -> 0 bytes public/img/emoji/smirk_cat.png | Bin 3127 -> 0 bytes public/img/emoji/smoking.png | Bin 2053 -> 0 bytes public/img/emoji/snail.png | Bin 3179 -> 0 bytes public/img/emoji/snake.png | Bin 2902 -> 0 bytes public/img/emoji/snowboarder.png | Bin 2875 -> 0 bytes public/img/emoji/snowflake.png | Bin 2763 -> 0 bytes public/img/emoji/snowman.png | Bin 2758 -> 0 bytes public/img/emoji/sob.png | Bin 3015 -> 0 bytes public/img/emoji/soccer.png | Bin 3512 -> 0 bytes public/img/emoji/soon.png | Bin 1551 -> 0 bytes public/img/emoji/sos.png | Bin 2549 -> 0 bytes public/img/emoji/sound.png | Bin 3185 -> 0 bytes public/img/emoji/space_invader.png | Bin 2954 -> 0 bytes public/img/emoji/spades.png | Bin 1719 -> 0 bytes public/img/emoji/spaghetti.png | Bin 3259 -> 0 bytes public/img/emoji/sparkle.png | Bin 2979 -> 0 bytes public/img/emoji/sparkler.png | Bin 3097 -> 0 bytes public/img/emoji/sparkles.png | Bin 1936 -> 0 bytes public/img/emoji/sparkling_heart.png | Bin 2724 -> 0 bytes public/img/emoji/speak_no_evil.png | Bin 3153 -> 0 bytes public/img/emoji/speaker.png | Bin 3317 -> 0 bytes public/img/emoji/speech_balloon.png | Bin 2130 -> 0 bytes public/img/emoji/speedboat.png | Bin 2226 -> 0 bytes public/img/emoji/squirrel.png | Bin 4598 -> 0 bytes public/img/emoji/star.png | Bin 2188 -> 0 bytes public/img/emoji/star2.png | Bin 2418 -> 0 bytes public/img/emoji/stars.png | Bin 2663 -> 0 bytes public/img/emoji/station.png | Bin 2931 -> 0 bytes public/img/emoji/statue_of_liberty.png | Bin 3127 -> 0 bytes public/img/emoji/steam_locomotive.png | Bin 2703 -> 0 bytes public/img/emoji/stew.png | Bin 3115 -> 0 bytes public/img/emoji/straight_ruler.png | Bin 2352 -> 0 bytes public/img/emoji/strawberry.png | Bin 2771 -> 0 bytes public/img/emoji/stuck_out_tongue.png | Bin 2824 -> 0 bytes .../emoji/stuck_out_tongue_closed_eyes.png | Bin 2974 -> 0 bytes .../emoji/stuck_out_tongue_winking_eye.png | Bin 2980 -> 0 bytes public/img/emoji/sun_with_face.png | Bin 3695 -> 0 bytes public/img/emoji/sunflower.png | Bin 3100 -> 0 bytes public/img/emoji/sunglasses.png | Bin 3149 -> 0 bytes public/img/emoji/sunny.png | Bin 2504 -> 0 bytes public/img/emoji/sunrise.png | Bin 2848 -> 0 bytes public/img/emoji/sunrise_over_mountains.png | Bin 3096 -> 0 bytes public/img/emoji/surfer.png | Bin 2802 -> 0 bytes public/img/emoji/sushi.png | Bin 2955 -> 0 bytes public/img/emoji/suspect.png | Bin 1016 -> 0 bytes public/img/emoji/suspension_railway.png | Bin 2417 -> 0 bytes public/img/emoji/sweat.png | Bin 2963 -> 0 bytes public/img/emoji/sweat_drops.png | Bin 2862 -> 0 bytes public/img/emoji/sweat_smile.png | Bin 3129 -> 0 bytes public/img/emoji/sweet_potato.png | Bin 3175 -> 0 bytes public/img/emoji/swimmer.png | Bin 2317 -> 0 bytes public/img/emoji/symbols.png | Bin 2917 -> 0 bytes public/img/emoji/syringe.png | Bin 1939 -> 0 bytes public/img/emoji/tada.png | Bin 2773 -> 0 bytes public/img/emoji/tanabata_tree.png | Bin 2487 -> 0 bytes public/img/emoji/tangerine.png | Bin 3450 -> 0 bytes public/img/emoji/taurus.png | Bin 2618 -> 0 bytes public/img/emoji/taxi.png | Bin 2425 -> 0 bytes public/img/emoji/tea.png | Bin 3343 -> 0 bytes public/img/emoji/telephone.png | Bin 2727 -> 0 bytes public/img/emoji/telephone_receiver.png | Bin 2001 -> 0 bytes public/img/emoji/telescope.png | Bin 2419 -> 0 bytes public/img/emoji/tennis.png | Bin 3124 -> 0 bytes public/img/emoji/tent.png | Bin 2916 -> 0 bytes public/img/emoji/thought_balloon.png | Bin 2521 -> 0 bytes public/img/emoji/three.png | Bin 2397 -> 0 bytes public/img/emoji/thumbsdown.png | Bin 2974 -> 0 bytes public/img/emoji/thumbsup.png | Bin 2900 -> 0 bytes public/img/emoji/ticket.png | Bin 2236 -> 0 bytes public/img/emoji/tiger.png | Bin 3088 -> 0 bytes public/img/emoji/tiger2.png | Bin 2807 -> 0 bytes public/img/emoji/tired_face.png | Bin 3085 -> 0 bytes public/img/emoji/tm.png | Bin 842 -> 0 bytes public/img/emoji/toilet.png | Bin 1733 -> 0 bytes public/img/emoji/tokyo_tower.png | Bin 2856 -> 0 bytes public/img/emoji/tomato.png | Bin 3006 -> 0 bytes public/img/emoji/tongue.png | Bin 2765 -> 0 bytes public/img/emoji/top.png | Bin 2494 -> 0 bytes public/img/emoji/tophat.png | Bin 2563 -> 0 bytes public/img/emoji/tractor.png | Bin 2848 -> 0 bytes public/img/emoji/traffic_light.png | Bin 2285 -> 0 bytes public/img/emoji/train.png | Bin 2391 -> 0 bytes public/img/emoji/train2.png | Bin 2643 -> 0 bytes public/img/emoji/tram.png | Bin 2852 -> 0 bytes public/img/emoji/triangular_flag_on_post.png | Bin 1399 -> 0 bytes public/img/emoji/triangular_ruler.png | Bin 2005 -> 0 bytes public/img/emoji/trident.png | Bin 2705 -> 0 bytes public/img/emoji/triumph.png | Bin 3188 -> 0 bytes public/img/emoji/trolleybus.png | Bin 2531 -> 0 bytes public/img/emoji/trollface.png | Bin 3262 -> 0 bytes public/img/emoji/trophy.png | Bin 2767 -> 0 bytes public/img/emoji/tropical_drink.png | Bin 2305 -> 0 bytes public/img/emoji/tropical_fish.png | Bin 2716 -> 0 bytes public/img/emoji/truck.png | Bin 2339 -> 0 bytes public/img/emoji/trumpet.png | Bin 2330 -> 0 bytes public/img/emoji/tshirt.png | Bin 2794 -> 0 bytes public/img/emoji/tulip.png | Bin 2955 -> 0 bytes public/img/emoji/turtle.png | Bin 2767 -> 0 bytes public/img/emoji/tv.png | Bin 2622 -> 0 bytes .../img/emoji/twisted_rightwards_arrows.png | Bin 2561 -> 0 bytes public/img/emoji/two.png | Bin 2301 -> 0 bytes public/img/emoji/two_hearts.png | Bin 2128 -> 0 bytes public/img/emoji/two_men_holding_hands.png | Bin 3340 -> 0 bytes public/img/emoji/two_women_holding_hands.png | Bin 3464 -> 0 bytes public/img/emoji/u5272.png | Bin 2685 -> 0 bytes public/img/emoji/u5408.png | Bin 2593 -> 0 bytes public/img/emoji/u55b6.png | Bin 2428 -> 0 bytes public/img/emoji/u6307.png | Bin 2736 -> 0 bytes public/img/emoji/u6708.png | Bin 2265 -> 0 bytes public/img/emoji/u6709.png | Bin 2312 -> 0 bytes public/img/emoji/u6e80.png | Bin 2779 -> 0 bytes public/img/emoji/u7121.png | Bin 2630 -> 0 bytes public/img/emoji/u7533.png | Bin 2323 -> 0 bytes public/img/emoji/u7981.png | Bin 2793 -> 0 bytes public/img/emoji/u7a7a.png | Bin 2560 -> 0 bytes public/img/emoji/uk.png | Bin 2832 -> 0 bytes public/img/emoji/umbrella.png | Bin 2540 -> 0 bytes public/img/emoji/unamused.png | Bin 2976 -> 0 bytes public/img/emoji/underage.png | Bin 3085 -> 0 bytes public/img/emoji/unlock.png | Bin 2424 -> 0 bytes public/img/emoji/up.png | Bin 2484 -> 0 bytes public/img/emoji/us.png | Bin 2902 -> 0 bytes public/img/emoji/v.png | Bin 2722 -> 0 bytes public/img/emoji/vertical_traffic_light.png | Bin 2267 -> 0 bytes public/img/emoji/vhs.png | Bin 2234 -> 0 bytes public/img/emoji/vibration_mode.png | Bin 2620 -> 0 bytes public/img/emoji/video_camera.png | Bin 2876 -> 0 bytes public/img/emoji/video_game.png | Bin 3121 -> 0 bytes public/img/emoji/violin.png | Bin 2571 -> 0 bytes public/img/emoji/virgo.png | Bin 2764 -> 0 bytes public/img/emoji/volcano.png | Bin 3152 -> 0 bytes public/img/emoji/vs.png | Bin 2358 -> 0 bytes public/img/emoji/walking.png | Bin 1895 -> 0 bytes public/img/emoji/waning_crescent_moon.png | Bin 3152 -> 0 bytes public/img/emoji/waning_gibbous_moon.png | Bin 3513 -> 0 bytes public/img/emoji/warning.png | Bin 2155 -> 0 bytes public/img/emoji/watch.png | Bin 2889 -> 0 bytes public/img/emoji/water_buffalo.png | Bin 2836 -> 0 bytes public/img/emoji/watermelon.png | Bin 2798 -> 0 bytes public/img/emoji/wave.png | Bin 2974 -> 0 bytes public/img/emoji/wavy_dash.png | Bin 696 -> 0 bytes public/img/emoji/waxing_crescent_moon.png | Bin 3295 -> 0 bytes public/img/emoji/waxing_gibbous_moon.png | Bin 3179 -> 0 bytes public/img/emoji/wc.png | Bin 2471 -> 0 bytes public/img/emoji/weary.png | Bin 3222 -> 0 bytes public/img/emoji/wedding.png | Bin 2904 -> 0 bytes public/img/emoji/whale.png | Bin 2646 -> 0 bytes public/img/emoji/whale2.png | Bin 3249 -> 0 bytes public/img/emoji/wheelchair.png | Bin 2522 -> 0 bytes public/img/emoji/white_check_mark.png | Bin 2278 -> 0 bytes public/img/emoji/white_circle.png | Bin 2477 -> 0 bytes public/img/emoji/white_flower.png | Bin 2638 -> 0 bytes public/img/emoji/white_large_square.png | Bin 1411 -> 0 bytes .../img/emoji/white_medium_small_square.png | Bin 1800 -> 0 bytes public/img/emoji/white_medium_square.png | Bin 2085 -> 0 bytes public/img/emoji/white_small_square.png | Bin 1391 -> 0 bytes public/img/emoji/white_square_button.png | Bin 1725 -> 0 bytes public/img/emoji/wind_chime.png | Bin 2130 -> 0 bytes public/img/emoji/wine_glass.png | Bin 2154 -> 0 bytes public/img/emoji/wink.png | Bin 2999 -> 0 bytes public/img/emoji/wolf.png | Bin 2792 -> 0 bytes public/img/emoji/woman.png | Bin 3410 -> 0 bytes public/img/emoji/womans_clothes.png | Bin 2833 -> 0 bytes public/img/emoji/womans_hat.png | Bin 3541 -> 0 bytes public/img/emoji/womens.png | Bin 2412 -> 0 bytes public/img/emoji/worried.png | Bin 2956 -> 0 bytes public/img/emoji/wrench.png | Bin 2151 -> 0 bytes public/img/emoji/x.png | Bin 1994 -> 0 bytes public/img/emoji/yellow_heart.png | Bin 2459 -> 0 bytes public/img/emoji/yen.png | Bin 2741 -> 0 bytes public/img/emoji/yum.png | Bin 3044 -> 0 bytes public/img/emoji/zap.png | Bin 1774 -> 0 bytes public/img/emoji/zero.png | Bin 2379 -> 0 bytes public/img/emoji/zzz.png | Bin 1915 -> 0 bytes public/img/favicon.ico | Bin 0 -> 90022 bytes public/img/favicon.png | Bin 7052 -> 8268 bytes public/img/gitea-large-resize.png | Bin 16470 -> 0 bytes public/img/gitea-lg.png | Bin 26945 -> 46270 bytes public/img/gitea-sm.png | Bin 0 -> 4881 bytes public/img/gogs.ico | Bin 0 -> 29157 bytes public/img/openid-16x16.png | Bin 0 -> 230 bytes public/js/index.js | 340 +- public/js/jquery-1.11.3.min.js | 5 - public/js/libs/autolink.js | 15 - public/js/libs/clipboard-1.5.9.min.js | 7 - public/js/libs/emojify-1.1.0.min.js | 4 - public/js/libs/gitgraph.js | 399 - public/js/libs/jquery.are-you-sure.js | 192 - public/js/semantic-2.2.1.min.js | 19 - public/less/_admin.less | 4 +- public/less/_base.less | 67 + public/less/_editor.less | 13 +- public/less/_explore.less | 9 +- public/less/_form.less | 32 +- public/less/_repository.less | 169 +- public/less/_user.less | 21 +- .../plugins/codemirror-5.17.0/.gitattributes | 8 - public/plugins/codemirror-5.17.0/.gitignore | 8 - public/plugins/codemirror-5.17.0/.npmignore | 10 - public/plugins/codemirror-5.17.0/.travis.yml | 4 - .../codemirror-5.17.0/addon/mode/loadmode.js | 64 - .../codemirror-5.17.0/addon/mode/multiplex.js | 123 - .../addon/mode/multiplex_test.js | 33 - .../codemirror-5.17.0/addon/mode/overlay.js | 85 - .../codemirror-5.17.0/addon/mode/simple.js | 213 - .../plugins/codemirror-5.17.0/mode/apl/apl.js | 174 - .../codemirror-5.17.0/mode/apl/index.html | 72 - .../mode/asciiarmor/asciiarmor.js | 73 - .../mode/asciiarmor/index.html | 46 - .../codemirror-5.17.0/mode/asn.1/asn.1.js | 204 - .../codemirror-5.17.0/mode/asn.1/index.html | 77 - .../mode/asterisk/asterisk.js | 196 - .../mode/asterisk/index.html | 154 - .../mode/brainfuck/brainfuck.js | 85 - .../mode/brainfuck/index.html | 85 - .../codemirror-5.17.0/mode/clike/clike.js | 786 - .../codemirror-5.17.0/mode/clike/index.html | 360 - .../codemirror-5.17.0/mode/clike/scala.html | 767 - .../codemirror-5.17.0/mode/clike/test.js | 55 - .../codemirror-5.17.0/mode/clojure/clojure.js | 306 - .../codemirror-5.17.0/mode/clojure/index.html | 91 - .../codemirror-5.17.0/mode/cmake/cmake.js | 97 - .../codemirror-5.17.0/mode/cmake/index.html | 129 - .../codemirror-5.17.0/mode/cobol/cobol.js | 255 - .../codemirror-5.17.0/mode/cobol/index.html | 210 - .../mode/coffeescript/coffeescript.js | 355 - .../mode/coffeescript/index.html | 740 - .../mode/commonlisp/commonlisp.js | 123 - .../mode/commonlisp/index.html | 177 - .../codemirror-5.17.0/mode/crystal/crystal.js | 391 - .../codemirror-5.17.0/mode/crystal/index.html | 119 - .../plugins/codemirror-5.17.0/mode/css/css.js | 825 - .../codemirror-5.17.0/mode/css/gss.html | 103 - .../codemirror-5.17.0/mode/css/gss_test.js | 17 - .../codemirror-5.17.0/mode/css/index.html | 75 - .../codemirror-5.17.0/mode/css/less.html | 152 - .../codemirror-5.17.0/mode/css/less_test.js | 54 - .../codemirror-5.17.0/mode/css/scss.html | 157 - .../codemirror-5.17.0/mode/css/scss_test.js | 110 - .../codemirror-5.17.0/mode/css/test.js | 200 - .../codemirror-5.17.0/mode/cypher/cypher.js | 146 - .../codemirror-5.17.0/mode/cypher/index.html | 63 - public/plugins/codemirror-5.17.0/mode/d/d.js | 218 - .../codemirror-5.17.0/mode/d/index.html | 273 - .../codemirror-5.17.0/mode/dart/dart.js | 157 - .../codemirror-5.17.0/mode/dart/index.html | 71 - .../codemirror-5.17.0/mode/diff/diff.js | 47 - .../codemirror-5.17.0/mode/diff/index.html | 117 - .../codemirror-5.17.0/mode/django/django.js | 356 - .../codemirror-5.17.0/mode/django/index.html | 73 - .../mode/dockerfile/dockerfile.js | 79 - .../mode/dockerfile/index.html | 73 - .../plugins/codemirror-5.17.0/mode/dtd/dtd.js | 142 - .../codemirror-5.17.0/mode/dtd/index.html | 89 - .../codemirror-5.17.0/mode/dylan/dylan.js | 344 - .../codemirror-5.17.0/mode/dylan/index.html | 407 - .../codemirror-5.17.0/mode/dylan/test.js | 88 - .../codemirror-5.17.0/mode/ebnf/ebnf.js | 195 - .../codemirror-5.17.0/mode/ebnf/index.html | 102 - .../plugins/codemirror-5.17.0/mode/ecl/ecl.js | 206 - .../codemirror-5.17.0/mode/ecl/index.html | 52 - .../codemirror-5.17.0/mode/eiffel/eiffel.js | 160 - .../codemirror-5.17.0/mode/eiffel/index.html | 429 - .../plugins/codemirror-5.17.0/mode/elm/elm.js | 205 - .../codemirror-5.17.0/mode/elm/index.html | 61 - .../codemirror-5.17.0/mode/erlang/erlang.js | 618 - .../codemirror-5.17.0/mode/erlang/index.html | 76 - .../codemirror-5.17.0/mode/factor/factor.js | 83 - .../codemirror-5.17.0/mode/factor/index.html | 77 - .../plugins/codemirror-5.17.0/mode/fcl/fcl.js | 173 - .../codemirror-5.17.0/mode/fcl/index.html | 108 - .../codemirror-5.17.0/mode/forth/forth.js | 180 - .../codemirror-5.17.0/mode/forth/index.html | 75 - .../codemirror-5.17.0/mode/fortran/fortran.js | 188 - .../codemirror-5.17.0/mode/fortran/index.html | 81 - .../plugins/codemirror-5.17.0/mode/gas/gas.js | 345 - .../codemirror-5.17.0/mode/gas/index.html | 68 - .../plugins/codemirror-5.17.0/mode/gfm/gfm.js | 130 - .../codemirror-5.17.0/mode/gfm/index.html | 93 - .../codemirror-5.17.0/mode/gfm/test.js | 236 - .../codemirror-5.17.0/mode/gherkin/gherkin.js | 178 - .../codemirror-5.17.0/mode/gherkin/index.html | 48 - .../plugins/codemirror-5.17.0/mode/go/go.js | 185 - .../codemirror-5.17.0/mode/go/index.html | 85 - .../codemirror-5.17.0/mode/groovy/groovy.js | 230 - .../codemirror-5.17.0/mode/groovy/index.html | 84 - .../codemirror-5.17.0/mode/haml/haml.js | 161 - .../codemirror-5.17.0/mode/haml/index.html | 79 - .../codemirror-5.17.0/mode/haml/test.js | 97 - .../mode/handlebars/handlebars.js | 62 - .../mode/handlebars/index.html | 79 - .../mode/haskell-literate/haskell-literate.js | 43 - .../mode/haskell-literate/index.html | 282 - .../codemirror-5.17.0/mode/haskell/haskell.js | 267 - .../codemirror-5.17.0/mode/haskell/index.html | 73 - .../codemirror-5.17.0/mode/haxe/haxe.js | 515 - .../codemirror-5.17.0/mode/haxe/index.html | 124 - .../mode/htmlembedded/htmlembedded.js | 28 - .../mode/htmlembedded/index.html | 60 - .../mode/htmlmixed/htmlmixed.js | 152 - .../mode/htmlmixed/index.html | 89 - .../codemirror-5.17.0/mode/http/http.js | 113 - .../codemirror-5.17.0/mode/http/index.html | 45 - .../plugins/codemirror-5.17.0/mode/idl/idl.js | 290 - .../codemirror-5.17.0/mode/idl/index.html | 64 - .../plugins/codemirror-5.17.0/mode/index.html | 164 - .../codemirror-5.17.0/mode/jade/index.html | 70 - .../codemirror-5.17.0/mode/jade/jade.js | 590 - .../mode/javascript/index.html | 114 - .../mode/javascript/javascript.js | 743 - .../mode/javascript/json-ld.html | 72 - .../codemirror-5.17.0/mode/javascript/test.js | 207 - .../mode/javascript/typescript.html | 61 - .../codemirror-5.17.0/mode/jinja2/index.html | 54 - .../codemirror-5.17.0/mode/jinja2/jinja2.js | 142 - .../codemirror-5.17.0/mode/jsx/index.html | 89 - .../plugins/codemirror-5.17.0/mode/jsx/jsx.js | 147 - .../codemirror-5.17.0/mode/jsx/test.js | 69 - .../codemirror-5.17.0/mode/julia/index.html | 195 - .../codemirror-5.17.0/mode/julia/julia.js | 392 - .../mode/livescript/index.html | 459 - .../mode/livescript/livescript.js | 280 - .../codemirror-5.17.0/mode/lua/index.html | 85 - .../plugins/codemirror-5.17.0/mode/lua/lua.js | 159 - .../mode/markdown/index.html | 361 - .../mode/markdown/markdown.js | 819 - .../codemirror-5.17.0/mode/markdown/test.js | 990 - .../mode/mathematica/index.html | 72 - .../mode/mathematica/mathematica.js | 176 - .../codemirror-5.17.0/mode/mbox/index.html | 44 - .../codemirror-5.17.0/mode/mbox/mbox.js | 129 - public/plugins/codemirror-5.17.0/mode/meta.js | 208 - .../codemirror-5.17.0/mode/mirc/index.html | 160 - .../codemirror-5.17.0/mode/mirc/mirc.js | 193 - .../codemirror-5.17.0/mode/mllike/index.html | 179 - .../codemirror-5.17.0/mode/mllike/mllike.js | 205 - .../mode/modelica/index.html | 67 - .../mode/modelica/modelica.js | 245 - .../codemirror-5.17.0/mode/mscgen/index.html | 151 - .../codemirror-5.17.0/mode/mscgen/mscgen.js | 169 - .../mode/mscgen/mscgen_test.js | 75 - .../mode/mscgen/msgenny_test.js | 71 - .../codemirror-5.17.0/mode/mscgen/xu_test.js | 75 - .../codemirror-5.17.0/mode/mumps/index.html | 85 - .../codemirror-5.17.0/mode/mumps/mumps.js | 148 - .../codemirror-5.17.0/mode/nginx/index.html | 181 - .../codemirror-5.17.0/mode/nginx/nginx.js | 178 - .../codemirror-5.17.0/mode/nsis/index.html | 80 - .../codemirror-5.17.0/mode/nsis/nsis.js | 95 - .../mode/ntriples/index.html | 45 - .../mode/ntriples/ntriples.js | 186 - .../codemirror-5.17.0/mode/octave/index.html | 83 - .../codemirror-5.17.0/mode/octave/octave.js | 135 - .../codemirror-5.17.0/mode/oz/index.html | 59 - .../plugins/codemirror-5.17.0/mode/oz/oz.js | 252 - .../codemirror-5.17.0/mode/pascal/index.html | 61 - .../codemirror-5.17.0/mode/pascal/pascal.js | 109 - .../codemirror-5.17.0/mode/pegjs/index.html | 66 - .../codemirror-5.17.0/mode/pegjs/pegjs.js | 114 - .../codemirror-5.17.0/mode/perl/index.html | 75 - .../codemirror-5.17.0/mode/perl/perl.js | 837 - .../codemirror-5.17.0/mode/php/index.html | 64 - .../plugins/codemirror-5.17.0/mode/php/php.js | 234 - .../codemirror-5.17.0/mode/php/test.js | 154 - .../codemirror-5.17.0/mode/pig/index.html | 53 - .../plugins/codemirror-5.17.0/mode/pig/pig.js | 178 - .../mode/powershell/index.html | 204 - .../mode/powershell/powershell.js | 396 - .../codemirror-5.17.0/mode/powershell/test.js | 72 - .../mode/properties/index.html | 53 - .../mode/properties/properties.js | 78 - .../mode/protobuf/index.html | 64 - .../mode/protobuf/protobuf.js | 68 - .../codemirror-5.17.0/mode/puppet/index.html | 121 - .../codemirror-5.17.0/mode/puppet/puppet.js | 220 - .../codemirror-5.17.0/mode/python/index.html | 198 - .../codemirror-5.17.0/mode/python/python.js | 340 - .../codemirror-5.17.0/mode/python/test.js | 30 - .../codemirror-5.17.0/mode/q/index.html | 144 - public/plugins/codemirror-5.17.0/mode/q/q.js | 139 - .../codemirror-5.17.0/mode/r/index.html | 85 - public/plugins/codemirror-5.17.0/mode/r/r.js | 164 - .../mode/rpm/changes/index.html | 66 - .../codemirror-5.17.0/mode/rpm/index.html | 149 - .../plugins/codemirror-5.17.0/mode/rpm/rpm.js | 109 - .../codemirror-5.17.0/mode/rst/index.html | 535 - .../plugins/codemirror-5.17.0/mode/rst/rst.js | 557 - .../codemirror-5.17.0/mode/ruby/index.html | 183 - .../codemirror-5.17.0/mode/ruby/ruby.js | 285 - .../codemirror-5.17.0/mode/ruby/test.js | 14 - .../codemirror-5.17.0/mode/rust/index.html | 64 - .../codemirror-5.17.0/mode/rust/rust.js | 71 - .../codemirror-5.17.0/mode/rust/test.js | 39 - .../codemirror-5.17.0/mode/sas/index.html | 81 - .../plugins/codemirror-5.17.0/mode/sas/sas.js | 315 - .../codemirror-5.17.0/mode/sass/index.html | 66 - .../codemirror-5.17.0/mode/sass/sass.js | 414 - .../codemirror-5.17.0/mode/scheme/index.html | 77 - .../codemirror-5.17.0/mode/scheme/scheme.js | 249 - .../codemirror-5.17.0/mode/shell/index.html | 66 - .../codemirror-5.17.0/mode/shell/shell.js | 139 - .../codemirror-5.17.0/mode/shell/test.js | 58 - .../codemirror-5.17.0/mode/sieve/index.html | 93 - .../codemirror-5.17.0/mode/sieve/sieve.js | 193 - .../codemirror-5.17.0/mode/slim/index.html | 96 - .../codemirror-5.17.0/mode/slim/slim.js | 575 - .../codemirror-5.17.0/mode/slim/test.js | 96 - .../mode/smalltalk/index.html | 68 - .../mode/smalltalk/smalltalk.js | 168 - .../codemirror-5.17.0/mode/smarty/index.html | 138 - .../codemirror-5.17.0/mode/smarty/smarty.js | 225 - .../codemirror-5.17.0/mode/solr/index.html | 57 - .../codemirror-5.17.0/mode/solr/solr.js | 104 - .../codemirror-5.17.0/mode/soy/index.html | 68 - .../plugins/codemirror-5.17.0/mode/soy/soy.js | 199 - .../codemirror-5.17.0/mode/sparql/index.html | 61 - .../codemirror-5.17.0/mode/sparql/sparql.js | 180 - .../mode/spreadsheet/index.html | 42 - .../mode/spreadsheet/spreadsheet.js | 112 - .../codemirror-5.17.0/mode/sql/index.html | 86 - .../plugins/codemirror-5.17.0/mode/sql/sql.js | 413 - .../codemirror-5.17.0/mode/stex/index.html | 110 - .../codemirror-5.17.0/mode/stex/stex.js | 251 - .../codemirror-5.17.0/mode/stex/test.js | 123 - .../codemirror-5.17.0/mode/stylus/index.html | 106 - .../codemirror-5.17.0/mode/stylus/stylus.js | 769 - .../codemirror-5.17.0/mode/swift/index.html | 88 - .../codemirror-5.17.0/mode/swift/swift.js | 202 - .../codemirror-5.17.0/mode/tcl/index.html | 142 - .../plugins/codemirror-5.17.0/mode/tcl/tcl.js | 139 - .../codemirror-5.17.0/mode/textile/index.html | 191 - .../codemirror-5.17.0/mode/textile/test.js | 417 - .../codemirror-5.17.0/mode/textile/textile.js | 469 - .../mode/tiddlywiki/index.html | 154 - .../mode/tiddlywiki/tiddlywiki.css | 14 - .../mode/tiddlywiki/tiddlywiki.js | 308 - .../codemirror-5.17.0/mode/tiki/index.html | 95 - .../codemirror-5.17.0/mode/tiki/tiki.css | 26 - .../codemirror-5.17.0/mode/tiki/tiki.js | 312 - .../codemirror-5.17.0/mode/toml/index.html | 73 - .../codemirror-5.17.0/mode/toml/toml.js | 88 - .../codemirror-5.17.0/mode/tornado/index.html | 63 - .../codemirror-5.17.0/mode/tornado/tornado.js | 68 - .../codemirror-5.17.0/mode/troff/index.html | 146 - .../codemirror-5.17.0/mode/troff/troff.js | 84 - .../mode/ttcn-cfg/index.html | 115 - .../mode/ttcn-cfg/ttcn-cfg.js | 214 - .../codemirror-5.17.0/mode/ttcn/index.html | 118 - .../codemirror-5.17.0/mode/ttcn/ttcn.js | 283 - .../codemirror-5.17.0/mode/turtle/index.html | 50 - .../codemirror-5.17.0/mode/turtle/turtle.js | 162 - .../codemirror-5.17.0/mode/twig/index.html | 45 - .../codemirror-5.17.0/mode/twig/twig.js | 141 - .../codemirror-5.17.0/mode/vb/index.html | 102 - .../plugins/codemirror-5.17.0/mode/vb/vb.js | 276 - .../mode/vbscript/index.html | 55 - .../mode/vbscript/vbscript.js | 350 - .../mode/velocity/index.html | 120 - .../mode/velocity/velocity.js | 201 - .../codemirror-5.17.0/mode/verilog/index.html | 120 - .../codemirror-5.17.0/mode/verilog/test.js | 273 - .../codemirror-5.17.0/mode/verilog/verilog.js | 537 - .../codemirror-5.17.0/mode/vhdl/index.html | 95 - .../codemirror-5.17.0/mode/vhdl/vhdl.js | 189 - .../codemirror-5.17.0/mode/vue/index.html | 69 - .../plugins/codemirror-5.17.0/mode/vue/vue.js | 69 - .../codemirror-5.17.0/mode/webidl/index.html | 71 - .../codemirror-5.17.0/mode/webidl/webidl.js | 195 - .../codemirror-5.17.0/mode/xml/index.html | 61 - .../codemirror-5.17.0/mode/xml/test.js | 51 - .../plugins/codemirror-5.17.0/mode/xml/xml.js | 394 - .../codemirror-5.17.0/mode/xquery/index.html | 210 - .../codemirror-5.17.0/mode/xquery/test.js | 67 - .../codemirror-5.17.0/mode/xquery/xquery.js | 437 - .../codemirror-5.17.0/mode/yacas/index.html | 87 - .../codemirror-5.17.0/mode/yacas/yacas.js | 204 - .../mode/yaml-frontmatter/index.html | 121 - .../mode/yaml-frontmatter/yaml-frontmatter.js | 68 - .../codemirror-5.17.0/mode/yaml/index.html | 80 - .../codemirror-5.17.0/mode/yaml/yaml.js | 117 - .../codemirror-5.17.0/mode/z80/index.html | 53 - .../plugins/codemirror-5.17.0/mode/z80/z80.js | 116 - public/plugins/dropzone-4.2.0/dropzone.css | 388 - public/plugins/dropzone-4.2.0/dropzone.js | 1752 - public/plugins/highlight-9.6.0/default.css | 99 - public/plugins/highlight-9.6.0/github.css | 99 - .../plugins/highlight-9.6.0/highlight.pack.js | 3 - .../jquery.datetimepicker.css | 545 - .../jquery.datetimepicker.js | 2073 - .../jquery.minicolors.css | 323 - .../jquery.minicolors.min.js | 11 - .../jquery.minicolors.png | Bin 68627 -> 0 bytes public/plugins/pdfjs-1.4.20/LICENSE | 177 - public/plugins/pdfjs-1.4.20/build/pdf.js | 10375 ---- .../plugins/pdfjs-1.4.20/build/pdf.worker.js | 42034 ---------------- .../plugins/pdfjs-1.4.20/web/compatibility.js | 593 - public/plugins/pdfjs-1.4.20/web/debugger.js | 618 - .../web/images/annotation-check.svg | 11 - .../web/images/annotation-comment.svg | 16 - .../web/images/annotation-help.svg | 26 - .../web/images/annotation-insert.svg | 10 - .../web/images/annotation-key.svg | 11 - .../web/images/annotation-newparagraph.svg | 11 - .../web/images/annotation-noicon.svg | 7 - .../web/images/annotation-note.svg | 42 - .../web/images/annotation-paragraph.svg | 16 - .../web/images/findbarButton-next-rtl.png | Bin 199 -> 0 bytes .../web/images/findbarButton-next-rtl@2x.png | Bin 304 -> 0 bytes .../web/images/findbarButton-next.png | Bin 193 -> 0 bytes .../web/images/findbarButton-next@2x.png | Bin 296 -> 0 bytes .../web/images/findbarButton-previous-rtl.png | Bin 193 -> 0 bytes .../images/findbarButton-previous-rtl@2x.png | Bin 296 -> 0 bytes .../web/images/findbarButton-previous.png | Bin 199 -> 0 bytes .../web/images/findbarButton-previous@2x.png | Bin 304 -> 0 bytes .../plugins/pdfjs-1.4.20/web/images/grab.cur | Bin 326 -> 0 bytes .../pdfjs-1.4.20/web/images/grabbing.cur | Bin 326 -> 0 bytes .../pdfjs-1.4.20/web/images/loading-icon.gif | Bin 2545 -> 0 bytes .../pdfjs-1.4.20/web/images/loading-small.png | Bin 7402 -> 0 bytes .../web/images/loading-small@2x.png | Bin 16131 -> 0 bytes ...ondaryToolbarButton-documentProperties.png | Bin 403 -> 0 bytes ...aryToolbarButton-documentProperties@2x.png | Bin 933 -> 0 bytes .../secondaryToolbarButton-firstPage.png | Bin 179 -> 0 bytes .../secondaryToolbarButton-firstPage@2x.png | Bin 266 -> 0 bytes .../secondaryToolbarButton-handTool.png | Bin 301 -> 0 bytes .../secondaryToolbarButton-handTool@2x.png | Bin 583 -> 0 bytes .../secondaryToolbarButton-lastPage.png | Bin 175 -> 0 bytes .../secondaryToolbarButton-lastPage@2x.png | Bin 276 -> 0 bytes .../secondaryToolbarButton-rotateCcw.png | Bin 360 -> 0 bytes .../secondaryToolbarButton-rotateCcw@2x.png | Bin 731 -> 0 bytes .../secondaryToolbarButton-rotateCw.png | Bin 359 -> 0 bytes .../secondaryToolbarButton-rotateCw@2x.png | Bin 714 -> 0 bytes .../pdfjs-1.4.20/web/images/shadow.png | Bin 290 -> 0 bytes .../pdfjs-1.4.20/web/images/texture.png | Bin 2418 -> 0 bytes .../web/images/toolbarButton-bookmark.png | Bin 174 -> 0 bytes .../web/images/toolbarButton-bookmark@2x.png | Bin 260 -> 0 bytes .../web/images/toolbarButton-download.png | Bin 259 -> 0 bytes .../web/images/toolbarButton-download@2x.png | Bin 425 -> 0 bytes .../web/images/toolbarButton-menuArrows.png | Bin 108 -> 0 bytes .../images/toolbarButton-menuArrows@2x.png | Bin 152 -> 0 bytes .../web/images/toolbarButton-openFile.png | Bin 295 -> 0 bytes .../web/images/toolbarButton-openFile@2x.png | Bin 550 -> 0 bytes .../web/images/toolbarButton-pageDown-rtl.png | Bin 242 -> 0 bytes .../images/toolbarButton-pageDown-rtl@2x.png | Bin 398 -> 0 bytes .../web/images/toolbarButton-pageDown.png | Bin 238 -> 0 bytes .../web/images/toolbarButton-pageDown@2x.png | Bin 396 -> 0 bytes .../web/images/toolbarButton-pageUp-rtl.png | Bin 245 -> 0 bytes .../images/toolbarButton-pageUp-rtl@2x.png | Bin 405 -> 0 bytes .../web/images/toolbarButton-pageUp.png | Bin 246 -> 0 bytes .../web/images/toolbarButton-pageUp@2x.png | Bin 403 -> 0 bytes .../images/toolbarButton-presentationMode.png | Bin 321 -> 0 bytes .../toolbarButton-presentationMode@2x.png | Bin 586 -> 0 bytes .../web/images/toolbarButton-print.png | Bin 257 -> 0 bytes .../web/images/toolbarButton-print@2x.png | Bin 464 -> 0 bytes .../web/images/toolbarButton-search.png | Bin 309 -> 0 bytes .../web/images/toolbarButton-search@2x.png | Bin 653 -> 0 bytes ...olbarButton-secondaryToolbarToggle-rtl.png | Bin 246 -> 0 bytes ...arButton-secondaryToolbarToggle-rtl@2x.png | Bin 456 -> 0 bytes .../toolbarButton-secondaryToolbarToggle.png | Bin 243 -> 0 bytes ...oolbarButton-secondaryToolbarToggle@2x.png | Bin 458 -> 0 bytes .../toolbarButton-sidebarToggle-rtl.png | Bin 225 -> 0 bytes .../toolbarButton-sidebarToggle-rtl@2x.png | Bin 344 -> 0 bytes .../images/toolbarButton-sidebarToggle.png | Bin 225 -> 0 bytes .../images/toolbarButton-sidebarToggle@2x.png | Bin 331 -> 0 bytes .../images/toolbarButton-viewAttachments.png | Bin 384 -> 0 bytes .../toolbarButton-viewAttachments@2x.png | Bin 871 -> 0 bytes .../images/toolbarButton-viewOutline-rtl.png | Bin 177 -> 0 bytes .../toolbarButton-viewOutline-rtl@2x.png | Bin 394 -> 0 bytes .../web/images/toolbarButton-viewOutline.png | Bin 178 -> 0 bytes .../images/toolbarButton-viewOutline@2x.png | Bin 331 -> 0 bytes .../images/toolbarButton-viewThumbnail.png | Bin 185 -> 0 bytes .../images/toolbarButton-viewThumbnail@2x.png | Bin 220 -> 0 bytes .../web/images/toolbarButton-zoomIn.png | Bin 136 -> 0 bytes .../web/images/toolbarButton-zoomIn@2x.png | Bin 160 -> 0 bytes .../web/images/toolbarButton-zoomOut.png | Bin 88 -> 0 bytes .../web/images/toolbarButton-zoomOut@2x.png | Bin 109 -> 0 bytes .../web/images/treeitem-collapsed-rtl.png | Bin 183 -> 0 bytes .../web/images/treeitem-collapsed-rtl@2x.png | Bin 205 -> 0 bytes .../web/images/treeitem-collapsed.png | Bin 128 -> 0 bytes .../web/images/treeitem-collapsed@2x.png | Bin 149 -> 0 bytes .../web/images/treeitem-expanded.png | Bin 125 -> 0 bytes .../web/images/treeitem-expanded@2x.png | Bin 172 -> 0 bytes public/plugins/pdfjs-1.4.20/web/viewer.css | 2122 - public/plugins/pdfjs-1.4.20/web/viewer.html | 422 - public/plugins/pdfjs-1.4.20/web/viewer.js | 7952 --- .../simplemde-1.10.1/simplemde.min.css | 7 - .../plugins/simplemde-1.10.1/simplemde.min.js | 14 - public/swagger.v1.json | 2819 ++ routers/admin/admin.go | 7 +- routers/admin/auths.go | 48 +- routers/api/v1/admin/org.go | 15 +- routers/api/v1/admin/repo.go | 15 +- routers/api/v1/admin/user.go | 57 +- routers/api/v1/api.go | 159 +- routers/api/v1/convert/convert.go | 57 + routers/api/v1/misc/markdown.go | 25 +- routers/api/v1/misc/markdown_test.go | 2 +- routers/api/v1/misc/version.go | 12 + routers/api/v1/org/hook.go | 56 + routers/api/v1/org/member.go | 99 +- routers/api/v1/org/org.go | 2 +- routers/api/v1/org/team.go | 6 +- routers/api/v1/repo/branch.go | 16 +- routers/api/v1/repo/file.go | 5 + routers/api/v1/repo/fork.go | 25 +- routers/api/v1/repo/hook.go | 45 +- routers/api/v1/repo/issue.go | 29 +- routers/api/v1/repo/issue_comment.go | 12 +- routers/api/v1/repo/issue_label.go | 4 +- routers/api/v1/repo/label.go | 2 +- routers/api/v1/repo/release.go | 104 +- routers/api/v1/repo/repo.go | 169 +- routers/api/v1/repo/status.go | 122 + routers/api/v1/user/app.go | 23 +- routers/api/v1/user/follower.go | 66 +- routers/api/v1/user/gpg_key.go | 153 + routers/api/v1/user/key.go | 56 +- routers/api/v1/user/repo.go | 96 +- routers/api/v1/user/star.go | 43 +- routers/api/v1/user/user.go | 27 + routers/api/v1/user/watch.go | 58 +- routers/api/v1/utils/utils.go | 15 + routers/dev/template.go | 4 +- routers/home.go | 35 +- routers/init.go | 4 +- routers/install.go | 9 +- routers/org/members.go | 6 + routers/org/teams.go | 53 +- routers/private/branch.go | 25 + routers/private/internal.go | 47 + routers/private/push_update.go | 47 + routers/repo/branch.go | 59 - routers/repo/commit.go | 13 + routers/repo/download.go | 4 +- routers/repo/editor.go | 106 +- routers/repo/http.go | 71 +- routers/repo/issue.go | 195 +- routers/repo/issue_label.go | 58 +- routers/repo/issue_watch.go | 36 + routers/repo/pull.go | 187 +- routers/repo/release.go | 203 +- routers/repo/repo.go | 7 +- routers/repo/setting.go | 23 +- routers/repo/view.go | 77 +- routers/repo/webhook.go | 93 +- routers/repo/wiki.go | 7 +- routers/routes/routes.go | 676 + routers/user/auth.go | 57 +- routers/user/auth_openid.go | 424 + routers/user/home.go | 206 +- routers/user/home_test.go | 33 + routers/user/main_test.go | 33 + routers/user/profile.go | 31 +- routers/user/setting.go | 162 +- routers/user/setting_openid.go | 155 + scripts/generate-gitignores.go | 93 + scripts/generate-licenses.go | 101 + templates/admin/auth/edit.tmpl | 421 +- templates/admin/auth/list.tmpl | 72 +- templates/admin/auth/new.tmpl | 296 +- templates/admin/auth/source/ldap.tmpl | 65 + templates/admin/auth/source/oauth.tmpl | 58 + templates/admin/auth/source/smtp.tmpl | 28 + templates/admin/base/search.tmpl | 2 + templates/admin/config.tmpl | 516 +- templates/admin/dashboard.tmpl | 234 +- templates/admin/monitor.tmpl | 110 +- templates/admin/navbar.tmpl | 55 +- templates/admin/notice.tmpl | 172 +- templates/admin/org/list.tmpl | 79 +- templates/admin/repo/list.tmpl | 88 +- templates/admin/user/edit.tmpl | 222 +- templates/admin/user/list.tmpl | 98 +- templates/admin/user/new.tmpl | 110 +- templates/base/footer.tmpl | 41 +- templates/base/head.tmpl | 75 +- templates/base/paginate.tmpl | 10 +- templates/explore/navbar.tmpl | 23 +- templates/explore/organizations.tmpl | 52 +- templates/explore/repo_list.tmpl | 2 +- templates/explore/repos.tmpl | 12 +- templates/explore/users.tmpl | 52 +- templates/install.tmpl | 18 + templates/mail/auth/activate.tmpl | 4 +- templates/mail/auth/activate_email.tmpl | 4 +- templates/mail/auth/register_notify.tmpl | 2 +- templates/mail/auth/reset_passwd.tmpl | 4 +- templates/org/header.tmpl | 2 +- templates/org/home.tmpl | 2 +- templates/org/member/invite.tmpl | 2 +- templates/org/settings/hook_new.tmpl | 7 +- templates/org/settings/hooks.tmpl | 4 +- templates/org/settings/options.tmpl | 2 +- templates/org/team/members.tmpl | 2 +- templates/org/team/new.tmpl | 15 + templates/repo/bare.tmpl | 15 +- templates/repo/branch_dropdown.tmpl | 2 +- templates/repo/commits.tmpl | 6 +- templates/repo/commits_table.tmpl | 40 +- templates/repo/diff/box.tmpl | 2 +- templates/repo/diff/page.tmpl | 19 +- templates/repo/editor/commit_form.tmpl | 4 +- templates/repo/editor/edit.tmpl | 2 +- templates/repo/editor/upload.tmpl | 2 +- templates/repo/graph.tmpl | 3 +- templates/repo/header.tmpl | 32 +- templates/repo/home.tmpl | 41 +- templates/repo/issue/list.tmpl | 212 +- templates/repo/issue/view_content.tmpl | 315 +- .../repo/issue/view_content/comments.tmpl | 144 + templates/repo/issue/view_content/pull.tmpl | 63 + .../repo/issue/view_content/sidebar.tmpl | 125 + templates/repo/migrate.tmpl | 5 +- templates/repo/pulls/fork.tmpl | 20 +- templates/repo/release/list.tmpl | 29 +- templates/repo/settings/branches.tmpl | 142 +- templates/repo/settings/collaboration.tmpl | 90 +- templates/repo/settings/deploy_keys.tmpl | 111 +- templates/repo/settings/githook_edit.tmpl | 50 +- templates/repo/settings/githooks.tmpl | 36 +- templates/repo/settings/hook_gitea.tmpl | 28 + templates/repo/settings/hook_gogs.tmpl | 2 +- templates/repo/settings/hook_history.tmpl | 4 +- templates/repo/settings/hook_list.tmpl | 73 +- templates/repo/settings/hook_new.tmpl | 39 +- templates/repo/settings/hooks.tmpl | 6 +- templates/repo/settings/navbar.tmpl | 45 +- templates/repo/settings/options.tmpl | 460 +- templates/repo/view_file.tmpl | 6 +- templates/repo/view_list.tmpl | 18 +- templates/repo/wiki/new.tmpl | 2 +- templates/repo/wiki/view.tmpl | 12 +- templates/swagger.tmpl | 93 + templates/user/auth/activate.tmpl | 4 +- templates/user/auth/finalize_openid.tmpl | 46 + templates/user/auth/forgot_passwd.tmpl | 6 +- templates/user/auth/link_account.tmpl | 2 + templates/user/auth/signin.tmpl | 7 +- templates/user/auth/signin_inner.tmpl | 105 +- templates/user/auth/signin_navbar.tmpl | 11 + templates/user/auth/signin_openid.tmpl | 38 + templates/user/auth/signup_inner.tmpl | 4 +- .../user/auth/signup_openid_connect.tmpl | 36 + templates/user/auth/signup_openid_navbar.tmpl | 11 + .../user/auth/signup_openid_register.tmpl | 45 + templates/user/auth/twofa.tmpl | 2 +- templates/user/auth/twofa_scratch.tmpl | 2 +- templates/user/dashboard/dashboard.tmpl | 187 +- templates/user/dashboard/feeds.tmpl | 4 +- templates/user/dashboard/issues.tmpl | 2 +- templates/user/profile.tmpl | 10 +- templates/user/settings/account_link.tmpl | 52 +- templates/user/settings/applications.tmpl | 97 +- templates/user/settings/avatar.tmpl | 78 +- templates/user/settings/delete.tmpl | 45 +- templates/user/settings/email.tmpl | 90 +- templates/user/settings/keys.tmpl | 12 + templates/user/settings/keys_gpg.tmpl | 67 + templates/user/settings/keys_ssh.tmpl | 67 + templates/user/settings/navbar.tmpl | 65 +- templates/user/settings/openid.tmpl | 71 + templates/user/settings/organization.tmpl | 35 + templates/user/settings/password.tmpl | 67 +- templates/user/settings/profile.tmpl | 90 +- templates/user/settings/sshkeys.tmpl | 83 - templates/user/settings/twofa.tmpl | 52 +- templates/user/settings/twofa_enroll.tmpl | 44 +- 2269 files changed, 48031 insertions(+), 135459 deletions(-) delete mode 100644 .drone.yml.sig create mode 100644 Dockerfile.aarch64 create mode 100644 assets/logo.svg rename {scripts => contrib}/README (100%) rename {scripts => contrib}/autoboot.sh (100%) rename {scripts => contrib}/init/centos/gitea (100%) rename {scripts => contrib}/init/debian/gitea (98%) rename {scripts => contrib}/init/freebsd/gitea (100%) rename {scripts => contrib}/init/gentoo/gitea (100%) rename {scripts => contrib}/init/openbsd/gitea (100%) rename {scripts => contrib}/init/suse/gitea (100%) rename {scripts => contrib}/launchd/io.gitea.web.plist (100%) rename {scripts => contrib}/migrate/gogs_migrate.sh (100%) rename {scripts => contrib}/mysql.sql (100%) rename {scripts => contrib}/supervisor/gitea (100%) rename {scripts => contrib}/systemd/gitea.service (100%) rename {scripts => contrib}/windows/install-as-service.bat (100%) create mode 100644 integrations/api_branch_test.go create mode 100644 integrations/api_comment_test.go create mode 100644 integrations/api_fork_test.go create mode 100644 integrations/api_issue_label_test.go create mode 100644 integrations/api_issue_test.go create mode 100644 integrations/api_keys_test.go create mode 100644 integrations/api_pull_test.go create mode 100644 integrations/api_repo_test.go create mode 100644 integrations/api_team_test.go create mode 100644 integrations/bare_repo_test.go create mode 100644 integrations/change_default_branch_test.go create mode 100644 integrations/delete_user_test.go create mode 100644 integrations/editor_test.go create mode 100644 integrations/explore_repos_test.go create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/HEAD create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/config create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/description create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/applypatch-msg.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/commit-msg.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-receive create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-receive.d/gitea create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-update.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-applypatch.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-commit.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-push.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-rebase.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-receive create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-receive.d/gitea create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/prepare-commit-msg.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update.d/gitea create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update.sample create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/info/exclude create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/info/refs create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/objects/2a/2f1d4670728a2e10049e345bd7a276468beab6 create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/objects/4b/4851ad51df6a7d9f25c979345979eaeb5b349f create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/objects/65/f1bf27bc3bf70f64657658635e66094edbcb4d create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/objects/info/packs create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/refs/heads/DefaultBranch create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/refs/heads/develop create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/refs/heads/feature/1 create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/refs/heads/master create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/HEAD create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/config create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/description create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/applypatch-msg.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/commit-msg.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-receive create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-receive.d/gitea create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-update.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-applypatch.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-commit.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-push.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-rebase.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-receive create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-receive.d/gitea create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/prepare-commit-msg.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update.d/gitea create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update.sample create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/info/exclude create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/HEAD create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/config create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/description create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/applypatch-msg.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/commit-msg.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-receive create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-receive.d/gitea create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-update.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-applypatch.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-commit.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-push.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-rebase.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive.d/gitea create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/prepare-commit-msg.sample create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update.d/gitea create mode 100755 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update.sample create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/info/exclude create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/20/ade30d25e0ecaeec84e7f542a8456900858240 create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/27/74debeea6dc742cc4971a92db0e08b95b60588 create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/2a/47ca4b614a9f5a43abbd5ad851a54a616ffee6 create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/2f/9b22fd3159a43b7b4e5dd806fcd544edf8716f create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/d5/6a3073c1dbb7b15963110a049d50cdb5db99fc create mode 100644 integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/refs/heads/master create mode 100644 integrations/html_helper.go delete mode 100644 integrations/install_test.go create mode 100644 integrations/integration_test.go delete mode 100644 integrations/internal/utils/utils.go create mode 100644 integrations/internal_test.go create mode 100644 integrations/issue_test.go create mode 100644 integrations/links_test.go create mode 100644 integrations/mysql.ini create mode 100644 integrations/pgsql.ini create mode 100644 integrations/pull_compare_test.go create mode 100644 integrations/pull_create_test.go create mode 100644 integrations/pull_merge_test.go create mode 100644 integrations/release_test.go create mode 100644 integrations/repo_commits_test.go create mode 100644 integrations/repo_fork_test.go create mode 100644 integrations/repo_migrate_test.go create mode 100644 integrations/repo_test.go create mode 100644 integrations/setting_test.go create mode 100644 integrations/signin_test.go create mode 100644 integrations/signup_test.go create mode 100644 integrations/sqlite.ini create mode 100644 integrations/user_test.go create mode 100644 integrations/xss_test.go create mode 100644 models/attachment_test.go rename models/{consistency_test.go => consistency.go} (83%) create mode 100644 models/error_oauth2.go create mode 100644 models/fixtures/attachment.yml create mode 100644 models/fixtures/commit_status.yml create mode 100644 models/fixtures/follow.yml create mode 100644 models/fixtures/issue_watch.yml create mode 100644 models/fixtures/protected_branch.yml create mode 100644 models/fixtures/release.yml create mode 100644 models/fixtures/repo_unit.yml create mode 100644 models/fixtures/user_open_id.yml create mode 100644 models/gpg_key.go create mode 100644 models/gpg_key_test.go create mode 100644 models/issue_comment_test.go create mode 100644 models/issue_list_test.go create mode 100644 models/issue_watch.go create mode 100644 models/issue_watch_test.go create mode 100644 models/main_test.go create mode 100644 models/migrations/v23.go create mode 100644 models/migrations/v24.go create mode 100644 models/migrations/v25.go create mode 100644 models/migrations/v26.go create mode 100644 models/migrations/v27.go create mode 100644 models/migrations/v28.go create mode 100644 models/migrations/v29.go create mode 100644 models/migrations/v30.go create mode 100644 models/migrations/v31.go create mode 100644 models/migrations/v32.go create mode 100644 models/migrations/v33.go create mode 100644 models/migrations/v34.go create mode 100644 models/migrations/v35.go create mode 100644 models/migrations/v36.go create mode 100644 models/migrations/v37.go create mode 100644 models/migrations/v38.go create mode 100644 models/migrations/v42.go create mode 100644 models/migrations/v43.go create mode 100644 models/migrations/v44.go create mode 100644 models/oauth2.go create mode 100644 models/status.go create mode 100644 models/status_test.go create mode 100644 models/test_fixtures.go rename models/{setup_for_test.go => unit_tests.go} (60%) create mode 100644 models/user_follow.go create mode 100644 models/user_follow_test.go create mode 100644 models/user_openid.go create mode 100644 models/user_openid_test.go create mode 100644 modules/auth/openid/discovery_cache.go create mode 100644 modules/auth/openid/discovery_cache_test.go create mode 100644 modules/auth/openid/openid.go create mode 100644 modules/auth/user_form_auth_openid.go create mode 100644 modules/markup/markup.go create mode 100644 modules/markup/markup_test.go create mode 100644 modules/private/branch.go create mode 100644 modules/private/internal.go create mode 100644 modules/private/push_update.go create mode 100644 modules/test/context_tests.go create mode 100644 modules/util/remove.go create mode 100644 modules/util/remove_windows.go create mode 100644 modules/validation/binding.go create mode 100644 modules/validation/binding_test.go create mode 100644 modules/validation/refname_test.go create mode 100644 modules/validation/validurl_test.go create mode 100644 options/gitignore/Ansible create mode 100644 options/gitignore/Bazaar delete mode 100644 options/gitignore/C Sharp create mode 100644 options/gitignore/Calabash create mode 100644 options/gitignore/D create mode 100644 options/gitignore/Dropbox create mode 100644 options/gitignore/Elm delete mode 100644 options/gitignore/FSharp create mode 100644 options/gitignore/Fortran create mode 100644 options/gitignore/GPG delete mode 100644 options/gitignore/IPythonNotebook create mode 100644 options/gitignore/Julia create mode 100644 options/gitignore/Otto create mode 100644 options/gitignore/PureScript create mode 100644 options/gitignore/Scheme create mode 100644 options/gitignore/Smalltalk create mode 100644 options/gitignore/Stata create mode 100644 options/gitignore/Terraform create mode 100644 options/gitignore/UnrealEngine rename options/gitignore/{OSX => macOS} (81%) create mode 100644 options/license/0BSD create mode 100644 options/license/AAL create mode 100644 options/license/ADSL rename options/license/{Academic Free License v1.1 => AFL-1.1} (73%) rename options/license/{Academic Free License v1.2 => AFL-1.2} (96%) create mode 100644 options/license/AFL-2.0 create mode 100644 options/license/AFL-2.1 rename options/license/{Academic Free License v3.0 => AFL-3.0} (79%) rename options/license/{Affero General Public License v1.0 => AGPL-1.0} (83%) create mode 100644 options/license/AGPL-3.0 create mode 100644 options/license/AMDPLPA create mode 100644 options/license/AML create mode 100644 options/license/AMPAS create mode 100644 options/license/ANTLR-PD create mode 100644 options/license/APAFML create mode 100644 options/license/APL-1.0 create mode 100644 options/license/APSL-1.0 create mode 100644 options/license/APSL-1.1 create mode 100644 options/license/APSL-1.2 create mode 100644 options/license/APSL-2.0 rename options/license/{Abstyles License => Abstyles} (70%) create mode 100644 options/license/Adobe-2006 create mode 100644 options/license/Adobe-Glyph create mode 100644 options/license/Afmparse create mode 100644 options/license/Aladdin delete mode 100644 options/license/Apache License 1.0 delete mode 100644 options/license/Apache License 1.1 create mode 100644 options/license/Apache-1.0 create mode 100644 options/license/Apache-1.1 rename options/license/{Apache License 2.0 => Apache-2.0} (78%) delete mode 100644 options/license/Artistic License 1.0 delete mode 100644 options/license/Artistic License 2.0 create mode 100644 options/license/Artistic-1.0 create mode 100644 options/license/Artistic-1.0-Perl create mode 100644 options/license/Artistic-1.0-cl8 create mode 100644 options/license/Artistic-2.0 delete mode 100644 options/license/BSD 2-clause License delete mode 100644 options/license/BSD 4-clause License create mode 100644 options/license/BSD-2-Clause create mode 100644 options/license/BSD-2-Clause-FreeBSD create mode 100644 options/license/BSD-2-Clause-NetBSD create mode 100644 options/license/BSD-3-Clause rename options/license/{BSD 3-clause License => BSD-3-Clause-Attribution} (50%) create mode 100644 options/license/BSD-3-Clause-Clear create mode 100644 options/license/BSD-3-Clause-LBNL create mode 100644 options/license/BSD-3-Clause-No-Nuclear-License create mode 100644 options/license/BSD-3-Clause-No-Nuclear-License-2014 create mode 100644 options/license/BSD-3-Clause-No-Nuclear-Warranty create mode 100644 options/license/BSD-4-Clause create mode 100644 options/license/BSD-4-Clause-UC create mode 100644 options/license/BSD-Protection create mode 100644 options/license/BSD-Source-Code create mode 100644 options/license/BSL-1.0 create mode 100644 options/license/Bahyph create mode 100644 options/license/Barr create mode 100644 options/license/Beerware create mode 100644 options/license/BitTorrent-1.0 create mode 100644 options/license/BitTorrent-1.1 create mode 100644 options/license/Borceux create mode 100644 options/license/CATOSL-1.1 create mode 100644 options/license/CC-BY-1.0 create mode 100644 options/license/CC-BY-2.0 create mode 100644 options/license/CC-BY-3.0 create mode 100644 options/license/CC-BY-4.0 create mode 100644 options/license/CC-BY-NC-1.0 create mode 100644 options/license/CC-BY-NC-2.0 create mode 100644 options/license/CC-BY-NC-3.0 create mode 100644 options/license/CC-BY-NC-4.0 create mode 100644 options/license/CC-BY-NC-ND-1.0 create mode 100644 options/license/CC-BY-NC-ND-2.0 create mode 100644 options/license/CC-BY-NC-ND-3.0 create mode 100644 options/license/CC-BY-NC-ND-4.0 create mode 100644 options/license/CC-BY-NC-SA-1.0 create mode 100644 options/license/CC-BY-NC-SA-2.0 create mode 100644 options/license/CC-BY-NC-SA-3.0 create mode 100644 options/license/CC-BY-NC-SA-4.0 create mode 100644 options/license/CC-BY-ND-1.0 create mode 100644 options/license/CC-BY-ND-2.0 create mode 100644 options/license/CC-BY-ND-3.0 create mode 100644 options/license/CC-BY-ND-4.0 create mode 100644 options/license/CC-BY-SA-1.0 create mode 100644 options/license/CC-BY-SA-2.0 create mode 100644 options/license/CC-BY-SA-3.0 create mode 100644 options/license/CC-BY-SA-4.0 rename options/license/{Creative Commons CC0 1.0 Universal => CC0-1.0} (62%) create mode 100644 options/license/CDDL-1.0 create mode 100644 options/license/CDDL-1.1 create mode 100644 options/license/CECILL-1.0 create mode 100644 options/license/CECILL-1.1 create mode 100644 options/license/CECILL-2.0 create mode 100644 options/license/CECILL-2.1 create mode 100644 options/license/CECILL-B create mode 100644 options/license/CECILL-C create mode 100644 options/license/CNRI-Jython create mode 100644 options/license/CNRI-Python create mode 100644 options/license/CNRI-Python-GPL-Compatible create mode 100644 options/license/CPAL-1.0 create mode 100644 options/license/CPL-1.0 create mode 100644 options/license/CPOL-1.02 rename options/license/{Mozilla Public License 1.1 => CUA-OPL-1.0} (60%) create mode 100644 options/license/Caldera create mode 100644 options/license/ClArtistic create mode 100644 options/license/Condor-1.1 create mode 100644 options/license/Crossword create mode 100644 options/license/CrystalStacker create mode 100644 options/license/Cube create mode 100644 options/license/D-FSL-1.0 create mode 100644 options/license/DOC create mode 100644 options/license/DSDP create mode 100644 options/license/Dotseqn rename options/license/{Educational Community License v1.0 => ECL-1.0} (71%) rename options/license/{Educational Community License v2.0 => ECL-2.0} (79%) create mode 100644 options/license/EFL-1.0 create mode 100644 options/license/EFL-2.0 rename options/license/{Eclipse Public License 1.0 => EPL-1.0} (68%) create mode 100644 options/license/EUDatagrid create mode 100644 options/license/EUPL-1.0 create mode 100644 options/license/EUPL-1.1 create mode 100644 options/license/Entessa create mode 100644 options/license/ErlPL-1.1 create mode 100644 options/license/Eurosym create mode 100644 options/license/FSFAP create mode 100644 options/license/FSFUL create mode 100644 options/license/FSFULLR create mode 100644 options/license/FTL create mode 100644 options/license/Fair create mode 100644 options/license/Frameworx-1.0 create mode 100644 options/license/FreeImage rename options/license/{GNU Free Documentation License v1.1 => GFDL-1.1} (78%) rename options/license/{GNU Free Documentation License v1.2 => GFDL-1.2} (80%) rename options/license/{GNU Free Documentation License v1.3 => GFDL-1.3} (82%) create mode 100644 options/license/GL2PS delete mode 100644 options/license/GNU Affero General Public License v3.0 delete mode 100644 options/license/GNU General Public License v3.0 rename options/license/{GNU General Public License v1.0 => GPL-1.0} (73%) rename options/license/{GNU General Public License v2.0 => GPL-2.0} (80%) create mode 100644 options/license/GPL-3.0 create mode 100644 options/license/Giftware create mode 100644 options/license/Glide create mode 100644 options/license/Glulxe create mode 100644 options/license/HPND create mode 100644 options/license/HaskellReport create mode 100644 options/license/IBM-pibs create mode 100644 options/license/ICU create mode 100644 options/license/IJG create mode 100644 options/license/IPA create mode 100644 options/license/IPL-1.0 rename options/license/{ISC license => ISC} (81%) create mode 100644 options/license/ImageMagick create mode 100644 options/license/Imlib2 create mode 100644 options/license/Info-ZIP create mode 100644 options/license/Intel create mode 100644 options/license/Intel-ACPI create mode 100644 options/license/Interbase-1.0 create mode 100644 options/license/JSON create mode 100644 options/license/JasPer-2.0 create mode 100644 options/license/LAL-1.2 create mode 100644 options/license/LAL-1.3 rename options/license/{GNU Library General Public License v2.0 => LGPL-2.0} (84%) rename options/license/{GNU Lesser General Public License v2.1 => LGPL-2.1} (83%) rename options/license/{GNU Lesser General Public License v3.0 => LGPL-3.0} (51%) create mode 100644 options/license/LGPLLR create mode 100644 options/license/LPL-1.0 create mode 100644 options/license/LPL-1.02 create mode 100644 options/license/LPPL-1.0 create mode 100644 options/license/LPPL-1.1 create mode 100644 options/license/LPPL-1.2 create mode 100644 options/license/LPPL-1.3a create mode 100644 options/license/LPPL-1.3c create mode 100644 options/license/Latex2e create mode 100644 options/license/Leptonica create mode 100644 options/license/LiLiQ-P-1.1 create mode 100644 options/license/LiLiQ-R-1.1 create mode 100644 options/license/LiLiQ-Rplus-1.1 create mode 100644 options/license/Libpng rename options/license/{MIT License => MIT} (98%) create mode 100644 options/license/MIT-CMU create mode 100644 options/license/MIT-advertising create mode 100644 options/license/MIT-enna create mode 100644 options/license/MIT-feh create mode 100644 options/license/MITNFA create mode 100644 options/license/MPL-1.0 create mode 100644 options/license/MPL-1.1 create mode 100644 options/license/MPL-2.0 create mode 100644 options/license/MPL-2.0-no-copyleft-exception create mode 100644 options/license/MS-PL create mode 100644 options/license/MS-RL create mode 100644 options/license/MTLL create mode 100644 options/license/MakeIndex create mode 100644 options/license/MirOS create mode 100644 options/license/Motosoto delete mode 100644 options/license/Mozilla Public License 1.0 delete mode 100644 options/license/Mozilla Public License 2.0 create mode 100644 options/license/Multics create mode 100644 options/license/Mup create mode 100644 options/license/NASA-1.3 create mode 100644 options/license/NBPL-1.0 create mode 100644 options/license/NCSA create mode 100644 options/license/NGPL create mode 100644 options/license/NLOD-1.0 create mode 100644 options/license/NLPL create mode 100644 options/license/NOSL create mode 100644 options/license/NPL-1.0 create mode 100644 options/license/NPL-1.1 create mode 100644 options/license/NPOSL-3.0 create mode 100644 options/license/NRL create mode 100644 options/license/NTP create mode 100644 options/license/Naumen create mode 100644 options/license/Net-SNMP create mode 100644 options/license/NetCDF create mode 100644 options/license/Newsletr create mode 100644 options/license/Nokia create mode 100644 options/license/Noweb create mode 100644 options/license/Nunit create mode 100644 options/license/OCCT-PL create mode 100644 options/license/OCLC-2.0 create mode 100644 options/license/ODbL-1.0 create mode 100644 options/license/OFL-1.0 create mode 100644 options/license/OFL-1.1 create mode 100644 options/license/OGTSL create mode 100644 options/license/OLDAP-1.1 create mode 100644 options/license/OLDAP-1.2 create mode 100644 options/license/OLDAP-1.3 create mode 100644 options/license/OLDAP-1.4 create mode 100644 options/license/OLDAP-2.0 create mode 100644 options/license/OLDAP-2.0.1 create mode 100644 options/license/OLDAP-2.1 create mode 100644 options/license/OLDAP-2.2 create mode 100644 options/license/OLDAP-2.2.1 create mode 100644 options/license/OLDAP-2.2.2 create mode 100644 options/license/OLDAP-2.3 create mode 100644 options/license/OLDAP-2.4 create mode 100644 options/license/OLDAP-2.7 create mode 100644 options/license/OML create mode 100644 options/license/OPL-1.0 create mode 100644 options/license/OSET-PL-2.1 create mode 100644 options/license/OSL-1.0 create mode 100644 options/license/OSL-1.1 rename options/license/{Academic Free License v2.0 => OSL-2.0} (81%) rename options/license/{Academic Free License v2.1 => OSL-2.1} (82%) create mode 100644 options/license/OSL-3.0 create mode 100644 options/license/OpenSSL create mode 100644 options/license/PDDL-1.0 create mode 100644 options/license/PHP-3.0 create mode 100644 options/license/PHP-3.01 create mode 100644 options/license/Plexus create mode 100644 options/license/PostgreSQL create mode 100644 options/license/Python-2.0 create mode 100644 options/license/QPL-1.0 create mode 100644 options/license/Qhull create mode 100644 options/license/RHeCos-1.1 create mode 100644 options/license/RPL-1.1 create mode 100644 options/license/RPSL-1.0 create mode 100644 options/license/RSA-MD create mode 100644 options/license/RSCPL create mode 100644 options/license/Rdisc create mode 100644 options/license/Ruby create mode 100644 options/license/SAX-PD create mode 100644 options/license/SCEA create mode 100644 options/license/SGI-B-1.0 create mode 100644 options/license/SGI-B-1.1 create mode 100644 options/license/SGI-B-2.0 create mode 100644 options/license/SISSL create mode 100644 options/license/SISSL-1.2 create mode 100644 options/license/SMLNJ create mode 100644 options/license/SMPPL create mode 100644 options/license/SNIA create mode 100644 options/license/SPL-1.0 create mode 100644 options/license/SWL create mode 100644 options/license/Saxpath create mode 100644 options/license/Sendmail create mode 100644 options/license/SimPL-2.0 create mode 100644 options/license/Sleepycat create mode 100644 options/license/Spencer-86 create mode 100644 options/license/Spencer-94 create mode 100644 options/license/Spencer-99 create mode 100644 options/license/SugarCRM-1.1.3 create mode 100644 options/license/TCL create mode 100644 options/license/TCP-wrappers create mode 100644 options/license/TMate create mode 100644 options/license/TORQUE-1.1 create mode 100644 options/license/TOSL create mode 100644 options/license/UPL-1.0 create mode 100644 options/license/Unicode-DFS-2015 create mode 100644 options/license/Unicode-DFS-2016 create mode 100644 options/license/Unicode-TOU create mode 100644 options/license/Unlicense create mode 100644 options/license/Updating the SPDX Licenses create mode 100644 options/license/VOSTROM create mode 100644 options/license/VSL-1.0 create mode 100644 options/license/Vim create mode 100644 options/license/W3C create mode 100644 options/license/W3C-19980720 create mode 100644 options/license/W3C-20150513 create mode 100644 options/license/WTFPL create mode 100644 options/license/Watcom-1.0 create mode 100644 options/license/Wsuipa create mode 100644 options/license/X11 create mode 100644 options/license/XFree86-1.1 create mode 100644 options/license/XSkat create mode 100644 options/license/Xerox create mode 100644 options/license/Xnet create mode 100644 options/license/YPL-1.0 create mode 100644 options/license/YPL-1.1 create mode 100644 options/license/ZPL-1.1 create mode 100644 options/license/ZPL-2.0 create mode 100644 options/license/ZPL-2.1 create mode 100644 options/license/Zed create mode 100644 options/license/Zend-2.0 create mode 100644 options/license/Zimbra-1.3 create mode 100644 options/license/Zimbra-1.4 create mode 100644 options/license/Zlib create mode 100644 options/license/curl create mode 100644 options/license/diffmark create mode 100644 options/license/dvipdfm create mode 100644 options/license/eGenix create mode 100644 options/license/gSOAP-1.3b create mode 100644 options/license/gnuplot create mode 100644 options/license/iMatix create mode 100644 options/license/libtiff create mode 100644 options/license/mpich2 create mode 100644 options/license/psfrag create mode 100644 options/license/psutils create mode 100644 options/license/xinetd create mode 100644 options/license/xpp create mode 100644 options/license/zlib-acknowledgement create mode 100644 options/locale/locale_hu-HU.ini create mode 100644 options/locale/locale_lt-LT.ini create mode 100644 options/locale/locale_nb-NO.ini delete mode 100644 public/assets/font-awesome-4.6.3/css/font-awesome.min.css delete mode 100644 public/assets/font-awesome-4.6.3/fonts/FontAwesome.otf delete mode 100644 public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.eot delete mode 100644 public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.svg delete mode 100644 public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.ttf delete mode 100644 public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.woff delete mode 100644 public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.woff2 delete mode 100755 public/assets/octicons-4.3.0/octicons.eot delete mode 100755 public/assets/octicons-4.3.0/octicons.min.css delete mode 100755 public/assets/octicons-4.3.0/octicons.svg delete mode 100755 public/assets/octicons-4.3.0/octicons.ttf delete mode 100755 public/assets/octicons-4.3.0/octicons.woff delete mode 100755 public/assets/octicons-4.3.0/octicons.woff2 delete mode 100644 public/css/gitgraph.css delete mode 100644 public/css/github.min.css delete mode 100755 public/css/semantic-2.2.1.min.css delete mode 100755 public/css/themes/basic/assets/fonts/icons.eot delete mode 100755 public/css/themes/basic/assets/fonts/icons.svg delete mode 100755 public/css/themes/basic/assets/fonts/icons.ttf delete mode 100755 public/css/themes/basic/assets/fonts/icons.woff delete mode 100755 public/css/themes/default/assets/fonts/icons.eot delete mode 100755 public/css/themes/default/assets/fonts/icons.otf delete mode 100755 public/css/themes/default/assets/fonts/icons.svg delete mode 100755 public/css/themes/default/assets/fonts/icons.ttf delete mode 100755 public/css/themes/default/assets/fonts/icons.woff delete mode 100755 public/css/themes/default/assets/fonts/icons.woff2 delete mode 100755 public/css/themes/default/assets/images/flags.png create mode 100644 public/img/auth/bitbucket.png create mode 100644 public/img/auth/dropbox.png create mode 100644 public/img/auth/facebook.png rename public/img/{ => auth}/github.png (100%) create mode 100644 public/img/auth/gitlab.png create mode 100644 public/img/auth/google_plus.png create mode 100644 public/img/auth/openid_connect.png create mode 100644 public/img/auth/twitter.png delete mode 100644 public/img/emoji/+1.png delete mode 100644 public/img/emoji/-1.png delete mode 100644 public/img/emoji/100.png delete mode 100644 public/img/emoji/1234.png delete mode 100644 public/img/emoji/8ball.png delete mode 100644 public/img/emoji/a.png delete mode 100644 public/img/emoji/ab.png delete mode 100644 public/img/emoji/abc.png delete mode 100644 public/img/emoji/abcd.png delete mode 100644 public/img/emoji/accept.png delete mode 100644 public/img/emoji/aerial_tramway.png delete mode 100644 public/img/emoji/airplane.png delete mode 100644 public/img/emoji/alarm_clock.png delete mode 100644 public/img/emoji/alien.png delete mode 100644 public/img/emoji/ambulance.png delete mode 100644 public/img/emoji/anchor.png delete mode 100644 public/img/emoji/angel.png delete mode 100644 public/img/emoji/anger.png delete mode 100644 public/img/emoji/angry.png delete mode 100644 public/img/emoji/anguished.png delete mode 100644 public/img/emoji/ant.png delete mode 100644 public/img/emoji/apple.png delete mode 100644 public/img/emoji/aquarius.png delete mode 100644 public/img/emoji/aries.png delete mode 100644 public/img/emoji/arrow_backward.png delete mode 100644 public/img/emoji/arrow_double_down.png delete mode 100644 public/img/emoji/arrow_double_up.png delete mode 100644 public/img/emoji/arrow_down.png delete mode 100644 public/img/emoji/arrow_down_small.png delete mode 100644 public/img/emoji/arrow_forward.png delete mode 100644 public/img/emoji/arrow_heading_down.png delete mode 100644 public/img/emoji/arrow_heading_up.png delete mode 100644 public/img/emoji/arrow_left.png delete mode 100644 public/img/emoji/arrow_lower_left.png delete mode 100644 public/img/emoji/arrow_lower_right.png delete mode 100644 public/img/emoji/arrow_right.png delete mode 100644 public/img/emoji/arrow_right_hook.png delete mode 100644 public/img/emoji/arrow_up.png delete mode 100644 public/img/emoji/arrow_up_down.png delete mode 100644 public/img/emoji/arrow_up_small.png delete mode 100644 public/img/emoji/arrow_upper_left.png delete mode 100644 public/img/emoji/arrow_upper_right.png delete mode 100644 public/img/emoji/arrows_clockwise.png delete mode 100644 public/img/emoji/arrows_counterclockwise.png delete mode 100644 public/img/emoji/art.png delete mode 100644 public/img/emoji/articulated_lorry.png delete mode 100644 public/img/emoji/astonished.png delete mode 100644 public/img/emoji/atm.png delete mode 100644 public/img/emoji/b.png delete mode 100644 public/img/emoji/baby.png delete mode 100644 public/img/emoji/baby_bottle.png delete mode 100644 public/img/emoji/baby_chick.png delete mode 100644 public/img/emoji/baby_symbol.png delete mode 100644 public/img/emoji/back.png delete mode 100644 public/img/emoji/baggage_claim.png delete mode 100644 public/img/emoji/balloon.png delete mode 100644 public/img/emoji/ballot_box_with_check.png delete mode 100644 public/img/emoji/bamboo.png delete mode 100644 public/img/emoji/banana.png delete mode 100644 public/img/emoji/bangbang.png delete mode 100644 public/img/emoji/bank.png delete mode 100644 public/img/emoji/bar_chart.png delete mode 100644 public/img/emoji/barber.png delete mode 100644 public/img/emoji/baseball.png delete mode 100644 public/img/emoji/basketball.png delete mode 100644 public/img/emoji/bath.png delete mode 100644 public/img/emoji/bathtub.png delete mode 100644 public/img/emoji/battery.png delete mode 100644 public/img/emoji/bear.png delete mode 100644 public/img/emoji/bee.png delete mode 100644 public/img/emoji/beer.png delete mode 100644 public/img/emoji/beers.png delete mode 100644 public/img/emoji/beetle.png delete mode 100644 public/img/emoji/beginner.png delete mode 100644 public/img/emoji/bell.png delete mode 100644 public/img/emoji/bento.png delete mode 100644 public/img/emoji/bicyclist.png delete mode 100644 public/img/emoji/bike.png delete mode 100644 public/img/emoji/bikini.png delete mode 100644 public/img/emoji/bird.png delete mode 100644 public/img/emoji/birthday.png delete mode 100644 public/img/emoji/black_circle.png delete mode 100644 public/img/emoji/black_joker.png delete mode 100644 public/img/emoji/black_medium_small_square.png delete mode 100644 public/img/emoji/black_medium_square.png delete mode 100644 public/img/emoji/black_nib.png delete mode 100644 public/img/emoji/black_small_square.png delete mode 100644 public/img/emoji/black_square.png delete mode 100644 public/img/emoji/black_square_button.png delete mode 100644 public/img/emoji/blossom.png delete mode 100644 public/img/emoji/blowfish.png delete mode 100644 public/img/emoji/blue_book.png delete mode 100644 public/img/emoji/blue_car.png delete mode 100644 public/img/emoji/blue_heart.png delete mode 100644 public/img/emoji/blush.png delete mode 100644 public/img/emoji/boar.png delete mode 100644 public/img/emoji/boat.png delete mode 100644 public/img/emoji/bomb.png delete mode 100644 public/img/emoji/book.png delete mode 100644 public/img/emoji/bookmark.png delete mode 100644 public/img/emoji/bookmark_tabs.png delete mode 100644 public/img/emoji/books.png delete mode 100644 public/img/emoji/boom.png delete mode 100644 public/img/emoji/boot.png delete mode 100644 public/img/emoji/bouquet.png delete mode 100644 public/img/emoji/bow.png delete mode 100644 public/img/emoji/bowling.png delete mode 100644 public/img/emoji/bowtie.png delete mode 100644 public/img/emoji/boy.png delete mode 100644 public/img/emoji/bread.png delete mode 100644 public/img/emoji/bride_with_veil.png delete mode 100644 public/img/emoji/bridge_at_night.png delete mode 100644 public/img/emoji/briefcase.png delete mode 100644 public/img/emoji/broken_heart.png delete mode 100644 public/img/emoji/bug.png delete mode 100644 public/img/emoji/bulb.png delete mode 100644 public/img/emoji/bullettrain_front.png delete mode 100644 public/img/emoji/bullettrain_side.png delete mode 100644 public/img/emoji/bus.png delete mode 100644 public/img/emoji/busstop.png delete mode 100644 public/img/emoji/bust_in_silhouette.png delete mode 100644 public/img/emoji/busts_in_silhouette.png delete mode 100644 public/img/emoji/cactus.png delete mode 100644 public/img/emoji/cake.png delete mode 100644 public/img/emoji/calendar.png delete mode 100644 public/img/emoji/calling.png delete mode 100644 public/img/emoji/camel.png delete mode 100644 public/img/emoji/camera.png delete mode 100644 public/img/emoji/cancer.png delete mode 100644 public/img/emoji/candy.png delete mode 100644 public/img/emoji/capital_abcd.png delete mode 100644 public/img/emoji/capricorn.png delete mode 100644 public/img/emoji/car.png delete mode 100644 public/img/emoji/card_index.png delete mode 100644 public/img/emoji/carousel_horse.png delete mode 100644 public/img/emoji/cat.png delete mode 100644 public/img/emoji/cat2.png delete mode 100644 public/img/emoji/cd.png delete mode 100644 public/img/emoji/chart.png delete mode 100644 public/img/emoji/chart_with_downwards_trend.png delete mode 100644 public/img/emoji/chart_with_upwards_trend.png delete mode 100644 public/img/emoji/checkered_flag.png delete mode 100644 public/img/emoji/cherries.png delete mode 100644 public/img/emoji/cherry_blossom.png delete mode 100644 public/img/emoji/chestnut.png delete mode 100644 public/img/emoji/chicken.png delete mode 100644 public/img/emoji/children_crossing.png delete mode 100644 public/img/emoji/chocolate_bar.png delete mode 100644 public/img/emoji/christmas_tree.png delete mode 100644 public/img/emoji/church.png delete mode 100644 public/img/emoji/cinema.png delete mode 100644 public/img/emoji/circus_tent.png delete mode 100644 public/img/emoji/city_sunrise.png delete mode 100644 public/img/emoji/city_sunset.png delete mode 100644 public/img/emoji/cl.png delete mode 100644 public/img/emoji/clap.png delete mode 100644 public/img/emoji/clapper.png delete mode 100644 public/img/emoji/clipboard.png delete mode 100644 public/img/emoji/clock1.png delete mode 100644 public/img/emoji/clock10.png delete mode 100644 public/img/emoji/clock1030.png delete mode 100644 public/img/emoji/clock11.png delete mode 100644 public/img/emoji/clock1130.png delete mode 100644 public/img/emoji/clock12.png delete mode 100644 public/img/emoji/clock1230.png delete mode 100644 public/img/emoji/clock130.png delete mode 100644 public/img/emoji/clock2.png delete mode 100644 public/img/emoji/clock230.png delete mode 100644 public/img/emoji/clock3.png delete mode 100644 public/img/emoji/clock330.png delete mode 100644 public/img/emoji/clock4.png delete mode 100644 public/img/emoji/clock430.png delete mode 100644 public/img/emoji/clock5.png delete mode 100644 public/img/emoji/clock530.png delete mode 100644 public/img/emoji/clock6.png delete mode 100644 public/img/emoji/clock630.png delete mode 100644 public/img/emoji/clock7.png delete mode 100644 public/img/emoji/clock730.png delete mode 100644 public/img/emoji/clock8.png delete mode 100644 public/img/emoji/clock830.png delete mode 100644 public/img/emoji/clock9.png delete mode 100644 public/img/emoji/clock930.png delete mode 100644 public/img/emoji/closed_book.png delete mode 100644 public/img/emoji/closed_lock_with_key.png delete mode 100644 public/img/emoji/closed_umbrella.png delete mode 100644 public/img/emoji/cloud.png delete mode 100644 public/img/emoji/clubs.png delete mode 100644 public/img/emoji/cn.png delete mode 100644 public/img/emoji/cocktail.png delete mode 100644 public/img/emoji/coffee.png delete mode 100644 public/img/emoji/cold_sweat.png delete mode 100644 public/img/emoji/collision.png delete mode 100644 public/img/emoji/computer.png delete mode 100644 public/img/emoji/confetti_ball.png delete mode 100644 public/img/emoji/confounded.png delete mode 100644 public/img/emoji/confused.png delete mode 100644 public/img/emoji/congratulations.png delete mode 100644 public/img/emoji/construction.png delete mode 100644 public/img/emoji/construction_worker.png delete mode 100644 public/img/emoji/convenience_store.png delete mode 100644 public/img/emoji/cookie.png delete mode 100644 public/img/emoji/cool.png delete mode 100644 public/img/emoji/cop.png delete mode 100644 public/img/emoji/copyright.png delete mode 100644 public/img/emoji/corn.png delete mode 100644 public/img/emoji/couple.png delete mode 100644 public/img/emoji/couple_with_heart.png delete mode 100644 public/img/emoji/couplekiss.png delete mode 100644 public/img/emoji/cow.png delete mode 100644 public/img/emoji/cow2.png delete mode 100644 public/img/emoji/credit_card.png delete mode 100644 public/img/emoji/crescent_moon.png delete mode 100644 public/img/emoji/crocodile.png delete mode 100644 public/img/emoji/crossed_flags.png delete mode 100644 public/img/emoji/crown.png delete mode 100644 public/img/emoji/cry.png delete mode 100644 public/img/emoji/crying_cat_face.png delete mode 100644 public/img/emoji/crystal_ball.png delete mode 100644 public/img/emoji/cupid.png delete mode 100644 public/img/emoji/curly_loop.png delete mode 100644 public/img/emoji/currency_exchange.png delete mode 100644 public/img/emoji/curry.png delete mode 100644 public/img/emoji/custard.png delete mode 100644 public/img/emoji/customs.png delete mode 100644 public/img/emoji/cyclone.png delete mode 100644 public/img/emoji/dancer.png delete mode 100644 public/img/emoji/dancers.png delete mode 100644 public/img/emoji/dango.png delete mode 100644 public/img/emoji/dart.png delete mode 100644 public/img/emoji/dash.png delete mode 100644 public/img/emoji/date.png delete mode 100644 public/img/emoji/de.png delete mode 100644 public/img/emoji/deciduous_tree.png delete mode 100644 public/img/emoji/department_store.png delete mode 100644 public/img/emoji/diamond_shape_with_a_dot_inside.png delete mode 100644 public/img/emoji/diamonds.png delete mode 100644 public/img/emoji/disappointed.png delete mode 100644 public/img/emoji/disappointed_relieved.png delete mode 100644 public/img/emoji/dizzy.png delete mode 100644 public/img/emoji/dizzy_face.png delete mode 100644 public/img/emoji/do_not_litter.png delete mode 100644 public/img/emoji/dog.png delete mode 100644 public/img/emoji/dog2.png delete mode 100644 public/img/emoji/dollar.png delete mode 100644 public/img/emoji/dolls.png delete mode 100644 public/img/emoji/dolphin.png delete mode 100644 public/img/emoji/donut.png delete mode 100644 public/img/emoji/door.png delete mode 100644 public/img/emoji/doughnut.png delete mode 100644 public/img/emoji/dragon.png delete mode 100644 public/img/emoji/dragon_face.png delete mode 100644 public/img/emoji/dress.png delete mode 100644 public/img/emoji/dromedary_camel.png delete mode 100644 public/img/emoji/droplet.png delete mode 100644 public/img/emoji/dvd.png delete mode 100644 public/img/emoji/e-mail.png delete mode 100644 public/img/emoji/ear.png delete mode 100644 public/img/emoji/ear_of_rice.png delete mode 100644 public/img/emoji/earth_africa.png delete mode 100644 public/img/emoji/earth_americas.png delete mode 100644 public/img/emoji/earth_asia.png delete mode 100644 public/img/emoji/egg.png delete mode 100644 public/img/emoji/eggplant.png delete mode 100644 public/img/emoji/eight.png delete mode 100644 public/img/emoji/eight_pointed_black_star.png delete mode 100644 public/img/emoji/eight_spoked_asterisk.png delete mode 100644 public/img/emoji/electric_plug.png delete mode 100644 public/img/emoji/elephant.png delete mode 100644 public/img/emoji/email.png delete mode 100644 public/img/emoji/end.png delete mode 100644 public/img/emoji/envelope.png delete mode 100644 public/img/emoji/es.png delete mode 100644 public/img/emoji/euro.png delete mode 100644 public/img/emoji/european_castle.png delete mode 100644 public/img/emoji/european_post_office.png delete mode 100644 public/img/emoji/evergreen_tree.png delete mode 100644 public/img/emoji/exclamation.png delete mode 100644 public/img/emoji/expressionless.png delete mode 100644 public/img/emoji/eyeglasses.png delete mode 100644 public/img/emoji/eyes.png delete mode 100644 public/img/emoji/facepunch.png delete mode 100644 public/img/emoji/factory.png delete mode 100644 public/img/emoji/fallen_leaf.png delete mode 100644 public/img/emoji/family.png delete mode 100644 public/img/emoji/fast_forward.png delete mode 100644 public/img/emoji/fax.png delete mode 100644 public/img/emoji/fearful.png delete mode 100644 public/img/emoji/feelsgood.png delete mode 100644 public/img/emoji/feet.png delete mode 100644 public/img/emoji/ferris_wheel.png delete mode 100644 public/img/emoji/file_folder.png delete mode 100644 public/img/emoji/finnadie.png delete mode 100644 public/img/emoji/fire.png delete mode 100644 public/img/emoji/fire_engine.png delete mode 100644 public/img/emoji/fireworks.png delete mode 100644 public/img/emoji/first_quarter_moon.png delete mode 100644 public/img/emoji/first_quarter_moon_with_face.png delete mode 100644 public/img/emoji/fish.png delete mode 100644 public/img/emoji/fish_cake.png delete mode 100644 public/img/emoji/fishing_pole_and_fish.png delete mode 100644 public/img/emoji/fist.png delete mode 100644 public/img/emoji/five.png delete mode 100644 public/img/emoji/flags.png delete mode 100644 public/img/emoji/flashlight.png delete mode 100644 public/img/emoji/floppy_disk.png delete mode 100644 public/img/emoji/flower_playing_cards.png delete mode 100644 public/img/emoji/flushed.png delete mode 100644 public/img/emoji/foggy.png delete mode 100644 public/img/emoji/football.png delete mode 100644 public/img/emoji/fork_and_knife.png delete mode 100644 public/img/emoji/fountain.png delete mode 100644 public/img/emoji/four.png delete mode 100644 public/img/emoji/four_leaf_clover.png delete mode 100644 public/img/emoji/fr.png delete mode 100644 public/img/emoji/free.png delete mode 100644 public/img/emoji/fried_shrimp.png delete mode 100644 public/img/emoji/fries.png delete mode 100644 public/img/emoji/frog.png delete mode 100644 public/img/emoji/frowning.png delete mode 100644 public/img/emoji/fu.png delete mode 100644 public/img/emoji/fuelpump.png delete mode 100644 public/img/emoji/full_moon.png delete mode 100644 public/img/emoji/full_moon_with_face.png delete mode 100644 public/img/emoji/game_die.png delete mode 100644 public/img/emoji/gb.png delete mode 100644 public/img/emoji/gem.png delete mode 100644 public/img/emoji/gemini.png delete mode 100644 public/img/emoji/ghost.png delete mode 100644 public/img/emoji/gift.png delete mode 100644 public/img/emoji/gift_heart.png delete mode 100644 public/img/emoji/girl.png delete mode 100644 public/img/emoji/globe_with_meridians.png delete mode 100644 public/img/emoji/goat.png delete mode 100644 public/img/emoji/goberserk.png delete mode 100644 public/img/emoji/godmode.png delete mode 100644 public/img/emoji/golf.png delete mode 100644 public/img/emoji/grapes.png delete mode 100644 public/img/emoji/green_apple.png delete mode 100644 public/img/emoji/green_book.png delete mode 100644 public/img/emoji/green_heart.png delete mode 100644 public/img/emoji/grey_exclamation.png delete mode 100644 public/img/emoji/grey_question.png delete mode 100644 public/img/emoji/grimacing.png delete mode 100644 public/img/emoji/grin.png delete mode 100644 public/img/emoji/grinning.png delete mode 100644 public/img/emoji/guardsman.png delete mode 100644 public/img/emoji/guitar.png delete mode 100644 public/img/emoji/gun.png delete mode 100644 public/img/emoji/haircut.png delete mode 100644 public/img/emoji/hamburger.png delete mode 100644 public/img/emoji/hammer.png delete mode 100644 public/img/emoji/hamster.png delete mode 100644 public/img/emoji/hand.png delete mode 100644 public/img/emoji/handbag.png delete mode 100644 public/img/emoji/hankey.png delete mode 100644 public/img/emoji/hash.png delete mode 100644 public/img/emoji/hatched_chick.png delete mode 100644 public/img/emoji/hatching_chick.png delete mode 100644 public/img/emoji/headphones.png delete mode 100644 public/img/emoji/hear_no_evil.png delete mode 100644 public/img/emoji/heart.png delete mode 100644 public/img/emoji/heart_decoration.png delete mode 100644 public/img/emoji/heart_eyes.png delete mode 100644 public/img/emoji/heart_eyes_cat.png delete mode 100644 public/img/emoji/heartbeat.png delete mode 100644 public/img/emoji/heartpulse.png delete mode 100644 public/img/emoji/hearts.png delete mode 100644 public/img/emoji/heavy_check_mark.png delete mode 100644 public/img/emoji/heavy_division_sign.png delete mode 100644 public/img/emoji/heavy_dollar_sign.png delete mode 100644 public/img/emoji/heavy_exclamation_mark.png delete mode 100644 public/img/emoji/heavy_minus_sign.png delete mode 100644 public/img/emoji/heavy_multiplication_x.png delete mode 100644 public/img/emoji/heavy_plus_sign.png delete mode 100644 public/img/emoji/helicopter.png delete mode 100644 public/img/emoji/herb.png delete mode 100644 public/img/emoji/hibiscus.png delete mode 100644 public/img/emoji/high_brightness.png delete mode 100644 public/img/emoji/high_heel.png delete mode 100644 public/img/emoji/hocho.png delete mode 100644 public/img/emoji/honey_pot.png delete mode 100644 public/img/emoji/honeybee.png delete mode 100644 public/img/emoji/horse.png delete mode 100644 public/img/emoji/horse_racing.png delete mode 100644 public/img/emoji/hospital.png delete mode 100644 public/img/emoji/hotel.png delete mode 100644 public/img/emoji/hotsprings.png delete mode 100644 public/img/emoji/hourglass.png delete mode 100644 public/img/emoji/hourglass_flowing_sand.png delete mode 100644 public/img/emoji/house.png delete mode 100644 public/img/emoji/house_with_garden.png delete mode 100644 public/img/emoji/hurtrealbad.png delete mode 100644 public/img/emoji/hushed.png delete mode 100644 public/img/emoji/ice_cream.png delete mode 100644 public/img/emoji/icecream.png delete mode 100644 public/img/emoji/id.png delete mode 100644 public/img/emoji/ideograph_advantage.png delete mode 100644 public/img/emoji/imp.png delete mode 100644 public/img/emoji/inbox_tray.png delete mode 100644 public/img/emoji/incoming_envelope.png delete mode 100644 public/img/emoji/information_desk_person.png delete mode 100644 public/img/emoji/information_source.png delete mode 100644 public/img/emoji/innocent.png delete mode 100644 public/img/emoji/interrobang.png delete mode 100644 public/img/emoji/iphone.png delete mode 100644 public/img/emoji/it.png delete mode 100644 public/img/emoji/izakaya_lantern.png delete mode 100644 public/img/emoji/jack_o_lantern.png delete mode 100644 public/img/emoji/japan.png delete mode 100644 public/img/emoji/japanese_castle.png delete mode 100644 public/img/emoji/japanese_goblin.png delete mode 100644 public/img/emoji/japanese_ogre.png delete mode 100644 public/img/emoji/jeans.png delete mode 100644 public/img/emoji/joy.png delete mode 100644 public/img/emoji/joy_cat.png delete mode 100644 public/img/emoji/jp.png delete mode 100644 public/img/emoji/key.png delete mode 100644 public/img/emoji/keycap_ten.png delete mode 100644 public/img/emoji/kimono.png delete mode 100644 public/img/emoji/kiss.png delete mode 100644 public/img/emoji/kissing.png delete mode 100644 public/img/emoji/kissing_cat.png delete mode 100644 public/img/emoji/kissing_closed_eyes.png delete mode 100644 public/img/emoji/kissing_face.png delete mode 100644 public/img/emoji/kissing_heart.png delete mode 100644 public/img/emoji/kissing_smiling_eyes.png delete mode 100644 public/img/emoji/koala.png delete mode 100644 public/img/emoji/koko.png delete mode 100644 public/img/emoji/kr.png delete mode 100644 public/img/emoji/large_blue_circle.png delete mode 100644 public/img/emoji/large_blue_diamond.png delete mode 100644 public/img/emoji/large_orange_diamond.png delete mode 100644 public/img/emoji/last_quarter_moon.png delete mode 100644 public/img/emoji/last_quarter_moon_with_face.png delete mode 100644 public/img/emoji/laughing.png delete mode 100644 public/img/emoji/leaves.png delete mode 100644 public/img/emoji/ledger.png delete mode 100644 public/img/emoji/left_luggage.png delete mode 100644 public/img/emoji/left_right_arrow.png delete mode 100644 public/img/emoji/leftwards_arrow_with_hook.png delete mode 100644 public/img/emoji/lemon.png delete mode 100644 public/img/emoji/leo.png delete mode 100644 public/img/emoji/leopard.png delete mode 100644 public/img/emoji/libra.png delete mode 100644 public/img/emoji/light_rail.png delete mode 100644 public/img/emoji/link.png delete mode 100644 public/img/emoji/lips.png delete mode 100644 public/img/emoji/lipstick.png delete mode 100644 public/img/emoji/lock.png delete mode 100644 public/img/emoji/lock_with_ink_pen.png delete mode 100644 public/img/emoji/lollipop.png delete mode 100644 public/img/emoji/loop.png delete mode 100644 public/img/emoji/loudspeaker.png delete mode 100644 public/img/emoji/love_hotel.png delete mode 100644 public/img/emoji/love_letter.png delete mode 100644 public/img/emoji/low_brightness.png delete mode 100644 public/img/emoji/m.png delete mode 100644 public/img/emoji/mag.png delete mode 100644 public/img/emoji/mag_right.png delete mode 100644 public/img/emoji/mahjong.png delete mode 100644 public/img/emoji/mailbox.png delete mode 100644 public/img/emoji/mailbox_closed.png delete mode 100644 public/img/emoji/mailbox_with_mail.png delete mode 100644 public/img/emoji/mailbox_with_no_mail.png delete mode 100644 public/img/emoji/man.png delete mode 100644 public/img/emoji/man_with_gua_pi_mao.png delete mode 100644 public/img/emoji/man_with_turban.png delete mode 100644 public/img/emoji/mans_shoe.png delete mode 100644 public/img/emoji/maple_leaf.png delete mode 100644 public/img/emoji/mask.png delete mode 100644 public/img/emoji/massage.png delete mode 100644 public/img/emoji/meat_on_bone.png delete mode 100644 public/img/emoji/mega.png delete mode 100644 public/img/emoji/melon.png delete mode 100644 public/img/emoji/memo.png delete mode 100644 public/img/emoji/mens.png delete mode 100644 public/img/emoji/metal.png delete mode 100644 public/img/emoji/metro.png delete mode 100644 public/img/emoji/microphone.png delete mode 100644 public/img/emoji/microscope.png delete mode 100644 public/img/emoji/milky_way.png delete mode 100644 public/img/emoji/minibus.png delete mode 100644 public/img/emoji/minidisc.png delete mode 100644 public/img/emoji/mobile_phone_off.png delete mode 100644 public/img/emoji/money_with_wings.png delete mode 100644 public/img/emoji/moneybag.png delete mode 100644 public/img/emoji/monkey.png delete mode 100644 public/img/emoji/monkey_face.png delete mode 100644 public/img/emoji/monorail.png delete mode 100644 public/img/emoji/mortar_board.png delete mode 100644 public/img/emoji/mount_fuji.png delete mode 100644 public/img/emoji/mountain_bicyclist.png delete mode 100644 public/img/emoji/mountain_cableway.png delete mode 100644 public/img/emoji/mountain_railway.png delete mode 100644 public/img/emoji/mouse.png delete mode 100644 public/img/emoji/mouse2.png delete mode 100644 public/img/emoji/movie_camera.png delete mode 100644 public/img/emoji/moyai.png delete mode 100644 public/img/emoji/muscle.png delete mode 100644 public/img/emoji/mushroom.png delete mode 100644 public/img/emoji/musical_keyboard.png delete mode 100644 public/img/emoji/musical_note.png delete mode 100644 public/img/emoji/musical_score.png delete mode 100644 public/img/emoji/mute.png delete mode 100644 public/img/emoji/nail_care.png delete mode 100644 public/img/emoji/name_badge.png delete mode 100644 public/img/emoji/neckbeard.png delete mode 100644 public/img/emoji/necktie.png delete mode 100644 public/img/emoji/negative_squared_cross_mark.png delete mode 100644 public/img/emoji/neutral_face.png delete mode 100644 public/img/emoji/new.png delete mode 100644 public/img/emoji/new_moon.png delete mode 100644 public/img/emoji/new_moon_with_face.png delete mode 100644 public/img/emoji/newspaper.png delete mode 100644 public/img/emoji/ng.png delete mode 100644 public/img/emoji/nine.png delete mode 100644 public/img/emoji/no_bell.png delete mode 100644 public/img/emoji/no_bicycles.png delete mode 100644 public/img/emoji/no_entry.png delete mode 100644 public/img/emoji/no_entry_sign.png delete mode 100644 public/img/emoji/no_good.png delete mode 100644 public/img/emoji/no_mobile_phones.png delete mode 100644 public/img/emoji/no_mouth.png delete mode 100644 public/img/emoji/no_pedestrians.png delete mode 100644 public/img/emoji/no_smoking.png delete mode 100644 public/img/emoji/non-potable_water.png delete mode 100644 public/img/emoji/nose.png delete mode 100644 public/img/emoji/notebook.png delete mode 100644 public/img/emoji/notebook_with_decorative_cover.png delete mode 100644 public/img/emoji/notes.png delete mode 100644 public/img/emoji/nut_and_bolt.png delete mode 100644 public/img/emoji/o.png delete mode 100644 public/img/emoji/o2.png delete mode 100644 public/img/emoji/ocean.png delete mode 100644 public/img/emoji/octocat.png delete mode 100644 public/img/emoji/octopus.png delete mode 100644 public/img/emoji/oden.png delete mode 100644 public/img/emoji/office.png delete mode 100644 public/img/emoji/ok.png delete mode 100644 public/img/emoji/ok_hand.png delete mode 100644 public/img/emoji/ok_woman.png delete mode 100644 public/img/emoji/older_man.png delete mode 100644 public/img/emoji/older_woman.png delete mode 100644 public/img/emoji/on.png delete mode 100644 public/img/emoji/oncoming_automobile.png delete mode 100644 public/img/emoji/oncoming_bus.png delete mode 100644 public/img/emoji/oncoming_police_car.png delete mode 100644 public/img/emoji/oncoming_taxi.png delete mode 100644 public/img/emoji/one.png delete mode 100644 public/img/emoji/open_file_folder.png delete mode 100644 public/img/emoji/open_hands.png delete mode 100644 public/img/emoji/open_mouth.png delete mode 100644 public/img/emoji/ophiuchus.png delete mode 100644 public/img/emoji/orange_book.png delete mode 100644 public/img/emoji/outbox_tray.png delete mode 100644 public/img/emoji/ox.png delete mode 100644 public/img/emoji/package.png delete mode 100644 public/img/emoji/page_facing_up.png delete mode 100644 public/img/emoji/page_with_curl.png delete mode 100644 public/img/emoji/pager.png delete mode 100644 public/img/emoji/palm_tree.png delete mode 100644 public/img/emoji/panda_face.png delete mode 100644 public/img/emoji/paperclip.png delete mode 100644 public/img/emoji/parking.png delete mode 100644 public/img/emoji/part_alternation_mark.png delete mode 100644 public/img/emoji/partly_sunny.png delete mode 100644 public/img/emoji/passport_control.png delete mode 100644 public/img/emoji/paw_prints.png delete mode 100644 public/img/emoji/peach.png delete mode 100644 public/img/emoji/pear.png delete mode 100644 public/img/emoji/pencil.png delete mode 100644 public/img/emoji/pencil2.png delete mode 100644 public/img/emoji/penguin.png delete mode 100644 public/img/emoji/pensive.png delete mode 100644 public/img/emoji/performing_arts.png delete mode 100644 public/img/emoji/persevere.png delete mode 100644 public/img/emoji/person_frowning.png delete mode 100644 public/img/emoji/person_with_blond_hair.png delete mode 100644 public/img/emoji/person_with_pouting_face.png delete mode 100644 public/img/emoji/phone.png delete mode 100644 public/img/emoji/pig.png delete mode 100644 public/img/emoji/pig2.png delete mode 100644 public/img/emoji/pig_nose.png delete mode 100644 public/img/emoji/pill.png delete mode 100644 public/img/emoji/pineapple.png delete mode 100644 public/img/emoji/pisces.png delete mode 100644 public/img/emoji/pizza.png delete mode 100644 public/img/emoji/plus1.png delete mode 100644 public/img/emoji/point_down.png delete mode 100644 public/img/emoji/point_left.png delete mode 100644 public/img/emoji/point_right.png delete mode 100644 public/img/emoji/point_up.png delete mode 100644 public/img/emoji/point_up_2.png delete mode 100644 public/img/emoji/police_car.png delete mode 100644 public/img/emoji/poodle.png delete mode 100644 public/img/emoji/poop.png delete mode 100644 public/img/emoji/post_office.png delete mode 100644 public/img/emoji/postal_horn.png delete mode 100644 public/img/emoji/postbox.png delete mode 100644 public/img/emoji/potable_water.png delete mode 100644 public/img/emoji/pouch.png delete mode 100644 public/img/emoji/poultry_leg.png delete mode 100644 public/img/emoji/pound.png delete mode 100644 public/img/emoji/pouting_cat.png delete mode 100644 public/img/emoji/pray.png delete mode 100644 public/img/emoji/princess.png delete mode 100644 public/img/emoji/punch.png delete mode 100644 public/img/emoji/purple_heart.png delete mode 100644 public/img/emoji/purse.png delete mode 100644 public/img/emoji/pushpin.png delete mode 100644 public/img/emoji/put_litter_in_its_place.png delete mode 100644 public/img/emoji/question.png delete mode 100644 public/img/emoji/rabbit.png delete mode 100644 public/img/emoji/rabbit2.png delete mode 100644 public/img/emoji/racehorse.png delete mode 100644 public/img/emoji/radio.png delete mode 100644 public/img/emoji/radio_button.png delete mode 100644 public/img/emoji/rage.png delete mode 100644 public/img/emoji/rage1.png delete mode 100644 public/img/emoji/rage2.png delete mode 100644 public/img/emoji/rage3.png delete mode 100644 public/img/emoji/rage4.png delete mode 100644 public/img/emoji/railway_car.png delete mode 100644 public/img/emoji/rainbow.png delete mode 100644 public/img/emoji/raised_hand.png delete mode 100644 public/img/emoji/raised_hands.png delete mode 100644 public/img/emoji/raising_hand.png delete mode 100644 public/img/emoji/ram.png delete mode 100644 public/img/emoji/ramen.png delete mode 100644 public/img/emoji/rat.png delete mode 100644 public/img/emoji/recycle.png delete mode 100644 public/img/emoji/red_car.png delete mode 100644 public/img/emoji/red_circle.png delete mode 100644 public/img/emoji/registered.png delete mode 100644 public/img/emoji/relaxed.png delete mode 100644 public/img/emoji/relieved.png delete mode 100644 public/img/emoji/repeat.png delete mode 100644 public/img/emoji/repeat_one.png delete mode 100644 public/img/emoji/restroom.png delete mode 100644 public/img/emoji/revolving_hearts.png delete mode 100644 public/img/emoji/rewind.png delete mode 100644 public/img/emoji/ribbon.png delete mode 100644 public/img/emoji/rice.png delete mode 100644 public/img/emoji/rice_ball.png delete mode 100644 public/img/emoji/rice_cracker.png delete mode 100644 public/img/emoji/rice_scene.png delete mode 100644 public/img/emoji/ring.png delete mode 100644 public/img/emoji/rocket.png delete mode 100644 public/img/emoji/roller_coaster.png delete mode 100644 public/img/emoji/rooster.png delete mode 100644 public/img/emoji/rose.png delete mode 100644 public/img/emoji/rotating_light.png delete mode 100644 public/img/emoji/round_pushpin.png delete mode 100644 public/img/emoji/rowboat.png delete mode 100644 public/img/emoji/ru.png delete mode 100644 public/img/emoji/rugby_football.png delete mode 100644 public/img/emoji/runner.png delete mode 100644 public/img/emoji/running.png delete mode 100644 public/img/emoji/running_shirt_with_sash.png delete mode 100644 public/img/emoji/sa.png delete mode 100644 public/img/emoji/sagittarius.png delete mode 100644 public/img/emoji/sailboat.png delete mode 100644 public/img/emoji/sake.png delete mode 100644 public/img/emoji/sandal.png delete mode 100644 public/img/emoji/santa.png delete mode 100644 public/img/emoji/satellite.png delete mode 100644 public/img/emoji/satisfied.png delete mode 100644 public/img/emoji/saxophone.png delete mode 100644 public/img/emoji/school.png delete mode 100644 public/img/emoji/school_satchel.png delete mode 100644 public/img/emoji/scissors.png delete mode 100644 public/img/emoji/scorpius.png delete mode 100644 public/img/emoji/scream.png delete mode 100644 public/img/emoji/scream_cat.png delete mode 100644 public/img/emoji/scroll.png delete mode 100644 public/img/emoji/seat.png delete mode 100644 public/img/emoji/secret.png delete mode 100644 public/img/emoji/see_no_evil.png delete mode 100644 public/img/emoji/seedling.png delete mode 100644 public/img/emoji/seven.png delete mode 100644 public/img/emoji/shaved_ice.png delete mode 100644 public/img/emoji/sheep.png delete mode 100644 public/img/emoji/shell.png delete mode 100644 public/img/emoji/ship.png delete mode 100644 public/img/emoji/shipit.png delete mode 100644 public/img/emoji/shirt.png delete mode 100644 public/img/emoji/shit.png delete mode 100644 public/img/emoji/shoe.png delete mode 100644 public/img/emoji/shower.png delete mode 100644 public/img/emoji/signal_strength.png delete mode 100644 public/img/emoji/six.png delete mode 100644 public/img/emoji/six_pointed_star.png delete mode 100644 public/img/emoji/ski.png delete mode 100644 public/img/emoji/skull.png delete mode 100644 public/img/emoji/sleeping.png delete mode 100644 public/img/emoji/sleepy.png delete mode 100644 public/img/emoji/slot_machine.png delete mode 100644 public/img/emoji/small_blue_diamond.png delete mode 100644 public/img/emoji/small_orange_diamond.png delete mode 100644 public/img/emoji/small_red_triangle.png delete mode 100644 public/img/emoji/small_red_triangle_down.png delete mode 100644 public/img/emoji/smile.png delete mode 100644 public/img/emoji/smile_cat.png delete mode 100644 public/img/emoji/smiley.png delete mode 100644 public/img/emoji/smiley_cat.png delete mode 100644 public/img/emoji/smiling_imp.png delete mode 100644 public/img/emoji/smirk.png delete mode 100644 public/img/emoji/smirk_cat.png delete mode 100644 public/img/emoji/smoking.png delete mode 100644 public/img/emoji/snail.png delete mode 100644 public/img/emoji/snake.png delete mode 100644 public/img/emoji/snowboarder.png delete mode 100644 public/img/emoji/snowflake.png delete mode 100644 public/img/emoji/snowman.png delete mode 100644 public/img/emoji/sob.png delete mode 100644 public/img/emoji/soccer.png delete mode 100644 public/img/emoji/soon.png delete mode 100644 public/img/emoji/sos.png delete mode 100644 public/img/emoji/sound.png delete mode 100644 public/img/emoji/space_invader.png delete mode 100644 public/img/emoji/spades.png delete mode 100644 public/img/emoji/spaghetti.png delete mode 100644 public/img/emoji/sparkle.png delete mode 100644 public/img/emoji/sparkler.png delete mode 100644 public/img/emoji/sparkles.png delete mode 100644 public/img/emoji/sparkling_heart.png delete mode 100644 public/img/emoji/speak_no_evil.png delete mode 100644 public/img/emoji/speaker.png delete mode 100644 public/img/emoji/speech_balloon.png delete mode 100644 public/img/emoji/speedboat.png delete mode 100644 public/img/emoji/squirrel.png delete mode 100644 public/img/emoji/star.png delete mode 100644 public/img/emoji/star2.png delete mode 100644 public/img/emoji/stars.png delete mode 100644 public/img/emoji/station.png delete mode 100644 public/img/emoji/statue_of_liberty.png delete mode 100644 public/img/emoji/steam_locomotive.png delete mode 100644 public/img/emoji/stew.png delete mode 100644 public/img/emoji/straight_ruler.png delete mode 100644 public/img/emoji/strawberry.png delete mode 100644 public/img/emoji/stuck_out_tongue.png delete mode 100644 public/img/emoji/stuck_out_tongue_closed_eyes.png delete mode 100644 public/img/emoji/stuck_out_tongue_winking_eye.png delete mode 100644 public/img/emoji/sun_with_face.png delete mode 100644 public/img/emoji/sunflower.png delete mode 100644 public/img/emoji/sunglasses.png delete mode 100644 public/img/emoji/sunny.png delete mode 100644 public/img/emoji/sunrise.png delete mode 100644 public/img/emoji/sunrise_over_mountains.png delete mode 100644 public/img/emoji/surfer.png delete mode 100644 public/img/emoji/sushi.png delete mode 100644 public/img/emoji/suspect.png delete mode 100644 public/img/emoji/suspension_railway.png delete mode 100644 public/img/emoji/sweat.png delete mode 100644 public/img/emoji/sweat_drops.png delete mode 100644 public/img/emoji/sweat_smile.png delete mode 100644 public/img/emoji/sweet_potato.png delete mode 100644 public/img/emoji/swimmer.png delete mode 100644 public/img/emoji/symbols.png delete mode 100644 public/img/emoji/syringe.png delete mode 100644 public/img/emoji/tada.png delete mode 100644 public/img/emoji/tanabata_tree.png delete mode 100644 public/img/emoji/tangerine.png delete mode 100644 public/img/emoji/taurus.png delete mode 100644 public/img/emoji/taxi.png delete mode 100644 public/img/emoji/tea.png delete mode 100644 public/img/emoji/telephone.png delete mode 100644 public/img/emoji/telephone_receiver.png delete mode 100644 public/img/emoji/telescope.png delete mode 100644 public/img/emoji/tennis.png delete mode 100644 public/img/emoji/tent.png delete mode 100644 public/img/emoji/thought_balloon.png delete mode 100644 public/img/emoji/three.png delete mode 100644 public/img/emoji/thumbsdown.png delete mode 100644 public/img/emoji/thumbsup.png delete mode 100644 public/img/emoji/ticket.png delete mode 100644 public/img/emoji/tiger.png delete mode 100644 public/img/emoji/tiger2.png delete mode 100644 public/img/emoji/tired_face.png delete mode 100644 public/img/emoji/tm.png delete mode 100644 public/img/emoji/toilet.png delete mode 100644 public/img/emoji/tokyo_tower.png delete mode 100644 public/img/emoji/tomato.png delete mode 100644 public/img/emoji/tongue.png delete mode 100644 public/img/emoji/top.png delete mode 100644 public/img/emoji/tophat.png delete mode 100644 public/img/emoji/tractor.png delete mode 100644 public/img/emoji/traffic_light.png delete mode 100644 public/img/emoji/train.png delete mode 100644 public/img/emoji/train2.png delete mode 100644 public/img/emoji/tram.png delete mode 100644 public/img/emoji/triangular_flag_on_post.png delete mode 100644 public/img/emoji/triangular_ruler.png delete mode 100644 public/img/emoji/trident.png delete mode 100644 public/img/emoji/triumph.png delete mode 100644 public/img/emoji/trolleybus.png delete mode 100644 public/img/emoji/trollface.png delete mode 100644 public/img/emoji/trophy.png delete mode 100644 public/img/emoji/tropical_drink.png delete mode 100644 public/img/emoji/tropical_fish.png delete mode 100644 public/img/emoji/truck.png delete mode 100644 public/img/emoji/trumpet.png delete mode 100644 public/img/emoji/tshirt.png delete mode 100644 public/img/emoji/tulip.png delete mode 100644 public/img/emoji/turtle.png delete mode 100644 public/img/emoji/tv.png delete mode 100644 public/img/emoji/twisted_rightwards_arrows.png delete mode 100644 public/img/emoji/two.png delete mode 100644 public/img/emoji/two_hearts.png delete mode 100644 public/img/emoji/two_men_holding_hands.png delete mode 100644 public/img/emoji/two_women_holding_hands.png delete mode 100644 public/img/emoji/u5272.png delete mode 100644 public/img/emoji/u5408.png delete mode 100644 public/img/emoji/u55b6.png delete mode 100644 public/img/emoji/u6307.png delete mode 100644 public/img/emoji/u6708.png delete mode 100644 public/img/emoji/u6709.png delete mode 100644 public/img/emoji/u6e80.png delete mode 100644 public/img/emoji/u7121.png delete mode 100644 public/img/emoji/u7533.png delete mode 100644 public/img/emoji/u7981.png delete mode 100644 public/img/emoji/u7a7a.png delete mode 100644 public/img/emoji/uk.png delete mode 100644 public/img/emoji/umbrella.png delete mode 100644 public/img/emoji/unamused.png delete mode 100644 public/img/emoji/underage.png delete mode 100644 public/img/emoji/unlock.png delete mode 100644 public/img/emoji/up.png delete mode 100644 public/img/emoji/us.png delete mode 100644 public/img/emoji/v.png delete mode 100644 public/img/emoji/vertical_traffic_light.png delete mode 100644 public/img/emoji/vhs.png delete mode 100644 public/img/emoji/vibration_mode.png delete mode 100644 public/img/emoji/video_camera.png delete mode 100644 public/img/emoji/video_game.png delete mode 100644 public/img/emoji/violin.png delete mode 100644 public/img/emoji/virgo.png delete mode 100644 public/img/emoji/volcano.png delete mode 100644 public/img/emoji/vs.png delete mode 100644 public/img/emoji/walking.png delete mode 100644 public/img/emoji/waning_crescent_moon.png delete mode 100644 public/img/emoji/waning_gibbous_moon.png delete mode 100644 public/img/emoji/warning.png delete mode 100644 public/img/emoji/watch.png delete mode 100644 public/img/emoji/water_buffalo.png delete mode 100644 public/img/emoji/watermelon.png delete mode 100644 public/img/emoji/wave.png delete mode 100644 public/img/emoji/wavy_dash.png delete mode 100644 public/img/emoji/waxing_crescent_moon.png delete mode 100644 public/img/emoji/waxing_gibbous_moon.png delete mode 100644 public/img/emoji/wc.png delete mode 100644 public/img/emoji/weary.png delete mode 100644 public/img/emoji/wedding.png delete mode 100644 public/img/emoji/whale.png delete mode 100644 public/img/emoji/whale2.png delete mode 100644 public/img/emoji/wheelchair.png delete mode 100644 public/img/emoji/white_check_mark.png delete mode 100644 public/img/emoji/white_circle.png delete mode 100644 public/img/emoji/white_flower.png delete mode 100644 public/img/emoji/white_large_square.png delete mode 100644 public/img/emoji/white_medium_small_square.png delete mode 100644 public/img/emoji/white_medium_square.png delete mode 100644 public/img/emoji/white_small_square.png delete mode 100644 public/img/emoji/white_square_button.png delete mode 100644 public/img/emoji/wind_chime.png delete mode 100644 public/img/emoji/wine_glass.png delete mode 100644 public/img/emoji/wink.png delete mode 100644 public/img/emoji/wolf.png delete mode 100644 public/img/emoji/woman.png delete mode 100644 public/img/emoji/womans_clothes.png delete mode 100644 public/img/emoji/womans_hat.png delete mode 100644 public/img/emoji/womens.png delete mode 100644 public/img/emoji/worried.png delete mode 100644 public/img/emoji/wrench.png delete mode 100644 public/img/emoji/x.png delete mode 100644 public/img/emoji/yellow_heart.png delete mode 100644 public/img/emoji/yen.png delete mode 100644 public/img/emoji/yum.png delete mode 100644 public/img/emoji/zap.png delete mode 100644 public/img/emoji/zero.png delete mode 100644 public/img/emoji/zzz.png create mode 100644 public/img/favicon.ico delete mode 100644 public/img/gitea-large-resize.png create mode 100644 public/img/gitea-sm.png create mode 100644 public/img/gogs.ico create mode 100644 public/img/openid-16x16.png delete mode 100644 public/js/jquery-1.11.3.min.js delete mode 100644 public/js/libs/autolink.js delete mode 100755 public/js/libs/clipboard-1.5.9.min.js delete mode 100644 public/js/libs/emojify-1.1.0.min.js delete mode 100644 public/js/libs/gitgraph.js delete mode 100644 public/js/libs/jquery.are-you-sure.js delete mode 100755 public/js/semantic-2.2.1.min.js delete mode 100644 public/plugins/codemirror-5.17.0/.gitattributes delete mode 100644 public/plugins/codemirror-5.17.0/.gitignore delete mode 100644 public/plugins/codemirror-5.17.0/.npmignore delete mode 100644 public/plugins/codemirror-5.17.0/.travis.yml delete mode 100644 public/plugins/codemirror-5.17.0/addon/mode/loadmode.js delete mode 100644 public/plugins/codemirror-5.17.0/addon/mode/multiplex.js delete mode 100644 public/plugins/codemirror-5.17.0/addon/mode/multiplex_test.js delete mode 100644 public/plugins/codemirror-5.17.0/addon/mode/overlay.js delete mode 100644 public/plugins/codemirror-5.17.0/addon/mode/simple.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/apl/apl.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/apl/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/asciiarmor/asciiarmor.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/asciiarmor/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/asn.1/asn.1.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/asn.1/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/asterisk/asterisk.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/asterisk/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/brainfuck/brainfuck.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/brainfuck/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/clike/clike.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/clike/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/clike/scala.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/clike/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/clojure/clojure.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/clojure/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/cmake/cmake.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/cmake/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/cobol/cobol.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/cobol/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/coffeescript/coffeescript.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/coffeescript/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/commonlisp/commonlisp.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/commonlisp/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/crystal/crystal.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/crystal/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/css/css.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/css/gss.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/css/gss_test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/css/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/css/less.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/css/less_test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/css/scss.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/css/scss_test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/css/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/cypher/cypher.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/cypher/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/d/d.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/d/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/dart/dart.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/dart/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/diff/diff.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/diff/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/django/django.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/django/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/dockerfile/dockerfile.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/dockerfile/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/dtd/dtd.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/dtd/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/dylan/dylan.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/dylan/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/dylan/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/ebnf/ebnf.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/ebnf/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/ecl/ecl.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/ecl/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/eiffel/eiffel.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/eiffel/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/elm/elm.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/elm/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/erlang/erlang.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/erlang/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/factor/factor.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/factor/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/fcl/fcl.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/fcl/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/forth/forth.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/forth/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/fortran/fortran.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/fortran/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/gas/gas.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/gas/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/gfm/gfm.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/gfm/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/gfm/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/gherkin/gherkin.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/gherkin/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/go/go.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/go/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/groovy/groovy.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/groovy/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/haml/haml.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/haml/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/haml/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/handlebars/handlebars.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/handlebars/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/haskell-literate/haskell-literate.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/haskell-literate/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/haskell/haskell.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/haskell/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/haxe/haxe.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/haxe/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/htmlembedded/htmlembedded.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/htmlembedded/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/htmlmixed/htmlmixed.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/htmlmixed/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/http/http.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/http/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/idl/idl.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/idl/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/jade/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/jade/jade.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/javascript/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/javascript/javascript.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/javascript/json-ld.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/javascript/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/javascript/typescript.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/jinja2/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/jinja2/jinja2.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/jsx/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/jsx/jsx.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/jsx/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/julia/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/julia/julia.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/livescript/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/livescript/livescript.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/lua/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/lua/lua.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/markdown/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/markdown/markdown.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/markdown/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/mathematica/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/mathematica/mathematica.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/mbox/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/mbox/mbox.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/meta.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/mirc/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/mirc/mirc.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/mllike/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/mllike/mllike.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/modelica/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/modelica/modelica.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/mscgen/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/mscgen/mscgen.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/mscgen/mscgen_test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/mscgen/msgenny_test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/mscgen/xu_test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/mumps/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/mumps/mumps.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/nginx/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/nginx/nginx.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/nsis/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/nsis/nsis.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/ntriples/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/ntriples/ntriples.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/octave/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/octave/octave.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/oz/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/oz/oz.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/pascal/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/pascal/pascal.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/pegjs/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/pegjs/pegjs.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/perl/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/perl/perl.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/php/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/php/php.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/php/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/pig/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/pig/pig.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/powershell/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/powershell/powershell.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/powershell/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/properties/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/properties/properties.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/protobuf/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/protobuf/protobuf.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/puppet/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/puppet/puppet.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/python/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/python/python.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/python/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/q/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/q/q.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/r/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/r/r.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/rpm/changes/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/rpm/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/rpm/rpm.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/rst/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/rst/rst.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/ruby/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/ruby/ruby.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/ruby/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/rust/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/rust/rust.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/rust/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/sas/index.html delete mode 100755 public/plugins/codemirror-5.17.0/mode/sas/sas.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/sass/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/sass/sass.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/scheme/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/scheme/scheme.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/shell/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/shell/shell.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/shell/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/sieve/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/sieve/sieve.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/slim/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/slim/slim.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/slim/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/smalltalk/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/smalltalk/smalltalk.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/smarty/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/smarty/smarty.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/solr/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/solr/solr.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/soy/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/soy/soy.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/sparql/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/sparql/sparql.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/spreadsheet/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/spreadsheet/spreadsheet.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/sql/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/sql/sql.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/stex/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/stex/stex.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/stex/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/stylus/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/stylus/stylus.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/swift/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/swift/swift.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/tcl/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/tcl/tcl.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/textile/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/textile/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/textile/textile.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/tiddlywiki/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/tiddlywiki/tiddlywiki.css delete mode 100644 public/plugins/codemirror-5.17.0/mode/tiddlywiki/tiddlywiki.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/tiki/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/tiki/tiki.css delete mode 100644 public/plugins/codemirror-5.17.0/mode/tiki/tiki.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/toml/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/toml/toml.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/tornado/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/tornado/tornado.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/troff/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/troff/troff.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/ttcn-cfg/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/ttcn-cfg/ttcn-cfg.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/ttcn/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/ttcn/ttcn.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/turtle/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/turtle/turtle.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/twig/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/twig/twig.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/vb/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/vb/vb.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/vbscript/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/vbscript/vbscript.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/velocity/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/velocity/velocity.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/verilog/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/verilog/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/verilog/verilog.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/vhdl/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/vhdl/vhdl.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/vue/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/vue/vue.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/webidl/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/webidl/webidl.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/xml/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/xml/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/xml/xml.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/xquery/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/xquery/test.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/xquery/xquery.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/yacas/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/yacas/yacas.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/yaml-frontmatter/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/yaml-frontmatter/yaml-frontmatter.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/yaml/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/yaml/yaml.js delete mode 100644 public/plugins/codemirror-5.17.0/mode/z80/index.html delete mode 100644 public/plugins/codemirror-5.17.0/mode/z80/z80.js delete mode 100644 public/plugins/dropzone-4.2.0/dropzone.css delete mode 100644 public/plugins/dropzone-4.2.0/dropzone.js delete mode 100644 public/plugins/highlight-9.6.0/default.css delete mode 100644 public/plugins/highlight-9.6.0/github.css delete mode 100644 public/plugins/highlight-9.6.0/highlight.pack.js delete mode 100644 public/plugins/jquery.datetimepicker-2.4.5/jquery.datetimepicker.css delete mode 100644 public/plugins/jquery.datetimepicker-2.4.5/jquery.datetimepicker.js delete mode 100644 public/plugins/jquery.minicolors-2.2.3/jquery.minicolors.css delete mode 100644 public/plugins/jquery.minicolors-2.2.3/jquery.minicolors.min.js delete mode 100644 public/plugins/jquery.minicolors-2.2.3/jquery.minicolors.png delete mode 100644 public/plugins/pdfjs-1.4.20/LICENSE delete mode 100644 public/plugins/pdfjs-1.4.20/build/pdf.js delete mode 100644 public/plugins/pdfjs-1.4.20/build/pdf.worker.js delete mode 100644 public/plugins/pdfjs-1.4.20/web/compatibility.js delete mode 100644 public/plugins/pdfjs-1.4.20/web/debugger.js delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/annotation-check.svg delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/annotation-comment.svg delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/annotation-help.svg delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/annotation-insert.svg delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/annotation-key.svg delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/annotation-newparagraph.svg delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/annotation-noicon.svg delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/annotation-note.svg delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/annotation-paragraph.svg delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/findbarButton-next-rtl.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/findbarButton-next-rtl@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/findbarButton-next.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/findbarButton-next@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous-rtl.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous-rtl@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/grab.cur delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/grabbing.cur delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/loading-icon.gif delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/loading-small.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/loading-small@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-documentProperties.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-documentProperties@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-firstPage.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-firstPage@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-handTool.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-handTool@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-lastPage.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-lastPage@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCcw.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCcw@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCw.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCw@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/shadow.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/texture.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-bookmark.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-bookmark@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-download.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-download@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-menuArrows.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-menuArrows@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-openFile.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-openFile@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown-rtl.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown-rtl@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp-rtl.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp-rtl@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-presentationMode.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-presentationMode@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-print.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-print@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-search.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-search@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle-rtl.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle-rtl.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle-rtl@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewAttachments.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewAttachments@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline-rtl.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline-rtl@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewOutline@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewThumbnail.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewThumbnail@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomIn.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomIn@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomOut.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomOut@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed-rtl.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed-rtl@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/treeitem-expanded.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/images/treeitem-expanded@2x.png delete mode 100644 public/plugins/pdfjs-1.4.20/web/viewer.css delete mode 100644 public/plugins/pdfjs-1.4.20/web/viewer.html delete mode 100644 public/plugins/pdfjs-1.4.20/web/viewer.js delete mode 100644 public/plugins/simplemde-1.10.1/simplemde.min.css delete mode 100644 public/plugins/simplemde-1.10.1/simplemde.min.js create mode 100644 public/swagger.v1.json create mode 100644 routers/api/v1/repo/status.go create mode 100644 routers/api/v1/user/gpg_key.go create mode 100644 routers/api/v1/utils/utils.go create mode 100644 routers/private/branch.go create mode 100644 routers/private/internal.go create mode 100644 routers/private/push_update.go create mode 100644 routers/repo/issue_watch.go create mode 100644 routers/routes/routes.go create mode 100644 routers/user/auth_openid.go create mode 100644 routers/user/home_test.go create mode 100644 routers/user/main_test.go create mode 100644 routers/user/setting_openid.go create mode 100644 scripts/generate-gitignores.go create mode 100644 scripts/generate-licenses.go create mode 100644 templates/admin/auth/source/ldap.tmpl create mode 100644 templates/admin/auth/source/oauth.tmpl create mode 100644 templates/admin/auth/source/smtp.tmpl create mode 100644 templates/repo/issue/view_content/comments.tmpl create mode 100644 templates/repo/issue/view_content/pull.tmpl create mode 100644 templates/repo/issue/view_content/sidebar.tmpl create mode 100644 templates/repo/settings/hook_gitea.tmpl create mode 100644 templates/swagger.tmpl create mode 100644 templates/user/auth/finalize_openid.tmpl create mode 100644 templates/user/auth/signin_navbar.tmpl create mode 100644 templates/user/auth/signin_openid.tmpl create mode 100644 templates/user/auth/signup_openid_connect.tmpl create mode 100644 templates/user/auth/signup_openid_navbar.tmpl create mode 100644 templates/user/auth/signup_openid_register.tmpl create mode 100644 templates/user/settings/keys.tmpl create mode 100644 templates/user/settings/keys_gpg.tmpl create mode 100644 templates/user/settings/keys_ssh.tmpl create mode 100644 templates/user/settings/openid.tmpl create mode 100644 templates/user/settings/organization.tmpl delete mode 100644 templates/user/settings/sshkeys.tmpl diff --git a/.drone.yml b/.drone.yml index b0c3366..92bedc2 100644 --- a/.drone.yml +++ b/.drone.yml @@ -2,11 +2,31 @@ workspace: base: /srv/app path: src/code.gitea.io/gitea -pipeline: - clone: - image: plugins/git +clone: + git: + image: plugins/git:1 + depth: 50 tags: true +pipeline: + build: + image: webhippie/golang:edge + pull: true + environment: + TAGS: bindata sqlite + GOPATH: /srv/app + commands: + - make clean + - make generate + - make vet + - make lint + - make stylesheets-check + - make misspell-check + - make test-vendor + - make build + when: + event: [ push, tag, pull_request ] + test: image: webhippie/golang:edge pull: true @@ -14,15 +34,21 @@ pipeline: TAGS: bindata sqlite GOPATH: /srv/app commands: - - apk -U add openssh-client - - make clean - - make generate - - make vet - - make lint - make test - - make build when: - event: [ push, tag, pull_request ] + event: [ tag, pull_request ] + + # Commented until db locking have been resolved! + # test-sqlite: + # image: webhippie/golang:edge + # pull: true + # environment: + # TAGS: bindata + # GOPATH: /srv/app + # commands: + # - make test-sqlite + # when: + # event: [ push, tag, pull_request ] test-mysql: image: webhippie/golang:edge @@ -55,24 +81,21 @@ pipeline: commands: - make release when: - event: [ push, tag, pull_request ] - - coverage: - image: plugins/coverage - server: https://coverage.gitea.io - when: - event: [ push, tag, pull_request ] + event: [ push, tag ] docker: - image: plugins/docker + image: plugins/docker:17.05 + pull: true + secrets: [ docker_username, docker_password ] repo: gitea/gitea tags: [ '${DRONE_TAG##v}' ] when: event: [ tag ] - branch: [ refs/tags/* ] docker: - image: plugins/docker + image: plugins/docker:17.05 + pull: true + secrets: [ docker_username, docker_password ] repo: gitea/gitea tags: [ '${DRONE_BRANCH##release/v}' ] when: @@ -80,7 +103,9 @@ pipeline: branch: [ release/* ] docker: - image: plugins/docker + image: plugins/docker:17.05 + pull: true + secrets: [ docker_username, docker_password ] repo: gitea/gitea tags: [ 'latest' ] when: @@ -88,17 +113,24 @@ pipeline: branch: [ master ] release: - image: plugins/s3 + image: plugins/s3:1 + pull: true + secrets: [ aws_access_key_id, aws_secret_access_key ] + bucket: releases + endpoint: https://storage.gitea.io path_style: true strip_prefix: dist/release/ source: dist/release/* target: /gitea/${DRONE_TAG##v} when: event: [ tag ] - branch: [ refs/tags/* ] release: - image: plugins/s3 + image: plugins/s3:1 + pull: true + secrets: [ aws_access_key_id, aws_secret_access_key ] + bucket: releases + endpoint: https://storage.gitea.io path_style: true strip_prefix: dist/release/ source: dist/release/* @@ -108,7 +140,11 @@ pipeline: branch: [ release/* ] release: - image: plugins/s3 + image: plugins/s3:1 + pull: true + secrets: [ aws_access_key_id, aws_secret_access_key ] + bucket: releases + endpoint: https://storage.gitea.io path_style: true strip_prefix: dist/release/ source: dist/release/* @@ -118,15 +154,21 @@ pipeline: branch: [ master ] github: - image: plugins/github-release + image: plugins/github-release:1 + pull: true + secrets: [ github_token ] files: - dist/release/* when: event: [ tag ] - branch: [ refs/tags/* ] - gitter: - image: plugins/gitter + discord: + image: appleboy/drone-discord:1.0.0 + pull: true + secrets: [ discord_webhook_id, discord_webhook_token ] + when: + event: [ push, tag, pull_request ] + status: [ changed, failure ] services: mysql: diff --git a/.drone.yml.sig b/.drone.yml.sig deleted file mode 100644 index 62f3629..0000000 --- a/.drone.yml.sig +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJIUzI1NiJ9.d29ya3NwYWNlOgogIGJhc2U6IC9zcnYvYXBwCiAgcGF0aDogc3JjL2NvZGUuZ2l0ZWEuaW8vZ2l0ZWEKCnBpcGVsaW5lOgogIGNsb25lOgogICAgaW1hZ2U6IHBsdWdpbnMvZ2l0CiAgICB0YWdzOiB0cnVlCgogIHRlc3Q6CiAgICBpbWFnZTogd2ViaGlwcGllL2dvbGFuZzplZGdlCiAgICBwdWxsOiB0cnVlCiAgICBlbnZpcm9ubWVudDoKICAgICAgVEFHUzogYmluZGF0YSBzcWxpdGUKICAgICAgR09QQVRIOiAvc3J2L2FwcAogICAgY29tbWFuZHM6CiAgICAgIC0gYXBrIC1VIGFkZCBvcGVuc3NoLWNsaWVudAogICAgICAtIG1ha2UgY2xlYW4KICAgICAgLSBtYWtlIGdlbmVyYXRlCiAgICAgIC0gbWFrZSB2ZXQKICAgICAgLSBtYWtlIGxpbnQKICAgICAgLSBtYWtlIHRlc3QKICAgICAgLSBtYWtlIGJ1aWxkCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoLCB0YWcsIHB1bGxfcmVxdWVzdCBdCgogIHRlc3QtbXlzcWw6CiAgICBpbWFnZTogd2ViaGlwcGllL2dvbGFuZzplZGdlCiAgICBwdWxsOiB0cnVlCiAgICBlbnZpcm9ubWVudDoKICAgICAgVEFHUzogYmluZGF0YQogICAgICBHT1BBVEg6IC9zcnYvYXBwCiAgICBjb21tYW5kczoKICAgICAgLSBtYWtlIHRlc3QtbXlzcWwKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2gsIHRhZywgcHVsbF9yZXF1ZXN0IF0KCiAgdGVzdC1wZ3NxbDoKICAgIGltYWdlOiB3ZWJoaXBwaWUvZ29sYW5nOmVkZ2UKICAgIHB1bGw6IHRydWUKICAgIGVudmlyb25tZW50OgogICAgICBUQUdTOiBiaW5kYXRhCiAgICAgIEdPUEFUSDogL3Nydi9hcHAKICAgIGNvbW1hbmRzOgogICAgICAtIG1ha2UgdGVzdC1wZ3NxbAogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgcHVzaCwgdGFnLCBwdWxsX3JlcXVlc3QgXQoKICBzdGF0aWM6CiAgICBpbWFnZToga2FyYWxhYmUveGdvLWxhdGVzdDpsYXRlc3QKICAgIHB1bGw6IHRydWUKICAgIGVudmlyb25tZW50OgogICAgICBUQUdTOiBiaW5kYXRhIHNxbGl0ZQogICAgICBHT1BBVEg6IC9zcnYvYXBwCiAgICBjb21tYW5kczoKICAgICAgLSBtYWtlIHJlbGVhc2UKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2gsIHRhZywgcHVsbF9yZXF1ZXN0IF0KCiAgY292ZXJhZ2U6CiAgICBpbWFnZTogcGx1Z2lucy9jb3ZlcmFnZQogICAgc2VydmVyOiBodHRwczovL2NvdmVyYWdlLmdpdGVhLmlvCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoLCB0YWcsIHB1bGxfcmVxdWVzdCBdCgogIGRvY2tlcjoKICAgIGltYWdlOiBwbHVnaW5zL2RvY2tlcgogICAgcmVwbzogZ2l0ZWEvZ2l0ZWEKICAgIHRhZ3M6IFsgJyR7RFJPTkVfVEFHIyN2fScgXQogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgdGFnIF0KICAgICAgYnJhbmNoOiBbIHJlZnMvdGFncy8qIF0KCiAgZG9ja2VyOgogICAgaW1hZ2U6IHBsdWdpbnMvZG9ja2VyCiAgICByZXBvOiBnaXRlYS9naXRlYQogICAgdGFnczogWyAnJHtEUk9ORV9CUkFOQ0gjI3JlbGVhc2Uvdn0nIF0KICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2ggXQogICAgICBicmFuY2g6IFsgcmVsZWFzZS8qIF0KCiAgZG9ja2VyOgogICAgaW1hZ2U6IHBsdWdpbnMvZG9ja2VyCiAgICByZXBvOiBnaXRlYS9naXRlYQogICAgdGFnczogWyAnbGF0ZXN0JyBdCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoIF0KICAgICAgYnJhbmNoOiBbIG1hc3RlciBdCgogIHJlbGVhc2U6CiAgICBpbWFnZTogcGx1Z2lucy9zMwogICAgcGF0aF9zdHlsZTogdHJ1ZQogICAgc3RyaXBfcHJlZml4OiBkaXN0L3JlbGVhc2UvCiAgICBzb3VyY2U6IGRpc3QvcmVsZWFzZS8qCiAgICB0YXJnZXQ6IC9naXRlYS8ke0RST05FX1RBRyMjdn0KICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHRhZyBdCiAgICAgIGJyYW5jaDogWyByZWZzL3RhZ3MvKiBdCgogIHJlbGVhc2U6CiAgICBpbWFnZTogcGx1Z2lucy9zMwogICAgcGF0aF9zdHlsZTogdHJ1ZQogICAgc3RyaXBfcHJlZml4OiBkaXN0L3JlbGVhc2UvCiAgICBzb3VyY2U6IGRpc3QvcmVsZWFzZS8qCiAgICB0YXJnZXQ6IC9naXRlYS8ke0RST05FX0JSQU5DSCMjcmVsZWFzZS92fQogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgcHVzaCBdCiAgICAgIGJyYW5jaDogWyByZWxlYXNlLyogXQoKICByZWxlYXNlOgogICAgaW1hZ2U6IHBsdWdpbnMvczMKICAgIHBhdGhfc3R5bGU6IHRydWUKICAgIHN0cmlwX3ByZWZpeDogZGlzdC9yZWxlYXNlLwogICAgc291cmNlOiBkaXN0L3JlbGVhc2UvKgogICAgdGFyZ2V0OiAvZ2l0ZWEvbWFzdGVyCiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoIF0KICAgICAgYnJhbmNoOiBbIG1hc3RlciBdCgogIGdpdGh1YjoKICAgIGltYWdlOiBwbHVnaW5zL2dpdGh1Yi1yZWxlYXNlCiAgICBmaWxlczoKICAgICAgLSBkaXN0L3JlbGVhc2UvKgogICAgd2hlbjoKICAgICAgZXZlbnQ6IFsgdGFnIF0KICAgICAgYnJhbmNoOiBbIHJlZnMvdGFncy8qIF0KCiAgZ2l0dGVyOgogICAgaW1hZ2U6IHBsdWdpbnMvZ2l0dGVyCgpzZXJ2aWNlczoKICBteXNxbDoKICAgIGltYWdlOiBteXNxbDo1LjcKICAgIGVudmlyb25tZW50OgogICAgICAtIE1ZU1FMX0RBVEFCQVNFPXRlc3QKICAgICAgLSBNWVNRTF9BTExPV19FTVBUWV9QQVNTV09SRD15ZXMKICAgIHdoZW46CiAgICAgIGV2ZW50OiBbIHB1c2gsIHRhZywgcHVsbF9yZXF1ZXN0IF0KCiAgcGdzcWw6CiAgICBpbWFnZTogcG9zdGdyZXM6OS41CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBQT1NUR1JFU19EQj10ZXN0CiAgICB3aGVuOgogICAgICBldmVudDogWyBwdXNoLCB0YWcsIHB1bGxfcmVxdWVzdCBdCg.hp6IsxbFIQOaxJdmGv32Vf34-Nra3KqVIWzH52W687I \ No newline at end of file diff --git a/.editorconfig b/.editorconfig index 12b2424..cbbb106 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,10 +15,14 @@ indent_size = 8 indent_style = tab indent_size = 4 -[*.{less,yml}] +[*.{less}] indent_style = space indent_size = 4 +[*.{yml}] +indent_style = space +indent_size = 2 + [*.js] indent_style = space indent_size = 4 diff --git a/.github/issue_template.md b/.github/issue_template.md index dbf2ae9..b5d2409 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -1,9 +1,11 @@ -1. Please speak English, this is the language all of us can speak and write. -2. Please ask questions or configuration/deploy problems on our Gitter channel: https://gitter.im/go-gitea/gitea -3. Please take a moment to search check that your issue doesn't already exist. -4. Please give all relevant information below for bug reports, because incomplete details will be handled as an invalid report. - -**You MUST delete the content above including this line before posting, otherwise your issue will be invalid.** + - Gitea version (or commit ref): - Git version: @@ -11,6 +13,7 @@ - Database (use `[x]`): - [ ] PostgreSQL - [ ] MySQL + - [ ] MSSQL - [ ] SQLite - Can you reproduce the bug at https://try.gitea.io: - [ ] Yes (provide example URL) @@ -25,4 +28,4 @@ ## Screenshots -**If this issue involves the Web Interface, please include a screenshot** + diff --git a/.gitignore b/.gitignore index 79198ff..87d5327 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,7 @@ _testmain.go *.test *.prof -coverage.out +*coverage.out /modules/options/bindata.go /modules/public/bindata.go @@ -36,6 +36,7 @@ coverage.out *.log /gitea +/integrations.test /bin /dist @@ -44,3 +45,4 @@ coverage.out /indexers /log /public/img/avatar +/integrations/gitea-integration diff --git a/CHANGELOG.md b/CHANGELOG.md index f6fab1a..5bf83df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,513 @@ # Changelog +## [1.2.1](https://github.com/go-gitea/gitea/releases/tag/v1.2.1) - 2017-10-16 +* BUGFIXES + * Fix PR, milestone and label functionality if issue unit is disabled (#2710) (#2714) + * Fix plain readme didn't render correctly on repo home page (#2705) (#2712) + * Fix so that user can still fork his own repository to his organizations (#2699) (#2707) + * Fix .netrc authentication (#2700) (#2708) + * Fix slice out of bounds error in mailer (#2479) (#2696) + +## [1.2.0](https://github.com/go-gitea/gitea/releases/tag/v1.2.0) - 2017-10-10 +* SECURITY + * Sanitation fix from Gogs (#1461) +* BREAKING + * Rename /forget_password url to /forgot_password (#1219) +* FEATURE + * Logo: Add task to generate images from SVG and change to new logo (#2194) + * Status-API (#1332) + * Show commit status icon in commits table (#1688) + * Additional OAuth2 providers (#1010) + * GPG commit validation (#1150) + * Rework SSH key management UI to add GPG (#1293) + * Implement GPG api (#710) + * Login via OpenID-2.0 (#618) + * Add units to team (#947) + * Batch updates for issues (#926) + * Add Gitea Webhook (#1755) + * API: support '/orgs/:org/repos' (#2047) + * Display all organization from user settings (#1739) + * LDAP user synchronization (#1478) + * Adding #issuecomment to the URL in E-Mail notifications (#1674) + * Add download count field and unit testing for attachment. (#1512) + * Add repo mirror sync API endpoint (#1508) + * Add markup package to prepare for org markup format (#1493) + * Support for custom html meta (#1423) + * Per issue/PR watch/unwatch (#1410) + * Allow ENABLE_OPENID_SIGNUP to depend on DISABLE_REGISTRATION (#1369) + * Repo size in admin panel (#1482) + * Show user OpenID URIs in their profile (#1314) + * Add change-password admin command (#1304) + * Only use issue and wiki on repo. (#1297) + * Allow push to init a wiki repo (#1279) +* ENHANCEMENT + * Make time diff translatable (#2057) + * Smaller watch, star, and fork buttons (#2052) + * Display config file path on admin panel (#2030) + * Only show SSH clone URL if signed in (#2169) (#2170) + * Only show "No Description" to repo admins (#2167) + * Always return valid go-get meta, even if unauthorized (#2010) + * Enable assignee e-mail notification (#2003) + * Let not-logged-in users view releases (#1999) + * No highlighting for .txt files (#1922) + * Make side nav on dashboard stackable (#1778) + * Setting to disable authorized_keys backup (#1856) + * Hide the create organization button (in dashboard/organization section) (#1705) + * LFS: Return 404 for unimplemented endpoints (#1330) + * Show a link to password reset from user settings requiring a password (#862) + * Reserve the "explore" user/org name (#1222) + * Send notifications to partecipants in issue comments (#1217) + * Improve style of user OpenID setting page (#1324) + * Use font-awesome OpenID icon more (#1320) + * Use readonly input form to show the validated OpenID URI (#1308) + * Add captcha support to OpenID based signup (#1307) + * Minor improvements on commit graph UI (#1380) + * Mirror sync interval specified as duration string (#1407) + * Make issue in commit graph "clickable" (#1392) + * Use whole button (commit graph) as link (#1390) + * Autofocus on 2fa passcode fields (#1460) + * Sort on repo size in admin panel (#1654) + * Improve dashboard repo search (#1652) + * Use a better default MAX_GIT_DIFF_LINE_CHARACTERS (#1845) + * Adds Parent property to the repo API (#1687) + * Add configuration option for default permission to create Organizations (#1686) + * Remove sha1 hash display in repository table (#1678) + * Download files to their original filename (#1676) + * Exposes in API the Repo entity's Size and IsBare property (#1668) + * Change two factor code entry box from text to number (#1733) + * Directly show error if user hit repository limit (#1767) + * Generate small and large logos at 4x resolution (#2233) + * Tags listed in releases tab (#2389) (#2424) +* BUGFIXES + * Fix adding branch as protected to not allow pushing to it (#2556) + * Orgs: fix org page title when full name is not defined (#1495) + * Fix double borders on edit page (#1152) (#1153) + * Search bar fixes for #1187 and #1205 (#1207) + * Fix upgrade failed after ever rollback (#1194) + * Fix FCGI (over TCP) support (#1368) + * Backport of migration fixes (#2604) (#2677) + * fix panic on gogs webhook creation (#2675) (#2676) + * Backport: Fixes 500 error on dashboard when using MSSQL (#2504) (#2662) + * Fix go get response if only app URL is custom in configuration (#2634) (#2640) + * Fix deletion of unprotected branches (#2630) + * Backport of 2611 / Fix doubled issue tab introduced in migration v16 (#2622) + * v38 migration used an outdated version of RepoUnit model (#2602) + * fix go get subpackage bug (#2584) (#2589) + * Backport: Sync releases table with tags on push and for mirrors (#2459) (#2554) + * Backport: Restricting access to fork functioanlity to users with Code access (#2542) + * Fix migration from pre-v15 to 1.2.0 (#2460) (#2465) + * Fix migration from pre-v15 to 1.2.0 (#2460) + * fix duplicated feed (#2370) (#2413) + * Fix releases to be counted from database not tags (#2389) + * Fix missing collabrative repos (#2367) (#2382) + * Add more test for login links and fix a bug on action retrieve (#2361) + * Fix SQL condition bug in GetFeeds(..) (#2360) + * fix bug on create repo link on dashboard (#2359) + * Fix order of elements in dashboard html (#2344) + * Fix repo-search template errors for go1.7 (#2336) + * Add missing forks key for dashboard repository component (#2325) + * fix template error on explore repos (#2319) + * Trigger sync webhooks on UI commit (#2302) + * fix 500 error when view an issue which's milestone deleted (#2297) + * Only update needed columns when update user (#2296) + * Fix rendering of external links (#2292) + * Fix and improve dashboard repo UI (#2285) + * Make short link pattern greedy (#2259) + * Temporarily patch go-ini/ini with fork (#2255) + * Convert xorm literal queries to method calls (#2253) + * update code.gitea.io/git in vendor to fix delete branch fails (#2250) + * Replace calls to xorm UseBool with Where (#2237) + * rhel7 has a git version with four digits (1.8.3.1) (#2236) + * Fix internal requests when gitea listens to unix socket or only external IP (#2234) + * Check for access in /repositories/:id (#2227) + * Fixed robots.txt 404 error (#2226) + * Fix counts on issues dashboard (#2215) + * Fix unclosed session bug (#2214) + * Add collaborative repositories to the dashboard (#2205) + * Fix issue updated_unix bug (#2204) + * Fix Commits nil pointer dereference (#2203) + * Fix bare-repo bugs (#2199) + * Fix PR nil-dereference bug (#2195) + * Allow only single fork per user/organization (#2193) + * Fix key usage time update if the key is used in parallel for multiple operations (#2185) + * Only allow token authentication with 2FA enabled (#2184) + * Fix profile update for non-local users (#2178) + * Fix compiling without sqlite and gcc (#2177) + * Make compare button URL aware if current repo is a fork (#2162) (#2163) + * Remove unit types commits and settings (#2161) + * Fix OpenID registration route (#2160) + * Fix repository settings collobration list display (#2151) + * Ignore invalid issue numbers in commit messages. Fixes #2022 (#2150) + * Fix SHA1 hash linking (#2143) + * Fix repo API bug (#2133) + * Use POSIX complaint ! operator in find (#2132) + * Fix GET /users/:username/repos endpoint (#2125) + * Fix username rendering bug (#2122) + * Fix wiki preview links (#2119) + * vendor: update sqlite to fix "database is locked" errors (#2116) + * Fix unchecked error bug (#2110) + * Fix missing-return bug (#2109) + * Fix API for branches with slashes (#2096) + * Fix git hooks update to receive required arguments (#2095) + * upgrade git source code. (#2094) + * Fix SQL bug in models.PullRequests (#2092) + * Don't ignore gravatar error (#2083) + * Fix release display and correct paging (#2080) + * remove unnecessary blank lines and wrong error log (#2079) + * Check for valid renamed usernames (#2077) + * Update git module (#2074) + * Fix org hooks UI (#2072) + * Fix #1271: Call location.reload after XHR finishes (#2071) + * Fix default ghost assignee bug (#2069) + * Fix bug in issue labels API (#2048) + * Load label ID in NewLabels (#2045) + * Fix: `http: multiple response.WriteHeader calls` (#2038) + * Pagination on releases page (#2035) + * repo/editor: fix breadcrumb path cuts parent dirs (#3859) (#2032) + * Fix displaying commits and files of PR created from now deleted fork (#2023) + * Fix #2001 and fix issue comments hidden (#2016) + * Update code.gitea.io/git (#2014) + * Keep sort when switching page (#2013) + * Important: wrong PR merge commit ID saved (#2007) + * Don't show non-comments in comments API (#2001) + * Fix "Dashboard shows deleted comments" (#1995) + * Make branch deletion URL more like GitHub's, fixes #1397 (#1994) + * Fix fast-forward PR bug (#1989) + * Fix GPG email checking to be case insensitive (#1988) + * fix bug for normal user visit public repo (#1984) + * fix collborators lack of units on orgnization repositories (#1968) + * Fix diff of renamed and modified file (#1967) + * Fix uppercase default branch bug (#1965) + * Fix bug in Action.loadRepo() (#1959) + * Fix deleted milestone bug (#1942) + * Fix engine bug in getIssueByID (#1934) + * Switch to keybase go-crypto (for some elliptic curve key) + test (#1925) + * Fix setting.AppPath for integration tests (#1923) + * Fix search by issue type (#1914) + * Fix ghost user bug (#1913) + * Require token before checking membership/ownership (#1905) + * Bug fixes for org member API (#1904) + * A missing / to provide a correct endpoint (#1903) + * Fix 500 in public activity page (#1901) + * Center-aligned login topbar (#1880) + * Migration to fix existing owner team units (#1873) + * Fix paginater length (#1866) + * Fix bug in removeOrgRepo (#1858) + * Display draft releases (#1854) + * Fix 404 for external tracking issues (#1852) + * Update code.gitea.io/git (#1849) + * Fix user profile activity feed (#1848) + * Don't ignore error in getMergeCommit (#1843) + * Fix locking bug in removeOrgRepo (#1842) + * Fix status table race condition (#1835) + * Fix PR template error (#1834) + * Fix pull request compare link (#1832) + * Use ghost users in issues/PRs (#1831) + * Commitless repos should be bare (#1829) + * Update code.gitea.io/git (#1824) + * Fix invalid reference in feeds template (#1820) + * fix bug to deny to add orgnization as a member of an orgnization or team (#1815) + * xxx_active_code_live setting in printed in hours and minutes instead … (#1814) + * Fix deadlock in updateRepository (#1813) + * Give all units to owner team (#1812) + * Fix 500 for GET /teams/:id endpoints (#1811) + * fix bug not to trim space of login username (#1796) + * Fix renaming bug (#1786) + * Fix activity feed (#1779) + * Make navbar scroll on overflow (#1777) + * Delete repo redirects on repo deletion (#1776) + * Fix unloaded owner bug (#1770) + * Admin should always be allowed to create repositories even if hit limit (#1765) + * Update HighlightJS and fix YAML files highlighting (#1764) + * fix: #1757 fix set MAX_CREATION_LIMIT as zero. (#1762) + * fix admin lost permission caused by #947 (#1753) + * More fixes for dashboard search (#1750) + * fixes wrong after field in webhook payload (#1746) + * fix avatar update bug (#1729) + * Fix FOUC on Firefox (#1728) + * Fix changes introduce by update of go-swagger. (#1727) + * Fix #1719 (#1722) + * Correct flash after sending password reset email (#1718) + * Fix and test for delete user (#1713) + * Fix rendering of issue checkboxes (#1709) + * Enforce netgo build tag while cross-compilation (#1690) + * fix bug when push a branch name with / & fix an integration test bug (#1689) + * fix potential sqlite lock (#1680) + * Fix commit sha1 URL rendering in markdown (#1677) + * Fix static files permission under public/ (#1675) + * fix: tag contain character ) will http 500 on release page (#1670) + * Fix CSS for code in wiki markdown (#1660) + * fix multiple readme file rendering and fix #1657 (#1658) + * Add primary key and index to external login user table (#1656) + * fix #1643 and improve integration test (#1645) + * Fix version in Makefile (#1636) + * Handle display of GPG key without end date (#1628) + * fix bug on issue view when not login (#1624) + * bug fixed for API to get user's repos (#1622) + * fix lost text color on button on set as primary email (#1621) + * Add create_at and updated_at in PR json (#1616) + * update git and fix #1133 (#1614) + * fix bug on status API (#1533) + * Do not show empty collaborators segment (#1531) + * Fix markdown rendering (#1530) + * fix go get sub package and add domain on installation to let go get work defaultly (#1518) + * fix #1501 ssh hangs caused by #1461 (#1513) + * Fix empty file download (#1506) + * Fix broken v27 migration - change mirror interval from int to bigint (#1504) + * Do not allow commiting to protected branch from online editor (#1502) + * Add internal routes for ssh hook comands (#1471) + * Fix races within code.gitea.io/git.(*Command).RunInDirTimeoutPipeline (#1465) + * Simple quick fix for #1418 (#1456) + * fix gpg API panic when no verification (#1451) + * fix migrate failed and org dashboard failed on MSSQL database (#1448) + * Optimize and fix autolink function (#1442) (#1444) + * Fix and simplify repo branches (settings) UI (#1435) + * Fix disabled fields in repo settings UI (#1431) + * fixes pull request hanging when it contains normal and LFS files (#1425) + * Fix races in the log module by using syncmap (#1421) + * Add length check for the return string (#1420) + * Fix "Error: No issue number specified" when pushing (#1393) + * Corrected Mirror.NextUpdate not set (#1388) + * fix: remove `str2html` from org full name (#1360) + * Correct broken unaligned load/store in armv5 (#1355) + * Remove href on first/last link when on first/last page (#1345) + * Fix broken table layout (#1344) + * LFS: Fix SSH authentication for trailing arguments (#1328) + * Remove empty file (#1326) + * Fix delete user failed on sqlite (#1321) + * Fix inconsistency in layout (#1316) + * Fix gpg wrong column types (#1303) + * Fix wiki bugs (#1294) + * Fix missing less sources for oauth (#1288) + * Make sure both scripts/ can live side by side (#1264) + * Fix nil-dereference bug (#1258) + * rewrite pre-commit, post-commit and options hooks (fixes #1250) (#1257) + * Commit search appearence fixes (#1254) + * Fix forget migration for wiki hooks (#1227) + * Fix repo settings external tracker failed and check external urls (#1215) + * Fix 500 caused by branches settings introduced by #1198 (#1214) + * fix #1189, commit messages containing a pipe (#1203) + * Bug fixed for delete repo failed (#1193) + * Fix migration failed when authorized_keys is not exist (#1180) + * Fix ini format incomiptable with crowdin (#1177) +* TESTING + * Integration tests for issues API (#2059) + * Add integration tests for signin (#2363) + * Add INTERNAL_TOKEN to integration .ini file (#2346) + * Add public links check (#2323) + * Fix hooks for integration repo (#2216) + * More integration tests for comment API (#2156) + * Cache session cookies in tests (#2128) + * Less verbose integration tests (#2123) + * Fix improper setup for integration tests (#2050) + * Improve integration test helper functions (#2049) + * Add integration test for issue creating (#2002) + * Use testing/benchmark interface (#1993) + * Add integration test for repository migration (#1983) + * Consolidate boilerplate in integration tests (#1979) + * Set console to debug for integration tests (#1976) + * Add pull-create integration test (#1972) + * Coverage reports for integration tests (#1960) + * Add integration test for pull-request merge (#1912) + * Add integration test for file editing (#1907) + * Add integration test for repository forking (#1896) + * Run unused test (#1875) + * Don't recreate database in integration tests (#1697) + * remove sqlite tag when integration test with mysql/postgres and recreate database when init integration test (#1693) + * MySQL, Postgres integration tests in drone (#1638) + * improve integration test to resue models/fixtures and store git repos with tests (#1627) + * Improve govendor testing (#1623) + * Integration test framework (#1290) + * Unit tests for issue_list (#1209) + * Add integration test for signup (#1135) +* TRANSLATION + * update translation from crowdin (#2368) (#2380) + * Small fixes (#2144) + * Missing signed commit display translations (#2134) + * Sync latest translations from crowdin (#2104) + * Add make command update-translations for update translations from crodwin (#2097) + * Fix some mistakes (#1833) + * Improve clarity between is_activated and prohibit_login (#1788) + * Improve grammar (#1775) + * Fix bad grammar and wordiness (#1741) + * Make strings translatable (#1188) (#1198) +* BUILD + * Dockerfile for aarch64 (#1128) (#1130) + * backport from v1.2 branch: add secrets for github release (#2588) (#2598) + * Add secrets for github release to fix drone failed (#2588) + * Backport changes for latest drone (#2586) + * Removing .drone.yml.sig (#2579) + * Fix drone for tags (#2573) (#2576) + * Backport: Remove go version check for make fmt (#2558) (#2561) + * Backport: Fix lint, fmt and integration testing errors (#2553) + * update latest xorm version to vendor (#2353) + * Remove integration test executables on `make clean` (#2340) + * refactor(Makefile): allow overriding default go program (#2310) + * Revert to upstream ini dependency (#2304) + * Use /dev/urandom to create random password (#2298) + * update drone sig file. (#2262) + * go get github.com/wadey/gocovmerge when needed (#2235) + * fix typo (#2145) + * Revert "Reduce number of layer" (#2086) + * Reduce number of layer (#2078) + * Skip sqlite integration in CI (#2058) + * fix golint error and rename func for suggestion. (#1997) + * fix misspell (#1996) + * update drone sig file (#1981) + * send notification if status changed (#1973) + * switch gitter to discord for drone. (#1971) + * Fix missing backslash in Dockerfile.rpi (#1952) + * Don't run 'make release' on PRs (#1908) + * Update code.gitea.io/git (#1892) + * Use production version of vuejs (#1869) + * Add a variable for docker tag (#1825) + * resign drone and fix #1816 (#1819) + * Separate generate swagger + fix sed os specific (#1791) + * Only run coverage on merges/pushes to master (#1783) + * Remove stale rule from Makefile (#1782) + * feat: upgrade drone docker image to support multi-stage build. (#1732) + * Realy don't cache apk index (#1694) + * Limit clone depth when drone-building (#1644) + * Refactor Dockerfile (#1632) + * Check if missing/modified/unused deps in vendor and fix errors (#1468) + * Add GOFLAGS and EXTRA_GOFLAGS (#1438) + * Include formatting check to the `make test` (and thus also `check`) rule (#1366) +* DOCS + * fix wrong changelog title (#2395) + * fix webhook link (#2289) + * Improve swagger doc (#2274) + * Add link to forum in issue template (#2070) + * add missing lfs config on example file (#2039) + * Add discourse link (#2027) + * Fix wording (#2024) + * Fix typo (#1974) + * Swagger docs for list/create forks (#1941) + * Update links to Discord server (#1940) + * [ci skip] update discord badge. (#1930) + * Change join chat from gitter to discord (#1929) + * Update changelog with v1.1.1 (#1926) + * Correct grammar in APIEmpty documentation (#1748) + * Add swagger comment for MirrorSync (#1747) + * Add "Table of Contents" in CONTRIBUTING.md (#1634) + * Fix service description in Debian init file (#1538) + * Use MAINTAINERS file in repository in CONTRIBUTING (#1489) + * Generate swagger json (#1402) + * Changed text when password reset disabled. (#1364) + * Removed email copyright year (#1348) + * Specify that time interval units are seconds (#1311) + * Gitea OpenID-2.0 login has been tested with livejournal.com too (#1306) + * Make wording of commit search more clear (#1291) + * Add notice that LFS mirroring is not supported (#1251) + * Fix typos in models/ and modules/ (#1248) + * Refactor and fix incorrect comment (#1247) + * Fix migration comment (#1241) + * Update locale_en-US.ini (#1235) + * Add LibreJS support (#1201) + * rename OSX to macOS (#1176) + * add mssql to app.ini db config comment (#1172) + * Add MSSQL to issues template (#1171) +* MISC + * Add badge and link to the Matrix room (#2348) + * ignore coverage steps. (#2257) + * Use sqlite3 database as default for Docker image (#2182) + * update drone discord plugin to 0.0.4 version (#1992) + * fix typo (#1990) + * Move 3rd party js/css into `public/vendor` and document sources (#2383) + * Prevent conflicting TOTP accounts by adding AppURL to issuer parameter (#2335) + * Fix variable name typo (#2327) + * Make use of Vue more universal (#2318) + * Remove (almost) server side data rendering from repo-search component (#2317) + * Add OpenID configuration in install page (#2276) + * More tweaks to repo top panel (#2267) + * File path tweaks in UI (#2264) + * Make SHOW_USER_EMAIL also apply to profiles (#2258) + * EnableUnit() -> UnitEnabled() (#2242) + * Prevent selection of diff line numbers (#2240) + * Remove unused variable on makefile (#2225) + * No error log entries for repo 404 (#2200) + * Refactor vue delimeters to use es6 template delimeters (#2171) + * Replace tmp with TMPDIR. (#2152) + * Remove unused files (#2124) + * Improve org error handling (#2117) + * Absolute path for setting.CustomConf (#2085) + * remove deprecated code for Gogs compitable (#2041) + * Refactor session close as xorm already does everything needed internally (#2020) + * SQLite has a query timeout. Hopefully fixes most 'database locked' errors (#1961) + * Use monospace font in githook editor (#1958) + * Fix import order (#1951) + * Gracefully handle bare repositories on API operations. (#1932) + * Fix errors caused by force push (#1927) + * Display URLs in integration test logs (#1924) + * Set TMPDIR enviroment variable for dump command (#1915) + * Cache ctx.User in retrieveFeeds (#1902) + * Make `LocalCopyPath` a setting instead of a hard-coded path (#1881) + * Add check misspelling (#1877) + * Fix misspelled variables (#1874) + * Gofmt (#1868, #1710, #1662) + * Rename misnamed migration (#1867) + * Support CRLF when splitting code lines for display (#1862) + * Add convert less css file step. (#1861) + * Prevent accidential selection of line numbers in code view (#1860) + * Delete Public SSH Key tmp file after calculating fingerprint (#1855) + * Remove annoying difference in button heights. (#1853) + * Only run test coverage on master branch. (#1838) + * Error from mktemp command in MacOS. (#1837) + * Use writeTmpKeyFile in calcFingerprint (#1828) + * ROOT_URL setting use the default as shown in conf/app.ini (#1823) + * Rename RepoCreationNum -> MaxCreationLimit (#1766) + * Add button to admin ui (#1738) + * Correct spelling mistakes (#1703) + * Make openid support default false for compitable with v1.1 (#1650) + * Send mails as HTML as default. Setting for send as plain text. (#1648) + * fix potential lock when sqlite (#1647) + * Optimize png images via Google zopflipng [ci skip] (#1639) + * Upgrade alpine to v3.5 in Dockerfile (#1633) + * remove unused vendor packages (#1620) + * markup: microoptimise for many short filenames in directory (#1534) + * support health check via / and fix #969 (#1520) + * Remove env user salt since no need to use (#1515) + * Drop db operations from hook commands (#1514) + * Better URL validation (#1507) + * Migrate WatchInfo struct to api (#1492) + * refactor: show command help message. (#1486) + * refactor update ssh key use time (#1466) + * Set VERSION from git once, in a variable (#1447) + * Remove unused mutex field (#1440) + * Simplify settings pages with item list (#1389) + * Clean-up PostgreSQL Tests (#1361) + * refactor: remove workaround after the golang 1.7 release. (#1349) + * Delete the useless code (#1335) + * Run "make fmt" with go-1.6 (#1333) + * Refactor admin/auth/new.tmpl (#1277) + * Refactor repo/issue/view_content.tmpl (#1276) + * Cleaner ui for admin, repo settings, and user settings page (#1269) (#1270) + * Cleaner UI for explore page (#1253) (#1255) + * Synced licenses with github repo (#1246) + * Synced gitignores with github repo (#1245) + * Simplify RepositoryList.loadAttributes() (#1211) + * Move user_follow to separate file (#1210) + * Reduce conditionals in signin/signup inner forms (#1138) + +## [1.1.3](https://github.com/go-gitea/gitea/releases/tag/v1.1.3) - 2017-08-03 + +* BUGFIXES + * Fix PR template error (#2008) + * Fix markdown rendering (fix #1530) (#2043) + * Fix missing less sources for oauth (backport #1288) (#2135) + * Don't ignore gravatar error (#2138) + * Fix diff of renamed and modified file (#2136) + * Fix fast-forward PR bug (#2137) + * Fix some security bugs + +## [1.1.2](https://github.com/go-gitea/gitea/releases/tag/v1.1.2) - 2017-06-13 + +* BUGFIXES + * Enforce netgo build tag while cross-compilation (Backport of #1690) (#1731) + * fix update avatar + * fix delete user failed on sqlite (#1321) + * fix bug not to trim space of login username (#1806) + * Backport bugfixes #1220 and #1393 to v1.1 (#1758) + ## [1.1.1](https://github.com/go-gitea/gitea/releases/tag/v1.1.1) - 2017-05-04 * BUGFIXES @@ -86,7 +594,7 @@ * Added option to config to disable local path imports [#724](https://github.com/go-gitea/gitea/pull/724) * Allow custom public files [#782](https://github.com/go-gitea/gitea/pull/782) * Added pprof endpoint for debugging [#801](https://github.com/go-gitea/gitea/pull/801) - * Added X-GitHub-* headers [#809](https://github.com/go-gitea/gitea/pull/809) + * Added `X-GitHub-*` headers [#809](https://github.com/go-gitea/gitea/pull/809) * Fill SSH key title automatically [#863](https://github.com/go-gitea/gitea/pull/863) * Display Git version on admin panel [#921](https://github.com/go-gitea/gitea/pull/921) * Expose URL field on issue API [#982](https://github.com/go-gitea/gitea/pull/982) @@ -118,7 +626,7 @@ ## [1.0.1](https://github.com/go-gitea/gitea/releases/tag/v1.0.1) - 2017-01-05 * BUGFIXES - * Fixed localized MIN_PASSWORD_LENGTH [#501](https://github.com/go-gitea/gitea/pull/501) + * Fixed localized `MIN_PASSWORD_LENGTH` [#501](https://github.com/go-gitea/gitea/pull/501) * Fixed 500 error on organization delete [#507](https://github.com/go-gitea/gitea/pull/507) * Ignore empty wiki repo on migrate [#544](https://github.com/go-gitea/gitea/pull/544) * Proper check access for forking [#563](https://github.com/go-gitea/gitea/pull/563) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f6f7aff..2699d18 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,22 @@ # Contribution Guidelines +## Table of Contents + +- [Contribution Guidelines](#contribution-guidelines) + - [Introduction](#introduction) + - [Bug reports](#bug-reports) + - [Discuss your design](#discuss-your-design) + - [Testing redux](#testing-redux) + - [Vendoring](#vendoring) + - [Code review](#code-review) + - [Styleguide](#styleguide) + - [Sign your work](#sign-your-work) + - [Release Cycle](#release-cycle) + - [Maintainers](#maintainers) + - [Owners](#owners) + - [Versions](#versions) + - [Copyright](#copyright) + ## Introduction This document explains how to contribute changes to the Gitea project. It assumes you have followed the [installation instructions](https://docs.gitea.io/en-us/). Sensitive security-related issues should be reported to [security@gitea.io](mailto:security@gitea.io). @@ -81,13 +98,13 @@ The current release cycle is aligned to start on December 25 to February 24, nex ## Maintainers -To make sure every PR is checked, we have [team maintainers](https://github.com/orgs/go-gitea/teams/maintainers). Every PR **MUST** be reviewed by at least two maintainers (or owners) before it can get merged. A maintainer should be a contributor of Gitea (or Gogs) and contributed at least 4 accepted PRs. A contributor should apply as a maintainer in the [Gitter develop channel](https://gitter.im/go-gitea/develop). The owners or the team maintainers may invite the contributor. A maintainer should spend some time on code reviews. If a maintainer has no time to do that, they should apply to leave the maintainers team and we will give them the honor of being a member of the [advisors team](https://github.com/orgs/go-gitea/teams/advisors). Of course, if an advisor has time to code review, we will gladly welcome them back to the maintainers team. If a maintainer is inactive for more than 3 months and forgets to leave the maintainers team, the owners may move him or her from the maintainers team to the advisors team. +To make sure every PR is checked, we have [team maintainers](MAINTAINERS). Every PR **MUST** be reviewed by at least two maintainers (or owners) before it can get merged. A maintainer should be a contributor of Gitea (or Gogs) and contributed at least 4 accepted PRs. A contributor should apply as a maintainer in the [Discord](https://discord.gg/NsatcWJ) #develop channel. The owners or the team maintainers may invite the contributor. A maintainer should spend some time on code reviews. If a maintainer has no time to do that, they should apply to leave the maintainers team and we will give them the honor of being a member of the [advisors team](https://github.com/orgs/go-gitea/teams/advisors). Of course, if an advisor has time to code review, we will gladly welcome them back to the maintainers team. If a maintainer is inactive for more than 3 months and forgets to leave the maintainers team, the owners may move him or her from the maintainers team to the advisors team. ## Owners Since Gitea is a pure community organization without any company support, to keep the development healthy we will elect three owners every year. All contributors may vote to elect up to three candidates, one of which will be the main owner, and the other two the assistant owners. When the new owners have been elected, the old owners will give up ownership to the newly elected owners. If an owner is unable to do so, the other owners will assist in ceding ownership to the newly elected owners. -After the election, the new owners should proactively agree with our [CONTRIBUTING](CONTRIBUTING.md) requirements on the [Gitter main channel](https://gitter.im/go-gitea/gitea). Below are the words to speak: +After the election, the new owners should proactively agree with our [CONTRIBUTING](CONTRIBUTING.md) requirements in the [Discord](https://discord.gg/NsatcWJ) #general channel. Below are the words to speak: ``` I'm honored to having been elected an owner of Gitea, I agree with [CONTRIBUTING](CONTRIBUTING.md). I will spend part of my time on Gitea and lead the development of Gitea. diff --git a/Dockerfile b/Dockerfile index 2d47a18..a063f2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,9 @@ -FROM alpine:3.4 +FROM alpine:3.5 MAINTAINER Thomas Boerger EXPOSE 22 3000 -RUN apk update && \ - apk add \ +RUN apk --no-cache add \ su-exec \ ca-certificates \ sqlite \ @@ -14,10 +13,8 @@ RUN apk update && \ s6 \ curl \ openssh \ - tzdata && \ - rm -rf \ - /var/cache/apk/* && \ - addgroup \ + tzdata +RUN addgroup \ -S -g 1000 \ git && \ adduser \ @@ -27,7 +24,7 @@ RUN apk update && \ -u 1000 \ -G git \ git && \ - echo "git:$(date +%s | sha256sum | base64 | head -c 32)" | chpasswd + echo "git:$(dd if=/dev/urandom bs=24 count=1 status=none | base64)" | chpasswd ENV USER git ENV GITEA_CUSTOM /data/gitea diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 new file mode 100644 index 0000000..a9dc3ad --- /dev/null +++ b/Dockerfile.aarch64 @@ -0,0 +1,40 @@ +FROM multiarch/alpine:aarch64-v3.5 + +EXPOSE 22 3000 + +RUN apk --no-cache add \ + su-exec \ + ca-certificates \ + sqlite \ + bash \ + git \ + linux-pam \ + s6 \ + curl \ + openssh \ + tzdata +RUN addgroup \ + -S -g 1000 \ + git && \ + adduser \ + -S -H -D \ + -h /data/git \ + -s /bin/bash \ + -u 1000 \ + -G git \ + git && \ + echo "git:$(dd if=/dev/urandom bs=24 count=1 status=none | base64)" | chpasswd + +ENV USER git +ENV GITEA_CUSTOM /data/gitea + +COPY docker / +COPY gitea /app/gitea/gitea + +ENV GODEBUG=netdns=go + +VOLUME ["/data"] + +ENTRYPOINT ["/usr/bin/entrypoint"] +CMD ["/bin/s6-svscan", "/etc/s6"] + diff --git a/Dockerfile.rpi b/Dockerfile.rpi index e334ffc..373b802 100644 --- a/Dockerfile.rpi +++ b/Dockerfile.rpi @@ -1,10 +1,9 @@ -FROM hypriot/rpi-alpine-scratch:v3.4 +FROM multiarch/alpine:armhf-v3.5 MAINTAINER Thomas Boerger EXPOSE 22 3000 -RUN apk update && \ - apk add \ +RUN apk --no-cache add \ su-exec \ ca-certificates \ sqlite \ @@ -14,10 +13,8 @@ RUN apk update && \ s6 \ curl \ openssh \ - tzdata && \ - rm -rf \ - /var/cache/apk/* && \ - addgroup \ + tzdata +RUN addgroup \ -S -g 1000 \ git && \ adduser \ @@ -27,7 +24,7 @@ RUN apk update && \ -u 1000 \ -G git \ git && \ - echo "git:$(date +%s | sha256sum | base64 | head -c 32)" | chpasswd + echo "git:$(dd if=/dev/urandom bs=24 count=1 status=none | base64)" | chpasswd ENV USER git ENV GITEA_CUSTOM /data/gitea diff --git a/MAINTAINERS b/MAINTAINERS index 495a418..7c1215c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -12,3 +12,7 @@ Rémy Boulanouar (@DblK) Sandro Santilli (@strk) Thibault Meyer (@0xbaadf00d) Thomas Boerger (@tboerger) +Patrick G (@geek1011) +Antoine Girard (@sapk) +Lauris Bukšis-Haberkorns (@lafriks) +Jonas Östanbäck (@cez81) diff --git a/Makefile b/Makefile index a76208f..855f42c 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,43 @@ DIST := dist IMPORT := code.gitea.io/gitea +GO ?= go +SED_INPLACE := sed -i + +ifeq ($(OS), Windows_NT) + EXECUTABLE := gitea.exe +else + EXECUTABLE := gitea + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Darwin) + SED_INPLACE := sed -i '' + endif +endif + +BINDATA := modules/{options,public,templates}/bindata.go +STYLESHEETS := $(wildcard public/less/index.less public/less/_*.less) +DOCKER_TAG := gitea/gitea:latest +GOFILES := $(shell find . -name "*.go" -type f ! -path "./vendor/*" ! -path "*/bindata.go") +GOFMT ?= gofmt -s + +GOFLAGS := -i -v +EXTRA_GOFLAGS ?= + +LDFLAGS := -X "main.Version=$(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//')" -X "main.Tags=$(TAGS)" + +PACKAGES ?= $(filter-out code.gitea.io/gitea/integrations,$(shell $(GO) list ./... | grep -v /vendor/)) +SOURCES ?= $(shell find . -name "*.go" -type f) + +TAGS ?= + +TMPDIR := $(shell mktemp -d 2>/dev/null || mktemp -d -t 'gitea-temp') + ifeq ($(OS), Windows_NT) EXECUTABLE := gitea.exe else EXECUTABLE := gitea endif -BINDATA := modules/{options,public,templates}/bindata.go -STYLESHEETS := $(wildcard public/less/index.less public/less/_*.less) -JAVASCRIPTS := - -LDFLAGS := -X "main.Version=$(shell git describe --tags --always | sed 's/-/+/' | sed 's/^v//')" -X "main.Tags=$(TAGS)" - -PACKAGES ?= $(filter-out code.gitea.io/gitea/integrations,$(shell go list ./... | grep -v /vendor/)) -SOURCES ?= $(shell find . -name "*.go" -type f) - -TAGS ?= - ifneq ($(DRONE_TAG),) VERSION ?= $(subst v,,$(DRONE_TAG)) else @@ -33,72 +53,161 @@ all: build .PHONY: clean clean: - go clean -i ./... - rm -rf $(EXECUTABLE) $(DIST) $(BINDATA) + $(GO) clean -i ./... + rm -rf $(EXECUTABLE) $(DIST) $(BINDATA) integrations*.test .PHONY: fmt fmt: - find . -name "*.go" -type f -not -path "./vendor/*" | xargs gofmt -s -w + $(GOFMT) -w $(GOFILES) .PHONY: vet vet: - go vet $(PACKAGES) + $(GO) vet $(PACKAGES) .PHONY: generate generate: @hash go-bindata > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - go get -u github.com/jteeuwen/go-bindata/...; \ + $(GO) get -u github.com/jteeuwen/go-bindata/...; \ fi - go generate $(PACKAGES) + $(GO) generate $(PACKAGES) + +.PHONY: generate-swagger +generate-swagger: + @hash swagger > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + $(GO) get -u github.com/go-swagger/go-swagger/cmd/swagger; \ + fi + swagger generate spec -o ./public/swagger.v1.json + $(SED_INPLACE) "s;\".ref\": \"#/definitions/GPGKey\";\"type\": \"object\";g" ./public/swagger.v1.json + $(SED_INPLACE) "s;^ \".ref\": \"#/definitions/Repository\"; \"type\": \"object\";g" ./public/swagger.v1.json .PHONY: errcheck errcheck: @hash errcheck > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - go get -u github.com/kisielk/errcheck; \ + $(GO) get -u github.com/kisielk/errcheck; \ fi errcheck $(PACKAGES) .PHONY: lint lint: @hash golint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - go get -u github.com/golang/lint/golint; \ + $(GO) get -u github.com/golang/lint/golint; \ fi for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done; -.PHONY: integrations -integrations: TAGS=bindata sqlite -integrations: build - go test code.gitea.io/gitea/integrations +.PHONY: misspell-check +misspell-check: + @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + $(GO) get -u github.com/client9/misspell/cmd/misspell; \ + fi + misspell -error -i unknwon $(GOFILES) + +.PHONY: misspell +misspell: + @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + $(GO) get -u github.com/client9/misspell/cmd/misspell; \ + fi + misspell -w -i unknwon $(GOFILES) + +.PHONY: fmt-check +fmt-check: + # get all go files and run go fmt on them + @diff=$$($(GOFMT) -d $(GOFILES)); \ + if [ -n "$$diff" ]; then \ + echo "Please run 'make fmt' and commit the result:"; \ + echo "$${diff}"; \ + exit 1; \ + fi; .PHONY: test -test: - for PKG in $(PACKAGES); do go test -cover -coverprofile $$GOPATH/src/$$PKG/coverage.out $$PKG || exit 1; done; +test: fmt-check + $(GO) test $(PACKAGES) + +.PHONY: test-coverage +test-coverage: unit-test-coverage integration-test-coverage + @hash gocovmerge > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + $(GO) get -u github.com/wadey/gocovmerge; \ + fi + for PKG in $(PACKAGES); do\ + touch $$GOPATH/src/$$PKG/coverage.out;\ + egrep "$$PKG[^/]*\.go" integration.coverage.out > int.coverage.out;\ + gocovmerge $$GOPATH/src/$$PKG/coverage.out int.coverage.out > pkg.coverage.out;\ + mv pkg.coverage.out $$GOPATH/src/$$PKG/coverage.out;\ + rm int.coverage.out;\ + done; + +.PHONY: unit-test-coverage +unit-test-coverage: + for PKG in $(PACKAGES); do $(GO) test -cover -coverprofile $$GOPATH/src/$$PKG/coverage.out $$PKG || exit 1; done; + +.PHONY: test-vendor +test-vendor: + @hash govendor > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + $(GO) get -u github.com/kardianos/govendor; \ + fi + govendor list +unused | tee "$(TMPDIR)/wc-gitea-unused" + [ $$(cat "$(TMPDIR)/wc-gitea-unused" | wc -l) -eq 0 ] || echo "Warning: /!\\ Some vendor are not used /!\\" + + govendor list +outside | tee "$(TMPDIR)/wc-gitea-outside" + [ $$(cat "$(TMPDIR)/wc-gitea-outside" | wc -l) -eq 0 ] || exit 1 + + govendor status || exit 1 + +.PHONY: test-sqlite +test-sqlite: integrations.sqlite.test + GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/sqlite.ini ./integrations.sqlite.test .PHONY: test-mysql -test-mysql: - @echo "Not integrated yet!" +test-mysql: integrations.test + GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/mysql.ini ./integrations.test .PHONY: test-pgsql -test-pgsql: - @echo "Not integrated yet!" +test-pgsql: integrations.test + GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/pgsql.ini ./integrations.test + + +.PHONY: bench-sqlite +bench-sqlite: integrations.sqlite.test + GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/sqlite.ini ./integrations.sqlite.test -test.bench . + +.PHONY: bench-mysql +bench-mysql: integrations.test + GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/mysql.ini ./integrations.test -test.bench . + +.PHONY: bench-pgsql +bench-pgsql: integrations.test + GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/pgsql.ini ./integrations.test -test.bench . + + +.PHONY: integration-test-coverage +integration-test-coverage: integrations.cover.test + GITEA_ROOT=${CURDIR} GITEA_CONF=integrations/mysql.ini ./integrations.cover.test -test.coverprofile=integration.coverage.out + +integrations.test: $(SOURCES) + $(GO) test -c code.gitea.io/gitea/integrations + +integrations.sqlite.test: $(SOURCES) + $(GO) test -c code.gitea.io/gitea/integrations -o integrations.sqlite.test -tags 'sqlite' + +integrations.cover.test: $(SOURCES) + $(GO) test -c code.gitea.io/gitea/integrations -coverpkg $(shell echo $(PACKAGES) | tr ' ' ',') -o integrations.cover.test .PHONY: check check: test .PHONY: install install: $(wildcard *.go) - go install -v -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' + $(GO) install -v -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' .PHONY: build build: $(EXECUTABLE) $(EXECUTABLE): $(SOURCES) - go build -i -v -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@ + $(GO) build $(GOFLAGS) $(EXTRA_GOFLAGS) -tags '$(TAGS)' -ldflags '-s -w $(LDFLAGS)' -o $@ .PHONY: docker docker: docker run -ti --rm -v $(CURDIR):/srv/app/src/code.gitea.io/gitea -w /srv/app/src/code.gitea.io/gitea -e TAGS="bindata $(TAGS)" webhippie/golang:edge make clean generate build - docker build -t gitea/gitea:latest . + docker build -t $(DOCKER_TAG) . .PHONY: release release: release-dirs release-windows release-linux release-darwin release-copy release-check @@ -110,7 +219,7 @@ release-dirs: .PHONY: release-windows release-windows: @hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - go get -u github.com/karalabe/xgo; \ + $(GO) get -u github.com/karalabe/xgo; \ fi xgo -dest $(DIST)/binaries -tags 'netgo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets 'windows/*' -out gitea-$(VERSION) . ifeq ($(CI),drone) @@ -120,7 +229,7 @@ endif .PHONY: release-linux release-linux: @hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - go get -u github.com/karalabe/xgo; \ + $(GO) get -u github.com/karalabe/xgo; \ fi xgo -dest $(DIST)/binaries -tags 'netgo $(TAGS)' -ldflags '-linkmode external -extldflags "-static" $(LDFLAGS)' -targets 'linux/*' -out gitea-$(VERSION) . ifeq ($(CI),drone) @@ -130,7 +239,7 @@ endif .PHONY: release-darwin release-darwin: @hash xgo > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - go get -u github.com/karalabe/xgo; \ + $(GO) get -u github.com/karalabe/xgo; \ fi xgo -dest $(DIST)/binaries -tags 'netgo $(TAGS)' -ldflags '$(LDFLAGS)' -targets 'darwin/*' -out gitea-$(VERSION) . ifeq ($(CI),drone) @@ -152,12 +261,64 @@ javascripts: public/js/index.js public/js/index.js: $(JAVASCRIPTS) cat $< >| $@ +.PHONY: stylesheets-check +stylesheets-check: stylesheets + @diff=$$(git diff public/css/index.css); \ + if [ -n "$$diff" ]; then \ + echo "Please run 'make stylesheets' and commit the result:"; \ + echo "$${diff}"; \ + exit 1; \ + fi; + .PHONY: stylesheets stylesheets: public/css/index.css .IGNORE: public/css/index.css public/css/index.css: $(STYLESHEETS) - lessc $< $@ + @which lessc > /dev/null; if [ $$? -ne 0 ]; then \ + $(GO) get -u github.com/kib357/less-go/lessc; \ + fi + lessc -i $< -o $@ -.PHONY: assets -assets: javascripts stylesheets +.PHONY: swagger-ui +swagger-ui: + rm -Rf public/vendor/assets/swagger-ui + git clone --depth=10 -b v3.0.7 --single-branch https://github.com/swagger-api/swagger-ui.git $(TMPDIR)/swagger-ui + mv $(TMPDIR)/swagger-ui/dist public/vendor/assets/swagger-ui + rm -Rf $(TMPDIR)/swagger-ui + $(SED_INPLACE) "s;http://petstore.swagger.io/v2/swagger.json;../../swagger.v1.json;g" public/assets/swagger-ui/index.html + +.PHONY: update-translations +update-translations: + mkdir -p ./translations + cd ./translations && curl -L https://crowdin.com/download/project/gitea.zip > gitea.zip && unzip gitea.zip + rm ./translations/gitea.zip + $(SED_INPLACE) -e 's/="/=/g' -e 's/"$$//g' ./translations/*.ini + $(SED_INPLACE) -e 's/\\"/"/g' ./translations/*.ini + mv ./translations/*.ini ./options/locale/ + rmdir ./translations + +.PHONY: generate-images +generate-images: + mkdir -p $(TMPDIR)/images + inkscape -f $(PWD)/assets/logo.svg -w 880 -h 880 -e $(PWD)/public/img/gitea-lg.png + inkscape -f $(PWD)/assets/logo.svg -w 120 -h 120 -jC -i layer1 -e $(TMPDIR)/images/sm-1.png + inkscape -f $(PWD)/assets/logo.svg -w 120 -h 120 -jC -i layer2 -e $(TMPDIR)/images/sm-2.png + composite -compose atop $(TMPDIR)/images/sm-2.png $(TMPDIR)/images/sm-1.png $(PWD)/public/img/gitea-sm.png + inkscape -f $(PWD)/assets/logo.svg -w 200 -h 200 -e $(PWD)/public/img/avatar_default.png + inkscape -f $(PWD)/assets/logo.svg -w 180 -h 180 -e $(PWD)/public/img/favicon.png + inkscape -f $(PWD)/assets/logo.svg -w 128 -h 128 -e $(TMPDIR)/images/128-raw.png + inkscape -f $(PWD)/assets/logo.svg -w 64 -h 64 -e $(TMPDIR)/images/64-raw.png + inkscape -f $(PWD)/assets/logo.svg -w 32 -h 32 -jC -i layer1 -e $(TMPDIR)/images/32-1.png + inkscape -f $(PWD)/assets/logo.svg -w 32 -h 32 -jC -i layer2 -e $(TMPDIR)/images/32-2.png + composite -compose atop $(TMPDIR)/images/32-2.png $(TMPDIR)/images/32-1.png $(TMPDIR)/images/32-raw.png + inkscape -f $(PWD)/assets/logo.svg -w 16 -h 16 -jC -i layer1 -e $(TMPDIR)/images/16-raw.png + zopflipng $(TMPDIR)/images/128-raw.png $(TMPDIR)/images/128.png + zopflipng $(TMPDIR)/images/64-raw.png $(TMPDIR)/images/64.png + zopflipng $(TMPDIR)/images/32-raw.png $(TMPDIR)/images/32.png + zopflipng $(TMPDIR)/images/16-raw.png $(TMPDIR)/images/16.png + rm -f $(TMPDIR)/images/*-*.png + convert $(TMPDIR)/images/16.png $(TMPDIR)/images/32.png \ + $(TMPDIR)/images/64.png $(TMPDIR)/images/128.png \ + $(PWD)/public/img/favicon.ico + rm -rf $(TMPDIR)/images diff --git a/README.md b/README.md index 1a4dbe0..6316401 100644 --- a/README.md +++ b/README.md @@ -3,19 +3,19 @@ # Gitea - Git with a cup of tea [![Build Status](https://drone.gitea.io/api/badges/go-gitea/gitea/status.svg)](https://drone.gitea.io/go-gitea/gitea) -[![Join the chat at https://gitter.im/go-gitea/gitea](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-gitea/gitea?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Join the Discord chat at https://discord.gg/NsatcWJ](https://img.shields.io/discord/322538954119184384.svg)](https://discord.gg/NsatcWJ) +[![Join the Matrix chat at https://matrix.to/#/#gitea:matrix.org](https://img.shields.io/badge/matrix-%23gitea%3Amatrix.org-7bc9a4.svg)](https://matrix.to/#/#gitea:matrix.org) [![](https://images.microbadger.com/badges/image/gitea/gitea.svg)](https://microbadger.com/images/gitea/gitea "Get your own image badge on microbadger.com") [![Coverage Status](https://coverage.gitea.io/badges/go-gitea/gitea/coverage.svg)](https://coverage.gitea.io/go-gitea/gitea) [![Go Report Card](https://goreportcard.com/badge/code.gitea.io/gitea)](https://goreportcard.com/report/code.gitea.io/gitea) [![GoDoc](https://godoc.org/code.gitea.io/gitea?status.svg)](https://godoc.org/code.gitea.io/gitea) [![Release](https://github-release-version.herokuapp.com/github/go-gitea/gitea/release.svg?style=flat)](https://github.com/go-gitea/gitea/releases/latest) -|||| -|:-------------:|:-------:|:-------:| +| | | | +|:---:|:---:|:---:| |![Dashboard](https://i.imgur.com/3iEQsux.jpg)|![Repository](https://i.imgur.com/glqFnj8.jpg)|![Commits History](https://i.imgur.com/ad1FEpi.jpg)| |![Profile](https://i.imgur.com/q81EcGa.jpg)|![Admin Dashboard](https://i.imgur.com/L2CQeN0.jpg)|![Diff](https://i.imgur.com/cNuvMum.jpg)| |![Issues](https://i.imgur.com/xCYRqaF.jpg)|![Releases](https://i.imgur.com/ILpRBCe.jpg)|![Organization](https://i.imgur.com/0BHnrcL.jpg)| -|||| ## Purpose @@ -29,7 +29,7 @@ The goal of this project is to make the easiest, fastest, and most painless way ## Docs -For more information and instructions about how to install Gitea please look at our [documentation](https://docs.gitea.io/en-us/). If you cannot find some specific information, then head over to our [Gitter](https://gitter.im/go-gitea/gitea) channel to chat with us. +For more information and instructions about how to install Gitea please look at our [documentation](https://docs.gitea.io/en-us/). If you cannot find some specific information, then head over to our [Discord server](https://discord.gg/NsatcWJ) or [Matrix room](https://matrix.to/#/#gitea:matrix.org) to chat with us or use the [forum](https://discourse.gitea.io/). ## Contributing diff --git a/README_ZH.md b/README_ZH.md index 9b9b694..8610adf 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -3,19 +3,18 @@ # Gitea - Git with a cup of tea [![Build Status](https://drone.gitea.io/api/badges/go-gitea/gitea/status.svg)](https://drone.gitea.io/go-gitea/gitea) -[![Join the chat at https://gitter.im/go-gitea/gitea](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-gitea/gitea?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Join the chat at https://img.shields.io/discord/322538954119184384.svg](https://img.shields.io/discord/322538954119184384.svg)](https://discord.gg/NsatcWJ) [![](https://images.microbadger.com/badges/image/gitea/gitea.svg)](https://microbadger.com/images/gitea/gitea "Get your own image badge on microbadger.com") [![Coverage Status](https://coverage.gitea.io/badges/go-gitea/gitea/coverage.svg)](https://coverage.gitea.io/go-gitea/gitea) [![Go Report Card](https://goreportcard.com/badge/code.gitea.io/gitea)](https://goreportcard.com/report/code.gitea.io/gitea) [![GoDoc](https://godoc.org/code.gitea.io/gitea?status.svg)](https://godoc.org/code.gitea.io/gitea) [![Release](https://github-release-version.herokuapp.com/github/go-gitea/gitea/release.svg?style=flat)](https://github.com/go-gitea/gitea/releases/latest) -|||| -|:-------------:|:-------:|:-------:| +| | | | +|:---:|:---:|:---:| |![Dashboard](https://i.imgur.com/3iEQsux.jpg)|![Repository](https://i.imgur.com/glqFnj8.jpg)|![Commits History](https://i.imgur.com/ad1FEpi.jpg)| |![Profile](https://i.imgur.com/q81EcGa.jpg)|![Admin Dashboard](https://i.imgur.com/L2CQeN0.jpg)|![Diff](https://i.imgur.com/cNuvMum.jpg)| |![Issues](https://i.imgur.com/xCYRqaF.jpg)|![Releases](https://i.imgur.com/ILpRBCe.jpg)|![Organization](https://i.imgur.com/0BHnrcL.jpg)| -|||| ## 目标 @@ -31,7 +30,7 @@ Gitea的首要目标是创建一个极易安装,运行非常快速,安装和 ## 文档 -关于如何安装请访问我们的 [文档站](https://docs.gitea.io/zh-cn/),如果没有找到对应的文档,你也可以通过 [Gitter - 英文](https://gitter.im/go-gitea/gitea) 和 QQ群 328432459 来和我们交流。 +关于如何安装请访问我们的 [文档站](https://docs.gitea.io/zh-cn/),如果没有找到对应的文档,你也可以通过 [Discord - 英文](https://discord.gg/NsatcWJ) 和 QQ群 328432459 来和我们交流。 ## 贡献流程 diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000..ac1594a --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/cmd/admin.go b/cmd/admin.go index 4b4ab95..928bc1e 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -8,10 +8,10 @@ package cmd import ( "fmt" - "github.com/urfave/cli" - "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/setting" + + "github.com/urfave/cli" ) var ( @@ -23,6 +23,7 @@ var ( to make automatic initialization process more smoothly`, Subcommands: []cli.Command{ subcmdCreateUser, + subcmdChangePassword, }, } @@ -57,8 +58,59 @@ to make automatic initialization process more smoothly`, }, }, } + + subcmdChangePassword = cli.Command{ + Name: "change-password", + Usage: "Change a user's password", + Action: runChangePassword, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "username,u", + Value: "", + Usage: "The user to change password for", + }, + cli.StringFlag{ + Name: "password,p", + Value: "", + Usage: "New password to set for user", + }, + }, + } ) +func runChangePassword(c *cli.Context) error { + if !c.IsSet("password") { + return fmt.Errorf("Password is not specified") + } else if !c.IsSet("username") { + return fmt.Errorf("Username is not specified") + } + + setting.NewContext() + models.LoadConfigs() + + setting.NewXORMLogService(false) + if err := models.SetEngine(); err != nil { + return fmt.Errorf("models.SetEngine: %v", err) + } + + uname := c.String("username") + user, err := models.GetUserByName(uname) + if err != nil { + return fmt.Errorf("%v", err) + } + user.Passwd = c.String("password") + if user.Salt, err = models.GetUserSalt(); err != nil { + return fmt.Errorf("%v", err) + } + user.EncodePasswd() + if err := models.UpdateUserCols(user, "passwd", "salt"); err != nil { + return fmt.Errorf("%v", err) + } + + fmt.Printf("User '%s' password has been successfully updated!\n", uname) + return nil +} + func runCreateUser(c *cli.Context) error { if !c.IsSet("name") { return fmt.Errorf("Username is not specified") diff --git a/cmd/dump.go b/cmd/dump.go index ad095ed..2f42bb8 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -16,6 +16,7 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/setting" + "github.com/Unknwon/cae/zip" "github.com/Unknwon/com" "github.com/urfave/cli" @@ -73,6 +74,11 @@ func runDump(ctx *cli.Context) error { } log.Printf("Creating tmp work dir: %s", TmpWorkDir) + // work-around #1103 + if os.Getenv("TMPDIR") == "" { + os.Setenv("TMPDIR", TmpWorkDir) + } + reposDump := path.Join(TmpWorkDir, "gitea-repo.zip") dbDump := path.Join(TmpWorkDir, "gitea-db.sql") diff --git a/cmd/hook.go b/cmd/hook.go index d120f21..9a6fc67 100644 --- a/cmd/hook.go +++ b/cmd/hook.go @@ -7,20 +7,18 @@ package cmd import ( "bufio" "bytes" - "crypto/tls" "fmt" "os" + "path/filepath" "strconv" "strings" "code.gitea.io/git" "code.gitea.io/gitea/models" - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/httplib" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" "code.gitea.io/gitea/modules/setting" - "github.com/Unknwon/com" "github.com/urfave/cli" ) @@ -64,6 +62,12 @@ var ( } ) +func hookSetup(logPath string) { + setting.NewContext() + log.NewGitLogger(filepath.Join(setting.LogRootPath, logPath)) + models.LoadConfigs() +} + func runHookPreReceive(c *cli.Context) error { if len(os.Getenv("SSH_ORIGINAL_COMMAND")) == 0 { return nil @@ -75,9 +79,7 @@ func runHookPreReceive(c *cli.Context) error { setting.CustomConf = c.GlobalString("config") } - if err := setup("hooks/pre-receive.log"); err != nil { - fail("Hook pre-receive init failed", fmt.Sprintf("setup: %v", err)) - } + hookSetup("hooks/pre-receive.log") // the environment setted on serv command repoID, _ := strconv.ParseInt(os.Getenv(models.ProtectedBranchRepoID), 10, 64) @@ -119,16 +121,16 @@ func runHookPreReceive(c *cli.Context) error { }*/ branchName := strings.TrimPrefix(refFullName, git.BranchPrefix) - protectBranch, err := models.GetProtectedBranchBy(repoID, branchName) + protectBranch, err := private.GetProtectedBranchBy(repoID, branchName) if err != nil { log.GitLogger.Fatal(2, "retrieve protected branches information failed") } - if protectBranch != nil { + if protectBranch != nil && protectBranch.IsProtected() { // check and deletion if newCommitID == git.EmptySHA { fail(fmt.Sprintf("branch %s is protected from deletion", branchName), "") - } else { + } else if !protectBranch.CanPush { fail(fmt.Sprintf("protected branch %s can not be pushed to", branchName), "") //fail(fmt.Sprintf("branch %s is protected from force push", branchName), "") } @@ -149,9 +151,7 @@ func runHookUpdate(c *cli.Context) error { setting.CustomConf = c.GlobalString("config") } - if err := setup("hooks/update.log"); err != nil { - fail("Hook update init failed", fmt.Sprintf("setup: %v", err)) - } + hookSetup("hooks/update.log") return nil } @@ -167,13 +167,10 @@ func runHookPostReceive(c *cli.Context) error { setting.CustomConf = c.GlobalString("config") } - if err := setup("hooks/post-receive.log"); err != nil { - fail("Hook post-receive init failed", fmt.Sprintf("setup: %v", err)) - } + hookSetup("hooks/post-receive.log") // the environment setted on serv command repoUser := os.Getenv(models.EnvRepoUsername) - repoUserSalt := os.Getenv(models.EnvRepoUserSalt) isWiki := (os.Getenv(models.EnvRepoIsWiki) == "true") repoName := os.Getenv(models.EnvRepoName) pusherID, _ := strconv.ParseInt(os.Getenv(models.EnvPusherID), 10, 64) @@ -199,7 +196,7 @@ func runHookPostReceive(c *cli.Context) error { newCommitID := string(fields[1]) refFullName := string(fields[2]) - if err := models.PushUpdate(models.PushUpdateOptions{ + if err := private.PushUpdate(models.PushUpdateOptions{ RefFullName: refFullName, OldCommitID: oldCommitID, NewCommitID: newCommitID, @@ -210,23 +207,6 @@ func runHookPostReceive(c *cli.Context) error { }); err != nil { log.GitLogger.Error(2, "Update: %v", err) } - - // Ask for running deliver hook and test pull request tasks. - reqURL := setting.LocalURL + repoUser + "/" + repoName + "/tasks/trigger?branch=" + - strings.TrimPrefix(refFullName, git.BranchPrefix) + "&secret=" + base.EncodeMD5(repoUserSalt) + "&pusher=" + com.ToStr(pusherID) - log.GitLogger.Trace("Trigger task: %s", reqURL) - - resp, err := httplib.Head(reqURL).SetTLSClientConfig(&tls.Config{ - InsecureSkipVerify: true, - }).Response() - if err == nil { - resp.Body.Close() - if resp.StatusCode/100 != 2 { - log.GitLogger.Error(2, "Failed to trigger task: not 2xx response code") - } - } else { - log.GitLogger.Error(2, "Failed to trigger task: %v", err) - } } return nil diff --git a/cmd/serv.go b/cmd/serv.go index 5b1caf4..4e3b9de 100644 --- a/cmd/serv.go +++ b/cmd/serv.go @@ -16,7 +16,9 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/private" "code.gitea.io/gitea/modules/setting" + "github.com/Unknwon/com" "github.com/dgrijalva/jwt-go" "github.com/urfave/cli" @@ -105,7 +107,8 @@ func runServ(c *cli.Context) error { } if len(c.Args()) < 1 { - fail("Not enough arguments", "Not enough arguments") + cli.ShowSubcommandHelp(c) + return nil } cmd := os.Getenv("SSH_ORIGINAL_COMMAND") @@ -123,8 +126,8 @@ func runServ(c *cli.Context) error { fail("Unknown git command", "LFS authentication request over SSH denied, LFS support is disabled") } - if strings.Contains(args, " ") { - argsSplit := strings.SplitN(args, " ", 2) + argsSplit := strings.Split(args, " ") + if len(argsSplit) >= 2 { args = strings.TrimSpace(argsSplit[0]) lfsVerb = strings.TrimSpace(argsSplit[1]) } @@ -140,8 +143,10 @@ func runServ(c *cli.Context) error { reponame := strings.ToLower(strings.TrimSuffix(rr[1], ".git")) isWiki := false + unitType := models.UnitTypeCode if strings.HasSuffix(reponame, ".wiki") { isWiki = true + unitType = models.UnitTypeWiki reponame = reponame[:len(reponame)-5] } @@ -161,8 +166,6 @@ func runServ(c *cli.Context) error { fail("Internal error", "Failed to get repository owner (%s): %v", username, err) } - os.Setenv(models.EnvRepoUserSalt, repoUser.Salt) - repo, err := models.GetRepositoryByName(repoUser.ID, reponame) if err != nil { if models.IsErrRepoNotExist(err) { @@ -179,8 +182,10 @@ func runServ(c *cli.Context) error { if verb == lfsAuthenticateVerb { if lfsVerb == "upload" { requestedMode = models.AccessModeWrite - } else { + } else if lfsVerb == "download" { requestedMode = models.AccessModeRead + } else { + fail("Unknown LFS verb", "Unknown lfs verb %s", lfsVerb) } } @@ -232,7 +237,7 @@ func runServ(c *cli.Context) error { fail("internal error", "Failed to get user by key ID(%d): %v", keyID, err) } - mode, err := models.AccessLevel(user, repo) + mode, err := models.AccessLevel(user.ID, repo) if err != nil { fail("Internal error", "Failed to check access: %v", err) } else if mode < requestedMode { @@ -245,6 +250,12 @@ func runServ(c *cli.Context) error { user.Name, requestedMode, repoPath) } + if !repo.CheckUnitUser(user.ID, user.IsAdmin, unitType) { + fail("You do not have allowed for this action", + "User %s does not have allowed access to repository %s 's code", + user.Name, repoPath) + } + os.Setenv(models.EnvPusherName, user.Name) os.Setenv(models.EnvPusherID, fmt.Sprintf("%d", user.ID)) } @@ -296,6 +307,12 @@ func runServ(c *cli.Context) error { gitcmd = exec.Command(verb, repoPath) } + if isWiki { + if err = repo.InitWiki(); err != nil { + fail("Internal error", "Failed to init wiki repo: %v", err) + } + } + os.Setenv(models.ProtectedBranchRepoID, fmt.Sprintf("%d", repo.ID)) gitcmd.Dir = setting.RepoRootPath @@ -308,13 +325,7 @@ func runServ(c *cli.Context) error { // Update user key activity. if keyID > 0 { - key, err := models.GetPublicKeyByID(keyID) - if err != nil { - fail("Internal error", "GetPublicKeyById: %v", err) - } - - key.Updated = time.Now() - if err = models.UpdatePublicKey(key); err != nil { + if err = private.UpdatePublicKeyUpdated(keyID); err != nil { fail("Internal error", "UpdatePublicKey: %v", err) } } diff --git a/cmd/web.go b/cmd/web.go index c2d14a7..21f12ee 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -11,37 +11,15 @@ import ( "net/http/fcgi" _ "net/http/pprof" // Used for debugging if enabled and a web server is running "os" - "path" "strings" - "code.gitea.io/gitea/models" - "code.gitea.io/gitea/modules/auth" - "code.gitea.io/gitea/modules/context" - "code.gitea.io/gitea/modules/lfs" "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/options" - "code.gitea.io/gitea/modules/public" "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/templates" "code.gitea.io/gitea/routers" - "code.gitea.io/gitea/routers/admin" - apiv1 "code.gitea.io/gitea/routers/api/v1" - "code.gitea.io/gitea/routers/dev" - "code.gitea.io/gitea/routers/org" - "code.gitea.io/gitea/routers/repo" - "code.gitea.io/gitea/routers/user" + "code.gitea.io/gitea/routers/routes" - "github.com/go-macaron/binding" - "github.com/go-macaron/cache" - "github.com/go-macaron/captcha" - "github.com/go-macaron/csrf" - "github.com/go-macaron/gzip" - "github.com/go-macaron/i18n" - "github.com/go-macaron/session" - "github.com/go-macaron/toolbox" context2 "github.com/gorilla/context" "github.com/urfave/cli" - macaron "gopkg.in/macaron.v1" ) // CmdWeb represents the available web sub-command. @@ -70,94 +48,6 @@ and it takes care of all the other things for you`, }, } -// newMacaron initializes Macaron instance. -func newMacaron() *macaron.Macaron { - m := macaron.New() - if !setting.DisableRouterLog { - m.Use(macaron.Logger()) - } - m.Use(macaron.Recovery()) - if setting.EnableGzip { - m.Use(gzip.Gziper()) - } - if setting.Protocol == setting.FCGI { - m.SetURLPrefix(setting.AppSubURL) - } - m.Use(public.Custom( - &public.Options{ - SkipLogging: setting.DisableRouterLog, - }, - )) - m.Use(public.Static( - &public.Options{ - Directory: path.Join(setting.StaticRootPath, "public"), - SkipLogging: setting.DisableRouterLog, - }, - )) - m.Use(macaron.Static( - setting.AvatarUploadPath, - macaron.StaticOptions{ - Prefix: "avatars", - SkipLogging: setting.DisableRouterLog, - ETag: true, - }, - )) - - m.Use(templates.Renderer()) - models.InitMailRender(templates.Mailer()) - - localeNames, err := options.Dir("locale") - - if err != nil { - log.Fatal(4, "Failed to list locale files: %v", err) - } - - localFiles := make(map[string][]byte) - - for _, name := range localeNames { - localFiles[name], err = options.Locale(name) - - if err != nil { - log.Fatal(4, "Failed to load %s locale file. %v", name, err) - } - } - - m.Use(i18n.I18n(i18n.Options{ - SubURL: setting.AppSubURL, - Files: localFiles, - Langs: setting.Langs, - Names: setting.Names, - DefaultLang: "en-US", - Redirect: true, - })) - m.Use(cache.Cacher(cache.Options{ - Adapter: setting.CacheAdapter, - AdapterConfig: setting.CacheConn, - Interval: setting.CacheInterval, - })) - m.Use(captcha.Captchaer(captcha.Options{ - SubURL: setting.AppSubURL, - })) - m.Use(session.Sessioner(setting.SessionConfig)) - m.Use(csrf.Csrfer(csrf.Options{ - Secret: setting.SecretKey, - Cookie: setting.CSRFCookieName, - SetCookie: true, - Header: "X-Csrf-Token", - CookiePath: setting.AppSubURL, - })) - m.Use(toolbox.Toolboxer(m, toolbox.Options{ - HealthCheckFuncs: []*toolbox.HealthCheckFuncDesc{ - { - Desc: "Database connection", - Func: models.Ping, - }, - }, - })) - m.Use(context.Contexter()) - return m -} - func runWeb(ctx *cli.Context) error { if ctx.IsSet("config") { setting.CustomConf = ctx.String("config") @@ -169,482 +59,8 @@ func runWeb(ctx *cli.Context) error { routers.GlobalInit() - m := newMacaron() - - reqSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: true}) - ignSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: setting.Service.RequireSignInView}) - ignSignInAndCsrf := context.Toggle(&context.ToggleOptions{DisableCSRF: true}) - reqSignOut := context.Toggle(&context.ToggleOptions{SignOutRequired: true}) - - bindIgnErr := binding.BindIgnErr - - m.Use(user.GetNotificationCount) - - // FIXME: not all routes need go through same middlewares. - // Especially some AJAX requests, we can reduce middleware number to improve performance. - // Routers. - m.Get("/", ignSignIn, routers.Home) - m.Group("/explore", func() { - m.Get("", func(ctx *context.Context) { - ctx.Redirect(setting.AppSubURL + "/explore/repos") - }) - m.Get("/repos", routers.ExploreRepos) - m.Get("/users", routers.ExploreUsers) - m.Get("/organizations", routers.ExploreOrganizations) - }, ignSignIn) - m.Combo("/install", routers.InstallInit).Get(routers.Install). - Post(bindIgnErr(auth.InstallForm{}), routers.InstallPost) - m.Get("/^:type(issues|pulls)$", reqSignIn, user.Issues) - - // ***** START: User ***** - m.Group("/user", func() { - m.Get("/login", user.SignIn) - m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost) - m.Get("/sign_up", user.SignUp) - m.Post("/sign_up", bindIgnErr(auth.RegisterForm{}), user.SignUpPost) - m.Get("/reset_password", user.ResetPasswd) - m.Post("/reset_password", user.ResetPasswdPost) - m.Group("/oauth2", func() { - m.Get("/:provider", user.SignInOAuth) - m.Get("/:provider/callback", user.SignInOAuthCallback) - }) - m.Get("/link_account", user.LinkAccount) - m.Post("/link_account_signin", bindIgnErr(auth.SignInForm{}), user.LinkAccountPostSignIn) - m.Post("/link_account_signup", bindIgnErr(auth.RegisterForm{}), user.LinkAccountPostRegister) - m.Group("/two_factor", func() { - m.Get("", user.TwoFactor) - m.Post("", bindIgnErr(auth.TwoFactorAuthForm{}), user.TwoFactorPost) - m.Get("/scratch", user.TwoFactorScratch) - m.Post("/scratch", bindIgnErr(auth.TwoFactorScratchAuthForm{}), user.TwoFactorScratchPost) - }) - }, reqSignOut) - - m.Group("/user/settings", func() { - m.Get("", user.Settings) - m.Post("", bindIgnErr(auth.UpdateProfileForm{}), user.SettingsPost) - m.Combo("/avatar").Get(user.SettingsAvatar). - Post(binding.MultipartForm(auth.AvatarForm{}), user.SettingsAvatarPost) - m.Post("/avatar/delete", user.SettingsDeleteAvatar) - m.Combo("/email").Get(user.SettingsEmails). - Post(bindIgnErr(auth.AddEmailForm{}), user.SettingsEmailPost) - m.Post("/email/delete", user.DeleteEmail) - m.Get("/password", user.SettingsPassword) - m.Post("/password", bindIgnErr(auth.ChangePasswordForm{}), user.SettingsPasswordPost) - m.Combo("/ssh").Get(user.SettingsSSHKeys). - Post(bindIgnErr(auth.AddSSHKeyForm{}), user.SettingsSSHKeysPost) - m.Post("/ssh/delete", user.DeleteSSHKey) - m.Combo("/applications").Get(user.SettingsApplications). - Post(bindIgnErr(auth.NewAccessTokenForm{}), user.SettingsApplicationsPost) - m.Post("/applications/delete", user.SettingsDeleteApplication) - m.Route("/delete", "GET,POST", user.SettingsDelete) - m.Combo("/account_link").Get(user.SettingsAccountLinks).Post(user.SettingsDeleteAccountLink) - m.Group("/two_factor", func() { - m.Get("", user.SettingsTwoFactor) - m.Post("/regenerate_scratch", user.SettingsTwoFactorRegenerateScratch) - m.Post("/disable", user.SettingsTwoFactorDisable) - m.Get("/enroll", user.SettingsTwoFactorEnroll) - m.Post("/enroll", bindIgnErr(auth.TwoFactorAuthForm{}), user.SettingsTwoFactorEnrollPost) - }) - }, reqSignIn, func(ctx *context.Context) { - ctx.Data["PageIsUserSettings"] = true - }) - - m.Group("/user", func() { - // r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds) - m.Any("/activate", user.Activate) - m.Any("/activate_email", user.ActivateEmail) - m.Get("/email2user", user.Email2User) - m.Get("/forget_password", user.ForgotPasswd) - m.Post("/forget_password", user.ForgotPasswdPost) - m.Get("/logout", user.SignOut) - }) - // ***** END: User ***** - - adminReq := context.Toggle(&context.ToggleOptions{SignInRequired: true, AdminRequired: true}) - - // ***** START: Admin ***** - m.Group("/admin", func() { - m.Get("", adminReq, admin.Dashboard) - m.Get("/config", admin.Config) - m.Post("/config/test_mail", admin.SendTestMail) - m.Get("/monitor", admin.Monitor) - - m.Group("/users", func() { - m.Get("", admin.Users) - m.Combo("/new").Get(admin.NewUser).Post(bindIgnErr(auth.AdminCreateUserForm{}), admin.NewUserPost) - m.Combo("/:userid").Get(admin.EditUser).Post(bindIgnErr(auth.AdminEditUserForm{}), admin.EditUserPost) - m.Post("/:userid/delete", admin.DeleteUser) - }) - - m.Group("/orgs", func() { - m.Get("", admin.Organizations) - }) - - m.Group("/repos", func() { - m.Get("", admin.Repos) - m.Post("/delete", admin.DeleteRepo) - }) - - m.Group("/auths", func() { - m.Get("", admin.Authentications) - m.Combo("/new").Get(admin.NewAuthSource).Post(bindIgnErr(auth.AuthenticationForm{}), admin.NewAuthSourcePost) - m.Combo("/:authid").Get(admin.EditAuthSource). - Post(bindIgnErr(auth.AuthenticationForm{}), admin.EditAuthSourcePost) - m.Post("/:authid/delete", admin.DeleteAuthSource) - }) - - m.Group("/notices", func() { - m.Get("", admin.Notices) - m.Post("/delete", admin.DeleteNotices) - m.Get("/empty", admin.EmptyNotices) - }) - }, adminReq) - // ***** END: Admin ***** - - m.Group("", func() { - m.Group("/:username", func() { - m.Get("", user.Profile) - m.Get("/followers", user.Followers) - m.Get("/following", user.Following) - }) - - m.Get("/attachments/:uuid", func(ctx *context.Context) { - attach, err := models.GetAttachmentByUUID(ctx.Params(":uuid")) - if err != nil { - if models.IsErrAttachmentNotExist(err) { - ctx.Error(404) - } else { - ctx.Handle(500, "GetAttachmentByUUID", err) - } - return - } - - fr, err := os.Open(attach.LocalPath()) - if err != nil { - ctx.Handle(500, "Open", err) - return - } - defer fr.Close() - - if err = repo.ServeData(ctx, attach.Name, fr); err != nil { - ctx.Handle(500, "ServeData", err) - return - } - }) - m.Post("/attachments", repo.UploadAttachment) - }, ignSignIn) - - m.Group("/:username", func() { - m.Get("/action/:action", user.Action) - }, reqSignIn) - - if macaron.Env == macaron.DEV { - m.Get("/template/*", dev.TemplatePreview) - } - - reqRepoAdmin := context.RequireRepoAdmin() - reqRepoWriter := context.RequireRepoWriter() - - // ***** START: Organization ***** - m.Group("/org", func() { - m.Group("", func() { - m.Get("/create", org.Create) - m.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.CreatePost) - }, func(ctx *context.Context) { - if !ctx.User.CanCreateOrganization() { - ctx.NotFound() - } - }) - - m.Group("/:org", func() { - m.Get("/dashboard", user.Dashboard) - m.Get("/^:type(issues|pulls)$", user.Issues) - m.Get("/members", org.Members) - m.Get("/members/action/:action", org.MembersAction) - - m.Get("/teams", org.Teams) - }, context.OrgAssignment(true)) - - m.Group("/:org", func() { - m.Get("/teams/:team", org.TeamMembers) - m.Get("/teams/:team/repositories", org.TeamRepositories) - m.Route("/teams/:team/action/:action", "GET,POST", org.TeamsAction) - m.Route("/teams/:team/action/repo/:action", "GET,POST", org.TeamsRepoAction) - }, context.OrgAssignment(true, false, true)) - - m.Group("/:org", func() { - m.Get("/teams/new", org.NewTeam) - m.Post("/teams/new", bindIgnErr(auth.CreateTeamForm{}), org.NewTeamPost) - m.Get("/teams/:team/edit", org.EditTeam) - m.Post("/teams/:team/edit", bindIgnErr(auth.CreateTeamForm{}), org.EditTeamPost) - m.Post("/teams/:team/delete", org.DeleteTeam) - - m.Group("/settings", func() { - m.Combo("").Get(org.Settings). - Post(bindIgnErr(auth.UpdateOrgSettingForm{}), org.SettingsPost) - m.Post("/avatar", binding.MultipartForm(auth.AvatarForm{}), org.SettingsAvatar) - m.Post("/avatar/delete", org.SettingsDeleteAvatar) - - m.Group("/hooks", func() { - m.Get("", org.Webhooks) - m.Post("/delete", org.DeleteWebhook) - m.Get("/:type/new", repo.WebhooksNew) - m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) - m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) - m.Get("/:id", repo.WebHooksEdit) - m.Post("/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) - m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) - }) - - m.Route("/delete", "GET,POST", org.SettingsDelete) - }) - - m.Route("/invitations/new", "GET,POST", org.Invitation) - }, context.OrgAssignment(true, true)) - }, reqSignIn) - // ***** END: Organization ***** - - // ***** START: Repository ***** - m.Group("/repo", func() { - m.Get("/create", repo.Create) - m.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost) - m.Get("/migrate", repo.Migrate) - m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost) - m.Combo("/fork/:repoid").Get(repo.Fork). - Post(bindIgnErr(auth.CreateRepoForm{}), repo.ForkPost) - }, reqSignIn) - - m.Group("/:username/:reponame", func() { - m.Group("/settings", func() { - m.Combo("").Get(repo.Settings). - Post(bindIgnErr(auth.RepoSettingForm{}), repo.SettingsPost) - m.Group("/collaboration", func() { - m.Combo("").Get(repo.Collaboration).Post(repo.CollaborationPost) - m.Post("/access_mode", repo.ChangeCollaborationAccessMode) - m.Post("/delete", repo.DeleteCollaboration) - }) - m.Group("/branches", func() { - m.Combo("").Get(repo.ProtectedBranch).Post(repo.ProtectedBranchPost) - m.Post("/can_push", repo.ChangeProtectedBranch) - m.Post("/delete", repo.DeleteProtectedBranch) - }) - - m.Group("/hooks", func() { - m.Get("", repo.Webhooks) - m.Post("/delete", repo.DeleteWebhook) - m.Get("/:type/new", repo.WebhooksNew) - m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) - m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) - m.Get("/:id", repo.WebHooksEdit) - m.Post("/:id/test", repo.TestWebhook) - m.Post("/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) - m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) - - m.Group("/git", func() { - m.Get("", repo.GitHooks) - m.Combo("/:name").Get(repo.GitHooksEdit). - Post(repo.GitHooksEditPost) - }, context.GitHookService()) - }) - - m.Group("/keys", func() { - m.Combo("").Get(repo.DeployKeys). - Post(bindIgnErr(auth.AddSSHKeyForm{}), repo.DeployKeysPost) - m.Post("/delete", repo.DeleteDeployKey) - }) - - }, func(ctx *context.Context) { - ctx.Data["PageIsSettings"] = true - }, context.UnitTypes()) - }, reqSignIn, context.RepoAssignment(), reqRepoAdmin, context.RepoRef()) - - m.Get("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), repo.Action) - m.Group("/:username/:reponame", func() { - // FIXME: should use different URLs but mostly same logic for comments of issue and pull reuqest. - // So they can apply their own enable/disable logic on routers. - m.Group("/issues", func() { - m.Combo("/new", repo.MustEnableIssues).Get(context.RepoRef(), repo.NewIssue). - Post(bindIgnErr(auth.CreateIssueForm{}), repo.NewIssuePost) - - m.Group("/:index", func() { - m.Post("/label", repo.UpdateIssueLabel) - m.Post("/milestone", repo.UpdateIssueMilestone) - m.Post("/assignee", repo.UpdateIssueAssignee) - }, reqRepoWriter) - - m.Group("/:index", func() { - m.Post("/title", repo.UpdateIssueTitle) - m.Post("/content", repo.UpdateIssueContent) - m.Combo("/comments").Post(bindIgnErr(auth.CreateCommentForm{}), repo.NewComment) - }) - }) - m.Group("/comments/:id", func() { - m.Post("", repo.UpdateCommentContent) - m.Post("/delete", repo.DeleteComment) - }) - m.Group("/labels", func() { - m.Post("/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel) - m.Post("/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel) - m.Post("/delete", repo.DeleteLabel) - m.Post("/initialize", bindIgnErr(auth.InitializeLabelsForm{}), repo.InitializeLabels) - }, reqRepoWriter, context.RepoRef()) - m.Group("/milestones", func() { - m.Combo("/new").Get(repo.NewMilestone). - Post(bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost) - m.Get("/:id/edit", repo.EditMilestone) - m.Post("/:id/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.EditMilestonePost) - m.Get("/:id/:action", repo.ChangeMilestonStatus) - m.Post("/delete", repo.DeleteMilestone) - }, reqRepoWriter, context.RepoRef()) - m.Group("/releases", func() { - m.Get("/new", repo.NewRelease) - m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost) - m.Post("/delete", repo.DeleteRelease) - }, reqRepoWriter, context.RepoRef()) - m.Group("/releases", func() { - m.Get("/edit/*", repo.EditRelease) - m.Post("/edit/*", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost) - }, reqRepoWriter, func(ctx *context.Context) { - var err error - ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch) - if err != nil { - ctx.Handle(500, "GetBranchCommit", err) - return - } - ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount() - if err != nil { - ctx.Handle(500, "CommitsCount", err) - return - } - ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount - }) - - m.Combo("/compare/*", repo.MustAllowPulls, repo.SetEditorconfigIfExists). - Get(repo.CompareAndPullRequest). - Post(bindIgnErr(auth.CreateIssueForm{}), repo.CompareAndPullRequestPost) - - m.Group("", func() { - m.Combo("/_edit/*").Get(repo.EditFile). - Post(bindIgnErr(auth.EditRepoFileForm{}), repo.EditFilePost) - m.Combo("/_new/*").Get(repo.NewFile). - Post(bindIgnErr(auth.EditRepoFileForm{}), repo.NewFilePost) - m.Post("/_preview/*", bindIgnErr(auth.EditPreviewDiffForm{}), repo.DiffPreviewPost) - m.Combo("/_delete/*").Get(repo.DeleteFile). - Post(bindIgnErr(auth.DeleteRepoFileForm{}), repo.DeleteFilePost) - - m.Group("", func() { - m.Combo("/_upload/*").Get(repo.UploadFile). - Post(bindIgnErr(auth.UploadRepoFileForm{}), repo.UploadFilePost) - m.Post("/upload-file", repo.UploadFileToServer) - m.Post("/upload-remove", bindIgnErr(auth.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer) - }, func(ctx *context.Context) { - if !setting.Repository.Upload.Enabled { - ctx.Handle(404, "", nil) - return - } - }) - }, reqRepoWriter, context.RepoRef(), func(ctx *context.Context) { - if !ctx.Repo.Repository.CanEnableEditor() || ctx.Repo.IsViewCommit { - ctx.Handle(404, "", nil) - return - } - }) - }, reqSignIn, context.RepoAssignment(), repo.MustBeNotBare, context.UnitTypes()) - - m.Group("/:username/:reponame", func() { - m.Group("", func() { - m.Get("/releases", repo.Releases) - m.Get("/^:type(issues|pulls)$", repo.RetrieveLabels, repo.Issues) - m.Get("/^:type(issues|pulls)$/:index", repo.ViewIssue) - m.Get("/labels/", repo.RetrieveLabels, repo.Labels) - m.Get("/milestones", repo.Milestones) - }, context.RepoRef()) - - // m.Get("/branches", repo.Branches) - m.Post("/branches/:name/delete", reqSignIn, reqRepoWriter, repo.DeleteBranchPost) - - m.Group("/wiki", func() { - m.Get("/?:page", repo.Wiki) - m.Get("/_pages", repo.WikiPages) - - m.Group("", func() { - m.Combo("/_new").Get(repo.NewWiki). - Post(bindIgnErr(auth.NewWikiForm{}), repo.NewWikiPost) - m.Combo("/:page/_edit").Get(repo.EditWiki). - Post(bindIgnErr(auth.NewWikiForm{}), repo.EditWikiPost) - m.Post("/:page/delete", repo.DeleteWikiPagePost) - }, reqSignIn, reqRepoWriter) - }, repo.MustEnableWiki, context.RepoRef()) - - m.Group("/wiki", func() { - m.Get("/raw/*", repo.WikiRaw) - m.Get("/*", repo.WikiRaw) - }, repo.MustEnableWiki) - - m.Get("/archive/*", repo.Download) - - m.Group("/pulls/:index", func() { - m.Get("/commits", context.RepoRef(), repo.ViewPullCommits) - m.Get("/files", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.ViewPullFiles) - m.Post("/merge", reqRepoWriter, repo.MergePullRequest) - }, repo.MustAllowPulls) - - m.Group("", func() { - m.Get("/src/*", repo.SetEditorconfigIfExists, repo.Home) - m.Get("/raw/*", repo.SingleDownload) - m.Get("/commits/*", repo.RefCommits) - m.Get("/graph", repo.Graph) - m.Get("/commit/:sha([a-f0-9]{7,40})$", repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.Diff) - m.Get("/forks", repo.Forks) - }, context.RepoRef()) - m.Get("/commit/:sha([a-f0-9]{7,40})\\.:ext(patch|diff)", repo.RawDiff) - - m.Get("/compare/:before([a-z0-9]{40})\\.\\.\\.:after([a-z0-9]{40})", repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.CompareDiff) - }, ignSignIn, context.RepoAssignment(), repo.MustBeNotBare, context.UnitTypes()) - m.Group("/:username/:reponame", func() { - m.Get("/stars", repo.Stars) - m.Get("/watchers", repo.Watchers) - }, ignSignIn, context.RepoAssignment(), context.RepoRef(), context.UnitTypes()) - - m.Group("/:username", func() { - m.Group("/:reponame", func() { - m.Get("", repo.SetEditorconfigIfExists, repo.Home) - m.Get("\\.git$", repo.SetEditorconfigIfExists, repo.Home) - }, ignSignIn, context.RepoAssignment(true), context.RepoRef(), context.UnitTypes()) - - m.Group("/:reponame", func() { - m.Group("/info/lfs", func() { - m.Post("/objects/batch", lfs.BatchHandler) - m.Get("/objects/:oid/:filename", lfs.ObjectOidHandler) - m.Any("/objects/:oid", lfs.ObjectOidHandler) - m.Post("/objects", lfs.PostHandler) - }, ignSignInAndCsrf) - m.Any("/*", ignSignInAndCsrf, repo.HTTP) - m.Head("/tasks/trigger", repo.TriggerTask) - }) - }) - // ***** END: Repository ***** - - m.Group("/notifications", func() { - m.Get("", user.Notifications) - m.Post("/status", user.NotificationStatusPost) - }, reqSignIn) - - m.Group("/api", func() { - apiv1.RegisterRoutes(m) - }, ignSignIn) - - // robots.txt - m.Get("/robots.txt", func(ctx *context.Context) { - if setting.HasRobotsTxt { - ctx.ServeFileContent(path.Join(setting.CustomPath, "robots.txt")) - } else { - ctx.Error(404) - } - }) - - // Not found handler. - m.NotFound(routers.NotFound) + m := routes.NewMacaron() + routes.RegisterRoutes(m) // Flag for port number in case first time run conflict. if ctx.IsSet("port") { @@ -677,7 +93,12 @@ func runWeb(ctx *cli.Context) error { case setting.HTTPS: err = runHTTPS(listenAddr, setting.CertFile, setting.KeyFile, context2.ClearHandler(m)) case setting.FCGI: - err = fcgi.Serve(nil, context2.ClearHandler(m)) + listener, err := net.Listen("tcp", listenAddr) + if err != nil { + log.Fatal(4, "Failed to bind %s", listenAddr, err) + } + defer listener.Close() + err = fcgi.Serve(listener, context2.ClearHandler(m)) case setting.UnixSocket: if err := os.Remove(listenAddr); err != nil && !os.IsNotExist(err) { log.Fatal(4, "Failed to remove unix socket directory %s: %v", listenAddr, err) diff --git a/cmd/web_graceful.go b/cmd/web_graceful.go index b0b3093..e54561f 100644 --- a/cmd/web_graceful.go +++ b/cmd/web_graceful.go @@ -11,6 +11,7 @@ import ( "net/http" "code.gitea.io/gitea/modules/log" + "github.com/facebookgo/grace/gracehttp" ) diff --git a/conf/app.ini b/conf/app.ini index 1390d45..e704067 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -32,6 +32,10 @@ LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd, ; Separate values by commas. Preview tab in edit mode won't show if the file extension doesn't match PREVIEWABLE_FILE_MODES = markdown +[repository.local] +; Path for uploads. Defaults to `tmp/local-repo` +LOCAL_COPY_PATH = tmp/local-repo + [repository.upload] ; Whether repository file uploads are enabled. Defaults to `true` ENABLED = true @@ -74,6 +78,11 @@ ORG_PAGING_NUM = 50 ; Number of repos that are showed in one page REPO_PAGING_NUM = 15 +[ui.meta] +AUTHOR = Gitea - Git with a cup of tea +DESCRIPTION = Gitea (Git with a cup of tea) is a painless self-hosted Git service written in Go +KEYWORDS = go,git,self-hosted,gitea + [markdown] ; Enable hard line break extension ENABLE_HARD_LINE_BREAK = false @@ -85,9 +94,11 @@ CUSTOM_URL_SCHEMES = FILE_EXTENSIONS = .md,.markdown,.mdown,.mkd [server] +; Listen protocol. One of 'http', 'https', 'unix' or 'fcgi'. PROTOCOL = http DOMAIN = localhost ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ +; Listen address. Either a IPv4/IPv6 address or the path to a unix socket. HTTP_ADDR = 0.0.0.0 HTTP_PORT = 3000 ; Permission for unix socket @@ -110,11 +121,15 @@ SSH_PORT = 22 SSH_LISTEN_PORT = %(SSH_PORT)s ; Root path of SSH directory, default is '~/.ssh', but you have to use '/home/git/.ssh'. SSH_ROOT_PATH = -; Directory to create temporary files when test publick key using ssh-keygen, +; Directory to create temporary files when test public key using ssh-keygen, ; default is system temporary directory. SSH_KEY_TEST_PATH = ; Path to ssh-keygen, default is 'ssh-keygen' and let shell find out which one to call. SSH_KEYGEN_PATH = ssh-keygen +; Enable SSH Authorized Key Backup when rewriting all keys, default is true +SSH_BACKUP_AUTHORIZED_KEYS = true +; Enable exposure of SSH clone URL to anonymous visitors, default is false +SSH_EXPOSE_ANONYMOUS = false ; Indicate whether to check minimum key size with corresponding type MINIMUM_KEY_SIZE_CHECK = false ; Disable CDN even in "prod" mode @@ -138,6 +153,12 @@ APP_DATA_PATH = data ENABLE_GZIP = false ; Landing page for non-logged users, can be "home" or "explore" LANDING_PAGE = home +; Enables git-lfs support. true or false, default is false. +LFS_START_SERVER = false +; Where your lfs files put on, default is data/lfs. +LFS_CONTENT_PATH = data/lfs +; LFS authentication secret, changed this to yourself. +LFS_JWT_SECRET = ; Define allowed algorithms and their minimum key length (use -1 to disable a type) [ssh.minimum_key_sizes] @@ -147,7 +168,7 @@ RSA = 2048 DSA = 1024 [database] -; Either "mysql", "postgres" or "sqlite3", it's your choice +; Either "mysql", "postgres", "mssql" or "sqlite3", it's your choice DB_TYPE = mysql HOST = 127.0.0.1:3306 NAME = gitea @@ -157,6 +178,8 @@ PASSWD = SSL_MODE = disable ; For "sqlite3" and "tidb", use absolute path when you start as service PATH = data/gitea.db +; For "sqlite3" only. Query timeout +SQLITE_TIMEOUT = 500 [indexer] ISSUE_INDEXER_PATH = indexers/issues.bleve @@ -182,8 +205,44 @@ MIN_PASSWORD_LENGTH = 6 ; True when users are allowed to import local server paths IMPORT_LOCAL_PATHS = false +[openid] +; +; OpenID is an open standard and decentralized authentication protocol. +; Your identity is the address of a webpage you provide, which describes +; how to prove you are in control of that page. +; +; For more info: https://en.wikipedia.org/wiki/OpenID +; +; Current implementation supports OpenID-2.0 +; +; Tested to work providers at the time of writing: +; - Any GNUSocial node (your.hostname.tld/username) +; - Any SimpleID provider (http://simpleid.koinic.net) +; - http://openid.org.cn/ +; - openid.stackexchange.com +; - login.launchpad.net +; - .livejournal.com +; +; Whether to allow signin in via OpenID +ENABLE_OPENID_SIGNIN = true +; Whether to allow registering via OpenID +; Do not include to rely on DISABLE_REGISTRATION setting +;ENABLE_OPENID_SIGNUP = true +; Allowed URI patterns (POSIX regexp). +; Space separated. +; Only these would be allowed if non-blank. +; Example value: trusted.domain.org trusted.domain.net +WHITELISTED_URIS = +; Forbidden URI patterns (POSIX regexp). +; Space sepaated. +; Only used if WHITELISTED_URIS is blank. +; Example value: loadaverage.org/badguy stackexchange.com/.*spammer +BLACKLISTED_URIS = + [service] +; Time limit to confirm account/email registration ACTIVE_CODE_LIVE_MINUTES = 180 +; Time limit to confirm forgot password reset process RESET_PASSWD_CODE_LIVE_MINUTES = 180 ; User need to confirm e-mail for registration REGISTER_EMAIL_CONFIRM = false @@ -201,6 +260,9 @@ ENABLE_CAPTCHA = true ; Default value for KeepEmailPrivate ; New user will get the value of this setting copied into their profile DEFAULT_KEEP_EMAIL_PRIVATE = false +; Default value for AllowCreateOrganization +; New user will have rights set to create organizations depending on this setting +DEFAULT_ALLOW_CREATE_ORGANIZATION = true ; Default value for the domain part of the user's email address in the git log ; if he has set KeepEmailPrivate true. The user's email replaced with a ; concatenation of the user name in lower case, "@" and NO_REPLY_ADDRESS. @@ -242,8 +304,8 @@ FROM = ; Mailer user name and password USER = PASSWD = -; Use text/html as alternative format of content -ENABLE_HTML_ALTERNATIVE = false +; Send mails as plain text +SEND_AS_PLAIN_TEXT = false ; Enable sendmail (override SMTP) USE_SENDMAIL = false ; Specifiy an alternative sendmail binary @@ -274,9 +336,9 @@ COOKIE_NAME = i_like_gitea COOKIE_SECURE = false ; Enable set cookie, default is true ENABLE_SET_COOKIE = true -; Session GC time interval, default is 86400 +; Session GC time interval in seconds, default is 86400 (1 day) GC_INTERVAL_TIME = 86400 -; Session life time, default is 86400 +; Session life time in seconds, default is 86400 (1 day) SESSION_LIFE_TIME = 86400 [picture] @@ -400,13 +462,23 @@ SCHEDULE = @every 24h ; Archives created more than OLDER_THAN ago are subject to deletion OLDER_THAN = 24h +; Synchronize external user data (only LDAP user synchronization is supported) +[cron.sync_external_users] +; Syncronize external user data when starting server (default false) +RUN_AT_START = false +; Interval as a duration between each synchronization (default every 24h) +SCHEDULE = @every 24h +; Create new users, update existing user data and disable users that are not in external source anymore (default) +; or only create new users if UPDATE_EXISTING is set to false +UPDATE_EXISTING = true + [git] ; Disables highlight of added and removed changes DISABLE_DIFF_HIGHLIGHT = false ; Max number of lines allowed of a single file in diff view MAX_GIT_DIFF_LINES = 1000 ; Max number of characters of a line allowed in diff view -MAX_GIT_DIFF_LINE_CHARACTERS = 500 +MAX_GIT_DIFF_LINE_CHARACTERS = 5000 ; Max number of files shown in diff view MAX_GIT_DIFF_FILES = 100 ; Arguments for command 'git gc', e.g. "--aggressive --auto" @@ -422,8 +494,10 @@ PULL = 300 GC = 60 [mirror] -; Default interval in hours between each check -DEFAULT_INTERVAL = 8 +; Default interval as a duration between each check +DEFAULT_INTERVAL = 8h +; Min interval as a duration must be > 1m +MIN_INTERVAL = 10m [api] ; Max number of items will response in a page diff --git a/scripts/README b/contrib/README similarity index 100% rename from scripts/README rename to contrib/README diff --git a/scripts/autoboot.sh b/contrib/autoboot.sh similarity index 100% rename from scripts/autoboot.sh rename to contrib/autoboot.sh diff --git a/scripts/init/centos/gitea b/contrib/init/centos/gitea similarity index 100% rename from scripts/init/centos/gitea rename to contrib/init/centos/gitea diff --git a/scripts/init/debian/gitea b/contrib/init/debian/gitea similarity index 98% rename from scripts/init/debian/gitea rename to contrib/init/debian/gitea index 0cde38a..1a371ba 100644 --- a/scripts/init/debian/gitea +++ b/contrib/init/debian/gitea @@ -15,7 +15,7 @@ # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin -DESC="Go Git Service" +DESC="Git with a cup of tea" NAME=gitea SERVICEVERBOSE=yes PIDFILE=/var/run/$NAME.pid diff --git a/scripts/init/freebsd/gitea b/contrib/init/freebsd/gitea similarity index 100% rename from scripts/init/freebsd/gitea rename to contrib/init/freebsd/gitea diff --git a/scripts/init/gentoo/gitea b/contrib/init/gentoo/gitea similarity index 100% rename from scripts/init/gentoo/gitea rename to contrib/init/gentoo/gitea diff --git a/scripts/init/openbsd/gitea b/contrib/init/openbsd/gitea similarity index 100% rename from scripts/init/openbsd/gitea rename to contrib/init/openbsd/gitea diff --git a/scripts/init/suse/gitea b/contrib/init/suse/gitea similarity index 100% rename from scripts/init/suse/gitea rename to contrib/init/suse/gitea diff --git a/scripts/launchd/io.gitea.web.plist b/contrib/launchd/io.gitea.web.plist similarity index 100% rename from scripts/launchd/io.gitea.web.plist rename to contrib/launchd/io.gitea.web.plist diff --git a/scripts/migrate/gogs_migrate.sh b/contrib/migrate/gogs_migrate.sh similarity index 100% rename from scripts/migrate/gogs_migrate.sh rename to contrib/migrate/gogs_migrate.sh diff --git a/scripts/mysql.sql b/contrib/mysql.sql similarity index 100% rename from scripts/mysql.sql rename to contrib/mysql.sql diff --git a/scripts/supervisor/gitea b/contrib/supervisor/gitea similarity index 100% rename from scripts/supervisor/gitea rename to contrib/supervisor/gitea diff --git a/scripts/systemd/gitea.service b/contrib/systemd/gitea.service similarity index 100% rename from scripts/systemd/gitea.service rename to contrib/systemd/gitea.service diff --git a/scripts/windows/install-as-service.bat b/contrib/windows/install-as-service.bat similarity index 100% rename from scripts/windows/install-as-service.bat rename to contrib/windows/install-as-service.bat diff --git a/docker/etc/templates/app.ini b/docker/etc/templates/app.ini index 0c4b9d6..0987941 100644 --- a/docker/etc/templates/app.ini +++ b/docker/etc/templates/app.ini @@ -8,7 +8,7 @@ TEMP_PATH = /data/gitea/uploads APP_DATA_PATH = /data/gitea [database] -HOST = mysql:3306 +DB_TYPE = sqlite3 PATH = /data/gitea/gitea.db [session] diff --git a/integrations/api_branch_test.go b/integrations/api_branch_test.go new file mode 100644 index 0000000..8701229 --- /dev/null +++ b/integrations/api_branch_test.go @@ -0,0 +1,44 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func testAPIGetBranch(t *testing.T, branchName string, exists bool) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + req := NewRequestf(t, "GET", "/api/v1/repos/user2/repo1/branches/%s", branchName) + resp := session.MakeRequest(t, req, NoExpectedStatus) + if !exists { + assert.EqualValues(t, http.StatusNotFound, resp.HeaderCode) + return + } + assert.EqualValues(t, http.StatusOK, resp.HeaderCode) + var branch api.Branch + DecodeJSON(t, resp, &branch) + assert.EqualValues(t, branchName, branch.Name) +} + +func TestAPIGetBranch(t *testing.T) { + for _, test := range []struct { + BranchName string + Exists bool + }{ + {"master", true}, + {"master/doesnotexist", false}, + {"feature/1", true}, + {"feature/1/doesnotexist", false}, + } { + testAPIGetBranch(t, test.BranchName, test.Exists) + } +} diff --git a/integrations/api_comment_test.go b/integrations/api_comment_test.go new file mode 100644 index 0000000..645afba --- /dev/null +++ b/integrations/api_comment_test.go @@ -0,0 +1,125 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "fmt" + "net/http" + "testing" + + "code.gitea.io/gitea/models" + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func TestAPIListRepoComments(t *testing.T) { + prepareTestEnv(t) + + comment := models.AssertExistsAndLoadBean(t, &models.Comment{}, + models.Cond("type = ?", models.CommentTypeComment)).(*models.Comment) + issue := models.AssertExistsAndLoadBean(t, &models.Issue{ID: comment.IssueID}).(*models.Issue) + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: issue.RepoID}).(*models.Repository) + repoOwner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + session := loginUser(t, repoOwner.Name) + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/comments", + repoOwner.Name, repo.Name) + resp := session.MakeRequest(t, req, http.StatusOK) + + var apiComments []*api.Comment + DecodeJSON(t, resp, &apiComments) + for _, apiComment := range apiComments { + c := &models.Comment{ID: apiComment.ID} + models.AssertExistsAndLoadBean(t, c, + models.Cond("type = ?", models.CommentTypeComment)) + models.AssertExistsAndLoadBean(t, &models.Issue{ID: c.IssueID, RepoID: repo.ID}) + } +} + +func TestAPIListIssueComments(t *testing.T) { + prepareTestEnv(t) + + comment := models.AssertExistsAndLoadBean(t, &models.Comment{}, + models.Cond("type = ?", models.CommentTypeComment)).(*models.Comment) + issue := models.AssertExistsAndLoadBean(t, &models.Issue{ID: comment.IssueID}).(*models.Issue) + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: issue.RepoID}).(*models.Repository) + repoOwner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + session := loginUser(t, repoOwner.Name) + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues/%d/comments", + repoOwner.Name, repo.Name, issue.Index) + resp := session.MakeRequest(t, req, http.StatusOK) + + var comments []*api.Comment + DecodeJSON(t, resp, &comments) + expectedCount := models.GetCount(t, &models.Comment{IssueID: issue.ID}, + models.Cond("type = ?", models.CommentTypeComment)) + assert.EqualValues(t, expectedCount, len(comments)) +} + +func TestAPICreateComment(t *testing.T) { + prepareTestEnv(t) + const commentBody = "Comment body" + + issue := models.AssertExistsAndLoadBean(t, &models.Issue{}).(*models.Issue) + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: issue.RepoID}).(*models.Repository) + repoOwner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + session := loginUser(t, repoOwner.Name) + urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/comments", + repoOwner.Name, repo.Name, issue.Index) + req := NewRequestWithValues(t, "POST", urlStr, map[string]string{ + "body": commentBody, + }) + resp := session.MakeRequest(t, req, http.StatusCreated) + + var updatedComment api.Comment + DecodeJSON(t, resp, &updatedComment) + assert.EqualValues(t, commentBody, updatedComment.Body) + models.AssertExistsAndLoadBean(t, &models.Comment{ID: updatedComment.ID, IssueID: issue.ID, Content: commentBody}) +} + +func TestAPIEditComment(t *testing.T) { + prepareTestEnv(t) + const newCommentBody = "This is the new comment body" + + comment := models.AssertExistsAndLoadBean(t, &models.Comment{}, + models.Cond("type = ?", models.CommentTypeComment)).(*models.Comment) + issue := models.AssertExistsAndLoadBean(t, &models.Issue{ID: comment.IssueID}).(*models.Issue) + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: issue.RepoID}).(*models.Repository) + repoOwner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + session := loginUser(t, repoOwner.Name) + urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/comments/%d", + repoOwner.Name, repo.Name, issue.Index, comment.ID) + req := NewRequestWithValues(t, "PATCH", urlStr, map[string]string{ + "body": newCommentBody, + }) + resp := session.MakeRequest(t, req, http.StatusOK) + + var updatedComment api.Comment + DecodeJSON(t, resp, &updatedComment) + assert.EqualValues(t, comment.ID, updatedComment.ID) + assert.EqualValues(t, newCommentBody, updatedComment.Body) + models.AssertExistsAndLoadBean(t, &models.Comment{ID: comment.ID, IssueID: issue.ID, Content: newCommentBody}) +} + +func TestAPIDeleteComment(t *testing.T) { + prepareTestEnv(t) + + comment := models.AssertExistsAndLoadBean(t, &models.Comment{}, + models.Cond("type = ?", models.CommentTypeComment)).(*models.Comment) + issue := models.AssertExistsAndLoadBean(t, &models.Issue{ID: comment.IssueID}).(*models.Issue) + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: issue.RepoID}).(*models.Repository) + repoOwner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + session := loginUser(t, repoOwner.Name) + req := NewRequestf(t, "DELETE", "/api/v1/repos/%s/%s/issues/%d/comments/%d", + repoOwner.Name, repo.Name, issue.Index, comment.ID) + session.MakeRequest(t, req, http.StatusNoContent) + + models.AssertNotExistsBean(t, &models.Comment{ID: comment.ID}) +} diff --git a/integrations/api_fork_test.go b/integrations/api_fork_test.go new file mode 100644 index 0000000..2c5eb55 --- /dev/null +++ b/integrations/api_fork_test.go @@ -0,0 +1,18 @@ +// Copyright 2017 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + api "code.gitea.io/sdk/gitea" +) + +func TestCreateForkNoLogin(t *testing.T) { + prepareTestEnv(t) + req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{}) + MakeRequest(t, req, http.StatusUnauthorized) +} diff --git a/integrations/api_issue_label_test.go b/integrations/api_issue_label_test.go new file mode 100644 index 0000000..195ec24 --- /dev/null +++ b/integrations/api_issue_label_test.go @@ -0,0 +1,62 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "fmt" + "net/http" + "testing" + + "code.gitea.io/gitea/models" + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func TestAPIAddIssueLabels(t *testing.T) { + assert.NoError(t, models.LoadFixtures()) + + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) + issue := models.AssertExistsAndLoadBean(t, &models.Issue{RepoID: repo.ID}).(*models.Issue) + label := models.AssertExistsAndLoadBean(t, &models.Label{RepoID: repo.ID}).(*models.Label) + owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels", + owner.Name, repo.Name, issue.Index) + req := NewRequestWithJSON(t, "POST", urlStr, &api.IssueLabelsOption{ + Labels: []int64{label.ID}, + }) + session := loginUser(t, owner.Name) + resp := session.MakeRequest(t, req, http.StatusOK) + var apiLabels []*api.Label + DecodeJSON(t, resp, &apiLabels) + assert.Len(t, apiLabels, models.GetCount(t, &models.IssueLabel{IssueID: issue.ID})) + + models.AssertExistsAndLoadBean(t, &models.IssueLabel{IssueID: issue.ID, LabelID: label.ID}) +} + +func TestAPIReplaceIssueLabels(t *testing.T) { + assert.NoError(t, models.LoadFixtures()) + + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) + issue := models.AssertExistsAndLoadBean(t, &models.Issue{RepoID: repo.ID}).(*models.Issue) + label := models.AssertExistsAndLoadBean(t, &models.Label{RepoID: repo.ID}).(*models.Label) + owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues/%d/labels", + owner.Name, repo.Name, issue.Index) + req := NewRequestWithJSON(t, "PUT", urlStr, &api.IssueLabelsOption{ + Labels: []int64{label.ID}, + }) + session := loginUser(t, owner.Name) + resp := session.MakeRequest(t, req, http.StatusOK) + var apiLabels []*api.Label + DecodeJSON(t, resp, &apiLabels) + assert.Len(t, apiLabels, 1) + assert.EqualValues(t, label.ID, apiLabels[0].ID) + + models.AssertCount(t, &models.IssueLabel{IssueID: issue.ID}, 1) + models.AssertExistsAndLoadBean(t, &models.IssueLabel{IssueID: issue.ID, LabelID: label.ID}) +} diff --git a/integrations/api_issue_test.go b/integrations/api_issue_test.go new file mode 100644 index 0000000..74436ff --- /dev/null +++ b/integrations/api_issue_test.go @@ -0,0 +1,63 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/models" + api "code.gitea.io/sdk/gitea" + + "fmt" + "github.com/stretchr/testify/assert" +) + +func TestAPIListIssues(t *testing.T) { + prepareTestEnv(t) + + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) + owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + session := loginUser(t, owner.Name) + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/issues?state=all", + owner.Name, repo.Name) + resp := session.MakeRequest(t, req, http.StatusOK) + var apiIssues []*api.Issue + DecodeJSON(t, resp, &apiIssues) + assert.Len(t, apiIssues, models.GetCount(t, &models.Issue{RepoID: repo.ID})) + for _, apiIssue := range apiIssues { + models.AssertExistsAndLoadBean(t, &models.Issue{ID: apiIssue.ID, RepoID: repo.ID}) + } +} + +func TestAPICreateIssue(t *testing.T) { + prepareTestEnv(t) + const body, title = "apiTestBody", "apiTestTitle" + + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) + owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + session := loginUser(t, owner.Name) + + urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/issues?state=all", owner.Name, repo.Name) + req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateIssueOption{ + Body: body, + Title: title, + Assignee: owner.Name, + }) + resp := session.MakeRequest(t, req, http.StatusCreated) + var apiIssue api.Issue + DecodeJSON(t, resp, &apiIssue) + assert.Equal(t, apiIssue.Body, body) + assert.Equal(t, apiIssue.Title, title) + + models.AssertExistsAndLoadBean(t, &models.Issue{ + RepoID: repo.ID, + AssigneeID: owner.ID, + Content: body, + Title: title, + }) +} diff --git a/integrations/api_keys_test.go b/integrations/api_keys_test.go new file mode 100644 index 0000000..8e2b6d3 --- /dev/null +++ b/integrations/api_keys_test.go @@ -0,0 +1,39 @@ +// Copyright 2017 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + api "code.gitea.io/sdk/gitea" +) + +func TestViewDeployKeysNoLogin(t *testing.T) { + prepareTestEnv(t) + req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/keys") + MakeRequest(t, req, http.StatusUnauthorized) +} + +func TestCreateDeployKeyNoLogin(t *testing.T) { + prepareTestEnv(t) + req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/keys", api.CreateKeyOption{ + Title: "title", + Key: "key", + }) + MakeRequest(t, req, http.StatusUnauthorized) +} + +func TestGetDeployKeyNoLogin(t *testing.T) { + prepareTestEnv(t) + req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/keys/1") + MakeRequest(t, req, http.StatusUnauthorized) +} + +func TestDeleteDeployKeyNoLogin(t *testing.T) { + prepareTestEnv(t) + req := NewRequest(t, "DELETE", "/api/v1/repos/user2/repo1/keys/1") + MakeRequest(t, req, http.StatusUnauthorized) +} diff --git a/integrations/api_pull_test.go b/integrations/api_pull_test.go new file mode 100644 index 0000000..b9bab92 --- /dev/null +++ b/integrations/api_pull_test.go @@ -0,0 +1,30 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/models" + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func TestAPIViewPulls(t *testing.T) { + prepareTestEnv(t) + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) + owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + session := loginUser(t, "user2") + req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/pulls?state=all", owner.Name, repo.Name) + resp := session.MakeRequest(t, req, http.StatusOK) + + var pulls []*api.PullRequest + DecodeJSON(t, resp, &pulls) + expectedLen := models.GetCount(t, &models.Issue{RepoID: repo.ID}, models.Cond("is_pull = ?", true)) + assert.Len(t, pulls, expectedLen) +} diff --git a/integrations/api_repo_test.go b/integrations/api_repo_test.go new file mode 100644 index 0000000..d5b1676 --- /dev/null +++ b/integrations/api_repo_test.go @@ -0,0 +1,94 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "strings" + "testing" + + "code.gitea.io/gitea/models" + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func TestAPIUserReposNotLogin(t *testing.T) { + prepareTestEnv(t) + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) + + req := NewRequestf(t, "GET", "/api/v1/users/%s/repos", user.Name) + resp := MakeRequest(t, req, http.StatusOK) + + var apiRepos []api.Repository + DecodeJSON(t, resp, &apiRepos) + expectedLen := models.GetCount(t, models.Repository{OwnerID: user.ID}, + models.Cond("is_private = ?", false)) + assert.Len(t, apiRepos, expectedLen) + for _, repo := range apiRepos { + assert.EqualValues(t, user.ID, repo.Owner.ID) + assert.False(t, repo.Private) + } +} + +type searchResponseBody struct { + ok bool + data []api.Repository +} + +func TestAPISearchRepoNotLogin(t *testing.T) { + prepareTestEnv(t) + const keyword = "test" + + req := NewRequestf(t, "GET", "/api/v1/repos/search?q=%s", keyword) + resp := MakeRequest(t, req, http.StatusOK) + + var body searchResponseBody + DecodeJSON(t, resp, &body) + for _, repo := range body.data { + assert.True(t, strings.Contains(repo.Name, keyword)) + } +} + +func TestAPIViewRepo(t *testing.T) { + prepareTestEnv(t) + + req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1") + resp := MakeRequest(t, req, http.StatusOK) + + var repo api.Repository + DecodeJSON(t, resp, &repo) + assert.EqualValues(t, 1, repo.ID) + assert.EqualValues(t, "repo1", repo.Name) +} + +func TestAPIOrgRepos(t *testing.T) { + prepareTestEnv(t) + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) + // User3 is an Org. Check their repos. + sourceOrg := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User) + // Login as User2. + session := loginUser(t, user.Name) + + req := NewRequestf(t, "GET", "/api/v1/orgs/%s/repos", sourceOrg.Name) + resp := session.MakeRequest(t, req, http.StatusOK) + + var apiRepos []*api.Repository + DecodeJSON(t, resp, &apiRepos) + expectedLen := models.GetCount(t, models.Repository{OwnerID: sourceOrg.ID}, + models.Cond("is_private = ?", false)) + assert.Len(t, apiRepos, expectedLen) + for _, repo := range apiRepos { + assert.False(t, repo.Private) + } +} + +func TestAPIGetRepoByIDUnauthorized(t *testing.T) { + prepareTestEnv(t) + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User) + sess := loginUser(t, user.Name) + req := NewRequestf(t, "GET", "/api/v1/repositories/2") + sess.MakeRequest(t, req, http.StatusNotFound) +} diff --git a/integrations/api_team_test.go b/integrations/api_team_test.go new file mode 100644 index 0000000..b8d21be --- /dev/null +++ b/integrations/api_team_test.go @@ -0,0 +1,31 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/models" + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func TestAPITeam(t *testing.T) { + prepareTestEnv(t) + teamUser := models.AssertExistsAndLoadBean(t, &models.TeamUser{}).(*models.TeamUser) + team := models.AssertExistsAndLoadBean(t, &models.Team{ID: teamUser.TeamID}).(*models.Team) + user := models.AssertExistsAndLoadBean(t, &models.User{ID: teamUser.UID}).(*models.User) + + session := loginUser(t, user.Name) + req := NewRequestf(t, "GET", "/api/v1/teams/%d", teamUser.TeamID) + resp := session.MakeRequest(t, req, http.StatusOK) + + var apiTeam api.Team + DecodeJSON(t, resp, &apiTeam) + assert.EqualValues(t, team.ID, apiTeam.ID) + assert.Equal(t, team.Name, apiTeam.Name) +} diff --git a/integrations/bare_repo_test.go b/integrations/bare_repo_test.go new file mode 100644 index 0000000..e693c18 --- /dev/null +++ b/integrations/bare_repo_test.go @@ -0,0 +1,28 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/models" +) + +func TestBareRepo(t *testing.T) { + prepareTestEnv(t) + subpaths := []string{ + "commits/master", + "raw/foo", + "commit/1ae57b34ccf7e18373", + "graph", + } + bareRepo := models.AssertExistsAndLoadBean(t, &models.Repository{}, models.Cond("is_bare = ?", true)).(*models.Repository) + owner := models.AssertExistsAndLoadBean(t, &models.User{ID: bareRepo.OwnerID}).(*models.User) + for _, subpath := range subpaths { + req := NewRequestf(t, "GET", "/%s/%s/%s", owner.Name, bareRepo.Name, subpath) + MakeRequest(t, req, http.StatusNotFound) + } +} diff --git a/integrations/change_default_branch_test.go b/integrations/change_default_branch_test.go new file mode 100644 index 0000000..dbd189c --- /dev/null +++ b/integrations/change_default_branch_test.go @@ -0,0 +1,38 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "fmt" + "net/http" + "testing" + + "code.gitea.io/gitea/models" +) + +func TestChangeDefaultBranch(t *testing.T) { + prepareTestEnv(t) + repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) + owner := models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User) + + session := loginUser(t, owner.Name) + branchesURL := fmt.Sprintf("/%s/%s/settings/branches", owner.Name, repo.Name) + + csrf := GetCSRF(t, session, branchesURL) + req := NewRequestWithValues(t, "POST", branchesURL, map[string]string{ + "_csrf": csrf, + "action": "default_branch", + "branch": "DefaultBranch", + }) + session.MakeRequest(t, req, http.StatusFound) + + csrf = GetCSRF(t, session, branchesURL) + req = NewRequestWithValues(t, "POST", branchesURL, map[string]string{ + "_csrf": csrf, + "action": "default_branch", + "branch": "does_not_exist", + }) + session.MakeRequest(t, req, http.StatusNotFound) +} diff --git a/integrations/delete_user_test.go b/integrations/delete_user_test.go new file mode 100644 index 0000000..889f8da --- /dev/null +++ b/integrations/delete_user_test.go @@ -0,0 +1,27 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/models" +) + +func TestDeleteUser(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user1") + + csrf := GetCSRF(t, session, "/admin/users/8") + req := NewRequestWithValues(t, "POST", "/admin/users/8/delete", map[string]string{ + "_csrf": csrf, + }) + session.MakeRequest(t, req, http.StatusOK) + + models.AssertNotExistsBean(t, &models.User{ID: 8}) + models.CheckConsistencyFor(t, &models.User{}) +} diff --git a/integrations/editor_test.go b/integrations/editor_test.go new file mode 100644 index 0000000..2b5db2e --- /dev/null +++ b/integrations/editor_test.go @@ -0,0 +1,154 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "path" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCreateFile(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + + // Request editor page + req := NewRequest(t, "GET", "/user2/repo1/_new/master/") + resp := session.MakeRequest(t, req, http.StatusOK) + + doc := NewHTMLParser(t, resp.Body) + lastCommit := doc.GetInputValueByName("last_commit") + assert.NotEmpty(t, lastCommit) + + // Save new file to master branch + req = NewRequestWithValues(t, "POST", "/user2/repo1/_new/master/", map[string]string{ + "_csrf": doc.GetCSRF(), + "last_commit": lastCommit, + "tree_path": "test.txt", + "content": "Content", + "commit_choice": "direct", + }) + resp = session.MakeRequest(t, req, http.StatusFound) +} + +func TestCreateFileOnProtectedBranch(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + + csrf := GetCSRF(t, session, "/user2/repo1/settings/branches") + // Change master branch to protected + req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches?action=protected_branch", map[string]string{ + "_csrf": csrf, + "branchName": "master", + "canPush": "false", + }) + resp := session.MakeRequest(t, req, http.StatusOK) + // Check if master branch has been locked successfully + flashCookie := session.GetCookie("macaron_flash") + assert.NotNil(t, flashCookie) + assert.EqualValues(t, flashCookie.Value, "success%3Dmaster%2BLocked%2Bsuccessfully") + + // Request editor page + req = NewRequest(t, "GET", "/user2/repo1/_new/master/") + resp = session.MakeRequest(t, req, http.StatusOK) + + doc := NewHTMLParser(t, resp.Body) + lastCommit := doc.GetInputValueByName("last_commit") + assert.NotEmpty(t, lastCommit) + + // Save new file to master branch + req = NewRequestWithValues(t, "POST", "/user2/repo1/_new/master/", map[string]string{ + "_csrf": doc.GetCSRF(), + "last_commit": lastCommit, + "tree_path": "test.txt", + "content": "Content", + "commit_choice": "direct", + }) + + resp = session.MakeRequest(t, req, http.StatusOK) + // Check body for error message + assert.Contains(t, string(resp.Body), "Can not commit to protected branch 'master'.") +} + +func testEditFile(t *testing.T, session *TestSession, user, repo, branch, filePath string) *TestResponse { + + newContent := "Hello, World (Edited)\n" + + // Get to the 'edit this file' page + req := NewRequest(t, "GET", path.Join(user, repo, "_edit", branch, filePath)) + resp := session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + lastCommit := htmlDoc.GetInputValueByName("last_commit") + assert.NotEmpty(t, lastCommit) + + // Submit the edits + req = NewRequestWithValues(t, "POST", path.Join(user, repo, "_edit", branch, filePath), + map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + "last_commit": lastCommit, + "tree_path": filePath, + "content": newContent, + "commit_choice": "direct", + }, + ) + resp = session.MakeRequest(t, req, http.StatusFound) + + // Verify the change + req = NewRequest(t, "GET", path.Join(user, repo, "raw", branch, filePath)) + resp = session.MakeRequest(t, req, http.StatusOK) + assert.EqualValues(t, newContent, string(resp.Body)) + + return resp +} + +func testEditFileToNewBranch(t *testing.T, session *TestSession, user, repo, branch, targetBranch, filePath string) *TestResponse { + + newContent := "Hello, World (Edited)\n" + + // Get to the 'edit this file' page + req := NewRequest(t, "GET", path.Join(user, repo, "_edit", branch, filePath)) + resp := session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + lastCommit := htmlDoc.GetInputValueByName("last_commit") + assert.NotEmpty(t, lastCommit) + + // Submit the edits + req = NewRequestWithValues(t, "POST", path.Join(user, repo, "_edit", branch, filePath), + map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + "last_commit": lastCommit, + "tree_path": filePath, + "content": newContent, + "commit_choice": "commit-to-new-branch", + "new_branch_name": targetBranch, + }, + ) + resp = session.MakeRequest(t, req, http.StatusFound) + + // Verify the change + req = NewRequest(t, "GET", path.Join(user, repo, "raw", targetBranch, filePath)) + resp = session.MakeRequest(t, req, http.StatusOK) + assert.EqualValues(t, newContent, string(resp.Body)) + + return resp +} + +func TestEditFile(t *testing.T) { + prepareTestEnv(t) + session := loginUser(t, "user2") + testEditFile(t, session, "user2", "repo1", "master", "README.md") +} + +func TestEditFileToNewBranch(t *testing.T) { + prepareTestEnv(t) + session := loginUser(t, "user2") + testEditFileToNewBranch(t, session, "user2", "repo1", "master", "feature/test", "README.md") +} diff --git a/integrations/explore_repos_test.go b/integrations/explore_repos_test.go new file mode 100644 index 0000000..7408f06 --- /dev/null +++ b/integrations/explore_repos_test.go @@ -0,0 +1,17 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" +) + +func TestExploreRepos(t *testing.T) { + prepareTestEnv(t) + + req := NewRequest(t, "GET", "/explore/repos") + MakeRequest(t, req, http.StatusOK) +} diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/HEAD b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/config b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/config new file mode 100644 index 0000000..07d359d --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/config @@ -0,0 +1,4 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/description b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/applypatch-msg.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/commit-msg.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-receive b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-receive new file mode 100755 index 0000000..4b3d452 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-receive @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/post-receive.d"`; do + sh "$SHELL_FOLDER/post-receive.d/$i" +done \ No newline at end of file diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-receive.d/gitea b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-receive.d/gitea new file mode 100755 index 0000000..2eb3be9 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-receive.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' post-receive diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-update.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-applypatch.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-commit.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-commit.sample new file mode 100755 index 0000000..68d62d5 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-push.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-push.sample new file mode 100755 index 0000000..6187dbf --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +z40=0000000000000000000000000000000000000000 + +while read local_ref local_sha remote_ref remote_sha +do + if [ "$local_sha" = $z40 ] + then + # Handle delete + : + else + if [ "$remote_sha" = $z40 ] + then + # New branch, examine all commits + range="$local_sha" + else + # Update to existing branch, examine new commits + range="$remote_sha..$local_sha" + fi + + # Check for WIP commit + commit=`git rev-list -n 1 --grep '^WIP' "$range"` + if [ -n "$commit" ] + then + echo >&2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-rebase.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-rebase.sample new file mode 100755 index 0000000..33730ca --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-receive b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-receive new file mode 100755 index 0000000..4127013 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-receive @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/pre-receive.d"`; do + sh "$SHELL_FOLDER/pre-receive.d/$i" +done \ No newline at end of file diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-receive.d/gitea b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-receive.d/gitea new file mode 100755 index 0000000..1933f6c --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/pre-receive.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' pre-receive diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/prepare-commit-msg.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..f093a02 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/prepare-commit-msg.sample @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update new file mode 100755 index 0000000..c186fe4 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/update.d"`; do + sh "$SHELL_FOLDER/update.d/$i" $1 $2 $3 +done \ No newline at end of file diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update.d/gitea b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update.d/gitea new file mode 100755 index 0000000..615b4f4 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' update $1 $2 $3 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update.sample new file mode 100755 index 0000000..80ba941 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/info/exclude b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/info/refs b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/info/refs new file mode 100644 index 0000000..ca1df85 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/info/refs @@ -0,0 +1 @@ +65f1bf27bc3bf70f64657658635e66094edbcb4d refs/heads/master diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/objects/2a/2f1d4670728a2e10049e345bd7a276468beab6 b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/objects/2a/2f1d4670728a2e10049e345bd7a276468beab6 new file mode 100644 index 0000000000000000000000000000000000000000..0994add2c8a420ba89b9a239de84741d4d00ee02 GIT binary patch literal 54 zcmV-60LlM&0V^p=O;s>9XD~D{Ff%bx2y%6F@paY9O=0l%2wWR@KdW}W>d8uz$jVo* MqfO=m05RYX?j~gyApigX literal 0 HcmV?d00001 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/objects/4b/4851ad51df6a7d9f25c979345979eaeb5b349f b/integrations/gitea-integration-meta/gitea-repositories/user2/repo1.git/objects/4b/4851ad51df6a7d9f25c979345979eaeb5b349f new file mode 100644 index 0000000000000000000000000000000000000000..700a13828e63248a392e4c90d92bbb6e3dd57ba0 GIT binary patch literal 42 ycmb%v7rOCc0q7S-{K(sSa& zkkbhiI`12U*27++lwz~nt#W~Lz0(ZW%yS%}\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-receive b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-receive new file mode 100755 index 0000000..4b3d452 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-receive @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/post-receive.d"`; do + sh "$SHELL_FOLDER/post-receive.d/$i" +done \ No newline at end of file diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-receive.d/gitea b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-receive.d/gitea new file mode 100755 index 0000000..2eb3be9 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-receive.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' post-receive diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-update.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-applypatch.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-commit.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-commit.sample new file mode 100755 index 0000000..68d62d5 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-push.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-push.sample new file mode 100755 index 0000000..6187dbf --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +z40=0000000000000000000000000000000000000000 + +while read local_ref local_sha remote_ref remote_sha +do + if [ "$local_sha" = $z40 ] + then + # Handle delete + : + else + if [ "$remote_sha" = $z40 ] + then + # New branch, examine all commits + range="$local_sha" + else + # Update to existing branch, examine new commits + range="$remote_sha..$local_sha" + fi + + # Check for WIP commit + commit=`git rev-list -n 1 --grep '^WIP' "$range"` + if [ -n "$commit" ] + then + echo >&2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-rebase.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-rebase.sample new file mode 100755 index 0000000..33730ca --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-receive b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-receive new file mode 100755 index 0000000..4127013 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-receive @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/pre-receive.d"`; do + sh "$SHELL_FOLDER/pre-receive.d/$i" +done \ No newline at end of file diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-receive.d/gitea b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-receive.d/gitea new file mode 100755 index 0000000..1933f6c --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/pre-receive.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' pre-receive diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/prepare-commit-msg.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..f093a02 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/prepare-commit-msg.sample @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update new file mode 100755 index 0000000..c186fe4 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/update.d"`; do + sh "$SHELL_FOLDER/update.d/$i" $1 $2 $3 +done \ No newline at end of file diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update.d/gitea b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update.d/gitea new file mode 100755 index 0000000..615b4f4 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' update $1 $2 $3 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update.sample b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update.sample new file mode 100755 index 0000000..80ba941 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/info/exclude b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user2/repo15.git/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/HEAD b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/HEAD new file mode 100644 index 0000000..cb089cd --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/config b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/config new file mode 100644 index 0000000..e6da231 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true + ignorecase = true + precomposeunicode = true diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/description b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/description new file mode 100644 index 0000000..498b267 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/applypatch-msg.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/commit-msg.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-receive b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-receive new file mode 100755 index 0000000..4b3d452 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-receive @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/post-receive.d"`; do + sh "$SHELL_FOLDER/post-receive.d/$i" +done \ No newline at end of file diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-receive.d/gitea b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-receive.d/gitea new file mode 100755 index 0000000..2eb3be9 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-receive.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' post-receive diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-update.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-applypatch.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-commit.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-commit.sample new file mode 100755 index 0000000..68d62d5 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-push.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-push.sample new file mode 100755 index 0000000..6187dbf --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +z40=0000000000000000000000000000000000000000 + +while read local_ref local_sha remote_ref remote_sha +do + if [ "$local_sha" = $z40 ] + then + # Handle delete + : + else + if [ "$remote_sha" = $z40 ] + then + # New branch, examine all commits + range="$local_sha" + else + # Update to existing branch, examine new commits + range="$remote_sha..$local_sha" + fi + + # Check for WIP commit + commit=`git rev-list -n 1 --grep '^WIP' "$range"` + if [ -n "$commit" ] + then + echo >&2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-rebase.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-rebase.sample new file mode 100755 index 0000000..33730ca --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive new file mode 100755 index 0000000..4127013 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/pre-receive.d"`; do + sh "$SHELL_FOLDER/pre-receive.d/$i" +done \ No newline at end of file diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive.d/gitea b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive.d/gitea new file mode 100755 index 0000000..1933f6c --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' pre-receive diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/prepare-commit-msg.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..f093a02 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/prepare-commit-msg.sample @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update new file mode 100755 index 0000000..c186fe4 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +ORI_DIR=`pwd` +SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) +cd "$ORI_DIR" +for i in `ls "$SHELL_FOLDER/update.d"`; do + sh "$SHELL_FOLDER/update.d/$i" $1 $2 $3 +done \ No newline at end of file diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update.d/gitea b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update.d/gitea new file mode 100755 index 0000000..615b4f4 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update.d/gitea @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +"$GITEA_ROOT/gitea" hook --config='integrations/app.ini' update $1 $2 $3 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update.sample b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update.sample new file mode 100755 index 0000000..80ba941 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/info/exclude b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/info/exclude new file mode 100644 index 0000000..a5196d1 --- /dev/null +++ b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/20/ade30d25e0ecaeec84e7f542a8456900858240 b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/20/ade30d25e0ecaeec84e7f542a8456900858240 new file mode 100644 index 0000000000000000000000000000000000000000..9f3ffe5f27eab55ddf77a4eef3620a63549a1a32 GIT binary patch literal 84 zcmV-a0IUCa0V^p=O;s>6XD~D{Ff%bx2y%6F@paY9O<}m2Wl((Z_V$gD$%0%ga|6z9 qy*=}fi2)EOq~s?vsF&Q^_bT_e(;3ggmAV@qbWh#J+5rIM${q^x(I*%H literal 0 HcmV?d00001 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/27/74debeea6dc742cc4971a92db0e08b95b60588 b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/27/74debeea6dc742cc4971a92db0e08b95b60588 new file mode 100644 index 0000000000000000000000000000000000000000..5d9226f7a1240630524be4a3f27f4f31b1972c4c GIT binary patch literal 51 zcmV-30L=e*0V^p=O;s>9VK6i>Ff%bxNXbvu%S~a>pRM%QFmj1?wO{NFwm(;0-u@`e J2LKmL5A5=Z6&nBm literal 0 HcmV?d00001 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/2a/47ca4b614a9f5a43abbd5ad851a54a616ffee6 b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/2a/47ca4b614a9f5a43abbd5ad851a54a616ffee6 new file mode 100644 index 0000000000000000000000000000000000000000..ca60d2314fcda692990183d659d83ee440c1b995 GIT binary patch literal 760 zcmVYOx;klMR72dt4;0R+*~O8>}``PUZ2-qtxFX@ zzcQJ_^G_pOnRY=y&KS-~OX8!%s4VQG3+deL$vl6&|{~De2HSfz`)_^n-GuEXHwgRaeKV9=$9fPOJ1R0w&iIoy1PPwU+nK$I{bkEo7A`*gjm6CvD_e$1?jz#N~O za$_(}1e~skAZ#g_cMrB?V4Go^>n-WyBM+oNMmAPyk=}4>>B#PS@I$%`bj(%?W#cq$vH`uuPA-Xd;t|(ab9y}n`qJEc`7=3+E55E z$e1f~*2Cub*`mHJ?;X>J)^ki#5tAz#O#)(g5k031yqQOfK2UuUvU(xh?s>+q2#7WU zPQ_aDQ+K*Pm0NN_6;C(xXkDE?Y6;G%0+#1q=Fn1)S{}>pfgYb)I$r|Fv`LJBTSVP( zb>$Z|pyzbAWM`N|X)pQxLk(E=9`8a`Kus_6?#{1_diM>Af6P%>n&^txCj_v@gI-fg qUZ|GWE4B7C{oDJ4oXQ&c&k4mk{mKZW?!Q*Q-a`ZP8Tki~F*%6l+q`%%--?Q3*9;fw#G`w_Am_K7;=uqdh2LKN*4QBuV literal 0 HcmV?d00001 diff --git a/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/d5/6a3073c1dbb7b15963110a049d50cdb5db99fc b/integrations/gitea-integration-meta/gitea-repositories/user3/repo3.git/objects/d5/6a3073c1dbb7b15963110a049d50cdb5db99fc new file mode 100644 index 0000000000000000000000000000000000000000..eff3c9833edabef54391c6c050778ee88eaa207b GIT binary patch literal 42 ycmb setting.UI.IssuePagingNum { + expectedNumIssues = setting.UI.IssuePagingNum + } + assert.EqualValues(t, expectedNumIssues, issuesSelection.Length()) + + issuesSelection.Each(func(_ int, selection *goquery.Selection) { + issue := getIssue(t, repo.ID, selection) + assert.EqualValues(t, user.ID, issue.PosterID) + }) +} + +func TestNoLoginViewIssue(t *testing.T) { + prepareTestEnv(t) + + req := NewRequest(t, "GET", "/user2/repo1/issues/1") + MakeRequest(t, req, http.StatusOK) +} + +func testNewIssue(t *testing.T, session *TestSession, user, repo, title string) { + + req := NewRequest(t, "GET", path.Join(user, repo, "issues", "new")) + resp := session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + link, exists := htmlDoc.doc.Find("form.ui.form").Attr("action") + assert.True(t, exists, "The template has changed") + req = NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + "title": title, + }) + resp = session.MakeRequest(t, req, http.StatusFound) + + req = NewRequest(t, "GET", RedirectURL(t, resp)) + resp = session.MakeRequest(t, req, http.StatusOK) +} + +func TestNewIssue(t *testing.T) { + prepareTestEnv(t) + session := loginUser(t, "user2") + testNewIssue(t, session, "user2", "repo1", "Title") +} diff --git a/integrations/links_test.go b/integrations/links_test.go new file mode 100644 index 0000000..bab147b --- /dev/null +++ b/integrations/links_test.go @@ -0,0 +1,130 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "fmt" + "net/http" + "testing" + + api "code.gitea.io/sdk/gitea" +) + +func TestLinksNoLogin(t *testing.T) { + prepareTestEnv(t) + + var links = []string{ + "/explore/repos", + "/explore/repos?q=test&tab=", + "/explore/users", + "/explore/users?q=test&tab=", + "/explore/organizations", + "/explore/organizations?q=test&tab=", + "/", + "/user/sign_up", + "/user/login", + "/user/forgot_password", + "/swagger", + // TODO: follow this page and test every link + "/vendor/librejs.html", + } + + for _, link := range links { + req := NewRequest(t, "GET", link) + MakeRequest(t, req, http.StatusOK) + } +} + +func testLinksAsUser(userName string, t *testing.T) { + var links = []string{ + "/explore/repos", + "/explore/repos?q=test&tab=", + "/explore/users", + "/explore/users?q=test&tab=", + "/explore/organizations", + "/explore/organizations?q=test&tab=", + "/", + "/user/forgot_password", + "/swagger", + "/issues", + "/issues?type=your_repositories&repo=0&sort=&state=open", + "/issues?type=assigned&repo=0&sort=&state=open", + "/issues?type=created_by&repo=0&sort=&state=open", + "/issues?type=your_repositories&repo=0&sort=&state=closed", + "/issues?type=assigned&repo=0&sort=&state=closed", + "/issues?type=created_by&repo=0&sort=&state=closed", + "/pulls", + "/pulls?type=your_repositories&repo=0&sort=&state=open", + "/pulls?type=assigned&repo=0&sort=&state=open", + "/pulls?type=created_by&repo=0&sort=&state=open", + "/pulls?type=your_repositories&repo=0&sort=&state=closed", + "/pulls?type=assigned&repo=0&sort=&state=closed", + "/pulls?type=created_by&repo=0&sort=&state=closed", + "/notifications", + "/repo/create", + "/repo/migrate", + "/org/create", + "/user2", + "/user2?tab=stars", + "/user2?tab=activity", + "/user/settings", + "/user/settings/avatar", + "/user/settings/password", + "/user/settings/email", + "/user/settings/keys", + "/user/settings/applications", + "/user/settings/two_factor", + "/user/settings/account_link", + "/user/settings/organization", + "/user/settings/delete", + } + + session := loginUser(t, userName) + for _, link := range links { + req := NewRequest(t, "GET", link) + session.MakeRequest(t, req, http.StatusOK) + } + + reqAPI := NewRequestf(t, "GET", "/api/v1/users/%s/repos", userName) + respAPI := MakeRequest(t, reqAPI, http.StatusOK) + + var apiRepos []api.Repository + DecodeJSON(t, respAPI, &apiRepos) + + var repoLinks = []string{ + "", + "/issues", + "/pulls", + "/commits/master", + "/graph", + "/settings", + "/settings/collaboration", + "/settings/branches", + "/settings/hooks", + // FIXME: below links should return 200 but 404 ?? + //"/settings/hooks/git", + //"/settings/hooks/git/pre-receive", + //"/settings/hooks/git/update", + //"/settings/hooks/git/post-receive", + "/settings/keys", + "/releases", + "/releases/new", + //"/wiki/_pages", + "/wiki/_new", + } + + for _, repo := range apiRepos { + for _, link := range repoLinks { + req := NewRequest(t, "GET", fmt.Sprintf("/%s/%s%s", userName, repo.Name, link)) + session.MakeRequest(t, req, http.StatusOK) + } + } +} + +func TestLinksLogin(t *testing.T) { + prepareTestEnv(t) + + testLinksAsUser("user2", t) +} diff --git a/integrations/mysql.ini b/integrations/mysql.ini new file mode 100644 index 0000000..82acc24 --- /dev/null +++ b/integrations/mysql.ini @@ -0,0 +1,59 @@ +APP_NAME = Gitea: Git with a cup of tea +RUN_MODE = prod + +[database] +DB_TYPE = mysql +HOST = mysql:3306 +NAME = testgitea +USER = root +PASSWD = +SSL_MODE = disable +PATH = data/gitea.db + +[repository] +ROOT = integrations/gitea-integration/gitea-repositories + +[server] +SSH_DOMAIN = localhost +HTTP_PORT = 3000 +ROOT_URL = http://localhost:3000/ +DISABLE_SSH = false +SSH_PORT = 22 +LFS_START_SERVER = false +OFFLINE_MODE = false + +[mailer] +ENABLED = false + +[service] +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +DISABLE_REGISTRATION = false +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +DEFAULT_KEEP_EMAIL_PRIVATE = false +DEFAULT_ALLOW_CREATE_ORGANIZATION = true +NO_REPLY_ADDRESS = noreply.example.org + +[picture] +DISABLE_GRAVATAR = false +ENABLE_FEDERATED_AVATAR = false + +[session] +PROVIDER = file + +[log] +MODE = console,file +ROOT_PATH = mysql-log + +[log.console] +LEVEL = Warn + +[log.file] +LEVEL = Debug + +[security] +INSTALL_LOCK = true +SECRET_KEY = 9pCviYTWSb +INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTU1NTE2MTh9.hhSVGOANkaKk3vfCd2jDOIww4pUk0xtg9JRde5UogyQ + diff --git a/integrations/pgsql.ini b/integrations/pgsql.ini new file mode 100644 index 0000000..fe979a6 --- /dev/null +++ b/integrations/pgsql.ini @@ -0,0 +1,58 @@ +APP_NAME = Gitea: Git with a cup of tea +RUN_MODE = prod + +[database] +DB_TYPE = postgres +HOST = pgsql:5432 +NAME = testgitea +USER = postgres +PASSWD = postgres +SSL_MODE = disable +PATH = data/gitea.db + +[repository] +ROOT = integrations/gitea-integration/gitea-repositories + +[server] +SSH_DOMAIN = localhost +HTTP_PORT = 3000 +ROOT_URL = http://localhost:3000/ +DISABLE_SSH = false +SSH_PORT = 22 +LFS_START_SERVER = false +OFFLINE_MODE = false + +[mailer] +ENABLED = false + +[service] +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +DISABLE_REGISTRATION = false +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +DEFAULT_KEEP_EMAIL_PRIVATE = false +DEFAULT_ALLOW_CREATE_ORGANIZATION = true +NO_REPLY_ADDRESS = noreply.example.org + +[picture] +DISABLE_GRAVATAR = false +ENABLE_FEDERATED_AVATAR = false + +[session] +PROVIDER = file + +[log] +MODE = console,file +ROOT_PATH = pgsql-log + +[log.console] +LEVEL = Warn + +[log.file] +LEVEL = Debug + +[security] +INSTALL_LOCK = true +SECRET_KEY = 9pCviYTWSb +INTERNAL_TOKEN = test diff --git a/integrations/pull_compare_test.go b/integrations/pull_compare_test.go new file mode 100644 index 0000000..593b2f4 --- /dev/null +++ b/integrations/pull_compare_test.go @@ -0,0 +1,27 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestPullCompare(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + req := NewRequest(t, "GET", "/user2/repo1/pulls") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + link, exists := htmlDoc.doc.Find(".navbar").Find(".ui.green.button").Attr("href") + assert.True(t, exists, "The template has changed") + + req = NewRequest(t, "GET", link) + resp = session.MakeRequest(t, req, http.StatusOK) + assert.EqualValues(t, http.StatusOK, resp.HeaderCode) +} diff --git a/integrations/pull_create_test.go b/integrations/pull_create_test.go new file mode 100644 index 0000000..a62144c --- /dev/null +++ b/integrations/pull_create_test.go @@ -0,0 +1,52 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "path" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func testPullCreate(t *testing.T, session *TestSession, user, repo, branch string) *TestResponse { + req := NewRequest(t, "GET", path.Join(user, repo)) + resp := session.MakeRequest(t, req, http.StatusOK) + + // Click the little green button to create a pull + htmlDoc := NewHTMLParser(t, resp.Body) + link, exists := htmlDoc.doc.Find("button.ui.green.tiny.compact.button").Parent().Attr("href") + assert.True(t, exists, "The template has changed") + if branch != "master" { + link = strings.Replace(link, ":master", ":"+branch, 1) + } + + req = NewRequest(t, "GET", link) + resp = session.MakeRequest(t, req, http.StatusOK) + + // Submit the form for creating the pull + htmlDoc = NewHTMLParser(t, resp.Body) + link, exists = htmlDoc.doc.Find("form.ui.form").Attr("action") + assert.True(t, exists, "The template has changed") + req = NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + "title": "This is a pull title", + }) + resp = session.MakeRequest(t, req, http.StatusFound) + + //TODO check the redirected URL + + return resp +} + +func TestPullCreate(t *testing.T) { + prepareTestEnv(t) + session := loginUser(t, "user1") + testRepoFork(t, session, "user2", "repo1", "user1", "repo1") + testEditFile(t, session, "user1", "repo1", "master", "README.md") + testPullCreate(t, session, "user1", "repo1", "master") +} diff --git a/integrations/pull_merge_test.go b/integrations/pull_merge_test.go new file mode 100644 index 0000000..100298b --- /dev/null +++ b/integrations/pull_merge_test.go @@ -0,0 +1,93 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "path" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func testPullMerge(t *testing.T, session *TestSession, user, repo, pullnum string) *TestResponse { + req := NewRequest(t, "GET", path.Join(user, repo, "pulls", pullnum)) + resp := session.MakeRequest(t, req, http.StatusOK) + + // Click the little green button to create a pull + htmlDoc := NewHTMLParser(t, resp.Body) + link, exists := htmlDoc.doc.Find("form.ui.form>button.ui.green.button").Parent().Attr("action") + assert.True(t, exists, "The template has changed") + req = NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + }) + resp = session.MakeRequest(t, req, http.StatusFound) + + return resp +} + +func testPullCleanUp(t *testing.T, session *TestSession, user, repo, pullnum string) *TestResponse { + req := NewRequest(t, "GET", path.Join(user, repo, "pulls", pullnum)) + resp := session.MakeRequest(t, req, http.StatusOK) + + // Click the little green button to create a pull + htmlDoc := NewHTMLParser(t, resp.Body) + link, exists := htmlDoc.doc.Find(".comments .merge .delete-button").Attr("data-url") + assert.True(t, exists, "The template has changed") + req = NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + }) + resp = session.MakeRequest(t, req, http.StatusOK) + + return resp +} + +func TestPullMerge(t *testing.T) { + prepareTestEnv(t) + session := loginUser(t, "user1") + testRepoFork(t, session, "user2", "repo1", "user1", "repo1") + testEditFile(t, session, "user1", "repo1", "master", "README.md") + + resp := testPullCreate(t, session, "user1", "repo1", "master") + + elem := strings.Split(RedirectURL(t, resp), "/") + assert.EqualValues(t, "pulls", elem[3]) + testPullMerge(t, session, elem[1], elem[2], elem[4]) +} + +func TestPullCleanUpAfterMerge(t *testing.T) { + prepareTestEnv(t) + session := loginUser(t, "user1") + testRepoFork(t, session, "user2", "repo1", "user1", "repo1") + testEditFileToNewBranch(t, session, "user1", "repo1", "master", "feature/test", "README.md") + + resp := testPullCreate(t, session, "user1", "repo1", "feature/test") + + elem := strings.Split(RedirectURL(t, resp), "/") + assert.EqualValues(t, "pulls", elem[3]) + testPullMerge(t, session, elem[1], elem[2], elem[4]) + + // Check PR branch deletion + resp = testPullCleanUp(t, session, elem[1], elem[2], elem[4]) + respJSON := struct { + Redirect string + }{} + DecodeJSON(t, resp, &respJSON) + + assert.NotEmpty(t, respJSON.Redirect, "Redirected URL is not found") + + elem = strings.Split(respJSON.Redirect, "/") + assert.EqualValues(t, "pulls", elem[3]) + + // Check branch deletion result + req := NewRequest(t, "GET", respJSON.Redirect) + resp = session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + resultMsg := htmlDoc.doc.Find(".ui.message>p").Text() + + assert.EqualValues(t, "user1/feature/test has been deleted.", resultMsg) +} diff --git a/integrations/release_test.go b/integrations/release_test.go new file mode 100644 index 0000000..bce1c88 --- /dev/null +++ b/integrations/release_test.go @@ -0,0 +1,116 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "fmt" + "net/http" + "testing" + + "github.com/Unknwon/i18n" + "github.com/stretchr/testify/assert" +) + +func createNewRelease(t *testing.T, session *TestSession, repoURL, tag, title string, preRelease, draft bool) { + req := NewRequest(t, "GET", repoURL+"/releases/new") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + link, exists := htmlDoc.doc.Find("form").Attr("action") + assert.True(t, exists, "The template has changed") + + postData := map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + "tag_name": tag, + "tag_target": "master", + "title": title, + "content": "", + } + if preRelease { + postData["prerelease"] = "on" + } + if draft { + postData["draft"] = "Save Draft" + } + req = NewRequestWithValues(t, "POST", link, postData) + + resp = session.MakeRequest(t, req, http.StatusFound) + + RedirectURL(t, resp) // check that redirect URL exists +} + +func checkLatestReleaseAndCount(t *testing.T, session *TestSession, repoURL, version, label string, count int) { + req := NewRequest(t, "GET", repoURL+"/releases") + resp := session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + labelText := htmlDoc.doc.Find("#release-list > li .meta .label").First().Text() + assert.EqualValues(t, label, labelText) + titleText := htmlDoc.doc.Find("#release-list > li .detail h3 a").First().Text() + assert.EqualValues(t, version, titleText) + + releaseList := htmlDoc.doc.Find("#release-list > li") + assert.EqualValues(t, count, releaseList.Length()) +} + +func TestViewReleases(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + req := NewRequest(t, "GET", "/user2/repo1/releases") + session.MakeRequest(t, req, http.StatusOK) +} + +func TestViewReleasesNoLogin(t *testing.T) { + prepareTestEnv(t) + + req := NewRequest(t, "GET", "/user2/repo1/releases") + MakeRequest(t, req, http.StatusOK) +} + +func TestCreateRelease(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, false) + + checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.stable"), 1) +} + +func TestCreateReleasePreRelease(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", true, false) + + checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.prerelease"), 1) +} + +func TestCreateReleaseDraft(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, true) + + checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", i18n.Tr("en", "repo.release.draft"), 1) +} + +func TestCreateReleasePaging(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + // Create enaugh releases to have paging + for i := 0; i < 12; i++ { + version := fmt.Sprintf("v0.0.%d", i) + createNewRelease(t, session, "/user2/repo1", version, version, false, false) + } + createNewRelease(t, session, "/user2/repo1", "v0.0.12", "v0.0.12", false, true) + + checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.12", i18n.Tr("en", "repo.release.draft"), 10) + + // Check that user3 does not see draft and still see 10 latest releases + session2 := loginUser(t, "user3") + checkLatestReleaseAndCount(t, session2, "/user2/repo1", "v0.0.11", i18n.Tr("en", "repo.release.stable"), 10) +} diff --git a/integrations/repo_commits_test.go b/integrations/repo_commits_test.go new file mode 100644 index 0000000..bf35398 --- /dev/null +++ b/integrations/repo_commits_test.go @@ -0,0 +1,89 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "path" + "testing" + + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func TestRepoCommits(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + + // Request repository commits page + req := NewRequest(t, "GET", "/user2/repo1/commits/master") + resp := session.MakeRequest(t, req, http.StatusOK) + + doc := NewHTMLParser(t, resp.Body) + commitURL, exists := doc.doc.Find("#commits-table tbody tr td.sha a").Attr("href") + assert.True(t, exists) + assert.NotEmpty(t, commitURL) +} + +func doTestRepoCommitWithStatus(t *testing.T, state string, classes ...string) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + + // Request repository commits page + req := NewRequest(t, "GET", "/user2/repo1/commits/master") + resp := session.MakeRequest(t, req, http.StatusOK) + + doc := NewHTMLParser(t, resp.Body) + // Get first commit URL + commitURL, exists := doc.doc.Find("#commits-table tbody tr td.sha a").Attr("href") + assert.True(t, exists) + assert.NotEmpty(t, commitURL) + + // Call API to add status for commit + req = NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/statuses/"+path.Base(commitURL), + api.CreateStatusOption{ + State: api.StatusState(state), + TargetURL: "http://test.ci/", + Description: "", + Context: "testci", + }, + ) + + resp = session.MakeRequest(t, req, http.StatusCreated) + + req = NewRequest(t, "GET", "/user2/repo1/commits/master") + resp = session.MakeRequest(t, req, http.StatusOK) + + doc = NewHTMLParser(t, resp.Body) + // Check if commit status is displayed in message column + sel := doc.doc.Find("#commits-table tbody tr td.message i.commit-status") + assert.Equal(t, sel.Length(), 1) + for _, class := range classes { + assert.True(t, sel.HasClass(class)) + } +} + +func TestRepoCommitsWithStatusPending(t *testing.T) { + doTestRepoCommitWithStatus(t, "pending", "circle", "yellow") +} + +func TestRepoCommitsWithStatusSuccess(t *testing.T) { + doTestRepoCommitWithStatus(t, "success", "check", "green") +} + +func TestRepoCommitsWithStatusError(t *testing.T) { + doTestRepoCommitWithStatus(t, "error", "warning", "red") +} + +func TestRepoCommitsWithStatusFailure(t *testing.T) { + doTestRepoCommitWithStatus(t, "failure", "remove", "red") +} + +func TestRepoCommitsWithStatusWarning(t *testing.T) { + doTestRepoCommitWithStatus(t, "warning", "warning", "sign", "yellow") +} diff --git a/integrations/repo_fork_test.go b/integrations/repo_fork_test.go new file mode 100644 index 0000000..f8cc2e3 --- /dev/null +++ b/integrations/repo_fork_test.go @@ -0,0 +1,73 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "fmt" + "net/http" + "testing" + + "code.gitea.io/gitea/models" + + "github.com/stretchr/testify/assert" +) + +func testRepoFork(t *testing.T, session *TestSession, ownerName, repoName, forkOwnerName, forkRepoName string) *TestResponse { + forkOwner := models.AssertExistsAndLoadBean(t, &models.User{Name: forkOwnerName}).(*models.User) + + // Step0: check the existence of the to-fork repo + req := NewRequestf(t, "GET", "/%s/%s", forkOwnerName, forkRepoName) + resp := session.MakeRequest(t, req, http.StatusNotFound) + + // Step1: go to the main page of repo + req = NewRequestf(t, "GET", "/%s/%s", ownerName, repoName) + resp = session.MakeRequest(t, req, http.StatusOK) + + // Step2: click the fork button + htmlDoc := NewHTMLParser(t, resp.Body) + link, exists := htmlDoc.doc.Find("a.ui.button[href^=\"/repo/fork/\"]").Attr("href") + assert.True(t, exists, "The template has changed") + req = NewRequest(t, "GET", link) + resp = session.MakeRequest(t, req, http.StatusOK) + + // Step3: fill the form of the forking + htmlDoc = NewHTMLParser(t, resp.Body) + link, exists = htmlDoc.doc.Find("form.ui.form[action^=\"/repo/fork/\"]").Attr("action") + assert.True(t, exists, "The template has changed") + _, exists = htmlDoc.doc.Find(fmt.Sprintf(".owner.dropdown .item[data-value=\"%d\"]", forkOwner.ID)).Attr("data-value") + assert.True(t, exists, fmt.Sprintf("Fork owner '%s' is not present in select box", forkOwnerName)) + req = NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + "uid": fmt.Sprintf("%d", forkOwner.ID), + "repo_name": forkRepoName, + }) + resp = session.MakeRequest(t, req, http.StatusFound) + + // Step4: check the existence of the forked repo + req = NewRequestf(t, "GET", "/%s/%s", forkOwnerName, forkRepoName) + resp = session.MakeRequest(t, req, http.StatusOK) + + return resp +} + +func TestRepoFork(t *testing.T) { + prepareTestEnv(t) + session := loginUser(t, "user1") + testRepoFork(t, session, "user2", "repo1", "user1", "repo1") +} + +func TestRepoForkToOrg(t *testing.T) { + prepareTestEnv(t) + session := loginUser(t, "user2") + testRepoFork(t, session, "user2", "repo1", "user3", "repo1") + + // Check that no more forking is allowed as user2 owns repository + // and user3 organization that owner user2 is also now has forked this repository + req := NewRequest(t, "GET", "/user2/repo1") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + _, exists := htmlDoc.doc.Find("a.ui.button[href^=\"/repo/fork/\"]").Attr("href") + assert.False(t, exists, "Forking should not be allowed anymore") +} diff --git a/integrations/repo_migrate_test.go b/integrations/repo_migrate_test.go new file mode 100644 index 0000000..4307ddf --- /dev/null +++ b/integrations/repo_migrate_test.go @@ -0,0 +1,67 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +func testRepoMigrate(t testing.TB, session *TestSession, cloneAddr, repoName string) *TestResponse { + req := NewRequest(t, "GET", "/repo/migrate") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + + link, exists := htmlDoc.doc.Find("form.ui.form").Attr("action") + assert.True(t, exists, "The template has changed") + + uid, exists := htmlDoc.doc.Find("#uid").Attr("value") + assert.True(t, exists, "The template has changed") + + req = NewRequestWithValues(t, "POST", link, map[string]string{ + "_csrf": htmlDoc.GetCSRF(), + "clone_addr": cloneAddr, + "uid": uid, + "repo_name": repoName, + }, + ) + resp = session.MakeRequest(t, req, http.StatusFound) + + return resp +} + +func TestRepoMigrate(t *testing.T) { + prepareTestEnv(t) + session := loginUser(t, "user2") + testRepoMigrate(t, session, "https://github.com/go-gitea/git.git", "git") +} + +func BenchmarkRepoMigrate(b *testing.B) { + samples := []struct { + url string + name string + }{ + {url: "https://github.com/go-gitea/gitea.git", name: "gitea"}, + {url: "https://github.com/ethantkoenig/manyfiles.git", name: "manyfiles"}, + {url: "https://github.com/moby/moby.git", name: "moby"}, + {url: "https://github.com/golang/go.git", name: "go"}, + {url: "https://github.com/torvalds/linux.git", name: "linux"}, + } + + prepareTestEnv(b) + session := loginUser(b, "user2") + b.ResetTimer() + + for _, s := range samples { + b.Run(s.name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + testRepoMigrate(b, session, s.url, s.name) + } + + }) + } +} diff --git a/integrations/repo_test.go b/integrations/repo_test.go new file mode 100644 index 0000000..8465bbd --- /dev/null +++ b/integrations/repo_test.go @@ -0,0 +1,76 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "fmt" + "net/http" + "testing" + + "code.gitea.io/gitea/modules/setting" + + "github.com/stretchr/testify/assert" +) + +func TestViewRepo(t *testing.T) { + prepareTestEnv(t) + + req := NewRequest(t, "GET", "/user2/repo1") + MakeRequest(t, req, http.StatusOK) + + req = NewRequest(t, "GET", "/user3/repo3") + MakeRequest(t, req, http.StatusNotFound) + + session := loginUser(t, "user1") + session.MakeRequest(t, req, http.StatusNotFound) +} + +func TestViewRepo2(t *testing.T) { + prepareTestEnv(t) + + req := NewRequest(t, "GET", "/user3/repo3") + session := loginUser(t, "user2") + session.MakeRequest(t, req, http.StatusOK) +} + +func TestViewRepo3(t *testing.T) { + prepareTestEnv(t) + + req := NewRequest(t, "GET", "/user3/repo3") + session := loginUser(t, "user4") + session.MakeRequest(t, req, http.StatusOK) +} + +func TestViewRepo1CloneLinkAnonymous(t *testing.T) { + prepareTestEnv(t) + + req := NewRequest(t, "GET", "/user2/repo1") + resp := MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + link, exists := htmlDoc.doc.Find("#repo-clone-https").Attr("data-link") + assert.True(t, exists, "The template has changed") + assert.Equal(t, setting.AppURL+"user2/repo1.git", link) + _, exists = htmlDoc.doc.Find("#repo-clone-ssh").Attr("data-link") + assert.False(t, exists) +} + +func TestViewRepo1CloneLinkAuthorized(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + + req := NewRequest(t, "GET", "/user2/repo1") + resp := session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + link, exists := htmlDoc.doc.Find("#repo-clone-https").Attr("data-link") + assert.True(t, exists, "The template has changed") + assert.Equal(t, setting.AppURL+"user2/repo1.git", link) + link, exists = htmlDoc.doc.Find("#repo-clone-ssh").Attr("data-link") + assert.True(t, exists, "The template has changed") + sshURL := fmt.Sprintf("%s@%s:user2/repo1.git", setting.RunUser, setting.SSH.Domain) + assert.Equal(t, sshURL, link) +} diff --git a/integrations/setting_test.go b/integrations/setting_test.go new file mode 100644 index 0000000..a8d1f01 --- /dev/null +++ b/integrations/setting_test.go @@ -0,0 +1,70 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/modules/setting" + + "github.com/stretchr/testify/assert" +) + +func TestSettingShowUserEmailExplore(t *testing.T) { + prepareTestEnv(t) + + showUserEmail := setting.UI.ShowUserEmail + setting.UI.ShowUserEmail = true + + session := loginUser(t, "user2") + req := NewRequest(t, "GET", "/explore/users") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + assert.Contains(t, + htmlDoc.doc.Find(".ui.user.list").Text(), + "user2@example.com", + ) + + setting.UI.ShowUserEmail = false + + req = NewRequest(t, "GET", "/explore/users") + resp = session.MakeRequest(t, req, http.StatusOK) + htmlDoc = NewHTMLParser(t, resp.Body) + assert.NotContains(t, + htmlDoc.doc.Find(".ui.user.list").Text(), + "user2@example.com", + ) + + setting.UI.ShowUserEmail = showUserEmail +} + +func TestSettingShowUserEmailProfile(t *testing.T) { + prepareTestEnv(t) + + showUserEmail := setting.UI.ShowUserEmail + setting.UI.ShowUserEmail = true + + session := loginUser(t, "user2") + req := NewRequest(t, "GET", "/user2") + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + assert.Contains(t, + htmlDoc.doc.Find(".user.profile").Text(), + "user2@example.com", + ) + + setting.UI.ShowUserEmail = false + + req = NewRequest(t, "GET", "/user2") + resp = session.MakeRequest(t, req, http.StatusOK) + htmlDoc = NewHTMLParser(t, resp.Body) + assert.NotContains(t, + htmlDoc.doc.Find(".user.profile").Text(), + "user2@example.com", + ) + + setting.UI.ShowUserEmail = showUserEmail +} diff --git a/integrations/signin_test.go b/integrations/signin_test.go new file mode 100644 index 0000000..9eab5b5 --- /dev/null +++ b/integrations/signin_test.go @@ -0,0 +1,60 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "strings" + "testing" + + "code.gitea.io/gitea/models" + + "github.com/Unknwon/i18n" + "github.com/stretchr/testify/assert" +) + +func testLoginFailed(t *testing.T, username, password, message string) { + session := emptyTestSession(t) + req := NewRequestWithValues(t, "POST", "/user/login", map[string]string{ + "_csrf": GetCSRF(t, session, "/user/login"), + "user_name": username, + "password": password, + }) + resp := session.MakeRequest(t, req, http.StatusOK) + + htmlDoc := NewHTMLParser(t, resp.Body) + resultMsg := htmlDoc.doc.Find(".ui.message>p").Text() + + assert.EqualValues(t, message, resultMsg) +} + +func TestSignin(t *testing.T) { + prepareTestEnv(t) + + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) + + // add new user with user2's email + user.Name = "testuser" + user.LowerName = strings.ToLower(user.Name) + user.ID = 0 + models.AssertSuccessfulInsert(t, user) + + samples := []struct { + username string + password string + message string + }{ + {username: "wrongUsername", password: "wrongPassword", message: i18n.Tr("en", "form.username_password_incorrect")}, + {username: "wrongUsername", password: "password", message: i18n.Tr("en", "form.username_password_incorrect")}, + {username: "user15", password: "wrongPassword", message: i18n.Tr("en", "form.username_password_incorrect")}, + {username: "user1@example.com", password: "wrongPassword", message: i18n.Tr("en", "form.username_password_incorrect")}, + // test for duplicate email + {username: "user2@example.com", password: "password", message: i18n.Tr("en", "form.email_been_used")}, + } + + for _, s := range samples { + testLoginFailed(t, s.username, s.password, s.message) + } +} diff --git a/integrations/signup_test.go b/integrations/signup_test.go new file mode 100644 index 0000000..325c906 --- /dev/null +++ b/integrations/signup_test.go @@ -0,0 +1,30 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/modules/setting" +) + +func TestSignup(t *testing.T) { + prepareTestEnv(t) + + setting.Service.EnableCaptcha = false + + req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{ + "user_name": "exampleUser", + "email": "exampleUser@example.com", + "password": "examplePassword", + "retype": "examplePassword", + }) + MakeRequest(t, req, http.StatusFound) + + // should be able to view new user's page + req = NewRequest(t, "GET", "/exampleUser") + MakeRequest(t, req, http.StatusOK) +} diff --git a/integrations/sqlite.ini b/integrations/sqlite.ini new file mode 100644 index 0000000..799a44b --- /dev/null +++ b/integrations/sqlite.ini @@ -0,0 +1,54 @@ +APP_NAME = Gitea: Git with a cup of tea +RUN_MODE = prod + +[database] +DB_TYPE = sqlite3 +PATH = :memory: + +[repository] +ROOT = integrations/gitea-integration/gitea-repositories + +[server] +SSH_DOMAIN = localhost +HTTP_PORT = 3000 +ROOT_URL = http://localhost:3000/ +DISABLE_SSH = false +SSH_PORT = 22 +LFS_START_SERVER = false +OFFLINE_MODE = false + +[mailer] +ENABLED = false + +[service] +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = false +DISABLE_REGISTRATION = false +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +DEFAULT_KEEP_EMAIL_PRIVATE = false +DEFAULT_ALLOW_CREATE_ORGANIZATION = true +NO_REPLY_ADDRESS = noreply.example.org + +[picture] +DISABLE_GRAVATAR = false +ENABLE_FEDERATED_AVATAR = false + +[session] +PROVIDER = file + +[log] +MODE = console,file +ROOT_PATH = sqlite-log + +[log.console] +LEVEL = Warn + +[log.file] +LEVEL = Debug + +[security] +INSTALL_LOCK = true +SECRET_KEY = 9pCviYTWSb +INTERNAL_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYmYiOjE0OTI3OTU5ODN9.OQkH5UmzID2XBdwQ9TAI6Jj2t1X-wElVTjbE7aoN4I8 + diff --git a/integrations/user_test.go b/integrations/user_test.go new file mode 100644 index 0000000..ddb46da --- /dev/null +++ b/integrations/user_test.go @@ -0,0 +1,99 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/models" + + "github.com/Unknwon/i18n" + "github.com/stretchr/testify/assert" +) + +func TestViewUser(t *testing.T) { + prepareTestEnv(t) + + req := NewRequest(t, "GET", "/user2") + MakeRequest(t, req, http.StatusOK) +} + +func TestRenameUsername(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ + "_csrf": GetCSRF(t, session, "/user/settings"), + "name": "newUsername", + "email": "user2@example.com", + }) + session.MakeRequest(t, req, http.StatusFound) + + models.AssertExistsAndLoadBean(t, &models.User{Name: "newUsername"}) + models.AssertNotExistsBean(t, &models.User{Name: "user2"}) +} + +func TestRenameInvalidUsername(t *testing.T) { + prepareTestEnv(t) + + invalidUsernames := []string{ + "%2f*", + "%2f.", + "%2f..", + "%00", + "thisHas ASpace", + } + + session := loginUser(t, "user2") + for _, invalidUsername := range invalidUsernames { + t.Logf("Testing username %s", invalidUsername) + + req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ + "_csrf": GetCSRF(t, session, "/user/settings"), + "name": invalidUsername, + "email": "user2@example.com", + }) + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + assert.Contains(t, + htmlDoc.doc.Find(".ui.negative.message").Text(), + i18n.Tr("en", "form.alpha_dash_dot_error"), + ) + + models.AssertNotExistsBean(t, &models.User{Name: invalidUsername}) + } +} + +func TestRenameReservedUsername(t *testing.T) { + prepareTestEnv(t) + + reservedUsernames := []string{ + "help", + "user", + "template", + } + + session := loginUser(t, "user2") + for _, reservedUsername := range reservedUsernames { + t.Logf("Testing username %s", reservedUsername) + req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ + "_csrf": GetCSRF(t, session, "/user/settings"), + "name": reservedUsername, + "email": "user2@example.com", + }) + resp := session.MakeRequest(t, req, http.StatusFound) + + req = NewRequest(t, "GET", RedirectURL(t, resp)) + resp = session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + assert.Contains(t, + htmlDoc.doc.Find(".ui.negative.message").Text(), + i18n.Tr("en", "user.newName_reserved"), + ) + + models.AssertNotExistsBean(t, &models.User{Name: reservedUsername}) + } +} diff --git a/integrations/version_test.go b/integrations/version_test.go index beda5c3..95b4dbc 100644 --- a/integrations/version_test.go +++ b/integrations/version_test.go @@ -2,81 +2,26 @@ // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. -package integration +package integrations import ( - "encoding/json" - "fmt" - "log" "net/http" - "os" - "os/exec" - "path/filepath" - "strings" "testing" - "code.gitea.io/gitea/integrations/internal/utils" + "code.gitea.io/gitea/modules/setting" "code.gitea.io/sdk/gitea" "github.com/stretchr/testify/assert" ) -func version(t *utils.T) error { - var err error - - path, err := filepath.Abs(t.Config.Program) - if err != nil { - return err - } - - cmd := exec.Command(path, "--version") - out, err := cmd.Output() - if err != nil { - return err - } - - fields := strings.Fields(string(out)) - if !strings.HasPrefix(string(out), "Gitea version") { - return fmt.Errorf("unexpected version string '%s' of the gitea executable", out) - } - - expected := fields[2] - - var r *http.Response - r, err = http.Get("http://:" + ServerHTTPPort + "/api/v1/version") - if err != nil { - return err - } - defer r.Body.Close() - - if r.StatusCode != http.StatusOK { - return fmt.Errorf("'/api/v1/version': %s\n", r.Status) - } - - var v gitea.ServerVersion - - dec := json.NewDecoder(r.Body) - if err := dec.Decode(&v); err != nil { - return err - } - - actual := v.Version - - log.Printf("Actual: \"%s\" Expected: \"%s\"\n", actual, expected) - assert.Equal(t, expected, actual) - - return nil -} - func TestVersion(t *testing.T) { - conf := utils.Config{ - Program: "../gitea", - WorkDir: "", - Args: []string{"web", "--port", ServerHTTPPort}, - LogFile: os.Stderr, - } + prepareTestEnv(t) - if err := utils.New(t, &conf).RunTest(install, version); err != nil { - t.Fatal(err) - } + setting.AppVer = "1.1.0+dev" + req := NewRequest(t, "GET", "/api/v1/version") + resp := MakeRequest(t, req, http.StatusOK) + + var version gitea.ServerVersion + DecodeJSON(t, resp, &version) + assert.Equal(t, setting.AppVer, string(version.Version)) } diff --git a/integrations/xss_test.go b/integrations/xss_test.go new file mode 100644 index 0000000..d71c680 --- /dev/null +++ b/integrations/xss_test.go @@ -0,0 +1,37 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/models" + + "github.com/stretchr/testify/assert" +) + +func TestXSSUserFullName(t *testing.T) { + prepareTestEnv(t) + user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) + const fullName = `name & ` + + session := loginUser(t, user.Name) + req := NewRequestWithValues(t, "POST", "/user/settings", map[string]string{ + "_csrf": GetCSRF(t, session, "/user/settings"), + "name": user.Name, + "full_name": fullName, + "email": user.Email, + }) + session.MakeRequest(t, req, http.StatusFound) + + req = NewRequestf(t, "GET", "/%s", user.Name) + resp := session.MakeRequest(t, req, http.StatusOK) + htmlDoc := NewHTMLParser(t, resp.Body) + assert.EqualValues(t, 0, htmlDoc.doc.Find("script.evil").Length()) + assert.EqualValues(t, fullName, + htmlDoc.doc.Find("div.content").Find(".header.text.center").Text(), + ) +} diff --git a/main.go b/main.go index 383dbc2..f208c1d 100644 --- a/main.go +++ b/main.go @@ -17,7 +17,7 @@ import ( ) // Version holds the current Gitea version -var Version = "1.1.0+dev" +var Version = "1.2.0-dev" // Tags holds the build tags used var Tags = "" diff --git a/models/access.go b/models/access.go index 49a8838..98ead19 100644 --- a/models/access.go +++ b/models/access.go @@ -59,21 +59,21 @@ type Access struct { Mode AccessMode } -func accessLevel(e Engine, user *User, repo *Repository) (AccessMode, error) { +func accessLevel(e Engine, userID int64, repo *Repository) (AccessMode, error) { mode := AccessModeNone if !repo.IsPrivate { mode = AccessModeRead } - if user == nil { + if userID == 0 { return mode, nil } - if user.ID == repo.OwnerID { + if userID == repo.OwnerID { return AccessModeOwner, nil } - a := &Access{UserID: user.ID, RepoID: repo.ID} + a := &Access{UserID: userID, RepoID: repo.ID} if has, err := e.Get(a); !has || err != nil { return mode, err } @@ -81,19 +81,19 @@ func accessLevel(e Engine, user *User, repo *Repository) (AccessMode, error) { } // AccessLevel returns the Access a user has to a repository. Will return NoneAccess if the -// user does not have access. User can be nil! -func AccessLevel(user *User, repo *Repository) (AccessMode, error) { - return accessLevel(x, user, repo) +// user does not have access. +func AccessLevel(userID int64, repo *Repository) (AccessMode, error) { + return accessLevel(x, userID, repo) } -func hasAccess(e Engine, user *User, repo *Repository, testMode AccessMode) (bool, error) { - mode, err := accessLevel(e, user, repo) +func hasAccess(e Engine, userID int64, repo *Repository, testMode AccessMode) (bool, error) { + mode, err := accessLevel(e, userID, repo) return testMode <= mode, err } -// HasAccess returns true if someone has the request access level. User can be nil! -func HasAccess(user *User, repo *Repository, testMode AccessMode) (bool, error) { - return hasAccess(x, user, repo, testMode) +// HasAccess returns true if user has access to repo +func HasAccess(userID int64, repo *Repository, testMode AccessMode) (bool, error) { + return hasAccess(x, userID, repo, testMode) } type repoAccess struct { diff --git a/models/access_test.go b/models/access_test.go index 6b3cce5..59575ac 100644 --- a/models/access_test.go +++ b/models/access_test.go @@ -21,23 +21,23 @@ func TestAccessLevel(t *testing.T) { assert.NoError(t, PrepareTestDatabase()) user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) - user2 := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User) + user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository) repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository) - level, err := AccessLevel(user1, repo1) + level, err := AccessLevel(user1.ID, repo1) assert.NoError(t, err) assert.Equal(t, AccessModeOwner, level) - level, err = AccessLevel(user1, repo2) + level, err = AccessLevel(user1.ID, repo2) assert.NoError(t, err) assert.Equal(t, AccessModeWrite, level) - level, err = AccessLevel(user2, repo1) + level, err = AccessLevel(user2.ID, repo1) assert.NoError(t, err) assert.Equal(t, AccessModeRead, level) - level, err = AccessLevel(user2, repo2) + level, err = AccessLevel(user2.ID, repo2) assert.NoError(t, err) assert.Equal(t, AccessModeNone, level) } @@ -46,24 +46,24 @@ func TestHasAccess(t *testing.T) { assert.NoError(t, PrepareTestDatabase()) user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) - user2 := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User) + user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository) repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository) for _, accessMode := range accessModes { - has, err := HasAccess(user1, repo1, accessMode) + has, err := HasAccess(user1.ID, repo1, accessMode) assert.NoError(t, err) assert.True(t, has) - has, err = HasAccess(user1, repo2, accessMode) + has, err = HasAccess(user1.ID, repo2, accessMode) assert.NoError(t, err) assert.Equal(t, accessMode <= AccessModeWrite, has) - has, err = HasAccess(user2, repo1, accessMode) + has, err = HasAccess(user2.ID, repo1, accessMode) assert.NoError(t, err) assert.Equal(t, accessMode <= AccessModeRead, has) - has, err = HasAccess(user2, repo2, accessMode) + has, err = HasAccess(user2.ID, repo2, accessMode) assert.NoError(t, err) assert.Equal(t, accessMode <= AccessModeNone, has) } diff --git a/models/action.go b/models/action.go index 6f76cbc..32b3dbd 100644 --- a/models/action.go +++ b/models/action.go @@ -9,11 +9,13 @@ import ( "fmt" "path" "regexp" + "strconv" "strings" "time" "unicode" "github.com/Unknwon/com" + "github.com/go-xorm/builder" "github.com/go-xorm/xorm" "code.gitea.io/git" @@ -70,20 +72,21 @@ func init() { // repository. It implemented interface base.Actioner so that can be // used in template render. type Action struct { - ID int64 `xorm:"pk autoincr"` - UserID int64 `xorm:"INDEX"` // Receiver user id. - OpType ActionType - ActUserID int64 `xorm:"INDEX"` // Action user id. - ActUserName string // Action user name. - ActAvatar string `xorm:"-"` - RepoID int64 `xorm:"INDEX"` - RepoUserName string - RepoName string - RefName string - IsPrivate bool `xorm:"INDEX NOT NULL DEFAULT false"` - Content string `xorm:"TEXT"` - Created time.Time `xorm:"-"` - CreatedUnix int64 `xorm:"INDEX"` + ID int64 `xorm:"pk autoincr"` + UserID int64 `xorm:"INDEX"` // Receiver user id. + OpType ActionType + ActUserID int64 `xorm:"INDEX"` // Action user id. + ActUser *User `xorm:"-"` + RepoID int64 `xorm:"INDEX"` + Repo *Repository `xorm:"-"` + CommentID int64 `xorm:"INDEX"` + Comment *Comment `xorm:"-"` + IsDeleted bool `xorm:"INDEX NOT NULL DEFAULT false"` + RefName string + IsPrivate bool `xorm:"INDEX NOT NULL DEFAULT false"` + Content string `xorm:"TEXT"` + Created time.Time `xorm:"-"` + CreatedUnix int64 `xorm:"INDEX"` } // BeforeInsert will be invoked by XORM before inserting a record @@ -106,42 +109,77 @@ func (a *Action) GetOpType() int { return int(a.OpType) } +func (a *Action) loadActUser() { + if a.ActUser != nil { + return + } + var err error + a.ActUser, err = GetUserByID(a.ActUserID) + if err == nil { + return + } else if IsErrUserNotExist(err) { + a.ActUser = NewGhostUser() + } else { + log.Error(4, "GetUserByID(%d): %v", a.ActUserID, err) + } +} + +func (a *Action) loadRepo() { + if a.Repo != nil { + return + } + var err error + a.Repo, err = GetRepositoryByID(a.RepoID) + if err != nil { + log.Error(4, "GetRepositoryByID(%d): %v", a.RepoID, err) + } +} + // GetActUserName gets the action's user name. func (a *Action) GetActUserName() string { - return a.ActUserName + a.loadActUser() + return a.ActUser.Name } // ShortActUserName gets the action's user name trimmed to max 20 // chars. func (a *Action) ShortActUserName() string { - return base.EllipsisString(a.ActUserName, 20) + return base.EllipsisString(a.GetActUserName(), 20) +} + +// GetActAvatar the action's user's avatar link +func (a *Action) GetActAvatar() string { + a.loadActUser() + return a.ActUser.AvatarLink() } // GetRepoUserName returns the name of the action repository owner. func (a *Action) GetRepoUserName() string { - return a.RepoUserName + a.loadRepo() + return a.Repo.MustOwner().Name } // ShortRepoUserName returns the name of the action repository owner // trimmed to max 20 chars. func (a *Action) ShortRepoUserName() string { - return base.EllipsisString(a.RepoUserName, 20) + return base.EllipsisString(a.GetRepoUserName(), 20) } // GetRepoName returns the name of the action repository. func (a *Action) GetRepoName() string { - return a.RepoName + a.loadRepo() + return a.Repo.Name } // ShortRepoName returns the name of the action repository // trimmed to max 33 chars. func (a *Action) ShortRepoName() string { - return base.EllipsisString(a.RepoName, 33) + return base.EllipsisString(a.GetRepoName(), 33) } // GetRepoPath returns the virtual path to the action repository. func (a *Action) GetRepoPath() string { - return path.Join(a.RepoUserName, a.RepoName) + return path.Join(a.GetRepoUserName(), a.GetRepoName()) } // ShortRepoPath returns the virtual path to the action repository @@ -158,6 +196,35 @@ func (a *Action) GetRepoLink() string { return "/" + a.GetRepoPath() } +// GetCommentLink returns link to action comment. +func (a *Action) GetCommentLink() string { + if a == nil { + return "#" + } + if a.Comment == nil && a.CommentID != 0 { + a.Comment, _ = GetCommentByID(a.CommentID) + } + if a.Comment != nil { + return a.Comment.HTMLURL() + } + if len(a.GetIssueInfos()) == 0 { + return "#" + } + //Return link to issue + issueIDString := a.GetIssueInfos()[0] + issueID, err := strconv.ParseInt(issueIDString, 10, 64) + if err != nil { + return "#" + } + + issue, err := GetIssueByID(issueID) + if err != nil { + return "#" + } + + return issue.HTMLURL() +} + // GetBranch returns the action's repository branch. func (a *Action) GetBranch() string { return a.RefName @@ -205,13 +272,12 @@ func (a *Action) GetIssueContent() string { func newRepoAction(e Engine, u *User, repo *Repository) (err error) { if err = notifyWatchers(e, &Action{ - ActUserID: u.ID, - ActUserName: u.Name, - OpType: ActionCreateRepo, - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, + ActUserID: u.ID, + ActUser: u, + OpType: ActionCreateRepo, + RepoID: repo.ID, + Repo: repo, + IsPrivate: repo.IsPrivate, }); err != nil { return fmt.Errorf("notify watchers '%d/%d': %v", u.ID, repo.ID, err) } @@ -227,14 +293,13 @@ func NewRepoAction(u *User, repo *Repository) (err error) { func renameRepoAction(e Engine, actUser *User, oldRepoName string, repo *Repository) (err error) { if err = notifyWatchers(e, &Action{ - ActUserID: actUser.ID, - ActUserName: actUser.Name, - OpType: ActionRenameRepo, - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, - Content: oldRepoName, + ActUserID: actUser.ID, + ActUser: actUser, + OpType: ActionRenameRepo, + RepoID: repo.ID, + Repo: repo, + IsPrivate: repo.IsPrivate, + Content: oldRepoName, }); err != nil { return fmt.Errorf("notify watchers: %v", err) } @@ -360,7 +425,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err issue, err := GetIssueByRef(ref) if err != nil { - if IsErrIssueNotExist(err) || err == errMissingIssueNumber { + if IsErrIssueNotExist(err) || err == errMissingIssueNumber || err == errInvalidIssueNumber { continue } return err @@ -398,7 +463,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err issue, err := GetIssueByRef(ref) if err != nil { - if IsErrIssueNotExist(err) || err == errMissingIssueNumber { + if IsErrIssueNotExist(err) || err == errMissingIssueNumber || err == errInvalidIssueNumber { continue } return err @@ -438,7 +503,7 @@ func UpdateIssuesCommit(doer *User, repo *Repository, commits []*PushCommit) err issue, err := GetIssueByRef(ref) if err != nil { - if IsErrIssueNotExist(err) || err == errMissingIssueNumber { + if IsErrIssueNotExist(err) || err == errMissingIssueNumber || err == errInvalidIssueNumber { continue } return err @@ -486,7 +551,7 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { } // Change repository bare status and update last updated time. - repo.IsBare = false + repo.IsBare = repo.IsBare && opts.Commits.Len <= 0 if err = UpdateRepository(repo, false); err != nil { return fmt.Errorf("UpdateRepository: %v", err) } @@ -521,15 +586,14 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { refName := git.RefEndName(opts.RefFullName) if err = NotifyWatchers(&Action{ - ActUserID: pusher.ID, - ActUserName: pusher.Name, - OpType: opType, - Content: string(data), - RepoID: repo.ID, - RepoUserName: repo.MustOwner().Name, - RepoName: repo.Name, - RefName: refName, - IsPrivate: repo.IsPrivate, + ActUserID: pusher.ID, + ActUser: pusher, + OpType: opType, + Content: string(data), + RepoID: repo.ID, + Repo: repo, + RefName: refName, + IsPrivate: repo.IsPrivate, }); err != nil { return fmt.Errorf("NotifyWatchers: %v", err) } @@ -598,14 +662,13 @@ func CommitRepoAction(opts CommitRepoActionOptions) error { func transferRepoAction(e Engine, doer, oldOwner *User, repo *Repository) (err error) { if err = notifyWatchers(e, &Action{ - ActUserID: doer.ID, - ActUserName: doer.Name, - OpType: ActionTransferRepo, - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, - Content: path.Join(oldOwner.Name, repo.Name), + ActUserID: doer.ID, + ActUser: doer, + OpType: ActionTransferRepo, + RepoID: repo.ID, + Repo: repo, + IsPrivate: repo.IsPrivate, + Content: path.Join(oldOwner.Name, repo.Name), }); err != nil { return fmt.Errorf("notifyWatchers: %v", err) } @@ -628,14 +691,13 @@ func TransferRepoAction(doer, oldOwner *User, repo *Repository) error { func mergePullRequestAction(e Engine, doer *User, repo *Repository, issue *Issue) error { return notifyWatchers(e, &Action{ - ActUserID: doer.ID, - ActUserName: doer.Name, - OpType: ActionMergePullRequest, - Content: fmt.Sprintf("%d|%s", issue.Index, issue.Title), - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, + ActUserID: doer.ID, + ActUser: doer, + OpType: ActionMergePullRequest, + Content: fmt.Sprintf("%d|%s", issue.Index, issue.Title), + RepoID: repo.ID, + Repo: repo, + IsPrivate: repo.IsPrivate, }) } @@ -644,33 +706,45 @@ func MergePullRequestAction(actUser *User, repo *Repository, pull *Issue) error return mergePullRequestAction(x, actUser, repo, pull) } -// GetFeeds returns action list of given user in given context. -// actorID is the user who's requesting, ctxUserID is the user/org that is requested. -// actorID can be -1 when isProfile is true or to skip the permission check. -func GetFeeds(ctxUser *User, actorID, offset int64, isProfile bool) ([]*Action, error) { - actions := make([]*Action, 0, 20) - sess := x. - Limit(20, int(offset)). - Desc("id"). - Where("user_id = ?", ctxUser.ID) - if isProfile { - sess. - And("is_private = ?", false). - And("act_user_id = ?", ctxUser.ID) - } else if actorID != -1 && ctxUser.IsOrganization() { - env, err := ctxUser.AccessibleReposEnv(actorID) +// GetFeedsOptions options for retrieving feeds +type GetFeedsOptions struct { + RequestedUser *User + RequestingUserID int64 + IncludePrivate bool // include private actions + OnlyPerformedBy bool // only actions performed by requested user + IncludeDeleted bool // include deleted actions +} + +// GetFeeds returns actions according to the provided options +func GetFeeds(opts GetFeedsOptions) ([]*Action, error) { + cond := builder.NewCond() + + var repoIDs []int64 + if opts.RequestedUser.IsOrganization() { + env, err := opts.RequestedUser.AccessibleReposEnv(opts.RequestingUserID) if err != nil { return nil, fmt.Errorf("AccessibleReposEnv: %v", err) } - repoIDs, err := env.RepoIDs(1, ctxUser.NumRepos) - if err != nil { + if repoIDs, err = env.RepoIDs(1, opts.RequestedUser.NumRepos); err != nil { return nil, fmt.Errorf("GetUserRepositories: %v", err) } - if len(repoIDs) > 0 { - sess.In("repo_id", repoIDs) - } + + cond = cond.And(builder.In("repo_id", repoIDs)) } - err := sess.Find(&actions) - return actions, err + cond = cond.And(builder.Eq{"user_id": opts.RequestedUser.ID}) + + if opts.OnlyPerformedBy { + cond = cond.And(builder.Eq{"act_user_id": opts.RequestedUser.ID}) + } + if !opts.IncludePrivate { + cond = cond.And(builder.Eq{"is_private": false}) + } + + if !opts.IncludeDeleted { + cond = cond.And(builder.Eq{"is_deleted": false}) + } + + actions := make([]*Action, 0, 20) + return actions, x.Limit(20).Desc("id").Where(cond).Find(&actions) } diff --git a/models/action_test.go b/models/action_test.go index cb36966..431469e 100644 --- a/models/action_test.go +++ b/models/action_test.go @@ -1,6 +1,7 @@ package models import ( + "path" "strings" "testing" @@ -10,22 +11,21 @@ import ( ) func TestAction_GetRepoPath(t *testing.T) { - action := &Action{ - RepoUserName: "username", - RepoName: "reponame", - } - assert.Equal(t, "username/reponame", action.GetRepoPath()) + assert.NoError(t, PrepareTestDatabase()) + repo := AssertExistsAndLoadBean(t, &Repository{}).(*Repository) + owner := AssertExistsAndLoadBean(t, &User{ID: repo.OwnerID}).(*User) + action := &Action{RepoID: repo.ID} + assert.Equal(t, path.Join(owner.Name, repo.Name), action.GetRepoPath()) } func TestAction_GetRepoLink(t *testing.T) { - action := &Action{ - RepoUserName: "username", - RepoName: "reponame", - } + assert.NoError(t, PrepareTestDatabase()) + repo := AssertExistsAndLoadBean(t, &Repository{}).(*Repository) + owner := AssertExistsAndLoadBean(t, &User{ID: repo.OwnerID}).(*User) + action := &Action{RepoID: repo.ID} setting.AppSubURL = "/suburl/" - assert.Equal(t, "/suburl/username/reponame", action.GetRepoLink()) - setting.AppSubURL = "" - assert.Equal(t, "/username/reponame", action.GetRepoLink()) + expected := path.Join(setting.AppSubURL, owner.Name, repo.Name) + assert.Equal(t, expected, action.GetRepoLink()) } func TestNewRepoAction(t *testing.T) { @@ -36,13 +36,12 @@ func TestNewRepoAction(t *testing.T) { repo.Owner = user actionBean := &Action{ - OpType: ActionCreateRepo, - ActUserID: user.ID, - RepoID: repo.ID, - ActUserName: user.Name, - RepoName: repo.Name, - RepoUserName: repo.Owner.Name, - IsPrivate: repo.IsPrivate, + OpType: ActionCreateRepo, + ActUserID: user.ID, + RepoID: repo.ID, + ActUser: user, + Repo: repo, + IsPrivate: repo.IsPrivate, } AssertNotExistsBean(t, actionBean) @@ -64,14 +63,13 @@ func TestRenameRepoAction(t *testing.T) { repo.LowerName = strings.ToLower(newRepoName) actionBean := &Action{ - OpType: ActionRenameRepo, - ActUserID: user.ID, - ActUserName: user.Name, - RepoID: repo.ID, - RepoName: repo.Name, - RepoUserName: repo.Owner.Name, - IsPrivate: repo.IsPrivate, - Content: oldRepoName, + OpType: ActionRenameRepo, + ActUserID: user.ID, + ActUser: user, + RepoID: repo.ID, + Repo: repo, + IsPrivate: repo.IsPrivate, + Content: oldRepoName, } AssertNotExistsBean(t, actionBean) assert.NoError(t, RenameRepoAction(user, oldRepoName, repo)) @@ -163,7 +161,7 @@ func TestUpdateIssuesCommit(t *testing.T) { CommitterName: "User Two", AuthorEmail: "user4@example.com", AuthorName: "User Four", - Message: "start working on #1", + Message: "start working on #FST-1, #1", }, { Sha1: "abcdef2", @@ -232,13 +230,13 @@ func TestCommitRepoAction(t *testing.T) { pushCommits.Len = len(pushCommits.Commits) actionBean := &Action{ - OpType: ActionCommitRepo, - ActUserID: user.ID, - ActUserName: user.Name, - RepoID: repo.ID, - RepoName: repo.Name, - RefName: "refName", - IsPrivate: repo.IsPrivate, + OpType: ActionCommitRepo, + ActUserID: user.ID, + ActUser: user, + RepoID: repo.ID, + Repo: repo, + RefName: "refName", + IsPrivate: repo.IsPrivate, } AssertNotExistsBean(t, actionBean) assert.NoError(t, CommitRepoAction(CommitRepoActionOptions{ @@ -265,13 +263,12 @@ func TestTransferRepoAction(t *testing.T) { repo.Owner = user4 actionBean := &Action{ - OpType: ActionTransferRepo, - ActUserID: user2.ID, - ActUserName: user2.Name, - RepoID: repo.ID, - RepoName: repo.Name, - RepoUserName: repo.Owner.Name, - IsPrivate: repo.IsPrivate, + OpType: ActionTransferRepo, + ActUserID: user2.ID, + ActUser: user2, + RepoID: repo.ID, + Repo: repo, + IsPrivate: repo.IsPrivate, } AssertNotExistsBean(t, actionBean) assert.NoError(t, TransferRepoAction(user2, user2, repo)) @@ -290,13 +287,12 @@ func TestMergePullRequestAction(t *testing.T) { issue := AssertExistsAndLoadBean(t, &Issue{ID: 3, RepoID: repo.ID}).(*Issue) actionBean := &Action{ - OpType: ActionMergePullRequest, - ActUserID: user.ID, - ActUserName: user.Name, - RepoID: repo.ID, - RepoName: repo.Name, - RepoUserName: repo.Owner.Name, - IsPrivate: repo.IsPrivate, + OpType: ActionMergePullRequest, + ActUserID: user.ID, + ActUser: user, + RepoID: repo.ID, + Repo: repo, + IsPrivate: repo.IsPrivate, } AssertNotExistsBean(t, actionBean) assert.NoError(t, MergePullRequestAction(user, repo, issue)) @@ -309,13 +305,24 @@ func TestGetFeeds(t *testing.T) { assert.NoError(t, PrepareTestDatabase()) user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) - actions, err := GetFeeds(user, user.ID, 0, false) + actions, err := GetFeeds(GetFeedsOptions{ + RequestedUser: user, + RequestingUserID: user.ID, + IncludePrivate: true, + OnlyPerformedBy: false, + IncludeDeleted: true, + }) assert.NoError(t, err) assert.Len(t, actions, 1) - assert.Equal(t, int64(1), actions[0].ID) - assert.Equal(t, user.ID, actions[0].UserID) + assert.EqualValues(t, 1, actions[0].ID) + assert.EqualValues(t, user.ID, actions[0].UserID) - actions, err = GetFeeds(user, user.ID, 0, true) + actions, err = GetFeeds(GetFeedsOptions{ + RequestedUser: user, + RequestingUserID: user.ID, + IncludePrivate: false, + OnlyPerformedBy: false, + }) assert.NoError(t, err) assert.Len(t, actions, 0) } @@ -323,15 +330,28 @@ func TestGetFeeds(t *testing.T) { func TestGetFeeds2(t *testing.T) { // test with an organization user assert.NoError(t, PrepareTestDatabase()) - user := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User) + org := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User) + userID := AssertExistsAndLoadBean(t, &OrgUser{OrgID: org.ID, IsOwner: true}).(*OrgUser).UID - actions, err := GetFeeds(user, user.ID, 0, false) + actions, err := GetFeeds(GetFeedsOptions{ + RequestedUser: org, + RequestingUserID: userID, + IncludePrivate: true, + OnlyPerformedBy: false, + IncludeDeleted: true, + }) assert.NoError(t, err) assert.Len(t, actions, 1) - assert.Equal(t, int64(2), actions[0].ID) - assert.Equal(t, user.ID, actions[0].UserID) + assert.EqualValues(t, 2, actions[0].ID) + assert.EqualValues(t, org.ID, actions[0].UserID) - actions, err = GetFeeds(user, user.ID, 0, true) + actions, err = GetFeeds(GetFeedsOptions{ + RequestedUser: org, + RequestingUserID: userID, + IncludePrivate: false, + OnlyPerformedBy: false, + IncludeDeleted: true, + }) assert.NoError(t, err) assert.Len(t, actions, 0) } diff --git a/models/admin.go b/models/admin.go index e573c9b..f864520 100644 --- a/models/admin.go +++ b/models/admin.go @@ -6,16 +6,13 @@ package models import ( "fmt" - "os" - "os/exec" - "strings" "time" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/util" + "github.com/Unknwon/com" "github.com/go-xorm/xorm" - - "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/setting" ) //NoticeType describes the notice type @@ -79,19 +76,7 @@ func RemoveAllWithNotice(title, path string) { } func removeAllWithNotice(e Engine, title, path string) { - var err error - // workaround for Go not being able to remove read-only files/folders: https://github.com/golang/go/issues/9606 - // this bug should be fixed on Go 1.7, so the workaround should be removed when Gogs don't support Go 1.6 anymore: - // https://github.com/golang/go/commit/2ffb3e5d905b5622204d199128dec06cefd57790 - if setting.IsWindows { - // converting "/" to "\" in path on Windows - path = strings.Replace(path, "/", "\\", -1) - err = exec.Command("cmd", "/C", "rmdir", "/S", "/Q", path).Run() - } else { - err = os.RemoveAll(path) - } - - if err != nil { + if err := util.RemoveAll(path); err != nil { desc := fmt.Sprintf("%s [%s]: %v", title, path, err) log.Warn(desc) if err = createNotice(e, NoticeRepository, desc); err != nil { diff --git a/models/attachment.go b/models/attachment.go index 5fd90be..3b3521b 100644 --- a/models/attachment.go +++ b/models/attachment.go @@ -20,15 +20,15 @@ import ( // Attachment represent a attachment of issue/comment/release. type Attachment struct { - ID int64 `xorm:"pk autoincr"` - UUID string `xorm:"uuid UNIQUE"` - IssueID int64 `xorm:"INDEX"` - CommentID int64 - ReleaseID int64 `xorm:"INDEX"` - Name string - - Created time.Time `xorm:"-"` - CreatedUnix int64 + ID int64 `xorm:"pk autoincr"` + UUID string `xorm:"uuid UNIQUE"` + IssueID int64 `xorm:"INDEX"` + ReleaseID int64 `xorm:"INDEX"` + CommentID int64 + Name string + DownloadCount int64 `xorm:"DEFAULT 0"` + Created time.Time `xorm:"-"` + CreatedUnix int64 } // BeforeInsert is invoked from XORM before inserting an object of this type. @@ -45,6 +45,19 @@ func (a *Attachment) AfterSet(colName string, _ xorm.Cell) { } } +// IncreaseDownloadCount is update download count + 1 +func (a *Attachment) IncreaseDownloadCount() error { + sess := x.NewSession() + defer sess.Close() + + // Update download count. + if _, err := sess.Exec("UPDATE `attachment` SET download_count=download_count+1 WHERE id=?", a.ID); err != nil { + return fmt.Errorf("increase attachment count: %v", err) + } + + return nil +} + // AttachmentLocalPath returns where attachment is stored in local file // system based on given UUID. func AttachmentLocalPath(uuid string) string { diff --git a/models/attachment_test.go b/models/attachment_test.go new file mode 100644 index 0000000..d568e39 --- /dev/null +++ b/models/attachment_test.go @@ -0,0 +1,60 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIncreaseDownloadCount(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + attachment, err := GetAttachmentByUUID("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11") + assert.NoError(t, err) + assert.Equal(t, int64(0), attachment.DownloadCount) + + // increase download count + err = attachment.IncreaseDownloadCount() + assert.NoError(t, err) + + attachment, err = GetAttachmentByUUID("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11") + assert.NoError(t, err) + assert.Equal(t, int64(1), attachment.DownloadCount) +} + +func TestGetByCommentOrIssueID(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + // count of attachments from issue ID + attachments, err := GetAttachmentsByIssueID(1) + assert.NoError(t, err) + assert.Equal(t, 2, len(attachments)) + + attachments, err = GetAttachmentsByCommentID(1) + assert.NoError(t, err) + assert.Equal(t, 2, len(attachments)) +} + +func TestDeleteAttachments(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + count, err := DeleteAttachmentsByIssue(4, false) + assert.NoError(t, err) + assert.Equal(t, 1, count) + + count, err = DeleteAttachmentsByComment(2, false) + assert.NoError(t, err) + assert.Equal(t, 2, count) + + err = DeleteAttachment(&Attachment{ID: 8}, false) + assert.NoError(t, err) + + attachment, err := GetAttachmentByUUID("a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18") + assert.Error(t, err) + assert.True(t, IsErrAttachmentNotExist(err)) + assert.Nil(t, attachment) +} diff --git a/models/branches.go b/models/branches.go index 89a6996..383aa82 100644 --- a/models/branches.go +++ b/models/branches.go @@ -17,10 +17,10 @@ const ( // ProtectedBranch struct type ProtectedBranch struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 `xorm:"UNIQUE(s)"` - BranchName string `xorm:"UNIQUE(s)"` - CanPush bool + ID int64 `xorm:"pk autoincr"` + RepoID int64 `xorm:"UNIQUE(s)"` + BranchName string `xorm:"UNIQUE(s)"` + CanPush bool `xorm:"NOT NULL DEFAULT false"` Created time.Time `xorm:"-"` CreatedUnix int64 Updated time.Time `xorm:"-"` @@ -38,6 +38,11 @@ func (protectBranch *ProtectedBranch) BeforeUpdate() { protectBranch.UpdatedUnix = time.Now().Unix() } +// IsProtected returns if the branch is protected +func (protectBranch *ProtectedBranch) IsProtected() bool { + return protectBranch.ID > 0 +} + // GetProtectedBranchByRepoID getting protected branch by repo ID func GetProtectedBranchByRepoID(RepoID int64) ([]*ProtectedBranch, error) { protectedBranches := make([]*ProtectedBranch, 0) @@ -57,12 +62,29 @@ func GetProtectedBranchBy(repoID int64, BranchName string) (*ProtectedBranch, er return rel, nil } -// GetProtectedBranches get all protected btanches +// GetProtectedBranches get all protected branches func (repo *Repository) GetProtectedBranches() ([]*ProtectedBranch, error) { protectedBranches := make([]*ProtectedBranch, 0) return protectedBranches, x.Find(&protectedBranches, &ProtectedBranch{RepoID: repo.ID}) } +// IsProtectedBranch checks if branch is protected +func (repo *Repository) IsProtectedBranch(branchName string) (bool, error) { + protectedBranch := &ProtectedBranch{ + RepoID: repo.ID, + BranchName: branchName, + } + + has, err := x.Get(protectedBranch) + if err != nil { + return true, err + } else if has { + return true, nil + } + + return false, nil +} + // AddProtectedBranch add protection to branch func (repo *Repository) AddProtectedBranch(branchName string, canPush bool) error { protectedBranch := &ProtectedBranch{ @@ -78,7 +100,7 @@ func (repo *Repository) AddProtectedBranch(branchName string, canPush bool) erro } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -109,7 +131,7 @@ func (repo *Repository) ChangeProtectedBranch(id int64, canPush bool) error { ProtectedBranch.CanPush = canPush sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -129,7 +151,7 @@ func (repo *Repository) DeleteProtectedBranch(id int64) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } diff --git a/models/consistency_test.go b/models/consistency.go similarity index 83% rename from models/consistency_test.go rename to models/consistency.go index a8de8e3..0c279ea 100644 --- a/models/consistency_test.go +++ b/models/consistency.go @@ -12,9 +12,9 @@ import ( "github.com/stretchr/testify/assert" ) -// ConsistencyCheckable a type that can be tested for database consistency -type ConsistencyCheckable interface { - CheckForConsistency(t *testing.T) +// consistencyCheckable a type that can be tested for database consistency +type consistencyCheckable interface { + checkForConsistency(t *testing.T) } // CheckConsistencyForAll test that the entire database is consistent @@ -44,12 +44,12 @@ func CheckConsistencyFor(t *testing.T, beansToCheck ...interface{}) { for i := 0; i < sliceValue.Len(); i++ { entity := sliceValue.Index(i).Interface() - checkable, ok := entity.(ConsistencyCheckable) + checkable, ok := entity.(consistencyCheckable) if !ok { t.Errorf("Expected %+v (of type %T) to be checkable for consistency", entity, entity) } else { - checkable.CheckForConsistency(t) + checkable.checkForConsistency(t) } } } @@ -68,7 +68,7 @@ func assertCount(t *testing.T, bean interface{}, expected int) { "Failed consistency test, the counted bean (of type %T) was %+v", bean, bean) } -func (user *User) CheckForConsistency(t *testing.T) { +func (user *User) checkForConsistency(t *testing.T) { assertCount(t, &Repository{OwnerID: user.ID}, user.NumRepos) assertCount(t, &Star{UID: user.ID}, user.NumStars) assertCount(t, &OrgUser{OrgID: user.ID}, user.NumMembers) @@ -81,7 +81,7 @@ func (user *User) CheckForConsistency(t *testing.T) { } } -func (repo *Repository) CheckForConsistency(t *testing.T) { +func (repo *Repository) checkForConsistency(t *testing.T) { assert.Equal(t, repo.LowerName, strings.ToLower(repo.Name), "repo: %+v", repo) assertCount(t, &Star{RepoID: repo.ID}, repo.NumStars) assertCount(t, &Watch{RepoID: repo.ID}, repo.NumWatches) @@ -112,7 +112,7 @@ func (repo *Repository) CheckForConsistency(t *testing.T) { "Unexpected number of closed milestones for repo %+v", repo) } -func (issue *Issue) CheckForConsistency(t *testing.T) { +func (issue *Issue) checkForConsistency(t *testing.T) { actual := getCount(t, x.Where("type=?", CommentTypeComment), &Comment{IssueID: issue.ID}) assert.EqualValues(t, issue.NumComments, actual, "Unexpected number of comments for issue %+v", issue) @@ -122,13 +122,13 @@ func (issue *Issue) CheckForConsistency(t *testing.T) { } } -func (pr *PullRequest) CheckForConsistency(t *testing.T) { +func (pr *PullRequest) checkForConsistency(t *testing.T) { issue := AssertExistsAndLoadBean(t, &Issue{ID: pr.IssueID}).(*Issue) assert.True(t, issue.IsPull) assert.EqualValues(t, issue.Index, pr.Index) } -func (milestone *Milestone) CheckForConsistency(t *testing.T) { +func (milestone *Milestone) checkForConsistency(t *testing.T) { assertCount(t, &Issue{MilestoneID: milestone.ID}, milestone.NumIssues) actual := getCount(t, x.Where("is_closed=?", true), &Issue{MilestoneID: milestone.ID}) @@ -136,7 +136,7 @@ func (milestone *Milestone) CheckForConsistency(t *testing.T) { "Unexpected number of closed issues for milestone %+v", milestone) } -func (label *Label) CheckForConsistency(t *testing.T) { +func (label *Label) checkForConsistency(t *testing.T) { issueLabels := make([]*IssueLabel, 0, 10) assert.NoError(t, x.Find(&issueLabels, &IssueLabel{LabelID: label.ID})) assert.EqualValues(t, label.NumIssues, len(issueLabels), @@ -155,18 +155,12 @@ func (label *Label) CheckForConsistency(t *testing.T) { "Unexpected number of closed issues for label %+v", label) } -func (team *Team) CheckForConsistency(t *testing.T) { +func (team *Team) checkForConsistency(t *testing.T) { assertCount(t, &TeamUser{TeamID: team.ID}, team.NumMembers) assertCount(t, &TeamRepo{TeamID: team.ID}, team.NumRepos) } -func (action *Action) CheckForConsistency(t *testing.T) { +func (action *Action) checkForConsistency(t *testing.T) { repo := AssertExistsAndLoadBean(t, &Repository{ID: action.RepoID}).(*Repository) - owner := AssertExistsAndLoadBean(t, &User{ID: repo.OwnerID}).(*User) - actor := AssertExistsAndLoadBean(t, &User{ID: action.ActUserID}).(*User) - - assert.Equal(t, repo.Name, action.RepoName, "action: %+v", action) assert.Equal(t, repo.IsPrivate, action.IsPrivate, "action: %+v", action) - assert.Equal(t, owner.Name, action.RepoUserName, "action: %+v", action) - assert.Equal(t, actor.Name, action.ActUserName, "action: %+v", action) } diff --git a/models/error.go b/models/error.go index 472c8c9..74551ad 100644 --- a/models/error.go +++ b/models/error.go @@ -93,6 +93,21 @@ func (err ErrEmailAlreadyUsed) Error() string { return fmt.Sprintf("e-mail has been used [email: %s]", err.Email) } +// ErrOpenIDAlreadyUsed represents a "OpenIDAlreadyUsed" kind of error. +type ErrOpenIDAlreadyUsed struct { + OpenID string +} + +// IsErrOpenIDAlreadyUsed checks if an error is a ErrOpenIDAlreadyUsed. +func IsErrOpenIDAlreadyUsed(err error) bool { + _, ok := err.(ErrOpenIDAlreadyUsed) + return ok +} + +func (err ErrOpenIDAlreadyUsed) Error() string { + return fmt.Sprintf("OpenID has been used [oid: %s]", err.OpenID) +} + // ErrUserOwnRepos represents a "UserOwnRepos" kind of error. type ErrUserOwnRepos struct { UID int64 @@ -245,6 +260,84 @@ func (err ErrKeyNameAlreadyUsed) Error() string { return fmt.Sprintf("public key already exists [owner_id: %d, name: %s]", err.OwnerID, err.Name) } +// ErrGPGEmailNotFound represents a "ErrGPGEmailNotFound" kind of error. +type ErrGPGEmailNotFound struct { + Email string +} + +// IsErrGPGEmailNotFound checks if an error is a ErrGPGEmailNotFound. +func IsErrGPGEmailNotFound(err error) bool { + _, ok := err.(ErrGPGEmailNotFound) + return ok +} + +func (err ErrGPGEmailNotFound) Error() string { + return fmt.Sprintf("failed to found email or is not confirmed : %s", err.Email) +} + +// ErrGPGKeyParsing represents a "ErrGPGKeyParsing" kind of error. +type ErrGPGKeyParsing struct { + ParseError error +} + +// IsErrGPGKeyParsing checks if an error is a ErrGPGKeyParsing. +func IsErrGPGKeyParsing(err error) bool { + _, ok := err.(ErrGPGKeyParsing) + return ok +} + +func (err ErrGPGKeyParsing) Error() string { + return fmt.Sprintf("failed to parse gpg key %s", err.ParseError.Error()) +} + +// ErrGPGKeyNotExist represents a "GPGKeyNotExist" kind of error. +type ErrGPGKeyNotExist struct { + ID int64 +} + +// IsErrGPGKeyNotExist checks if an error is a ErrGPGKeyNotExist. +func IsErrGPGKeyNotExist(err error) bool { + _, ok := err.(ErrGPGKeyNotExist) + return ok +} + +func (err ErrGPGKeyNotExist) Error() string { + return fmt.Sprintf("public gpg key does not exist [id: %d]", err.ID) +} + +// ErrGPGKeyIDAlreadyUsed represents a "GPGKeyIDAlreadyUsed" kind of error. +type ErrGPGKeyIDAlreadyUsed struct { + KeyID string +} + +// IsErrGPGKeyIDAlreadyUsed checks if an error is a ErrKeyNameAlreadyUsed. +func IsErrGPGKeyIDAlreadyUsed(err error) bool { + _, ok := err.(ErrGPGKeyIDAlreadyUsed) + return ok +} + +func (err ErrGPGKeyIDAlreadyUsed) Error() string { + return fmt.Sprintf("public key already exists [key_id: %s]", err.KeyID) +} + +// ErrGPGKeyAccessDenied represents a "GPGKeyAccessDenied" kind of Error. +type ErrGPGKeyAccessDenied struct { + UserID int64 + KeyID int64 +} + +// IsErrGPGKeyAccessDenied checks if an error is a ErrGPGKeyAccessDenied. +func IsErrGPGKeyAccessDenied(err error) bool { + _, ok := err.(ErrGPGKeyAccessDenied) + return ok +} + +// Error pretty-prints an error of type ErrGPGKeyAccessDenied. +func (err ErrGPGKeyAccessDenied) Error() string { + return fmt.Sprintf("user does not have access to the key [user_id: %d, key_id: %d]", + err.UserID, err.KeyID) +} + // ErrKeyAccessDenied represents a "KeyAccessDenied" kind of error. type ErrKeyAccessDenied struct { UserID int64 @@ -355,6 +448,22 @@ func (err ErrAccessTokenEmpty) Error() string { // \_______ /__| \___ (____ /___| /__/_____ \(____ /__| |__|\____/|___| / // \/ /_____/ \/ \/ \/ \/ \/ +// ErrOrgNotExist represents a "OrgNotExist" kind of error. +type ErrOrgNotExist struct { + ID int64 + Name string +} + +// IsErrOrgNotExist checks if an error is a ErrOrgNotExist. +func IsErrOrgNotExist(err error) bool { + _, ok := err.(ErrOrgNotExist) + return ok +} + +func (err ErrOrgNotExist) Error() string { + return fmt.Sprintf("org does not exist [id: %d, name: %s]", err.ID, err.Name) +} + // ErrLastOrgOwner represents a "LastOrgOwner" kind of error. type ErrLastOrgOwner struct { UID int64 diff --git a/models/error_oauth2.go b/models/error_oauth2.go new file mode 100644 index 0000000..a25be89 --- /dev/null +++ b/models/error_oauth2.go @@ -0,0 +1,24 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import "fmt" + +// ErrOpenIDConnectInitialize represents a "OpenIDConnectInitialize" kind of error. +type ErrOpenIDConnectInitialize struct { + OpenIDConnectAutoDiscoveryURL string + ProviderName string + Cause error +} + +// IsErrOpenIDConnectInitialize checks if an error is a ExternalLoginUserAlreadyExist. +func IsErrOpenIDConnectInitialize(err error) bool { + _, ok := err.(ErrOpenIDConnectInitialize) + return ok +} + +func (err ErrOpenIDConnectInitialize) Error() string { + return fmt.Sprintf("Failed to initialize OpenID Connect Provider with name '%s' with url '%s': %v", err.ProviderName, err.OpenIDConnectAutoDiscoveryURL, err.Cause) +} diff --git a/models/external_login_user.go b/models/external_login_user.go index b268094..21a3cbb 100644 --- a/models/external_login_user.go +++ b/models/external_login_user.go @@ -8,9 +8,9 @@ import "github.com/markbates/goth" // ExternalLoginUser makes the connecting between some existing user and additional external login sources type ExternalLoginUser struct { - ExternalID string `xorm:"NOT NULL"` - UserID int64 `xorm:"NOT NULL"` - LoginSourceID int64 `xorm:"NOT NULL"` + ExternalID string `xorm:"pk NOT NULL"` + UserID int64 `xorm:"INDEX NOT NULL"` + LoginSourceID int64 `xorm:"pk NOT NULL"` } // GetExternalLogin checks if a externalID in loginSourceID scope already exists diff --git a/models/fixtures/access.yml b/models/fixtures/access.yml index 5ea4076..8722b24 100644 --- a/models/fixtures/access.yml +++ b/models/fixtures/access.yml @@ -9,3 +9,9 @@ user_id: 4 repo_id: 4 mode: 2 # write + +- + id: 3 + user_id: 4 + repo_id: 3 + mode: 2 # write diff --git a/models/fixtures/action.yml b/models/fixtures/action.yml index 94d8e57..ad46e6b 100644 --- a/models/fixtures/action.yml +++ b/models/fixtures/action.yml @@ -3,21 +3,15 @@ user_id: 2 op_type: 12 # close issue act_user_id: 2 - act_user_name: user2 repo_id: 2 - repo_user_name: user2 - repo_name: repo2 is_private: true - id: 2 user_id: 3 op_type: 2 # rename repo - act_user_id: 3 - act_user_name: user3 + act_user_id: 2 repo_id: 3 - repo_user_name: user3 - repo_name: repo3 is_private: true content: oldRepoName @@ -26,8 +20,5 @@ user_id: 11 op_type: 1 # create repo act_user_id: 11 - act_user_name: user11 repo_id: 9 - repo_user_name: user11 - repo_name: repo9 is_private: false diff --git a/models/fixtures/attachment.yml b/models/fixtures/attachment.yml new file mode 100644 index 0000000..f196aa4 --- /dev/null +++ b/models/fixtures/attachment.yml @@ -0,0 +1,71 @@ +- + id: 1 + uuid: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 + issue_id: 1 + comment_id: 0 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 2 + uuid: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a12 + issue_id: 1 + comment_id: 0 + name: attach2 + download_count: 1 + created_unix: 946684800 + +- + id: 3 + uuid: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a13 + issue_id: 2 + comment_id: 1 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 4 + uuid: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a14 + issue_id: 3 + comment_id: 1 + name: attach2 + download_count: 1 + created_unix: 946684800 + +- + id: 5 + uuid: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a15 + issue_id: 4 + comment_id: 0 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 6 + uuid: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a16 + issue_id: 5 + comment_id: 2 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 7 + uuid: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a17 + issue_id: 5 + comment_id: 2 + name: attach1 + download_count: 0 + created_unix: 946684800 + +- + id: 8 + uuid: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a18 + issue_id: 6 + comment_id: 0 + name: attach1 + download_count: 0 + created_unix: 946684800 diff --git a/models/fixtures/comment.yml b/models/fixtures/comment.yml index e38952a..3292bb4 100644 --- a/models/fixtures/comment.yml +++ b/models/fixtures/comment.yml @@ -2,6 +2,18 @@ id: 1 type: 7 # label poster_id: 2 - issue_id: 1 + issue_id: 1 # in repo_id 1 label_id: 1 content: "1" +- + id: 2 + type: 0 # comment + poster_id: 3 # user not watching (see watch.yml) + issue_id: 1 # in repo_id 1 + content: "good work!" +- + id: 3 + type: 0 # comment + poster_id: 5 # user not watching (see watch.yml) + issue_id: 1 # in repo_id 1 + content: "meh..." diff --git a/models/fixtures/commit_status.yml b/models/fixtures/commit_status.yml new file mode 100644 index 0000000..20d5797 --- /dev/null +++ b/models/fixtures/commit_status.yml @@ -0,0 +1,54 @@ +- + id: 1 + index: 1 + repo_id: 1 + state: "pending" + sha: "1234123412341234123412341234123412341234" + target_url: https://example.com/builds/ + description: My awesome CI-service + context: ci/awesomeness + creator_id: 2 + +- + id: 2 + index: 2 + repo_id: 1 + state: "warning" + sha: "1234123412341234123412341234123412341234" + target_url: https://example.com/converage/ + description: My awesome Coverage service + context: cov/awesomeness + creator_id: 2 + +- + id: 3 + index: 3 + repo_id: 1 + state: "success" + sha: "1234123412341234123412341234123412341234" + target_url: https://example.com/converage/ + description: My awesome Coverage service + context: cov/awesomeness + creator_id: 2 + +- + id: 4 + index: 4 + repo_id: 1 + state: "failure" + sha: "1234123412341234123412341234123412341234" + target_url: https://example.com/builds/ + description: My awesome CI-service + context: ci/awesomeness + creator_id: 2 + +- + id: 5 + index: 5 + repo_id: 1 + state: "error" + sha: "1234123412341234123412341234123412341234" + target_url: https://example.com/builds/ + description: My awesome deploy service + context: deploy/awesomeness + creator_id: 2 diff --git a/models/fixtures/follow.yml b/models/fixtures/follow.yml new file mode 100644 index 0000000..480fa06 --- /dev/null +++ b/models/fixtures/follow.yml @@ -0,0 +1,14 @@ +- + id: 1 + user_id: 4 + follow_id: 2 + +- + id: 2 + user_id: 8 + follow_id: 2 + +- + id: 3 + user_id: 2 + follow_id: 8 diff --git a/models/fixtures/issue.yml b/models/fixtures/issue.yml index c2d2108..7bbbab2 100644 --- a/models/fixtures/issue.yml +++ b/models/fixtures/issue.yml @@ -8,7 +8,7 @@ content: content1 is_closed: false is_pull: false - num_comments: 0 + num_comments: 2 created_unix: 946684800 updated_unix: 978307200 diff --git a/models/fixtures/issue_watch.yml b/models/fixtures/issue_watch.yml new file mode 100644 index 0000000..596662d --- /dev/null +++ b/models/fixtures/issue_watch.yml @@ -0,0 +1,15 @@ +- + id: 1 + user_id: 1 + issue_id: 1 + is_watching: true + created_unix: 946684800 + updated_unix: 946684800 + +- + id: 2 + user_id: 2 + issue_id: 2 + is_watching: false + created_unix: 946684800 + updated_unix: 946684800 diff --git a/models/fixtures/protected_branch.yml b/models/fixtures/protected_branch.yml new file mode 100644 index 0000000..ca780a7 --- /dev/null +++ b/models/fixtures/protected_branch.yml @@ -0,0 +1 @@ +[] # empty diff --git a/models/fixtures/pull_request.yml b/models/fixtures/pull_request.yml index 7946a0f..d8313f9 100644 --- a/models/fixtures/pull_request.yml +++ b/models/fixtures/pull_request.yml @@ -16,7 +16,7 @@ - id: 2 type: 0 # gitea pull request - status: 1 # checking + status: 2 # mergable issue_id: 3 index: 3 head_repo_id: 1 diff --git a/models/fixtures/release.yml b/models/fixtures/release.yml new file mode 100644 index 0000000..ca780a7 --- /dev/null +++ b/models/fixtures/release.yml @@ -0,0 +1 @@ +[] # empty diff --git a/models/fixtures/repo_unit.yml b/models/fixtures/repo_unit.yml new file mode 100644 index 0000000..02daa48 --- /dev/null +++ b/models/fixtures/repo_unit.yml @@ -0,0 +1,79 @@ +- + id: 1 + repo_id: 1 + type: 1 + index: 0 + config: "{}" + created_unix: 946684810 + +- + id: 2 + repo_id: 1 + type: 2 + index: 1 + config: "{}" + created_unix: 946684810 + +- + id: 3 + repo_id: 1 + type: 3 + index: 2 + config: "{}" + created_unix: 946684810 + +- + id: 4 + repo_id: 1 + type: 4 + index: 3 + config: "{}" + created_unix: 946684810 + +- + id: 5 + repo_id: 1 + type: 5 + index: 4 + config: "{}" + created_unix: 946684810 + +- + id: 6 + repo_id: 3 + type: 1 + index: 0 + config: "{}" + created_unix: 946684810 + +- + id: 7 + repo_id: 3 + type: 2 + index: 1 + config: "{}" + created_unix: 946684810 + +- + id: 8 + repo_id: 3 + type: 3 + index: 2 + config: "{}" + created_unix: 946684810 + +- + id: 9 + repo_id: 3 + type: 4 + index: 3 + config: "{}" + created_unix: 946684810 + +- + id: 10 + repo_id: 3 + type: 5 + index: 4 + config: "{}" + created_unix: 946684810 diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index 1d44865..b10b85c 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -169,3 +169,10 @@ num_pulls: 0 num_closed_pulls: 0 is_mirror: false + +- + id: 15 + owner_id: 2 + lower_name: repo15 + name: repo15 + is_bare: true diff --git a/models/fixtures/team.yml b/models/fixtures/team.yml index 3b47ef0..795d5cd 100644 --- a/models/fixtures/team.yml +++ b/models/fixtures/team.yml @@ -6,6 +6,7 @@ authorize: 4 # owner num_repos: 2 num_members: 1 + unit_types: '[1,2,3,4,5,6,7]' - id: 2 @@ -15,6 +16,7 @@ authorize: 2 # write num_repos: 1 num_members: 2 + unit_types: '[1,2,3,4,5,6,7]' - id: 3 @@ -24,6 +26,7 @@ authorize: 4 # owner num_repos: 0 num_members: 1 + unit_types: '[1,2,3,4,5,6,7]' - id: 4 @@ -33,3 +36,4 @@ authorize: 4 # owner num_repos: 0 num_members: 1 + unit_types: '[1,2,3,4,5,6,7]' diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index 5a2dd2f..b3e7864 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -1,12 +1,14 @@ +# NOTE: all users should have a password of "password" + - # NOTE: this user (id=1) is the admin id: 1 lower_name: user1 name: user1 full_name: User One email: user1@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: true avatar: avatar1 avatar_email: user1@example.com @@ -18,14 +20,17 @@ name: user2 full_name: User Two email: user2@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar2 avatar_email: user2@example.com - num_repos: 2 + num_repos: 3 num_stars: 2 + num_followers: 2 + num_following: 1 + is_active: true - id: 3 @@ -33,9 +38,9 @@ name: user3 full_name: User Three email: user3@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 1 # organization - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar3 avatar_email: user3@example.com @@ -49,13 +54,14 @@ name: user4 full_name: User Four email: user4@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar4 avatar_email: user4@example.com num_repos: 0 + num_following: 1 - id: 5 @@ -63,15 +69,16 @@ name: user5 full_name: User Five email: user5@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar5 avatar_email: user5@example.com num_repos: 1 allow_create_organization: false is_active: true + num_following: 0 - id: 6 @@ -79,9 +86,9 @@ name: user6 full_name: User Six email: user6@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 1 # organization - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar6 avatar_email: user6@example.com @@ -95,9 +102,9 @@ name: user7 full_name: User Seven email: user7@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 1 # organization - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar7 avatar_email: user7@example.com @@ -111,14 +118,16 @@ name: user8 full_name: User Eight email: user8@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar8 avatar_email: user8@example.com num_repos: 0 is_active: true + num_followers: 1 + num_following: 1 - id: 9 @@ -126,9 +135,9 @@ name: user9 full_name: User Nine email: user9@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar9 avatar_email: user9@example.com @@ -141,9 +150,9 @@ name: user10 full_name: User Ten email: user10@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar10 avatar_email: user10@example.com @@ -156,9 +165,9 @@ name: user11 full_name: User Eleven email: user11@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar11 avatar_email: user11@example.com @@ -171,9 +180,9 @@ name: user12 full_name: User 12 email: user12@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar12 avatar_email: user12@example.com @@ -186,9 +195,9 @@ name: user13 full_name: User 13 email: user13@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar13 avatar_email: user13@example.com @@ -201,9 +210,9 @@ name: user14 full_name: User 14 email: user14@example.com - passwd: password + passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password type: 0 # individual - salt: salt + salt: ZogKvWdyEx is_admin: false avatar: avatar14 avatar_email: user13@example.com diff --git a/models/fixtures/user_open_id.yml b/models/fixtures/user_open_id.yml new file mode 100644 index 0000000..d3a367b --- /dev/null +++ b/models/fixtures/user_open_id.yml @@ -0,0 +1,17 @@ +- + id: 1 + uid: 1 + uri: https://user1.domain1.tld/ + show: false + +- + id: 2 + uid: 1 + uri: http://user1.domain2.tld/ + show: true + +- + id: 3 + uid: 2 + uri: https://domain1.tld/user2/ + show: true diff --git a/models/git_diff.go b/models/git_diff.go index d9bb5e9..659dfbc 100644 --- a/models/git_diff.go +++ b/models/git_diff.go @@ -287,7 +287,6 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader) (*D curFile.IsBin = true curFile.IsLFSFile = true curSection.Lines = nil - break } } } @@ -366,10 +365,12 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader) (*D } curFile = &DiffFile{ - Name: a, - Index: len(diff.Files) + 1, - Type: DiffFileChange, - Sections: make([]*DiffSection, 0, 10), + Name: b, + OldName: a, + Index: len(diff.Files) + 1, + Type: DiffFileChange, + Sections: make([]*DiffSection, 0, 10), + IsRenamed: a != b, } diff.Files = append(diff.Files, curFile) if len(diff.Files) >= maxFiles { @@ -402,9 +403,6 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader) (*D curFile.Type = DiffFileChange case strings.HasPrefix(line, "similarity index 100%"): curFile.Type = DiffFileRename - curFile.IsRenamed = true - curFile.OldName = curFile.Name - curFile.Name = b } if curFile.Type > 0 { if strings.HasSuffix(line, " 160000\n") { diff --git a/models/git_diff_test.go b/models/git_diff_test.go index f88e6fb..acdae20 100644 --- a/models/git_diff_test.go +++ b/models/git_diff_test.go @@ -1,9 +1,10 @@ package models import ( - dmp "github.com/sergi/go-diff/diffmatchpatch" "html/template" "testing" + + dmp "github.com/sergi/go-diff/diffmatchpatch" ) func assertEqual(t *testing.T, s1 string, s2 template.HTML) { diff --git a/models/gpg_key.go b/models/gpg_key.go new file mode 100644 index 0000000..08573c1 --- /dev/null +++ b/models/gpg_key.go @@ -0,0 +1,465 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "bytes" + "container/list" + "crypto" + "encoding/base64" + "fmt" + "hash" + "io" + "strings" + "time" + + "code.gitea.io/git" + "code.gitea.io/gitea/modules/log" + + "github.com/go-xorm/xorm" + "github.com/keybase/go-crypto/openpgp" + "github.com/keybase/go-crypto/openpgp/armor" + "github.com/keybase/go-crypto/openpgp/packet" +) + +// GPGKey represents a GPG key. +type GPGKey struct { + ID int64 `xorm:"pk autoincr"` + OwnerID int64 `xorm:"INDEX NOT NULL"` + KeyID string `xorm:"INDEX CHAR(16) NOT NULL"` + PrimaryKeyID string `xorm:"CHAR(16)"` + Content string `xorm:"TEXT NOT NULL"` + Created time.Time `xorm:"-"` + CreatedUnix int64 + Expired time.Time `xorm:"-"` + ExpiredUnix int64 + Added time.Time `xorm:"-"` + AddedUnix int64 + SubsKey []*GPGKey `xorm:"-"` + Emails []*EmailAddress + CanSign bool + CanEncryptComms bool + CanEncryptStorage bool + CanCertify bool +} + +// BeforeInsert will be invoked by XORM before inserting a record +func (key *GPGKey) BeforeInsert() { + key.AddedUnix = time.Now().Unix() + key.ExpiredUnix = key.Expired.Unix() + key.CreatedUnix = key.Created.Unix() +} + +// AfterSet is invoked from XORM after setting the value of a field of this object. +func (key *GPGKey) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "key_id": + x.Where("primary_key_id=?", key.KeyID).Find(&key.SubsKey) + case "added_unix": + key.Added = time.Unix(key.AddedUnix, 0).Local() + case "expired_unix": + key.Expired = time.Unix(key.ExpiredUnix, 0).Local() + case "created_unix": + key.Created = time.Unix(key.CreatedUnix, 0).Local() + } +} + +// ListGPGKeys returns a list of public keys belongs to given user. +func ListGPGKeys(uid int64) ([]*GPGKey, error) { + keys := make([]*GPGKey, 0, 5) + return keys, x.Where("owner_id=? AND primary_key_id=''", uid).Find(&keys) +} + +// GetGPGKeyByID returns public key by given ID. +func GetGPGKeyByID(keyID int64) (*GPGKey, error) { + key := new(GPGKey) + has, err := x.Id(keyID).Get(key) + if err != nil { + return nil, err + } else if !has { + return nil, ErrGPGKeyNotExist{keyID} + } + return key, nil +} + +// checkArmoredGPGKeyString checks if the given key string is a valid GPG armored key. +// The function returns the actual public key on success +func checkArmoredGPGKeyString(content string) (*openpgp.Entity, error) { + list, err := openpgp.ReadArmoredKeyRing(strings.NewReader(content)) + if err != nil { + return nil, ErrGPGKeyParsing{err} + } + return list[0], nil +} + +//addGPGKey add key and subkeys to database +func addGPGKey(e Engine, key *GPGKey) (err error) { + // Save GPG primary key. + if _, err = e.Insert(key); err != nil { + return err + } + // Save GPG subs key. + for _, subkey := range key.SubsKey { + if err := addGPGKey(e, subkey); err != nil { + return err + } + } + return nil +} + +// AddGPGKey adds new public key to database. +func AddGPGKey(ownerID int64, content string) (*GPGKey, error) { + ekey, err := checkArmoredGPGKeyString(content) + if err != nil { + return nil, err + } + + // Key ID cannot be duplicated. + has, err := x.Where("key_id=?", ekey.PrimaryKey.KeyIdString()). + Get(new(GPGKey)) + if err != nil { + return nil, err + } else if has { + return nil, ErrGPGKeyIDAlreadyUsed{ekey.PrimaryKey.KeyIdString()} + } + + //Get DB session + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return nil, err + } + + key, err := parseGPGKey(ownerID, ekey) + if err != nil { + return nil, err + } + + if err = addGPGKey(sess, key); err != nil { + return nil, err + } + + return key, sess.Commit() +} + +//base64EncPubKey encode public kay content to base 64 +func base64EncPubKey(pubkey *packet.PublicKey) (string, error) { + var w bytes.Buffer + err := pubkey.Serialize(&w) + if err != nil { + return "", err + } + return base64.StdEncoding.EncodeToString(w.Bytes()), nil +} + +//parseSubGPGKey parse a sub Key +func parseSubGPGKey(ownerID int64, primaryID string, pubkey *packet.PublicKey, expiry time.Time) (*GPGKey, error) { + content, err := base64EncPubKey(pubkey) + if err != nil { + return nil, err + } + return &GPGKey{ + OwnerID: ownerID, + KeyID: pubkey.KeyIdString(), + PrimaryKeyID: primaryID, + Content: content, + Created: pubkey.CreationTime, + Expired: expiry, + CanSign: pubkey.CanSign(), + CanEncryptComms: pubkey.PubKeyAlgo.CanEncrypt(), + CanEncryptStorage: pubkey.PubKeyAlgo.CanEncrypt(), + CanCertify: pubkey.PubKeyAlgo.CanSign(), + }, nil +} + +//parseGPGKey parse a PrimaryKey entity (primary key + subs keys + self-signature) +func parseGPGKey(ownerID int64, e *openpgp.Entity) (*GPGKey, error) { + pubkey := e.PrimaryKey + + //Extract self-sign for expire date based on : https://github.com/golang/crypto/blob/master/openpgp/keys.go#L165 + var selfSig *packet.Signature + for _, ident := range e.Identities { + if selfSig == nil { + selfSig = ident.SelfSignature + } else if ident.SelfSignature.IsPrimaryId != nil && *ident.SelfSignature.IsPrimaryId { + selfSig = ident.SelfSignature + break + } + } + expiry := time.Time{} + if selfSig.KeyLifetimeSecs != nil { + expiry = selfSig.CreationTime.Add(time.Duration(*selfSig.KeyLifetimeSecs) * time.Second) + } + + //Parse Subkeys + subkeys := make([]*GPGKey, len(e.Subkeys)) + for i, k := range e.Subkeys { + subs, err := parseSubGPGKey(ownerID, pubkey.KeyIdString(), k.PublicKey, expiry) + if err != nil { + return nil, err + } + subkeys[i] = subs + } + + //Check emails + userEmails, err := GetEmailAddresses(ownerID) + if err != nil { + return nil, err + } + emails := make([]*EmailAddress, len(e.Identities)) + n := 0 + for _, ident := range e.Identities { + email := strings.ToLower(strings.TrimSpace(ident.UserId.Email)) + for _, e := range userEmails { + if e.Email == email && e.IsActivated { + emails[n] = e + break + } + } + if emails[n] == nil { + return nil, ErrGPGEmailNotFound{ident.UserId.Email} + } + n++ + } + content, err := base64EncPubKey(pubkey) + if err != nil { + return nil, err + } + return &GPGKey{ + OwnerID: ownerID, + KeyID: pubkey.KeyIdString(), + PrimaryKeyID: "", + Content: content, + Created: pubkey.CreationTime, + Expired: expiry, + Emails: emails, + SubsKey: subkeys, + CanSign: pubkey.CanSign(), + CanEncryptComms: pubkey.PubKeyAlgo.CanEncrypt(), + CanEncryptStorage: pubkey.PubKeyAlgo.CanEncrypt(), + CanCertify: pubkey.PubKeyAlgo.CanSign(), + }, nil +} + +// deleteGPGKey does the actual key deletion +func deleteGPGKey(e *xorm.Session, keyID string) (int64, error) { + if keyID == "" { + return 0, fmt.Errorf("empty KeyId forbidden") //Should never happen but just to be sure + } + return e.Where("key_id=?", keyID).Or("primary_key_id=?", keyID).Delete(new(GPGKey)) +} + +// DeleteGPGKey deletes GPG key information in database. +func DeleteGPGKey(doer *User, id int64) (err error) { + key, err := GetGPGKeyByID(id) + if err != nil { + if IsErrGPGKeyNotExist(err) { + return nil + } + return fmt.Errorf("GetPublicKeyByID: %v", err) + } + + // Check if user has access to delete this key. + if !doer.IsAdmin && doer.ID != key.OwnerID { + return ErrGPGKeyAccessDenied{doer.ID, key.ID} + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = deleteGPGKey(sess, key.KeyID); err != nil { + return err + } + + return sess.Commit() +} + +// CommitVerification represents a commit validation of signature +type CommitVerification struct { + Verified bool + Reason string + SigningUser *User + SigningKey *GPGKey +} + +// SignCommit represents a commit with validation of signature. +type SignCommit struct { + Verification *CommitVerification + *UserCommit +} + +func readerFromBase64(s string) (io.Reader, error) { + bs, err := base64.StdEncoding.DecodeString(s) + if err != nil { + return nil, err + } + return bytes.NewBuffer(bs), nil +} + +func populateHash(hashFunc crypto.Hash, msg []byte) (hash.Hash, error) { + h := hashFunc.New() + if _, err := h.Write(msg); err != nil { + return nil, err + } + return h, nil +} + +// readArmoredSign read an armored signature block with the given type. https://sourcegraph.com/github.com/golang/crypto/-/blob/openpgp/read.go#L24:6-24:17 +func readArmoredSign(r io.Reader) (body io.Reader, err error) { + block, err := armor.Decode(r) + if err != nil { + return + } + if block.Type != openpgp.SignatureType { + return nil, fmt.Errorf("expected '" + openpgp.SignatureType + "', got: " + block.Type) + } + return block.Body, nil +} + +func extractSignature(s string) (*packet.Signature, error) { + r, err := readArmoredSign(strings.NewReader(s)) + if err != nil { + return nil, fmt.Errorf("Failed to read signature armor") + } + p, err := packet.Read(r) + if err != nil { + return nil, fmt.Errorf("Failed to read signature packet") + } + sig, ok := p.(*packet.Signature) + if !ok { + return nil, fmt.Errorf("Packet is not a signature") + } + return sig, nil +} + +func verifySign(s *packet.Signature, h hash.Hash, k *GPGKey) error { + //Check if key can sign + if !k.CanSign { + return fmt.Errorf("key can not sign") + } + //Decode key + b, err := readerFromBase64(k.Content) + if err != nil { + return err + } + //Read key + p, err := packet.Read(b) + if err != nil { + return err + } + + //Check type + pkey, ok := p.(*packet.PublicKey) + if !ok { + return fmt.Errorf("key is not a public key") + } + + return pkey.VerifySignature(h, s) +} + +// ParseCommitWithSignature check if signature is good against keystore. +func ParseCommitWithSignature(c *git.Commit) *CommitVerification { + if c.Signature != nil { + //Parsing signature + sig, err := extractSignature(c.Signature.Signature) + if err != nil { //Skipping failed to extract sign + log.Error(3, "SignatureRead err: %v", err) + return &CommitVerification{ + Verified: false, + Reason: "gpg.error.extract_sign", + } + } + + //Find Committer account + committer, err := GetUserByEmail(c.Committer.Email) + if err != nil { //Skipping not user for commiter + log.Error(3, "NoCommitterAccount: %v", err) + return &CommitVerification{ + Verified: false, + Reason: "gpg.error.no_committer_account", + } + } + + keys, err := ListGPGKeys(committer.ID) + if err != nil { //Skipping failed to get gpg keys of user + log.Error(3, "ListGPGKeys: %v", err) + return &CommitVerification{ + Verified: false, + Reason: "gpg.error.failed_retrieval_gpg_keys", + } + } + + for _, k := range keys { + //Generating hash of commit + hash, err := populateHash(sig.Hash, []byte(c.Signature.Payload)) + if err != nil { //Skipping ailed to generate hash + log.Error(3, "PopulateHash: %v", err) + return &CommitVerification{ + Verified: false, + Reason: "gpg.error.generate_hash", + } + } + //We get PK + if err := verifySign(sig, hash, k); err == nil { + return &CommitVerification{ //Everything is ok + Verified: true, + Reason: fmt.Sprintf("%s <%s> / %s", c.Committer.Name, c.Committer.Email, k.KeyID), + SigningUser: committer, + SigningKey: k, + } + } + //And test also SubsKey + for _, sk := range k.SubsKey { + + //Generating hash of commit + hash, err := populateHash(sig.Hash, []byte(c.Signature.Payload)) + if err != nil { //Skipping ailed to generate hash + log.Error(3, "PopulateHash: %v", err) + return &CommitVerification{ + Verified: false, + Reason: "gpg.error.generate_hash", + } + } + if err := verifySign(sig, hash, sk); err == nil { + return &CommitVerification{ //Everything is ok + Verified: true, + Reason: fmt.Sprintf("%s <%s> / %s", c.Committer.Name, c.Committer.Email, sk.KeyID), + SigningUser: committer, + SigningKey: sk, + } + } + } + } + return &CommitVerification{ //Default at this stage + Verified: false, + Reason: "gpg.error.no_gpg_keys_found", + } + } + + return &CommitVerification{ + Verified: false, //Default value + Reason: "gpg.error.not_signed_commit", //Default value + } +} + +// ParseCommitsWithSignature checks if signaute of commits are corresponding to users gpg keys. +func ParseCommitsWithSignature(oldCommits *list.List) *list.List { + var ( + newCommits = list.New() + e = oldCommits.Front() + ) + for e != nil { + c := e.Value.(UserCommit) + newCommits.PushBack(SignCommit{ + UserCommit: &c, + Verification: ParseCommitWithSignature(c.Commit), + }) + e = e.Next() + } + return newCommits +} diff --git a/models/gpg_key_test.go b/models/gpg_key_test.go new file mode 100644 index 0000000..687e0cd --- /dev/null +++ b/models/gpg_key_test.go @@ -0,0 +1,224 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCheckArmoredGPGKeyString(t *testing.T) { + testGPGArmor := `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFh91QoBCADciaDd7aqegYkn4ZIG7J0p1CRwpqMGjxFroJEMg6M1ZiuEVTRv +z49P4kcr1+98NvFmcNc+x5uJgvPCwr/N8ZW5nqBUs2yrklbFF4MeQomyZJJegP8m +/dsRT3BwIT8YMUtJuCj0iqD9vuKYfjrztcMgC1sYwcE9E9OlA0pWBvUdU2i0TIB1 +vOq6slWGvHHa5l5gPfm09idlVxfH5+I+L1uIMx5ovbiVVU5x2f1AR1T18f0t2TVN +0agFTyuoYE1ATmvJHmMcsfgM1Gpd9hIlr9vlupT2kKTPoNzVzsJsOU6Ku/Lf/bac +mF+TfSbRCtmG7dkYZ4metLj7zG/WkW8IvJARABEBAAG0HUFudG9pbmUgR0lSQVJE +IDxzYXBrQHNhcGsuZnI+iQFUBBMBCAA+FiEEEIOwJg/1vpF1itJ4roJVuKDYKOQF +Alh91QoCGwMFCQPCZwAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQroJVuKDY +KORreggAlIkC2QjHP5tb7b0+LksB2JMXdY+UzZBcJxtNmvA7gNQaGvWRrhrbePpa +MKDP+3A4BPDBsWFbbB7N56vQ5tROpmWbNKuFOVER4S1bj0JZV0E+xkDLqt9QwQtQ +ojd7oIZJwDUwdud1PvCza2mjgBqqiFE+twbc3i9xjciCGspMniUul1eQYLxRJ0w+ +sbvSOUnujnq5ByMSz9ij00O6aiPfNQS5oB5AALfpjYZDvWAAljLVrtmlQJWZ6dZo +T/YNwsW2dECPuti8+Nmu5FxPGDTXxdbnRaeJTQ3T6q1oUVAv7yTXBx5NXfXkMa5i +iEayQIH8Joq5Ev5ja/lRGQQhArMQ2bkBDQRYfdUKAQgAv7B3coLSrOQbuTZSlgWE +QeT+7DWbmqE1LAQA1pQPcUPXLBUVd60amZJxF9nzUYcY83ylDi0gUNJS+DJGOXpT +pzX2IOuOMGbtUSeKwg5s9O4SUO7f2yCc3RGaegER5zgESxelmOXG+b/hoNt7JbdU +JtxcnLr91Jw2PBO/Xf0ZKJ01CQG2Yzdrrj6jnrHyx94seHy0i6xH1o0OuvfVMLfN +/Vbb/ZHh6ym2wHNqRX62b0VAbchcJXX/MEehXGknKTkO6dDUd+mhRgWMf9ZGRFWx +ag4qALimkf1FXtAyD0vxFYeyoWUQzrOvUsm2BxIN/986R08fhkBQnp5nz07mrU02 +cQARAQABiQE8BBgBCAAmFiEEEIOwJg/1vpF1itJ4roJVuKDYKOQFAlh91QoCGwwF +CQPCZwAACgkQroJVuKDYKOT32wf/UZqMdPn5OhyhffFzjQx7wolrf92WkF2JkxtH +6c3Htjlt/p5RhtKEeErSrNAxB4pqB7dznHaJXiOdWEZtRVXXjlNHjrokGTesqtKk +lHWtK62/MuyLdr+FdCl68F3ewuT2iu/MDv+D4HPqA47zma9xVgZ9ZNwJOpv3fCOo +RfY66UjGEnfgYifgtI5S84/mp2jaSc9UNvlZB6RSf8cfbJUL74kS2lq+xzSlf0yP +Av844q/BfRuVsJsK1NDNG09LC30B0l3LKBqlrRmRTUMHtgchdX2dY+p7GPOoSzlR +MkM/fdpyc2hY7Dl/+qFmN5MG5yGmMpQcX+RNNR222ibNC1D3wg== +=i9b7 +-----END PGP PUBLIC KEY BLOCK-----` + + key, err := checkArmoredGPGKeyString(testGPGArmor) + assert.NoError(t, err, "Could not parse a valid GPG public armored rsa key", key) + //TODO verify value of key +} + +func TestCheckArmoredbrainpoolP256r1GPGKeyString(t *testing.T) { + testGPGArmor := `-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +mFMEV6HwkhMJKyQDAwIIAQEHAgMEUsvJO/j5dFMRRj67qeZC9fSKBsGZdOHRj2+6 +8wssmbUuLTfT/ZjIbExETyY8hFnURRGpD2Ifyz0cKjXcbXfJtrQTRm9vYmFyIDxm +b29AYmFyLmRlPoh/BBMTCAAnBQJZOsDIAhsDBQkJZgGABQsJCAcCBhUICQoLAgQW +AgMBAh4BAheAAAoJEGuJTd/DBMzmNVQA/2beUrv1yU4gyvCiPDEm3pK42cSfaL5D +muCtPCUg9hlWAP4yq6M78NW8STfsXgn6oeziMYiHSTmV14nOamLuwwDWM7hXBFeh +8JISCSskAwMCCAEBBwIDBG3A+XfINAZp1CTse2mRNgeUE5DbUtEpO8ALXKA1UQsQ +DLKq27b7zTgawgXIGUGP6mWsJ5oH7MNAJ/uKTsYmX40DAQgHiGcEGBMIAA8FAleh +8JICGwwFCQlmAYAACgkQa4lN38MEzOZwKAD/QKyerAgcvzzLaqvtap3XvpYcw9tc +OyjLLnFQiVmq7kEA/0z0CQe3ZQiQIq5zrs7Nh1XRkFAo8GlU/SGC9XFFi722 +=ZiSe +-----END PGP PUBLIC KEY BLOCK-----` + + key, err := checkArmoredGPGKeyString(testGPGArmor) + assert.NoError(t, err, "Could not parse a valid GPG public armored brainpoolP256r1 key", key) + //TODO verify value of key +} + +func TestExtractSignature(t *testing.T) { + testGPGArmor := `-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFh91QoBCADciaDd7aqegYkn4ZIG7J0p1CRwpqMGjxFroJEMg6M1ZiuEVTRv +z49P4kcr1+98NvFmcNc+x5uJgvPCwr/N8ZW5nqBUs2yrklbFF4MeQomyZJJegP8m +/dsRT3BwIT8YMUtJuCj0iqD9vuKYfjrztcMgC1sYwcE9E9OlA0pWBvUdU2i0TIB1 +vOq6slWGvHHa5l5gPfm09idlVxfH5+I+L1uIMx5ovbiVVU5x2f1AR1T18f0t2TVN +0agFTyuoYE1ATmvJHmMcsfgM1Gpd9hIlr9vlupT2kKTPoNzVzsJsOU6Ku/Lf/bac +mF+TfSbRCtmG7dkYZ4metLj7zG/WkW8IvJARABEBAAG0HUFudG9pbmUgR0lSQVJE +IDxzYXBrQHNhcGsuZnI+iQFUBBMBCAA+FiEEEIOwJg/1vpF1itJ4roJVuKDYKOQF +Alh91QoCGwMFCQPCZwAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQroJVuKDY +KORreggAlIkC2QjHP5tb7b0+LksB2JMXdY+UzZBcJxtNmvA7gNQaGvWRrhrbePpa +MKDP+3A4BPDBsWFbbB7N56vQ5tROpmWbNKuFOVER4S1bj0JZV0E+xkDLqt9QwQtQ +ojd7oIZJwDUwdud1PvCza2mjgBqqiFE+twbc3i9xjciCGspMniUul1eQYLxRJ0w+ +sbvSOUnujnq5ByMSz9ij00O6aiPfNQS5oB5AALfpjYZDvWAAljLVrtmlQJWZ6dZo +T/YNwsW2dECPuti8+Nmu5FxPGDTXxdbnRaeJTQ3T6q1oUVAv7yTXBx5NXfXkMa5i +iEayQIH8Joq5Ev5ja/lRGQQhArMQ2bkBDQRYfdUKAQgAv7B3coLSrOQbuTZSlgWE +QeT+7DWbmqE1LAQA1pQPcUPXLBUVd60amZJxF9nzUYcY83ylDi0gUNJS+DJGOXpT +pzX2IOuOMGbtUSeKwg5s9O4SUO7f2yCc3RGaegER5zgESxelmOXG+b/hoNt7JbdU +JtxcnLr91Jw2PBO/Xf0ZKJ01CQG2Yzdrrj6jnrHyx94seHy0i6xH1o0OuvfVMLfN +/Vbb/ZHh6ym2wHNqRX62b0VAbchcJXX/MEehXGknKTkO6dDUd+mhRgWMf9ZGRFWx +ag4qALimkf1FXtAyD0vxFYeyoWUQzrOvUsm2BxIN/986R08fhkBQnp5nz07mrU02 +cQARAQABiQE8BBgBCAAmFiEEEIOwJg/1vpF1itJ4roJVuKDYKOQFAlh91QoCGwwF +CQPCZwAACgkQroJVuKDYKOT32wf/UZqMdPn5OhyhffFzjQx7wolrf92WkF2JkxtH +6c3Htjlt/p5RhtKEeErSrNAxB4pqB7dznHaJXiOdWEZtRVXXjlNHjrokGTesqtKk +lHWtK62/MuyLdr+FdCl68F3ewuT2iu/MDv+D4HPqA47zma9xVgZ9ZNwJOpv3fCOo +RfY66UjGEnfgYifgtI5S84/mp2jaSc9UNvlZB6RSf8cfbJUL74kS2lq+xzSlf0yP +Av844q/BfRuVsJsK1NDNG09LC30B0l3LKBqlrRmRTUMHtgchdX2dY+p7GPOoSzlR +MkM/fdpyc2hY7Dl/+qFmN5MG5yGmMpQcX+RNNR222ibNC1D3wg== +=i9b7 +-----END PGP PUBLIC KEY BLOCK-----` + ekey, err := checkArmoredGPGKeyString(testGPGArmor) + assert.NoError(t, err, "Could not parse a valid GPG armored key", ekey) + + pubkey := ekey.PrimaryKey + content, err := base64EncPubKey(pubkey) + assert.NoError(t, err, "Could not base64 encode a valid PublicKey content", ekey) + + key := &GPGKey{ + KeyID: pubkey.KeyIdString(), + Content: content, + Created: pubkey.CreationTime, + CanSign: pubkey.CanSign(), + CanEncryptComms: pubkey.PubKeyAlgo.CanEncrypt(), + CanEncryptStorage: pubkey.PubKeyAlgo.CanEncrypt(), + CanCertify: pubkey.PubKeyAlgo.CanSign(), + } + + cannotsignkey := &GPGKey{ + KeyID: pubkey.KeyIdString(), + Content: content, + Created: pubkey.CreationTime, + CanSign: false, + CanEncryptComms: false, + CanEncryptStorage: false, + CanCertify: false, + } + + testGoodSigArmor := `-----BEGIN PGP SIGNATURE----- + +iQEzBAABCAAdFiEEEIOwJg/1vpF1itJ4roJVuKDYKOQFAljAiQIACgkQroJVuKDY +KORvCgf6A/Ehh0r7QbO2tFEghT+/Ab+bN7jRN3zP9ed6/q/ophYmkrU0NibtbJH9 +AwFVdHxCmj78SdiRjaTKyevklXw34nvMftmvnOI4lBNUdw6KWl25/n/7wN0l2oZW +rW3UawYpZgodXiLTYarfEimkDQmT67ArScjRA6lLbkEYKO0VdwDu+Z6yBUH3GWtm +45RkXpnsF6AXUfuD7YxnfyyDE1A7g7zj4vVYUAfWukJjqow/LsCUgETETJOqj9q3 +52/oQDs04fVkIEtCDulcY+K/fKlukBPJf9WceNDEqiENUzN/Z1y0E+tJ07cSy4bk +yIJb+d0OAaG8bxloO7nJq4Res1Qa8Q== +=puvG +-----END PGP SIGNATURE-----` + testGoodPayload := `tree 56ae8d2799882b20381fc11659db06c16c68c61a +parent c7870c39e4e6b247235ca005797703ec4254613f +author Antoine GIRARD 1489012989 +0100 +committer Antoine GIRARD 1489012989 +0100 + +Goog GPG +` + + testBadSigArmor := `-----BEGIN PGP SIGNATURE----- + +iQEzBAABCAAdFiEE5yr4rn9ulbdMxJFiPYI/ySNrtNkFAljAiYkACgkQPYI/ySNr +tNmDdQf+NXhVRiOGt0GucpjJCGrOnK/qqVUmQyRUfrqzVUdb/1/Ws84V5/wE547I +6z3oxeBKFsJa1CtIlxYaUyVhYnDzQtphJzub+Aw3UG0E2ywiE+N7RCa1Ufl7pPxJ +U0SD6gvNaeTDQV/Wctu8v8DkCtEd3N8cMCDWhvy/FQEDztVtzm8hMe0Vdm0ozEH6 +P0W93sDNkLC5/qpWDN44sFlYDstW5VhMrnF0r/ohfaK2kpYHhkPk7WtOoHSUwQSg +c4gfhjvXIQrWFnII1Kr5jFGlmgNSR02qpb31VGkMzSnBhWVf2OaHS/kI49QHJakq +AhVDEnoYLCgoDGg9c3p1Ll2452/c6Q== +=uoGV +-----END PGP SIGNATURE-----` + testBadPayload := `tree 3074ff04951956a974e8b02d57733b0766f7cf6c +parent fd3577542f7ad1554c7c7c0eb86bb57a1324ad91 +author Antoine GIRARD 1489013107 +0100 +committer Antoine GIRARD 1489013107 +0100 + +Unknown GPG key with good email +` + //Reading Sign + goodSig, err := extractSignature(testGoodSigArmor) + assert.NoError(t, err, "Could not parse a valid GPG armored signature", testGoodSigArmor) + badSig, err := extractSignature(testBadSigArmor) + assert.NoError(t, err, "Could not parse a valid GPG armored signature", testBadSigArmor) + + //Generating hash of commit + goodHash, err := populateHash(goodSig.Hash, []byte(testGoodPayload)) + assert.NoError(t, err, "Could not generate a valid hash of payload", testGoodPayload) + badHash, err := populateHash(badSig.Hash, []byte(testBadPayload)) + assert.NoError(t, err, "Could not generate a valid hash of payload", testBadPayload) + + //Verify + err = verifySign(goodSig, goodHash, key) + assert.NoError(t, err, "Could not validate a good signature") + err = verifySign(badSig, badHash, key) + assert.Error(t, err, "Validate a bad signature") + err = verifySign(goodSig, goodHash, cannotsignkey) + assert.Error(t, err, "Validate a bad signature with a kay that can not sign") +} + +func TestCheckGPGUserEmail(t *testing.T) { + testEmailWithUpperCaseLetters := `-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQENBFlEBvMBCADe+EQcfv/aKbMFy7YB8e/DE+hY39sfjvdvSgeXtNhfmYvIOUjT +ORMCvce2Oxzb3HTI0rjYsJpzo9jEQ53dB3vdr0ne5Juby6N7QPjof3NR+ko50Ki2 +0ilOjYuA0v6VHLIn70UBa9NEf+XDuE7P+Lbtl2L9B9OMXtcTAZoA3cJySgtNFNIG +AVefPi8LeOcekL39wxJEA8OzdCyO5oENEwAG1tzjy9DDNJf74/dBBh2NiXeSeMxZ +RYeYzqEa2UTDP1fkUl7d2/hV36cKZWZr+l4SQ5bM7HeLj2SsfabLfqKoVWgkfAzQ +VwtkbRpzMiDLMte2ZAyTJUc+77YbFoyAmOcjABEBAAG0HFVzZXIgT25lIDxVc2Vy +MUBFeGFtcGxlLmNvbT6JATgEEwECACIFAllEBvMCGwMGCwkIBwMCBhUIAgkKCwQW +AgMBAh4BAheAAAoJEFMOzOY274DFw5EIAKc4jiYaMb1HDKrSv0tphgNxPFEY83/J +9CZggO7BINxlb7z/lH1i0U2h2Ha9E3VJTJQF80zBCaIvtU2UNrgVmSKoc0BdE/2S +rS9MAl29sXxf1BfvXHu12Suvo8O/ZFP45Vm/3kkHuasHyOV1GwUWnynt1qo0zUEn +WMIcB8USlmMT1TnSb10YKBd/BpGF3crFDJLfAHRumZUk4knDDWUOWy5RCOG8cedc +VTAhfdoKRRO3PchOfz6Rls/hew12mRNayqxuLQl2+BX+BWu+25dR3qyiS+twLbk6 +Rjpb0S+RQTkYIUoI0SEZpxcTZso11xF5KNpKZ9aAoiLJqkNF5h4oPSe5AQ0EWUQG +8wEIALiMMqh3NF3ON/z7hQfeU24bCl/WdfJwCR9CWU/jx4X4gZq2C2aGtytGN5g/ +qoYQ3poTOPzh/4Dvs+r6CtHqi0CvPiEOfSxzmaK+F+vA0GMn2i3Sx5gq/VB0mr+j +RIYMCjf68Tifo2RAT0VDzn6t304l5+VPr4OgbobMRH+wDe7Hhd2pZXl7ty8DooBn +vqaqoKgdiccUXGBKe4Oihl/oZ4qrYH6K4ACP1Sco1rs4mNeKDAW8k/Y7zLjg6d59 +g0YQ1YI+CX/bKB7/cpMHLupyMLqvCcqIpjBXRJNMdjuMHgKckjr89DwnqXqgXz7W +u0B39MZQn9nn6vq8BdkoDFgrTQ8AEQEAAYkBHwQYAQIACQUCWUQG8wIbDAAKCRBT +DszmNu+Axf4IB/0S9NTc6kpwW+ZPZQNTWR5oKDEaXVCRLccOlkt33txMvk/z2jNM +trEke99ss5L1bRyWB5fRA+XVsPmW9kIk8pmGFmxqp2nSxr9m9rlL5oTYH8u6dfSm +zwGhqkfITjPI7hyNN52PLANwoS0o4dLzIE65ewigx6cnRlrT2IENObxG/tlxaYg1 +NHahJX0uFlVk0W0bLBrs3fTDw1lS/N8HpyQb+5ryQmiIb2a48aygCS/h2qeRlX1d +Q0KHb+QcycSgbDx0ZAvdIacuKvBBcbxrsmFUI4LR+oIup0G9gUc0roPvr014jYQL +7f8r/8fpcN8t+I/41QHCs6L/BEIdTHW3rTQ6 +=zHo9 +-----END PGP PUBLIC KEY BLOCK-----` + + key, err := AddGPGKey(1, testEmailWithUpperCaseLetters) + assert.NoError(t, err) + + assert.Len(t, key.Emails, 1) + assert.Equal(t, "user1@example.com", key.Emails[0].Email) +} diff --git a/models/issue.go b/models/issue.go index c740d8f..673d718 100644 --- a/models/issue.go +++ b/models/issue.go @@ -24,6 +24,7 @@ import ( var ( errMissingIssueNumber = errors.New("No issue number specified") + errInvalidIssueNumber = errors.New("Invalid issue number") ) // Issue represents an issue or pull request of repository. @@ -131,6 +132,35 @@ func (issue *Issue) loadPoster(e Engine) (err error) { return } +func (issue *Issue) loadAssignee(e Engine) (err error) { + if issue.Assignee == nil && issue.AssigneeID > 0 { + issue.Assignee, err = getUserByID(e, issue.AssigneeID) + if err != nil { + issue.AssigneeID = -1 + issue.Assignee = NewGhostUser() + if !IsErrUserNotExist(err) { + return fmt.Errorf("getUserByID.(assignee) [%d]: %v", issue.AssigneeID, err) + } + err = nil + return + } + } + return +} + +func (issue *Issue) loadPullRequest(e Engine) (err error) { + if issue.IsPull && issue.PullRequest == nil { + issue.PullRequest, err = getPullRequestByIssueID(e, issue.ID) + if err != nil { + if IsErrPullRequestNotExist(err) { + return err + } + return fmt.Errorf("getPullRequestByIssueID [%d]: %v", issue.ID, err) + } + } + return nil +} + func (issue *Issue) loadAttributes(e Engine) (err error) { if err = issue.loadRepo(e); err != nil { return @@ -146,24 +176,18 @@ func (issue *Issue) loadAttributes(e Engine) (err error) { if issue.Milestone == nil && issue.MilestoneID > 0 { issue.Milestone, err = getMilestoneByRepoID(e, issue.RepoID, issue.MilestoneID) - if err != nil { + if err != nil && !IsErrMilestoneNotExist(err) { return fmt.Errorf("getMilestoneByRepoID [repo_id: %d, milestone_id: %d]: %v", issue.RepoID, issue.MilestoneID, err) } } - if issue.Assignee == nil && issue.AssigneeID > 0 { - issue.Assignee, err = getUserByID(e, issue.AssigneeID) - if err != nil { - return fmt.Errorf("getUserByID.(assignee) [%d]: %v", issue.AssigneeID, err) - } + if err = issue.loadAssignee(e); err != nil { + return } - if issue.IsPull && issue.PullRequest == nil { + if err = issue.loadPullRequest(e); err != nil && !IsErrPullRequestNotExist(err) { // It is possible pull request is not yet created. - issue.PullRequest, err = getPullRequestByIssueID(e, issue.ID) - if err != nil && !IsErrPullRequestNotExist(err) { - return fmt.Errorf("getPullRequestByIssueID [%d]: %v", issue.ID, err) - } + return err } if issue.Attachments == nil { @@ -174,7 +198,10 @@ func (issue *Issue) loadAttributes(e Engine) (err error) { } if issue.Comments == nil { - issue.Comments, err = getCommentsByIssueID(e, issue.ID) + issue.Comments, err = findComments(e, FindCommentsOptions{ + IssueID: issue.ID, + Type: CommentTypeUnknown, + }) if err != nil { return fmt.Errorf("getCommentsByIssueID [%d]: %v", issue.ID, err) } @@ -304,8 +331,15 @@ func (issue *Issue) HasLabel(labelID int64) bool { func (issue *Issue) sendLabelUpdatedWebhook(doer *User) { var err error if issue.IsPull { - err = issue.PullRequest.LoadIssue() - if err != nil { + if err = issue.loadRepo(x); err != nil { + log.Error(4, "loadRepo: %v", err) + return + } + if err = issue.loadPullRequest(x); err != nil { + log.Error(4, "loadPullRequest: %v", err) + return + } + if err = issue.PullRequest.LoadIssue(); err != nil { log.Error(4, "LoadIssue: %v", err) return } @@ -374,7 +408,7 @@ func (issue *Issue) RemoveLabel(doer *User, label *Label) error { return err } - if has, err := HasAccess(doer, issue.Repo, AccessModeWrite); err != nil { + if has, err := HasAccess(doer.ID, issue.Repo, AccessModeWrite); err != nil { return err } else if !has { return ErrLabelNotExist{} @@ -406,16 +440,18 @@ func (issue *Issue) clearLabels(e *xorm.Session, doer *User) (err error) { // Triggers appropriate WebHooks, if any. func (issue *Issue) ClearLabels(doer *User) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } if err := issue.loadRepo(sess); err != nil { return err + } else if err = issue.loadPullRequest(sess); err != nil { + return err } - if has, err := hasAccess(sess, doer, issue.Repo, AccessModeWrite); err != nil { + if has, err := hasAccess(sess, doer.ID, issue.Repo, AccessModeWrite); err != nil { return err } else if !has { return ErrLabelNotExist{} @@ -470,7 +506,7 @@ func (ts labelSorter) Swap(i, j int) { // Triggers appropriate WebHooks, if any. func (issue *Issue) ReplaceLabels(labels []*Label, doer *User) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -536,14 +572,11 @@ func (issue *Issue) ReadBy(userID int64) error { return err } - if err := setNotificationStatusReadIfUnread(x, userID, issue.ID); err != nil { - return err - } - - return nil + return setNotificationStatusReadIfUnread(x, userID, issue.ID) } func updateIssueCols(e Engine, issue *Issue, cols ...string) error { + cols = append(cols, "updated_unix") if _, err := e.Id(issue.ID).Cols(cols...).Update(issue); err != nil { return err } @@ -598,7 +631,7 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository, // ChangeStatus changes issue status to open or closed. func (issue *Issue) ChangeStatus(doer *User, repo *Repository, isClosed bool) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -733,7 +766,7 @@ func (issue *Issue) ChangeContent(doer *User, content string) (err error) { return nil } -// ChangeAssignee changes the Asssignee field of this issue. +// ChangeAssignee changes the Assignee field of this issue. func (issue *Issue) ChangeAssignee(doer *User, assigneeID int64) (err error) { var oldAssigneeID = issue.AssigneeID issue.AssigneeID = assigneeID @@ -809,23 +842,14 @@ func newIssue(e *xorm.Session, doer *User, opts NewIssueOptions) (err error) { } } - if opts.Issue.AssigneeID > 0 { - assignee, err := getUserByID(e, opts.Issue.AssigneeID) - if err != nil && !IsErrUserNotExist(err) { - return fmt.Errorf("getUserByID: %v", err) + if assigneeID := opts.Issue.AssigneeID; assigneeID > 0 { + valid, err := hasAccess(e, assigneeID, opts.Repo, AccessModeWrite) + if err != nil { + return fmt.Errorf("hasAccess [user_id: %d, repo_id: %d]: %v", assigneeID, opts.Repo.ID, err) } - - // Assume assignee is invalid and drop silently. - opts.Issue.AssigneeID = 0 - if assignee != nil { - valid, err := hasAccess(e, assignee, opts.Repo, AccessModeWrite) - if err != nil { - return fmt.Errorf("hasAccess [user_id: %d, repo_id: %d]: %v", assignee.ID, opts.Repo.ID, err) - } - if valid { - opts.Issue.AssigneeID = assignee.ID - opts.Issue.Assignee = assignee - } + if !valid { + opts.Issue.AssigneeID = 0 + opts.Issue.Assignee = nil } } @@ -908,7 +932,7 @@ func newIssue(e *xorm.Session, doer *User, opts NewIssueOptions) (err error) { // NewIssue creates new issue with labels for repository. func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, uuids []string) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -927,14 +951,13 @@ func NewIssue(repo *Repository, issue *Issue, labelIDs []int64, uuids []string) } if err = NotifyWatchers(&Action{ - ActUserID: issue.Poster.ID, - ActUserName: issue.Poster.Name, - OpType: ActionCreateIssue, - Content: fmt.Sprintf("%d|%s", issue.Index, issue.Title), - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, + ActUserID: issue.Poster.ID, + ActUser: issue.Poster, + OpType: ActionCreateIssue, + Content: fmt.Sprintf("%d|%s", issue.Index, issue.Title), + RepoID: repo.ID, + Repo: repo, + IsPrivate: repo.IsPrivate, }); err != nil { log.Error(4, "NotifyWatchers: %v", err) } @@ -955,7 +978,7 @@ func GetIssueByRef(ref string) (*Issue, error) { index, err := com.StrTo(ref[n+1:]).Int64() if err != nil { - return nil, err + return nil, errInvalidIssueNumber } repo, err := GetRepositoryByRef(ref[:n]) @@ -1003,7 +1026,7 @@ func getIssueByID(e Engine, id int64) (*Issue, error) { } else if !has { return nil, ErrIssueNotExist{id, 0, 0} } - return issue, issue.LoadAttributes() + return issue, issue.loadAttributes(e) } // GetIssueByID returns an issue by given ID. @@ -1011,6 +1034,16 @@ func GetIssueByID(id int64) (*Issue, error) { return getIssueByID(x, id) } +func getIssuesByIDs(e Engine, issueIDs []int64) ([]*Issue, error) { + issues := make([]*Issue, 0, 10) + return issues, e.In("id", issueIDs).Find(&issues) +} + +// GetIssuesByIDs return issues with the given IDs. +func GetIssuesByIDs(issueIDs []int64) ([]*Issue, error) { + return getIssuesByIDs(x, issueIDs) +} + // IssuesOptions represents options of an issue. type IssuesOptions struct { RepoID int64 @@ -1020,6 +1053,7 @@ type IssuesOptions struct { MilestoneID int64 RepoIDs []int64 Page int + PageSize int IsClosed util.OptionalBool IsPull util.OptionalBool Labels string @@ -1048,20 +1082,15 @@ func sortIssuesSession(sess *xorm.Session, sortType string) { } } -// Issues returns a list of issues by given conditions. -func Issues(opts *IssuesOptions) ([]*Issue, error) { - var sess *xorm.Session - if opts.Page >= 0 { +func (opts *IssuesOptions) setupSession(sess *xorm.Session) error { + if opts.Page >= 0 && opts.PageSize > 0 { var start int if opts.Page == 0 { start = 0 } else { - start = (opts.Page - 1) * setting.UI.IssuePagingNum + start = (opts.Page - 1) * opts.PageSize } - sess = x.Limit(setting.UI.IssuePagingNum, start) - } else { - sess = x.NewSession() - defer sess.Close() + sess.Limit(opts.PageSize, start) } if len(opts.IssueIDs) > 0 { @@ -1107,12 +1136,10 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) { sess.And("issue.is_pull=?", false) } - sortIssuesSession(sess, opts.SortType) - if len(opts.Labels) > 0 && opts.Labels != "0" { labelIDs, err := base.StringsToInt64s(strings.Split(opts.Labels, ",")) if err != nil { - return nil, err + return err } if len(labelIDs) > 0 { sess. @@ -1120,6 +1147,45 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) { In("issue_label.label_id", labelIDs) } } + return nil +} + +// CountIssuesByRepo map from repoID to number of issues matching the options +func CountIssuesByRepo(opts *IssuesOptions) (map[int64]int64, error) { + sess := x.NewSession() + defer sess.Close() + + if err := opts.setupSession(sess); err != nil { + return nil, err + } + + countsSlice := make([]*struct { + RepoID int64 + Count int64 + }, 0, 10) + if err := sess.GroupBy("issue.repo_id"). + Select("issue.repo_id AS repo_id, COUNT(*) AS count"). + Table("issue"). + Find(&countsSlice); err != nil { + return nil, err + } + + countMap := make(map[int64]int64, len(countsSlice)) + for _, c := range countsSlice { + countMap[c.RepoID] = c.Count + } + return countMap, nil +} + +// Issues returns a list of issues by given conditions. +func Issues(opts *IssuesOptions) ([]*Issue, error) { + sess := x.NewSession() + defer sess.Close() + + if err := opts.setupSession(sess); err != nil { + return nil, err + } + sortIssuesSession(sess, opts.SortType) issues := make([]*Issue, 0, setting.UI.IssuePagingNum) if err := sess.Find(&issues); err != nil { @@ -1133,6 +1199,24 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) { return issues, nil } +// GetParticipantsByIssueID returns all users who are participated in comments of an issue. +func GetParticipantsByIssueID(issueID int64) ([]*User, error) { + userIDs := make([]int64, 0, 5) + if err := x.Table("comment").Cols("poster_id"). + Where("issue_id = ?", issueID). + And("type = ?", CommentTypeComment). + Distinct("poster_id"). + Find(&userIDs); err != nil { + return nil, fmt.Errorf("get poster IDs: %v", err) + } + if len(userIDs) == 0 { + return nil, nil + } + + users := make([]*User, 0, len(userIDs)) + return users, x.In("id", userIDs).Find(&users) +} + // UpdateIssueMentions extracts mentioned people from content and // updates issue-user relations for them. func UpdateIssueMentions(e Engine, issueID int64, mentions []string) error { @@ -1205,7 +1289,6 @@ func parseCountResult(results []map[string][]byte) int64 { // IssueStatsOptions contains parameters accepted by GetIssueStats. type IssueStatsOptions struct { - FilterMode int RepoID int64 Labels string MilestoneID int64 @@ -1223,7 +1306,7 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) { countSession := func(opts *IssueStatsOptions) *xorm.Session { sess := x. Where("issue.repo_id = ?", opts.RepoID). - And("is_pull = ?", opts.IsPull) + And("issue.is_pull = ?", opts.IsPull) if len(opts.IssueIDs) > 0 { sess.In("issue.id", opts.IssueIDs) @@ -1234,8 +1317,8 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) { if err != nil { log.Warn("Malformed Labels argument: %s", opts.Labels) } else if len(labelIDs) > 0 { - sess.Join("INNER", "issue_label", "issue.id = issue_id"). - In("label_id", labelIDs) + sess.Join("INNER", "issue_label", "issue.id = issue_label.issue_id"). + In("issue_label.label_id", labelIDs) } } @@ -1244,11 +1327,11 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) { } if opts.AssigneeID > 0 { - sess.And("assignee_id = ?", opts.AssigneeID) + sess.And("issue.assignee_id = ?", opts.AssigneeID) } if opts.PosterID > 0 { - sess.And("poster_id = ?", opts.PosterID) + sess.And("issue.poster_id = ?", opts.PosterID) } if opts.MentionedID > 0 { @@ -1261,40 +1344,15 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) { } var err error - switch opts.FilterMode { - case FilterModeAll, FilterModeAssign: - stats.OpenCount, err = countSession(opts). - And("is_closed = ?", false). - Count(new(Issue)) - - stats.ClosedCount, err = countSession(opts). - And("is_closed = ?", true). - Count(new(Issue)) - case FilterModeCreate: - stats.OpenCount, err = countSession(opts). - And("poster_id = ?", opts.PosterID). - And("is_closed = ?", false). - Count(new(Issue)) - - stats.ClosedCount, err = countSession(opts). - And("poster_id = ?", opts.PosterID). - And("is_closed = ?", true). - Count(new(Issue)) - case FilterModeMention: - stats.OpenCount, err = countSession(opts). - Join("INNER", "issue_user", "issue.id = issue_user.issue_id"). - And("issue_user.uid = ?", opts.PosterID). - And("issue_user.is_mentioned = ?", true). - And("issue.is_closed = ?", false). - Count(new(Issue)) - - stats.ClosedCount, err = countSession(opts). - Join("INNER", "issue_user", "issue.id = issue_user.issue_id"). - And("issue_user.uid = ?", opts.PosterID). - And("issue_user.is_mentioned = ?", true). - And("issue.is_closed = ?", true). - Count(new(Issue)) + stats.OpenCount, err = countSession(opts). + And("issue.is_closed = ?", false). + Count(new(Issue)) + if err != nil { + return stats, err } + stats.ClosedCount, err = countSession(opts). + And("issue.is_closed = ?", true). + Count(new(Issue)) return stats, err } diff --git a/models/issue_comment.go b/models/issue_comment.go index e133cc0..753e79b 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -10,6 +10,7 @@ import ( "time" "github.com/Unknwon/com" + "github.com/go-xorm/builder" "github.com/go-xorm/xorm" api "code.gitea.io/sdk/gitea" @@ -21,6 +22,11 @@ import ( // CommentType defines whether a comment is just a simple comment, an action (like close) or a reference. type CommentType int +// define unknown comment type +const ( + CommentTypeUnknown CommentType = -1 +) + // Enumerate all the comment types const ( // Plain comment, can be associated with a commit (CommitID > 0) and a line (LineNum > 0) @@ -153,7 +159,7 @@ func (c *Comment) HTMLURL() string { log.Error(4, "GetIssueByID(%d): %v", c.IssueID, err) return "" } - return fmt.Sprintf("%s#issuecomment-%d", issue.HTMLURL(), c.ID) + return fmt.Sprintf("%s#%s", issue.HTMLURL(), c.HashTag()) } // IssueURL formats a URL-string to the issue @@ -231,12 +237,9 @@ func (c *Comment) LoadMilestone() error { has, err := x.ID(c.OldMilestoneID).Get(&oldMilestone) if err != nil { return err - } else if !has { - return ErrMilestoneNotExist{ - ID: c.OldMilestoneID, - } + } else if has { + c.OldMilestone = &oldMilestone } - c.OldMilestone = &oldMilestone } if c.MilestoneID > 0 { @@ -244,12 +247,9 @@ func (c *Comment) LoadMilestone() error { has, err := x.ID(c.MilestoneID).Get(&milestone) if err != nil { return err - } else if !has { - return ErrMilestoneNotExist{ - ID: c.MilestoneID, - } + } else if has { + c.Milestone = &milestone } - c.Milestone = &milestone } return nil } @@ -289,7 +289,7 @@ func (c *Comment) MailParticipants(e Engine, opType ActionType, issue *Issue) (e case ActionReopenIssue: issue.Content = fmt.Sprintf("Reopened #%d", issue.Index) } - if err = mailIssueCommentToParticipants(issue, c.Poster, mentions); err != nil { + if err = mailIssueCommentToParticipants(issue, c.Poster, c, mentions); err != nil { log.Error(4, "mailIssueCommentToParticipants: %v", err) } @@ -329,13 +329,14 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err // Compose comment action, could be plain comment, close or reopen issue/pull request. // This object will be used to notify watchers in the end of function. act := &Action{ - ActUserID: opts.Doer.ID, - ActUserName: opts.Doer.Name, - Content: fmt.Sprintf("%d|%s", opts.Issue.Index, strings.Split(opts.Content, "\n")[0]), - RepoID: opts.Repo.ID, - RepoUserName: opts.Repo.Owner.Name, - RepoName: opts.Repo.Name, - IsPrivate: opts.Repo.IsPrivate, + ActUserID: opts.Doer.ID, + ActUser: opts.Doer, + Content: fmt.Sprintf("%d|%s", opts.Issue.Index, strings.Split(opts.Content, "\n")[0]), + RepoID: opts.Repo.ID, + Repo: opts.Repo, + Comment: comment, + CommentID: comment.ID, + IsPrivate: opts.Repo.IsPrivate, } // Check comment type. @@ -398,7 +399,11 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err if err != nil { return nil, err } + } + // update the issue's updated_unix column + if err = updateIssueCols(e, opts.Issue); err != nil { + return nil, err } // Notify watchers for whatever action comes in, ignore if no action type. @@ -509,7 +514,7 @@ type CreateCommentOptions struct { // CreateComment creates comment of issue or commit. func CreateComment(opts *CreateCommentOptions) (comment *Comment, err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return nil, err } @@ -575,45 +580,71 @@ func GetCommentByID(id int64) (*Comment, error) { return c, nil } -func getCommentsByIssueIDSince(e Engine, issueID, since int64) ([]*Comment, error) { - comments := make([]*Comment, 0, 10) - sess := e. - Where("issue_id = ?", issueID). - Asc("created_unix") - if since > 0 { - sess.And("updated_unix >= ?", since) - } - return comments, sess.Find(&comments) +// FindCommentsOptions describes the conditions to Find comments +type FindCommentsOptions struct { + RepoID int64 + IssueID int64 + Since int64 + Type CommentType } -func getCommentsByRepoIDSince(e Engine, repoID, since int64) ([]*Comment, error) { - comments := make([]*Comment, 0, 10) - sess := e.Where("issue.repo_id = ?", repoID). - Join("INNER", "issue", "issue.id = comment.issue_id"). - Asc("comment.created_unix") - if since > 0 { - sess.And("comment.updated_unix >= ?", since) +func (opts *FindCommentsOptions) toConds() builder.Cond { + var cond = builder.NewCond() + if opts.RepoID > 0 { + cond = cond.And(builder.Eq{"issue.repo_id": opts.RepoID}) } - return comments, sess.Find(&comments) + if opts.IssueID > 0 { + cond = cond.And(builder.Eq{"comment.issue_id": opts.IssueID}) + } + if opts.Since > 0 { + cond = cond.And(builder.Gte{"comment.updated_unix": opts.Since}) + } + if opts.Type != CommentTypeUnknown { + cond = cond.And(builder.Eq{"comment.type": opts.Type}) + } + return cond } -func getCommentsByIssueID(e Engine, issueID int64) ([]*Comment, error) { - return getCommentsByIssueIDSince(e, issueID, -1) +func findComments(e Engine, opts FindCommentsOptions) ([]*Comment, error) { + comments := make([]*Comment, 0, 10) + sess := e.Where(opts.toConds()) + if opts.RepoID > 0 { + sess.Join("INNER", "issue", "issue.id = comment.issue_id") + } + return comments, sess. + Asc("comment.created_unix"). + Find(&comments) +} + +// FindComments returns all comments according options +func FindComments(opts FindCommentsOptions) ([]*Comment, error) { + return findComments(x, opts) } // GetCommentsByIssueID returns all comments of an issue. func GetCommentsByIssueID(issueID int64) ([]*Comment, error) { - return getCommentsByIssueID(x, issueID) + return findComments(x, FindCommentsOptions{ + IssueID: issueID, + Type: CommentTypeUnknown, + }) } // GetCommentsByIssueIDSince returns a list of comments of an issue since a given time point. func GetCommentsByIssueIDSince(issueID, since int64) ([]*Comment, error) { - return getCommentsByIssueIDSince(x, issueID, since) + return findComments(x, FindCommentsOptions{ + IssueID: issueID, + Type: CommentTypeUnknown, + Since: since, + }) } // GetCommentsByRepoIDSince returns a list of comments for all issues in a repo since a given time point. func GetCommentsByRepoIDSince(repoID, since int64) ([]*Comment, error) { - return getCommentsByRepoIDSince(x, repoID, since) + return findComments(x, FindCommentsOptions{ + RepoID: repoID, + Type: CommentTypeUnknown, + Since: since, + }) } // UpdateComment updates information of comment. @@ -625,7 +656,7 @@ func UpdateComment(c *Comment) error { // DeleteComment deletes the comment func DeleteComment(comment *Comment) error { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err := sess.Begin(); err != nil { return err } @@ -642,5 +673,9 @@ func DeleteComment(comment *Comment) error { } } + if _, err := sess.Where("comment_id = ?", comment.ID).Cols("is_deleted").Update(&Action{IsDeleted: true}); err != nil { + return err + } + return sess.Commit() } diff --git a/models/issue_comment_test.go b/models/issue_comment_test.go new file mode 100644 index 0000000..86fc32a --- /dev/null +++ b/models/issue_comment_test.go @@ -0,0 +1,41 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestCreateComment(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + issue := AssertExistsAndLoadBean(t, &Issue{}).(*Issue) + repo := AssertExistsAndLoadBean(t, &Repository{ID: issue.RepoID}).(*Repository) + doer := AssertExistsAndLoadBean(t, &User{ID: repo.OwnerID}).(*User) + + now := time.Now().Unix() + comment, err := CreateComment(&CreateCommentOptions{ + Type: CommentTypeComment, + Doer: doer, + Repo: repo, + Issue: issue, + Content: "Hello", + }) + assert.NoError(t, err) + then := time.Now().Unix() + + assert.EqualValues(t, CommentTypeComment, comment.Type) + assert.EqualValues(t, "Hello", comment.Content) + assert.EqualValues(t, issue.ID, comment.IssueID) + assert.EqualValues(t, doer.ID, comment.PosterID) + AssertInt64InRange(t, now, then, comment.CreatedUnix) + AssertExistsAndLoadBean(t, comment) // assert actually added to DB + + updatedIssue := AssertExistsAndLoadBean(t, &Issue{ID: issue.ID}).(*Issue) + AssertInt64InRange(t, now, then, updatedIssue.UpdatedUnix) +} diff --git a/models/issue_indexer.go b/models/issue_indexer.go index be74bb2..05b324f 100644 --- a/models/issue_indexer.go +++ b/models/issue_indexer.go @@ -13,6 +13,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" + "github.com/blevesearch/bleve" "github.com/blevesearch/bleve/analysis/analyzer/simple" "github.com/blevesearch/bleve/search/query" @@ -132,7 +133,6 @@ func populateIssueIndexer() error { RepoID: repo.ID, IsClosed: util.OptionalBoolNone, IsPull: util.OptionalBoolNone, - Page: -1, // do not page }) if err != nil { return fmt.Errorf("Issues: %v", err) diff --git a/models/issue_label.go b/models/issue_label.go index 67e0ac7..5ecd355 100644 --- a/models/issue_label.go +++ b/models/issue_label.go @@ -96,12 +96,31 @@ func (label *Label) ForegroundColor() template.CSS { return template.CSS("#000") } -// NewLabels creates new label(s) for a repository. -func NewLabels(labels ...*Label) error { - _, err := x.Insert(labels) +func newLabel(e Engine, label *Label) error { + _, err := e.Insert(label) return err } +// NewLabel creates a new label for a repository +func NewLabel(label *Label) error { + return newLabel(x, label) +} + +// NewLabels creates new labels for a repository. +func NewLabels(labels ...*Label) error { + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + for _, label := range labels { + if err := newLabel(sess, label); err != nil { + return err + } + } + return sess.Commit() +} + // getLabelInRepoByName returns a label by Name in given repository. // If pass repoID as 0, then ORM will ignore limitation of repository // and can return arbitrary label with any valid ID. @@ -223,7 +242,7 @@ func DeleteLabel(repoID, labelID int64) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -298,7 +317,7 @@ func NewIssueLabel(issue *Issue, label *Label, doer *User) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -327,7 +346,7 @@ func newIssueLabels(e *xorm.Session, issue *Issue, labels []*Label, doer *User) // NewIssueLabels creates a list of issue-label relations. func NewIssueLabels(issue *Issue, labels []*Label, doer *User) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -375,7 +394,7 @@ func deleteIssueLabel(e *xorm.Session, issue *Issue, label *Label, doer *User) ( // DeleteIssueLabel deletes issue-label relation. func DeleteIssueLabel(issue *Issue, label *Label, doer *User) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } diff --git a/models/issue_label_test.go b/models/issue_label_test.go index 2ef3966..33630cd 100644 --- a/models/issue_label_test.go +++ b/models/issue_label_test.go @@ -52,7 +52,7 @@ func TestNewLabels(t *testing.T) { } assert.NoError(t, NewLabels(labels...)) for _, label := range labels { - AssertExistsAndLoadBean(t, label) + AssertExistsAndLoadBean(t, label, Cond("id = ?", label.ID)) } CheckConsistencyFor(t, &Label{}, &Repository{}) } diff --git a/models/issue_list.go b/models/issue_list.go index 692243e..cef4ec0 100644 --- a/models/issue_list.go +++ b/models/issue_list.go @@ -59,17 +59,23 @@ func (issues IssueList) loadPosters(e Engine) error { return nil } - postgerIDs := issues.getPosterIDs() - posterMaps := make(map[int64]*User, len(postgerIDs)) + posterIDs := issues.getPosterIDs() + posterMaps := make(map[int64]*User, len(posterIDs)) err := e. - In("id", postgerIDs). + In("id", posterIDs). Find(&posterMaps) if err != nil { return err } for _, issue := range issues { - issue.Poster = posterMaps[issue.PosterID] + if issue.PosterID <= 0 { + continue + } + var ok bool + if issue.Poster, ok = posterMaps[issue.PosterID]; !ok { + issue.Poster = NewGhostUser() + } } return nil } @@ -173,7 +179,13 @@ func (issues IssueList) loadAssignees(e Engine) error { } for _, issue := range issues { - issue.Assignee = assigneeMaps[issue.AssigneeID] + if issue.AssigneeID <= 0 { + continue + } + var ok bool + if issue.Assignee, ok = assigneeMaps[issue.AssigneeID]; !ok { + issue.Assignee = NewGhostUser() + } } return nil } diff --git a/models/issue_list_test.go b/models/issue_list_test.go new file mode 100644 index 0000000..958e074 --- /dev/null +++ b/models/issue_list_test.go @@ -0,0 +1,65 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIssueList_LoadRepositories(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + issueList := IssueList{ + AssertExistsAndLoadBean(t, &Issue{ID: 1}).(*Issue), + AssertExistsAndLoadBean(t, &Issue{ID: 2}).(*Issue), + AssertExistsAndLoadBean(t, &Issue{ID: 4}).(*Issue), + } + + repos, err := issueList.LoadRepositories() + assert.NoError(t, err) + assert.Len(t, repos, 2) + for _, issue := range issueList { + assert.EqualValues(t, issue.RepoID, issue.Repo.ID) + } +} + +func TestIssueList_LoadAttributes(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + issueList := IssueList{ + AssertExistsAndLoadBean(t, &Issue{ID: 1}).(*Issue), + AssertExistsAndLoadBean(t, &Issue{ID: 2}).(*Issue), + AssertExistsAndLoadBean(t, &Issue{ID: 4}).(*Issue), + } + + assert.NoError(t, issueList.LoadAttributes()) + for _, issue := range issueList { + assert.EqualValues(t, issue.RepoID, issue.Repo.ID) + for _, label := range issue.Labels { + assert.EqualValues(t, issue.RepoID, label.RepoID) + AssertExistsAndLoadBean(t, &IssueLabel{IssueID: issue.ID, LabelID: label.ID}) + } + if issue.PosterID > 0 { + assert.EqualValues(t, issue.PosterID, issue.Poster.ID) + } + if issue.AssigneeID > 0 { + assert.EqualValues(t, issue.AssigneeID, issue.Assignee.ID) + } + if issue.MilestoneID > 0 { + assert.EqualValues(t, issue.MilestoneID, issue.Milestone.ID) + } + if issue.IsPull { + assert.EqualValues(t, issue.ID, issue.PullRequest.IssueID) + } + for _, attachment := range issue.Attachments { + assert.EqualValues(t, issue.ID, attachment.IssueID) + } + for _, comment := range issue.Comments { + assert.EqualValues(t, issue.ID, comment.IssueID) + } + } +} diff --git a/models/issue_mail.go b/models/issue_mail.go index 4b07660..b9e1a69 100644 --- a/models/issue_mail.go +++ b/models/issue_mail.go @@ -19,15 +19,32 @@ func (issue *Issue) mailSubject() string { } // mailIssueCommentToParticipants can be used for both new issue creation and comment. -func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string) error { +// This function sends two list of emails: +// 1. Repository watchers and users who are participated in comments. +// 2. Users who are not in 1. but get mentioned in current issue/comment. +func mailIssueCommentToParticipants(issue *Issue, doer *User, comment *Comment, mentions []string) error { if !setting.Service.EnableNotifyMail { return nil } - // Mail watchers. watchers, err := GetWatchers(issue.RepoID) if err != nil { - return fmt.Errorf("GetWatchers [%d]: %v", issue.RepoID, err) + return fmt.Errorf("GetWatchers [repo_id: %d]: %v", issue.RepoID, err) + } + participants, err := GetParticipantsByIssueID(issue.ID) + if err != nil { + return fmt.Errorf("GetParticipantsByIssueID [issue_id: %d]: %v", issue.ID, err) + } + + // In case the issue poster is not watching the repository, + // even if we have duplicated in watchers, can be safely filtered out. + if issue.PosterID != doer.ID { + participants = append(participants, issue.Poster) + } + + // Assignee must receive any communications + if issue.Assignee != nil && issue.AssigneeID > 0 && issue.AssigneeID != doer.ID { + participants = append(participants, issue.Assignee) } tos := make([]string, 0, len(watchers)) // List of email addresses. @@ -48,7 +65,18 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string) tos = append(tos, to.Email) names = append(names, to.Name) } - SendIssueCommentMail(issue, doer, tos) + for i := range participants { + if participants[i].ID == doer.ID { + continue + } else if com.IsSliceContainsStr(names, participants[i].Name) { + continue + } + + tos = append(tos, participants[i].Email) + names = append(names, participants[i].Name) + } + + SendIssueCommentMail(issue, doer, comment, tos) // Mail mentioned people and exclude watchers. names = append(names, doer.Name) @@ -60,7 +88,7 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string) tos = append(tos, mentions[i]) } - SendIssueMentionMail(issue, doer, GetUserEmailsByNames(tos)) + SendIssueMentionMail(issue, doer, comment, GetUserEmailsByNames(tos)) return nil } @@ -73,7 +101,7 @@ func (issue *Issue) MailParticipants() (err error) { return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err) } - if err = mailIssueCommentToParticipants(issue, issue.Poster, mentions); err != nil { + if err = mailIssueCommentToParticipants(issue, issue.Poster, nil, mentions); err != nil { log.Error(4, "mailIssueCommentToParticipants: %v", err) } diff --git a/models/issue_milestone.go b/models/issue_milestone.go index cfd2ce1..d12c309 100644 --- a/models/issue_milestone.go +++ b/models/issue_milestone.go @@ -104,7 +104,7 @@ func (m *Milestone) APIFormat() *api.Milestone { // NewMilestone creates new milestone of repository. func NewMilestone(m *Milestone) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -215,7 +215,7 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -330,7 +330,7 @@ func DeleteMilestoneByRepoID(repoID, id int64) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } diff --git a/models/issue_milestone_test.go b/models/issue_milestone_test.go index aa4038d..7926b34 100644 --- a/models/issue_milestone_test.go +++ b/models/issue_milestone_test.go @@ -5,13 +5,13 @@ package models import ( + "sort" "testing" + "time" api "code.gitea.io/sdk/gitea" "github.com/stretchr/testify/assert" - "sort" - "time" ) func TestMilestone_State(t *testing.T) { diff --git a/models/issue_test.go b/models/issue_test.go index a6da809..8a8ccce 100644 --- a/models/issue_test.go +++ b/models/issue_test.go @@ -5,7 +5,9 @@ package models import ( + "sort" "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -42,3 +44,126 @@ func TestIssueAPIURL(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/issues/1", issue.APIURL()) } + +func TestGetIssuesByIDs(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + testSuccess := func(expectedIssueIDs []int64, nonExistentIssueIDs []int64) { + issues, err := GetIssuesByIDs(append(expectedIssueIDs, nonExistentIssueIDs...)) + assert.NoError(t, err) + actualIssueIDs := make([]int64, len(issues)) + for i, issue := range issues { + actualIssueIDs[i] = issue.ID + } + assert.Equal(t, expectedIssueIDs, actualIssueIDs) + + } + testSuccess([]int64{1, 2, 3}, []int64{}) + testSuccess([]int64{1, 2, 3}, []int64{NonexistentID}) +} + +func TestGetParticipantsByIssueID(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + checkParticipants := func(issueID int64, userIDs []int) { + participants, err := GetParticipantsByIssueID(issueID) + if assert.NoError(t, err) { + participantsIDs := make([]int, len(participants)) + for i, u := range participants { + participantsIDs[i] = int(u.ID) + } + sort.Ints(participantsIDs) + sort.Ints(userIDs) + assert.Equal(t, userIDs, participantsIDs) + } + } + + // User 1 is issue1 poster (see fixtures/issue.yml) + // User 2 only labeled issue1 (see fixtures/comment.yml) + // Users 3 and 5 made actual comments (see fixtures/comment.yml) + checkParticipants(1, []int{3, 5}) +} + +func TestIssue_AddLabel(t *testing.T) { + var tests = []struct { + issueID int64 + labelID int64 + doerID int64 + }{ + {1, 2, 2}, // non-pull-request, not-already-added label + {1, 1, 2}, // non-pull-request, already-added label + {2, 2, 2}, // pull-request, not-already-added label + {2, 1, 2}, // pull-request, already-added label + } + for _, test := range tests { + assert.NoError(t, PrepareTestDatabase()) + issue := AssertExistsAndLoadBean(t, &Issue{ID: test.issueID}).(*Issue) + label := AssertExistsAndLoadBean(t, &Label{ID: test.labelID}).(*Label) + doer := AssertExistsAndLoadBean(t, &User{ID: test.doerID}).(*User) + assert.NoError(t, issue.AddLabel(doer, label)) + AssertExistsAndLoadBean(t, &IssueLabel{IssueID: test.issueID, LabelID: test.labelID}) + } +} + +func TestIssue_AddLabels(t *testing.T) { + var tests = []struct { + issueID int64 + labelIDs []int64 + doerID int64 + }{ + {1, []int64{1, 2}, 2}, // non-pull-request + {1, []int64{}, 2}, // non-pull-request, empty + {2, []int64{1, 2}, 2}, // pull-request + {2, []int64{}, 1}, // pull-request, empty + } + for _, test := range tests { + assert.NoError(t, PrepareTestDatabase()) + issue := AssertExistsAndLoadBean(t, &Issue{ID: test.issueID}).(*Issue) + labels := make([]*Label, len(test.labelIDs)) + for i, labelID := range test.labelIDs { + labels[i] = AssertExistsAndLoadBean(t, &Label{ID: labelID}).(*Label) + } + doer := AssertExistsAndLoadBean(t, &User{ID: test.doerID}).(*User) + assert.NoError(t, issue.AddLabels(doer, labels)) + for _, labelID := range test.labelIDs { + AssertExistsAndLoadBean(t, &IssueLabel{IssueID: test.issueID, LabelID: labelID}) + } + } +} + +func TestIssue_ClearLabels(t *testing.T) { + var tests = []struct { + issueID int64 + doerID int64 + }{ + {1, 2}, // non-pull-request, has labels + {2, 2}, // pull-request, has labels + {3, 2}, // pull-request, has no labels + } + for _, test := range tests { + assert.NoError(t, PrepareTestDatabase()) + issue := AssertExistsAndLoadBean(t, &Issue{ID: test.issueID}).(*Issue) + doer := AssertExistsAndLoadBean(t, &User{ID: test.doerID}).(*User) + assert.NoError(t, issue.ClearLabels(doer)) + AssertNotExistsBean(t, &IssueLabel{IssueID: test.issueID}) + } +} + +func TestUpdateIssueCols(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + issue := AssertExistsAndLoadBean(t, &Issue{}).(*Issue) + + const newTitle = "New Title for unit test" + issue.Title = newTitle + + prevContent := issue.Content + issue.Content = "This should have no effect" + + now := time.Now().Unix() + assert.NoError(t, UpdateIssueCols(issue, "name")) + then := time.Now().Unix() + + updatedIssue := AssertExistsAndLoadBean(t, &Issue{ID: issue.ID}).(*Issue) + assert.EqualValues(t, newTitle, updatedIssue.Title) + assert.EqualValues(t, prevContent, updatedIssue.Content) + AssertInt64InRange(t, now, then, updatedIssue.UpdatedUnix) +} diff --git a/models/issue_user.go b/models/issue_user.go index 024a3cc..11d47dd 100644 --- a/models/issue_user.go +++ b/models/issue_user.go @@ -69,7 +69,7 @@ func updateIssueUserByAssignee(e Engine, issue *Issue) (err error) { // UpdateIssueUserByAssignee updates issue-user relation for assignee. func UpdateIssueUserByAssignee(issue *Issue) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } diff --git a/models/issue_watch.go b/models/issue_watch.go new file mode 100644 index 0000000..3751178 --- /dev/null +++ b/models/issue_watch.go @@ -0,0 +1,96 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "time" +) + +// IssueWatch is connection request for receiving issue notification. +type IssueWatch struct { + ID int64 `xorm:"pk autoincr"` + UserID int64 `xorm:"UNIQUE(watch) NOT NULL"` + IssueID int64 `xorm:"UNIQUE(watch) NOT NULL"` + IsWatching bool `xorm:"NOT NULL"` + Created time.Time `xorm:"-"` + CreatedUnix int64 `xorm:"NOT NULL"` + Updated time.Time `xorm:"-"` + UpdatedUnix int64 `xorm:"NOT NULL"` +} + +// BeforeInsert is invoked from XORM before inserting an object of this type. +func (iw *IssueWatch) BeforeInsert() { + var ( + t = time.Now() + u = t.Unix() + ) + iw.Created = t + iw.CreatedUnix = u + iw.Updated = t + iw.UpdatedUnix = u +} + +// BeforeUpdate is invoked from XORM before updating an object of this type. +func (iw *IssueWatch) BeforeUpdate() { + var ( + t = time.Now() + u = t.Unix() + ) + iw.Updated = t + iw.UpdatedUnix = u +} + +// CreateOrUpdateIssueWatch set watching for a user and issue +func CreateOrUpdateIssueWatch(userID, issueID int64, isWatching bool) error { + iw, exists, err := getIssueWatch(x, userID, issueID) + if err != nil { + return err + } + + if !exists { + iw = &IssueWatch{ + UserID: userID, + IssueID: issueID, + IsWatching: isWatching, + } + + if _, err := x.Insert(iw); err != nil { + return err + } + } else { + iw.IsWatching = isWatching + + if _, err := x.Id(iw.ID).Cols("is_watching", "updated_unix").Update(iw); err != nil { + return err + } + } + return nil +} + +// GetIssueWatch returns an issue watch by user and issue +func GetIssueWatch(userID, issueID int64) (iw *IssueWatch, exists bool, err error) { + return getIssueWatch(x, userID, issueID) +} + +func getIssueWatch(e Engine, userID, issueID int64) (iw *IssueWatch, exists bool, err error) { + iw = new(IssueWatch) + exists, err = e. + Where("user_id = ?", userID). + And("issue_id = ?", issueID). + Get(iw) + return +} + +// GetIssueWatchers returns watchers/unwatchers of a given issue +func GetIssueWatchers(issueID int64) ([]*IssueWatch, error) { + return getIssueWatchers(x, issueID) +} + +func getIssueWatchers(e Engine, issueID int64) (watches []*IssueWatch, err error) { + err = e. + Where("issue_id = ?", issueID). + Find(&watches) + return +} diff --git a/models/issue_watch_test.go b/models/issue_watch_test.go new file mode 100644 index 0000000..d8b456c --- /dev/null +++ b/models/issue_watch_test.go @@ -0,0 +1,51 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCreateOrUpdateIssueWatch(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + assert.NoError(t, CreateOrUpdateIssueWatch(3, 1, true)) + iw := AssertExistsAndLoadBean(t, &IssueWatch{UserID: 3, IssueID: 1}).(*IssueWatch) + assert.Equal(t, true, iw.IsWatching) + + assert.NoError(t, CreateOrUpdateIssueWatch(1, 1, false)) + iw = AssertExistsAndLoadBean(t, &IssueWatch{UserID: 1, IssueID: 1}).(*IssueWatch) + assert.Equal(t, false, iw.IsWatching) +} + +func TestGetIssueWatch(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + _, exists, err := GetIssueWatch(1, 1) + assert.Equal(t, true, exists) + assert.NoError(t, err) + + _, exists, err = GetIssueWatch(2, 2) + assert.Equal(t, true, exists) + assert.NoError(t, err) + + _, exists, err = GetIssueWatch(3, 1) + assert.Equal(t, false, exists) + assert.NoError(t, err) +} + +func TestGetIssueWatchers(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + iws, err := GetIssueWatchers(1) + assert.NoError(t, err) + assert.Equal(t, 1, len(iws)) + + iws, err = GetIssueWatchers(5) + assert.NoError(t, err) + assert.Equal(t, 0, len(iws)) +} diff --git a/models/lfs.go b/models/lfs.go index 99b8138..f908cae 100644 --- a/models/lfs.go +++ b/models/lfs.go @@ -56,7 +56,7 @@ func NewLFSMetaObject(m *LFSMetaObject) (*LFSMetaObject, error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return nil, err } @@ -94,7 +94,7 @@ func RemoveLFSMetaObjectByOid(oid string) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err := sess.Begin(); err != nil { return err } diff --git a/models/login_source.go b/models/login_source.go index b314253..4778ccd 100644 --- a/models/login_source.go +++ b/models/login_source.go @@ -121,9 +121,11 @@ func (cfg *PAMConfig) ToDB() ([]byte, error) { // OAuth2Config holds configuration for the OAuth2 login source. type OAuth2Config struct { - Provider string - ClientID string - ClientSecret string + Provider string + ClientID string + ClientSecret string + OpenIDConnectAutoDiscoveryURL string + CustomURLMapping *oauth2.CustomURLMapping } // FromDB fills up an OAuth2Config from serialized format. @@ -138,11 +140,12 @@ func (cfg *OAuth2Config) ToDB() ([]byte, error) { // LoginSource represents an external way for authorizing users. type LoginSource struct { - ID int64 `xorm:"pk autoincr"` - Type LoginType - Name string `xorm:"UNIQUE"` - IsActived bool `xorm:"INDEX NOT NULL DEFAULT false"` - Cfg core.Conversion `xorm:"TEXT"` + ID int64 `xorm:"pk autoincr"` + Type LoginType + Name string `xorm:"UNIQUE"` + IsActived bool `xorm:"INDEX NOT NULL DEFAULT false"` + IsSyncEnabled bool `xorm:"INDEX NOT NULL DEFAULT false"` + Cfg core.Conversion `xorm:"TEXT"` Created time.Time `xorm:"-"` CreatedUnix int64 `xorm:"INDEX"` @@ -292,11 +295,21 @@ func CreateLoginSource(source *LoginSource) error { } else if has { return ErrLoginSourceAlreadyExist{source.Name} } + // Synchronization is only aviable with LDAP for now + if !source.IsLDAP() { + source.IsSyncEnabled = false + } _, err = x.Insert(source) - if err == nil && source.IsOAuth2() { + if err == nil && source.IsOAuth2() && source.IsActived { oAuth2Config := source.OAuth2() - oauth2.RegisterProvider(source.Name, oAuth2Config.Provider, oAuth2Config.ClientID, oAuth2Config.ClientSecret) + err = oauth2.RegisterProvider(source.Name, oAuth2Config.Provider, oAuth2Config.ClientID, oAuth2Config.ClientSecret, oAuth2Config.OpenIDConnectAutoDiscoveryURL, oAuth2Config.CustomURLMapping) + err = wrapOpenIDConnectInitializeError(err, source.Name, oAuth2Config) + + if err != nil { + // remove the LoginSource in case of errors while registering OAuth2 providers + x.Delete(source) + } } return err } @@ -321,11 +334,25 @@ func GetLoginSourceByID(id int64) (*LoginSource, error) { // UpdateSource updates a LoginSource record in DB. func UpdateSource(source *LoginSource) error { + var originalLoginSource *LoginSource + if source.IsOAuth2() { + // keep track of the original values so we can restore in case of errors while registering OAuth2 providers + var err error + if originalLoginSource, err = GetLoginSourceByID(source.ID); err != nil { + return err + } + } + _, err := x.Id(source.ID).AllCols().Update(source) - if err == nil && source.IsOAuth2() { + if err == nil && source.IsOAuth2() && source.IsActived { oAuth2Config := source.OAuth2() - oauth2.RemoveProvider(source.Name) - oauth2.RegisterProvider(source.Name, oAuth2Config.Provider, oAuth2Config.ClientID, oAuth2Config.ClientSecret) + err = oauth2.RegisterProvider(source.Name, oAuth2Config.Provider, oAuth2Config.ClientID, oAuth2Config.ClientSecret, oAuth2Config.OpenIDConnectAutoDiscoveryURL, oAuth2Config.CustomURLMapping) + err = wrapOpenIDConnectInitializeError(err, source.Name, oAuth2Config) + + if err != nil { + // restore original values since we cannot update the provider it self + x.Id(source.ID).AllCols().Update(originalLoginSource) + } } return err } @@ -383,8 +410,8 @@ func composeFullName(firstname, surname, username string) string { // LoginViaLDAP queries if login/password is valid against the LDAP directory pool, // and create a local user if success when enabled. func LoginViaLDAP(user *User, login, password string, source *LoginSource, autoRegister bool) (*User, error) { - username, fn, sn, mail, isAdmin, succeed := source.Cfg.(*LDAPConfig).SearchEntry(login, password, source.Type == LoginDLDAP) - if !succeed { + sr := source.Cfg.(*LDAPConfig).SearchEntry(login, password, source.Type == LoginDLDAP) + if sr == nil { // User not in LDAP, do nothing return nil, ErrUserNotExist{0, login, 0} } @@ -394,28 +421,28 @@ func LoginViaLDAP(user *User, login, password string, source *LoginSource, autoR } // Fallback. - if len(username) == 0 { - username = login + if len(sr.Username) == 0 { + sr.Username = login } // Validate username make sure it satisfies requirement. - if binding.AlphaDashDotPattern.MatchString(username) { - return nil, fmt.Errorf("Invalid pattern for attribute 'username' [%s]: must be valid alpha or numeric or dash(-_) or dot characters", username) + if binding.AlphaDashDotPattern.MatchString(sr.Username) { + return nil, fmt.Errorf("Invalid pattern for attribute 'username' [%s]: must be valid alpha or numeric or dash(-_) or dot characters", sr.Username) } - if len(mail) == 0 { - mail = fmt.Sprintf("%s@localhost", username) + if len(sr.Mail) == 0 { + sr.Mail = fmt.Sprintf("%s@localhost", sr.Username) } user = &User{ - LowerName: strings.ToLower(username), - Name: username, - FullName: composeFullName(fn, sn, username), - Email: mail, + LowerName: strings.ToLower(sr.Username), + Name: sr.Username, + FullName: composeFullName(sr.Name, sr.Surname, sr.Username), + Email: sr.Mail, LoginType: source.Type, LoginSource: source.ID, LoginName: login, IsActive: true, - IsAdmin: isAdmin, + IsAdmin: sr.IsAdmin, } return user, CreateUser(user) } @@ -482,10 +509,7 @@ func SMTPAuth(a smtp.Auth, cfg *SMTPConfig) error { } if ok, _ := c.Extension("AUTH"); ok { - if err = c.Auth(a); err != nil { - return err - } - return nil + return c.Auth(a) } return ErrUnsupportedLoginType } @@ -580,27 +604,6 @@ func LoginViaPAM(user *User, login, password string, sourceID int64, cfg *PAMCon return user, CreateUser(user) } -// ________ _____ __ .__ ________ -// \_____ \ / _ \ __ ___/ |_| |__ \_____ \ -// / | \ / /_\ \| | \ __\ | \ / ____/ -// / | \/ | \ | /| | | Y \/ \ -// \_______ /\____|__ /____/ |__| |___| /\_______ \ -// \/ \/ \/ \/ - -// OAuth2Provider describes the display values of a single OAuth2 provider -type OAuth2Provider struct { - Name string - DisplayName string - Image string -} - -// OAuth2Providers contains the map of registered OAuth2 providers in Gitea (based on goth) -// key is used to map the OAuth2Provider with the goth provider type (also in LoginSource.OAuth2Config.Provider) -// value is used to store display data -var OAuth2Providers = map[string]OAuth2Provider{ - "github": {Name: "github", DisplayName: "GitHub", Image: "/img/github.png"}, -} - // ExternalUserLogin attempts a login using external source types. func ExternalUserLogin(user *User, login, password string, source *LoginSource, autoRegister bool) (*User, error) { if !source.IsActived { @@ -671,7 +674,7 @@ func UserSignIn(username, password string) (*User, error) { } sources := make([]*LoginSource, 0, 5) - if err = x.UseBool().Find(&sources, &LoginSource{IsActived: true}); err != nil { + if err = x.Where("is_actived = ?", true).Find(&sources); err != nil { return nil, err } @@ -690,58 +693,3 @@ func UserSignIn(username, password string) (*User, error) { return nil, ErrUserNotExist{user.ID, user.Name, 0} } - -// GetActiveOAuth2ProviderLoginSources returns all actived LoginOAuth2 sources -func GetActiveOAuth2ProviderLoginSources() ([]*LoginSource, error) { - sources := make([]*LoginSource, 0, 1) - if err := x.UseBool().Find(&sources, &LoginSource{IsActived: true, Type: LoginOAuth2}); err != nil { - return nil, err - } - return sources, nil -} - -// GetActiveOAuth2LoginSourceByName returns a OAuth2 LoginSource based on the given name -func GetActiveOAuth2LoginSourceByName(name string) (*LoginSource, error) { - loginSource := &LoginSource{ - Name: name, - Type: LoginOAuth2, - IsActived: true, - } - - has, err := x.UseBool().Get(loginSource) - if !has || err != nil { - return nil, err - } - - return loginSource, nil -} - -// GetActiveOAuth2Providers returns the map of configured active OAuth2 providers -// key is used as technical name (like in the callbackURL) -// values to display -func GetActiveOAuth2Providers() (map[string]OAuth2Provider, error) { - // Maybe also separate used and unused providers so we can force the registration of only 1 active provider for each type - - loginSources, err := GetActiveOAuth2ProviderLoginSources() - if err != nil { - return nil, err - } - - providers := make(map[string]OAuth2Provider) - for _, source := range loginSources { - providers[source.Name] = OAuth2Providers[source.OAuth2().Provider] - } - - return providers, nil -} - -// InitOAuth2 initialize the OAuth2 lib and register all active OAuth2 providers in the library -func InitOAuth2() { - oauth2.Init() - loginSources, _ := GetActiveOAuth2ProviderLoginSources() - - for _, source := range loginSources { - oAuth2Config := source.OAuth2() - oauth2.RegisterProvider(source.Name, oAuth2Config.Provider, oAuth2Config.ClientID, oAuth2Config.ClientSecret) - } -} diff --git a/models/mail.go b/models/mail.go index 16e8c9e..41fddad 100644 --- a/models/mail.go +++ b/models/mail.go @@ -47,8 +47,8 @@ func SendTestMail(email string) error { func SendUserMail(c *macaron.Context, u *User, tpl base.TplName, code, subject, info string) { data := map[string]interface{}{ "Username": u.DisplayName(), - "ActiveCodeLives": setting.Service.ActiveCodeLives / 60, - "ResetPwdCodeLives": setting.Service.ResetPwdCodeLives / 60, + "ActiveCodeLives": base.MinutesToFriendly(setting.Service.ActiveCodeLives, c.Locale.Language()), + "ResetPwdCodeLives": base.MinutesToFriendly(setting.Service.ResetPwdCodeLives, c.Locale.Language()), "Code": code, } @@ -65,7 +65,7 @@ func SendUserMail(c *macaron.Context, u *User, tpl base.TplName, code, subject, mailer.SendAsync(msg) } -// SendActivateAccountMail sends an activation mail to the user +// SendActivateAccountMail sends an activation mail to the user (new user registration) func SendActivateAccountMail(c *macaron.Context, u *User) { SendUserMail(c, u, mailAuthActivate, u.GenerateActivateCode(), c.Tr("mail.activate_account"), "activate account") } @@ -75,11 +75,11 @@ func SendResetPasswordMail(c *macaron.Context, u *User) { SendUserMail(c, u, mailAuthResetPassword, u.GenerateActivateCode(), c.Tr("mail.reset_password"), "reset password") } -// SendActivateEmailMail sends confirmation email. +// SendActivateEmailMail sends confirmation email to confirm new email address func SendActivateEmailMail(c *macaron.Context, u *User, email *EmailAddress) { data := map[string]interface{}{ "Username": u.DisplayName(), - "ActiveCodeLives": setting.Service.ActiveCodeLives / 60, + "ActiveCodeLives": base.MinutesToFriendly(setting.Service.ActiveCodeLives, c.Locale.Language()), "Code": u.GenerateEmailActivateCode(email.Email), "Email": email.Email, } @@ -148,10 +148,16 @@ func composeTplData(subject, body, link string) map[string]interface{} { return data } -func composeIssueMessage(issue *Issue, doer *User, tplName base.TplName, tos []string, info string) *mailer.Message { +func composeIssueCommentMessage(issue *Issue, doer *User, comment *Comment, tplName base.TplName, tos []string, info string) *mailer.Message { subject := issue.mailSubject() body := string(markdown.RenderString(issue.Content, issue.Repo.HTMLURL(), issue.Repo.ComposeMetas())) - data := composeTplData(subject, body, issue.HTMLURL()) + + data := make(map[string]interface{}, 10) + if comment != nil { + data = composeTplData(subject, body, issue.HTMLURL()+"#"+comment.HashTag()) + } else { + data = composeTplData(subject, body, issue.HTMLURL()) + } data["Doer"] = doer var content bytes.Buffer @@ -166,18 +172,18 @@ func composeIssueMessage(issue *Issue, doer *User, tplName base.TplName, tos []s } // SendIssueCommentMail composes and sends issue comment emails to target receivers. -func SendIssueCommentMail(issue *Issue, doer *User, tos []string) { +func SendIssueCommentMail(issue *Issue, doer *User, comment *Comment, tos []string) { if len(tos) == 0 { return } - mailer.SendAsync(composeIssueMessage(issue, doer, mailIssueComment, tos, "issue comment")) + mailer.SendAsync(composeIssueCommentMessage(issue, doer, comment, mailIssueComment, tos, "issue comment")) } // SendIssueMentionMail composes and sends issue mention emails to target receivers. -func SendIssueMentionMail(issue *Issue, doer *User, tos []string) { +func SendIssueMentionMail(issue *Issue, doer *User, comment *Comment, tos []string) { if len(tos) == 0 { return } - mailer.SendAsync(composeIssueMessage(issue, doer, mailIssueMention, tos, "issue mention")) + mailer.SendAsync(composeIssueCommentMessage(issue, doer, comment, mailIssueMention, tos, "issue mention")) } diff --git a/models/main_test.go b/models/main_test.go new file mode 100644 index 0000000..451b5e4 --- /dev/null +++ b/models/main_test.go @@ -0,0 +1,35 @@ +package models + +import ( + "fmt" + "os" + "path/filepath" + "testing" + + "code.gitea.io/gitea/modules/setting" + + _ "github.com/mattn/go-sqlite3" // for the test engine + "github.com/stretchr/testify/assert" +) + +// TestFixturesAreConsistent assert that test fixtures are consistent +func TestFixturesAreConsistent(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + CheckConsistencyForAll(t) +} + +func TestMain(m *testing.M) { + if err := CreateTestEngine("fixtures/"); err != nil { + fmt.Printf("Error creating test engine: %v\n", err) + os.Exit(1) + } + + setting.AppURL = "https://try.gitea.io/" + setting.RunUser = "runuser" + setting.SSH.Port = 3000 + setting.SSH.Domain = "try.gitea.io" + setting.RepoRootPath = filepath.Join(os.TempDir(), "repos") + setting.AppDataPath = filepath.Join(os.TempDir(), "appdata") + + os.Exit(m.Run()) +} diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 1425dbf..61963e6 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -92,8 +92,46 @@ var migrations = []Migration{ NewMigration("use new avatar path name for security reason", useNewNameAvatars), // v21 -> v22 NewMigration("rewrite authorized_keys file via new format", useNewPublickeyFormat), - // v21 -> v22 + // v22 -> v23 NewMigration("generate and migrate wiki Git hooks", generateAndMigrateWikiGitHooks), + // v23 -> v24 + NewMigration("add user openid table", addUserOpenID), + // v24 -> v25 + NewMigration("change the key_id and primary_key_id type", changeGPGKeysColumns), + // v25 -> v26 + NewMigration("add show field in user openid table", addUserOpenIDShow), + // v26 -> v27 + NewMigration("generate and migrate repo and wiki Git hooks", generateAndMigrateGitHookChains), + // v27 -> v28 + NewMigration("change mirror interval from hours to time.Duration", convertIntervalToDuration), + // v28 -> v29 + NewMigration("add field for repo size", addRepoSize), + // v29 -> v30 + NewMigration("add commit status table", addCommitStatus), + // v30 -> 31 + NewMigration("add primary key to external login user", addExternalLoginUserPK), + // 31 -> 32 + NewMigration("add field for login source synchronization", addLoginSourceSyncEnabledColumn), + // v32 -> v33 + NewMigration("add units for team", addUnitsToRepoTeam), + // v33 -> v34 + NewMigration("remove columns from action", removeActionColumns), + // v34 -> v35 + NewMigration("give all units to owner teams", giveAllUnitsToOwnerTeams), + // v35 -> v36 + NewMigration("adds comment to an action", addCommentIDToAction), + // v36 -> v37 + NewMigration("regenerate git hooks", regenerateGitHooks36), + // v37 -> v38 + NewMigration("unescape user full names", unescapeUserFullNames), + // v38 -> v39 + NewMigration("remove commits and settings unit types", removeCommitsUnitType), + // v43 -> v44 + NewMigration("fix protected branch can push value to false", fixProtectedBranchCanPushValue), + // v42 -> v43 + NewMigration("add tags to releases and sync existing repositories", releaseAddColumnIsTagAndSyncTags), + // v44 -> v45 + NewMigration("remove duplicate unit types", removeDuplicateUnitTypes), } // Migrate database to current version @@ -143,13 +181,6 @@ Please try to upgrade to a lower version (>= v0.6.0) first, then upgrade to curr return nil } -func sessionRelease(sess *xorm.Session) { - if !sess.IsCommitedOrRollbacked { - sess.Rollback() - } - sess.Close() -} - func fixLocaleFileLoadPanic(_ *xorm.Engine) error { cfg, err := ini.Load(setting.CustomConf) if err != nil { @@ -190,7 +221,7 @@ func trimCommitActionAppURLPrefix(x *xorm.Engine) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -263,7 +294,7 @@ func issueToIssueLabel(x *xorm.Engine) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -306,7 +337,7 @@ func attachmentRefactor(x *xorm.Engine) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -384,7 +415,7 @@ func renamePullRequestFields(x *xorm.Engine) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -468,7 +499,7 @@ func generateOrgRandsAndSalt(x *xorm.Engine) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -687,8 +718,7 @@ func convertDateToUnix(x *xorm.Engine) (err error) { offset := 0 for { beans := make([]*Bean, 0, 100) - if err = x.SQL(fmt.Sprintf("SELECT * FROM `%s` ORDER BY id ASC LIMIT 100 OFFSET %d", - table.name, offset)).Find(&beans); err != nil { + if err = x.Table(table.name).Asc("id").Limit(100, offset).Find(&beans); err != nil { return fmt.Errorf("select beans [table: %s, offset: %d]: %v", table.name, offset, err) } log.Trace("Table [%s]: offset: %d, beans: %d", table.name, offset, len(beans)) diff --git a/models/migrations/v13.go b/models/migrations/v13.go index c9a50a9..f81271f 100644 --- a/models/migrations/v13.go +++ b/models/migrations/v13.go @@ -23,7 +23,7 @@ func ldapUseSSLToSecurityProtocol(x *xorm.Engine) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } diff --git a/models/migrations/v14.go b/models/migrations/v14.go index 12ae629..392f9fd 100644 --- a/models/migrations/v14.go +++ b/models/migrations/v14.go @@ -28,7 +28,7 @@ type UserV14 struct { DiffViewStyle string `xorm:"NOT NULL DEFAULT ''"` } -// TableName will be invoked by XORM to customrize the table name +// TableName will be invoked by XORM to customize the table name func (*UserV14) TableName() string { return "user" } diff --git a/models/migrations/v15.go b/models/migrations/v15.go index 90fc22c..3492a71 100644 --- a/models/migrations/v15.go +++ b/models/migrations/v15.go @@ -10,20 +10,15 @@ import ( "github.com/go-xorm/xorm" ) -// UserV15 describes the added field for User -type UserV15 struct { - AllowCreateOrganization bool -} - -// TableName will be invoked by XORM to customrize the table name -func (*UserV15) TableName() string { - return "user" -} - func createAllowCreateOrganizationColumn(x *xorm.Engine) error { - if err := x.Sync2(new(UserV15)); err != nil { + type User struct { + KeepEmailPrivate bool + AllowCreateOrganization bool + } + + if err := x.Sync2(new(User)); err != nil { return fmt.Errorf("Sync2: %v", err) - } else if _, err = x.Where("type=0").Cols("allow_create_organization").Update(&UserV15{AllowCreateOrganization: true}); err != nil { + } else if _, err = x.Where("`type` = 0").Cols("allow_create_organization").Update(&User{AllowCreateOrganization: true}); err != nil { return fmt.Errorf("set allow_create_organization: %v", err) } return nil diff --git a/models/migrations/v16.go b/models/migrations/v16.go index 12cad46..f6fb76d 100644 --- a/models/migrations/v16.go +++ b/models/migrations/v16.go @@ -13,38 +13,38 @@ import ( "github.com/go-xorm/xorm" ) -// RepoUnit describes all units of a repository -type RepoUnit struct { - ID int64 - RepoID int64 `xorm:"INDEX(s)"` - Type int `xorm:"INDEX(s)"` - Index int - Config map[string]string `xorm:"JSON"` - CreatedUnix int64 `xorm:"INDEX CREATED"` - Created time.Time `xorm:"-"` -} - // Enumerate all the unit types const ( - UnitTypeCode = iota + 1 // 1 code - UnitTypeIssues // 2 issues - UnitTypePRs // 3 PRs - UnitTypeCommits // 4 Commits - UnitTypeReleases // 5 Releases - UnitTypeWiki // 6 Wiki - UnitTypeSettings // 7 Settings - UnitTypeExternalWiki // 8 ExternalWiki - UnitTypeExternalTracker // 9 ExternalTracker + V16UnitTypeCode = iota + 1 // 1 code + V16UnitTypeIssues // 2 issues + V16UnitTypePRs // 3 PRs + V16UnitTypeCommits // 4 Commits + V16UnitTypeReleases // 5 Releases + V16UnitTypeWiki // 6 Wiki + V16UnitTypeSettings // 7 Settings + V16UnitTypeExternalWiki // 8 ExternalWiki + V16UnitTypeExternalTracker // 9 ExternalTracker ) -// Repo describes a repository -type Repo struct { - ID int64 - EnableWiki, EnableExternalWiki, EnableIssues, EnableExternalTracker, EnablePulls bool - ExternalWikiURL, ExternalTrackerURL, ExternalTrackerFormat, ExternalTrackerStyle string -} - func addUnitsToTables(x *xorm.Engine) error { + // RepoUnit describes all units of a repository + type RepoUnit struct { + ID int64 + RepoID int64 `xorm:"INDEX(s)"` + Type int `xorm:"INDEX(s)"` + Index int + Config map[string]interface{} `xorm:"JSON"` + CreatedUnix int64 `xorm:"INDEX CREATED"` + Created time.Time `xorm:"-"` + } + + // Repo describes a repository + type Repo struct { + ID int64 + EnableWiki, EnableExternalWiki, EnableIssues, EnableExternalTracker, EnablePulls bool + ExternalWikiURL, ExternalTrackerURL, ExternalTrackerFormat, ExternalTrackerStyle string + } + var repos []Repo err := x.Table("repository").Select("*").Find(&repos) if err != nil { @@ -79,32 +79,32 @@ func addUnitsToTables(x *xorm.Engine) error { for _, repo := range repos { for i := 1; i <= 9; i++ { - if (i == UnitTypeWiki || i == UnitTypeExternalWiki) && !repo.EnableWiki { + if (i == V16UnitTypeWiki || i == V16UnitTypeExternalWiki) && !repo.EnableWiki { continue } - if i == UnitTypeExternalWiki && !repo.EnableExternalWiki { + if i == V16UnitTypeExternalWiki && !repo.EnableExternalWiki { continue } - if i == UnitTypePRs && !repo.EnablePulls { + if i == V16UnitTypePRs && !repo.EnablePulls { continue } - if (i == UnitTypeIssues || i == UnitTypeExternalTracker) && !repo.EnableIssues { + if (i == V16UnitTypeIssues || i == V16UnitTypeExternalTracker) && !repo.EnableIssues { continue } - if i == UnitTypeExternalTracker && !repo.EnableExternalTracker { + if i == V16UnitTypeExternalTracker && !repo.EnableExternalTracker { continue } - var config = make(map[string]string) + var config = make(map[string]interface{}) switch i { - case UnitTypeExternalTracker: + case V16UnitTypeExternalTracker: config["ExternalTrackerURL"] = repo.ExternalTrackerURL config["ExternalTrackerFormat"] = repo.ExternalTrackerFormat if len(repo.ExternalTrackerStyle) == 0 { repo.ExternalTrackerStyle = markdown.IssueNameStyleNumeric } config["ExternalTrackerStyle"] = repo.ExternalTrackerStyle - case UnitTypeExternalWiki: + case V16UnitTypeExternalWiki: config["ExternalWikiURL"] = repo.ExternalWikiURL } @@ -119,9 +119,5 @@ func addUnitsToTables(x *xorm.Engine) error { } } - if err := sess.Commit(); err != nil { - return err - } - - return nil + return sess.Commit() } diff --git a/models/migrations/v21.go b/models/migrations/v21.go index e049727..890f4de 100644 --- a/models/migrations/v21.go +++ b/models/migrations/v21.go @@ -51,8 +51,5 @@ func useNewPublickeyFormat(x *xorm.Engine) error { } f.Close() - if err = os.Rename(tmpPath, fpath); err != nil { - return err - } - return nil + return os.Rename(tmpPath, fpath) } diff --git a/models/migrations/v23.go b/models/migrations/v23.go new file mode 100644 index 0000000..4aadf7e --- /dev/null +++ b/models/migrations/v23.go @@ -0,0 +1,25 @@ +// Copyright 2017 Gitea. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "github.com/go-xorm/xorm" +) + +// UserOpenID is the list of all OpenID identities of a user. +type UserOpenID struct { + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"INDEX NOT NULL"` + URI string `xorm:"UNIQUE NOT NULL"` +} + +func addUserOpenID(x *xorm.Engine) error { + if err := x.Sync2(new(UserOpenID)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + return nil +} diff --git a/models/migrations/v24.go b/models/migrations/v24.go new file mode 100644 index 0000000..076c710 --- /dev/null +++ b/models/migrations/v24.go @@ -0,0 +1,50 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "time" + + "github.com/go-xorm/xorm" +) + +func changeGPGKeysColumns(x *xorm.Engine) error { + // EmailAddress is the list of all email addresses of a user. Can contain the + // primary email address, but is not obligatory. + type EmailAddress struct { + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"INDEX NOT NULL"` + Email string `xorm:"UNIQUE NOT NULL"` + IsActivated bool + IsPrimary bool `xorm:"-"` + } + + // GPGKey represents a GPG key. + type GPGKey struct { + ID int64 `xorm:"pk autoincr"` + OwnerID int64 `xorm:"INDEX NOT NULL"` + KeyID string `xorm:"INDEX CHAR(16) NOT NULL"` + PrimaryKeyID string `xorm:"CHAR(16)"` + Content string `xorm:"TEXT NOT NULL"` + Created time.Time `xorm:"-"` + CreatedUnix int64 + Expired time.Time `xorm:"-"` + ExpiredUnix int64 + Added time.Time `xorm:"-"` + AddedUnix int64 + SubsKey []*GPGKey `xorm:"-"` + Emails []*EmailAddress + CanSign bool + CanEncryptComms bool + CanEncryptStorage bool + CanCertify bool + } + + if err := x.DropTables(new(GPGKey)); err != nil { + return err + } + + return x.Sync(new(GPGKey)) +} diff --git a/models/migrations/v25.go b/models/migrations/v25.go new file mode 100644 index 0000000..a8d7465 --- /dev/null +++ b/models/migrations/v25.go @@ -0,0 +1,18 @@ +// Copyright 2017 Gitea. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "github.com/go-xorm/xorm" +) + +func addUserOpenIDShow(x *xorm.Engine) error { + if err := x.Sync2(new(UserOpenID)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + return nil +} diff --git a/models/migrations/v26.go b/models/migrations/v26.go new file mode 100644 index 0000000..8b1c9a6 --- /dev/null +++ b/models/migrations/v26.go @@ -0,0 +1,87 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "crypto/md5" + "encoding/hex" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "code.gitea.io/gitea/modules/setting" + + "github.com/Unknwon/com" + "github.com/go-xorm/xorm" +) + +func generateAndMigrateGitHookChains(x *xorm.Engine) (err error) { + type Repository struct { + ID int64 + OwnerID int64 + Name string + } + type User struct { + ID int64 + Name string + } + + var ( + hookNames = []string{"pre-receive", "update", "post-receive"} + hookTpl = fmt.Sprintf("#!/usr/bin/env %s\ndata=$(cat)\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" || continue\necho \"${data}\" | \"${hook}\"\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType) + ) + + return x.Where("id > 0").Iterate(new(Repository), + func(idx int, bean interface{}) error { + repo := bean.(*Repository) + user := new(User) + has, err := x.Where("id = ?", repo.OwnerID).Get(user) + if err != nil { + return fmt.Errorf("query owner of repository [repo_id: %d, owner_id: %d]: %v", repo.ID, repo.OwnerID, err) + } else if !has { + return nil + } + + repoPaths := []string{ + filepath.Join(setting.RepoRootPath, strings.ToLower(user.Name), strings.ToLower(repo.Name)) + ".git", + filepath.Join(setting.RepoRootPath, strings.ToLower(user.Name), strings.ToLower(repo.Name)) + ".wiki.git", + } + + for _, repoPath := range repoPaths { + if com.IsExist(repoPath) { + hookDir := filepath.Join(repoPath, "hooks") + + for _, hookName := range hookNames { + oldHookPath := filepath.Join(hookDir, hookName) + + // compare md5sums of hooks + if com.IsExist(oldHookPath) { + + f, err := os.Open(oldHookPath) + if err != nil { + return fmt.Errorf("cannot open old hook file '%s': %v", oldHookPath, err) + } + defer f.Close() + h := md5.New() + if _, err := io.Copy(h, f); err != nil { + return fmt.Errorf("cannot read old hook file '%s': %v", oldHookPath, err) + } + if hex.EncodeToString(h.Sum(nil)) == "6718ef67d0834e0a7908259acd566e3f" { + return nil + } + } + + if err = ioutil.WriteFile(oldHookPath, []byte(hookTpl), 0777); err != nil { + return fmt.Errorf("write old hook file '%s': %v", oldHookPath, err) + } + } + } + } + return nil + }) +} diff --git a/models/migrations/v27.go b/models/migrations/v27.go new file mode 100644 index 0000000..bd115cf --- /dev/null +++ b/models/migrations/v27.go @@ -0,0 +1,74 @@ +// Copyright 2017 Gitea. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + "time" + + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + + "github.com/go-xorm/xorm" +) + +func convertIntervalToDuration(x *xorm.Engine) (err error) { + type Repository struct { + ID int64 + OwnerID int64 + Name string + } + type Mirror struct { + ID int64 `xorm:"pk autoincr"` + RepoID int64 `xorm:"INDEX"` + Repo *Repository `xorm:"-"` + Interval time.Duration + } + + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return err + } + + dialect := x.Dialect().DriverName() + + switch dialect { + case "mysql": + _, err = sess.Exec("ALTER TABLE mirror MODIFY `interval` BIGINT") + case "postgres": + _, err = sess.Exec("ALTER TABLE mirror ALTER COLUMN \"interval\" SET DATA TYPE bigint") + case "tidb": + _, err = sess.Exec("ALTER TABLE mirror MODIFY `interval` BIGINT") + case "mssql": + _, err = sess.Exec("ALTER TABLE mirror ALTER COLUMN \"interval\" BIGINT") + case "sqlite3": + } + + if err != nil { + return fmt.Errorf("Error changing mirror interval column type: %v", err) + } + + var mirrors []Mirror + err = sess.Table("mirror").Select("*").Find(&mirrors) + if err != nil { + return fmt.Errorf("Query repositories: %v", err) + } + for _, mirror := range mirrors { + mirror.Interval = mirror.Interval * time.Hour + if mirror.Interval < setting.Mirror.MinInterval { + log.Info("Mirror interval less than Mirror.MinInterval, setting default interval: repo id %v", mirror.RepoID) + mirror.Interval = setting.Mirror.DefaultInterval + } + log.Debug("Mirror interval set to %v for repo id %v", mirror.Interval, mirror.RepoID) + _, err := sess.Id(mirror.ID).Cols("interval").Update(mirror) + if err != nil { + return fmt.Errorf("update mirror interval failed: %v", err) + } + } + + return sess.Commit() +} diff --git a/models/migrations/v28.go b/models/migrations/v28.go new file mode 100644 index 0000000..ec8155b --- /dev/null +++ b/models/migrations/v28.go @@ -0,0 +1,76 @@ +// Copyright 2017 The Gogs Authors. All rights reserved. +// Copyright 2017 Gitea. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + "path/filepath" + "strings" + + "code.gitea.io/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + + "github.com/go-xorm/xorm" +) + +func addRepoSize(x *xorm.Engine) (err error) { + log.Info("This migration could take up to minutes, please be patient.") + type Repository struct { + ID int64 + OwnerID int64 + Name string + Size int64 + } + type User struct { + ID int64 + Name string + } + if err = x.Sync2(new(Repository)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + + // For the sake of SQLite3, we can't use x.Iterate here. + offset := 0 + for { + repos := make([]*Repository, 0, 10) + if err = x.Table("repository").Asc("id").Limit(10, offset).Find(&repos); err != nil { + return fmt.Errorf("select repos [offset: %d]: %v", offset, err) + } + log.Trace("Select [offset: %d, repos: %d]", offset, len(repos)) + if len(repos) == 0 { + break + } + offset += 10 + + for _, repo := range repos { + if repo.Name == "." || repo.Name == ".." { + continue + } + + user := new(User) + has, err := x.Where("id = ?", repo.OwnerID).Get(user) + if err != nil { + return fmt.Errorf("query owner of repository [repo_id: %d, owner_id: %d]: %v", repo.ID, repo.OwnerID, err) + } else if !has { + continue + } + + repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(user.Name), strings.ToLower(repo.Name)) + ".git" + countObject, err := git.GetRepoSize(repoPath) + if err != nil { + log.Warn("GetRepoSize: %v", err) + continue + } + + repo.Size = countObject.Size + countObject.SizePack + if _, err = x.Id(repo.ID).Cols("size").Update(repo); err != nil { + return fmt.Errorf("update size: %v", err) + } + } + } + return nil +} diff --git a/models/migrations/v29.go b/models/migrations/v29.go new file mode 100644 index 0000000..eadb0f3 --- /dev/null +++ b/models/migrations/v29.go @@ -0,0 +1,34 @@ +// Copyright 2017 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "github.com/go-xorm/xorm" +) + +// CommitStatus see models/status.go +type CommitStatus struct { + ID int64 `xorm:"pk autoincr"` + Index int64 `xorm:"INDEX UNIQUE(repo_sha_index)"` + RepoID int64 `xorm:"INDEX UNIQUE(repo_sha_index)"` + State string `xorm:"VARCHAR(7) NOT NULL"` + SHA string `xorm:"VARCHAR(64) NOT NULL INDEX UNIQUE(repo_sha_index)"` + TargetURL string `xorm:"TEXT"` + Description string `xorm:"TEXT"` + Context string `xorm:"TEXT"` + CreatorID int64 `xorm:"INDEX"` + + CreatedUnix int64 `xorm:"INDEX"` + UpdatedUnix int64 `xorm:"INDEX"` +} + +func addCommitStatus(x *xorm.Engine) error { + if err := x.Sync2(new(CommitStatus)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + return nil +} diff --git a/models/migrations/v30.go b/models/migrations/v30.go new file mode 100644 index 0000000..90047df --- /dev/null +++ b/models/migrations/v30.go @@ -0,0 +1,38 @@ +// Copyright 2017 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "github.com/go-xorm/xorm" +) + +func addExternalLoginUserPK(x *xorm.Engine) error { + // ExternalLoginUser see models/external_login_user.go + type ExternalLoginUser struct { + ExternalID string `xorm:"pk NOT NULL"` + UserID int64 `xorm:"INDEX NOT NULL"` + LoginSourceID int64 `xorm:"pk NOT NULL"` + } + + extlogins := make([]*ExternalLoginUser, 0, 6) + if err := x.Find(&extlogins); err != nil { + return fmt.Errorf("Find: %v", err) + } + + if err := x.DropTables(new(ExternalLoginUser)); err != nil { + return fmt.Errorf("DropTables: %v", err) + } + + if err := x.Sync2(new(ExternalLoginUser)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + + if _, err := x.Insert(extlogins); err != nil { + return fmt.Errorf("Insert: %v", err) + } + return nil +} diff --git a/models/migrations/v31.go b/models/migrations/v31.go new file mode 100644 index 0000000..b7ceecf --- /dev/null +++ b/models/migrations/v31.go @@ -0,0 +1,35 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + "time" + + "github.com/go-xorm/core" + "github.com/go-xorm/xorm" +) + +func addLoginSourceSyncEnabledColumn(x *xorm.Engine) error { + // LoginSource see models/login_source.go + type LoginSource struct { + ID int64 `xorm:"pk autoincr"` + Type int + Name string `xorm:"UNIQUE"` + IsActived bool `xorm:"INDEX NOT NULL DEFAULT false"` + IsSyncEnabled bool `xorm:"INDEX NOT NULL DEFAULT false"` + Cfg core.Conversion `xorm:"TEXT"` + + Created time.Time `xorm:"-"` + CreatedUnix int64 `xorm:"INDEX"` + Updated time.Time `xorm:"-"` + UpdatedUnix int64 `xorm:"INDEX"` + } + + if err := x.Sync2(new(LoginSource)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + return nil +} diff --git a/models/migrations/v32.go b/models/migrations/v32.go new file mode 100644 index 0000000..d209fc3 --- /dev/null +++ b/models/migrations/v32.go @@ -0,0 +1,23 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import "github.com/go-xorm/xorm" + +func addUnitsToRepoTeam(x *xorm.Engine) error { + type Team struct { + UnitTypes []int `xorm:"json"` + } + + err := x.Sync(new(Team)) + if err != nil { + return err + } + + _, err = x.Update(&Team{ + UnitTypes: []int{1, 2, 3, 4, 5, 6, 7, 8, 9}, + }) + return err +} diff --git a/models/migrations/v33.go b/models/migrations/v33.go new file mode 100644 index 0000000..26cce0b --- /dev/null +++ b/models/migrations/v33.go @@ -0,0 +1,32 @@ +// Copyright 2017 Gitea. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + + "github.com/go-xorm/xorm" +) + +func removeActionColumns(x *xorm.Engine) error { + switch { + case setting.UseSQLite3: + log.Warn("Unable to drop columns in SQLite") + case setting.UseMySQL, setting.UsePostgreSQL, setting.UseMSSQL, setting.UseTiDB: + if _, err := x.Exec("ALTER TABLE action DROP COLUMN act_user_name"); err != nil { + return fmt.Errorf("DROP COLUMN act_user_name: %v", err) + } else if _, err = x.Exec("ALTER TABLE action DROP COLUMN repo_user_name"); err != nil { + return fmt.Errorf("DROP COLUMN repo_user_name: %v", err) + } else if _, err = x.Exec("ALTER TABLE action DROP COLUMN repo_name"); err != nil { + return fmt.Errorf("DROP COLUMN repo_name: %v", err) + } + default: + log.Fatal(4, "Unrecognized DB") + } + return nil +} diff --git a/models/migrations/v34.go b/models/migrations/v34.go new file mode 100644 index 0000000..258da41 --- /dev/null +++ b/models/migrations/v34.go @@ -0,0 +1,25 @@ +// Copyright 2017 Gitea. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "github.com/go-xorm/xorm" +) + +// Team see models/team.go +type Team struct { + UnitTypes []int `xorm:"json"` +} + +const ownerAccessMode = 4 + +var allUnitTypes = []int{1, 2, 3, 4, 5, 6, 7, 8, 9} + +func giveAllUnitsToOwnerTeams(x *xorm.Engine) error { + _, err := x.Cols("unit_types"). + Where("authorize = ?", ownerAccessMode). + Update(&Team{UnitTypes: allUnitTypes}) + return err +} diff --git a/models/migrations/v35.go b/models/migrations/v35.go new file mode 100644 index 0000000..7746663 --- /dev/null +++ b/models/migrations/v35.go @@ -0,0 +1,25 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "github.com/go-xorm/xorm" +) + +func addCommentIDToAction(x *xorm.Engine) error { + // Action see models/action.go + type Action struct { + CommentID int64 `xorm:"INDEX"` + IsDeleted bool `xorm:"INDEX NOT NULL DEFAULT false"` + } + + if err := x.Sync2(new(Action)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + + return nil +} diff --git a/models/migrations/v36.go b/models/migrations/v36.go new file mode 100644 index 0000000..06f76a2 --- /dev/null +++ b/models/migrations/v36.go @@ -0,0 +1,15 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "code.gitea.io/gitea/models" + + "github.com/go-xorm/xorm" +) + +func regenerateGitHooks36(x *xorm.Engine) (err error) { + return models.SyncRepositoryHooks() +} diff --git a/models/migrations/v37.go b/models/migrations/v37.go new file mode 100644 index 0000000..00653a7 --- /dev/null +++ b/models/migrations/v37.go @@ -0,0 +1,35 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "html" + + "github.com/go-xorm/xorm" +) + +func unescapeUserFullNames(x *xorm.Engine) (err error) { + type User struct { + ID int64 `xorm:"pk autoincr"` + FullName string + } + + const batchSize = 100 + for start := 0; ; start += batchSize { + users := make([]*User, 0, batchSize) + if err := x.Limit(batchSize, start).Find(&users); err != nil { + return err + } + if len(users) == 0 { + return nil + } + for _, user := range users { + user.FullName = html.UnescapeString(user.FullName) + if _, err := x.ID(user.ID).Cols("full_name").Update(user); err != nil { + return err + } + } + } +} diff --git a/models/migrations/v38.go b/models/migrations/v38.go new file mode 100644 index 0000000..6f66484 --- /dev/null +++ b/models/migrations/v38.go @@ -0,0 +1,70 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "time" + + "code.gitea.io/gitea/models" + + "github.com/go-xorm/core" + "github.com/go-xorm/xorm" +) + +func removeCommitsUnitType(x *xorm.Engine) (err error) { + // RepoUnit describes all units of a repository + type RepoUnit struct { + ID int64 + RepoID int64 `xorm:"INDEX(s)"` + Type int `xorm:"INDEX(s)"` + Index int + Config core.Conversion `xorm:"TEXT"` + CreatedUnix int64 `xorm:"INDEX CREATED"` + Created time.Time `xorm:"-"` + } + + // Update team unit types + const batchSize = 100 + for start := 0; ; start += batchSize { + teams := make([]*models.Team, 0, batchSize) + if err := x.Limit(batchSize, start).Find(&teams); err != nil { + return err + } + if len(teams) == 0 { + break + } + for _, team := range teams { + ut := make([]models.UnitType, 0, len(team.UnitTypes)) + for _, u := range team.UnitTypes { + if u < V16UnitTypeCommits { + ut = append(ut, u) + } else if u > V16UnitTypeSettings { + ut = append(ut, u-2) + } else if u > V16UnitTypeCommits && u != V16UnitTypeSettings { + ut = append(ut, u-1) + } + } + team.UnitTypes = ut + if _, err := x.ID(team.ID).Cols("unit_types").Update(team); err != nil { + return err + } + } + } + + // Delete commits and settings unit types + if _, err = x.In("`type`", []models.UnitType{V16UnitTypeCommits, V16UnitTypeSettings}).Delete(new(RepoUnit)); err != nil { + return err + } + // Fix renumber unit types that where in enumeration after settings unit type + if _, err = x.Where("`type` > ?", V16UnitTypeSettings).Decr("type").Decr("index").Update(new(RepoUnit)); err != nil { + return err + } + // Fix renumber unit types that where in enumeration after commits unit type + if _, err = x.Where("`type` > ?", V16UnitTypeCommits).Decr("type").Decr("index").Update(new(RepoUnit)); err != nil { + return err + } + + return nil +} diff --git a/models/migrations/v42.go b/models/migrations/v42.go new file mode 100644 index 0000000..3547ef1 --- /dev/null +++ b/models/migrations/v42.go @@ -0,0 +1,57 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "code.gitea.io/git" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + + "github.com/go-xorm/xorm" +) + +// ReleaseV39 describes the added field for Release +type ReleaseV39 struct { + IsTag bool `xorm:"NOT NULL DEFAULT false"` +} + +// TableName will be invoked by XORM to customrize the table name +func (*ReleaseV39) TableName() string { + return "release" +} + +func releaseAddColumnIsTagAndSyncTags(x *xorm.Engine) error { + if err := x.Sync2(new(ReleaseV39)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + + // For the sake of SQLite3, we can't use x.Iterate here. + offset := 0 + pageSize := 20 + for { + repos := make([]*models.Repository, 0, pageSize) + if err := x.Table("repository").Asc("id").Limit(pageSize, offset).Find(&repos); err != nil { + return fmt.Errorf("select repos [offset: %d]: %v", offset, err) + } + for _, repo := range repos { + gitRepo, err := git.OpenRepository(repo.RepoPath()) + if err != nil { + log.Warn("OpenRepository: %v", err) + continue + } + + if err = models.SyncReleasesWithTags(repo, gitRepo); err != nil { + log.Warn("SyncReleasesWithTags: %v", err) + } + } + if len(repos) < pageSize { + break + } + offset += pageSize + } + return nil +} diff --git a/models/migrations/v43.go b/models/migrations/v43.go new file mode 100644 index 0000000..b6351fa --- /dev/null +++ b/models/migrations/v43.go @@ -0,0 +1,18 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "code.gitea.io/gitea/models" + + "github.com/go-xorm/xorm" +) + +func fixProtectedBranchCanPushValue(x *xorm.Engine) error { + _, err := x.Cols("can_push").Update(&models.ProtectedBranch{ + CanPush: false, + }) + return err +} diff --git a/models/migrations/v44.go b/models/migrations/v44.go new file mode 100644 index 0000000..4de3ad4 --- /dev/null +++ b/models/migrations/v44.go @@ -0,0 +1,69 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "github.com/go-xorm/xorm" +) + +func removeDuplicateUnitTypes(x *xorm.Engine) error { + // RepoUnit describes all units of a repository + type RepoUnit struct { + RepoID int64 + Type int + } + + // Enumerate all the unit types + const ( + UnitTypeCode = iota + 1 // 1 code + UnitTypeIssues // 2 issues + UnitTypePullRequests // 3 PRs + UnitTypeReleases // 4 Releases + UnitTypeWiki // 5 Wiki + UnitTypeExternalWiki // 6 ExternalWiki + UnitTypeExternalTracker // 7 ExternalTracker + ) + + var externalIssueRepoUnits []RepoUnit + err := x.Where("type = ?", UnitTypeExternalTracker).Find(&externalIssueRepoUnits) + if err != nil { + return fmt.Errorf("Query repositories: %v", err) + } + + var externalWikiRepoUnits []RepoUnit + err = x.Where("type = ?", UnitTypeExternalWiki).Find(&externalWikiRepoUnits) + if err != nil { + return fmt.Errorf("Query repositories: %v", err) + } + + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return err + } + + for _, repoUnit := range externalIssueRepoUnits { + if _, err = sess.Delete(&RepoUnit{ + RepoID: repoUnit.RepoID, + Type: UnitTypeIssues, + }); err != nil { + return fmt.Errorf("Delete repo unit: %v", err) + } + } + + for _, repoUnit := range externalWikiRepoUnits { + if _, err = sess.Delete(&RepoUnit{ + RepoID: repoUnit.RepoID, + Type: UnitTypeWiki, + }); err != nil { + return fmt.Errorf("Delete repo unit: %v", err) + } + } + + return sess.Commit() +} diff --git a/models/models.go b/models/models.go index 5b9020b..e5d3597 100644 --- a/models/models.go +++ b/models/models.go @@ -24,7 +24,6 @@ import ( // Needed for the MSSSQL driver _ "github.com/denisenkom/go-mssqldb" - "code.gitea.io/gitea/models/migrations" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" ) @@ -32,7 +31,7 @@ import ( // Engine represents a xorm engine or session. type Engine interface { Table(tableNameOrBean interface{}) *xorm.Session - Count(interface{}) (int64, error) + Count(...interface{}) (int64, error) Decr(column string, arg ...interface{}) *xorm.Session Delete(interface{}) (int64, error) Exec(string, ...interface{}) (sql.Result, error) @@ -49,13 +48,6 @@ type Engine interface { Where(interface{}, ...interface{}) *xorm.Session } -func sessionRelease(sess *xorm.Session) { - if !sess.IsCommitedOrRollbacked { - sess.Rollback() - } - sess.Close() -} - var ( x *xorm.Engine tables []interface{} @@ -66,6 +58,7 @@ var ( // DbCfg holds the database settings DbCfg struct { Type, Host, Name, User, Passwd, Path, SSLMode string + Timeout int } // EnableSQLite3 use SQLite3 @@ -111,10 +104,14 @@ func init() { new(IssueUser), new(LFSMetaObject), new(TwoFactor), + new(GPGKey), new(RepoUnit), new(RepoRedirect), new(ExternalLoginUser), new(ProtectedBranch), + new(UserOpenID), + new(IssueWatch), + new(CommitStatus), ) gonicNames := []string{"SSL", "UID"} @@ -147,6 +144,7 @@ func LoadConfigs() { } DbCfg.SSLMode = sec.Key("SSL_MODE").String() DbCfg.Path = sec.Key("PATH").MustString("data/gitea.db") + DbCfg.Timeout = sec.Key("SQLITE_TIMEOUT").MustInt(500) sec = setting.Cfg.Section("indexer") setting.Indexer.IssuePath = sec.Key("ISSUE_INDEXER_PATH").MustString("indexers/issues.bleve") @@ -216,7 +214,7 @@ func getEngine() (*xorm.Engine, error) { if err := os.MkdirAll(path.Dir(DbCfg.Path), os.ModePerm); err != nil { return nil, fmt.Errorf("Failed to create directories: %v", err) } - connStr = "file:" + DbCfg.Path + "?cache=shared&mode=rwc" + connStr = fmt.Sprintf("file:%s?cache=shared&mode=rwc&_busy_timeout=%d", DbCfg.Path, DbCfg.Timeout) case "tidb": if !EnableTiDB { return nil, errors.New("this binary version does not build support for TiDB") @@ -260,7 +258,7 @@ func SetEngine() (err error) { } // NewEngine initializes a new xorm.Engine -func NewEngine() (err error) { +func NewEngine(migrateFunc func(*xorm.Engine) error) (err error) { if err = SetEngine(); err != nil { return err } @@ -269,7 +267,7 @@ func NewEngine() (err error) { return err } - if err = migrations.Migrate(x); err != nil { + if err = migrateFunc(x); err != nil { return fmt.Errorf("migrate: %v", err) } diff --git a/models/models_test.go b/models/models_test.go index 01d7231..649b1e0 100644 --- a/models/models_test.go +++ b/models/models_test.go @@ -11,15 +11,45 @@ import ( ) func Test_parsePostgreSQLHostPort(t *testing.T) { - test := func(input, expectedHost, expectedPort string) { - host, port := parsePostgreSQLHostPort(input) - assert.Equal(t, expectedHost, host) - assert.Equal(t, expectedPort, port) + tests := []struct { + HostPort string + Host string + Port string + }{ + { + HostPort: "127.0.0.1:1234", + Host: "127.0.0.1", + Port: "1234", + }, + { + HostPort: "127.0.0.1", + Host: "127.0.0.1", + Port: "5432", + }, + { + HostPort: "[::1]:1234", + Host: "[::1]", + Port: "1234", + }, + { + HostPort: "[::1]", + Host: "[::1]", + Port: "5432", + }, + { + HostPort: "/tmp/pg.sock:1234", + Host: "/tmp/pg.sock", + Port: "1234", + }, + { + HostPort: "/tmp/pg.sock", + Host: "/tmp/pg.sock", + Port: "5432", + }, + } + for _, test := range tests { + host, port := parsePostgreSQLHostPort(test.HostPort) + assert.Equal(t, test.Host, host) + assert.Equal(t, test.Port, port) } - test("127.0.0.1:1234", "127.0.0.1", "1234") - test("127.0.0.1", "127.0.0.1", "5432") - test("[::1]:1234", "[::1]", "1234") - test("[::1]", "[::1]", "5432") - test("/tmp/pg.sock:1234", "/tmp/pg.sock", "1234") - test("/tmp/pg.sock", "/tmp/pg.sock", "5432") } diff --git a/models/notification.go b/models/notification.go index bba662c..a59c6f1 100644 --- a/models/notification.go +++ b/models/notification.go @@ -96,6 +96,11 @@ func CreateOrUpdateIssueNotifications(issue *Issue, notificationAuthorID int64) } func createOrUpdateIssueNotifications(e Engine, issue *Issue, notificationAuthorID int64) error { + issueWatches, err := getIssueWatchers(e, issue.ID) + if err != nil { + return err + } + watches, err := getWatchers(e, issue.RepoID) if err != nil { return err @@ -106,23 +111,42 @@ func createOrUpdateIssueNotifications(e Engine, issue *Issue, notificationAuthor return err } - for _, watch := range watches { + alreadyNotified := make(map[int64]struct{}, len(issueWatches)+len(watches)) + + notifyUser := func(userID int64) error { // do not send notification for the own issuer/commenter - if watch.UserID == notificationAuthorID { + if userID == notificationAuthorID { + return nil + } + + if _, ok := alreadyNotified[userID]; ok { + return nil + } + alreadyNotified[userID] = struct{}{} + + if notificationExists(notifications, issue.ID, userID) { + return updateIssueNotification(e, userID, issue.ID, notificationAuthorID) + } + return createIssueNotification(e, userID, issue, notificationAuthorID) + } + + for _, issueWatch := range issueWatches { + // ignore if user unwatched the issue + if !issueWatch.IsWatching { + alreadyNotified[issueWatch.UserID] = struct{}{} continue } - if notificationExists(notifications, issue.ID, watch.UserID) { - err = updateIssueNotification(e, watch.UserID, issue.ID, notificationAuthorID) - } else { - err = createIssueNotification(e, watch.UserID, issue, notificationAuthorID) - } - - if err != nil { + if err := notifyUser(issueWatch.UserID); err != nil { return err } } + for _, watch := range watches { + if err := notifyUser(watch.UserID); err != nil { + return err + } + } return nil } diff --git a/models/oauth2.go b/models/oauth2.go new file mode 100644 index 0000000..a191754 --- /dev/null +++ b/models/oauth2.go @@ -0,0 +1,117 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "sort" + + "code.gitea.io/gitea/modules/auth/oauth2" +) + +// OAuth2Provider describes the display values of a single OAuth2 provider +type OAuth2Provider struct { + Name string + DisplayName string + Image string + CustomURLMapping *oauth2.CustomURLMapping +} + +// OAuth2Providers contains the map of registered OAuth2 providers in Gitea (based on goth) +// key is used to map the OAuth2Provider with the goth provider type (also in LoginSource.OAuth2Config.Provider) +// value is used to store display data +var OAuth2Providers = map[string]OAuth2Provider{ + "bitbucket": {Name: "bitbucket", DisplayName: "Bitbucket", Image: "/img/auth/bitbucket.png"}, + "dropbox": {Name: "dropbox", DisplayName: "Dropbox", Image: "/img/auth/dropbox.png"}, + "facebook": {Name: "facebook", DisplayName: "Facebook", Image: "/img/auth/facebook.png"}, + "github": {Name: "github", DisplayName: "GitHub", Image: "/img/auth/github.png", + CustomURLMapping: &oauth2.CustomURLMapping{ + TokenURL: oauth2.GetDefaultTokenURL("github"), + AuthURL: oauth2.GetDefaultAuthURL("github"), + ProfileURL: oauth2.GetDefaultProfileURL("github"), + EmailURL: oauth2.GetDefaultEmailURL("github"), + }, + }, + "gitlab": {Name: "gitlab", DisplayName: "GitLab", Image: "/img/auth/gitlab.png", + CustomURLMapping: &oauth2.CustomURLMapping{ + TokenURL: oauth2.GetDefaultTokenURL("gitlab"), + AuthURL: oauth2.GetDefaultAuthURL("gitlab"), + ProfileURL: oauth2.GetDefaultProfileURL("gitlab"), + }, + }, + "gplus": {Name: "gplus", DisplayName: "Google+", Image: "/img/auth/google_plus.png"}, + "openidConnect": {Name: "openidConnect", DisplayName: "OpenID Connect", Image: "/img/auth/openid_connect.png"}, + "twitter": {Name: "twitter", DisplayName: "Twitter", Image: "/img/auth/twitter.png"}, +} + +// OAuth2DefaultCustomURLMappings contains the map of default URL's for OAuth2 providers that are allowed to have custom urls +// key is used to map the OAuth2Provider +// value is the mapping as defined for the OAuth2Provider +var OAuth2DefaultCustomURLMappings = map[string]*oauth2.CustomURLMapping{ + "github": OAuth2Providers["github"].CustomURLMapping, + "gitlab": OAuth2Providers["gitlab"].CustomURLMapping, +} + +// GetActiveOAuth2ProviderLoginSources returns all actived LoginOAuth2 sources +func GetActiveOAuth2ProviderLoginSources() ([]*LoginSource, error) { + sources := make([]*LoginSource, 0, 1) + if err := x.Where("is_actived = ? and type = ?", true, LoginOAuth2).Find(&sources); err != nil { + return nil, err + } + return sources, nil +} + +// GetActiveOAuth2LoginSourceByName returns a OAuth2 LoginSource based on the given name +func GetActiveOAuth2LoginSourceByName(name string) (*LoginSource, error) { + loginSource := new(LoginSource) + has, err := x.Where("name = ? and type = ? and is_actived = ?", name, LoginOAuth2, true).Get(loginSource) + if !has || err != nil { + return nil, err + } + + return loginSource, nil +} + +// GetActiveOAuth2Providers returns the map of configured active OAuth2 providers +// key is used as technical name (like in the callbackURL) +// values to display +func GetActiveOAuth2Providers() ([]string, map[string]OAuth2Provider, error) { + // Maybe also separate used and unused providers so we can force the registration of only 1 active provider for each type + + loginSources, err := GetActiveOAuth2ProviderLoginSources() + if err != nil { + return nil, nil, err + } + + var orderedKeys []string + providers := make(map[string]OAuth2Provider) + for _, source := range loginSources { + providers[source.Name] = OAuth2Providers[source.OAuth2().Provider] + orderedKeys = append(orderedKeys, source.Name) + } + + sort.Strings(orderedKeys) + + return orderedKeys, providers, nil +} + +// InitOAuth2 initialize the OAuth2 lib and register all active OAuth2 providers in the library +func InitOAuth2() { + oauth2.Init() + loginSources, _ := GetActiveOAuth2ProviderLoginSources() + + for _, source := range loginSources { + oAuth2Config := source.OAuth2() + oauth2.RegisterProvider(source.Name, oAuth2Config.Provider, oAuth2Config.ClientID, oAuth2Config.ClientSecret, oAuth2Config.OpenIDConnectAutoDiscoveryURL, oAuth2Config.CustomURLMapping) + } +} + +// wrapOpenIDConnectInitializeError is used to wrap the error but this cannot be done in modules/auth/oauth2 +// inside oauth2: import cycle not allowed models -> modules/auth/oauth2 -> models +func wrapOpenIDConnectInitializeError(err error, providerName string, oAuth2Config *OAuth2Config) error { + if err != nil && "openidConnect" == oAuth2Config.Provider { + err = ErrOpenIDConnectInitialize{ProviderName: providerName, OpenIDConnectAutoDiscoveryURL: oAuth2Config.OpenIDConnectAutoDiscoveryURL, Cause: err} + } + return err +} diff --git a/models/org.go b/models/org.go index 9d7aaec..461e929 100644 --- a/models/org.go +++ b/models/org.go @@ -16,8 +16,6 @@ import ( ) var ( - // ErrOrgNotExist organization does not exist - ErrOrgNotExist = errors.New("Organization does not exist") // ErrTeamNotExist team does not exist ErrTeamNotExist = errors.New("Team does not exist") ) @@ -127,7 +125,7 @@ func CreateOrganization(org, owner *User) (err error) { org.Type = UserTypeOrganization sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -156,6 +154,7 @@ func CreateOrganization(org, owner *User) (err error) { Name: ownerTeamName, Authorize: AccessModeOwner, NumMembers: 1, + UnitTypes: allRepUnitTypes, } if _, err = sess.Insert(t); err != nil { return fmt.Errorf("insert owner team: %v", err) @@ -179,7 +178,7 @@ func CreateOrganization(org, owner *User) (err error) { // GetOrgByName returns organization by given name. func GetOrgByName(name string) (*User, error) { if len(name) == 0 { - return nil, ErrOrgNotExist + return nil, ErrOrgNotExist{0, name} } u := &User{ LowerName: strings.ToLower(name), @@ -189,7 +188,7 @@ func GetOrgByName(name string) (*User, error) { if err != nil { return nil, err } else if !has { - return nil, ErrOrgNotExist + return nil, ErrOrgNotExist{0, name} } return u, nil } @@ -236,11 +235,7 @@ func DeleteOrganization(org *User) (err error) { } } - if err = sess.Commit(); err != nil { - return err - } - - return nil + return sess.Commit() } func deleteOrg(e *xorm.Session, u *User) error { @@ -480,7 +475,7 @@ func RemoveOrgUser(orgID, userID int64) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err := sess.Begin(); err != nil { return err } @@ -548,10 +543,10 @@ func removeOrgRepo(e Engine, orgID, repoID int64) error { teamIDs := make([]int64, len(teamRepos)) for i, teamRepo := range teamRepos { - teamIDs[i] = teamRepo.ID + teamIDs[i] = teamRepo.TeamID } - _, err := x.Decr("num_repos").In("id", teamIDs).Update(new(Team)) + _, err := e.Decr("num_repos").In("id", teamIDs).Update(new(Team)) return err } @@ -670,13 +665,30 @@ func (env *accessibleReposEnv) Repos(page, pageSize int) ([]*Repository, error) Find(&repos) } -func (env *accessibleReposEnv) MirrorRepos() ([]*Repository, error) { - repos := make([]*Repository, 0, 10) - return repos, x. - Select("`repository`.*"). +func (env *accessibleReposEnv) MirrorRepoIDs() ([]int64, error) { + repoIDs := make([]int64, 0, 10) + return repoIDs, x. + Table("repository"). Join("INNER", "team_repo", "`team_repo`.repo_id=`repository`.id AND `repository`.is_mirror=?", true). Where(env.cond()). - GroupBy("`repository`.id"). + GroupBy("`repository`.id, `repository`.updated_unix"). OrderBy("updated_unix DESC"). + Cols("`repository`.id"). + Find(&repoIDs) +} + +func (env *accessibleReposEnv) MirrorRepos() ([]*Repository, error) { + repoIDs, err := env.MirrorRepoIDs() + if err != nil { + return nil, fmt.Errorf("MirrorRepoIDs: %v", err) + } + + repos := make([]*Repository, 0, len(repoIDs)) + if len(repoIDs) <= 0 { + return repos, nil + } + + return repos, x. + In("`repository`.id", repoIDs). Find(&repos) } diff --git a/models/org_team.go b/models/org_team.go index 84282da..bc0e12b 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -24,6 +24,15 @@ type Team struct { Members []*User `xorm:"-"` NumRepos int NumMembers int + UnitTypes []UnitType `xorm:"json"` +} + +// GetUnitTypes returns unit types the team owned, empty means all the unit types +func (t *Team) GetUnitTypes() []UnitType { + if len(t.UnitTypes) == 0 { + return allRepUnitTypes + } + return t.UnitTypes } // IsOwnerTeam returns true if team is owner team. @@ -110,7 +119,7 @@ func (t *Team) AddRepository(repo *Repository) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -139,18 +148,19 @@ func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (e } } - if err = t.getMembers(e); err != nil { - return fmt.Errorf("get team members: %v", err) + teamUsers, err := getTeamUsersByTeamID(e, t.ID) + if err != nil { + return fmt.Errorf("getTeamUsersByTeamID: %v", err) } - for _, u := range t.Members { - has, err := hasAccess(e, u, repo, AccessModeRead) + for _, teamUser := range teamUsers { + has, err := hasAccess(e, teamUser.UID, repo, AccessModeRead) if err != nil { return err } else if has { continue } - if err = watchRepo(e, u.ID, repo.ID, false); err != nil { + if err = watchRepo(e, teamUser.UID, repo.ID, false); err != nil { return err } } @@ -170,7 +180,7 @@ func (t *Team) RemoveRepository(repoID int64) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -182,6 +192,19 @@ func (t *Team) RemoveRepository(repoID int64) error { return sess.Commit() } +// UnitEnabled returns if the team has the given unit type enabled +func (t *Team) UnitEnabled(tp UnitType) bool { + if len(t.UnitTypes) == 0 { + return true + } + for _, u := range t.UnitTypes { + if u == tp { + return true + } + } + return false +} + // IsUsableTeamName tests if a name could be as team name func IsUsableTeamName(name string) error { switch name { @@ -207,7 +230,7 @@ func NewTeam(t *Team) (err error) { if err != nil { return err } else if !has { - return ErrOrgNotExist + return ErrOrgNotExist{t.OrgID, ""} } t.LowerName = strings.ToLower(t.Name) @@ -286,7 +309,7 @@ func UpdateTeam(t *Team, authChanged bool) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -331,7 +354,7 @@ func DeleteTeam(t *Team) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err := sess.Begin(); err != nil { return err } @@ -399,20 +422,25 @@ func IsTeamMember(orgID, teamID, userID int64) bool { return isTeamMember(x, orgID, teamID, userID) } -func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) { +func getTeamUsersByTeamID(e Engine, teamID int64) ([]*TeamUser, error) { teamUsers := make([]*TeamUser, 0, 10) - if err = e. + return teamUsers, e. Where("team_id=?", teamID). - Find(&teamUsers); err != nil { + Find(&teamUsers) +} + +func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) { + teamUsers, err := getTeamUsersByTeamID(e, teamID) + if err != nil { return nil, fmt.Errorf("get team-users: %v", err) } - members := make([]*User, 0, len(teamUsers)) - for i := range teamUsers { - member := new(User) - if _, err = e.Id(teamUsers[i].UID).Get(member); err != nil { - return nil, fmt.Errorf("get user '%d': %v", teamUsers[i].UID, err) + members := make([]*User, len(teamUsers)) + for i, teamUser := range teamUsers { + member, err := getUserByID(e, teamUser.UID) + if err != nil { + return nil, fmt.Errorf("get user '%d': %v", teamUser.UID, err) } - members = append(members, member) + members[i] = member } return members, nil } @@ -454,7 +482,7 @@ func AddTeamMember(team *Team, userID int64) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err := sess.Begin(); err != nil { return err } @@ -556,7 +584,7 @@ func removeTeamMember(e Engine, team *Team, userID int64) error { // RemoveTeamMember removes member from given team of given organization. func RemoveTeamMember(team *Team, userID int64) error { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err := sess.Begin(); err != nil { return err } diff --git a/models/org_team_test.go b/models/org_team_test.go index db0a814..9afd733 100644 --- a/models/org_team_test.go +++ b/models/org_team_test.go @@ -117,15 +117,15 @@ func TestTeam_HasRepository(t *testing.T) { func TestTeam_AddRepository(t *testing.T) { assert.NoError(t, PrepareTestDatabase()) - testSucess := func(teamID, repoID int64) { + testSuccess := func(teamID, repoID int64) { team := AssertExistsAndLoadBean(t, &Team{ID: teamID}).(*Team) repo := AssertExistsAndLoadBean(t, &Repository{ID: repoID}).(*Repository) assert.NoError(t, team.AddRepository(repo)) AssertExistsAndLoadBean(t, &TeamRepo{TeamID: teamID, RepoID: repoID}) CheckConsistencyFor(t, &Team{ID: teamID}, &Repository{ID: repoID}) } - testSucess(2, 3) - testSucess(2, 5) + testSuccess(2, 3) + testSuccess(2, 5) team := AssertExistsAndLoadBean(t, &Team{ID: 1}).(*Team) repo := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository) @@ -243,7 +243,7 @@ func TestDeleteTeam(t *testing.T) { // check that team members don't have "leftover" access to repos user := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User) repo := AssertExistsAndLoadBean(t, &Repository{ID: 3}).(*Repository) - accessMode, err := AccessLevel(user, repo) + accessMode, err := AccessLevel(user.ID, repo) assert.NoError(t, err) assert.True(t, accessMode < AccessModeWrite) } diff --git a/models/org_test.go b/models/org_test.go index 95698a5..801088c 100644 --- a/models/org_test.go +++ b/models/org_test.go @@ -222,10 +222,10 @@ func TestGetOrgByName(t *testing.T) { assert.Equal(t, "user3", org.Name) org, err = GetOrgByName("user2") // user2 is an individual - assert.Equal(t, ErrOrgNotExist, err) + assert.True(t, IsErrOrgNotExist(err)) org, err = GetOrgByName("") // corner case - assert.Equal(t, ErrOrgNotExist, err) + assert.True(t, IsErrOrgNotExist(err)) } func TestCountOrganizations(t *testing.T) { diff --git a/models/pull.go b/models/pull.go index 8228224..3d2e5c6 100644 --- a/models/pull.go +++ b/models/pull.go @@ -197,6 +197,8 @@ func (pr *PullRequest) APIFormat() *api.PullRequest { Base: apiBaseBranchInfo, Head: apiHeadBranchInfo, MergeBase: pr.MergeBase, + Created: &pr.Issue.Created, + Updated: &pr.Issue.Updated, } if pr.Status != PullRequestStatusChecking { @@ -326,7 +328,7 @@ func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error return fmt.Errorf("git push: %s", stderr) } - pr.MergedCommitID, err = headGitRepo.GetBranchCommitID(pr.HeadBranch) + pr.MergedCommitID, err = baseGitRepo.GetBranchCommitID(pr.BaseBranch) if err != nil { return fmt.Errorf("GetBranchCommit: %v", err) } @@ -404,7 +406,7 @@ func (pr *PullRequest) setMerged() (err error) { pr.HasMerged = true sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -493,23 +495,31 @@ func (pr *PullRequest) getMergeCommit() (*git.Commit, error) { if err != nil { // Errors are signaled by a non-zero status that is not 1 - if err.Error() == "exit status 1" { + if strings.Contains(err.Error(), "exit status 1") { return nil, nil } return nil, fmt.Errorf("git merge-base --is-ancestor: %v %v", stderr, err) } - // We can ignore this error since we only get here when there's a valid commit in headFile - commitID, _ := ioutil.ReadFile(pr.BaseRepo.RepoPath() + "/" + headFile) - cmd := string(commitID)[:40] + ".." + pr.BaseBranch + commitIDBytes, err := ioutil.ReadFile(pr.BaseRepo.RepoPath() + "/" + headFile) + if err != nil { + return nil, fmt.Errorf("ReadFile(%s): %v", headFile, err) + } + commitID := string(commitIDBytes) + if len(commitID) < 40 { + return nil, fmt.Errorf(`ReadFile(%s): invalid commit-ID "%s"`, headFile, commitID) + } + cmd := commitID[:40] + ".." + pr.BaseBranch // Get the commit from BaseBranch where the pull request got merged mergeCommit, stderr, err := process.GetManager().ExecDirEnv(-1, "", fmt.Sprintf("isMerged (git rev-list --ancestry-path --merges --reverse): %d", pr.BaseRepo.ID), []string{"GIT_INDEX_FILE=" + indexTmpPath, "GIT_DIR=" + pr.BaseRepo.RepoPath()}, "git", "rev-list", "--ancestry-path", "--merges", "--reverse", cmd) - if err != nil { return nil, fmt.Errorf("git rev-list --ancestry-path --merges --reverse: %v %v", stderr, err) + } else if len(mergeCommit) < 40 { + // PR was fast-forwarded, so just use last commit of PR + mergeCommit = commitID[:40] } gitRepo, err := git.OpenRepository(pr.BaseRepo.RepoPath()) @@ -592,7 +602,7 @@ func (pr *PullRequest) testPatch() (err error) { // NewPullRequest creates new pull request with labels for repository. func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []string, pr *PullRequest, patch []byte) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -631,14 +641,13 @@ func NewPullRequest(repo *Repository, pull *Issue, labelIDs []int64, uuids []str } if err = NotifyWatchers(&Action{ - ActUserID: pull.Poster.ID, - ActUserName: pull.Poster.Name, - OpType: ActionCreatePullRequest, - Content: fmt.Sprintf("%d|%s", pull.Index, pull.Title), - RepoID: repo.ID, - RepoUserName: repo.Owner.Name, - RepoName: repo.Name, - IsPrivate: repo.IsPrivate, + ActUserID: pull.Poster.ID, + ActUser: pull.Poster, + OpType: ActionCreatePullRequest, + Content: fmt.Sprintf("%d|%s", pull.Index, pull.Title), + RepoID: repo.ID, + Repo: repo, + IsPrivate: repo.IsPrivate, }); err != nil { log.Error(4, "NotifyWatchers: %v", err) } else if err = pull.MailParticipants(); err != nil { @@ -679,8 +688,6 @@ func listPullRequestStatement(baseRepoID int64, opts *PullRequestsOptions) (*xor sess.And("issue.is_closed=?", opts.State == "closed") } - sortIssuesSession(sess, opts.SortType) - if labelIDs, err := base.StringsToInt64s(opts.Labels); err != nil { return nil, err } else if len(labelIDs) > 0 { @@ -714,6 +721,7 @@ func PullRequests(baseRepoID int64, opts *PullRequestsOptions) ([]*PullRequest, prs := make([]*PullRequest, 0, ItemsPerPage) findSession, err := listPullRequestStatement(baseRepoID, opts) + sortIssuesSession(findSession, opts.SortType) if err != nil { log.Error(4, "listPullRequestStatement", err) return nil, maxResults, err @@ -904,7 +912,10 @@ func (pr *PullRequest) PushToBaseRepo() (err error) { _ = os.Remove(file) - if err = git.Push(headRepoPath, tmpRemoteName, fmt.Sprintf("%s:%s", pr.HeadBranch, headFile)); err != nil { + if err = git.Push(headRepoPath, git.PushOptions{ + Remote: tmpRemoteName, + Branch: fmt.Sprintf("%s:%s", pr.HeadBranch, headFile), + }); err != nil { return fmt.Errorf("Push: %v", err) } @@ -1054,29 +1065,30 @@ func (pr *PullRequest) checkAndUpdateStatus() { // TODO: test more pull requests at same time. func TestPullRequests() { prs := make([]*PullRequest, 0, 10) - x.Iterate(PullRequest{ - Status: PullRequestStatusChecking, - }, - func(idx int, bean interface{}) error { - pr := bean.(*PullRequest) - if err := pr.GetBaseRepo(); err != nil { - log.Error(3, "GetBaseRepo: %v", err) - return nil - } - if pr.manuallyMerged() { - return nil - } - if err := pr.testPatch(); err != nil { - log.Error(3, "testPatch: %v", err) - return nil - } - prs = append(prs, pr) - return nil - }) + err := x.Where("status = ?", PullRequestStatusChecking).Find(&prs) + if err != nil { + log.Error(3, "Find Checking PRs", err) + return + } + + var checkedPRs = make(map[int64]struct{}) // Update pull request status. for _, pr := range prs { + checkedPRs[pr.ID] = struct{}{} + if err := pr.GetBaseRepo(); err != nil { + log.Error(3, "GetBaseRepo: %v", err) + continue + } + if pr.manuallyMerged() { + continue + } + if err := pr.testPatch(); err != nil { + log.Error(3, "testPatch: %v", err) + continue + } + pr.checkAndUpdateStatus() } @@ -1085,7 +1097,12 @@ func TestPullRequests() { log.Trace("TestPullRequests[%v]: processing test task", prID) pullRequestQueue.Remove(prID) - pr, err := GetPullRequestByID(com.StrTo(prID).MustInt64()) + id := com.StrTo(prID).MustInt64() + if _, ok := checkedPRs[id]; ok { + continue + } + + pr, err := GetPullRequestByID(id) if err != nil { log.Error(4, "GetPullRequestByID[%s]: %v", prID, err) continue diff --git a/models/release.go b/models/release.go index 3e3db98..4205413 100644 --- a/models/release.go +++ b/models/release.go @@ -14,6 +14,7 @@ import ( "code.gitea.io/gitea/modules/process" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/sdk/gitea" + "github.com/go-xorm/builder" "github.com/go-xorm/xorm" ) @@ -33,7 +34,8 @@ type Release struct { NumCommitsBehind int64 `xorm:"-"` Note string `xorm:"TEXT"` IsDraft bool `xorm:"NOT NULL DEFAULT false"` - IsPrerelease bool + IsPrerelease bool `xorm:"NOT NULL DEFAULT false"` + IsTag bool `xorm:"NOT NULL DEFAULT false"` Attachments []*Attachment `xorm:"-"` @@ -73,7 +75,7 @@ func (r *Release) loadAttributes(e Engine) error { return nil } -// LoadAttributes load repo and publisher attributes for a realease +// LoadAttributes load repo and publisher attributes for a release func (r *Release) LoadAttributes() error { return r.loadAttributes(x) } @@ -138,17 +140,18 @@ func createTag(gitRepo *git.Repository, rel *Release) error { } return err } - } else { - commit, err := gitRepo.GetTagCommit(rel.TagName) - if err != nil { - return fmt.Errorf("GetTagCommit: %v", err) - } + rel.LowerTagName = strings.ToLower(rel.TagName) + } + commit, err := gitRepo.GetTagCommit(rel.TagName) + if err != nil { + return fmt.Errorf("GetTagCommit: %v", err) + } - rel.Sha1 = commit.ID.String() - rel.NumCommits, err = commit.CommitsCount() - if err != nil { - return fmt.Errorf("CommitsCount: %v", err) - } + rel.Sha1 = commit.ID.String() + rel.CreatedUnix = commit.Author.When.Unix() + rel.NumCommits, err = commit.CommitsCount() + if err != nil { + return fmt.Errorf("CommitsCount: %v", err) } } return nil @@ -232,25 +235,46 @@ func GetReleaseByID(id int64) (*Release, error) { return rel, nil } +// FindReleasesOptions describes the conditions to Find releases +type FindReleasesOptions struct { + IncludeDrafts bool + IncludeTags bool + TagNames []string +} + +func (opts *FindReleasesOptions) toConds(repoID int64) builder.Cond { + var cond = builder.NewCond() + cond = cond.And(builder.Eq{"repo_id": repoID}) + + if !opts.IncludeDrafts { + cond = cond.And(builder.Eq{"is_draft": false}) + } + if !opts.IncludeTags { + cond = cond.And(builder.Eq{"is_tag": false}) + } + if len(opts.TagNames) > 0 { + cond = cond.And(builder.In("tag_name", opts.TagNames)) + } + return cond +} + // GetReleasesByRepoID returns a list of releases of repository. -func GetReleasesByRepoID(repoID int64, page, pageSize int) (rels []*Release, err error) { +func GetReleasesByRepoID(repoID int64, opts FindReleasesOptions, page, pageSize int) (rels []*Release, err error) { if page <= 0 { page = 1 } + err = x. - Desc("created_unix"). + Desc("created_unix", "id"). Limit(pageSize, (page-1)*pageSize). - Find(&rels, Release{RepoID: repoID}) + Where(opts.toConds(repoID)). + Find(&rels) return rels, err } -// GetReleasesByRepoIDAndNames returns a list of releases of repository according repoID and tagNames. -func GetReleasesByRepoIDAndNames(repoID int64, tagNames []string) (rels []*Release, err error) { - err = x. - Desc("created_unix"). - In("tag_name", tagNames). - Find(&rels, Release{RepoID: repoID}) - return rels, err +// GetReleaseCountByRepoID returns the count of releases of repository +func GetReleaseCountByRepoID(repoID int64, opts FindReleasesOptions) (int64, error) { + return x.Where(opts.toConds(repoID)).Count(&Release{}) } type releaseMetaSearch struct { @@ -343,6 +367,8 @@ func UpdateRelease(gitRepo *git.Repository, rel *Release, attachmentUUIDs []stri if err = createTag(gitRepo, rel); err != nil { return err } + rel.LowerTagName = strings.ToLower(rel.TagName) + _, err = x.Id(rel.ID).AllCols().Update(rel) if err != nil { return err @@ -365,7 +391,7 @@ func DeleteReleaseByID(id int64, u *User, delTag bool) error { return fmt.Errorf("GetRepositoryByID: %v", err) } - has, err := HasAccess(u, repo, AccessModeWrite) + has, err := HasAccess(u.ID, repo, AccessModeWrite) if err != nil { return fmt.Errorf("HasAccess: %v", err) } else if !has { @@ -379,11 +405,64 @@ func DeleteReleaseByID(id int64, u *User, delTag bool) error { if err != nil && !strings.Contains(stderr, "not found") { return fmt.Errorf("git tag -d: %v - %s", err, stderr) } - } - if _, err = x.Id(rel.ID).Delete(new(Release)); err != nil { - return fmt.Errorf("Delete: %v", err) + if _, err = x.Id(rel.ID).Delete(new(Release)); err != nil { + return fmt.Errorf("Delete: %v", err) + } + } else { + rel.IsTag = true + rel.IsDraft = false + rel.IsPrerelease = false + rel.Title = "" + rel.Note = "" + + if _, err = x.Id(rel.ID).AllCols().Update(rel); err != nil { + return fmt.Errorf("Update: %v", err) + } } return nil } + +// SyncReleasesWithTags synchronizes release table with repository tags +func SyncReleasesWithTags(repo *Repository, gitRepo *git.Repository) error { + existingRelTags := make(map[string]struct{}) + opts := FindReleasesOptions{IncludeDrafts: true, IncludeTags: true} + for page := 1; ; page++ { + rels, err := GetReleasesByRepoID(repo.ID, opts, page, 100) + if err != nil { + return fmt.Errorf("GetReleasesByRepoID: %v", err) + } + if len(rels) == 0 { + break + } + for _, rel := range rels { + if rel.IsDraft { + continue + } + commitID, err := gitRepo.GetTagCommitID(rel.TagName) + if err != nil { + return fmt.Errorf("GetTagCommitID: %v", err) + } + if !gitRepo.IsTagExist(rel.TagName) || commitID != rel.Sha1 { + if err := pushUpdateDeleteTag(repo, gitRepo, rel.TagName); err != nil { + return fmt.Errorf("pushUpdateDeleteTag: %v", err) + } + } else { + existingRelTags[strings.ToLower(rel.TagName)] = struct{}{} + } + } + } + tags, err := gitRepo.GetTags() + if err != nil { + return fmt.Errorf("GetTags: %v", err) + } + for _, tagName := range tags { + if _, ok := existingRelTags[strings.ToLower(tagName)]; !ok { + if err := pushUpdateAddTag(repo, gitRepo, tagName); err != nil { + return fmt.Errorf("pushUpdateAddTag: %v", err) + } + } + } + return nil +} diff --git a/models/repo.go b/models/repo.go index 87b9a6e..c4bb9a8 100644 --- a/models/repo.go +++ b/models/repo.go @@ -193,7 +193,7 @@ type Repository struct { NumMilestones int `xorm:"NOT NULL DEFAULT 0"` NumClosedMilestones int `xorm:"NOT NULL DEFAULT 0"` NumOpenMilestones int `xorm:"-"` - NumTags int `xorm:"-"` + NumReleases int `xorm:"-"` IsPrivate bool `xorm:"INDEX"` IsBare bool `xorm:"INDEX"` @@ -207,6 +207,7 @@ type Repository struct { IsFork bool `xorm:"INDEX NOT NULL DEFAULT false"` ForkID int64 `xorm:"INDEX"` BaseRepo *Repository `xorm:"-"` + Size int64 `xorm:"NOT NULL DEFAULT 0"` Created time.Time `xorm:"-"` CreatedUnix int64 `xorm:"INDEX"` @@ -271,12 +272,27 @@ func (repo *Repository) APIURL() string { // APIFormat converts a Repository to api.Repository func (repo *Repository) APIFormat(mode AccessMode) *api.Repository { + return repo.innerAPIFormat(mode, false) +} + +func (repo *Repository) innerAPIFormat(mode AccessMode, isParent bool) *api.Repository { + var parent *api.Repository + cloneLink := repo.CloneLink() permission := &api.Permission{ Admin: mode >= AccessModeAdmin, Push: mode >= AccessModeWrite, Pull: mode >= AccessModeRead, } + if !isParent { + err := repo.GetBaseRepo() + if err != nil { + log.Error(4, "APIFormat: %v", err) + } + if repo.BaseRepo != nil { + parent = repo.BaseRepo.innerAPIFormat(mode, true) + } + } return &api.Repository{ ID: repo.ID, Owner: repo.Owner.APIFormat(), @@ -284,7 +300,10 @@ func (repo *Repository) APIFormat(mode AccessMode) *api.Repository { FullName: repo.FullName(), Description: repo.Description, Private: repo.IsPrivate, + Empty: repo.IsBare, + Size: int(repo.Size / 1024), Fork: repo.IsFork, + Parent: parent, Mirror: repo.IsMirror, HTMLURL: repo.HTMLURL(), SSHURL: cloneLink.SSH, @@ -310,12 +329,77 @@ func (repo *Repository) getUnits(e Engine) (err error) { return err } -func getUnitsByRepoID(e Engine, repoID int64) (units []*RepoUnit, err error) { - return units, e.Where("repo_id = ?", repoID).Find(&units) +// CheckUnitUser check whether user could visit the unit of this repository +func (repo *Repository) CheckUnitUser(userID int64, isAdmin bool, unitType UnitType) bool { + if err := repo.getUnitsByUserID(x, userID, isAdmin); err != nil { + return false + } + + for _, unit := range repo.Units { + if unit.Type == unitType { + return true + } + } + return false } -// EnableUnit if this repository enabled some unit -func (repo *Repository) EnableUnit(tp UnitType) bool { +// LoadUnitsByUserID loads units according userID's permissions +func (repo *Repository) LoadUnitsByUserID(userID int64, isAdmin bool) error { + return repo.getUnitsByUserID(x, userID, isAdmin) +} + +func (repo *Repository) getUnitsByUserID(e Engine, userID int64, isAdmin bool) (err error) { + if repo.Units != nil { + return nil + } + + if err = repo.getUnits(e); err != nil { + return err + } else if err = repo.getOwner(e); err != nil { + return err + } + + if !repo.Owner.IsOrganization() || userID == 0 || isAdmin || !repo.IsPrivate { + return nil + } + + // Collaborators will not be limited + if isCollaborator, err := repo.isCollaborator(e, userID); err != nil { + return err + } else if isCollaborator { + return nil + } + + teams, err := getUserTeams(e, repo.OwnerID, userID) + if err != nil { + return err + } + + var allTypes = make(map[UnitType]struct{}, len(allRepUnitTypes)) + for _, team := range teams { + // Administrators can not be limited + if team.Authorize >= AccessModeAdmin { + return nil + } + for _, unitType := range team.UnitTypes { + allTypes[unitType] = struct{}{} + } + } + + // unique + var newRepoUnits = make([]*RepoUnit, 0, len(repo.Units)) + for _, u := range repo.Units { + if _, ok := allTypes[u.Type]; ok { + newRepoUnits = append(newRepoUnits, u) + } + } + + repo.Units = newRepoUnits + return nil +} + +// UnitEnabled if this repository has the given unit enabled +func (repo *Repository) UnitEnabled(tp UnitType) bool { repo.getUnits(x) for _, unit := range repo.Units { if unit.Type == tp { @@ -325,6 +409,21 @@ func (repo *Repository) EnableUnit(tp UnitType) bool { return false } +// AnyUnitEnabled if this repository has the any of the given units enabled +func (repo *Repository) AnyUnitEnabled(tps ...UnitType) bool { + if err := repo.getUnits(x); err != nil { + log.Warn("Error loading repository (ID: %d) units: %s", repo.ID, err.Error()) + } + for _, unit := range repo.Units { + for _, tp := range tps { + if unit.Type == tp { + return true + } + } + } + return false +} + var ( // ErrUnitNotExist organization does not exist ErrUnitNotExist = errors.New("Unit does not exist") @@ -531,7 +630,7 @@ func (repo *Repository) ComposeCompareURL(oldCommitID, newCommitID string) strin // HasAccess returns true when user has access to this repository func (repo *Repository) HasAccess(u *User) bool { - has, _ := HasAccess(u, repo, AccessModeRead) + has, _ := HasAccess(u.ID, repo, AccessModeRead) return has } @@ -546,19 +645,54 @@ func (repo *Repository) IsOwnedBy(userID int64) bool { return repo.OwnerID == userID } +func (repo *Repository) updateSize(e Engine) error { + repoInfoSize, err := git.GetRepoSize(repo.RepoPath()) + if err != nil { + return fmt.Errorf("UpdateSize: %v", err) + } + + repo.Size = repoInfoSize.Size + repoInfoSize.SizePack + _, err = e.Id(repo.ID).Cols("size").Update(repo) + return err +} + +// UpdateSize updates the repository size, calculating it using git.GetRepoSize +func (repo *Repository) UpdateSize() error { + return repo.updateSize(x) +} + // CanBeForked returns true if repository meets the requirements of being forked. func (repo *Repository) CanBeForked() bool { - return !repo.IsBare + return !repo.IsBare && repo.UnitEnabled(UnitTypeCode) +} + +// CanUserFork returns true if specified user can fork repository. +func (repo *Repository) CanUserFork(user *User) (bool, error) { + if user == nil { + return false, nil + } + if repo.OwnerID != user.ID && !user.HasForkedRepo(repo.ID) { + return true, nil + } + if err := user.GetOwnedOrganizations(); err != nil { + return false, err + } + for _, org := range user.OwnedOrgs { + if repo.OwnerID != org.ID && !org.HasForkedRepo(repo.ID) { + return true, nil + } + } + return false, nil } // CanEnablePulls returns true if repository meets the requirements of accepting pulls. func (repo *Repository) CanEnablePulls() bool { - return !repo.IsMirror + return !repo.IsMirror && !repo.IsBare } // AllowsPulls returns true if repository meets the requirements of accepting pulls and has them enabled. func (repo *Repository) AllowsPulls() bool { - return repo.CanEnablePulls() && repo.EnableUnit(UnitTypePullRequests) + return repo.CanEnablePulls() && repo.UnitEnabled(UnitTypePullRequests) } // CanEnableEditor returns true if repository meets the requirements of web editor. @@ -587,7 +721,10 @@ func (repo *Repository) DescriptionHTML() template.HTML { // LocalCopyPath returns the local repository copy path func (repo *Repository) LocalCopyPath() string { - return path.Join(setting.AppDataPath, "tmp/local-repo", com.ToStr(repo.ID)) + if filepath.IsAbs(setting.Repository.Local.LocalCopyPath) { + return path.Join(setting.Repository.Local.LocalCopyPath, com.ToStr(repo.ID)) + } + return path.Join(setting.AppDataPath, setting.Repository.Local.LocalCopyPath, com.ToStr(repo.ID)) } // UpdateLocalCopyBranch pulls latest changes of given branch from repoPath to localPath. @@ -608,12 +745,13 @@ func UpdateLocalCopyBranch(repoPath, localPath, branch string) error { }); err != nil { return fmt.Errorf("git checkout %s: %v", branch, err) } - if err := git.Pull(localPath, git.PullRemoteOptions{ - Timeout: time.Duration(setting.Git.Timeout.Pull) * time.Second, - Remote: "origin", - Branch: branch, - }); err != nil { - return fmt.Errorf("git pull origin %s: %v", branch, err) + + _, err := git.NewCommand("fetch", "origin").RunInDir(localPath) + if err != nil { + return fmt.Errorf("git fetch origin: %v", err) + } + if err := git.ResetHEAD(localPath, true, "origin/"+branch); err != nil { + return fmt.Errorf("git reset --hard origin/%s: %v", branch, err) } } return nil @@ -808,6 +946,14 @@ func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) { if headBranch != nil { repo.DefaultBranch = headBranch.Name } + + if err = SyncReleasesWithTags(repo, gitRepo); err != nil { + log.Error(4, "Failed to synchronize tags to releases for repository: %v", err) + } + } + + if err = repo.UpdateSize(); err != nil { + log.Error(4, "Failed to update size for repository: %v", err) } if opts.IsMirror { @@ -815,7 +961,7 @@ func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) { RepoID: repo.ID, Interval: setting.Mirror.DefaultInterval, EnablePrune: true, - NextUpdate: time.Now().Add(time.Duration(setting.Mirror.DefaultInterval) * time.Hour), + NextUpdate: time.Now().Add(setting.Mirror.DefaultInterval), }); err != nil { return repo, fmt.Errorf("InsertOne: %v", err) } @@ -844,8 +990,12 @@ func cleanUpMigrateGitConfig(configPath string) error { // createDelegateHooks creates all the hooks scripts for the repo func createDelegateHooks(repoPath string) (err error) { var ( - hookNames = []string{"pre-receive", "update", "post-receive"} - hookTpl = fmt.Sprintf("#!/usr/bin/env %s\ndata=$(cat)\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" || continue\necho \"${data}\" | \"${hook}\"\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType) + hookNames = []string{"pre-receive", "update", "post-receive"} + hookTpls = []string{ + fmt.Sprintf("#!/usr/bin/env %s\ndata=$(cat)\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" || continue\necho \"${data}\" | \"${hook}\"\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType), + fmt.Sprintf("#!/usr/bin/env %s\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" || continue\n\"${hook}\" $1 $2 $3\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType), + fmt.Sprintf("#!/usr/bin/env %s\ndata=$(cat)\nexitcodes=\"\"\nhookname=$(basename $0)\nGIT_DIR=${GIT_DIR:-$(dirname $0)}\n\nfor hook in ${GIT_DIR}/hooks/${hookname}.d/*; do\ntest -x \"${hook}\" || continue\necho \"${data}\" | \"${hook}\"\nexitcodes=\"${exitcodes} $?\"\ndone\n\nfor i in ${exitcodes}; do\n[ ${i} -eq 0 ] || exit ${i}\ndone\n", setting.ScriptType), + } giteaHookTpls = []string{ fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' pre-receive\n", setting.ScriptType, setting.AppPath, setting.CustomConf), fmt.Sprintf("#!/usr/bin/env %s\n\"%s\" hook --config='%s' update $1 $2 $3\n", setting.ScriptType, setting.AppPath, setting.CustomConf), @@ -864,7 +1014,7 @@ func createDelegateHooks(repoPath string) (err error) { } // WARNING: This will override all old server-side hooks - if err = ioutil.WriteFile(oldHookPath, []byte(hookTpl), 0777); err != nil { + if err = ioutil.WriteFile(oldHookPath, []byte(hookTpls[i]), 0777); err != nil { return fmt.Errorf("write old hook file '%s': %v", oldHookPath, err) } @@ -1167,7 +1317,7 @@ func CreateRepository(u *User, opts CreateRepoOptions) (_ *Repository, err error } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return nil, err } @@ -1251,7 +1401,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return fmt.Errorf("sess.Begin: %v", err) } @@ -1464,6 +1614,10 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e return fmt.Errorf("updateRepository[%d]: %v", forkRepos[i].ID, err) } } + + if err = repo.updateSize(e); err != nil { + log.Error(4, "Failed to update size for repository: %v", err) + } } return nil @@ -1472,7 +1626,7 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e // UpdateRepository updates a repository func UpdateRepository(repo *Repository, visibilityChanged bool) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -1517,7 +1671,7 @@ func DeleteRepository(uid, repoID int64) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -1556,6 +1710,8 @@ func DeleteRepository(uid, repoID int64) error { &Release{RepoID: repoID}, &Collaboration{RepoID: repoID}, &PullRequest{BaseRepoID: repoID}, + &RepoUnit{RepoID: repoID}, + &RepoRedirect{RedirectRepoID: repoID}, ); err != nil { return fmt.Errorf("deleteBeans: %v", err) } @@ -1782,10 +1938,9 @@ func DeleteRepositoryArchives() error { // DeleteOldRepositoryArchives deletes old repository archives. func DeleteOldRepositoryArchives() { - if taskStatusTable.IsRunning(archiveCleanup) { + if !taskStatusTable.StartIfNotRunning(archiveCleanup) { return } - taskStatusTable.Start(archiveCleanup) defer taskStatusTable.Stop(archiveCleanup) log.Trace("Doing: ArchiveCleanup") @@ -1926,10 +2081,9 @@ const ( // GitFsck calls 'git fsck' to check repository health. func GitFsck() { - if taskStatusTable.IsRunning(gitFsck) { + if !taskStatusTable.StartIfNotRunning(gitFsck) { return } - taskStatusTable.Start(gitFsck) defer taskStatusTable.Stop(gitFsck) log.Trace("Doing: GitFsck") @@ -1998,10 +2152,9 @@ func repoStatsCheck(checker *repoChecker) { // CheckRepoStats checks the repository stats func CheckRepoStats() { - if taskStatusTable.IsRunning(checkRepos) { + if !taskStatusTable.StartIfNotRunning(checkRepos) { return } - taskStatusTable.Start(checkRepos) defer taskStatusTable.Stop(checkRepos) log.Trace("Doing: CheckRepoStats") @@ -2133,7 +2286,7 @@ func ForkRepository(u *User, oldRepo *Repository, name, desc string) (_ *Reposit } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return nil, err } @@ -2171,9 +2324,13 @@ func ForkRepository(u *User, oldRepo *Repository, name, desc string) (_ *Reposit return nil, err } + if err = repo.UpdateSize(); err != nil { + log.Error(4, "Failed to update size for repository: %v", err) + } + // Copy LFS meta objects in new session sess2 := x.NewSession() - defer sessionRelease(sess2) + defer sess2.Close() if err = sess2.Begin(); err != nil { return nil, err } @@ -2239,7 +2396,10 @@ func (repo *Repository) CreateNewBranch(doer *User, oldBranchName, branchName st return fmt.Errorf("CreateNewBranch: %v", err) } - if err = git.Push(localPath, "origin", branchName); err != nil { + if err = git.Push(localPath, git.PushOptions{ + Remote: "origin", + Branch: branchName, + }); err != nil { return fmt.Errorf("Push: %v", err) } diff --git a/models/repo_branch.go b/models/repo_branch.go index fcfd3e8..4821902 100644 --- a/models/repo_branch.go +++ b/models/repo_branch.go @@ -39,7 +39,7 @@ func GetBranchesByPath(path string) ([]*Branch, error) { // GetBranch returns a branch by it's name func (repo *Repository) GetBranch(branch string) (*Branch, error) { if !git.IsBranchExist(repo.RepoPath(), branch) { - return nil, &ErrBranchNotExist{branch} + return nil, ErrBranchNotExist{branch} } return &Branch{ Path: repo.RepoPath(), diff --git a/models/repo_collaboration.go b/models/repo_collaboration.go index 39df5b9..791f022 100644 --- a/models/repo_collaboration.go +++ b/models/repo_collaboration.go @@ -46,7 +46,7 @@ func (repo *Repository) AddCollaborator(u *User) error { collaboration.Mode = AccessModeWrite sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -136,7 +136,7 @@ func (repo *Repository) ChangeCollaborationAccessMode(uid int64, mode AccessMode collaboration.Mode = mode sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -161,7 +161,7 @@ func (repo *Repository) DeleteCollaboration(uid int64) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } diff --git a/models/repo_editor.go b/models/repo_editor.go index c675e1c..692fe8c 100644 --- a/models/repo_editor.go +++ b/models/repo_editor.go @@ -136,7 +136,10 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) ( Message: opts.Message, }); err != nil { return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil { + } else if err = git.Push(localPath, git.PushOptions{ + Remote: "origin", + Branch: opts.NewBranch, + }); err != nil { return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err) } @@ -152,27 +155,29 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) ( } // Simulate push event. - pushCommits := &PushCommits{ - Len: 1, - Commits: []*PushCommit{CommitToPushCommit(commit)}, - } oldCommitID := opts.LastCommitID if opts.NewBranch != opts.OldBranch { oldCommitID = git.EmptySHA } - if err := CommitRepoAction(CommitRepoActionOptions{ - PusherName: doer.Name, - RepoOwnerID: repo.MustOwner().ID, - RepoName: repo.Name, - RefFullName: git.BranchPrefix + opts.NewBranch, - OldCommitID: oldCommitID, - NewCommitID: commit.ID.String(), - Commits: pushCommits, - }); err != nil { - log.Error(4, "CommitRepoAction: %v", err) - return nil - } + if err = repo.GetOwner(); err != nil { + return fmt.Errorf("GetOwner: %v", err) + } + err = PushUpdate( + opts.NewBranch, + PushUpdateOptions{ + PusherID: doer.ID, + PusherName: doer.Name, + RepoUserName: repo.Owner.Name, + RepoName: repo.Name, + RefFullName: git.BranchPrefix + opts.NewBranch, + OldCommitID: oldCommitID, + NewCommitID: commit.ID.String(), + }, + ) + if err != nil { + return fmt.Errorf("PushUpdate: %v", err) + } return nil } @@ -273,7 +278,10 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) ( Message: opts.Message, }); err != nil { return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil { + } else if err = git.Push(localPath, git.PushOptions{ + Remote: "origin", + Branch: opts.NewBranch, + }); err != nil { return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err) } @@ -289,23 +297,29 @@ func (repo *Repository) DeleteRepoFile(doer *User, opts DeleteRepoFileOptions) ( } // Simulate push event. - pushCommits := &PushCommits{ - Len: 1, - Commits: []*PushCommit{CommitToPushCommit(commit)}, - } - if err := CommitRepoAction(CommitRepoActionOptions{ - PusherName: doer.Name, - RepoOwnerID: repo.MustOwner().ID, - RepoName: repo.Name, - RefFullName: git.BranchPrefix + opts.NewBranch, - OldCommitID: opts.LastCommitID, - NewCommitID: commit.ID.String(), - Commits: pushCommits, - }); err != nil { - log.Error(4, "CommitRepoAction: %v", err) - return nil + oldCommitID := opts.LastCommitID + if opts.NewBranch != opts.OldBranch { + oldCommitID = git.EmptySHA } + if err = repo.GetOwner(); err != nil { + return fmt.Errorf("GetOwner: %v", err) + } + err = PushUpdate( + opts.NewBranch, + PushUpdateOptions{ + PusherID: doer.ID, + PusherName: doer.Name, + RepoUserName: repo.Owner.Name, + RepoName: repo.Name, + RefFullName: git.BranchPrefix + opts.NewBranch, + OldCommitID: oldCommitID, + NewCommitID: commit.ID.String(), + }, + ) + if err != nil { + return fmt.Errorf("PushUpdate: %v", err) + } return nil } @@ -395,7 +409,7 @@ func DeleteUploads(uploads ...*Upload) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -509,7 +523,10 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) Message: opts.Message, }); err != nil { return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil { + } else if err = git.Push(localPath, git.PushOptions{ + Remote: "origin", + Branch: opts.NewBranch, + }); err != nil { return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err) } @@ -525,21 +542,28 @@ func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) } // Simulate push event. - pushCommits := &PushCommits{ - Len: 1, - Commits: []*PushCommit{CommitToPushCommit(commit)}, + oldCommitID := opts.LastCommitID + if opts.NewBranch != opts.OldBranch { + oldCommitID = git.EmptySHA } - if err := CommitRepoAction(CommitRepoActionOptions{ - PusherName: doer.Name, - RepoOwnerID: repo.MustOwner().ID, - RepoName: repo.Name, - RefFullName: git.BranchPrefix + opts.NewBranch, - OldCommitID: opts.LastCommitID, - NewCommitID: commit.ID.String(), - Commits: pushCommits, - }); err != nil { - log.Error(4, "CommitRepoAction: %v", err) - return nil + + if err = repo.GetOwner(); err != nil { + return fmt.Errorf("GetOwner: %v", err) + } + err = PushUpdate( + opts.NewBranch, + PushUpdateOptions{ + PusherID: doer.ID, + PusherName: doer.Name, + RepoUserName: repo.Owner.Name, + RepoName: repo.Name, + RefFullName: git.BranchPrefix + opts.NewBranch, + OldCommitID: oldCommitID, + NewCommitID: commit.ID.String(), + }, + ) + if err != nil { + return fmt.Errorf("PushUpdate: %v", err) } return DeleteUploads(uploads...) diff --git a/models/repo_list.go b/models/repo_list.go index a1a309f..15e6144 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -9,38 +9,35 @@ import ( "strings" "github.com/go-xorm/builder" - "github.com/go-xorm/xorm" ) // RepositoryList contains a list of repositories type RepositoryList []*Repository +// RepositoryListOfMap make list from values of map +func RepositoryListOfMap(repoMap map[int64]*Repository) RepositoryList { + return RepositoryList(valuesRepository(repoMap)) +} + func (repos RepositoryList) loadAttributes(e Engine) error { if len(repos) == 0 { return nil } // Load owners. - set := make(map[int64]*User) + set := make(map[int64]struct{}) for i := range repos { - set[repos[i].OwnerID] = nil + set[repos[i].OwnerID] = struct{}{} } - userIDs := make([]int64, 0, len(set)) - for userID := range set { - userIDs = append(userIDs, userID) - } - users := make([]*User, 0, len(userIDs)) + users := make(map[int64]*User, len(set)) if err := e. Where("id > 0"). - In("id", userIDs). + In("id", keysInt64(set)). Find(&users); err != nil { return fmt.Errorf("find users: %v", err) } - for i := range users { - set[users[i].ID] = users[i] - } for i := range repos { - repos[i].Owner = set[repos[i].OwnerID] + repos[i].Owner = users[repos[i].OwnerID] } return nil } @@ -91,87 +88,100 @@ func (repos MirrorRepositoryList) LoadAttributes() error { } // SearchRepoOptions holds the search options +// swagger:parameters repoSearch type SearchRepoOptions struct { - Keyword string - OwnerID int64 - Searcher *User //ID of the person who's seeking - OrderBy string - Private bool // Include private repositories in results - Starred bool - Page int - IsProfile bool - PageSize int // Can be smaller than or equal to setting.ExplorePagingNum + // Keyword to search + // + // in: query + Keyword string `json:"q"` + // Owner in we search search + // + // in: query + OwnerID int64 `json:"uid"` + Searcher *User `json:"-"` //ID of the person who's seeking + OrderBy string `json:"-"` + Private bool `json:"-"` // Include private repositories in results + Collaborate bool `json:"-"` // Include collaborative repositories + Starred bool `json:"-"` + Page int `json:"-"` + IsProfile bool `json:"-"` + // Limit of result + // + // maximum: setting.ExplorePagingNum + // in: query + PageSize int `json:"limit"` // Can be smaller than or equal to setting.ExplorePagingNum } // SearchRepositoryByName takes keyword and part of repository name to search, // it returns results in given range and number of total results. func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, count int64, err error) { - var ( - sess *xorm.Session - cond = builder.NewCond() - ) - - if len(opts.Keyword) == 0 { - return repos, 0, nil - } - opts.Keyword = strings.ToLower(opts.Keyword) - + var cond = builder.NewCond() if opts.Page <= 0 { opts.Page = 1 } - repos = make([]*Repository, 0, opts.PageSize) - + var starJoin bool if opts.Starred && opts.OwnerID > 0 { cond = builder.Eq{ "star.uid": opts.OwnerID, } + starJoin = true + } + + opts.Keyword = strings.ToLower(opts.Keyword) + if opts.Keyword != "" { + cond = cond.And(builder.Like{"lower_name", opts.Keyword}) } - cond = cond.And(builder.Like{"lower_name", opts.Keyword}) // Append conditions if !opts.Starred && opts.OwnerID > 0 { - cond = cond.And(builder.Eq{"owner_id": opts.OwnerID}) + var searcherReposCond builder.Cond = builder.Eq{"owner_id": opts.OwnerID} + if opts.Searcher != nil { + var ownerIds []int64 + + ownerIds = append(ownerIds, opts.Searcher.ID) + err = opts.Searcher.GetOrganizations(true) + + if err != nil { + return nil, 0, fmt.Errorf("Organization: %v", err) + } + + for _, org := range opts.Searcher.Orgs { + ownerIds = append(ownerIds, org.ID) + } + + searcherReposCond = searcherReposCond.Or(builder.In("owner_id", ownerIds)) + if opts.Collaborate { + searcherReposCond = searcherReposCond.Or(builder.Expr("id IN (SELECT repo_id FROM `access` WHERE access.user_id = ? AND owner_id != ?)", + opts.Searcher.ID, opts.Searcher.ID)) + } + } + cond = cond.And(searcherReposCond) } + if !opts.Private { cond = cond.And(builder.Eq{"is_private": false}) } - if opts.Searcher != nil { - var ownerIds []int64 - - ownerIds = append(ownerIds, opts.Searcher.ID) - err = opts.Searcher.GetOrganizations(true) - - if err != nil { - return nil, 0, fmt.Errorf("Organization: %v", err) - } - - for _, org := range opts.Searcher.Orgs { - ownerIds = append(ownerIds, org.ID) - } - - cond = cond.Or(builder.And(builder.Like{"lower_name", opts.Keyword}, builder.In("owner_id", ownerIds))) - } - if len(opts.OrderBy) == 0 { opts.OrderBy = "name ASC" } - if opts.Starred && opts.OwnerID > 0 { - sess = x. - Join("INNER", "star", "star.repo_id = repository.id"). - Where(cond) - count, err = x. + sess := x.NewSession() + defer sess.Close() + + if starJoin { + count, err = sess. Join("INNER", "star", "star.repo_id = repository.id"). Where(cond). Count(new(Repository)) if err != nil { return nil, 0, fmt.Errorf("Count: %v", err) } + + sess.Join("INNER", "star", "star.repo_id = repository.id") } else { - sess = x.Where(cond) - count, err = x. + count, err = sess. Where(cond). Count(new(Repository)) if err != nil { @@ -179,7 +189,9 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun } } + repos = make([]*Repository, 0, opts.PageSize) if err = sess. + Where(cond). Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). OrderBy(opts.OrderBy). Find(&repos); err != nil { @@ -187,7 +199,7 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (repos RepositoryList, coun } if !opts.IsProfile { - if err = repos.loadAttributes(x); err != nil { + if err = repos.loadAttributes(sess); err != nil { return nil, 0, fmt.Errorf("LoadAttributes: %v", err) } } diff --git a/models/repo_list_test.go b/models/repo_list_test.go index 1fbfa93..9c8a526 100644 --- a/models/repo_list_test.go +++ b/models/repo_list_test.go @@ -42,6 +42,7 @@ func TestSearchRepositoryByName(t *testing.T) { Keyword: "repo_13", Page: 1, PageSize: 10, + Private: true, Searcher: &User{ID: 14}, }) @@ -54,6 +55,7 @@ func TestSearchRepositoryByName(t *testing.T) { Keyword: "test_repo", Page: 1, PageSize: 10, + Private: true, Searcher: &User{ID: 14}, }) diff --git a/models/repo_mirror.go b/models/repo_mirror.go index 0689112..55dd48d 100644 --- a/models/repo_mirror.go +++ b/models/repo_mirror.go @@ -13,6 +13,7 @@ import ( "github.com/go-xorm/xorm" "gopkg.in/ini.v1" + "code.gitea.io/git" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/process" "code.gitea.io/gitea/modules/setting" @@ -27,8 +28,8 @@ type Mirror struct { ID int64 `xorm:"pk autoincr"` RepoID int64 `xorm:"INDEX"` Repo *Repository `xorm:"-"` - Interval int // Hour. - EnablePrune bool `xorm:"NOT NULL DEFAULT true"` + Interval time.Duration + EnablePrune bool `xorm:"NOT NULL DEFAULT true"` Updated time.Time `xorm:"-"` UpdatedUnix int64 `xorm:"INDEX"` @@ -61,14 +62,14 @@ func (m *Mirror) AfterSet(colName string, _ xorm.Cell) { } case "updated_unix": m.Updated = time.Unix(m.UpdatedUnix, 0).Local() - case "next_updated_unix": + case "next_update_unix": m.NextUpdate = time.Unix(m.NextUpdateUnix, 0).Local() } } // ScheduleNextUpdate calculates and sets next update time. func (m *Mirror) ScheduleNextUpdate() { - m.NextUpdate = time.Now().Add(time.Duration(m.Interval) * time.Hour) + m.NextUpdate = time.Now().Add(m.Interval) } func (m *Mirror) readAddress() { @@ -147,6 +148,20 @@ func (m *Mirror) runSync() bool { } return false } + + gitRepo, err := git.OpenRepository(repoPath) + if err != nil { + log.Error(4, "OpenRepository: %v", err) + return false + } + if err = SyncReleasesWithTags(m.Repo, gitRepo); err != nil { + log.Error(4, "Failed to synchronize tags to releases for repository: %v", err) + } + + if err := m.Repo.UpdateSize(); err != nil { + log.Error(4, "Failed to update size for mirror repository: %v", err) + } + if m.Repo.HasWiki() { if _, stderr, err := process.GetManager().ExecDir( timeout, wikiPath, fmt.Sprintf("Mirror.runSync: %s", wikiPath), @@ -197,10 +212,9 @@ func DeleteMirrorByRepoID(repoID int64) error { // MirrorUpdate checks and updates mirror repositories. func MirrorUpdate() { - if taskStatusTable.IsRunning(mirrorUpdate) { + if !taskStatusTable.StartIfNotRunning(mirrorUpdate) { return } - taskStatusTable.Start(mirrorUpdate) defer taskStatusTable.Stop(mirrorUpdate) log.Trace("Doing: MirrorUpdate") diff --git a/models/repo_test.go b/models/repo_test.go index a538d44..4b6fd44 100644 --- a/models/repo_test.go +++ b/models/repo_test.go @@ -5,10 +5,13 @@ package models import ( + "path" "testing" "code.gitea.io/gitea/modules/markdown" + "code.gitea.io/gitea/modules/setting" + "github.com/Unknwon/com" "github.com/stretchr/testify/assert" ) @@ -132,3 +135,22 @@ func TestRepoAPIURL(t *testing.T) { assert.Equal(t, "https://try.gitea.io/api/v1/repos/user12/repo10", repo.APIURL()) } + +func TestRepoLocalCopyPath(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + repo, err := GetRepositoryByID(10) + assert.NoError(t, err) + assert.NotNil(t, repo) + + // test default + repoID := com.ToStr(repo.ID) + expected := path.Join(setting.AppDataPath, setting.Repository.Local.LocalCopyPath, repoID) + assert.Equal(t, expected, repo.LocalCopyPath()) + + // test absolute setting + tempPath := "/tmp/gitea/local-copy-path" + expected = path.Join(tempPath, repoID) + setting.Repository.Local.LocalCopyPath = tempPath + assert.Equal(t, expected, repo.LocalCopyPath()) +} diff --git a/models/repo_unit.go b/models/repo_unit.go index ee61ef4..2256ff7 100644 --- a/models/repo_unit.go +++ b/models/repo_unit.go @@ -75,8 +75,8 @@ func (r *RepoUnit) BeforeSet(colName string, val xorm.Cell) { switch colName { case "type": switch UnitType(Cell2Int64(val)) { - case UnitTypeCode, UnitTypeIssues, UnitTypePullRequests, UnitTypeCommits, UnitTypeReleases, - UnitTypeWiki, UnitTypeSettings: + case UnitTypeCode, UnitTypeIssues, UnitTypePullRequests, UnitTypeReleases, + UnitTypeWiki: r.Config = new(UnitConfig) case UnitTypeExternalWiki: r.Config = new(ExternalWikiConfig) @@ -116,11 +116,6 @@ func (r *RepoUnit) PullRequestsConfig() *UnitConfig { return r.Config.(*UnitConfig) } -// CommitsConfig returns config for UnitTypeCommits -func (r *RepoUnit) CommitsConfig() *UnitConfig { - return r.Config.(*UnitConfig) -} - // ReleasesConfig returns config for UnitTypeReleases func (r *RepoUnit) ReleasesConfig() *UnitConfig { return r.Config.(*UnitConfig) @@ -135,3 +130,11 @@ func (r *RepoUnit) ExternalWikiConfig() *ExternalWikiConfig { func (r *RepoUnit) ExternalTrackerConfig() *ExternalTrackerConfig { return r.Config.(*ExternalTrackerConfig) } + +func getUnitsByRepoID(e Engine, repoID int64) (units []*RepoUnit, err error) { + return units, e.Where("repo_id = ?", repoID).Find(&units) +} + +func getUnitsByRepoIDAndIDs(e Engine, repoID int64, types []UnitType) (units []*RepoUnit, err error) { + return units, e.Where("repo_id = ?", repoID).In("`type`", types).Find(&units) +} diff --git a/models/ssh_key.go b/models/ssh_key.go index 802333f..2d06c23 100644 --- a/models/ssh_key.go +++ b/models/ssh_key.go @@ -13,7 +13,6 @@ import ( "io/ioutil" "math/big" "os" - "path" "path/filepath" "strings" "sync" @@ -325,8 +324,8 @@ func appendAuthorizedKeysToFile(keys ...*PublicKey) error { sshOpLocker.Lock() defer sshOpLocker.Unlock() - fpath := filepath.Join(setting.SSH.RootPath, "authorized_keys") - f, err := os.OpenFile(fpath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600) + fPath := filepath.Join(setting.SSH.RootPath, "authorized_keys") + f, err := os.OpenFile(fPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600) if err != nil { return err } @@ -373,17 +372,11 @@ func checkKeyFingerprint(e Engine, fingerprint string) error { func calcFingerprint(publicKeyContent string) (string, error) { // Calculate fingerprint. - tmpPath := strings.Replace(path.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond()), - "id_rsa.pub"), "\\", "/", -1) - dir := path.Dir(tmpPath) - - if err := os.MkdirAll(dir, os.ModePerm); err != nil { - return "", fmt.Errorf("Failed to create dir %s: %v", dir, err) - } - - if err := ioutil.WriteFile(tmpPath, []byte(publicKeyContent), 0644); err != nil { + tmpPath, err := writeTmpKeyFile(publicKeyContent) + if err != nil { return "", err } + defer os.Remove(tmpPath) stdout, stderr, err := process.GetManager().Exec("AddPublicKey", "ssh-keygen", "-lf", tmpPath) if err != nil { return "", fmt.Errorf("'ssh-keygen -lf %s' failed with error '%s': %s", tmpPath, err, stderr) @@ -437,7 +430,7 @@ func AddPublicKey(ownerID int64, name, content string) (*PublicKey, error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return nil, err } @@ -500,6 +493,27 @@ func UpdatePublicKey(key *PublicKey) error { return err } +// UpdatePublicKeyUpdated updates public key use time. +func UpdatePublicKeyUpdated(id int64) error { + now := time.Now() + // Check if key exists before update as affected rows count is unreliable + // and will return 0 affected rows if two updates are made at the same time + if cnt, err := x.ID(id).Count(&PublicKey{}); err != nil { + return err + } else if cnt != 1 { + return ErrKeyNotExist{id} + } + + _, err := x.ID(id).Cols("updated_unix").Update(&PublicKey{ + Updated: now, + UpdatedUnix: now.Unix(), + }) + if err != nil { + return err + } + return nil +} + // deletePublicKeys does the actual key deletion but does not update authorized_keys file. func deletePublicKeys(e *xorm.Session, keyIDs ...int64) error { if len(keyIDs) == 0 { @@ -526,7 +540,7 @@ func DeletePublicKey(doer *User, id int64) (err error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -549,57 +563,53 @@ func RewriteAllPublicKeys() error { sshOpLocker.Lock() defer sshOpLocker.Unlock() - fpath := filepath.Join(setting.SSH.RootPath, "authorized_keys") - tmpPath := fpath + ".tmp" - f, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) + fPath := filepath.Join(setting.SSH.RootPath, "authorized_keys") + tmpPath := fPath + ".tmp" + t, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { return err } defer func() { - f.Close() + t.Close() os.Remove(tmpPath) }() + if setting.SSH.AuthorizedKeysBackup && com.IsExist(fPath) { + bakPath := fmt.Sprintf("%s_%d.gitea_bak", fPath, time.Now().Unix()) + if err = com.Copy(fPath, bakPath); err != nil { + return err + } + } + err = x.Iterate(new(PublicKey), func(idx int, bean interface{}) (err error) { - _, err = f.WriteString((bean.(*PublicKey)).AuthorizedString()) + _, err = t.WriteString((bean.(*PublicKey)).AuthorizedString()) return err }) if err != nil { return err } - if com.IsExist(fpath) { - bakPath := fpath + fmt.Sprintf("_%d.gitea_bak", time.Now().Unix()) - if err = com.Copy(fpath, bakPath); err != nil { - return err - } - - p, err := os.Open(bakPath) + if com.IsExist(fPath) { + f, err := os.Open(fPath) if err != nil { return err } - defer p.Close() - - scanner := bufio.NewScanner(p) + scanner := bufio.NewScanner(f) for scanner.Scan() { line := scanner.Text() if strings.HasPrefix(line, tplCommentPrefix) { scanner.Scan() continue } - _, err = f.WriteString(line + "\n") + _, err = t.WriteString(line + "\n") if err != nil { return err } } + defer f.Close() } - f.Close() - if err = os.Rename(tmpPath, fpath); err != nil { - return err - } - - return nil + return os.Rename(tmpPath, fPath) } // ________ .__ ____ __. @@ -723,7 +733,7 @@ func AddDeployKey(repoID int64, name, content string) (*DeployKey, error) { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return nil, err } @@ -794,7 +804,7 @@ func DeleteDeployKey(doer *User, id int64) error { if err != nil { return fmt.Errorf("GetRepositoryByID: %v", err) } - yes, err := HasAccess(doer, repo, AccessModeAdmin) + yes, err := HasAccess(doer.ID, repo, AccessModeAdmin) if err != nil { return fmt.Errorf("HasAccess: %v", err) } else if !yes { @@ -803,7 +813,7 @@ func DeleteDeployKey(doer *User, id int64) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } diff --git a/models/status.go b/models/status.go new file mode 100644 index 0000000..2ce588b --- /dev/null +++ b/models/status.go @@ -0,0 +1,304 @@ +// Copyright 2017 Gitea. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "container/list" + "fmt" + "strings" + "time" + + "code.gitea.io/git" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/sdk/gitea" + + "github.com/go-xorm/xorm" +) + +// CommitStatusState holds the state of a Status +// It can be "pending", "success", "error", "failure", and "warning" +type CommitStatusState string + +// IsWorseThan returns true if this State is worse than the given State +func (css CommitStatusState) IsWorseThan(css2 CommitStatusState) bool { + switch css { + case CommitStatusError: + return true + case CommitStatusFailure: + return css2 != CommitStatusError + case CommitStatusWarning: + return css2 != CommitStatusError && css2 != CommitStatusFailure + case CommitStatusSuccess: + return css2 != CommitStatusError && css2 != CommitStatusFailure && css2 != CommitStatusWarning + default: + return css2 != CommitStatusError && css2 != CommitStatusFailure && css2 != CommitStatusWarning && css2 != CommitStatusSuccess + } +} + +const ( + // CommitStatusPending is for when the Status is Pending + CommitStatusPending CommitStatusState = "pending" + // CommitStatusSuccess is for when the Status is Success + CommitStatusSuccess CommitStatusState = "success" + // CommitStatusError is for when the Status is Error + CommitStatusError CommitStatusState = "error" + // CommitStatusFailure is for when the Status is Failure + CommitStatusFailure CommitStatusState = "failure" + // CommitStatusWarning is for when the Status is Warning + CommitStatusWarning CommitStatusState = "warning" +) + +// CommitStatus holds a single Status of a single Commit +type CommitStatus struct { + ID int64 `xorm:"pk autoincr"` + Index int64 `xorm:"INDEX UNIQUE(repo_sha_index)"` + RepoID int64 `xorm:"INDEX UNIQUE(repo_sha_index)"` + Repo *Repository `xorm:"-"` + State CommitStatusState `xorm:"VARCHAR(7) NOT NULL"` + SHA string `xorm:"VARCHAR(64) NOT NULL INDEX UNIQUE(repo_sha_index)"` + TargetURL string `xorm:"TEXT"` + Description string `xorm:"TEXT"` + Context string `xorm:"TEXT"` + Creator *User `xorm:"-"` + CreatorID int64 + + Created time.Time `xorm:"-"` + CreatedUnix int64 `xorm:"INDEX"` + Updated time.Time `xorm:"-"` + UpdatedUnix int64 `xorm:"INDEX"` +} + +// BeforeInsert is invoked from XORM before inserting an object of this type. +func (status *CommitStatus) BeforeInsert() { + status.CreatedUnix = time.Now().Unix() + status.UpdatedUnix = status.CreatedUnix +} + +// BeforeUpdate is invoked from XORM before updating this object. +func (status *CommitStatus) BeforeUpdate() { + status.UpdatedUnix = time.Now().Unix() +} + +// AfterSet is invoked from XORM after setting the value of a field of +// this object. +func (status *CommitStatus) AfterSet(colName string, _ xorm.Cell) { + switch colName { + case "created_unix": + status.Created = time.Unix(status.CreatedUnix, 0).Local() + case "updated_unix": + status.Updated = time.Unix(status.UpdatedUnix, 0).Local() + } +} + +func (status *CommitStatus) loadRepo(e Engine) (err error) { + if status.Repo == nil { + status.Repo, err = getRepositoryByID(e, status.RepoID) + if err != nil { + return fmt.Errorf("getRepositoryByID [%d]: %v", status.RepoID, err) + } + } + if status.Creator == nil && status.CreatorID > 0 { + status.Creator, err = getUserByID(e, status.CreatorID) + if err != nil { + return fmt.Errorf("getUserByID [%d]: %v", status.CreatorID, err) + } + } + return nil +} + +// APIURL returns the absolute APIURL to this commit-status. +func (status *CommitStatus) APIURL() string { + status.loadRepo(x) + return fmt.Sprintf("%sapi/v1/%s/statuses/%s", + setting.AppURL, status.Repo.FullName(), status.SHA) +} + +// APIFormat assumes some fields assigned with values: +// Required - Repo, Creator +func (status *CommitStatus) APIFormat() *api.Status { + status.loadRepo(x) + apiStatus := &api.Status{ + Created: status.Created, + Updated: status.Created, + State: api.StatusState(status.State), + TargetURL: status.TargetURL, + Description: status.Description, + ID: status.Index, + URL: status.APIURL(), + Context: status.Context, + } + if status.Creator != nil { + apiStatus.Creator = status.Creator.APIFormat() + } + + return apiStatus +} + +// GetCommitStatuses returns all statuses for a given commit. +func GetCommitStatuses(repo *Repository, sha string, page int) ([]*CommitStatus, error) { + statuses := make([]*CommitStatus, 0, 10) + return statuses, x.Limit(10, page*10).Where("repo_id = ?", repo.ID).And("sha = ?", sha).Find(&statuses) +} + +// GetLatestCommitStatus returns all statuses with a unique context for a given commit. +func GetLatestCommitStatus(repo *Repository, sha string, page int) ([]*CommitStatus, error) { + ids := make([]int64, 0, 10) + err := x.Limit(10, page*10). + Table(&CommitStatus{}). + Where("repo_id = ?", repo.ID).And("sha = ?", sha). + Select("max( id ) as id"). + GroupBy("context").OrderBy("max( id ) desc").Find(&ids) + if err != nil { + return nil, err + } + statuses := make([]*CommitStatus, 0, len(ids)) + if len(ids) == 0 { + return statuses, nil + } + return statuses, x.In("id", ids).Find(&statuses) +} + +// GetCommitStatus populates a given status for a given commit. +// NOTE: If ID or Index isn't given, and only Context, TargetURL and/or Description +// is given, the CommitStatus created _last_ will be returned. +func GetCommitStatus(repo *Repository, sha string, status *CommitStatus) (*CommitStatus, error) { + conds := &CommitStatus{ + Context: status.Context, + State: status.State, + TargetURL: status.TargetURL, + Description: status.Description, + } + has, err := x.Where("repo_id = ?", repo.ID).And("sha = ?", sha).Desc("created_unix").Get(conds) + if err != nil { + return nil, fmt.Errorf("GetCommitStatus[%s, %s]: %v", repo.RepoPath(), sha, err) + } + if !has { + return nil, fmt.Errorf("GetCommitStatus[%s, %s]: not found", repo.RepoPath(), sha) + } + + return conds, nil +} + +// NewCommitStatusOptions holds options for creating a CommitStatus +type NewCommitStatusOptions struct { + Repo *Repository + Creator *User + SHA string + CommitStatus *CommitStatus +} + +func newCommitStatus(sess *xorm.Session, opts NewCommitStatusOptions) error { + opts.CommitStatus.Description = strings.TrimSpace(opts.CommitStatus.Description) + opts.CommitStatus.Context = strings.TrimSpace(opts.CommitStatus.Context) + opts.CommitStatus.TargetURL = strings.TrimSpace(opts.CommitStatus.TargetURL) + opts.CommitStatus.SHA = opts.SHA + opts.CommitStatus.CreatorID = opts.Creator.ID + + if opts.Repo == nil { + return fmt.Errorf("newCommitStatus[nil, %s]: no repository specified", opts.SHA) + } + opts.CommitStatus.RepoID = opts.Repo.ID + + if opts.Creator == nil { + return fmt.Errorf("newCommitStatus[%s, %s]: no user specified", opts.Repo.RepoPath(), opts.SHA) + } + + gitRepo, err := git.OpenRepository(opts.Repo.RepoPath()) + if err != nil { + return fmt.Errorf("OpenRepository[%s]: %v", opts.Repo.RepoPath(), err) + } + if _, err := gitRepo.GetCommit(opts.SHA); err != nil { + return fmt.Errorf("GetCommit[%s]: %v", opts.SHA, err) + } + + // Get the next Status Index + var nextIndex int64 + lastCommitStatus := &CommitStatus{ + SHA: opts.SHA, + RepoID: opts.Repo.ID, + } + has, err := sess.Desc("index").Limit(1).Get(lastCommitStatus) + if err != nil { + sess.Rollback() + return fmt.Errorf("newCommitStatus[%s, %s]: %v", opts.Repo.RepoPath(), opts.SHA, err) + } + if has { + log.Debug("newCommitStatus[%s, %s]: found", opts.Repo.RepoPath(), opts.SHA) + nextIndex = lastCommitStatus.Index + } + opts.CommitStatus.Index = nextIndex + 1 + log.Debug("newCommitStatus[%s, %s]: %d", opts.Repo.RepoPath(), opts.SHA, opts.CommitStatus.Index) + + // Insert new CommitStatus + if _, err = sess.Insert(opts.CommitStatus); err != nil { + sess.Rollback() + return fmt.Errorf("newCommitStatus[%s, %s]: %v", opts.Repo.RepoPath(), opts.SHA, err) + } + + return nil +} + +// NewCommitStatus creates a new CommitStatus given a bunch of parameters +// NOTE: All text-values will be trimmed from whitespaces. +// Requires: Repo, Creator, SHA +func NewCommitStatus(repo *Repository, creator *User, sha string, status *CommitStatus) error { + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %v", repo.ID, creator.ID, sha, err) + } + + if err := newCommitStatus(sess, NewCommitStatusOptions{ + Repo: repo, + Creator: creator, + SHA: sha, + CommitStatus: status, + }); err != nil { + return fmt.Errorf("NewCommitStatus[repo_id: %d, user_id: %d, sha: %s]: %v", repo.ID, creator.ID, sha, err) + } + + return sess.Commit() +} + +// SignCommitWithStatuses represents a commit with validation of signature and status state. +type SignCommitWithStatuses struct { + Statuses []*CommitStatus + State CommitStatusState + *SignCommit +} + +// ParseCommitsWithStatus checks commits latest statuses and calculates its worst status state +func ParseCommitsWithStatus(oldCommits *list.List, repo *Repository) *list.List { + var ( + newCommits = list.New() + e = oldCommits.Front() + err error + ) + + for e != nil { + c := e.Value.(SignCommit) + commit := SignCommitWithStatuses{ + SignCommit: &c, + State: "", + Statuses: make([]*CommitStatus, 0), + } + commit.Statuses, err = GetLatestCommitStatus(repo, commit.ID.String(), 0) + if err != nil { + log.Error(3, "GetLatestCommitStatus: %v", err) + } else { + for _, status := range commit.Statuses { + if status.State.IsWorseThan(commit.State) { + commit.State = status.State + } + } + } + + newCommits.PushBack(commit) + e = e.Next() + } + return newCommits +} diff --git a/models/status_test.go b/models/status_test.go new file mode 100644 index 0000000..5585fb1 --- /dev/null +++ b/models/status_test.go @@ -0,0 +1,39 @@ +// Copyright 2017 Gitea. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGetCommitStatuses(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + repo1 := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository) + + sha1 := "1234123412341234123412341234123412341234" + + statuses, err := GetCommitStatuses(repo1, sha1, 0) + assert.NoError(t, err) + if assert.Equal(t, 5, len(statuses), "Expected to get 5 statuses") { + + assert.Equal(t, statuses[0].Context, "ci/awesomeness") + assert.Equal(t, statuses[0].State, CommitStatusPending) + + assert.Equal(t, statuses[1].Context, "cov/awesomeness") + assert.Equal(t, statuses[1].State, CommitStatusWarning) + + assert.Equal(t, statuses[2].Context, "cov/awesomeness") + assert.Equal(t, statuses[2].State, CommitStatusSuccess) + + assert.Equal(t, statuses[3].Context, "ci/awesomeness") + assert.Equal(t, statuses[3].State, CommitStatusFailure) + + assert.Equal(t, statuses[4].Context, "deploy/awesomeness") + assert.Equal(t, statuses[4].State, CommitStatusError) + } +} diff --git a/models/test_fixtures.go b/models/test_fixtures.go new file mode 100644 index 0000000..d7f59ec --- /dev/null +++ b/models/test_fixtures.go @@ -0,0 +1,23 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "gopkg.in/testfixtures.v2" +) + +var fixtures *testfixtures.Context + +// InitFixtures initialize test fixtures for a test database +func InitFixtures(helper testfixtures.Helper, dir string) (err error) { + testfixtures.SkipDatabaseNameCheck(true) + fixtures, err = testfixtures.NewFolder(x.DB().DB, helper, dir) + return err +} + +// LoadFixtures load fixtures for a test database +func LoadFixtures() error { + return fixtures.Load() +} diff --git a/models/unit.go b/models/unit.go index 54bb928..a14edce 100644 --- a/models/unit.go +++ b/models/unit.go @@ -12,15 +12,41 @@ const ( UnitTypeCode UnitType = iota + 1 // 1 code UnitTypeIssues // 2 issues UnitTypePullRequests // 3 PRs - UnitTypeCommits // 4 Commits - UnitTypeReleases // 5 Releases - UnitTypeWiki // 6 Wiki - UnitTypeSettings // 7 Settings - UnitTypeExternalWiki // 8 ExternalWiki - UnitTypeExternalTracker // 9 ExternalTracker + UnitTypeReleases // 4 Releases + UnitTypeWiki // 5 Wiki + UnitTypeExternalWiki // 6 ExternalWiki + UnitTypeExternalTracker // 7 ExternalTracker ) -// Unit is a tab page of one repository +var ( + // allRepUnitTypes contains all the unit types + allRepUnitTypes = []UnitType{ + UnitTypeCode, + UnitTypeIssues, + UnitTypePullRequests, + UnitTypeReleases, + UnitTypeWiki, + UnitTypeExternalWiki, + UnitTypeExternalTracker, + } + + // defaultRepoUnits contains the default unit types + defaultRepoUnits = []UnitType{ + UnitTypeCode, + UnitTypeIssues, + UnitTypePullRequests, + UnitTypeReleases, + UnitTypeWiki, + } + + // MustRepoUnits contains the units could not be disabled currently + MustRepoUnits = []UnitType{ + UnitTypeCode, + UnitTypeReleases, + } +) + +// Unit is a section of one repository type Unit struct { Type UnitType NameKey string @@ -29,13 +55,18 @@ type Unit struct { Idx int } +// CanDisable returns if this unit could be disabled. +func (u *Unit) CanDisable() bool { + return true +} + // Enumerate all the units var ( UnitCode = Unit{ UnitTypeCode, "repo.code", "/", - "repo.code_desc", + "repo.code.desc", 0, } @@ -43,15 +74,15 @@ var ( UnitTypeIssues, "repo.issues", "/issues", - "repo.issues_desc", + "repo.issues.desc", 1, } UnitExternalTracker = Unit{ UnitTypeExternalTracker, - "repo.issues", + "repo.ext_issues", "/issues", - "repo.issues_desc", + "repo.ext_issues.desc", 1, } @@ -59,67 +90,32 @@ var ( UnitTypePullRequests, "repo.pulls", "/pulls", - "repo.pulls_desc", + "repo.pulls.desc", 2, } - UnitCommits = Unit{ - UnitTypeCommits, - "repo.commits", - "/commits/master", - "repo.commits_desc", - 3, - } - UnitReleases = Unit{ UnitTypeReleases, "repo.releases", "/releases", - "repo.releases_desc", - 4, + "repo.releases.desc", + 3, } UnitWiki = Unit{ UnitTypeWiki, "repo.wiki", "/wiki", - "repo.wiki_desc", - 5, + "repo.wiki.desc", + 4, } UnitExternalWiki = Unit{ UnitTypeExternalWiki, - "repo.wiki", + "repo.ext_wiki", "/wiki", - "repo.wiki_desc", - 5, - } - - UnitSettings = Unit{ - UnitTypeSettings, - "repo.settings", - "/settings", - "repo.settings_desc", - 6, - } - - // defaultRepoUnits contains all the default unit types - defaultRepoUnits = []UnitType{ - UnitTypeCode, - UnitTypeIssues, - UnitTypePullRequests, - UnitTypeCommits, - UnitTypeReleases, - UnitTypeWiki, - UnitTypeSettings, - } - - // MustRepoUnits contains the units could be disabled currently - MustRepoUnits = []UnitType{ - UnitTypeCode, - UnitTypeCommits, - UnitTypeReleases, - UnitTypeSettings, + "repo.ext_wiki.desc", + 4, } // Units contains all the units @@ -128,10 +124,8 @@ var ( UnitTypeIssues: UnitIssues, UnitTypeExternalTracker: UnitExternalTracker, UnitTypePullRequests: UnitPullRequests, - UnitTypeCommits: UnitCommits, UnitTypeReleases: UnitReleases, UnitTypeWiki: UnitWiki, UnitTypeExternalWiki: UnitExternalWiki, - UnitTypeSettings: UnitSettings, } ) diff --git a/models/setup_for_test.go b/models/unit_tests.go similarity index 60% rename from models/setup_for_test.go rename to models/unit_tests.go index 5a17eac..315627d 100644 --- a/models/setup_for_test.go +++ b/models/unit_tests.go @@ -5,43 +5,20 @@ package models import ( - "fmt" - "os" - "path/filepath" "testing" - "code.gitea.io/gitea/modules/setting" - "github.com/go-xorm/core" "github.com/go-xorm/xorm" - _ "github.com/mattn/go-sqlite3" // for the test engine "github.com/stretchr/testify/assert" "gopkg.in/testfixtures.v2" ) +// NonexistentID an ID that will never exist const NonexistentID = 9223372036854775807 -func TestMain(m *testing.M) { - if err := CreateTestEngine(); err != nil { - fmt.Printf("Error creating test engine: %v\n", err) - os.Exit(1) - } - - setting.AppURL = "https://try.gitea.io/" - setting.RunUser = "runuser" - setting.SSH.Port = 3000 - setting.SSH.Domain = "try.gitea.io" - setting.RepoRootPath = filepath.Join(os.TempDir(), "repos") - setting.AppDataPath = filepath.Join(os.TempDir(), "appdata") - - os.Exit(m.Run()) -} - -var fixtures *testfixtures.Context - -// CreateTestEngine create an xorm engine for testing -func CreateTestEngine() error { - testfixtures.SkipDatabaseNameCheck(true) +// CreateTestEngine create in-memory sqlite database for unit tests +// Any package that calls this must import github.com/mattn/go-sqlite3 +func CreateTestEngine(fixturesDir string) error { var err error x, err = xorm.NewEngine("sqlite3", "file::memory:?cache=shared") if err != nil { @@ -52,27 +29,39 @@ func CreateTestEngine() error { return err } - fixtures, err = testfixtures.NewFolder(x.DB().DB, &testfixtures.SQLite{}, "fixtures/") - return err -} - -func TestFixturesAreConsistent(t *testing.T) { - assert.NoError(t, PrepareTestDatabase()) - CheckConsistencyForAll(t) + return InitFixtures(&testfixtures.SQLite{}, fixturesDir) } // PrepareTestDatabase load test fixtures into test database func PrepareTestDatabase() error { - return fixtures.Load() + return LoadFixtures() +} + +type testCond struct { + query interface{} + args []interface{} +} + +// Cond create a condition with arguments for a test +func Cond(query interface{}, args ...interface{}) interface{} { + return &testCond{query: query, args: args} +} + +func whereConditions(sess *xorm.Session, conditions []interface{}) { + for _, condition := range conditions { + switch cond := condition.(type) { + case *testCond: + sess.Where(cond.query, cond.args...) + default: + sess.Where(cond) + } + } } func loadBeanIfExists(bean interface{}, conditions ...interface{}) (bool, error) { sess := x.NewSession() defer sess.Close() - - for _, cond := range conditions { - sess = sess.Where(cond) - } + whereConditions(sess, conditions) return sess.Get(bean) } @@ -94,6 +83,16 @@ func AssertExistsAndLoadBean(t *testing.T, bean interface{}, conditions ...inter return bean } +// GetCount get the count of a bean +func GetCount(t *testing.T, bean interface{}, conditions ...interface{}) int { + sess := x.NewSession() + defer sess.Close() + whereConditions(sess, conditions) + count, err := sess.Count(bean) + assert.NoError(t, err) + return int(count) +} + // AssertNotExistsBean assert that a bean does not exist in the test database func AssertNotExistsBean(t *testing.T, bean interface{}, conditions ...interface{}) { exists, err := loadBeanIfExists(bean, conditions...) @@ -109,7 +108,11 @@ func AssertSuccessfulInsert(t *testing.T, beans ...interface{}) { // AssertCount assert the count of a bean func AssertCount(t *testing.T, bean interface{}, expected interface{}) { - actual, err := x.Count(bean) - assert.NoError(t, err) - assert.EqualValues(t, expected, actual) + assert.EqualValues(t, expected, GetCount(t, bean)) +} + +// AssertInt64InRange assert value is in range [low, high] +func AssertInt64InRange(t *testing.T, low, high, value int64) { + assert.True(t, value >= low && value <= high, + "Expected value in range [%d, %d], found %d", low, high, value) } diff --git a/models/update.go b/models/update.go index 3cb0608..56a227b 100644 --- a/models/update.go +++ b/models/update.go @@ -19,7 +19,6 @@ import ( const ( EnvRepoName = "GITEA_REPO_NAME" EnvRepoUsername = "GITEA_REPO_USER_NAME" - EnvRepoUserSalt = "GITEA_REPO_USER_SALT" EnvRepoIsWiki = "GITEA_REPO_IS_WIKI" EnvPusherName = "GITEA_PUSHER_NAME" EnvPusherID = "GITEA_PUSHER_ID" @@ -65,11 +64,115 @@ type PushUpdateOptions struct { // PushUpdate must be called for any push actions in order to // generates necessary push action history feeds. -func PushUpdate(opts PushUpdateOptions) (err error) { +func PushUpdate(branch string, opt PushUpdateOptions) error { + repo, err := pushUpdate(opt) + if err != nil { + return err + } + + pusher, err := GetUserByID(opt.PusherID) + if err != nil { + return err + } + + log.Trace("TriggerTask '%s/%s' by %s", repo.Name, branch, pusher.Name) + + go AddTestPullRequestTask(pusher, repo.ID, branch, true) + return nil +} + +func pushUpdateDeleteTag(repo *Repository, gitRepo *git.Repository, tagName string) error { + rel, err := GetRelease(repo.ID, tagName) + if err != nil { + if IsErrReleaseNotExist(err) { + return nil + } + return fmt.Errorf("GetRelease: %v", err) + } + if rel.IsTag { + if _, err = x.Id(rel.ID).Delete(new(Release)); err != nil { + return fmt.Errorf("Delete: %v", err) + } + } else { + rel.IsDraft = true + rel.NumCommits = 0 + rel.Sha1 = "" + if _, err = x.Id(rel.ID).AllCols().Update(rel); err != nil { + return fmt.Errorf("Update: %v", err) + } + } + + return nil +} + +func pushUpdateAddTag(repo *Repository, gitRepo *git.Repository, tagName string) error { + rel, err := GetRelease(repo.ID, tagName) + if err != nil && !IsErrReleaseNotExist(err) { + return fmt.Errorf("GetRelease: %v", err) + } + + tag, err := gitRepo.GetTag(tagName) + if err != nil { + return fmt.Errorf("GetTag: %v", err) + } + commit, err := tag.Commit() + if err != nil { + return fmt.Errorf("Commit: %v", err) + } + tagCreatedUnix := commit.Author.When.Unix() + + author, err := GetUserByEmail(commit.Author.Email) + if err != nil && !IsErrUserNotExist(err) { + return fmt.Errorf("GetUserByEmail: %v", err) + } + + commitsCount, err := commit.CommitsCount() + if err != nil { + return fmt.Errorf("CommitsCount: %v", err) + } + + if rel == nil { + rel = &Release{ + RepoID: repo.ID, + Title: "", + TagName: tagName, + LowerTagName: strings.ToLower(tagName), + Target: "", + Sha1: commit.ID.String(), + NumCommits: commitsCount, + Note: "", + IsDraft: false, + IsPrerelease: false, + IsTag: true, + CreatedUnix: tagCreatedUnix, + } + if author != nil { + rel.PublisherID = author.ID + } + + if _, err = x.InsertOne(rel); err != nil { + return fmt.Errorf("InsertOne: %v", err) + } + } else { + rel.Sha1 = commit.ID.String() + rel.CreatedUnix = tagCreatedUnix + rel.NumCommits = commitsCount + rel.IsDraft = false + if rel.IsTag && author != nil { + rel.PublisherID = author.ID + } + if _, err = x.Id(rel.ID).AllCols().Update(rel); err != nil { + return fmt.Errorf("Update: %v", err) + } + } + return nil +} + +func pushUpdate(opts PushUpdateOptions) (repo *Repository, err error) { isNewRef := opts.OldCommitID == git.EmptySHA isDelRef := opts.NewCommitID == git.EmptySHA if isNewRef && isDelRef { - return fmt.Errorf("Old and new revisions are both %s", git.EmptySHA) + return nil, fmt.Errorf("Old and new revisions are both %s", git.EmptySHA) } repoPath := RepoPath(opts.RepoUserName, opts.RepoName) @@ -77,32 +180,44 @@ func PushUpdate(opts PushUpdateOptions) (err error) { gitUpdate := exec.Command("git", "update-server-info") gitUpdate.Dir = repoPath if err = gitUpdate.Run(); err != nil { - return fmt.Errorf("Failed to call 'git update-server-info': %v", err) - } - - if isDelRef { - log.GitLogger.Info("Reference '%s' has been deleted from '%s/%s' by %s", - opts.RefFullName, opts.RepoUserName, opts.RepoName, opts.PusherName) - return nil - } - - gitRepo, err := git.OpenRepository(repoPath) - if err != nil { - return fmt.Errorf("OpenRepository: %v", err) + return nil, fmt.Errorf("Failed to call 'git update-server-info': %v", err) } owner, err := GetUserByName(opts.RepoUserName) if err != nil { - return fmt.Errorf("GetUserByName: %v", err) + return nil, fmt.Errorf("GetUserByName: %v", err) } - repo, err := GetRepositoryByName(owner.ID, opts.RepoName) + repo, err = GetRepositoryByName(owner.ID, opts.RepoName) if err != nil { - return fmt.Errorf("GetRepositoryByName: %v", err) + return nil, fmt.Errorf("GetRepositoryByName: %v", err) + } + + gitRepo, err := git.OpenRepository(repoPath) + if err != nil { + return nil, fmt.Errorf("OpenRepository: %v", err) + } + + if isDelRef { + // Tag has been deleted + if strings.HasPrefix(opts.RefFullName, git.TagPrefix) { + err = pushUpdateDeleteTag(repo, gitRepo, opts.RefFullName[len(git.TagPrefix):]) + if err != nil { + return nil, fmt.Errorf("pushUpdateDeleteTag: %v", err) + } + } + log.GitLogger.Info("Reference '%s' has been deleted from '%s/%s' by %s", + opts.RefFullName, opts.RepoUserName, opts.RepoName, opts.PusherName) + return repo, nil + } + + if err = repo.UpdateSize(); err != nil { + log.Error(4, "Failed to update size for repository: %v", err) } // Push tags. if strings.HasPrefix(opts.RefFullName, git.TagPrefix) { + pushUpdateAddTag(repo, gitRepo, opts.RefFullName[len(git.TagPrefix):]) if err := CommitRepoAction(CommitRepoActionOptions{ PusherName: opts.PusherName, RepoOwnerID: owner.ID, @@ -112,14 +227,14 @@ func PushUpdate(opts PushUpdateOptions) (err error) { NewCommitID: opts.NewCommitID, Commits: &PushCommits{}, }); err != nil { - return fmt.Errorf("CommitRepoAction (tag): %v", err) + return nil, fmt.Errorf("CommitRepoAction (tag): %v", err) } - return nil + return repo, nil } newCommit, err := gitRepo.GetCommit(opts.NewCommitID) if err != nil { - return fmt.Errorf("gitRepo.GetCommit: %v", err) + return nil, fmt.Errorf("gitRepo.GetCommit: %v", err) } // Push new branch. @@ -127,12 +242,12 @@ func PushUpdate(opts PushUpdateOptions) (err error) { if isNewRef { l, err = newCommit.CommitsBeforeLimit(10) if err != nil { - return fmt.Errorf("newCommit.CommitsBeforeLimit: %v", err) + return nil, fmt.Errorf("newCommit.CommitsBeforeLimit: %v", err) } } else { l, err = newCommit.CommitsBeforeUntil(opts.OldCommitID) if err != nil { - return fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err) + return nil, fmt.Errorf("newCommit.CommitsBeforeUntil: %v", err) } } @@ -145,7 +260,7 @@ func PushUpdate(opts PushUpdateOptions) (err error) { NewCommitID: opts.NewCommitID, Commits: ListToPushCommits(l), }); err != nil { - return fmt.Errorf("CommitRepoAction (branch): %v", err) + return nil, fmt.Errorf("CommitRepoAction (branch): %v", err) } - return nil + return repo, nil } diff --git a/models/user.go b/models/user.go index 8cec178..bbdec74 100644 --- a/models/user.go +++ b/models/user.go @@ -35,7 +35,6 @@ import ( "code.gitea.io/gitea/modules/avatar" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markdown" "code.gitea.io/gitea/modules/setting" ) @@ -50,6 +49,8 @@ const ( UserTypeOrganization ) +const syncExternalUsers = "sync_external_users" + var ( // ErrUserNotKeyOwner user does not own this key error ErrUserNotKeyOwner = errors.New("User does not own this public key") @@ -156,14 +157,12 @@ func (u *User) SetLastLogin() { // UpdateDiffViewStyle updates the users diff view style func (u *User) UpdateDiffViewStyle(style string) error { u.DiffViewStyle = style - return UpdateUser(u) + return UpdateUserCols(u, "diff_view_style") } // AfterSet is invoked from XORM after setting the value of a field of this object. func (u *User) AfterSet(colName string, _ xorm.Cell) { switch colName { - case "full_name": - u.FullName = markdown.Sanitize(u.FullName) case "created_unix": u.Created = time.Unix(u.CreatedUnix, 0).Local() case "updated_unix": @@ -209,8 +208,8 @@ func (u *User) HasForkedRepo(repoID int64) bool { return has } -// RepoCreationNum returns the number of repositories created by the user -func (u *User) RepoCreationNum() int { +// MaxCreationLimit returns the number of repositories a user is allowed to create +func (u *User) MaxCreationLimit() int { if u.MaxRepoCreation <= -1 { return setting.Repository.MaxCreationLimit } @@ -219,6 +218,9 @@ func (u *User) RepoCreationNum() int { // CanCreateRepo returns if user login can create a repository func (u *User) CanCreateRepo() bool { + if u.IsAdmin { + return true + } if u.MaxRepoCreation <= -1 { if setting.Repository.MaxCreationLimit <= -1 { return true @@ -328,15 +330,14 @@ func (u *User) generateRandomAvatar(e Engine) error { // which includes app sub-url as prefix. However, it is possible // to return full URL if user enables Gravatar-like service. func (u *User) RelAvatarLink() string { - defaultImgURL := setting.AppSubURL + "/img/avatar_default.png" if u.ID == -1 { - return defaultImgURL + return base.DefaultAvatarLink() } switch { case u.UseCustomAvatar: if !com.IsFile(u.CustomAvatarPath()) { - return defaultImgURL + return base.DefaultAvatarLink() } return setting.AppSubURL + "/avatars/" + u.Avatar case setting.DisableGravatar, setting.OfflineMode: @@ -431,7 +432,7 @@ func (u *User) UploadAvatar(data []byte) error { m := resize.Resize(avatar.AvatarSize, avatar.AvatarSize, img, resize.NearestNeighbor) sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -478,7 +479,7 @@ func (u *User) DeleteAvatar() error { // IsAdminOfRepo returns true if user has admin or higher access of repository. func (u *User) IsAdminOfRepo(repo *Repository) bool { - has, err := HasAccess(u, repo, AccessModeAdmin) + has, err := HasAccess(u.ID, repo, AccessModeAdmin) if err != nil { log.Error(3, "HasAccess: %v", err) } @@ -487,7 +488,7 @@ func (u *User) IsAdminOfRepo(repo *Repository) bool { // IsWriterOfRepo returns true if user has write access to given repository. func (u *User) IsWriterOfRepo(repo *Repository) bool { - has, err := HasAccess(u, repo, AccessModeWrite) + has, err := HasAccess(u.ID, repo, AccessModeWrite) if err != nil { log.Error(3, "HasAccess: %v", err) } @@ -541,7 +542,7 @@ func (u *User) GetOrgRepositoryIDs() ([]int64, error) { GroupBy("repository.id").Find(&ids) } -// GetAccessRepoIDs returns all repsitories IDs where user's or user is a team member orgnizations +// GetAccessRepoIDs returns all repositories IDs where user's or user is a team member organizations func (u *User) GetAccessRepoIDs() ([]int64, error) { ids, err := u.GetRepositoryIDs() if err != nil { @@ -596,7 +597,7 @@ func (u *User) ShortName(length int) string { return base.EllipsisString(u.Name, length) } -// IsMailable checks if a user is elegible +// IsMailable checks if a user is eligible // to receive emails. func (u *User) IsMailable() bool { return u.IsActive @@ -615,7 +616,7 @@ func IsUserExist(uid int64, name string) (bool, error) { Get(&User{LowerName: strings.ToLower(name)}) } -// GetUserSalt returns a ramdom user salt token. +// GetUserSalt returns a random user salt token. func GetUserSalt() (string, error) { return base.GetRandomString(10) } @@ -630,7 +631,7 @@ func NewGhostUser() *User { } var ( - reservedUsernames = []string{"assets", "css", "img", "js", "less", "plugins", "debug", "raw", "install", "api", "avatar", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."} + reservedUsernames = []string{"assets", "css", "explore", "img", "js", "less", "plugins", "debug", "raw", "install", "api", "avatar", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."} reservedUserPatterns = []string{"*.keys"} ) @@ -706,11 +707,11 @@ func CreateUser(u *User) (err error) { return err } u.EncodePasswd() - u.AllowCreateOrganization = true + u.AllowCreateOrganization = setting.Service.DefaultAllowCreateOrganization u.MaxRepoCreation = -1 sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -859,7 +860,9 @@ func updateUser(e Engine, u *User) error { if len(u.AvatarEmail) == 0 { u.AvatarEmail = u.Email } - u.Avatar = base.HashEmail(u.AvatarEmail) + if len(u.AvatarEmail) > 0 { + u.Avatar = base.HashEmail(u.AvatarEmail) + } } u.LowerName = strings.ToLower(u.Name) @@ -867,7 +870,6 @@ func updateUser(e Engine, u *User) error { u.Website = base.TruncateString(u.Website, 255) u.Description = base.TruncateString(u.Description, 255) - u.FullName = markdown.Sanitize(u.FullName) _, err := e.Id(u.ID).AllCols().Update(u) return err } @@ -877,6 +879,29 @@ func UpdateUser(u *User) error { return updateUser(x, u) } +// UpdateUserCols update user according special columns +func UpdateUserCols(u *User, cols ...string) error { + // Organization does not need email + u.Email = strings.ToLower(u.Email) + if !u.IsOrganization() { + if len(u.AvatarEmail) == 0 { + u.AvatarEmail = u.Email + } + if len(u.AvatarEmail) > 0 { + u.Avatar = base.HashEmail(u.AvatarEmail) + } + } + + u.LowerName = strings.ToLower(u.Name) + u.Location = base.TruncateString(u.Location, 255) + u.Website = base.TruncateString(u.Website, 255) + u.Description = base.TruncateString(u.Description, 255) + + cols = append(cols, "updated_unix") + _, err := x.Id(u.ID).Cols(cols...).Update(u) + return err +} + // UpdateUserSetting updates user's settings. func UpdateUserSetting(u *User) error { if !u.IsOrganization() { @@ -919,38 +944,41 @@ func deleteUser(e *xorm.Session, u *User) error { } // ***** START: Watch ***** - watches := make([]*Watch, 0, 10) - if err = e.Find(&watches, &Watch{UserID: u.ID}); err != nil { + watchedRepoIDs := make([]int64, 0, 10) + if err = e.Table("watch").Cols("watch.repo_id"). + Where("watch.user_id = ?", u.ID).Find(&watchedRepoIDs); err != nil { return fmt.Errorf("get all watches: %v", err) } - for i := range watches { - if _, err = e.Exec("UPDATE `repository` SET num_watches=num_watches-1 WHERE id=?", watches[i].RepoID); err != nil { - return fmt.Errorf("decrease repository watch number[%d]: %v", watches[i].RepoID, err) - } + if _, err = e.Decr("num_watches").In("id", watchedRepoIDs).Update(new(Repository)); err != nil { + return fmt.Errorf("decrease repository num_watches: %v", err) } // ***** END: Watch ***** // ***** START: Star ***** - stars := make([]*Star, 0, 10) - if err = e.Find(&stars, &Star{UID: u.ID}); err != nil { + starredRepoIDs := make([]int64, 0, 10) + if err = e.Table("star").Cols("star.repo_id"). + Where("star.uid = ?", u.ID).Find(&starredRepoIDs); err != nil { return fmt.Errorf("get all stars: %v", err) - } - for i := range stars { - if _, err = e.Exec("UPDATE `repository` SET num_stars=num_stars-1 WHERE id=?", stars[i].RepoID); err != nil { - return fmt.Errorf("decrease repository star number[%d]: %v", stars[i].RepoID, err) - } + } else if _, err = e.Decr("num_watches").In("id", starredRepoIDs).Update(new(Repository)); err != nil { + return fmt.Errorf("decrease repository num_stars: %v", err) } // ***** END: Star ***** // ***** START: Follow ***** - followers := make([]*Follow, 0, 10) - if err = e.Find(&followers, &Follow{UserID: u.ID}); err != nil { - return fmt.Errorf("get all followers: %v", err) + followeeIDs := make([]int64, 0, 10) + if err = e.Table("follow").Cols("follow.follow_id"). + Where("follow.user_id = ?", u.ID).Find(&followeeIDs); err != nil { + return fmt.Errorf("get all followees: %v", err) + } else if _, err = e.Decr("num_followers").In("id", followeeIDs).Update(new(User)); err != nil { + return fmt.Errorf("decrease user num_followers: %v", err) } - for i := range followers { - if _, err = e.Exec("UPDATE `user` SET num_followers=num_followers-1 WHERE id=?", followers[i].UserID); err != nil { - return fmt.Errorf("decrease user follower number[%d]: %v", followers[i].UserID, err) - } + + followerIDs := make([]int64, 0, 10) + if err = e.Table("follow").Cols("follow.user_id"). + Where("follow.follow_id = ?", u.ID).Find(&followerIDs); err != nil { + return fmt.Errorf("get all followers: %v", err) + } else if _, err = e.Decr("num_following").In("id", followerIDs).Update(new(User)); err != nil { + return fmt.Errorf("decrease user num_following: %v", err) } // ***** END: Follow ***** @@ -960,10 +988,12 @@ func deleteUser(e *xorm.Session, u *User) error { &Access{UserID: u.ID}, &Watch{UserID: u.ID}, &Star{UID: u.ID}, + &Follow{UserID: u.ID}, &Follow{FollowID: u.ID}, &Action{UserID: u.ID}, &IssueUser{UID: u.ID}, &EmailAddress{UID: u.ID}, + &UserOpenID{UID: u.ID}, ); err != nil { return fmt.Errorf("deleteBeans: %v", err) } @@ -1023,7 +1053,7 @@ func deleteUser(e *xorm.Session, u *User) error { // but issues/comments/pulls will be kept and shown as someone has been deleted. func DeleteUser(u *User) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -1103,7 +1133,7 @@ func GetUserByID(id int64) (*User, error) { // GetAssigneeByID returns the user with write access of repository by given ID. func GetAssigneeByID(repo *Repository, userID int64) (*User, error) { - has, err := HasAccess(&User{ID: userID}, repo, AccessModeWrite) + has, err := HasAccess(userID, repo, AccessModeWrite) if err != nil { return nil, err } else if !has { @@ -1292,78 +1322,6 @@ func SearchUserByName(opts *SearchUserOptions) (users []*User, _ int64, _ error) return users, count, sess.Find(&users) } -// ___________ .__ .__ -// \_ _____/___ | | | | ______ _ __ -// | __)/ _ \| | | | / _ \ \/ \/ / -// | \( <_> ) |_| |_( <_> ) / -// \___ / \____/|____/____/\____/ \/\_/ -// \/ - -// Follow represents relations of user and his/her followers. -type Follow struct { - ID int64 `xorm:"pk autoincr"` - UserID int64 `xorm:"UNIQUE(follow)"` - FollowID int64 `xorm:"UNIQUE(follow)"` -} - -// IsFollowing returns true if user is following followID. -func IsFollowing(userID, followID int64) bool { - has, _ := x.Get(&Follow{UserID: userID, FollowID: followID}) - return has -} - -// FollowUser marks someone be another's follower. -func FollowUser(userID, followID int64) (err error) { - if userID == followID || IsFollowing(userID, followID) { - return nil - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Insert(&Follow{UserID: userID, FollowID: followID}); err != nil { - return err - } - - if _, err = sess.Exec("UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { - return err - } - - if _, err = sess.Exec("UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { - return err - } - return sess.Commit() -} - -// UnfollowUser unmarks someone as another's follower. -func UnfollowUser(userID, followID int64) (err error) { - if userID == followID || !IsFollowing(userID, followID) { - return nil - } - - sess := x.NewSession() - defer sessionRelease(sess) - if err = sess.Begin(); err != nil { - return err - } - - if _, err = sess.Delete(&Follow{UserID: userID, FollowID: followID}); err != nil { - return err - } - - if _, err = sess.Exec("UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { - return err - } - - if _, err = sess.Exec("UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { - return err - } - return sess.Commit() -} - // GetStarredRepos returns the repos starred by a particular user func GetStarredRepos(userID int64, private bool) ([]*Repository, error) { sess := x.Where("star.uid=?", userID). @@ -1393,3 +1351,127 @@ func GetWatchedRepos(userID int64, private bool) ([]*Repository, error) { } return repos, nil } + +// SyncExternalUsers is used to synchronize users with external authorization source +func SyncExternalUsers() { + if !taskStatusTable.StartIfNotRunning(syncExternalUsers) { + return + } + defer taskStatusTable.Stop(syncExternalUsers) + + log.Trace("Doing: SyncExternalUsers") + + ls, err := LoginSources() + if err != nil { + log.Error(4, "SyncExternalUsers: %v", err) + return + } + + updateExisting := setting.Cron.SyncExternalUsers.UpdateExisting + + for _, s := range ls { + if !s.IsActived || !s.IsSyncEnabled { + continue + } + if s.IsLDAP() { + log.Trace("Doing: SyncExternalUsers[%s]", s.Name) + + var existingUsers []int64 + + // Find all users with this login type + var users []User + x.Where("login_type = ?", LoginLDAP). + And("login_source = ?", s.ID). + Find(&users) + + sr := s.LDAP().SearchEntries() + + for _, su := range sr { + if len(su.Username) == 0 { + continue + } + + if len(su.Mail) == 0 { + su.Mail = fmt.Sprintf("%s@localhost", su.Username) + } + + var usr *User + // Search for existing user + for _, du := range users { + if du.LowerName == strings.ToLower(su.Username) { + usr = &du + break + } + } + + fullName := composeFullName(su.Name, su.Surname, su.Username) + // If no existing user found, create one + if usr == nil { + log.Trace("SyncExternalUsers[%s]: Creating user %s", s.Name, su.Username) + + usr = &User{ + LowerName: strings.ToLower(su.Username), + Name: su.Username, + FullName: fullName, + LoginType: s.Type, + LoginSource: s.ID, + LoginName: su.Username, + Email: su.Mail, + IsAdmin: su.IsAdmin, + IsActive: true, + } + + err = CreateUser(usr) + if err != nil { + log.Error(4, "SyncExternalUsers[%s]: Error creating user %s: %v", s.Name, su.Username, err) + } + } else if updateExisting { + existingUsers = append(existingUsers, usr.ID) + // Check if user data has changed + if (len(s.LDAP().AdminFilter) > 0 && usr.IsAdmin != su.IsAdmin) || + strings.ToLower(usr.Email) != strings.ToLower(su.Mail) || + usr.FullName != fullName || + !usr.IsActive { + + log.Trace("SyncExternalUsers[%s]: Updating user %s", s.Name, usr.Name) + + usr.FullName = fullName + usr.Email = su.Mail + // Change existing admin flag only if AdminFilter option is set + if len(s.LDAP().AdminFilter) > 0 { + usr.IsAdmin = su.IsAdmin + } + usr.IsActive = true + + err = UpdateUserCols(usr, "full_name", "email", "is_admin", "is_active") + if err != nil { + log.Error(4, "SyncExternalUsers[%s]: Error updating user %s: %v", s.Name, usr.Name, err) + } + } + } + } + + // Deactivate users not present in LDAP + if updateExisting { + for _, usr := range users { + found := false + for _, uid := range existingUsers { + if usr.ID == uid { + found = true + break + } + } + if !found { + log.Trace("SyncExternalUsers[%s]: Deactivating user %s", s.Name, usr.Name) + + usr.IsActive = false + err = UpdateUserCols(&usr, "is_active") + if err != nil { + log.Error(4, "SyncExternalUsers[%s]: Error deactivating user %s: %v", s.Name, usr.Name, err) + } + } + } + } + } + } +} diff --git a/models/user_follow.go b/models/user_follow.go new file mode 100644 index 0000000..4bde71c --- /dev/null +++ b/models/user_follow.go @@ -0,0 +1,70 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +// Follow represents relations of user and his/her followers. +type Follow struct { + ID int64 `xorm:"pk autoincr"` + UserID int64 `xorm:"UNIQUE(follow)"` + FollowID int64 `xorm:"UNIQUE(follow)"` +} + +// IsFollowing returns true if user is following followID. +func IsFollowing(userID, followID int64) bool { + has, _ := x.Get(&Follow{UserID: userID, FollowID: followID}) + return has +} + +// FollowUser marks someone be another's follower. +func FollowUser(userID, followID int64) (err error) { + if userID == followID || IsFollowing(userID, followID) { + return nil + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Insert(&Follow{UserID: userID, FollowID: followID}); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `user` SET num_followers = num_followers + 1 WHERE id = ?", followID); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `user` SET num_following = num_following + 1 WHERE id = ?", userID); err != nil { + return err + } + return sess.Commit() +} + +// UnfollowUser unmarks someone as another's follower. +func UnfollowUser(userID, followID int64) (err error) { + if userID == followID || !IsFollowing(userID, followID) { + return nil + } + + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Delete(&Follow{UserID: userID, FollowID: followID}); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `user` SET num_followers = num_followers - 1 WHERE id = ?", followID); err != nil { + return err + } + + if _, err = sess.Exec("UPDATE `user` SET num_following = num_following - 1 WHERE id = ?", userID); err != nil { + return err + } + return sess.Commit() +} diff --git a/models/user_follow_test.go b/models/user_follow_test.go new file mode 100644 index 0000000..59392dc --- /dev/null +++ b/models/user_follow_test.go @@ -0,0 +1,45 @@ +package models + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsFollowing(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + assert.True(t, IsFollowing(4, 2)) + assert.False(t, IsFollowing(2, 4)) + assert.False(t, IsFollowing(5, NonexistentID)) + assert.False(t, IsFollowing(NonexistentID, 5)) + assert.False(t, IsFollowing(NonexistentID, NonexistentID)) +} + +func TestFollowUser(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + testSuccess := func(followerID, followedID int64) { + assert.NoError(t, FollowUser(followerID, followedID)) + AssertExistsAndLoadBean(t, &Follow{UserID: followerID, FollowID: followedID}) + } + testSuccess(4, 2) + testSuccess(5, 2) + + assert.NoError(t, FollowUser(2, 2)) + + CheckConsistencyFor(t, &User{}) +} + +func TestUnfollowUser(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + testSuccess := func(followerID, followedID int64) { + assert.NoError(t, UnfollowUser(followerID, followedID)) + AssertNotExistsBean(t, &Follow{UserID: followerID, FollowID: followedID}) + } + testSuccess(4, 2) + testSuccess(5, 2) + testSuccess(2, 2) + + CheckConsistencyFor(t, &User{}) +} diff --git a/models/user_mail.go b/models/user_mail.go index 4ccf08e..285ba74 100644 --- a/models/user_mail.go +++ b/models/user_mail.go @@ -127,7 +127,7 @@ func (email *EmailAddress) Activate() error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -208,7 +208,7 @@ func MakeEmailPrimary(email *EmailAddress) error { } sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } diff --git a/models/user_openid.go b/models/user_openid.go new file mode 100644 index 0000000..db84e2e --- /dev/null +++ b/models/user_openid.go @@ -0,0 +1,124 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "errors" + + "code.gitea.io/gitea/modules/auth/openid" + "code.gitea.io/gitea/modules/log" +) + +var ( + // ErrOpenIDNotExist openid is not known + ErrOpenIDNotExist = errors.New("OpenID is unknown") +) + +// UserOpenID is the list of all OpenID identities of a user. +type UserOpenID struct { + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"INDEX NOT NULL"` + URI string `xorm:"UNIQUE NOT NULL"` + Show bool `xorm:"DEFAULT false"` +} + +// GetUserOpenIDs returns all openid addresses that belongs to given user. +func GetUserOpenIDs(uid int64) ([]*UserOpenID, error) { + openids := make([]*UserOpenID, 0, 5) + if err := x. + Where("uid=?", uid). + Asc("id"). + Find(&openids); err != nil { + return nil, err + } + + return openids, nil +} + +func isOpenIDUsed(e Engine, uri string) (bool, error) { + if len(uri) == 0 { + return true, nil + } + + return e.Get(&UserOpenID{URI: uri}) +} + +// IsOpenIDUsed returns true if the openid has been used. +func IsOpenIDUsed(openid string) (bool, error) { + return isOpenIDUsed(x, openid) +} + +// NOTE: make sure openid.URI is normalized already +func addUserOpenID(e Engine, openid *UserOpenID) error { + used, err := isOpenIDUsed(e, openid.URI) + if err != nil { + return err + } else if used { + return ErrOpenIDAlreadyUsed{openid.URI} + } + + _, err = e.Insert(openid) + return err +} + +// AddUserOpenID adds an pre-verified/normalized OpenID URI to given user. +func AddUserOpenID(openid *UserOpenID) error { + return addUserOpenID(x, openid) +} + +// DeleteUserOpenID deletes an openid address of given user. +func DeleteUserOpenID(openid *UserOpenID) (err error) { + var deleted int64 + // ask to check UID + var address = UserOpenID{ + UID: openid.UID, + } + if openid.ID > 0 { + deleted, err = x.Id(openid.ID).Delete(&address) + } else { + deleted, err = x. + Where("openid=?", openid.URI). + Delete(&address) + } + + if err != nil { + return err + } else if deleted != 1 { + return ErrOpenIDNotExist + } + return nil +} + +// ToggleUserOpenIDVisibility toggles visibility of an openid address of given user. +func ToggleUserOpenIDVisibility(id int64) (err error) { + _, err = x.Exec("update user_open_id set show = not show where id = ?", id) + return err +} + +// GetUserByOpenID returns the user object by given OpenID if exists. +func GetUserByOpenID(uri string) (*User, error) { + if len(uri) == 0 { + return nil, ErrUserNotExist{0, uri, 0} + } + + uri, err := openid.Normalize(uri) + if err != nil { + return nil, err + } + + log.Trace("Normalized OpenID URI: " + uri) + + // Otherwise, check in openid table + oid := &UserOpenID{URI: uri} + has, err := x.Get(oid) + if err != nil { + return nil, err + } + if has { + return GetUserByID(oid.UID) + } + + return nil, ErrUserNotExist{0, uri, 0} +} diff --git a/models/user_openid_test.go b/models/user_openid_test.go new file mode 100644 index 0000000..e4734cc --- /dev/null +++ b/models/user_openid_test.go @@ -0,0 +1,82 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGetUserOpenIDs(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + oids, err := GetUserOpenIDs(int64(1)) + if assert.NoError(t, err) { + assert.Len(t, oids, 2) + assert.Equal(t, oids[0].URI, "https://user1.domain1.tld/") + assert.False(t, oids[0].Show) + assert.Equal(t, oids[1].URI, "http://user1.domain2.tld/") + assert.True(t, oids[1].Show) + } + + oids, err = GetUserOpenIDs(int64(2)) + if assert.NoError(t, err) { + assert.Len(t, oids, 1) + assert.Equal(t, oids[0].URI, "https://domain1.tld/user2/") + assert.True(t, oids[0].Show) + } +} + +func TestGetUserByOpenID(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + user, err := GetUserByOpenID("https://unknown") + if assert.Error(t, err) { + assert.True(t, IsErrUserNotExist(err)) + } + + user, err = GetUserByOpenID("https://user1.domain1.tld") + if assert.NoError(t, err) { + assert.Equal(t, user.ID, int64(1)) + } + + user, err = GetUserByOpenID("https://domain1.tld/user2/") + if assert.NoError(t, err) { + assert.Equal(t, user.ID, int64(2)) + } +} + +func TestToggleUserOpenIDVisibility(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + oids, err := GetUserOpenIDs(int64(2)) + if !assert.NoError(t, err) { + return + } + assert.Len(t, oids, 1) + assert.True(t, oids[0].Show) + + err = ToggleUserOpenIDVisibility(oids[0].ID) + if !assert.NoError(t, err) { + return + } + + oids, err = GetUserOpenIDs(int64(2)) + if assert.NoError(t, err) { + assert.Len(t, oids, 1) + assert.False(t, oids[0].Show) + } + err = ToggleUserOpenIDVisibility(oids[0].ID) + if !assert.NoError(t, err) { + return + } + + oids, err = GetUserOpenIDs(int64(2)) + if !assert.NoError(t, err) { + return + } + assert.Len(t, oids, 1) + assert.True(t, oids[0].Show) +} diff --git a/models/user_test.go b/models/user_test.go index b10ed9d..a16f979 100644 --- a/models/user_test.go +++ b/models/user_test.go @@ -36,5 +36,36 @@ func TestCanCreateOrganization(t *testing.T) { user.AllowCreateOrganization = true assert.True(t, admin.CanCreateOrganization()) assert.False(t, user.CanCreateOrganization()) - +} + +func TestDeleteUser(t *testing.T) { + test := func(userID int64) { + assert.NoError(t, PrepareTestDatabase()) + user := AssertExistsAndLoadBean(t, &User{ID: userID}).(*User) + + ownedRepos := make([]*Repository, 0, 10) + assert.NoError(t, x.Find(&ownedRepos, &Repository{OwnerID: userID})) + if len(ownedRepos) > 0 { + err := DeleteUser(user) + assert.Error(t, err) + assert.True(t, IsErrUserOwnRepos(err)) + return + } + + orgUsers := make([]*OrgUser, 0, 10) + assert.NoError(t, x.Find(&orgUsers, &OrgUser{UID: userID})) + for _, orgUser := range orgUsers { + if err := RemoveOrgUser(orgUser.OrgID, orgUser.UID); err != nil { + assert.True(t, IsErrLastOrgOwner(err)) + return + } + } + assert.NoError(t, DeleteUser(user)) + AssertNotExistsBean(t, &User{ID: userID}) + CheckConsistencyFor(t, &User{}, &Repository{}) + } + test(2) + test(4) + test(8) + test(11) } diff --git a/models/webhook.go b/models/webhook.go index 2030391..b7e687a 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -266,7 +267,7 @@ func UpdateWebhook(w *Webhook) error { // ID must be specified and do not assign unnecessary fields. func deleteWebhook(bean *Webhook) (err error) { sess := x.NewSession() - defer sessionRelease(sess) + defer sess.Close() if err = sess.Begin(); err != nil { return err } @@ -312,9 +313,11 @@ type HookTaskType int const ( GOGS HookTaskType = iota + 1 SLACK + GITEA ) var hookTaskTypes = map[string]HookTaskType{ + "gitea": GITEA, "gogs": GOGS, "slack": SLACK, } @@ -327,6 +330,8 @@ func ToHookTaskType(name string) HookTaskType { // Name returns the name of an hook task type func (t HookTaskType) Name() string { switch t { + case GITEA: + return "gitea" case GOGS: return "gogs" case SLACK: @@ -475,11 +480,11 @@ func PrepareWebhooks(repo *Repository, event HookEventType, p api.Payloader) err // check if repo belongs to org and append additional webhooks if repo.MustOwner().IsOrganization() { // get hooks for org - orgws, err := GetActiveWebhooksByOrgID(repo.OwnerID) + orgHooks, err := GetActiveWebhooksByOrgID(repo.OwnerID) if err != nil { return fmt.Errorf("GetActiveWebhooksByOrgID: %v", err) } - ws = append(ws, orgws...) + ws = append(ws, orgHooks...) } if len(ws) == 0 { @@ -503,7 +508,7 @@ func PrepareWebhooks(repo *Repository, event HookEventType, p api.Payloader) err } } - // Use separate objects so modifications won't be made on payload on non-Gogs type hooks. + // Use separate objects so modifications won't be made on payload on non-Gogs/Gitea type hooks. switch w.HookTaskType { case SLACK: payloader, err = GetSlackPayload(p, event, w.Meta) @@ -536,6 +541,8 @@ func (t *HookTask) deliver() { timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second req := httplib.Post(t.URL).SetTimeout(timeout, timeout). + Header("X-Gitea-Delivery", t.UUID). + Header("X-Gitea-Event", string(t.EventType)). Header("X-Gogs-Delivery", t.UUID). Header("X-Gogs-Event", string(t.EventType)). Header("X-GitHub-Delivery", t.UUID). @@ -612,18 +619,16 @@ func (t *HookTask) deliver() { // TODO: shoot more hooks at same time. func DeliverHooks() { tasks := make([]*HookTask, 0, 10) - x. - Where("is_delivered=?", false). - Iterate(new(HookTask), - func(idx int, bean interface{}) error { - t := bean.(*HookTask) - t.deliver() - tasks = append(tasks, t) - return nil - }) + err := x.Where("is_delivered=?", false).Find(&tasks) + if err != nil { + log.Error(4, "DeliverHooks: %v", err) + return + } // Update hook task status. for _, t := range tasks { + t.deliver() + if err := UpdateHookTask(t); err != nil { log.Error(4, "UpdateHookTask [%d]: %v", t.ID, err) } diff --git a/models/webhook_test.go b/models/webhook_test.go index 3f377ea..a637a16 100644 --- a/models/webhook_test.go +++ b/models/webhook_test.go @@ -191,16 +191,19 @@ func TestDeleteWebhookByOrgID(t *testing.T) { func TestToHookTaskType(t *testing.T) { assert.Equal(t, GOGS, ToHookTaskType("gogs")) assert.Equal(t, SLACK, ToHookTaskType("slack")) + assert.Equal(t, GITEA, ToHookTaskType("gitea")) } func TestHookTaskType_Name(t *testing.T) { assert.Equal(t, "gogs", GOGS.Name()) assert.Equal(t, "slack", SLACK.Name()) + assert.Equal(t, "gitea", GITEA.Name()) } func TestIsValidHookTaskType(t *testing.T) { assert.True(t, IsValidHookTaskType("gogs")) assert.True(t, IsValidHookTaskType("slack")) + assert.True(t, IsValidHookTaskType("gitea")) assert.False(t, IsValidHookTaskType("invalid")) } @@ -221,7 +224,7 @@ func TestCreateHookTask(t *testing.T) { hookTask := &HookTask{ RepoID: 3, HookID: 3, - Type: GOGS, + Type: GITEA, URL: "http://www.example.com/unit_test", Payloader: &api.PushPayload{}, } diff --git a/models/wiki.go b/models/wiki.go index d864505..a4a9cb9 100644 --- a/models/wiki.go +++ b/models/wiki.go @@ -163,7 +163,10 @@ func (repo *Repository) updateWikiPage(doer *User, oldWikiPath, wikiPath, conten Message: message, }); err != nil { return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", "master"); err != nil { + } else if err = git.Push(localPath, git.PushOptions{ + Remote: "origin", + Branch: "master", + }); err != nil { return fmt.Errorf("Push: %v", err) } @@ -209,7 +212,10 @@ func (repo *Repository) DeleteWikiPage(doer *User, wikiPath string) (err error) Message: message, }); err != nil { return fmt.Errorf("CommitChanges: %v", err) - } else if err = git.Push(localPath, "origin", "master"); err != nil { + } else if err = git.Push(localPath, git.PushOptions{ + Remote: "origin", + Branch: "master", + }); err != nil { return fmt.Errorf("Push: %v", err) } diff --git a/modules/auth/admin.go b/modules/auth/admin.go index 68bc4f3..0bb7d35 100644 --- a/modules/auth/admin.go +++ b/modules/auth/admin.go @@ -32,7 +32,7 @@ type AdminEditUserForm struct { FullName string `binding:"MaxSize(100)"` Email string `binding:"Required;Email;MaxSize(254)"` Password string `binding:"MaxSize(255)"` - Website string `binding:"Url;MaxSize(255)"` + Website string `binding:"ValidUrl;MaxSize(255)"` Location string `binding:"MaxSize(50)"` MaxRepoCreation int Active bool diff --git a/modules/auth/auth.go b/modules/auth/auth.go index 33ba777..89b3e38 100644 --- a/modules/auth/auth.go +++ b/modules/auth/auth.go @@ -19,6 +19,7 @@ import ( "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/validation" ) // IsAPIPath if URL is an api path @@ -253,6 +254,8 @@ func validate(errs binding.Errors, data map[string]interface{}, f Form, l macaro data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_error") case binding.ERR_ALPHA_DASH_DOT: data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_dot_error") + case validation.ErrGitRefName: + data["ErrorMsg"] = trName + l.Tr("form.git_ref_name_error") case binding.ERR_SIZE: data["ErrorMsg"] = trName + l.Tr("form.size_error", GetSize(field)) case binding.ERR_MIN_SIZE: diff --git a/modules/auth/auth_form.go b/modules/auth/auth_form.go index 338be53..7c452bb 100644 --- a/modules/auth/auth_form.go +++ b/modules/auth/auth_form.go @@ -11,34 +11,41 @@ import ( // AuthenticationForm form for authentication type AuthenticationForm struct { - ID int64 - Type int `binding:"Range(2,6)"` - Name string `binding:"Required;MaxSize(30)"` - Host string - Port int - BindDN string - BindPassword string - UserBase string - UserDN string - AttributeUsername string - AttributeName string - AttributeSurname string - AttributeMail string - AttributesInBind bool - Filter string - AdminFilter string - IsActive bool - SMTPAuth string - SMTPHost string - SMTPPort int - AllowedDomains string - SecurityProtocol int `binding:"Range(0,2)"` - TLS bool - SkipVerify bool - PAMServiceName string - Oauth2Provider string - Oauth2Key string - Oauth2Secret string + ID int64 + Type int `binding:"Range(2,6)"` + Name string `binding:"Required;MaxSize(30)"` + Host string + Port int + BindDN string + BindPassword string + UserBase string + UserDN string + AttributeUsername string + AttributeName string + AttributeSurname string + AttributeMail string + AttributesInBind bool + Filter string + AdminFilter string + IsActive bool + IsSyncEnabled bool + SMTPAuth string + SMTPHost string + SMTPPort int + AllowedDomains string + SecurityProtocol int `binding:"Range(0,2)"` + TLS bool + SkipVerify bool + PAMServiceName string + Oauth2Provider string + Oauth2Key string + Oauth2Secret string + OpenIDConnectAutoDiscoveryURL string + Oauth2UseCustomURL bool + Oauth2TokenURL string + Oauth2AuthURL string + Oauth2ProfileURL string + Oauth2EmailURL string } // Validate validates fields diff --git a/modules/auth/ldap/ldap.go b/modules/auth/ldap/ldap.go index 3064b31..7754cc8 100644 --- a/modules/auth/ldap/ldap.go +++ b/modules/auth/ldap/ldap.go @@ -47,6 +47,15 @@ type Source struct { Enabled bool // if this source is disabled } +// SearchResult : user data +type SearchResult struct { + Username string // Username + Name string // Name + Surname string // Surname + Mail string // E-mail address + IsAdmin bool // if user is administrator +} + func (ls *Source) sanitizedUserQuery(username string) (string, bool) { // See http://tools.ietf.org/search/rfc4515 badCharacters := "\x00()*\\" @@ -149,18 +158,39 @@ func bindUser(l *ldap.Conn, userDN, passwd string) error { return err } +func checkAdmin(l *ldap.Conn, ls *Source, userDN string) bool { + if len(ls.AdminFilter) > 0 { + log.Trace("Checking admin with filter %s and base %s", ls.AdminFilter, userDN) + search := ldap.NewSearchRequest( + userDN, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, ls.AdminFilter, + []string{ls.AttributeName}, + nil) + + sr, err := l.Search(search) + + if err != nil { + log.Error(4, "LDAP Admin Search failed unexpectedly! (%v)", err) + } else if len(sr.Entries) < 1 { + log.Error(4, "LDAP Admin Search failed") + } else { + return true + } + } + return false +} + // SearchEntry : search an LDAP source if an entry (name, passwd) is valid and in the specific filter -func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, string, string, string, bool, bool) { +func (ls *Source) SearchEntry(name, passwd string, directBind bool) *SearchResult { // See https://tools.ietf.org/search/rfc4513#section-5.1.2 if len(passwd) == 0 { log.Debug("Auth. failed for %s, password cannot be empty") - return "", "", "", "", false, false + return nil } l, err := dial(ls) if err != nil { log.Error(4, "LDAP Connect error, %s:%v", ls.Host, err) ls.Enabled = false - return "", "", "", "", false, false + return nil } defer l.Close() @@ -171,7 +201,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str var ok bool userDN, ok = ls.sanitizedUserDN(name) if !ok { - return "", "", "", "", false, false + return nil } } else { log.Trace("LDAP will use BindDN.") @@ -179,7 +209,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str var found bool userDN, found = ls.findUserDN(l, name) if !found { - return "", "", "", "", false, false + return nil } } @@ -187,13 +217,13 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str // binds user (checking password) before looking-up attributes in user context err = bindUser(l, userDN, passwd) if err != nil { - return "", "", "", "", false, false + return nil } } userFilter, ok := ls.sanitizedUserQuery(name) if !ok { - return "", "", "", "", false, false + return nil } log.Trace("Fetching attributes '%v', '%v', '%v', '%v' with filter %s and base %s", ls.AttributeUsername, ls.AttributeName, ls.AttributeSurname, ls.AttributeMail, userFilter, userDN) @@ -205,7 +235,7 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str sr, err := l.Search(search) if err != nil { log.Error(4, "LDAP Search failed unexpectedly! (%v)", err) - return "", "", "", "", false, false + return nil } else if len(sr.Entries) < 1 { if directBind { log.Error(4, "User filter inhibited user login.") @@ -213,39 +243,78 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, str log.Error(4, "LDAP Search failed unexpectedly! (0 entries)") } - return "", "", "", "", false, false + return nil } username := sr.Entries[0].GetAttributeValue(ls.AttributeUsername) firstname := sr.Entries[0].GetAttributeValue(ls.AttributeName) surname := sr.Entries[0].GetAttributeValue(ls.AttributeSurname) mail := sr.Entries[0].GetAttributeValue(ls.AttributeMail) - - isAdmin := false - if len(ls.AdminFilter) > 0 { - log.Trace("Checking admin with filter %s and base %s", ls.AdminFilter, userDN) - search = ldap.NewSearchRequest( - userDN, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, ls.AdminFilter, - []string{ls.AttributeName}, - nil) - - sr, err = l.Search(search) - if err != nil { - log.Error(4, "LDAP Admin Search failed unexpectedly! (%v)", err) - } else if len(sr.Entries) < 1 { - log.Error(4, "LDAP Admin Search failed") - } else { - isAdmin = true - } - } + isAdmin := checkAdmin(l, ls, userDN) if !directBind && ls.AttributesInBind { // binds user (checking password) after looking-up attributes in BindDN context err = bindUser(l, userDN, passwd) if err != nil { - return "", "", "", "", false, false + return nil } } - return username, firstname, surname, mail, isAdmin, true + return &SearchResult{ + Username: username, + Name: firstname, + Surname: surname, + Mail: mail, + IsAdmin: isAdmin, + } +} + +// SearchEntries : search an LDAP source for all users matching userFilter +func (ls *Source) SearchEntries() []*SearchResult { + l, err := dial(ls) + if err != nil { + log.Error(4, "LDAP Connect error, %s:%v", ls.Host, err) + ls.Enabled = false + return nil + } + defer l.Close() + + if ls.BindDN != "" && ls.BindPassword != "" { + err := l.Bind(ls.BindDN, ls.BindPassword) + if err != nil { + log.Debug("Failed to bind as BindDN[%s]: %v", ls.BindDN, err) + return nil + } + log.Trace("Bound as BindDN %s", ls.BindDN) + } else { + log.Trace("Proceeding with anonymous LDAP search.") + } + + userFilter := fmt.Sprintf(ls.Filter, "*") + + log.Trace("Fetching attributes '%v', '%v', '%v', '%v' with filter %s and base %s", ls.AttributeUsername, ls.AttributeName, ls.AttributeSurname, ls.AttributeMail, userFilter, ls.UserBase) + search := ldap.NewSearchRequest( + ls.UserBase, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, userFilter, + []string{ls.AttributeUsername, ls.AttributeName, ls.AttributeSurname, ls.AttributeMail}, + nil) + + sr, err := l.Search(search) + if err != nil { + log.Error(4, "LDAP Search failed unexpectedly! (%v)", err) + return nil + } + + result := make([]*SearchResult, len(sr.Entries)) + + for i, v := range sr.Entries { + result[i] = &SearchResult{ + Username: v.GetAttributeValue(ls.AttributeUsername), + Name: v.GetAttributeValue(ls.AttributeName), + Surname: v.GetAttributeValue(ls.AttributeSurname), + Mail: v.GetAttributeValue(ls.AttributeMail), + IsAdmin: checkAdmin(l, ls, v.DN), + } + } + + return result } diff --git a/modules/auth/oauth2/oauth2.go b/modules/auth/oauth2/oauth2.go index ca4cde7..4584c48 100644 --- a/modules/auth/oauth2/oauth2.go +++ b/modules/auth/oauth2/oauth2.go @@ -5,6 +5,7 @@ package oauth2 import ( + "math" "net/http" "os" "path/filepath" @@ -15,7 +16,14 @@ import ( "github.com/gorilla/sessions" "github.com/markbates/goth" "github.com/markbates/goth/gothic" + "github.com/markbates/goth/providers/bitbucket" + "github.com/markbates/goth/providers/dropbox" + "github.com/markbates/goth/providers/facebook" "github.com/markbates/goth/providers/github" + "github.com/markbates/goth/providers/gitlab" + "github.com/markbates/goth/providers/gplus" + "github.com/markbates/goth/providers/openidConnect" + "github.com/markbates/goth/providers/twitter" "github.com/satori/go.uuid" ) @@ -24,6 +32,14 @@ var ( providerHeaderKey = "gitea-oauth2-provider" ) +// CustomURLMapping describes the urls values to use when customizing OAuth2 provider URLs +type CustomURLMapping struct { + AuthURL string + TokenURL string + ProfileURL string + EmailURL string +} + // Init initialize the setup of the OAuth2 library func Init() { sessionDir := filepath.Join(setting.AppDataPath, "sessions", "oauth2") @@ -31,7 +47,15 @@ func Init() { log.Fatal(4, "Fail to create dir %s: %v", sessionDir, err) } - gothic.Store = sessions.NewFilesystemStore(sessionDir, []byte(sessionUsersStoreKey)) + store := sessions.NewFilesystemStore(sessionDir, []byte(sessionUsersStoreKey)) + // according to the Goth lib: + // set the maxLength of the cookies stored on the disk to a larger number to prevent issues with: + // securecookie: the value is too long + // when using OpenID Connect , since this can contain a large amount of extra information in the id_token + + // Note, when using the FilesystemStore only the session.ID is written to a browser cookie, so this is explicit for the storage on disk + store.MaxLength(math.MaxInt16) + gothic.Store = store gothic.SetState = func(req *http.Request) string { return uuid.NewV4().String() @@ -74,12 +98,14 @@ func ProviderCallback(provider string, request *http.Request, response http.Resp } // RegisterProvider register a OAuth2 provider in goth lib -func RegisterProvider(providerName, providerType, clientID, clientSecret string) { - provider := createProvider(providerName, providerType, clientID, clientSecret) +func RegisterProvider(providerName, providerType, clientID, clientSecret, openIDConnectAutoDiscoveryURL string, customURLMapping *CustomURLMapping) error { + provider, err := createProvider(providerName, providerType, clientID, clientSecret, openIDConnectAutoDiscoveryURL, customURLMapping) - if provider != nil { + if err == nil && provider != nil { goth.UseProviders(provider) } + + return err } // RemoveProvider removes the given OAuth2 provider from the goth lib @@ -88,20 +114,111 @@ func RemoveProvider(providerName string) { } // used to create different types of goth providers -func createProvider(providerName, providerType, clientID, clientSecret string) goth.Provider { +func createProvider(providerName, providerType, clientID, clientSecret, openIDConnectAutoDiscoveryURL string, customURLMapping *CustomURLMapping) (goth.Provider, error) { callbackURL := setting.AppURL + "user/oauth2/" + providerName + "/callback" var provider goth.Provider + var err error switch providerType { + case "bitbucket": + provider = bitbucket.New(clientID, clientSecret, callbackURL, "account") + case "dropbox": + provider = dropbox.New(clientID, clientSecret, callbackURL) + case "facebook": + provider = facebook.New(clientID, clientSecret, callbackURL, "email") case "github": - provider = github.New(clientID, clientSecret, callbackURL, "user:email") + authURL := github.AuthURL + tokenURL := github.TokenURL + profileURL := github.ProfileURL + emailURL := github.EmailURL + if customURLMapping != nil { + if len(customURLMapping.AuthURL) > 0 { + authURL = customURLMapping.AuthURL + } + if len(customURLMapping.TokenURL) > 0 { + tokenURL = customURLMapping.TokenURL + } + if len(customURLMapping.ProfileURL) > 0 { + profileURL = customURLMapping.ProfileURL + } + if len(customURLMapping.EmailURL) > 0 { + emailURL = customURLMapping.EmailURL + } + } + provider = github.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL, emailURL) + case "gitlab": + authURL := gitlab.AuthURL + tokenURL := gitlab.TokenURL + profileURL := gitlab.ProfileURL + if customURLMapping != nil { + if len(customURLMapping.AuthURL) > 0 { + authURL = customURLMapping.AuthURL + } + if len(customURLMapping.TokenURL) > 0 { + tokenURL = customURLMapping.TokenURL + } + if len(customURLMapping.ProfileURL) > 0 { + profileURL = customURLMapping.ProfileURL + } + } + provider = gitlab.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL) + case "gplus": + provider = gplus.New(clientID, clientSecret, callbackURL, "email") + case "openidConnect": + if provider, err = openidConnect.New(clientID, clientSecret, callbackURL, openIDConnectAutoDiscoveryURL); err != nil { + log.Warn("Failed to create OpenID Connect Provider with name '%s' with url '%s': %v", providerName, openIDConnectAutoDiscoveryURL, err) + } + case "twitter": + provider = twitter.NewAuthenticate(clientID, clientSecret, callbackURL) } // always set the name if provider is created so we can support multiple setups of 1 provider - if provider != nil { + if err == nil && provider != nil { provider.SetName(providerName) } - return provider + return provider, err +} + +// GetDefaultTokenURL return the default token url for the given provider +func GetDefaultTokenURL(provider string) string { + switch provider { + case "github": + return github.TokenURL + case "gitlab": + return gitlab.TokenURL + } + return "" +} + +// GetDefaultAuthURL return the default authorize url for the given provider +func GetDefaultAuthURL(provider string) string { + switch provider { + case "github": + return github.AuthURL + case "gitlab": + return gitlab.AuthURL + } + return "" +} + +// GetDefaultProfileURL return the default profile url for the given provider +func GetDefaultProfileURL(provider string) string { + switch provider { + case "github": + return github.ProfileURL + case "gitlab": + return gitlab.ProfileURL + } + return "" +} + +// GetDefaultEmailURL return the default email url for the given provider +func GetDefaultEmailURL(provider string) string { + switch provider { + case "github": + return github.EmailURL + } + return "" } diff --git a/modules/auth/openid/discovery_cache.go b/modules/auth/openid/discovery_cache.go new file mode 100644 index 0000000..68cd7a8 --- /dev/null +++ b/modules/auth/openid/discovery_cache.go @@ -0,0 +1,58 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package openid + +import ( + "sync" + "time" + + "github.com/yohcop/openid-go" +) + +type timedDiscoveredInfo struct { + info openid.DiscoveredInfo + time time.Time +} + +type timedDiscoveryCache struct { + cache map[string]timedDiscoveredInfo + ttl time.Duration + mutex *sync.Mutex +} + +func newTimedDiscoveryCache(ttl time.Duration) *timedDiscoveryCache { + return &timedDiscoveryCache{cache: map[string]timedDiscoveredInfo{}, ttl: ttl, mutex: &sync.Mutex{}} +} + +func (s *timedDiscoveryCache) Put(id string, info openid.DiscoveredInfo) { + s.mutex.Lock() + defer s.mutex.Unlock() + + s.cache[id] = timedDiscoveredInfo{info: info, time: time.Now()} +} + +// Delete timed-out cache entries +func (s *timedDiscoveryCache) cleanTimedOut() { + now := time.Now() + for k, e := range s.cache { + diff := now.Sub(e.time) + if diff > s.ttl { + delete(s.cache, k) + } + } +} + +func (s *timedDiscoveryCache) Get(id string) openid.DiscoveredInfo { + s.mutex.Lock() + defer s.mutex.Unlock() + + // Delete old cached while we are at it. + s.cleanTimedOut() + + if info, has := s.cache[id]; has { + return info.info + } + return nil +} diff --git a/modules/auth/openid/discovery_cache_test.go b/modules/auth/openid/discovery_cache_test.go new file mode 100644 index 0000000..2e37058 --- /dev/null +++ b/modules/auth/openid/discovery_cache_test.go @@ -0,0 +1,48 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package openid + +import ( + "testing" + "time" +) + +type testDiscoveredInfo struct{} + +func (s *testDiscoveredInfo) ClaimedID() string { + return "claimedID" +} +func (s *testDiscoveredInfo) OpEndpoint() string { + return "opEndpoint" +} +func (s *testDiscoveredInfo) OpLocalID() string { + return "opLocalID" +} + +func TestTimedDiscoveryCache(t *testing.T) { + dc := newTimedDiscoveryCache(1 * time.Second) + + // Put some initial values + dc.Put("foo", &testDiscoveredInfo{}) //openid.opEndpoint: "a", openid.opLocalID: "b", openid.claimedID: "c"}) + + // Make sure we can retrieve them + if di := dc.Get("foo"); di == nil { + t.Errorf("Expected a result, got nil") + } else if di.OpEndpoint() != "opEndpoint" || di.OpLocalID() != "opLocalID" || di.ClaimedID() != "claimedID" { + t.Errorf("Expected opEndpoint opLocalID claimedID, got %v %v %v", di.OpEndpoint(), di.OpLocalID(), di.ClaimedID()) + } + + // Attempt to get a non-existent value + if di := dc.Get("bar"); di != nil { + t.Errorf("Expected nil, got %v", di) + } + + // Sleep one second and try retrive again + time.Sleep(1 * time.Second) + + if di := dc.Get("foo"); di != nil { + t.Errorf("Expected a nil, got a result") + } +} diff --git a/modules/auth/openid/openid.go b/modules/auth/openid/openid.go new file mode 100644 index 0000000..ffe0aba --- /dev/null +++ b/modules/auth/openid/openid.go @@ -0,0 +1,35 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package openid + +import ( + "github.com/yohcop/openid-go" + "time" +) + +// For the demo, we use in-memory infinite storage nonce and discovery +// cache. In your app, do not use this as it will eat up memory and +// never +// free it. Use your own implementation, on a better database system. +// If you have multiple servers for example, you may need to share at +// least +// the nonceStore between them. +var nonceStore = openid.NewSimpleNonceStore() +var discoveryCache = newTimedDiscoveryCache(24 * time.Hour) + +// Verify handles response from OpenID provider +func Verify(fullURL string) (id string, err error) { + return openid.Verify(fullURL, discoveryCache, nonceStore) +} + +// Normalize normalizes an OpenID URI +func Normalize(url string) (id string, err error) { + return openid.Normalize(url) +} + +// RedirectURL redirects browser +func RedirectURL(id, callbackURL, realm string) (string, error) { + return openid.RedirectURL(id, callbackURL, realm) +} diff --git a/modules/auth/org.go b/modules/auth/org.go index 26740f8..d6c26b6 100644 --- a/modules/auth/org.go +++ b/modules/auth/org.go @@ -5,6 +5,8 @@ package auth import ( + "code.gitea.io/gitea/models" + "github.com/go-macaron/binding" "gopkg.in/macaron.v1" ) @@ -21,7 +23,7 @@ type CreateOrgForm struct { OrgName string `binding:"Required;AlphaDashDot;MaxSize(35)" locale:"org.org_name_holder"` } -// Validate valideates the fields +// Validate validates the fields func (f *CreateOrgForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -31,12 +33,12 @@ type UpdateOrgSettingForm struct { Name string `binding:"Required;AlphaDashDot;MaxSize(35)" locale:"org.org_name_holder"` FullName string `binding:"MaxSize(100)"` Description string `binding:"MaxSize(255)"` - Website string `binding:"Url;MaxSize(255)"` + Website string `binding:"ValidUrl;MaxSize(255)"` Location string `binding:"MaxSize(50)"` MaxRepoCreation int } -// Validate valideates the fields +// Validate validates the fields func (f *UpdateOrgSettingForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -53,9 +55,10 @@ type CreateTeamForm struct { TeamName string `binding:"Required;AlphaDashDot;MaxSize(30)"` Description string `binding:"MaxSize(255)"` Permission string + Units []models.UnitType } -// Validate valideates the fields +// Validate validates the fields func (f *CreateTeamForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index 2b118ce..58dcf46 100644 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -33,7 +34,7 @@ type CreateRepoForm struct { Readme string } -// Validate valideates the fields +// Validate validates the fields func (f *CreateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -50,7 +51,7 @@ type MigrateRepoForm struct { Description string `json:"description" binding:"MaxSize(255)"` } -// Validate valideates the fields +// Validate validates the fields func (f *MigrateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -87,8 +88,8 @@ func (f MigrateRepoForm) ParseRemoteAddr(user *models.User) (string, error) { type RepoSettingForm struct { RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"` Description string `binding:"MaxSize(255)"` - Website string `binding:"Url;MaxSize(255)"` - Interval int + Website string `binding:"ValidUrl;MaxSize(255)"` + Interval string MirrorAddress string Private bool EnablePrune bool @@ -105,7 +106,7 @@ type RepoSettingForm struct { EnablePulls bool } -// Validate valideates the fields +// Validate validates the fields func (f *RepoSettingForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -143,20 +144,33 @@ func (f WebhookForm) ChooseEvents() bool { // NewWebhookForm form for creating web hook type NewWebhookForm struct { - PayloadURL string `binding:"Required;Url"` + PayloadURL string `binding:"Required;ValidUrl"` ContentType int `binding:"Required"` Secret string WebhookForm } -// Validate valideates the fields +// Validate validates the fields func (f *NewWebhookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } +// NewGogshookForm form for creating gogs hook +type NewGogshookForm struct { + PayloadURL string `binding:"Required;ValidUrl"` + ContentType int `binding:"Required"` + Secret string + WebhookForm +} + +// Validate validates the fields +func (f *NewGogshookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { + return validate(errs, ctx.Data, f, ctx.Locale) +} + // NewSlackHookForm form for creating slack hook type NewSlackHookForm struct { - PayloadURL string `binding:"Required;Url"` + PayloadURL string `binding:"Required;ValidUrl"` Channel string `binding:"Required"` Username string IconURL string @@ -164,7 +178,7 @@ type NewSlackHookForm struct { WebhookForm } -// Validate valideates the fields +// Validate validates the fields func (f *NewSlackHookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -186,7 +200,7 @@ type CreateIssueForm struct { Files []string } -// Validate valideates the fields +// Validate validates the fields func (f *CreateIssueForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -198,7 +212,7 @@ type CreateCommentForm struct { Files []string } -// Validate valideates the fields +// Validate validates the fields func (f *CreateCommentForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -217,7 +231,7 @@ type CreateMilestoneForm struct { Deadline string } -// Validate valideates the fields +// Validate validates the fields func (f *CreateMilestoneForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -236,7 +250,7 @@ type CreateLabelForm struct { Color string `binding:"Required;Size(7)" locale:"repo.issues.label_color"` } -// Validate valideates the fields +// Validate validates the fields func (f *CreateLabelForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -246,7 +260,7 @@ type InitializeLabelsForm struct { TemplateName string `binding:"Required"` } -// Validate valideates the fields +// Validate validates the fields func (f *InitializeLabelsForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -269,7 +283,7 @@ type NewReleaseForm struct { Files []string } -// Validate valideates the fields +// Validate validates the fields func (f *NewReleaseForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -283,7 +297,7 @@ type EditReleaseForm struct { Files []string } -// Validate valideates the fields +// Validate validates the fields func (f *EditReleaseForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -303,7 +317,7 @@ type NewWikiForm struct { Message string } -// Validate valideates the fields +// Validate validates the fields // FIXME: use code generation to generate this method. func (f *NewWikiForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) @@ -323,11 +337,11 @@ type EditRepoFileForm struct { CommitSummary string `binding:"MaxSize(100)"` CommitMessage string CommitChoice string `binding:"Required;MaxSize(50)"` - NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"` + NewBranchName string `binding:"GitRefName;MaxSize(100)"` LastCommit string } -// Validate valideates the fields +// Validate validates the fields func (f *EditRepoFileForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -337,7 +351,7 @@ type EditPreviewDiffForm struct { Content string } -// Validate valideates the fields +// Validate validates the fields func (f *EditPreviewDiffForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -356,11 +370,11 @@ type UploadRepoFileForm struct { CommitSummary string `binding:"MaxSize(100)"` CommitMessage string CommitChoice string `binding:"Required;MaxSize(50)"` - NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"` + NewBranchName string `binding:"GitRefName;MaxSize(100)"` Files []string } -// Validate valideates the fields +// Validate validates the fields func (f *UploadRepoFileForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -370,7 +384,7 @@ type RemoveUploadFileForm struct { File string `binding:"Required;MaxSize(50)"` } -// Validate valideates the fields +// Validate validates the fields func (f *RemoveUploadFileForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -387,10 +401,10 @@ type DeleteRepoFileForm struct { CommitSummary string `binding:"MaxSize(100)"` CommitMessage string CommitChoice string `binding:"Required;MaxSize(50)"` - NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"` + NewBranchName string `binding:"GitRefName;MaxSize(100)"` } -// Validate valideates the fields +// Validate validates the fields func (f *DeleteRepoFileForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index 32c1887..3193717 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -38,14 +38,17 @@ type InstallForm struct { RegisterConfirm bool MailNotify bool - OfflineMode bool - DisableGravatar bool - EnableFederatedAvatar bool - DisableRegistration bool - EnableCaptcha bool - RequireSignInView bool - DefaultKeepEmailPrivate bool - NoReplyAddress string + OfflineMode bool + DisableGravatar bool + EnableFederatedAvatar bool + EnableOpenIDSignIn bool + EnableOpenIDSignUp bool + DisableRegistration bool + EnableCaptcha bool + RequireSignInView bool + DefaultKeepEmailPrivate bool + DefaultAllowCreateOrganization bool + NoReplyAddress string AdminName string `binding:"OmitEmpty;AlphaDashDot;MaxSize(30)" locale:"install.admin_name"` AdminPasswd string `binding:"OmitEmpty;MaxSize(255)" locale:"install.admin_password"` @@ -53,7 +56,7 @@ type InstallForm struct { AdminEmail string `binding:"OmitEmpty;MinSize(3);MaxSize(254);Include(@)" locale:"install.admin_email"` } -// Validate valideates the fields +// Validate validates the fields func (f *InstallForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -78,7 +81,7 @@ func (f *RegisterForm) Validate(ctx *macaron.Context, errs binding.Errors) bindi return validate(errs, ctx.Data, f, ctx.Locale) } -// SignInForm form for signing in +// SignInForm form for signing in with user/password type SignInForm struct { UserName string `binding:"Required;MaxSize(254)"` Password string `binding:"Required;MaxSize(255)"` @@ -99,15 +102,15 @@ func (f *SignInForm) Validate(ctx *macaron.Context, errs binding.Errors) binding // UpdateProfileForm form for updating profile type UpdateProfileForm struct { - Name string `binding:"OmitEmpty;MaxSize(35)"` + Name string `binding:"AlphaDashDot;MaxSize(35)"` FullName string `binding:"MaxSize(100)"` Email string `binding:"Required;Email;MaxSize(254)"` KeepEmailPrivate bool - Website string `binding:"Url;MaxSize(255)"` + Website string `binding:"ValidUrl;MaxSize(255)"` Location string `binding:"MaxSize(50)"` } -// Validate valideates the fields +// Validate validates the fields func (f *UpdateProfileForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -126,7 +129,7 @@ type AvatarForm struct { Federavatar bool } -// Validate valideates the fields +// Validate validates the fields func (f *AvatarForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -136,7 +139,7 @@ type AddEmailForm struct { Email string `binding:"Required;Email;MaxSize(254)"` } -// Validate valideates the fields +// Validate validates the fields func (f *AddEmailForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -148,19 +151,30 @@ type ChangePasswordForm struct { Retype string `form:"retype"` } -// Validate valideates the fields +// Validate validates the fields func (f *ChangePasswordForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } -// AddSSHKeyForm form for adding SSH key -type AddSSHKeyForm struct { +// AddOpenIDForm is for changing openid uri +type AddOpenIDForm struct { + Openid string `binding:"Required;MaxSize(256)"` +} + +// Validate validates the fields +func (f *AddOpenIDForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { + return validate(errs, ctx.Data, f, ctx.Locale) +} + +// AddKeyForm form for adding SSH/GPG key +type AddKeyForm struct { + Type string `binding:"OmitEmpty"` Title string `binding:"Required;MaxSize(50)"` Content string `binding:"Required"` } -// Validate valideates the fields -func (f *AddSSHKeyForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { +// Validate validates the fields +func (f *AddKeyForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } @@ -179,7 +193,7 @@ type TwoFactorAuthForm struct { Passcode string `binding:"Required"` } -// Validate valideates the fields +// Validate validates the fields func (f *TwoFactorAuthForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { return validate(errs, ctx.Data, f, ctx.Locale) } diff --git a/modules/auth/user_form_auth_openid.go b/modules/auth/user_form_auth_openid.go new file mode 100644 index 0000000..0ef821d --- /dev/null +++ b/modules/auth/user_form_auth_openid.go @@ -0,0 +1,43 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package auth + +import ( + "github.com/go-macaron/binding" + "gopkg.in/macaron.v1" +) + +// SignInOpenIDForm form for signing in with OpenID +type SignInOpenIDForm struct { + Openid string `binding:"Required;MaxSize(256)"` + Remember bool +} + +// Validate valideates the fields +func (f *SignInOpenIDForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { + return validate(errs, ctx.Data, f, ctx.Locale) +} + +// SignUpOpenIDForm form for signin up with OpenID +type SignUpOpenIDForm struct { + UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"` + Email string `binding:"Required;Email;MaxSize(254)"` +} + +// Validate valideates the fields +func (f *SignUpOpenIDForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { + return validate(errs, ctx.Data, f, ctx.Locale) +} + +// ConnectOpenIDForm form for connecting an existing account to an OpenID URI +type ConnectOpenIDForm struct { + UserName string `binding:"Required;MaxSize(254)"` + Password string `binding:"Required;MaxSize(255)"` +} + +// Validate valideates the fields +func (f *ConnectOpenIDForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { + return validate(errs, ctx.Data, f, ctx.Locale) +} diff --git a/modules/base/tool.go b/modules/base/tool.go index 32987a0..543775e 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -192,13 +192,21 @@ func HashEmail(email string) string { return EncodeMD5(strings.ToLower(strings.TrimSpace(email))) } +// DefaultAvatarLink the default avatar link +func DefaultAvatarLink() string { + return setting.AppSubURL + "/img/avatar_default.png" +} + // AvatarLink returns relative avatar link to the site domain by given email, // which includes app sub-url as prefix. However, it is possible // to return full URL if user enables Gravatar-like service. func AvatarLink(email string) string { if setting.EnableFederatedAvatar && setting.LibravatarService != nil { - // TODO: This doesn't check any error. AvatarLink should return (string, error) - url, _ := setting.LibravatarService.FromEmail(email) + url, err := setting.LibravatarService.FromEmail(email) + if err != nil { + log.Error(4, "LibravatarService.FromEmail(email=%s): error %v", email, err) + return DefaultAvatarLink() + } return url } @@ -206,7 +214,7 @@ func AvatarLink(email string) string { return setting.GravatarSource + HashEmail(email) } - return setting.AppSubURL + "/img/avatar_default.png" + return DefaultAvatarLink() } // Seconds-based time units @@ -219,77 +227,84 @@ const ( Year = 12 * Month ) -func computeTimeDiff(diff int64) (int64, string) { +func computeTimeDiff(diff int64, lang string) (int64, string) { diffStr := "" switch { case diff <= 0: diff = 0 - diffStr = "now" + diffStr = i18n.Tr(lang, "tool.now") case diff < 2: diff = 0 - diffStr = "1 second" + diffStr = i18n.Tr(lang, "tool.1s") case diff < 1*Minute: - diffStr = fmt.Sprintf("%d seconds", diff) + diffStr = i18n.Tr(lang, "tool.seconds", diff) diff = 0 case diff < 2*Minute: diff -= 1 * Minute - diffStr = "1 minute" + diffStr = i18n.Tr(lang, "tool.1m") case diff < 1*Hour: - diffStr = fmt.Sprintf("%d minutes", diff/Minute) + diffStr = i18n.Tr(lang, "tool.minutes", diff/Minute) diff -= diff / Minute * Minute case diff < 2*Hour: diff -= 1 * Hour - diffStr = "1 hour" + diffStr = i18n.Tr(lang, "tool.1h") case diff < 1*Day: - diffStr = fmt.Sprintf("%d hours", diff/Hour) + diffStr = i18n.Tr(lang, "tool.hours", diff/Hour) diff -= diff / Hour * Hour case diff < 2*Day: diff -= 1 * Day - diffStr = "1 day" + diffStr = i18n.Tr(lang, "tool.1d") case diff < 1*Week: - diffStr = fmt.Sprintf("%d days", diff/Day) + diffStr = i18n.Tr(lang, "tool.days", diff/Day) diff -= diff / Day * Day case diff < 2*Week: diff -= 1 * Week - diffStr = "1 week" + diffStr = i18n.Tr(lang, "tool.1w") case diff < 1*Month: - diffStr = fmt.Sprintf("%d weeks", diff/Week) + diffStr = i18n.Tr(lang, "tool.weeks", diff/Week) diff -= diff / Week * Week case diff < 2*Month: diff -= 1 * Month - diffStr = "1 month" + diffStr = i18n.Tr(lang, "tool.1mon") case diff < 1*Year: - diffStr = fmt.Sprintf("%d months", diff/Month) + diffStr = i18n.Tr(lang, "tool.months", diff/Month) diff -= diff / Month * Month case diff < 2*Year: diff -= 1 * Year - diffStr = "1 year" + diffStr = i18n.Tr(lang, "tool.1y") default: - diffStr = fmt.Sprintf("%d years", diff/Year) + diffStr = i18n.Tr(lang, "tool.years", diff/Year) diff -= (diff / Year) * Year } return diff, diffStr } -// TimeSincePro calculates the time interval and generate full user-friendly string. -func TimeSincePro(then time.Time) string { - return timeSincePro(then, time.Now()) +// MinutesToFriendly returns a user friendly string with number of minutes +// converted to hours and minutes. +func MinutesToFriendly(minutes int, lang string) string { + duration := time.Duration(minutes) * time.Minute + return TimeSincePro(time.Now().Add(-duration), lang) } -func timeSincePro(then, now time.Time) string { +// TimeSincePro calculates the time interval and generate full user-friendly string. +func TimeSincePro(then time.Time, lang string) string { + return timeSincePro(then, time.Now(), lang) +} + +func timeSincePro(then, now time.Time, lang string) string { diff := now.Unix() - then.Unix() if then.After(now) { - return "future" + return i18n.Tr(lang, "tool.future") } if diff == 0 { - return "now" + return i18n.Tr(lang, "tool.now") } var timeStr, diffStr string @@ -298,58 +313,25 @@ func timeSincePro(then, now time.Time) string { break } - diff, diffStr = computeTimeDiff(diff) + diff, diffStr = computeTimeDiff(diff, lang) timeStr += ", " + diffStr } return strings.TrimPrefix(timeStr, ", ") } func timeSince(then, now time.Time, lang string) string { - lbl := i18n.Tr(lang, "tool.ago") + lbl := "tool.ago" diff := now.Unix() - then.Unix() if then.After(now) { - lbl = i18n.Tr(lang, "tool.from_now") + lbl = "tool.from_now" diff = then.Unix() - now.Unix() } - - switch { - case diff <= 0: + if diff <= 0 { return i18n.Tr(lang, "tool.now") - case diff <= 1: - return i18n.Tr(lang, "tool.1s", lbl) - case diff < 1*Minute: - return i18n.Tr(lang, "tool.seconds", diff, lbl) - - case diff < 2*Minute: - return i18n.Tr(lang, "tool.1m", lbl) - case diff < 1*Hour: - return i18n.Tr(lang, "tool.minutes", diff/Minute, lbl) - - case diff < 2*Hour: - return i18n.Tr(lang, "tool.1h", lbl) - case diff < 1*Day: - return i18n.Tr(lang, "tool.hours", diff/Hour, lbl) - - case diff < 2*Day: - return i18n.Tr(lang, "tool.1d", lbl) - case diff < 1*Week: - return i18n.Tr(lang, "tool.days", diff/Day, lbl) - - case diff < 2*Week: - return i18n.Tr(lang, "tool.1w", lbl) - case diff < 1*Month: - return i18n.Tr(lang, "tool.weeks", diff/Week, lbl) - - case diff < 2*Month: - return i18n.Tr(lang, "tool.1mon", lbl) - case diff < 1*Year: - return i18n.Tr(lang, "tool.months", diff/Month, lbl) - - case diff < 2*Year: - return i18n.Tr(lang, "tool.1y", lbl) - default: - return i18n.Tr(lang, "tool.years", diff/Year, lbl) } + + _, diffStr := computeTimeDiff(diff, lang) + return i18n.Tr(lang, lbl, diffStr) } // RawTimeSince retrieves i18n key of time since t diff --git a/modules/base/tool_test.go b/modules/base/tool_test.go index 43d4df3..f3e787d 100644 --- a/modules/base/tool_test.go +++ b/modules/base/tool_test.go @@ -145,7 +145,7 @@ func TestComputeTimeDiff(t *testing.T) { // computeTimeDiff(base + offset) == (offset, str) test := func(base int64, str string, offsets ...int64) { for _, offset := range offsets { - diff, diffStr := computeTimeDiff(base + offset) + diff, diffStr := computeTimeDiff(base+offset, "en") assert.Equal(t, offset, diff) assert.Equal(t, str, diffStr) } @@ -167,18 +167,30 @@ func TestComputeTimeDiff(t *testing.T) { test(3*Year, "3 years", 0, Year-1) } +func TestMinutesToFriendly(t *testing.T) { + // test that a number of minutes yields the expected string + test := func(expected string, minutes int) { + actual := MinutesToFriendly(minutes, "en") + assert.Equal(t, expected, actual) + } + test("1 minute", 1) + test("2 minutes", 2) + test("1 hour", 60) + test("1 hour, 1 minute", 61) + test("1 hour, 2 minutes", 62) + test("2 hours", 120) +} + func TestTimeSince(t *testing.T) { assert.Equal(t, "now", timeSince(BaseDate, BaseDate, "en")) // test that each diff in `diffs` yields the expected string test := func(expected string, diffs ...time.Duration) { - ago := i18n.Tr("en", "tool.ago") - fromNow := i18n.Tr("en", "tool.from_now") for _, diff := range diffs { actual := timeSince(BaseDate, BaseDate.Add(diff), "en") - assert.Equal(t, expected+" "+ago, actual) + assert.Equal(t, i18n.Tr("en", "tool.ago", expected), actual) actual = timeSince(BaseDate.Add(diff), BaseDate, "en") - assert.Equal(t, expected+" "+fromNow, actual) + assert.Equal(t, i18n.Tr("en", "tool.from_now", expected), actual) } } test("1 second", time.Second, time.Second+50*time.Millisecond) @@ -198,13 +210,13 @@ func TestTimeSince(t *testing.T) { } func TestTimeSincePro(t *testing.T) { - assert.Equal(t, "now", timeSincePro(BaseDate, BaseDate)) + assert.Equal(t, "now", timeSincePro(BaseDate, BaseDate, "en")) // test that a difference of `diff` yields the expected string test := func(expected string, diff time.Duration) { - actual := timeSincePro(BaseDate, BaseDate.Add(diff)) + actual := timeSincePro(BaseDate, BaseDate.Add(diff), "en") assert.Equal(t, expected, actual) - assert.Equal(t, "future", timeSincePro(BaseDate.Add(diff), BaseDate)) + assert.Equal(t, "future", timeSincePro(BaseDate.Add(diff), BaseDate, "en")) } test("1 second", time.Second) test("2 seconds", 2*time.Second) diff --git a/modules/context/api.go b/modules/context/api.go index 725a346..0bf4307 100644 --- a/modules/context/api.go +++ b/modules/context/api.go @@ -23,6 +23,38 @@ type APIContext struct { Org *APIOrganization } +// APIError is error format response +// swagger:response error +type APIError struct { + Message string `json:"message"` + URL string `json:"url"` +} + +// APIValidationError is error format response related to input validation +// swagger:response validationError +type APIValidationError struct { + Message string `json:"message"` + URL string `json:"url"` +} + +//APIEmpty is an empty response +// swagger:response empty +type APIEmpty struct{} + +//APIForbiddenError is a forbidden error response +// swagger:response forbidden +type APIForbiddenError struct { + APIError +} + +//APINotFound is a not found empty response +// swagger:response notFound +type APINotFound struct{} + +//APIRedirect is a redirect response +// swagger:response redirect +type APIRedirect struct{} + // Error responses error message to client with given message. // If status is 500, also it prints error to log. func (ctx *APIContext) Error(status int, title string, obj interface{}) { @@ -37,13 +69,13 @@ func (ctx *APIContext) Error(status int, title string, obj interface{}) { log.Error(4, "%s: %s", title, message) } - ctx.JSON(status, map[string]string{ - "message": message, - "url": base.DocURL, + ctx.JSON(status, APIError{ + Message: message, + URL: base.DocURL, }) } -// SetLinkHeader sets pagination link header by given totol number and page size. +// SetLinkHeader sets pagination link header by given total number and page size. func (ctx *APIContext) SetLinkHeader(total, pageSize int) { page := paginater.New(total, pageSize, ctx.QueryInt("page"), 0) links := make([]string, 0, 4) diff --git a/modules/context/context.go b/modules/context/context.go index a77c1dc..9f5d934 100644 --- a/modules/context/context.go +++ b/modules/context/context.go @@ -10,6 +10,7 @@ import ( "html/template" "io" "net/http" + "path" "strings" "time" @@ -18,6 +19,7 @@ import ( "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + "github.com/Unknwon/com" "github.com/go-macaron/cache" "github.com/go-macaron/csrf" "github.com/go-macaron/i18n" @@ -33,6 +35,7 @@ type Context struct { Flash *session.Flash Session session.Store + Link string // current request URL User *models.User IsSigned bool IsBasicAuth bool @@ -154,17 +157,52 @@ func Contexter() macaron.Handler { csrf: x, Flash: f, Session: sess, + Link: setting.AppSubURL + strings.TrimSuffix(c.Req.URL.Path, "/"), Repo: &Repository{ PullRequest: &PullRequest{}, }, Org: &Organization{}, } - // Compute current URL for real-time change language. - ctx.Data["Link"] = setting.AppSubURL + strings.TrimSuffix(ctx.Req.URL.Path, "/") - + c.Data["Link"] = ctx.Link ctx.Data["PageStartTime"] = time.Now() + // Quick responses appropriate go-get meta with status 200 + // regardless of if user have access to the repository, + // or the repository does not exist at all. + // This is particular a workaround for "go get" command which does not respect + // .netrc file. + if ctx.Query("go-get") == "1" { + ownerName := c.Params(":username") + repoName := c.Params(":reponame") + branchName := "master" - // Get user from session if logined. + owner, err := models.GetUserByName(ownerName) + if err == nil { + repo, err := models.GetRepositoryByName(owner.ID, repoName) + if err == nil && len(repo.DefaultBranch) > 0 { + branchName = repo.DefaultBranch + } + } + prefix := setting.AppURL + path.Join(ownerName, repoName, "src", branchName) + c.PlainText(http.StatusOK, []byte(com.Expand(` + + + + + + + go get {GoGetImport} + + +`, map[string]string{ + "GoGetImport": ComposeGoGetImport(ownerName, strings.TrimSuffix(repoName, ".git")), + "CloneLink": models.ComposeHTTPSCloneURL(ownerName, repoName), + "GoDocDirectory": prefix + "{/dir}", + "GoDocFile": prefix + "{/dir}/{file}#L{line}", + }))) + return + } + + // Get user from session if logged in. ctx.User, ctx.IsBasicAuth = auth.SignedInUser(ctx.Context, ctx.Session) if ctx.User != nil { @@ -197,6 +235,7 @@ func Contexter() macaron.Handler { ctx.Data["ShowRegistrationButton"] = setting.Service.ShowRegistrationButton ctx.Data["ShowFooterBranding"] = setting.ShowFooterBranding ctx.Data["ShowFooterVersion"] = setting.ShowFooterVersion + ctx.Data["EnableOpenIDSignIn"] = setting.Service.EnableOpenIDSignIn c.Map(ctx) } diff --git a/modules/context/repo.go b/modules/context/repo.go index 1ae9854..cdb021f 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -12,7 +12,6 @@ import ( "code.gitea.io/git" "code.gitea.io/gitea/models" - "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "github.com/Unknwon/com" editorconfig "gopkg.in/editorconfig/editorconfig-core-go.v1" @@ -27,7 +26,7 @@ type PullRequest struct { HeadInfo string // [:] } -// Repository contains informations to operate a repository +// Repository contains information to operate a repository type Repository struct { AccessMode models.AccessMode IsWatching bool @@ -76,6 +75,16 @@ func (r *Repository) CanEnableEditor() bool { return r.Repository.CanEnableEditor() && r.IsViewBranch && r.IsWriter() } +// CanCommitToBranch returns true if repository is editable and user has proper access level +// and branch is not protected +func (r *Repository) CanCommitToBranch() (bool, error) { + protectedBranch, err := r.Repository.IsProtectedBranch(r.BranchName) + if err != nil { + return false, err + } + return r.CanEnableEditor() && !protectedBranch, nil +} + // GetEditorconfig returns the .editorconfig definition if found in the // HEAD of the default repo branch. func (r *Repository) GetEditorconfig() (*editorconfig.Editorconfig, error) { @@ -115,21 +124,23 @@ func RetrieveBaseRepo(ctx *Context, repo *models.Repository) { } } -// composeGoGetImport returns go-get-import meta content. -func composeGoGetImport(owner, repo string) string { +// ComposeGoGetImport returns go-get-import meta content. +func ComposeGoGetImport(owner, repo string) string { return path.Join(setting.Domain, setting.AppSubURL, owner, repo) } -// earlyResponseForGoGetMeta responses appropriate go-get meta with status 200 +// EarlyResponseForGoGetMeta responses appropriate go-get meta with status 200 // if user does not have actual access to the requested repository, // or the owner or repository does not exist at all. // This is particular a workaround for "go get" command which does not respect // .netrc file. -func earlyResponseForGoGetMeta(ctx *Context) { +func EarlyResponseForGoGetMeta(ctx *Context) { + username := ctx.Params(":username") + reponame := ctx.Params(":reponame") ctx.PlainText(200, []byte(com.Expand(``, map[string]string{ - "GoGetImport": composeGoGetImport(ctx.Params(":username"), ctx.Params(":reponame")), - "CloneLink": models.ComposeHTTPSCloneURL(ctx.Params(":username"), ctx.Params(":reponame")), + "GoGetImport": ComposeGoGetImport(username, strings.TrimSuffix(reponame, ".git")), + "CloneLink": models.ComposeHTTPSCloneURL(username, reponame), }))) } @@ -153,16 +164,78 @@ func RedirectToRepo(ctx *Context, redirectRepoID int64) { ctx.Redirect(redirectPath) } -// RepoAssignment returns a macaron to handle repository assignment -func RepoAssignment(args ...bool) macaron.Handler { +// RepoIDAssignment returns an macaron handler which assigns the repo to the context. +func RepoIDAssignment() macaron.Handler { return func(ctx *Context) { var ( - displayBare bool // To display bare page if it is a bare repo. + err error ) - if len(args) >= 1 { - displayBare = args[0] + + repoID := ctx.ParamsInt64(":repoid") + + // Get repository. + repo, err := models.GetRepositoryByID(repoID) + if err != nil { + if models.IsErrRepoNotExist(err) { + ctx.Handle(404, "GetRepositoryByID", nil) + } else { + ctx.Handle(500, "GetRepositoryByID", err) + } + return } + if err = repo.GetOwner(); err != nil { + ctx.Handle(500, "GetOwner", err) + return + } + + // Admin has super access. + if ctx.IsSigned && ctx.User.IsAdmin { + ctx.Repo.AccessMode = models.AccessModeOwner + } else { + var userID int64 + if ctx.User != nil { + userID = ctx.User.ID + } + mode, err := models.AccessLevel(userID, repo) + if err != nil { + ctx.Handle(500, "AccessLevel", err) + return + } + ctx.Repo.AccessMode = mode + } + + // Check access. + if ctx.Repo.AccessMode == models.AccessModeNone { + if ctx.Query("go-get") == "1" { + EarlyResponseForGoGetMeta(ctx) + return + } + ctx.Handle(404, "no access right", err) + return + } + ctx.Data["HasAccess"] = true + + if repo.IsMirror { + ctx.Repo.Mirror, err = models.GetMirrorByRepoID(repo.ID) + if err != nil { + ctx.Handle(500, "GetMirror", err) + return + } + ctx.Data["MirrorEnablePrune"] = ctx.Repo.Mirror.EnablePrune + ctx.Data["MirrorInterval"] = ctx.Repo.Mirror.Interval + ctx.Data["Mirror"] = ctx.Repo.Mirror + } + + ctx.Repo.Repository = repo + ctx.Data["RepoName"] = ctx.Repo.Repository.Name + ctx.Data["IsBareRepo"] = ctx.Repo.Repository.IsBare + } +} + +// RepoAssignment returns a macaron to handle repository assignment +func RepoAssignment() macaron.Handler { + return func(ctx *Context) { var ( owner *models.User err error @@ -179,10 +252,10 @@ func RepoAssignment(args ...bool) macaron.Handler { if err != nil { if models.IsErrUserNotExist(err) { if ctx.Query("go-get") == "1" { - earlyResponseForGoGetMeta(ctx) + EarlyResponseForGoGetMeta(ctx) return } - ctx.Handle(404, "GetUserByName", err) + ctx.Handle(404, "GetUserByName", nil) } else { ctx.Handle(500, "GetUserByName", err) } @@ -201,10 +274,10 @@ func RepoAssignment(args ...bool) macaron.Handler { RedirectToRepo(ctx, redirectRepoID) } else if models.IsErrRepoRedirectNotExist(err) { if ctx.Query("go-get") == "1" { - earlyResponseForGoGetMeta(ctx) + EarlyResponseForGoGetMeta(ctx) return } - ctx.Handle(404, "GetRepositoryByName", err) + ctx.Handle(404, "GetRepositoryByName", nil) } else { ctx.Handle(500, "LookupRepoRedirect", err) } @@ -219,7 +292,11 @@ func RepoAssignment(args ...bool) macaron.Handler { if ctx.IsSigned && ctx.User.IsAdmin { ctx.Repo.AccessMode = models.AccessModeOwner } else { - mode, err := models.AccessLevel(ctx.User, repo) + var userID int64 + if ctx.User != nil { + userID = ctx.User.ID + } + mode, err := models.AccessLevel(userID, repo) if err != nil { ctx.Handle(500, "AccessLevel", err) return @@ -230,7 +307,7 @@ func RepoAssignment(args ...bool) macaron.Handler { // Check access. if ctx.Repo.AccessMode == models.AccessModeNone { if ctx.Query("go-get") == "1" { - earlyResponseForGoGetMeta(ctx) + EarlyResponseForGoGetMeta(ctx) return } ctx.Handle(404, "no access right", err) @@ -269,7 +346,16 @@ func RepoAssignment(args ...bool) macaron.Handler { return } ctx.Data["Tags"] = tags - ctx.Repo.Repository.NumTags = len(tags) + + count, err := models.GetReleaseCountByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{ + IncludeDrafts: false, + IncludeTags: true, + }) + if err != nil { + ctx.Handle(500, "GetReleaseCountByRepoID", err) + return + } + ctx.Repo.Repository.NumReleases = int(count) ctx.Data["Title"] = owner.Name + "/" + repo.Name ctx.Data["Repository"] = repo @@ -278,7 +364,13 @@ func RepoAssignment(args ...bool) macaron.Handler { ctx.Data["IsRepositoryAdmin"] = ctx.Repo.IsAdmin() ctx.Data["IsRepositoryWriter"] = ctx.Repo.IsWriter() + if ctx.Data["CanSignedUserFork"], err = ctx.Repo.Repository.CanUserFork(ctx.User); err != nil { + ctx.Handle(500, "CanUserFork", err) + return + } + ctx.Data["DisableSSH"] = setting.SSH.Disabled + ctx.Data["ExposeAnonSSH"] = setting.SSH.ExposeAnonymous ctx.Data["DisableHTTP"] = setting.Repository.DisableHTTPGit ctx.Data["CloneLink"] = repo.CloneLink() ctx.Data["WikiCloneLink"] = repo.WikiCloneLink() @@ -290,15 +382,7 @@ func RepoAssignment(args ...bool) macaron.Handler { // repo is bare and display enable if ctx.Repo.Repository.IsBare { - log.Debug("Bare repository: %s", ctx.Repo.RepoLink) - // NOTE: to prevent templating error - ctx.Data["BranchName"] = "" - if displayBare { - if !ctx.Repo.IsAdmin() { - ctx.Flash.Info(ctx.Tr("repo.repo_is_empty"), true) - } - ctx.HTML(200, "repo/bare") - } + ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch return } @@ -330,17 +414,15 @@ func RepoAssignment(args ...bool) macaron.Handler { } } - // People who have push access or have fored repository can propose a new pull request. + // People who have push access or have forked repository can propose a new pull request. if ctx.Repo.IsWriter() || (ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID)) { // Pull request is allowed if this is a fork repository // and base repository accepts pull requests. - if repo.BaseRepo != nil { - if repo.BaseRepo.AllowsPulls() { - ctx.Data["BaseRepo"] = repo.BaseRepo - ctx.Repo.PullRequest.BaseRepo = repo.BaseRepo - ctx.Repo.PullRequest.Allowed = true - ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName - } + if repo.BaseRepo != nil && repo.BaseRepo.AllowsPulls() { + ctx.Data["BaseRepo"] = repo.BaseRepo + ctx.Repo.PullRequest.BaseRepo = repo.BaseRepo + ctx.Repo.PullRequest.Allowed = true + ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName } else { // Or, this is repository accepts pull requests between branches. if repo.AllowsPulls() { @@ -351,11 +433,14 @@ func RepoAssignment(args ...bool) macaron.Handler { ctx.Repo.PullRequest.HeadInfo = ctx.Repo.BranchName } } + + // Reset repo units as otherwise user specific units wont be loaded later + ctx.Repo.Repository.Units = nil } ctx.Data["PullRequestCtx"] = ctx.Repo.PullRequest if ctx.Query("go-get") == "1" { - ctx.Data["GoGetImport"] = composeGoGetImport(owner.Name, repo.Name) + ctx.Data["GoGetImport"] = ComposeGoGetImport(owner.Name, repo.Name) prefix := setting.AppURL + path.Join(owner.Name, repo.Name, "src", ctx.Repo.BranchName) ctx.Data["GoDocDirectory"] = prefix + "{/dir}" ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}" @@ -394,6 +479,11 @@ func RepoRef() macaron.Handler { if err != nil { ctx.Handle(500, "GetBranches", err) return + } else if len(brs) == 0 { + err = fmt.Errorf("No branches in non-bare repository %s", + ctx.Repo.GitRepo.Path) + ctx.Handle(500, "GetBranches", err) + return } refName = brs[0] } @@ -495,6 +585,44 @@ func RequireRepoWriter() macaron.Handler { } } +// LoadRepoUnits loads repsitory's units, it should be called after repository and user loaded +func LoadRepoUnits() macaron.Handler { + return func(ctx *Context) { + var isAdmin bool + if ctx.User != nil && ctx.User.IsAdmin { + isAdmin = true + } + + var userID int64 + if ctx.User != nil { + userID = ctx.User.ID + } + err := ctx.Repo.Repository.LoadUnitsByUserID(userID, isAdmin) + if err != nil { + ctx.Handle(500, "LoadUnitsByUserID", err) + return + } + } +} + +// CheckUnit will check whether +func CheckUnit(unitType models.UnitType) macaron.Handler { + return func(ctx *Context) { + if !ctx.Repo.Repository.UnitEnabled(unitType) { + ctx.Handle(404, "CheckUnit", fmt.Errorf("%s: %v", ctx.Tr("units.error.unit_not_allowed"), unitType)) + } + } +} + +// CheckAnyUnit will check whether any of the unit types are enabled +func CheckAnyUnit(unitTypes ...models.UnitType) macaron.Handler { + return func(ctx *Context) { + if !ctx.Repo.Repository.AnyUnitEnabled(unitTypes...) { + ctx.Handle(404, "CheckAnyUnit", fmt.Errorf("%s: %v", ctx.Tr("units.error.unit_not_allowed"), unitTypes)) + } + } +} + // GitHookService checks if repository Git hooks service has been enabled. func GitHookService() macaron.Handler { return func(ctx *Context) { @@ -511,10 +639,8 @@ func UnitTypes() macaron.Handler { ctx.Data["UnitTypeCode"] = models.UnitTypeCode ctx.Data["UnitTypeIssues"] = models.UnitTypeIssues ctx.Data["UnitTypePullRequests"] = models.UnitTypePullRequests - ctx.Data["UnitTypeCommits"] = models.UnitTypeCommits ctx.Data["UnitTypeReleases"] = models.UnitTypeReleases ctx.Data["UnitTypeWiki"] = models.UnitTypeWiki - ctx.Data["UnitTypeSettings"] = models.UnitTypeSettings ctx.Data["UnitTypeExternalWiki"] = models.UnitTypeExternalWiki ctx.Data["UnitTypeExternalTracker"] = models.UnitTypeExternalTracker } diff --git a/modules/cron/cron.go b/modules/cron/cron.go index 785bf44..a64b512 100644 --- a/modules/cron/cron.go +++ b/modules/cron/cron.go @@ -66,6 +66,17 @@ func NewContext() { go models.DeleteOldRepositoryArchives() } } + if setting.Cron.SyncExternalUsers.Enabled { + entry, err = c.AddFunc("Synchronize external users", setting.Cron.SyncExternalUsers.Schedule, models.SyncExternalUsers) + if err != nil { + log.Fatal(4, "Cron[Synchronize external users]: %v", err) + } + if setting.Cron.SyncExternalUsers.RunAtStart { + entry.Prev = time.Now() + entry.ExecTimes++ + go models.SyncExternalUsers() + } + } c.Start() } diff --git a/modules/highlight/highlight.go b/modules/highlight/highlight.go index 39b5d6d..fc9a4ad 100644 --- a/modules/highlight/highlight.go +++ b/modules/highlight/highlight.go @@ -25,43 +25,47 @@ var ( } // Extensions that are same as highlight classes. - highlightExts = map[string]bool{ - ".arm": true, - ".as": true, - ".sh": true, - ".cs": true, - ".cpp": true, - ".c": true, - ".css": true, - ".cmake": true, - ".bat": true, - ".dart": true, - ".patch": true, - ".elixir": true, - ".erlang": true, - ".go": true, - ".html": true, - ".xml": true, - ".hs": true, - ".ini": true, - ".json": true, - ".java": true, - ".js": true, - ".less": true, - ".lua": true, - ".php": true, - ".py": true, - ".rb": true, - ".scss": true, - ".sql": true, - ".scala": true, - ".swift": true, - ".ts": true, - ".vb": true, + highlightExts = map[string]struct{}{ + ".arm": {}, + ".as": {}, + ".sh": {}, + ".cs": {}, + ".cpp": {}, + ".c": {}, + ".css": {}, + ".cmake": {}, + ".bat": {}, + ".dart": {}, + ".patch": {}, + ".elixir": {}, + ".erlang": {}, + ".go": {}, + ".html": {}, + ".xml": {}, + ".hs": {}, + ".ini": {}, + ".json": {}, + ".java": {}, + ".js": {}, + ".less": {}, + ".lua": {}, + ".php": {}, + ".py": {}, + ".rb": {}, + ".scss": {}, + ".sql": {}, + ".scala": {}, + ".swift": {}, + ".ts": {}, + ".vb": {}, + ".yml": {}, + ".yaml": {}, } // Extensions that are not same as highlight classes. - highlightMapping = map[string]string{} + highlightMapping = map[string]string{ + ".txt": "nohighlight", + } ) // NewContext loads highlight map @@ -85,7 +89,7 @@ func FileNameToHighlightClass(fname string) string { } ext := path.Ext(fname) - if highlightExts[ext] { + if _, ok := highlightExts[ext]; ok { return ext[1:] } diff --git a/modules/httplib/httplib.go b/modules/httplib/httplib.go index 981de2f..f2d9a2b 100644 --- a/modules/httplib/httplib.go +++ b/modules/httplib/httplib.go @@ -62,6 +62,11 @@ func newRequest(url, method string) *Request { return &Request{url, &req, map[string]string{}, map[string]string{}, defaultSetting, &resp, nil} } +// NewRequest returns *Request with specific method +func NewRequest(url, method string) *Request { + return newRequest(url, method) +} + // Get returns *Request with GET method. func Get(url string) *Request { return newRequest(url, "GET") @@ -438,7 +443,7 @@ func (r *Request) ToXML(v interface{}) error { return err } -// Response executes request client gets response mannually. +// Response executes request client gets response manually. func (r *Request) Response() (*http.Response, error) { return r.getResponse() } diff --git a/modules/lfs/content_store.go b/modules/lfs/content_store.go index 7a1f1b4..3e1b2f3 100644 --- a/modules/lfs/content_store.go +++ b/modules/lfs/content_store.go @@ -20,7 +20,7 @@ type ContentStore struct { BasePath string } -// Get takes a Meta object and retreives the content from the store, returning +// Get takes a Meta object and retrieves the content from the store, returning // it as an io.Reader. If fromByte > 0, the reader starts from that byte func (s *ContentStore) Get(meta *models.LFSMetaObject, fromByte int64) (io.ReadCloser, error) { path := filepath.Join(s.BasePath, transformKey(meta.Oid)) @@ -70,10 +70,7 @@ func (s *ContentStore) Put(meta *models.LFSMetaObject, r io.Reader) error { return errHashMismatch } - if err := os.Rename(tmpPath, path); err != nil { - return err - } - return nil + return os.Rename(tmpPath, path) } // Exists returns true if the object exists in the content store. diff --git a/modules/lfs/server.go b/modules/lfs/server.go index 1bdeadc..44ab082 100644 --- a/modules/lfs/server.go +++ b/modules/lfs/server.go @@ -50,7 +50,7 @@ type BatchResponse struct { Objects []*Representation `json:"objects"` } -// Representation is object medata as seen by clients of the lfs server. +// Representation is object metadata as seen by clients of the lfs server. type Representation struct { Oid string `json:"oid"` Size int64 `json:"size"` @@ -463,7 +463,7 @@ func authenticate(ctx *context.Context, repository *models.Repository, authoriza } if ctx.IsSigned { - accessCheck, _ := models.HasAccess(ctx.User, repository, accessMode) + accessCheck, _ := models.HasAccess(ctx.User.ID, repository, accessMode) return accessCheck } @@ -499,7 +499,7 @@ func authenticate(ctx *context.Context, repository *models.Repository, authoriza return false } - accessCheck, _ := models.HasAccess(userModel, repository, accessMode) + accessCheck, _ := models.HasAccess(userModel.ID, repository, accessMode) return accessCheck } diff --git a/modules/log/conn.go b/modules/log/conn.go index b1801d0..edb149d 100644 --- a/modules/log/conn.go +++ b/modules/log/conn.go @@ -42,7 +42,7 @@ func (cw *ConnWriter) WriteMsg(msg string, skip, level int) error { if cw.Level > level { return nil } - if cw.neddedConnectOnMsg() { + if cw.neededConnectOnMsg() { if err := cw.connect(); err != nil { return err } @@ -87,7 +87,7 @@ func (cw *ConnWriter) connect() error { return nil } -func (cw *ConnWriter) neddedConnectOnMsg() bool { +func (cw *ConnWriter) neededConnectOnMsg() bool { if cw.Reconnect { cw.Reconnect = false return true diff --git a/modules/log/file.go b/modules/log/file.go index fe6c54e..18e82f7 100644 --- a/modules/log/file.go +++ b/modules/log/file.go @@ -110,10 +110,7 @@ func (w *FileLogWriter) StartLogger() error { return err } w.mw.SetFd(fd) - if err = w.initFd(); err != nil { - return err - } - return nil + return w.initFd() } func (w *FileLogWriter) docheck(size int) { diff --git a/modules/log/log.go b/modules/log/log.go index bea6e5b..36038d3 100644 --- a/modules/log/log.go +++ b/modules/log/log.go @@ -11,7 +11,8 @@ import ( "path/filepath" "runtime" "strings" - "sync" + + "golang.org/x/sync/syncmap" ) var ( @@ -42,10 +43,11 @@ func NewLogger(bufLen int64, mode, config string) { // DelLogger removes loggers that are for the given mode func DelLogger(mode string) error { for _, l := range loggers { - if _, ok := l.outputs[mode]; ok { + if _, ok := l.outputs.Load(mode); ok { return l.DelLogger(mode) } } + Trace("Log adapter %s not found, no need to delete", mode) return nil } @@ -84,7 +86,7 @@ func Info(format string, v ...interface{}) { } } -// Warn records warnning log +// Warn records warning log func Warn(format string, v ...interface{}) { for _, logger := range loggers { logger.Warn(format, v...) @@ -174,19 +176,17 @@ type logMsg struct { // it can contain several providers and log message into all providers. type Logger struct { adapter string - lock sync.Mutex level int msg chan *logMsg - outputs map[string]LoggerInterface + outputs syncmap.Map quit chan bool } // newLogger initializes and returns a new logger. func newLogger(buffer int64) *Logger { l := &Logger{ - msg: make(chan *logMsg, buffer), - outputs: make(map[string]LoggerInterface), - quit: make(chan bool), + msg: make(chan *logMsg, buffer), + quit: make(chan bool), } go l.StartLogger() return l @@ -194,14 +194,12 @@ func newLogger(buffer int64) *Logger { // SetLogger sets new logger instance with given logger adapter and config. func (l *Logger) SetLogger(adapter string, config string) error { - l.lock.Lock() - defer l.lock.Unlock() if log, ok := adapters[adapter]; ok { lg := log() if err := lg.Init(config); err != nil { return err } - l.outputs[adapter] = lg + l.outputs.Store(adapter, lg) l.adapter = adapter } else { panic("log: unknown adapter \"" + adapter + "\" (forgotten register?)") @@ -211,11 +209,9 @@ func (l *Logger) SetLogger(adapter string, config string) error { // DelLogger removes a logger adapter instance. func (l *Logger) DelLogger(adapter string) error { - l.lock.Lock() - defer l.lock.Unlock() - if lg, ok := l.outputs[adapter]; ok { - lg.Destroy() - delete(l.outputs, adapter) + if lg, ok := l.outputs.Load(adapter); ok { + lg.(LoggerInterface).Destroy() + l.outputs.Delete(adapter) } else { panic("log: unknown adapter \"" + adapter + "\" (forgotten register?)") } @@ -264,22 +260,24 @@ func (l *Logger) StartLogger() { for { select { case bm := <-l.msg: - for _, l := range l.outputs { - if err := l.WriteMsg(bm.msg, bm.skip, bm.level); err != nil { + l.outputs.Range(func(k, v interface{}) bool { + if err := v.(LoggerInterface).WriteMsg(bm.msg, bm.skip, bm.level); err != nil { fmt.Println("ERROR, unable to WriteMsg:", err) } - } + return true + }) case <-l.quit: return } } } -// Flush flushs all chan data. +// Flush flushes all chan data. func (l *Logger) Flush() { - for _, l := range l.outputs { - l.Flush() - } + l.outputs.Range(func(k, v interface{}) bool { + v.(LoggerInterface).Flush() + return true + }) } // Close closes logger, flush all chan data and destroy all adapter instances. @@ -288,19 +286,21 @@ func (l *Logger) Close() { for { if len(l.msg) > 0 { bm := <-l.msg - for _, l := range l.outputs { - if err := l.WriteMsg(bm.msg, bm.skip, bm.level); err != nil { + l.outputs.Range(func(k, v interface{}) bool { + if err := v.(LoggerInterface).WriteMsg(bm.msg, bm.skip, bm.level); err != nil { fmt.Println("ERROR, unable to WriteMsg:", err) } - } + return true + }) } else { break } } - for _, l := range l.outputs { - l.Flush() - l.Destroy() - } + l.outputs.Range(func(k, v interface{}) bool { + v.(LoggerInterface).Flush() + v.(LoggerInterface).Destroy() + return true + }) } // Trace records trace log @@ -321,7 +321,7 @@ func (l *Logger) Info(format string, v ...interface{}) { l.writerMsg(0, INFO, msg) } -// Warn records warnning log +// Warn records warning log func (l *Logger) Warn(format string, v ...interface{}) { msg := fmt.Sprintf("[W] "+format, v...) l.writerMsg(0, WARN, msg) diff --git a/modules/log/xorm.go b/modules/log/xorm.go index 113cfda..1a218a9 100644 --- a/modules/log/xorm.go +++ b/modules/log/xorm.go @@ -101,7 +101,7 @@ func (l *XORMLogBridge) Infof(format string, v ...interface{}) { } } -// Warn show warnning log +// Warn show warning log func (l *XORMLogBridge) Warn(v ...interface{}) { if l.level <= core.LOG_WARNING { msg := fmt.Sprint(v...) diff --git a/modules/mailer/mailer.go b/modules/mailer/mailer.go index ab8f010..5b28f92 100644 --- a/modules/mailer/mailer.go +++ b/modules/mailer/mailer.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -15,11 +16,12 @@ import ( "strings" "time" - "github.com/jaytaylor/html2text" - "gopkg.in/gomail.v2" - + "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + + "github.com/jaytaylor/html2text" + "gopkg.in/gomail.v2" ) // Message mail body and log info @@ -29,8 +31,8 @@ type Message struct { } // NewMessageFrom creates new mail message object with custom From header. -func NewMessageFrom(to []string, from, subject, htmlBody string) *Message { - log.Trace("NewMessageFrom (htmlBody):\n%s", htmlBody) +func NewMessageFrom(to []string, from, subject, body string) *Message { + log.Trace("NewMessageFrom (body):\n%s", body) msg := gomail.NewMessage() msg.SetHeader("From", from) @@ -38,15 +40,15 @@ func NewMessageFrom(to []string, from, subject, htmlBody string) *Message { msg.SetHeader("Subject", subject) msg.SetDateHeader("Date", time.Now()) - body, err := html2text.FromString(htmlBody) - if err != nil { - log.Error(4, "html2text.FromString: %v", err) - msg.SetBody("text/html", htmlBody) - } else { - msg.SetBody("text/plain", body) - if setting.MailService.EnableHTMLAlternative { - msg.AddAlternative("text/html", htmlBody) + plainBody, err := html2text.FromString(body) + if err != nil || setting.MailService.SendAsPlainText { + if strings.Contains(base.TruncateString(body, 100), "") { + log.Warn("Mail contains HTML but configured to send as plain text.") } + msg.SetBody("text/plain", plainBody) + } else { + msg.SetBody("text/plain", plainBody) + msg.AddAlternative("text/html", body) } return &Message{ @@ -82,7 +84,7 @@ func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) { case "Password:": return []byte(a.password), nil default: - return nil, fmt.Errorf("unknwon fromServer: %s", string(fromServer)) + return nil, fmt.Errorf("unknown fromServer: %s", string(fromServer)) } } return nil, nil @@ -146,7 +148,7 @@ func (s *smtpSender) Send(from string, to []string, msg io.WriterTo) error { } } - // If not using SMTPS, alway use STARTTLS if available + // If not using SMTPS, always use STARTTLS if available hasStartTLS, _ := client.Extension("STARTTLS") if !isSecureConn && hasStartTLS { if err = client.StartTLS(tlsconfig); err != nil { diff --git a/modules/markdown/markdown.go b/modules/markdown/markdown.go index 813fabe..ed673f2 100644 --- a/modules/markdown/markdown.go +++ b/modules/markdown/markdown.go @@ -14,12 +14,14 @@ import ( "regexp" "strings" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/setting" + "github.com/Unknwon/com" "github.com/russross/blackfriday" "golang.org/x/net/html" - - "code.gitea.io/gitea/modules/base" - "code.gitea.io/gitea/modules/setting" ) // Issue name styles @@ -40,19 +42,11 @@ func IsMarkdownFile(name string) bool { return false } -// IsReadmeFile reports whether name looks like a README file -// based on its name. -func IsReadmeFile(name string) bool { - name = strings.ToLower(name) - if len(name) < 6 { - return false - } else if len(name) == 6 { - return name == "readme" - } - return name[:7] == "readme." -} - var ( + // NOTE: All below regex matching do not perform any extra validation. + // Thus a link is produced even if the user does not exist, the issue does not exist, the commit does not exist, etc. + // While fast, this is also incorrect and lead to false positives. + // MentionPattern matches string that mentions someone, e.g. @Unknwon MentionPattern = regexp.MustCompile(`(\s|^|\W)@[0-9a-zA-Z-_\.]+`) @@ -65,22 +59,39 @@ var ( CrossReferenceIssueNumericPattern = regexp.MustCompile(`( |^)[0-9a-zA-Z]+/[0-9a-zA-Z]+#[0-9]+\b`) // Sha1CurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae - // FIXME: this pattern matches pure numbers as well, right now we do a hack to check in renderSha1CurrentPattern - // by converting string to a number. - Sha1CurrentPattern = regexp.MustCompile(`(?:^|\s|\()[0-9a-f]{40}\b`) + // Although SHA1 hashes are 40 chars long, the regex matches the hash from 7 to 40 chars in length + // so that abbreviated hash links can be used as well. This matches git and github useability. + Sha1CurrentPattern = regexp.MustCompile(`(?:^|\s|\()([0-9a-f]{7,40})\b`) // ShortLinkPattern matches short but difficult to parse [[name|link|arg=test]] syntax - ShortLinkPattern = regexp.MustCompile(`(\[\[.*\]\]\w*)`) + ShortLinkPattern = regexp.MustCompile(`(\[\[.*?\]\]\w*)`) // AnySHA1Pattern allows to split url containing SHA into parts AnySHA1Pattern = regexp.MustCompile(`(http\S*)://(\S+)/(\S+)/(\S+)/(\S+)/([0-9a-f]{40})(?:/?([^#\s]+)?(?:#(\S+))?)?`) - // IssueFullPattern allows to split issue (and pull) URLs into parts - IssueFullPattern = regexp.MustCompile(`(?:^|\s|\()(http\S*)://((?:[^\s/]+/)+)((?:\w{1,10}-)?[1-9][0-9]*)([\?|#]\S+.(\S+)?)?\b`) - validLinksPattern = regexp.MustCompile(`^[a-z][\w-]+://`) ) +// regexp for full links to issues/pulls +var issueFullPattern *regexp.Regexp + +// InitMarkdown initialize regexps for markdown parsing +func InitMarkdown() { + getIssueFullPattern() +} + +func getIssueFullPattern() *regexp.Regexp { + if issueFullPattern == nil { + appURL := setting.AppURL + if len(appURL) > 0 && appURL[len(appURL)-1] != '/' { + appURL += "/" + } + issueFullPattern = regexp.MustCompile(appURL + + `\w+/\w+/(?:issues|pulls)/((?:\w{1,10}-)?[1-9][0-9]*)([\?|#]\S+.(\S+)?)?\b`) + } + return issueFullPattern +} + // isLink reports whether link fits valid format. func isLink(link []byte) bool { return validLinksPattern.Match(link) @@ -155,12 +166,15 @@ func (r *Renderer) ListItem(out *bytes.Buffer, text []byte, flags int) { } switch { case bytes.HasPrefix(text, []byte(prefix+"[ ] ")): - text = append([]byte(`
`), text[3+len(prefix):]...) + text = append([]byte(``), text[3+len(prefix):]...) + if prefix != "" { + text = bytes.Replace(text, []byte(prefix), []byte{}, 1) + } case bytes.HasPrefix(text, []byte(prefix+"[x] ")): - text = append([]byte(`
`), text[3+len(prefix):]...) - } - if prefix != "" { - text = bytes.Replace(text, []byte("

"), []byte{}, 1) + text = append([]byte(``), text[3+len(prefix):]...) + if prefix != "" { + text = bytes.Replace(text, []byte(prefix), []byte{}, 1) + } } r.Renderer.ListItem(out, text, flags) } @@ -221,36 +235,17 @@ func cutoutVerbosePrefix(prefix string) string { } // URLJoin joins url components, like path.Join, but preserving contents -func URLJoin(elem ...string) string { - res := "" - last := len(elem) - 1 - for i, item := range elem { - res += item - if i != last && !strings.HasSuffix(res, "/") { - res += "/" - } +func URLJoin(base string, elems ...string) string { + u, err := url.Parse(base) + if err != nil { + log.Error(4, "URLJoin: Invalid base URL %s", base) + return "" } - cwdIndex := strings.Index(res, "/./") - for cwdIndex != -1 { - res = strings.Replace(res, "/./", "/", 1) - cwdIndex = strings.Index(res, "/./") - } - upIndex := strings.Index(res, "/..") - for upIndex != -1 { - res = strings.Replace(res, "/..", "", 1) - prevStart := -1 - for i := upIndex - 1; i >= 0; i-- { - if res[i] == '/' { - prevStart = i - break - } - } - if prevStart != -1 { - res = res[:prevStart] + res[upIndex:] - } - upIndex = strings.Index(res, "/..") - } - return res + joinArgs := make([]string, 0, len(elems)+1) + joinArgs = append(joinArgs, u.Path) + joinArgs = append(joinArgs, elems...) + u.Path = path.Join(joinArgs...) + return u.String() } // RenderIssueIndexPattern renders issue indexes to corresponding links. @@ -345,32 +340,17 @@ func renderFullSha1Pattern(rawBytes []byte, urlPrefix string) []byte { return rawBytes } -// renderFullIssuePattern renders issues-like URLs -func renderFullIssuePattern(rawBytes []byte, urlPrefix string) []byte { - ms := IssueFullPattern.FindAllSubmatch(rawBytes, -1) +// RenderFullIssuePattern renders issues-like URLs +func RenderFullIssuePattern(rawBytes []byte) []byte { + ms := getIssueFullPattern().FindAllSubmatch(rawBytes, -1) for _, m := range ms { all := m[0] - protocol := string(m[1]) - paths := bytes.Split(m[2], []byte("/")) - paths = paths[:len(paths)-1] - if bytes.HasPrefix(paths[0], []byte("gist.")) { - continue - } - path := protocol + "://" + string(m[2]) - id := string(m[3]) - path = URLJoin(path, id) - var comment []byte - if len(m) > 3 { - comment = m[4] - } - urlSuffix := "" + id := string(m[1]) text := "#" + id - if comment != nil { - urlSuffix += string(comment) - text += " " - } + // TODO if m[2] is not nil, then link is to a comment, + // and we should indicate that in the text somehow rawBytes = bytes.Replace(rawBytes, all, []byte(fmt.Sprintf( - `%s`, path, urlSuffix, text)), -1) + `%s`, string(all), text)), -1) } return rawBytes } @@ -550,12 +530,15 @@ func RenderCrossReferenceIssueIndexPattern(rawBytes []byte, urlPrefix string, me func renderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte { ms := Sha1CurrentPattern.FindAllSubmatch(rawBytes, -1) for _, m := range ms { - all := m[0] - if com.StrTo(all).MustInt() > 0 { - continue - } - rawBytes = bytes.Replace(rawBytes, all, []byte(fmt.Sprintf( - `%s`, URLJoin(urlPrefix, "commit", string(all)), base.ShortSha(string(all)))), -1) + hash := m[1] + // The regex does not lie, it matches the hash pattern. + // However, a regex cannot know if a hash actually exists or not. + // We could assume that a SHA1 hash should probably contain alphas AND numerics + // but that is not always the case. + // Although unlikely, deadbeef and 1234567 are valid short forms of SHA1 hash + // as used by git and github for linking and thus we have to do similar. + rawBytes = bytes.Replace(rawBytes, hash, []byte(fmt.Sprintf( + `%s`, URLJoin(urlPrefix, "commit", string(hash)), base.ShortSha(string(hash)))), -1) } return rawBytes } @@ -569,12 +552,12 @@ func RenderSpecialLink(rawBytes []byte, urlPrefix string, metas map[string]strin []byte(fmt.Sprintf(`%s`, URLJoin(setting.AppURL, string(m[1:])), m)), -1) } + rawBytes = RenderFullIssuePattern(rawBytes) rawBytes = RenderShortLinks(rawBytes, urlPrefix, false, isWikiMarkdown) rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas) rawBytes = RenderCrossReferenceIssueIndexPattern(rawBytes, urlPrefix, metas) rawBytes = renderFullSha1Pattern(rawBytes, urlPrefix) rawBytes = renderSha1CurrentPattern(rawBytes, urlPrefix) - rawBytes = renderFullIssuePattern(rawBytes, urlPrefix) return rawBytes } @@ -638,10 +621,8 @@ OUTER_LOOP: // Copy the token to the output verbatim buf.Write(RenderShortLinks([]byte(token.String()), urlPrefix, true, isWikiMarkdown)) - if token.Type == html.StartTagToken { - if !com.IsSliceContainsStr(noEndTags, token.Data) { - stackNum++ - } + if token.Type == html.StartTagToken && !com.IsSliceContainsStr(noEndTags, token.Data) { + stackNum++ } // If this is the close tag to the outer-most, we are done @@ -656,8 +637,8 @@ OUTER_LOOP: continue OUTER_LOOP } - if !com.IsSliceContainsStr(noEndTags, token.Data) { - startTags = append(startTags, token.Data) + if !com.IsSliceContainsStr(noEndTags, tagName) { + startTags = append(startTags, tagName) } case html.EndTagToken: @@ -707,3 +688,31 @@ func RenderString(raw, urlPrefix string, metas map[string]string) string { func RenderWiki(rawBytes []byte, urlPrefix string, metas map[string]string) string { return string(render(rawBytes, urlPrefix, metas, true)) } + +var ( + // MarkupName describes markup's name + MarkupName = "markdown" +) + +func init() { + markup.RegisterParser(Parser{}) +} + +// Parser implements markup.Parser +type Parser struct { +} + +// Name implements markup.Parser +func (Parser) Name() string { + return MarkupName +} + +// Extensions implements markup.Parser +func (Parser) Extensions() []string { + return setting.Markdown.FileExtensions +} + +// Render implements markup.Parser +func (Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { + return render(rawBytes, urlPrefix, metas, isWiki) +} diff --git a/modules/markdown/markdown_test.go b/modules/markdown/markdown_test.go index 88d289a..4506a29 100644 --- a/modules/markdown/markdown_test.go +++ b/modules/markdown/markdown_test.go @@ -1,3 +1,7 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + package markdown_test import ( @@ -55,6 +59,31 @@ func testRenderIssueIndexPattern(t *testing.T, input, expected string, metas map string(RenderIssueIndexPattern([]byte(input), AppSubURL, metas))) } +func TestURLJoin(t *testing.T) { + type test struct { + Expected string + Base string + Elements []string + } + newTest := func(expected, base string, elements ...string) test { + return test{Expected: expected, Base: base, Elements: elements} + } + for _, test := range []test{ + newTest("https://try.gitea.io/a/b/c", + "https://try.gitea.io", "a/b", "c"), + newTest("https://try.gitea.io/a/b/c", + "https://try.gitea.io/", "/a/b/", "/c/"), + newTest("https://try.gitea.io/a/c", + "https://try.gitea.io/", "/a/./b/", "../c/"), + newTest("a/b/c", + "a", "b/c/"), + newTest("a/b/d", + "a/", "b/c/", "/../d/"), + } { + assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...)) + } +} + func TestRender_IssueIndexPattern(t *testing.T) { // numeric: render inputs without valid mentions test := func(s string) { @@ -180,13 +209,15 @@ func TestRender_AutoLink(t *testing.T) { numericIssueLink(URLJoin(setting.AppSubURL, "issues"), 3333)) // render external issue URLs - tmp := "http://1111/2222/ssss-issues/3333?param=blah&blahh=333" - test(tmp, "#3333 ") - test("http://test.com/issues/33333", numericIssueLink("http://test.com/issues", 33333)) - test("https://issues/333", numericIssueLink("https://issues", 333)) + for _, externalURL := range []string{ + "http://1111/2222/ssss-issues/3333?param=blah&blahh=333", + "http://test.com/issues/33333", + "https://issues/333"} { + test(externalURL, externalURL) + } // render valid commit URLs - tmp = URLJoin(AppSubURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae") + tmp := URLJoin(AppSubURL, "commit", "d8a994ef243349f321568f9e36d5c3f444b99cae") test(tmp, "d8a994ef24") tmp += "#diff-2" test(tmp, "d8a994ef24 (diff-2)") @@ -231,8 +262,10 @@ func TestRender_ShortLinks(t *testing.T) { rawtree := URLJoin(AppSubURL, "raw", "master") url := URLJoin(tree, "Link") + otherUrl := URLJoin(tree, "OtherLink") imgurl := URLJoin(rawtree, "Link.jpg") urlWiki := URLJoin(AppSubURL, "wiki", "Link") + otherUrlWiki := URLJoin(AppSubURL, "wiki", "OtherLink") imgurlWiki := URLJoin(AppSubURL, "wiki", "raw", "Link.jpg") favicon := "http://google.com/favicon.ico" @@ -272,6 +305,10 @@ func TestRender_ShortLinks(t *testing.T) { "[[Name|Link.jpg|alt=\"AltName\"|title='Title']]", `

AltName

`, `

AltName

`) + test( + "[[Link]] [[OtherLink]]", + `

Link OtherLink

`, + `

Link OtherLink

`) } func TestRender_Commits(t *testing.T) { @@ -290,8 +327,11 @@ func TestRender_Commits(t *testing.T) { var src = strings.Replace(subtree, "/commit/", "/src/", -1) test(sha, `

b6dd6210ea

`) + test(sha[:7], `

b6dd621

`) + test(sha[:39], `

b6dd6210ea

`) test(commit, `

b6dd6210ea

`) test(tree, `

b6dd6210ea/src

`) + test("commit "+sha, `

commit b6dd6210ea

`) } func TestRender_Images(t *testing.T) { @@ -330,6 +370,22 @@ func TestRender_CrossReferences(t *testing.T) { `

gogits/gogs#12345

`) } +func TestRender_FullIssueURLs(t *testing.T) { + setting.AppURL = AppURL + setting.AppSubURL = AppSubURL + + test := func(input, expected string) { + result := RenderFullIssuePattern([]byte(input)) + assert.Equal(t, expected, string(result)) + } + test("Here is a link https://git.osgeo.org/gogs/postgis/postgis/pulls/6", + "Here is a link https://git.osgeo.org/gogs/postgis/postgis/pulls/6") + test("Look here http://localhost:3000/person/repo/issues/4", + `Look here #4`) + test("http://localhost:3000/person/repo/issues/4#issuecomment-1234", + `#4`) +} + func TestRegExp_MentionPattern(t *testing.T) { trueTestCases := []string{ "@Unknwon", @@ -520,50 +576,6 @@ func TestRegExp_AnySHA1Pattern(t *testing.T) { } } -func TestRegExp_IssueFullPattern(t *testing.T) { - testCases := map[string][]string{ - "https://github.com/gogits/gogs/pull/3244": { - "https", - "github.com/gogits/gogs/pull/", - "3244", - "", - "", - }, - "https://github.com/gogits/gogs/issues/3247#issuecomment-231517079": { - "https", - "github.com/gogits/gogs/issues/", - "3247", - "#issuecomment-231517079", - "", - }, - "https://try.gogs.io/gogs/gogs/issues/4#issue-685": { - "https", - "try.gogs.io/gogs/gogs/issues/", - "4", - "#issue-685", - "", - }, - "https://youtrack.jetbrains.com/issue/JT-36485": { - "https", - "youtrack.jetbrains.com/issue/", - "JT-36485", - "", - "", - }, - "https://youtrack.jetbrains.com/issue/JT-36485#comment=27-1508676": { - "https", - "youtrack.jetbrains.com/issue/", - "JT-36485", - "#comment=27-1508676", - "", - }, - } - - for k, v := range testCases { - assert.Equal(t, IssueFullPattern.FindStringSubmatch(k)[1:], v) - } -} - func TestMisc_IsMarkdownFile(t *testing.T) { setting.Markdown.FileExtensions = []string{".md", ".markdown", ".mdown", ".mkd"} trueTestCases := []string{ @@ -586,31 +598,6 @@ func TestMisc_IsMarkdownFile(t *testing.T) { } } -func TestMisc_IsReadmeFile(t *testing.T) { - trueTestCases := []string{ - "readme", - "README", - "readME.mdown", - "README.md", - } - falseTestCases := []string{ - "test.md", - "wow.MARKDOWN", - "LOL.mDoWn", - "test", - "abcdefg", - "abcdefghijklmnopqrstuvwxyz", - "test.md.test", - } - - for _, testCase := range trueTestCases { - assert.True(t, IsReadmeFile(testCase)) - } - for _, testCase := range falseTestCases { - assert.False(t, IsReadmeFile(testCase)) - } -} - func TestMisc_IsSameDomain(t *testing.T) { setting.AppURL = AppURL setting.AppSubURL = AppSubURL @@ -632,7 +619,7 @@ var sameCases = []string{ Ideas and codes -- Bezier widget (by @r-lyeh) https://github.com/ocornut/imgui/issues/786 +- Bezier widget (by @r-lyeh) ` + AppURL + `ocornut/imgui/issues/786 - Node graph editors https://github.com/ocornut/imgui/issues/306 - [[Memory Editor|memory_editor_example]] - [[Plot var helper|plot_var_example]]`, @@ -661,17 +648,17 @@ func testAnswers(baseURLContent, baseURLImages string) []string { `

Wiki! Enjoy :)

Ideas and codes

`, `

What is Wine Staging?

@@ -685,15 +672,15 @@ func testAnswers(baseURLContent, baseURLImages string) []string { - - + + - - + +
images/icon-install.pngInstallationimages/icon-install.pngInstallation
images/icon-usage.pngUsageimages/icon-usage.pngUsage
@@ -702,9 +689,9 @@ func testAnswers(baseURLContent, baseURLImages string) []string {
  1. Package your libGDX application -images/1.png
  2. +images/1.png
  3. Perform a test run by hitting the Run! button. -images/2.png
  4. +images/2.png
`, } diff --git a/modules/markdown/sanitizer.go b/modules/markdown/sanitizer.go index 32378dc..cc00c9a 100644 --- a/modules/markdown/sanitizer.go +++ b/modules/markdown/sanitizer.go @@ -38,15 +38,12 @@ func NewSanitizer() { // Custom URL-Schemes sanitizer.policy.AllowURLSchemes(setting.Markdown.CustomURLSchemes...) - }) } // Sanitize takes a string that contains a HTML fragment or document and applies policy whitelist. func Sanitize(s string) string { - if sanitizer.policy == nil { - NewSanitizer() - } + NewSanitizer() return sanitizer.policy.Sanitize(s) } @@ -56,8 +53,6 @@ func SanitizeBytes(b []byte) []byte { // nothing to sanitize return b } - if sanitizer.policy == nil { - NewSanitizer() - } + NewSanitizer() return sanitizer.policy.SanitizeBytes(b) } diff --git a/modules/markup/markup.go b/modules/markup/markup.go new file mode 100644 index 0000000..185cdc7 --- /dev/null +++ b/modules/markup/markup.go @@ -0,0 +1,83 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package markup + +import ( + "path/filepath" + "strings" +) + +// Parser defines an interface for parsering markup file to HTML +type Parser interface { + Name() string // markup format name + Extensions() []string + Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte +} + +var ( + parsers = make(map[string]Parser) +) + +// RegisterParser registers a new markup file parser +func RegisterParser(parser Parser) { + for _, ext := range parser.Extensions() { + parsers[strings.ToLower(ext)] = parser + } +} + +// Render renders markup file to HTML with all specific handling stuff. +func Render(filename string, rawBytes []byte, urlPrefix string, metas map[string]string) []byte { + return render(filename, rawBytes, urlPrefix, metas, false) +} + +func render(filename string, rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { + extension := strings.ToLower(filepath.Ext(filename)) + if parser, ok := parsers[extension]; ok { + return parser.Render(rawBytes, urlPrefix, metas, isWiki) + } + return nil +} + +// RenderString renders Markdown to HTML with special links and returns string type. +func RenderString(filename string, raw, urlPrefix string, metas map[string]string) string { + return string(render(filename, []byte(raw), urlPrefix, metas, false)) +} + +// RenderWiki renders markdown wiki page to HTML and return HTML string +func RenderWiki(filename string, rawBytes []byte, urlPrefix string, metas map[string]string) string { + return string(render(filename, rawBytes, urlPrefix, metas, true)) +} + +// Type returns if markup format via the filename +func Type(filename string) string { + extension := strings.ToLower(filepath.Ext(filename)) + if parser, ok := parsers[extension]; ok { + return parser.Name() + } + return "" +} + +// ReadmeFileType reports whether name looks like a README file +// based on its name and find the parser via its ext name +func ReadmeFileType(name string) (string, bool) { + if IsReadmeFile(name) { + return Type(name), true + } + return "", false +} + +// IsReadmeFile reports whether name looks like a README file +// based on its name. +func IsReadmeFile(name string) bool { + if len(name) < 6 { + return false + } + + name = strings.ToLower(name) + if len(name) == 6 { + return name == "readme" + } + return name[:7] == "readme." +} diff --git a/modules/markup/markup_test.go b/modules/markup/markup_test.go new file mode 100644 index 0000000..0dd2be3 --- /dev/null +++ b/modules/markup/markup_test.go @@ -0,0 +1,37 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package markup + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestMisc_IsReadmeFile(t *testing.T) { + trueTestCases := []string{ + "readme", + "README", + "readME.mdown", + "README.md", + } + falseTestCases := []string{ + "test.md", + "wow.MARKDOWN", + "LOL.mDoWn", + "test", + "abcdefg", + "abcdefghijklmnopqrstuvwxyz", + "test.md.test", + "readmf", + } + + for _, testCase := range trueTestCases { + assert.True(t, IsReadmeFile(testCase)) + } + for _, testCase := range falseTestCases { + assert.False(t, IsReadmeFile(testCase)) + } +} diff --git a/modules/options/dynamic.go b/modules/options/dynamic.go index f523574..c56d098 100644 --- a/modules/options/dynamic.go +++ b/modules/options/dynamic.go @@ -76,7 +76,7 @@ func License(name string) ([]byte, error) { return fileFromDir(path.Join("license", name)) } -// Labels eads the content of a specific labels from static or custom path. +// Labels reads the content of a specific labels from static or custom path. func Labels(name string) ([]byte, error) { return fileFromDir(path.Join("label", name)) } diff --git a/modules/options/static.go b/modules/options/static.go index d98253f..3301f45 100644 --- a/modules/options/static.go +++ b/modules/options/static.go @@ -72,7 +72,7 @@ func License(name string) ([]byte, error) { return fileFromDir(path.Join("license", name)) } -// Labels eads the content of a specific labels from static or custom path. +// Labels reads the content of a specific labels from static or custom path. func Labels(name string) ([]byte, error) { return fileFromDir(path.Join("label", name)) } diff --git a/modules/private/branch.go b/modules/private/branch.go new file mode 100644 index 0000000..6b3b917 --- /dev/null +++ b/modules/private/branch.go @@ -0,0 +1,40 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package private + +import ( + "encoding/json" + "fmt" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" +) + +// GetProtectedBranchBy get protected branch information +func GetProtectedBranchBy(repoID int64, branchName string) (*models.ProtectedBranch, error) { + // Ask for running deliver hook and test pull request tasks. + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/branch/%d/%s", repoID, branchName) + log.GitLogger.Trace("GetProtectedBranchBy: %s", reqURL) + + resp, err := newInternalRequest(reqURL, "GET").Response() + if err != nil { + return nil, err + } + + var branch models.ProtectedBranch + if err := json.NewDecoder(resp.Body).Decode(&branch); err != nil { + return nil, err + } + + defer resp.Body.Close() + + // All 2XX status codes are accepted and others will return an error + if resp.StatusCode/100 != 2 { + return nil, fmt.Errorf("Failed to update public key: %s", decodeJSONError(resp).Err) + } + + return &branch, nil +} diff --git a/modules/private/internal.go b/modules/private/internal.go new file mode 100644 index 0000000..ac2fe56 --- /dev/null +++ b/modules/private/internal.go @@ -0,0 +1,70 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package private + +import ( + "crypto/tls" + "encoding/json" + "fmt" + "net" + "net/http" + + "code.gitea.io/gitea/modules/httplib" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" +) + +func newRequest(url, method string) *httplib.Request { + return httplib.NewRequest(url, method).Header("Authorization", + fmt.Sprintf("Bearer %s", setting.InternalToken)) +} + +// Response internal request response +type Response struct { + Err string `json:"err"` +} + +func decodeJSONError(resp *http.Response) *Response { + var res Response + err := json.NewDecoder(resp.Body).Decode(&res) + if err != nil { + res.Err = err.Error() + } + return &res +} + +func newInternalRequest(url, method string) *httplib.Request { + req := newRequest(url, method).SetTLSClientConfig(&tls.Config{ + InsecureSkipVerify: true, + }) + if setting.Protocol == setting.UnixSocket { + req.SetTransport(&http.Transport{ + Dial: func(_, _ string) (net.Conn, error) { + return net.Dial("unix", setting.HTTPAddr) + }, + }) + } + return req +} + +// UpdatePublicKeyUpdated update publick key updates +func UpdatePublicKeyUpdated(keyID int64) error { + // Ask for running deliver hook and test pull request tasks. + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/ssh/%d/update", keyID) + log.GitLogger.Trace("UpdatePublicKeyUpdated: %s", reqURL) + + resp, err := newInternalRequest(reqURL, "POST").Response() + if err != nil { + return err + } + + defer resp.Body.Close() + + // All 2XX status codes are accepted and others will return an error + if resp.StatusCode/100 != 2 { + return fmt.Errorf("Failed to update public key: %s", decodeJSONError(resp).Err) + } + return nil +} diff --git a/modules/private/push_update.go b/modules/private/push_update.go new file mode 100644 index 0000000..f3071b6 --- /dev/null +++ b/modules/private/push_update.go @@ -0,0 +1,40 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package private + +import ( + "encoding/json" + "fmt" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" +) + +// PushUpdate update publick key updates +func PushUpdate(opt models.PushUpdateOptions) error { + // Ask for running deliver hook and test pull request tasks. + reqURL := setting.LocalURL + "api/internal/push/update" + log.GitLogger.Trace("PushUpdate: %s", reqURL) + + body, err := json.Marshal(&opt) + if err != nil { + return err + } + + resp, err := newInternalRequest(reqURL, "POST").Body(body).Response() + if err != nil { + return err + } + + defer resp.Body.Close() + + // All 2XX status codes are accepted and others will return an error + if resp.StatusCode/100 != 2 { + return fmt.Errorf("Failed to update public key: %s", decodeJSONError(resp).Err) + } + + return nil +} diff --git a/modules/setting/setting.go b/modules/setting/setting.go index c490fb1..aafe2d1 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -9,12 +10,14 @@ import ( "encoding/base64" "fmt" "io" + "net" "net/mail" "net/url" "os" "os/exec" "path" "path/filepath" + "regexp" "runtime" "strconv" "strings" @@ -26,6 +29,7 @@ import ( "code.gitea.io/gitea/modules/user" "github.com/Unknwon/com" + "github.com/dgrijalva/jwt-go" _ "github.com/go-macaron/cache/memcache" // memcache plugin for cache _ "github.com/go-macaron/cache/redis" "github.com/go-macaron/session" @@ -84,17 +88,19 @@ var ( EnablePprof bool SSH = struct { - Disabled bool `ini:"DISABLE_SSH"` - StartBuiltinServer bool `ini:"START_SSH_SERVER"` - Domain string `ini:"SSH_DOMAIN"` - Port int `ini:"SSH_PORT"` - ListenHost string `ini:"SSH_LISTEN_HOST"` - ListenPort int `ini:"SSH_LISTEN_PORT"` - RootPath string `ini:"SSH_ROOT_PATH"` - KeyTestPath string `ini:"SSH_KEY_TEST_PATH"` - KeygenPath string `ini:"SSH_KEYGEN_PATH"` - MinimumKeySizeCheck bool `ini:"-"` - MinimumKeySizes map[string]int `ini:"-"` + Disabled bool `ini:"DISABLE_SSH"` + StartBuiltinServer bool `ini:"START_SSH_SERVER"` + Domain string `ini:"SSH_DOMAIN"` + Port int `ini:"SSH_PORT"` + ListenHost string `ini:"SSH_LISTEN_HOST"` + ListenPort int `ini:"SSH_LISTEN_PORT"` + RootPath string `ini:"SSH_ROOT_PATH"` + KeyTestPath string `ini:"SSH_KEY_TEST_PATH"` + KeygenPath string `ini:"SSH_KEYGEN_PATH"` + AuthorizedKeysBackup bool `ini:"SSH_AUTHORIZED_KEYS_BACKUP"` + MinimumKeySizeCheck bool `ini:"-"` + MinimumKeySizes map[string]int `ini:"-"` + ExposeAnonymous bool `ini:"SSH_EXPOSE_ANONYMOUS"` }{ Disabled: false, StartBuiltinServer: false, @@ -171,6 +177,11 @@ var ( FileMaxSize int64 MaxFiles int } `ini:"-"` + + // Repository local settings + Local struct { + LocalCopyPath string + } `ini:"-"` }{ AnsiCharset: "", ForcePrivate: false, @@ -203,6 +214,13 @@ var ( FileMaxSize: 3, MaxFiles: 5, }, + + // Repository local settings + Local: struct { + LocalCopyPath string + }{ + LocalCopyPath: "tmp/local-repo", + }, } RepoRootPath string ScriptType = "bash" @@ -225,6 +243,11 @@ var ( User struct { RepoPagingNum int } `ini:"ui.user"` + Meta struct { + Author string + Description string + Keywords string + } `ini:"ui.meta"` }{ ExplorePagingNum: 20, IssuePagingNum: 10, @@ -247,9 +270,18 @@ var ( }{ RepoPagingNum: 15, }, + Meta: struct { + Author string + Description string + Keywords string + }{ + Author: "Gitea - Git with a cup of tea", + Description: "Gitea (Git with a cup of tea) is a painless self-hosted Git service written in Go", + Keywords: "go,git,self-hosted,gitea", + }, } - // Markdown sttings + // Markdown settings Markdown = struct { EnableHardLineBreak bool CustomURLSchemes []string `ini:"CUSTOM_URL_SCHEMES"` @@ -320,6 +352,12 @@ var ( Schedule string OlderThan time.Duration } `ini:"cron.archive_cleanup"` + SyncExternalUsers struct { + Enabled bool + RunAtStart bool + Schedule string + UpdateExisting bool + } `ini:"cron.sync_external_users"` }{ UpdateMirror: struct { Enabled bool @@ -363,6 +401,17 @@ var ( Schedule: "@every 24h", OlderThan: 24 * time.Hour, }, + SyncExternalUsers: struct { + Enabled bool + RunAtStart bool + Schedule string + UpdateExisting bool + }{ + Enabled: true, + RunAtStart: false, + Schedule: "@every 24h", + UpdateExisting: true, + }, } // Git settings @@ -402,10 +451,9 @@ var ( } // Mirror settings - Mirror = struct { - DefaultInterval int - }{ - DefaultInterval: 8, + Mirror struct { + DefaultInterval time.Duration + MinInterval time.Duration } // API settings @@ -420,7 +468,7 @@ var ( Names []string dateLangs map[string]string - // Highlight settings are loaded in modules/template/hightlight.go + // Highlight settings are loaded in modules/template/highlight.go // Other settings ShowFooterBranding bool @@ -428,14 +476,15 @@ var ( ShowFooterTemplateLoadTime bool // Global setting objects - Cfg *ini.File - CustomPath string // Custom directory path - CustomConf string - CustomPID string - ProdMode bool - RunUser string - IsWindows bool - HasRobotsTxt bool + Cfg *ini.File + CustomPath string // Custom directory path + CustomConf string + CustomPID string + ProdMode bool + RunUser string + IsWindows bool + HasRobotsTxt bool + InternalToken string // internal access token ) // DateLang transforms standard language locale name to corresponding value in datetime plugin. @@ -537,21 +586,9 @@ func NewContext() { Cfg = ini.Empty() - if err != nil { - log.Fatal(4, "Failed to parse 'app.ini': %v", err) - } - CustomPath = os.Getenv("GITEA_CUSTOM") if len(CustomPath) == 0 { - // For backward compatibility - // TODO: drop in 1.1.0 ? - CustomPath = os.Getenv("GOGS_CUSTOM") - if len(CustomPath) == 0 { - CustomPath = workDir + "/custom" - } else { - log.Warn(`Usage of GOGS_CUSTOM is deprecated and will be *removed* in a future release, -please consider changing to GITEA_CUSTOM`) - } + CustomPath = workDir + "/custom" } if len(CustomPID) > 0 { @@ -560,6 +597,8 @@ please consider changing to GITEA_CUSTOM`) if len(CustomConf) == 0 { CustomConf = CustomPath + "/conf/app.ini" + } else if !filepath.IsAbs(CustomConf) { + CustomConf = filepath.Join(workDir, CustomConf) } if com.IsFile(CustomConf) { @@ -582,18 +621,6 @@ please consider changing to GITEA_CUSTOM`) sec := Cfg.Section("server") AppName = Cfg.Section("").Key("APP_NAME").MustString("Gitea: Git with a cup of tea") - AppURL = sec.Key("ROOT_URL").MustString("http://localhost:3000/") - AppURL = strings.TrimRight(AppURL, "/") + "/" - - // Check if has app suburl. - url, err := url.Parse(AppURL) - if err != nil { - log.Fatal(4, "Invalid ROOT_URL '%s': %s", AppURL, err) - } - // Suburl should start with '/' and end without '/', such as '/{subpath}'. - // This value is empty if site does not have sub-url. - AppSubURL = strings.TrimSuffix(url.Path, "/") - AppSubURLDepth = strings.Count(AppSubURL, "/") Protocol = HTTP if sec.Key("PROTOCOL").String() == "https" { @@ -614,7 +641,46 @@ please consider changing to GITEA_CUSTOM`) Domain = sec.Key("DOMAIN").MustString("localhost") HTTPAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0") HTTPPort = sec.Key("HTTP_PORT").MustString("3000") - LocalURL = sec.Key("LOCAL_ROOT_URL").MustString(string(Protocol) + "://localhost:" + HTTPPort + "/") + + defaultAppURL := string(Protocol) + "://" + Domain + if (Protocol == HTTP && HTTPPort != "80") || (Protocol == HTTPS && HTTPPort != "443") { + defaultAppURL += ":" + HTTPPort + } + AppURL = sec.Key("ROOT_URL").MustString(defaultAppURL) + AppURL = strings.TrimRight(AppURL, "/") + "/" + + // Check if has app suburl. + url, err := url.Parse(AppURL) + if err != nil { + log.Fatal(4, "Invalid ROOT_URL '%s': %s", AppURL, err) + } + // Suburl should start with '/' and end without '/', such as '/{subpath}'. + // This value is empty if site does not have sub-url. + AppSubURL = strings.TrimSuffix(url.Path, "/") + AppSubURLDepth = strings.Count(AppSubURL, "/") + // Check if Domain differs from AppURL domain than update it to AppURL's domain + // TODO: Can be replaced with url.Hostname() when minimal GoLang version is 1.8 + urlHostname := strings.SplitN(url.Host, ":", 2)[0] + if urlHostname != Domain && net.ParseIP(urlHostname) == nil { + Domain = urlHostname + } + + var defaultLocalURL string + switch Protocol { + case UnixSocket: + defaultLocalURL = "http://unix/" + case FCGI: + defaultLocalURL = AppURL + default: + defaultLocalURL = string(Protocol) + "://" + if HTTPAddr == "0.0.0.0" { + defaultLocalURL += "localhost" + } else { + defaultLocalURL += HTTPAddr + } + defaultLocalURL += ":" + HTTPPort + "/" + } + LocalURL = sec.Key("LOCAL_ROOT_URL").MustString(defaultLocalURL) OfflineMode = sec.Key("OFFLINE_MODE").MustBool() DisableRouterLog = sec.Key("DISABLE_ROUTER_LOG").MustBool() StaticRootPath = sec.Key("STATIC_ROOT_PATH").MustString(workDir) @@ -663,6 +729,8 @@ please consider changing to GITEA_CUSTOM`) SSH.MinimumKeySizes[strings.ToLower(key.Name())] = key.MustInt() } } + SSH.AuthorizedKeysBackup = sec.Key("SSH_AUTHORIZED_KEYS_BACKUP").MustBool(true) + SSH.ExposeAnonymous = sec.Key("SSH_EXPOSE_ANONYMOUS").MustBool(false) if err = Cfg.Section("server").MapTo(&LFS); err != nil { log.Fatal(4, "Failed to map LFS settings: %v", err) @@ -716,7 +784,7 @@ please consider changing to GITEA_CUSTOM`) log.Fatal(4, "Error retrieving git version: %v", err) } - splitVersion := strings.SplitN(binVersion, ".", 3) + splitVersion := strings.SplitN(binVersion, ".", 4) majorVersion, err := strconv.ParseUint(splitVersion[0], 10, 64) if err != nil { @@ -754,6 +822,43 @@ please consider changing to GITEA_CUSTOM`) ReverseProxyAuthUser = sec.Key("REVERSE_PROXY_AUTHENTICATION_USER").MustString("X-WEBAUTH-USER") MinPasswordLength = sec.Key("MIN_PASSWORD_LENGTH").MustInt(6) ImportLocalPaths = sec.Key("IMPORT_LOCAL_PATHS").MustBool(false) + InternalToken = sec.Key("INTERNAL_TOKEN").String() + if len(InternalToken) == 0 { + secretBytes := make([]byte, 32) + _, err := io.ReadFull(rand.Reader, secretBytes) + if err != nil { + log.Fatal(4, "Error reading random bytes: %v", err) + } + + secretKey := base64.RawURLEncoding.EncodeToString(secretBytes) + + now := time.Now() + InternalToken, err = jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "nbf": now.Unix(), + }).SignedString([]byte(secretKey)) + + if err != nil { + log.Fatal(4, "Error generate internal token: %v", err) + } + + // Save secret + cfgSave := ini.Empty() + if com.IsFile(CustomConf) { + // Keeps custom settings if there is already something. + if err := cfgSave.Append(CustomConf); err != nil { + log.Error(4, "Failed to load custom conf '%s': %v", CustomConf, err) + } + } + + cfgSave.Section("security").Key("INTERNAL_TOKEN").SetValue(InternalToken) + + if err := os.MkdirAll(filepath.Dir(CustomConf), os.ModePerm); err != nil { + log.Fatal(4, "Failed to create '%s': %v", CustomConf, err) + } + if err := cfgSave.SaveTo(CustomConf); err != nil { + log.Fatal(4, "Error saving generated JWT Secret to custom config: %v", err) + } + } sec = Cfg.Section("attachment") AttachmentPath = sec.Key("PATH").MustString(path.Join(AppDataPath, "attachments")) @@ -805,6 +910,7 @@ please consider changing to GITEA_CUSTOM`) // Determine and create root git repository path. sec = Cfg.Section("repository") Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool() + Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1) RepoRootPath = sec.Key("ROOT").MustString(path.Join(homeDir, "gitea-repositories")) forcePathSeparator(RepoRootPath) if !filepath.IsAbs(RepoRootPath) { @@ -819,6 +925,8 @@ please consider changing to GITEA_CUSTOM`) log.Fatal(4, "Failed to map Repository.Editor settings: %v", err) } else if err = Cfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil { log.Fatal(4, "Failed to map Repository.Upload settings: %v", err) + } else if err = Cfg.Section("repository.local").MapTo(&Repository.Local); err != nil { + log.Fatal(4, "Failed to map Repository.Local settings: %v", err) } if !filepath.IsAbs(Repository.Upload.TempPath) { @@ -875,14 +983,20 @@ please consider changing to GITEA_CUSTOM`) log.Fatal(4, "Failed to map Cron settings: %v", err) } else if err = Cfg.Section("git").MapTo(&Git); err != nil { log.Fatal(4, "Failed to map Git settings: %v", err) - } else if err = Cfg.Section("mirror").MapTo(&Mirror); err != nil { - log.Fatal(4, "Failed to map Mirror settings: %v", err) } else if err = Cfg.Section("api").MapTo(&API); err != nil { log.Fatal(4, "Failed to map API settings: %v", err) } - if Mirror.DefaultInterval <= 0 { - Mirror.DefaultInterval = 24 + sec = Cfg.Section("mirror") + Mirror.MinInterval = sec.Key("MIN_INTERVAL").MustDuration(10 * time.Minute) + Mirror.DefaultInterval = sec.Key("DEFAULT_INTERVAL").MustDuration(8 * time.Hour) + if Mirror.MinInterval.Minutes() < 1 { + log.Warn("Mirror.MinInterval is too low") + Mirror.MinInterval = 1 * time.Minute + } + if Mirror.DefaultInterval < Mirror.MinInterval { + log.Warn("Mirror.DefaultInterval is less than Mirror.MinInterval") + Mirror.DefaultInterval = time.Hour * 8 } Langs = Cfg.Section("i18n").Key("LANGS").Strings(",") @@ -917,7 +1031,14 @@ var Service struct { EnableReverseProxyAutoRegister bool EnableCaptcha bool DefaultKeepEmailPrivate bool + DefaultAllowCreateOrganization bool NoReplyAddress string + + // OpenID settings + EnableOpenIDSignIn bool + EnableOpenIDSignUp bool + OpenIDWhitelist []*regexp.Regexp + OpenIDBlacklist []*regexp.Regexp } func newService() { @@ -931,7 +1052,27 @@ func newService() { Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool() Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool() Service.DefaultKeepEmailPrivate = sec.Key("DEFAULT_KEEP_EMAIL_PRIVATE").MustBool() + Service.DefaultAllowCreateOrganization = sec.Key("DEFAULT_ALLOW_CREATE_ORGANIZATION").MustBool(true) Service.NoReplyAddress = sec.Key("NO_REPLY_ADDRESS").MustString("noreply.example.org") + + sec = Cfg.Section("openid") + Service.EnableOpenIDSignIn = sec.Key("ENABLE_OPENID_SIGNIN").MustBool(false) + Service.EnableOpenIDSignUp = sec.Key("ENABLE_OPENID_SIGNUP").MustBool(!Service.DisableRegistration && Service.EnableOpenIDSignIn) + pats := sec.Key("WHITELISTED_URIS").Strings(" ") + if len(pats) != 0 { + Service.OpenIDWhitelist = make([]*regexp.Regexp, len(pats)) + for i, p := range pats { + Service.OpenIDWhitelist[i] = regexp.MustCompilePOSIX(p) + } + } + pats = sec.Key("BLACKLISTED_URIS").Strings(" ") + if len(pats) != 0 { + Service.OpenIDBlacklist = make([]*regexp.Regexp, len(pats)) + for i, p := range pats { + Service.OpenIDBlacklist[i] = regexp.MustCompilePOSIX(p) + } + } + } var logLevels = map[string]string{ @@ -1137,11 +1278,11 @@ func newSessionService() { // Mailer represents mail service. type Mailer struct { // Mailer - QueueLength int - Name string - From string - FromEmail string - EnableHTMLAlternative bool + QueueLength int + Name string + From string + FromEmail string + SendAsPlainText bool // SMTP sender Host string @@ -1170,9 +1311,9 @@ func newMailService() { } MailService = &Mailer{ - QueueLength: sec.Key("SEND_BUFFER_LEN").MustInt(100), - Name: sec.Key("NAME").MustString(AppName), - EnableHTMLAlternative: sec.Key("ENABLE_HTML_ALTERNATIVE").MustBool(), + QueueLength: sec.Key("SEND_BUFFER_LEN").MustInt(100), + Name: sec.Key("NAME").MustString(AppName), + SendAsPlainText: sec.Key("SEND_AS_PLAIN_TEXT").MustBool(false), Host: sec.Key("HOST").String(), User: sec.Key("USER").String(), @@ -1189,6 +1330,11 @@ func newMailService() { } MailService.From = sec.Key("FROM").MustString(MailService.User) + if sec.HasKey("ENABLE_HTML_ALTERNATIVE") { + log.Warn("ENABLE_HTML_ALTERNATIVE is deprecated, use SEND_AS_PLAIN_TEXT") + MailService.SendAsPlainText = !sec.Key("ENABLE_HTML_ALTERNATIVE").MustBool(false) + } + parsed, err := mail.ParseAddress(MailService.From) if err != nil { log.Fatal(4, "Invalid mailer.FROM (%s): %v", MailService.From, err) @@ -1225,7 +1371,7 @@ func newWebhookService() { Webhook.QueueLength = sec.Key("QUEUE_LENGTH").MustInt(1000) Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5) Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool() - Webhook.Types = []string{"gogs", "slack"} + Webhook.Types = []string{"gitea", "gogs", "slack"} Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10) } diff --git a/modules/sync/exclusive_pool.go b/modules/sync/exclusive_pool.go index 744cc7c..7c1a893 100644 --- a/modules/sync/exclusive_pool.go +++ b/modules/sync/exclusive_pool.go @@ -39,7 +39,7 @@ func NewExclusivePool() *ExclusivePool { } // CheckIn checks in an instance to the pool and hangs while instance -// with same indentity is using the lock. +// with same identity is using the lock. func (p *ExclusivePool) CheckIn(identity string) { p.lock.Lock() diff --git a/modules/sync/status_pool.go b/modules/sync/status_pool.go index 46d15aa..acbd93a 100644 --- a/modules/sync/status_pool.go +++ b/modules/sync/status_pool.go @@ -24,6 +24,18 @@ func NewStatusTable() *StatusTable { } } +// StartIfNotRunning sets value of given name to true if not already in pool. +// Returns whether set value was set to true +func (p *StatusTable) StartIfNotRunning(name string) bool { + p.lock.Lock() + _, ok := p.pool[name] + if !ok { + p.pool[name] = struct{}{} + } + p.lock.Unlock() + return !ok +} + // Start sets value of given name to true in the pool. func (p *StatusTable) Start(name string) { p.lock.Lock() diff --git a/modules/sync/status_pool_test.go b/modules/sync/status_pool_test.go index eef3ff6..b388c50 100644 --- a/modules/sync/status_pool_test.go +++ b/modules/sync/status_pool_test.go @@ -18,6 +18,15 @@ func Test_StatusTable(t *testing.T) { table.Start("xyz") assert.True(t, table.IsRunning("xyz")) + assert.False(t, table.StartIfNotRunning("xyz")) + assert.True(t, table.IsRunning("xyz")) + + table.Stop("xyz") + assert.False(t, table.IsRunning("xyz")) + + assert.True(t, table.StartIfNotRunning("xyz")) + assert.True(t, table.IsRunning("xyz")) + table.Stop("xyz") assert.False(t, table.IsRunning("xyz")) } diff --git a/modules/sync/unique_queue.go b/modules/sync/unique_queue.go index 7dcaa16..ca7c21a 100644 --- a/modules/sync/unique_queue.go +++ b/modules/sync/unique_queue.go @@ -36,7 +36,7 @@ func (q *UniqueQueue) Queue() <-chan string { return q.queue } -// Exist returns true if there is an instance with given indentity +// Exist returns true if there is an instance with given identity // exists in the queue. func (q *UniqueQueue) Exist(id interface{}) bool { return q.table.IsRunning(com.ToStr(id)) diff --git a/modules/templates/helper.go b/modules/templates/helper.go index fc02158..821ff6c 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -66,6 +66,7 @@ func NewFuncMap() []template.FuncMap { }, "AvatarLink": base.AvatarLink, "Safe": Safe, + "SafeJS": SafeJS, "Sanitize": bluemonday.UGCPolicy().Sanitize, "Str2html": Str2html, "TimeSince": base.TimeSince, @@ -82,6 +83,9 @@ func NewFuncMap() []template.FuncMap { "DateFmtShort": func(t time.Time) string { return t.Format("Jan 02, 2006") }, + "SizeFmt": func(s int64) string { + return base.FileSize(s) + }, "List": List, "SubStr": func(str string, start, length int) string { if len(str) == 0 { @@ -110,6 +114,15 @@ func NewFuncMap() []template.FuncMap { "ThemeColorMetaTag": func() string { return setting.UI.ThemeColorMetaTag }, + "MetaAuthor": func() string { + return setting.UI.Meta.Author + }, + "MetaDescription": func() string { + return setting.UI.Meta.Description + }, + "MetaKeywords": func() string { + return setting.UI.Meta.Keywords + }, "FilenameIsImage": func(filename string) bool { mimeType := mime.TypeByExtension(filepath.Ext(filename)) return strings.HasPrefix(mimeType, "image/") @@ -150,6 +163,11 @@ func Safe(raw string) template.HTML { return template.HTML(raw) } +// SafeJS renders raw as JS +func SafeJS(raw string) template.JS { + return template.JS(raw) +} + // Str2html render Markdown text to HTML func Str2html(raw string) template.HTML { return template.HTML(markdown.Sanitize(raw)) diff --git a/modules/test/context_tests.go b/modules/test/context_tests.go new file mode 100644 index 0000000..6bb7ffe --- /dev/null +++ b/modules/test/context_tests.go @@ -0,0 +1,150 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package test + +import ( + "net/http" + "net/url" + "testing" + + "code.gitea.io/gitea/modules/context" + + "github.com/stretchr/testify/assert" + macaron "gopkg.in/macaron.v1" +) + +// MockContext mock context for unit tests +func MockContext(t *testing.T) *context.Context { + var macaronContext *macaron.Context + mac := macaron.New() + mac.Get("*/", func(ctx *macaron.Context) { + macaronContext = ctx + }) + req, err := http.NewRequest("GET", "star", nil) + assert.NoError(t, err) + req.Form = url.Values{} + mac.ServeHTTP(&mockResponseWriter{}, req) + assert.NotNil(t, macaronContext) + assert.EqualValues(t, req, macaronContext.Req.Request) + macaronContext.Locale = &mockLocale{} + macaronContext.Resp = &mockResponseWriter{} + macaronContext.Render = &mockRender{ResponseWriter: macaronContext.Resp} + return &context.Context{ + Context: macaronContext, + } +} + +type mockLocale struct{} + +func (l mockLocale) Language() string { + return "en" +} + +func (l mockLocale) Tr(s string, _ ...interface{}) string { + return "test translation" +} + +type mockResponseWriter struct { + status int + size int +} + +func (rw *mockResponseWriter) Header() http.Header { + return map[string][]string{} +} + +func (rw *mockResponseWriter) Write(b []byte) (int, error) { + rw.size += len(b) + return len(b), nil +} + +func (rw *mockResponseWriter) WriteHeader(status int) { + rw.status = status +} + +func (rw *mockResponseWriter) Flush() { +} + +func (rw *mockResponseWriter) Status() int { + return rw.status +} + +func (rw *mockResponseWriter) Written() bool { + return rw.status > 0 +} + +func (rw *mockResponseWriter) Size() int { + return rw.size +} + +func (rw *mockResponseWriter) Before(b macaron.BeforeFunc) { + b(rw) +} + +type mockRender struct { + http.ResponseWriter +} + +func (tr *mockRender) SetResponseWriter(rw http.ResponseWriter) { + tr.ResponseWriter = rw +} + +func (tr *mockRender) JSON(int, interface{}) { +} + +func (tr *mockRender) JSONString(interface{}) (string, error) { + return "", nil +} + +func (tr *mockRender) RawData(status int, _ []byte) { + tr.Status(status) +} + +func (tr *mockRender) PlainText(status int, _ []byte) { + tr.Status(status) +} + +func (tr *mockRender) HTML(status int, _ string, _ interface{}, _ ...macaron.HTMLOptions) { + tr.Status(status) +} + +func (tr *mockRender) HTMLSet(status int, _ string, _ string, _ interface{}, _ ...macaron.HTMLOptions) { + tr.Status(status) +} + +func (tr *mockRender) HTMLSetString(string, string, interface{}, ...macaron.HTMLOptions) (string, error) { + return "", nil +} + +func (tr *mockRender) HTMLString(string, interface{}, ...macaron.HTMLOptions) (string, error) { + return "", nil +} + +func (tr *mockRender) HTMLSetBytes(string, string, interface{}, ...macaron.HTMLOptions) ([]byte, error) { + return nil, nil +} + +func (tr *mockRender) HTMLBytes(string, interface{}, ...macaron.HTMLOptions) ([]byte, error) { + return nil, nil +} + +func (tr *mockRender) XML(status int, _ interface{}) { + tr.Status(status) +} + +func (tr *mockRender) Error(status int, _ ...string) { + tr.Status(status) +} + +func (tr *mockRender) Status(status int) { + tr.ResponseWriter.WriteHeader(status) +} + +func (tr *mockRender) SetTemplatePath(string, string) { +} + +func (tr *mockRender) HasTemplateSet(string) bool { + return true +} diff --git a/modules/util/remove.go b/modules/util/remove.go new file mode 100644 index 0000000..8bca149 --- /dev/null +++ b/modules/util/remove.go @@ -0,0 +1,14 @@ +// +build !windows,!go1.7 go1.7 + +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package util + +import "os" + +// RemoveAll files from Go version 1.7 onward +func RemoveAll(path string) error { + return os.RemoveAll(path) +} diff --git a/modules/util/remove_windows.go b/modules/util/remove_windows.go new file mode 100644 index 0000000..f5891a5 --- /dev/null +++ b/modules/util/remove_windows.go @@ -0,0 +1,16 @@ +// +build windows,!go1.7 + +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package util + +// RemoveAll files from path on windows +// workaround for Go not being able to remove read-only files/folders: https://github.com/golang/go/issues/9606 +// this bug should be fixed on Go 1.7, so the workaround should be removed when Gitea don't support Go 1.6 anymore: +// https://github.com/golang/go/commit/2ffb3e5d905b5622204d199128dec06cefd57790 +func RemoveAll(path string) error { + path = strings.Replace(path, "/", "\\", -1) + return exec.Command("cmd", "/C", "rmdir", "/S", "/Q", path).Run() +} diff --git a/modules/validation/binding.go b/modules/validation/binding.go new file mode 100644 index 0000000..783499e --- /dev/null +++ b/modules/validation/binding.go @@ -0,0 +1,102 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package validation + +import ( + "fmt" + "net/url" + "regexp" + "strings" + + "github.com/go-macaron/binding" +) + +const ( + // ErrGitRefName is git reference name error + ErrGitRefName = "GitRefNameError" +) + +var ( + // GitRefNamePattern is regular expression wirh unallowed characters in git reference name + GitRefNamePattern = regexp.MustCompile("[^\\d\\w-_\\./]") +) + +// AddBindingRules adds additional binding rules +func AddBindingRules() { + addGitRefNameBindingRule() + addValidURLBindingRule() +} + +func addGitRefNameBindingRule() { + // Git refname validation rule + binding.AddRule(&binding.Rule{ + IsMatch: func(rule string) bool { + return strings.HasPrefix(rule, "GitRefName") + }, + IsValid: func(errs binding.Errors, name string, val interface{}) (bool, binding.Errors) { + str := fmt.Sprintf("%v", val) + + if GitRefNamePattern.MatchString(str) { + errs.Add([]string{name}, ErrGitRefName, "GitRefName") + return false, errs + } + // Additional rules as described at https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html + if strings.HasPrefix(str, "/") || strings.HasSuffix(str, "/") || + strings.HasPrefix(str, ".") || strings.HasSuffix(str, ".") || + strings.HasSuffix(str, ".lock") || + strings.Contains(str, "..") || strings.Contains(str, "//") { + errs.Add([]string{name}, ErrGitRefName, "GitRefName") + return false, errs + } + + return true, errs + }, + }) +} + +func addValidURLBindingRule() { + // URL validation rule + binding.AddRule(&binding.Rule{ + IsMatch: func(rule string) bool { + return strings.HasPrefix(rule, "ValidUrl") + }, + IsValid: func(errs binding.Errors, name string, val interface{}) (bool, binding.Errors) { + str := fmt.Sprintf("%v", val) + if len(str) != 0 { + if u, err := url.ParseRequestURI(str); err != nil || + (u.Scheme != "http" && u.Scheme != "https") || + !validPort(portOnly(u.Host)) { + errs.Add([]string{name}, binding.ERR_URL, "Url") + return false, errs + } + } + + return true, errs + }, + }) +} + +func portOnly(hostport string) string { + colon := strings.IndexByte(hostport, ':') + if colon == -1 { + return "" + } + if i := strings.Index(hostport, "]:"); i != -1 { + return hostport[i+len("]:"):] + } + if strings.Contains(hostport, "]") { + return "" + } + return hostport[colon+len(":"):] +} + +func validPort(p string) bool { + for _, r := range []byte(p) { + if r < '0' || r > '9' { + return false + } + } + return true +} diff --git a/modules/validation/binding_test.go b/modules/validation/binding_test.go new file mode 100644 index 0000000..7bc41ac --- /dev/null +++ b/modules/validation/binding_test.go @@ -0,0 +1,62 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package validation + +import ( + "fmt" + "net/http" + "net/http/httptest" + "testing" + + "github.com/go-macaron/binding" + "github.com/stretchr/testify/assert" + "gopkg.in/macaron.v1" +) + +const ( + testRoute = "/test" +) + +type ( + validationTestCase struct { + description string + data interface{} + expectedErrors binding.Errors + } + + handlerFunc func(interface{}, ...interface{}) macaron.Handler + + modeler interface { + Model() string + } + + TestForm struct { + BranchName string `form:"BranchName" binding:"GitRefName"` + URL string `form:"ValidUrl" binding:"ValidUrl"` + } +) + +func performValidationTest(t *testing.T, testCase validationTestCase) { + httpRecorder := httptest.NewRecorder() + m := macaron.Classic() + + m.Post(testRoute, binding.Validate(testCase.data), func(actual binding.Errors) { + assert.Equal(t, fmt.Sprintf("%+v", testCase.expectedErrors), fmt.Sprintf("%+v", actual)) + }) + + req, err := http.NewRequest("POST", testRoute, nil) + if err != nil { + panic(err) + } + + m.ServeHTTP(httpRecorder, req) + + switch httpRecorder.Code { + case http.StatusNotFound: + panic("Routing is messed up in test fixture (got 404): check methods and paths") + case http.StatusInternalServerError: + panic("Something bad happened on '" + testCase.description + "'") + } +} diff --git a/modules/validation/refname_test.go b/modules/validation/refname_test.go new file mode 100644 index 0000000..b101ffa --- /dev/null +++ b/modules/validation/refname_test.go @@ -0,0 +1,142 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package validation + +import ( + "testing" + + "github.com/go-macaron/binding" +) + +var gitRefNameValidationTestCases = []validationTestCase{ + { + description: "Referece contains only characters", + data: TestForm{ + BranchName: "test", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "Reference name contains single slash", + data: TestForm{ + BranchName: "feature/test", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "Reference name contains backslash", + data: TestForm{ + BranchName: "feature\\test", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"BranchName"}, + Classification: ErrGitRefName, + Message: "GitRefName", + }, + }, + }, + { + description: "Reference name starts with dot", + data: TestForm{ + BranchName: ".test", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"BranchName"}, + Classification: ErrGitRefName, + Message: "GitRefName", + }, + }, + }, + { + description: "Reference name ends with dot", + data: TestForm{ + BranchName: "test.", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"BranchName"}, + Classification: ErrGitRefName, + Message: "GitRefName", + }, + }, + }, + { + description: "Reference name starts with slash", + data: TestForm{ + BranchName: "/test", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"BranchName"}, + Classification: ErrGitRefName, + Message: "GitRefName", + }, + }, + }, + { + description: "Reference name ends with slash", + data: TestForm{ + BranchName: "test/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"BranchName"}, + Classification: ErrGitRefName, + Message: "GitRefName", + }, + }, + }, + { + description: "Reference name ends with .lock", + data: TestForm{ + BranchName: "test.lock", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"BranchName"}, + Classification: ErrGitRefName, + Message: "GitRefName", + }, + }, + }, + { + description: "Reference name contains multiple consecutive dots", + data: TestForm{ + BranchName: "te..st", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"BranchName"}, + Classification: ErrGitRefName, + Message: "GitRefName", + }, + }, + }, + { + description: "Reference name contains multiple consecutive slashes", + data: TestForm{ + BranchName: "te//st", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"BranchName"}, + Classification: ErrGitRefName, + Message: "GitRefName", + }, + }, + }, +} + +func Test_GitRefNameValidation(t *testing.T) { + AddBindingRules() + + for _, testCase := range gitRefNameValidationTestCases { + t.Run(testCase.description, func(t *testing.T) { + performValidationTest(t, testCase) + }) + } +} diff --git a/modules/validation/validurl_test.go b/modules/validation/validurl_test.go new file mode 100644 index 0000000..ba4d7d5 --- /dev/null +++ b/modules/validation/validurl_test.go @@ -0,0 +1,111 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package validation + +import ( + "testing" + + "github.com/go-macaron/binding" +) + +var urlValidationTestCases = []validationTestCase{ + { + description: "Empty URL", + data: TestForm{ + URL: "", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "URL without port", + data: TestForm{ + URL: "http://test.lan/", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "URL with port", + data: TestForm{ + URL: "http://test.lan:3000/", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "URL with IPv6 address without port", + data: TestForm{ + URL: "http://[::1]/", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "URL with IPv6 address with port", + data: TestForm{ + URL: "http://[::1]:3000/", + }, + expectedErrors: binding.Errors{}, + }, + { + description: "Invalid URL", + data: TestForm{ + URL: "http//test.lan/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URL"}, + Classification: binding.ERR_URL, + Message: "Url", + }, + }, + }, + { + description: "Invalid schema", + data: TestForm{ + URL: "ftp://test.lan/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URL"}, + Classification: binding.ERR_URL, + Message: "Url", + }, + }, + }, + { + description: "Invalid port", + data: TestForm{ + URL: "http://test.lan:3x4/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URL"}, + Classification: binding.ERR_URL, + Message: "Url", + }, + }, + }, + { + description: "Invalid port with IPv6 address", + data: TestForm{ + URL: "http://[::1]:3x4/", + }, + expectedErrors: binding.Errors{ + binding.Error{ + FieldNames: []string{"URL"}, + Classification: binding.ERR_URL, + Message: "Url", + }, + }, + }, +} + +func Test_ValidURLValidation(t *testing.T) { + AddBindingRules() + + for _, testCase := range urlValidationTestCases { + t.Run(testCase.description, func(t *testing.T) { + performValidationTest(t, testCase) + }) + } +} diff --git a/options/gitignore/Actionscript b/options/gitignore/Actionscript index f112f7f..11e612e 100644 --- a/options/gitignore/Actionscript +++ b/options/gitignore/Actionscript @@ -2,10 +2,18 @@ bin/ bin-debug/ bin-release/ +[Oo]bj/ # FlashDevelop obj +[Bb]in/ # FlashDevelop bin # Other files and folders .settings/ +# Executables +*.swf +*.air +*.ipa +*.apk + # Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` # should NOT be excluded as they contain compiler settings and other important # information for Eclipse / Flash Builder. diff --git a/options/gitignore/Android b/options/gitignore/Android index c9c2248..520a863 100644 --- a/options/gitignore/Android +++ b/options/gitignore/Android @@ -2,7 +2,7 @@ *.apk *.ap_ -# Files for the Dalvik VM +# Files for the ART/Dalvik VM *.dex # Java class files @@ -11,6 +11,7 @@ # Generated files bin/ gen/ +out/ # Gradle files .gradle/ @@ -30,3 +31,25 @@ proguard/ # Android Studio captures folder captures/ + +# Intellij +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/dictionaries +.idea/libraries + +# Keystore files +*.jks + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json diff --git a/options/gitignore/Ansible b/options/gitignore/Ansible new file mode 100644 index 0000000..a8b42eb --- /dev/null +++ b/options/gitignore/Ansible @@ -0,0 +1 @@ +*.retry diff --git a/options/gitignore/Autotools b/options/gitignore/Autotools index 053ff52..e3923f9 100644 --- a/options/gitignore/Autotools +++ b/options/gitignore/Autotools @@ -1,14 +1,33 @@ # http://www.gnu.org/software/automake Makefile.in +/ar-lib +/mdate-sh +/py-compile +/test-driver +/ylwrap # http://www.gnu.org/software/autoconf /autom4te.cache +/autoscan.log +/autoscan-*.log /aclocal.m4 /compile +/config.guess +/config.h.in +/config.sub /configure +/configure.scan /depcomp /install-sh /missing /stamp-h1 + +# https://www.gnu.org/software/libtool/ + +/ltmain.sh + +# http://www.gnu.org/software/texinfo + +/texinfo.tex diff --git a/options/gitignore/Bazaar b/options/gitignore/Bazaar new file mode 100644 index 0000000..3cbbcbd --- /dev/null +++ b/options/gitignore/Bazaar @@ -0,0 +1,2 @@ +.bzr/ +.bzrignore diff --git a/options/gitignore/C b/options/gitignore/C index bbf313b..8a365b3 100644 --- a/options/gitignore/C +++ b/options/gitignore/C @@ -1,9 +1,17 @@ +# Prerequisites +*.d + # Object files *.o *.ko *.obj *.elf +# Linker output +*.ilk +*.map +*.exp + # Precompiled Headers *.gch *.pch @@ -30,3 +38,14 @@ # Debug files *.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +modules.order +Module.symvers +Mkfile.old +dkms.conf diff --git a/options/gitignore/C Sharp b/options/gitignore/C Sharp deleted file mode 100644 index f638296..0000000 --- a/options/gitignore/C Sharp +++ /dev/null @@ -1,108 +0,0 @@ -# Build Folders (you can keep bin if you'd like, to store dlls and pdbs) -[Bb]in/ -[Oo]bj/ - -# mstest test results -TestResults - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results -[Dd]ebug/ -[Rr]elease/ -x64/ -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.log -*.vspscc -*.vssscc -.builds - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper* - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# Installshield output folder -[Ee]xpress - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish - -# Publish Web Output -*.Publish.xml - -# NuGet Packages Directory -packages - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others -[Bb]in -[Oo]bj -sql -TestResults -[Tt]est[Rr]esult* -*.Cache -ClientBin -[Ss]tyle[Cc]op.* -~$* -*.dbmdl -Generated_Code #added for RIA/Silverlight projects - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML diff --git a/options/gitignore/C++ b/options/gitignore/C++ index b8bd026..259148f 100644 --- a/options/gitignore/C++ +++ b/options/gitignore/C++ @@ -1,3 +1,6 @@ +# Prerequisites +*.d + # Compiled Object files *.slo *.lo @@ -15,6 +18,7 @@ # Fortran module files *.mod +*.smod # Compiled Static libraries *.lai diff --git a/options/gitignore/CMake b/options/gitignore/CMake index b558e9a..9ea395f 100644 --- a/options/gitignore/CMake +++ b/options/gitignore/CMake @@ -1,6 +1,9 @@ CMakeCache.txt CMakeFiles CMakeScripts +Testing Makefile cmake_install.cmake install_manifest.txt +compile_commands.json +CTestTestfile.cmake diff --git a/options/gitignore/CVS b/options/gitignore/CVS index 01ba863..1695352 100644 --- a/options/gitignore/CVS +++ b/options/gitignore/CVS @@ -1,4 +1,4 @@ /CVS/* -*/CVS/* +**/CVS/* .cvsignore */.cvsignore diff --git a/options/gitignore/CakePHP b/options/gitignore/CakePHP index 55a665e..c6597e4 100644 --- a/options/gitignore/CakePHP +++ b/options/gitignore/CakePHP @@ -2,8 +2,20 @@ /vendor/* /config/app.php -/tmp/* + +/tmp/cache/models/* +!/tmp/cache/models/empty +/tmp/cache/persistent/* +!/tmp/cache/persistent/empty +/tmp/cache/views/* +!/tmp/cache/views/empty +/tmp/sessions/* +!/tmp/sessions/empty +/tmp/tests/* +!/tmp/tests/empty + /logs/* +!/logs/empty # CakePHP 2 diff --git a/options/gitignore/Calabash b/options/gitignore/Calabash new file mode 100644 index 0000000..8a75b32 --- /dev/null +++ b/options/gitignore/Calabash @@ -0,0 +1,10 @@ +# Calabash / Cucumber +rerun/ +reports/ +screenshots/ +screenshot*.png +test-servers/ + +# bundler +.bundle +vendor diff --git a/options/gitignore/Clojure b/options/gitignore/Clojure index a9fe6fb..e69de29 100644 --- a/options/gitignore/Clojure +++ b/options/gitignore/Clojure @@ -1,13 +0,0 @@ -pom.xml -pom.xml.asc -*.jar -*.class -/lib/ -/classes/ -/target/ -/checkouts/ -.lein-deps-sum -.lein-repl-history -.lein-plugins/ -.lein-failures -.nrepl-port diff --git a/options/gitignore/CodeIgniter b/options/gitignore/CodeIgniter index 0f77d9e..bfea17c 100644 --- a/options/gitignore/CodeIgniter +++ b/options/gitignore/CodeIgniter @@ -4,3 +4,14 @@ */cache/* !*/cache/index.html !*/cache/.htaccess + +user_guide_src/build/* +user_guide_src/cilexer/build/* +user_guide_src/cilexer/dist/* +user_guide_src/cilexer/pycilexer.egg-info/* + +#codeigniter 3 +application/logs/* +!application/logs/index.html +!application/logs/.htaccess +/vendor/ diff --git a/options/gitignore/CommonLisp b/options/gitignore/CommonLisp index 4806e58..e7de127 100644 --- a/options/gitignore/CommonLisp +++ b/options/gitignore/CommonLisp @@ -1,3 +1,17 @@ *.FASL *.fasl *.lisp-temp +*.dfsl +*.pfsl +*.d64fsl +*.p64fsl +*.lx64fsl +*.lx32fsl +*.dx64fsl +*.dx32fsl +*.fx64fsl +*.fx32fsl +*.sx64fsl +*.sx32fsl +*.wx64fsl +*.wx32fsl diff --git a/options/gitignore/Composer b/options/gitignore/Composer index 3a693c9..c422267 100644 --- a/options/gitignore/Composer +++ b/options/gitignore/Composer @@ -1,5 +1,5 @@ composer.phar -vendor/ +/vendor/ # Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file # You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file diff --git a/options/gitignore/Concrete5 b/options/gitignore/Concrete5 index 9aa215a..1fe5361 100644 --- a/options/gitignore/Concrete5 +++ b/options/gitignore/Concrete5 @@ -1,3 +1,4 @@ config/site.php files/cache/* files/tmp/* +.htaccess diff --git a/options/gitignore/Coq b/options/gitignore/Coq index d3083b3..f25a61d 100644 --- a/options/gitignore/Coq +++ b/options/gitignore/Coq @@ -1,3 +1,30 @@ -*.vo +.*.aux +*.a +*.cma +*.cmi +*.cmo +*.cmx +*.cmxa +*.cmxs *.glob +*.ml.d +*.ml4.d +*.mli.d +*.mllib.d +*.mlpack.d +*.native +*.o *.v.d +*.vio +*.vo +.coq-native/ +.csdp.cache +.lia.cache +.nia.cache +.nlia.cache +.nra.cache +csdp.cache +lia.cache +nia.cache +nlia.cache +nra.cache diff --git a/options/gitignore/D b/options/gitignore/D new file mode 100644 index 0000000..74b926f --- /dev/null +++ b/options/gitignore/D @@ -0,0 +1,24 @@ +# Compiled Object files +*.o +*.obj + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Compiled Static libraries +*.a +*.lib + +# Executables +*.exe + +# DUB +.dub +docs.json +__dummy.html +docs/ + +# Code coverage +*.lst diff --git a/options/gitignore/Dart b/options/gitignore/Dart index 38548b3..4d2a4d6 100644 --- a/options/gitignore/Dart +++ b/options/gitignore/Dart @@ -1,15 +1,12 @@ -# Don’t commit the following directories created by pub. -.buildlog +# See https://www.dartlang.org/tools/private-files.html + +# Files and directories created by pub +.packages .pub/ build/ -packages -.packages - -# Or the files created by dart2js. -*.dart.js -*.js_ -*.js.deps -*.js.map - -# Include when developing application packages. +# If you're building an application, you may want to check-in your pubspec.lock pubspec.lock + +# Directory created by dartdoc +# If you don't generate documentation locally you can remove this line. +doc/api/ diff --git a/options/gitignore/Delphi b/options/gitignore/Delphi index 8d5d458..19864c6 100644 --- a/options/gitignore/Delphi +++ b/options/gitignore/Delphi @@ -20,6 +20,10 @@ # Deployment Manager configuration file for your project. Added in Delphi XE2. # Uncomment this if it is not mobile development and you do not use remote debug feature. #*.deployproj +# +# C++ object files produced when C/C++ Output file generation is configured. +# Uncomment this if you are not using external objects (zlib library for example). +#*.obj # # Delphi compiler-generated binaries (safe to delete) @@ -37,9 +41,13 @@ *.tds *.dcu *.lib +*.a +*.o +*.ocx # Delphi autogenerated files (duplicated info) *.cfg +*.hpp *Resource.rc # Delphi local files (user-specific info) @@ -51,7 +59,8 @@ # Delphi history and backups __history/ +__recovery/ *.~* -# Castalia statistics file +# Castalia statistics file (since XE7 Castalia is distributed with Delphi) *.stat diff --git a/options/gitignore/Dreamweaver b/options/gitignore/Dreamweaver index 6a33373..0621a3d 100644 --- a/options/gitignore/Dreamweaver +++ b/options/gitignore/Dreamweaver @@ -1,3 +1,7 @@ # DW Dreamweaver added files _notes +_compareTemp +configs/ dwsync.xml +dw_php_codehinting.config +*.mno diff --git a/options/gitignore/Dropbox b/options/gitignore/Dropbox new file mode 100644 index 0000000..40f4a46 --- /dev/null +++ b/options/gitignore/Dropbox @@ -0,0 +1,4 @@ +# Dropbox settings and caches +.dropbox +.dropbox.attr +.dropbox.cache diff --git a/options/gitignore/Drupal b/options/gitignore/Drupal index 04aed3b..0d2fe53 100644 --- a/options/gitignore/Drupal +++ b/options/gitignore/Drupal @@ -15,7 +15,7 @@ robots.txt /MAINTAINERS.txt /UPGRADE.txt /README.txt -sites/all/README.txt +sites/README.txt sites/all/modules/README.txt sites/all/themes/README.txt diff --git a/options/gitignore/Eagle b/options/gitignore/Eagle index a541034..9ced126 100644 --- a/options/gitignore/Eagle +++ b/options/gitignore/Eagle @@ -11,6 +11,10 @@ # comment the following line if you want to have your project file included. eagle.epf +# Autorouter files +*.pro +*.job + # CAM files *.$$$ *.cmp @@ -34,3 +38,7 @@ eagle.epf *.info *.eps + +# file locks introduced since 7.x +*.lck + diff --git a/options/gitignore/Eclipse b/options/gitignore/Eclipse index 0e22e95..4f88399 100644 --- a/options/gitignore/Eclipse +++ b/options/gitignore/Eclipse @@ -1,6 +1,5 @@ -*.pydevproject + .metadata -.gradle bin/ tmp/ *.tmp @@ -10,6 +9,7 @@ tmp/ local.properties .settings/ .loadpath +.recommenders # Eclipse Core .project @@ -20,7 +20,10 @@ local.properties # Locally stored "Eclipse launch configurations" *.launch -# CDT-specific +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) .cproject # JDT-specific (Eclipse Java Development Tools) @@ -29,11 +32,25 @@ local.properties # Java annotation processor (APT) .factorypath -# PDT-specific +# PDT-specific (PHP Development Tools) .buildpath # sbteclipse plugin .target +# Tern plugin +.tern-project + # TeXlipse plugin .texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet diff --git a/options/gitignore/EiffelStudio b/options/gitignore/EiffelStudio index a7ba35f..f41b4f7 100644 --- a/options/gitignore/EiffelStudio +++ b/options/gitignore/EiffelStudio @@ -1,2 +1,2 @@ -# The compilation directoy +# The compilation directory EIFGENs diff --git a/options/gitignore/Elisp b/options/gitignore/Elisp index 9b4291b..206569d 100644 --- a/options/gitignore/Elisp +++ b/options/gitignore/Elisp @@ -3,3 +3,9 @@ # Packaging .cask + +# Backup files +*~ + +# Undo-tree save-files +*.~undo-tree diff --git a/options/gitignore/Elixir b/options/gitignore/Elixir index 9607671..ac67aaf 100644 --- a/options/gitignore/Elixir +++ b/options/gitignore/Elixir @@ -1,4 +1,6 @@ /_build +/cover /deps erl_crash.dump *.ez +*.beam diff --git a/options/gitignore/Elm b/options/gitignore/Elm new file mode 100644 index 0000000..8b631e7 --- /dev/null +++ b/options/gitignore/Elm @@ -0,0 +1,4 @@ +# elm-package generated files +elm-stuff +# elm-repl generated files +repl-temp-* diff --git a/options/gitignore/Emacs b/options/gitignore/Emacs index e5327ba..3ac7904 100644 --- a/options/gitignore/Emacs +++ b/options/gitignore/Emacs @@ -30,3 +30,16 @@ tramp # cask packages .cask/ +dist/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile + +# directory configuration +.dir-locals.el diff --git a/options/gitignore/Erlang b/options/gitignore/Erlang index 8e46d5a..3826c85 100644 --- a/options/gitignore/Erlang +++ b/options/gitignore/Erlang @@ -4,7 +4,7 @@ deps *.beam *.plt erl_crash.dump -ebin +ebin/*.beam rel/example_project .concrete/DEV_MODE .rebar diff --git a/options/gitignore/ExtJs b/options/gitignore/ExtJs index 5ffc215..c92aea0 100644 --- a/options/gitignore/ExtJs +++ b/options/gitignore/ExtJs @@ -1,4 +1,12 @@ .architect +bootstrap.css +bootstrap.js bootstrap.json +bootstrap.jsonp build/ +classic.json +classic.jsonp ext/ +modern.json +modern.jsonp +resources/sass/.sass-cache/ diff --git a/options/gitignore/FSharp b/options/gitignore/FSharp deleted file mode 100644 index 6c914f7..0000000 --- a/options/gitignore/FSharp +++ /dev/null @@ -1,114 +0,0 @@ -# Build Folders (you can keep bin if you'd like, to store dlls and pdbs) -[Bb]in/ -[Oo]bj/ - -# mstest test results -TestResults - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results -[Dd]ebug/ -[Rr]elease/ -x64/ -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.log -*.vspscc -*.vssscc -.builds - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper* - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# Installshield output folder -[Ee]xpress - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish - -# Publish Web Output -*.Publish.xml - -# NuGet Packages Directory -packages - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others -[Bb]in -[Oo]bj -sql -TestResults -[Tt]est[Rr]esult* -*.Cache -ClientBin -[Ss]tyle[Cc]op.* -~$* -*.dbmdl -Generated_Code #added for RIA/Silverlight projects - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML - -#FSharp -paket.exe -paket-files/ -.fake - diff --git a/options/gitignore/Fortran b/options/gitignore/Fortran new file mode 100644 index 0000000..e69de29 diff --git a/options/gitignore/FuelPHP b/options/gitignore/FuelPHP index 7804d8d..d69f71f 100644 --- a/options/gitignore/FuelPHP +++ b/options/gitignore/FuelPHP @@ -1,2 +1,21 @@ -fuel/app/logs/*/*/* -fuel/app/cache/*/* +# the composer package lock file and install directory +# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file +# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file +# /composer.lock +/fuel/vendor + +# the fuelphp document +/docs/ + +# you may install these packages with `oil package`. +# http://fuelphp.com/docs/packages/oil/package.html +# /fuel/packages/auth/ +# /fuel/packages/email/ +# /fuel/packages/oil/ +# /fuel/packages/orm/ +# /fuel/packages/parser/ + +# dynamically generated files +/fuel/app/logs/*/*/* +/fuel/app/cache/*/* +/fuel/app/config/crypt.php diff --git a/options/gitignore/GPG b/options/gitignore/GPG new file mode 100644 index 0000000..7740a01 --- /dev/null +++ b/options/gitignore/GPG @@ -0,0 +1,2 @@ +secring.* + diff --git a/options/gitignore/Go b/options/gitignore/Go index daf913b..a1338d6 100644 --- a/options/gitignore/Go +++ b/options/gitignore/Go @@ -1,24 +1,14 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - +# Binaries for programs and plugins *.exe +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` *.test -*.prof + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 +.glide/ diff --git a/options/gitignore/Gradle b/options/gitignore/Gradle index 302a5f2..a1fc39c 100644 --- a/options/gitignore/Gradle +++ b/options/gitignore/Gradle @@ -1,8 +1,14 @@ .gradle -build/ +/build/ # Ignore Gradle GUI config gradle-app.setting # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) !gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties diff --git a/options/gitignore/Haskell b/options/gitignore/Haskell index cdc3c4d..450f32e 100644 --- a/options/gitignore/Haskell +++ b/options/gitignore/Haskell @@ -1,4 +1,5 @@ dist +dist-* cabal-dev *.o *.hi @@ -13,4 +14,7 @@ cabal.sandbox.config *.prof *.aux *.hp +*.eventlog .stack-work/ +cabal.project.local +.HTF/ diff --git a/options/gitignore/IPythonNotebook b/options/gitignore/IPythonNotebook deleted file mode 100644 index 27c1351..0000000 --- a/options/gitignore/IPythonNotebook +++ /dev/null @@ -1,2 +0,0 @@ -# Temporary data -.ipynb_checkpoints/ diff --git a/options/gitignore/Java b/options/gitignore/Java index 32858aa..6143e53 100644 --- a/options/gitignore/Java +++ b/options/gitignore/Java @@ -1,5 +1,12 @@ +# Compiled class file *.class +# Log file +*.log + +# BlueJ files +*.ctxt + # Mobile Tools for Java (J2ME) .mtj.tmp/ @@ -7,6 +14,9 @@ *.jar *.war *.ear +*.zip +*.tar.gz +*.rar # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* diff --git a/options/gitignore/JetBrains b/options/gitignore/JetBrains index 573bcf4..a5d4cc8 100644 --- a/options/gitignore/JetBrains +++ b/options/gitignore/JetBrains @@ -1,32 +1,28 @@ -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio - -*.iml - -## Directory-based project format: -.idea/ -# if you remove the above rule, at least ignore the following: +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff: -# .idea/workspace.xml -# .idea/tasks.xml -# .idea/dictionaries +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries # Sensitive or high-churn files: -# .idea/dataSources.ids -# .idea/dataSources.xml -# .idea/sqlDataSources.xml -# .idea/dynamic.xml -# .idea/uiDesigner.xml +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml # Gradle: -# .idea/gradle.xml -# .idea/libraries +.idea/**/gradle.xml +.idea/**/libraries # Mongo Explorer plugin: -# .idea/mongoSettings.xml +.idea/**/mongoSettings.xml ## File-based project format: -*.ipr *.iws ## Plugin-specific files: @@ -40,7 +36,11 @@ # JIRA plugin atlassian-ide-plugin.xml +# Cursive Clojure plugin +.idea/replstate.xml + # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties +fabric.properties diff --git a/options/gitignore/Joomla b/options/gitignore/Joomla index cf36d8c..53a74e7 100644 --- a/options/gitignore/Joomla +++ b/options/gitignore/Joomla @@ -29,8 +29,6 @@ /administrator/components/com_search/* /administrator/components/com_templates/* /administrator/components/com_users/* -/administrator/components/com_weblinks/* -/administrator/components/index.html /administrator/help/* /administrator/includes/* /administrator/language/en-GB/en-GB.com_ajax.ini @@ -41,7 +39,6 @@ /administrator/language/en-GB/en-GB.com_joomlaupdate.sys.ini /administrator/language/en-GB/en-GB.com_postinstall.ini /administrator/language/en-GB/en-GB.com_postinstall.sys.ini -/administrator/language/en-GB/en-GB.com_sitemapjen.sys.ini /administrator/language/en-GB/en-GB.com_tags.ini /administrator/language/en-GB/en-GB.com_tags.sys.ini /administrator/language/en-GB/en-GB.mod_stats_admin.ini @@ -52,6 +49,7 @@ /administrator/language/en-GB/en-GB.plg_content_contact.sys.ini /administrator/language/en-GB/en-GB.plg_content_finder.ini /administrator/language/en-GB/en-GB.plg_content_finder.sys.ini +/administrator/language/en-GB/en-GB.plg_editors-xtd_module* /administrator/language/en-GB/en-GB.plg_finder_categories.ini /administrator/language/en-GB/en-GB.plg_finder_categories.sys.ini /administrator/language/en-GB/en-GB.plg_finder_contacts.ini @@ -64,6 +62,10 @@ /administrator/language/en-GB/en-GB.plg_finder_tags.sys.ini /administrator/language/en-GB/en-GB.plg_finder_weblinks.ini /administrator/language/en-GB/en-GB.plg_finder_weblinks.sys.ini +/administrator/language/en-GB/en-GB.plg_installer_folderinstaller* +/administrator/language/en-GB/en-GB.plg_installer_packageinstaller* +/administrator/language/en-GB/en-GB.plg_installer_packageinstaller +/administrator/language/en-GB/en-GB.plg_installer_urlinstaller* /administrator/language/en-GB/en-GB.plg_installer_webinstaller.ini /administrator/language/en-GB/en-GB.plg_installer_webinstaller.sys.ini /administrator/language/en-GB/en-GB.plg_quickicon_joomlaupdate.ini @@ -72,6 +74,8 @@ /administrator/language/en-GB/en-GB.plg_search_tags.sys.ini /administrator/language/en-GB/en-GB.plg_system_languagecode.ini /administrator/language/en-GB/en-GB.plg_system_languagecode.sys.ini +/administrator/language/en-GB/en-GB.plg_system_stats* +/administrator/language/en-GB/en-GB.plg_system_updatenotification* /administrator/language/en-GB/en-GB.plg_twofactorauth_totp.ini /administrator/language/en-GB/en-GB.plg_twofactorauth_totp.sys.ini /administrator/language/en-GB/en-GB.plg_twofactorauth_yubikey.ini @@ -243,14 +247,11 @@ /administrator/language/en-GB/en-GB.plg_user_joomla.sys.ini /administrator/language/en-GB/en-GB.plg_user_profile.ini /administrator/language/en-GB/en-GB.plg_user_profile.sys.ini -/administrator/language/en-GB/en-GB.tpl_bluestork.ini -/administrator/language/en-GB/en-GB.tpl_bluestork.sys.ini /administrator/language/en-GB/en-GB.tpl_hathor.ini /administrator/language/en-GB/en-GB.tpl_hathor.sys.ini /administrator/language/en-GB/en-GB.xml -/administrator/language/en-GB/index.html /administrator/language/overrides/* -/administrator/language/index.html +/administrator/logs/index.html /administrator/manifests/* /administrator/modules/mod_custom/* /administrator/modules/mod_feed/* @@ -269,12 +270,9 @@ /administrator/modules/mod_unread/* /administrator/modules/mod_version/* /administrator/modules/mod_stats_admin/* -/administrator/modules/index.html -/administrator/templates/bluestork/* /administrator/templates/isis/* /administrator/templates/hathor/* /administrator/templates/system/* -/administrator/templates/index.html /administrator/index.php /cache/* /bin/* @@ -289,13 +287,14 @@ /components/com_finder/* /components/com_mailto/* /components/com_media/* +/components/com_modules/* /components/com_newsfeeds/* /components/com_search/* /components/com_users/* -/components/com_weblinks/* /components/com_wrapper/* /components/index.html /images/banners/* +/images/headers/* /images/sampledata/* /images/joomla* /images/index.html @@ -309,6 +308,7 @@ /language/en-GB/en-GB.com_tags.ini /language/en-GB/en-GB.finder_cli.ini /language/en-GB/en-GB.lib_fof.sys.ini +/language/en-GB/en-GB.lib_fof.ini /language/en-GB/en-GB.com_content.ini /language/en-GB/en-GB.lib_idna_convert.sys.ini /language/en-GB/en-GB.com_mailto.ini @@ -391,32 +391,47 @@ /language/en-GB/en-GB.tpl_beez5.ini /language/en-GB/en-GB.tpl_beez5.sys.ini /language/en-GB/en-GB.xml -/language/en-GB/index.html /language/en-GB/install.xml /language/overrides/* /language/index.html +/layouts/joomla/* +/layouts/libraries/* +/layouts/plugins/* +/layouts/index.html /libraries/cms.php /libraries/cms/* +/libraries/fof/* +/libraries/idna_convert/* /libraries/joomla/* +/libraries/legacy/* +/libraries/php-encryption/* +/libraries/phpass/* /libraries/phpmailer/* /libraries/phputf8/* /libraries/simplepie/* +/libraries/vendor/* +/libraries/classmap.php +/libraries/import.legacy.php /libraries/index.html /libraries/import.php /libraries/loader.php -/libraries/platform.php -/logs/* /media/cms/* +/media/com_contenthistory/* /media/com_finder/* +/media/com_joomlaupdate/* +/media/com_wrapper/* /media/contacts/* /media/editors/* +/media/jui/* /media/mailto/* /media/media/* /media/mod_languages/* /media/overrider/* +/media/plg_captcha_recaptcha/* /media/plg_quickicon_extensionupdate/* /media/plg_quickicon_joomlaupdate/* /media/plg_system_highlight/* +/media/plg_system_stats/* /media/system/* /media/index.html /modules/mod_articles_archive/* @@ -439,8 +454,9 @@ /modules/mod_search/* /modules/mod_stats/* /modules/mod_syndicate/* +/modules/mod_tags_popular/* +/modules/mod_tags_similar/* /modules/mod_users_latest/* -/modules/mod_weblinks/* /modules/mod_whosonline/* /modules/mod_wrapper/* /modules/index.html @@ -448,9 +464,8 @@ /plugins/authentication/gmail/* /plugins/authentication/joomla/* /plugins/authentication/ldap/* -/plugins/authentication/index.html +/plugins/authentication/cookie/* /plugins/captcha/recaptcha/* -/plugins/captcha/index.html /plugins/content/emailcloak/* /plugins/content/example/* /plugins/content/finder/* @@ -461,26 +476,21 @@ /plugins/content/pagenavigation/* /plugins/content/vote/* /plugins/content/contact/* -/plugins/content/index.html /plugins/editors/codemirror/* /plugins/editors/none/* /plugins/editors/tinymce/* -/plugins/editors/index.html +/plugins/editors-xtd/module/* /plugins/editors-xtd/article/* /plugins/editors-xtd/image/* /plugins/editors-xtd/pagebreak/* /plugins/editors-xtd/readmore/* -/plugins/editors-xtd/index.html /plugins/extension/example/* /plugins/extension/joomla/* -/plugins/extension/index.html -/plugins/finder/index.html /plugins/finder/categories/* /plugins/finder/contacts/* /plugins/finder/content/* /plugins/finder/newsfeeds/* /plugins/finder/tags/* -/plugins/finder/weblinks/* /plugins/installer/* /plugins/quickicon/extensionupdate/* /plugins/quickicon/joomlaupdate/* @@ -503,6 +513,8 @@ /plugins/system/redirect/* /plugins/system/remember/* /plugins/system/sef/* +/plugins/system/stats/* +/plugins/system/updatenotification/* /plugins/system/index.html /plugins/twofactorauth/* /plugins/user/contactcreator/* @@ -511,10 +523,7 @@ /plugins/user/profile/* /plugins/user/index.html /plugins/index.html -/templates/atomic/* /templates/beez3/* -/templates/beez_20/* -/templates/beez5/* /templates/protostar/* /templates/system/* /templates/index.html @@ -523,3 +532,4 @@ /index.php /joomla.xml /*.txt +/robots.txt.dist diff --git a/options/gitignore/Julia b/options/gitignore/Julia new file mode 100644 index 0000000..381e0b6 --- /dev/null +++ b/options/gitignore/Julia @@ -0,0 +1,4 @@ +*.jl.cov +*.jl.*.cov +*.jl.mem +deps/deps.jl diff --git a/options/gitignore/KiCAD b/options/gitignore/KiCAD index a9e50ba..208bc4f 100644 --- a/options/gitignore/KiCAD +++ b/options/gitignore/KiCAD @@ -1,13 +1,21 @@ -# For PCBs designed using KiCAD: http://www.kicad-pcb.org/ +# For PCBs designed using KiCad: http://www.kicad-pcb.org/ # Temporary files *.000 *.bak *.bck *.kicad_pcb-bak +*~ +_autosave-* +*.tmp # Netlist files (exported from Eeschema) *.net # Autorouter files (exported from Pcbnew) -.dsn +*.dsn +*.ses + +# Exported BOM files +*.xml +*.csv diff --git a/options/gitignore/Laravel b/options/gitignore/Laravel index 36d7ade..a4854be 100644 --- a/options/gitignore/Laravel +++ b/options/gitignore/Laravel @@ -1,4 +1,20 @@ -/bootstrap/compiled.php +vendor/ +node_modules/ +npm-debug.log + +# Laravel 4 specific +bootstrap/compiled.php +app/storage/ + +# Laravel 5 & Lumen specific +public/storage +public/hot +storage/*.key .env.*.php .env.php .env +Homestead.yaml +Homestead.json + +# Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer +.rocketeer/ diff --git a/options/gitignore/Leiningen b/options/gitignore/Leiningen index 47fed6c..a9fe6fb 100644 --- a/options/gitignore/Leiningen +++ b/options/gitignore/Leiningen @@ -1,6 +1,7 @@ pom.xml pom.xml.asc -*jar +*.jar +*.class /lib/ /classes/ /target/ diff --git a/options/gitignore/Linux b/options/gitignore/Linux index 5932ea1..b56bf65 100644 --- a/options/gitignore/Linux +++ b/options/gitignore/Linux @@ -1,7 +1,13 @@ *~ +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + # KDE directory preferences .directory # Linux trash folder which might appear on any partition or disk .Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* diff --git a/options/gitignore/Magento b/options/gitignore/Magento index e2ea013..b282f5c 100644 --- a/options/gitignore/Magento +++ b/options/gitignore/Magento @@ -1,126 +1,16 @@ -.htaccess.sample -.modgit/ -.modman/ -app/code/community/Phoenix/ -app/code/community/Cm/ -app/code/core/ -app/design/adminhtml/default/default/ -app/design/frontend/base/ -app/design/frontend/rwd/ -app/design/frontend/default/blank/ -app/design/frontend/default/default/ -app/design/frontend/default/iphone/ -app/design/frontend/default/modern/ -app/design/frontend/enterprise/default -app/design/install/ -app/etc/modules/Enterprise_* -app/etc/modules/Mage_All.xml -app/etc/modules/Mage_Api.xml -app/etc/modules/Mage_Api2.xml -app/etc/modules/Mage_Authorizenet.xml -app/etc/modules/Mage_Bundle.xml -app/etc/modules/Mage_Captcha.xml -app/etc/modules/Mage_Centinel.xml -app/etc/modules/Mage_Compiler.xml -app/etc/modules/Mage_ConfigurableSwatches.xml -app/etc/modules/Mage_Connect.xml -app/etc/modules/Mage_CurrencySymbol.xml -app/etc/modules/Mage_Downloadable.xml -app/etc/modules/Mage_ImportExport.xml -app/etc/modules/Mage_LoadTest.xml -app/etc/modules/Mage_Oauth.xml -app/etc/modules/Mage_PageCache.xml -app/etc/modules/Mage_Persistent.xml -app/etc/modules/Mage_Weee.xml -app/etc/modules/Mage_Widget.xml -app/etc/modules/Mage_XmlConnect.xml -app/etc/modules/Phoenix_Moneybookers.xml -app/etc/modules/Cm_RedisSession.xml -app/etc/applied.patches.list -app/etc/config.xml -app/etc/enterprise.xml -app/etc/local.xml.additional -app/etc/local.xml.template -app/etc/local.xml -app/.htaccess -app/locale/ -app/Mage.php -/cron.php -cron.sh -downloader/ -errors/ -favicon.ico -/get.php -includes/ -/index.php -index.php.sample -/install.php -js/blank.html -js/calendar/ -js/enterprise/ -js/extjs/ -js/firebug/ -js/flash/ -js/index.php -js/jscolor/ -js/lib/ -js/mage/ -js/prototype/ -js/scriptaculous/ -js/spacer.gif -js/tiny_mce/ -js/varien/ -lib/3Dsecure/ -lib/Apache/ -lib/flex/ -lib/googlecheckout/ -lib/.htaccess -lib/LinLibertineFont/ -lib/Mage/ -lib/PEAR/ -lib/Pelago/ -lib/phpseclib/ -lib/Varien/ -lib/Zend/ -lib/Cm/ -lib/Credis/ -lib/Magento/ -LICENSE_AFL.txt -LICENSE.html -LICENSE.txt -LICENSE_EE* -/mage -media/customer/ -media/dhl/ -media/downloadable/ -media/.htaccess -media/import/ -media/xmlconnect/ -media/catalog/product/cache/ -media/catalog/product/placeholder/default/ -/api.php -nbproject/ -pear -pear/ -php.ini.sample -pkginfo/ -RELEASE_NOTES.txt -shell/abstract.php -shell/compiler.php -shell/indexer.php -shell/log.php -sitemap.xml -skin/adminhtml/default/default/ -skin/adminhtml/default/enterprise -skin/frontend/base/ -skin/frontend/rwd/ -skin/frontend/default/blank/ -skin/frontend/default/blue/ -skin/frontend/default/default/ -skin/frontend/default/french/ -skin/frontend/default/german/ -skin/frontend/default/iphone/ -skin/frontend/default/modern/ -skin/frontend/enterprise -skin/install/ -var/ +#--------------------------# +# Magento Default Files # +#--------------------------# + +/app/etc/local.xml +/media/* +!/media/.htaccess +!/media/customer/.htaccess +!/media/dhl/logo.jpg +!/media/downloadable/.htaccess +!/media/xmlconnect/custom/ok.gif +!/media/xmlconnect/original/ok.gif +!/media/xmlconnect/system/ok.gif +/var/* +!/var/.htaccess +!/var/package/*.xml diff --git a/options/gitignore/Matlab b/options/gitignore/Matlab index 79bc56c..09dfde6 100644 --- a/options/gitignore/Matlab +++ b/options/gitignore/Matlab @@ -14,3 +14,9 @@ # Simulink Code Generation slprj/ + +# Session info +octave-workspace + +# Simulink autosave extension +.autosave diff --git a/options/gitignore/Maven b/options/gitignore/Maven index 1cdc9f7..5f2dbe1 100644 --- a/options/gitignore/Maven +++ b/options/gitignore/Maven @@ -7,3 +7,6 @@ release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties + +# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) +!/.mvn/wrapper/maven-wrapper.jar diff --git a/options/gitignore/MicrosoftOffice b/options/gitignore/MicrosoftOffice index 412297b..cb89174 100644 --- a/options/gitignore/MicrosoftOffice +++ b/options/gitignore/MicrosoftOffice @@ -8,3 +8,9 @@ # Excel Backup File *.xlk + +# PowerPoint temporary +~$*.ppt* + +# Visio autosave temporary files +*.~vsdx diff --git a/options/gitignore/Nanoc b/options/gitignore/Nanoc index abc2182..3f36ea2 100644 --- a/options/gitignore/Nanoc +++ b/options/gitignore/Nanoc @@ -1,6 +1,6 @@ -# For projects using nanoc (http://nanoc.ws/) +# For projects using Nanoc (http://nanoc.ws/) -# Default location for output, needs to match output_dir's value found in config.yaml +# Default location for output (needs to match output_dir's value found in nanoc.yaml) output/ # Temporary file directory diff --git a/options/gitignore/NetBeans b/options/gitignore/NetBeans index debe0e4..254108c 100644 --- a/options/gitignore/NetBeans +++ b/options/gitignore/NetBeans @@ -3,6 +3,4 @@ build/ nbbuild/ dist/ nbdist/ -nbactions.xml -nb-configuration.xml .nb-gradle/ diff --git a/options/gitignore/Node b/options/gitignore/Node index b38069d..00cbbdf 100644 --- a/options/gitignore/Node +++ b/options/gitignore/Node @@ -2,11 +2,14 @@ logs *.log npm-debug.log* +yarn-debug.log* +yarn-error.log* # Runtime data pids *.pid *.seed +*.pid.lock # Directory for instrumented libs generated by jscoverage/JSCover lib-cov @@ -14,15 +17,43 @@ lib-cov # Coverage directory used by tools like istanbul coverage +# nyc test coverage +.nyc_output + # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt +# Bower dependency directory (https://bower.io/) +bower_components + # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release -# Dependency directory -# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git -node_modules +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + diff --git a/options/gitignore/Objective-C b/options/gitignore/Objective-C index 05096f6..09dfede 100644 --- a/options/gitignore/Objective-C +++ b/options/gitignore/Objective-C @@ -4,7 +4,7 @@ ## Build generated build/ -DerivedData +DerivedData/ ## Various settings *.pbxuser @@ -15,25 +15,26 @@ DerivedData !default.mode2v3 *.perspectivev3 !default.perspectivev3 -xcuserdata +xcuserdata/ ## Other -*.xccheckout *.moved-aside -*.xcuserstate +*.xccheckout *.xcscmblueprint ## Obj-C/Swift specific *.hmap *.ipa +*.dSYM.zip +*.dSYM # CocoaPods # # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: -# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # -#Pods/ +# Pods/ # Carthage # @@ -41,3 +42,22 @@ xcuserdata # Carthage/Checkouts Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ diff --git a/options/gitignore/OpenCart b/options/gitignore/OpenCart index cc93767..97be41f 100644 --- a/options/gitignore/OpenCart +++ b/options/gitignore/OpenCart @@ -9,3 +9,12 @@ image/data/ image/cache/ system/cache/ system/logs/ + +system/storage/ + +# vQmod log files +vqmod/logs/* +# vQmod cache files +vqmod/vqcache/* +vqmod/checked.cache +vqmod/mods.cache diff --git a/options/gitignore/Otto b/options/gitignore/Otto new file mode 100644 index 0000000..5aa263f --- /dev/null +++ b/options/gitignore/Otto @@ -0,0 +1 @@ +.otto/ diff --git a/options/gitignore/Perl b/options/gitignore/Perl index ae2ad53..9bf1537 100644 --- a/options/gitignore/Perl +++ b/options/gitignore/Perl @@ -1,20 +1,35 @@ -/blib/ -/.build/ -_build/ -cover_db/ -inc/ -Build !Build/ -Build.bat .last_cover_stats -/Makefile -/Makefile.old -/MANIFEST.bak /META.yml /META.json /MYMETA.* -nytprof.out -/pm_to_blib *.o +*.pm.tdy *.bs + +# Devel::Cover +cover_db/ + +# Devel::NYTProf +nytprof.out + +# Dizt::Zilla +/.build/ + +# Module::Build +_build/ +Build +Build.bat + +# Module::Install +inc/ + +# ExtUitls::MakeMaker +/blib/ /_eumm/ +/*.gz +/Makefile +/Makefile.old +/MANIFEST.bak +/pm_to_blib +/*.zip diff --git a/options/gitignore/PlayFramework b/options/gitignore/PlayFramework index 4735f05..ae5ec9f 100644 --- a/options/gitignore/PlayFramework +++ b/options/gitignore/PlayFramework @@ -11,7 +11,6 @@ bin/ tmp/ test-result server.pid -*.iml *.eml /dist/ .cache diff --git a/options/gitignore/Prestashop b/options/gitignore/Prestashop index 1c8462b..7c6ae1e 100644 --- a/options/gitignore/Prestashop +++ b/options/gitignore/Prestashop @@ -7,9 +7,16 @@ config/settings.*.php # The following files are generated by PrestaShop. admin-dev/autoupgrade/ -cache/ +/cache/ +!/cache/index.php +!/cache/cachefs/index.php +!/cache/purifier/index.php +!/cache/push/index.php +!/cache/sandbox/index.php +!/cache/smarty/index.php +!/cache/tcpdf/index.php config/xml/*.xml -log/ +/log/* *sitemap.xml themes/*/cache/ modules/*/config*.xml @@ -21,5 +28,5 @@ admin-dev/backups/ admin-dev/export/ admin-dev/import/ download/ -img/ +/img/* upload/ diff --git a/options/gitignore/PureScript b/options/gitignore/PureScript new file mode 100644 index 0000000..361cf52 --- /dev/null +++ b/options/gitignore/PureScript @@ -0,0 +1,8 @@ +# Dependencies +.psci_modules +bower_components +node_modules + +# Generated files +.psci +output diff --git a/options/gitignore/Python b/options/gitignore/Python index a65d046..62c1e73 100644 --- a/options/gitignore/Python +++ b/options/gitignore/Python @@ -20,6 +20,7 @@ lib64/ parts/ sdist/ var/ +wheels/ *.egg-info/ .installed.cfg *.egg @@ -43,6 +44,7 @@ htmlcov/ nosetests.xml coverage.xml *,cover +.hypothesis/ # Translations *.mo @@ -50,9 +52,43 @@ coverage.xml # Django stuff: *.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject + +# Rope project settings +.ropeproject diff --git a/options/gitignore/Qt b/options/gitignore/Qt index 85a6baa..c7659c2 100644 --- a/options/gitignore/Qt +++ b/options/gitignore/Qt @@ -23,12 +23,16 @@ moc_*.cpp qrc_*.cpp ui_*.h Makefile* -*-build-* +*build-* # QtCreator *.autosave -#QtCtreator Qml +# QtCtreator Qml *.qmlproject.user *.qmlproject.user.* + +# QtCtreator CMake +CMakeLists.txt.user* + diff --git a/options/gitignore/R b/options/gitignore/R index 49037a0..fcff087 100644 --- a/options/gitignore/R +++ b/options/gitignore/R @@ -2,9 +2,18 @@ .Rhistory .Rapp.history +# Session Data files +.RData + # Example code in package build process *-Ex.R +# Output files from R CMD build +/*.tar.gz + +# Output files from R CMD check +/*.Rcheck/ + # RStudio files .Rproj.user/ @@ -14,3 +23,11 @@ vignettes/*.pdf # OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 .httr-oauth + +# knitr and R markdown default cache directories +/*_cache/ +/cache/ + +# Temporary files created by R markdown +*.utf8.md +*.knit.md diff --git a/options/gitignore/Rails b/options/gitignore/Rails index f786a90..e974276 100644 --- a/options/gitignore/Rails +++ b/options/gitignore/Rails @@ -12,15 +12,21 @@ capybara-*.html rerun.txt pickle-email-*.html -# TODO Comment out these rules if you are OK with secrets being uploaded to the repo +# TODO Comment out this rule if you are OK with secrets being uploaded to the repo config/initializers/secret_token.rb -config/secrets.yml -## Environment normalisation: +# Only include if you have production secrets in this file, which is no longer a Rails default +# config/secrets.yml + +# dotenv +# TODO Comment out this rule if environment variables can be committed +.env + +## Environment normalization: /.bundle /vendor/bundle -# these should all be checked in to normalise the environment: +# these should all be checked in to normalize the environment: # Gemfile.lock, .ruby-version, .ruby-gemset # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: @@ -33,3 +39,6 @@ bower.json # Ignore pow environment settings .powenv + +# Ignore Byebug command history file. +.byebug_history diff --git a/options/gitignore/Ruby b/options/gitignore/Ruby index 1ba91c0..5e1422c 100644 --- a/options/gitignore/Ruby +++ b/options/gitignore/Ruby @@ -10,10 +10,24 @@ /test/version_tmp/ /tmp/ +# Used by dotenv library to load environment variables. +# .env + ## Specific to RubyMotion: .dat* .repl_history build/ +*.bridgesupport +build-iPhoneOS/ +build-iPhoneSimulator/ + +## Specific to RubyMotion (use of CocoaPods): +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# vendor/Pods/ ## Documentation cache and generated files: /.yardoc/ @@ -21,7 +35,7 @@ build/ /doc/ /rdoc/ -## Environment normalisation: +## Environment normalization: /.bundle/ /vendor/bundle /lib/bundler/man/ diff --git a/options/gitignore/Rust b/options/gitignore/Rust index 37727f9..50281a4 100644 --- a/options/gitignore/Rust +++ b/options/gitignore/Rust @@ -1,11 +1,10 @@ -# Compiled files -*.o -*.so -*.rlib -*.dll - -# Executables -*.exe - # Generated by Cargo +# will have compiled files and executables /target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk diff --git a/options/gitignore/SBT b/options/gitignore/SBT index 970d897..5ed6acb 100644 --- a/options/gitignore/SBT +++ b/options/gitignore/SBT @@ -1,9 +1,12 @@ # Simple Build Tool # http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control +dist/* target/ lib_managed/ src_managed/ project/boot/ +project/plugins/project/ .history .cache +.lib/ diff --git a/options/gitignore/Scala b/options/gitignore/Scala index c58d83b..9c07d4a 100644 --- a/options/gitignore/Scala +++ b/options/gitignore/Scala @@ -1,17 +1,2 @@ *.class *.log - -# sbt specific -.cache -.history -.lib/ -dist/* -target/ -lib_managed/ -src_managed/ -project/boot/ -project/plugins/project/ - -# Scala-IDE specific -.scala_dependencies -.worksheet diff --git a/options/gitignore/Scheme b/options/gitignore/Scheme new file mode 100644 index 0000000..cbb89d7 --- /dev/null +++ b/options/gitignore/Scheme @@ -0,0 +1,7 @@ +*.ss~ +*.ss#* +.#*.ss + +*.scm~ +*.scm#* +.#*.scm diff --git a/options/gitignore/Smalltalk b/options/gitignore/Smalltalk new file mode 100644 index 0000000..75272b2 --- /dev/null +++ b/options/gitignore/Smalltalk @@ -0,0 +1,18 @@ +# changes file +*.changes + +# system image +*.image + +# Pharo Smalltalk Debug log file +PharoDebug.log + +# Squeak Smalltalk Debug log file +SqueakDebug.log + +# Monticello package cache +/package-cache + +# Metacello-github cache +/github-cache +github-*.zip diff --git a/options/gitignore/Stata b/options/gitignore/Stata new file mode 100644 index 0000000..07997bb --- /dev/null +++ b/options/gitignore/Stata @@ -0,0 +1,24 @@ +# .gitignore file for git projects containing Stata files +# Commercial statistical software: http://www.stata.com + +# Stata dataset and output files +*.dta +*.gph +*.log +*.smcl +*.stpr +*.stsem + +# Graphic export files from Stata +# Stata command graph export: http://www.stata.com/manuals14/g-2graphexport.pdf +# +# You may add graphic export files to your .gitignore. However you should be +# aware that this will exclude all image files from this main directory +# and subdirectories. +# *.ps +# *.eps +# *.wmf +# *.emf +# *.pdf +# *.png +# *.tif diff --git a/options/gitignore/SublimeText b/options/gitignore/SublimeText index 1d4e613..95ff224 100644 --- a/options/gitignore/SublimeText +++ b/options/gitignore/SublimeText @@ -12,3 +12,19 @@ # sftp configuration file sftp-config.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +Package Control.merged-ca-bundle +Package Control.user-ca-bundle +oscrypto-ca-bundle.crt +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings diff --git a/options/gitignore/SugarCRM b/options/gitignore/SugarCRM index 842c3ec..e927020 100644 --- a/options/gitignore/SugarCRM +++ b/options/gitignore/SugarCRM @@ -7,6 +7,7 @@ # For development the cache directory can be safely ignored and # therefore it is ignored. /cache/ +!/cache/index.html # Ignore some files and directories from the custom directory. /custom/history/ /custom/modulebuilder/ @@ -22,4 +23,5 @@ *.log # Ignore the new upload directories. /upload/ +!/upload/index.html /upload_backup/ diff --git a/options/gitignore/Swift b/options/gitignore/Swift index d571cb2..d534044 100644 --- a/options/gitignore/Swift +++ b/options/gitignore/Swift @@ -4,7 +4,7 @@ ## Build generated build/ -DerivedData +DerivedData/ ## Various settings *.pbxuser @@ -15,23 +15,35 @@ DerivedData !default.mode2v3 *.perspectivev3 !default.perspectivev3 -xcuserdata +xcuserdata/ ## Other -*.xccheckout *.moved-aside -*.xcuserstate +*.xccheckout *.xcscmblueprint ## Obj-C/Swift specific *.hmap *.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +.build/ # CocoaPods # # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: -# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # # Pods/ @@ -41,3 +53,15 @@ xcuserdata # Carthage/Checkouts Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output diff --git a/options/gitignore/Symfony b/options/gitignore/Symfony index c68377d..6c224e0 100644 --- a/options/gitignore/Symfony +++ b/options/gitignore/Symfony @@ -4,11 +4,16 @@ !app/cache/.gitkeep !app/logs/.gitkeep -# Cache and logs (Symfony3) +# Email spool folder +/app/spool/* + +# Cache, session files and logs (Symfony3) /var/cache/* /var/logs/* +/var/sessions/* !var/cache/.gitkeep !var/logs/.gitkeep +!var/sessions/.gitkeep # Parameters /app/config/parameters.yml @@ -20,7 +25,6 @@ /bin/* !bin/console !bin/symfony_requirements -/vendor/ # Assets and user uploads /web/bundles/ @@ -33,5 +37,5 @@ # Build data /build/ -# Composer PHAR -/composer.phar +# Backup entities generated with doctrine:generate:entities command +**/Entity/*~ diff --git a/options/gitignore/Tags b/options/gitignore/Tags index 45922ec..91927af 100644 --- a/options/gitignore/Tags +++ b/options/gitignore/Tags @@ -1,12 +1,15 @@ # Ignore tags created by etags, ctags, gtags (GNU global) and cscope TAGS +.TAGS !TAGS/ tags +.tags !tags/ gtags.files GTAGS GRTAGS GPATH +GSYMS cscope.files cscope.out cscope.in.out diff --git a/options/gitignore/TeX b/options/gitignore/TeX index a7a84bc..57ed9f5 100644 --- a/options/gitignore/TeX +++ b/options/gitignore/TeX @@ -6,6 +6,10 @@ *.fls *.out *.toc +*.fmt +*.fot +*.cb +*.cb2 ## Intermediate documents: *.dvi @@ -15,25 +19,26 @@ # *.eps # *.pdf +## Generated if empty string is given at "Please type another file name for output:" +.pdf + ## Bibliography auxiliary files (bibtex/biblatex/biber): *.bbl *.bcf *.blg *-blx.aux *-blx.bib -*.brf *.run.xml ## Build tool auxiliary files: *.fdb_latexmk *.synctex +*.synctex(busy) *.synctex.gz *.synctex.gz(busy) *.pdfsync ## Auxiliary and intermediate files from other packages: - - # algorithms *.alg *.loa @@ -46,11 +51,35 @@ acs-*.bib # beamer *.nav +*.pre *.snm *.vrb -#(e)ledmac/(e)ledpar +# changes +*.soc + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar *.end +*.?end *.[1-9] *.[1-9][0-9] *.[1-9][0-9][0-9] @@ -70,15 +99,21 @@ acs-*.bib *.glg *.glo *.gls +*.glsdefs # gnuplottex *-gnuplottex-* +# gregoriotex +*.gaux +*.gtex + # hyperref *.brf # knitr *-concordance.tex +# TODO Comment the next line if you want to keep your tikz graphics files *.tikz *-tikzDictionary @@ -93,9 +128,12 @@ acs-*.bib # minitoc *.maf -*.mtc -*.mtc[0-9] -*.mtc[1-9][0-9] +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* # minted _minted* @@ -104,22 +142,36 @@ _minted* # morewrites *.mw -# mylatexformat -*.fmt - # nomencl *.nlo +# pax +*.pax + # sagetex *.sagetex.sage *.sagetex.py *.sagetex.scmd +# scrwfile +*.wrt + # sympy *.sout *.sympy sympy-plots-for-*.tex/ +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# thmtools +*.loe + # TikZ & PGF *.dpth *.md5 @@ -128,9 +180,38 @@ sympy-plots-for-*.tex/ # todonotes *.tdo +# easy-todo +*.lod + # xindy *.xdy +# xypic precompiled matrices +*.xyc + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: # WinEdt *.bak *.sav + +# Texpad +.texpadtmp + +# Kile +*.backup + +# KBibTeX +*~[0-9]* + +# auto folder when using emacs and auctex +/auto/* + +# expex forward references with \gathertags +*-tags.tex diff --git a/options/gitignore/Terraform b/options/gitignore/Terraform new file mode 100644 index 0000000..41859c8 --- /dev/null +++ b/options/gitignore/Terraform @@ -0,0 +1,6 @@ +# Compiled files +*.tfstate +*.tfstate.backup + +# Module directory +.terraform/ diff --git a/options/gitignore/Typo3 b/options/gitignore/Typo3 index 5781fcc..cb024fe 100644 --- a/options/gitignore/Typo3 +++ b/options/gitignore/Typo3 @@ -1,5 +1,5 @@ ## TYPO3 v6.2 -# Ignore serveral upload and file directories. +# Ignore several upload and file directories. /fileadmin/user_upload/ /fileadmin/_temp_/ /fileadmin/_processed_/ diff --git a/options/gitignore/Umbraco b/options/gitignore/Umbraco index 21af92d..ea05e1f 100644 --- a/options/gitignore/Umbraco +++ b/options/gitignore/Umbraco @@ -1,12 +1,11 @@ # Note: VisualStudio gitignore rules may also be relevant +# Umbraco # Ignore unimportant folders generated by Umbraco -**/App_Data/ClientDependency/ -**/App_Data/ExamineIndexes/ **/App_Data/Logs/ **/App_Data/[Pp]review/ **/App_Data/TEMP/ -Cached/ +**/App_Data/NuGetBackup/ # Ignore Umbraco content cache file **/App_Data/umbraco.config @@ -15,3 +14,6 @@ Cached/ # Make sure to include details from VisualStudio.gitignore BEFORE this !**/App_Data/[Pp]ackages/ !**/[Uu]mbraco/[Dd]eveloper/[Pp]ackages + +# ImageProcessor DiskCache +**/App_Data/cache/ diff --git a/options/gitignore/Unity b/options/gitignore/Unity index 9de9409..eb83a8f 100644 --- a/options/gitignore/Unity +++ b/options/gitignore/Unity @@ -2,8 +2,15 @@ /[Tt]emp/ /[Oo]bj/ /[Bb]uild/ +/[Bb]uilds/ +/Assets/AssetStoreTools* -# Autogenerated VS/MD solution and project files +# Visual Studio 2015 cache directory +/.vs/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ *.csproj *.unityproj *.sln @@ -13,9 +20,15 @@ *.userprefs *.pidb *.booproj +*.svd +*.pdb # Unity3D generated meta files *.pidb.meta # Unity3D Generated File On Crash Reports sysinfo.txt + +# Builds +*.apk +*.unitypackage diff --git a/options/gitignore/UnrealEngine b/options/gitignore/UnrealEngine new file mode 100644 index 0000000..2f09600 --- /dev/null +++ b/options/gitignore/UnrealEngine @@ -0,0 +1,70 @@ +# Visual Studio 2015 user specific files +.vs/ + +# Visual Studio 2015 database file +*.VC.db + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +*.ipa + +# These project files can be generated by the engine +*.xcodeproj +*.xcworkspace +*.sln +*.suo +*.opensdf +*.sdf +*.VC.db +*.VC.opendb + +# Precompiled Assets +SourceArt/**/*.png +SourceArt/**/*.tga + +# Binary Files +Binaries/* + +# Builds +Build/* + +# Don't ignore icon files in Build +!Build/**/*.ico + +# Built data for maps +*_BuiltData.uasset + +# Configuration files generated by the Editor +Saved/* + +# Compiled source files for the engine to use +Intermediate/* + +# Cache files for the editor to use +DerivedDataCache/* diff --git a/options/gitignore/Vim b/options/gitignore/Vim index 6c5ee8d..42e7afc 100644 --- a/options/gitignore/Vim +++ b/options/gitignore/Vim @@ -1,6 +1,12 @@ -[._]*.s[a-w][a-z] -[._]s[a-w][a-z] -*.un~ +# swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] +# session Session.vim +# temporary .netrwhist *~ +# auto-generated tag files +tags diff --git a/options/gitignore/VirtualEnv b/options/gitignore/VirtualEnv index 831cf3a..b2c22f2 100644 --- a/options/gitignore/VirtualEnv +++ b/options/gitignore/VirtualEnv @@ -4,7 +4,9 @@ [Bb]in [Ii]nclude [Ll]ib +[Ll]ib64 [Ll]ocal [Ss]cripts pyvenv.cfg +.venv pip-selfcheck.json diff --git a/options/gitignore/VisualStudio b/options/gitignore/VisualStudio index 150691a..a752eac 100644 --- a/options/gitignore/VisualStudio +++ b/options/gitignore/VisualStudio @@ -1,5 +1,7 @@ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files *.suo @@ -17,10 +19,10 @@ [Rr]eleases/ x64/ x86/ -build/ bld/ [Bb]in/ [Oo]bj/ +[Ll]og/ # Visual Studio 2015 cache/options directory .vs/ @@ -40,9 +42,11 @@ TestResult.xml [Rr]eleasePS/ dlldata.c -# DNX +# .NET Core project.lock.json +project.fragment.lock.json artifacts/ +**/Properties/launchSettings.json *_i.c *_p.c @@ -76,9 +80,12 @@ _Chutzpah* ipch/ *.aps *.ncb +*.opendb *.opensdf *.sdf *.cachefile +*.VC.db +*.VC.VC.opendb # Visual Studio profiler *.psess @@ -106,6 +113,10 @@ _TeamCity* # DotCover is a Code Coverage Tool *.dotCover +# Visual Studio code coverage results +*.coverage +*.coveragexml + # NCrunch _NCrunch_* .*crunch*.local.xml @@ -137,11 +148,16 @@ publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings +# TODO: Comment the next line if you want to checkin your web deploy settings # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + # NuGet Packages *.nupkg # The packages folder can be ignored because of Package Restore @@ -150,13 +166,23 @@ publish/ !**/packages/build/ # Uncomment if necessary however generally it will be regenerated when needed #!**/packages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets -# Windows Azure Build Output +# Microsoft Azure Build Output csx/ *.build.csdef -# Windows Store app package directory +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt # Visual Studio cache files # files ending in .cache can be ignored @@ -166,16 +192,19 @@ AppPackages/ # Others ClientBin/ -[Ss]tyle[Cc]op.* ~$* *~ *.dbmdl *.dbproj.schemaview +*.jfm *.pfx *.publishsettings -node_modules/ orleans.codegen.cs +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + # RIA/Silverlight projects Generated_Code/ @@ -199,8 +228,15 @@ UpgradeLog*.htm # Microsoft Fakes FakesAssemblies/ +# GhostDoc plugin setting file +*.GhostDoc.xml + # Node.js Tools for Visual Studio .ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ # Visual Studio 6 build log *.plg @@ -208,6 +244,9 @@ FakesAssemblies/ # Visual Studio 6 workspace options file *.opt +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts @@ -215,3 +254,34 @@ FakesAssemblies/ **/*.Server/GeneratedArtifacts **/*.Server/ModelManifest.xml _Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs \ No newline at end of file diff --git a/options/gitignore/VisualStudioCode b/options/gitignore/VisualStudioCode index 0865bb7..0511e2b 100644 --- a/options/gitignore/VisualStudioCode +++ b/options/gitignore/VisualStudioCode @@ -1,2 +1,5 @@ -.settings - +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/options/gitignore/Waf b/options/gitignore/Waf index 68cacdb..dad2b56 100644 --- a/options/gitignore/Waf +++ b/options/gitignore/Waf @@ -1,3 +1,9 @@ -# for projects that use Waf for building: http://code.google.com/p/waf/ -.waf-* -.lock-* +# For projects that use the Waf build system: https://waf.io/ +# Dot-hidden on Unix-like systems +.waf-*-*/ +.waf3-*-*/ +# Hidden directory on Windows (no dot) +waf-*-*/ +waf3-*-*/ +# Lockfile +.lock-waf_*_build diff --git a/options/gitignore/Windows b/options/gitignore/Windows index a0d3145..ba26afd 100644 --- a/options/gitignore/Windows +++ b/options/gitignore/Windows @@ -1,6 +1,7 @@ -# Windows image file caches +# Windows thumbnail cache files Thumbs.db ehthumbs.db +ehthumbs_vista.db # Folder config file Desktop.ini diff --git a/options/gitignore/WordPress b/options/gitignore/WordPress index 5603287..9792350 100644 --- a/options/gitignore/WordPress +++ b/options/gitignore/WordPress @@ -1,7 +1,4 @@ *.log -.htaccess -sitemap.xml -sitemap.xml.gz wp-config.php wp-content/advanced-cache.php wp-content/backup-db/ @@ -13,6 +10,9 @@ wp-content/uploads/ wp-content/wp-cache-config.php wp-content/plugins/hello.php -/readme.html +/.htaccess /license.txt +/readme.html +/sitemap.xml +/sitemap.xml.gz diff --git a/options/gitignore/Xcode b/options/gitignore/Xcode index d07b789..37de8bb 100644 --- a/options/gitignore/Xcode +++ b/options/gitignore/Xcode @@ -4,7 +4,7 @@ ## Build generated build/ -DerivedData +DerivedData/ ## Various settings *.pbxuser @@ -15,9 +15,9 @@ DerivedData !default.mode2v3 *.perspectivev3 !default.perspectivev3 -xcuserdata +xcuserdata/ ## Other -*.xccheckout *.moved-aside -*.xcuserstate +*.xccheckout +*.xcscmblueprint diff --git a/options/gitignore/XilinxISE b/options/gitignore/XilinxISE index e041f51..4475f84 100644 --- a/options/gitignore/XilinxISE +++ b/options/gitignore/XilinxISE @@ -42,6 +42,16 @@ *_usage.xml *_xst.xrpt +# iMPACT generated files +_impactbatch.log +impact.xsl +impact_impact.xwbt +ise_impact.cmd +webtalk_impact.xml + +# Core Generator generated files +xaw2verilog.log + # project-wide generated files *.gise par_usage_statistics.html diff --git a/options/gitignore/ZendFramework b/options/gitignore/ZendFramework index 3fbc973..80adb15 100644 --- a/options/gitignore/ZendFramework +++ b/options/gitignore/ZendFramework @@ -15,6 +15,11 @@ data/sessions/ data/tmp/ temp/ +#Doctrine 2 +data/DoctrineORMModule/Proxy/ +data/DoctrineORMModule/cache/ + + # Legacy ZF1 demos/ extras/documentation diff --git a/options/gitignore/OSX b/options/gitignore/macOS similarity index 81% rename from options/gitignore/OSX rename to options/gitignore/macOS index 660b313..f0f3fbc 100644 --- a/options/gitignore/OSX +++ b/options/gitignore/macOS @@ -1,24 +1,26 @@ -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/options/license/0BSD b/options/license/0BSD new file mode 100644 index 0000000..0bcf761 --- /dev/null +++ b/options/license/0BSD @@ -0,0 +1,5 @@ +Copyright (C) 2006 by Rob Landley + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/options/license/AAL b/options/license/AAL new file mode 100644 index 0000000..18f468c --- /dev/null +++ b/options/license/AAL @@ -0,0 +1,23 @@ +Attribution Assurance License + +Copyright (c) <> + +All Rights Reserved + +ATTRIBUTION ASSURANCE LICENSE (adapted from the original BSD license) + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the conditions below are met. These conditions require a modest attribution to <;match=.+>> (the "Author"), who hopes that its promotional value may help justify the thousands of dollars in otherwise billable time invested in writing this and other freely available, open-source software. + +1. Redistributions of source code, in whole or part and with or without modification (the "Code"), must prominently display this GPG-signed text in verifiable form. + +2. Redistributions of the Code in binary form must be accompanied by this GPG-signed text in any documentation and, each time the resulting executable program or a program dependent thereon is launched, a prominent display (e.g., splash screen or banner text) of the Author's attribution information, which includes: + + (a) <> ("AUTHOR"), + (b) <> ("PROFESSIONAL IDENTIFICATION"), and + (c) <> ("URL"). + +3. Neither the name nor any trademark of the Author may be used to endorse or promote products derived from this software without specific prior written permission. + +4. Users are entirely responsible, to the exclusion of the Author and any other persons, for compliance with (1) regulations set by owners or administrators of employed equipment, (2) licensing terms of any other software, and (3) local regulations regarding use, including those regarding import, export, and use of encryption software. + +THIS FREE SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, EFFECTS OF UNAUTHORIZED OR MALICIOUS NETWORK ACCESS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/ADSL b/options/license/ADSL new file mode 100644 index 0000000..9c5154f --- /dev/null +++ b/options/license/ADSL @@ -0,0 +1 @@ +This software code is made available "AS IS" without warranties of any kind. You may copy, display, modify and redistribute the software code either by itself or as incorporated into your code; provided that > you do not remove any proprietary notices. Your use of this software code is at your own risk and you waive any claim against Amazon Digital Services, Inc. or its affiliates with respect to your use of this software code. (c) 2006 Amazon Digital Services, Inc. or its affiliates. \ No newline at end of file diff --git a/options/license/Academic Free License v1.1 b/options/license/AFL-1.1 similarity index 73% rename from options/license/Academic Free License v1.1 rename to options/license/AFL-1.1 index 61ea6da..c6217e1 100644 --- a/options/license/Academic Free License v1.1 +++ b/options/license/AFL-1.1 @@ -1,14 +1,19 @@ -Academic Free License +Academic Free License Version 1.1 -The Academic Free License applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: -"Licensed under the Academic Free License version 1.1." +The Academic Free License applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: -Grant of License. Licensor hereby grants to any person obtaining a copy of the Original Work ("You") a world-wide, royalty-free, non-exclusive, perpetual, non-sublicenseable license (1) to use, copy, modify, merge, publish, perform, distribute and/or sell copies of the Original Work and derivative works thereof, and (2) under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and derivative works thereof, subject to the following conditions. + "Licensed under the Academic Free License version 1.1." -Right of Attribution. Redistributions of the Original Work must reproduce all copyright notices in the Original Work as furnished by the Licensor, both in the Original Work itself and in any documentation and/or other materials provided with the distribution of the Original Work in executable form. +Grant of License. Licensor hereby grants to any person obtaining a copy of the Original Work ("You") a world-wide, royalty-free, non-exclusive, perpetual, non-sublicenseable license -Exclusions from License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. +(1) to use, copy, modify, merge, publish, perform, distribute and/or sell copies of the Original Work and derivative works thereof, and + +(2) under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and derivative works thereof, subject to the following conditions. + + Right of Attribution. Redistributions of the Original Work must reproduce all copyright notices in the Original Work as furnished by the Licensor, both in the Original Work itself and in any documentation and/or other materials provided with the distribution of the Original Work in executable form. + + Exclusions from License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. WARRANTY AND DISCLAIMERS. LICENSOR WARRANTS THAT THE COPYRIGHT IN AND TO THE ORIGINAL WORK IS OWNED BY THE LICENSOR OR THAT THE ORIGINAL WORK IS DISTRIBUTED BY LICENSOR UNDER A VALID CURRENT LICENSE FROM THE COPYRIGHT OWNER. EXCEPT AS EXPRESSLY STATED IN THE IMMEDIATELY PRECEEDING SENTENCE, THE ORIGINAL WORK IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE WARRANTY OF NON-INFRINGEMENT AND WARRANTIES THAT THE ORIGINAL WORK IS MERCHANTABLE OR FIT FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO LICENSE TO ORIGINAL WORK IS GRANTED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. @@ -19,4 +24,4 @@ License to Source Code. The term "Source Code" means the preferred form of the O Mutual Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License if You file a lawsuit in any court alleging that any OSI Certified open source software that is licensed under any license containing this "Mutual Termination for Patent Action" clause infringes any patent claims that are essential to use that software. This license is Copyright (C) 2002 Lawrence E. Rosen. All rights reserved. -Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. +Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. \ No newline at end of file diff --git a/options/license/Academic Free License v1.2 b/options/license/AFL-1.2 similarity index 96% rename from options/license/Academic Free License v1.2 rename to options/license/AFL-1.2 index d846ecd..9302c93 100644 --- a/options/license/Academic Free License v1.2 +++ b/options/license/AFL-1.2 @@ -1,9 +1,10 @@ -Academic Free License -Version 1.2 +Academic Free License +Version 1.2 + This Academic Free License applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: -Licensed under the Academic Free License version 1.2 + Licensed under the Academic Free License version 1.2 Grant of License. Licensor hereby grants to any person obtaining a copy of the Original Work ("You") a world-wide, royalty-free, non-exclusive, perpetual, non-sublicenseable license (1) to use, copy, modify, merge, publish, perform, distribute and/or sell copies of the Original Work and derivative works thereof, and (2) under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and derivative works thereof, subject to the following conditions. @@ -24,4 +25,4 @@ Mutual Termination for Patent Action. This License shall terminate automatically Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. This license is Copyright (C) 2002 Lawrence E. Rosen. All rights reserved. -Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. +Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. \ No newline at end of file diff --git a/options/license/AFL-2.0 b/options/license/AFL-2.0 new file mode 100644 index 0000000..a8cfafb --- /dev/null +++ b/options/license/AFL-2.0 @@ -0,0 +1,45 @@ +The Academic Free License +v. 2.0 + +This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: + + Licensed under the Academic Free License version 2.0 + +1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license to do the following: + + a) to reproduce the Original Work in copies; + b) to prepare derivative works ("Derivative Works") based upon the Original Work; + c) to distribute copies of the Original Work and Derivative Works to the public; + d) to perform the Original Work publicly; and + e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor hereby agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work, and by publishing the address of that information repository in a notice immediately following the copyright notice that applies to the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the licensed claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license. + +5) This section intentionally omitted. + +6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately proceeding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to Original Work is granted hereunder except under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to liability for death or personal injury resulting from Licensor's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + +9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. + +10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, for patent infringement (i) against Licensor with respect to a patent applicable to software or (ii) against any entity with respect to a patent applicable to the Original Work (but excluding combinations of the Original Work with other software or hardware). + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. ¤ 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. + +12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + +13) Miscellaneous. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + +This license is Copyright (C) 2003 Lawrence E. Rosen. All rights reserved. +Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. \ No newline at end of file diff --git a/options/license/AFL-2.1 b/options/license/AFL-2.1 new file mode 100644 index 0000000..2cb5b00 --- /dev/null +++ b/options/license/AFL-2.1 @@ -0,0 +1,45 @@ +The Academic Free License +v.2.1 + +This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: + + Licensed under the Academic Free License version 2.1 + +1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license to do the following: + + a) to reproduce the Original Work in copies; + b) to prepare derivative works ("Derivative Works") based upon the Original Work; + c) to distribute copies of the Original Work and Derivative Works to the public; + d) to perform the Original Work publicly; and + e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor hereby agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work, and by publishing the address of that information repository in a notice immediately following the copyright notice that applies to the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the licensed claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license. + +5) This section intentionally omitted. + +6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately proceeding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to Original Work is granted hereunder except under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to liability for death or personal injury resulting from Licensor's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + + 9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. + +10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. + +12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + +13) Miscellaneous. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + +This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. +Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. \ No newline at end of file diff --git a/options/license/Academic Free License v3.0 b/options/license/AFL-3.0 similarity index 79% rename from options/license/Academic Free License v3.0 rename to options/license/AFL-3.0 index 36bdcfd..0fb7dbb 100644 --- a/options/license/Academic Free License v3.0 +++ b/options/license/AFL-3.0 @@ -1,42 +1,43 @@ -Academic Free License (“AFL”) v. 3.0 +Academic Free License (“AFL”) v. 3.0 + This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: -Licensed under the Academic Free License version 3.0 + Licensed under the Academic Free License version 3.0 1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: + + a) to reproduce the Original Work in copies, either alone or as part of a collective work; + b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; + c) to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor’s reserved rights and remedies, in this Academic Free License; + d) to perform the Original Work publicly; and + e) to display the Original Work publicly. -a) to reproduce the Original Work in copies, either alone or as part of a collective work; -b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; -c) to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor’s reserved rights and remedies, in this Academic Free License; -d) to perform the Original Work publicly; and -e) to display the Original Work publicly. - -2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. +2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. 3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. -4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor’s trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. + 4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor’s trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. -5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). +5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). -6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. +6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. 7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. -8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. +8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. -9) Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including “fair use” or “fair dealing”). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). +9) Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including “fair use” or “fair dealing”). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). -10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. +10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. -11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. -12) Attorneys’ Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. +12) Attorneys’ Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. -13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. +13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. -14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. -15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. +15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. -16) Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. +16) Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. \ No newline at end of file diff --git a/options/license/Affero General Public License v1.0 b/options/license/AGPL-1.0 similarity index 83% rename from options/license/Affero General Public License v1.0 rename to options/license/AGPL-1.0 index 946b95d..60e9947 100644 --- a/options/license/Affero General Public License v1.0 +++ b/options/license/AGPL-1.0 @@ -1,5 +1,6 @@ -AFFERO GENERAL PUBLIC LICENSE +AFFERO GENERAL PUBLIC LICENSE Version 1, March 2002

Copyright © 2002 Affero Inc.
510 Third Street - Suite 225, San Francisco, CA 94107, USA + This license is a modified version of the GNU General Public License copyright (C) 1989, 1991 Free Software Foundation, Inc. made with their permission. Section 2(d) has been added to cover use of software over a computer network. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -32,11 +33,12 @@ Activities other than copying, distribution and modification are not covered by You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. -2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
 -a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
 -b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
 -c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
 -d) If the Program as you received it is intended to interact with users through a computer network and if, in the version you received, any user interacting with the Program was given the opportunity to request transmission to that user of the Program's complete source code, you must not remove that facility from your modified version of the Program or work based on the Program, and must offer an equivalent opportunity for all users interacting with your Program through a computer network to request immediate transmission by HTTP of the complete source code of your modified version or other derivative work. +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
 + b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
 + c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
 + d) If the Program as you received it is intended to interact with users through a computer network and if, in the version you received, any user interacting with the Program was given the opportunity to request transmission to that user of the Program's complete source code, you must not remove that facility from your modified version of the Program or work based on the Program, and must offer an equivalent opportunity for all users interacting with your Program through a computer network to request immediate transmission by HTTP of the complete source code of your modified version or other derivative work. These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. @@ -44,10 +46,10 @@ Thus, it is not the intent of this section to claim rights or contest your right In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. -3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
 -a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
 -b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
 -c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
 + a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
 + b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
 + c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. diff --git a/options/license/AGPL-3.0 b/options/license/AGPL-3.0 new file mode 100644 index 0000000..0a4f9a1 --- /dev/null +++ b/options/license/AGPL-3.0 @@ -0,0 +1,235 @@ +GNU AFFERO GENERAL PUBLIC LICENSE +Version 3, 19 November 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + + Preamble + +The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. + +The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. + +Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. + +A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. + +The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. + +An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. + +The precise terms and conditions for copying, distribution and modification follow. + + TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU Affero General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based on the Program. + +To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. + +1. Source Code. +The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. + +A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +2. Basic Permissions. +All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. +No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. + +4. Conveying Verbatim Copies. +You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. +You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". + + c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. + +6. Conveying Non-Source Forms. +You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: + + a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + + d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. + +7. Additional Terms. +"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + + e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to s ue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. + +A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. + +13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. + +Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . \ No newline at end of file diff --git a/options/license/AMDPLPA b/options/license/AMDPLPA new file mode 100644 index 0000000..d76602b --- /dev/null +++ b/options/license/AMDPLPA @@ -0,0 +1,19 @@ +All rights reserved. + +Redistribution and use in any form of this material and any product thereof including software in source or binary forms, along with any related documentation, with or without modification ("this material"), is permitted provided that the following conditions are met: + + Redistributions of source code of any software must retain the above copyright notice and all terms of this license as part of the code. + + Redistributions in binary form of any software must reproduce the above copyright notice and all terms of this license in any related documentation and/or other materials. + + Neither the names nor trademarks of Advanced Micro Devices, Inc. or any copyright holders or contributors may be used to endorse or promote products derived from this material without specific prior written permission. + + Notice about U.S. Government restricted rights: This material is provided with "RESTRICTED RIGHTS." Use, duplication or disclosure by the U.S. Government is subject to the full extent of restrictions set forth in FAR52.227 and DFARS252.227 et seq., or any successor or applicable regulations. Use of this material by the U.S. Government constitutes acknowledgment of the proprietary rights of Advanced Micro Devices, Inc. and any copyright holders and contributors. + + ANY BREACH OF ANY TERM OF THIS LICENSE SHALL RESULT IN THE IMMEDIATE REVOCATION OF ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL. + +THIS MATERIAL IS PROVIDED BY ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" IN ITS CURRENT CONDITION AND WITHOUT ANY REPRESENTATIONS, GUARANTEE, OR WARRANTY OF ANY KIND OR IN ANY WAY RELATED TO SUPPORT, INDEMNITY, ERROR FREE OR UNINTERRUPTED OPERATION, OR THAT IT IS FREE FROM DEFECTS OR VIRUSES. ALL OBLIGATIONS ARE HEREBY DISCLAIMED - WHETHER EXPRESS, IMPLIED, OR STATUTORY - INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OPERABILITY, QUALITY OF SERVICE, OR NON-INFRINGEMENT. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, REVENUE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED OR BASED ON ANY THEORY OF LIABILITY ARISING IN ANY WAY RELATED TO THIS MATERIAL, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE ENTIRE AND AGGREGATE LIABILITY OF ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS SHALL NOT EXCEED TEN DOLLARS (US $10.00). ANYONE REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL ACCEPTS THIS ALLOCATION OF RISK AND AGREES TO RELEASE ADVANCED MICRO DEVICES, INC. AND ANY COPYRIGHT HOLDERS AND CONTRIBUTORS FROM ANY AND ALL LIABILITIES, OBLIGATIONS, CLAIMS, OR DEMANDS IN EXCESS OF TEN DOLLARS (US $10.00). THE FOREGOING ARE ESSENTIAL TERMS OF THIS LICENSE AND, IF ANY OF THESE TERMS ARE CONSTRUED AS UNENFORCEABLE, FAIL IN ESSENTIAL PURPOSE, OR BECOME VOID OR DETRIMENTAL TO ADVANCED MICRO DEVICES, INC. OR ANY COPYRIGHT HOLDERS OR CONTRIBUTORS FOR ANY REASON, THEN ALL RIGHTS TO REDISTRIBUTE, ACCESS OR USE THIS MATERIAL SHALL TERMINATE IMMEDIATELY. MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF THIS LICENSE OR ANY AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL. + +NOTICE IS HEREBY PROVIDED, AND BY REDISTRIBUTING OR ACCESSING OR USING THIS MATERIAL SUCH NOTICE IS ACKNOWLEDGED, THAT THIS MATERIAL MAY BE SUBJECT TO RESTRICTIONS UNDER THE LAWS AND REGULATIONS OF THE UNITED STATES OR OTHER COUNTRIES, WHICH INCLUDE BUT ARE NOT LIMITED TO, U.S. EXPORT CONTROL LAWS SUCH AS THE EXPORT ADMINISTRATION REGULATIONS AND NATIONAL SECURITY CONTROLS AS DEFINED THEREUNDER, AS WELL AS STATE DEPARTMENT CONTROLS UNDER THE U.S. MUNITIONS LIST. THIS MATERIAL MAY NOT BE USED, RELEASED, TRANSFERRED, IMPORTED, EXPORTED AND/OR RE- EXPORTED IN ANY MANNER PROHIBITED UNDER ANY APPLICABLE LAWS, INCLUDING U.S. EXPORT CONTROL LAWS REGARDING SPECIFICALLY DESIGNATED PERSONS, COUNTRIES AND NATIONALS OF COUNTRIES SUBJECT TO NATIONAL SECURITY CONTROLS. MOREOVER, THE FOREGOING SHALL SURVIVE ANY EXPIRATION OR TERMINATION OF ANY LICENSE OR AGREEMENT OR ACCESS OR USE RELATED TO THIS MATERIAL. + +This license forms the entire agreement regarding the subject matter hereof and supersedes all proposals and prior discussions and writings between the parties with respect thereto. This license does not affect any ownership, rights, title, or interest in, or relating to, this material. No terms of this license can be modified or waived, and no breach of this license can be excused, unless done so in a writing signed by all affected parties. Each term of this license is separately enforceable. If any term of this license is determined to be or becomes unenforceable or illegal, such term shall be reformed to the minimum extent necessary in order for this license to remain in effect in accordance with its terms as modified by such reformation. This license shall be governed by and construed in accordance with the laws of the State of Texas without regard to rules on conflicts of law of any state or jurisdiction or the United Nations Convention on the International Sale of Goods. All disputes arising out of this license shall be subject to the jurisdiction of the federal and state courts in Austin, Texas, and all defenses are hereby waived concerning personal jurisdiction and venue of these courts. \ No newline at end of file diff --git a/options/license/AML b/options/license/AML new file mode 100644 index 0000000..8cc3202 --- /dev/null +++ b/options/license/AML @@ -0,0 +1,9 @@ +Copyright: Copyright (c) 2006 by Apple Computer, Inc., All Rights Reserved. + +IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in consideration of your agreement to the following terms, and your use, installation, modification or redistribution of this Apple software constitutes acceptance of these terms. If you do not agree with these terms, please do not use, install, modify or redistribute this Apple software. + +In consideration of your agreement to abide by the following terms, and subject to these terms, Apple grants you a personal, non-exclusive license, under Apple's copyrights in this original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the Apple Software, with or without modifications, in source and/or binary forms; provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software. Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to endorse or promote products derived from the Apple Software without specific prior written permission from Apple. Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by Apple herein, including but not limited to any patent rights that may be infringed by your derivative works or by other works in which the Apple Software may be incorporated. + +The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. + +IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/AMPAS b/options/license/AMPAS new file mode 100644 index 0000000..48f0146 --- /dev/null +++ b/options/license/AMPAS @@ -0,0 +1,13 @@ +Copyright (c) 2006 Academy of Motion Picture Arts and Sciences ("A.M.P.A.S."). Portions contributed by others as indicated. All rights reserved. + +A world-wide, royalty-free, non-exclusive right to distribute, copy, modify, create derivatives, and use, in source and binary forms, is hereby granted, subject to acceptance of this license. Performance of any of the aforementioned acts indicates acceptance to be bound by the following terms and conditions: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the Disclaimer of Warranty. + + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the Disclaimer of Warranty in the documentation and/or other materials provided with the distribution. + + * Nothing in this license shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of A.M.P.A.S. or any contributors, except as expressly stated herein, and neither the name of A.M.P.A.S. nor of any other contributors to this software, may be used to endorse or promote products derived from this software without specific prior written permission of A.M.P.A.S. or contributor, as appropriate. + +This license shall be governed by the laws of the State of California, and subject to the jurisdiction of the courts therein. + +Disclaimer of Warranty: THIS SOFTWARE IS PROVIDED BY A.M.P.A.S. AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL A.M.P.A.S., ANY CONTRIBUTORS OR DISTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/ANTLR-PD b/options/license/ANTLR-PD new file mode 100644 index 0000000..d75060d --- /dev/null +++ b/options/license/ANTLR-PD @@ -0,0 +1,5 @@ +ANTLR 2 License + +We reserve no legal rights to the ANTLR--it is fully in the public domain. An individual or company may do whatever they wish with source code distributed with ANTLR or the code generated by ANTLR, including the incorporation of ANTLR, or its output, into commerical software. + +We encourage users to develop software with ANTLR. However, we do ask that credit is given to us for developing ANTLR. By "credit", we mean that if you use ANTLR or incorporate any source code into one of your programs (commercial product, research project, or otherwise) that you acknowledge this fact somewhere in the documentation, research report, etc... If you like ANTLR and have developed a nice tool with the output, please mention that you developed it using ANTLR. In addition, we ask that the headers remain intact in our source code. As long as these guidelines are kept, we expect to continue enhancing this system and expect to make other tools available as they are completed. diff --git a/options/license/APAFML b/options/license/APAFML new file mode 100644 index 0000000..bc992bf --- /dev/null +++ b/options/license/APAFML @@ -0,0 +1,3 @@ +Copyright (c) 1985, 1987, 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. + +This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. \ No newline at end of file diff --git a/options/license/APL-1.0 b/options/license/APL-1.0 new file mode 100644 index 0000000..0349df4 --- /dev/null +++ b/options/license/APL-1.0 @@ -0,0 +1,295 @@ +ADAPTIVE PUBLIC LICENSE +Version 1.0 + +THE LICENSED WORK IS PROVIDED UNDER THE TERMS OF THIS ADAPTIVE PUBLIC LICENSE ("LICENSE"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE LICENSED WORK CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS LICENSE AND ITS TERMS, WHETHER OR NOT SUCH RECIPIENT READS THE TERMS OF THIS LICENSE. "LICENSED WORK" AND "RECIPIENT" ARE DEFINED BELOW. + +IMPORTANT NOTE: This License is "adaptive", and the generic version or another version of an Adaptive Public License should not be relied upon to determine your rights and obligations under this License. You must read the specific Adaptive Public License that you receive with the Licensed Work, as certain terms are defined at the outset by the Initial Contributor. + +See Section 2.2 below, Exhibit A attached, and any Suppfile.txt accompanying this License to determine the specific adaptive features applicable to this License. For example, without limiting the foregoing, (a) for selected choice of law and jurisdiction see Part 3 of Exhibit A; (b) for the selected definition of Third Party see Part 4 of Exhibit A; and (c) for selected patent licensing terms (if any) see Section 2.2 below and Part 6 of Exhibit A. + +1. DEFINITIONS. + +1.1. "CONTRIBUTION" means: + + (a) In the case of the Initial Contributor, the Initial Work distributed under this License by the Initial Contributor; and + (b) In the case of each Subsequent Contributor, the Subsequent Work originating from and distributed by such Subsequent Contributor. + +1.2. "DESIGNATED WEB SITE" means the web site having the URL identified in Part 1 of Exhibit A, which URL may be changed by the Initial Contributor by posting on the current Designated Web Site the new URL for at least sixty (60) days. + +1.3. "DISTRIBUTOR" means any Person that distributes the Licensed Work or any portion thereof to at least one Third Party. + +1.4. "ELECTRONIC DISTRIBUTION MECHANISM" means any mechanism generally accepted in the software development community for the electronic transfer of data. + +1.5. "EXECUTABLE" means the Licensed Work in any form other than Source Code. + +1.6. "GOVERNING JURISDICTION" means the state, province or other legal jurisdiction identified in Part 3 of Exhibit A. + +1.7. "INDEPENDENT MODULE" means a separate module of software and/or data that is not a derivative work of or copied from the Licensed Work or any portion thereof. In addition, a module does not qualify as an Independent Module but instead forms part of the Licensed Work if the module: (a) is embedded in the Licensed Work; (b) is included by reference in the Licensed Work other than by a function call or a class reference; or (c) must be included or contained, in whole or in part, within a file directory or subdirectory actually containing files making up the Licensed Work. + +1.8. "INITIAL CONTRIBUTOR" means the Person or entity identified as the Initial Contributor in the notice required byPart 1 of Exhibit A. + +1.9. "INITIAL WORK" means the initial Source Code, object code (if any) and documentation for the computer program identified in Part 2 of Exhibit A, as such Source Code, object code and documentation is distributed under this License by the Initial Contributor. + +1.10. "LARGER WORK" means a work that combines the Licensed Work or portions thereof with code not governed by this License. + +1.11. "LICENSED WORK" means the Initial Work and/or any Subsequent Work, in each case including portions thereof. + +1.12. "LICENSE NOTICE" has the meaning assigned in Part 5 of Exhibit A. + +1.13. "MODIFICATION" or "MODIFICATIONS" means any change to and/or addition to the Licensed Work. + +1.14. "PERSON" means an individual or other legal entity, including a corporation, partnership or other body. + +1.15. "RECIPIENT" means any Person who receives or obtains the Licensed Work under this License (by way of example, without limiting the foregoing, any Subsequent Contributor or Distributor). + +1.16. "SOURCE CODE" means the source code for a computer program, including the source code for all modules and components of the computer program, plus any associated interface definition files, and scripts used to control compilation and installation of an executable. + +1.17. "SUBSEQUENT CONTRIBUTOR" means any Person that makes or contributes to the making of any Subsequent Work and that distributes that Subsequent Work to at least one Third Party. + +1.18. "SUBSEQUENT WORK" means a work that has resulted or arises from changes to and/or additions to: + + (a) the Initial Work; + (b) any other Subsequent Work; or + (c) to any combination of the Initial Work and any such other Subsequent Work; +where such changes and/or additions originate from a Subsequent Contributor. A Subsequent Work will "originate" from a Subsequent Contributor if the Subsequent Work was a result of efforts by such Subsequent Contributor (or anyone acting on such Subsequent Contributor's behalf, such as, a contractor or other entity that is engaged by or under the direction of the Subsequent Contributor). For greater certainty, a Subsequent Work expressly excludes and shall not capture within its meaning any Independent Module. + +1.19. "SUPPLEMENT FILE" means a file distributed with the Licensed Work having a file name "suppfile.txt". + +1.20. "THIRD PARTY" has the meaning assigned in Part 4 of Exhibit A. + +2. LICENSE. + +2.1. COPYRIGHT LICENSE FROM INITIAL AND SUBSEQUENT CONTRIBUTORS. + + (a) Subject to the terms of this License, the Initial Contributor hereby grants each Recipient a world-wide, royalty-free, non-exclusive copyright license to: + + (i) reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Initial Work; and + (ii) reproduce, publicly display, publicly perform, distribute, and sublicense any derivative works (if any) prepared by Recipient; +in Source Code and Executable form, either with other Modifications, on an unmodified basis, or as part of a Larger Work. + + (b) Subject to the terms of this License, each Subsequent Contributor hereby grants each Recipient a world-wide, royalty-free, non-exclusive copyright license to: + + (i) reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Subsequent Work of such Subsequent Contributor; and + (ii) reproduce, publicly display, publicly perform, distribute, and sublicense any derivative works (if any) prepared by Recipient; +in Source Code and Executable form, either with other Modifications, on an unmodified basis, or as part of a Larger Work. + +2.2. PATENT LICENSE FROM INITIAL AND SUBSEQUENT CONTRIBUTORS. + + (a) This License does not include or grant any patent license whatsoever from the Initial Contributor, Subsequent Contributor, or any Distributor unless, at the time the Initial Work is first distributed or made available under this License (as the case may be), the Initial Contributor has selected pursuant to Part 6 of Exhibit A the patent terms in paragraphs A, B, C, D and E from Part 6 of Exhibit A. If this is not done then the Initial Work and any other Subsequent Work is made available under the License without any patent license (the "PATENTS-EXCLUDED LICENSE"). + (b) However, the Initial Contributor may subsequently distribute or make available (as the case may be) future copies of: (1) the Initial Work; or (2) any Licensed Work distributed by the Initial Contributor which includes the Initial Work (or any portion thereof) and/or any Modification made by the Initial Contributor; available under a License which includes a patent license (the "PATENTS-INCLUDED LICENSE") by selecting pursuant to Part 6 of Exhibit A the patent terms in paragraphs A, B, C, D and E from Part 6 of Exhibit A, when the Initial Contributor distributes or makes available (as the case may be) such future copies under this License. + (c) If any Recipient receives or obtains one or more copies of the Initial Work or any other portion of the Licensed Work under the Patents-Included License, then all licensing of such copies under this License shall include the terms in paragraphs A, B, C, D and E from Part 6 of Exhibit A and that Recipient shall not be able to rely upon the Patents-Excluded License for any such copies. However, all Recipients that receive one or more copies of the Initial Work or any other portion of the Licensed Work under a copy of the License which includes the Patents-Excluded License shall have no patent license with respect to such copies received under the Patents-Excluded License and availability and distribution of such copies, including Modifications made by such Recipient to such copies, shall be under a copy of the License without any patent license. + (d) Where a Recipient uses in combination or combines any copy of the Licensed Work (or portion thereof) licensed under a copy of the License having a Patents-Excluded License with any copy of the Licensed Work (or portion thereof) licensed under a copy of the License having a Patents-Included License, the combination (and any portion thereof) shall, from the first time such Recipient uses, makes available or distributes the combination (as the case may be), be subject to only the terms of the License having the Patents-Included License which shall include the terms in paragraphs A, B, C, D and E from Part 6 of Exhibit A. + +2.3. ACKNOWLEDGEMENT AND DISCLAIMER. +Recipient understands and agrees that although Initial Contributor and each Subsequent Contributor grants the licenses to its Contributions set forth herein, no representation, warranty, guarantee or assurance is provided by any Initial Contributor, Subsequent Contributor, or Distributor that the Licensed Work does not infringe the patent or other intellectual property rights of any other entity. Initial Contributor, Subsequent Contributor, and each Distributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise, in relation to the Licensed Works. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, without limiting the foregoing disclaimers, if a third party patent license is required to allow Recipient to distribute the Licensed Work, it is Recipient's responsibility to acquire that license before distributing the Licensed Work. + +2.4. RESERVATION. +Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Initial Contributor, Subsequent Contributor, or Distributor except as expressly stated herein. + +3. DISTRIBUTION OBLIGATIONS. + +3.1. DISTRIBUTION GENERALLY. + + (a) A Subsequent Contributor shall make that Subsequent Contributor's Subsequent Work(s) available to the public via an Electronic Distribution Mechanism for a period of at least twelve (12) months. The aforesaid twelve (12) month period shall begin within a reasonable time after the creation of the Subsequent Work and no later than sixty (60) days after first distribution of that Subsequent Contributor's Subsequent Work. + (b) All Distributors must distribute the Licensed Work in accordance with the terms of the License, and must include a copy of this License (including without limitation Exhibit A and the accompanying Supplement File) with each copy of the Licensed Work distributed. In particular, this License must be prominently distributed with the Licensed Work in a file called "license.txt." In addition, the License Notice in Part 5 of Exhibit Amust be included at the beginning of all Source Code files, and viewable to a user in any executable such that the License Notice is reasonably brought to the attention of any party using the Licensed Work. + +3.2. EXECUTABLE DISTRIBUTIONS OF THE LICENSED WORK. +A Distributor may choose to distribute the Licensed Work, or any portion thereof, in Executable form (an "EXECUTABLE DISTRIBUTION") to any third party, under the terms of Section 2 of this License, provided the Executable Distribution is made available under and accompanied by a copy of this License, AND provided at least ONE of the following conditions is fulfilled: + + (a) The Executable Distribution must be accompanied by the Source Code for the Licensed Work making up the Executable Distribution, and the Source Code must be distributed on the same media as the Executable Distribution or using an Electronic Distribution Mechanism; or + (b) The Executable Distribution must be accompanied with a written offer, valid for at least thirty six (36) months, to give any third party under the terms of this License, for a charge no more than the cost of physically performing source distribution, a complete machine-readable copy of the Source Code for the Licensed Work making up the Executable Distribution, to be available and distributed using an Electronic Distribution Mechanism, and such Executable Distribution must remain available in Source Code form to any third party via the Electronic Distribution Mechanism (or any replacement Electronic Distribution Mechanism the particular Distributor may reasonably need to turn to as a substitute) for said at least thirty six (36) months. + +For greater certainty, the above-noted requirements apply to any Licensed Work or portion thereof distributed to any third party in Executable form, whether such distribution is made alone, in combination with a Larger Work or Independent Modules, or in some other combination. + +3.3. SOURCE CODE DISTRIBUTIONS. +When a Distributor makes the Licensed Work, or any portion thereof, available to any Person in Source Code form, it must be made available under this License and a copy of this License must be included with each copy of the Source Code, situated so that the copy of the License is conspicuously brought to the attention of that Person. For greater clarification, this Section 3.3 applies to all distribution of the Licensed Work in any Source Code form. A Distributor may charge a fee for the physical act of transferring a copy, which charge shall be no more than the cost of physically performing source distribution. + +3.4. REQUIRED NOTICES IN SOURCE CODE. +Each Subsequent Contributor must ensure that the notice set out in Part 5 of Exhibit A is included in each file of the Source Code for each Subsequent Work originating from that particular Subsequent Contributor, if such notice is not already included in each such file. If it is not possible to put such notice in a particular Source Code file due to its structure, then the Subsequent Contributor must include such notice in a location (such as a relevant directory in which the file is stored) where a user would be likely to look for such a notice. + +3.5. NO DISTRIBUTION REQUIREMENTS FOR INTERNALLY USED MODIFICATIONS. +Notwithstanding Sections 3.2, 3.3 and 3.4, Recipient may, internally within its own corporation or organization use the Licensed Work, including the Initial Work and Subsequent Works, and make Modifications for internal use within Recipient's own corporation or organization (collectively, "INTERNAL USE MODIFICATIONS"). The Recipient shall have no obligation to distribute, in either Source Code or Executable form, any such Internal Use Modifications made by Recipient in the course of such internal use, except where required below in this Section 3.5. All Internal Use Modifications distributed to any Person, whether or not a Third Party, shall be distributed pursuant to and be accompanied by the terms of this License. If the Recipient chooses to distribute any such Internal Use Modifications to any Third Party, then the Recipient shall be deemed a Subsequent Contributor, and any such Internal Use Modifications distributed to any Third Party shall be deemed a Subsequent Work originating from that Subsequent Contributor, and shall from the first such instance become part of the Licensed Work that must thereafter be distributed and made available to third parties in accordance with the terms of Sections 3.1 to 3.4 inclusive. + +3.6. INDEPENDENT MODULES. +This License shall not apply to Independent Modules of any Initial Contributor, Subsequent Contributor, Distributor or any Recipient, and such Independent Modules may be licensed or made available under one or more separate license agreements. + +3.7. LARGER WORKS. +Any Distributor or Recipient may create or contribute to a Larger Work by combining any of the Licensed Work with other code not governed by the terms of this License, and may distribute the Larger Work as one or more products. However, in any such case, Distributor or Recipient (as the case may be) must make sure that the requirements of this License are fulfilled for the Licensed Work portion of the Larger Work. + +3.8. DESCRIPTION OF DISTRIBUTED MODIFICATIONS. + + (a) Each Subsequent Contributor (including the Initial Contributor where the Initial Contributor also qualifies as a Subsequent Contributor) must cause each Subsequent Work created or contributed to by that Subsequent Contributor to contain a file documenting the changes, in accordance with the requirements ofPart 1 of the Supplement File, that such Subsequent Contributor made in the creation or contribution to that Subsequent Work. If no Supplement File exists or no requirements are set out in Part 1 of the Supplement File, then there are no requirements for Subsequent Contributors to document changes that they make resulting in Subsequent Works. + (b) The Initial Contributor may at any time introduce requirements or add to or change earlier requirements (in each case, the "EARLIER DESCRIPTION REQUIREMENTS") for documenting changes resulting in Subsequent Works by revising Part 1 of each copy of the Supplement File distributed by the Initial Contributor with future copies of the Licensed Work so that Part 1 then contains new requirements (the "NEW DESCRIPTION REQUIREMENTS") for documenting such changes. + (c) Any Recipient receiving at any time any copy of an Initial Work or any Subsequent Work under a copy of this License (in each case, an "Earlier LICENSED COPY") having the Earlier Description Requirements may choose, with respect to each such Earlier Licensed Copy, to comply with the Earlier Description Requirements or the New Description Requirements. Where a Recipient chooses to comply with the New Description Requirements, that Recipient will, when thereafter distributing any copies of any such Earlier Licensed Copy, include a Supplement File having a section entitled Part 1 that contains a copy of the New Description Requirements. + (d) For greater certainty, the intent of Part 1 of the Supplement File is to provide a mechanism (if any) by which Subsequent Contributors must document changes that they make to the Licensed Work resulting in Subsequent Works. Part 1 of any Supplement File shall not be used to increase or reduce the scope of the license granted in Article 2 of this License or in any other way increase or decrease the rights and obligations of any Recipient, and shall at no time serve as the basis for terminating the License. Further, a Recipient can be required to correct and change its documentation procedures to comply with Part 1 of the Supplement File, but cannot be penalised with damages. Part 1 of any Supplement File is only binding on each Recipient of any Licensed Work to the extent Part 1 sets out the requirements for documenting changes to the Initial Work or any Subsequent Work. + (e) An example of a set of requirements for documenting changes and contributions made by Subsequent Contributor is set out in Part 7 of Exhibit A of this License. Part 7 is a sample only and is not binding on Recipients, unless (subject to the earlier paragraphs of this Section 3.8) those are the requirements that the Initial Contributor includes in Part 1 of the Supplement File with the copies of the Initial Work distributed under this License. + +3.9. USE OF DISTRIBUTOR NAME. +The name of a Distributor may not be used by any other Distributor to endorse or promote the Licensed Work or products derived from the Licensed Work, without prior written permission. + +3.10. LIMITED RECOGNITION OF INITIAL CONTRIBUTOR. + + (a) As a modest attribution to the Initial Contributor, in the hope that its promotional value may help justify the time, money and effort invested in writing the Initial Work, the Initial Contributor may include in Part 2 of the Supplement File a requirement that each time an executable program resulting from the Initial Work or any Subsequent Work, or a program dependent thereon, is launched or run, a prominent display of the Initial Contributor's attribution information must occur (the "ATTRIBUTION INFORMATION"). The Attribution Information must be included at the beginning of each Source Code file. For greater certainty, the Initial Contributor may specify in the Supplement File that the above attribution requirement only applies to an executable program resulting from the Initial Work or any Subsequent Work, but not a program dependent thereon. The intent is to provide for reasonably modest attribution, therefore the Initial Contributor may not require Recipients to display, at any time, more than the following Attribution Information: (a) a copyright notice including the name of the Initial Contributor; (b) a word or one phrase (not exceeding 10 words); (c) one digital image or graphic provided with the Initial Work; and (d) a URL (collectively, the "ATTRIBUTION LIMITS"). + (b) If no Supplement File exists, or no Attribution Information is set out in Part 2 of the Supplement File, then there are no requirements for Recipients to display any Attribution Information of the Initial Contributor. + (c) Each Recipient acknowledges that all trademarks, service marks and/or trade names contained withinPart 2 of the Supplement File distributed with the Licensed Work are the exclusive property of the Initial Contributor and may only be used with the permission of the Initial Contributor, or under circumstances otherwise permitted by law, or as expressly set out in this License. +3.11. For greater certainty, any description or attribution provisions contained within a Supplement File may only be used to specify the nature of the description or attribution requirements, as the case may be. Any provision in a Supplement File that otherwise purports to modify, vary, nullify or amend any right, obligation or representation contained herein shall be deemed void to that extent, and shall be of no force or effect. + +4. COMMERCIAL USE AND INDEMNITY. + +4.1. COMMERCIAL SERVICES. +A Recipient ("COMMERCIAL RECIPIENT") may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations (collectively, "SERVICES") to one or more other Recipients or Distributors. However, such Commercial Recipient may do so only on that Commercial Recipient's own behalf, and not on behalf of any other Distributor or Recipient, and Commercial Recipient must make it clear than any such warranty, support, indemnity or liability obligation(s) is/are offered by Commercial Recipient alone. At no time may Commercial Recipient use any Services to deny any party the Licensed Work in Source Code or Executable form when so required under any of the other terms of this License. For greater certainty, this Section 4.1 does not diminish any of the other terms of this License, including without limitation the obligation of the Commercial Recipient as a Distributor, when distributing any of the Licensed Work in Source Code or Executable form, to make such distribution royalty-free (subject to the right to charge a fee of no more than the cost of physically performing Source Code or Executable distribution (as the case may be)). + +4.2. INDEMNITY. +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this License is intended to facilitate the commercial use of the Licensed Work, the Distributor who includes any of the Licensed Work in a commercial product offering should do so in a manner which does not create potential liability for other Distributors. Therefore, if a Distributor includes the Licensed Work in a commercial product offering or offers any Services, such Distributor ("COMMERCIAL DISTRIBUTOR") hereby agrees to defend and indemnify every other Distributor or Subsequent Contributor (in each case an "INDEMNIFIED PARTY") against any losses, damages and costs (collectively "LOSSES") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Party to the extent caused by the acts or omissions of such Commercial Distributor in connection with its distribution of any of the Licensed Work in a commercial product offering or in connection with any Services. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Party must: (a) promptly notify the Commercial Distributor in writing of such claim; and (b) allow the Commercial Distributor to control, and co-operate with the Commercial Distributor in, the defense and any related settlement negotiations. The Indemnified Party may participate in any such claim at its own expense. + +5. VERSIONS OF THE LICENSE. + +5.1. NEW VERSIONS. +The Initial Contributor may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + +5.2. EFFECT OF NEW VERSIONS. +Once the Licensed Work or any portion thereof has been published by Initial Contributor under a particular version of the License, Recipient may choose to continue to use it under the terms of that version. However, if a Recipient chooses to use the Licensed Work under the terms of any subsequent version of the License published by the Initial Contributor, then from the date of making this choice, the Recipient must comply with the terms of that subsequent version with respect to all further reproduction, preparation of derivative works, public display of, public performance of, distribution and sublicensing by the Recipient in connection with the Licensed Work. No one other than the Initial Contributor has the right to modify the terms applicable to the Licensed Work + +6. DISCLAIMER OF WARRANTY. + +6.1. GENERAL DISCLAIMER. +EXCEPT AS EXPRESSLY SET FORTH IN THIS LICENSE, THE LICENSED WORK IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT ANY REPRESENTATION, WARRANTY, GUARANTEE, ASSURANCE OR CONDITION OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LICENSED WORK IS WITH RECIPIENT. SHOULD ANY LICENSED WORK PROVE DEFECTIVE IN ANY RESPECT, RECIPIENT (NOT THE INITIAL CONTRIBUTOR OR ANY SUBSEQUENT CONTRIBUTOR) ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS CLAUSE CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY LICENSED WORK IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS LICENSE INCLUDING WITHOUT LIMITATION THIS DISCLAIMER. + +6.2. RESPONSIBILITY OF RECIPIENTS. +Each Recipient is solely responsible for determining the appropriateness of using and distributing the Licensed Work and assumes all risks associated with its exercise of rights under this License, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +7. TERMINATION. + +7.1. This License shall continue until terminated in accordance with the express terms herein. + +7.2. Recipient may choose to terminate this License automatically at any time. + +7.3. This License, including without limitation the rights granted hereunder to a particular Recipient, will terminate automatically if such Recipient is in material breach of any of the terms of this License and fails to cure such breach within sixty (60) days of becoming aware of the breach. Without limiting the foregoing, any material breach by such Recipient of any term of any other License under which such Recipient is granted any rights to the Licensed Work shall constitute a material breach of this License. + +7.4. Upon termination of this License by or with respect to a particular Recipient for any reason, all rights granted hereunder and under any other License to that Recipient shall terminate. However, all sublicenses to the Licensed Work which were previously properly granted by such Recipient under a copy of this License (in each case, an "Other License" and in plural, "Other Licenses") shall survive any such termination of this License, including without limitation the rights and obligations under such Other Licenses as set out in their respective Sections 2, 3, 4, 5, 6, 7 and 8, mutatis mutandis, for so long as the respective sublicensees (i.e. other Recipients) remain in compliance with the terms of the copy of this License under which such sublicensees received rights to the Licensed Work. Any termination of such Other Licenses shall be pursuant to their respective Section 7, mutatis mutandis. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +7.5. Upon any termination of this License by or with respect to a particular Recipient, Sections 4.1, 4.2, 6.1, 6.2, 7.4, 7.5, 8.1, and 8.2, together with all provisions of this License necessary for the interpretation and enforcement of same, shall expressly survive such termination. + +8. LIMITATION OF LIABILITY. + +8.1. IN NO EVENT SHALL ANY OF INITIAL CONTRIBUTOR, ITS SUBSIDIARIES, OR AFFILIATES, OR ANY OF ITS OR THEIR RESPECTIVE OFFICERS, DIRECTORS, EMPLOYEES, AND/OR AGENTS (AS THE CASE MAY BE), HAVE ANY LIABILITY FOR ANY DIRECT DAMAGES, INDIRECT DAMAGES, PUNITIVE DAMAGES, INCIDENTAL DAMAGES, SPECIAL DAMAGES, EXEMPLARY DAMAGES, CONSEQUENTIAL DAMAGES OR ANY OTHER DAMAGES WHATSOEVER (INCLUDING WITHOUT LIMITATION LOSS OF USE, DATA OR PROFITS, OR ANY OTHER LOSS ARISING OUT OF OR IN ANY WAY RELATED TO THE USE, INABILITY TO USE, UNAUTHORIZED USE, PERFORMANCE, OR NON-PERFORMANCE OF THE LICENSED WORK OR ANY PART THEREOF OR THE PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, OR THAT RESULT FROM ERRORS, DEFECTS, OMISSIONS, DELAYS IN OPERATION OR TRANSMISSION, OR ANY OTHER FAILURE OF PERFORMANCE), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) IN RELATION TO OR ARISING IN ANY WAY OUT OF THIS LICENSE OR THE USE OR DISTRIBUTION OF THE LICENSED WORK OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. THIS CLAUSE CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY LICENSED WORK IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS LICENSE INCLUDING WITHOUT LIMITATION THE LIMITATIONS SET FORTH IN THIS SECTION 8.1. + +8.2. EXCEPT AS EXPRESSLY SET FORTH IN THIS LICENSE, EACH RECIPIENT SHALL NOT HAVE ANY LIABILITY FOR ANY EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE LICENSED WORK OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. + +9. GOVERNING LAW AND LEGAL ACTION. + +9.1. This License shall be governed by and construed in accordance with the laws of the Governing Jurisdiction assigned inPart 3 of Exhibit A, without regard to its conflict of law provisions. No party may bring a legal action under this License more than one year after the cause of the action arose. Each party waives its rights (if any) to a jury trial in any litigation arising under this License. Note that if the Governing Jurisdiction is not assigned in Part 3 of Exhibit A, then the Governing Jurisdiction shall be the State of New York. + +9.2. The courts of the Governing Jurisdiction shall have jurisdiction, but not exclusive jurisdiction, to entertain and determine all disputes and claims, whether for specific performance, injunction, damages or otherwise, both at law and in equity, arising out of or in any way relating to this License, including without limitation, the legality, validity, existence and enforceability of this License. Each party to this License hereby irrevocably attorns to and accepts the jurisdiction of the courts of the Governing Jurisdiction for such purposes. + +9.3. Except as expressly set forth elsewhere herein, in the event of any action or proceeding brought by any party against another under this License the prevailing party shall be entitled to recover all costs and expenses including the fees of its attorneys in such action or proceeding in such amount as the court may adjudge reasonable. + +10. MISCELLANEOUS. + +10.1. The obligations imposed by this License are for the benefit of the Initial Contributor and any Recipient, and each Recipient acknowledges and agrees that the Initial Contributor and/or any other Recipient may enforce the terms and conditions of this License against any Recipient. + +10.2. This License represents the complete agreement concerning subject matter hereof, and supersedes and cancels all previous oral and written communications, representations, agreements and understandings between the parties with respect to the subject matter hereof. + +10.3. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. + +10.4. The language in all parts of this License shall be in all cases construed simply according to its fair meaning, and not strictly for or against any of the parties hereto. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +10.5. If any provision of this License is invalid or unenforceable under the laws of the Governing Jurisdiction, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +10.6. The paragraph headings of this License are for reference and convenience only and are not a part of this License, and they shall have no effect upon the construction or interpretation of any part hereof. + +10.7. Each of the terms "including", "include" and "includes", when used in this License, is not limiting whether or not non-limiting language (such as "without limitation" or "but not limited to" or words of similar import) is used with reference thereto. + +10.8. The parties hereto acknowledge they have expressly required that this License and notices relating thereto be drafted in the English language. + +//***THE LICENSE TERMS END HERE (OTHER THAN AS SET OUT IN EXHIBIT A).***// + +EXHIBIT A (to the Adaptive Public License) + +PART 1: INITIAL CONTRIBUTOR AND DESIGNATED WEB SITE + +The Initial Contributor is: +____________________________________________________ +  +[Enter full name of Initial Contributor] + +Address of Initial Contributor: +________________________________________________ +  +________________________________________________ +  +________________________________________________ +  +[Enter address above] + +The Designated Web Site is: +__________________________________________________ +  +[Enter URL for Designated Web Site of Initial Contributor] + +NOTE: The Initial Contributor is to complete this Part 1, along with Parts 2, 3, and 5, and, if applicable, Parts 4 and 6. + +PART 2: INITIAL WORK + +The Initial Work comprises the computer program(s) distributed by the Initial Contributor having the following title(s): _______________________________________________. + +The date on which the Initial Work was first available under this License: _________________ + +PART 3: GOVERNING JURISDICTION + +For the purposes of this License, the Governing Jurisdiction is _________________________________________________. 
[Initial Contributor to Enter Governing Jurisdiction here] + +PART 4: THIRD PARTIES + +For the purposes of this License, "Third Party" has the definition set forth below in the ONE paragraph selected by the Initial Contributor from paragraphs A, B, C, D and E when the Initial Work is distributed or otherwise made available by the Initial Contributor. To select one of the following paragraphs, the Initial Contributor must place an "X" or "x" in the selection box alongside the one respective paragraph selected. +SELECTION +  +BOX PARAGRAPH +[  ] A. "THIRD PARTY" means any third party. +  +  +[  ] B. "THIRD PARTY" means any third party except for any of the following: (a) a wholly owned subsidiary of the Subsequent Contributor in question; (b) a legal entity (the "PARENT") that wholly owns the Subsequent Contributor in question; or (c) a wholly owned subsidiary of the wholly owned subsidiary in (a) or of the Parent in (b). +  +  +[  ] C. "THIRD PARTY" means any third party except for any of the following: (a) any Person directly or indirectly owning a majority of the voting interest in the Subsequent Contributor or (b) any Person in which the Subsequent Contributor directly or indirectly owns a majority voting interest. +  +  +[  ] D. "THIRD PARTY" means any third party except for any Person directly or indirectly controlled by the Subsequent Contributor. For purposes of this definition, "control" shall mean the power to direct or cause the direction of, the management and policies of such Person whether through the ownership of voting interests, by contract, or otherwise. +  +  +[  ] E. "THIRD PARTY" means any third party except for any Person directly or indirectly controlling, controlled by, or under common control with the Subsequent Contributor. For purposes of this definition, "control" shall mean the power to direct or cause the direction of, the management and policies of such Person whether through the ownership of voting interests, by contract, or otherwise. +The default definition of "THIRD PARTY" is the definition set forth in paragraph A, if NONE OR MORE THAN ONE of paragraphs A, B, C, D or E in this Part 4 are selected by the Initial Contributor. + +PART 5: NOTICE + +THE LICENSED WORK IS PROVIDED UNDER THE TERMS OF THE ADAPTIVE PUBLIC LICENSE ("LICENSE") AS FIRST COMPLETED BY: ______________________ [Insert the name of the Initial Contributor here]. ANY USE, PUBLIC DISPLAY, PUBLIC PERFORMANCE, REPRODUCTION OR DISTRIBUTION OF, OR PREPARATION OF DERIVATIVE WORKS BASED ON, THE LICENSED WORK CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS LICENSE AND ITS TERMS, WHETHER OR NOT SUCH RECIPIENT READS THE TERMS OF THE LICENSE. "LICENSED WORK" AND "RECIPIENT" ARE DEFINED IN THE LICENSE. A COPY OF THE LICENSE IS LOCATED IN THE TEXT FILE ENTITLED "LICENSE.TXT" ACCOMPANYING THE CONTENTS OF THIS FILE. IF A COPY OF THE LICENSE DOES NOT ACCOMPANY THIS FILE, A COPY OF THE LICENSE MAY ALSO BE OBTAINED AT THE FOLLOWING WEB SITE: ___________________________________________________[Insert Initial Contributor's Designated Web Site here] + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +PART 6: PATENT LICENSING TERMS + +For the purposes of this License, paragraphs A, B, C, D and E of this Part 6 of Exhibit A are only incorporated and form part of the terms of the License if the Initial Contributor places an "X" or "x" in the selection box alongside the YES answer to the question immediately below. + +Is this a Patents-Included License pursuant to Section 2.2 of the License? +YES [      ] +NO [      ] + +By default, if YES is not selected by the Initial Contributor, the answer is NO. + +A. For the purposes of the paragraphs in this Part 6 of Exhibit A, "LICENSABLE" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights granted herein. + +B. The Initial Contributor hereby grants all Recipients a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, under patent claim(s) Licensable by the Initial Contributor that are or would be infringed by the making, using, selling, offering for sale, having made, importing, exporting, transfer or disposal of such Initial Work or any portion thereof. Notwithstanding the foregoing, no patent license is granted under this Paragraph B by the Initial Contributor: (1) for any code that the Initial Contributor deletes from the Initial Work (or any portion thereof) distributed by the Initial Contributor prior to such distribution; (2) for any Modifications made to the Initial Work (or any portion thereof) by any other Person; or (3) separate from the Initial Work (or portions thereof) distributed or made available by the Initial Contributor. + +C. Effective upon distribution by a Subsequent Contributor to a Third Party of any Modifications made by that Subsequent Contributor, such Subsequent Contributor hereby grants all Recipients a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, under patent claim(s) Licensable by such Subsequent Contributor that are or would be infringed by the making, using, selling, offering for sale, having made, importing, exporting, transfer or disposal of any such Modifications made by that Subsequent Contributor alone and/or in combination with its Subsequent Work (or portions of such combination) to make, use, sell, offer for sale, have made, import, export, transfer and otherwise dispose of: +(1) Modifications made by that Subsequent Contributor (or portions thereof); and +(2) the combination of Modifications made by that Subsequent Contributor with its Subsequent Work (or portions of such combination); +(collectively and in each case, the "SUBSEQUENT CONTRIBUTOR VERSION"). +Notwithstanding the foregoing, no patent license is granted under this Paragraph C by such Subsequent Contributor: (1) for any code that such Subsequent Contributor deletes from the Subsequent Contributor Version (or any portion thereof) distributed by the Subsequent Contributor prior to such distribution; (2) for any Modifications made to the Subsequent Contributor Version (or any portion thereof) by any other Person; or (3) separate from the Subsequent Contributor Version (or portions thereof) distributed or made available by the Subsequent Contributor. + +D. Effective upon distribution of any Licensed Work by a Distributor to a Third Party, such Distributor hereby grants all Recipients a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, under patent claim(s) Licensable by such Distributor that are or would be infringed by the making, using, selling, offering for sale, having made, importing, exporting, transfer or disposal of any such Licensed Work distributed by such Distributor, to make, use, sell, offer for sale, have made, import, export, transfer and otherwise dispose of such Licensed Work or portions thereof (collectively and in each case, the "DISTRIBUTOR VERSION"). Notwithstanding the foregoing, no patent license is granted under this Paragraph D by such Distributor: (1) for any code that such Distributor deletes from the Distributor Version (or any portion thereof) distributed by the Distributor prior to such distribution; (2) for any Modifications made to the Distributor Version (or any portion thereof) by any other Person; or (3) separate from the Distributor Version (or portions thereof) distributed or made available by the Distributor. + +E. If Recipient institutes patent litigation against another Recipient (a "USER") with respect to a patent applicable to a computer program or software (including a cross-claim or counterclaim in a lawsuit, and whether or not any of the patent claims are directed to a system, method, process, apparatus, device, product, article of manufacture or any other form of patent claim), then any patent or copyright license granted by that User to such Recipient under this License or any other copy of this License shall terminate. The termination shall be effective ninety (90) days after notice of termination from User to Recipient, unless the Recipient withdraws the patent litigation claim before the end of the ninety (90) day period. To be effective, any such notice of license termination must include a specific list of applicable patents and/or a copy of the copyrighted work of User that User alleges will be infringed by Recipient upon License termination. License termination is only effective with respect to patents and/or copyrights for which proper notice has been given. + +PART 7: SAMPLE REQUIREMENTS FOR THE DESCRIPTION OF DISTRIBUTED MODIFICATIONS + +Each Subsequent Contributor (including the Initial Contributor where the Initial Contributor qualifies as a Subsequent Contributor) is invited (but not required) to cause each Subsequent Work created or contributed to by that Subsequent Contributor to contain a file documenting the changes such Subsequent Contributor made to create that Subsequent Work and the date of any change. //***EXHIBIT A ENDS HERE.***// diff --git a/options/license/APSL-1.0 b/options/license/APSL-1.0 new file mode 100644 index 0000000..03f4962 --- /dev/null +++ b/options/license/APSL-1.0 @@ -0,0 +1,109 @@ +APPLE PUBLIC SOURCE LICENSE +Version 1.0 - March 16, 1999 + +Please read this License carefully before downloading this software. By downloading and using this software, you are agreeing to be bound by the terms of this License. If you do not or cannot agree to the terms of this License, please do not download or use the software. + +1. General; Definitions. This License applies to any program or other work which Apple Computer, Inc. ("Apple") publicly announces as subject to this Apple Public Source License and which contains a notice placed by Apple identifying such program or work as "Original Code" and stating that it is subject to the terms of this Apple Public Source License version 1.0 (or subsequent version thereof), as it may be revised from time to time by Apple ("License"). As used in this License: + + 1.1 "Applicable Patents" mean: (a) in the case where Apple is the grantor of rights, (i) patents or patent applications that are now or hereafter acquired, owned by or assigned to Apple and (ii) whose claims cover subject matter contained in the Original Code, but only to the extent necessary to use, reproduce and/or distribute the Original Code without infringement; and (b) in the case where You are the grantor of rights, (i) patents and patent applications that are now or hereafter acquired, owned by or assigned to You and (ii) whose claims cover subject matter in Your Modifications, taken alone or in combination with Original Code. + + 1.2 "Covered Code" means the Original Code, Modifications, the combination of Original Code and any Modifications, and/or any respective portions thereof. + + 1.3 "Deploy" means to use, sublicense or distribute Covered Code other than for Your internal research and development (R&D), and includes without limitation, any and all internal use or distribution of Covered Code within Your business or organization except for R&D use, as well as direct or indirect sublicensing or distribution of Covered Code by You to any third party in any form or manner. + + 1.4 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.5 "Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of Covered Code. When code is released as a series of files, a Modification is: (a) any addition to or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code. + + 1.6 "Original Code" means the Source Code of a program or other work as originally made available by Apple under this License, including the Source Code of any updates or upgrades to such programs or works made available by Apple under this License, and that has been expressly identified by Apple as such in the header file(s) of such work. + + 1.7 "Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code). + + 1.8 "You" or "Your" means an individual or a legal entity exercising rights under this License. For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Permitted Uses; Conditions & Restrictions. Subject to the terms and conditions of this License, Apple hereby grants You, effective on the date You accept this License and download the Original Code, a world-wide, royalty-free, non-exclusive license, to the extent of Apple's Applicable Patents and copyrights covering the Original Code, to do the following: + + 2.1 You may use, copy, modify and distribute Original Code, with or without Modifications, solely for Your internal research and development, provided that You must in each instance: + + (a) retain and reproduce in all copies of Original Code the copyright and other proprietary notices and disclaimers of Apple as they appear in the Original Code, and keep intact all notices in the Original Code that refer to this License; + + (b) include a copy of this License with every copy of Source Code of Covered Code and documentation You distribute, and You may not offer or impose any terms on such Source Code that alter or restrict this License or the recipients' rights hereunder, except as permitted under Section 6; and + + (c) completely and accurately document all Modifications that you have made and the date of each such Modification, designate the version of the Original Code you used, prominently include a file carrying such information with the Modifications, and duplicate the notice in Exhibit A in each file of the Source Code of all such Modifications. + + 2.2 You may Deploy Covered Code, provided that You must in each instance: + + (a) satisfy all the conditions of Section 2.1 with respect to the Source Code of the Covered Code; + + (b) make all Your Deployed Modifications publicly available in Source Code form via electronic distribution (e.g. download from a web site) under the terms of this License and subject to the license grants set forth in Section 3 below, and any additional terms You may choose to offer under Section 6. You must continue to make the Source Code of Your Deployed Modifications available for as long as you Deploy the Covered Code or twelve (12) months from the date of initial Deployment, whichever is longer; + + (c) must notify Apple and other third parties of how to obtain Your Deployed Modifications by filling out and submitting the required information found at http://www.apple.com/publicsource/modifications.html; and + + (d) if you Deploy Covered Code in object code, executable form only, include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code. + +3. Your Grants. In consideration of, and as a condition to, the licenses granted to You under this License: + + (a) You hereby grant to Apple and all third parties a non-exclusive, royalty-free license, under Your Applicable Patents and other intellectual property rights owned or controlled by You, to use, reproduce, modify, distribute and Deploy Your Modifications of the same scope and extent as Apple's licenses under Sections 2.1 and 2.2; and + + (b) You hereby grant to Apple and its subsidiaries a non-exclusive, worldwide, royalty-free, perpetual and irrevocable license, under Your Applicable Patents and other intellectual property rights owned or controlled by You, to use, reproduce, execute, compile, display, perform, modify or have modified (for Apple and/or its subsidiaries), sublicense and distribute Your Modifications, in any form, through multiple tiers of distribution. + +4. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof. + +5. Limitations on Patent License. Except as expressly stated in Section 2, no other patent rights, express or implied, are granted by Apple herein. Modifications and/or Larger Works may require additional patent licenses from Apple which Apple may grant in its sole discretion. + +6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the scope of the license granted herein ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Apple. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Apple harmless for any liability incurred by or claims asserted against Apple by reason of any such Additional Terms. + +7. Versions of the License. Apple may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Apple. No one other than Apple has the right to modify the terms applicable to Covered Code created under this License. + +8. NO WARRANTY OR SUPPORT. The Original Code may contain in whole or in part pre-release, untested, or not fully tested works. The Original Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies. You expressly acknowledge and agree that use of the Original Code, or any portion thereof, is at Your sole and entire risk. THE ORIGINAL CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND APPLE'S LICENSOR(S) (FOR THE PURPOSES OF SECTIONS 8 AND 9, APPLE AND APPLE'S LICENSOR(S) ARE COLLECTIVELY REFERRED TO AS "APPLE") EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY OR SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. APPLE DOES NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE ORIGINAL CODE WILL MEET YOUR REQUIREMENTS, OR THAT THE OPERATION OF THE ORIGINAL CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE ORIGINAL CODE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY OR IN ANY WAY INCREASE THE SCOPE OF THIS WARRANTY. You acknowledge that the Original Code is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Original Code could lead to death, personal injury, or severe physical or environmental damage. + +9. Liability. + + 9.1 Infringement. If any of the Original Code becomes the subject ofa claim of infringement ("Affected Original Code"), Apple may, at its sole discretion and option: (a) attempt to procure the rights necessary for You to continue using the Affected Original Code; (b) modify the Affected Original Code so that it is no longer infringing; or (c) terminate Your rights to use the Affected Original Code, effective immediately upon Apple's posting of a notice to such effect on the Apple web site that is used for implementation of this License. + + 9.2 LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES SHALL APPLE BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE ORIGINAL CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. In no event shall Apple's total liability to You for all damages under this License exceed the amount of fifty dollars ($50.00). + +10. Trademarks. This License does not grant any rights to use the trademarks or trade names "Apple", "Apple Computer", "Mac OS X", "Mac OS X Server" or any other trademarks or trade names belonging to Apple (collectively "Apple Marks") and no Apple Marks may be used to endorse or promote products derived from the Original Code +other than as permitted by and in strict compliance at all times with Apple's third party trademark usage guidelines which are posted at http://www.apple.com/legal/guidelinesfor3rdparties.html. + +11. Ownership. Apple retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Apple ("Apple Modifications"), and such Apple Modifications will not be automatically subject to this License. Apple may, at its sole discretion, choose to license such Apple Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all. Apple's development, use, reproduction, modification, sublicensing and distribution of Covered Code will not be subject to this License. + +12. Termination. + + 12.1 Termination. This License and the rights granted hereunder will terminate: + + (a) automatically without notice from Apple if You fail to comply with any term(s) of this License and fail to cure such breach within 30 days of becoming aware of such breach; + + (b) immediately in the event of the circumstances described in Sections 9.1 and/or 13.6(b); or + + (c) automatically without notice from Apple if You, at any time during the term of this License, commence an action for patent infringement against Apple. + + 12.2 Effect of Termination. Upon termination, You agree to immediately stop any further use, reproduction, modification and distribution of the Covered Code, or Affected Original Code in the case of termination under Section 9.1, and to destroy all copies of the Covered Code or Affected Original Code (in the case of +termination under Section 9.1) that are in your possession or control. All sublicenses to the Covered Code which have been properly granted prior to termination shall survive any termination of this License. Provisions which, by their nature, should remain in effect beyond the termination of this License shall survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. Neither party will be liable to the other for compensation, indemnity or damages of any sort solely as a result of terminating this License in accordance with its terms, and termination of this License will be without prejudice to any other right or remedy of either party. + +13. Miscellaneous. + + 13.1 Export Law Assurances. You may not use or otherwise export or re-export the Original Code except as authorized by United States law and the laws of the jurisdiction in which the Original Code was obtained. In particular, but without limitation, the Original Code may not be exported or re-exported (a) into (or to a national or resident of) any U.S. embargoed country or (b) to anyone on the U.S. Treasury Department's list of Specially Designated Nationals or the U.S. Department of Commerce's Table of Denial Orders. By using the Original Code, You represent and warrant that You are not located in, under control of, or a national or resident of any such country or on any such list. + + 13.2 Government End Users. The Covered Code is a "commercial item" as defined in FAR 2.101. Government software and technical data rights in the Covered Code include only those rights customarily provided to the public as defined in this License. This customary commercial license in technical data and software is provided in +accordance with FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation). Accordingly, all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 13.3 Relationship of Parties. This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between You and Apple, and You will not represent to the contrary, whether expressly, by implication, appearance or otherwise. + + 13.4 Independent Development. Nothing in this License will impair Apple's right to acquire, license, develop, have others develop for it, market and/or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Larger Works, technology or products that You may develop, produce, market or distribute. + + 13.5 Waiver; Construction. Failure by Apple to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision. Any law or regulation which provides that the language of a contract shall be construed against the drafter will not apply to this License. + + 13.6 Severability. (a) If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and effect. (b) Notwithstanding the foregoing, if applicable law prohibits or restricts You from fully and/or specifically complying with Sections 2 and/or 3 or prevents the enforceability of either of those Sections, this License will immediately terminate and You must immediately discontinue any use of the Covered Code and destroy all copies of it that are in your possession or control. + + 13.7 Dispute Resolution. Any litigation or other dispute resolution between You and Apple relating to this License shall take place in the Northern District of California, and You and Apple hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that District with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. + + 13.8 Entire Agreement; Governing Law. This License constitutes the entire agreement between the parties with respect to the subject matter hereof. This License shall be governed by the laws of the United States and the State of California, except that body of California law concerning conflicts of law. + + Where You are located in the province of Quebec, Canada, the following clause applies: The parties hereby confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exige que le present contrat et tous les documents connexes soient rediges en anglais. + +EXHIBIT A. + +"Portions Copyright (c) 1999 Apple Computer, Inc. All Rights Reserved. This file contains Original Code and/or Modifications of Original Code as defined in and that are subject to the Apple Public Source License Version 1.0 (the 'License'). You may not use this file except in compliance with the License. Please obtain a copy of the License at http://www.apple.com/publicsource and read it before using this file. + +The Original Code and all software distributed under the License are distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the License for the specific language governing rights and limitations under the License." \ No newline at end of file diff --git a/options/license/APSL-1.1 b/options/license/APSL-1.1 new file mode 100644 index 0000000..bd7b440 --- /dev/null +++ b/options/license/APSL-1.1 @@ -0,0 +1,108 @@ +APPLE PUBLIC SOURCE LICENSE +Version 1.1 - April 19,1999 + +Please read this License carefully before downloading this software. +By downloading and using this software, you are agreeing to be bound by the terms of this License. If you do not or cannot agree to the terms of this License, please do not download or use the software. + +1. General; Definitions. This License applies to any program or other work which Apple Computer, Inc. ("Apple") publicly announces as subject to this Apple Public Source License and which contains a notice placed by Apple identifying such program or work as "Original Code" and stating that it is subject to the terms of this Apple Public Source License version 1.1 (or subsequent version thereof), as it may be revised from time to time by Apple ("License"). As used in this License: + + 1.1 "Affected Original Code" means only those specific portions of Original Code that allegedly infringe upon any party's intellectual property rights or are otherwise the subject of a claim of infringement. + + 1.2 "Applicable Patent Rights" mean: (a) in the case where Apple is the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to Apple and (ii) that cover subject matter contained in the Original Code, but only to the extent necessary to use, reproduce and/or distribute the Original Code without infringement; and (b) in the case where You are the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to You and (ii) that cover subject matter in Your Modifications, taken alone or in combination with Original Code. + + 1.3 "Covered Code" means the Original Code, Modifications, the combination of Original Code and any Modifications, and/or any respective portions thereof. + + 1.4 "Deploy" means to use, sublicense or distribute Covered Code other than for Your internal research and development (R&D), and includes without limitation, any and all internal use or distribution of Covered Code within Your business or organization except for R&D use, as well as direct or indirect sublicensing or distribution of Covered Code by You to any third party in any form or manner. + + 1.5 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.6 "Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of Covered Code. When code is released as a series of files, a Modification is: (a) any addition to or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code. + + 1.7 "Original Code" means (a) the Source Code of a program or other work as originally made available by Apple under this License, including the Source Code of any updates or upgrades to such programs or works made available by Apple under this License, and that has been expressly identified by Apple as such in the header file(s) of such work; and (b) the object code compiled from such Source Code and originally made available by Apple under this License. + + 1.8 "Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code). + + 1.9 "You" or "Your" means an individual or a legal entity exercising rights under this License. For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Permitted Uses; Conditions & Restrictions. Subject to the terms and conditions of this License, Apple hereby grants You, effective on the date You accept this License and download the Original Code, a world-wide, royalty-free, non- exclusive license, to the extent of Apple's Applicable Patent Rights and copyrights covering the Original Code, to do the following: + + 2.1 You may use, copy, modify and distribute Original Code, with or without Modifications, solely for Your internal research and development, provided that You must in each instance: + + (a) retain and reproduce in all copies of Original Code the copyright and other proprietary notices and disclaimers of Apple as they appear in the Original Code, and keep intact all notices in the Original Code that refer to this License; + + (b) include a copy of this License with every copy of Source Code of Covered Code and documentation You distribute, and You may not offer or impose any terms on such Source Code that alter or restrict this License or the recipients' rights hereunder, except as permitted under Section 6; and + + (c) completely and accurately document all Modifications that you have made and the date of each such Modification, designate the version of the Original Code you used, prominently include a file carrying such information with the Modifications, and duplicate the notice in Exhibit A in each file of the Source Code of all such Modifications. + + 2.2 You may Deploy Covered Code, provided that You must in each instance: + + (a) satisfy all the conditions of Section 2.1 with respect to the Source Code of the Covered Code; + + (b) make all Your Deployed Modifications publicly available in Source Code form via electronic distribution (e.g. download from a web site) under the terms of this License and subject to the license grants set forth in Section 3 below, and any additional terms You may choose to offer under Section 6. You must continue to make the Source Code of Your Deployed Modifications available for as long as you Deploy the Covered Code or twelve (12) months from the date of initial Deployment, whichever is longer; + + (c) if You Deploy Covered Code containing Modifications made by You, inform others of how to obtain those Modifications by filling out and submitting the information found at http://www.apple.com/publicsource/modifications.html, if available; and + + (d) if You Deploy Covered Code in object code, executable form only, include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code. + +3. Your Grants. In consideration of, and as a condition to, the licenses granted to You under this License: + + (a) You hereby grant to Apple and all third parties a non-exclusive, royalty-free license, under Your Applicable Patent Rights and other intellectual property rights owned or controlled by You, to use, reproduce, modify, distribute and Deploy Your Modifications of the same scope and extent as Apple's licenses under Sections 2.1 and 2.2; and + + (b) You hereby grant to Apple and its subsidiaries a non-exclusive, worldwide, royalty-free, perpetual and irrevocable license, under Your Applicable Patent Rights and other intellectual property rights owned or controlled by You, to use, reproduce, execute, compile, display, perform, modify or have modified (for Apple and/or its subsidiaries), sublicense and distribute Your Modifications, in any form, through multiple tiers of distribution. + +4. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof. + +5. Limitations on Patent License. Except as expressly stated in Section 2, no other patent rights, express or implied, are granted by Apple herein. Modifications and/or Larger Works may require additional patent licenses from Apple which Apple may grant in its sole discretion. + +6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the scope of the license granted herein ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Apple. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Apple harmless for any liability incurred by or claims asserted against Apple by reason of any such Additional Terms. + +7. Versions of the License. Apple may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Apple. No one other than Apple has the right to modify the terms applicable to Covered Code created under this License. + +8. NO WARRANTY OR SUPPORT. The Original Code may contain in whole or in part pre-release, untested, or not fully tested works. The Original Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies. You expressly acknowledge and agree that use of the Original Code, or any portion thereof, is at Your sole and entire risk. THE ORIGINAL CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND APPLE'S LICENSOR(S) (FOR THE PURPOSES OF SECTIONS 8 AND 9, APPLE AND APPLE'S LICENSOR(S) ARE COLLECTIVELY REFERRED TO AS "APPLE") EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY OR SATISFACTORY QUALITY AND FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. APPLE DOES NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE ORIGINAL CODE WILL MEET YOUR REQUIREMENTS, OR THAT THE OPERATION OF THE ORIGINAL CODE WILL BE UNINTERRUPTED OR ERROR- FREE, OR THAT DEFECTS IN THE ORIGINAL CODE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY OR IN ANY WAY INCREASE THE SCOPE OF THIS WARRANTY. You acknowledge that the Original Code is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Original Code could lead to death, personal injury, or severe physical or environmental damage. + +9. Liability. + + 9.1 Infringement. If any portion of, or functionality implemented by, the Original Code becomes the subject of a claim of infringement, Apple may, at its option: (a) attempt to procure the rights necessary for Apple and You to continue using the Affected Original Code; (b) modify the Affected Original Code so that it is no longer infringing; or (c) suspend Your rights to use, reproduce, modify, sublicense and distribute the Affected Original Code until a final determination of the claim is made by a court or governmental administrative agency of competent jurisdiction and Apple lifts the suspension as set forth below. Such suspension of rights will be effective immediately upon Apple's posting of a notice to such effect on the Apple web site that is used for implementation of this License. Upon such final determination being made, if Apple is legally able, without the payment of a fee or royalty, to resume use, reproduction, modification, sublicensing and distribution of the Affected Original Code, Apple will lift the suspension of rights to the Affected Original Code by posting a notice to such effect on the Apple web site that is used for implementation of this License. If Apple suspends Your rights to Affected Original Code, nothing in this License shall be construed to restrict You, at Your option and subject to applicable law, from replacing the Affected Original Code with non-infringing code or independently negotiating for necessary rights from such third party. + + 9.2 LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES SHALL APPLE BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE ORIGINAL CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. In no event shall Apple's total liability to You for all damages under this License exceed the amount of fifty dollars ($50.00). + +10. Trademarks. This License does not grant any rights to use the trademarks or trade names "Apple", "Apple Computer", "Mac OS X", "Mac OS X Server" or any other trademarks or trade names belonging to Apple (collectively "Apple Marks") and no Apple Marks may be used to endorse or promote products derived from the Original Code other than as permitted by and in strict compliance at all times with Apple's third party trademark usage guidelines which are posted at http://www.apple.com/legal/guidelinesfor3rdparties.html. + +11. Ownership. Apple retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Apple ("Apple Modifications"), and such Apple Modifications will not be automatically subject to this License. Apple may, at its sole discretion, choose to license such Apple Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all. Apple's development, use, reproduction, modification, sublicensing and distribution of Covered Code will not be subject to this License. + +12. Termination. + + 12.1 Termination. This License and the rights granted hereunder will terminate: + + (a) automatically without notice from Apple if You fail to comply with any term(s) of this License and fail to cure such breach within 30 days of becoming aware of such breach; + + (b) immediately in the event of the circumstances described in Section 13.5(b); or + + (c) automatically without notice from Apple if You, at any time during the term of this License, commence an action for patent infringement against Apple. + + 12.2 Effect of Termination. Upon termination, You agree to immediately stop any further use, reproduction, modification, sublicensing and distribution of the Covered Code and to destroy all copies of the Covered Code that are in your possession or control. All sublicenses to the Covered Code which have been properly granted prior to termination shall survive any termination of this License. Provisions which, by their nature, should remain in effect beyond the termination of this License shall survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. Neither party will be liable to the other for compensation, indemnity or damages of any sort solely as a result of terminating this License in accordance with its terms, and termination of this License will be without prejudice to any other right or remedy of either party. + +13. Miscellaneous. + + 13.1 Government End Users. The Covered Code is a "commercial item" as defined in FAR 2.101. Government software and technical data rights in the Covered Code include only those rights customarily provided to the public as defined in this License. This customary commercial license in technical data and software is provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation). Accordingly, all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 13.2 Relationship of Parties. This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between You and Apple, and You will not represent to the contrary, whether expressly, by implication, appearance or otherwise. + + 13.3 Independent Development. Nothing in this License will impair Apple's right to acquire, license, develop, have others develop for it, market and/or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Larger Works, technology or products that You may +develop, produce, market or distribute. + + 13.4 Waiver; Construction. Failure by Apple to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision. Any law or regulation which provides that the language of a contract shall be construed against the drafter will not apply to this License. + + 13.5 Severability. (a) If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and effect. (b) Notwithstanding the foregoing, if applicable law prohibits or restricts You from fully and/or specifically complying with Sections 2 and/or 3 or prevents the enforceability of either of those Sections, this License will immediately terminate and You must immediately discontinue any use of the Covered Code and destroy all copies of it that are in your possession or control. + + 13.6 Dispute Resolution. Any litigation or other dispute resolution between You and Apple relating to this License shall take place in the Northern District of California, and You and Apple hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that District with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. + + 13.7 Entire Agreement; Governing Law. This License constitutes the entire agreement between the parties with respect to the subject matter hereof. This License shall be governed by the laws of the United States and the State of California, except that body of California law concerning conflicts of law. + + Where You are located in the province of Quebec, Canada, the following clause applies: The parties hereby confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exige que le present contrat et tous les documents connexes soient rediges en anglais. + +EXHIBIT A. + +"Portions Copyright (c) 1999-2000 Apple Computer, Inc. All Rights Reserved. This file contains Original Code and/or Modifications of Original Code as defined in and that are subject to the Apple Public Source License Version 1.1 (the "License"). You may not use this file except in compliance with the License. Please obtain a copy of the License at http://www.apple.com/publicsource and read it before using this file. + +The Original Code and all software distributed under the License are distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the License for the specific language governing rights and limitations under the License." \ No newline at end of file diff --git a/options/license/APSL-1.2 b/options/license/APSL-1.2 new file mode 100644 index 0000000..4b0eff9 --- /dev/null +++ b/options/license/APSL-1.2 @@ -0,0 +1,103 @@ +Apple Public Source License Ver. 1.2 + +1. General; Definitions. This License applies to any program or other work which Apple Computer, Inc. ("Apple") makes publicly available and which contains a notice placed by Apple identifying such program or work as "Original Code" and stating that it is subject to the terms of this Apple Public Source License version 1.2 (or subsequent version thereof) ("License"). As used in this License: + + 1.1 "Applicable Patent Rights" mean: (a) in the case where Apple is the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to Apple and (ii) that cover subject matter contained in the Original Code, but only to the extent necessary to use, reproduce and/or distribute the Original Code without infringement; and (b) in the case where You are the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to You and (ii) that cover subject matter in Your Modifications, taken alone or in combination with Original Code. + + 1.2 "Contributor" means any person or entity that creates or contributes to the creation of Modifications. + + 1.3 "Covered Code" means the Original Code, Modifications, the combination of Original Code and any Modifications, and/or any respective portions thereof. + + 1.4 "Deploy" means to use, sublicense or distribute Covered Code other than for Your internal research and development (R&D) and/or Personal Use, and includes without limitation, any and all internal use or distribution of Covered Code within Your business or organization except for R&D use and/or Personal Use, as well as direct or indirect sublicensing or distribution of Covered Code by You to any third party in any form or manner. + + 1.5 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.6 "Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of the Original Code, any previous Modifications, the combination of Original Code and any previous Modifications, and/or any respective portions thereof. When code is released as a series of files, a Modification is: (a) any addition to or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code. + + 1.7 "Original Code" means (a) the Source Code of a program or other work as originally made available by Apple under this License, including the Source Code of any updates or upgrades to such programs or works made available by Apple under this License, and that has been expressly identified by Apple as such in the header file(s) of such work; and (b) the object code compiled from such Source Code and originally made available by Apple under this License. + + 1.8 "Personal Use" means use of Covered Code by an individual solely for his or her personal, private and non-commercial purposes. An individual's use of Covered Code in his or her capacity as an officer, employee, member, independent contractor or agent of a corporation, business or organization (commercial or non-commercial) does not qualify as Personal Use. + + 1.9 "Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code). + + 1.10 "You" or "Your" means an individual or a legal entity exercising rights under this License. For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Permitted Uses; Conditions & Restrictions.Subject to the terms and conditions of this License, Apple hereby grants You, effective on the date You accept this License and download the Original Code, a world-wide, royalty-free, non-exclusive license, to the extent of Apple's Applicable Patent Rights and copyrights covering the Original Code, to do the following: + + 2.1 You may use, reproduce, display, perform, modify and distribute Original Code, with or without Modifications, solely for Your internal research and development and/or Personal Use, provided that in each instance: + + (a) You must retain and reproduce in all copies of Original Code the copyright and other proprietary notices and disclaimers of Apple as they appear in the Original Code, and keep intact all notices in the Original Code that refer to this License; and + + (b) You must include a copy of this License with every copy of Source Code of Covered Code and documentation You distribute, and You may not offer or impose any terms on such Source Code that alter or restrict this License or the recipients' rights hereunder, except as permitted under Section 6. + + 2.2 You may use, reproduce, display, perform, modify and Deploy Covered Code, provided that in each instance: + + (a) You must satisfy all the conditions of Section 2.1 with respect to the Source Code of the Covered Code; + + (b) You must duplicate, to the extent it does not already exist, the notice in Exhibit A in each file of the Source Code of all Your Modifications, and cause the modified files to carry prominent notices stating that You changed the files and the date of any change; + + (c) You must make Source Code of all Your Deployed Modifications publicly available under the terms of this License, including the license grants set forth in Section 3 below, for as long as you Deploy the Covered Code or twelve (12) months from the date of initial Deployment, whichever is longer. You should preferably distribute the Source Code of Your Deployed Modifications electronically (e.g. download from a web site); and + + (d) if You Deploy Covered Code in object code, executable form only, You must include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code. + + 2.3 You expressly acknowledge and agree that although Apple and each Contributor grants the licenses to their respective portions of the Covered Code set forth herein, no assurances are provided by Apple or any Contributor that the Covered Code does not infringe the patent or other intellectual property rights of any other entity. Apple and each Contributor disclaim any liability to You for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, You hereby assume sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow You to distribute the Covered Code, it is Your responsibility to acquire that license before distributing the Covered Code. + +3. Your Grants. In consideration of, and as a condition to, the licenses granted to You under this License: + + (a) You hereby grant to Apple and all third parties a non-exclusive, royalty-free license, under Your Applicable Patent Rights and other intellectual property rights (other than patent) owned or controlled by You, to use, reproduce, display, perform, modify, distribute and Deploy Your Modifications of the same scope and extent as Apple's licenses under Sections 2.1 and 2.2; and + + (b) You hereby grant to Apple and its subsidiaries a non-exclusive, worldwide, royalty-free, perpetual and irrevocable license, under Your Applicable Patent Rights and other intellectual property rights (other than patent) owned or controlled by You, to use, reproduce, display, perform, modify or have modified (for Apple and/or its subsidiaries), sublicense and distribute Your Modifications, in any form, through multiple tiers of distribution. + +4. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof. + +5. Limitations on Patent License. Except as expressly stated in Section 2, no other patent rights, express or implied, are granted by Apple herein. Modifications and/or Larger Works may require additional patent licenses from Apple which Apple may grant in its sole discretion. + +6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the scope of the license granted herein ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Apple or any Contributor. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Apple and every Contributor harmless for any liability incurred by or claims asserted against Apple or such Contributor by reason of any such Additional Terms. + +7. Versions of the License. Apple may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Apple. No one other than Apple has the right to modify the terms applicable to Covered Code created under this License. + +8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part pre-release, untested, or not fully tested works. The Covered Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies. You expressly acknowledge and agree that use of the Covered Code, or any portion thereof, is at Your sole and entire risk. THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND APPLE'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. APPLE AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE, AN APPLE AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You acknowledge that the Covered Code is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Covered Code could lead to death, personal injury, or severe physical or environmental damage. + +9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL APPLE OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF APPLE OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to You for all damages (other than as may be required by applicable law) under this License exceed the amount of fifty dollars ($50.00). + +10. Trademarks. This License does not grant any rights to use the trademarks or trade names "Apple", "Apple Computer", "Mac OS X", "Mac OS X Server", "QuickTime", "QuickTime Streaming Server" or any other trademarks or trade names belonging to Apple (collectively "Apple Marks") or to any trademark or trade name belonging to any Contributor. No Apple Marks may be used to endorse or promote products derived from the Original Code other than as permitted by and in strict compliance at all times with Apple's third party trademark usage guidelines which are posted at http://www.apple.com/legal/guidelinesfor3rdparties.html. + +11. Ownership. Subject to the licenses granted under this License, each Contributor retains all rights, title and interest in and to any Modifications made by such Contributor. Apple retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Apple ("Apple Modifications"), and such Apple Modifications will not be automatically subject to this License. Apple may, at its sole discretion, choose to license such Apple Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all. + +12. Termination. + + 12.1 Termination. This License and the rights granted hereunder will terminate: + + (a) automatically without notice from Apple if You fail to comply with any term(s) of this License and fail to cure such breach within 30 days of becoming aware of such breach; + + (b) immediately in the event of the circumstances described in Section 13.5(b); or + + (c) automatically without notice from Apple if You, at any time during the term of this License, commence an action for patent infringement against Apple. + + 12.2 Effect of Termination. Upon termination, You agree to immediately stop any further use, reproduction, modification, sublicensing and distribution of the Covered Code and to destroy all copies of the Covered Code that are in your possession or control. All sublicenses to the Covered Code which have been properly granted prior to termination shall survive any termination of this License. Provisions which, by their nature, should remain in effect beyond the termination of this License shall survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for compensation, indemnity or damages of any sort solely as a result of terminating this License in accordance with its terms, and termination of this License will be without prejudice to any other right or remedy of any party. + +13. Miscellaneous. + + 13.1 Government End Users. The Covered Code is a "commercial item" as defined in FAR 2.101. Government software and technical data rights in the Covered Code include only those rights customarily provided to the public as defined in this License. This customary commercial license in technical data and software is provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation). Accordingly, all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 13.2 Relationship of Parties. This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between or amongYou, Apple or any Contributor, and You will not represent to the contrary, whether expressly, by implication, appearance or otherwise. + + 13.3 Independent Development. Nothing in this License will impair Apple's right to acquire, license, develop, have others develop for it, market and/or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Larger Works, technology or products that You may develop, produce, market or distribute. + + 13.4 Waiver; Construction. Failure by Apple or any Contributor to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision. Any law or regulation which provides that the language of a contract shall be construed against the drafter will not apply to this License. + + 13.5 Severability. (a) If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and effect. (b) Notwithstanding the foregoing, if applicable law prohibits or restricts You from fully and/or specifically complying with Sections 2 and/or 3 or prevents the enforceability of either of those Sections, this License will immediately terminate and You must immediately discontinue any use of the Covered Code and destroy all copies of it that are in your possession or control. + + 13.6 Dispute Resolution. Any litigation or other dispute resolution between You and Apple relating to this License shall take place in the Northern District of California, and You and Apple hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that District with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. + + 13.7 Entire Agreement; Governing Law. This License constitutes the entire agreement between the parties with respect to the subject matter hereof. This License shall be governed by the laws of the United States and the State of California, except that body of California law concerning conflicts of law. + + Where You are located in the province of Quebec, Canada, the following clause applies: The parties hereby confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exigé que le présent contrat et tous les documents connexes soient rédigés en anglais. + +EXHIBIT A. + +"Portions Copyright (c) 1999-2001 Apple Computer, Inc. All Rights Reserved. + +This file contains Original Code and/or Modifications of Original Code as defined in and that are subject to the Apple Public Source License Version 1.2 (the 'License'). You may not use this file except in compliance with the License. Please obtain a copy of the License at http://www.apple.com/publicsource and read it before using this file. + +The Original Code and all software distributed under the License are distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the specific language governing rights and limitations under the License." \ No newline at end of file diff --git a/options/license/APSL-2.0 b/options/license/APSL-2.0 new file mode 100644 index 0000000..04e3389 --- /dev/null +++ b/options/license/APSL-2.0 @@ -0,0 +1,102 @@ +APPLE PUBLIC SOURCE LICENSE +Version 2.0 - August 6, 2003 + +Please read this License carefully before downloading this software. By downloading or using this software, you are agreeing to be bound by the terms of this License. If you do not or cannot agree to the terms of this License, please do not download or use the software. + +Apple Note: In January 2007, Apple changed its corporate name from "Apple Computer, Inc." to "Apple Inc." This change has been reflected below and copyright years updated, but no other changes have been made to the APSL 2.0. + +1. General; Definitions. This License applies to any program or other work which Apple Inc. ("Apple") makes publicly available and which contains a notice placed by Apple identifying such program or work as "Original Code" and stating that it is subject to the terms of this Apple Public Source License version 2.0 ("License"). As used in this License: + + 1.1 "Applicable Patent Rights" mean: (a) in the case where Apple is the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to Apple and (ii) that cover subject matter contained in the Original Code, but only to the extent necessary to use, reproduce and/or distribute the Original Code without infringement; and (b) in the case where You are the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to You and (ii) that cover subject matter in Your Modifications, taken alone or in combination with Original Code. + + 1.2 "Contributor" means any person or entity that creates or contributes to the creation of Modifications. + + 1.3 "Covered Code" means the Original Code, Modifications, the combination of Original Code and any Modifications, and/or any respective portions thereof. + + 1.4 "Externally Deploy" means: (a) to sublicense, distribute or otherwise make Covered Code available, directly or indirectly, to anyone other than You; and/or (b) to use Covered Code, alone or as part of a Larger Work, in any way to provide a service, including but not limited to delivery of content, through electronic communication with a client other than You. + + 1.5 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.6 "Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of the Original Code, any previous Modifications, the combination of Original Code and any previous Modifications, and/or any respective portions thereof. When code is released as a series of files, a Modification is: (a) any addition to or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code. + + 1.7 "Original Code" means (a) the Source Code of a program or other work as originally made available by Apple under this License, including the Source Code of any updates or upgrades to such programs or works made available by Apple under this License, and that has been expressly identified by Apple as such in the header file(s) of such work; and (b) the object code compiled from such Source Code and originally made available by Apple under this License + + 1.8 "Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code). + + 1.9 "You" or "Your" means an individual or a legal entity exercising rights under this License. For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Permitted Uses; Conditions & Restrictions. Subject to the terms and conditions of this License, Apple hereby grants You, effective on the date You accept this License and download the Original Code, a world-wide, royalty-free, non-exclusive license, to the extent of Apple's Applicable Patent Rights and copyrights covering the Original Code, to do the following: + + 2.1 Unmodified Code. You may use, reproduce, display, perform, internally distribute within Your organization, and Externally Deploy verbatim, unmodified copies of the Original Code, for commercial or non-commercial purposes, provided that in each instance: + + (a) You must retain and reproduce in all copies of Original Code the copyright and other proprietary notices and disclaimers of Apple as they appear in the Original Code, and keep intact all notices in the Original Code that refer to this License; and + + (b) You must include a copy of this License with every copy of Source Code of Covered Code and documentation You distribute or Externally Deploy, and You may not offer or impose any terms on such Source Code that alter or restrict this License or the recipients' rights hereunder, except as permitted under Section 6. + + 2.2 Modified Code. You may modify Covered Code and use, reproduce, display, perform, internally distribute within Your organization, and Externally Deploy Your Modifications and Covered Code, for commercial or non-commercial purposes, provided that in each instance You also meet all of these conditions: + + (a) You must satisfy all the conditions of Section 2.1 with respect to the Source Code of the Covered Code; + + (b) You must duplicate, to the extent it does not already exist, the notice in Exhibit A in each file of the Source Code of all Your Modifications, and cause the modified files to carry prominent notices stating that You changed the files and the date of any change; and + + (c) If You Externally Deploy Your Modifications, You must make Source Code of all Your Externally Deployed Modifications either available to those to whom You have Externally Deployed Your Modifications, or publicly available. Source Code of Your Externally Deployed Modifications must be released under the terms set forth in this License, including the license grants set forth in Section 3 below, for as long as you Externally Deploy the Covered Code or twelve (12) months from the date of initial External Deployment, whichever is longer. You should preferably distribute the Source Code of Your Externally Deployed Modifications electronically (e.g. download from a web site). + + 2.3 Distribution of Executable Versions. In addition, if You Externally Deploy Covered Code (Original Code and/or Modifications) in object code, executable form only, You must include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code. + + 2.4 Third Party Rights. You expressly acknowledge and agree that although Apple and each Contributor grants the licenses to their respective portions of the Covered Code set forth herein, no assurances are provided by Apple or any Contributor that the Covered Code does not infringe the patent or other intellectual property rights of any other entity. Apple and each Contributor disclaim any liability to You for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, You hereby assume sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow You to distribute the Covered Code, it is Your responsibility to acquire that license before distributing the Covered Code. + +3. Your Grants. In consideration of, and as a condition to, the licenses granted to You under this License, You hereby grant to any person or entity receiving or distributing Covered Code under this License a non-exclusive, royalty-free, perpetual, irrevocable license, under Your Applicable Patent Rights and other intellectual property rights (other than patent) owned or controlled by You, to use, reproduce, display, perform, modify, sublicense, distribute and Externally Deploy Your Modifications of the same scope and extent as Apple's licenses under Sections 2.1 and 2.2 above. + +4. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof. + +5. Limitations on Patent License. Except as expressly stated in Section 2, no other patent rights, express or implied, are granted by Apple herein. Modifications and/or Larger Works may require additional patent licenses from Apple which Apple may grant in its sole discretion. + +6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the scope of the license granted herein ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Apple or any Contributor. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Apple and every Contributor harmless for any liability incurred by or claims asserted against Apple or such Contributor by reason of any such Additional Terms. + +7. Versions of the License. Apple may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Apple. No one other than Apple has the right to modify the terms applicable to Covered Code created under this License. + +8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part pre-release, untested, or not fully tested works. The Covered Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies. You expressly acknowledge and agree that use of the Covered Code, or any portion thereof, is at Your sole and entire risk. THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND APPLE AND APPLE'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. APPLE AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE, AN APPLE AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You acknowledge that the Covered Code is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Covered Code could lead to death, personal injury, or severe physical or environmental damage. + +9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL APPLE OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF APPLE OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to You for all damages (other than as may be required by applicable law) under this License exceed the amount of fifty dollars ($50.00). + +10. Trademarks. This License does not grant any rights to use the trademarks or trade names "Apple", "Mac", "Mac OS", "QuickTime", "QuickTime Streaming Server" or any other trademarks, service marks, logos or trade names belonging to Apple (collectively "Apple Marks") or to any trademark, service mark, logo or trade name belonging to any Contributor. You agree not to use any Apple Marks in or as part of the name of products derived from the Original Code or to endorse or promote products derived from the Original Code other than as expressly permitted by and in strict compliance at all times with Apple's third party trademark usage guidelines which are posted at http://www.apple.com/legal/guidelinesfor3rdparties.html. + +11. Ownership. Subject to the licenses granted under this License, each Contributor retains all rights, title and interest in and to any Modifications made by such Contributor. Apple retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Apple ("Apple Modifications"), and such Apple Modifications will not be automatically subject to this License. Apple may, at its sole discretion, choose to license such Apple Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all. + +12. Termination. + + 12.1 Termination. This License and the rights granted hereunder will terminate: + + (a) automatically without notice from Apple if You fail to comply with any term(s) of this License and fail to cure such breach within 30 days of becoming aware of such breach; + + (b) immediately in the event of the circumstances described in Section 13.5(b); or + + (c) automatically without notice from Apple if You, at any time during the term of this License, commence an action for patent infringement against Apple; provided that Apple did not first commence an action for patent infringement against You in that instance. + + 12.2 Effect of Termination. Upon termination, You agree to immediately stop any further use, reproduction, modification, sublicensing and distribution of the Covered Code. All sublicenses to the Covered Code which have been properly granted prior to termination shall survive any termination of this License. Provisions which, by their nature, should remain in effect beyond the termination of this License shall survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for compensation, indemnity or damages of any sort solely as a result of terminating this License in accordance with its terms, and termination of this License will be without prejudice to any other right or remedy of any party. + +13. Miscellaneous. + + 13.1 Government End Users. The Covered Code is a "commercial item" as defined in FAR 2.101. Government software and technical data rights in the Covered Code include only those rights customarily provided to the public as defined in this License. This customary commercial license in technical data and software is provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation). Accordingly, all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 13.2 Relationship of Parties. This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between or among You, Apple or any Contributor, and You will not represent to the contrary, whether expressly, by implication, appearance or otherwise. + + 13.3 Independent Development. Nothing in this License will impair Apple's right to acquire, license, develop, have others develop for it, market and/or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Larger Works, technology or products that You may develop, produce, market or distribute. + + 13.4 Waiver; Construction. Failure by Apple or any Contributor to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision. Any law or regulation which provides that the language of a contract shall be construed against the drafter will not apply to this License. + + 13.5 Severability. (a) If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and effect. (b) Notwithstanding the foregoing, if applicable law prohibits or restricts You from fully and/or specifically complying with Sections 2 and/or 3 or prevents the enforceability of either of those Sections, this License will immediately terminate and You must immediately discontinue any use of the Covered Code and destroy all copies of it that are in your possession or control. + + 13.6 Dispute Resolution. Any litigation or other dispute resolution between You and Apple relating to this License shall take place in the Northern District of California, and You and Apple hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that District with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. + + 13.7 Entire Agreement; Governing Law. This License constitutes the entire agreement between the parties with respect to the subject matter hereof. This License shall be governed by the laws of the United States and the State of California, except that body of California law concerning conflicts of law. + + Where You are located in the province of Quebec, Canada, the following clause applies: The parties hereby confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exigé que le présent contrat et tous les documents connexes soient rédigés en anglais. + +EXHIBIT A. + +"Portions Copyright (c) 1999-2007 Apple Inc. All Rights Reserved. + +This file contains Original Code and/or Modifications of Original Code as defined in and that are subject to the Apple Public Source License Version 2.0 (the 'License'). You may not use this file except in compliance with the License. Please obtain a copy of the License at http://www.opensource.apple.com/apsl/ and read it before using this file. + +The Original Code and all software distributed under the License are distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the specific language governing rights and limitations under the License." \ No newline at end of file diff --git a/options/license/Abstyles License b/options/license/Abstyles similarity index 70% rename from options/license/Abstyles License rename to options/license/Abstyles index a4a62f8..0df00c5 100644 --- a/options/license/Abstyles License +++ b/options/license/Abstyles @@ -1,10 +1,11 @@ This is APREAMBL.TEX, version 1.10e, written by Hans-Hermann Bode (HHBODE@DOSUNI1.BITNET), for the BibTeX `adaptable' family, version 1.10. -See the file APREAMBL.DOC for a detailed documentation. -This program is distributed WITHOUT ANY WARRANTY, express or implied. +See the file APREAMBL.DOC for a detailed documentation. -Copyright (C) 1991, 1992 Hans-Hermann Bode +This program is distributed WITHOUT ANY WARRANTY, express or implied. -Permission is granted to make and distribute verbatim copies of this document provided that the copyright notice and this permission notice are preserved on all copies. +Copyright (C) 1991, 1992 Hans-Hermann Bode + +Permission is granted to make and distribute verbatim copies of this document provided that the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this document under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. \ No newline at end of file diff --git a/options/license/Adobe-2006 b/options/license/Adobe-2006 new file mode 100644 index 0000000..e2dafbb --- /dev/null +++ b/options/license/Adobe-2006 @@ -0,0 +1,12 @@ +Adobe Systems Incorporated(r) Source Code License Agreement +Copyright(c) 2006 Adobe Systems Incorporated. All rights reserved. + +Please read this Source Code License Agreement carefully before using the source code. + +Adobe Systems Incorporated grants to you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license, to reproduce, prepare derivative works of, publicly display, publicly perform, and distribute this source code and such derivative works in source or object code form without any attribution requirements. + +The name "Adobe Systems Incorporated" must not be used to endorse or promote products derived from the source code without prior written permission. + +You agree to indemnify, hold harmless and defend Adobe Systems Incorporated from and against any loss, damage, claims or lawsuits, including attorney's fees that arise or result from your use or distribution of the source code. + +THIS SOURCE CODE IS PROVIDED "AS IS" AND "WITH ALL FAULTS", WITHOUT ANY TECHNICAL SUPPORT OR ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ALSO, THERE IS NO WARRANTY OF NON-INFRINGEMENT, TITLE OR QUIET ENJOYMENT. IN NO EVENT SHALL MACROMEDIA OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOURCE CODE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/Adobe-Glyph b/options/license/Adobe-Glyph new file mode 100644 index 0000000..83e743b --- /dev/null +++ b/options/license/Adobe-Glyph @@ -0,0 +1,10 @@ +Copyright (c) 1997,1998,2002,2007 Adobe Systems Incorporated + +Permission is hereby granted, free of charge, to any person obtaining a copy of this documentation file to use, copy, publish, distribute, sublicense, and/or sell copies of the documentation, and to permit others to do the same, provided that: + + - No modification, editing or other alteration of this document is allowed; and + - The above copyright notice and this permission notice shall be included in all copies of the documentation. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this documentation file, to create their own derivative works from the content of this document to use, copy, publish, distribute, sublicense, and/or sell the derivative works, and to permit others to do the same, provided that the derived work is not represented as being a copy or version of this document. + +Adobe shall not be liable to any party for any loss of revenue or profit or for indirect, incidental, special, consequential, or other similar damages, whether based on tort (including without limitation negligence or strict liability), contract or other legal or equitable grounds even if Adobe has been advised or had reason to know of the possibility of such damages.Ê The Adobe materials are provided on an "AS IS" basis.Ê Adobe specifically disclaims all express, statutory, or implied warranties relating to the Adobe materials, including but not limited to those concerning merchantability or fitness for a particular purpose or non-infringement of any third party rights regarding the Adobe materials. \ No newline at end of file diff --git a/options/license/Afmparse b/options/license/Afmparse new file mode 100644 index 0000000..d279edc --- /dev/null +++ b/options/license/Afmparse @@ -0,0 +1,10 @@ +(C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved. + +This file may be freely copied and redistributed as long as: + + 1) This entire notice continues to be included in the file, + 2) If the file has been modified in any way, a notice of such modification is conspicuously indicated. + +PostScript, Display PostScript,and Adobe are registered trademarks of Adobe Systems Incorporated. + +THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. \ No newline at end of file diff --git a/options/license/Aladdin b/options/license/Aladdin new file mode 100644 index 0000000..e7da44b --- /dev/null +++ b/options/license/Aladdin @@ -0,0 +1,62 @@ +Aladdin Free Public License +(Version 8, November 18, 1999) + +Copyright (C) 1994, 1995, 1997, 1998, 1999 Aladdin Enterprises,
Menlo Park, California, U.S.A. All rights reserved. + +NOTE: This License is not the same as any of the GNU Licenses published by the Free Software Foundation. Its terms are substantially different from those of the GNU Licenses. If you are familiar with the GNU Licenses, please read this license with extra care. + +Aladdin Enterprises hereby grants to anyone the permission to apply this License to their own work, as long as the entire License (including the above notices and this paragraph) is copied with no changes, additions, or deletions except for changing the first paragraph of Section 0 to include a suitable description of the work to which the license is being applied and of the person or entity that holds the copyright in the work, and, if the License is being applied to a work created in a country other than the United States, replacing the first paragraph of Section 6 with an appropriate reference to the laws of the appropriate country. + +0. Subject Matter +This License applies to the computer program known as "Aladdin Ghostscript." The "Program", below, refers to such program. The Program is a copyrighted work whose copyright is held by Aladdin Enterprises (the "Licensor"). Please note that Aladdin Ghostscript is neither the program known as "GNU Ghostscript" nor the version of Ghostscript available for commercial licensing from Artifex Software Inc. + +A "work based on the Program" means either the Program or any derivative work of the Program, as defined in the United States Copyright Act of 1976, such as a translation or a modification. + +BY MODIFYING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE PROGRAM), YOU INDICATE YOUR ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL ITS TERMS AND CONDITIONS FOR COPYING, DISTRIBUTING OR MODIFYING THE PROGRAM OR WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS YOU PERMISSION TO MODIFY OR DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE WORKS. THESE ACTIONS ARE PROHIBITED BY LAW. IF YOU DO NOT ACCEPT THESE TERMS AND CONDITIONS, DO NOT MODIFY OR DISTRIBUTE THE PROGRAM. + +1. Licenses. +Licensor hereby grants you the following rights, provided that you comply with all of the restrictions set forth in this License and provided, further, that you distribute an unmodified copy of this License with the Program: + + (a) You may copy and distribute literal (i.e., verbatim) copies of the Program's source code as you receive it throughout the world, in any medium. + (b) You may modify the Program, create works based on the Program and distribute copies of such throughout the world, in any medium. + +2. Restrictions. +This license is subject to the following restrictions: + + (a) Distribution of the Program or any work based on the Program by a commercial organization to any third party is prohibited if any payment is made in connection with such distribution, whether directly (as in payment for a copy of the Program) or indirectly (as in payment for some service related to the Program, or payment for some product or service that includes a copy of the Program "without charge"; these are only examples, and not an exhaustive enumeration of prohibited activities). The following methods of distribution involving payment shall not in and of themselves be a violation of this restriction: + + (i) Posting the Program on a public access information storage and retrieval service for which a fee is received for retrieving information (such as an on-line service), provided that the fee is not content-dependent (i.e., the fee would be the same for retrieving the same volume of information consisting of random data) and that access to the service and to the Program is available independent of any other product or service. An example of a service that does not fall under this section is an on-line service that is operated by a company and that is only available to customers of that company. (This is not an exhaustive enumeration.) + (ii) Distributing the Program on removable computer-readable media, provided that the files containing the Program are reproduced entirely and verbatim on such media, that all information on such media be redistributable for non-commercial purposes without charge, and that such media are distributed by themselves (except for accompanying documentation) independent of any other product or service. Examples of such media include CD-ROM, magnetic tape, and optical storage media. (This is not intended to be an exhaustive list.) An example of a distribution that does not fall under this section is a CD-ROM included in a book or magazine. (This is not an exhaustive enumeration.) + + (b) Activities other than copying, distribution and modification of the Program are not subject to this License and they are outside its scope. Functional use (running) of the Program is not restricted, and any output produced through the use of the Program is subject to this license only if its contents constitute a work based on the Program (independent of having been made by running the Program). + + (c) You must meet all of the following conditions with respect to any work that you distribute or publish that in whole or in part contains or is derived from the Program or any part thereof ("the Work"): + + (i) If you have modified the Program, you must cause the Work to carry prominent notices stating that you have modified the Program's files and the date of any change. In each source file that you have modified, you must include a prominent notice that you have modified the file, including your name, your e-mail address (if any), and the date and purpose of the change; + (ii) You must cause the Work to be licensed as a whole and at no charge to all third parties under the terms of this License; + (iii) If the Work normally reads commands interactively when run, you must cause it, at each time the Work commences operation, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty). Such notice must also state that users may redistribute the Work only under the conditions of this License and tell the user how to view the copy of this License included with the Work. (Exceptions: if the Program is interactive but normally prints or displays such an announcement only at the request of a user, such as in an "About box", the Work is required to print or display the notice only under the same circumstances; if the Program itself is interactive but does not normally print such an announcement, the Work is not required to print an announcement.); + (iv) You must accompany the Work with the complete corresponding machine-readable source code, delivered on a medium customarily used for software interchange. The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable code. If you distribute with the Work any component that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, you must also distribute the source code of that component if you have it and are allowed to do so; + (v) If you distribute any written or printed material at all with the Work, such material must include either a written copy of this License, or a prominent written indication that the Work is covered by this License and written instructions for printing and/or displaying the copy of the License on the distribution medium; + (vi) You may not impose any further restrictions on the recipient's exercise of the rights granted herein. + +If distribution of executable or object code is made by offering the equivalent ability to copy from a designated place, then offering equivalent ability to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source code along with the object code. + +3. Reservation of Rights. +No rights are granted to the Program except as expressly set forth herein. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +4. Other Restrictions. +If the distribution and/or use of the Program is restricted in certain countries for any reason, Licensor may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +5. Limitations. +THE PROGRAM IS PROVIDED TO YOU "AS IS," WITHOUT WARRANTY. THERE IS NO WARRANTY FOR THE PROGRAM, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL LICENSOR, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6. General. +This License is governed by the laws of the State of California, U.S.A., excluding choice of law rules. + +If any part of this License is found to be in conflict with the law, that part shall be interpreted in its broadest meaning consistent with the law, and no other parts of the License shall be affected. + +For United States Government users, the Program is provided with RESTRICTED RIGHTS. If you are a unit or agency of the United States Government or are acquiring the Program for any such unit or agency, the following apply: + +If the unit or agency is the Department of Defense ("DOD"), the Program and its documentation are classified as "commercial computer software" and "commercial computer software documentation" respectively and, pursuant to DFAR Section 227.7202, the Government is acquiring the Program and its documentation in accordance with the terms of this License. If the unit or agency is other than DOD, the Program and its documentation are classified as "commercial computer software" and "commercial computer software documentation" respectively and, pursuant to FAR Section 12.212, the Government is acquiring the Program and its documentation in accordance with the terms of this License. diff --git a/options/license/Apache License 1.0 b/options/license/Apache License 1.0 deleted file mode 100644 index 9a06536..0000000 --- a/options/license/Apache License 1.0 +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 1995-1999 The Apache Group. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. All advertising materials mentioning features or use of this software must display the following acknowledgment: "This product includes software developed by the Apache Group for use in the Apache HTTP server project (http://www.apache.org/) ." - -4. The "Apache" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org - -5. Products derived from this software may not be called "Apache" nor may "Apache" appear in their name, without prior written permission of the Apache Group . - -6. Redistributions of any form whatsoever must retain the following acknowledgment: -"This product includes software developed by the Apache Group for use in the Apache HTTP server project (http://www.apache.org/) . - -THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many individuals on behalf of the Apache Group and was originally based on public domain software written at the National Center for Supercomputing Applications, University of Illinois, Urbana-Champaign. For more information on the Apache Group and the Apache HTTP server project, please see. diff --git a/options/license/Apache License 1.1 b/options/license/Apache License 1.1 deleted file mode 100644 index 92b971b..0000000 --- a/options/license/Apache License 1.1 +++ /dev/null @@ -1,20 +0,0 @@ -Apache License 1.1 -Copyright (c) 2000 The Apache Software Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: -"This product includes software developed by the Apache Software Foundation (http://www.apache.org/) ." -Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. - -4. The "Apache" and "Apache Software Foundation" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact apache@apache.org - -5. Products derived from this software may not be called "Apache" [ex. "Jakarta," "Apache," or "Apache Commons,"] nor may "Apache" [ex. the names] appear in their name, without prior written permission of the Apache Software Foundation . - -THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation. For more information on the Apache Software Foundation, please see http://www.apache.org/. Portions of this software are based upon public domain software originally written at the National Center for Supercomputing Applications, University of Illinois, Urbana-Champaign. diff --git a/options/license/Apache-1.0 b/options/license/Apache-1.0 new file mode 100644 index 0000000..1b253d6 --- /dev/null +++ b/options/license/Apache-1.0 @@ -0,0 +1,20 @@ +Copyright (c) 1995-1999 The Apache Group. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. All advertising materials mentioning features or use of this software must display the following acknowledgment: "This product includes software developed by the <>." + +4. The <> must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact <> + +5. Products derived from this software may not be called <> nor may <> appear in their name, without prior written permission of <>. + +6. Redistributions of any form whatsoever must retain the following acknowledgment: +"This product includes software developed by <>. + +THIS SOFTWARE IS PROVIDED BY <> ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +<> This software consists of voluntary contributions made by many individuals on behalf of the Apache Group and was originally based on public domain software written at the National Center for Supercomputing Applications, University of Illinois, Urbana-Champaign. For more information on the Apache Group and the Apache HTTP server project, please see . <> \ No newline at end of file diff --git a/options/license/Apache-1.1 b/options/license/Apache-1.1 new file mode 100644 index 0000000..4359bf6 --- /dev/null +++ b/options/license/Apache-1.1 @@ -0,0 +1,21 @@ +Apache License 1.1 + +Copyright (c) 2000 The Apache Software Foundation. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: +"This product includes software developed by <>." +Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. + +4. The <> must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact <> + +5. Products derived from this software may not be called <> nor may <> appear in their name, without prior written permission of <>. + +THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +<> This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation. For more information on the Apache Software Foundation, please see http://www.apache.org/. Portions of this software are based upon public domain software originally written at the National Center for Supercomputing Applications, University of Illinois, Urbana-Champaign. <> \ No newline at end of file diff --git a/options/license/Apache License 2.0 b/options/license/Apache-2.0 similarity index 78% rename from options/license/Apache License 2.0 rename to options/license/Apache-2.0 index dbfab25..33666dd 100644 --- a/options/license/Apache License 2.0 +++ b/options/license/Apache-2.0 @@ -1,6 +1,7 @@ -Apache License -Version 2.0, January 2004 +Apache License +Version 2.0, January 2004 http://www.apache.org/licenses/ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. @@ -31,15 +32,15 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: -(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and -(b) You must cause any modified files to carry prominent notices stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and -(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and -(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. -You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. @@ -55,18 +56,18 @@ END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/options/license/Artistic License 1.0 b/options/license/Artistic License 1.0 deleted file mode 100644 index 7121f1f..0000000 --- a/options/license/Artistic License 1.0 +++ /dev/null @@ -1,48 +0,0 @@ -The Artistic License -Preamble - -The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. - -Definitions: - -"Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - -"Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - -"Copyright Holder" is whoever is named in the copyright or copyrights for the package. - -"You" is you, if you're thinking about copying or distributing this Package. - -"Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - -"Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. - -1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. - -2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. - -3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: - -a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. -b) use the modified Package only within your corporation or organization. -c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. -d) make other distribution arrangements with the Copyright Holder. - -4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: - -a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. -b) accompany the distribution with the machine-readable source of the Package with your modifications. -c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. -d) make other distribution arrangements with the Copyright Holder. - -5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. - -6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. - -7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. - -8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. - -9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - -The End diff --git a/options/license/Artistic License 2.0 b/options/license/Artistic License 2.0 deleted file mode 100644 index 5f85aa8..0000000 --- a/options/license/Artistic License 2.0 +++ /dev/null @@ -1,84 +0,0 @@ -The Artistic License 2.0 -Copyright (c) 2000-2006, The Perl Foundation. - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble - -This license establishes the terms under which a given free software Package may be copied, modified, distributed, and/or redistributed. The intent is that the Copyright Holder maintains some artistic control over the development of that Package while still keeping the Package available as open source and free software. - -You are always permitted to make arrangements wholly outside of this license directly with the Copyright Holder of a given Package. If the terms of this license do not permit the full use that you propose to make of the Package, you should contact the Copyright Holder and seek a different licensing arrangement. - -Definitions - -"Copyright Holder" means the individual(s) or organization(s) named in the copyright notice for the entire Package. - -"Contributor" means any party that has contributed code or other material to the Package, in accordance with the Copyright Holder's procedures. - -"You" and "your" means any person who would like to copy, distribute, or modify the Package. - -"Package" means the collection of files distributed by the Copyright Holder, and derivatives of that collection and/or of those files. A given Package may consist of either the Standard Version, or a Modified Version. - -"Distribute" means providing a copy of the Package or making it accessible to anyone else, or in the case of a company or organization, to others outside of your company or organization. - -"Distributor Fee" means any fee that you charge for Distributing this Package or providing support for this Package to another party. It does not mean licensing fees. - -"Standard Version" refers to the Package if it has not been modified, or has been modified only in ways explicitly requested by the Copyright Holder. - -"Modified Version" means the Package, if it has been changed, and such changes were not explicitly requested by the Copyright Holder. - -"Original License" means this Artistic License as Distributed with the Standard Version of the Package, in its current version or as it may be modified by The Perl Foundation in the future. - -"Source" form means the source code, documentation source, and configuration files for the Package. - -"Compiled" form means the compiled bytecode, object code, binary, or any other form resulting from mechanical transformation or translation of the Source form. - -Permission for Use and Modification Without Distribution - -(1) You are permitted to use the Standard Version and create and use Modified Versions for any purpose without restriction, provided that you do not Distribute the Modified Version. - -Permissions for Redistribution of the Standard Version - -(2) You may Distribute verbatim copies of the Source form of the Standard Version of this Package in any medium without restriction, either gratis or for a Distributor Fee, provided that you duplicate all of the original copyright notices and associated disclaimers. At your discretion, such verbatim copies may or may not include a Compiled form of the Package. - -(3) You may apply any bug fixes, portability changes, and other modifications made available from the Copyright Holder. The resulting Package will still be considered the Standard Version, and as such will be subject to the Original License. - -Distribution of Modified Versions of the Package as Source - -(4) You may Distribute your Modified Version as Source (either gratis or for a Distributor Fee, and with or without a Compiled form of the Modified Version) provided that you clearly document how it differs from the Standard Version, including, but not limited to, documenting any non-standard features, executables, or modules, and provided that you do at least ONE of the following: - -(a) make the Modified Version available to the Copyright Holder of the Standard Version, under the Original License, so that the Copyright Holder may include your modifications in the Standard Version. -(b) ensure that installation of your Modified Version does not prevent the user installing or running the Standard Version. In addition, the Modified Version must bear a name that is different from the name of the Standard Version. -(c) allow anyone who receives a copy of the Modified Version to make the Source form of the Modified Version available to others under - -(i) the Original License or -(ii) a license that permits the licensee to freely copy, modify and redistribute the Modified Version using the same licensing terms that apply to the copy that the licensee received, and requires that the Source form of the Modified Version, and of any works derived from it, be made freely available in that license fees are prohibited but Distributor Fees are allowed. - -Distribution of Compiled Forms of the Standard Version or Modified Versions without the Source - -(5) You may Distribute Compiled forms of the Standard Version without the Source, provided that you include complete instructions on how to get the Source of the Standard Version. Such instructions must be valid at the time of your distribution. If these instructions, at any time while you are carrying out such distribution, become invalid, you must provide new instructions on demand or cease further distribution. If you provide valid instructions or cease distribution within thirty days after you become aware that the instructions are invalid, then you do not forfeit any of your rights under this license. - -(6) You may Distribute a Modified Version in Compiled form without the Source, provided that you comply with Section 4 with respect to the Source of the Modified Version. - -Aggregating or Linking the Package - -(7) You may aggregate the Package (either the Standard Version or Modified Version) with other packages and Distribute the resulting aggregation provided that you do not charge a licensing fee for the Package. Distributor Fees are permitted, and licensing fees for other components in the aggregation are permitted. The terms of this license apply to the use and Distribution of the Standard or Modified Versions as included in the aggregation. - -(8) You are permitted to link Modified and Standard Versions with other works, to embed the Package in a larger work of your own, or to build stand-alone binary or bytecode versions of applications that include the Package, and Distribute the result without restriction, provided the result does not expose a direct interface to the Package. - -Items That are Not Considered Part of a Modified Version - -(9) Works (including, but not limited to, modules and scripts) that merely extend or make use of the Package, do not, by themselves, cause the Package to be a Modified Version. In addition, such works are not considered parts of the Package itself, and are not subject to the terms of this license. - -General Provisions - -(10) Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. - -(11) If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. - -(12) This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. - -(13) This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. - -(14) Disclaimer of Warranty: -THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/options/license/Artistic-1.0 b/options/license/Artistic-1.0 new file mode 100644 index 0000000..fc6aea7 --- /dev/null +++ b/options/license/Artistic-1.0 @@ -0,0 +1,49 @@ +The Artistic License + +Preamble + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. + b) use the modified Package only within your corporation or organization. + c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. + b) accompany the distribution with the machine-readable source of the Package with your modifications. + c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. + +7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. + +8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End \ No newline at end of file diff --git a/options/license/Artistic-1.0-Perl b/options/license/Artistic-1.0-Perl new file mode 100644 index 0000000..dd45f4c --- /dev/null +++ b/options/license/Artistic-1.0-Perl @@ -0,0 +1,51 @@ +The "Artistic License" + +Preamble + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. + b) use the modified Package only within your corporation or organization. + c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. + b) accompany the distribution with the machine-readable source of the Package with your modifications. + c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. + +7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. + +8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. + +9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End diff --git a/options/license/Artistic-1.0-cl8 b/options/license/Artistic-1.0-cl8 new file mode 100644 index 0000000..5e0b00f --- /dev/null +++ b/options/license/Artistic-1.0-cl8 @@ -0,0 +1,51 @@ +The Artistic License + +Preamble + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. + b) use the modified Package only within your corporation or organization. + c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. + b) accompany the distribution with the machine-readable source of the Package with your modifications. + c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. + +7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. + +8.Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. + +9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End \ No newline at end of file diff --git a/options/license/Artistic-2.0 b/options/license/Artistic-2.0 new file mode 100644 index 0000000..5e56785 --- /dev/null +++ b/options/license/Artistic-2.0 @@ -0,0 +1,85 @@ +The Artistic License 2.0 + +Copyright (c) 2000-2006, The Perl Foundation. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +This license establishes the terms under which a given free software Package may be copied, modified, distributed, and/or redistributed. The intent is that the Copyright Holder maintains some artistic control over the development of that Package while still keeping the Package available as open source and free software. + +You are always permitted to make arrangements wholly outside of this license directly with the Copyright Holder of a given Package. If the terms of this license do not permit the full use that you propose to make of the Package, you should contact the Copyright Holder and seek a different licensing arrangement. + +Definitions + + "Copyright Holder" means the individual(s) or organization(s) named in the copyright notice for the entire Package. + + "Contributor" means any party that has contributed code or other material to the Package, in accordance with the Copyright Holder's procedures. + + "You" and "your" means any person who would like to copy, distribute, or modify the Package. + + "Package" means the collection of files distributed by the Copyright Holder, and derivatives of that collection and/or of those files. A given Package may consist of either the Standard Version, or a Modified Version. + + "Distribute" means providing a copy of the Package or making it accessible to anyone else, or in the case of a company or organization, to others outside of your company or organization. + + "Distributor Fee" means any fee that you charge for Distributing this Package or providing support for this Package to another party. It does not mean licensing fees. + + "Standard Version" refers to the Package if it has not been modified, or has been modified only in ways explicitly requested by the Copyright Holder. + + "Modified Version" means the Package, if it has been changed, and such changes were not explicitly requested by the Copyright Holder. + + "Original License" means this Artistic License as Distributed with the Standard Version of the Package, in its current version or as it may be modified by The Perl Foundation in the future. + + "Source" form means the source code, documentation source, and configuration files for the Package. + + "Compiled" form means the compiled bytecode, object code, binary, or any other form resulting from mechanical transformation or translation of the Source form. + +Permission for Use and Modification Without Distribution + +(1) You are permitted to use the Standard Version and create and use Modified Versions for any purpose without restriction, provided that you do not Distribute the Modified Version. + +Permissions for Redistribution of the Standard Version + +(2) You may Distribute verbatim copies of the Source form of the Standard Version of this Package in any medium without restriction, either gratis or for a Distributor Fee, provided that you duplicate all of the original copyright notices and associated disclaimers. At your discretion, such verbatim copies may or may not include a Compiled form of the Package. + +(3) You may apply any bug fixes, portability changes, and other modifications made available from the Copyright Holder. The resulting Package will still be considered the Standard Version, and as such will be subject to the Original License. + +Distribution of Modified Versions of the Package as Source + +(4) You may Distribute your Modified Version as Source (either gratis or for a Distributor Fee, and with or without a Compiled form of the Modified Version) provided that you clearly document how it differs from the Standard Version, including, but not limited to, documenting any non-standard features, executables, or modules, and provided that you do at least ONE of the following: + + (a) make the Modified Version available to the Copyright Holder of the Standard Version, under the Original License, so that the Copyright Holder may include your modifications in the Standard Version. + (b) ensure that installation of your Modified Version does not prevent the user installing or running the Standard Version. In addition, the Modified Version must bear a name that is different from the name of the Standard Version. + (c) allow anyone who receives a copy of the Modified Version to make the Source form of the Modified Version available to others under + + (i) the Original License or + (ii) a license that permits the licensee to freely copy, modify and redistribute the Modified Version using the same licensing terms that apply to the copy that the licensee received, and requires that the Source form of the Modified Version, and of any works derived from it, be made freely available in that license fees are prohibited but Distributor Fees are allowed. + +Distribution of Compiled Forms of the Standard Version or Modified Versions without the Source + +(5) You may Distribute Compiled forms of the Standard Version without the Source, provided that you include complete instructions on how to get the Source of the Standard Version. Such instructions must be valid at the time of your distribution. If these instructions, at any time while you are carrying out such distribution, become invalid, you must provide new instructions on demand or cease further distribution. If you provide valid instructions or cease distribution within thirty days after you become aware that the instructions are invalid, then you do not forfeit any of your rights under this license. + +(6) You may Distribute a Modified Version in Compiled form without the Source, provided that you comply with Section 4 with respect to the Source of the Modified Version. + +Aggregating or Linking the Package + +(7) You may aggregate the Package (either the Standard Version or Modified Version) with other packages and Distribute the resulting aggregation provided that you do not charge a licensing fee for the Package. Distributor Fees are permitted, and licensing fees for other components in the aggregation are permitted. The terms of this license apply to the use and Distribution of the Standard or Modified Versions as included in the aggregation. + +(8) You are permitted to link Modified and Standard Versions with other works, to embed the Package in a larger work of your own, or to build stand-alone binary or bytecode versions of applications that include the Package, and Distribute the result without restriction, provided the result does not expose a direct interface to the Package. + +Items That are Not Considered Part of a Modified Version + +(9) Works (including, but not limited to, modules and scripts) that merely extend or make use of the Package, do not, by themselves, cause the Package to be a Modified Version. In addition, such works are not considered parts of the Package itself, and are not subject to the terms of this license. + +General Provisions + +(10) Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. + +(11) If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. + +(12) This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. + +(13) This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. + +(14) Disclaimer of Warranty: +THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/BSD 2-clause License b/options/license/BSD 2-clause License deleted file mode 100644 index 44f67c1..0000000 --- a/options/license/BSD 2-clause License +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/options/license/BSD 4-clause License b/options/license/BSD 4-clause License deleted file mode 100644 index fc206e3..0000000 --- a/options/license/BSD 4-clause License +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) . All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. All advertising materials mentioning features or use of this software must display the following acknowledgement: -This product includes software developed by the the organization . - -4. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/options/license/BSD-2-Clause b/options/license/BSD-2-Clause new file mode 100644 index 0000000..e9ab04d --- /dev/null +++ b/options/license/BSD-2-Clause @@ -0,0 +1,9 @@ +Copyright (c) < ;match=.+>> All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY <> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/BSD-2-Clause-FreeBSD b/options/license/BSD-2-Clause-FreeBSD new file mode 100644 index 0000000..4774804 --- /dev/null +++ b/options/license/BSD-2-Clause-FreeBSD @@ -0,0 +1,13 @@ +The FreeBSD Copyright + +Copyright 1992-2012 The FreeBSD Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project. diff --git a/options/license/BSD-2-Clause-NetBSD b/options/license/BSD-2-Clause-NetBSD new file mode 100644 index 0000000..8e13f78 --- /dev/null +++ b/options/license/BSD-2-Clause-NetBSD @@ -0,0 +1,11 @@ +Copyright (c) 2008 The NetBSD Foundation, Inc. All rights reserved. + +This code is derived from software contributed to The NetBSD Foundation by <> + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY <> ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/BSD-3-Clause b/options/license/BSD-3-Clause new file mode 100644 index 0000000..7b87a53 --- /dev/null +++ b/options/license/BSD-3-Clause @@ -0,0 +1,11 @@ +Copyright (c) < ;match=.+>>. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of <> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY <> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/BSD 3-clause License b/options/license/BSD-3-Clause-Attribution similarity index 50% rename from options/license/BSD 3-clause License rename to options/license/BSD-3-Clause-Attribution index 206be5d..57e3af9 100644 --- a/options/license/BSD 3-clause License +++ b/options/license/BSD-3-Clause-Attribution @@ -1,10 +1,11 @@ -Copyright (c) . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + 4. Redistributions of any form whatsoever must retain the following acknowledgment: 'This product includes software developed by the <> + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/BSD-3-Clause-Clear b/options/license/BSD-3-Clause-Clear new file mode 100644 index 0000000..afa9cbd --- /dev/null +++ b/options/license/BSD-3-Clause-Clear @@ -0,0 +1,14 @@ +The Clear BSD License + +Copyright (c) <> +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted (subject to the limitations in the disclaimer below) provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + * Neither the name of <> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY <> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/options/license/BSD-3-Clause-LBNL b/options/license/BSD-3-Clause-LBNL new file mode 100644 index 0000000..ab94601 --- /dev/null +++ b/options/license/BSD-3-Clause-LBNL @@ -0,0 +1,12 @@ +Copyright (c) 2003, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Dept. of Energy). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +(1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +(2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +(3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, U.S. Dept. of Energy nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You are under no obligation whatsoever to provide any bug fixes, patches, or upgrades to the features, functionality or performance of the source code ("Enhancements") to anyone; however, if you choose to make your Enhancements available either publicly, or directly to Lawrence Berkeley National Laboratory, without imposing a separate written license agreement for such Enhancements, then you hereby grant the following license: a non-exclusive, royalty-free perpetual license to install, use, modify, prepare derivative works, incorporate into other computer software, distribute, and sublicense such Enhancements or derivative works thereof, in binary and source code form. diff --git a/options/license/BSD-3-Clause-No-Nuclear-License b/options/license/BSD-3-Clause-No-Nuclear-License new file mode 100644 index 0000000..8d99a2f --- /dev/null +++ b/options/license/BSD-3-Clause-No-Nuclear-License @@ -0,0 +1,14 @@ + +Copyright 1994-2009 Sun Microsystems, Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistribution of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + * Redistribution in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + * Neither the name of Sun Microsystems, Inc. or the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility. diff --git a/options/license/BSD-3-Clause-No-Nuclear-License-2014 b/options/license/BSD-3-Clause-No-Nuclear-License-2014 new file mode 100644 index 0000000..e861a4c --- /dev/null +++ b/options/license/BSD-3-Clause-No-Nuclear-License-2014 @@ -0,0 +1,16 @@ + +Copyright © 2008, 2014 Oracle and/or its affiliates. All rights reserved. + +Use is subject to license terms. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + * Neither the name of Oracle Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility. diff --git a/options/license/BSD-3-Clause-No-Nuclear-Warranty b/options/license/BSD-3-Clause-No-Nuclear-Warranty new file mode 100644 index 0000000..2c00ee1 --- /dev/null +++ b/options/license/BSD-3-Clause-No-Nuclear-Warranty @@ -0,0 +1,14 @@ + +Copyright (c) 2003-2005 Sun Microsystems, Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistribution of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + - Redistribution in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + - Neither the name of Sun Microsystems, Inc. or the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +You acknowledge that this software is not designed or intended for use in the design, construction, operation or maintenance of any nuclear facility. diff --git a/options/license/BSD-4-Clause b/options/license/BSD-4-Clause new file mode 100644 index 0000000..5b124b6 --- /dev/null +++ b/options/license/BSD-4-Clause @@ -0,0 +1,14 @@ +Copyright (c) < ;match=.+>>. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. All advertising materials mentioning features or use of this software must display the following acknowledgement: +This product includes software developed by the <>. + +4. Neither the name of <> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY <> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/BSD-4-Clause-UC b/options/license/BSD-4-Clause-UC new file mode 100644 index 0000000..5349032 --- /dev/null +++ b/options/license/BSD-4-Clause-UC @@ -0,0 +1 @@ +BSD-4-Clause (University of California-Specific) Copyright [various years] The Regents of the University of California. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the University of California, Berkeley and its contributors. 4. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/BSD-Protection b/options/license/BSD-Protection new file mode 100644 index 0000000..9dce867 --- /dev/null +++ b/options/license/BSD-Protection @@ -0,0 +1,53 @@ +BSD Protection License +February 2002 + +Preamble +-------- + +The Berkeley Software Distribution ("BSD") license has proven very effective over the years at allowing for a wide spread of work throughout both commercial and non-commercial products. For programmers whose primary intention is to improve the general quality of available software, it is arguable that there is no better license than the BSD license, as it permits improvements to be used wherever they will help, without idealogical or metallic constraint. + +This is of particular value to those who produce reference implementations of proposed standards: The case of TCP/IP clearly illustrates that freely and universally available implementations leads the rapid acceptance of standards -- often even being used instead of a de jure standard (eg, OSI network models). + +With the rapid proliferation of software licensed under the GNU General Public License, however, the continued success of this role is called into question. Given that the inclusion of a few lines of "GPL-tainted" work into a larger body of work will result in restricted distribution -- and given that further work will likely build upon the "tainted" portions, making them difficult to remove at a future date -- there are inevitable circumstances where authors would, in order to protect their goal of providing for the widespread usage of their work, wish to guard against such "GPL-taint". + +In addition, one can imagine that companies which operate by producing and selling (possibly closed-source) code would wish to protect themselves against the rise of a GPL-licensed competitor. While under existing licenses this would mean not releasing their code under any form of open license, if a license existed under which they could incorporate any improvements back into their own (commercial) products then they might be far more willing to provide for non-closed distribution. + +For the above reasons, we put forth this "BSD Protection License": A license designed to retain the freedom granted by the BSD license to use licensed works in a wide variety of settings, both non-commercial and commercial, while protecting the work from having future contributors restrict that freedom. + +The precise terms and conditions for copying, distribution, and modification follow. + +BSD PROTECTION LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION, AND MODIFICATION +---------------------------------------------------------------- + +0. Definitions. + + a) "Program", below, refers to any program or work distributed under the terms of this license. + b) A "work based on the Program", below, refers to either the Program or any derivative work under copyright law. + c) "Modification", below, refers to the act of creating derivative works. + d) "You", below, refers to each licensee. + +1. Scope. +This license governs the copying, distribution, and modification of the Program. Other activities are outside the scope of this license; The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program. + +2. Verbatim copies. +You may copy and distribute verbatim copies of the Program as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +3. Modification and redistribution under closed license. +You may modify your copy or copies of the Program, and distribute the resulting derivative works, provided that you meet the following conditions: + + a) The copyright notice and disclaimer on the Program must be reproduced and included in the source code, documentation, and/or other materials provided in a manner in which such notices are normally distributed. + b) The derivative work must be clearly identified as such, in order that it may not be confused with the original work. + c) The license under which the derivative work is distributed must expressly prohibit the distribution of further derivative works. + +4. Modification and redistribution under open license. +You may modify your copy or copies of the Program, and distribute the resulting derivative works, provided that you meet the following conditions: + + a) The copyright notice and disclaimer on the Program must be reproduced and included in the source code, documentation, and/or other materials provided in a manner in which such notices are normally distributed. + b) You must clearly indicate the nature and date of any changes made to the Program. The full details need not necessarily be included in the individual modified files, provided that each modified file is clearly marked as such and instructions are included on where the full details of the modifications may be found. + c) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + +5. Implied acceptance. +You may not copy or distribute the Program or any derivative works except as expressly provided under this license. Consequently, any such action will be taken as implied acceptance of the terms of this license. + +6. NO WARRANTY. +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/options/license/BSD-Source-Code b/options/license/BSD-Source-Code new file mode 100644 index 0000000..72e64c3 --- /dev/null +++ b/options/license/BSD-Source-Code @@ -0,0 +1,10 @@ +Copyright (c) <> +All rights reserved. + +Redistribution and use of this software in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + * Neither the name of <>nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission of Deusty, LLC. + +THIS SOFTWARE IS PROVIDED BY <> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/options/license/BSL-1.0 b/options/license/BSL-1.0 new file mode 100644 index 0000000..c2dc836 --- /dev/null +++ b/options/license/BSL-1.0 @@ -0,0 +1,7 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/options/license/Bahyph b/options/license/Bahyph new file mode 100644 index 0000000..110fbaf --- /dev/null +++ b/options/license/Bahyph @@ -0,0 +1,11 @@ +COPYRIGHT NOTICE + +These patterns and the generating sh script are Copyright (c) GMV 1991 + +These patterns were developed for internal GMV use and are made public in the hope that they will benefit others. Also, spreading these patterns throughout the Spanish-language TeX community is expected to provide back-benefits to GMV in that it can help keeping GMV in the mainstream of spanish users. + +However, this is given for free and WITHOUT ANY WARRANTY. Under no circumstances can Julio Sanchez, GMV, Jos'e A. Ma~nas or any agents or representatives thereof be held responsible for any errors in this software nor for any damages derived from its use, even in case any of the above has been notified of the possibility of such damages. If any such situation arises, you responsible for repair. Use of this software is an explicit acceptance of these conditions. + +You can use this software for any purpose. You cannot delete this copyright notice. If you change this software, you must include comments explaining who, when and why. You are kindly requested to send any changes to tex@gmv.es. If you change the generating script, you must include code in it such that any output is clearly labeled as generated by a modified script. Despite the lack of warranty, we would like to hear about any problem you find. Please report problems to tex@gmv.es. + +END OF COPYRIGHT NOTICE \ No newline at end of file diff --git a/options/license/Barr b/options/license/Barr new file mode 100644 index 0000000..8b341c9 --- /dev/null +++ b/options/license/Barr @@ -0,0 +1 @@ +This is a package of commutative diagram macros built on top of Xy-pic by Michael Barr (email: barr@barrs.org). Its use is unrestricted. It may be freely distributed, unchanged, for non-commercial or commercial use. If changed, it must be renamed. Inclusion in a commercial software package is also permitted, but I would appreciate receiving a free copy for my personal examination and use. There are no guarantees that this package is good for anything. I have tested it with LaTeX 2e, LaTeX 2.09 and Plain TeX. Although I know of no reason it will not work with AMSTeX, I have not tested it. \ No newline at end of file diff --git a/options/license/Beerware b/options/license/Beerware new file mode 100644 index 0000000..1e6f52c --- /dev/null +++ b/options/license/Beerware @@ -0,0 +1 @@ +"THE BEER-WARE LICENSE" (Revision 42): wrote this file. As long as you retain this notice you can do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp \ No newline at end of file diff --git a/options/license/BitTorrent-1.0 b/options/license/BitTorrent-1.0 new file mode 100644 index 0000000..01b2168 --- /dev/null +++ b/options/license/BitTorrent-1.0 @@ -0,0 +1,140 @@ +BitTorrent Open Source License +Version 1.0 + +This BitTorrent Open Source License (the "License") applies to the BitTorrent client and related software products as well as any updates or maintenance releases of that software ("BitTorrent Products") that are distributed by BitTorrent, Inc. ("Licensor").  Any BitTorrent Product licensed pursuant to this License is a Licensed Product. Licensed Product, in its entirety, is protected by U.S. copyright law.  This License identifies the terms under which you may use, copy, distribute or modify Licensed Product. +  +Preamble +  +This Preamble is intended to describe, in plain English, the nature and scope of this License.  However, this Preamble is not a part of this license.  The legal effect of this License is dependent only upon the terms of the License and not this Preamble. +  +This License complies with the Open Source Definition and is derived from the Jabber Open Source License 1.0 (the "JOSL"), which has been approved by Open Source Initiative. Sections 4(c) and 4(f)(iii) from the JOSL have been dropped. +  +This License provides that: +  +1. You may use, sell or give away the Licensed Product, alone or as a component of an aggregate software distribution containing programs from several different sources.  No royalty or other fee is required. +  +2. Both Source Code and executable versions of the Licensed Product, including Modifications made by previous Contributors, are available for your use.  (The terms "Licensed Product," "Modifications," "Contributors" and "Source Code" are defined in the License.) +  +3. You are allowed to make Modifications to the Licensed Product, and you can create Derivative Works from it. (The term "Derivative Works" is defined in the License.) +  +4. By accepting the Licensed Product under the provisions of this License, you agree that any Modifications you make to the Licensed Product and then distribute are governed by the provisions of this License.  In particular, you must make the Source Code of your Modifications available to others. +  +5. You may use the Licensed Product for any purpose, but the Licensor is not providing you any warranty whatsoever, nor is the Licensor accepting any liability in the event that the Licensed Product doesn't work properly or causes you any injury or damages. +  +6. If you sublicense the Licensed Product or Derivative Works, you may charge fees for warranty or support, or for accepting indemnity or liability obligations to your customers.  You cannot charge for the Source Code. +  +7. If you assert any patent claims against the Licensor relating to the Licensed Product, or if you breach any terms of the License, your rights to the Licensed Product under this License automatically terminate. +  +You may use this License to distribute your own Derivative Works, in which case the provisions of this License will apply to your Derivative Works just as they do to the original Licensed Product. +  +Alternatively, you may distribute your Derivative Works under any other OSI-approved Open Source license, or under a proprietary license of your choice.  If you use any license other than this License, however, you must continue to fulfill the requirements of this License (including the provisions relating to publishing the Source Code) for those portions of your Derivative Works that consist of the Licensed Product, including the files containing Modifications. +  +New versions of this License may be published from time to time.  You may choose to  continue to use the license terms in this version of the License or those from the new version.  However, only the Licensor has the right to change the License terms as they apply to the Licensed Product. +  +This License relies on precise definitions for certain terms.  Those terms are defined when they are first used, and the definitions are repeated for your convenience in a Glossary at the end of the License. +  +License Terms +  +1. Grant of License From Licensor.  Licensor hereby grants you a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, to do the following: + + a. Use, reproduce, modify, display, perform, sublicense and distribute any Modifications created by such Contributor or portions thereof, in both Source Code or as an executable program, either on an unmodified basis or as part of Derivative Works. + b. Under claims of patents now or hereafter owned or controlled by Contributor, to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof, but solely to the extent that any such claim is necessary to enable you to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof or Derivative Works thereof. + +2. Grant of License to Modifications From Contributor. "Modifications" means any additions to or deletions from the substance or structure of (i) a file containing Licensed Product, or (ii) any new file that contains any part of Licensed Product. Hereinafter in this License, the term "Licensed Product" shall include all previous Modifications that you receive from any Contributor. By application of the provisions in Section 4(a) below, each person or entity who created or contributed to the creation of, and distributed, a Modification (a "Contributor") hereby grants you a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, to do the following: + + 1. Use, reproduce, modify, display, perform, sublicense and distribute any Modifications created by such Contributor or portions thereof, in both Source Code or as an executable program, either on an unmodified basis or as part of Derivative Works. + 2. Under claims of patents now or hereafter owned or controlled by Contributor, to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof, but solely to the extent that any such claim is necessary to enable you to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof or Derivative Works thereof. + +3. Exclusions From License Grant.  Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor or any Contributor except as expressly stated herein. No patent license is granted separate from the Licensed Product, for code that you delete from the Licensed Product, or for combinations of the Licensed Product with other software or hardware.  No right is granted to the trademarks of Licensor or any Contributor even if such marks are included in the Licensed Product. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any code that Licensor otherwise would have a right to license. + +4. Your Obligations Regarding Distribution. + + a. Application of This License to Your Modifications.  As an express condition for your use of the Licensed Product, you hereby agree that any Modifications that you create or to which you contribute, and which you distribute, are governed by the terms of this License including, without limitation, Section 2.  Any Modifications that you create or to which you contribute may be distributed only under the terms of this License or a future version of this License released under Section 7.  You must include a copy of this License with every copy of the Modifications you distribute.  You agree not to offer or impose any terms on any Source Code or executable version of the Licensed Product or Modifications that alter or restrict the applicable version of this License or the recipients' rights hereunder. However, you may include an additional document offering the additional rights described in Section 4(d). + + b. Availability of Source Code.  You must make available, under the terms of this License, the Source Code of the Licensed Product and any Modifications that you distribute, either on the same media as you distribute any executable or other form of the Licensed Product, or via a mechanism generally accepted in the software development community for the electronic transfer of data (an "Electronic Distribution Mechanism").  The Source Code for any version of Licensed Product or Modifications that you distribute must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of said Licensed Product or Modifications has been made available.  You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + c. Intellectual Property Matters.  + + i. Third Party Claims.  If you have knowledge that a license to a third party's intellectual property right is required to exercise the rights granted by this License, you must include a text file with the Source Code distribution titled "LEGAL" that describes the claim and the party making the claim in +sufficient detail that a recipient will know whom to contact.  If you obtain such knowledge after you make any Modifications available as described in Section 4(b), you shall promptly modify the LEGAL file in all copies you make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Licensed Product from you that new knowledge has been obtained. + ii. Contributor APIs.  If your Modifications include an application programming interface ("API") and you have knowledge of patent licenses that are reasonably necessary to implement that API, you must also include this information in the LEGAL file. + iii. Representations.  You represent that, except as disclosed pursuant to 4(c)(i) above, you believe that any Modifications you distribute are your original creations and that you have sufficient rights to grant the rights conveyed by this License. + + d. Required Notices.  You must duplicate this License in any documentation you provide along with the Source Code of any Modifications you create or to which you contribute, and which you distribute, wherever you describe recipients' rights relating to Licensed Product.  You must duplicate the notice contained in Exhibit A (the "Notice") in each file of the Source Code of any copy you distribute of the Licensed Product. If you created a Modification, you may add your name as a Contributor to the Notice.  If it is not possible to put the Notice in a particular Source Code file due to its structure, then you must include such Notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice.  You may choose to offer, and charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Licensed Product. However, you may do so only on your own behalf, and not on behalf of the Licensor or any Contributor.  You must make it clear that any such warranty, support, indemnity or liability obligation is offered by you alone, and you hereby agree to indemnify the Licensor and every Contributor for any liability incurred by the Licensor or such Contributor as a result of warranty, support, indemnity or liability terms you offer. +  + e. Distribution of Executable Versions.  You may distribute Licensed Product as an executable program under a license of your choice that may contain terms different from this License provided (i) you have satisfied the requirements of Sections 4(a) through 4(d) for that distribution, (ii) you include a conspicuous notice in the +executable version, related documentation and collateral materials stating that the Source Code version of the Licensed Product is available under the terms of this License, including a description of how and where you have fulfilled the obligations of Section 4(b), and (iii) you make it clear that any terms that differ from this License are offered by you alone, not by Licensor or any Contributor.  You hereby agree to indemnify the Licensor and every Contributor for any liability incurred by Licensor or such Contributor as a result of any terms you offer. +  + f. Distribution of Derivative Works.  You may create Derivative Works (e.g., combinations of some or all of the Licensed Product with other code) and distribute the Derivative Works as products under any other license you select, with the proviso that the requirements of this License are fulfilled for those portions of the Derivative Works that consist of the Licensed Product or any Modifications thereto. + +5. Inability to Comply Due to Statute or Regulation.  If it is impossible for you to comply with any of the terms of this License with respect to some or all of the Licensed Product due to statute, judicial order, or regulation, then you must (i) comply with the terms of this License to the maximum extent possible, (ii) cite the statute or regulation that prohibits you from adhering to the License, and (iii) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 4(d), and must be included with all distributions of the Source Code.  Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill at computer programming to be able to understand it. + +6. Application of This License.  This License applies to code to which Licensor or Contributor has attached the Notice in Exhibit A, which is incorporated herein by this reference.  +  +7. Versions of This License. + + a. New Versions.  Licensor may publish from time to time revised and/or new versions of the License. + + b. Effect of New Versions.  Once Licensed Product has been published under a particular version of the License, you may always continue to use it under the terms of that version.  You may also choose to use such Licensed Product under the terms of any subsequent version of the License published by Licensor.  No one other than Licensor has the right to modify the terms applicable to Licensed Product created under this License. + + c. Derivative Works of this License.  If you create or use a modified version of this License, which you may do only in order to apply it to software that is not already a Licensed Product under this License, you must rename your license so that it is not confusingly similar to this License, and must make it clear that your license contains terms that differ from this License.  In so naming your license, you may not use any trademark of Licensor or any Contributor. + +8. Disclaimer of Warranty.  LICENSED PRODUCT IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE LICENSED PRODUCT IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LICENSED PRODUCT IS WITH YOU.  SHOULD LICENSED PRODUCT PROVE DEFECTIVE IN ANY RESPECT, YOU (AND NOT THE LICENSOR OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION.  THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF LICENSED PRODUCT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +9. Termination. + + a. Automatic Termination Upon Breach.  This license and the rights granted hereunder will terminate automatically if you fail to comply with the terms herein and fail to cure such breach within thirty (30) days of becoming aware of the breach.  All sublicenses to the Licensed Product that are properly granted shall survive any termination of this license.  Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive. +  + b. Termination Upon Assertion of Patent Infringement.  If you initiate litigation by asserting a patent infringement claim (excluding declaratory judgment actions) against Licensor or a Contributor (Licensor or Contributor against whom you file such an action is referred to herein as Respondent) alleging that Licensed Product directly or indirectly infringes any patent, then any and all rights granted by such Respondent to you under Sections 1 or 2 of this License shall terminate prospectively upon sixty (60) days notice from Respondent (the "Notice Period") unless within that Notice Period you either agree in writing (i) to pay Respondent a mutually agreeable reasonably royalty for your past or future use of Licensed Product made by such Respondent, or (ii) withdraw your litigation claim with respect to Licensed Product against such Respondent.  If within said Notice Period a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Licensor to you under Sections 1 and 2 automatically terminate at the expiration of said Notice Period. +  + c. Reasonable Value of This License.  If you assert a patent infringement claim against Respondent alleging that Licensed Product directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses +granted by said Respondent under Sections 1 and 2 shall be taken into account in determining the amount or value of any payment or license. +  + d. No Retroactive Effect of Termination.  In the event of termination under Sections 9(a) or 9(b) above, all end user license agreements (excluding licenses to distributors and resellers) that have been validly granted by you or any distributor hereunder prior to termination shall survive termination. +  +10.  Limitation of Liability.  UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE LICENSOR, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF LICENSED PRODUCT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES.  THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY +RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION.  SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. +  +11.  Responsibility for Claims.  As between Licensor and Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License.  You agree to work with Licensor and Contributors to distribute such responsibility on an equitable basis.  Nothing herein is intended or +shall be deemed to constitute any admission of liability. +  +12.  U.S. Government End Users.  The Licensed Product is a commercial item, as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer software and commercial computer software documentation, as such terms are used in 48 C.F.R. 12.212 (Sept. 1995).  Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through +227.7202-4 (June 1995), all U.S. Government End Users acquire Licensed Product with only those rights set forth herein. +  +13.  Miscellaneous.  This License represents the complete agreement concerning the subject matter hereof.  If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.  This License shall be governed by California law provisions (except to the extent applicable +law, if any, provides otherwise), excluding its conflict-of-law provisions.  You expressly agree that any litigation relating to this license shall be subject to the jurisdiction of the Federal Courts of the Northern District of California or the Superior Court of the County of Santa Clara, California (as appropriate), with venue lying in Santa Clara County, California, with the losing party responsible for costs including, without limitation, court costs and reasonable attorneys fees and expenses.  The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded.  You and Licensor expressly waive any rights to a jury trial in any litigation concerning Licensed Product or this License.  Any law or regulation that provides that the language of a contract shall be construed against the drafter shall not apply to this License. +  +14.  Definition of You in This License. You throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 7.  For legal entities, you includes any entity that controls, is +controlled by, or is under common control with you.  For purposes of this definition, control means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +  +15.  Glossary.  All defined terms in this License that are used in more than one Section of this License are repeated here, in alphabetical order, for the convenience of the reader.  The Section of this License in which each defined term is first used is shown in parentheses. +  +Contributor:  Each person or entity who created or contributed to the creation of, and distributed, a Modification. (See Section 2) +  +Derivative Works: That term as used in this License is defined under U.S. copyright law.  (See Section 1(b)) +  +License:  This BitTorrent Open Source License.  (See first paragraph of License) +  +Licensed Product:  Any BitTorrent Product licensed pursuant to this License.  The term "Licensed Product" includes all previous Modifications from any Contributor that you receive.  (See first paragraph of License and Section 2) +  +Licensor:  BitTorrent, Inc.  (See first paragraph of License) +  +Modifications:  Any additions to or deletions from the substance or structure of (i) a file containing Licensed Product, or (ii) any new file that contains any part of Licensed Product.  (See Section 2) +  +Notice:  The notice contained in Exhibit A.  (See Section 4(e)) +  +Source Code: The preferred form for making modifications to the Licensed Product, including all modules contained therein, plus any associated interface definition files, scripts used to control compilation and installation of an executable program, or a list of differential comparisons against the Source Code of the Licensed Product.  (See +Section 1(a)) +  +You:  This term is defined in Section 14 of this License. +  +EXHIBIT A +  +The Notice below must appear in each file of the Source Code of any copy you distribute of the Licensed Product or any hereto.  Contributors to any Modifications may add their own copyright notices to identify their own contributions. +  +License: +  +The contents of this file are subject to the BitTorrent Open Source License Version 1.0 (the License).  You may not copy or use this file, in either source code or executable form, except in compliance with the License.  You may obtain a copy of the License at http://www.bittorrent.com/license/. +  +Software distributed under the License is distributed on an AS IS basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License for the specific language governing rights and limitations under the License. +  \ No newline at end of file diff --git a/options/license/BitTorrent-1.1 b/options/license/BitTorrent-1.1 new file mode 100644 index 0000000..76e2ef2 --- /dev/null +++ b/options/license/BitTorrent-1.1 @@ -0,0 +1,137 @@ +BitTorrent Open Source License +Version 1.1 + +This BitTorrent Open Source License (the "License") applies to the BitTorrent client and related software products as well as any updates or maintenance releases of that software ("BitTorrent Products") that are distributed by BitTorrent, Inc. ("Licensor"). Any BitTorrent Product licensed pursuant to this License is a Licensed Product. Licensed Product, in its entirety, is protected by U.S. copyright law. This License identifies the terms under which you may use, copy, distribute or modify Licensed Product. + +Preamble + +This Preamble is intended to describe, in plain English, the nature and scope of this License. However, this Preamble is not a part of this license. The legal effect of this License is dependent only upon the terms of the License and not this Preamble. + +This License complies with the Open Source Definition and is derived from the Jabber Open Source License 1.0 (the "JOSL"), which has been approved by Open Source Initiative. Sections 4(c) and 4(f)(iii) from the JOSL have been deleted. + +This License provides that: + +1. You may use or give away the Licensed Product, alone or as a component of an aggregate software distribution containing programs from several different sources. No royalty or other fee is required. + +2. Both Source Code and executable versions of the Licensed Product, including Modifications made by previous Contributors, are available for your use. (The terms "Licensed Product," "Modifications," "Contributors" and "Source Code" are defined in the License.) + +3. You are allowed to make Modifications to the Licensed Product, and you can create Derivative Works from it. (The term "Derivative Works" is defined in the License.) + +4. By accepting the Licensed Product under the provisions of this License, you agree that any Modifications you make to the Licensed Product and then distribute are governed by the provisions of this License. In particular, you must make the Source Code of your Modifications available to others free of charge and without a royalty. + +5. You may sell, accept donations or otherwise receive compensation for executable versions of a Licensed Product, without paying a royalty or other fee to the Licensor or any Contributor, provided that such executable versions contain your or another Contributor's material Modifications. For the avoidance of doubt, to the extent your executable version of a Licensed Product does not contain your or another Contributor's material Modifications, you may not sell, accept donations or otherwise receive compensation for such executable. + +You may use the Licensed Product for any purpose, but the Licensor is not providing you any warranty whatsoever, nor is the Licensor accepting any liability in the event that the Licensed Product doesn't work properly or causes you any injury or damages. + +6. If you sublicense the Licensed Product or Derivative Works, you may charge fees for warranty or support, or for accepting indemnity or liability obligations to your customers. You cannot charge for, sell, accept donations or otherwise receive compensation for the Source Code. + +7. If you assert any patent claims against the Licensor relating to the Licensed Product, or if you breach any terms of the License, your rights to the Licensed Product under this License automatically terminate. +You may use this License to distribute your own Derivative Works, in which case the provisions of this License will apply to your Derivative Works just as they do to the original Licensed Product. + +Alternatively, you may distribute your Derivative Works under any other OSI-approved Open Source license, or under a proprietary license of your choice. If you use any license other than this License, however, you must continue to fulfill the requirements of this License (including the provisions relating to publishing the Source Code) for those portions of your Derivative Works that consist of the Licensed Product, including the files containing +Modifications. + +New versions of this License may be published from time to time in connection with new versions of a Licensed Product or otherwise. You may choose to continue to use the license terms in this version of the License for the Licensed Product that was originally licensed hereunder, however, the new versions of this License will at all times apply to new versions of the Licensed Product released by Licensor after the release of the new version of this License. Only the Licensor has the right to change the License terms as they apply to the Licensed Product. + +This License relies on precise definitions for certain terms. Those terms are defined when they are first used, and the definitions are repeated for your convenience in a Glossary at the end of the License. + +License Terms + +1. Grant of License From Licensor. Subject to the terms and conditions of this License, Licensor hereby grants you a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, to do the following: + + a. Use, reproduce, modify, display, perform, sublicense and distribute any Modifications created by a Contributor or portions thereof, in both Source Code or as an executable program, either on an unmodified basis or as part of Derivative Works. + b. Under claims of patents now or hereafter owned or controlled by Contributor, to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof, but solely to the extent that any such claim is necessary to enable you to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof or Derivative Works thereof. + +2. Grant of License to Modifications From Contributor. "Modifications" means any additions to or deletions from the substance or structure of (i) a file containing a Licensed Product, or (ii) any new file that contains any part of a Licensed Product. Hereinafter in this License, the term "Licensed Product" shall include all previous Modifications that you receive from any Contributor. Subject to the terms and conditions of this License, By application of the provisions in Section 4(a) below, each person or entity who created or contributed to the creation of, and distributed, a Modification (a "Contributor") hereby grants you a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, to do the following: + + a. Use, reproduce, modify, display, perform, sublicense and distribute any Modifications created by such Contributor or portions thereof, in both Source Code or as an executable program, either on an unmodified basis or as part of Derivative Works. + + b. Under claims of patents now or hereafter owned or controlled by Contributor, to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof, but solely to the extent that any such claim is necessary to enable you to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof or Derivative Works thereof. + +3. Exclusions From License Grant. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor or any Contributor except as expressly stated herein. No patent license is granted separate from the Licensed Product, for code that you delete from the Licensed Product, or for combinations of the Licensed Product with other software or hardware. No right is granted to the trademarks of Licensor or any Contributor even if such marks are included in the Licensed Product. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any code that Licensor otherwise would have a right to license. As an express condition for your use of the Licensed Product, you hereby agree that you will not, without the prior written consent of Licensor, use any trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor or any Contributor except as expressly stated herein. For the avoidance of doubt and without limiting the foregoing, you hereby agree that you will not use or display any trademark of Licensor or any Contributor in any domain name, directory filepath, advertisement, link or other reference to you in any manner or in any media. + +4. Your Obligations Regarding Distribution. + + a. Application of This License to Your Modifications. As an express condition for your use of the Licensed Product, you hereby agree that any Modifications that you create or to which you contribute, and which you distribute, are governed by the terms of this License including, without limitation, Section 2. Any Modifications that you create or to which you contribute may be distributed only under the terms of this License or a future version of this License released under Section 7. You must include a copy of this License with every copy of the Modifications you distribute. You agree not to offer or impose any terms on any Source Code or executable version of the Licensed Product or Modifications that alter or restrict the applicable version of this License or the recipients' rights hereunder. However, you may include an additional document offering the additional rights described in Section 4(d). + + b. Availability of Source Code. You must make available, without charge, under the terms of this License, the Source Code of the Licensed Product and any Modifications that you distribute, either on the same media as you distribute any executable or other form of the Licensed Product, or via a mechanism generally accepted in the software development community for the electronic transfer of data (an "Electronic Distribution Mechanism"). The Source Code for any version of Licensed Product or Modifications that you distribute must remain available for as long as any executable or other form of the Licensed Product is distributed by you. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + c. Intellectual Property Matters. + + i. Third Party Claims. If you have knowledge that a license to a third party's intellectual property right is required to exercise the rights granted by this License, you must include a text file with the Source Code distribution titled "LEGAL" that describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after you make any Modifications available as described in Section 4(b), you shall promptly modify the LEGAL file in all copies you make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Licensed Product from you that new knowledge has been obtained. + ii. Contributor APIs. If your Modifications include an application programming interface ("API") and you have knowledge of patent licenses that are reasonably necessary to implement that API, you must also include this information in the LEGAL file. + iii. Representations. You represent that, except as disclosed pursuant to 4(c)(i) above, you believe that any Modifications you distribute are your original creations and that you have sufficient rights to grant the rights conveyed by this License. + + d. Required Notices. You must duplicate this License in any documentation you provide along with the Source Code of any Modifications you create or to which you contribute, and which you distribute, wherever you describe recipients' rights relating to Licensed Product. You must duplicate the notice contained in Exhibit A (the "Notice") in each file of the Source Code of any copy you distribute of the Licensed Product. If you created a Modification, you may add your name as a Contributor to the Notice. If it is not possible to put the Notice in a particular Source Code file due to its structure, then you must include such Notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Licensed Product. However, you may do so only on your own behalf, and not on behalf of the Licensor or any Contributor. You must make it clear that any such warranty, support, indemnity or liability obligation is offered by you alone, and you hereby agree to indemnify the Licensor and every Contributor for any liability incurred by the Licensor or such Contributor as a result of warranty, support, indemnity or liability terms you offer. + + e. Distribution of Executable Versions. You may distribute Licensed Product as an executable program under a license of your choice that may contain terms different from this License provided (i) you have satisfied the requirements of Sections 4(a) through 4(d) for that distribution, (ii) you include a conspicuous notice in the executable version, related documentation and collateral materials stating that the Source Code version of the Licensed Product is available under the terms of this License, including a description of how and where you have fulfilled the obligations of Section 4(b), and (iii) you make it clear that any terms that differ from this License are offered by you alone, not by Licensor or any Contributor. You hereby agree to indemnify the Licensor and every Contributor for any liability incurred by Licensor or such Contributor as a result of any terms you offer. + + f. Distribution of Derivative Works. You may create Derivative Works (e.g., combinations of some or all of the Licensed Product with other code) and distribute the Derivative Works as products under any other license you select, with the proviso that the requirements of this License are fulfilled for those portions of the Derivative Works that consist of the Licensed Product or any Modifications thereto. + + g. Compensation for Distribution of Executable Versions of Licensed Products, Modifications or Derivative Works. Notwithstanding any provision of this License to the contrary, by distributing, selling, licensing, sublicensing or otherwise making available any Licensed Product, or Modification or Derivative Work thereof, you and Licensor hereby acknowledge and agree that you may sell, license or sublicense for a fee, accept donations or otherwise receive compensation for executable versions of a Licensed Product, without paying a royalty or other fee to the Licensor or any other Contributor, provided that such executable versions (i) contain your or another Contributor's material Modifications, or (ii) are otherwise material Derivative Works. For purposes of this License, an executable version of the Licensed Product will be deemed to contain a material Modification, or will otherwise be deemed a material Derivative Work, if (a) the Licensed Product is modified with your own or a third party's software programs or other code, and/or the Licensed Product is combined with a number of your own or a third party's software programs or code, respectively, and (b) such software programs or code add or contribute material value, functionality or features to the License Product. For the avoidance of doubt, to the extent your executable version of a Licensed Product does not contain your or another Contributor's material Modifications or is otherwise not a material Derivative Work, in each case as contemplated herein, you may not sell, license or sublicense for a fee, accept donations or otherwise receive compensation for such executable. Additionally, without limitation of the foregoing and notwithstanding any provision of this License to the contrary, you cannot charge for, sell, license or sublicense for a fee, accept donations or otherwise receive compensation for the Source Code. + +5. Inability to Comply Due to Statute or Regulation. If it is impossible for you to comply with any of the terms of this License with respect to some or all of the Licensed Product due to statute, judicial order, or regulation, then you must (i) comply with the terms of this License to the maximum extent possible, (ii) cite the statute or regulation that prohibits you from adhering to the License, and (iii) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 4(d), and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill at computer programming to be able to understand it. + +6. Application of This License. This License applies to code to which Licensor or Contributor has attached the Notice in Exhibit A, which is incorporated herein by this reference. + +7. Versions of This License. + + a. New Versions. Licensor may publish from time to time revised and/or new versions of the License. + + b. Effect of New Versions. Once Licensed Product has been published under a particular version of the License, you may always continue to use it under the terms of that version, provided that any such license be in full force and effect at the time, and has not been revoked or otherwise terminated. You may also choose to use such Licensed Product under the terms of any subsequent version (but not any prior version) of the License published by Licensor. No one other than Licensor has the right to modify the terms applicable to Licensed Product created under this License. + + c. Derivative Works of this License. If you create or use a modified version of this License, which you may do only in order to apply it to software that is not already a Licensed Product under this License, you must rename your license so that it is not confusingly similar to this License, and must make it clear that your license contains terms that differ from this License. In so naming your license, you may not use any trademark of Licensor or any Contributor. + +8. Disclaimer of Warranty. LICENSED PRODUCT IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE LICENSED PRODUCT IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LICENSED PRODUCT IS WITH YOU. SHOULD LICENSED PRODUCT PROVE DEFECTIVE IN ANY RESPECT, YOU (AND NOT THE LICENSOR OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF LICENSED PRODUCT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +9. Termination. + + a. Automatic Termination Upon Breach. This license and the rights granted hereunder will terminate automatically if you fail to comply with the terms herein and fail to cure such breach within ten (10) days of being notified of the breach by the Licensor. For purposes of this provision, proof of delivery via email to the address listed in the 'WHOIS' database of the registrar for any website through which you distribute or market any Licensed Product, or to any alternate email address which you designate in writing to the Licensor, shall constitute sufficient notification. All sublicenses to the Licensed Product that are properly granted shall survive any termination of this license so long as they continue to complye with the terms of this License. Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive. + + b. Termination Upon Assertion of Patent Infringement. If you initiate litigation by asserting a patent infringement claim (excluding declaratory judgment actions) against Licensor or a Contributor (Licensor or Contributor against whom you file such an action is referred to herein as Respondent) alleging that Licensed Product directly or indirectly infringes any patent, then any and all rights granted by such Respondent to you under Sections 1 or 2 of this License shall terminate prospectively upon sixty (60) days notice from Respondent (the "Notice Period") unless within that Notice Period you either agree in writing (i) to pay Respondent a mutually agreeable reasonably royalty for your past or future use of Licensed Product made by such Respondent, or (ii) withdraw your litigation claim with respect to Licensed Product against such Respondent. If within said Notice Period a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Licensor to you under Sections 1 and 2 automatically terminate at the expiration of said Notice Period. + + c. Reasonable Value of This License. If you assert a patent infringement claim against Respondent alleging that Licensed Product directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by said Respondent under Sections 1 and 2 shall be taken into account in determining the amount or value of any payment or license. + + d. No Retroactive Effect of Termination. In the event of termination under Sections 9(a) or 9(b) above, all end user license agreements (excluding licenses to distributors and resellers) that have been validly granted by you or any distributor hereunder prior to termination shall survive termination. + +10. Limitation of Liability. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE LICENSOR, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF LICENSED PRODUCT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +11. Responsibility for Claims. As between Licensor and Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License. You agree to work with Licensor and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +12. U.S. Government End Users. The Licensed Product is a commercial item, as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer software and commercial computer software documentation, as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Licensed Product with only those rights set forth herein. + +13. Miscellaneous. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. You expressly agree that in any litigation relating to this license the losing party shall be responsible for costs including, without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation that provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +14. Definition of You in This License. You throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 7. For legal entities, you includes any entity that controls, is controlled by, is under common control with, or affiliated with, you. For purposes of this definition, control means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. You are responsible for advising any affiliated entity of the terms of this License, and that any rights or privileges derived from or obtained by way of this License are subject to the restrictions outlined herein. + +15. Glossary. All defined terms in this License that are used in more than one Section of this License are repeated here, in alphabetical order, for the convenience of the reader. The Section of this License in which each defined term is first used is shown in parentheses. + +Contributor: Each person or entity who created or contributed to the creation of, and distributed, a Modification. (See Section 2) + +Derivative Works: That term as used in this License is defined under U.S. copyright law. (See Section 1(b)) + +License: This BitTorrent Open Source License. (See first paragraph of License) + +Licensed Product: Any BitTorrent Product licensed pursuant to this License. The term "Licensed Product" includes all previous Modifications from any Contributor that you receive. (See first paragraph of License and Section 2) + +Licensor: BitTorrent, Inc. (See first paragraph of License) + +Modifications: Any additions to or deletions from the substance or structure of (i) a file containing Licensed +Product, or (ii) any new file that contains any part of Licensed Product. (See Section 2) + +Notice: The notice contained in Exhibit A. (See Section 4(e)) + +Source Code: The preferred form for making modifications to the Licensed Product, including all modules contained therein, plus any associated interface definition files, scripts used to control compilation and installation of an executable program, or a list of differential comparisons against the Source Code of the Licensed Product. (See Section 1(a)) + +You: This term is defined in Section 14 of this License. + +EXHIBIT A + +The Notice below must appear in each file of the Source Code of any copy you distribute of the Licensed Product or any hereto. Contributors to any Modifications may add their own copyright notices to identify their own contributions. + +License: +The contents of this file are subject to the BitTorrent Open Source License Version 1.0 (the License). You may not copy or use this file, in either source code or executable form, except in compliance with the License. You may obtain a copy of the License at http://www.bittorrent.com/license/. + +Software distributed under the License is distributed on an AS IS basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +BitTorrent, Inc. diff --git a/options/license/Borceux b/options/license/Borceux new file mode 100644 index 0000000..4856e78 --- /dev/null +++ b/options/license/Borceux @@ -0,0 +1,19 @@ +Copyright 1993 Francis Borceux +You may freely use, modify, and/or distribute each of the files in this package without limitation. The package consists of the following files: + +README +compatibility/OldDiagram +compatibility/OldMaxiDiagram +compatibility/OldMicroDiagram +compatibility/OldMiniDiagram +compatibility/OldMultipleArrows +diagram/Diagram +diagram/MaxiDiagram +diagram/MicroDiagram +diagram/MiniDiagram +diagram/MultipleArrows +user-guides/Diagram_Mode_d_Emploi +user-guides/Diagram_Read_Me + +Of course no support is guaranteed, but the author will attempt to assist with problems. Current email address: +francis dot borceux at uclouvain dot be. diff --git a/options/license/CATOSL-1.1 b/options/license/CATOSL-1.1 new file mode 100644 index 0000000..1baf2aa --- /dev/null +++ b/options/license/CATOSL-1.1 @@ -0,0 +1,114 @@ +Computer Associates Trusted Open Source License +Version 1.1 + +PLEASE READ THIS DOCUMENT CAREFULLY AND IN ITS ENTIRETY. THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMPUTER ASSOCIATES TRUSTED OPEN SOURCE LICENSE ("LICENSE"). ANY USE, REPRODUCTION, MODIFICATION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES THE RECIPIENT'S ACCEPTANCE OF THIS LICENSE. + +License Background + +Computer Associates International, Inc. (CA) believes in open source. We believe that the open source development approach can take appropriate software programs to unprecedented levels of quality, growth, and innovation. To demonstrate our continuing commitment to open source, we are releasing the Program (as defined below) under this License. + +This License is intended to permit contributors and recipients of the Program to use the Program, including its source code, freely and without many of the concerns of some other open source licenses. Although we expect the underlying Program, and Contributions (as defined below) made to such Program, to remain open, this License is designed to permit you to maintain your own software programs free of this License unless you choose to do so. Thus, only your Contributions to the Program must be distributed under the terms of this License. + +The provisions that follow set forth the terms and conditions under which you may use the Program. + +1. DEFINITIONS + +1.1 Contribution means (a) in the case of CA, the Original Program; and (b) in the case of each Contributor (including CA), changes and additions to the Program, where such changes and/or additions to the Program originate from and are distributed by that particular Contributor to unaffiliated third parties. A Contribution originates from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributors behalf. Contributions do not include additions to the Program which: (x) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (y) are not derivative works of the Program. + +1.2 Contributor means CA and any other person or entity that distributes the Program. + +1.3 Contributor Version means as to a Contributor, that version of the Program that includes the Contributors Contribution but not any Contributions made to the Program thereafter. + +1.4 Larger Work means a work that combines the Program or portions thereof with code not governed by the terms of this License. + +1.5 Licensed Patents mean patents licensable by a Contributor that are infringed by the use or sale of its Contribution alone or when combined with the Program. + +1.6 Original Program means the original version of the software to which this License is attached and as released by CA, including source code, object code and documentation, if any. + +1.7 Program means the Original Program and Contributions. + +1.8 Recipient means anyone who modifies, copies, uses or distributes the Program. + +2. GRANT OF RIGHTS + +2.1 Subject to the terms of this License, each Contributor hereby grants Recipient an irrevocable, non-exclusive, worldwide, royalty-free license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. For the avoidance of doubt, the license provided in this Section 2.1 shall not include a license to any Licensed Patents of a Contributor. + +2.2 Subject to the terms of this License, each Contributor hereby grants Recipient an irrevocable, non-exclusive, worldwide, royalty-free license to the Licensed Patents to the extent necessary to make, use, sell, offer to sell and import the Contribution of such Contributor, if any, in source code and object code form. The license granted in this Section 2.2 shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes the Licensed Patents to be infringed by such combination. Notwithstanding the foregoing, no license is granted under this Section 2.2: (a) for any code or works that do not include the Contributor Version, as it exists and is used in accordance with the terms hereof; (b) for infringements caused by: (i) third party modifications of the Contributor Version; or (ii) the combination of Contributions made by each such Contributor with other software (except as part of the Contributor Version) or other devices; or (c) with respect to Licensed Patents infringed by the Program in the absence of Contributions made by that Contributor. + +2.3 Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, except as provided in Section 2.4, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other person or entity. Each Contributor disclaims any liability to Recipient for claims brought by any other person or entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. + +2.4 Each Contributor represents and warrants that it has all right, title and interest in the copyrights in its Contributions, and has the right to grant the copyright licenses set forth in this License. + +3. DISTRIBUTION REQUIREMENTS + +3.1 If the Program is distributed in object code form, then a prominent notice must be included in the code itself as well as in any related documentation, stating that the source code for the Program is available from the Contributor with information on how and where to obtain the source code. A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + + * it complies with the terms and conditions of this License; and + * its license agreement: + * effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose, to the maximum extent permitted by applicable law; + * effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits, to the maximum extent permitted by applicable law; + * states that any provisions which are inconsistent with this License are offered by that Contributor alone and not by any other party; and + * states that source code for the Program is available from such Contributor at the cost of distribution, and informs licensees how to obtain it in a reasonable manner. + +3.2 When the Program is made available in source code form: + + * it must be made available under this License; and + * a copy of this License must be included with each copy of the Program. + +3.3 This License is intended to facilitate the commercial distribution of the Program by any Contributor. However, Contributors may only charge Recipients a one-time, upfront fee for the distribution of the Program. Contributors may not charge Recipients any recurring charge, license fee, or any ongoing royalty for the Recipients exercise of its rights under this License to the Program. Contributors shall make the source code for the Contributor Version they distribute available at a cost, if any, equal to the cost to the Contributor to physically copy and distribute the work. It is not the intent of this License to prohibit a Contributor from charging fees for any service or maintenance that a Contributor may charge to a Recipient, so long as such fees are not an attempt to circumvent the foregoing restrictions on charging royalties or other recurring fees for the Program itself. + +3.4 A Contributor may create a Larger Work by combining the Program with other software code not governed by the terms of this License, and distribute the Larger Work as a single product. In such a case, the Contributor must make sure that the requirements of this License are fulfilled for the Program. Any Contributor who includes the Program in a commercial product offering, including as part of a Larger Work, may subject itself, but not any other Contributor, to additional contractual commitments, including, but not limited to, performance warranties and non-infringement representations on suchContributors behalf. No Contributor may create any additional liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (Commercial Contributor) hereby agrees to defend and indemnify every other Contributor (Indemnified Contributor) who made Contributions to the Program distributed by the Commercial Contributor against any losses, damages and costs (collectively Losses) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions, including any additional contractual commitments, of such Commercial Contributor in connection with its distribution of the Program. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. + +3.5 If Contributor has knowledge that a license under a third partys intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must (a) include a text file with the Program source code distribution titled ../IP_ISSUES, and (b) notify CA in writing at Computer Associates International, Inc., One Computer Associates Plaza, Islandia, New York 11749, Attn: Open Source Group or by email at opensource@ca.com, both describing the claim and the party making the claim in sufficient detail that a Recipient and CA will know whom to contact with regard to such matter. If Contributor obtains such knowledge after the Contribution is made available, Contributor shall also promptly modify the IP_ISSUES file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Program that such new knowledge has been obtained. + +3.6 Recipient shall not remove, obscure, or modify any CA or other Contributor copyright or patent proprietary notices appearing in the Program, whether in the source code, object code or in any documentation. In addition to the obligations set forth in Section 4, each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. CONTRIBUTION RESTRICTIONS + +4.1 Each Contributor must cause the Program to which the Contributor provides a Contribution to contain a file documenting the changes the Contributor made to create its version of the Program and the date of any change. Each Contributor must also include a prominent statement that the Contribution is derived, directly or indirectly, from the Program distributed by a prior Contributor, including the name of the prior Contributor from which such Contribution was derived, in (a) the Program source code, and (b) in any notice in an executable version or related documentation in which the Contributor describes the origin or ownership of the Program. + +5. NO WARRANTY + +5.1 EXCEPT AS EXPRESSLY SET FORTH IN THIS LICENSE, THE PROGRAM IS PROVIDED AS IS AND IN ITS PRESENT STATE AND CONDITION. NO WARRANTY, REPRESENTATION, CONDITION, UNDERTAKING OR TERM, EXPRESS OR IMPLIED, STATUTORY OR OTHERWISE, AS TO THE CONDITION, QUALITY, DURABILITY, PERFORMANCE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE OR USE OF THE PROGRAM IS GIVEN OR ASSUMED BY ANY CONTRIBUTOR AND ALL SUCH WARRANTIES, REPRESENTATIONS, CONDITIONS, UNDERTAKINGS AND TERMS ARE HEREBY EXCLUDED TO THE FULLEST EXTENT PERMITTED BY LAW. + +5.2 Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this License, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +5.3 Each Recipient acknowledges that the Program is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Program could lead to death, personal injury, or severe physical or environmental damage. + +6. DISCLAIMER OF LIABILITY + +6.1 EXCEPT AS EXPRESSLY SET FORTH IN THIS LICENSE, AND TO THE EXTENT PERMITTED BY LAW, NO CONTRIBUTOR SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. TRADEMARKS AND BRANDING + +7.1 This License does not grant any Recipient or any third party any rights to use the trademarks or trade names now or subsequently posted at http://www.ca.com/catrdmrk.htm, or any other trademarks, service marks, logos or trade names belonging to CA (collectively CA Marks) or to any trademark, service mark, logo or trade name belonging to any Contributor. Recipient agrees not to use any CA Marks in or as part of the name of products derived from the Original Program or to endorse or promote products derived from the Original Program. + +7.2 Subject to Section 7.1, Recipients may distribute the Program under trademarks, logos, and product names belonging to the Recipient provided that all copyright and other attribution notices remain in the Program. + +8. PATENT LITIGATION + +8.1 If Recipient institutes patent litigation against any person or entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipients patent(s), then such Recipients rights granted under Section 2.2 shall terminate as of the date such litigation is filed. + +9. OWNERSHIP + +9.1 Subject to the licenses granted under this License in Sections 2.1 and 2.2 above, each Contributor retains all rights, title and interest in and to any Contributions made by such Contributor. CA retains all rights, title and interest in and to the Original Program and any Contributions made by or on behalf of CA (CA Contributions), and such CA Contributions will not be automatically subject to this License. CA may, at its sole discretion, choose to license such CA Contributions under this License, or on different terms from those contained in this License or may choose not to license them at all. + +10. TERMINATION + +10.1 All of Recipients rights under this License shall terminate if it fails to comply with any of the material terms or conditions of this License and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If Recipients rights under this License terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipients obligations under this License and any licenses granted by Recipient as a Contributor relating to the Program shall continue and survive termination. + +11. GENERAL + +11.1 If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +11.2 CA may publish new versions (including revisions) of this License from time to time. Each new version of the License will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the License under which it was received. In addition, after a new version of the License is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. No one other than CA has the right to modify this License. + +11.3 If it is impossible for Recipient to comply with any of the terms of this License with respect to some or all of the Program due to statute, judicial order, or regulation, then Recipient must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the IP_ISSUES file described in Section 3.5 and must be included with all distributions of the Program source code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a Recipient of ordinary skill to be able to understand it. + +11.4 This License is governed by the laws of the State of New York. No Recipient will bring a legal action under this License more than one year after the cause of action arose. Each Recipient waives its rights to a jury trial in any resulting litigation. Any litigation or other dispute resolution between a Recipient and CA relating to this License shall take place in the State of New York, and Recipient and CA hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that district with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. + +11.5 Where Recipient is located in the province of Quebec, Canada, the following clause applies: The parties hereby confirm that they have requested that this License and all related documents be drafted in English. Les parties contractantes confirment qu'elles ont exige que le present contrat et tous les documents associes soient rediges en anglais. + +11.6 The Program is subject to all export and import laws, restrictions and regulations of the country in which Recipient receives the Program. Recipient is solely responsible for complying with and ensuring that Recipient does not export, re-export, or import the Program in violation of such laws, restrictions or regulations, or without any necessary licenses and authorizations. + +11.7 This License constitutes the entire agreement between the parties with respect to the subject matter hereof. \ No newline at end of file diff --git a/options/license/CC-BY-1.0 b/options/license/CC-BY-1.0 new file mode 100644 index 0000000..f2392b3 --- /dev/null +++ b/options/license/CC-BY-1.0 @@ -0,0 +1,80 @@ +Creative Commons Attribution 1.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DRAFT LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to create and reproduce Derivative Works; + + c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + + d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested. + + b. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + + a. By offering the Work for public release under this License, Licensor represents and warrants that, to the best of Licensor's knowledge after reasonable inquiry: + + i. Licensor has secured all rights in the Work necessary to grant the license rights hereunder and to permit the lawful exercise of the rights granted hereunder without You having any obligation to pay any royalties, compulsory license fees, residuals or any other payments; + + ii. The Work does not infringe the copyright, trademark, publicity rights, common law rights or any other right of any third party or constitute defamation, invasion of privacy or other tortious injury to any third party. + + b. EXCEPT AS EXPRESSLY STATED IN THIS LICENSE OR OTHERWISE AGREED IN WRITING OR REQUIRED BY APPLICABLE LAW, THE WORK IS LICENSED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES REGARDING THE CONTENTS OR ACCURACY OF THE WORK. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, AND EXCEPT FOR DAMAGES ARISING FROM LIABILITY TO A THIRD PARTY RESULTING FROM BREACH OF THE WARRANTIES IN SECTION 5, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. diff --git a/options/license/CC-BY-2.0 b/options/license/CC-BY-2.0 new file mode 100644 index 0000000..9228f69 --- /dev/null +++ b/options/license/CC-BY-2.0 @@ -0,0 +1,81 @@ +Creative Commons Attribution 2.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.<> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to create and reproduce Derivative Works; + + c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + + d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works. + + e. For the avoidance of doubt, where the work is a musical composition: + + i. Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work. + + ii. Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions). + + f. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions). + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested. + + b. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-3.0 b/options/license/CC-BY-3.0 new file mode 100644 index 0000000..7d48247 --- /dev/null +++ b/options/license/CC-BY-3.0 @@ -0,0 +1,93 @@ +Creative Commons Attribution 3.0 Unported + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + + b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + + c. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + + d. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + + e. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + + f. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + + g. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + + h. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + + i. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + + b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + + c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + + d. to Distribute and Publicly Perform Adaptations. + + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + + ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + + iii. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. + + b. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + c. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. + + e. This License may not be modified without the mutual written agreement of the Licensor and You. + + f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. + +Creative Commons Notice + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-4.0 b/options/license/CC-BY-4.0 new file mode 100644 index 0000000..c13c4c7 --- /dev/null +++ b/options/license/CC-BY-4.0 @@ -0,0 +1,154 @@ +Creative Commons Attribution 4.0 International + +<> Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. <> + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + +b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified form), You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.

Creative Commons may be contacted at creativecommons.org. diff --git a/options/license/CC-BY-NC-1.0 b/options/license/CC-BY-NC-1.0 new file mode 100644 index 0000000..7e55e08 --- /dev/null +++ b/options/license/CC-BY-NC-1.0 @@ -0,0 +1,75 @@ +Creative Commons Attribution-NonCommercial 1.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DRAFT LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to create and reproduce Derivative Works; + + c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + + d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested. + + b. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + + c. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + +By offering the Work for public release under this License, Licensor represents and warrants that, to the best of Licensor's knowledge after reasonable inquiry: Licensor has secured all rights in the Work necessary to grant the license rights hereunder and to permit the lawful exercise of the rights granted hereunder without You having any obligation to pay any royalties, compulsory license fees, residuals or any other payments; The Work does not infringe the copyright, trademark, publicity rights, common law rights or any other right of any third party or constitute defamation, invasion of privacy or other tortious injury to any third party. EXCEPT AS EXPRESSLY STATED IN THIS LICENSE OR OTHERWISE AGREED IN WRITING OR REQUIRED BY APPLICABLE LAW, THE WORK IS LICENSED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES REGARDING THE CONTENTS OR ACCURACY OF THE WORK. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, AND EXCEPT FOR DAMAGES ARISING FROM LIABILITY TO A THIRD PARTY RESULTING FROM BREACH OF THE WARRANTIES IN SECTION 5, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-NC-2.0 b/options/license/CC-BY-NC-2.0 new file mode 100644 index 0000000..a99d065 --- /dev/null +++ b/options/license/CC-BY-NC-2.0 @@ -0,0 +1,81 @@ +Creative Commons Attribution-NonCommercial 2.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to create and reproduce Derivative Works; + + c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + + d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Sections 4(d) and 4(e). + +4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested. + + b. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + + c. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + + d. For the avoidance of doubt, where the Work is a musical composition: + + i. Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work if that performance is primarily intended for or directed toward commercial advantage or private monetary compensation. + + ii. Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions), if Your distribution of such cover version is primarily intended for or directed toward commercial advantage or private monetary compensation. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-NC-3.0 b/options/license/CC-BY-NC-3.0 new file mode 100644 index 0000000..5cd4720 --- /dev/null +++ b/options/license/CC-BY-NC-3.0 @@ -0,0 +1,95 @@ +Creative Commons Attribution-NonCommercial 3.0 Unported + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + + b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + + c. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + + d. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + + e. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + + f. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + + g. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + + h. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + + i. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + + b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + + c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + + d. to Distribute and Publicly Perform Adaptations. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d). + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested. + + b. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + + c. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, (iv) consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + d. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + + ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, + + iii. Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c). + + e. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + + f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. + +Creative Commons Notice + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of the License. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-NC-4.0 b/options/license/CC-BY-NC-4.0 new file mode 100644 index 0000000..5c36579 --- /dev/null +++ b/options/license/CC-BY-NC-4.0 @@ -0,0 +1,156 @@ +Creative Commons Attribution-NonCommercial 4.0 International + +<> Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. <> + +Creative Commons Attribution-NonCommercial 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + i. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. + + j. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + k. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + l. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and + + B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified form), You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.

Creative Commons may be contacted at creativecommons.org. diff --git a/options/license/CC-BY-NC-ND-1.0 b/options/license/CC-BY-NC-ND-1.0 new file mode 100644 index 0000000..daeb921 --- /dev/null +++ b/options/license/CC-BY-NC-ND-1.0 @@ -0,0 +1,75 @@ +Creative Commons Attribution-NoDerivs-NonCommercial 1.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DRAFT LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. + + b. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + + c. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied. Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + + a. By offering the Work for public release under this License, Licensor represents and warrants that, to the best of Licensor's knowledge after reasonable inquiry: + + i. Licensor has secured all rights in the Work necessary to grant the license rights hereunder and to permit the lawful exercise of the rights granted hereunder without You having any obligation to pay any royalties, compulsory license fees, residuals or any other payments; + + ii. The Work does not infringe the copyright, trademark, publicity rights, common law rights or any other right of any third party or constitute defamation, invasion of privacy or other tortious injury to any third party. + + b. EXCEPT AS EXPRESSLY STATED IN THIS LICENSE OR OTHERWISE AGREED IN WRITING OR REQUIRED BY APPLICABLE LAW, THE WORK IS LICENSED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES REGARDING THE CONTENTS OR ACCURACY OF THE WORK. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, AND EXCEPT FOR DAMAGES ARISING FROM LIABILITY TO A THIRD PARTY RESULTING FROM BREACH OF THE WARRANTIES IN SECTION 5, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + c. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + d. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-NC-ND-2.0 b/options/license/CC-BY-NC-ND-2.0 new file mode 100644 index 0000000..29c2701 --- /dev/null +++ b/options/license/CC-BY-NC-ND-2.0 @@ -0,0 +1,77 @@ +Creative Commons Attribution-NonCommercial-NoDerivs 2.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Derivative Works. All rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Sections 4(d) and 4(e). + +4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. + + b. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + + c. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; and to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + + d. For the avoidance of doubt, where the Work is a musical composition: + + i. Performancf Royalties Under Blanket Licenses. Licensor reserves the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work if that performance is primarily intended for or directed toward commercial advantage or private monetary compensation. + + ii. Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions), if Your distribution of such cover version is primarily intended for or directed toward commercial advantage or private monetary compensation. + + e. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + c. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + d. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-NC-ND-3.0 b/options/license/CC-BY-NC-ND-3.0 new file mode 100644 index 0000000..1af8856 --- /dev/null +++ b/options/license/CC-BY-NC-ND-3.0 @@ -0,0 +1,89 @@ +Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + + b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + + c. "Distribute" means to make available to the public the original and copies of the Work through sale or other transfer of ownership. + + d. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + + e. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + + f. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + + g. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + + h. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + + i. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; and, + + b. to Distribute and Publicly Perform the Work including as incorporated in Collections. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Adaptations. Subject to 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d). + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. + + b. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + + c. If You Distribute, or Publicly Perform the Work or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Collection, at a minimum such credit will appear, if a credit for all contributing authors of Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + d. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + + ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, + + iii. Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b). + + e. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + c. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + d. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + + e. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. + +Creative Commons Notice + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-NC-ND-4.0 b/options/license/CC-BY-NC-ND-4.0 new file mode 100644 index 0000000..f1107b0 --- /dev/null +++ b/options/license/CC-BY-NC-ND-4.0 @@ -0,0 +1,153 @@ +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International + +<> Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. <> + +Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + c. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + d. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + e. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + f. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + g. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + h. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. + + i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and + + B. produce and reproduce, but not Share, Adapted Material for NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material, You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. For the avoidance of doubt, You do not have permission under this Public License to Share Adapted Material. + + 3. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 4. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only and provided You do not Share Adapted Material; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.

Creative Commons may be contacted at creativecommons.org. \ No newline at end of file diff --git a/options/license/CC-BY-NC-SA-1.0 b/options/license/CC-BY-NC-SA-1.0 new file mode 100644 index 0000000..7905c96 --- /dev/null +++ b/options/license/CC-BY-NC-SA-1.0 @@ -0,0 +1,83 @@ +Creative Commons Attribution-NonCommercial-ShareAlike 1.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DRAFT LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to create and reproduce Derivative Works; + + c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + + d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested. + + b. You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License. + + c. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + + d. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + + a. By offering the Work for public release under this License, Licensor represents and warrants that, to the best of Licensor's knowledge after reasonable inquiry: + + i. Licensor has secured all rights in the Work necessary to grant the license rights hereunder and to permit the lawful exercise of the rights granted hereunder without You having any obligation to pay any royalties, compulsory license fees, residuals or any other payments; + + ii. The Work does not infringe the copyright, trademark, publicity rights, common law rights or any other right of any third party or constitute defamation, invasion of privacy or other tortious injury to any third party. + + b. EXCEPT AS EXPRESSLY STATED IN THIS LICENSE OR OTHERWISE AGREED IN WRITING OR REQUIRED BY APPLICABLE LAW, THE WORK IS LICENSED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES REGARDING THE CONTENTS OR ACCURACY OF THE WORK. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, AND EXCEPT FOR DAMAGES ARISING FROM LIABILITY TO A THIRD PARTY RESULTING FROM BREACH OF THE WARRANTIES IN SECTION 5, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-NC-SA-2.0 b/options/license/CC-BY-NC-SA-2.0 new file mode 100644 index 0000000..82d806f --- /dev/null +++ b/options/license/CC-BY-NC-SA-2.0 @@ -0,0 +1,87 @@ +Creative Commons Attribution-NonCommercial-ShareAlike 2.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + + g. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to create and reproduce Derivative Works; + + c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + + d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Sections 4(e) and 4(f). + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested. + + b. You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-NonCommercial-ShareAlike 2.0 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License. + + c. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works. + + d. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + + e. For the avoidance of doubt, where the Work is a musical composition: + + i. Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work if that performance is primarily intended for or directed toward commercial advantage or private monetary compensation. + + ii. Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions), if Your distribution of such cover version is primarily intended for or directed toward commercial advantage or private monetary compensation. + + f. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-NC-SA-3.0 b/options/license/CC-BY-NC-SA-3.0 new file mode 100644 index 0000000..ac9b2be --- /dev/null +++ b/options/license/CC-BY-NC-SA-3.0 @@ -0,0 +1,99 @@ +Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + + b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(g) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + + c. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + + d. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike. + + e. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + + f. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + + g. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + + h. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + + i. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + + j. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + + b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + + c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + + d. to Distribute and Publicly Perform Adaptations. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights described in Section 4(e). + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(d), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(d), as requested. + + b. You may Distribute or Publicly Perform an Adaptation only under: (i) the terms of this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-NonCommercial-ShareAlike 3.0 US) ("Applicable License"). You must include a copy of, or the URI, for Applicable License with every copy of each Adaptation You Distribute or Publicly Perform. You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License. You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License. + + c. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in con-nection with the exchange of copyrighted works. + + d. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, (iv) consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(d) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + + ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, + + iii. Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c). + + f. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING AND TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THIS EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + + f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. + +Creative Commons Notice + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-NC-SA-4.0 b/options/license/CC-BY-NC-SA-4.0 new file mode 100644 index 0000000..60454c8 --- /dev/null +++ b/options/license/CC-BY-NC-SA-4.0 @@ -0,0 +1,168 @@ +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International + +<> Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. <> + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + k. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. + + l. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and + + B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + + C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified form), You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + + b. ShareAlike.In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + + 1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.

Creative Commons may be contacted at creativecommons.org. diff --git a/options/license/CC-BY-ND-1.0 b/options/license/CC-BY-ND-1.0 new file mode 100644 index 0000000..2f350e3 --- /dev/null +++ b/options/license/CC-BY-ND-1.0 @@ -0,0 +1,73 @@ +Creative Commons Attribution-NoDerivs 1.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DRAFT LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. + + b. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied. Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + + a. By offering the Work for public release under this License, Licensor represents and warrants that, to the best of Licensor's knowledge after reasonable inquiry: + + i. Licensor has secured all rights in the Work necessary to grant the license rights hereunder and to permit the lawful exercise of the rights granted hereunder without You having any obligation to pay any royalties, compulsory license fees, residuals or any other payments; + + ii. The Work does not infringe the copyright, trademark, publicity rights, common law rights or any other right of any third party or constitute defamation, invasion of privacy or other tortious injury to any third party. + + b. EXCEPT AS EXPRESSLY STATED IN THIS LICENSE OR OTHERWISE AGREED IN WRITING OR REQUIRED BY APPLICABLE LAW, THE WORK IS LICENSED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES REGARDING THE CONTENTS OR ACCURACY OF THE WORK. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, AND EXCEPT FOR DAMAGES ARISING FROM LIABILITY TO A THIRD PARTY RESULTING FROM BREACH OF THE WARRANTIES IN SECTION 5, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + c. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + d. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-ND-2.0 b/options/license/CC-BY-ND-2.0 new file mode 100644 index 0000000..06e6e13 --- /dev/null +++ b/options/license/CC-BY-ND-2.0 @@ -0,0 +1,75 @@ +Creative Commons Attribution-NoDerivs 2.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works. + + c. For the avoidance of doubt, where the work is a musical composition: + + i. Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work. + + ii. Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights society or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions). + + d. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions). + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Derivative Works. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. + + b. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; and to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + c. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. + + d. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-ND-3.0 b/options/license/CC-BY-ND-3.0 new file mode 100644 index 0000000..47c9ada --- /dev/null +++ b/options/license/CC-BY-ND-3.0 @@ -0,0 +1,87 @@ +Creative Commons Attribution-NoDerivs 3.0 Unported + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + + b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + + c. "Distribute" means to make available to the public the original and copies of the Work through sale or other transfer of ownership. + + d. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + + e. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + + f. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + + g. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + + h. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + + i. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; and, + + b. to Distribute and Publicly Perform the Work including as incorporated in Collections. + + c. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + + ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + + iii. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Adaptations. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. + + b. If You Distribute, or Publicly Perform the Work or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. The credit required by this Section 4(b) may be implemented in any reasonable manner; provided, however, that in the case of a Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + c. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + c. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + d. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + + e. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. + +Creative Commons Notice + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-ND-4.0 b/options/license/CC-BY-ND-4.0 new file mode 100644 index 0000000..efbd8b6 --- /dev/null +++ b/options/license/CC-BY-ND-4.0 @@ -0,0 +1,152 @@ +Creative Commons Attribution-NoDerivatives 4.0 International + +<> Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. <> + +Creative Commons Attribution-NoDerivatives 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NoDerivatives 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + c. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + d. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + e. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + f. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + g. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + h. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + i. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + j. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce and reproduce, but not Share, Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material, You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. For the avoidance of doubt, You do not have permission under this Public License to Share Adapted Material. + + 3. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 4. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database, provided You do not Share Adapted Material; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.

Creative Commons may be contacted at creativecommons.org. diff --git a/options/license/CC-BY-SA-1.0 b/options/license/CC-BY-SA-1.0 new file mode 100644 index 0000000..7ce6c5a --- /dev/null +++ b/options/license/CC-BY-SA-1.0 @@ -0,0 +1,81 @@ +Creative Commons Attribution-ShareAlike 1.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DRAFT LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to create and reproduce Derivative Works; + + c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + + d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works; + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested. + + b. You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License. + + c. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + + a. By offering the Work for public release under this License, Licensor represents and warrants that, to the best of Licensor's knowledge after reasonable inquiry: + + i. Licensor has secured all rights in the Work necessary to grant the license rights hereunder and to permit the lawful exercise of the rights granted hereunder without You having any obligation to pay any royalties, compulsory license fees, residuals or any other payments; + + ii. The Work does not infringe the copyright, trademark, publicity rights, common law rights or any other right of any third party or constitute defamation, invasion of privacy or other tortious injury to any third party. + + b. EXCEPT AS EXPRESSLY STATED IN THIS LICENSE OR OTHERWISE AGREED IN WRITING OR REQUIRED BY APPLICABLE LAW, THE WORK IS LICENSED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES REGARDING THE CONTENTS OR ACCURACY OF THE WORK. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, AND EXCEPT FOR DAMAGES ARISING FROM LIABILITY TO A THIRD PARTY RESULTING FROM BREACH OF THE WARRANTIES IN SECTION 5, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-SA-2.0 b/options/license/CC-BY-SA-2.0 new file mode 100644 index 0000000..fc4b6b2 --- /dev/null +++ b/options/license/CC-BY-SA-2.0 @@ -0,0 +1,85 @@ +Creative Commons Attribution-ShareAlike 2.0 + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License. + + b. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License. + + c. "Licensor" means the individual or entity that offers the Work under the terms of this License. + + d. "Original Author" means the individual or entity who created the Work. + + e. "Work" means the copyrightable work of authorship offered under the terms of this License. + + f. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + + g. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike. + +2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works; + + b. to create and reproduce Derivative Works; + + c. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works; + + d. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works. + + e. For the avoidance of doubt, where the work is a musical composition: + + i. Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work. + + ii. Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights society or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions). + + f. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions). + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested. + + b. You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-ShareAlike 2.0 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License. + + c. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-SA-3.0 b/options/license/CC-BY-SA-3.0 new file mode 100644 index 0000000..50bffd5 --- /dev/null +++ b/options/license/CC-BY-SA-3.0 @@ -0,0 +1,99 @@ +Creative Commons Attribution-ShareAlike 3.0 Unported + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. <> + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + + b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined below) for the purposes of this License. + + c. "Creative Commons Compatible License" means a license that is listed at http://creativecommons.org/compatiblelicenses that has been approved by Creative Commons as being essentially equivalent to this License, including, at a minimum, because that license: (i) contains terms that have the same purpose, meaning and effect as the License Elements of this License; and, (ii) explicitly permits the relicensing of adaptations of works made available under that license under this License or a Creative Commons jurisdiction license with the same License Elements as this License. + + d. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + + e. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike. + + f. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + + g. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + + h. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + + i. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + + j. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + + k. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + + b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + + c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + + d. to Distribute and Publicly Perform Adaptations. + + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + + ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + + iii. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested. + + b. You may Distribute or Publicly Perform an Adaptation only under the terms of: (i) this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible License. If you license the Adaptation under one of the licenses mentioned in (iv), you must comply with the terms of that license. If you license the Adaptation under the terms of any of the licenses mentioned in (i), (ii) or (iii) (the "Applicable License"), you must comply with the terms of the Applicable License generally and the following provisions: (I) You must include a copy of, or the URI for, the Applicable License with every copy of each Adaptation You Distribute or Publicly Perform; (II) You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License; (III) You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License. + + c. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Ssection 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + d. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + + f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. + +Creative Commons Notice + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of the License. + +Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/options/license/CC-BY-SA-4.0 b/options/license/CC-BY-SA-4.0 new file mode 100644 index 0000000..1d09048 --- /dev/null +++ b/options/license/CC-BY-SA-4.0 @@ -0,0 +1,168 @@ +Creative Commons Attribution-ShareAlike 4.0 International + +<> Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. + +Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. <> + +Creative Commons Attribution-ShareAlike 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. + + a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. + + e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. + + i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. + + k. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: + + A. reproduce and Share the Licensed Material, in whole or in part; and + + B. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. + + 3. Term. The term of this Public License is specified in Section 6(a). + + 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. + + 5. Downstream recipients. + + A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. + + B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. + + C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. + + 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this Public License. + + 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified form), You must: + + A. retain the following if it is supplied by the Licensor with the Licensed Material: + + i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of warranties; + + v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; + + B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and + + C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. + + 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. + + b. ShareAlike.In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. + + 1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; + + b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. + +Section 5 – Disclaimer of Warranties and Limitation of Liability. + + a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. + + b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. + + c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. + + a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or + + 2. upon express reinstatement by the Licensor. + + c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. + + d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. + + e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. + + a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. + + c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. + + d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.

Creative Commons may be contacted at creativecommons.org. diff --git a/options/license/Creative Commons CC0 1.0 Universal b/options/license/CC0-1.0 similarity index 62% rename from options/license/Creative Commons CC0 1.0 Universal rename to options/license/CC0-1.0 index af03882..ec1dd6d 100644 --- a/options/license/Creative Commons CC0 1.0 Universal +++ b/options/license/CC0-1.0 @@ -1,5 +1,7 @@ Creative Commons CC0 1.0 Universal -CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. + +<> CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. <> + Statement of Purpose The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). @@ -10,19 +12,19 @@ For these and/or other purposes and motivations, and without any expectation of 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: -i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; + i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; -ii. moral rights retained by the original author(s) and/or performer(s); + ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; + iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; -iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; + iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; -v. rights protecting the extraction, dissemination, use and reuse of data in a Work; + v. rights protecting the extraction, dissemination, use and reuse of data in a Work; -vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and + vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and -vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. + vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. @@ -30,10 +32,10 @@ vii. other similar, equivalent or corresponding rights throughout the world base 4. Limitations and Disclaimers. -a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. + a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. -b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. + b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. -c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. + c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. -d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. + d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. \ No newline at end of file diff --git a/options/license/CDDL-1.0 b/options/license/CDDL-1.0 new file mode 100644 index 0000000..6d85329 --- /dev/null +++ b/options/license/CDDL-1.0 @@ -0,0 +1,119 @@ +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) +Version 1.0 + +1. Definitions. + +1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications. + +1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. + +1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. + +1.4. “Executable” means the Covered Software in any form other than Source Code. + +1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License. + +1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. + +1.7. “License” means this document. + +1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + +1.9. “Modifications” means the Source Code and Executable form of any of the following: + + A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; + + B. Any new file that contains any part of the Original Software or previous Modification; or + + C. Any new file that is contributed or otherwise made available under the terms of this License. + +1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License. + +1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + +1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. + +1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants. + +2.1. The Initial Developer Grant. +Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. + +2.2. Contributor Grant. +Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + +3.1. Availability of Source Code. +Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. + +3.2. Modifications. +The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. + +3.3. Required Notices. +You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. + +3.4. Application of Additional Terms. +You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients’ rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + +3.5. Distribution of Executable Versions. +You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient’s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + +3.6. Larger Works. +You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. + +4. Versions of the License. + +4.1. New Versions. +Sun Microsystems, Inc. is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. + +4.2. Effect of New Versions. +You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. + +4.3. Modified Versions. +When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. + +5. DISCLAIMER OF WARRANTY. + +COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + +6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. + +6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + +The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. + +9. MISCELLANEOUS. + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction’s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. \ No newline at end of file diff --git a/options/license/CDDL-1.1 b/options/license/CDDL-1.1 new file mode 100644 index 0000000..c718f33 --- /dev/null +++ b/options/license/CDDL-1.1 @@ -0,0 +1,123 @@ +COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) +Version 1.1 + +1. Definitions. + +1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications. + +1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. + +1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. + +1.4. “Executable” means the Covered Software in any form other than Source Code. + +1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License. + +1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. + +1.7. “License” means this document. + +1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + +1.9. “Modifications” means the Source Code and Executable form of any of the following: + + A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; + + B. Any new file that contains any part of the Original Software or previous Modification; or + + C. Any new file that is contributed or otherwise made available under the terms of this License. + +1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License. + +1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + +1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. + +1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants. + +2.1. The Initial Developer Grant. +Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, the Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer, to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof), with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). + + (c) The licenses granted in Sections 2.1(a) and (b) are effective on the date Initial Developer first distributes or otherwise makes the Original Software available to a third party under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: (1) for code that You delete from the Original Software, or (2) for infringements caused by: (i) the modification of the Original Software, or (ii) the combination of the Original Software with other software or devices. + +2.2. Contributor Grant. +Conditioned upon Your compliance with Section 3.1 below and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof), either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (1) Modifications made by that Contributor (or portions thereof); and (2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first distributes or otherwise makes the Modifications available to a third party. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: (1) for any code that Contributor has deleted from the Contributor Version; (2) for infringements caused by: (i) third party modifications of Contributor Version, or (ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or (3) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + +3.1. Availability of Source Code. +Any Covered Software that You distribute or otherwise make available in Executable form must also be made available in Source Code form and that Source Code form must be distributed only under the terms of this License. You must include a copy of this License with every copy of the Source Code form of the Covered Software You distribute or otherwise make available. You must inform recipients of any such Covered Software in Executable form as to how they can obtain such Covered Software in Source Code form in a reasonable manner on or through a medium customarily used for software exchange. + +3.2. Modifications. +The Modifications that You create or to which You contribute are governed by the terms of this License. You represent that You believe Your Modifications are Your original creation(s) and/or You have sufficient rights to grant the rights conveyed by this License. + +3.3. Required Notices. +You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. + +3.4. Application of Additional Terms. +You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients' rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + +3.5. Distribution of Executable Versions. +You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient's rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + +3.6. Larger Works. +You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. + +4. Versions of the License. + +4.1. New Versions. +Oracle is the initial license steward and may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Except as provided in Section 4.3, no one other than the license steward has the right to modify this License. + +4.2. Effect of New Versions. +You may always continue to use, distribute or otherwise make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. If the Initial Developer includes a notice in the Original Software prohibiting it from being distributed or otherwise made available under any subsequent version of the License, You must distribute and make the Covered Software available under the terms of the version of the License under which You originally received the Covered Software. Otherwise, You may also choose to use, distribute or otherwise make the Covered Software available under the terms of any subsequent version of the License published by the license steward. + +4.3. Modified Versions. +When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. + +5. DISCLAIMER OF WARRANTY. +COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +6. TERMINATION. + +6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. + +6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + +6.4. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. + +7. LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8. U.S. GOVERNMENT END USERS. + +The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. + +9. MISCELLANEOUS. + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction's conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. + +10. RESPONSIBILITY FOR CLAIMS. + +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) +The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. diff --git a/options/license/CECILL-1.0 b/options/license/CECILL-1.0 new file mode 100644 index 0000000..18d9db3 --- /dev/null +++ b/options/license/CECILL-1.0 @@ -0,0 +1,216 @@ +CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL + +Avertissement + +Ce contrat est une licence de logiciel libre issue d’une concertation entre ses auteurs afin que le respect de deux grands principes préside à sa rédaction: + • d’une part, sa conformité au droit français, tant au regard du droit de la responsabilité civile que du droit de la propriété intellectuelle et de la protection qu’il offre aux auteurs et titulaires des droits patrimoniaux sur un logiciel. + • d’autre part, le respect des principes de diffusion des logiciels libres: accès au code source, droits étendus conférés aux utilisateurs. + +Les auteurs de la licence CeCILL1 sont: + +Commissariat à l’Energie Atomique – CEA, établissement public de caractère scientifique technique et industriel, dont le siège est situé 31-33 rue de la Fédération, 75752 PARIS cedex 15. + +Centre National de la Recherche Scientifique – CNRS, établissement public à caractère scientifique et technologique, dont le siège est situé 3 rue Michel-Ange 75794 Paris cedex 16. + +Institut National de Recherche en Informatique et en Automatique – INRIA, établissement public à caractère scientifique et technologique, dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. + +PREAMBULE + +Ce contrat est une licence de logiciel libre dont l'objectif est de conférer aux utilisateurs la liberté de modification et de redistribution du logiciel régi par cette licence dans le cadre d'un modèle de diffusion «open source». + +L'exercice de ces libertés est assorti de certains devoirs à la charge des utilisateurs afin de préserver ce statut au cours des redistributions ultérieures. + +L’accessibilité au code source et les droits de copie, de modification et de redistribution qui en découlent ont pour contrepartie de n’offrir aux utilisateurs qu’une garantie limitée et de ne faire peser sur l’auteur du logiciel, le titulaire des droits patrimoniaux et les concédants successifs qu’une responsabilité restreinte. + +A cet égard l’attention de l’utilisateur est attirée sur les risques associés au chargement, à l’utilisation, à la modification et/ou au développement et à la reproduction du logiciel par l’utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à manipuler et qui le réserve donc à des développeurs et des professionnels avertis possédant des connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester l’adéquation du Logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de leurs systèmes et ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les même conditions de sécurité. Ce contrat peut être reproduit et diffusé librement, sous réserve de le conserver en l’état, sans ajout ni suppression de clauses. + +Ce contrat est susceptible de s’appliquer à tout logiciel dont le titulaire des droits patrimoniaux décide de soumettre l’exploitation aux dispositions qu’il contient. + +Article 1er - DEFINITIONS + +Dans ce contrat, les termes suivants, lorsqu’ils seront écrits avec une lettre capitale, auront la signification suivante: + +Contrat: désigne le présent contrat de licence, ses éventuelles versions postérieures et annexes. + +Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code Source et le cas échéant sa documentation, dans leur état au moment de l’acceptation du +Contrat par le Licencié. + +Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et de Code Objet et le cas échéant sa documentation, dans leur état au moment de leur première diffusion sous les termes du Contrat. + +Logiciel Modifié: désigne le Logiciel modifié par au moins une Contribution. + +Code Source: désigne l’ensemble des instructions et des lignes de programme du Logiciel et auquel l’accès est nécessaire en vue de modifier le Logiciel. + +Code Objet: désigne les fichiers binaires issus de la compilation du Code Source. + +Titulaire : désigne le détenteur des droits patrimoniaux d’auteur sur le Logiciel Initial. + +Licencié(s): désigne le ou les utilisateur(s) du Logiciel ayant accepté le Contrat. + +Contributeur: désigne le Licencié auteur d’au moins une Contribution. + +Concédant: désigne le Titulaire ou toute personne physique ou morale distribuant le Logiciel sous le Contrat. + +Contributions: désigne l’ensemble des modifications, corrections, traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans le Logiciel par tout + +Contributeur, ainsi que les Modules Statiques. + +Module: désigne un ensemble de fichiers sources y compris leur documentation qui, une fois compilé sous forme exécutable, permet de réaliser des fonctionnalités ou +services supplémentaires à ceux fournis par le Logiciel. + +Module Dynamique: désigne tout Module, créé par le Contributeur, indépendant du Logiciel, tel que ce Module et le Logiciel sont sous forme de deux exécutables indépendants qui s’exécutent dans un espace d’adressage indépendant, l’un appelant l’autre au moment de leur exécution. + +Module Statique: désigne tout Module créé par le Contributeur et lié au Logiciel par un lien statique rendant leur code objet dépendant l'un de l'autre. Ce Module et le Logiciel auquel il est lié, sont regroupés en un seul exécutable. + +Parties: désigne collectivement le Licencié et le Concédant. + +Ces termes s’entendent au singulier comme au pluriel. + +Article 2 - OBJET + +Le Contrat a pour objet la concession par le Concédant au Licencié d’une Licence non exclusive, transférable et mondiale du Logiciel telle que définie ci-après à l'article 5 pour toute la durée de protection des droits portant sur ce Logiciel. + +Article 3 - ACCEPTATION + +3.1. L’acceptation par le Licencié des termes du Contrat est réputée acquise du fait du premier des faits suivants: + • (i) le chargement du Logiciel par tout moyen notamment par téléchargement à partir d’un serveur distant ou par chargement à partir d’un support physique; + • (ii) le premier exercice par le Licencié de l’un quelconque des droits concédés par le Contrat. + +3.2. Un exemplaire du Contrat, contenant notamment un avertissement relatif aux spécificités du Logiciel, à la restriction de garantie et à la limitation à un usage par des utilisateurs expérimentés a été mis à disposition du Licencié préalablement à son acceptation telle que définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris connaissances. + +Article 4 - ENTREE EN VIGUEUR ET DUREE + +4.1.ENTREE EN VIGUEUR + +Le Contrat entre en vigueur à la date de son acceptation par le Licencié telle que définie en 3.1. + +4.2. DUREE + +Le Contrat produira ses effets pendant toute la durée légale de protection des droits patrimoniaux portant sur le Logiciel. + +Article 5 - ETENDUE DES DROITS CONCEDES + +Le Concédant concède au Licencié, qui accepte, les droits suivants sur le Logiciel pour toutes destinations et pour la durée du Contrat dans les conditions ci-après détaillées. + +Par ailleurs, le Concédant concède au Licencié à titre gracieux les droits d’exploitation du ou des brevets qu’il détient sur tout ou partie des inventions +implémentées dans le Logiciel. + +5.1. DROITS D’UTILISATION + +Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant aux domaines d’application, étant ci-après précisé que cela comporte: + 1. la reproduction permanente ou provisoire du Logiciel en tout ou partie par tout moyen et sous toute forme. + 2. le chargement, l’affichage, l’exécution, ou le stockage du Logiciel sur tout support. + 3. la possibilité d’en observer, d’en étudier, ou d’en tester le fonctionnement afin de déterminer les idées et principes qui sont à la base de n’importe quel élément de ce Logiciel; et ceci, lorsque le Licencié effectue toute opération de chargement, d’affichage, d’exécution, de transmission ou de stockage du Logiciel qu’il est en droit d’effectuer en vertu du Contrat. + +5.2. DROIT D’APPORTER DES CONTRIBUTIONS + +Le droit d’apporter des Contributions comporte le droit de traduire, d’adapter, d’arranger ou d’apporter toute autre modification du Logiciel et le droit de reproduire le Logiciel en résultant. + +Le Licencié est autorisé à apporter toute Contribution au Logiciel sous réserve de mentionner, de façon explicite, son nom en tant qu’auteur de cette Contribution et la date de création de celle-ci. + +5.3. DROITS DE DISTRIBUTION ET DE DIFFUSION + +Le droit de distribution et de diffusion comporte notamment le droit de transmettre et de communiquer le Logiciel au public sur tout support et par tout moyen ainsi que le droit de mettre sur le marché à titre onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. + +Le Licencié est autorisé à redistribuer des copies du Logiciel, modifié ou non, à des tiers dans les conditions ci-après détaillées. + +5.3.1. REDISTRIBUTION DU LOGICIEL SANS MODIFICATION +Le Licencié est autorisé à redistribuer des copies conformes du Logiciel, sous forme de Code Source ou de Code Objet, à condition que cette redistribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: + 1. d’un exemplaire du Contrat, + 2. d’un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, +et que, dans le cas où seul le Code Objet du Logiciel est redistribué, le Licencié permette aux futurs Licenciés d’accéder facilement au Code Source complet du Logiciel en indiquant les modalités d’accès, étant entendu que le coût additionnel d’acquisition du Code Source ne devra pas excéder le simple coût de transfert des données. + +5.3.2. REDISTRIBUTION DU LOGICIEL MODIFIE +Lorsque le Licencié apporte une Contribution au Logiciel, les conditions de redistribution du Logiciel Modifié sont alors soumises à l’intégralité des dispositions du Contrat. +Le Licencié est autorisé à redistribuer le Logiciel Modifié, sous forme de Code Source ou de Code Objet, à condition que cette redistribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: + 1. d’un exemplaire du Contrat, + 2. d’un avertissement relatif à la restriction de garantie et de responsabilité du concédant telle que prévue aux articles 8 et 9, +et que, dans le cas où seul le Code Objet du Logiciel Modifié est redistribué, le Licencié permette aux futurs Licenciés d’accéder facilement au Code Source complet du Logiciel Modifié en indiquant les modalités d’accès, étant entendu que le coût additionnel d’acquisition du Code Source ne devra pas excéder le simple coût de transfert des données. + +5.3.3. REDISTRIBUTION DES MODULES DYNAMIQUES +Lorsque le Licencié a développé un Module Dynamique les conditions du Contrat ne s’appliquent pas à ce Module Dynamique, qui peut être distribué sous un contrat de licence différent. + +5.3.4. COMPATIBILITE AVEC LA LICENCE GPL +Dans le cas où le Logiciel, Modifié ou non, est intégré à un code soumis aux dispositions de la licence GPL, le Licencié est autorisé à redistribuer l’ensemble sous la licence GPL. +Dans le cas où le Logiciel Modifié intègre un code soumis aux dispositions de la licence GPL, le Licencié est autorisé à redistribuer le Logiciel Modifié sous la licence GPL. + +Article 6 - PROPRIETE INTELLECTUELLE + +6.1. SUR LE LOGICIEL INITIAL +Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel Initial. Toute utilisation du Logiciel Initial est soumise au respect des conditions dans lesquelles le Titulaire a choisi de diffuser son œuvre et nul autre n’a la faculté de modifier les conditions de diffusion de ce Logiciel Initial. +Le Titulaire s'engage à maintenir la diffusion du Logiciel initial sous les conditions du Contrat et ce, pour la durée visée à l'article 4.2. + +6.2. SUR LES CONTRIBUTIONS +Les droits de propriété intellectuelle sur les Contributions sont attachés au titulaire de droits patrimoniaux désigné par la législation applicable. + +6.3. SUR LES MODULES DYNAMIQUES +Le Licencié ayant développé un Module Dynamique est titulaire des droits de propriété intellectuelle sur ce Module Dynamique et reste libre du choix du contrat régissant sa diffusion. + +6.4. DISPOSITIONS COMMUNES + +6.4.1. Le Licencié s’engage expressément: + 1. à ne pas supprimer ou modifier de quelque manière que ce soit les mentions de propriété intellectuelle apposées sur le Logiciel; + 2. à reproduire à l’identique lesdites mentions de propriété intellectuelle sur les copies du Logiciel. +6.4.2. Le Licencié s’engage à ne pas porter atteinte, directement ou indirectement, aux droits de propriété intellectuelle du Titulaire et/ou des Contributeurs et à prendre, le cas échéant, à l’égard de son personnel toutes les mesures nécessaires pour assurer le respect des dits droits de propriété intellectuelle du Titulaire et/ou des Contributeurs. + +Article 7 - SERVICES ASSOCIES + +7.1. Le Contrat n’oblige en aucun cas le Concédant à la réalisation de prestations d’assistance technique ou de maintenance du Logiciel. +Cependant le Concédant reste libre de proposer ce type de services. Les termes et conditions d’une telle assistance technique et/ou d’une telle maintenance seront alors déterminés dans un acte séparé. Ces actes de maintenance et/ou assistance technique n’engageront que la seule responsabilité du Concédant qui les propose. + +7.2. De même, tout Concédant est libre de proposer, sous sa seule responsabilité, à ses licenciés une garantie, qui n’engagera que lui, lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, dans les conditions qu’il souhaite. Cette garantie et les modalités financières de son application feront l’objet d’un acte séparé entre le Concédant et le Licencié. + +Article 8 - RESPONSABILITE + +8.1. Sous réserve des dispositions de l’article 8.2, si le Concédant n’exécute pas tout ou partie des obligations mises à sa charge par le Contrat, le Licencié a la faculté, sous réserve de prouver la faute du Concédant concerné, de solliciter la réparation du préjudice direct qu’il subit et dont il apportera la preuve. + +8.2. La responsabilité du Concédant est limitée aux engagements pris en application du Contrat et ne saurait être engagée en raison notamment:(i) des dommages dus à l’inexécution, totale ou partielle, de ses obligations par le Licencié, (ii) des dommages directs ou indirects découlant de l’utilisation ou des performances du Logiciel subis par le Licencié lorsqu’il s’agit d’un professionnel utilisant le Logiciel à des fins professionnelles et (iii) des dommages indirects découlant de l’utilisation ou des performances du Logiciel. Les Parties conviennent expressément que tout préjudice financier ou commercial (par exemple perte de données, perte de bénéfices, perte d’exploitation, perte de clientèle ou de commandes, manque à gagner, trouble commercial quelconque) ou toute action dirigée contre le Licencié par un tiers, constitue un dommage indirect et n’ouvre pas droit à réparation par le Concédant. + +Article 9 - GARANTIE + +9.1. Le Licencié reconnaît que l’état actuel des connaissances scientifiques et techniques au moment de la mise en circulation du Logiciel ne permet pas d’en tester et d’en vérifier toutes les utilisations ni de détecter l’existence d’éventuels défauts. L’attention du Licencié a été attirée sur ce point sur les risques associés au chargement, à l’utilisation, la modification et/ou au développement et à la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. +Il relève de la responsabilité du Licencié de contrôler, par tous moyens, l’adéquation du produit à ses besoins, son bon fonctionnement et de s'assurer qu’il ne causera pas de dommages aux personnes et aux biens. + +9.2. Le Concédant déclare de bonne foi être en droit de concéder l'ensemble des droits attachés au Logiciel (comprenant notamment les droits visés à l'article 5). + +9.3. Le Licencié reconnaît que le Logiciel est fourni «en l'état» par le Concédant sans autre garantie, expresse ou tacite, que celle prévue à l’article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, son caractère sécurisé, innovant ou pertinent. +En particulier, le Concédant ne garantit pas que le Logiciel est exempt d'erreur, qu’il fonctionnera sans interruption, qu’il sera compatible avec l’équipement du Licencié et sa configuration logicielle ni qu’il remplira les besoins du Licencié. + +9.4. Le Concédant ne garantit pas, de manière expresse ou tacite, que le Logiciel ne porte pas atteinte à un quelconque droit de propriété intellectuelle d’un tiers portant sur un brevet, un logiciel ou sur tout autre droit de propriété. Ainsi, le Concédant exclut toute garantie au profit du Licencié contre les actions en contrefaçon qui pourraient être diligentées au titre de l’utilisation, de la modification, et de la redistribution du Logiciel. Néanmoins, si de telles actions sont exercées contre le Licencié, le Concédant lui apportera son aide technique et juridique pour sa défense. Cette aide technique et juridique est déterminée au cas par cas entre le Concédant concerné et le Licencié dans le cadre d’un protocole d’accord. Le Concédant dégage toute responsabilité quant à l’utilisation de la dénomination du Logiciel par le Licencié. Aucune garantie n’est apportée quant à l’existence de droits antérieurs sur le nom du Logiciel et sur l’existence d’une marque. + +Article 10 - RESILIATION + +10.1. En cas de manquement par le Licencié aux obligations mises à sa charge par le Contrat, le Concédant pourra résilier de plein droit le Contrat trente (30) jours après notification adressée au Licencié et restée sans effet. +10.2. Le Licencié dont le Contrat est résilié n’est plus autorisé à utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les licences qu’il aura concédées antérieurement à la résiliation du Contrat resteront valides sous réserve qu’elles aient été effectuées en conformité avec le Contrat. + +Article 11 - DISPOSITIONS DIVERSES + +11.1. CAUSE EXTERIEURE +Aucune des Parties ne sera responsable d’un retard ou d’une défaillance d’exécution du Contrat qui serait dû à un cas de force majeure, un cas fortuit ou une cause extérieure, telle que, notamment, le mauvais fonctionnement ou les interruptions du réseau électrique ou de télécommunication, la paralysie du réseau liée à une attaque informatique, l’intervention des autorités gouvernementales, les catastrophes naturelles, les dégâts des eaux, les tremblements de terre, le feu, les explosions, les grèves et les conflits sociaux, l’état de guerre… + +11.2. Le fait, par l’une ou l’autre des Parties, d’omettre en une ou plusieurs occasions de se prévaloir d’une ou plusieurs dispositions du Contrat, ne pourra en aucun cas impliquer renonciation par la Partie intéressée à s’en prévaloir ultérieurement. + +11.3. Le Contrat annule et remplace toute convention antérieure, écrite ou orale, entre les Parties sur le même objet et constitue l’accord entier entre les Parties sur cet objet. Aucune addition ou modification aux termes du Contrat n’aura d’effet à l’égard des Parties à moins d’être faite par écrit et signée par leurs représentants dûment habilités. + +11.4. Dans l’hypothèse où une ou plusieurs des dispositions du Contrat s’avèrerait contraire à une loi ou à un texte applicable, existants ou futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les amendements nécessaires pour se conformer à cette loi ou à ce texte. Toutes les autres dispositions resteront en vigueur. De même, la nullité, pour quelque raison que ce soit, d’une des dispositions du Contrat ne saurait entraîner la nullité de l’ensemble du Contrat. + +11.5. LANGUE +Le Contrat est rédigé en langue française et en langue anglaise. En cas de divergence d’interprétation, seule la version française fait foi. + +Article 12 - NOUVELLES VERSIONS DU CONTRAT + +12.1. Toute personne est autorisée à copier et distribuer des copies de ce Contrat. + +12.2. Afin d’en préserver la cohérence, le texte du Contrat est protégé et ne peut être modifié que par les auteurs de la licence, lesquels se réservent le droit de publier périodiquement des mises à jour ou de nouvelles versions du Contrat, qui possèderont chacune un numéro distinct. Ces versions ultérieures seront susceptibles de prendre en compte de nouvelles problématiques rencontrées par les logiciels libres. + +12.3. Tout Logiciel diffusé sous une version donnée du Contrat ne pourra faire l'objet d'une diffusion ultérieure que sous la même version du Contrat ou une version postérieure, sous réserve des dispositions de l'article 5.3.4. + +Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE + +13.1. Le Contrat est régi par la loi française. Les Parties conviennent de tenter de régler à l’amiable les différends ou litiges qui viendraient à se produire par suite ou à l’occasion du Contrat. + +13.2. A défaut d’accord amiable dans un délai de deux (2) mois à compter de leur survenance et sauf situation relevant d’une procédure d’urgence, les différends ou litiges seront portés par la Partie la plus diligente devant les Tribunaux compétents de Paris. + +1 Ce: CEA, C: CNRS, I: INRIA, LL: Logiciel Libre + +Version 1 du 21/06/2004 diff --git a/options/license/CECILL-1.1 b/options/license/CECILL-1.1 new file mode 100644 index 0000000..8dfaeeb --- /dev/null +++ b/options/license/CECILL-1.1 @@ -0,0 +1,229 @@ + FREE SOFTWARE LICENSING AGREEMENT CeCILL + +Notice + +This Agreement is a free software license that is the result of discussions between its authors in order to ensure compliance with the two main principles guiding its drafting: + - firstly, its conformity with French law, both as regards the law of torts and intellectual property law, and the protection that it offers to authors and the holders of economic rights over software. + - secondly, compliance with the principles for the distribution of free software: access to source codes, extended user-rights. + +The following bodies are the authors of this license CeCILL (Ce : CEA, C : CNRS, I : INRIA, LL : Logiciel Libre): + +Commissariat à l'Energie Atomique - CEA, a public scientific, technical and industrial establishment, having its principal place of business at 31-33 rue de la Fédération, 75752 PARIS cedex 15, France. + +Centre National de la Recherche Scientifique - CNRS, a public scientific and technological establishment, having its principal place of business at 3 rue Michel-Ange 75794 Paris cedex 16, France. + +Institut National de Recherche en Informatique et en Automatique - INRIA, a public scientific and technological establishment, having its principal place of business at Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. + +PREAMBLE + +The purpose of this Free Software Licensing Agreement is to grant users the right to modify and redistribute the software governed by this license within the framework of an "open source" distribution model. + +The exercising of these rights is conditional upon certain obligations for users so as to ensure that this status is retained for subsequent redistribution operations. + +As a counterpart to the access to the source code and rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty and the software's author, the holder of the economic rights, and the successive licensors only have limited liability. + +In this respect, it is brought to the user's attention that the risks associated with loading, using, modifying and/or developing or reproducing the software by the user given its nature of Free Software, that may mean that it is complicated to manipulate, and that also therefore means that it is reserved for developers and experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the Software's suitability as regards their requirements in conditions enabling the security of their systems and/or data to be ensured and, more generally, to use and operate it in the same conditions of security. This Agreement may be freely reproduced and published, provided it is not altered, and that no Articles are either added or removed herefrom. + +This Agreement may apply to any or all software for which the holder of the economic rights decides to submit the operation thereof to its provisions. + +Article 1 - DEFINITIONS + +For the purposes of this Agreement, when the following expressions commence with a capital letter, they shall have the following meaning: + +Agreement: means this Licensing Agreement, and any or all of its subsequent versions. + +Software: means the software in its Object Code and/or Source Code form and, where applicable, its documentation, "as is" at the time when the Licensee accepts the Agreement. + +Initial Software: means the Software in its Source Code and/or Object Code form and, where applicable, its documentation, "as is" at the time when it is distributed for the first time under the terms and conditions of the Agreement. + +Modified Software: means the Software modified by at least one Contribution. + +Source Code: means all the Software's instructions and program lines to which access is required so as to modify the Software. + +Object Code: means the binary files originating from the compilation of the Source Code. + +Holder: means the holder of the economic rights over the Initial Software. + +Licensee(s): mean(s) the Software user(s) having accepted the Agreement. + +Contributor: means a Licensee having made at least one Contribution. + +Licensor: means the Holder, or any or all other individual or legal entity, that distributes the Software under the Agreement. + +Contributions: mean any or all modifications, corrections, translations, adaptations and/or new functionalities integrated into the Software by any or all Contributor, and the Static Modules. + +Module: means a set of sources files including their documentation that, once compiled in executable form, enables supplementary functionalities or services to be developed in addition to those offered by the Software. + +Dynamic Module: means any or all module, created by the Contributor, that is independent of the Software, so that this module and the Software are in two different executable forms that are run in separate address spaces, with one calling the other when they are run. + +Static Module: means any or all module, created by the Contributor and connected to the Software by a static link that makes their object codes interdependent. This module and the Software to which it is connected, are combined in a single executable. + +Parties: mean both the Licensee and the Licensor. + +These expressions may be used both in singular and plural form. + +Article 2 - PURPOSE + +The purpose of the Agreement is to enable the Licensor to grant the Licensee a free, non-exclusive, transferable and worldwide License for the Software as set forth in Article 5 hereinafter for the whole term of protection of the rights over said Software. + +Article 3 - ACCEPTANCE + +3.1. The Licensee shall be deemed as having accepted the terms and conditions of this Agreement by the occurrence of the first of the following events: + (i) loading the Software by any or all means, notably, by downloading from a remote server, or by loading from a physical medium; + (ii) the first time the Licensee exercises any of the rights granted hereunder. + +3.2. One copy of the Agreement, containing a notice relating to the specific nature of the Software, to the limited warranty, and to the limitation to use by experienced users has been provided to the Licensee prior to its acceptance as set forth in Article 3.1 hereinabove, and the Licensee hereby acknowledges that it is aware thereof. + +Article 4 - EFFECTIVE DATE AND TERM + +4.1. EFFECTIVE DATE + +The Agreement shall become effective on the date when it is accepted by the Licensee as set forth in Article 3.1. + +4.2. TERM + +The Agreement shall remain in force during the whole legal term of protection of the economic rights over the Software. + +Article 5 - SCOPE OF THE RIGHTS GRANTED --------------------------------------- + +The Licensor hereby grants to the Licensee, that accepts such, the following rights as regards the Software for any or all use, and for the term of the Agreement, on the basis of the terms and conditions set forth hereinafter. + +Otherwise, the Licensor grants to the Licensee free of charge exploitation rights on the patents he holds on whole or part of the inventions implemented in the Software. + +5.1. RIGHTS OF USE + +The Licensee is authorized to use the Software, unrestrictedly, as regards the fields of application, with it being hereinafter specified that this relates to: + 1. permanent or temporary reproduction of all or part of the Software by any or all means and in any or all form. + 2. loading, displaying, running, or storing the Software on any or all medium. + 3. entitlement to observe, study or test the operation thereof so as to establish the ideas and principles that form the basis for any or all constituent elements of said Software. This shall apply when the Licensee carries out any or all loading, displaying, running, transmission or storage operation as regards the Software, that it is entitled to carry out hereunder. + +5.2. entitlement to make CONTRIBUTIONS + +The right to make Contributions includes the right to translate, adapt, arrange, or make any or all modification to the Software, and the right to reproduce the resulting Software. + +The Licensee is authorized to make any or all Contribution to the Software provided that it explicitly mentions its name as the author of said Contribution and the date of the development thereof. + +5.3. DISTRIBUTION AND PUBLICATION RIGHTS + +In particular, the right of distribution and publication includes the right to transmit and communicate the Software to the general public on any or all medium, and by any or all means, and the right to market, either in consideration of a fee, or free of charge, a copy or copies of the Software by means of any or all process. The Licensee is further authorized to redistribute copies of the modified or unmodified Software to third parties according to the terms and conditions set forth hereinafter. + +5.3.1. REDISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION + +The Licensee is authorized to redistribute true copies of the Software in Source Code or Object Code form, provided that said redistribution complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Software's Object Code is redistributed, the Licensee allows future Licensees unhindered access to the Software's full Source Code by providing them with the terms and conditions for access thereto, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. + +5.3.2. REDISTRIBUTION OF MODIFIED SOFTWARE + +When the Licensee makes a Contribution to the Software, the terms and conditions for the redistribution of the Modified Software shall then be subject to all the provisions hereof. + +The Licensee is authorized to redistribute the Modified Software, in Source Code or Object Code form, provided that said redistribution complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + 2. a notice relating to the limitation of both the Licensor's warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Modified Software's Object Code is redistributed, the Licensee allows future Licensees unhindered access to the Modified Software's full Source Code by providing them with the terms and conditions for access thereto, it being understood that the additional cost of acquiring the Source Code shall not exceed the cost of transferring the data. + +5.3.3. redistribution OF DYNAMIC MODULES + +When the Licensee has developed a Dynamic Module, the terms and conditions hereof do not apply to said Dynamic Module, that may be distributed under a separate Licensing Agreement. + +5.3.4. COMPATIBILITY WITH THE GPL LICENSE + +In the event that the Modified or unmodified Software is included in a code that is subject to the provisions of the GPL License, the Licensee is authorized to redistribute the whole under the GPL License. + +In the event that the Modified Software includes a code that is subject to the provisions of the GPL License, the Licensee is authorized to redistribute the Modified Software under the GPL License. + +Article 6 - INTELLECTUAL PROPERTY + +6.1. OVER THE INITIAL SOFTWARE + +The Holder owns the economic rights over the Initial Software. Any or all use of the Initial Software is subject to compliance with the terms and conditions under which the Holder has elected to distribute its work and no one shall be entitled to and it shall have sole entitlement to modify the terms and conditions for the distribution of said Initial Software. + +The Holder undertakes to maintain the distribution of the Initial Software under the conditions of the Agreement, for the duration set forth in article 4.2.. + +6.2. OVER THE CONTRIBUTIONS + +The intellectual property rights over the Contributions belong to the holder of the economic rights as designated by effective legislation. + +6.3. OVER THE DYNAMIC MODULES + +The Licensee having developed a Dynamic Module is the holder of the intellectual property rights over said Dynamic Module and is free to choose the agreement that shall govern its distribution. + +6.4. JOINT PROVISIONS + +6.4.1. The Licensee expressly undertakes: + + 1. not to remove, or modify, in any or all manner, the intellectual property notices affixed to the Software; + 2. to reproduce said notices, in an identical manner, in the copies of the Software. + +6.4.2. The Licensee undertakes not to directly or indirectly infringe the intellectual property rights of the Holder and/or Contributors and to take, where applicable, vis-à-vis its staff, any or all measures required to ensure respect for said intellectual property rights of the Holder and/or Contributors. + +Article 7 - RELATED SERVICES + +7.1. Under no circumstances shall the Agreement oblige the Licensor to provide technical assistance or maintenance services for the Software. + +However, the Licensor is entitled to offer this type of service. The terms and conditions of such technical assistance, and/or such maintenance, shall then be set forth in a separate instrument. Only the Licensor offering said maintenance and/or technical assistance services shall incur liability therefor. + +7.2. Similarly, any or all Licensor shall be entitled to offer to its Licensees, under its own responsibility, a warranty, that shall only be binding upon itself, for the redistribution of the Software and/or the Modified Software, under terms and conditions that it shall decide upon itself. Said warranty, and the financial terms and conditions of its application, shall be subject to a separate instrument executed between the Licensor and the Licensee. + +Article 8 - LIABILITY + +8.1. Subject to the provisions of Article 8.2, should the Licensor fail to fulfill all or part of its obligations hereunder, the Licensee shall be entitled to claim compensation for the direct loss suffered as a result of a fault on the part of the Licensor, subject to providing evidence of it. + +8.2. The Licensor's liability is limited to the commitments made under this Licensing Agreement and shall not be incurred as a result , in particular: (i) of loss due the Licensee's total or partial failure to fulfill its obligations, (ii) direct or consequential loss due to the Software's use or performance that is suffered by the Licensee, when the latter is a professional using said Software for professional purposes and (iii) consequential loss due to the Software's use or performance. The Parties expressly agree that any or all pecuniary or business loss (i.e. loss of data, loss of profits, operating loss, loss of customers or orders, opportunity cost, any disturbance to business activities) or any or all legal proceedings instituted against the Licensee by a third party, shall constitute consequential loss and shall not provide entitlement to any or all compensation from the Licensor. + +Article 9 - WARRANTY + +9.1. The Licensee acknowledges that the current situation as regards scientific and technical know-how at the time when the Software was distributed did not enable all possible uses to be tested and verified, nor for the presence of any or all faults to be detected. In this respect, the Licensee's attention has been drawn to the risks associated with loading, using, modifying and/or developing and reproducing the Software that are reserved for experienced users. + +The Licensee shall be responsible for verifying, by any or all means, the product's suitability for its requirements, its due and proper functioning, and for ensuring that it shall not cause damage to either persons or property. + +9.2. The Licensor hereby represents, in good faith, that it is entitled to grant all the rights on the Software (including in particular the rights set forth in Article 5 hereof over the Software). + +9.3. The Licensee acknowledges that the Software is supplied "as is" by the Licensor without any or all other express or tacit warranty, other than that provided for in Article 9.2 and, in particular, without any or all warranty as to its market value, its secured, innovative or relevant nature. + +Specifically, the Licensor does not warrant that the Software is free from any or all error, that it shall operate continuously, that it shall be compatible with the Licensee's own equipment and its software configuration, nor that it shall meet the Licensee's requirements. + +9.4. The Licensor does not either expressly or tacitly warrant that the Software does not infringe any or all third party intellectual right relating to a patent, software or to any or all other property right. Moreover, the Licensor shall not hold the Licensee harmless against any or all proceedings for infringement that may be instituted in respect of the use, modification and redistribution of the Software. Nevertheless, should such proceedings be instituted against the Licensee, the Licensor shall provide it with technical and legal assistance for its defense. Such technical and legal assistance shall be decided upon on a case-by-case basis between the relevant Licensor and the Licensee pursuant to a memorandum of understanding. The Licensor disclaims any or all liability as regards the Licensee's use of the Software's name. No warranty shall be provided as regards the existence of prior rights over the name of the Software and as regards the existence of a trademark. + +Article 10 - TERMINATION + +10.1. In the event of a breach by the Licensee of its obligations hereunder, the Licensor may automatically terminate this Agreement thirty (30) days after notice has been sent to the Licensee and has remained ineffective. + +10.2. The Licensee whose Agreement is terminated shall no longer be authorized to use, modify or distribute the Software. However, any or all licenses that it may have granted prior to termination of the Agreement shall remain valid subject to their having been granted in compliance with the terms and conditions hereof. + +Article 11 - MISCELLANEOUS PROVISIONS + +11.1. EXCUSABLE EVENTS + +Neither Party shall be liable for any or all delay, or failure to perform the Agreement, that may be attributable to an event of force majeure, an act of God or an outside cause, such as, notably, defective functioning, or interruptions affecting the electricity or telecommunications networks, blocking of the network following a virus attack, the intervention of the government authorities, natural disasters, water damage, earthquakes, fire, explosions, strikes and labor unrest, war, etc. + +11.2. The fact that either Party may fail, on one or several occasions, to invoke one or several of the provisions hereof, shall under no circumstances be interpreted as being a waiver by the interested Party of its entitlement to invoke said provision(s) subsequently. + +11.3. The Agreement cancels and replaces any or all previous agreement, whether written or oral, between the Parties and having the same purpose, and constitutes the entirety of the agreement between said Parties concerning said purpose. No supplement or modification to the terms and conditions hereof shall be effective as regards the Parties unless it is made in writing and signed by their duly authorized representatives. + +11.4. In the event that one or several of the provisions hereof were to conflict with a current or future applicable act or legislative text, said act or legislative text shall take precedence, and the Parties shall make the necessary amendments so as to be in compliance with said act or legislative text. All the other provisions shall remain effective. Similarly, the fact that a provision of the Agreement may be null and void, for any reason whatsoever, shall not cause the Agreement as a whole to be null and void. + +11.5. LANGUAGE + +The Agreement is drafted in both French and English. In the event of a conflict as regards construction, the French version shall be deemed authentic. + +Article 12 - NEW VERSIONS OF THE AGREEMENT + +12.1. Any or all person is authorized to duplicate and distribute copies of this Agreement. + +12.2. So as to ensure coherence, the wording of this Agreement is protected and may only be modified by the authors of the License, that reserve the right to periodically publish updates or new versions of the Agreement, each with a separate number. These subsequent versions may address new issues encountered by Free Software. + +12.3. Any or all Software distributed under a given version of the Agreement may only be subsequently distributed under the same version of the Agreement, or a subsequent version, subject to the provisions of article 5.3.4. + +Article 13 - GOVERNING LAW AND JURISDICTION + +13.1. The Agreement is governed by French law. The Parties agree to endeavor to settle the disagreements or disputes that may arise during the performance of the Agreement out-of-court. + +13.2. In the absence of an out-of-court settlement within two (2) months as from their occurrence, and unless emergency proceedings are necessary, the disagreements or disputes shall be referred to the Paris Courts having jurisdiction, by the first Party to take action. + + Version 1.1 of 10/26/2004 \ No newline at end of file diff --git a/options/license/CECILL-2.0 b/options/license/CECILL-2.0 new file mode 100644 index 0000000..edac8f4 --- /dev/null +++ b/options/license/CECILL-2.0 @@ -0,0 +1,241 @@ +CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL + +Avertissement + +Ce contrat est une licence de logiciel libre issue d'une concertation entre ses auteurs afin que le respect de deux grands principes préside à sa rédaction: + +d'une part, le respect des principes de diffusion des logiciels libres: accès au code source, droits étendus conférés aux utilisateurs, +d'autre part, la désignation d'un droit applicable, le droit français, auquel elle est conforme, tant au regard du droit de la responsabilité civile que du droit de la propriété intellectuelle et de la protection qu'il offre aux auteurs et titulaires des droits patrimoniaux sur un logiciel. +Les auteurs de la licence CeCILL1 sont: + +Commissariat à l'Energie Atomique - CEA, établissement public de recherche à caractère scientifique, technique et industriel, dont le siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. + +Centre National de la Recherche Scientifique - CNRS, établissement public à caractère scientifique et technologique, dont le siège est situé 3 rue Michel-Ange, 75794 Paris cedex 16. + +Institut National de Recherche en Informatique et en Automatique - INRIA, établissement public à caractère scientifique et technologique, dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. + +Préambule + +Ce contrat est une licence de logiciel libre dont l'objectif est de conférer aux utilisateurs la liberté de modification et de redistribution du logiciel régi par cette licence dans le cadre d'un modèle de diffusion en logiciel libre. + +L'exercice de ces libertés est assorti de certains devoirs à la charge des utilisateurs afin de préserver ce statut au cours des redistributions ultérieures. + +L'accessibilité au code source et les droits de copie, de modification et de redistribution qui en découlent ont pour contrepartie de n'offrir aux utilisateurs qu'une garantie limitée et de ne faire peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et les concédants successifs qu'une responsabilité restreinte. + +A cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par l'utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à manipuler et qui le réserve donc à des développeurs ou des professionnels avertis possédant des connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester l'adéquation du logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. Ce contrat peut être reproduit et diffusé librement, sous réserve de le conserver en l'état, sans ajout ni suppression de clauses. + +Ce contrat est susceptible de s'appliquer à tout logiciel dont le titulaire des droits patrimoniaux décide de soumettre l'exploitation aux dispositions qu'il contient. + +Article 1 - DEFINITIONS + +Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une lettre capitale, auront la signification suivante: + +Contrat: désigne le présent contrat de licence, ses éventuelles versions postérieures et annexes. + +Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code Source et le cas échéant sa documentation, dans leur état au moment de l'acceptation du Contrat par le Licencié. + +Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et éventuellement de Code Objet et le cas échéant sa documentation, dans leur état au moment de leur première diffusion sous les termes du Contrat. + +Logiciel Modifié: désigne le Logiciel modifié par au moins une Contribution. + +Code Source: désigne l'ensemble des instructions et des lignes de programme du Logiciel et auquel l'accès est nécessaire en vue de modifier le Logiciel. + +Code Objet: désigne les fichiers binaires issus de la compilation du Code Source. + +Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur sur le Logiciel Initial. + +Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le Contrat. + +Contributeur: désigne le Licencié auteur d'au moins une Contribution. + +Concédant: désigne le Titulaire ou toute personne physique ou morale distribuant le Logiciel sous le Contrat. + +Contribution: désigne l'ensemble des modifications, corrections, traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans le Logiciel par tout Contributeur, ainsi que tout Module Interne. + +Module: désigne un ensemble de fichiers sources y compris leur documentation qui permet de réaliser des fonctionnalités ou services supplémentaires à ceux fournis par le Logiciel. + +Module Externe: désigne tout Module, non dérivé du Logiciel, tel que ce Module et le Logiciel s'exécutent dans des espaces d'adressage différents, l'un appelant l'autre au moment de leur exécution. + +Module Interne: désigne tout Module lié au Logiciel de telle sorte qu'ils s'exécutent dans le même espace d'adressage. + +GNU GPL: désigne la GNU General Public License dans sa version 2 ou toute version ultérieure, telle que publiée par Free Software Foundation Inc. + +Parties: désigne collectivement le Licencié et le Concédant. + +Ces termes s'entendent au singulier comme au pluriel. + +Article 2 - OBJET + +Le Contrat a pour objet la concession par le Concédant au Licencié d'une licence non exclusive, cessible et mondiale du Logiciel telle que définie ci-après à l'article 5 pour toute la durée de protection des droits portant sur ce Logiciel. + +Article 3 - ACCEPTATION + +3.1 L'acceptation par le Licencié des termes du Contrat est réputée acquise du fait du premier des faits suivants: + +(i) le chargement du Logiciel par tout moyen notamment par téléchargement à partir d'un serveur distant ou par chargement à partir d'un support physique; +(ii) le premier exercice par le Licencié de l'un quelconque des droits concédés par le Contrat. +3.2 Un exemplaire du Contrat, contenant notamment un avertissement relatif aux spécificités du Logiciel, à la restriction de garantie et à la limitation à un usage par des utilisateurs expérimentés a été mis à disposition du Licencié préalablement à son acceptation telle que définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris connaissance. + +Article 4 - ENTREE EN VIGUEUR ET DUREE + +4.1 ENTREE EN VIGUEUR + +Le Contrat entre en vigueur à la date de son acceptation par le Licencié telle que définie en 3.1. + +4.2 DUREE + +Le Contrat produira ses effets pendant toute la durée légale de protection des droits patrimoniaux portant sur le Logiciel. + +Article 5 - ETENDUE DES DROITS CONCEDES + +Le Concédant concède au Licencié, qui accepte, les droits suivants sur le Logiciel pour toutes destinations et pour la durée du Contrat dans les conditions ci-après détaillées. + +Par ailleurs, si le Concédant détient ou venait à détenir un ou plusieurs brevets d'invention protégeant tout ou partie des fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas opposer les éventuels droits conférés par ces brevets aux Licenciés successifs qui utiliseraient, exploiteraient ou modifieraient le Logiciel. En cas de cession de ces brevets, le Concédant s'engage à faire reprendre les obligations du présent alinéa aux cessionnaires. + +5.1 DROIT D'UTILISATION + +Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant aux domaines d'application, étant ci-après précisé que cela comporte: + +la reproduction permanente ou provisoire du Logiciel en tout ou partie par tout moyen et sous toute forme. + +le chargement, l'affichage, l'exécution, ou le stockage du Logiciel sur tout support. + +la possibilité d'en observer, d'en étudier, ou d'en tester le fonctionnement afin de déterminer les idées et principes qui sont à la base de n'importe quel élément de ce Logiciel; et ceci, lorsque le Licencié effectue toute opération de chargement, d'affichage, d'exécution, de transmission ou de stockage du Logiciel qu'il est en droit d'effectuer en vertu du Contrat. + +5.2 DROIT D'APPORTER DES CONTRIBUTIONS + +Le droit d'apporter des Contributions comporte le droit de traduire, d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel et le droit de reproduire le logiciel en résultant. + +Le Licencié est autorisé à apporter toute Contribution au Logiciel sous réserve de mentionner, de façon explicite, son nom en tant qu'auteur de cette Contribution et la date de création de celle-ci. + +5.3 DROIT DE DISTRIBUTION + +Le droit de distribution comporte notamment le droit de diffuser, de transmettre et de communiquer le Logiciel au public sur tout support et par tout moyen ainsi que le droit de mettre sur le marché à titre onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. + +Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou non, à des tiers dans les conditions ci-après détaillées. + +5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION + +Le Licencié est autorisé à distribuer des copies conformes du Logiciel, sous forme de Code Source ou de Code Objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: + +d'un exemplaire du Contrat, + +d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, + +et que, dans le cas où seul le Code Objet du Logiciel est redistribué, le Licencié permette aux futurs Licenciés d'accéder facilement au Code Source complet du Logiciel en indiquant les modalités d'accès, étant entendu que le coût additionnel d'acquisition du Code Source ne devra pas excéder le simple coût de transfert des données. + +5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE + +Lorsque le Licencié apporte une Contribution au Logiciel, les conditions de distribution du Logiciel Modifié en résultant sont alors soumises à l'intégralité des dispositions du Contrat. + +Le Licencié est autorisé à distribuer le Logiciel Modifié, sous forme de code source ou de code objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: + +d'un exemplaire du Contrat, + +d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, + +et que, dans le cas où seul le code objet du Logiciel Modifié est redistribué, le Licencié permette aux futurs Licenciés d'accéder facilement au code source complet du Logiciel Modifié en indiquant les modalités d'accès, étant entendu que le coût additionnel d'acquisition du code source ne devra pas excéder le simple coût de transfert des données. + +5.3.3 DISTRIBUTION DES MODULES EXTERNES + +Lorsque le Licencié a développé un Module Externe les conditions du Contrat ne s'appliquent pas à ce Module Externe, qui peut être distribué sous un contrat de licence différent. + +5.3.4 COMPATIBILITE AVEC LA LICENCE GNU GPL + +Le Licencié peut inclure un code soumis aux dispositions d'une des versions de la licence GNU GPL dans le Logiciel modifié ou non et distribuer l'ensemble sous les conditions de la même version de la licence GNU GPL. + +Le Licencié peut inclure le Logiciel modifié ou non dans un code soumis aux dispositions d'une des versions de la licence GNU GPL et distribuer l'ensemble sous les conditions de la même version de la licence GNU GPL. + +Article 6 - PROPRIETE INTELLECTUELLE + +6.1 SUR LE LOGICIEL INITIAL + +Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel Initial. Toute utilisation du Logiciel Initial est soumise au respect des conditions dans lesquelles le Titulaire a choisi de diffuser son oeuvre et nul autre n'a la faculté de modifier les conditions de diffusion de ce Logiciel Initial. + +Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi par le Contrat et ce, pour la durée visée à l'article 4.2. + +6.2 SUR LES CONTRIBUTIONS + +Le Licencié qui a développé une Contribution est titulaire sur celle-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable. + +6.3 SUR LES MODULES EXTERNES + +Le Licencié qui a développé un Module Externe est titulaire sur celui-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable et reste libre du choix du contrat régissant sa diffusion. + +6.4 DISPOSITIONS COMMUNES + +Le Licencié s'engage expressément: + +à ne pas supprimer ou modifier de quelque manière que ce soit les mentions de propriété intellectuelle apposées sur le Logiciel; + +à reproduire à l'identique lesdites mentions de propriété intellectuelle sur les copies du Logiciel modifié ou non. + +Le Licencié s'engage à ne pas porter atteinte, directement ou indirectement, aux droits de propriété intellectuelle du Titulaire et/ou des Contributeurs sur le Logiciel et à prendre, le cas échéant, à l'égard de son personnel toutes les mesures nécessaires pour assurer le respect des dits droits de propriété intellectuelle du Titulaire et/ou des Contributeurs. + +Article 7 - SERVICES ASSOCIES + +7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de prestations d'assistance technique ou de maintenance du Logiciel. + +Cependant le Concédant reste libre de proposer ce type de services. Les termes et conditions d'une telle assistance technique et/ou d'une telle maintenance seront alors déterminés dans un acte séparé. Ces actes de maintenance et/ou assistance technique n'engageront que la seule responsabilité du Concédant qui les propose. + +7.2 De même, tout Concédant est libre de proposer, sous sa seule responsabilité, à ses licenciés une garantie, qui n'engagera que lui, lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, dans les conditions qu'il souhaite. Cette garantie et les modalités financières de son application feront l'objet d'un acte séparé entre le Concédant et le Licencié. + +Article 8 - RESPONSABILITE + +8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la faculté, sous réserve de prouver la faute du Concédant concerné, de solliciter la réparation du préjudice direct qu'il subirait du fait du Logiciel et dont il apportera la preuve. + +8.2 La responsabilité du Concédant est limitée aux engagements pris en application du Contrat et ne saurait être engagée en raison notamment: (i) des dommages dus à l'inexécution, totale ou partielle, de ses obligations par le Licencié, (ii) des dommages directs ou indirects découlant de l'utilisation ou des performances du Logiciel subis par le Licencié et (iii) plus généralement d'un quelconque dommage indirect. En particulier, les Parties conviennent expressément que tout préjudice financier ou commercial (par exemple perte de données, perte de bénéfices, perte d'exploitation, perte de clientèle ou de commandes, manque à gagner, trouble commercial quelconque) ou toute action dirigée contre le Licencié par un tiers, constitue un dommage indirect et n'ouvre pas droit à réparation par le Concédant. + +Article 9 - GARANTIE + +9.1 Le Licencié reconnaît que l'état actuel des connaissances scientifiques et techniques au moment de la mise en circulation du Logiciel ne permet pas d'en tester et d'en vérifier toutes les utilisations ni de détecter l'existence d'éventuels défauts. L'attention du Licencié a été attirée sur ce point sur les risques associés au chargement, à l'utilisation, la modification et/ou au développement et à la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. + +Il relève de la responsabilité du Licencié de contrôler, par tous moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. + +9.2 Le Concédant déclare de bonne foi être en droit de concéder l'ensemble des droits attachés au Logiciel (comprenant notamment les droits visés à l'article 5). + +9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le Concédant sans autre garantie, expresse ou tacite, que celle prévue à l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, son caractère sécurisé, innovant ou pertinent. + +En particulier, le Concédant ne garantit pas que le Logiciel est exempt d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible avec l'équipement du Licencié et sa configuration logicielle ni qu'il remplira les besoins du Licencié. + +9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le Logiciel ne porte pas atteinte à un quelconque droit de propriété intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout autre droit de propriété. Ainsi, le Concédant exclut toute garantie au profit du Licencié contre les actions en contrefaçon qui pourraient être diligentées au titre de l'utilisation, de la modification, et de la redistribution du Logiciel. Néanmoins, si de telles actions sont exercées contre le Licencié, le Concédant lui apportera son aide technique et juridique pour sa défense. Cette aide technique et juridique est déterminée au cas par cas entre le Concédant concerné et le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage toute responsabilité quant à l'utilisation de la dénomination du Logiciel par le Licencié. Aucune garantie n'est apportée quant à l'existence de droits antérieurs sur le nom du Logiciel et sur l'existence d'une marque. + +Article 10 - RESILIATION + +10.1 En cas de manquement par le Licencié aux obligations mises à sa charge par le Contrat, le Concédant pourra résilier de plein droit le Contrat trente (30) jours après notification adressée au Licencié et restée sans effet. + +10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les licences qu'il aura concédées antérieurement à la résiliation du Contrat resteront valides sous réserve qu'elles aient été effectuées en conformité avec le Contrat. + +Article 11 - DISPOSITIONS DIVERSES + +11.1 CAUSE EXTERIEURE + +Aucune des Parties ne sera responsable d'un retard ou d'une défaillance d'exécution du Contrat qui serait dû à un cas de force majeure, un cas fortuit ou une cause extérieure, telle que, notamment, le mauvais fonctionnement ou les interruptions du réseau électrique ou de télécommunication, la paralysie du réseau liée à une attaque informatique, l'intervention des autorités gouvernementales, les catastrophes naturelles, les dégâts des eaux, les tremblements de terre, le feu, les explosions, les grèves et les conflits sociaux, l'état de guerre... + +11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du Contrat, ne pourra en aucun cas impliquer renonciation par la Partie intéressée à s'en prévaloir ultérieurement. + +11.3 Le Contrat annule et remplace toute convention antérieure, écrite ou orale, entre les Parties sur le même objet et constitue l'accord entier entre les Parties sur cet objet. Aucune addition ou modification aux termes du Contrat n'aura d'effet à l'égard des Parties à moins d'être faite par écrit et signée par leurs représentants dûment habilités. + +11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat s'avèrerait contraire à une loi ou à un texte applicable, existants ou futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les amendements nécessaires pour se conformer à cette loi ou à ce texte. Toutes les autres dispositions resteront en vigueur. De même, la nullité, pour quelque raison que ce soit, d'une des dispositions du Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. + +11.5 LANGUE + +Le Contrat est rédigé en langue française et en langue anglaise, ces deux versions faisant également foi. + +Article 12 - NOUVELLES VERSIONS DU CONTRAT + +12.1 Toute personne est autorisée à copier et distribuer des copies de ce Contrat. + +12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé et ne peut être modifié que par les auteurs de la licence, lesquels se réservent le droit de publier périodiquement des mises à jour ou de nouvelles versions du Contrat, qui posséderont chacune un numéro distinct. Ces versions ultérieures seront susceptibles de prendre en compte de nouvelles problématiques rencontrées par les logiciels libres. + +12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra faire l'objet d'une diffusion ultérieure que sous la même version du Contrat ou une version postérieure, sous réserve des dispositions de l'article 5.3.4. + +Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE + +13.1 Le Contrat est régi par la loi française. Les Parties conviennent de tenter de régler à l'amiable les différends ou litiges qui viendraient à se produire par suite ou à l'occasion du Contrat. + +13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter de leur survenance et sauf situation relevant d'une procédure d'urgence, les différends ou litiges seront portés par la Partie la plus diligente devant les Tribunaux compétents de Paris. + +1 CeCILL est pour Ce(a) C(nrs) I(nria) L(ogiciel) L(ibre) + +Version 2.0 du 2006-09-05. \ No newline at end of file diff --git a/options/license/CECILL-2.1 b/options/license/CECILL-2.1 new file mode 100644 index 0000000..c8ac1f7 --- /dev/null +++ b/options/license/CECILL-2.1 @@ -0,0 +1,249 @@ +CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL + +Version 2.1 du 2013-06-21 + +Avertissement + +Ce contrat est une licence de logiciel libre issue d'une concertation entre ses auteurs afin que le respect de deux grands principes préside à sa rédaction: + + * d'une part, le respect des principes de diffusion des logiciels libres: accès au code source, droits étendus conférés aux utilisateurs, + + * d'autre part, la désignation d'un droit applicable, le droit français, auquel elle est conforme, tant au regard du droit de la responsabilité civile que du droit de la propriété intellectuelle et de la protection qu'il offre aux auteurs et titulaires des droits patrimoniaux sur un logiciel. + +Les auteurs de la licence CeCILL (Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) sont: + +Commissariat à l'énergie atomique et aux énergies alternatives - CEA, établissement public de recherche à caractère scientifique, technique et industriel, dont le siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. + +Centre National de la Recherche Scientifique - CNRS, établissement public à caractère scientifique et technologique, dont le siège est situé 3 rue Michel-Ange, 75794 Paris cedex 16. + +Institut National de Recherche en Informatique et en Automatique - Inria, établissement public à caractère scientifique et technologique, dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. + + Préambule + +Ce contrat est une licence de logiciel libre dont l'objectif est de conférer aux utilisateurs la liberté de modification et de redistribution du logiciel régi par cette licence dans le cadre d'un modèle de diffusion en logiciel libre. + +L'exercice de ces libertés est assorti de certains devoirs à la charge des utilisateurs afin de préserver ce statut au cours des redistributions ultérieures. + +L'accessibilité au code source et les droits de copie, de modification et de redistribution qui en découlent ont pour contrepartie de n'offrir aux utilisateurs qu'une garantie limitée et de ne faire peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et les concédants successifs qu'une responsabilité restreinte. + +A cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par l'utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à manipuler et qui le réserve donc à des développeurs ou des professionnels avertis possédant des connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester l'adéquation du logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. Ce contrat peut être reproduit et diffusé librement, sous réserve de le conserver en l'état, sans ajout ni suppression de clauses. + +Ce contrat est susceptible de s'appliquer à tout logiciel dont le titulaire des droits patrimoniaux décide de soumettre l'exploitation aux dispositions qu'il contient. + +Une liste de questions fréquemment posées se trouve sur le site web officiel de la famille des licences CeCILL (http://www.cecill.info/index.fr.html) pour toute clarification qui serait nécessaire. + + Article 1 - DEFINITIONS + +Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une lettre capitale, auront la signification suivante: + +Contrat: désigne le présent contrat de licence, ses éventuelles versions postérieures et annexes. + +Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code Source et le cas échéant sa documentation, dans leur état au moment de l'acceptation du Contrat par le Licencié. + +Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et éventuellement de Code Objet et le cas échéant sa documentation, dans leur état au moment de leur première diffusion sous les termes du Contrat. + +Logiciel Modifié: désigne le Logiciel modifié par au moins une Contribution. + +Code Source: désigne l'ensemble des instructions et des lignes de programme du Logiciel et auquel l'accès est nécessaire en vue de modifier le Logiciel. + +Code Objet: désigne les fichiers binaires issus de la compilation du Code Source. + +Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur sur le Logiciel Initial. + +Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le Contrat. + +Contributeur: désigne le Licencié auteur d'au moins une Contribution. + +Concédant: désigne le Titulaire ou toute personne physique ou morale distribuant le Logiciel sous le Contrat. + +Contribution: désigne l'ensemble des modifications, corrections, traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans le Logiciel par tout Contributeur, ainsi que tout Module Interne. + +Module: désigne un ensemble de fichiers sources y compris leur documentation qui permet de réaliser des fonctionnalités ou services supplémentaires à ceux fournis par le Logiciel. + +Module Externe: désigne tout Module, non dérivé du Logiciel, tel que ce Module et le Logiciel s'exécutent dans des espaces d'adressage différents, l'un appelant l'autre au moment de leur exécution. + +Module Interne: désigne tout Module lié au Logiciel de telle sorte qu'ils s'exécutent dans le même espace d'adressage. + +GNU GPL: désigne la GNU General Public License dans sa version 2 ou toute version ultérieure, telle que publiée par Free Software Foundation Inc. + +GNU Affero GPL: désigne la GNU Affero General Public License dans sa version 3 ou toute version ultérieure, telle que publiée par Free Software Foundation Inc. + +EUPL: désigne la Licence Publique de l'Union européenne dans sa version 1.1 ou toute version ultérieure, telle que publiée par la Commission Européenne. + +Parties: désigne collectivement le Licencié et le Concédant. + +Ces termes s'entendent au singulier comme au pluriel. + + Article 2 - OBJET + +Le Contrat a pour objet la concession par le Concédant au Licencié d'une licence non exclusive, cessible et mondiale du Logiciel telle que définie ci-après à l'article 5 <#etendue> pour toute la durée de protection des droits portant sur ce Logiciel. + + Article 3 - ACCEPTATION + +3.1 L'acceptation par le Licencié des termes du Contrat est réputée acquise du fait du premier des faits suivants: + + * (i) le chargement du Logiciel par tout moyen notamment par téléchargement à partir d'un serveur distant ou par chargement à partir d'un support physique; + + * (ii) le premier exercice par le Licencié de l'un quelconque des droits concédés par le Contrat. + +3.2 Un exemplaire du Contrat, contenant notamment un avertissement relatif aux spécificités du Logiciel, à la restriction de garantie et à la limitation à un usage par des utilisateurs expérimentés a été mis à disposition du Licencié préalablement à son acceptation telle que définie à l'article 3.1 <#acceptation-acquise> ci dessus et le Licencié reconnaît en avoir pris connaissance. + + Article 4 - ENTREE EN VIGUEUR ET DUREE + + 4.1 ENTREE EN VIGUEUR + +Le Contrat entre en vigueur à la date de son acceptation par le Licencié telle que définie en 3.1 <#acceptation-acquise>. + + 4.2 DUREE + +Le Contrat produira ses effets pendant toute la durée légale de protection des droits patrimoniaux portant sur le Logiciel. + + Article 5 - ETENDUE DES DROITS CONCEDES + +Le Concédant concède au Licencié, qui accepte, les droits suivants sur le Logiciel pour toutes destinations et pour la durée du Contrat dans les conditions ci-après détaillées. + +Par ailleurs, si le Concédant détient ou venait à détenir un ou plusieurs brevets d'invention protégeant tout ou partie des fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas opposer les éventuels droits conférés par ces brevets aux Licenciés successifs qui utiliseraient, exploiteraient ou modifieraient le Logiciel. En cas de cession de ces brevets, le Concédant s'engage à faire reprendre les obligations du présent alinéa aux cessionnaires. + + 5.1 DROIT D'UTILISATION + +Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant aux domaines d'application, étant ci-après précisé que cela comporte: + + 1. la reproduction permanente ou provisoire du Logiciel en tout ou partie par tout moyen et sous toute forme. + + 2. le chargement, l'affichage, l'exécution, ou le stockage du Logiciel sur tout support. + + 3. la possibilité d'en observer, d'en étudier, ou d'en tester le fonctionnement afin de déterminer les idées et principes qui sont à la base de n'importe quel élément de ce Logiciel; et ceci, lorsque le Licencié effectue toute opération de chargement, d'affichage, d'exécution, de transmission ou de stockage du Logiciel qu'il est en droit d'effectuer en vertu du Contrat. + + 5.2 DROIT D'APPORTER DES CONTRIBUTIONS + +Le droit d'apporter des Contributions comporte le droit de traduire, d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel et le droit de reproduire le logiciel en résultant. + +Le Licencié est autorisé à apporter toute Contribution au Logiciel sous réserve de mentionner, de façon explicite, son nom en tant qu'auteur de cette Contribution et la date de création de celle-ci. + + 5.3 DROIT DE DISTRIBUTION + +Le droit de distribution comporte notamment le droit de diffuser, de transmettre et de communiquer le Logiciel au public sur tout support et par tout moyen ainsi que le droit de mettre sur le marché à titre onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. + +Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou non, à des tiers dans les conditions ci-après détaillées. + + 5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION + + Le Licencié est autorisé à distribuer des copies conformes du Logiciel, sous forme de Code Source ou de Code Objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 <#responsabilite> et 9 <#garantie>, + + et que, dans le cas où seul le Code Objet du Logiciel est redistribué, le Licencié permette un accès effectif au Code Source complet du Logiciel pour une durée d'au moins 3 ans à compter de la distribution du logiciel, étant entendu que le coût additionnel d'acquisition du Code Source ne devra pas excéder le simple coût de transfert des données. + + 5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE + + Lorsque le Licencié apporte une Contribution au Logiciel, les conditions de distribution du Logiciel Modifié en résultant sont alors soumises à l'intégralité des dispositions du Contrat. + + Le Licencié est autorisé à distribuer le Logiciel Modifié, sous forme de code source ou de code objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 <#responsabilite> et 9 <#garantie>, + +et, dans le cas où seul le code objet du Logiciel Modifié est redistribué, + + 3. d'une note précisant les conditions d'accès effectif au code source complet du Logiciel Modifié, pendant une période d'au moins 3 ans à compter de la distribution du Logiciel Modifié, étant entendu que le coût additionnel d'acquisition du code source ne devra pas excéder le simple coût de transfert des données. + + 5.3.3 DISTRIBUTION DES MODULES EXTERNES + + Lorsque le Licencié a développé un Module Externe les conditions du Contrat ne s'appliquent pas à ce Module Externe, qui peut être distribué sous un contrat de licence différent. + + 5.3.4 COMPATIBILITE AVEC D'AUTRES LICENCES + + Le Licencié peut inclure un code soumis aux dispositions d'une des versions de la licence GNU GPL, GNU Affero GPL et/ou EUPL dans le Logiciel modifié ou non et distribuer l'ensemble sous les conditions de la même version de la licence GNU GPL, GNU Affero GPL et/ou EUPL. + + Le Licencié peut inclure le Logiciel modifié ou non dans un code soumis aux dispositions d'une des versions de la licence GNU GPL, GNU Affero GPL et/ou EUPL et distribuer l'ensemble sous les conditions de la même version de la licence GNU GPL, GNU Affero GPL et/ou EUPL. + + Article 6 - PROPRIETE INTELLECTUELLE + + 6.1 SUR LE LOGICIEL INITIAL + +Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel Initial. Toute utilisation du Logiciel Initial est soumise au respect des conditions dans lesquelles le Titulaire a choisi de diffuser son oeuvre et nul autre n'a la faculté de modifier les conditions de diffusion de ce Logiciel Initial. + +Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi par le Contrat et ce, pour la durée visée à l'article 4.2 <#duree>. + + 6.2 SUR LES CONTRIBUTIONS + +Le Licencié qui a développé une Contribution est titulaire sur celle-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable. + + 6.3 SUR LES MODULES EXTERNES + +Le Licencié qui a développé un Module Externe est titulaire sur celui-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable et reste libre du choix du contrat régissant sa diffusion. + + 6.4 DISPOSITIONS COMMUNES + +Le Licencié s'engage expressément: + + 1. à ne pas supprimer ou modifier de quelque manière que ce soit les mentions de propriété intellectuelle apposées sur le Logiciel; + + 2. à reproduire à l'identique lesdites mentions de propriété intellectuelle sur les copies du Logiciel modifié ou non. + +Le Licencié s'engage à ne pas porter atteinte, directement ou indirectement, aux droits de propriété intellectuelle du Titulaire et/ou des Contributeurs sur le Logiciel et à prendre, le cas échéant, à l'égard de son personnel toutes les mesures nécessaires pour assurer le respect des dits droits de propriété intellectuelle du Titulaire et/ou des Contributeurs. + + Article 7 - SERVICES ASSOCIES + +7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de prestations d'assistance technique ou de maintenance du Logiciel. + +Cependant le Concédant reste libre de proposer ce type de services. Les termes et conditions d'une telle assistance technique et/ou d'une telle maintenance seront alors déterminés dans un acte séparé. Ces actes de maintenance et/ou assistance technique n'engageront que la seule responsabilité du Concédant qui les propose. + +7.2 De même, tout Concédant est libre de proposer, sous sa seule responsabilité, à ses licenciés une garantie, qui n'engagera que lui, lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, dans les conditions qu'il souhaite. Cette garantie et les modalités financières de son application feront l'objet d'un acte séparé entre le Concédant et le Licencié. + + Article 8 - RESPONSABILITE + +8.1 Sous réserve des dispositions de l'article 8.2 <#limite-responsabilite>, le Licencié a la faculté, sous réserve de prouver la faute du Concédant concerné, de solliciter la réparation du préjudice direct qu'il subirait du fait du Logiciel et dont il apportera la preuve. + +8.2 La responsabilité du Concédant est limitée aux engagements pris en application du Contrat et ne saurait être engagée en raison notamment: (i) des dommages dus à l'inexécution, totale ou partielle, de ses obligations par le Licencié, (ii) des dommages directs ou indirects découlant de l'utilisation ou des performances du Logiciel subis par le Licencié et (iii) plus généralement d'un quelconque dommage indirect. En particulier, les Parties conviennent expressément que tout préjudice financier ou commercial (par exemple perte de données, perte de bénéfices, perte d'exploitation, perte de clientèle ou de commandes, manque à gagner, trouble commercial quelconque) ou toute action dirigée contre le Licencié par un tiers, constitue un dommage indirect et n'ouvre pas droit à réparation par le Concédant. + + Article 9 - GARANTIE + +9.1 Le Licencié reconnaît que l'état actuel des connaissances scientifiques et techniques au moment de la mise en circulation du Logiciel ne permet pas d'en tester et d'en vérifier toutes les utilisations ni de détecter l'existence d'éventuels défauts. L'attention du Licencié a été attirée sur ce point sur les risques associés au chargement, à l'utilisation, la modification et/ou au développement et à la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. + +Il relève de la responsabilité du Licencié de contrôler, par tous moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. + +9.2 Le Concédant déclare de bonne foi être en droit de concéder l'ensemble des droits attachés au Logiciel (comprenant notamment les droits visés à l'article 5 <#etendue>). + +9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le Concédant sans autre garantie, expresse ou tacite, que celle prévue à l'article 9.2 <#bonne-foi> et notamment sans aucune garantie sur sa valeur commerciale, son caractère sécurisé, innovant ou pertinent. + +En particulier, le Concédant ne garantit pas que le Logiciel est exempt d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible avec l'équipement du Licencié et sa configuration logicielle ni qu'il remplira les besoins du Licencié. + +9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le Logiciel ne porte pas atteinte à un quelconque droit de propriété intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout autre droit de propriété. Ainsi, le Concédant exclut toute garantie au profit du Licencié contre les actions en contrefaçon qui pourraient être diligentées au titre de l'utilisation, de la modification, et de la redistribution du Logiciel. Néanmoins, si de telles actions sont exercées contre le Licencié, le Concédant lui apportera son expertise technique et juridique pour sa défense. Cette expertise technique et juridique est déterminée au cas par cas entre le Concédant concerné et le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage toute responsabilité quant à l'utilisation de la dénomination du Logiciel par le Licencié. Aucune garantie n'est apportée quant à l'existence de droits antérieurs sur le nom du Logiciel et sur l'existence d'une marque. + + Article 10 - RESILIATION + +10.1 En cas de manquement par le Licencié aux obligations mises à sa charge par le Contrat, le Concédant pourra résilier de plein droit le Contrat trente (30) jours après notification adressée au Licencié et restée sans effet. + +10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les licences qu'il aura concédées antérieurement à la résiliation du Contrat resteront valides sous réserve qu'elles aient été effectuées en conformité avec le Contrat. + + Article 11 - DISPOSITIONS DIVERSES + +11.1 CAUSE EXTERIEURE +Aucune des Parties ne sera responsable d'un retard ou d'une défaillance d'exécution du Contrat qui serait dû à un cas de force majeure, un cas fortuit ou une cause extérieure, telle que, notamment, le mauvais fonctionnement ou les interruptions du réseau électrique ou de télécommunication, la paralysie du réseau liée à une attaque informatique, l'intervention des autorités gouvernementales, les catastrophes naturelles, les dégâts des eaux, les tremblements de terre, le feu, les explosions, les grèves et les conflits sociaux, l'état de guerre... + +11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du Contrat, ne pourra en aucun cas impliquer renonciation par la Partie intéressée à s'en prévaloir ultérieurement. + +11.3 Le Contrat annule et remplace toute convention antérieure, écrite ou orale, entre les Parties sur le même objet et constitue l'accord entier entre les Parties sur cet objet. Aucune addition ou modification aux termes du Contrat n'aura d'effet à l'égard des Parties à moins d'être faite par écrit et signée par leurs représentants dûment habilités. + +11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat s'avèrerait contraire à une loi ou à un texte applicable, existants ou futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les amendements nécessaires pour se conformer à cette loi ou à ce texte. Toutes les autres dispositions resteront en vigueur. De même, la nullité, pour quelque raison que ce soit, d'une des dispositions du Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. + +11.5 LANGUE +Le Contrat est rédigé en langue française et en langue anglaise, ces deux versions faisant également foi. + + Article 12 - NOUVELLES VERSIONS DU CONTRAT + +12.1 Toute personne est autorisée à copier et distribuer des copies de ce Contrat. + +12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé et ne peut être modifié que par les auteurs de la licence, lesquels se réservent le droit de publier périodiquement des mises à jour ou de nouvelles versions du Contrat, qui posséderont chacune un numéro distinct. Ces versions ultérieures seront susceptibles de prendre en compte de nouvelles problématiques rencontrées par les logiciels libres. + +12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra faire l'objet d'une diffusion ultérieure que sous la même version du Contrat ou une version postérieure, sous réserve des dispositions de l'article 5.3.4 <#compatibilite>. + + Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE + +13.1 Le Contrat est régi par la loi française. Les Parties conviennent de tenter de régler à l'amiable les différends ou litiges qui viendraient à se produire par suite ou à l'occasion du Contrat. + +13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter de leur survenance et sauf situation relevant d'une procédure d'urgence, les différends ou litiges seront portés par la Partie la plus diligente devant les Tribunaux compétents de Paris. \ No newline at end of file diff --git a/options/license/CECILL-B b/options/license/CECILL-B new file mode 100644 index 0000000..e251521 --- /dev/null +++ b/options/license/CECILL-B @@ -0,0 +1,245 @@ +CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + +Avertissement + +Ce contrat est une licence de logiciel libre issue d'une concertation entre ses auteurs afin que le respect de deux grands principes préside à sa rédaction: + +d'une part, le respect des principes de diffusion des logiciels libres: accès au code source, droits étendus conférés aux utilisateurs, +d'autre part, la désignation d'un droit applicable, le droit français, auquel elle est conforme, tant au regard du droit de la responsabilité civile que du droit de la propriété intellectuelle et de la protection qu'il offre aux auteurs et titulaires des droits patrimoniaux sur un logiciel. +Les auteurs de la licence CeCILL-B1 sont: + +Commissariat à l'Energie Atomique - CEA, établissement public de recherche à caractère scientifique, technique et industriel, dont le siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. + +Centre National de la Recherche Scientifique - CNRS, établissement public à caractère scientifique et technologique, dont le siège est situé 3 rue Michel-Ange, 75794 Paris cedex 16. + +Institut National de Recherche en Informatique et en Automatique - INRIA, établissement public à caractère scientifique et technologique, dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. + +Préambule + +Ce contrat est une licence de logiciel libre dont l'objectif est de conférer aux utilisateurs une très large liberté de modification et de redistribution du logiciel régi par cette licence. + +L'exercice de cette liberté est assorti d'une obligation forte de citation à la charge de ceux qui distribueraient un logiciel incorporant un logiciel régi par la présente licence afin d'assurer que les contributions de tous soient correctement identifiées et reconnues. + +L'accessibilité au code source et les droits de copie, de modification et de redistribution qui découlent de ce contrat ont pour contrepartie de n'offrir aux utilisateurs qu'une garantie limitée et de ne faire peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et les concédants successifs qu'une responsabilité restreinte. + +A cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par l'utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à manipuler et qui le réserve donc à des développeurs ou des professionnels avertis possédant des connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester l'adéquation du logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. Ce contrat peut être reproduit et diffusé librement, sous réserve de le conserver en l'état, sans ajout ni suppression de clauses. + +Ce contrat est susceptible de s'appliquer à tout logiciel dont le titulaire des droits patrimoniaux décide de soumettre l'exploitation aux dispositions qu'il contient. + +Article 1 - DEFINITIONS + +Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une lettre capitale, auront la signification suivante: + +Contrat: désigne le présent contrat de licence, ses éventuelles versions postérieures et annexes. + +Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code Source et le cas échéant sa documentation, dans leur état au moment de l'acceptation du Contrat par le Licencié. + +Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et éventuellement de Code Objet et le cas échéant sa documentation, dans leur état au moment de leur première diffusion sous les termes du Contrat. + +Logiciel Modifié: désigne le Logiciel modifié par au moins une Contribution. + +Code Source: désigne l'ensemble des instructions et des lignes de programme du Logiciel et auquel l'accès est nécessaire en vue de modifier le Logiciel. + +Code Objet: désigne les fichiers binaires issus de la compilation du Code Source. + +Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur sur le Logiciel Initial. + +Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le Contrat. + +Contributeur: désigne le Licencié auteur d'au moins une Contribution. + +Concédant: désigne le Titulaire ou toute personne physique ou morale distribuant le Logiciel sous le Contrat. + +Contribution: désigne l'ensemble des modifications, corrections, traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans le Logiciel par tout Contributeur, ainsi que tout Module Interne. + +Module: désigne un ensemble de fichiers sources y compris leur documentation qui permet de réaliser des fonctionnalités ou services supplémentaires à ceux fournis par le Logiciel. + +Module Externe: désigne tout Module, non dérivé du Logiciel, tel que ce Module et le Logiciel s'exécutent dans des espaces d'adressage différents, l'un appelant l'autre au moment de leur exécution. + +Module Interne: désigne tout Module lié au Logiciel de telle sorte qu'ils s'exécutent dans le même espace d'adressage. + +Parties: désigne collectivement le Licencié et le Concédant. + +Ces termes s'entendent au singulier comme au pluriel. + +Article 2 - OBJET + +Le Contrat a pour objet la concession par le Concédant au Licencié d'une licence non exclusive, cessible et mondiale du Logiciel telle que définie ci-après à l'article 5 pour toute la durée de protection des droits portant sur ce Logiciel. + +Article 3 - ACCEPTATION + +3.1 L'acceptation par le Licencié des termes du Contrat est réputée acquise du fait du premier des faits suivants: + +(i) le chargement du Logiciel par tout moyen notamment par téléchargement à partir d'un serveur distant ou par chargement à partir d'un support physique; +(ii) le premier exercice par le Licencié de l'un quelconque des droits concédés par le Contrat. +3.2 Un exemplaire du Contrat, contenant notamment un avertissement relatif aux spécificités du Logiciel, à la restriction de garantie et à la limitation à un usage par des utilisateurs expérimentés a été mis à disposition du Licencié préalablement à son acceptation telle que définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris connaissance. + +Article 4 - ENTREE EN VIGUEUR ET DUREE + +4.1 ENTREE EN VIGUEUR + +Le Contrat entre en vigueur à la date de son acceptation par le Licencié telle que définie en 3.1. + +4.2 DUREE + +Le Contrat produira ses effets pendant toute la durée légale de protection des droits patrimoniaux portant sur le Logiciel. + +Article 5 - ETENDUE DES DROITS CONCEDES + +Le Concédant concède au Licencié, qui accepte, les droits suivants sur le Logiciel pour toutes destinations et pour la durée du Contrat dans les conditions ci-après détaillées. + +Par ailleurs, si le Concédant détient ou venait à détenir un ou plusieurs brevets d'invention protégeant tout ou partie des fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas opposer les éventuels droits conférés par ces brevets aux Licenciés successifs qui utiliseraient, exploiteraient ou modifieraient le Logiciel. En cas de cession de ces brevets, le Concédant s'engage à faire reprendre les obligations du présent alinéa aux cessionnaires. + +5.1 DROIT D'UTILISATION + +Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant aux domaines d'application, étant ci-après précisé que cela comporte: + +la reproduction permanente ou provisoire du Logiciel en tout ou partie par tout moyen et sous toute forme. + +le chargement, l'affichage, l'exécution, ou le stockage du Logiciel sur tout support. + +la possibilité d'en observer, d'en étudier, ou d'en tester le fonctionnement afin de déterminer les idées et principes qui sont à la base de n'importe quel élément de ce Logiciel; et ceci, lorsque le Licencié effectue toute opération de chargement, d'affichage, d'exécution, de transmission ou de stockage du Logiciel qu'il est en droit d'effectuer en vertu du Contrat. + +5.2 DROIT D'APPORTER DES CONTRIBUTIONS + +Le droit d'apporter des Contributions comporte le droit de traduire, d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel et le droit de reproduire le logiciel en résultant. + +Le Licencié est autorisé à apporter toute Contribution au Logiciel sous réserve de mentionner, de façon explicite, son nom en tant qu'auteur de cette Contribution et la date de création de celle-ci. + +5.3 DROIT DE DISTRIBUTION + +Le droit de distribution comporte notamment le droit de diffuser, de transmettre et de communiquer le Logiciel au public sur tout support et par tout moyen ainsi que le droit de mettre sur le marché à titre onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. + +Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou non, à des tiers dans les conditions ci-après détaillées. + +5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION + +Le Licencié est autorisé à distribuer des copies conformes du Logiciel, sous forme de Code Source ou de Code Objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: + +d'un exemplaire du Contrat, + +d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, + +et que, dans le cas où seul le Code Objet du Logiciel est redistribué, le Licencié permette un accès effectif au Code Source complet du Logiciel pendant au moins toute la durée de sa distribution du Logiciel, étant entendu que le coût additionnel d'acquisition du Code Source ne devra pas excéder le simple coût de transfert des données. + +5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE + +Lorsque le Licencié apporte une Contribution au Logiciel, le Logiciel Modifié peut être distribué sous un contrat de licence autre que le présent Contrat sous réserve du respect des dispositions de l'article 5.3.4. + +5.3.3 DISTRIBUTION DES MODULES EXTERNES + +Lorsque le Licencié a développé un Module Externe les conditions du Contrat ne s'appliquent pas à ce Module Externe, qui peut être distribué sous un contrat de licence différent. + +5.3.4 CITATIONS + +Le Licencié qui distribue un Logiciel Modifié s'engage expressément: + +à indiquer dans sa documentation qu'il a été réalisé à partir du Logiciel régi par le Contrat, en reproduisant les mentions de propriété intellectuelle du Logiciel, + +à faire en sorte que l'utilisation du Logiciel, ses mentions de propriété intellectuelle et le fait qu'il est régi par le Contrat soient indiqués dans un texte facilement accessible depuis l'interface du Logiciel Modifié, + +à mentionner, sur un site Web librement accessible décrivant le Logiciel Modifié, et pendant au moins toute la durée de sa distribution, qu'il a été réalisé à partir du Logiciel régi par le Contrat, en reproduisant les mentions de propriété intellectuelle du Logiciel, + +lorsqu'il le distribue à un tiers susceptible de distribuer lui-même un Logiciel Modifié, sans avoir à en distribuer le code source, à faire ses meilleurs efforts pour que les obligations du présent article 5.3.4 soient reprises par le dit tiers. + +Lorsque le Logiciel modifié ou non est distribué avec un Module Externe qui a été conçu pour l'utiliser, le Licencié doit soumettre le dit Module Externe aux obligations précédentes. + +5.3.5 COMPATIBILITE AVEC LES LICENCES CeCILL et CeCILL-C + +Lorsqu'un Logiciel Modifié contient une Contribution soumise au contrat de licence CeCILL, les stipulations prévues à l'article 5.3.4 sont facultatives. + +Un Logiciel Modifié peut être distribué sous le contrat de licence CeCILL-C. Les stipulations prévues à l'article 5.3.4 sont alors facultatives. + +Article 6 - PROPRIETE INTELLECTUELLE + +6.1 SUR LE LOGICIEL INITIAL + +Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel Initial. Toute utilisation du Logiciel Initial est soumise au respect des conditions dans lesquelles le Titulaire a choisi de diffuser son oeuvre et nul autre n'a la faculté de modifier les conditions de diffusion de ce Logiciel Initial. + +Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi par le Contrat et ce, pour la durée visée à l'article 4.2. + +6.2 SUR LES CONTRIBUTIONS + +Le Licencié qui a développé une Contribution est titulaire sur celle-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable. + +6.3 SUR LES MODULES EXTERNES + +Le Licencié qui a développé un Module Externe est titulaire sur celui-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable et reste libre du choix du contrat régissant sa diffusion. + +6.4 DISPOSITIONS COMMUNES + +Le Licencié s'engage expressément: + +à ne pas supprimer ou modifier de quelque manière que ce soit les mentions de propriété intellectuelle apposées sur le Logiciel; + +à reproduire à l'identique lesdites mentions de propriété intellectuelle sur les copies du Logiciel modifié ou non. + +Le Licencié s'engage à ne pas porter atteinte, directement ou indirectement, aux droits de propriété intellectuelle du Titulaire et/ou des Contributeurs sur le Logiciel et à prendre, le cas échéant, à l'égard de son personnel toutes les mesures nécessaires pour assurer le respect des dits droits de propriété intellectuelle du Titulaire et/ou des Contributeurs. + +Article 7 - SERVICES ASSOCIES + +7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de prestations d'assistance technique ou de maintenance du Logiciel. + +Cependant le Concédant reste libre de proposer ce type de services. Les termes et conditions d'une telle assistance technique et/ou d'une telle maintenance seront alors déterminés dans un acte séparé. Ces actes de maintenance et/ou assistance technique n'engageront que la seule responsabilité du Concédant qui les propose. + +7.2 De même, tout Concédant est libre de proposer, sous sa seule responsabilité, à ses licenciés une garantie, qui n'engagera que lui, lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, dans les conditions qu'il souhaite. Cette garantie et les modalités financières de son application feront l'objet d'un acte séparé entre le Concédant et le Licencié. + +Article 8 - RESPONSABILITE + +8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la faculté, sous réserve de prouver la faute du Concédant concerné, de solliciter la réparation du préjudice direct qu'il subirait du fait du Logiciel et dont il apportera la preuve. + +8.2 La responsabilité du Concédant est limitée aux engagements pris en application du Contrat et ne saurait être engagée en raison notamment: (i) des dommages dus à l'inexécution, totale ou partielle, de ses obligations par le Licencié, (ii) des dommages directs ou indirects découlant de l'utilisation ou des performances du Logiciel subis par le Licencié et (iii) plus généralement d'un quelconque dommage indirect. En particulier, les Parties conviennent expressément que tout préjudice financier ou commercial (par exemple perte de données, perte de bénéfices, perte d'exploitation, perte de clientèle ou de commandes, manque à gagner, trouble commercial quelconque) ou toute action dirigée contre le Licencié par un tiers, constitue un dommage indirect et n'ouvre pas droit à réparation par le Concédant. + +Article 9 - GARANTIE + +9.1 Le Licencié reconnaît que l'état actuel des connaissances scientifiques et techniques au moment de la mise en circulation du Logiciel ne permet pas d'en tester et d'en vérifier toutes les utilisations ni de détecter l'existence d'éventuels défauts. L'attention du Licencié a été attirée sur ce point sur les risques associés au chargement, à l'utilisation, la modification et/ou au développement et à la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. + +Il relève de la responsabilité du Licencié de contrôler, par tous moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. + +9.2 Le Concédant déclare de bonne foi être en droit de concéder l'ensemble des droits attachés au Logiciel (comprenant notamment les droits visés à l'article 5). + +9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le Concédant sans autre garantie, expresse ou tacite, que celle prévue à l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, son caractère sécurisé, innovant ou pertinent. + +En particulier, le Concédant ne garantit pas que le Logiciel est exempt d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible avec l'équipement du Licencié et sa configuration logicielle ni qu'il remplira les besoins du Licencié. + +9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le Logiciel ne porte pas atteinte à un quelconque droit de propriété intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout autre droit de propriété. Ainsi, le Concédant exclut toute garantie au profit du Licencié contre les actions en contrefaçon qui pourraient être diligentées au titre de l'utilisation, de la modification, et de la redistribution du Logiciel. Néanmoins, si de telles actions sont exercées contre le Licencié, le Concédant lui apportera son aide technique et juridique pour sa défense. Cette aide technique et juridique est déterminée au cas par cas entre le Concédant concerné et le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage toute responsabilité quant à l'utilisation de la dénomination du Logiciel par le Licencié. Aucune garantie n'est apportée quant à l'existence de droits antérieurs sur le nom du Logiciel et sur l'existence d'une marque. + +Article 10 - RESILIATION + +10.1 En cas de manquement par le Licencié aux obligations mises à sa charge par le Contrat, le Concédant pourra résilier de plein droit le Contrat trente (30) jours après notification adressée au Licencié et restée sans effet. + +10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les licences qu'il aura concédées antérieurement à la résiliation du Contrat resteront valides sous réserve qu'elles aient été effectuées en conformité avec le Contrat. + +Article 11 - DISPOSITIONS DIVERSES + +11.1 CAUSE EXTERIEURE + +Aucune des Parties ne sera responsable d'un retard ou d'une défaillance d'exécution du Contrat qui serait dû à un cas de force majeure, un cas fortuit ou une cause extérieure, telle que, notamment, le mauvais fonctionnement ou les interruptions du réseau électrique ou de télécommunication, la paralysie du réseau liée à une attaque informatique, l'intervention des autorités gouvernementales, les catastrophes naturelles, les dégâts des eaux, les tremblements de terre, le feu, les explosions, les grèves et les conflits sociaux, l'état de guerre... + +11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du Contrat, ne pourra en aucun cas impliquer renonciation par la Partie intéressée à s'en prévaloir ultérieurement. + +11.3 Le Contrat annule et remplace toute convention antérieure, écrite ou orale, entre les Parties sur le même objet et constitue l'accord entier entre les Parties sur cet objet. Aucune addition ou modification aux termes du Contrat n'aura d'effet à l'égard des Parties à moins d'être faite par écrit et signée par leurs représentants dûment habilités. + +11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat s'avèrerait contraire à une loi ou à un texte applicable, existants ou futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les amendements nécessaires pour se conformer à cette loi ou à ce texte. Toutes les autres dispositions resteront en vigueur. De même, la nullité, pour quelque raison que ce soit, d'une des dispositions du Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. + +11.5 LANGUE + +Le Contrat est rédigé en langue française et en langue anglaise, ces deux versions faisant également foi. + +Article 12 - NOUVELLES VERSIONS DU CONTRAT + +12.1 Toute personne est autorisée à copier et distribuer des copies de ce Contrat. + +12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé et ne peut être modifié que par les auteurs de la licence, lesquels se réservent le droit de publier périodiquement des mises à jour ou de nouvelles versions du Contrat, qui posséderont chacune un numéro distinct. Ces versions ultérieures seront susceptibles de prendre en compte de nouvelles problématiques rencontrées par les logiciels libres. + +12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra faire l'objet d'une diffusion ultérieure que sous la même version du Contrat ou une version postérieure. + +Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE + +13.1 Le Contrat est régi par la loi française. Les Parties conviennent de tenter de régler à l'amiable les différends ou litiges qui viendraient à se produire par suite ou à l'occasion du Contrat. + +13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter de leur survenance et sauf situation relevant d'une procédure d'urgence, les différends ou litiges seront portés par la Partie la plus diligente devant les Tribunaux compétents de Paris. + +1 CeCILL est pour Ce(a) C(nrs) I(nria) L(ogiciel) L(ibre) + +Version 1.0 du 2006-09-05. \ No newline at end of file diff --git a/options/license/CECILL-C b/options/license/CECILL-C new file mode 100644 index 0000000..143e50d --- /dev/null +++ b/options/license/CECILL-C @@ -0,0 +1,239 @@ +CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-C + +Avertissement + +Ce contrat est une licence de logiciel libre issue d'une concertation entre ses auteurs afin que le respect de deux grands principes préside à sa rédaction: + +d'une part, le respect des principes de diffusion des logiciels libres: accès au code source, droits étendus conférés aux utilisateurs, +d'autre part, la désignation d'un droit applicable, le droit français, auquel elle est conforme, tant au regard du droit de la responsabilité civile que du droit de la propriété intellectuelle et de la protection qu'il offre aux auteurs et titulaires des droits patrimoniaux sur un logiciel. +Les auteurs de la licence CeCILL-C1 sont: + +Commissariat à l'Energie Atomique - CEA, établissement public de recherche à caractère scientifique, technique et industriel, dont le siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. + +Centre National de la Recherche Scientifique - CNRS, établissement public à caractère scientifique et technologique, dont le siège est situé 3 rue Michel-Ange, 75794 Paris cedex 16. + +Institut National de Recherche en Informatique et en Automatique - INRIA, établissement public à caractère scientifique et technologique, dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 Le Chesnay cedex. + +Préambule + +Ce contrat est une licence de logiciel libre dont l'objectif est de conférer aux utilisateurs la liberté de modifier et de réutiliser le logiciel régi par cette licence. + +L'exercice de cette liberté est assorti d'une obligation de remettre à la disposition de la communauté les modifications apportées au code source du logiciel afin de contribuer à son évolution. + +L'accessibilité au code source et les droits de copie, de modification et de redistribution qui découlent de ce contrat ont pour contrepartie de n'offrir aux utilisateurs qu'une garantie limitée et de ne faire peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et les concédants successifs qu'une responsabilité restreinte. + +A cet égard l'attention de l'utilisateur est attirée sur les risques associés au chargement, à l'utilisation, à la modification et/ou au développement et à la reproduction du logiciel par l'utilisateur étant donné sa spécificité de logiciel libre, qui peut le rendre complexe à manipuler et qui le réserve donc à des développeurs ou des professionnels avertis possédant des connaissances informatiques approfondies. Les utilisateurs sont donc invités à charger et tester l'adéquation du logiciel à leurs besoins dans des conditions permettant d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus généralement, à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. Ce contrat peut être reproduit et diffusé librement, sous réserve de le conserver en l'état, sans ajout ni suppression de clauses. + +Ce contrat est susceptible de s'appliquer à tout logiciel dont le titulaire des droits patrimoniaux décide de soumettre l'exploitation aux dispositions qu'il contient. + +Article 1 - DEFINITIONS + +Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une lettre capitale, auront la signification suivante: + +Contrat: désigne le présent contrat de licence, ses éventuelles versions postérieures et annexes. + +Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code Source et le cas échéant sa documentation, dans leur état au moment de l'acceptation du Contrat par le Licencié. + +Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et éventuellement de Code Objet et le cas échéant sa documentation, dans leur état au moment de leur première diffusion sous les termes du Contrat. + +Logiciel Modifié: désigne le Logiciel modifié par au moins une Contribution Intégrée. + +Code Source: désigne l'ensemble des instructions et des lignes de programme du Logiciel et auquel l'accès est nécessaire en vue de modifier le Logiciel. + +Code Objet: désigne les fichiers binaires issus de la compilation du Code Source. + +Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur sur le Logiciel Initial. + +Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le Contrat. + +Contributeur: désigne le Licencié auteur d'au moins une Contribution Intégrée. + +Concédant: désigne le Titulaire ou toute personne physique ou morale distribuant le Logiciel sous le Contrat. + +Contribution Intégrée: désigne l'ensemble des modifications, corrections, traductions, adaptations et/ou nouvelles fonctionnalités intégrées dans le Code Source par tout Contributeur. + +Module Lié: désigne un ensemble de fichiers sources y compris leur documentation qui, sans modification du Code Source, permet de réaliser des fonctionnalités ou services supplémentaires à ceux fournis par le Logiciel. + +Logiciel Dérivé: désigne toute combinaison du Logiciel, modifié ou non, et d'un Module Lié. + +Parties: désigne collectivement le Licencié et le Concédant. + +Ces termes s'entendent au singulier comme au pluriel. + +Article 2 - OBJET + +Le Contrat a pour objet la concession par le Concédant au Licencié d'une licence non exclusive, cessible et mondiale du Logiciel telle que définie ci-après à l'article 5 pour toute la durée de protection des droits portant sur ce Logiciel. + +Article 3 - ACCEPTATION + +3.1 L'acceptation par le Licencié des termes du Contrat est réputée acquise du fait du premier des faits suivants: + +(i) le chargement du Logiciel par tout moyen notamment par téléchargement à partir d'un serveur distant ou par chargement à partir d'un support physique; +(ii) le premier exercice par le Licencié de l'un quelconque des droits concédés par le Contrat. +3.2 Un exemplaire du Contrat, contenant notamment un avertissement relatif aux spécificités du Logiciel, à la restriction de garantie et à la limitation à un usage par des utilisateurs expérimentés a été mis à disposition du Licencié préalablement à son acceptation telle que définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris connaissance. + +Article 4 - ENTREE EN VIGUEUR ET DUREE + +4.1 ENTREE EN VIGUEUR + +Le Contrat entre en vigueur à la date de son acceptation par le Licencié telle que définie en 3.1. + +4.2 DUREE + +Le Contrat produira ses effets pendant toute la durée légale de protection des droits patrimoniaux portant sur le Logiciel. + +Article 5 - ETENDUE DES DROITS CONCEDES + +Le Concédant concède au Licencié, qui accepte, les droits suivants sur le Logiciel pour toutes destinations et pour la durée du Contrat dans les conditions ci-après détaillées. + +Par ailleurs, si le Concédant détient ou venait à détenir un ou plusieurs brevets d'invention protégeant tout ou partie des fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas opposer les éventuels droits conférés par ces brevets aux Licenciés successifs qui utiliseraient, exploiteraient ou modifieraient le Logiciel. En cas de cession de ces brevets, le Concédant s'engage à faire reprendre les obligations du présent alinéa aux cessionnaires. + +5.1 DROIT D'UTILISATION + +Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant aux domaines d'application, étant ci-après précisé que cela comporte: + +la reproduction permanente ou provisoire du Logiciel en tout ou partie par tout moyen et sous toute forme. + +le chargement, l'affichage, l'exécution, ou le stockage du Logiciel sur tout support. + +la possibilité d'en observer, d'en étudier, ou d'en tester le fonctionnement afin de déterminer les idées et principes qui sont à la base de n'importe quel élément de ce Logiciel; et ceci, lorsque le Licencié effectue toute opération de chargement, d'affichage, d'exécution, de transmission ou de stockage du Logiciel qu'il est en droit d'effectuer en vertu du Contrat. + +5.2 DROIT DE MODIFICATION + +Le droit de modification comporte le droit de traduire, d'adapter, d'arranger ou d'apporter toute autre modification au Logiciel et le droit de reproduire le logiciel en résultant. Il comprend en particulier le droit de créer un Logiciel Dérivé. + +Le Licencié est autorisé à apporter toute modification au Logiciel sous réserve de mentionner, de façon explicite, son nom en tant qu'auteur de cette modification et la date de création de celle-ci. + +5.3 DROIT DE DISTRIBUTION + +Le droit de distribution comporte notamment le droit de diffuser, de transmettre et de communiquer le Logiciel au public sur tout support et par tout moyen ainsi que le droit de mettre sur le marché à titre onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. + +Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou non, à des tiers dans les conditions ci-après détaillées. + +5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION + +Le Licencié est autorisé à distribuer des copies conformes du Logiciel, sous forme de Code Source ou de Code Objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: + +d'un exemplaire du Contrat, + +d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, + +et que, dans le cas où seul le Code Objet du Logiciel est redistribué, le Licencié permette un accès effectif au Code Source complet du Logiciel pendant au moins toute la durée de sa distribution du Logiciel, étant entendu que le coût additionnel d'acquisition du Code Source ne devra pas excéder le simple coût de transfert des données. + +5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE + +Lorsque le Licencié apporte une Contribution Intégrée au Logiciel, les conditions de distribution du Logiciel Modifié en résultant sont alors soumises à l'intégralité des dispositions du Contrat. + +Le Licencié est autorisé à distribuer le Logiciel Modifié sous forme de code source ou de code objet, à condition que cette distribution respecte les dispositions du Contrat dans leur totalité et soit accompagnée: + +d'un exemplaire du Contrat, + +d'un avertissement relatif à la restriction de garantie et de responsabilité du Concédant telle que prévue aux articles 8 et 9, + +et que, dans le cas où seul le code objet du Logiciel Modifié est redistribué, le Licencié permette un accès effectif à son code source complet pendant au moins toute la durée de sa distribution du Logiciel Modifié, étant entendu que le coût additionnel d'acquisition du code source ne devra pas excéder le simple coût de transfert des données. + +5.3.3 DISTRIBUTION DU LOGICIEL DERIVE + +Lorsque le Licencié crée un Logiciel Dérivé, ce Logiciel Dérivé peut être distribué sous un contrat de licence autre que le présent Contrat à condition de respecter les obligations de mention des droits sur le Logiciel telles que définies à l'article 6.4. Dans le cas où la création du Logiciel Dérivé a nécessité une modification du Code Source le licencié s'engage à ce que: + +le Logiciel Modifié correspondant à cette modification soit régi par le présent Contrat, +les Contributions Intégrées dont le Logiciel Modifié résulte soient clairement identifiées et documentées, +le Licencié permette un accès effectif au code source du Logiciel Modifié, pendant au moins toute la durée de la distribution du Logiciel Dérivé, de telle sorte que ces modifications puissent être reprises dans une version ultérieure du Logiciel, étant entendu que le coût additionnel d'acquisition du code source du Logiciel Modifié ne devra pas excéder le simple coût du transfert des données. +5.3.4 COMPATIBILITE AVEC LA LICENCE CeCILL + +Lorsqu'un Logiciel Modifié contient une Contribution Intégrée soumise au contrat de licence CeCILL, ou lorsqu'un Logiciel Dérivé contient un Module Lié soumis au contrat de licence CeCILL, les stipulations prévues au troisième item de l'article 6.4 sont facultatives. + +Article 6 - PROPRIETE INTELLECTUELLE + +6.1 SUR LE LOGICIEL INITIAL + +Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel Initial. Toute utilisation du Logiciel Initial est soumise au respect des conditions dans lesquelles le Titulaire a choisi de diffuser son oeuvre et nul autre n'a la faculté de modifier les conditions de diffusion de ce Logiciel Initial. + +Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi par le Contrat et ce, pour la durée visée à l'article 4.2. + +6.2 SUR LES CONTRIBUTIONS INTEGREES + +Le Licencié qui a développé une Contribution Intégrée est titulaire sur celle-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable. + +6.3 SUR LES MODULES LIES + +Le Licencié qui a développé un Module Lié est titulaire sur celui-ci des droits de propriété intellectuelle dans les conditions définies par la législation applicable et reste libre du choix du contrat régissant sa diffusion dans les conditions définies à l'article 5.3.3. + +6.4 MENTIONS DES DROITS + +Le Licencié s'engage expressément: + +à ne pas supprimer ou modifier de quelque manière que ce soit les mentions de propriété intellectuelle apposées sur le Logiciel; + +à reproduire à l'identique lesdites mentions de propriété intellectuelle sur les copies du Logiciel modifié ou non; + +à faire en sorte que l'utilisation du Logiciel, ses mentions de propriété intellectuelle et le fait qu'il est régi par le Contrat soient indiqués dans un texte facilement accessible notamment depuis l'interface de tout Logiciel Dérivé. +Le Licencié s'engage à ne pas porter atteinte, directement ou indirectement, aux droits de propriété intellectuelle du Titulaire et/ou des Contributeurs sur le Logiciel et à prendre, le cas échéant, à l'égard de son personnel toutes les mesures nécessaires pour assurer le respect des dits droits de propriété intellectuelle du Titulaire et/ou des Contributeurs. + +Article 7 - SERVICES ASSOCIES + +7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de prestations d'assistance technique ou de maintenance du Logiciel. + +Cependant le Concédant reste libre de proposer ce type de services. Les termes et conditions d'une telle assistance technique et/ou d'une telle maintenance seront alors déterminés dans un acte séparé. Ces actes de maintenance et/ou assistance technique n'engageront que la seule responsabilité du Concédant qui les propose. + +7.2 De même, tout Concédant est libre de proposer, sous sa seule responsabilité, à ses licenciés une garantie, qui n'engagera que lui, lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, dans les conditions qu'il souhaite. Cette garantie et les modalités financières de son application feront l'objet d'un acte séparé entre le Concédant et le Licencié. + +Article 8 - RESPONSABILITE + +8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la faculté, sous réserve de prouver la faute du Concédant concerné, de solliciter la réparation du préjudice direct qu'il subirait du fait du Logiciel et dont il apportera la preuve. + +8.2 La responsabilité du Concédant est limitée aux engagements pris en application du Contrat et ne saurait être engagée en raison notamment: (i) des dommages dus à l'inexécution, totale ou partielle, de ses obligations par le Licencié, (ii) des dommages directs ou indirects découlant de l'utilisation ou des performances du Logiciel subis par le Licencié et (iii) plus généralement d'un quelconque dommage indirect. En particulier, les Parties conviennent expressément que tout préjudice financier ou commercial (par exemple perte de données, perte de bénéfices, perte d'exploitation, perte de clientèle ou de commandes, manque à gagner, trouble commercial quelconque) ou toute action dirigée contre le Licencié par un tiers, constitue un dommage indirect et n'ouvre pas droit à réparation par le Concédant. + +Article 9 - GARANTIE + +9.1 Le Licencié reconnaît que l'état actuel des connaissances scientifiques et techniques au moment de la mise en circulation du Logiciel ne permet pas d'en tester et d'en vérifier toutes les utilisations ni de détecter l'existence d'éventuels défauts. L'attention du Licencié a été attirée sur ce point sur les risques associés au chargement, à l'utilisation, la modification et/ou au développement et à la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. + +Il relève de la responsabilité du Licencié de contrôler, par tous moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. + +9.2 Le Concédant déclare de bonne foi être en droit de concéder l'ensemble des droits attachés au Logiciel (comprenant notamment les droits visés à l'article 5). + +9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le Concédant sans autre garantie, expresse ou tacite, que celle prévue à l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, son caractère sécurisé, innovant ou pertinent. + +En particulier, le Concédant ne garantit pas que le Logiciel est exempt d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible avec l'équipement du Licencié et sa configuration logicielle ni qu'il remplira les besoins du Licencié. + +9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le Logiciel ne porte pas atteinte à un quelconque droit de propriété intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout autre droit de propriété. Ainsi, le Concédant exclut toute garantie au profit du Licencié contre les actions en contrefaçon qui pourraient être diligentées au titre de l'utilisation, de la modification, et de la redistribution du Logiciel. Néanmoins, si de telles actions sont exercées contre le Licencié, le Concédant lui apportera son aide technique et juridique pour sa défense. Cette aide technique et juridique est déterminée au cas par cas entre le Concédant concerné et le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage toute responsabilité quant à l'utilisation de la dénomination du Logiciel par le Licencié. Aucune garantie n'est apportée quant à l'existence de droits antérieurs sur le nom du Logiciel et sur l'existence d'une marque. + +Article 10 - RESILIATION + +10.1 En cas de manquement par le Licencié aux obligations mises à sa charge par le Contrat, le Concédant pourra résilier de plein droit le Contrat trente (30) jours après notification adressée au Licencié et restée sans effet. + +10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les licences qu'il aura concédées antérieurement à la résiliation du Contrat resteront valides sous réserve qu'elles aient été effectuées en conformité avec le Contrat. + +Article 11 - DISPOSITIONS DIVERSES + +11.1 CAUSE EXTERIEURE + +Aucune des Parties ne sera responsable d'un retard ou d'une défaillance d'exécution du Contrat qui serait dû à un cas de force majeure, un cas fortuit ou une cause extérieure, telle que, notamment, le mauvais fonctionnement ou les interruptions du réseau électrique ou de télécommunication, la paralysie du réseau liée à une attaque informatique, l'intervention des autorités gouvernementales, les catastrophes naturelles, les dégâts des eaux, les tremblements de terre, le feu, les explosions, les grèves et les conflits sociaux, l'état de guerre... + +11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du Contrat, ne pourra en aucun cas impliquer renonciation par la Partie intéressée à s'en prévaloir ultérieurement. + +11.3 Le Contrat annule et remplace toute convention antérieure, écrite ou orale, entre les Parties sur le même objet et constitue l'accord entier entre les Parties sur cet objet. Aucune addition ou modification aux termes du Contrat n'aura d'effet à l'égard des Parties à moins d'être faite par écrit et signée par leurs représentants dûment habilités. + +11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat s'avèrerait contraire à une loi ou à un texte applicable, existants ou futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les amendements nécessaires pour se conformer à cette loi ou à ce texte. Toutes les autres dispositions resteront en vigueur. De même, la nullité, pour quelque raison que ce soit, d'une des dispositions du Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. + +11.5 LANGUE + +Le Contrat est rédigé en langue française et en langue anglaise, ces deux versions faisant également foi. + +Article 12 - NOUVELLES VERSIONS DU CONTRAT + +12.1 Toute personne est autorisée à copier et distribuer des copies de ce Contrat. + +12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé et ne peut être modifié que par les auteurs de la licence, lesquels se réservent le droit de publier périodiquement des mises à jour ou de nouvelles versions du Contrat, qui posséderont chacune un numéro distinct. Ces versions ultérieures seront susceptibles de prendre en compte de nouvelles problématiques rencontrées par les logiciels libres. + +12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra faire l'objet d'une diffusion ultérieure que sous la même version du Contrat ou une version postérieure. + +Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE + +13.1 Le Contrat est régi par la loi française. Les Parties conviennent de tenter de régler à l'amiable les différends ou litiges qui viendraient à se produire par suite ou à l'occasion du Contrat. + +13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter de leur survenance et sauf situation relevant d'une procédure d'urgence, les différends ou litiges seront portés par la Partie la plus diligente devant les Tribunaux compétents de Paris. + +1 CeCILL est pour Ce(a) C(nrs) I(nria) L(ogiciel) L(ibre) + +Version 1.0 du 2006-09-05. \ No newline at end of file diff --git a/options/license/CNRI-Jython b/options/license/CNRI-Jython new file mode 100644 index 0000000..7529387 --- /dev/null +++ b/options/license/CNRI-Jython @@ -0,0 +1,10 @@ + +1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and using JPython version 1.1.x in source or binary form and its associated documentation as provided herein ("Software").
 +2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a non-exclusive, non-transferable, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use the Software alone or in any derivative version, provided, however, that CNRI's License Agreement and CNRI's notice of copyright, i.e., “Copyright (c) 1996-1999 Corporation for National Research Initiatives; All Rights Reserved” are both retained in the Software, alone or in any derivative version prepared by Licensee.
Alternatively, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes), provided, however, that such text is displayed prominently in the Software alone or in any derivative version prepared by Licensee: “JPython (Version 1.1.x) is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1006. The License may also be obtained from a proxy server on the Web using the following URL: http://hdl.handle.net/1895.22/1006.”
 +3. In the event Licensee prepares a derivative work that is based on or incorporates the Software or any part thereof, and wants to make the derivative work available to the public as provided herein, then Licensee hereby agrees to indicate in any such work, in a prominently visible way, the nature of the modifications made to CNRI's Software.
 +4. Licensee may not use CNRI trademarks or trade name, including JPython or CNRI, in a trademark sense to endorse or promote products or services of Licensee, or any third party. Licensee may use the mark JPython in connection with Licensee's derivative versions that are based on or incorporate the Software, but only in the form “JPython-based ___________________,” or equivalent.
 +5. CNRI is making the Software available to Licensee on an “AS IS” basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
 +6. CNRI SHALL NOT BE LIABLE TO LICENSEE OR OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. SOME STATES DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY SO THE ABOVE DISCLAIMER MAY NOT APPLY TO LICENSEE.
 +7. This License Agreement may be terminated by CNRI (i) immediately upon written notice from CNRI of any material breach by the Licensee, if the nature of the breach is such that it cannot be promptly remedied; or (ii) sixty (60) days following notice from CNRI to Licensee of a material remediable breach, if Licensee has not remedied such breach within that sixty-day period.
 +8. This License Agreement shall be governed by and interpreted in all respects by the law of the State of Virginia, excluding conflict of law provisions. Nothing in this Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between CNRI and Licensee.
 +9. By clicking on the "ACCEPT" button where indicated, or by installing, copying or otherwise using the Software, Licensee agrees to be bound by the terms and conditions of this License Agreement.


 diff --git a/options/license/CNRI-Python b/options/license/CNRI-Python new file mode 100644 index 0000000..da7dad3 --- /dev/null +++ b/options/license/CNRI-Python @@ -0,0 +1,25 @@ +CNRI OPEN SOURCE LICENSE AGREEMENT + +IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY. + +BY CLICKING ON "ACCEPT" WHERE INDICATED BELOW, OR BY COPYING, INSTALLING OR OTHERWISE USING PYTHON 1.6, beta 1 SOFTWARE, YOU ARE DEEMED TO HAVE AGREED TO THE TERMS AND CONDITIONS OF THIS LICENSE AGREEMENT. + +1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 1.6, beta 1 software in source or binary form and its associated documentation, as released at the www.python.org Internet site on August 4, 2000 ("Python 1.6b1"). + +2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6b1 alone or in any derivative version, provided, however, that CNRIs License Agreement is retained in Python 1.6b1, alone or in any derivative version prepared by Licensee. + +Alternately, in lieu of CNRIs License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6, beta 1, is made available subject to the terms and conditions in CNRIs License Agreement. This Agreement may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1011. This Agreement may also be obtained from a proxy server on the Internet using the URL:http://hdl.handle.net/1895.22/1011". + +3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6b1 or any part thereof, and wants to make the derivative work available to the public as provided herein, then Licensee hereby agrees to indicate in any such work the nature of the modifications made to Python 1.6b1. + +4. CNRI is making Python 1.6b1 available to Licensee on an "AS IS" basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6b1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING PYTHON 1.6b1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. + +7. This License Agreement shall be governed by and interpreted in all respects by the law of the State of Virginia, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between CNRI and Licensee. This License Agreement does not grant permission to use CNRI trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, installing or otherwise using Python 1.6b1, Licensee agrees to be bound by the terms and conditions of this License Agreement. + +ACCEPT \ No newline at end of file diff --git a/options/license/CNRI-Python-GPL-Compatible b/options/license/CNRI-Python-GPL-Compatible new file mode 100644 index 0000000..2754c70 --- /dev/null +++ b/options/license/CNRI-Python-GPL-Compatible @@ -0,0 +1,23 @@ +CNRI OPEN SOURCE GPL-COMPATIBLE LICENSE AGREEMENT + +IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY. + +BY CLICKING ON "ACCEPT" WHERE INDICATED BELOW, OR BY COPYING, INSTALLING OR OTHERWISE USING PYTHON 1.6.1 SOFTWARE, YOU ARE DEEMED TO HAVE AGREED TO THE TERMS AND CONDITIONS OF THIS LICENSE AGREEMENT. + +1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 1.6.1 software in source or binary form and its associated documentation. + +2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6.1 alone or in any derivative version, provided, however, that CNRI's License Agreement and CNRI's notice of copyright, i.e., "Copyright © 1995-2001 Corporation for National Research Initiatives; All Rights Reserved" are retained in Python 1.6.1 alone or in any derivative version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with Python 1.6.1 may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This Agreement may also be obtained from a proxy server on the Internet using the following URL: http://hdl.handle.net/1895.22/1013". + +3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 1.6.1. + +4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + +5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + +6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. + +7. This License Agreement shall be governed by the federal intellectual property law of the United States, including without limitation the federal copyright law, and, to the extent such U.S. federal law does not apply, by the law of the Commonwealth of Virginia, excluding Virginia's conflict of law provisions. Notwithstanding the foregoing, with regard to derivative works based on Python 1.6.1 that incorporate non-separable material that was previously distributed under the GNU General Public License (GPL), the law of the Commonwealth of Virginia shall govern this License Agreement only as to issues arising under or with respect to Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between CNRI and Licensee. This License Agreement does not grant permission to use CNRI trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. + +8. By clicking on the "ACCEPT" button where indicated, or by copying, installing or otherwise using Python 1.6.1, Licensee agrees to be bound by the terms and conditions of this License Agreement. + +ACCEPT diff --git a/options/license/CPAL-1.0 b/options/license/CPAL-1.0 new file mode 100644 index 0000000..596c996 --- /dev/null +++ b/options/license/CPAL-1.0 @@ -0,0 +1,172 @@ +Common Public Attribution License Version 1.0 (CPAL) + +1. “Definitions” + +1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + +1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + +1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + +1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + +1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + +1.5 “Executable” means Covered Code in any form other than Source Code. + +1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + +1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + +1.8 “License” means this document. + +1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + +1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + +A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + +B. Any new file that contains any part of the Original Code or previous Modifications. + +1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + +1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + +1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + +1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + +2.1 The Initial Developer Grant. +The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + +2.2 Contributor Grant. +Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + +3.1 Application of License. +The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + +3.2 Availability of Source Code. +Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + +3.3 Description of Modifications. +You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + +3.4 Intellectual Property Matters + + (a) Third Party Claims. If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs. If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + + (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + +3.5 Required Notices. +You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + +3.6 Distribution of Executable Versions. +You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + +3.7 Larger Works. +You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + +6.1 New Versions. +Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + +6.2 Effect of New Versions. +Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + +6.3 Derivative Works. +If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY. +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + +8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + +8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + +8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. +The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS. +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS. +As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. +Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + +15. ADDITIONAL TERM: NETWORK USE. +The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + +EXHIBIT A. Common Public Attribution License Version 1.0. + +“The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at _____________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. +Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. +The Original Code is______________________. +The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. +The Initial Developer of the Original Code is ____________. All portions of the code written by ___________ are Copyright (c) _____. All Rights Reserved. +Contributor ______________________. +Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. +If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + +[NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + +EXHIBIT B. Attribution Information + +Attribution Copyright Notice: _______________________ +Attribution Phrase (not exceeding 10 words): _______________________ +Attribution URL: _______________________ +Graphic Image as provided in the Covered Code, if any. +Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/options/license/CPL-1.0 b/options/license/CPL-1.0 new file mode 100644 index 0000000..7732b21 --- /dev/null +++ b/options/license/CPL-1.0 @@ -0,0 +1,87 @@ +Common Public License Version 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + + i) changes to the Program, and + + ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + + c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + + d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + + i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + + ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + + iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + + iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + + b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. \ No newline at end of file diff --git a/options/license/CPOL-1.02 b/options/license/CPOL-1.02 new file mode 100644 index 0000000..8f0a750 --- /dev/null +++ b/options/license/CPOL-1.02 @@ -0,0 +1,98 @@ +The Code Project Open License (CPOL) 1.02 + +Preamble + +This License governs Your use of the Work. This License is intended to allow developers to use the Source Code and Executable Files provided as part of the Work in any application in any form. + +The main points subject to the terms of the License are: +- Source Code and Executable Files can be used in commercial applications; +- Source Code and Executable Files can be redistributed; and +- Source Code can be modified to create derivative works. +- No claim of suitability, guarantee, or any warranty whatsoever is provided. The software is provided "as-is". +- The Article accompanying the Work may not be distributed or republished without the Author's consent + +This License is entered between You, the individual or other entity reading or otherwise making use of the Work licensed pursuant to this License and the individual or other entity which offers the Work under the terms of this License ("Author"). + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. + +1. Definitions. + + a. "Articles" means, collectively, all articles written by Author which describes how the Source Code and Executable Files for the Work may be used by a user. + + b. "Author" means the individual or entity that offers the Work under the terms of this License. + + c. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works. + + d. "Executable Files" refer to the executables, binary files, configuration and any required data files included in the Work. + + e. "Publisher" means the provider of the website, magazine, CD-ROM, DVD or other medium from or by which the Work is obtained by You. + + f. "Source Code" refers to the collection of source code and configuration files used to create the Executable Files. + + g. "Standard Version" refers to such a Work if it has not been modified, or has been modified in accordance with the consent of the Author, such consent being in the full discretion of the Author. + + h. "Work" refers to the collection of files distributed by the Publisher, including the Source Code, Executable Files, binaries, data files, documentation, whitepapers and the Articles. + + i. "You" is you, an individual or entity wishing to use the Work and exercise your rights under this License. + +2. Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, limit, or restrict any rights arising from fair use, fair dealing, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, the Author hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. You may use the standard version of the Source Code or Executable Files in Your own applications. + + b. You may apply bug fixes, portability fixes and other modifications obtained from the Public Domain or from the Author. A Work modified in such a way shall still be considered the standard version and will be subject to this License. + + c. You may otherwise modify Your copy of this Work (excluding the Articles) in any way to create a Derivative Work, provided that You insert a prominent notice in each changed file stating how, when and where You changed that file. + + d. You may distribute the standard version of the Executable Files and Source Code or Derivative Work in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution. + + e. The Articles discussing the Work published in any form by the author may not be distributed or republished without the Author's consent. The author retains copyright to any such Articles. You may use the Executable Files and Source Code pursuant to this License but you may not repost or republish or otherwise distribute or make available the Articles, without the prior written consent of the Author. + +Any subroutines or modules supplied by You and linked into the Source Code or Executable Files of this Work shall not be considered part of this Work and will not be subject to the terms of this License. + +4. Patent License. Subject to the terms and conditions of this License, each Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, import, and otherwise transfer the Work. + +5. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You agree not to remove any of the original copyright, patent, trademark, and attribution notices and associated disclaimers that may appear in the Source Code or Executable Files. + + b. You agree not to advertise or in any way imply that this Work is a product of Your own. + + c. The name of the Author may not be used to endorse or promote products derived from the Work without the prior written consent of the Author. + + d. You agree not to sell, lease, or rent any part of the Work. This does not restrict you from including the Work or any part of the Work inside a larger software distribution that itself is being sold. The Work by itself, though, cannot be sold, leased or rented. + + e. You may distribute the Executable Files and Source Code only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy of the Executable Files or Source Code You distribute and ensure that anyone receiving such Executable Files and Source Code agrees that the terms of this License apply to such Executable Files and/or Source Code. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute the Executable Files or Source Code with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License. + + f. You agree not to use the Work for illegal, immoral or improper purposes, or on pages containing illegal, immoral or improper material. The Work is subject to applicable export laws. You agree to comply with all such laws and regulations that may apply to the Work after Your receipt of the Work. + +6. Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", "WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK (OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE WORKS. + +7. Indemnity. You agree to defend, indemnify and hold harmless the Author and the Publisher from and against any claims, suits, losses, damages, liabilities, costs, and expenses (including reasonable legal or attorneys' fees) resulting from or relating to any use of the Work by You. + +8. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +9. Termination. + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of any term of this License. Individuals or entities who have received Derivative Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of this License. + + b. If You bring a copyright, trademark, patent or any other infringement claim against any contributor over infringements You claim are made by the Work, your License from such contributor to the Work ends automatically. + + c. Subject to the above terms and conditions, this License is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, the Author reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +10. Publisher. The parties hereby confirm that the Publisher shall not, under any circumstances, be responsible for and shall not have any liability in respect of the subject matter of this License. The Publisher makes no warranty whatsoever in connection with the Work and shall not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. The Publisher reserves the right to cease making the Work available to You at any time without notice + +11. Miscellaneous + + a. This License shall be governed by the laws of the location of the head office of the Author or if the Author is an individual, the laws of location of the principal place of residence of the Author. + + b. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this License, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + c. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + + d. This License constitutes the entire agreement between the parties with respect to the Work licensed herein. There are no understandings, agreements or representations with respect to the Work not specified herein. The Author shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Author and You. diff --git a/options/license/Mozilla Public License 1.1 b/options/license/CUA-OPL-1.0 similarity index 60% rename from options/license/Mozilla Public License 1.1 rename to options/license/CUA-OPL-1.0 index 8118cfd..fc6bab8 100644 --- a/options/license/Mozilla Public License 1.1 +++ b/options/license/CUA-OPL-1.0 @@ -1,4 +1,5 @@ -Mozilla Public License Version 1.1 +CUA Office Public License Version 1.0 + 1. Definitions. 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. @@ -21,9 +22,11 @@ Mozilla Public License Version 1.1 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. -1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: -Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. -Any new file that contains any part of the Original Code or previous Modifications. +1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. @@ -37,17 +40,23 @@ Any new file that contains any part of the Original Code or previous Modificatio 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: -a. under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and -b. under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). -c. the licenses granted in this Section 2.1 (a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. -d. Notwithstanding Section 2.1 (b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license -a. under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and -b. under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). -c. the licenses granted in Sections 2.2 (a) and 2.2 (b) are effective on the date Contributor first makes Commercial Use of the Covered Code. -d. Notwithstanding Section 2.2 (b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 3. Distribution Obligations. @@ -59,84 +68,76 @@ d. Notwithstanding Section 2.2 (b) above, no patent license is granted: 1) for a 3.4. Intellectual Property Matters -(a) Third Party Claims -If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. -(b) Contributor APIs -If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. -(c) Representations. -Contributor represents that, except as disclosed pursuant to Section 3.4 (a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. -3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Sections 3.1, 3.2, 3.3, 3.4 and 3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. +3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. - If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. -5. Application of this License. +5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. 6. Versions of the License. -6.1. New Versions -Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. +6.1. New Versions. CUA Office Project may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. -6.2. Effect of New Versions -Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. +6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by CUA Office Project. No one other than CUA Office Project has the right to modify the terms applicable to Covered Code created under this License. -6.3. Derivative Works -If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) +6.3. Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "CUA Office", "CUA", "CUAPL", or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CUA Office Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) -7. DISCLAIMER OF WARRANTY +7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. -8. Termination +8. TERMINATION. 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: -a. such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. -b. any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. -9. LIMITATION OF LIABILITY +9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. -10. U.S. government end users +10. U.S. GOVERNMENT END USERS. The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. -11. Miscellaneous +11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. -12. Responsibility for claims +12. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. -13. Multiple-licensed code -Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the MPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. +13. MULTIPLE-LICENSED CODE. +Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the NPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. -Exhibit A - Mozilla Public License. +EXHIBIT A - CUA Office Public License. -"The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ +"The contents of this file are subject to the CUA Office Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://cuaoffice.sourceforge.net/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. -The Initial Developer of the Original Code is ________________________. -Portions created by ______________________ are Copyright (C) ______ -_______________________. All Rights Reserved. +The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________. -Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." +Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CUAPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CUAPL or the [___] License." -NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications. +[NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] \ No newline at end of file diff --git a/options/license/Caldera b/options/license/Caldera new file mode 100644 index 0000000..7e729a3 --- /dev/null +++ b/options/license/Caldera @@ -0,0 +1,25 @@ +Caldera International, Inc. hereby grants a fee free license that includes the rights use, modify and distribute this named source code, including creating derived binary products created from the source code. The source code for which Caldera International, Inc. grants rights are limited to the following UNIX Operating Systems that operate on the 16-Bit PDP-11 CPU and early versions of the 32-Bit UNIX Operating System, with specific exclusion of UNIX System III and UNIX System V and successor operating systems: + + 32-bit 32V UNIX + 16 bit UNIX Versions 1, 2, 3, 4, 5, 6, 7 + +Caldera International, Inc. makes no guarantees or commitments that any source code is available from Caldera +International, Inc. + +The following copyright notice applies to the source code files for which this license is granted. + +Copyright(C) Caldera International Inc. 2001-2002. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + Redistributions of source code and documentation must retain the above copyright notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + All advertising materials mentioning features or use of this software must display the following acknowledgement: +This product includes software developed or owned by Caldera International, Inc. + + Neither the name of Caldera International, Inc. nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/ClArtistic b/options/license/ClArtistic new file mode 100644 index 0000000..6901ee4 --- /dev/null +++ b/options/license/ClArtistic @@ -0,0 +1,61 @@ +The Clarified Artistic License + +Preamble + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Distribution fee" is a fee you charge for providing a copy of this Package to another party. + + "Freely Available" means that no fee is charged for the right to use the item, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain, or those made Freely Available, or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major network archive site allowing unrestricted access to them, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + e) permit and encourge anyone who receives a copy of the modified Package permission to make your modifications Freely Available in some specific way. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. + + b) accompany the distribution with the machine-readable source of the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + e) offer the machine-readable source of the Package, with your modifications, by mail order. + +5. You may charge a distribution fee for any distribution of this Package. If you offer support for this Package, you may charge any fee you choose for that support. You may not charge a license fee for the right to use this Package itself. You may distribute this Package in aggregate with other (possibly commercial and possibly nonfree) programs as part of a larger (possibly commercial and possibly nonfree) software distribution, and charge license fees for other parts of that software distribution, provided that you do not advertise this Package as a product of your own. If the Package includes an interpreter, You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. + +7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. + +8. Aggregation of the Standard Version of the Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. + +9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End \ No newline at end of file diff --git a/options/license/Condor-1.1 b/options/license/Condor-1.1 new file mode 100644 index 0000000..7c78eb8 --- /dev/null +++ b/options/license/Condor-1.1 @@ -0,0 +1,39 @@ +Condor Public License + +Version 1.1, October 30, 2003 + +Copyright © 1990-2006 Condor Team, Computer Sciences Department, University of Wisconsin-Madison, Madison, WI. All Rights Reserved. For more information contact: Condor Team, Attention: Professor Miron Livny, Dept of Computer Sciences, 1210 W. Dayton St., Madison, WI 53706-1685, (608) 262-0856 or miron@cs.wisc.edu. + +This software referred to as the Condor® Version 6.x software ("Software") was developed by the Condor Project, Condor Team, Computer Sciences Department, University of Wisconsin-Madison, under the authority of the Board of Regents of the University of Wisconsin System and includes voluntary contributions made to the Condor Project ("Copyright Holders and Contributors and the University"). For more information on the Condor Project, please see http://www.condorproject.org/. + +Installation, use, reproduction, display, modification and redistribution of this Software, with or without modification, in source and binary forms, are permitted. Any exercise of rights under this license including sublicenses by you is subject to the following conditions: + +1. Redistributions of this Software, with or without modification, must reproduce this Condor Public License in: (1) the Software, and (2) any user documentation or other similar material which is provided with the Software. + +2. Any user documentation included with a redistribution must include the following notice:
``This product includes software from the Condor® Project (http://www.condorproject.org/)"
Alternatively, if that is where third-party acknowledgments normally appear, this acknowledgment must be reproduced in the Software itself.
 +3. Any academic report, publication, or other academic disclosure of results obtained with this Software will acknowledge this Software's use by an appropriate citation. + +4. The name Condor® is a registered trademark of the University of Wisconsin-Madison. The trademark may not be used to endorse or promote software, or products derived therefrom, and, other than as required by section 2 and 3 above, it may not be affixed to modified redistributions of this Software without the prior written approval, obtainable via email to condor-admin@cs.wisc.edu. + +5. To the extent that patent claims licensable by the University of Wisconsin-Madison are necessarily infringed by the use or sale of the Software, you are granted a non-exclusive, worldwide, royalty- free perpetual license under such patent claims, with the rights for you to make, use, sell, offer to sell, import and otherwise transfer the Software in source code and object code form and derivative works. This patent license shall apply to the combination of the Software with other software if, at the time the Software is added by you, such addition of the Software causes such combination to be covered by such patent claims. This patent license shall not apply to any other combinations which include the Software. No hardware per se is licensed hereunder.If you or any subsequent sub-licensee (a ``Recipient") institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Software infringes such Recipient's patent(s), then such Recipient's rights granted (directly or indirectly) under the patent license above shall terminate as of the date such litigation is filed. All sublicenses to the Software which have been properly granted prior to termination shall survive any termination of said patent license, if not otherwise terminated pursuant to this section. + +6. DISCLAIMER +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AND THE UNIVERSITY "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, OF SATISFACTORY QUALITY, AND FITNESS FOR A PARTICULAR PURPOSE OR USE ARE DISCLAIMED. THE COPYRIGHT HOLDERS AND CONTRIBUTORS AND THE UNIVERSITY MAKE NO REPRESENTATION THAT THE SOFTWARE, MODIFICATIONS, ENHANCEMENTS OR DERIVATIVE WORKS THEREOF, WILL NOT INFRINGE ANY PATENT, COPYRIGHT, TRADEMARK, TRADE SECRET OR OTHER PROPRIETARY RIGHT.
 +7. LIMITATION OF LIABILITY +THE COPYRIGHT HOLDERS AND CONTRIBUTORS AND ANY OTHER OFFICER, AGENT, OR EMPLOYEE OF THE UNIVERSITY SHALL HAVE NO LIABILITY TO LICENSEE OR OTHER PERSONS FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA OR PROFITS, OR BUSINESS INTERRUPTION, HOWEVER CAUSED AND ON ANY THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR OTHERWISE, ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 +8. Certain uses and transfers of the Software or documentation, and/or items or software incorporating the Condor Software or documentation, may require a license under U.S. Export Control laws. Licensee represents and warrants that all uses and transfers of the Condor Software or documentation and/or any items or software incorporating Condor shall be in compliance with U.S. Export Control laws, and Licensee further understands that failure to comply with such export control laws may result in criminal liability to Licensee under U.S. laws. + +9. The Condor Team may publish revised and/or new versions of this Condor Public License (``this License") from time to time. Each version will be given a distinguishing version number. Once Software has been published under a particular version of this License, you may always continue to use it under the terms of that version. You may also choose to use such Software under the terms of any subsequent version of this License published by the Condor Team. No one other than the Condor Team has the right to modify the terms of this License. + +For more information: + +Condor Team +Attention: Professor Miron Livny +7367 Computer Sciences +1210 W. Dayton St. +Madison, WI 53706-1685 +miron@cs.wisc.edu +http://pages.cs.wisc.edu/~miron/miron.html + + + diff --git a/options/license/Crossword b/options/license/Crossword new file mode 100644 index 0000000..74ecbb4 --- /dev/null +++ b/options/license/Crossword @@ -0,0 +1,5 @@ +Copyright (C) 1995-2009 Gerd Neugebauer +   +cwpuzzle.dtx is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. No author or distributor accepts responsibility to anyone for the consequences of using it or for whether it serves any particular purpose or works at all, unless he says so in writing. +  . +Everyone is granted permission to copy, modify and redistribute cwpuzzle.dtx, provided this copyright notice is preserved and any modifications are indicated. diff --git a/options/license/CrystalStacker b/options/license/CrystalStacker new file mode 100644 index 0000000..7705e91 --- /dev/null +++ b/options/license/CrystalStacker @@ -0,0 +1,7 @@ +Crystal Stacker is freeware. This means you can pass copies around freely provided you include this document in it's original form in your distribution. Please see the "Contacting Us" section of this document if you need to contact us for any reason. + +Disclaimer + +NewCreature Design makes no guarantees regarding the Crystal Stacker software. We are not responsible for damages caused by it, though the software is not known to cause any problems. If you have trouble with the software, see the "Contacting Us" section of this document. + +The source code is provided as-is and you may do with it whatsoever you please provided that you include this file in its unmodified form with any new distribution. NewCreature Design makes no gaurantees regarding the usability of the source but are willing to help with any problems you might run into. Please see the "Contacting Us" section of this document if you need to get in touch with us about any issues you have regarding the source. \ No newline at end of file diff --git a/options/license/Cube b/options/license/Cube new file mode 100644 index 0000000..3a61403 --- /dev/null +++ b/options/license/Cube @@ -0,0 +1,17 @@ +Cube game engine source code, 20 dec 2003 release. + +Copyright (C) 2001-2003 Wouter van Oortmerssen. + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. + +additional clause specific to Cube: + + 4. Source versions may not be "relicensed" under a different license without my explicitly written permission. \ No newline at end of file diff --git a/options/license/D-FSL-1.0 b/options/license/D-FSL-1.0 new file mode 100644 index 0000000..393d14f --- /dev/null +++ b/options/license/D-FSL-1.0 @@ -0,0 +1,147 @@ +Deutsche Freie Software Lizenz + +(c) Ministerium für Wissenschaft und Forschung Nordrhein-Westfalen 2004 + +Erstellt von Axel Metzger und Till Jaeger, Institut für Rechtsfragen der Freien und Open Source Software - (http://www.ifross.de). + +Präambel + +Software ist mehr als ein Wirtschaftsgut. Sie ist die technische Grundlage der Informationsgesellschaft. Die Frage der Teilhabe der Allgemeinheit ist deswegen von besonderer Bedeutung. Herkömmlich lizenzierte Programme werden nur im Object Code vertrieben, der Nutzer darf das Programm weder verändern noch weitergeben. Das Lizenzmodell der Freien Software (synonym "Open Source Software") gewährt Ihnen dagegen umfassende Freiheiten im Umgang mit dem Programm. Die Deutsche Freie Software Lizenz folgt diesem Lizenzmodell. Sie gewährt Ihnen das Recht, das Programm in umfassender Weise zu nutzen. Es ist Ihnen gestattet, das Programm nach Ihren Vorstellungen zu verändern, in veränderter oder unveränderter Form zu vervielfältigen, zu verbreiten und öffentlich zugänglich zu machen. Diese Rechte werden unentgeltlich eingeräumt. + +Die Deutsche Freie Software Lizenz verbindet die Rechtseinräumung allerdings mit Pflichten, die dem Zweck dienen, das freie Zirkulieren des Programms und aller veröffentlichten Fortentwicklungen zu sichern. Wenn Sie das Programm verbreiten oder öffentlich zugänglich machen, dann müssen Sie jedem, der das Programm von Ihnen erhält, eine Kopie dieser Lizenz mitliefern und den Zugriff auf den Source Code ermöglichen. Eine weitere Pflicht betrifft Fortentwicklungen des Programms. Änderungen am Programm, die Sie öffentlich verbreiten oder zugänglich machen, müssen nach den Bestimmungen dieser Lizenz frei gegeben werden. + +Die Deutsche Freie Software Lizenz nimmt auf die besonderen Anforderungen des deutschen und europäischen Rechts Rücksicht. Sie ist zweisprachig gestaltet und damit auch auf den internationalen Vertrieb ausgerichtet. + +§ 0 Definitionen + +Dokumentation: Die Beschreibung des Aufbaus und/oder der Struktur der Programmierung und/oder der Funktionalitäten des Programms, unabhängig davon, ob sie im Source Code oder gesondert vorgenommen wird. + +Lizenz: Die zwischen dem Lizenzgeber und Ihnen geschlossene Vereinbarung mit dem Inhalt der "Deutschen Freien Software Lizenz" bzw. das Angebot hierzu. + +Lizenznehmer: Jede natürliche oder juristische Person, die die Lizenz angenommen hat. + +Programm: Jedes Computerprogramm, das von den Rechtsinhabern nach den Bestimmungen dieser Lizenz verbreitet oder öffentlich zugänglich gemacht worden ist. + +Object Code: Die maschinenlesbare, übersetzte Form des Programms. + +Öffentlich: Nicht nur an einen bestimmten Personenkreis gerichtet, der persönlich oder durch die Zugehörigkeit zu einer juristischen Person oder einem öffentlichen Träger miteinander verbunden ist. + +Öffentlich zugänglich machen: Die öffentliche Weitergabe des Programms in unkörperlicher Form, insbesondere das Bereithalten zum Download in Datennetzen. + +Rechtsinhaber: Der bzw. die Urheber oder sonstigen Inhaber der ausschließlichen Nutzungsrechte an dem Programm. + +Source Code: Die für Menschen lesbare, in Programmiersprache dargestellte Form des Programms. + +Verändern: Jede Erweiterung, Kürzung und Bearbeitung des Programms, insbesondere Weiterentwicklungen. + +Verbreiten: Die öffentliche Weitergabe körperlicher Vervielfältigungsstücke, insbesondere auf Datenträgern oder in Verbindung mit Hardware. + +Vollständiger Source Code: Der Source Code in der für die Erstellung bzw. die Bearbeitung benutzten Form zusammen mit den zur Übersetzung und Installation erforderlichen Konfigurationsdateien und Software-Werkzeugen, sofern diese in der benötigten Form nicht allgemein gebräuchlich (z.B. Standard-Kompiler) oder für jedermann lizenzgebührenfrei im Internet abrufbar sind. + +§ 1 Rechte + +(1) Sie dürfen das Programm in unveränderter Form vervielfältigen, verbreiten und öffentlich zugänglich machen. + +(2) Sie dürfen das Programm verändern und entsprechend veränderte Versionen vervielfältigen, verbreiten und öffentlich zugänglich machen. Gestattet ist auch die Kombination des Programms oder Teilen hiervon mit anderen Programmen. + +(3) Sie erhalten die Rechte unentgeltlich. + +§ 2 Pflichten beim Vertrieb + +(1) Wenn Sie das Programm verbreiten oder öffentlich zugänglich machen, sei es in unveränderter oder veränderter Form, sei es in einer Kombination mit anderen Programmen oder in Verbindung mit Hardware, dann müssen sie mitliefern: +1. alle Vermerke im Source Code und/oder Object Code, die auf diese Lizenz hinweisen; +2. alle Vermerke im Source Code und/oder Object Code, die über die Urheber des Programms Auskunft geben; +3. einen für den Empfänger deutlich wahrnehmbaren Hinweis auf diese Lizenz und die Internetadresse http://www.d-fsl.de; +4. den vollständigen Text dieser Lizenz in deutlich wahrnehmbarer Weise. + +(2) Wenn bei der Installation des Programms und/oder beim Programmstart Lizenz- und/oder Vertragsbedingungen angezeigt werden, dann müssen +1. diese Lizenz, +2. ein Hinweis auf diese Lizenz und +3. ein Hinweis auf den oder die Rechtsinhaber an den ersten unter dieser Lizenz nutzbaren Programmbestandteilen +ebenfalls angezeigt werden. + +(3) Sie dürfen die Nutzung des Programms nicht von Pflichten oder Bedingungen abhängig machen, die nicht in dieser Lizenz vorgesehen sind. + +(4) Sofern Sie mit dem Programm eine Dokumentation erhalten haben, muss diese Dokumentation entsprechend mitgeliefert werden, es sei denn, die freie Mitlieferung der Dokumentation ist Ihnen aufgrund der Lizenz für die Dokumentation nicht gestattet. + +§ 3 Weitere Pflichten beim Vertrieb veränderter Versionen + +(1) Veränderte Versionen des Programms dürfen Sie nur unter den Bedingungen dieser Lizenz verbreiten oder öffentlich zugänglich machen, so dass Dritte das veränderte Programm insgesamt unter dieser Lizenz nutzen können. + +(2) Wird das Programm oder ein Teil hiervon mit einem anderen Programm kombiniert, gilt auch die Kombination insgesamt als eine veränderte Version des Programms, es sei denn, das andere Programm ist formal und inhaltlich eigenständig. Ein anderes Programm ist dann als eigenständig anzusehen, wenn es die folgenden Voraussetzungen alle erfüllt: +1. Der Source Code der kombinierten Programme muss jeweils in eigenen Dateien vorhanden sein, die keine Bestandteile des anderen Teils enthalten, die über die zur Programmkombination üblichen und erforderlichen Informationen über den anderen Teil hinausgehen, wobei der Source Code des anderen Programms nicht mitgeliefert werden muss. +2. Der mit dem Programm kombinierte Teil muss auch dann sinnvoll nutzbar sein, wenn er nicht mit dem Programm kombiniert wird, und zwar entweder alleine oder mit sonstigen Programmen. Was als "sinnvoll nutzbar" anzusehen ist, richtet sich nach der Auffassung der betroffenen Fachkreise. Zu den betroffenen Fachkreisen gehören alle Personen, die das Programm oder Programme mit vergleichbarer Funktionalität entwickeln, benutzen, verbreiten oder öffentlich zugänglich machen. + +(3) Wenn Sie das Programm oder einen Teil hiervon - verändert oder unverändert - zusammen mit einem anderen Programm verbreiten oder öffentlich zugänglich machen, das unter der GNU General Public License (GPL) lizenziert wird, darf das Programm auch unter den Bedingungen der GPL genutzt werden, sofern es mit dem anderen Programm ein "derivative work" im Sinne der GPL bildet. Dabei sollen die Hinweise auf diese Lizenz entfernt und durch einen Hinweis auf die GPL ersetzt werden. Ob bei der Zusammenstellung ein "derivate work" im Sinne der GPL entsteht, beurteilt sich nach Ziffer 2 b) der GPL. Diese Bestimmung lautet: "You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License." Die GPL kann abgerufen werden unter http://www.fsf.org/licenses/gpl. + +(4) Wenn Sie das Programm in einer veränderten Form verbreiten oder öffentlich zugänglich machen, müssen Sie im Source Code einen Hinweis mit den Änderungen aufnehmen und mit dem Datum der Änderung versehen. Der Hinweis muss erkennen lassen, welche Änderungen vorgenommen wurden und bestehende Vermerke, die über die Urheber des Programms Auskunft geben, übernehmen. Dies gilt unabhängig davon, ob Sie einen eigenen Urhebervermerk hinzufügen. Anstelle eines Hinweises im Source Code können Sie auch ein Versionskontrollsystem verwenden oder weiterführen, sofern dieses mitverbreitet wird oder öffentlich zugänglich ist. + +(5) Sie dürfen von Dritten für die Einräumung eines einfachen Nutzungsrechts an veränderten Versionen des Programms kein Entgelt verlangen. + +(6) Wenn Sie an der veränderten Version des Programms ein anderes Schutzrecht als ein Urheberrecht erwerben, insbesondere ein Patent oder Gebrauchsmuster, lizenzieren Sie dieses Schutzrecht für veränderte und unveränderte Versionen des Programms in dem Umfang, der erforderlich ist, um die Rechte aus dieser Lizenz wahrnehmen zu können. + +§ 4 Weitere Pflichten beim Vertrieb im Object Code + +(1) Wenn Sie das Programm nur im Object Code verbreiten, dann müssen Sie zusätzlich zu den in § 2 und § 3 geregelten Pflichten entweder +1. den vollständigen Source Code im Internet öffentlich zugänglich machen und bei der Verbreitung des Object Codes deutlich auf die vollständige Internetadresse hinweisen, unter der der Source Code abgerufen werden kann oder +2. den vollständigen Source Code auf einem hierfür üblichen Datenträger unter Beachtung der §§ 2 und 3 mitverbreiten. + +(2) Wenn Sie das Programm im Object Code öffentlich zugänglich machen, dann müssen Sie zusätzlich zu den in § 2 und § 3 geregelten Pflichten den vollständigen Source Code im Internet öffentlich zugänglich machen und dabei deutlich auf die vollständige Internetadresse hinweisen. + +(3) Sofern Sie mit dem Programm eine Dokumentation erhalten haben, muss diese Dokumentation entsprechend der Absätze 1 und 2 mitgeliefert werden, es sei denn, die freie Mitlieferung der Dokumentation ist Ihnen aufgrund der Lizenz für die Dokumentation nicht gestattet. + +§ 5 Vertragsschluss + +(1) Mit dieser Lizenz wird Ihnen und jeder anderen Person ein Angebot auf Abschluss eines Vertrages über die Nutzung des Programms unter den Bedingungen der Deutschen Freien Softwarelizenz unterbreitet. + +(2) Sie dürfen das Programm nach den jeweils anwendbaren gesetzlichen Vorschriften bestimmungsgemäß benutzen, ohne dass es der Annahme dieser Lizenz bedarf. Dieses Recht umfasst in der Europäischen Union und in den meisten anderen Rechtsordnungen insbesondere die folgenden Befugnisse: +1. das Programm ablaufen zu lassen sowie die Erstellung von hierfür erforderlichen Vervielfältigungen im Haupt- und Arbeitsspeicher; +2. das Erstellen einer Sicherungskopie; +3. die Fehlerberichtigung; +4. die Weitergabe einer rechtmäßig erworbenen körperlichen Kopie des Programms. + +(3) Sie erklären Ihre Zustimmung zum Abschluss dieser Lizenz, indem Sie das Programm verbreiten, öffentlich zugänglich machen, verändern oder in einer Weise vervielfältigen, die über die bestimmungsgemäße Nutzung im Sinne von Absatz 2 hinausgeht. Ab diesem Zeitpunkt ist diese Lizenz als rechtlich verbindlicher Vertrag zwischen den Rechtsinhabern und Ihnen geschlossen, ohne dass es eines Zugangs der Annahmeerklärung bei den Rechtsinhabern bedarf. + +(4) Sie und jeder andere Lizenznehmer erhalten die Rechte aus dieser Lizenz direkt von den Rechtsinhabern. Eine Unterlizenzierung oder Übertragung der Rechte ist nicht gestattet. + +§ 6 Beendigung der Rechte bei Zuwiderhandlung + +(1) Jede Verletzung Ihrer Verpflichtungen aus dieser Lizenz führt zu einer automatischen Beendigung Ihrer Rechte aus dieser Lizenz. + +(2) Die Rechte Dritter, die das Programm oder Rechte an dem Programm von Ihnen erhalten haben, bleiben hiervon unberührt. + +§ 7 Haftung und Gewährleistung + +(1) Für entgegenstehende Rechte Dritter haften die Rechtsinhaber nur, sofern sie Kenntnis von diesen Rechten hatten, ohne Sie zu informieren. + +(2) Die Haftung für Fehler und sonstige Mängel des Programms richtet sich nach den außerhalb dieser Lizenz getroffenen Vereinbarungen zwischen Ihnen und den Rechtsinhabern oder, wenn eine solche Vereinbarung nicht existiert, nach den gesetzlichen Regelungen. + +§ 8 Verträge mit Dritten + +(1) Diese Lizenz regelt nur die Beziehung zwischen Ihnen und den Rechtsinhabern. Sie ist nicht Bestandteil der Verträge zwischen Ihnen und Dritten. + +(2) Die Lizenz beschränkt Sie nicht in der Freiheit, mit Dritten, die von Ihnen Kopien des Programms erhalten oder Leistungen in Anspruch nehmen, die im Zusammenhang mit dem Programm stehen, Verträge beliebigen Inhalts zu schließen, sofern Sie dabei Ihren Verpflichtungen aus dieser Lizenz nachkommen und die Rechte der Dritten aus dieser Lizenz nicht beeinträchtigt werden. Insbesondere dürfen Sie für die Überlassung des Programms oder sonstige Leistungen ein Entgelt verlangen. + +(3) Diese Lizenz verpflichtet Sie nicht, das Programm an Dritte weiterzugeben. Es steht Ihnen frei zu entscheiden, wem Sie das Programm zugänglich machen. Sie dürfen aber die weitere Nutzung durch Dritte nicht durch den Einsatz technischer Schutzmaßnahmen, insbesondere durch den Einsatz von Kopierschutzvorrichtungen jeglicher Art, verhindern oder erschweren. Eine passwortgeschützte Zugangsbeschränkung oder die Nutzung in einem Intranet wird nicht als technische Schutzmaßnahme angesehen. + +§ 9 Text der Lizenz + +(1) Diese Lizenz ist in deutscher und englischer Sprache abgefasst. Beide Fassungen sind gleich verbindlich. Es wird unterstellt, dass die in der Lizenz verwandten Begriffe in beiden Fassungen dieselbe Bedeutung haben. Ergeben sich dennoch Unterschiede, so ist die Bedeutung maßgeblich, welche die Fassungen unter Berücksichtigung des Ziels und Zwecks der Lizenz am besten miteinander in Einklang bringt. + +(2) Der Lizenzrat der Deutschen Freien Software Lizenz kann mit verbindlicher Wirkung neue Versionen der Lizenz in Kraft setzen, soweit dies erforderlich und zumutbar ist. Neue Versionen der Lizenz werden auf der Internetseite http://www.d-fsl.de mit einer eindeutigen Versionsnummer veröffentlicht. Die neue Version der Lizenz erlangt für Sie verbindliche Wirkung, wenn Sie von deren Veröffentlichung Kenntnis genommen haben. Gesetzliche Rechtsbehelfe gegen die Änderung der Lizenz werden durch die vorstehenden Bestimmungen nicht beschränkt. + +(3) Sie dürfen diese Lizenz in unveränderter Form vervielfältigen, verbreiten und öffentlich zugänglich machen. + +§ 10 Anwendbares Recht + +Auf diese Lizenz findet deutsches Recht Anwendung. + + +Anhang: Wie unterstellen Sie ein Programm der Deutschen Freien Software Lizenz? +Um jedermann den Abschluss dieser Lizenz zu ermöglichen, wird empfohlen, das Programm mit folgendem Hinweis auf die Lizenz zu versehen: + +"Copyright (C) 20[jj] [Name des Rechtsinhabers]. + +Dieses Programm kann durch jedermann gemäß den Bestimmungen der Deutschen Freien Software Lizenz genutzt werden. + +Die Lizenz kann unter http://www.d-fsl.de abgerufen werden." \ No newline at end of file diff --git a/options/license/DOC b/options/license/DOC new file mode 100644 index 0000000..4bb9608 --- /dev/null +++ b/options/license/DOC @@ -0,0 +1,16 @@ +Copyright and Licensing Information for ACE(TM), TAO(TM), CIAO(TM), DAnCE(TM), and CoSMIC(TM) + +ACE(TM), TAO(TM), CIAO(TM), DAnCE>(TM), and CoSMIC(TM) (henceforth referred to as "DOC software") are copyrighted by Douglas C. Schmidt and his research group at Washington University, University of California, Irvine, and Vanderbilt University, Copyright (c) 1993-2009, all rights reserved. Since DOC software is open-source, freely available software, you are free to use, modify, copy, and distribute--perpetually and irrevocably--the DOC software source code and object code produced from the source, as well as copy and distribute modified versions of this software. You must, however, include this copyright statement along with any code built using DOC software that you release. No copyright statement needs to be provided if you just ship binary executables of your software products. + +You can use DOC software in commercial and/or binary software releases and are under no obligation to redistribute any of your source code that is built using DOC software. Note, however, that you may not misappropriate the DOC software code, such as copyrighting it yourself or claiming authorship of the DOC software code, in a way that will prevent DOC software from being distributed freely using an open-source development model. You needn't inform anyone that you're using DOC software in your software, though we encourage you to let us know so we can promote your project in the DOC software success stories. + +The ACE, TAO, CIAO, DAnCE, and CoSMIC web sites are maintained by the DOC Group at the Institute for Software Integrated Systems (ISIS) and the Center for Distributed Object Computing of Washington University, St. Louis for the development of open-source software as part of the open-source software community. Submissions are provided by the submitter ``as is'' with no warranties whatsoever, including any warranty of merchantability, noninfringement of third party intellectual property, or fitness for any particular purpose. In no event shall the submitter be liable for any direct, indirect, special, exemplary, punitive, or consequential damages, including without limitation, lost profits, even if advised of the possibility of such damages. Likewise, DOC software is provided as is with no warranties of any kind, including the warranties of design, merchantability, and fitness for a particular purpose, noninfringement, or arising from a course of dealing, usage or trade practice. Washington University, UC Irvine, Vanderbilt University, their employees, and students shall have no liability with respect to the infringement of copyrights, trade secrets or any patents by DOC software or any part thereof. Moreover, in no event will Washington University, UC Irvine, or Vanderbilt University, their employees, or students be liable for any lost revenue or profits or other special, indirect and consequential damages. + +DOC software is provided with no support and without any obligation on the part of Washington University, UC Irvine, Vanderbilt University, their employees, or students to assist in its use, correction, modification, or enhancement. A number of companies around the world provide commercial support for DOC software, however. DOC software is Y2K-compliant, as long as the underlying OS platform is Y2K-compliant. Likewise, DOC software is compliant with the new US daylight savings rule passed by Congress as "The Energy Policy Act of 2005," which established new daylight savings times (DST) rules for the United States that expand DST as of March 2007. Since DOC software obtains time/date and calendaring information from operating systems users will not be affected by the new DST rules as long as they upgrade their operating systems accordingly. + +The names ACE(TM), TAO(TM), CIAO(TM), DAnCE(TM), CoSMIC(TM), Washington University, UC Irvine, and Vanderbilt University, may not be used to endorse or promote products or services derived from this source without express written permission from Washington University, UC Irvine, or Vanderbilt University. This license grants no permission to call products or services derived from this source ACE(TM), TAO(TM), CIAO(TM), DAnCE(TM), or CoSMIC(TM), nor does it grant permission for the name Washington University, UC Irvine, or Vanderbilt University to appear in their names. + +If you have any suggestions, additions, comments, or questions, please let me know. + +Douglas C. Schmidt + diff --git a/options/license/DSDP b/options/license/DSDP new file mode 100644 index 0000000..bf2ec89 --- /dev/null +++ b/options/license/DSDP @@ -0,0 +1,18 @@ +COPYRIGHT NOTIFICATION + +(C) COPYRIGHT 2004 UNIVERSITY OF CHICAGO + +This program discloses material protectable under copyright laws of the United States. Permission to copy and modify this software and its documentation is hereby granted, provided that this notice is retained thereon and on all copies or modifications. The University of Chicago makes no representations as to the suitability and operability of this software for any purpose. It is provided "as is"; without express or implied warranty. Permission is hereby granted to use, reproduce, prepare derivative works, and to redistribute to others, so long as this original copyright notice is retained. Any publication resulting from research that made use of this software should cite this document. + + This software was authored by: + + Steven J. Benson Mathematics and Computer Science Division Argonne National Laboratory Argonne IL 60439 + + Yinyu Ye Department of Management Science and Engineering Stanford University Stanford, CA U.S.A + + Any questions or comments on the software may be directed to benson@mcs.anl.gov or yinyu-ye@stanford.edu + +Argonne National Laboratory with facilities in the states of Illinois and Idaho, is owned by The United States Government, and operated by the University of Chicago under provision of a contract with the Department of Energy. + +DISCLAIMER +THIS PROGRAM WAS PREPARED AS AN ACCOUNT OF WORK SPONSORED BY AN AGENCY OF THE UNITED STATES GOVERNMENT. NEITHER THE UNITED STATES GOVERNMENT NOR ANY AGENCY THEREOF, NOR THE UNIVERSITY OF CHICAGO, NOR ANY OF THEIR EMPLOYEES OR OFFICERS, MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, OR PROCESS DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS. REFERENCE HEREIN TO ANY SPECIFIC COMMERCIAL PRODUCT, PROCESS, OR SERVICE BY TRADE NAME, TRADEMARK, MANUFACTURER, OR OTHERWISE, DOES NOT NECESSARILY CONSTITUTE OR IMPLY ITS ENDORSEMENT, RECOMMENDATION, OR FAVORING BY THE UNITED STATES GOVERNMENT OR ANY AGENCY THEREOF. THE VIEW AND OPINIONS OF AUTHORS EXPRESSED HEREIN DO NOT NECESSARILY STATE OR REFLECT THOSE OF THE UNITED STATES GOVERNMENT OR ANY AGENCY THEREOF. \ No newline at end of file diff --git a/options/license/Dotseqn b/options/license/Dotseqn new file mode 100644 index 0000000..9833407 --- /dev/null +++ b/options/license/Dotseqn @@ -0,0 +1,5 @@ +Copyright (C) 1995 by Donald Arseneau + +This file may be freely transmitted and reproduced, but it may not be changed unless the name is changed also (except that you may freely change the paper-size option for \documentclass). + +This notice must be left intact. diff --git a/options/license/Educational Community License v1.0 b/options/license/ECL-1.0 similarity index 71% rename from options/license/Educational Community License v1.0 rename to options/license/ECL-1.0 index eb69cbd..e207abf 100644 --- a/options/license/Educational Community License v1.0 +++ b/options/license/ECL-1.0 @@ -1,22 +1,23 @@ The Educational Community License + This Educational Community License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: -Copyright (c) + Copyright (c) < ;match=.+>> -Licensed under the Educational Community License version 1.0 + Licensed under the Educational Community License version 1.0 This Original Work, including software, source code, documents, or other related items, is being provided by the copyright holder(s) subject to the terms of the Educational Community License. By obtaining, using and/or copying this Original Work, you agree that you have read, understand, and will comply with the following terms and conditions of the Educational Community License: -Permission to use, copy, modify, merge, publish, distribute, and sublicense this Original Work and its documentation, with or without modification, for any purpose, and without fee or royalty to the copyright holder(s) is hereby granted, provided that you include the following on ALL copies of the Original Work or portions thereof, including modifications or derivatives, that you make: +Permission to use, copy, modify, merge, publish, distribute, and sublicense this Original Work and its documentation, with or without modification, for any purpose, and without fee or royalty to the copyright holder(s) is hereby granted, provided that you include the following on ALL copies of the Original Work or portions thereof, including modifications or derivatives, that you make: -The full text of the Educational Community License in a location viewable to users of the redistributed or derivative work. + The full text of the Educational Community License in a location viewable to users of the redistributed or derivative work. -Any pre-existing intellectual property disclaimers, notices, or terms and conditions. + Any pre-existing intellectual property disclaimers, notices, or terms and conditions. -Notice of any changes or modifications to the Original Work, including the date the changes were made. + Notice of any changes or modifications to the Original Work, including the date the changes were made. -Any modifications of the Original Work must be distributed in such a manner as to avoid any confusion with the Original Work of the copyright holders. + Any modifications of the Original Work must be distributed in such a manner as to avoid any confusion with the Original Work of the copyright holders. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -The name and trademarks of copyright holder(s) may NOT be used in advertising or publicity pertaining to the Original or Derivative Works without specific, written prior permission. Title to copyright in the Original Work and any associated documentation will at all times remain with the copyright holders. +The name and trademarks of copyright holder(s) may NOT be used in advertising or publicity pertaining to the Original or Derivative Works without specific, written prior permission. Title to copyright in the Original Work and any associated documentation will at all times remain with the copyright holders. \ No newline at end of file diff --git a/options/license/Educational Community License v2.0 b/options/license/ECL-2.0 similarity index 79% rename from options/license/Educational Community License v2.0 rename to options/license/ECL-2.0 index 4c69417..a4b4cbd 100644 --- a/options/license/Educational Community License v2.0 +++ b/options/license/ECL-2.0 @@ -1,5 +1,6 @@ -Educational Community License +Educational Community License Version 2.0, April 2007 + http://www.osedu.org/licenses/ The Educational Community License version 2.0 ("ECL") consists of the Apache 2.0 license, modified to change the scope of the patent grant in section 3 to be specific to the needs of the education communities using this license. The original Apache 2.0 license can be found at: http://www.apache.org/licenses/LICENSE-2.0 @@ -40,13 +41,13 @@ Subject to the terms and conditions of this License, each Contributor hereby gra You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: -a. You must give any other recipients of the Work or Derivative Works a copy of this License; and + a. You must give any other recipients of the Work or Derivative Works a copy of this License; and -b. You must cause any modified files to carry prominent notices stating that You changed the files; and + b. You must cause any modified files to carry prominent notices stating that You changed the files; and -c. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + c. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and -d. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + d. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. @@ -74,24 +75,24 @@ END OF TERMS AND CONDITIONS APPENDIX: How to apply the Educational Community License to your work -To apply the Educational Community License to your work, attach -the following boilerplate notice, with the fields enclosed by -brackets "[]" replaced with your own identifying information. -(Don't include the brackets!) The text should be enclosed in the -appropriate comment syntax for the file format. We also recommend -that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier +To apply the Educational Community License to your work, attach +the following boilerplate notice, with the fields enclosed by +brackets "[]" replaced with your own identifying information. +(Don't include the brackets!) The text should be enclosed in the +appropriate comment syntax for the file format. We also recommend +that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright [yyyy] [name of copyright owner] Licensed under the -Educational Community License, Version 2.0 (the "License"); you may -not use this file except in compliance with the License. You may -obtain a copy of the License at + Copyright [yyyy] [name of copyright owner] Licensed under the + Educational Community License, Version 2.0 (the "License"); you may + not use this file except in compliance with the License. You may + obtain a copy of the License at + + http://www.osedu.org/licenses/ECL-2.0 -http://www.osedu.org/licenses/ECL-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an "AS IS" -BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express -or implied. See the License for the specific language governing -permissions and limitations under the License. + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an "AS IS" + BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the License for the specific language governing + permissions and limitations under the License. \ No newline at end of file diff --git a/options/license/EFL-1.0 b/options/license/EFL-1.0 new file mode 100644 index 0000000..8fff15c --- /dev/null +++ b/options/license/EFL-1.0 @@ -0,0 +1,13 @@ +Eiffel Forum License, version 1 + +Permission is hereby granted to use, copy, modify and/or distribute this package, provided that: + + - copyright notices are retained unchanged + + - any distribution of this package, whether modified or not, includes this file + +Permission is hereby also granted to distribute binary programs which depend on this package, provided that: + + - if the binary program depends on a modified version of this package, you must publicly release the modified version of this package + +THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT WARRANTY. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THIS PACKAGE. \ No newline at end of file diff --git a/options/license/EFL-2.0 b/options/license/EFL-2.0 new file mode 100644 index 0000000..e1d36e4 --- /dev/null +++ b/options/license/EFL-2.0 @@ -0,0 +1,9 @@ +Eiffel Forum License, version 2 + +1. Permission is hereby granted to use, copy, modify and/or distribute this package, provided that: + - copyright notices are retained unchanged, + - any distribution of this package, whether modified or not, includes this license text. + +2. Permission is hereby also granted to distribute binary programs which depend on this package. If the binary program depends on a modified version of this package, you are encouraged to publicly release the modified version of this package. + +THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT WARRANTY. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE TO ANY PARTY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THIS PACKAGE. \ No newline at end of file diff --git a/options/license/Eclipse Public License 1.0 b/options/license/EPL-1.0 similarity index 68% rename from options/license/Eclipse Public License 1.0 rename to options/license/EPL-1.0 index a5965ff..1e9afbe 100644 --- a/options/license/Eclipse Public License 1.0 +++ b/options/license/EPL-1.0 @@ -1,15 +1,16 @@ Eclipse Public License - v 1.0 + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS -"Contribution" means: -a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and -b) in the case of each subsequent Contributor: -i) changes to the Program, and -ii) additions to the Program; +"Contribution" means: + a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; -where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. @@ -20,43 +21,43 @@ where such changes and/or additions to the Program originate from and are distri 2. GRANT OF RIGHTS -a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + + b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. -b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. -c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. -d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. - -3. REQUIREMENTS +3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: -a) it complies with the terms and conditions of this Agreement; and - -b) its license agreement: -i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; -ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; -iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and -iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + a) it complies with the terms and conditions of this Agreement; and + + b) its license agreement: + i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: -a) it must be made available under this Agreement; and + a) it must be made available under this Agreement; and -b) a copy of this Agreement must be included with each copy of the Program. + b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. -4. COMMERCIAL DISTRIBUTION +4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. -5. NO WARRANTY +5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. -6. DISCLAIMER OF LIABILITY +6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL @@ -69,4 +70,4 @@ All Recipient's rights under this Agreement shall terminate if it fails to compl Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. -This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. \ No newline at end of file diff --git a/options/license/EUDatagrid b/options/license/EUDatagrid new file mode 100644 index 0000000..44db87e --- /dev/null +++ b/options/license/EUDatagrid @@ -0,0 +1,24 @@ +EU DataGrid Software License + +Copyright (c) 2001 EU DataGrid. All rights reserved. + +This software includes voluntary contributions made to the EU DataGrid. For more information on the EU DataGrid, please see http://www.eu-datagrid.org/. + +Installation, use, reproduction, display, modification and redistribution of this software, with or without modification, in source and binary forms, are permitted. Any exercise of rights under this license by you or your sub-licensees is subject to the following conditions: + +1. Redistributions of this software, with or without modification, must reproduce the above copyright notice and the above license statement as well as this list of conditions, in the software, the user documentation and any other materials provided with the software. + +2. The user documentation, if any, included with a redistribution, must include the following notice: + “"This product includes software developed by the EU DataGrid (http://www.eu-datagrid.org/)." + +Alternatively, if that is where third-party acknowledgments normally appear, this acknowledgment must be reproduced in the software itself. + +3. The names "EDG", "EDG Toolkit", “EU DataGrid” and "EU DataGrid Project" may not be used to endorse or promote software, or products derived therefrom, except with prior written permission by hep-project-grid-edg-license@cern.ch. + +4. You are under no obligation to provide anyone with any bug fixes, patches, upgrades or other modifications, enhancements or derivatives of the features,functionality or performance of this software that you may develop. However, if you publish or distribute your modifications, enhancements or derivative works without contemporaneously requiring users to enter into a separate written license agreement, then you are deemed to have granted participants in the EU DataGrid a worldwide, non-exclusive, royalty-free, perpetual license to install, use, reproduce, display, modify, redistribute and sub-license your modifications, enhancements or derivative works, whether in binary or source code form, under the license conditions stated in this list of conditions. + +5. DISCLAIMER +THIS SOFTWARE IS PROVIDED BY THE EU DATAGRID AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, OF SATISFACTORY QUALITY, AND FITNESS FOR A PARTICULAR PURPOSE OR USE ARE DISCLAIMED. THE EU DATAGRID AND CONTRIBUTORS MAKE NO REPRESENTATION THAT THE SOFTWARE, MODIFICATIONS, ENHANCEMENTS OR DERIVATIVE WORKS THEREOF, WILL NOT INFRINGE ANY PATENT, COPYRIGHT, TRADE SECRET OR OTHER PROPRIETARY RIGHT. + +6. LIMITATION OF LIABILITY +THE EU DATAGRID AND CONTRIBUTORS SHALL HAVE NO LIABILITY TO LICENSEE OR OTHER PERSONS FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA OR PROFITS, OR BUSINESS INTERRUPTION, HOWEVER CAUSED AND ON ANY THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCT LIABILITY OR OTHERWISE, ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/options/license/EUPL-1.0 b/options/license/EUPL-1.0 new file mode 100644 index 0000000..5b1a6e6 --- /dev/null +++ b/options/license/EUPL-1.0 @@ -0,0 +1,154 @@ +European Union Public Licence V.1.0 + +EUPL (c) the European Community 2007 + +This European Union Public Licence (the “EUPL”) applies to the Work or Software (as defined below) which is provided under the terms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such use is covered by a right of the copyright holder of the Work). + +The Original Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following notice immediately following the copyright notice for the Original Work: + + Licensed under the EUPL V.1.0 + +or has expressed by any other mean his willingness to license under the EUPL. + +1. Definitions + +In this Licence, the following terms have the following meaning: + + − The Licence: this Licence. + + − The Original Work or the Software: the software distributed and/or communicated by the Licensor under this Licence, available as Source Code and also as Executable Code as the case may be. + + − Derivative Works: the works or software that could be created by the Licensee, based upon the Original Work or modifications thereof. This Licence does not define the extent of modification or dependence on the Original Work required in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in the country mentioned in Article 15. + + − The Work: the Original Work and/or its Derivative Works. + + − The Source Code: the human-readable form of the Work which is the most convenient for people to study and modify. + + − The Executable Code: any code which has generally been compiled and which is meant to be interpreted by a computer as a program. + + − The Licensor: the natural or legal person that distributes and/or communicates the Work under the Licence. + + − Contributor(s): any natural or legal person who modifies the Work under the Licence, or otherwise contributes to the creation of a Derivative Work. + + − The Licensee or “You”: any natural or legal person who makes any usage of the Software under the terms of the Licence. − Distribution and/or Communication: any act of selling, giving, lending, renting, distributing, communicating, transmitting, or otherwise making available, on-line or off-line, copies of the Work at the disposal of any other natural or legal person. + +2. Scope of the rights granted by the Licence + +The Licensor hereby grants You a world-wide, royalty-free, non-exclusive, sub-licensable licence to do the following, for the duration of copyright vested in the Original Work: + + − use the Work in any circumstance and for all usage, + + − reproduce the Work, + + − modify the Original Work, and make Derivative Works based upon the Work, + + − communicate to the public, including the right to make available or display the Work or copies thereof to the public and perform publicly, as the case may be, the Work, + + − distribute the Work or copies thereof, + + − lend and rent the Work or copies thereof, + + − sub-license rights in the Work or copies thereof. + +Those rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the applicable law permits so. + +In the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed by law in order to make effective the licence of the economic rights here above listed. + +The Licensor grants to the Licensee royalty-free, non exclusive usage rights to any patents held by the Licensor, to the extent necessary to make use of the rights granted on the Work under this Licence. + +3. Communication of the Source Code + +The Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as Executable Code, the Licensor provides in addition a machinereadable copy of the Source Code of the Work along with each copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to the Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to distribute and/or communicate the Work. + +4. Limitations on copyright + +Nothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the exclusive rights of the rights owners in the Original Work or Software, of the exhaustion of those rights or of other applicable limitations thereto. + +5. Obligations of the Licensee + +The grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those obligations are the following: + +Attribution right: the Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to the Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the Licence with every copy of the Work he/she distributes and/or communicates. The Licensee must cause any Derivative Work to carry prominent notices stating that the Work has been modified and the date of modification. + +Copyleft clause: If the Licensee distributes and/or communicates copies of the Original Works or Derivative Works based upon the Original Work, this Distribution and/or Communication will be done under the terms of this Licence. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the Work or Derivative Work that alter or restrict the terms of the Licence. + +Compatibility clause: If the Licensee Distributes and/or Communicates Derivative Works or copies thereof based upon both the Original Work and another work licensed under a Compatible Licence, this Distribution and/or Communication can be done under the terms of this Compatible Licence. For the sake of this clause, “Compatible Licence” refers to the licences listed in the appendix attached to this Licence. Should the Licensee’s obligations under the Compatible Licence conflict with his/her obligations under this Licence, the obligations of the Compatible Licence shall prevail. + +Provision of Source Code: When distributing and/or communicating copies of the Work, the Licensee will provide a machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available for as long as the Licensee continues to distribute and/or communicate the Work. + +Legal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the copyright notice. + +6. Chain of Authorship + +The original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or licensed to him/her and that he/she has the power and authority to grant the Licence. + +Each Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or licensed to him/her and that he/she has the power and authority to grant the Licence. + +Each time You, as a Licensee, receive the Work, the original Licensor and subsequent Contributors grant You a licence to their contributions to the Work, under the terms of this Licence. + +7. Disclaimer of Warranty + +The Work is a work in progress, which is continuously improved by numerous contributors. It is not a finished work and may therefore contain defects or “bugs” inherent to this type of software development. + +For the above reason, the Work is provided under the Licence on an “as is” basis and without warranties of any kind concerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or errors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this Licence. + +This disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work. + +8. Disclaimer of Liability + +Except in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be liable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the Work, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss of data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However, the Licensor will be liable under statutory product liability laws as far such laws apply to the Work. + +9. Additional agreements + +While distributing the Original Work or Derivative Works, You may choose to conclude an additional agreement to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or services consistent with this Licence. However, in accepting such obligations, You may act only on your own behalf and on your sole responsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by the fact You have accepted any such warranty or additional liability. + +10. Acceptance of the Licence + +The provisions of this Licence can be accepted by clicking on an icon “I agree” placed under the bottom of a window displaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of applicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms and conditions. + +Similarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You by Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution and/or Communication by You of the Work or copies thereof. + +11. Information to the public + +In case of any Distribution and/or Communication of the Work by means of electronic communication by You (for example, by offering to download the Work from a remote location) the distribution channel or media (for example, a website) must at least provide to the public the information requested by the applicable law regarding the identification and address of the Licensor, the Licence and the way it may be accessible, concluded, stored and reproduced by the Licensee. + +12. Termination of the Licence + +The Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms of the Licence. + +Such a termination will not terminate the licences of any person who has received the Work from the Licensee under the Licence, provided such persons remain in full compliance with the Licence. + +13. Miscellaneous + +Without prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the Work licensed hereunder. + +If any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or enforceability of the Licence as a whole. Such provision will be construed and/or reformed so as necessary to make it valid and enforceable. + +The European Commission may put into force translations and/or binding new versions of this Licence, so far this is required and reasonable. New versions of the Licence will be published with a unique version number. The new version of the Licence becomes binding for You as soon as You become aware of its publication. + +14. Jurisdiction + +Any litigation resulting from the interpretation of this License, arising between the European Commission, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice of the European Communities, as laid down in article 238 of the Treaty establishing the European Community. + +Any litigation arising between Parties, other than the European Commission, and resulting from the interpretation of this License, will be subject to the exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business. + +15. Applicable Law + +This Licence shall be governed by the law of the European Union country where the Licensor resides or has his registered office. + +This licence shall be governed by the Belgian law if: + + − a litigation arises between the European Commission, as a Licensor, and any Licensee; + + − the Licensor, other than the European Commission, has no residence or registered office inside a European Union country. + + +Appendix + +“Compatible Licences” according to article 5 EUPL are: + +− General Public License (GPL) v. 2 +− Open Software License (OSL) v. 2.1, v. 3.0 +− Common Public License v. 1.0 +− Eclipse Public License v. 1.0 +− Cecill v. 2.0 \ No newline at end of file diff --git a/options/license/EUPL-1.1 b/options/license/EUPL-1.1 new file mode 100644 index 0000000..ddc66e2 --- /dev/null +++ b/options/license/EUPL-1.1 @@ -0,0 +1,157 @@ +European Union Public Licence V. 1.1 + +EUPL (c) the European Community 2007 + +This European Union Public Licence (the "EUPL") applies to the Work or Software (as defined below) which is provided under the terms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such use is covered by a right of the copyright holder of the Work). + +The Original Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following notice immediately following the copyright notice for the Original Work: + + Licensed under the EUPL V.1.1 + +or has expressed by any other mean his willingness to license under the EUPL. + +1. Definitions + +In this Licence, the following terms have the following meaning: + + - The Licence: this Licence. + + - The Original Work or the Software: the software distributed and/or communicated by the Licensor under this Licence, available as Source Code and also as Executable Code as the case may be. + + - Derivative Works: the works or software that could be created by the Licensee, based upon the Original Work or modifications thereof. This Licence does not define the extent of modification or dependence on the Original Work required in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in the country mentioned in Article 15. + + - The Work: the Original Work and/or its Derivative Works. + + - The Source Code: the human-readable form of the Work which is the most convenient for people to study and modify. + + - The Executable Code: any code which has generally been compiled and which is meant to be interpreted by a computer as a program. + + - The Licensor: the natural or legal person that distributes and/or communicates the Work under the Licence. + + - Contributor(s): any natural or legal person who modifies the Work under the Licence, or otherwise contributes to the creation of a Derivative Work. + + - The Licensee or "You": any natural or legal person who makes any usage of the Software under the terms of the Licence. + + - Distribution and/or Communication: any act of selling, giving, lending, renting, distributing, communicating, transmitting, or otherwise making available, on-line or off-line, copies of the Work or providing access to its essential functionalities at the disposal of any other natural or legal person. + +2. Scope of the rights granted by the Licence + +The Licensor hereby grants You a world-wide, royalty-free, non-exclusive, sublicensable licence to do the following, for the duration of copyright vested in the Original Work: + + - use the Work in any circumstance and for all usage, + + - reproduce the Work, + + - modify the Original Work, and make Derivative Works based upon the Work, + + - communicate to the public, including the right to make available or display the Work or copies thereof to the public and perform publicly, as the case may be, the Work, + + - distribute the Work or copies thereof, + + - lend and rent the Work or copies thereof, + + - sub-license rights in the Work or copies thereof. + +Those rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the applicable law permits so. + +In the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed by law in order to make effective the licence of the economic rights here above listed. + +The Licensor grants to the Licensee royalty-free, non exclusive usage rights to any patents held by the Licensor, to the extent necessary to make use of the rights granted on the Work under this Licence. + +3. Communication of the Source Code + +The Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as Executable Code, the Licensor provides in addition a machine-readable copy of the Source Code of the Work along with each copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to the Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to distribute and/or communicate the Work. + +4. Limitations on copyright + +Nothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the exclusive rights of the rights owners in the Original Work or Software, of the exhaustion of those rights or of other applicable limitations thereto. + +5. Obligations of the Licensee + +The grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those obligations are the following: + +Attribution right: the Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to the Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the Licence with every copy of the Work he/she distributes and/or communicates. The Licensee must cause any Derivative Work to carry prominent notices stating that the Work has been modified and the date of modification. + +Copyleft clause: If the Licensee distributes and/or communicates copies of the Original Works or Derivative Works based upon the Original Work, this Distribution and/or Communication will be done under the terms of this Licence or of a later version of this Licence unless the Original Work is expressly distributed only under this version of the Licence. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the Work or Derivative Work that alter or restrict the terms of the Licence. + +Compatibility clause: If the Licensee Distributes and/or Communicates Derivative Works or copies thereof based upon both the Original Work and another work licensed under a Compatible Licence, this Distribution and/or Communication can be done under the terms of this Compatible Licence. For the sake of this clause, "Compatible Licence," refers to the licences listed in the appendix attached to this Licence. Should the Licensee's obligations under the Compatible Licence conflict with his/her obligations under this Licence, the obligations of the Compatible Licence shall prevail. + +Provision of Source Code: When distributing and/or communicating copies of the Work, the Licensee will provide a machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available for as long as the Licensee continues to distribute and/or communicate the Work. + +Legal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the copyright notice. + +6. Chain of Authorship + +The original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or licensed to him/her and that he/she has the power and authority to grant the Licence. + +Each Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or licensed to him/her and that he/she has the power and authority to grant the Licence. + +Each time You accept the Licence, the original Licensor and subsequent Contributors grant You a licence to their contributions to the Work, under the terms of this Licence. + +7. Disclaimer of Warranty + +The Work is a work in progress, which is continuously improved by numerous contributors. It is not a finished work and may therefore contain defects or "bugs" inherent to this type of software development. + +For the above reason, the Work is provided under the Licence on an "as is" basis and without warranties of any kind concerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or errors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this Licence. + +This disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work. + +8. Disclaimer of Liability + +Except in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be liable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the Work, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss of data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However, the Licensor will be liable under statutory product liability laws as far such laws apply to the Work. + +9. Additional agreements + +While distributing the Original Work or Derivative Works, You may choose to conclude an additional agreement to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or services consistent with this Licence. However, in accepting such obligations, You may act only on your own behalf and on your sole responsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by the fact You have accepted any such warranty or additional liability. + +10. Acceptance of the Licence + +The provisions of this Licence can be accepted by clicking on an icon "I agree" placed under the bottom of a window displaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of applicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms and conditions. + +Similarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You by Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution and/or Communication by You of the Work or copies thereof. + +11. Information to the public + +In case of any Distribution and/or Communication of the Work by means of electronic communication by You (for example, by offering to download the Work from a remote location) the distribution channel or media (for example, a website) must at least provide to the public the information requested by the applicable law regarding the Licensor, the Licence and the way it may be accessible, concluded, stored and reproduced by the Licensee. + +12. Termination of the Licence + +The Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms of the Licence. Such a termination will not terminate the licences of any person who has received the Work from the Licensee under the Licence, provided such persons remain in full compliance with the Licence. + +13. Miscellaneous + +Without prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the Work licensed hereunder. + +If any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or enforceability of the Licence as a whole. Such provision will be construed and/or reformed so as necessary to make it valid and enforceable. + +The European Commission may publish other linguistic versions and/or new versions of this Licence, so far this is required and reasonable, without reducing the scope of the rights granted by the Licence. New versions of the Licence will be published with a unique version number. + +All linguistic versions of this Licence, approved by the European Commission, have identical value. Parties can take advantage of the linguistic version of their choice. + +14. Jurisdiction + +Any litigation resulting from the interpretation of this License, arising between the European Commission, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice of the European Communities, as laid down in article 238 of the Treaty establishing the European Community. + +Any litigation arising between Parties, other than the European Commission, and resulting from the interpretation of this License, will be subject to the exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business. + +15. Applicable Law + +This Licence shall be governed by the law of the European Union country where the Licensor resides or has his registered office. + +This licence shall be governed by the Belgian law if: + + - a litigation arises between the European Commission, as a Licensor, and any Licensee; + + - the Licensor, other than the European Commission, has no residence or registered office inside a European Union country. + + + +Appendix + +"Compatible Licences" according to article 5 EUPL are: + + - GNU General Public License (GNU GPL) v. 2 + - Open Software License (OSL) v. 2.1, v. 3.0 + - Common Public License v. 1.0 + - Eclipse Public License v. 1.0 + - Cecill v. 2.0 \ No newline at end of file diff --git a/options/license/Entessa b/options/license/Entessa new file mode 100644 index 0000000..baea965 --- /dev/null +++ b/options/license/Entessa @@ -0,0 +1,22 @@ +Entessa Public License Version. 1.0 +Copyright (c) 2003 Entessa, LLC. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: + + "This product includes open source software developed by openSEAL (http://www.openseal.org/)." + +Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. + +4. The names "openSEAL" and "Entessa" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact epl@entessa.com. + +5. Products derived from this software may not be called "openSEAL", nor may "openSEAL" appear in their name, without prior written permission of Entessa. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ENTESSA, LLC, OPENSEAL OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This software consists of voluntary contributions made by many individuals on behalf of openSEAL and was originally based on software contributed by Entessa, LLC, http://www.entessa.com. For more information on the openSEAL, please see . \ No newline at end of file diff --git a/options/license/ErlPL-1.1 b/options/license/ErlPL-1.1 new file mode 100644 index 0000000..de7c620 --- /dev/null +++ b/options/license/ErlPL-1.1 @@ -0,0 +1,93 @@ +ERLANG PUBLIC LICENSE Version 1.1 + +1. Definitions. + +1.1. ``Contributor'' means each entity that creates or contributes to the creation of Modifications. + +1.2. ``Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + +1.3. ``Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + +1.4. ``Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data. + +1.5. ``Executable'' means Covered Code in any form other than Source Code. + +1.6. ``Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + +1.7. ``Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + +1.8. ``License'' means this document. + +1.9. ``Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. + +1.10. ``Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + +1.11. ``Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + +1.12. ``You'' means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities,``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, ``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + +2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``Utilize'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + +2.2. Contributor Grant. Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + +3. Distribution Obligations. + +3.1. Application of License. The Modifications which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + +3.2. Availability of Source Code. Any Modification which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + +3.3. Description of Modifications. You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + +3.4. Intellectual Property Matters + + (a) Third Party Claims. If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled ``LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs. If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. + +3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + +3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + +3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. +This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. + +6. CONNECTION TO MOZILLA PUBLIC LICENSE +This Erlang License is a derivative work of the Mozilla Public License, Version 1.0. It contains terms which differ from the Mozilla Public License, Version 1.0. + +7. DISCLAIMER OF WARRANTY. +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. +This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +9. DISCLAIMER OF LIABILITY +Any utilization of Covered Code shall not cause the Initial Developer or any Contributor to be liable for any damages (neither direct nor indirect). + +10. MISCELLANEOUS +This License represents the complete agreement concerning the subject matter hereof. If any provision is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be construed by and in accordance with the substantive laws of Sweden. Any dispute, controversy or claim arising out of or relating to this License, or the breach, termination or invalidity thereof, shall be subject to the exclusive jurisdiction of Swedish courts, with the Stockholm City Court as the first instance. + +EXHIBIT A. + +``The contents of this file are subject to the Erlang Public License, Version 1.1, (the "License"); you may not use this file except in compliance with the License. You should have received a copy of the Erlang Public License along with this software. If not, it can be retrieved via the world wide web at http://www.erlang.org/. + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Initial Developer of the Original Code is Ericsson Utvecklings AB. Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings AB. All Rights Reserved.'' \ No newline at end of file diff --git a/options/license/Eurosym b/options/license/Eurosym new file mode 100644 index 0000000..2d2b659 --- /dev/null +++ b/options/license/Eurosym @@ -0,0 +1,18 @@ +Copyright (c) 1999-2002 Henrik Theiling +Licence Version 2 + +This software is provided 'as-is', without warranty of any kind, express or implied. In no event will the authors or copyright holders be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated. + + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + + 3. You must not use any of the names of the authors or copyright holders of the original software for advertising or publicity pertaining to distribution without specific, written prior permission. + + 4. If you change this software and redistribute parts or all of it in any form, you must make the source code of the altered version of this software available. + + 5. This notice may not be removed or altered from any source distribution. + +This licence is governed by the Laws of Germany. Disputes shall be settled by Saarbruecken City Court. \ No newline at end of file diff --git a/options/license/FSFAP b/options/license/FSFAP new file mode 100644 index 0000000..32bc8a8 --- /dev/null +++ b/options/license/FSFAP @@ -0,0 +1 @@ +Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty. diff --git a/options/license/FSFUL b/options/license/FSFUL new file mode 100644 index 0000000..f976e3c --- /dev/null +++ b/options/license/FSFUL @@ -0,0 +1,3 @@ +Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. + +This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. diff --git a/options/license/FSFULLR b/options/license/FSFULLR new file mode 100644 index 0000000..2acb219 --- /dev/null +++ b/options/license/FSFULLR @@ -0,0 +1,3 @@ +Copyright 1996-2006 Free Software Foundation, Inc. + +This file is free software; the Free Software Foundation gives unlimited permission to copy and/or distribute it, with or without modifications, as long as this notice is preserved. diff --git a/options/license/FTL b/options/license/FTL new file mode 100644 index 0000000..b2cfd9d --- /dev/null +++ b/options/license/FTL @@ -0,0 +1,79 @@ +The FreeType Project LICENSE + +2006-Jan-27 + +Copyright 1996-2002, 2006 by David Turner, Robert Wilhelm, and Werner Lemberg + +Introduction + +The FreeType Project is distributed in several archive packages; some of them may contain, in addition to the FreeType font engine, various tools and contributions which rely on, or relate to, the FreeType Project. + +This license applies to all files found in such packages, and which do not fall under their own explicit license. The license affects thus the FreeType font engine, the test programs, documentation and makefiles, at the very least. + +This license was inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses, which all encourage inclusion and use of free software in commercial and freeware products alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use it, or only parts of it, in a program, you must acknowledge somewhere in your documentation that you have used the FreeType code. (`credits') + +We specifically permit and encourage the inclusion of this software, with or without modifications, in commercial products. We disclaim all warranties covering The FreeType Project and assume no liability related to The FreeType Project. + +Finally, many people asked us for a preferred form for a credit/disclaimer to use in compliance with this license. We thus encourage you to use the following text: + + """ Portions of this software are copyright © The FreeType Project (www.freetype.org). All rights reserved. """ + +Please replace with the value from the FreeType version you actually use. + +Legal Terms + +0. Definitions + +Throughout this license, the terms `package', `FreeType Project', and `FreeType archive' refer to the set of files originally distributed by the authors (David Turner, Robert Wilhelm, and Werner Lemberg) as the `FreeType Project', be they named as alpha, beta or final release. + +`You' refers to the licensee, or person using the project, where `using' is a generic term including compiling the project's source code as well as linking it to form a `program' or `executable'. This program is referred to as `a program using the FreeType engine'. + +This license applies to all files distributed in the original FreeType Project, including all source code, binaries and documentation, unless otherwise stated in the file in its original, unmodified form as distributed in the original archive. If you are unsure whether or not a particular file is covered by this license, you must contact us to verify this. + +The FreeType Project is copyright (C) 1996-2000 by David Turner, Robert Wilhelm, and Werner Lemberg. All rights reserved except as specified below. + +1. No Warranty + +THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO USE, OF THE FREETYPE PROJECT. + +2. Redistribution + +This license grants a worldwide, royalty-free, perpetual and irrevocable right and license to use, execute, perform, compile, display, copy, create derivative works of, distribute and sublicense the FreeType Project (in both source and object code forms) and derivative works thereof for any purpose; and to authorize others to exercise some or all of the rights granted herein, subject to the following conditions: + + o Redistribution of source code must retain this license file (`FTL.TXT') unaltered; any additions, deletions or changes to the original files must be clearly indicated in accompanying documentation. The copyright notices of the unaltered, original files must be preserved in all copies of source files. + + o Redistribution in binary form must provide a disclaimer that states that the software is based in part of the work of the FreeType Team, in the distribution documentation. We also encourage you to put an URL to the FreeType web page in your documentation, though this isn't mandatory. + +These conditions apply to any software derived from or based on the FreeType Project, not just the unmodified files. If you use our work, you must acknowledge us. However, no fee need be paid to us. + +3. Advertising + +Neither the FreeType authors and contributors nor you shall use the name of the other for commercial, advertising, or promotional purposes without specific prior written permission. + +We suggest, but do not require, that you use one or more of the following phrases to refer to this software in your documentation or advertising materials: `FreeType Project', `FreeType Engine', `FreeType library', or `FreeType Distribution'. + +As you have not signed this license, you are not required to accept it. However, as the FreeType Project is copyrighted material, only this license, or another one contracted with the authors, grants you the right to use, distribute, and modify it. Therefore, by using, distributing, or modifying the FreeType Project, you indicate that you understand and accept all the terms of this license. + +4. Contacts + +There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as future and wanted additions to the library and distribution. If you are looking for support, start in this list if you haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, specific licenses, porting, etc. + +Our home page can be found at + + http://www.freetype.org + +--- end of FTL.TXT --- \ No newline at end of file diff --git a/options/license/Fair b/options/license/Fair new file mode 100644 index 0000000..ccc3d67 --- /dev/null +++ b/options/license/Fair @@ -0,0 +1,9 @@ +Fair License + + + +Usage of the works is permitted provided that this instrument is retained with the works, so that any entity that uses the works is notified of this instrument. + +DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. + +[2004, Fair License: rhid.com/fair (this URL no longer works)] \ No newline at end of file diff --git a/options/license/Frameworx-1.0 b/options/license/Frameworx-1.0 new file mode 100644 index 0000000..12b4b2f --- /dev/null +++ b/options/license/Frameworx-1.0 @@ -0,0 +1,69 @@ +THE FRAMEWORX OPEN LICENSE 1.0 + +This License Agreement, The Frameworx Open License 1.0, has been entered into between The Frameworx Company and you, the licensee hereunder, effective as of Your acceptance of the Frameworx Code Base or an Downstream Distribution (each as defined below). + +AGREEMENT BACKGROUND +The Frameworx Company is committed to the belief that open source software results in better quality, greater technical and product innovation in the market place and a more empowered and productive developer and end-user community. Our objective is to ensure that the Frameworx Code Base, and the source code for improvements and innovations to it, remain free and open to the community.To further these beliefs and objectives, we are distributing the Frameworx Code Base, without royalties and in source code form, to the community pursuant to this License Agreement. + +AGREEMENT TERMS +The Frameworx Company and You have agreed as follows: + +1.Definitions.The following terms have the following respective meanings: + + (a) Frameworx Code Base means the software developed by The Frameworx Company and made available under this License Agreement + + (b) Downstream Distribution means any direct or indirect release, distribution or remote availability of software (i) that directly or indirectly contains, or depends for its intended functioning on, the Frameworx Code Base or any portion or element thereof and (ii) in which rights to use and distribute such Frameworx Code Base software depend, directly or indirectly, on the License provided in Section 2 below. + + (c) "Source Code" to any software means the preferred form for making modifications to that software, including any associated documentation, interface definition files and compilation or installation scripts, or any version thereof that has been compressed or archived, and can be reconstituted, using an appropriate and generally available archival or compression technology. + + (d) Value-Added Services means any commercial or fee-based software-related service, including without limitation: system or application development or consulting; technical or end-user support or training; distribution maintenance, configuration or versioning; or outsourced, hosted or network-based application services. + +2. License Grant. Subject to the terms and conditions hereof, The Frameworx Company hereby grants You a non-exclusive license (the License), subject to third party intellectual property claims, and for no fee other than a nominal charge reflecting the costs of physical distribution, to: + + (a) use the Frameworx Code Base, in either Source Code or machine-readable form; + + (b) make modifications, additions and deletions to the content or structure of the Frameworx Code Base; or + + (c) create larger works or derivative works including the Frameworx Code Base or any portion or element thereof; and + + (d) release, distribute or make available, either generally or to any specific third-party, any of the foregoing in Source Code or binary form. + +3. License Conditions. The grant of the License under Section 1 hereof, and your exercise of all rights in connection with this License Agreement, will remain subject to the following terms and conditions, as well as to the other provisions hereof: + + (a) Complete Source Code for any Downstream Distribution directly or indirectly made by You that contains, or depends for its intended functionality on, the Frameworx Code Base, or any portion or element thereof, shall be made freely available to all users thereof on terms and conditions no more restrictive, and no less favorable for any user (including, without limitation, with regard to Source Code availability and royalty-free use) than those terms and conditions provided in this License Agreement. + + (b) Any Value-Added Services that you offer or provide, directly or indirectly, in relation to any Downstream Distribution shall be offered and provided on commercial terms that are reasonably commensurate to the fair market value of such Value-Added Services. In addition, the terms and conditions on which any such Value Added Services are so offered or provided shall be consistent with, and shall fully support, the intent and purpose of this License Agreement. + + (c) All Downstream Distributions shall: + + (i) include all portions and elements of the Frameworx Code Base required to build the Source Code of such Downstream Distribution into a fully functional machine-executable system, or additional build scripts or comparable software necessary and sufficient for such purposes; + + (ii) include, in each file containing any portion or element of the Frameworx Code Base, the following identifying legend: This file contains software that has been made available under The Frameworx Open License 1.0. Use and distribution hereof are subject to the restrictions set forth therein. + + (iii) include all other copyright notices, authorship credits, warranty disclaimers (including that provided in Section 6 below), legends, documentation, annotations and comments contained in the Frameworx Code Base as provided to You hereunder; + + (iv) contain an unaltered copy of the html file named frameworx_community_invitation.html included within the Frameworx Code Base that acknowledges new users and provides them with information on the Frameworx Code Base community; + + (v) contain an unaltered copy of the text file named the_frameworx_license.txt included within the Frameworx Code Base that includes a text copy of the form of this License Agreement; and + + (vi) prominently display to any viewer or user of the Source Code of such Open Downstream Distribution, in the place and manner normally used for such displays, the following legend: + +Source code licensed under from The Frameworx Company is contained herein, and such source code has been obtained either under The Frameworx Open License, or another license granted by The Frameworx Company. Use and distribution hereof is subject to the restrictions provided in the relevant such license and to the copyrights of the licensor thereunder. A copy of The Frameworx Open License is provided in a file named the_frameworx_license.txt and included herein, and may also be available for inspection at http://www.frameworx.com. + +4. Restrictions on Open Downstream Distributions. Each Downstream Distribution made by You, and by any party directly or indirectly obtaining rights to the Frameworx Code Base through You, shall be made subject to a license grant or agreement to the extent necessary so that each distributee under that Downstream Distribution will be subject to the same restrictions on re-distribution and use as are binding on You hereunder. You may satisfy this licensing requirement either by: + + (a) requiring as a condition to any Downstream Distribution made by you, or by any direct or indirect distributee of Your Downstream Distribution (or any portion or element thereof), that each distributee under the relevant Downstream Distribution obtain a direct license (on the same terms and conditions as those in this License Agreement) from The Frameworx Company; or + + (b) sub-licensing all (and not less than all) of Your rights and obligations hereunder to that distributee, including (without limitation) Your obligation to require distributees to be bound by license restrictions as contemplated by this Section 4 above. + +The Frameworx Company hereby grants to you all rights to sub-license your rights hereunder as necessary to fully effect the intent and purpose of this Section 4 above, provided, however, that your rights and obligations hereunder shall be unaffected by any such sublicensing. In addition, The Frameworx Company expressly retains all rights to take all appropriate action (including legal action) against any such direct or indirect sub-licensee to ensure its full compliance with the intent and purposes of this License Agreement. + +5. Intellectual Property. Except as expressly provided herein, this License Agreement preserves and respects Your and The Frameworx Companys respective intellectual property rights, including, in the case of The Frameworx Company, its copyrights and patent rights relating to the Frameworx Code Base. + +6. Warranty Disclaimer. THE SOFTWARE LICENSED HEREUNDER IS PROVIDED ``AS IS.'' ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT, ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE LICENSOR OF THIS SOFTWARE, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES INCLUDING (BUT NOT LIMITED TO) PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +7. License Violation. The License, and all of your rights thereunder, shall be deemed automatically terminated and void as of any Downstream Distribution directly or indirectly made or facilitated by You that violates the provisions of this License Agreement, provided, however, that this License Agreement shall survive any such termination in order to remedy the effects of such violation. This License Agreement shall be binding on the legal successors and assigns of the parties hereto. + +Your agreement to the foregoing as of the date hereof has been evidenced by your acceptance of the relevant software distribution hereunder. + +(C) THE FRAMEWORX COMPANY 2003 \ No newline at end of file diff --git a/options/license/FreeImage b/options/license/FreeImage new file mode 100644 index 0000000..f1b9c72 --- /dev/null +++ b/options/license/FreeImage @@ -0,0 +1,117 @@ +FreeImage Public License - Version 1.0 + +1. Definitions. + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a +Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell ("Utilize") the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + + 2.2. Contributor Grant. + Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + + (a) Third Party Claims. + If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You descr ibe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License,provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. +This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Floris van den Berg may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Floris van den Berg +No one other than Floris van den Berg has the right to modify the terms applicable to Covered Code created under this License. + + 6.3. Derivative Works. + If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases "FreeImage", `FreeImage Public License", "FIPL", or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the FreeImage Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY. +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. +This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +9. LIMITATION OF LIABILITY. +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. +The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS. +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by Dutch law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the The Netherlands: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Almelo, The Netherlands; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the court of Almelo, The Netherlands with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS. +Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. + +EXHIBIT A. + +"The contents of this file are subject to the FreeImage Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://home.wxs.nl/~flvdberg/freeimage-license.txt + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. \ No newline at end of file diff --git a/options/license/GNU Free Documentation License v1.1 b/options/license/GFDL-1.1 similarity index 78% rename from options/license/GNU Free Documentation License v1.1 rename to options/license/GFDL-1.1 index cb852fa..d1ff4cd 100644 --- a/options/license/GNU Free Documentation License v1.1 +++ b/options/license/GFDL-1.1 @@ -1,8 +1,9 @@ GNU Free Documentation License Version 1.1, March 2000 -Copyright (C) 2000 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +Copyright (C) 2000 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE @@ -10,7 +11,7 @@ The purpose of this License is to make a manual, textbook, or other written docu This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. -We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. +We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS @@ -28,13 +29,13 @@ A "Transparent" copy of the Document means a machine-readable copy, represented Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only. -The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. +The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. -You may also lend copies, under the same conditions stated above, and you may publicly display copies. +You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY @@ -44,26 +45,26 @@ If the required texts for either cover are too voluminous to fit legibly, you sh If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. -It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. +It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: -A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. -B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has less than five). -C. State on the Title page the name of the publisher of the Modified Version, as the publisher. -D. Preserve all the copyright notices of the Document. -E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. -F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. -G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. -H. Include an unaltered copy of this License. -I. Preserve the section entitled "History", and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. -J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. -K. In any section entitled "Acknowledgements" or "Dedications", preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. -L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. -M. Delete any section entitled "Endorsements". Such a section may not be included in the Modified Version. -N. Do not retitle any existing section as "Endorsements" or to conflict in title with any Invariant Section. + A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. + B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has less than five). + C. State on the Title page the name of the publisher of the Modified Version, as the publisher. + D. Preserve all the copyright notices of the Document. + E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. + F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. + G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. + H. Include an unaltered copy of this License. + I. Preserve the section entitled "History", and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. + J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. + K. In any section entitled "Acknowledgements" or "Dedications", preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. + L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. + M. Delete any section entitled "Endorsements". Such a section may not be included in the Modified Version. + N. Do not retitle any existing section as "Endorsements" or to conflict in title with any Invariant Section. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. @@ -71,7 +72,7 @@ You may add a section entitled "Endorsements", provided it contains nothing but You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. -The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. +The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS @@ -79,40 +80,40 @@ You may combine the Document with other documents released under this License, u The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. -In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements." +In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. -You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. +You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an "aggregate", and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document. -If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate. +If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate. 8. TRANSLATION -Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail. +Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail. 9. TERMINATION -You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. +You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. -Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. +Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: -Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled "GNU Free Documentation License". + Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have no Invariant Sections, write "with no Invariant Sections" instead of saying which ones are invariant. If you have no Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being LIST"; likewise for Back-Cover Texts. -If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. +If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. \ No newline at end of file diff --git a/options/license/GNU Free Documentation License v1.2 b/options/license/GFDL-1.2 similarity index 80% rename from options/license/GNU Free Documentation License v1.2 rename to options/license/GFDL-1.2 index 206e5ee..58863d0 100644 --- a/options/license/GNU Free Documentation License v1.2 +++ b/options/license/GFDL-1.2 @@ -1,8 +1,9 @@ GNU Free Documentation License -Version 1.2, November 2002 -Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +Version 1.2, November 2002 -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE @@ -10,7 +11,7 @@ The purpose of this License is to make a manual, textbook, or other functional a This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. -We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. +We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS @@ -32,13 +33,13 @@ The "Title Page" means, for a printed book, the title page itself, plus such fol A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. -The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. +The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. -You may also lend copies, under the same conditions stated above, and you may publicly display copies. +You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY @@ -48,27 +49,27 @@ If the required texts for either cover are too voluminous to fit legibly, you sh If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. -It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. +It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: -A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. -B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. -C. State on the Title page the name of the publisher of the Modified Version, as the publisher. -D. Preserve all the copyright notices of the Document. -E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. -F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. -G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. -H. Include an unaltered copy of this License. -I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. -J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. -K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. -L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. -M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. -N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. -O. Preserve any Warranty Disclaimers. + A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. + B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. + C. State on the Title page the name of the publisher of the Modified Version, as the publisher. + D. Preserve all the copyright notices of the Document. + E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. + F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. + G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. + H. Include an unaltered copy of this License. + I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. + J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. + K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. + L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. + M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. + N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. + O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. @@ -76,7 +77,7 @@ You may add a section Entitled "Endorsements", provided it contains nothing but You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. -The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. +The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS @@ -84,46 +85,46 @@ You may combine the Document with other documents released under this License, u The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. -In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". +In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. -You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. +You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. -If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. +If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. -If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. +If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION -You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. +You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. -Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. +Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: -Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". + Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: -with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. -If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. +If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. \ No newline at end of file diff --git a/options/license/GNU Free Documentation License v1.3 b/options/license/GFDL-1.3 similarity index 82% rename from options/license/GNU Free Documentation License v1.3 rename to options/license/GFDL-1.3 index b0fefa8..6041ddd 100644 --- a/options/license/GNU Free Documentation License v1.3 +++ b/options/license/GFDL-1.3 @@ -1,6 +1,7 @@ GNU Free Documentation License -Version 1.3, 3 November 2008 -Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +Version 1.3, 3 November 2008 + +Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -10,7 +11,7 @@ The purpose of this License is to make a manual, textbook, or other functional a This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. -We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. +We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS @@ -40,7 +41,7 @@ The Document may include Warranty Disclaimers next to the notice which states th You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. -You may also lend copies, under the same conditions stated above, and you may publicly display copies. +You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY @@ -50,26 +51,26 @@ If the required texts for either cover are too voluminous to fit legibly, you sh If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. -It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. +It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: -A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. -B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. -C. State on the Title page the name of the publisher of the Modified Version, as the publisher. -D. Preserve all the copyright notices of the Document. -E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. -F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. -G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. -I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. -J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. -K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. -L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. -M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. -N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. -O. Preserve any Warranty Disclaimers. + A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. + B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. + C. State on the Title page the name of the publisher of the Modified Version, as the publisher. + D. Preserve all the copyright notices of the Document. + E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. + F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. + G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. + I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. + J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. + K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. + L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. + M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. + N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. + O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. @@ -77,7 +78,7 @@ You may add a section Entitled "Endorsements", provided it contains nothing but You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. -The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. +The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS @@ -85,25 +86,25 @@ You may combine the Document with other documents released under this License, u The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. -In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". +In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. -You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. +You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. -If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. +If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. -If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. +If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION @@ -113,7 +114,7 @@ However, if you cease all violation of this License, then your license from a pa Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. +Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE @@ -131,18 +132,18 @@ Each version of the License is given a distinguishing version number. If the Doc An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. -The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. +The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: -Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". + Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: -with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. -If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. +If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. \ No newline at end of file diff --git a/options/license/GL2PS b/options/license/GL2PS new file mode 100644 index 0000000..7536c03 --- /dev/null +++ b/options/license/GL2PS @@ -0,0 +1,13 @@ +GL2PS LICENSE Version 2, November 2003 + +Copyright (C) 2003, Christophe Geuzaine + +Permission to use, copy, and distribute this software and its documentation for any purpose with or without fee is hereby granted, provided that the copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. + +Permission to modify and distribute modified versions of this software is granted, provided that: + +1) the modifications are licensed under the same terms as this software; + +2) you make available the source code of any modifications that you distribute, either on the same media as you distribute any executable or other form of this software, or via a mechanism generally accepted in the software development community for the electronic transfer of data. + +This software is provided "as is" without express or implied warranty. \ No newline at end of file diff --git a/options/license/GNU Affero General Public License v3.0 b/options/license/GNU Affero General Public License v3.0 deleted file mode 100644 index 3d3266e..0000000 --- a/options/license/GNU Affero General Public License v3.0 +++ /dev/null @@ -1,241 +0,0 @@ -GNU AFFERO GENERAL PUBLIC LICENSE -Version 3, 19 November 2007 -Copyright (C) 2007 Free Software Foundation, Inc. - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble - -The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software. - -The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - -Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software. - -A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public. - -The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version. - -An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS - -0. Definitions. - -"This License" refers to version 3 of the GNU Affero General Public License. - -"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - -"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. - -To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. - -A "covered work" means either the unmodified Program or a work based on the Program. - -To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - -To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - -1. Source Code. -The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. - -A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - -The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - -The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those -subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. -All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. -No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. -You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. -You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: - -a) The work must carry prominent notices stating that you modified it, and giving a relevant date. - -b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". - -c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. - -d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - -6. Conveying Non-Source Forms. -You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: - -a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. - -b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. - -c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. - -d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. - -e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - -A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - -"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - -7. Additional Terms. -"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: - -a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or - -b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or - -c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or - -d) Limiting the use for publicity purposes of names of licensors or authors of the material; or - -e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or - -f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. - -All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - -8. Termination. - -You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - -An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - -11. Patents. - -A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - -In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to s ue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - -A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - -13. Remote Network Interaction; Use with the GNU General Public License. - -Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph. - -Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License. - -14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - -Copyright (C) - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements. - -You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see . diff --git a/options/license/GNU General Public License v3.0 b/options/license/GNU General Public License v3.0 deleted file mode 100644 index 7083002..0000000 --- a/options/license/GNU General Public License v3.0 +++ /dev/null @@ -1,231 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 -Copyright © 2007 Free Software Foundation, Inc. - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble - -The GNU General Public License is a free, copyleft license for software and other kinds of works. - -The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS - -0. Definitions. - -“This License” refers to version 3 of the GNU General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based on the Program. - -To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - -1. Source Code. -The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. - -A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - -The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. -All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. -No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. -You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. -You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: - -a) The work must carry prominent notices stating that you modified it, and giving a relevant date. - -b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. - -c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. - -d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - -6. Conveying Non-Source Forms. -You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: - -a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. - -b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. - -c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. - -d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. - -e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - -A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - -7. Additional Terms. -“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: - -a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or - -b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or - -c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or - -d) Limiting the use for publicity purposes of names of licensors or authors of the material; or - -e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or - -f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. - -All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - -8. Termination. -You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. -You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. -Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - -An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - -11. Patents. -A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - -In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - -A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. -If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - -13. Use with the GNU Affero General Public License. -Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. - -14. Revised Versions of this License. -The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. -If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. - - -Copyright (C) - -This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - - Copyright (C) -This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. -This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. - -You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . - -The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . diff --git a/options/license/GNU General Public License v1.0 b/options/license/GPL-1.0 similarity index 73% rename from options/license/GNU General Public License v1.0 rename to options/license/GPL-1.0 index 902a4a4..434f1b2 100644 --- a/options/license/GNU General Public License v1.0 +++ b/options/license/GPL-1.0 @@ -1,6 +1,7 @@ GNU GENERAL PUBLIC LICENSE Version 1, February 1989 -Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -28,23 +29,23 @@ GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MO 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: -a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and + a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and -b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). + b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). -c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. + c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. -d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: -a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, + a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, -b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, + b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, -c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) + c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. @@ -74,26 +75,26 @@ If you develop a new program, and you want it to be of the greatest possible use To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - Copyright (C) 19yy + Copyright (C) 19yy -This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: -Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: -Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. -, 1 April 1989 Ty Coon, President of Vice + , 1 April 1989 Ty Coon, President of Vice -That's all there is to it! +That's all there is to it! \ No newline at end of file diff --git a/options/license/GNU General Public License v2.0 b/options/license/GPL-2.0 similarity index 80% rename from options/license/GNU General Public License v2.0 rename to options/license/GPL-2.0 index ee27892..cb39d53 100644 --- a/options/license/GNU General Public License v2.0 +++ b/options/license/GPL-2.0 @@ -1,7 +1,8 @@ -GNU GENERAL PUBLIC LICENSE +GNU GENERAL PUBLIC LICENSE Version 2, June 1991 -Copyright (C) 1989, 1991 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -35,11 +36,11 @@ You may charge a fee for the physical act of transferring a copy, and you may at 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: -a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. -b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. -c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. @@ -49,11 +50,11 @@ In addition, mere aggregation of another work not based on the Program with the 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: -a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, -b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, -c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. @@ -95,22 +96,22 @@ If you develop a new program, and you want it to be of the greatest possible use To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. -one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author + one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author -This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: -Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: -Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. + Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. -signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice +signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice \ No newline at end of file diff --git a/options/license/GPL-3.0 b/options/license/GPL-3.0 new file mode 100644 index 0000000..20dcfdf --- /dev/null +++ b/options/license/GPL-3.0 @@ -0,0 +1,15 @@ +GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS + 0. Definitions. + “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. + b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. + c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. + d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. + b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. + d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. + e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or + b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or + c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or + d) Limiting the use for publicity purposes of names of licensors or authors of the material; or + e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or + f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs + If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . \ No newline at end of file diff --git a/options/license/Giftware b/options/license/Giftware new file mode 100644 index 0000000..c22c5a6 --- /dev/null +++ b/options/license/Giftware @@ -0,0 +1,9 @@ +Allegro 4 (the giftware license) + +Allegro is gift-ware. It was created by a number of people working in cooperation, and is given to you freely as a gift. You may use, modify, redistribute, and generally hack it about in any way you like, and you do not have to give us anything in return. + +However, if you like this product you are encouraged to thank us by making a return gift to the Allegro community. This could be by writing an add-on package, providing a useful bug report, making an improvement to the library, or perhaps just releasing the sources of your program so that other people can learn from them. If you redistribute parts of this code or make a game using it, it would be nice if you mentioned Allegro somewhere in the credits, but you are not required to do this. We trust you not to abuse our generosity. + +By Shawn Hargreaves, 18 October 1998. + +DISCLAIMER: THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/options/license/Glide b/options/license/Glide new file mode 100644 index 0000000..2059f97 --- /dev/null +++ b/options/license/Glide @@ -0,0 +1,95 @@ +3DFX GLIDE Source Code General Public License + +1. PREAMBLE + +This license is for software that provides a 3D graphics application program interface (API).The license is intended to offer terms similar to some standard General Public Licenses designed to foster open standards and unrestricted accessibility to source code. Some of these licenses require that, as a condition of the license of the software, any derivative works (that is, new software which is a work containing the original program or a portion of it) must be available for general use, without restriction other than for a minor transfer fee, and that the source code for such derivative works must likewise be made available. The only restriction is that such derivative works must be subject to the same General Public License terms as the original work. + +This 3dfx GLIDE Source Code General Public License differs from the standard licenses of this type in that it does not require the entire derivative work to be made available under the terms of this license nor is the recipient required to make available the source code for the entire derivative work. Rather, the license is limited to only the identifiable portion of the derivative work that is derived from the licensed software. The precise terms and conditions for copying, distribution and modification follow. + +2. DEFINITIONS + + 2.1 This License applies to any program (or other "work") which contains a notice placed by the copyright holder saying it may be distributed under the terms of this 3dfx GLIDE Source Code General Public License. + + 2.2 The term "Program" as used in this Agreement refers to 3DFX's GLIDE source code and object code and any Derivative Work. + + 2.3 "Derivative Work" means, for the purpose of the License, that portion of any work that contains the Program or the identifiable portion of a work that is derived from the Program, either verbatim or with modifications and/or translated into another language, and that performs 3D graphics API operations. It does not include any other portions of a work. + + 2.4 "Modifications of the Program" means any work, which includes a Derivative Work, and includes the whole of such work. + + 2.5 "License" means this 3dfx GLIDE Source Code General Public License. + + 2.6 The "Source Code" for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, any associated interface definition files, and the scripts used to control compilation and installation of the executable work. + + 2.7 "3dfx" means 3dfx Interactive, Inc. + +3. LICENSED ACTIVITIES + + 3.1 COPYING - You may copy and distribute verbatim copies of the Program's Source Code as you receive it, in any medium, subject to the provision of section 3.3 and provided also that: + + (a) you conspicuously and appropriately publish on each copy an appropriate copyright notice (3dfx Interactive, Inc. 1999), a notice that recipients who wish to copy, distribute or modify the Program can only do so subject to this License, and a disclaimer of warranty as set forth in section 5; + + (b) keep intact all the notices that refer to this License and to the absence of any warranty; and + + (c) do not make any use of the GLIDE trademark without the prior written permission of 3dfx, and + + (d) give all recipients of the Program a copy of this License along with the Program or instructions on how to easily receive a copy of this License. + + 3.2 MODIFICATION OF THE PROGRAM/DERIVATIVE WORKS - You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications subject to the provisions of section 3.3 and provided that you also meet all of the following conditions: + + (a) you conspicuously and appropriately publish on each copy of a Derivative Work an appropriate copyright notice, a notice that recipients who wish to copy, distribute or modify the Derivative Work can only do so subject to this License, and a disclaimer of warranty as set forth in section 5; + + (b) keep intact all the notices that refer to this License and to the absence of any warranty; and (c) give all recipients of the Derivative Work a copy of this License along with the Derivative Work or instructions on how to easily receive a copy of this License. + + (d) You must cause the modified files of the Derivative Work to carry prominent notices stating that you changed the files and the date of any change. + + (e) You must cause any Derivative Work that you distribute or publish to be licensed at no charge to all third parties under the terms of this License. + + (f) You do not make any use of the GLIDE trademark without the prior written permission of 3dfx. + + (g) If the Derivative Work normally reads commands interactively when run, you must cause it, when started running for such interactive use, to print or display an announcement as follows: + + "COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED THIS SOFTWARE IS FREE AND PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. THERE IS NO RIGHT TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX INTERACTIVE, INC. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A FULL TEXT OF THE DISTRIBUTION AND NON-WARRANTY PROVISIONS (REQUEST COPY FROM INFO@3DFX.COM)." + + (h) The requirements of this section 3.2 do not apply to the modified work as a whole but only to the Derivative Work. It is not the intent of this License to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of Derivative Works. + + 3.3 DISTRIBUTION + + (a) All copies of the Program or Derivative Works which are distributed must include in the file headers the following language verbatim: + + "THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC (info@3dfx.com). THIS PROGRAM. IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A FULL TEXT OF THE NON-WARRANTY PROVISIONS. + + USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013, AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF THE UNITED STATES. + + COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED" + + (b) You may distribute the Program or a Derivative Work in object code or executable form under the terms of Sections 3.1 and 3.2 provided that you also do one of the following: + + (1) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 3.1 and 3.2; or, + + (2) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 3.1 and 3.2 on a medium customarily used for software interchange; or, + + (3) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection 3.3(b)(2) above.) + + (c) The source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable code. + + (d) If distribution of executable code or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + + (e) Each time you redistribute the Program or any Derivative Work, the recipient automatically receives a license from 3dfx and successor licensors to copy, distribute or modify the Program and Derivative Works subject to the terms and conditions of the License. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + + (f) You may not make any use of the GLIDE trademark without the prior written permission of 3dfx. + + (g) You may not copy, modify, sublicense, or distribute the Program or any Derivative Works except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program or any Derivative Works is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +4. MISCELLANEOUS + + 4.1 Acceptance of this License is voluntary. By using, modifying or distributing the Program or any Derivative Work, you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. Nothing else grants you permission to modify or distribute the Program or Derivative Works and doing so without acceptance of this License is in violation of the U.S. and international copyright laws. + + 4.2 If the distribution and/or use of the Program or Derivative Works is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + + 4.3 This License is to be construed according to the laws of the State of California and you consent to personal jurisdiction in the State of California in the event it is necessary to enforce the provisions of this License. + +5. NO WARRANTIES + + 5.1 TO THE EXTENT PERMITTED BY APPLICABLE LAW, THERE IS NO WARRANTY FOR THE PROGRAM. OR DERIVATIVE WORKS THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM AND ANY DERIVATIVE WORKS"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM AND ANY DERIVATIVE WORK IS WITH YOU. SHOULD THE PROGRAM OR ANY DERIVATIVE WORK PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 5.2 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL 3DFX INTERACTIVE, INC., OR ANY OTHER COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM OR DERIVATIVE WORKS AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM OR DERIVATIVE WORKS (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM OR DERIVATIVE WORKS TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/options/license/Glulxe b/options/license/Glulxe new file mode 100644 index 0000000..8bbb720 --- /dev/null +++ b/options/license/Glulxe @@ -0,0 +1,3 @@ +The source code in this package is copyright 1999-2010 by Andrew Plotkin. + +You may copy and distribute it freely, by any means and under any conditions, as long as the code and documentation is not changed. You may also incorporate this code into your own program and distribute that, or modify this code and use and distribute the modified version, as long as you retain a notice in your program or documentation which mentions my name and the URL shown above. diff --git a/options/license/HPND b/options/license/HPND new file mode 100644 index 0000000..6da9371 --- /dev/null +++ b/options/license/HPND @@ -0,0 +1,7 @@ +Historical Permission Notice and Disclaimer + + + +Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies[,] [and] that both [that] [the] copyright notice and this permission notice appear in supporting documentation[, and that the name [of] [or ] not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission]. [ makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.] + +[ DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS[,][.] IN NO EVENT SHALL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.] diff --git a/options/license/HaskellReport b/options/license/HaskellReport new file mode 100644 index 0000000..563b705 --- /dev/null +++ b/options/license/HaskellReport @@ -0,0 +1,6 @@ +Code derived from the document "Report on the Programming Language +Haskell 2010", is distributed under the following license: + +Copyright (c) 2010 Simon Marlow + +The authors intend this Report to belong to the entire Haskell community, and so we grant permission to copy and distribute it for any purpose, provided that it is reproduced in its entirety, including this Notice. Modified versions of this Report may also be copied and distributed for any purpose, provided that the modified version is clearly presented as such, and that it does not claim to be a definition of the Haskell 2010 Language. diff --git a/options/license/IBM-pibs b/options/license/IBM-pibs new file mode 100644 index 0000000..43fe439 --- /dev/null +++ b/options/license/IBM-pibs @@ -0,0 +1,8 @@ +This source code has been made available to you by IBM on an AS-IS basis.  Anyone receiving this source is licensed under IBM copyrights to use it in any way he or she deems fit, including copying it, modifying it, compiling it, and redistributing it either with or without modifications.  No license under IBM patents or patent applications is to be implied by the copyright license. + +Any user of this software should understand that IBM cannot provide technical support for this software and will not be responsible for any consequences resulting from the use of this software. + +Any person who transfers this source code or any derivative work must include the IBM copyright notice, this paragraph, and the preceding two paragraphs in the transferred software. + +COPYRIGHT   I B M   CORPORATION 2002 +LICENSED MATERIAL  -  PROGRAM PROPERTY OF I B M \ No newline at end of file diff --git a/options/license/ICU b/options/license/ICU new file mode 100644 index 0000000..883ab20 --- /dev/null +++ b/options/license/ICU @@ -0,0 +1,12 @@ +ICU License - ICU 1.8.1 and later + +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1995-2014 International Business Machines Corporation and others +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. diff --git a/options/license/IJG b/options/license/IJG new file mode 100644 index 0000000..e8030ce --- /dev/null +++ b/options/license/IJG @@ -0,0 +1,38 @@ +Independent JPEG Group License + +LEGAL ISSUES + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a program, you must acknowledge somewhere in your documentation that you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, with respect to this software, its quality, accuracy, merchantability, or fitness for a particular purpose. This software is provided "AS IS", and you, its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1998, Thomas G. Lane. All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this software (or portions thereof) for any purpose, without fee, subject to these conditions: + + (1) If any part of the source code for this software is distributed, then this README file must be included, with this copyright and no-warranty notice unaltered; and any additions, deletions, or changes to the original files must be clearly indicated in accompanying documentation. + (2) If only executable code is distributed, then the accompanying documentation must state that "this software is based in part on the work of the Independent JPEG Group". + (3) Permission for use of this software is granted only if the user accepts full responsibility for any undesirable consequences; the authors accept NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, not just to the unmodified library. If you use our work, you ought to acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name in advertising or publicity relating to this software or products derived from it. This software may be referred to only as "the Independent JPEG Group's software". + +We specifically permit and encourage the use of this software as the basis of commercial products, provided that all warranty or liability claims are assumed by the product vendor. + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. ansi2knr.c is NOT covered by the above copyright and conditions, but instead by the usual distribution terms of the Free Software Foundation; principally, that you must include source code if you redistribute it. (See the file ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part of any program generated from the IJG code, this does not limit you more than the foregoing paragraphs do. + +The Unix configuration script "configure" was produced with GNU Autoconf. It is copyright by the Free Software Foundation but is freely distributable. The same holds for its supporting scripts (config.guess, config.sub, ltconfig, ltmain.sh). Another support script, install-sh, is copyright by M.I.T. but is also freely distributable. + +It appears that the arithmetic coding option of the JPEG spec is covered by patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot legally be used without obtaining one or more licenses. For this reason, support for arithmetic coding has been removed from the free JPEG software. (Since arithmetic coding provides only a marginal gain over the unpatented Huffman mode, it is unlikely that very many implementations will support it.) So far as we are aware, there are no patent restrictions on the remaining code. + +The IJG distribution formerly included code to read and write GIF files. To avoid entanglement with the Unisys LZW patent, GIF reading support has been removed altogether, and the GIF writer has been simplified to produce "uncompressed GIFs". This technique does not use the LZW algorithm; the resulting GIF files are larger than usual, but are readable by all standard GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of CompuServe Incorporated. GIF(sm) is a Service Mark property of CompuServe Incorporated." \ No newline at end of file diff --git a/options/license/IPA b/options/license/IPA new file mode 100644 index 0000000..234c53e --- /dev/null +++ b/options/license/IPA @@ -0,0 +1,83 @@ +IPA Font License Agreement v1.0 + +The Licensor provides the Licensed Program (as defined in Article 1 below) under the terms of this license agreement ("Agreement"). Any use, reproduction or distribution of the Licensed Program, or any exercise of rights under this Agreement by a Recipient (as defined in Article 1 below) constitutes the Recipient's acceptance of this Agreement. + +Article 1 (Definitions) + +1. "Digital Font Program" shall mean a computer program containing, or used to render or display fonts. + +2. "Licensed Program" shall mean a Digital Font Program licensed by the Licensor under this Agreement. + +3. "Derived Program" shall mean a Digital Font Program created as a result of a modification, addition, deletion, replacement or any other adaptation to or of a part or all of the Licensed Program, and includes a case where a Digital Font Program newly created by retrieving font information from a part or all of the Licensed Program or Embedded Fonts from a Digital Document File with or without modification of the retrieved font information. + +4. "Digital Content" shall mean products provided to end users in the form of digital data, including video content, motion and/or still pictures, TV programs or other broadcasting content and products consisting of character text, pictures, photographic images, graphic symbols and/or the like. + +5. "Digital Document File" shall mean a PDF file or other Digital Content created by various software programs in which a part or all of the Licensed Program becomes embedded or contained in the file for the display of the font ("Embedded Fonts"). Embedded Fonts are used only in the display of characters in the particular Digital Document File within which they are embedded, and shall be distinguished from those in any Digital Font Program, which may be used for display of characters outside that particular Digital Document File. + +6. "Computer" shall include a server in this Agreement. + +7. "Reproduction and Other Exploitation" shall mean reproduction, transfer, distribution, lease, public transmission, presentation, exhibition, adaptation and any other exploitation. + +8. "Recipient" shall mean anyone who receives the Licensed Program under this Agreement, including one that receives the Licensed Program from a Recipient. + +Article 2 (Grant of License) + +The Licensor grants to the Recipient a license to use the Licensed Program in any and all countries in accordance with each of the provisions set forth in this Agreement. However, any and all rights underlying in the Licensed Program shall be held by the Licensor. In no sense is this Agreement intended to transfer any right relating to the Licensed Program held by the Licensor except as specifically set forth herein or any right relating to any trademark, trade name, or service mark to the Recipient. + +1. The Recipient may install the Licensed Program on any number of Computers and use the same in accordance with the provisions set forth in this Agreement. + +2. The Recipient may use the Licensed Program, with or without modification in printed materials or in Digital Content as an expression of character texts or the like. + +3. The Recipient may conduct Reproduction and Other Exploitation of the printed materials and Digital Content created in accordance with the preceding Paragraph, for commercial or non-commercial purposes and in any form of media including but not limited to broadcasting, communication and various recording media. + +4. If any Recipient extracts Embedded Fonts from a Digital Document File to create a Derived Program, such Derived Program shall be subject to the terms of this agreement. + +5. If any Recipient performs Reproduction or Other Exploitation of a Digital Document File in which Embedded Fonts of the Licensed Program are used only for rendering the Digital Content within such Digital Document File then such Recipient shall have no further obligations under this Agreement in relation to such actions. + +6. The Recipient may reproduce the Licensed Program as is without modification and transfer such copies, publicly transmit or otherwise redistribute the Licensed Program to a third party for commercial or non-commercial purposes ("Redistribute"), in accordance with the provisions set forth in Article 3 Paragraph 2. + +7. The Recipient may create, use, reproduce and/or Redistribute a Derived Program under the terms stated above for the Licensed Program: provided, that the Recipient shall follow the provisions set forth in Article 3 Paragraph 1 when Redistributing the Derived Program. + +Article 3 (Restriction) + +The license granted in the preceding Article shall be subject to the following restrictions: + +1. If a Derived Program is Redistributed pursuant to Paragraph 4 and 7 of the preceding Article, the following conditions must be met : + + (1) The following must be also Redistributed together with the Derived Program, or be made available online or by means of mailing mechanisms in exchange for a cost which does not exceed the total costs of postage, storage medium and handling fees: + + (a) a copy of the Derived Program; and + + (b) any additional file created by the font developing program in the course of creating the Derived Program that can be used for further modification of the Derived Program, if any. + + (2) It is required to also Redistribute means to enable recipients of the Derived Program to replace the Derived Program with the Licensed Program first released under this License (the "Original Program"). Such means may be to provide a difference file from the Original Program, or instructions setting out a method to replace the Derived Program with the Original Program. + + (3) The Recipient must license the Derived Program under the terms and conditions of this Agreement. + + (4) No one may use or include the name of the Licensed Program as a program name, font name or file name of the Derived Program. + + (5) Any material to be made available online or by means of mailing a medium to satisfy the requirements of this paragraph may be provided, verbatim, by any party wishing to do so. + +2. If the Recipient Redistributes the Licensed Program pursuant to Paragraph 6 of the preceding Article, the Recipient shall meet all of the following conditions: + + (1) The Recipient may not change the name of the Licensed Program. + + (2) The Recipient may not alter or otherwise modify the Licensed Program. + + (3) The Recipient must attach a copy of this Agreement to the Licensed Program. + +3. THIS LICENSED PROGRAM IS PROVIDED BY THE LICENSOR "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTY AS TO THE LICENSED PROGRAM OR ANY DERIVED PROGRAM, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXTENDED, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO; PROCUREMENT OF SUBSTITUTED GOODS OR SERVICE; DAMAGES ARISING FROM SYSTEM FAILURE; LOSS OR CORRUPTION OF EXISTING DATA OR PROGRAM; LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE INSTALLATION, USE, THE REPRODUCTION OR OTHER EXPLOITATION OF THE LICENSED PROGRAM OR ANY DERIVED PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +4. The Licensor is under no obligation to respond to any technical questions or inquiries, or provide any other user support in connection with the installation, use or the Reproduction and Other Exploitation of the Licensed Program or Derived Programs thereof. + +Article 4 (Termination of Agreement) + +1. The term of this Agreement shall begin from the time of receipt of the Licensed Program by the Recipient and shall continue as long as the Recipient retains any such Licensed Program in any way. + +2. Notwithstanding the provision set forth in the preceding Paragraph, in the event of the breach of any of the provisions set forth in this Agreement by the Recipient, this Agreement shall automatically terminate without any notice. In the case of such termination, the Recipient may not use or conduct Reproduction and Other Exploitation of the Licensed Program or a Derived Program: provided that such termination shall not affect any rights of any other Recipient receiving the Licensed Program or the Derived Program from such Recipient who breached this Agreement. + +Article 5 (Governing Law) + +1. IPA may publish revised and/or new versions of this License. In such an event, the Recipient may select either this Agreement or any subsequent version of the Agreement in using, conducting the Reproduction and Other Exploitation of, or Redistributing the Licensed Program or a Derived Program. Other matters not specified above shall be subject to the Copyright Law of Japan and other related laws and regulations of Japan. + +2. This Agreement shall be construed under the laws of Japan. \ No newline at end of file diff --git a/options/license/IPL-1.0 b/options/license/IPL-1.0 new file mode 100644 index 0000000..9b5da18 --- /dev/null +++ b/options/license/IPL-1.0 @@ -0,0 +1,215 @@ +IBM Public License Version 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS IBM +PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION +OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS +"Contribution" means: + +a. in the case of International Business Machines Corporation ("IBM"), the Original Program, and + +b. in the case of each Contributor, + i. changes to the Program, and + ii. additions to the Program; +where such changes and/or additions to the Program originate from and +are distributed by that particular Contributor. A Contribution +'originates' from a Contributor if it was added to the Program by +such Contributor itself or anyone acting on such Contributor's +behalf. Contributions do not include additions to the Program which: +(i) are separate modules of software distributed in conjunction with +the Program under their own license agreement, and (ii) are not +derivative works of the Program. + +"Contributor" means IBM and any other entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a +Contributor which are necessarily infringed by the use or sale of its +Contribution alone or when combined with the Program. + +"Original Program" means the original version of the software +accompanying this Agreement as released by IBM, including source +code, object code and documentation, if any. + +"Program" means the Original Program and Contributions. + +"Recipient" means anyone who receives the Program under this +Agreement, including all Contributors. + +2. GRANT OF RIGHTS +a. Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free copyright +license to reproduce, prepare derivative works of, publicly display, +publicly perform, distribute and sublicense the Contribution of such +Contributor, if any, and such derivative works, in source code and +object code form. + +b. Subject to the terms of this Agreement, each Contributor hereby +grants Recipient a non-exclusive, worldwide, royalty-free patent +license under Licensed Patents to make, use, sell, offer to sell, +import and otherwise transfer the Contribution of such Contributor, +if any, in source code and object code form. This patent license +shall apply to the combination of the Contribution and the Program +if, at the time the Contribution is added by the Contributor, such +addition of the Contribution causes such combination to be covered by +the Licensed Patents. The patent license shall not apply to any +other combinations which include the Contribution. No hardware per +se is licensed hereunder. + +c. Recipient understands that although each Contributor grants the +licenses to its Contributions set forth herein, no assurances are +provided by any Contributor that the Program does not infringe the +patent or other intellectual property rights of any other entity. +Each Contributor disclaims any liability to Recipient for claims +brought by any other entity based on infringement of intellectual +property rights or otherwise. As a condition to exercising the +rights and licenses granted hereunder, each Recipient hereby assumes +sole responsibility to secure any other intellectual property rights +needed, if any. For example, if a third party patent license is +required to allow Recipient to distribute the Program, it is +Recipient's responsibility to acquire that license before +distributing the Program. + +d. Each Contributor represents that to its knowledge it has +sufficient copyright rights in its Contribution, if any, to grant the +copyright license set forth in this Agreement. + +3. REQUIREMENTS +A Contributor may choose to distribute +the Program in object code form under its own license agreement, +provided that: + +a. it complies with the terms and conditions of this Agreement; and +b. its license agreement: + i. effectively disclaims on behalf of all Contributors all warranties + and conditions, express and implied, including warranties or + conditions of title and non-infringement, and implied warranties or + conditions of merchantability and fitness for a particular purpose; + ii. effectively excludes on behalf of all Contributors all liability + for damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + iii. states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + iv. states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: +a. it must be made available under this Agreement; and +b. a copy of this Agreement must be included with each copy of the +Program. + +Each Contributor must include the following in a conspicuous location in the Program: + + Copyright (C) 1996, 1999 International Business Machines Corporation and others. All Rights Reserved. + +In addition, each Contributor must identify itself as the originator +of its Contribution, if any, in a manner that reasonably allows +subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION +Commercial distributors of software may accept certain +responsibilities with respect to end users, business partners and the +like. While this license is intended to facilitate the commercial +use of the Program, the Contributor who includes the Program in a +commercial product offering should do so in a manner which does not +create potential liability for other Contributors. Therefore, if a +Contributor includes the Program in a commercial product offering, +such Contributor ("Commercial Contributor") hereby agrees to defend +and indemnify every other Contributor ("Indemnified Contributor") +against any losses, damages and costs (collectively "Losses") arising +from claims, lawsuits and other legal actions brought by a third +party against the Indemnified Contributor to the extent caused by the +acts or omissions of such Commercial Contributor in connection with +its distribution of the Program in a commercial product offering. +The obligations in this section do not apply to any claims or Losses +relating to any actual or alleged intellectual property infringement. +In order to qualify, an Indemnified Contributor must: a) promptly +notify the Commercial Contributor in writing of such claim, and b) +allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any +such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's +responsibility alone. Under this section, the Commercial Contributor +would have to defend claims against the other Contributors related to +those performance claims and warranties, and if a court requires any +other Contributor to pay any damages as a result, the Commercial +Contributor must pay those damages. + +5. NO WARRANTY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS +PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY +WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY +OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely +responsible for determining the appropriateness of using and +distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement, including but not limited to +the risks and costs of program errors, compliance with applicable +laws, damage to or loss of data, programs or equipment, and +unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT +NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS +GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with +respect to a patent applicable to software (including a cross-claim +or counterclaim in a lawsuit), then any patent licenses granted by +that Contributor to such Recipient under this Agreement shall +terminate as of the date such litigation is filed. In addition, if +Recipient institutes patent litigation against any entity (including +a cross-claim or counterclaim in a lawsuit) alleging that the Program +itself (excluding combinations of the Program with other software or +hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any +licenses granted by Recipient relating to the Program shall continue +and survive. + +IBM may publish new versions (including revisions) of this Agreement +from time to time. Each new version of the Agreement will be given a +distinguishing version number. The Program (including Contributions) +may always be distributed subject to the version of the Agreement +under which it was received. In addition, after a new version of the +Agreement is published, Contributor may elect to distribute the +Program (including its Contributions) under the new version. No one +other than IBM has the right to modify this Agreement. Except as +expressly stated in Sections 2(a) and 2(b) above, Recipient receives +no rights or licenses to the intellectual property of any Contributor +under this Agreement, whether expressly, by implication, estoppel or +otherwise. All rights in the Program not expressly granted under +this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and +the intellectual property laws of the United States of America. No +party to this Agreement will bring a legal action under this +Agreement more than one year after the cause of action arose. Each +party waives its rights to a jury trial in any resulting litigation. \ No newline at end of file diff --git a/options/license/ISC license b/options/license/ISC similarity index 81% rename from options/license/ISC license rename to options/license/ISC index a4bac65..d50e0cf 100644 --- a/options/license/ISC license +++ b/options/license/ISC @@ -1,6 +1,8 @@ ISC License: -Copyright (c) Year(s), Company or Person's Name + +Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") +Copyright (c) 1995-2003 by Internet Software Consortium Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/options/license/ImageMagick b/options/license/ImageMagick new file mode 100644 index 0000000..865627a --- /dev/null +++ b/options/license/ImageMagick @@ -0,0 +1,98 @@ +Before we get to the text of the license, lets just review what the license says in simple terms: + +It allows you to: + + * freely download and use ImageMagick software, in whole or in part, for personal, company internal, or commercial purposes; + * use ImageMagick software in packages or distributions that you create; + * link against a library under a different license; + * link code under a different license against a library under this license; + * merge code into a work under a different license; + * extend patent grants to any code using code under this license; + * and extend patent protection. + +It forbids you to: + + * redistribute any piece of ImageMagick-originated software without proper attribution; + * use any marks owned by ImageMagick Studio LLC in any way that might state or imply that ImageMagick Studio LLC endorses your distribution; + * use any marks owned by ImageMagick Studio LLC in any way that might state or imply that you created the ImageMagick software in question. + +It requires you to: + + * include a copy of the license in any redistribution you may make that includes ImageMagick software; + * provide clear attribution to ImageMagick Studio LLC for any distributions that include ImageMagick software. + +It does not require you to: + + * include the source of the ImageMagick software itself, or of any modifications you may have made to it, in any redistribution you may assemble that includes it; + * submit changes that you make to the software back to the ImageMagick Studio LLC (though such feedback is encouraged). + +A few other clarifications include: + + * ImageMagick is freely available without charge; + * you may include ImageMagick on a DVD as long as you comply with the terms of the license; + * you can give modified code away for free or sell it under the terms of the ImageMagick license or distribute the result under a different license, but you need to acknowledge the use of the ImageMagick software; + * the license is compatible with the GPL V3. + * when exporting the ImageMagick software, review its export classification. + +Terms and Conditions for Use, Reproduction, and Distribution + +The legally binding and authoritative terms and conditions for use, reproduction, and distribution of ImageMagick follow: + +Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization dedicated to making software imaging solutions freely available. + +1. Definitions. + +License shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +Legal Entity shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, control means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +You (or Your) shall mean an individual or Legal Entity exercising permissions granted by this License. + +Source form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +Object form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +Work shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +Derivative Works shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +Contribution shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as Not a Contribution. + +Contributor shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + a. You must give any other recipients of the Work or Derivative Works a copy of this License; and + b. You must cause any modified files to carry prominent notices stating that You changed the files; and + c. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + d. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +How to Apply the License to your Work + +To apply the ImageMagick License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information (don't include the brackets). The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the ImageMagick License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + + http://www.imagemagick.org/script/license.php + + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. \ No newline at end of file diff --git a/options/license/Imlib2 b/options/license/Imlib2 new file mode 100644 index 0000000..065a179 --- /dev/null +++ b/options/license/Imlib2 @@ -0,0 +1,9 @@ +Imlib2 License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies of the Software and its Copyright notices. In addition publicly documented acknowledgment must be given that this software has been used if no source code of this software is made available publicly. Making the source available publicly means including the source for this software with the distribution, or a method to get this software via some reasonable mechanism (electronic transfer via a network or media) as well as making an offer to supply the source on request. This Copyright notice serves as an offer to supply the source on on request as well. Instead of this, supplying acknowledgments of use of this software in either Copyright notices, Manuals, Publicity and Marketing documents or any documentation provided with any product containing this software. This License does not apply to any software that links to the libraries provided by this software (statically or dynamically), but only to the software provided. + +Please see the COPYING-PLAIN for a plain-english explanation of this notice and its intent. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/options/license/Info-ZIP b/options/license/Info-ZIP new file mode 100644 index 0000000..0e53f67 --- /dev/null +++ b/options/license/Info-ZIP @@ -0,0 +1,16 @@ +Info-ZIP License + +Copyright (c) 1990-2009 Info-ZIP. All rights reserved. + +For the purposes of this copyright and license, "Info-ZIP" is defined as the following set of individuals: + + Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois, Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth, Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz, David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko, Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs, Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda, Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren, Rich Wales, Mike White. + +This software is provided "as is," without warranty of any kind, express or implied. In no event shall Info-ZIP or its contributors be held liable for any direct, indirect, incidental, special or consequential damages arising out of the use of or inability to use this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the above disclaimer and the following restrictions: + + * Redistributions of source code (in whole or in part) must retain the above copyright notice, definition, disclaimer, and this list of conditions.
 + * Redistributions in binary form (compiled executables and libraries) must reproduce the above copyright notice, definition, disclaimer, and this list of conditions in documentation and/or other materials provided with the distribution. Additional documentation is not needed for executables where a command line license option provides these and a note regarding this option is in the executable's startup banner. The sole exception to this condition is redistribution of a standard UnZipSFX binary (including SFXWiz) as part of a self-extracting archive; that is permitted without inclusion of this license, as long as the normal SFX banner has not been removed from the binary or disabled.
 + * Altered versions--including, but not limited to, ports to new operating systems, existing ports with new graphical interfaces, versions with modified or added functionality, and dynamic, shared, or static library versions not from Info-ZIP--must be plainly marked as such and must not be misrepresented as being the original source or, if binaries, compiled from the original source. Such altered versions also must not be misrepresented as being Info-ZIP releases--including, but not limited to, labeling of the altered versions with the names "Info-ZIP" (or any variation thereof, including, but not limited to, different capitalizations), "Pocket UnZip," "WiZ" or "MacZip" without the explicit permission of Info-ZIP. Such altered versions are further prohibited from misrepresentative use of the Zip-Bugs or Info-ZIP e-mail addresses or the Info-ZIP URL(s), such as to imply Info-ZIP will provide support for the altered versions.
 + * Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip," "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its own source and binary releases. diff --git a/options/license/Intel b/options/license/Intel new file mode 100644 index 0000000..3696e8d --- /dev/null +++ b/options/license/Intel @@ -0,0 +1,13 @@ +Intel Open Source License + +Copyright (c) 1996-2000 Intel Corporation All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + • Neither the name of the Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF YOUR JURISDICTION. It is licensee's responsibility to comply with any export regulations applicable in licensee's jurisdiction. Under CURRENT (May 2000) U.S. export regulations this software is eligible for export from the U.S. and can be downloaded by or otherwise exported or reexported worldwide EXCEPT to U.S. embargoed destinations which include Cuba, Iraq, Libya, North Korea, Iran, Syria, Sudan, Afghanistan and any other country to which the U.S. has embargoed goods and services. diff --git a/options/license/Intel-ACPI b/options/license/Intel-ACPI new file mode 100644 index 0000000..7557060 --- /dev/null +++ b/options/license/Intel-ACPI @@ -0,0 +1,34 @@ +ACPI - Software License Agreement +
Software License Agreement IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING. + +Do not use or load this software and any associated materials (collectively, the "Software") until you have carefully read the following terms and conditions. By loading or using the Software, you agree to the terms of this Agreement. If you do not wish to so agree, do not install or use the Software. + +1. COPYRIGHT NOTICE Some or all of this work - Copyright © 1999-2005, Intel Corp. All rights reserved. + +2. LICENSE + + 2.1. This is your license from Intel Corp. under its intellectual property rights. You may have additional license terms from the party that provided you this software, covering your right to use that party's intellectual property rights. + + 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a copy of the source code appearing in this file ("Covered Code") an irrevocable, perpetual, worldwide license under Intel's copyrights in the base code distributed originally by Intel ("Original Intel Code") to copy, make derivatives, distribute, use and display any portion of the Covered Code in any form, with the right to sublicense such rights; and + + 2.3. Intel grants Licensee a non-exclusive and non-transferable patent license (with the right to sublicense), under only those claims of Intel patents that are infringed by the Original Intel Code, to make, use, sell, offer to sell, and import the Covered Code and derivative works thereof solely to the minimum extent necessary to exercise the above copyright license, and in no event shall the patent license extend to any additions to or modifications of the Original Intel Code. No other license or right is granted directly or by implication, estoppel or otherwise; The above copyright and patent license is granted only if the following conditions are met: + +3. CONDITIONS + + 3.1. Redistribution of Source with Rights to Further Distribute Source. Redistribution of source code of any substantial portion of the Covered Code or modification with rights to further distribute source must include the above Copyright Notice, the above License, this list of Conditions, and the following Disclaimer and Export Compliance provision. In addition, Licensee must cause all Covered Code to which Licensee contributes to contain a file documenting the changes Licensee made to create that Covered Code and the date of any change. Licensee must include in that file the documentation of any changes made by any predecessor Licensee. Licensee must include a prominent statement that the modification is derived, directly or indirectly, from Original Intel Code. + + 3.2. Redistribution of Source with no Rights to Further Distribute Source. Redistribution of source code of any substantial portion of the Covered Code or modification without rights to further distribute source must include the following Disclaimer and Export Compliance provision in the documentation and/or other materials provided with distribution. In addition, Licensee may not authorize further sublicense of source of any portion of the Covered Code, and must include terms to the effect that the license from Licensee to its licensee is limited to the intellectual property embodied in the software Licensee provides to its licensee, and not to intellectual property embodied in modifications its licensee may make. + + 3.3. Redistribution of Executable. Redistribution in executable form of any substantial portion of the Covered Code or modification must reproduce the above Copyright Notice, and the following Disclaimer and Export Compliance provision in the documentation and/or other materials provided with the distribution. + + 3.4. Intel retains all right, title, and interest in and to the Original Intel Code. + + 3.5. Neither the name Intel nor any other trademark owned or controlled by Intel shall be used in advertising or otherwise to promote the sale, use or other dealings in products derived from or relating to the Covered Code without prior written authorization from Intel. + +4. DISCLAIMER AND EXPORT COMPLIANCE + + 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. + + 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY LIMITED REMEDY. + + 4.3. Licensee shall not export, either directly or indirectly, any of this software or system incorporating such software without first obtaining any required license or other approval from the U. S. Department of Commerce or any other agency or department of the United States Government. In the event Licensee exports any such software from the United States or re-exports any such software from a foreign destination, Licensee shall ensure that the distribution and export/re-export of the software is in compliance with all laws, regulations, orders, or other restrictions of the U.S. Export Administration Regulations. Licensee agrees that neither it nor any of its subsidiaries will export/re-export any technical data, process, software, or service, directly or indirectly, to any country for which the United States government or any agency thereof requires an export license, other governmental approval, or letter of assurance, without first obtaining such license, approval or letter. diff --git a/options/license/Interbase-1.0 b/options/license/Interbase-1.0 new file mode 100644 index 0000000..77dbac7 --- /dev/null +++ b/options/license/Interbase-1.0 @@ -0,0 +1,199 @@ +INTERBASE PUBLIC LICENSE +Version 1.0 + +1. Definitions. + +1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. + +1.1. ''Contributor'' means each entity that creates or contributes to the creation of Modifications. + +1.2. ''Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + +1.3. ''Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + +1.4. ''Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data. + +1.5. ''Executable'' means Covered Code in any form other than Source Code. + +1.6. ''Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + +1.7. ''Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + +1.8. ''License'' means this document. + +1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + +1.9. ''Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + +A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + +B. Any new file that contains any part of the Original Code or previous Modifications. + +1.10. ''Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + +1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + +1.11. ''Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + +1.12. "You'' (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + +2.1. The Initial Developer Grant. + +The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + +2.2. Contributor Grant. + +Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + +3.1. Application of License. + +The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + +3.2. Availability of Source Code. + +Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + +3.3. Description of Modifications. + +You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + +3.4. Intellectual Property Matters + + (a) Third Party Claims. + + If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs. + + If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + + (c) Representations. + + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + +3.5. Required Notices. + +You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + +3.6. Distribution of Executable Versions. + +You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + +3.7. Larger Works. + +You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + +6.1. New Versions. + +Borland Software Corporation (''Interbase'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + +6.2. Effect of New Versions. + +Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Interbase. No one other than Interbase has the right to modify the terms applicable to Covered Code created under this License. + +6.3. Derivative Works. + +If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases ''Mozilla'', ''MOZILLAPL'', ''MOZPL'', ''Netscape'', "MPL", ''NPL", "Interbase", "ISC", "IB'' or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +6.4 Origin of the Interbase Public License. + +The Interbase public license is based on the Mozilla Public License V 1.1 with the following changes: + +The license is published by Borland Software Corporation. Only Borland Software Corporation can modify the terms applicable to Covered Code. +The license can be modified used for code which is not already governed by this license. Modified versions of the license must be renamed to avoid confusion with Netscape?s or Interbase Software?s license and must include a description of changes from the Interbase Public License. +The name of the license in Exhibit A is the "Interbase Public License". +The reference to an alternative license in Exhibit A has been removed. +Amendments I, II, III, V, and VI have been deleted. +Exhibit A, Netscape Public License has been deleted +A new amendment (II) has been added, describing the required and restricted rights to use the trademarks of Borland Software Corporation +7. DISCLAIMER OF WARRANTY. + +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + +8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + +8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + +8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + +The Covered Code is a ''commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ''commercial computer software'' and ''commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS. + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS. + +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + +Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the NPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A - InterBase Public License. + +``The contents of this file are subject to the Interbase Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.Interbase.com/IPL.html + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code was created by InterBase Software Corp and its successors. + +Portions created by Borland/Inprise are Copyright (C) Borland/Inprise. All Rights Reserved. + +Contributor(s): ______________________________________. + +AMENDMENTS + +I. InterBase and logo. This License does not grant any rights to use the trademarks "Interbase'', "Java" or "JavaScript" even if such marks are included in the Original Code or Modifications. + +II. Trademark Usage. + +II.1. Advertising Materials. All advertising materials mentioning features or use of the covered Code must display the following acknowledgement: "This product includes software developed by Borland Software Corp. " + +II.2. Endorsements. The names "InterBase," "ISC," and "IB" must not be used to endorse or promote Contributor Versions or Larger Works without the prior written permission of Interbase. + +II.3. Product Names. Contributor Versions and Larger Works may not be called "InterBase" or "Interbase" nor may the word "InterBase" appear in their names without the prior written permission of Interbase. \ No newline at end of file diff --git a/options/license/JSON b/options/license/JSON new file mode 100644 index 0000000..e29500b --- /dev/null +++ b/options/license/JSON @@ -0,0 +1,11 @@ +JSON License + +Copyright (c) 2002 JSON.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +The Software shall be used for Good, not Evil. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/options/license/JasPer-2.0 b/options/license/JasPer-2.0 new file mode 100644 index 0000000..93d1128 --- /dev/null +++ b/options/license/JasPer-2.0 @@ -0,0 +1,17 @@ +JasPer License Version 2.0 + +Copyright (c) 2001-2006 Michael David Adams +Copyright (c) 1999-2000 Image Power, Inc. +Copyright (c) 1999-2000 The University of British Columbia + +All rights reserved. + +Permission is hereby granted, free of charge, to any person (the "User") obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +1. The above copyright notices and this permission notice (which includes the disclaimer below) shall be included in all copies or substantial portions of the Software. + +2. The name of a copyright holder shall not be used to endorse or promote products derived from the Software without specific prior written permission. + +THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS +"AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO +EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. NO ASSURANCES ARE PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY. EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR OTHERWISE. AS A CONDITION TO EXERCISING THE RIGHTS GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY. THE SOFTWARE IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES. diff --git a/options/license/LAL-1.2 b/options/license/LAL-1.2 new file mode 100644 index 0000000..80e9204 --- /dev/null +++ b/options/license/LAL-1.2 @@ -0,0 +1,67 @@ +Licence Art Libre +
[ Copyleft Attitude ] + +Version 1.2 + +Préambule : + +Avec cette Licence Art Libre, l’autorisation est donnée de copier, de diffuser et de transformer librement les oeuvres dans le respect des droits de l’auteur. + +Loin d’ignorer les droits de l’auteur, cette licence les reconnaît et les protège. Elle en reformule le principe en permettant au public de faire un usage créatif des oeuvres d’art.
 +Alors que l’usage fait du droit de la propriété littéraire et artistique conduit à restreindre l’accès du public à l’oeuvre, la Licence Art Libre a pour but de le favoriser.
 +L’intention est d’ouvrir l’accès et d’autoriser l’utilisation des ressources d’une oeuvre par le plus grand nombre. En avoir jouissance pour en multiplier les réjouissances, créer de nouvelles conditions de création pour amplifier les possibilités de création. Dans le respect des auteurs avec la reconnaissance et la défense de leur droit moral. + +En effet, avec la venue du numérique, l’invention de l’internet et des logiciels libres, un nouveau mode de création et de production est apparu. Il est aussi l’amplification de ce qui a été expérimenté par nombre d’artistes contemporains. +Le savoir et la création sont des ressources qui doivent demeurer libres pour être encore véritablement du savoir et de la création. C’est à dire rester une recherche fondamentale qui ne soit pas directement liée à une application concrète. Créer c’est découvrir l’inconnu, c’est inventer le réel avant tout souci de réalisme.
 +Ainsi, l’objet de l’art n’est pas confondu avec l’objet d’art fini et défini comme tel.
C’est la raison essentielle de cette Licence Art Libre : promouvoir et protéger des pratiques artistiques libérées des seules règles de l’économie de marché. + +DÉFINITIONS + +– L’oeuvre :
il s’agit d’une oeuvre commune qui comprend l’oeuvre originelle ainsi que toutes les contributions postérieures (les originaux conséquents et les copies). Elle est créée à l’initiative de l’auteur originel qui par cette licence définit les conditions selon lesquelles les contributions sont faites. + +– L’oeuvre originelle :
c’est-à-dire l’oeuvre créée par l’initiateur de l’oeuvre commune dont les copies vont être modifiées par qui le souhaite. + +– Les oeuvres conséquentes :
c’est-à-dire les propositions des auteurs qui contribuent à la formation de l’oeuvre en faisant usage des droits de reproduction, de diffusion et de modification que leur confère la licence. + +– Original (source ou ressource de l’oeuvre) :
exemplaire daté de l’oeuvre, de sa définition, de sa partition ou de son programme que l’auteur présente comme référence pour toutes actualisations, interprétations, copies ou reproductions ultérieures. + +– Copie :
toute reproduction d’un original au sens de cette licence. + +– Auteur de l’oeuvre originelle :
c’est la personne qui a créé l’oeuvre à l’origine d’une arborescence de cette oeuvre modifiée. Par cette licence, l’auteur détermine les conditions dans lesquelles ce travail se fait. + +– Contributeur :
toute personne qui contribue à la création de l’oeuvre. Il est l’auteur d’une oeuvre originale résultant de la modification d’une copie de l’oeuvre originelle ou de la modification d’une copie d’une oeuvre conséquente. + +1. OBJET +Cette licence a pour objet de définir les conditions selon lesquelles vous pouvez jouir librement de cette oeuvre. + +2. L’ÉTENDUE DE LA JOUISSANCE +Cette oeuvre est soumise au droit d’auteur, et l’auteur par cette
licence vous indique quelles sont vos libertés pour la copier, la
diffuser et la modifier: + +2.1 LA LIBERTÉ DE COPIER (OU DE REPRODUCTION) +Vous avez la liberté de copier cette oeuvre pour un usage personnel, pour vos amis, ou toute autre personne et quelque soit la technique employée. + +2.2 LA LIBERTÉ DE DIFFUSER, D’INTERPRÉTER (OU DE REPRÉSENTATION) +Vous pouvez diffuser librement les copies de ces oeuvres, modifiées
ou non, quel que soit le support, quel que soit le lieu, à titre onéreux ou gratuit si vous respectez toutes les conditions suivantes:
 + – joindre aux copies, cette licence à l’identique, ou indiquer précisément où se trouve la licence,
 – indiquer au destinataire le nom de l’auteur des originaux,
 – indiquer au destinataire où il pourra avoir accès aux originaux
(originels et/ou conséquents). L’auteur de l’original pourra, s’il le souhaite, vous autoriser à diffuser l’original dans les mêmes conditions que les copies. + +2.3 LA LIBERTÉ DE MODIFIER +Vous avez la liberté de modifier les copies des originaux (originels
et conséquents), qui peuvent être partielles ou non, dans le respect des conditions prévues à l’article 2.2 en cas de diffusion (ou représentation) de la copie modifiée.
L’auteur de l’original pourra, s’il le souhaite, vous autoriser à modifier l’original dans les mêmes conditions que les copies. + +3. L’INCORPORATION DE L’OEUVRE +Tous les éléments de cette oeuvre doivent demeurer libres, c’est pourquoi il ne vous est pas permis d’intégrer les originaux (originels et conséquents) dans une autre oeuvre qui ne serait pas soumise à cette licence. + +4. VOS DROITS D’AUTEUR +Cette licence n’a pas pour objet de nier vos droits d’auteur sur votre contribution. En choisissant de contribuer à l’évolution de cette oeuvre, vous acceptez seulement d’offrir aux autres les mêmes droits sur votre contribution que ceux qui vous ont été accordés par cette licence. + +5. LA DURÉE DE LA LICENCE +Cette licence prend effet dès votre acceptation de ses dispositions. Le fait de copier, de diffuser, ou de modifier l’oeuvre constitue une acception tacite.
Cette licence a pour durée la durée des droits d’auteur attachés à l’oeuvre. Si vous ne respectez pas les termes de cette licence, vous perdez automatiquement les droits qu’elle vous confère.
Si le régime juridique auquel vous êtes soumis ne vous permet pas de respecter les termes de cette licence, vous ne pouvez pas vous prévaloir des libertés qu’elle confère. + +6. LES DIFFÉRENTES VERSIONS DE LA LICENCE +Cette licence pourra être modifiée régulièrement, en vue de son amélioration, par ses auteurs (les acteurs du mouvement « copyleft attitude ») sous la forme de nouvelles versions numérotées. +Vous avez toujours le choix entre vous contenter des dispositions contenues dans la version sous laquelle la copie vous a été communiquée ou alors, vous prévaloir des dispositions d’une des versions ultérieures. + +7. LES SOUS-LICENCES +Les sous licences ne sont pas autorisées par la présente. Toute personne qui souhaite bénéficier des libertés qu’elle confère sera liée directement à l’auteur de l’oeuvre originelle. + +8. LA LOI APPLICABLE AU CONTRAT +Cette licence est soumise au droit français. diff --git a/options/license/LAL-1.3 b/options/license/LAL-1.3 new file mode 100644 index 0000000..38331ed --- /dev/null +++ b/options/license/LAL-1.3 @@ -0,0 +1,88 @@ +Licence Art Libre 1.3 (LAL 1.3) + +Préambule : + +Avec la Licence Art Libre, l’autorisation est donnée de copier, de diffuser et de transformer librement les œuvres dans le respect des droits de l’auteur. + +Loin d’ignorer ces droits, la Licence Art Libre les reconnaît et les protège. Elle en reformule l’exercice en permettant à tout un chacun de faire un usage créatif des productions de l’esprit quels que soient leur genre et leur forme d’expression. + +Si, en règle générale, l’application du droit d’auteur conduit à restreindre l’accès aux œuvres de l’esprit, la Licence Art Libre, au contraire, le favorise. L’intention est d’autoriser l’utilisation des ressources d’une œuvre ; créer de nouvelles conditions de création pour amplifier les possibilités de création. La Licence Art Libre permet d’avoir jouissance des œuvres tout en reconnaissant les droits et les responsabilités de chacun. + +Avec le développement du numérique, l’invention d’internet et des logiciels libres, les modalités de création ont évolué : les productions de l’esprit s’offrent naturellement à la circulation, à l’échange et aux transformations. Elles se prêtent favorablement à la réalisation d’œuvres communes que chacun peut augmenter pour l’avantage de tous. + +C’est la raison essentielle de la Licence Art Libre : promouvoir et protéger ces productions de l’esprit selon les principes du copyleft : liberté d’usage, de copie, de diffusion, de transformation et interdiction d’appropriation exclusive. + +Définitions : + +Nous désignons par « œuvre », autant l’œuvre initiale, les œuvres conséquentes, que l’œuvre commune telles que définies ci-après : + +L’œuvre commune :
Il s’agit d’une œuvre qui comprend l’œuvre initiale ainsi que toutes les contributions postérieures (les originaux conséquents et les copies). Elle est créée à l’initiative de l’auteur initial qui par cette licence définit les conditions selon lesquelles les contributions sont faites. + +L’œuvre initiale :
C’est-à-dire l’œuvre créée par l’initiateur de l’œuvre commune dont les copies vont être modifiées par qui le souhaite. + +Les œuvres conséquentes :
C’est-à-dire les contributions des auteurs qui participent à la formation de l’œuvre commune en faisant usage des droits de reproduction, de diffusion et de modification que leur confère la licence. + +Originaux (sources ou ressources de l’œuvre) :
Chaque exemplaire daté de l’œuvre initiale ou conséquente que leurs auteurs présentent comme référence pour toutes actualisations, interprétations, copies ou reproductions ultérieures. + +Copie :
Toute reproduction d’un original au sens de cette licence. + +1- OBJET. +Cette licence a pour objet de définir les conditions selon lesquelles vous pouvez jouir librement de l’œuvre. + +2. L’ÉTENDUE DE LA JOUISSANCE. +Cette œuvre est soumise au droit d’auteur, et l’auteur par cette licence vous indique quelles sont vos libertés pour la copier, la diffuser et la modifier. + +2.1 LA LIBERTÉ DE COPIER (OU DE REPRODUCTION). +Vous avez la liberté de copier cette œuvre pour vous, vos amis ou toute autre personne, quelle que soit la technique employée. + +2.2 LA LIBERTÉ DE DIFFUSER (INTERPRÉTER, REPRÉSENTER, DISTRIBUER). +Vous pouvez diffuser librement les copies de ces œuvres, modifiées ou non, quel que soit le support, quel que soit le lieu, à titre onéreux ou gratuit, si vous respectez toutes les conditions suivantes : + + 1. joindre aux copies cette licence à l’identique ou indiquer précisément où se trouve la licence ; + 2. indiquer au destinataire le nom de chaque auteur des originaux, y compris le vôtre si vous avez modifié l’œuvre ; + 3. indiquer au destinataire où il pourrait avoir accès aux originaux (initiaux et/ou conséquents). + +Les auteurs des originaux pourront, s’ils le souhaitent, vous autoriser à diffuser l’original dans les mêmes conditions que les copies. + +2.3 LA LIBERTÉ DE MODIFIER. +Vous avez la liberté de modifier les copies des originaux (initiaux et conséquents) dans le respect des conditions suivantes : + + 1. celles prévues à l’article 2.2 en cas de diffusion de la copie modifiée ; + 2. indiquer qu’il s’agit d’une œuvre modifiée et, si possible, la nature de la modification ; + 3. diffuser cette œuvre conséquente avec la même licence ou avec toute licence compatible ; + 4. Les auteurs des originaux pourront, s’ils le souhaitent, vous autoriser à modifier l’original dans les mêmes conditions que les copies. + +3. DROITS CONNEXES. +Les actes donnant lieu à des droits d’auteur ou des droits voisins ne doivent pas constituer un obstacle aux libertés conférées par cette licence.
C’est pourquoi, par exemple, les interprétations doivent être soumises à la même licence ou une licence compatible. De même, l’intégration de l’œuvre à une base de données, une compilation ou une anthologie ne doit pas faire obstacle à la jouissance de l’œuvre telle que définie par cette licence. + +4. L’ INTÉGRATION DE L’ŒUVRE. +Toute intégration de cette œuvre à un ensemble non soumis à la LAL doit assurer l’exercice des libertés conférées par cette licence. +Si l’œuvre n’est plus accessible indépendamment de l’ensemble, alors l’intégration n’est possible qu’à condition que l’ensemble soit soumis à la LAL ou une licence compatible. + +5. CRITÈRES DE COMPATIBILITÉ. +Une licence est compatible avec la LAL si et seulement si : + + 1. elle accorde l’autorisation de copier, diffuser et modifier des copies de l’œuvre, y compris à des fins lucratives, et sans autres restrictions que celles qu’impose le respect des autres critères de compatibilité ; + 2. elle garantit la paternité de l’œuvre et l’accès aux versions antérieures de l’œuvre quand cet accès est possible ; + 3. elle reconnaît la LAL également compatible (réciprocité) ; + 4. elle impose que les modifications faites sur l’œuvre soient soumises à la même licence ou encore à une licence répondant aux critères de compatibilité posés par la LAL. + +6. VOS DROITS INTELLECTUELS. +La LAL n’a pas pour objet de nier vos droits d’auteur sur votre contribution ni vos droits connexes. En choisissant de contribuer à l’évolution de cette œuvre commune, vous acceptez seulement d’offrir aux autres les mêmes autorisations sur votre contribution que celles qui vous ont été accordées par cette licence. Ces autorisations n’entraînent pas un dessaisissement de vos droits intellectuels. + +7. VOS RESPONSABILITÉS. +La liberté de jouir de l’œuvre tel que permis par la LAL (liberté de copier, diffuser, modifier) implique pour chacun la responsabilité de ses propres faits. + +8. LA DURÉE DE LA LICENCE. +Cette licence prend effet dès votre acceptation de ses dispositions. Le fait de copier, de diffuser, ou de modifier l’œuvre constitue une acceptation tacite.
 +Cette licence a pour durée la durée des droits d’auteur attachés à l’œuvre. Si vous ne respectez pas les termes de cette licence, vous perdez automatiquement les droits qu’elle vous confère.
Si le régime juridique auquel vous êtes soumis ne vous permet pas de respecter les termes de cette licence, vous ne pouvez pas vous prévaloir des libertés qu’elle confère. + +9. LES DIFFÉRENTES VERSIONS DE LA LICENCE. +Cette licence pourra être modifiée régulièrement, en vue de son amélioration, par ses auteurs (les acteurs du mouvement Copyleft Attitude) sous la forme de nouvelles versions numérotées.
 +Vous avez toujours le choix entre vous contenter des dispositions contenues dans la version de la LAL sous laquelle la copie vous a été communiquée ou alors, vous prévaloir des dispositions d’une des versions ultérieures. + +10. LES SOUS-LICENCES. +Les sous-licences ne sont pas autorisées par la présente. Toute personne qui souhaite bénéficier des libertés qu’elle confère sera liée directement aux auteurs de l’œuvre commune. + +11. LE CONTEXTE JURIDIQUE. +Cette licence est rédigée en référence au droit français et à la Convention de Berne relative au droit d’auteur. diff --git a/options/license/GNU Library General Public License v2.0 b/options/license/LGPL-2.0 similarity index 84% rename from options/license/GNU Library General Public License v2.0 rename to options/license/LGPL-2.0 index a04e3a1..21a037c 100644 --- a/options/license/GNU Library General Public License v2.0 +++ b/options/license/LGPL-2.0 @@ -1,12 +1,13 @@ GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 -Copyright (C) 1991 Free Software Foundation, Inc. -51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +Copyright (C) 1991 Free Software Foundation, Inc. +51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] +[This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble @@ -56,13 +57,13 @@ You may charge a fee for the physical act of transferring a copy, and you may at 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: -a) The modified work must itself be a software library. + a) The modified work must itself be a software library. -b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. -c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - -d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) @@ -96,13 +97,13 @@ Otherwise, if the work is a derivative of the Library, you may distribute the ob You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: -a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) -b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. -c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. - -d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. @@ -110,9 +111,9 @@ It may happen that this requirement contradicts the license restrictions of othe 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: -a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. -b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. @@ -130,7 +131,7 @@ This section is intended to make thoroughly clear what is believed to be a conse 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. -13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. +13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. @@ -150,24 +151,24 @@ If you develop a new library, and you want it to be of the greatest possible use To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. -one line to give the library's name and an idea of what it does. -Copyright (C) year name of author + one line to give the library's name and an idea of what it does. + Copyright (C) year name of author -This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. -This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: -Yoyodyne, Inc., hereby disclaims all copyright interest in -the library `Frob' (a library for tweaking knobs) written +Yoyodyne, Inc., hereby disclaims all copyright interest in +the library `Frob' (a library for tweaking knobs) written by James Random Hacker. -signature of Ty Coon, 1 April 1990 +signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice -That's all there is to it! +That's all there is to it! \ No newline at end of file diff --git a/options/license/GNU Lesser General Public License v2.1 b/options/license/LGPL-2.1 similarity index 83% rename from options/license/GNU Lesser General Public License v2.1 rename to options/license/LGPL-2.1 index 7dd5aab..62ac6ff 100644 --- a/options/license/GNU Lesser General Public License v2.1 +++ b/options/license/LGPL-2.1 @@ -1,12 +1,13 @@ GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 -Copyright (C) 1991, 1999 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. -[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble @@ -58,13 +59,13 @@ You may charge a fee for the physical act of transferring a copy, and you may at 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: -a) The modified work must itself be a software library. + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. -b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. -c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. - -d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) @@ -98,15 +99,15 @@ Otherwise, if the work is a derivative of the Library, you may distribute the ob You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: -a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) -b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. -c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. -d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. -e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. @@ -114,9 +115,9 @@ It may happen that this requirement contradicts the license restrictions of othe 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: -a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. -b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. @@ -154,21 +155,21 @@ If you develop a new library, and you want it to be of the greatest possible use To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. -one line to give the library's name and an idea of what it does. -Copyright (C) year name of author + one line to give the library's name and an idea of what it does. + Copyright (C) year name of author -This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. -This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. -You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. + You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: -Yoyodyne, Inc., hereby disclaims all copyright interest in -the library `Frob' (a library for tweaking knobs) written +Yoyodyne, Inc., hereby disclaims all copyright interest in +the library `Frob' (a library for tweaking knobs) written by James Random Hacker. -signature of Ty Coon, 1 April 1990 -Ty Coon, President of Vice -That's all there is to it! +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice +That's all there is to it! \ No newline at end of file diff --git a/options/license/GNU Lesser General Public License v3.0 b/options/license/LGPL-3.0 similarity index 51% rename from options/license/GNU Lesser General Public License v3.0 rename to options/license/LGPL-3.0 index 0c8228d..dc29ef6 100644 --- a/options/license/GNU Lesser General Public License v3.0 +++ b/options/license/LGPL-3.0 @@ -1,7 +1,8 @@ -GNU LESSER GENERAL PUBLIC LICENSE +GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 -Copyright (C) 2007 Free Software Foundation, Inc. +Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. @@ -14,57 +15,57 @@ As used herein, "this License" refers to version 3 of the GNU Lesser General Pub An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. -A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". +A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. -1. Exception to Section 3 of the GNU GPL. +1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. -2. Conveying Modified Versions. +2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: -a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or + a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or -b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. + b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. -3. Object Code Incorporating Material from Library Header Files. -The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: +3. Object Code Incorporating Material from Library Header Files. +The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: -a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. + a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. -b) Accompany the object code with a copy of the GNU GPL and this license document. + b) Accompany the object code with a copy of the GNU GPL and this license document. -4. Combined Works. +4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: -a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. + a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. -b) Accompany the Combined Work with a copy of the GNU GPL and this license document. + b) Accompany the Combined Work with a copy of the GNU GPL and this license document. -c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. + c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. -d) Do one of the following: + d) Do one of the following: -0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. + 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. -1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. + 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. -e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) + e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) -5. Combined Libraries. +5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: -a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. -b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. -6. Revised Versions of the GNU Lesser General Public License. +6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. -If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. +If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. \ No newline at end of file diff --git a/options/license/LGPLLR b/options/license/LGPLLR new file mode 100644 index 0000000..2372611 --- /dev/null +++ b/options/license/LGPLLR @@ -0,0 +1,89 @@ +Lesser General Public License For Linguistic Resources + +Preamble + +The licenses for most data are designed to take away your freedom to share and change it. By contrast, this License is intended to guarantee your freedom to share and change free data--to make sure the data are free for all their users. + +This License, the Lesser General Public License for Linguistic Resources, applies to some specially designated linguistic resources -- typically lexicons and grammars. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any Linguistic Resource which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License for Linguistic Resources (also called "this License"). Each licensee is addressed as "you". + +A "linguistic resource" means a collection of data about language prepared so as to be used with application programs. + +The "Linguistic Resource", below, refers to any such work which has been distributed under these terms. A "work based on the Linguistic Resource" means either the Linguistic Resource or any derivative work under copyright law: that is to say, a work containing the Linguistic Resource or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Legible form" for a linguistic resource means the preferred form of the resource for making modifications to it. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Linguistic Resource is not restricted, and output from such a program is covered only if its contents constitute a work based on the Linguistic Resource (independent of the use of the Linguistic Resource in a tool for writing it). Whether that is true depends on what the program that uses the Linguistic Resource does. + +1. You may copy and distribute verbatim copies of the Linguistic Resource as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Linguistic Resource. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Linguistic Resource or any portion of it, thus forming a work based on the Linguistic Resource, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) The modified work must itself be a linguistic resource. + + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Linguistic Resource, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Linguistic Resource, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Linguistic Resource. + +In addition, mere aggregation of another work not based on the Linguistic Resource with the Linguistic Resource (or with a work based on the Linguistic Resource) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. A program that contains no derivative of any portion of the Linguistic Resource, but is designed to work with the Linguistic Resource (or an encrypted form of the Linguistic Resource) by reading it or being compiled or linked with it, is called a "work that uses the Linguistic Resource". Such a work, in isolation, is not a derivative work of the Linguistic Resource, and therefore falls outside the scope of this License. + +However, combining a "work that uses the Linguistic Resource" with the Linguistic Resource (or an encrypted form of the Linguistic Resource) creates a package that is a derivative of the Linguistic Resource (because it contains portions of the Linguistic Resource), rather than a "work that uses the Linguistic Resource". If the package is a derivative of the Linguistic Resource, you may distribute the package under the terms of Section 4. Any works containing that package also fall under Section 4. + +4. As an exception to the Sections above, you may also combine a "work that uses the Linguistic Resource" with the Linguistic Resource (or an encrypted form of the Linguistic Resource) to produce a package containing portions of the Linguistic Resource, and distribute that package under terms of your choice, provided that the terms permit modification of the package for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the package that the Linguistic Resource is used in it and that the Linguistic Resource and its use are covered by this License. You must supply a copy of this License. If the package during execution displays copyright notices, you must include the copyright notice for the Linguistic Resource among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + + a) Accompany the package with the complete corresponding machine-readable legible form of the Linguistic Resource including whatever changes were used in the package (which must be distributed under Sections 1 and 2 above); and, if the package contains an encrypted form of the Linguistic Resource, with the complete machine-readable "work that uses the Linguistic Resource", as object code and/or source code, so that the user can modify the Linguistic Resource and then encrypt it to produce a modified package containing the modified Linguistic Resource. + + b) Use a suitable mechanism for combining with the Linguistic Resource. A suitable mechanism is one that will operate properly with a modified version of the Linguistic Resource, if the user installs one, as long as the modified version is interface-compatible with the version that the package was made with. + + c) Accompany the package with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 4a, above, for a charge no more than the cost of performing this distribution. + + d) If distribution of the package is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. + + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + +If the package includes an encrypted form of the Linguistic Resource, the required form of the "work that uses the Linguistic Resource" must include any data and utility programs needed for reproducing the package from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Linguistic Resource together in a package that you distribute. + +5. You may not copy, modify, sublicense, link with, or distribute the Linguistic Resource except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Linguistic Resource is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +6. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Linguistic Resource or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Linguistic Resource (or any work based on the Linguistic Resource), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Linguistic Resource or works based on it. + +7. Each time you redistribute the Linguistic Resource (or any work based on the Linguistic Resource), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Linguistic Resource subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +8. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Linguistic Resource at all. For example, if a patent license would not permit royalty-free redistribution of the Linguistic Resource by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Linguistic Resource. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free resource distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of data distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute resources through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +9. If the distribution and/or use of the Linguistic Resource is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Linguistic Resource under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +10. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License for Linguistic Resources from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Linguistic Resource specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Linguistic Resource does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +11. If you wish to incorporate parts of the Linguistic Resource into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. + + NO WARRANTY + +12. BECAUSE THE LINGUISTIC RESOURCE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LINGUISTIC RESOURCE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LINGUISTIC RESOURCE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LINGUISTIC RESOURCE IS WITH YOU. SHOULD THE LINGUISTIC RESOURCE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LINGUISTIC RESOURCE AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LINGUISTIC RESOURCE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LINGUISTIC RESOURCE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/options/license/LPL-1.0 b/options/license/LPL-1.0 new file mode 100644 index 0000000..ae6edf0 --- /dev/null +++ b/options/license/LPL-1.0 @@ -0,0 +1,81 @@ +Lucent Public License Version 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a. in the case of <;match=.+>> ("<;match=.+>>"), the Original Program, and + b. in the case of each Contributor, + + i. changes to the Program, and + ii. additions to the Program; where such changes and/or additions to the Program originate from and are "Contributed" by that particular Contributor. + + A Contribution is "Contributed" by a Contributor only (i) if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf, and (ii) the Contributor explicitly consents, in accordance with Section 3C, to characterization of the changes and/or additions as Contributions. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means <;match=.+>> and any other entity that has Contributed a Contribution to the Program. + +"Distributor" means a Recipient that distributes the Program, modifications to the Program, or any part thereof. + +"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Original Program" means the original version of the software accompanying this Agreement as released by <;match=.+>>, including source code, object code and documentation, if any. + +"Program" means the Original Program and Contributions or any part thereof + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a. Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + + b. Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. The patent license granted by a Contributor shall also apply to the combination of the Contribution of that Contributor and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license granted by a Contributor shall not apply to (i) any other combinations which include the Contribution, nor to (ii) Contributions of other Contributors. No hardware per se is licensed hereunder. + + c. Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + + d. Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + + A. Distributor may choose to distribute the Program in any form under this Agreement or under its own license agreement, provided that: + + 1. it complies with the terms and conditions of this Agreement; + 2. if the Program is distributed in source code or other tangible form, a copy of this Agreement or Distributor's own license agreement is included with each copy of the Program; and + 3. if distributed under Distributor's own license agreement, such license agreement: + + a. effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + b. effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; and + c. states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party. + + B. Each Distributor must include the following in a conspicuous location in the Program: + + Copyright (C) <, ;match=.+>> and others. All Rights Reserved. + + C. In addition, each Contributor must identify itself as the originator of its Contribution, if any, and indicate its consent to characterization of its additions and/or changes as a Contribution, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. Once consent is granted, it may not thereafter be revoked. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Distributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for Contributors. Therefore, if a Distributor includes the Program in a commercial product offering, such Distributor ("Commercial Distributor") hereby agrees to defend and indemnify every Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Distributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Distributor in writing of such claim, and b) allow the Commercial Distributor to control, and cooperate with the Commercial Distributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Distributor might include the Program in a commercial product offering, Product X. That Distributor is then a Commercial Distributor. If that Commercial Distributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Distributor's responsibility alone. Under this section, the Commercial Distributor would have to defend claims against the Contributors related to those performance claims and warranties, and if a court requires any Contributor to pay any damages as a result, the Commercial Distributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +<;match=.+>> may publish new versions (including revisions) of this Agreement from time to time. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. No one other than <;match=.+>> has the right to modify this Agreement. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of <;match=.+>> and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. \ No newline at end of file diff --git a/options/license/LPL-1.02 b/options/license/LPL-1.02 new file mode 100644 index 0000000..ce002a0 --- /dev/null +++ b/options/license/LPL-1.02 @@ -0,0 +1,85 @@ +Lucent Public License Version 1.02 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a. in the case of Lucent Technologies Inc. ("LUCENT"), the Original Program, and + b. in the case of each Contributor, + + i. changes to the Program, and + ii. additions to the Program; + + where such changes and/or additions to the Program were added to the Program by such Contributor itself or anyone acting on such Contributor's behalf, and the Contributor explicitly consents, in accordance with Section 3C, to characterization of the changes and/or additions as Contributions. + +"Contributor" means LUCENT and any other entity that has Contributed a Contribution to the Program. + +"Distributor" means a Recipient that distributes the Program, modifications to the Program, or any part thereof. + +"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Original Program" means the original version of the software accompanying this Agreement as released by LUCENT, including source code, object code and documentation, if any. + +"Program" means the Original Program and Contributions or any part thereof + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + + a. Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + + b. Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. The patent license granted by a Contributor shall also apply to the combination of the Contribution of that Contributor and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license granted by a Contributor shall not apply to (i) any other combinations which include the Contribution, nor to (ii) Contributions of other Contributors. No hardware per se is licensed hereunder. + + c. Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + + d. Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + + A. Distributor may choose to distribute the Program in any form under this Agreement or under its own license agreement, provided that: + + 1. it complies with the terms and conditions of this Agreement; + 2. if the Program is distributed in source code or other tangible form, a copy of this Agreement or Distributor's own license agreement is included with each copy of the Program; and + 3. if distributed under Distributor's own license agreement, such license agreement: + + a. effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + b. effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; and + c. states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party. + + B. Each Distributor must include the following in a conspicuous location in the Program: + + Copyright (C) 2003, Lucent Technologies Inc. and others. All Rights Reserved. + + C. In addition, each Contributor must identify itself as the originator of its Contribution in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. Also, each Contributor must agree that the additions and/or changes are intended to be a Contribution. Once a Contribution is contributed, it may not thereafter be revoked. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Distributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for Contributors. Therefore, if a Distributor includes the Program in a commercial product offering, such Distributor ("Commercial Distributor") hereby agrees to defend and indemnify every Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Distributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Distributor in writing of such claim, and b) allow the Commercial Distributor to control, and cooperate with the Commercial Distributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Distributor might include the Program in a commercial product offering, Product X. That Distributor is then a Commercial Distributor. If that Commercial Distributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Distributor's responsibility alone. Under this section, the Commercial Distributor would have to defend claims against the Contributors related to those performance claims and warranties, and if a court requires any Contributor to pay any damages as a result, the Commercial Distributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. EXPORT CONTROL + +Recipient agrees that Recipient alone is responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries). + +8. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +LUCENT may publish new versions (including revisions) of this Agreement from time to time. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. No one other than LUCENT has the right to modify this Agreement. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. \ No newline at end of file diff --git a/options/license/LPPL-1.0 b/options/license/LPPL-1.0 new file mode 100644 index 0000000..324fc05 --- /dev/null +++ b/options/license/LPPL-1.0 @@ -0,0 +1,103 @@ +LaTeX Project Public License + +LPPL Version 1.0 1999-03-01 + +Copyright 1999 LaTeX3 Project + +Everyone is permitted to copy and distribute verbatim copies of this license document, but modification is not allowed. + +Preamble + +The LaTeX Project Public License (LPPL) is the license under which the base LaTeX distribution is distributed. As described below you may use this licence for any software that you wish to distribute. + +It may be particularly suitable if your software is TeX related (such as a LaTeX package file) but it may be used for any software, even if it is unrelated to TeX. + +To use this license, the files of your distribution should have an explicit copyright notice giving your name and the year, together with a reference to this license. + +A typical example would be + + %% pig.sty %% Copyright 2001 M. Y. Name + + % This program can redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or (at your option) any later version. + +Given such a notice in the file, the conditions of this document would apply, with: + +`The Program' referring to the software `pig.sty' and `The Copyright Holder' referring to the person `M. Y. Name'. + +To see a real example, see the file legal.txt which carries the copyright notice for the base latex distribution. + +This license gives terms under which files of The Program may be distributed and modified. Individual files may have specific further constraints on modification, but no file should have restrictions on distribution other than those specified below. + +This is to ensure that a distributor wishing to distribute a complete unmodified copy of The Program need only check the conditions in this file, and does not need to check every file in The Program for extra restrictions. If you do need to modify the distribution terms of some files, do not refer to this license, instead distribute The Program under a different license. You may use the parts of the text of LPPL as a model for your own license, but your license should not directly refer to the LPPL or otherwise give the impression that The Program is distributed under the LPPL. + + The LaTeX Project Public License +================================ +Terms And Conditions For Copying, Distribution And Modification +=============================================================== + + +WARRANTY +======== + +There is no warranty for The Program, to the extent permitted by applicable law. Except when otherwise stated in writing, The Copyright Holder provides The Program `as is' without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the program is with you. Should The Program prove defective, you assume the cost of all necessary servicing, repair or correction. + +In no event unless required by applicable law or agreed to in writing will The Copyright Holder, or any of the individual authors named in the source for The Program, be liable to you for damages, including any general, special, incidental or consequential damages arising out of any use of The Program or out of inability to use The Program (including but not limited to loss of data or data being rendered inaccurate or losses sustained by you or by third parties as a result of a failure of The Program to operate with any other programs), even if such holder or other party has been advised of the possibility of such damages. + + +DISTRIBUTION +============ + +Redistribution of unchanged files is allowed provided that all files that make up the distribution of The Program are distributed. In particular this means that The Program has to be distributed including its documentation if documentation was part of the original distribution. + +The distribution of The Program will contain a prominent file listing all the files covered by this license. + +If you receive only some of these files from someone, complain! + +The distribution of changed versions of certain files included in the The Program, and the reuse of code from The Program, are allowed under the following restrictions: + + * It is allowed only if the legal notice in the file does not expressly forbid it. See note below, under "Conditions on individual files". + + * You rename the file before you make any changes to it, unless the file explicitly says that renaming is not required. Any such changed files must be distributed under a license that forbids distribution of those files, and any files derived from them, under the names used by the original files in the distribution of The Program. + + * You change any `identification string' in The Program to clearly indicate that the file is not part of the standard system. + + * If The Program includes an `error report address' so that errors may be reported to The Copyright Holder, or other specified addresses, this address must be changed in any modified versions of The Program, so that reports for files not maintained by the original program maintainers are directed to the maintainers of the changed files. + + * You acknowledge the source and authorship of the original version in the modified file. + + * You also distribute the unmodified version of the file or alternatively provide sufficient information so that the user of your modified file can be reasonably expected to be able to obtain an original, unmodified copy of The Program. For example, you may specify a URL to a site that you expect will freely provide the user with a copy of The Program (either the version on which your modification is based, or perhaps a later version). + + * If The Program is intended to be used with, or is based on, LaTeX, then files with the following file extensions which have special meaning in LaTeX Software, have special modification rules under the license: + + - Files with extension `.ins' (installation files): these files may not be modified at all because they contain the legal notices that are placed in the generated files. + + - Files with extension `.fd' (LaTeX font definitions files): these files are allowed to be modified without changing the name, but only to enable use of all available fonts and to prevent attempts to access unavailable fonts. However, modified files are not allowed to be distributed in place of original files. + + - Files with extension `.cfg' (configuration files): these files can be created or modified to enable easy configuration of the system. The documentation in cfgguide.tex in the base LaTeX distribution describes when it makes sense to modify or generate such files. + +The above restrictions are not intended to prohibit, and hence do not apply to, the updating, by any method, of a file so that it becomes identical to the latest version of that file in The Program. + +======================================================================== + +NOTES +===== + +We believe that these requirements give you the freedom you to make modifications that conform with whatever technical specifications you wish, whilst maintaining the availability, integrity and reliability of The Program. If you do not see how to achieve your goal whilst adhering to these requirements then read the document cfgguide.tex in the base LaTeX distribution for suggestions. + +Because of the portability and exchangeability aspects of systems like LaTeX, The LaTeX3 Project deprecates the distribution of non-standard versions of components of LaTeX or of generally available contributed code for them but such distributions are permitted under the above restrictions. + +The document modguide.tex in the base LaTeX distribution details the reasons for the legal requirements detailed above. Even if The Program is unrelated to LaTeX, the argument in modguide.tex may still apply, and should be read before a modified version of The Program is distributed. + +Conditions on individual files +============================== + +The individual files may bear additional conditions which supersede the general conditions on distribution and modification contained in this file. If there are any such files, the distribution of The Program will contain a prominent file that lists all the exceptional files. + +Typical examples of files with more restrictive modification conditions would be files that contain the text of copyright notices. + + * The conditions on individual files differ only in the extent of *modification* that is allowed. + + * The conditions on *distribution* are the same for all the files. Thus a (re)distributor of a complete, unchanged copy of The Program need meet only the conditions in this file; it is not necessary to check the header of every file in the distribution to check that a distribution meets these requirements. \ No newline at end of file diff --git a/options/license/LPPL-1.1 b/options/license/LPPL-1.1 new file mode 100644 index 0000000..bd95cea --- /dev/null +++ b/options/license/LPPL-1.1 @@ -0,0 +1,141 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.1 1999-07-10 + +Copyright 1999 LaTeX3 Project + +Everyone is allowed to distribute verbatim copies of this license document, but modification of it is not allowed. + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the license under which the base LaTeX distribution is distributed. + +You may use this license for any program that you have written and wish to distribute. This license may be particularly suitable if your program is TeX-related (such as a LaTeX package), but you may use it even if your program is unrelated to TeX. The section `WHETHER AND HOW TO DISTRIBUTE PROGRAMS UNDER THIS LICENSE', below, gives instructions, examples, and recommendations for authors who are considering distributing their programs under this license. + +In this license document, `The Program' refers to any program distributed under this license. + +This license gives conditions under which The Program may be distributed and conditions under which modified versions of The Program may be distributed. Individual files of The Program may bear supplementary and/or superseding conditions on modification of themselves and on the distribution of modified versions of themselves, but *no* file of The Program may bear supplementary or superseding conditions on the distribution of an unmodified copy of the file. A distributor wishing to distribute a complete, unmodified copy of The Program therefore needs to check the conditions only in this license and nowhere else. + +Activities other than distribution and/or modification of The Program are not covered by this license; they are outside its scope. In particular, the act of running The Program is not restricted. + +We, the LaTeX3 Project, believe that the conditions below give you the freedom to make and distribute modified versions of The Program that conform with whatever technical specifications you wish while maintaining the availability, integrity, and reliability of The Program. If you do not see how to achieve your goal while meeting these conditions, then read the document `cfgguide.tex' in the base LaTeX distribution for suggestions. + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +You may distribute a complete, unmodified copy of The Program. Distribution of only part of The Program is not allowed. + +You may not modify in any way a file of The Program that bears a legal notice forbidding modification of that file. + +You may distribute a modified file of The Program if, and only if, the following eight conditions are met: + + 1. You must meet any additional conditions borne by the file on the distribution of a modified version of the file as described below in the subsection `Additional Conditions on Individual Files of The Program'. + + 2. If the file is a LaTeX software file, then you must meet any applicable additional conditions on the distribution of a modified version of the file that are described below in the subsection `Additional Conditions on LaTeX Software Files'. + + 3. You must not distribute the modified file with the filename of the original file. + + 4. In the modified file, you must acknowledge the authorship and name of the original file, and the name (if any) of the program which contains it. + + 5. You must change any identification string in the file to indicate clearly that the modified file is not part of The Program. + + 6. You must change any addresses in the modified file for the reporting of errors in the file or in The Program generally to ensure that reports for files no longer maintained by the original maintainers will be directed to the maintainers of the modified files. + + 7. You must distribute the modified file under a license that forbids distribution both of the modified file and of any files derived from the modified file with the filename of the original file. + + 8. You must do either (A) or (B): + + (A) distribute a copy of The Program (that is, a complete, unmodified copy of The Program) together with the modified file; if your distribution of the modified file is made by offering access to copy the modified file from a designated place, then offering equivalent access to copy The Program from the same place meets this condition, even though third parties are not compelled to copy The Program along with the modified file; + + (B) provide to those who receive the modified file information that is sufficient for them to obtain a copy of The Program; for example, you may provide a Uniform Resource Locator (URL) for a site that you expect will provide them with a copy of The Program free of charge (either the version from which your modification is derived, or perhaps a later version). + +Note that in the above, `distribution' of a file means making the file available to others by any means. This includes, for instance, installing the file on any machine in such a way that the file is accessible by users other than yourself. `Modification' of a file means any procedure that produces a derivative file under any applicable law -- that is, a file containing the original file or a significant portion of it, either verbatim or with modifications and/or translated into another language. + +Changing the name of a file is considered to be a modification of the file. + +The distribution conditions in this license do not have to be applied to files that have been modified in accordance with the above conditions. Note, however, that Condition 7. does apply to any such modified file. + +The conditions above are not intended to prohibit, and hence do not apply to, the updating, by any method, of a file so that it becomes identical to the latest version of that file of The Program. + +A Recommendation on Modification Without Distribution +----------------------------------------------------- + +It is wise never to modify a file of The Program, even for your own personal use, without also meeting the above eight conditions for distributing the modified file. While you might intend that such modified files will never be distributed, often this will happen by accident -- you may forget that you have modified the file; or it may not occur to you when allowing others to access the modified file that you are thus distributing it and violating the conditions of this license. It is usually in your best interest to keep your copy of The Program identical with the public one. Many programs provide ways to control the behavior of that program without altering its licensed files. + +Additional Conditions on Individual Files of The Program +-------------------------------------------------------- + +An individual file of The Program may bear additional conditions that supplement and/or supersede the conditions in this license if, and only if, such additional conditions exclusively concern modification of the file or distribution of a modified version of the file. The conditions on individual files of The Program therefore may differ only with respect to the kind and extent of modification of those files that is allowed, and with respect to the distribution of modified versions of those files. + +Additional Conditions on LaTeX Software Files +--------------------------------------------- + +If a file of The Program is intended to be used with LaTeX (that is, if it is a LaTeX software file), then the following additional conditions, which supplement and/or supersede the conditions above, apply to the file according to its filename extension: + + - You may not modify any file with filename extension `.ins' since these are installation files containing the legal notices that are placed in the files they generate. + + - You may distribute modified versions of files with filename extension `.fd' (LaTeX font definition files) under the standard conditions of the LPPL as described above. You may also distribute such modified LaTeX font definition files with their original names provided that: + (1) the only changes to the original files either enable use of available fonts or prevent attempts to access unavailable fonts; + (2) you also distribute the original, unmodified files (TeX input paths can be used to control which set of LaTeX font definition files is actually used by TeX). + + - You may distribute modified versions of files with filename extension `.cfg' (configuration files) with their original names. The Program may (and usually will) specify the range of commands that are allowed in a particular configuration file. + +Because of portability and exchangeability issues in LaTeX software, The LaTeX3 Project deprecates the distribution of modified versions of components of LaTeX or of generally available contributed code for them, but such distribution can meet the conditions of this license. + +NO WARRANTY +=========== + +There is no warranty for The Program. Except when otherwise stated in writing, The Copyright Holder provides The Program `as is', without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of The Program is with you. Should The Program prove defective, you assume the cost of all necessary servicing, repair, or correction. + +In no event unless agreed to in writing will The Copyright Holder, or any author named in the files of The Program, or any other party who may distribute and/or modify The Program as permitted below, be liable to you for damages, including any general, special, incidental or consequential damages arising out of any use of The Program or out of inability to use The Program (including, but not limited to, loss of data, data being rendered inaccurate, or losses sustained by anyone as a result of any failure of The Program to operate with any other programs), even if The Copyright Holder or said author or said other party has been advised of the possibility of such damages. + +WHETHER AND HOW TO DISTRIBUTE PROGRAMS UNDER THIS LICENSE +========================================================= + +This section contains important instructions, examples, and recommendations for authors who are considering distributing their programs under this license. These authors are addressed as `you' in this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your program you want or need to use *distribution* conditions that differ from those in this license, then do not refer to this license anywhere in your program but instead distribute your program under a different license. You may use the text of this license as a model for your own license, but your license should not refer to the LPPL or otherwise give the impression that your program is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains the motivation behind the conditions of this license. It explains, for example, why distributing LaTeX under the GNU General Public License (GPL) was considered inappropriate. Even if your program is unrelated to LaTeX, the discussion in `modguide.tex' may still be relevant, and authors intending to distribute their programs under any license are encouraged to read it. + +How to Use This License +----------------------- + +To use this license, place in each of the files of your program both an explicit copyright notice including your name and the year and also a statement that the distribution and/or modification of the file is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2001 M. Y. Name + % + % This program may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.1 + % of this license or (at your option) any later version. + % The latest version of this license is in % http://www.latex-project.org/lppl.txt + % and version 1.1 or later is part of all distributions of LaTeX % version 1999/06/01 or later. + % + % This program consists of the files pig.dtx and pig.ins + +Given such a notice and statement in a file, the conditions given in this license document would apply, with `The Program' referring to the two files `pig.dtx' and `pig.ins', and `The Copyright Holder' referring to the person `M. Y. Name'. + +Important Recommendations +------------------------- + +Defining What Constitutes The Program + +The LPPL requires that distributions of The Program contain all the files of The Program. It is therefore important that you provide a way for the licensee to determine which files constitute The Program. This could, for example, be achieved by explicitly listing all the files of The Program near the copyright notice of each file or by using a line like + + % This program consists of all files listed in manifest.txt. + +in that place. In the absence of an unequivocal list it might be impossible for the licensee to determine what is considered by you to comprise The Program. + +Noting Exceptional Files + +If The Program contains any files bearing additional conditions on modification, or on distribution of modified versions, of those files (other than those listed in `Additional Conditions on LaTeX Software Files'), then it is recommended that The Program contain a prominent file that defines the exceptional conditions, and either lists the exceptional files or defines one or more categories of exceptional files. + +Files containing the text of a license (such as this file) are often examples of files bearing more restrictive conditions on modification. LaTeX configuration files (with filename extension `.cfg') are examples of files bearing less restrictive conditions on the distribution of a modified version of the file. The additional conditions on LaTeX software given above are examples of declaring a category of files bearing exceptional additional conditions. \ No newline at end of file diff --git a/options/license/LPPL-1.2 b/options/license/LPPL-1.2 new file mode 100644 index 0000000..0728188 --- /dev/null +++ b/options/license/LPPL-1.2 @@ -0,0 +1,140 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.2 1999-09-03 + +Copyright 1999 LaTeX3 Project + +Everyone is allowed to distribute verbatim copies of this license document, but modification of it is not allowed. + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the license under which the base LaTeX distribution is distributed. + +You may use this license for any program that you have written and wish to distribute. This license may be particularly suitable if your program is TeX-related (such as a LaTeX package), but you may use it even if your program is unrelated to TeX. The section `WHETHER AND HOW TO DISTRIBUTE PROGRAMS UNDER THIS LICENSE', below, gives instructions, examples, and recommendations for authors who are considering distributing their programs under this license. + +In this license document, `The Program' refers to any program distributed under this license. + +This license gives conditions under which The Program may be distributed and conditions under which modified versions of The Program may be distributed. Individual files of The Program may bear supplementary and/or superseding conditions on modification of themselves and on the distribution of modified versions of themselves, but *no* file of The Program may bear supplementary or superseding conditions on the distribution of an unmodified copy of the file. A distributor wishing to distribute a complete, unmodified copy of The Program therefore needs to check the conditions only in this license and nowhere else. + +Activities other than distribution and/or modification of The Program are not covered by this license; they are outside its scope. In particular, the act of running The Program is not restricted. + +We, the LaTeX3 Project, believe that the conditions below give you the freedom to make and distribute modified versions of The Program that conform with whatever technical specifications you wish while maintaining the availability, integrity, and reliability of The Program. If you do not see how to achieve your goal while meeting these conditions, then read the document `cfgguide.tex' in the base LaTeX distribution for suggestions. + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +You may distribute a complete, unmodified copy of The Program. Distribution of only part of The Program is not allowed. + +You may not modify in any way a file of The Program that bears a legal notice forbidding modification of that file. + +You may distribute a modified file of The Program if, and only if, the following eight conditions are met: + + 1. You must meet any additional conditions borne by the file on the distribution of a modified version of the file as described below in the subsection `Additional Conditions on Individual Files of The Program'. + + 2. If the file is a LaTeX software file, then you must meet any applicable additional conditions on the distribution of a modified version of the file that are described below in the subsection `Additional Conditions on LaTeX Software Files'. + + 3. You must not distribute the modified file with the filename of the original file. + + 4. In the modified file, you must acknowledge the authorship and name of the original file, and the name (if any) of the program which contains it. + + 5. You must change any identification string in the file to indicate clearly that the modified file is not part of The Program. + + 6. You must change any addresses in the modified file for the reporting of errors in the file or in The Program generally to ensure that reports for files no longer maintained by the original maintainers will be directed to the maintainers of the modified files. + + 7. You must distribute the modified file under a license that forbids distribution both of the modified file and of any files derived from the modified file with the filename of the original file. + + 8. You must do either (A) or (B): + + (A) distribute a copy of The Program (that is, a complete, unmodified copy of The Program) together with the modified file; if your distribution of the modified file is made by offering access to copy the modified file from a designated place, then offering equivalent access to copy The Program from the same place meets this condition, even though third parties are not compelled to copy The Program along with the modified file; + + (B) provide to those who receive the modified file information that is sufficient for them to obtain a copy of The Program; for example, you may provide a Uniform Resource Locator (URL) for a site that you expect will provide them with a copy of The Program free of charge (either the version from which your modification is derived, or perhaps a later version). + +Note that in the above, `distribution' of a file means making the file available to others by any means. This includes, for instance, installing the file on any machine in such a way that the file is accessible by users other than yourself. `Modification' of a file means any procedure that produces a derivative file under any applicable law -- that is, a file containing the original file or a significant portion of it, either verbatim or with modifications and/or translated into another language. + +Changing the name of a file (other than as necessitated by the file conventions of the target file systems) is considered to be a modification of the file. + +The distribution conditions in this license do not have to be applied to files that have been modified in accordance with the above conditions. Note, however, that Condition 7. does apply to any such modified file. + +The conditions above are not intended to prohibit, and hence do not apply to, the updating, by any method, of a file so that it becomes identical to the latest version of that file of The Program. + + +A Recommendation on Modification Without Distribution ----------------------------------------------------- + +It is wise never to modify a file of The Program, even for your own personal use, without also meeting the above eight conditions for distributing the modified file. While you might intend that such modified files will never be distributed, often this will happen by accident -- you may forget that you have modified the file; or it may not occur to you when allowing others to access the modified file that you are thus distributing it and violating the conditions of this license. It is usually in your best interest to keep your copy of The Program identical with the public one. Many programs provide ways to control the behavior of that program without altering its licensed files. + +Additional Conditions on Individual Files of The Program -------------------------------------------------------- + +An individual file of The Program may bear additional conditions that supplement and/or supersede the conditions in this license if, and only if, such additional conditions exclusively concern modification of the file or distribution of a modified version of the file. The conditions on individual files of The Program therefore may differ only with respect to the kind and extent of modification of those files that is allowed, and with respect to the distribution of modified versions of those files. + +Additional Conditions on LaTeX Software Files +--------------------------------------------- + +If a file of The Program is intended to be used with LaTeX (that is, if it is a LaTeX software file), then the following additional conditions, which supplement and/or supersede the conditions above, apply to the file according to its filename extension: + + - You may not modify any file with filename extension `.ins' since these are installation files containing the legal notices that are placed in the files they generate. + + - You may distribute modified versions of files with filename extension `.fd' (LaTeX font definition files) under the standard conditions of the LPPL as described above. You may also distribute such modified LaTeX font definition files with their original names provided that: + (1) the only changes to the original files either enable use of available fonts or prevent attempts to access unavailable fonts; + (2) you also distribute the original, unmodified files (TeX input paths can be used to control which set of LaTeX font definition files is actually used by TeX). + + - You may distribute modified versions of files with filename extension `.cfg' (configuration files) with their original names. The Program may (and usually will) specify the range of commands that are allowed in a particular configuration file. + +Because of portability and exchangeability issues in LaTeX software, The LaTeX3 Project deprecates the distribution of modified versions of components of LaTeX or of generally available contributed code for them, but such distribution can meet the conditions of this license. + +NO WARRANTY +=========== + +There is no warranty for The Program. Except when otherwise stated in writing, The Copyright Holder provides The Program `as is', without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of The Program is with you. Should The Program prove defective, you assume the cost of all necessary servicing, repair, or correction. + +In no event unless agreed to in writing will The Copyright Holder, or any author named in the files of The Program, or any other party who may distribute and/or modify The Program as permitted above, be liable to you for damages, including any general, special, incidental or consequential damages arising out of any use of The Program or out of inability to use The Program (including, but not limited to, loss of data, data being rendered inaccurate, or losses sustained by anyone as a result of any failure of The Program to operate with any other programs), even if The Copyright Holder or said author or said other party has been advised of the possibility of such damages. + +WHETHER AND HOW TO DISTRIBUTE PROGRAMS UNDER THIS LICENSE ========================================================= + +This section contains important instructions, examples, and recommendations for authors who are considering distributing their programs under this license. These authors are addressed as `you' in this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your program you want or need to use *distribution* conditions that differ from those in this license, then do not refer to this license anywhere in your program but instead distribute your program under a different license. You may use the text of this license as a model for your own license, but your license should not refer to the LPPL or otherwise give the impression that your program is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains the motivation behind the conditions of this license. It explains, for example, why distributing LaTeX under the GNU General Public License (GPL) was considered inappropriate. Even if your program is unrelated to LaTeX, the discussion in `modguide.tex' may still be relevant, and authors intending to distribute their programs under any license are encouraged to read it. + +How to Use This License +----------------------- + +To use this license, place in each of the files of your program both an explicit copyright notice including your name and the year and also a statement that the distribution and/or modification of the file is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2001 M. Y. Name + % + % This program may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.2 + % of this license or (at your option) any later version. + % The latest version of this license is in + % http://www.latex-project.org/lppl.txt + % and version 1.2 or later is part of all distributions of LaTeX + % version 1999/12/01 or later. + % + % This program consists of the files pig.dtx and pig.ins + +Given such a notice and statement in a file, the conditions given in this license document would apply, with `The Program' referring to the two files `pig.dtx' and `pig.ins', and `The Copyright Holder' referring to the person `M. Y. Name'. + +Important Recommendations +------------------------- + +Defining What Constitutes The Program + +The LPPL requires that distributions of The Program contain all the files of The Program. It is therefore important that you provide a way for the licensee to determine which files constitute The Program. This could, for example, be achieved by explicitly listing all the files of The Program near the copyright notice of each file or by using a line like + + % This program consists of all files listed in manifest.txt. + +in that place. In the absence of an unequivocal list it might be impossible for the licensee to determine what is considered by you to comprise The Program. + +Noting Exceptional Files If The Program contains any files bearing additional conditions on modification, or on distribution of modified versions, of those files (other than those listed in `Additional Conditions on LaTeX Software Files'), then it is recommended that The Program contain a prominent file that defines the exceptional conditions, and either lists the exceptional files or defines one or more categories of exceptional files. + +Files containing the text of a license (such as this file) are often examples of files bearing more restrictive conditions on modification. LaTeX configuration files (with filename extension `.cfg') are examples of files bearing less restrictive conditions on the distribution of a modified version of the file. The additional conditions on LaTeX software given above are examples of declaring a category of files bearing exceptional additional conditions. + diff --git a/options/license/LPPL-1.3a b/options/license/LPPL-1.3a new file mode 100644 index 0000000..37cdd13 --- /dev/null +++ b/options/license/LPPL-1.3a @@ -0,0 +1,176 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.3a 2004-10-01 + +Copyright 1999 2002-04 LaTeX3 +Project Everyone is allowed to distribute verbatim copies of this license document, but modification of it is not allowed. + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the primary license under which the the LaTeX kernel and the base LaTeX packages are distributed. + +You may use this license for any work of which you hold the copyright and which you wish to distribute. This license may be particularly suitable if your work is TeX-related (such as a LaTeX package), but you may use it with small modifications even if your work is unrelated to TeX. + +The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE', below, gives instructions, examples, and recommendations for authors who are considering distributing their works under this license. + +This license gives conditions under which a work may be distributed and modified, as well as conditions under which modified versions of that work may be distributed. + +We, the LaTeX3 Project, believe that the conditions below give you the freedom to make and distribute modified versions of your work that conform with whatever technical specifications you wish while maintaining the availability, integrity, and reliability of that work. If you do not see how to achieve your goal while meeting these conditions, then read the document `cfgguide.tex' and `modguide.tex' in the base LaTeX distribution for suggestions. + +DEFINITIONS +=========== + +In this license document the following terms are used: + +`Work' Any work being distributed under this License. `Derived Work' Any work that under any applicable law is derived from the Work. + +`Modification' Any procedure that produces a Derived Work under any applicable law -- for example, the production of a file containing an original file associated with the Work or a significant portion of such a file, either verbatim or with modifications and/or translated into another language. + +`Modify' To apply any procedure that produces a Derived Work under any applicable law. `Distribution' Making copies of the Work available from one person to another, in whole or in part. Distribution includes (but is not limited to) making any electronic components of the Work accessible by file transfer protocols such as FTP or HTTP or by shared file systems such as Sun's Network File System (NFS). + +`Compiled Work' A version of the Work that has been processed into a form where it is directly usable on a computer system. This processing may include using installation facilities provided by the Work, transformations of the Work, copying of components of the Work, or other activities. Note that modification of any installation facilities provided by the Work constitutes modification of the Work. + +`Current Maintainer' A person or persons nominated as such within the Work. If there is no such explicit nomination then it is the `Copyright Holder' under any applicable law. + +`Base Interpreter' A program or process that is normally needed for running or interpreting a part or the whole of the Work. A Base Interpreter may depend on external components but these are not considered part of the Base Interpreter provided that each external component clearly identifies itself whenever it is used interactively. Unless explicitly specified when applying the license to the Work, the only applicable Base Interpreter is a "LaTeX-Format". + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +1. Activities other than distribution and/or modification of the Work are not covered by this license; they are outside its scope. In particular, the act of running the Work is not restricted and no requirements are made concerning any offers of support for the Work. + +2. You may distribute a complete, unmodified copy of the Work as you received it. Distribution of only part of the Work is considered modification of the Work, and no right to distribute such a Derived Work may be assumed under the terms of this clause. + +3. You may distribute a Compiled Work that has been generated from a complete, unmodified copy of the Work as distributed under Clause 2 above, as long as that Compiled Work is distributed in such a way that the recipients may install the Compiled Work on their system exactly as it would have been installed if they generated a Compiled Work directly from the Work. + +4. If you are the Current Maintainer of the Work, you may, without restriction, modify the Work, thus creating a Derived Work. You may also distribute the Derived Work without restriction, including Compiled Works generated from the Derived Work. Derived Works distributed in this manner by the Current Maintainer are considered to be updated versions of the Work. + +5. If you are not the Current Maintainer of the Work, you may modify your copy of the Work, thus creating a Derived Work based on the Work, and compile this Derived Work, thus creating a Compiled Work based on the Derived Work. + +6. If you are not the Current Maintainer of the Work, you may distribute a Derived Work provided the following conditions are met for every component of the Work unless that component clearly states in the copyright notice that it is exempt from that condition. Only the Current Maintainer is allowed to add such statements of exemption to a component of the Work. + + a. If a component of this Derived Work can be a direct replacement for a component of the Work when that component is used with the Base Interpreter, then, wherever this component of the Work identifies itself to the user when used interactively with that Base Interpreter, the replacement component of this Derived Work clearly and unambiguously identifies itself as a modified version of this component to the user when used interactively with that Base Interpreter. + + b. Every component of the Derived Work contains prominent notices detailing the nature of the changes to that component, or a prominent reference to another file that is distributed as part of the Derived Work and that contains a complete and accurate log of the changes. + + c. No information in the Derived Work implies that any persons, including (but not limited to) the authors of the original version of the Work, provide any support, including (but not limited to) the reporting and handling of errors, to recipients of the Derived Work unless those persons have stated explicitly that they do provide such support for the Derived Work. + + d. You distribute at least one of the following with the Derived Work: + + 1. A complete, unmodified copy of the Work; if your distribution of a modified component is made by offering access to copy the modified component from a designated place, then offering equivalent access to copy the Work from the same or some similar place meets this condition, even though third parties are not compelled to copy the Work along with the modified component; + + 2. Information that is sufficient to obtain a complete, unmodified copy of the Work. + +7. If you are not the Current Maintainer of the Work, you may distribute a Compiled Work generated from a Derived Work, as long as the Derived Work is distributed to all recipients of the Compiled Work, and as long as the conditions of Clause 6, above, are met with regard to the Derived Work. + +8. The conditions above are not intended to prohibit, and hence do not apply to, the modification, by any method, of any component so that it becomes identical to an updated version of that component of the Work as it is distributed by the Current Maintainer under Clause 4, above. + +9. Distribution of the Work or any Derived Work in an alternative format, where the Work or that Derived Work (in whole or in part) is then produced by applying some process to that format, does not relax or nullify any sections of this license as they pertain to the results of applying that process. + +10. + a. A Derived Work may be distributed under a different license provided that license itself honors the conditions listed in Clause 6 above, in regard to the Work, though it does not have to honor the rest of the conditions in this license. + + b. If a Derived Work is distributed under this license, that Derived Work must provide sufficient documentation as part of itself to allow each recipient of that Derived Work to honor the restrictions in Clause 6 above, concerning changes from the Work. + +11. This license places no restrictions on works that are unrelated to the Work, nor does this license place any restrictions on aggregating such works with the Work by any means. + +12. Nothing in this license is intended to, or may be used to, prevent complete compliance by all parties with all applicable laws. + +NO WARRANTY +=========== + +There is no warranty for the Work. Except when otherwise stated in writing, the Copyright Holder provides the Work `as is', without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the Work is with you. Should the Work prove defective, you assume the cost of all necessary servicing, repair, or correction. + +In no event unless required by applicable law or agreed to in writing will The Copyright Holder, or any author named in the components of the Work, or any other party who may distribute and/or modify the Work as permitted above, be liable to you for damages, including any general, special, incidental or consequential damages arising out of any use of the Work or out of inability to use the Work (including, but not limited to, loss of data, data being rendered inaccurate, or losses sustained by anyone as a result of any failure of the Work to operate with any other programs), even if the Copyright Holder or said author or said other party has been advised of the possibility of such damages. + +MAINTENANCE OF THE WORK +======================= + +The Work has the status `author-maintained' if the Copyright Holder explicitly and prominently states near the primary copyright notice in the Work that the Work can only be maintained by the Copyright Holder or simply that is `author-maintained'. + +The Work has the status `maintained' if there is a Current Maintainer who has indicated in the Work that they are willing to receive error reports for the Work (for example, by supplying a valid e-mail address). It is not required for the Current Maintainer to acknowledge or act upon these error reports. + +The Work changes from status `maintained' to `unmaintained' if there is no Current Maintainer, or the person stated to be Current Maintainer of the work cannot be reached through the indicated means of communication for a period of six months, and there are no other significant signs of active maintenance. + +You can become the Current Maintainer of the Work by agreement with any existing Current Maintainer to take over this role. + +If the Work is unmaintained, you can become the Current Maintainer of the Work through the following steps: + + 1. Make a reasonable attempt to trace the Current Maintainer (and the Copyright Holder, if the two differ) through the means of an Internet or similar search. + + 2. If this search is successful, then enquire whether the Work is still maintained. + + a. If it is being maintained, then ask the Current Maintainer to update their communication data within one month. + + b. If the search is unsuccessful or no action to resume active maintenance is taken by the Current Maintainer, then announce within the pertinent community your intention to take over maintenance. (If the Work is a LaTeX work, this could be done, for example, by posting to comp.text.tex.) + + 3a. If the Current Maintainer is reachable and agrees to pass maintenance of the Work to you, then this takes effect immediately upon announcement. + + b. If the Current Maintainer is not reachable and the Copyright Holder agrees that maintenance of the Work be passed to you, then this takes effect immediately upon announcement. + + 4. If you make an `intention announcement' as described in 2b. above and after three months your intention is challenged neither by the Current Maintainer nor by the Copyright Holder nor by other people, then you may arrange for the Work to be changed so as to name you as the (new) Current Maintainer. + + 5. If the previously unreachable Current Maintainer becomes reachable once more within three months of a change completed under the terms of 3b) or 4), then that Current Maintainer must become or remain the Current Maintainer upon request provided they then update their communication data within one month. + +A change in the Current Maintainer does not, of itself, alter the fact that the Work is distributed under the LPPL license. + +If you become the Current Maintainer of the Work, you should immediately provide, within the Work, a prominent and unambiguous statement of your status as Current Maintainer. You should also announce your new status to the same pertinent community as in 2b) above. + +WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE +====================================================== + +This section contains important instructions, examples, and recommendations for authors who are considering distributing their works under this license. These authors are addressed as `you' in this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your work you want or need to use *distribution* conditions that differ significantly from those in this license, then do not refer to this license anywhere in your work but, instead, distribute your work under a different license. You may use the text of this license as a model for your own license, but your license should not refer to the LPPL or otherwise give the impression that your work is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains the motivation behind the conditions of this license. It explains, for example, why distributing LaTeX under the GNU General Public License (GPL) was considered inappropriate. Even if your work is unrelated to LaTeX, the discussion in `modguide.tex' may still be relevant, and authors intending to distribute their works under any license are encouraged to read it. + +A Recommendation on Modification Without Distribution +----------------------------------------------------- + +It is wise never to modify a component of the Work, even for your own personal use, without also meeting the above conditions for distributing the modified component. While you might intend that such modifications will never be distributed, often this will happen by accident -- you may forget that you have modified that component; or it may not occur to you when allowing others to access the modified version that you are thus distributing it and violating the conditions of this license in ways that could have legal implications and, worse, cause problems for the community. It is therefore usually in your best interest to keep your copy of the Work identical with the public one. Many works provide ways to control the behavior of that work without altering any of its licensed components. + +How to Use This License +----------------------- + +To use this license, place in each of the components of your work both an explicit copyright notice including your name and the year the work was authored and/or last substantially modified. Include also a statement that the distribution and/or modification of that component is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2003 M. Y. Name + % + % This work may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.3 + % of this license or (at your option) any later version. + % The latest version of this license is in + % http://www.latex-project.org/lppl.txt + % and version 1.3 or later is part of all distributions of LaTeX + % version 2003/12/01 or later. + % + % This work has the LPPL maintenance status "maintained". + % + % This Current Maintainer of this work is M. Y. Name. + % + % This work consists of the files pig.dtx and pig.ins % and the derived file pig.sty. + +Given such a notice and statement in a file, the conditions given in this license document would apply, with the `Work' referring to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being generated from `pig.dtx' using `pig.ins'), the `Base Interpreter' referring to any "LaTeX-Format", and both `Copyright Holder' and `Current Maintainer' referring to the person `M. Y. Name'. + +If you do not want the Maintenance section of LPPL to apply to your Work, change "maintained" above into "author-maintained". However, we recommend that you use "maintained" as the Maintenance section was added in order to ensure that your Work remains useful to the community even when you can no longer maintain and support it yourself. + +Important Recommendations +------------------------- + +Defining What Constitutes the Work + +The LPPL requires that distributions of the Work contain all the files of the Work. It is therefore important that you provide a way for the licensee to determine which files constitute the Work. This could, for example, be achieved by explicitly listing all the files of the Work near the copyright notice of each file or by using a line such as: + + % This work consists of all files listed in manifest.txt. + +in that place. In the absence of an unequivocal list it might be impossible for the licensee to determine what is considered by you to comprise the Work and, in such a case, the licensee would be entitled to make reasonable conjectures as to which files comprise the Work. + diff --git a/options/license/LPPL-1.3c b/options/license/LPPL-1.3c new file mode 100644 index 0000000..60ea951 --- /dev/null +++ b/options/license/LPPL-1.3c @@ -0,0 +1,184 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.3c 2008-05-04 + +Copyright 1999 2002-2008 LaTeX3 Project + +Everyone is allowed to distribute verbatim copies of this license document, but modification of it is not allowed. + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the primary license under which the LaTeX kernel and the base LaTeX packages are distributed. + +You may use this license for any work of which you hold the copyright and which you wish to distribute. This license may be particularly suitable if your work is TeX-related (such as a LaTeX package), but it is written in such a way that you can use it even if your work is unrelated to TeX. + +The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE', below, gives instructions, examples, and recommendations for authors who are considering distributing their works under this license. + +This license gives conditions under which a work may be distributed and modified, as well as conditions under which modified versions of that work may be distributed. + +We, the LaTeX3 Project, believe that the conditions below give you the freedom to make and distribute modified versions of your work that conform with whatever technical specifications you wish while maintaining the availability, integrity, and reliability of that work. If you do not see how to achieve your goal while meeting these conditions, then read the document `cfgguide.tex' and `modguide.tex' in the base LaTeX distribution for suggestions. + +DEFINITIONS +=========== + +In this license document the following terms are used: + +`Work' Any work being distributed under this License. `Derived Work' Any work that under any applicable law is derived from the Work. + +`Modification' Any procedure that produces a Derived Work under any applicable law -- for example, the production of a file containing an original file associated with the Work or a significant portion of such a file, either verbatim or with modifications and/or translated into another language. + +`Modify' To apply any procedure that produces a Derived Work under any applicable law. `Distribution' Making copies of the Work available from one person to another, in whole or in part. Distribution includes (but is not limited to) making any electronic components of the Work accessible by file transfer protocols such as FTP or HTTP or by shared file systems such as Sun's Network File System (NFS). + +`Compiled Work' A version of the Work that has been processed into a form where it is directly usable on a computer system. This processing may include using installation facilities provided by the Work, transformations of the Work, copying of components of the Work, or other activities. Note that modification of any installation facilities provided by the Work constitutes modification of the Work. + +`Current Maintainer' A person or persons nominated as such within the Work. If there is no such explicit nomination then it is the `Copyright Holder' under any applicable law. + +`Base Interpreter' A program or process that is normally needed for running or interpreting a part or the whole of the Work. + +A Base Interpreter may depend on external components but these are not considered part of the Base Interpreter provided that each external component clearly identifies itself whenever it is used interactively. Unless explicitly specified when applying the license to the Work, the only applicable Base Interpreter is a `LaTeX-Format' or in the case of files belonging to the `LaTeX-format' a program implementing the `TeX language'. + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +1. Activities other than distribution and/or modification of the Work are not covered by this license; they are outside its scope. In particular, the act of running the Work is not restricted and no requirements are made concerning any offers of support for the Work. + +2. You may distribute a complete, unmodified copy of the Work as you received it. Distribution of only part of the Work is considered modification of the Work, and no right to distribute such a Derived Work may be assumed under the terms of this clause. + +3. You may distribute a Compiled Work that has been generated from a complete, unmodified copy of the Work as distributed under Clause 2 above, as long as that Compiled Work is distributed in such a way that the recipients may install the Compiled Work on their system exactly as it would have been installed if they generated a Compiled Work directly from the Work. + +4. If you are the Current Maintainer of the Work, you may, without restriction, modify the Work, thus creating a Derived Work. You may also distribute the Derived Work without restriction, including Compiled Works generated from the Derived Work. Derived Works distributed in this manner by the Current Maintainer are considered to be updated versions of the Work. + +5. If you are not the Current Maintainer of the Work, you may modify your copy of the Work, thus creating a Derived Work based on the Work, and compile this Derived Work, thus creating a Compiled Work based on the Derived Work. + +6. If you are not the Current Maintainer of the Work, you may distribute a Derived Work provided the following conditions are met for every component of the Work unless that component clearly states in the copyright notice that it is exempt from that condition. Only the Current Maintainer is allowed to add such statements of exemption to a component of the Work. + + a. If a component of this Derived Work can be a direct replacement for a component of the Work when that component is used with the Base Interpreter, then, wherever this component of the Work identifies itself to the user when used interactively with that Base Interpreter, the replacement component of this Derived Work clearly and unambiguously identifies itself as a modified version of this component to the user when used interactively with that Base Interpreter. + + b. Every component of the Derived Work contains prominent notices detailing the nature of the changes to that component, or a prominent reference to another file that is distributed as part of the Derived Work and that contains a complete and accurate log of the changes. + + c. No information in the Derived Work implies that any persons, including (but not limited to) the authors of the original version of the Work, provide any support, including (but not limited to) the reporting and handling of errors, to recipients of the Derived Work unless those persons have stated explicitly that they do provide such support for the Derived Work. + + d. You distribute at least one of the following with the Derived Work: + + 1. A complete, unmodified copy of the Work; if your distribution of a modified component is made by offering access to copy the modified component from a designated place, then offering equivalent access to copy the Work from the same or some similar place meets this condition, even though third parties are not compelled to copy the Work along with the modified component; + + 2. Information that is sufficient to obtain a complete, unmodified copy of the Work. + +7. If you are not the Current Maintainer of the Work, you may distribute a Compiled Work generated from a Derived Work, as long as the Derived Work is distributed to all recipients of the Compiled Work, and as long as the conditions of Clause 6, above, are met with regard to the Derived Work. + +8. The conditions above are not intended to prohibit, and hence do not apply to, the modification, by any method, of any component so that it becomes identical to an updated version of that component of the Work as it is distributed by the Current Maintainer under Clause 4, above. + +9. Distribution of the Work or any Derived Work in an alternative format, where the Work or that Derived Work (in whole or in part) is then produced by applying some process to that format, does not relax or nullify any sections of this license as they pertain to the results of applying that process. + +10. + a. A Derived Work may be distributed under a different license provided that license itself honors the conditions listed in Clause 6 above, in regard to the Work, though it does not have to honor the rest of the conditions in this license. + + b. If a Derived Work is distributed under a different license, that Derived Work must provide sufficient documentation as part of itself to allow each recipient of that Derived Work to honor the restrictions in Clause 6 above, concerning changes from the Work. + +11. This license places no restrictions on works that are unrelated to the Work, nor does this license place any restrictions on aggregating such works with the Work by any means. + +12. Nothing in this license is intended to, or may be used to, prevent complete compliance by all parties with all applicable laws. + +NO WARRANTY +=========== + +There is no warranty for the Work. Except when otherwise stated in writing, the Copyright Holder provides the Work `as is', without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the Work is with you. Should the Work prove defective, you assume the cost of all necessary servicing, repair, or correction. + +In no event unless required by applicable law or agreed to in writing will The Copyright Holder, or any author named in the components of the Work, or any other party who may distribute and/or modify the Work as permitted above, be liable to you for damages, including any general, special, incidental or consequential damages arising out of any use of the Work or out of inability to use the Work (including, but not limited to, loss of data, data being rendered inaccurate, or losses sustained by anyone as a result of any failure of the Work to operate with any other programs), even if the Copyright Holder or said author or said other party has been advised of the possibility of such damages. + +MAINTENANCE OF THE WORK +======================= + +The Work has the status `author-maintained' if the Copyright Holder explicitly and prominently states near the primary copyright notice in the Work that the Work can only be maintained by the Copyright Holder or simply that it is `author-maintained'. + +The Work has the status `maintained' if there is a Current Maintainer who has indicated in the Work that they are willing to receive error reports for the Work (for example, by supplying a valid e-mail address). It is not required for the Current Maintainer to acknowledge or act upon these error reports. + +The Work changes from status `maintained' to `unmaintained' if there is no Current Maintainer, or the person stated to be Current Maintainer of the work cannot be reached through the indicated means of communication for a period of six months, and there are no other significant signs of active maintenance. + +You can become the Current Maintainer of the Work by agreement with any existing Current Maintainer to take over this role. + +If the Work is unmaintained, you can become the Current Maintainer of the Work through the following steps: + +1. Make a reasonable attempt to trace the Current Maintainer (and the Copyright Holder, if the two differ) through the means of an Internet or similar search. + +2. If this search is successful, then enquire whether the Work is still maintained. + + a. If it is being maintained, then ask the Current Maintainer to update their communication data within one month. + + b. If the search is unsuccessful or no action to resume active maintenance is taken by the Current Maintainer, then announce within the pertinent community your intention to take over maintenance. (If the Work is a LaTeX work, this could be done, for example, by posting to comp.text.tex.) + +3a. If the Current Maintainer is reachable and agrees to pass maintenance of the Work to you, then this takes effect immediately upon announcement. + +b. If the Current Maintainer is not reachable and the Copyright Holder agrees that maintenance of the Work be passed to you, then this takes effect immediately upon announcement. + +4. If you make an `intention announcement' as described in 2b. above and after three months your intention is challenged neither by the Current Maintainer nor by the Copyright Holder nor by other people, then you may arrange for the Work to be changed so as to name you as the (new) Current Maintainer. + +5. If the previously unreachable Current Maintainer becomes reachable once more within three months of a change completed under the terms of 3b) or 4), then that Current Maintainer must become or remain the Current Maintainer upon request provided they then update their communication data within one month. + +A change in the Current Maintainer does not, of itself, alter the fact that the Work is distributed under the LPPL license. + +If you become the Current Maintainer of the Work, you should immediately provide, within the Work, a prominent and unambiguous statement of your status as Current Maintainer. You should also announce your new status to the same pertinent community as in 2b) above. + +WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE +====================================================== + +This section contains important instructions, examples, and recommendations for authors who are considering distributing their works under this license. These authors are addressed as `you' in this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your work you want or need to use *distribution* conditions that differ significantly from those in this license, then do not refer to this license anywhere in your work but, instead, distribute your work under a different license. You may use the text of this license as a model for your own license, but your license should not refer to the LPPL or otherwise give the impression that your work is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains the motivation behind the conditions of this license. It explains, for example, why distributing LaTeX under the GNU General Public License (GPL) was considered inappropriate. Even if your work is unrelated to LaTeX, the discussion in `modguide.tex' may still be relevant, and authors intending to distribute their works under any license are encouraged to read it. + +A Recommendation on Modification Without Distribution +----------------------------------------------------- + +It is wise never to modify a component of the Work, even for your own personal use, without also meeting the above conditions for distributing the modified component. While you might intend that such modifications will never be distributed, often this will happen by accident -- you may forget that you have modified that component; or it may not occur to you when allowing others to access the modified version that you are thus distributing it and violating the conditions of this license in ways that could have legal implications and, worse, cause problems for the community. It is therefore usually in your best interest to keep your copy of the Work identical with the public one. Many works provide ways to control the behavior of that work without altering any of its licensed components. + +How to Use This License +----------------------- + +To use this license, place in each of the components of your work both an explicit copyright notice including your name and the year the work was authored and/or last substantially modified. Include also a statement that the distribution and/or modification of that component is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2005 M. Y. Name + % + % This work may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.3 + % of this license or (at your option) any later version. + % The latest version of this license is in + % http://www.latex-project.org/lppl.txt + % and version 1.3 or later is part of all distributions of LaTeX + % version 2005/12/01 or later. + % + % This work has the LPPL maintenance status `maintained'. + % + % The Current Maintainer of this work is M. Y. Name. + % + % This work consists of the files pig.dtx and pig.ins + % and the derived file pig.sty. + +Given such a notice and statement in a file, the conditions given in this license document would apply, with the `Work' referring to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being generated from `pig.dtx' using `pig.ins'), the `Base Interpreter' referring to any `LaTeX-Format', and both `Copyright Holder' and `Current Maintainer' referring to the person `M. Y. Name'. + +If you do not want the Maintenance section of LPPL to apply to your Work, change `maintained' above into `author-maintained'. However, we recommend that you use `maintained', as the Maintenance section was added in order to ensure that your Work remains useful to the community even when you can no longer maintain and support it yourself. + +Derived Works That Are Not Replacements +--------------------------------------- + +Several clauses of the LPPL specify means to provide reliability and stability for the user community. They therefore concern themselves with the case that a Derived Work is intended to be used as a (compatible or incompatible) replacement of the original Work. If this is not the case (e.g., if a few lines of code are reused for a completely different task), then clauses 6b and 6d shall not apply. + +Important Recommendations +------------------------- + +Defining What Constitutes the Work + +The LPPL requires that distributions of the Work contain all the files of the Work. It is therefore important that you provide a way for the licensee to determine which files constitute the Work. This could, for example, be achieved by explicitly listing all the files of the Work near the copyright notice of each file or by using a line such as: + + % This work consists of all files listed in manifest.txt. + +in that place. In the absence of an unequivocal list it might be impossible for the licensee to determine what is considered by you to comprise the Work and, in such a case, the licensee would be entitled to make reasonable conjectures as to which files comprise the Work. \ No newline at end of file diff --git a/options/license/Latex2e b/options/license/Latex2e new file mode 100644 index 0000000..3f67f81 --- /dev/null +++ b/options/license/Latex2e @@ -0,0 +1,9 @@ +Copyright (C) 2007, 2008, 2009, 2010 Karl Berry. +Copyright (C) 1988, 1994, 2007 Stephen Gilmore. +Copyright (C) 1994, 1995, 1996 Torsten Martinsen. + +Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. diff --git a/options/license/Leptonica b/options/license/Leptonica new file mode 100644 index 0000000..0477a63 --- /dev/null +++ b/options/license/Leptonica @@ -0,0 +1,10 @@ +Copyright (C) 2001 Leptonica. All rights reserved. + +This software is distributed in the hope that it will be useful, but with NO WARRANTY OF ANY KIND. + +No author or distributor accepts responsibility to anyone for the consequences of using this software, or for whether it serves any particular purpose or works at all, unless he or she says so in writing. Everyone is granted permission to copy, modify and redistribute this source code, for commercial or non-commercial purposes, with the following restrictions: + +(1) the origin of this source code must not be misrepresented; +(2) modified versions must be plainly marked as such; and +(3) this notice may not be removed or altered from any source or modified source distribution. + diff --git a/options/license/LiLiQ-P-1.1 b/options/license/LiLiQ-P-1.1 new file mode 100644 index 0000000..53eefc4 --- /dev/null +++ b/options/license/LiLiQ-P-1.1 @@ -0,0 +1,70 @@ +Licence Libre du Québec – Permissive (LiLiQ-P) + +Version 1.1 + +1. Préambule +Cette licence s'applique à tout logiciel distribué dont le titulaire du droit d'auteur précise qu'il est sujet aux termes de la Licence Libre du Québec – Permissive (LiLiQ-P) (ci-après appelée la « licence »). + +2. Définitions +Dans la présente licence, à moins que le contexte n'indique un sens différent, on entend par: + + « concédant » : le titulaire du droit d'auteur sur le logiciel, ou toute personne dûment autorisée par ce dernier à accorder la présente licence; + « contributeur » : le titulaire du droit d'auteur ou toute personne autorisée par ce dernier à soumettre au concédant une contribution. Un contributeur dont sa contribution est incorporée au logiciel est considéré comme un concédant en regard de sa contribution; + « contribution » : tout logiciel original, ou partie de logiciel original soumis et destiné à être incorporé dans le logiciel; + « distribution » : le fait de délivrer une copie du logiciel; + « licencié » : toute personne qui possède une copie du logiciel et qui exerce les droits concédés par la licence; + « logiciel » : une œuvre protégée par le droit d'auteur, telle qu'un programme d'ordinateur et sa documentation, pour laquelle le titulaire du droit d'auteur a précisé qu'elle est sujette aux termes de la présente licence; + « logiciel dérivé » : tout logiciel original réalisé par un licencié, autre que le logiciel ou un logiciel modifié, qui produit ou reproduit la totalité ou une partie importante du logiciel; + « logiciel modifié » : toute modification par un licencié de l'un des fichiers source du logiciel ou encore tout nouveau fichier source qui incorpore le logiciel ou une partie importante de ce dernier. + +3. Licence de droit d'auteur +Sous réserve des termes de la licence, le concédant accorde au licencié une licence non exclusive et libre de redevances lui permettant d’exercer les droits suivants sur le logiciel : + + 1 Produire ou reproduire la totalité ou une partie importante; + 2 Exécuter ou représenter la totalité ou une partie importante en public; + 3 Publier la totalité ou une partie importante; + 4 Sous-licencier sous une autre licence libre, approuvée ou certifiée par la Free Software Foundation ou l'Open Source Initiative. + +Cette licence est accordée sans limite territoriale et sans limite de temps. + +L'exercice complet de ces droits est sujet à la distribution par le concédant du code source du logiciel, lequel doit être sous une forme permettant d'y apporter des modifications. Le concédant peut aussi distribuer le logiciel accompagné d'une offre de distribuer le code source du logiciel, sans frais supplémentaires, autres que ceux raisonnables afin de permettre la livraison du code source. Cette offre doit être valide pendant une durée raisonnable. + +4. Distribution +Le licencié peut distribuer des copies du logiciel, d'un logiciel modifié ou dérivé, sous réserve de respecter les conditions suivantes : + + 1 Le logiciel doit être accompagné d'un exemplaire de cette licence; + 2 Si le logiciel a été modifié, le licencié doit en faire la mention, de préférence dans chacun des fichiers modifiés dont la nature permet une telle mention; + 3 Les étiquettes ou mentions faisant état des droits d'auteur, des marques de commerce, des garanties ou de la paternité concernant le logiciel ne doivent pas être modifiées ou supprimées, à moins que ces étiquettes ou mentions ne soient inapplicables à un logiciel modifié ou dérivé donné. + +5. Contributions +Sous réserve d'une entente distincte, toute contribution soumise par un contributeur au concédant pour inclusion dans le logiciel sera soumise aux termes de cette licence. + +6. Marques de commerce +La licence n'accorde aucune permission particulière qui permettrait d'utiliser les marques de commerce du concédant, autre que celle requise permettant d'identifier la provenance du logiciel. + +7. Garanties +Sauf mention contraire, le concédant distribue le logiciel sans aucune garantie, aux risques et périls de l'acquéreur de la copie du logiciel, et ce, sans assurer que le logiciel puisse répondre à un besoin particulier ou puisse donner un résultat quelconque. + +Sans lier le concédant d'une quelconque manière, rien n'empêche un licencié d'offrir ou d'exclure des garanties ou du support. + +8. Responsabilité +Le licencié est responsable de tout préjudice résultant de l'exercice des droits accordés par la licence. + +Le concédant ne saurait être tenu responsable de dommages subis par le licencié ou par des tiers, pour quelque cause que ce soit en lien avec la licence et les droits qui y sont accordés. + +9. Résiliation +La présente licence est automatiquement résiliée dès que les droits qui y sont accordés ne sont pas exercés conformément aux termes qui y sont stipulés. + +Toutefois, si le défaut est corrigé dans un délai de 30 jours de sa prise de connaissance par la personne en défaut, et qu'il s'agit du premier défaut, la licence est accordée de nouveau. + +Pour tout défaut subséquent, le consentement exprès du concédant est nécessaire afin que la licence soit accordée de nouveau. + +10. Version de la licence +Le Centre de services partagés du Québec, ses ayants cause ou toute personne qu'il désigne, peuvent diffuser des versions révisées ou modifiées de cette licence. Chaque version recevra un numéro unique. Si un logiciel est déjà soumis aux termes d'une version spécifique, c'est seulement cette version qui liera les parties à la licence. + +Le concédant peut aussi choisir de concéder la licence sous la version actuelle ou toute version ultérieure, auquel cas le licencié peut choisir sous quelle version la licence lui est accordée. + +11. Divers +Dans la mesure où le concédant est un ministère, un organisme public ou une personne morale de droit public, créés en vertu d'une loi de l'Assemblée nationale du Québec, la licence est régie par le droit applicable au Québec et en cas de contestation, les tribunaux du Québec seront seuls compétents. + +La présente licence peut être distribuée sans conditions particulières. Toutefois, une version modifiée doit être distribuée sous un nom différent. Toute référence au Centre de services partagés du Québec, et, le cas échéant, ses ayant cause, doit être retirée, autre que celle permettant d'identifier la provenance de la licence. diff --git a/options/license/LiLiQ-R-1.1 b/options/license/LiLiQ-R-1.1 new file mode 100644 index 0000000..3784f1a --- /dev/null +++ b/options/license/LiLiQ-R-1.1 @@ -0,0 +1,94 @@ +Licence Libre du Québec – Réciprocité (LiLiQ-R) + +Version 1.1 + +1. Préambule +Cette licence s'applique à tout logiciel distribué dont le titulaire du droit d'auteur précise qu'il est sujet aux termes de la Licence Libre du Québec – Réciprocité (LiLiQ-R) (ci-après appelée la « licence »). + +2. Définitions +Dans la présente licence, à moins que le contexte n'indique un sens différent, on entend par: + + « concédant » : le titulaire du droit d'auteur sur le logiciel, ou toute personne dûment autorisée par ce dernier à accorder la présente licence; + « contributeur » : le titulaire du droit d'auteur ou toute personne autorisée par ce dernier à soumettre au concédant une contribution. Un contributeur dont sa contribution est incorporée au logiciel est considéré comme un concédant en regard de sa contribution; + « contribution » : tout logiciel original, ou partie de logiciel original soumis et destiné à être incorporé dans le logiciel; + « distribution » : le fait de délivrer une copie du logiciel; + « licencié » : toute personne qui possède une copie du logiciel et qui exerce les droits concédés par la licence; + « logiciel » : une œuvre protégée par le droit d'auteur, telle qu'un programme d'ordinateur et sa documentation, pour laquelle le titulaire du droit d'auteur a précisé qu'elle est sujette aux termes de la présente licence; + « logiciel dérivé » : tout logiciel original réalisé par un licencié, autre que le logiciel ou un logiciel modifié, qui produit ou reproduit la totalité ou une partie importante du logiciel; + « logiciel modifié » : toute modification par un licencié de l'un des fichiers source du logiciel ou encore tout nouveau fichier source qui incorpore le logiciel ou une partie importante de ce dernier. + +3. Licence de droit d'auteur +Sous réserve des termes de la licence, le concédant accorde au licencié une licence non exclusive et libre de redevances lui permettant d’exercer les droits suivants sur le logiciel : + + 1 Produire ou reproduire la totalité ou une partie importante; + 2 Exécuter ou représenter la totalité ou une partie importante en public; + 3 Publier la totalité ou une partie importante. + +Cette licence est accordée sans limite territoriale et sans limite de temps. + +L'exercice complet de ces droits est sujet à la distribution par le concédant du code source du logiciel, lequel doit être sous une forme permettant d'y apporter des modifications. Le concédant peut aussi distribuer le logiciel accompagné d'une offre de distribuer le code source du logiciel, sans frais supplémentaires, autres que ceux raisonnables afin de permettre la livraison du code source. Cette offre doit être valide pendant une durée raisonnable. + +4. Distribution +Le licencié peut distribuer des copies du logiciel, d'un logiciel modifié ou dérivé, sous réserve de respecter les conditions suivantes : + + 1 Le logiciel doit être accompagné d'un exemplaire de cette licence; + 2 Si le logiciel a été modifié, le licencié doit en faire la mention, de préférence dans chacun des fichiers modifiés dont la nature permet une telle mention; + 3 Les étiquettes ou mentions faisant état des droits d'auteur, des marques de commerce, des garanties ou de la paternité concernant le logiciel ne doivent pas être modifiées ou supprimées, à moins que ces étiquettes ou mentions ne soient inapplicables à un logiciel modifié ou dérivé donné. + +4.1. Réciprocité +Chaque fois que le licencié distribue le logiciel, le concédant offre au récipiendaire une concession sur le logiciel selon les termes de la présente licence. Le licencié doit offrir une concession selon les termes de la présente licence pour tout logiciel modifié qu'il distribue. + +Chaque fois que le licencié distribue le logiciel ou un logiciel modifié, ce dernier doit assumer l'obligation d'en distribuer le code source, de la manière prévue au troisième alinéa de l'article 3. + +4.2. Compatibilité +Dans la mesure où le licencié souhaite distribuer un logiciel modifié combiné à un logiciel assujetti à une licence compatible, mais dont il ne serait pas possible d'en respecter les termes, le concédant offre, en plus de la présente concession, une concession selon les termes de cette licence compatible. + +Un licencié qui est titulaire exclusif du droit d'auteur sur le logiciel assujetti à une licence compatible ne peut pas se prévaloir de cette offre. Il en est de même pour toute autre personne dûment autorisée à sous-licencier par le titulaire exclusif du droit d'auteur sur le logiciel assujetti à une licence compatible. + +Est considérée comme une licence compatible toute licence libre approuvée ou certifiée par la Free Software Foundation ou l'Open Source Initiative, dont le niveau de réciprocité est comparable ou supérieur à celui de la présente licence, sans toutefois être moindre, notamment : + + 1 Common Development and Distribution License (CDDL-1.0) + 2 Common Public License Version 1.0 (CPL-1.0) + 3 Contrat de licence de logiciel libre CeCILL, version 2.1 (CECILL-2.1) + 4 Contrat de licence de logiciel libre CeCILL-C (CECILL-C) + 5 Eclipse Public License - v 1.0 (EPL-1.0) + 6 European Union Public License, version 1.1 (EUPL v. 1.1) + 7 Licence Libre du Québec – Réciprocité forte version 1.1 (LiLiQ-R+ 1.1) + 8 GNU General Public License Version 2 (GNU GPLv2) + 9 GNU General Public License Version 3 (GNU GPLv3) + 10 GNU Lesser General Public License Version 2.1 (GNU LGPLv2.1) + 11 GNU Lesser General Public License Version 3 (GNU LGPLv3) + 12 Mozilla Public License Version 2.0 (MPL-2.0) + +5. Contributions +Sous réserve d'une entente distincte, toute contribution soumise par un contributeur au concédant pour inclusion dans le logiciel sera soumise aux termes de cette licence. + +6. Marques de commerce +La licence n'accorde aucune permission particulière qui permettrait d'utiliser les marques de commerce du concédant, autre que celle requise permettant d'identifier la provenance du logiciel. + +7. Garanties +Sauf mention contraire, le concédant distribue le logiciel sans aucune garantie, aux risques et périls de l'acquéreur de la copie du logiciel, et ce, sans assurer que le logiciel puisse répondre à un besoin particulier ou puisse donner un résultat quelconque. + +Sans lier le concédant d'une quelconque manière, rien n'empêche un licencié d'offrir ou d'exclure des garanties ou du support. + +8. Responsabilité +Le licencié est responsable de tout préjudice résultant de l'exercice des droits accordés par la licence. + +Le concédant ne saurait être tenu responsable du préjudice subi par le licencié ou par des tiers, pour quelque cause que ce soit en lien avec la licence et les droits qui y sont accordés. + +9. Résiliation +La présente licence est résiliée de plein droit dès que les droits qui y sont accordés ne sont pas exercés conformément aux termes qui y sont stipulés. + +Toutefois, si le défaut est corrigé dans un délai de 30 jours de sa prise de connaissance par la personne en défaut, et qu'il s'agit du premier défaut, la licence est accordée de nouveau. + +Pour tout défaut subséquent, le consentement exprès du concédant est nécessaire afin que la licence soit accordée de nouveau. + +10. Version de la licence +Le Centre de services partagés du Québec, ses ayants cause ou toute personne qu'il désigne, peuvent diffuser des versions révisées ou modifiées de cette licence. Chaque version recevra un numéro unique. Si un logiciel est déjà soumis aux termes d'une version spécifique, c'est seulement cette version qui liera les parties à la licence. + +Le concédant peut aussi choisir de concéder la licence sous la version actuelle ou toute version ultérieure, auquel cas le licencié peut choisir sous quelle version la licence lui est accordée. + +11. Divers +Dans la mesure où le concédant est un ministère, un organisme public ou une personne morale de droit public, créés en vertu d'une loi de l'Assemblée nationale du Québec, la licence est régie par le droit applicable au Québec et en cas de contestation, les tribunaux du Québec seront seuls compétents. + +La présente licence peut être distribuée sans conditions particulières. Toutefois, une version modifiée doit être distribuée sous un nom différent. Toute référence au Centre de services partagés du Québec, et, le cas échéant, ses ayant droit, doit être retirée, autre que celle permettant d'identifier la provenance de la licence. diff --git a/options/license/LiLiQ-Rplus-1.1 b/options/license/LiLiQ-Rplus-1.1 new file mode 100644 index 0000000..85a9f70 --- /dev/null +++ b/options/license/LiLiQ-Rplus-1.1 @@ -0,0 +1,88 @@ +Licence Libre du Québec – Réciprocité forte (LiLiQ-R+) + +Version 1.1 + +1. Préambule +Cette licence s'applique à tout logiciel distribué dont le titulaire du droit d'auteur précise qu'il est sujet aux termes de la Licence Libre du Québec – Réciprocité forte (LiLiQ-R+) (ci-après appelée la « licence »). + +2. Définitions +Dans la présente licence, à moins que le contexte n'indique un sens différent, on entend par: + + « concédant » : le titulaire du droit d'auteur sur le logiciel, ou toute personne dûment autorisée par ce dernier à accorder la présente licence; + « contributeur » : le titulaire du droit d'auteur ou toute personne autorisée par ce dernier à soumettre au concédant une contribution. Un contributeur dont sa contribution est incorporée au logiciel est considéré comme un concédant en regard de sa contribution; + « contribution » : tout logiciel original, ou partie de logiciel original soumis et destiné à être incorporé dans le logiciel; + « distribution » : le fait de délivrer une copie du logiciel; + « licencié » : toute personne qui possède une copie du logiciel et qui exerce les droits concédés par la licence; + « logiciel » : une œuvre protégée par le droit d'auteur, telle qu'un programme d'ordinateur et sa documentation, pour laquelle le titulaire du droit d'auteur a précisé qu'elle est sujette aux termes de la présente licence; + « logiciel dérivé » : tout logiciel original réalisé par un licencié, autre que le logiciel ou un logiciel modifié, qui produit ou reproduit la totalité ou une partie importante du logiciel; + « logiciel modifié » : toute modification par un licencié de l'un des fichiers source du logiciel ou encore tout nouveau fichier source qui incorpore le logiciel ou une partie importante de ce dernier. + +3. Licence de droit d'auteur +Sous réserve des termes de la licence, le concédant accorde au licencié une licence non exclusive et libre de redevances lui permettant d’exercer les droits suivants sur le logiciel : + + 1 Produire ou reproduire la totalité ou une partie importante; + 2 Exécuter ou représenter la totalité ou une partie importante en public; + 3 Publier la totalité ou une partie importante. + +Cette licence est accordée sans limite territoriale et sans limite de temps. + +L'exercice complet de ces droits est sujet à la distribution par le concédant du code source du logiciel, lequel doit être sous une forme permettant d'y apporter des modifications. Le concédant peut aussi distribuer le logiciel accompagné d'une offre de distribuer le code source du logiciel, sans frais supplémentaires, autres que ceux raisonnables afin de permettre la livraison du code source. Cette offre doit être valide pendant une durée raisonnable. + +4. Distribution +Le licencié peut distribuer des copies du logiciel, d'un logiciel modifié ou dérivé, sous réserve de respecter les conditions suivantes : + + 1 Le logiciel doit être accompagné d'un exemplaire de cette licence; + 2 Si le logiciel a été modifié, le licencié doit en faire la mention, de préférence dans chacun des fichiers modifiés dont la nature permet une telle mention; + 3 Les étiquettes ou mentions faisant état des droits d'auteur, des marques de commerce, des garanties ou de la paternité concernant le logiciel ne doivent pas être modifiées ou supprimées, à moins que ces étiquettes ou mentions ne soient inapplicables à un logiciel modifié ou dérivé donné. + +4.1. Réciprocité +Chaque fois que le licencié distribue le logiciel, le concédant offre au récipiendaire une concession sur le logiciel selon les termes de la présente licence. Le licencié doit offrir une concession selon les termes de la présente licence pour tout logiciel modifié ou dérivé qu'il distribue. + +Chaque fois que le licencié distribue le logiciel, un logiciel modifié, ou un logiciel dérivé, ce dernier doit assumer l'obligation d'en distribuer le code source, de la manière prévue au troisième alinéa de l'article 3. + +4.2. Compatibilité +Dans la mesure où le licencié souhaite distribuer un logiciel modifié ou dérivé combiné à un logiciel assujetti à une licence compatible, mais dont il ne serait pas possible d'en respecter les termes, le concédant offre, en plus de la présente concession, une concession selon les termes de cette licence compatible. + +Un licencié qui est titulaire exclusif du droit d'auteur sur le logiciel assujetti à une licence compatible ne peut pas se prévaloir de cette offre. Il en est de même pour toute autre personne dûment autorisée à sous-licencier par le titulaire exclusif du droit d'auteur sur le logiciel assujetti à une licence compatible. + +Est considérée comme une licence compatible toute licence libre approuvée ou certifiée par la Free Software Foundation ou l'Open Source Initiative, dont le niveau de réciprocité est comparable à celui de la présente licence, sans toutefois être moindre, notamment : + + 1 Common Public License Version 1.0 (CPL-1.0) + 2 Contrat de licence de logiciel libre CeCILL, version 2.1 (CECILL-2.1) + 3 Eclipse Public License - v 1.0 (EPL-1.0) + 4 European Union Public License, version 1.1 (EUPL v. 1.1) + 5 GNU General Public License Version 2 (GNU GPLv2) + 6 GNU General Public License Version 3 (GNU GPLv3) + +5. Contributions +Sous réserve d'une entente distincte, toute contribution soumise par un contributeur au concédant pour inclusion dans le logiciel sera soumise aux termes de cette licence. + +6. Marques de commerce +La licence n'accorde aucune permission particulière qui permettrait d'utiliser les marques de commerce du concédant, autre que celle requise permettant d'identifier la provenance du logiciel. + +7. Garanties +Sauf mention contraire, le concédant distribue le logiciel sans aucune garantie, aux risques et périls de l'acquéreur de la copie du logiciel, et ce, sans assurer que le logiciel puisse répondre à un besoin particulier ou puisse donner un résultat quelconque. + +Sans lier le concédant d'une quelconque manière, rien n'empêche un licencié d'offrir ou d'exclure des garanties ou du support. + +8. Responsabilité +Le licencié est responsable de tout préjudice résultant de l'exercice des droits accordés par la licence. + +Le concédant ne saurait être tenu responsable du préjudice subi par le licencié ou par des tiers, pour quelque cause que ce soit en lien avec la licence et les droits qui y sont accordés. + +9. Résiliation +La présente licence est résiliée de plein droit dès que les droits qui y sont accordés ne sont pas exercés conformément aux termes qui y sont stipulés. + +Toutefois, si le défaut est corrigé dans un délai de 30 jours de sa prise de connaissance par la personne en défaut, et qu'il s'agit du premier défaut, la licence est accordée de nouveau. + +Pour tout défaut subséquent, le consentement exprès du concédant est nécessaire afin que la licence soit accordée de nouveau. + +10. Version de la licence +Le Centre de services partagés du Québec, ses ayants cause ou toute personne qu'il désigne, peuvent diffuser des versions révisées ou modifiées de cette licence. Chaque version recevra un numéro unique. Si un logiciel est déjà soumis aux termes d'une version spécifique, c'est seulement cette version qui liera les parties à la licence. + +Le concédant peut aussi choisir de concéder la licence sous la version actuelle ou toute version ultérieure, auquel cas le licencié peut choisir sous quelle version la licence lui est accordée. + +11. Divers +Dans la mesure où le concédant est un ministère, un organisme public ou une personne morale de droit public, créés en vertu d'une loi de l'Assemblée nationale du Québec, la licence est régie par le droit applicable au Québec et en cas de contestation, les tribunaux du Québec seront seuls compétents. + +La présente licence peut être distribuée sans conditions particulières. Toutefois, une version modifiée doit être distribuée sous un nom différent. Toute référence au Centre de services partagés du Québec, et, le cas échéant, ses ayant cause, doit être retirée, autre que celle permettant d'identifier la provenance de la licence. diff --git a/options/license/Libpng b/options/license/Libpng new file mode 100644 index 0000000..1636402 --- /dev/null +++ b/options/license/Libpng @@ -0,0 +1,76 @@ +This copy of the libpng notices is provided for your convenience. In case of any discrepancy between this copy and the notices in the file png.h that is included in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately following this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.4.5, December 9, 2010, are Copyright (c) 2004, 2006-2010 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-1.2.5 with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-1.0.6 with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the library or against infringement. There is no warranty that our efforts or the library will fulfill any of your particular purposes or needs. This library is provided with all faults, and the entire risk of satisfactory quality, performance, accuracy, and effort is with the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-0.96, with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Digger +Distributed according to the same disclaimer and license as libpng-0.88, with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors and Group 42, Inc. disclaim all warranties, expressed or implied, including, without limitation, the warranties of merchantability and of fitness for any purpose. The Contributing Authors and Group 42, Inc. assume no liability for direct, indirect, incidental, special, exemplary, or consequential damages, which may result from the use of the PNG Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this source code, or portions hereof, for any purpose, without fee, subject to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without fee, and encourage the use of this source code as a component to supporting the PNG file format in commercial products. If you use this source code in a product, acknowledgment is not required but would be appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +December 9, 2010 \ No newline at end of file diff --git a/options/license/MIT License b/options/license/MIT similarity index 98% rename from options/license/MIT License rename to options/license/MIT index 472ac23..3f28a5f 100644 --- a/options/license/MIT License +++ b/options/license/MIT @@ -1,8 +1,9 @@ MIT License + Copyright (c) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/options/license/MIT-CMU b/options/license/MIT-CMU new file mode 100644 index 0000000..c32911e --- /dev/null +++ b/options/license/MIT-CMU @@ -0,0 +1,9 @@ +Copyright 1989, 1991, 1992 by Carnegie Mellon University + +Derivative Work - 1996, 1998-2000 Copyright 1996, 1998-2000 The Regents of the University of California + +All Rights Reserved + +Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appears in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of CMU and The Regents of the University of California not be used in advertising or publicity pertaining to distribution of the software without specific written permission. + +CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CMU OR THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM THE LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/options/license/MIT-advertising b/options/license/MIT-advertising new file mode 100644 index 0000000..e1d908d --- /dev/null +++ b/options/license/MIT-advertising @@ -0,0 +1,7 @@ +Copyright (C) 2000-2008 Carsten Haitzler, Geoff Harrison and various contributors Copyright (C) 2004-2008 Kim Woelders + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies of the Software, its documentation and marketing & publicity materials, and acknowledgment shall be given in the documentation, materials and software packages that this Software was used. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/options/license/MIT-enna b/options/license/MIT-enna new file mode 100644 index 0000000..0cf0d92 --- /dev/null +++ b/options/license/MIT-enna @@ -0,0 +1,9 @@ +Copyright (C) 2000 Carsten Haitzler and various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies of the Software and its Copyright notices. In addition publicly documented acknowledgment must be given that this software has been used if no source code of this software is made available publicly. This includes acknowledgments in either Copyright notices, Manuals, Publicity and Marketing documents or any documentation provided with any product containing this software. This License does not apply to any software that links to the libraries provided by this software (statically or dynamically), but only to the software provided. + +Please see the COPYING.PLAIN for a plain-english explanation of this notice and it's intent. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/options/license/MIT-feh b/options/license/MIT-feh new file mode 100644 index 0000000..f761334 --- /dev/null +++ b/options/license/MIT-feh @@ -0,0 +1,5 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies of the Software and its documentation and acknowledgment shall be given in the documentation and software packages that this Software was used. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/options/license/MITNFA b/options/license/MITNFA new file mode 100644 index 0000000..535427b --- /dev/null +++ b/options/license/MITNFA @@ -0,0 +1,7 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +Distributions of all or part of the Software intended to be used by the recipients as they would use the unmodified Software, containing modifications that substantially alter, remove, or disable functionality of the Software, outside of the documented configuration mechanisms provided by the Software, shall be modified such that the Original Author's bug reporting email addresses and urls are either replaced with the contact information of the parties responsible for the changes, or removed entirely. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/options/license/MPL-1.0 b/options/license/MPL-1.0 new file mode 100644 index 0000000..6047b95 --- /dev/null +++ b/options/license/MPL-1.0 @@ -0,0 +1,123 @@ +MOZILLA PUBLIC LICENSE +Version 1.0 + +1. Definitions. + + 1.1. ``Contributor'' means each entity that creates or contributes to the creation of Modifications. + + 1.2. ``Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. ``Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4. ``Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. ``Executable'' means Covered Code in any form other than Source Code. + + 1.6. ``Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. ``Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. ``License'' means this document. + + 1.9. ``Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. ``Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.11. ``Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. ``You'' means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, ``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, ``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. +The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``Utilize'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + + 2.2. Contributor Grant. +Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + + (a) Third Party Claims. + If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled ``LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. +This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation (``Netscape'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. + + 6.3. Derivative Works. + If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY. +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. +This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +9. LIMITATION OF LIABILITY. +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. +The Covered Code is a ``commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and ``commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS. +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the United States of America: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Santa Clara County, California, under the auspices of JAMS/EndDispute; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS. +Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. + +EXHIBIT A. + +``The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code is ______________________________________. + +The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. + +Contributor(s): ______________________________________.'' \ No newline at end of file diff --git a/options/license/MPL-1.1 b/options/license/MPL-1.1 new file mode 100644 index 0000000..e1c8428 --- /dev/null +++ b/options/license/MPL-1.1 @@ -0,0 +1,143 @@ +Mozilla Public License Version 1.1 + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: +Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. +Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + a. under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + b. under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + c. the licenses granted in this Section 2.1 (a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + d. Notwithstanding Section 2.1 (b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + a. under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + b. under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + c. the licenses granted in Sections 2.2 (a) and 2.2 (b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + d. Notwithstanding Section 2.2 (b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + + (a) Third Party Claims + If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs + If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4 (a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Sections 3.1, 3.2, 3.3, 3.4 and 3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions + Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. + + 6.3. Derivative Works + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. Termination + + 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: + + a. such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + b. any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. government end users +The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. Miscellaneous +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. Responsibility for claims +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +13. Multiple-licensed code +Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the MPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +Exhibit A - Mozilla Public License. + +"The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code is ______________________________________. + +The Initial Developer of the Original Code is ________________________. +Portions created by ______________________ are Copyright (C) ______ +_______________________. All Rights Reserved. + +Contributor(s): ______________________________________. + +Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." + +NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications. diff --git a/options/license/MPL-2.0 b/options/license/MPL-2.0 new file mode 100644 index 0000000..c42155d --- /dev/null +++ b/options/license/MPL-2.0 @@ -0,0 +1,144 @@ +Mozilla Public License Version 2.0 + +1. Definitions + + 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. + + 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. + + 1.3. "Contribution" means Covered Software of a particular Contributor. + + 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. + + 1.5. "Incompatible With Secondary Licenses" means + + (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. + + 1.6. "Executable Form" means any form of the work other than Source Code Form. + + 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. + + 1.8. "License" means this document. + + 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. + + 1.10. "Modifications" means any of the following: + + (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or + + (b) any new file in Source Code Form that contains any Covered Software. + + 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. + + 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. + + 1.13. "Source Code Form" means the form of the work preferred for making modifications. + + 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants and Conditions + + 2.1. Grants + Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and + + (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. + + 2.2. Effective Date + The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. + + 2.3. Limitations on Grant Scope + The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: + + (a) for any code that a Contributor has removed from Covered Software; or + + (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or + + (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. + + This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). + + 2.4. Subsequent Licenses + No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). + + 2.5. Representation + Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. + + 2.6. Fair Use + This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. + + 2.7. Conditions + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. + +3. Responsibilities + + 3.1. Distribution of Source Form + All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. + + 3.2. Distribution of Executable Form + If You distribute Covered Software in Executable Form then: + + (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and + + (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. + + 3.3. Distribution of a Larger Work + You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). + + 3.4. Notices + You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. + + 3.5. Application of Additional Terms + You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Termination + + 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. + + 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. + + 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. + +6. Disclaimer of Warranty +Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. + +7. Limitation of Liability +Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation +Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. + +9. Miscellaneous +This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. + +10. Versions of the License + + 10.1. New Versions + Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. + + 10.2. Effect of New Versions + You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. + + 10.3. Modified Versions + If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). + + 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. \ No newline at end of file diff --git a/options/license/MPL-2.0-no-copyleft-exception b/options/license/MPL-2.0-no-copyleft-exception new file mode 100644 index 0000000..c42155d --- /dev/null +++ b/options/license/MPL-2.0-no-copyleft-exception @@ -0,0 +1,144 @@ +Mozilla Public License Version 2.0 + +1. Definitions + + 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. + + 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. + + 1.3. "Contribution" means Covered Software of a particular Contributor. + + 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. + + 1.5. "Incompatible With Secondary Licenses" means + + (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. + + 1.6. "Executable Form" means any form of the work other than Source Code Form. + + 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. + + 1.8. "License" means this document. + + 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. + + 1.10. "Modifications" means any of the following: + + (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or + + (b) any new file in Source Code Form that contains any Covered Software. + + 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. + + 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. + + 1.13. "Source Code Form" means the form of the work preferred for making modifications. + + 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants and Conditions + + 2.1. Grants + Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: + + (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and + + (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. + + 2.2. Effective Date + The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. + + 2.3. Limitations on Grant Scope + The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: + + (a) for any code that a Contributor has removed from Covered Software; or + + (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or + + (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. + + This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). + + 2.4. Subsequent Licenses + No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). + + 2.5. Representation + Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. + + 2.6. Fair Use + This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. + + 2.7. Conditions + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. + +3. Responsibilities + + 3.1. Distribution of Source Form + All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. + + 3.2. Distribution of Executable Form + If You distribute Covered Software in Executable Form then: + + (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and + + (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. + + 3.3. Distribution of a Larger Work + You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). + + 3.4. Notices + You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. + + 3.5. Application of Additional Terms + You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Termination + + 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. + + 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. + + 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. + +6. Disclaimer of Warranty +Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. + +7. Limitation of Liability +Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation +Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. + +9. Miscellaneous +This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. + +10. Versions of the License + + 10.1. New Versions + Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. + + 10.2. Effect of New Versions + You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. + + 10.3. Modified Versions + If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). + + 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. \ No newline at end of file diff --git a/options/license/MS-PL b/options/license/MS-PL new file mode 100644 index 0000000..b44a385 --- /dev/null +++ b/options/license/MS-PL @@ -0,0 +1,22 @@ +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. A "contribution" is the original software, or any additions or changes to the software. A "contributor" is any person that distributes its contribution under this license. "Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + + (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + (A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + + (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + + (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + + (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + + (E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. \ No newline at end of file diff --git a/options/license/MS-RL b/options/license/MS-RL new file mode 100644 index 0000000..6a65aa7 --- /dev/null +++ b/options/license/MS-RL @@ -0,0 +1,30 @@ +Microsoft Reciprocal License (Ms-RL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + +A "contribution" is the original software, or any additions or changes to the software. + +A "contributor" is any person that distributes its contribution under this license. + +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + + (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + (A) Reciprocal Grants- For any file you distribute that contains code from the software (in source code or binary format), you must provide recipients the source code to that file along with a copy of this license, which license will govern that file. You may license other files that are entirely your own work and do not contain code from the software under any terms you choose. + + (B) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + + (C) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + + (D) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + + (E) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + + (F) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. \ No newline at end of file diff --git a/options/license/MTLL b/options/license/MTLL new file mode 100644 index 0000000..00498c9 --- /dev/null +++ b/options/license/MTLL @@ -0,0 +1,24 @@ +Software License for MTL + +Copyright (c) 2007 The Trustees of Indiana University. + 2008 Dresden University of Technology and the Trustees of Indiana University. + 2010 SimuNova UG (haftungsbeschränkt), www.simunova.com. +All rights reserved. +Authors: Peter Gottschling and Andrew Lumsdaine + +This file is part of the Matrix Template Library + +Dresden University of Technology -- short TUD -- and Indiana University -- short IU -- have the exclusive rights to license this product under the following license. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + 1. All redistributions of source code must retain the above copyright notice, the list of authors in the original source code, this list of conditions and the disclaimer listed in this license; + 2. All redistributions in binary form must reproduce the above copyright notice, this list of conditions and the disclaimer listed in this license in the documentation and/or other materials provided with the distribution; + 3. Any documentation included with all redistributions must include the following acknowledgement: + "This product includes software developed at the University of Notre Dame, the Pervasive Technology Labs at Indiana University, and Dresden University of Technology. For technical information contact Andrew Lumsdaine at the Pervasive Technology Labs at Indiana University. For administrative and license questions contact the Advanced Research and Technology Institute at 1100 Waterway Blvd. Indianapolis, Indiana 46202, phone 317-274-5905, fax 317-274-5902." + Alternatively, this acknowledgement may appear in the software itself, and wherever such third-party acknowledgments normally appear. + 4. The name "MTL" shall not be used to endorse or promote products derived from this software without prior written permission from IU or TUD. For written permission, please contact Indiana University Advanced Research & Technology Institute. + 5. Products derived from this software may not be called "MTL", nor may "MTL" appear in their name, without prior written permission of Indiana University Advanced Research & Technology Institute. + +TUD and IU provide no reassurances that the source code provided does not infringe the patent or any other intellectual property rights of any other entity. TUD and IU disclaim any liability to any recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. + +LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. DRESDEN UNIVERSITY OF TECHNOLOGY AND INDIANA UNIVERSITY GIVE NO WARRANTIES AND MAKE NO REPRESENTATION THAT SOFTWARE IS FREE OF INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. DRESDEN UNIVERSITY OF TECHNOLOGY AND INDIANA UNIVERSITY MAKE NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", "VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE. LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION GENERATED USING SOFTWARE. \ No newline at end of file diff --git a/options/license/MakeIndex b/options/license/MakeIndex new file mode 100644 index 0000000..c345384 --- /dev/null +++ b/options/license/MakeIndex @@ -0,0 +1,19 @@ +MakeIndex Distribution Notice + +11/11/1989 + +Copyright (C) 1989 by Chen & Harrison International Systems, Inc. +Copyright (C) 1988 by Olivetti Research Center +Copyright (C) 1987 by Regents of the University of California + +Author: + Pehong Chen (phc@renoir.berkeley.edu) + Chen & Harrison International Systems, Inc. + Palo Alto, California + USA + +Permission is hereby granted to make and distribute original copies of this program provided that the copyright notice and this permission notice are preserved and provided that the recipient is not asked to waive or limit his right to redistribute copies as allowed by this permission notice and provided that anyone who receives an executable form of this program is granted access to a machine-readable form of the source code for this program at a cost not greater than reasonable reproduction, shipping, and handling costs. Executable forms of this program distributed without the source code must be accompanied by a conspicuous copy of this permission notice and a statement that tells the recipient how to obtain the source code. + +Permission is granted to distribute modified versions of all or part of this program under the conditions above with the additional requirement that the entire modified work must be covered by a permission notice identical to this permission notice. Anything distributed with and usable only in conjunction with something derived from this program, whose useful purpose is to extend or adapt or add capabilities to this program, is to be considered a modified version of this program under the requirement above. Ports of this program to other systems not supported in the distribution are also considered modified versions. All modified versions should be reported back to the author. + +This program is distributed with no warranty of any sort. No contributor accepts responsibility for the consequences of using this program or for whether it serves any particular purpose. diff --git a/options/license/MirOS b/options/license/MirOS new file mode 100644 index 0000000..62d0ac5 --- /dev/null +++ b/options/license/MirOS @@ -0,0 +1,28 @@ +MirOS License + +Copyright [YEAR] +[NAME] [EMAIL] + +Provided that these terms and disclaimer and all copyright notices are retained or reproduced in an accompanying document, permission is granted to deal in this work without restriction, including unlimited rights to use, publicly perform, distribute, sell, modify, merge, give away, or sublicence. + +This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to the utmost extent permitted by applicable law, neither express nor implied; without malicious intent or gross negligence. In no event may a licensor, author or contributor be held liable for indirect, direct, other damage, loss, or other issues arising in any way out of dealing in the work, even if advised of the possibility of such damage or existence of a defect, except proven that it results out of said person's immediate fault when using the work as intended. + +I_N_S_T_R_U_C_T_I_O_N_S_:_ +To apply the template(1) specify the years of copyright (separated by comma, not as a range), the legal names of the copyright holders, and the real names of the authors if different. Avoid adding text. + +R_A_T_I_O_N_A_L_E_:_ +This licence is apt for any kind of work (such as source code, fonts, documentation, graphics, sound etc.) and the preferred terms for work added to MirBSD. It has been drafted as universally usable equivalent of the "historic permission notice"(2) adapted to Europen law because in some (droit d'auteur) countries authors cannot disclaim all liabi‐ lities. Compliance to DFSG(3) 1.1 is ensured, and GPLv2 compatibility is asserted unless advertising clauses are used. The MirOS Licence is certified to conform to OKD(4) 1.0 and OSD(5) 1.9, and qualifies as a Free Software(6) and also Free Documentation(7) licence and is included in some relevant lists(8)(9)(10). + +We believe you are not liable for work inserted which is intellectual property of third parties, if you were not aware of the fact, act appropriately as soon as you become aware of that problem, seek an amicable solution for all parties, and never knowingly distribute a work without being authorised to do so by its licensors. + +R_E_F_E_R_E_N_C_E_S_:_ +(1) also at http://mirbsd.de/MirOS-Licence +(2) http://www.opensource.org/licenses/historical.php +(3) http://www.debian.org/social_contract#guidelines +(4) http://www.opendefinition.org/1.0 +(5) http://www.opensource.org/docs/osd +(6) http://www.gnu.org/philosophy/free-sw.html +(7) http://www.gnu.org/philosophy/free-doc.html +(8) http://www.ifross.de/ifross_html/lizenzcenter.html +(9) http://www.opendefinition.org/licenses +(10) http://opensource.org/licenses/miros.html \ No newline at end of file diff --git a/options/license/Motosoto b/options/license/Motosoto new file mode 100644 index 0000000..204957b --- /dev/null +++ b/options/license/Motosoto @@ -0,0 +1,110 @@ +MOTOSOTO OPEN SOURCE LICENSE - Version 0.9.1 + +This Motosoto Open Source License (the "License") applies to "Community Portal Server" and related software products as well as any updatesor maintenance releases of that software ("Motosoto Products") that are distributed by Motosoto.Com B.V. ("Licensor"). Any Motosoto Product licensed pursuant to this License is a "Licensed Product." Licensed Product, in its entirety, is protected by Dutch copyright law. This License identifies the terms under which you may use, copy, distribute or modify Licensed Product and has been submitted to the Open Software Initiative (OSI) for approval. + +Preamble + +This Preamble is intended to describe, in plain English, the nature and scope of this License. However, this Preamble is not a part of this license. The legal effect of this License is dependent only upon the terms of the License and not this Preamble. This License complies with the Open Source Definition and has been approved by Open Source Initiative. Software distributed under this License may be marked as "OSI Certified Open Source Software." + +This License provides that: + +1. You may use, sell or give away the Licensed Product, alone or as a component of an aggregate software distribution containing programs from several different sources. No royalty or other fee is required. + +2. Both Source Code and executable versions of the Licensed Product, including Modifications made by previous Contributors, are available for your use. (The terms "Licensed Product," "Modifications," "Contributors" and "Source Code" are defined in the License.) + +3. You are allowed to make Modifications to the Licensed Product, and you can create Derivative Works from it. (The term "Derivative Works" is defined in the License.) + +4. By accepting the Licensed Product under the provisions of this License, you agree that any Modifications you make to the Licensed Product and then distribute are governed by the provisions of this License. In particular, you must make the Source Code of your Modifications available to others. + +5. You may use the Licensed Product for any purpose, but the Licensor is not providing you any warranty whatsoever, nor is the Licensor accepting any liability in the event that the Licensed Product doesn't work properly or causes you any injury or damages. + +6. If you sublicense the Licensed Product or Derivative Works, you may charge fees for warranty or support, or for accepting indemnity or liability obligations to your customers. You cannot charge for the Source Code. + +7. If you assert any patent claims against the Licensor relating to the Licensed Product, or if you breach any terms of the License, your rights to the Licensed Product under this License automatically terminate. + +You may use this License to distribute your own Derivative Works, in which case the provisions of this License will apply to your Derivative Works just as they do to the original Licensed Product. + +Alternatively, you may distribute your Derivative Works under any other OSI-approved Open Source license, or under a proprietary license of your choice. If you use any license other than this License, however, you must continue to fulfill the requirements of this License (including the provisions relating to publishing the Source Code) for those portions of your Derivative Works that consist of the Licensed Product, including the files containing Modifications. + +New versions of this License may be published from time to time. You may choose to continue to use the license terms in this version of the License or those from the new version. However, only the Licensor has the right to change the License terms as they apply to the Licensed Product. This License relies on precise definitions for certain terms. Those terms are defined when they are first used, and the definitions are repeated for your convenience in a Glossary at the end of the License. + +License Terms + +1. Grant of License From Licensor. + +Licensor hereby grants you a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, to do the following: + + a. Use, reproduce, modify, display, perform, sublicense and distribute Licensed Product or portions thereof (including Modifications as hereinafter defined), in both Source Code or as an executable program. "Source Code" means the preferred form for making modifications to the Licensed Product, including all modules contained therein, plus any associated interface definition files, scripts used to control compilation and installation of an executable program, or a list of differential comparisons against the Source Code of the Licensed Product. + + b. Create Derivative Works (as that term is defined under Dutch copyright law) of Licensed Product by adding to or deleting from the substance or structure of said Licensed Product. + + c. Under claims of patents now or hereafter owned or controlled by Licensor, to make, use, sell, offer for sale, have made, and/or otherwise dispose of Licensed Product or portions thereof, but solely to the extent that any such claim is necessary to enable you to make, use, sell, offer for sale, have made, and/or otherwise dispose of Licensed Product or portions thereof or Derivative Works thereof. + +2. Grant of License to Modifications From Contributor. + +"Modifications" means any additions to or deletions from the substance or structure of (i) a file containing Licensed Product, or (ii) any new file that contains any part of Licensed Product. Hereinafter in this License, the term "Licensed Product" shall include all previous Modifications that you receive from any Contributor. By application of the provisions in Section 4(a) below, each person or entity who created or contributed to the creation of, and distributed, a Modification (a "Contributor") hereby grants you a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims, to do the following: + + a. Use, reproduce, modify, display, perform, sublicense and distribute any Modifications created by such Contributor or portions thereof, in both Source Code or as an executable program, either on an unmodified basis or as part of Derivative Works. + + b. Under claims of patents now or hereafter owned or controlled by Contributor, to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof, but solely to the extent that any such claim is necessary to enable you to make, use, sell, offer for sale, have made, and/or otherwise dispose of Modifications or portions thereof or Derivative Works thereof. + +3. Exclusions From License Grant. + +Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor or any Contributor except as expressly stated herein. No patent license is granted separate from the Licensed Product, for code that you delete from the Licensed Product, or for combinations of the Licensed Product with other software or hardware. No right is granted to the trademarks of Licensor or any Contributor even if such marks are included in the Licensed Product. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any code that Licensor otherwise would have a right to license. + +4. Your Obligations Regarding Distribution. + + a. Application of This License to Your Modifications. As an express condition for your use of the Licensed Product, you hereby agree that any Modifications that you create or to which you contribute, and which you distribute, are governed by the terms of this License including, without limitation, Section 2. Any Modifications that you create or to which you contribute may be distributed only under the terms of this License or a future version of this License released under Section 7. You must include a copy of this License with every copy of the Modifications you distribute. You agree not to offer or impose any terms on any Source Code or executable version of the Licensed Product or Modifications that alter or restrict the applicable version of this License or the recipients' rights hereunder. However, you may include an additional document offering the additional rights described in Section 4(e). + + b. Availability of Source Code. You must make available, under the terms of this License, the Source Code of the Licensed Product and any Modifications that you distribute, either on the same media as you distribute any executable or other form of the Licensed Product, or via a mechanism generally accepted in the software development community for the electronic transfer of data (an "Electronic Distribution Mechanism"). The Source Code for any version of Licensed Product or Modifications that you distribute must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of said Licensed Product or Modifications has been made available. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + c. Description of Modifications. You must cause any Modifications that you create or to which you contribute, and which you distribute, to contain a file documenting the additions, changes or deletions you made to create or contribute to those Modifications, and the dates of any such additions, changes or deletions. You must include a prominent statement that the Modifications are derived, directly or indirectly, from the Licensed Product and include the names of the Licensor and any Contributor to the Licensed Product in (i) the Source Code and (ii) in any notice displayed by a version of the Licensed Product you distribute or in related documentation in which you describe the origin or ownership of the Licensed Product. You may not modify or delete any preexisting copyright notices in the Licensed Product. + + d. Intellectual Property Matters. + i. Third Party Claims. If you have knowledge that a license to a third party's intellectual property right is required to exercise the rights granted by this License, you must include a text file with the Source Code distribution titled "LEGAL" that describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after you make any Modifications available as described in Section 4(b), you shall promptly modify the LEGAL file in all copies you make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Licensed Product from you that new knowledge has been obtained. + + ii. Contributor APIs. If your Modifications include an application programming interface ("API") and you have knowledge of patent licenses that are reasonably necessary to implement that API, you must also include this information in the LEGAL file. + + iii. Representations. You represent that, except as disclosed pursuant to 4(d)(i) above, you believe that any Modifications you distribute are your original creations and that you have sufficient rights to grant the rights conveyed by this License. + + e. Required Notices. You must duplicate this License in any documentation you provide along with the Source Code of any Modifications you create or to which you contribute, and which you distribute, wherever you describe recipients' rights relating to Licensed Product. You must duplicate the notice contained in Exhibit A (the "Notice") in each file of the Source Code of any copy you distribute of the Licensed Product. If you created a Modification, you may add your name as a Contributor to the Notice. If it is not possible to put the Notice in a particular Source Code file due to its structure, then you must include such Notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Licensed Product. However, you may do so only on your own behalf, and not on behalf of the Licensor or any Contributor. You must make it clear that any such warranty, support, indemnity or liability obligation is offered by you alone, and you hereby agree to indemnify the Licensor and every Contributor for any liability incurred by the Licensor or such Contributor as a result of warranty, support, indemnity or liability terms you offer. + + f. Distribution of Executable Versions. You may distribute Licensed Product as an executable program under a license of your choice that may contain terms different from this License provided (i) you have satisfied the requirements of Sections 4(a) through 4(e) for that distribution, (ii) you include a conspicuous notice in the executable version, related documentation and collateral materials stating that the Source Code version of the Licensed Product is available under the terms of this License, including a description of how and where you have fulfilled the obligations of Section 4(b), (iii) you retain all existing copyright notices in the Licensed Product, and (iv) you make it clear that any terms that differ from this License are offered by you alone, not by Licensor or any Contributor. You hereby agree to indemnify the Licensor and every Contributor for any liability incurred by Licensor or such Contributor as a result of any terms you offer. + + g. Distribution of Derivative Works. You may create Derivative Works (e.g., combinations of some or all of the Licensed Product with other code) and distribute the Derivative Works as products under any other license you select, with the proviso that the requirements of this License are fulfilled for those portions of the Derivative Works that consist of the Licensed Product or any Modifications thereto. + +5. Inability to Comply Due to Statute or Regulation. + +If it is impossible for you to comply with any of the terms of this License with respect to some or all of the Licensed Product due to statute, judicial order, or regulation, then you must (i) comply with the terms of this License to the maximum extent possible, (ii) cite the statute or regulation that prohibits you from adhering to the License, and (iii) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 4(d), and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill at computer programming to be able to understand it. + +6. Application of This License. + +This License applies to code to which Licensor or Contributor has attached the Notice in Exhibit A, which is incorporated herein by this reference. + +7. Versions of This License. + + a. Version. The Motosoto Open Source License is derived from the Jabber Open Source License. All changes are related to applicable law and the location of court. + + b. New Versions. Licensor may publish from time to time revised and/or new versions of the License. + + c. Effect of New Versions. Once Licensed Product has been published under a particular version of the License, you may always continue to use it under the terms of that version. You may also choose to use such Licensed Product under the terms of any subsequent version of the License published by Licensor. No one other than Lic ensor has the right to modify the terms applicable to Licensed Product created under this License. + + d. Derivative Works of this License. If you create or use a modified version of this License, which you may do only in order to apply it to software that is not already a Licensed Product under this License, you must rename your license so that it is not confusingly similar to this License, and must make it clear that your license contains terms that differ from this License. In so naming your license, you may not use any trademark of Licensor or any Contributor. + +8. Disclaimer of Warranty. + +LICENSED PRODUCT IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE LICENSED PRODUCT IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LICENSED PRODUCT IS WITH YOU. SHOULD LICENSED PRODUCT PROVE DEFECTIVE IN ANY RESPECT, YOU (AND NOT THE LICENSOR OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF LICENSED PRODUCT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +9. Termination. + + a. Automatic Termination Upon Breach. This license and the rights granted hereunder will terminate automatically if you fail to comply with the terms herein and fail to cure such breach within thirty (30) days of becoming aware of the breach. All sublicenses to the Licensed Product that are properly granted shall survive any termination of this license. Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive. + + b. Termination Upon Assertion of Patent Infringement. If you initiate litigation by asserting a patent infringement claim (excluding declaratory judgment actions) against Licensor or a Contributor (Licensor or Contributor against whom you file such an action is referred to herein as "Respondent") alleging that Licensed Product directly or indirectly infringes any patent, then any and all rights granted by such Respondent to you under Sections 1 or 2 of this License shall terminate prospectively upon sixty (60) days notice from Respondent (the "Notice Period") unless within that Notice Period you either agree in writing (i) to pay Respondent a mutually agreeable reasonably royalty for your past or future use of Licensed Product made by such Respondent, or (ii) withdraw your litigation claim with respect to Licensed Product against such Respondent. If within said Notice Period a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Licensor to you under Sections 1 and 2 automatically terminate at the expiration of said Notice Period. + + c. Reasonable Value of This License. If you assert a patent infringement claim against Respondent alleging that Licensed Product directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by said Respondent under Sections 1 and 2 shall be taken into account in determining the amount or value of any payment or license. + + d. No Retroactive Effect of Termination. In the event of termination under Sections 9(a) or 9(b) above, all end user license agreements (excluding licenses to distributors and reselle rs) that have been validly granted by you or any distributor hereunder prior to termination shall survive termination. + +10. Limitation of Liability. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE LICENSOR, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF LICENSED PRODUCT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY \ No newline at end of file diff --git a/options/license/Mozilla Public License 1.0 b/options/license/Mozilla Public License 1.0 deleted file mode 100644 index 731f43c..0000000 --- a/options/license/Mozilla Public License 1.0 +++ /dev/null @@ -1,122 +0,0 @@ -MOZILLA PUBLIC LICENSE -Version 1.0 -1. Definitions. - -1.1. ``Contributor'' means each entity that creates or contributes to the creation of Modifications. - -1.2. ``Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. - -1.3. ``Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. - -1.4. ``Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data. - -1.5. ``Executable'' means Covered Code in any form other than Source Code. - -1.6. ``Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. - -1.7. ``Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. - -1.8. ``License'' means this document. - -1.9. ``Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: - -A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. - -B. Any new file that contains any part of the Original Code or previous Modifications. - -1.10. ``Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. - -1.11. ``Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. - -1.12. ``You'' means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, ``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, ``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. - -2. Source Code License. - -2.1. The Initial Developer Grant. -The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: - -(a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and - -(b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``Utilize'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. - -2.2. Contributor Grant. -Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: - -(a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and - -(b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. - -3. Distribution Obligations. - -3.1. Application of License. -The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. - -3.2. Availability of Source Code. -Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. - -3.3. Description of Modifications. -You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. - -3.4. Intellectual Property Matters - -(a) Third Party Claims. -If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled ``LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. - -(b) Contributor APIs. -If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. - -3.5. Required Notices. -You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. - -3.6. Distribution of Executable Versions. -You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. - -3.7. Larger Works. -You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. - -4. Inability to Comply Due to Statute or Regulation. -If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. - -5. Application of this License. -This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. - -6. Versions of the License. - -6.1. New Versions. -Netscape Communications Corporation (``Netscape'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. - -6.2. Effect of New Versions. -Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. - -6.3. Derivative Works. -If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) - -7. DISCLAIMER OF WARRANTY. -COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -8. TERMINATION. -This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. - -9. LIMITATION OF LIABILITY. -UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -10. U.S. GOVERNMENT END USERS. -The Covered Code is a ``commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and ``commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. - -11. MISCELLANEOUS. -This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the United States of America: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Santa Clara County, California, under the auspices of JAMS/EndDispute; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. - -12. RESPONSIBILITY FOR CLAIMS. -Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. - -EXHIBIT A. - -``The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ - -Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. - -The Original Code is ______________________________________. - -The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. - -Contributor(s): ______________________________________.'' diff --git a/options/license/Mozilla Public License 2.0 b/options/license/Mozilla Public License 2.0 deleted file mode 100644 index e57837d..0000000 --- a/options/license/Mozilla Public License 2.0 +++ /dev/null @@ -1,143 +0,0 @@ -Mozilla Public License Version 2.0 -1. Definitions - -1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. - -1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" means Covered Software of a particular Contributor. - -1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. - -1.5. "Incompatible With Secondary Licenses" means - -(a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or - -(b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. - -1.6. "Executable Form" means any form of the work other than Source Code Form. - -1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. - -1.8. "License" means this document. - -1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. - -1.10. "Modifications" means any of the following: - -(a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or - -(b) any new file in Source Code Form that contains any Covered Software. - -1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. - -1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. - -1.13. "Source Code Form" means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. - -2. License Grants and Conditions - -2.1. Grants -Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. - -2.2. Effective Date -The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. - -2.3. Limitations on Grant Scope -The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: - -(a) for any code that a Contributor has removed from Covered Software; or - -(b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of its Contributions. - -This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). - -2.4. Subsequent Licenses -No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). - -2.5. Representation -Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use -This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. - -2.7. Conditions -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. - -3. Responsibilities - -3.1. Distribution of Source Form -All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. - -3.2. Distribution of Executable Form -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work -You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). - -3.4. Notices -You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms -You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. - -4. Inability to Comply Due to Statute or Regulation -If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. - -6. Disclaimer of Warranty -Covered Software is provided under this License on an "as is" basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. - -7. Limitation of Liability -Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. - -8. Litigation -Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. - -9. Miscellaneous -This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. - -10. Versions of the License - -10.1. New Versions -Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. - -10.2. Effect of New Versions -You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. - -10.3. Modified Versions -If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses -If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice - -This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice - -This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. diff --git a/options/license/Multics b/options/license/Multics new file mode 100644 index 0000000..60c1cd3 --- /dev/null +++ b/options/license/Multics @@ -0,0 +1,13 @@ +Multics License + +Historical Background + +This edition of the Multics software materials and documentation is provided and donated to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. as a contribution to computer science knowledge. This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL and BULL HN Information Systems Inc. to the development of this operating system. Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture for managing computer hardware properly and for executing programs. Many subsequent operating systems incorporated Multics principles. Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . + +----------------------------------------------------------- + +Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without fee is hereby granted,provided that the below copyright notice and historical background appear in all copies and that both the copyright notice and historical background and this permission notice appear in supporting documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining to distribution of the programs without specific prior written permission. + +Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. +Copyright 2006 by BULL HN Information Systems Inc. +Copyright 2006 by Bull SAS All Rights Reserved \ No newline at end of file diff --git a/options/license/Mup b/options/license/Mup new file mode 100644 index 0000000..c2e6bc9 --- /dev/null +++ b/options/license/Mup @@ -0,0 +1,13 @@ +Copyright (c) 1995-2012 by Arkkra Enterprises. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following DISCLAIMER. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following DISCLAIMER in the documentation and/or other materials provided with the distribution. + +3. Any additions, deletions, or changes to the original files must be clearly indicated in accompanying documentation. including the reasons for the changes, and the names of those who made the modifications. + +DISCLAIMER + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/NASA-1.3 b/options/license/NASA-1.3 new file mode 100644 index 0000000..2dc1ad6 --- /dev/null +++ b/options/license/NASA-1.3 @@ -0,0 +1,85 @@ +NASA OPEN SOURCE AGREEMENT VERSION 1.3 + +THIS OPEN SOURCE AGREEMENT ("AGREEMENT") DEFINES THE RIGHTS OF USE, REPRODUCTION, DISTRIBUTION, MODIFICATION AND REDISTRIBUTION OF CERTAIN COMPUTER SOFTWARE ORIGINALLY RELEASED BY THE UNITED STATES GOVERNMENT AS REPRESENTED BY THE GOVERNMENT AGENCY LISTED BELOW ("GOVERNMENT AGENCY"). THE UNITED STATES GOVERNMENT, AS REPRESENTED BY GOVERNMENT AGENCY, IS AN INTENDED THIRD-PARTY BENEFICIARY OF ALL SUBSEQUENT DISTRIBUTIONS OR REDISTRIBUTIONS OF THE SUBJECT SOFTWARE. ANYONE WHO USES, REPRODUCES, DISTRIBUTES, MODIFIES OR REDISTRIBUTES THE SUBJECT SOFTWARE, AS DEFINED HEREIN, OR ANY PART THEREOF, IS, BY THAT ACTION, ACCEPTING IN FULL THE RESPONSIBILITIES AND OBLIGATIONS CONTAINED IN THIS AGREEMENT. + +Government Agency: _____ Government Agency Original Software Designation: __ Government Agency Original Software Title: _____ User Registration Requested. Please Visit http://___ Government Agency Point of Contact for Original Software: _____ + +DEFINITIONS + +A. "Contributor" means Government Agency, as the developer of the Original Software, and any entity that makes a Modification. B. "Covered Patents" mean patent claims licensable by a Contributor that are necessarily infringed by the use or sale of its Modification alone or when combined with the Subject Software. C. "Display" means the showing of a copy of the Subject Software, either directly or by means of an image, or any other device. D. "Distribution" means conveyance or transfer of the Subject Software, regardless of means, to another. E. "Larger Work" means computer software that combines Subject Software, or portions thereof, with software separate from the Subject Software that is not governed by the terms of this Agreement. F. "Modification" means any alteration of, including addition to or deletion from, the substance or structure of either the Original Software or Subject Software, and includes derivative works, as that term is defined in the Copyright Statute, 17 USC 101. However, the act of including Subject Software as part of a Larger Work does not in and of itself constitute a Modification. G. "Original Software" means the computer software first released under this Agreement by Government Agency with Government Agency designation __ and entitled _________, including source code, object code and accompanying documentation, if any. H. "Recipient" means anyone who acquires the Subject Software under this Agreement, including all Contributors. I. "Redistribution" means Distribution of the Subject Software after a Modification has been made. J. "Reproduction" means the making of a counterpart, image or copy of the Subject Software. K. "Sale" means the exchange of the Subject Software for money or equivalent value. L. "Subject Software" means the Original Software, Modifications, or any respective parts thereof. M. "Use" means the application or employment of the Subject Software for any purpose. + +GRANT OF RIGHTS + +A. Under Non-Patent Rights: Subject to the terms and conditions of this Agreement, each Contributor, with respect to its own contribution to the Subject Software, hereby grants to each Recipient a non-exclusive, world-wide, royalty-free license to engage in the following activities pertaining to the Subject Software: + + 1. Use + 2. Distribution + 3. Reproduction + 4. Modification + 5. Redistribution + 6. Display + +B. Under Patent Rights: Subject to the terms and conditions of this Agreement, each Contributor, with respect to its own contribution to the Subject Software, hereby grants to each Recipient under Covered Patents a non-exclusive, world-wide, royalty-free license to engage in the following activities pertaining to the Subject Software: + + 1. Use + 2. Distribution + 3. Reproduction + 4. Sale + 5. Offer for Sale + +C. The rights granted under Paragraph B. also apply to the combination of a Contributor's Modification and the Subject Software if, at the time the Modification is added by the Contributor, the addition of such Modification causes the combination to be covered by the Covered Patents. It does not apply to any other combinations that include a Modification. + +D. The rights granted in Paragraphs A. and B. allow the Recipient to sublicense those same rights. Such sublicense must be under the same terms and conditions of this Agreement. + +OBLIGATIONS OF RECIPIENT + +A. Distribution or Redistribution of the Subject Software must be made under this Agreement except for additions covered under paragraph 3H. + + 1. Whenever a Recipient distributes or redistributes the Subject Software, a copy of this Agreement must be included with each copy of the Subject Software; and + 2. If Recipient distributes or redistributes the Subject Software in any form other than source code, Recipient must also make the source code freely available, and must provide with each copy of the Subject Software information on how to obtain the source code in a reasonable manner on or through a medium customarily used for software exchange. + +B. Each Recipient must ensure that the following copyright notice appears prominently in the Subject Software: + +[Government Agency will insert the applicable copyright notice in each agreement accompanying the initial distribution of original software and remove this bracketed language.] + +[The following copyright notice will be used if created by a contractor pursuant to Government Agency contract and rights obtained from creator by assignment. Government Agency will insert the year and its Agency designation and remove the bracketed language.] Copyright (c) {YEAR} United States Government as represented by ___ ____. All Rights Reserved. + +[The following copyright notice will be used if created by civil servants only. Government Agency will insert the year and its Agency designation and remove the bracketed language.] Copyright (c) {YEAR} United States Government as represented by ____ ____. No copyright is claimed in the United States under Title 17, U.S.Code. All Other Rights Reserved. + +C. Each Contributor must characterize its alteration of the Subject Software as a Modification and must identify itself as the originator of its Modification in a manner that reasonably allows subsequent Recipients to identify the originator of the Modification. In fulfillment of these requirements, Contributor must include a file (e.g., a change log file) that describes the alterations made and the date of the alterations, identifies Contributor as originator of the alterations, and consents to characterization of the alterations as a Modification, for example, by including a statement that the Modification is derived, directly or indirectly, from Original Software provided by Government Agency. Once consent is granted, it may not thereafter be revoked. + +D. A Contributor may add its own copyright notice to the Subject Software. Once a copyright notice has been added to the Subject Software, a Recipient may not remove it without the express permission of the Contributor who added the notice. + +E. A Recipient may not make any representation in the Subject Software or in any promotional, advertising or other material that may be construed as an endorsement by Government Agency or by any prior Recipient of any product or service provided by Recipient, or that may seek to obtain commercial advantage by the fact of Government Agency's or a prior Recipient's participation in this Agreement. + +F. In an effort to track usage and maintain accurate records of the Subject Software, each Recipient, upon receipt of the Subject Software, is requested to register with Government Agency by visiting the following website: ______. Recipient's name and personal information shall be used for statistical purposes only. Once a Recipient makes a Modification available, it is requested that the Recipient inform Government Agency at the web site provided above how to access the Modification. + +[Alternative paragraph for use when a web site for release and monitoring of subject software will not be supported by releasing Government Agency] In an effort to track usage and maintain accurate records of the Subject Software, each Recipient, upon receipt of the Subject Software, is requested to provide Government Agency, by e-mail to the Government Agency Point of Contact listed in clause 5.F., the following information: ______. Recipient's name and personal information shall be used for statistical purposes only. Once a Recipient makes a Modification available, it is requested that the Recipient inform Government Agency, by e-mail to the Government Agency Point of Contact listed in clause 5.F., how to access the Modification. + +G. Each Contributor represents that that its Modification is believed to be Contributor's original creation and does not violate any existing agreements, regulations, statutes or rules, and further that Contributor has sufficient rights to grant the rights conveyed by this Agreement. + +H. A Recipient may choose to offer, and to charge a fee for, warranty, support, indemnity and/or liability obligations to one or more other Recipients of the Subject Software. A Recipient may do so, however, only on its own behalf and not on behalf of Government Agency or any other Recipient. Such a Recipient must make it absolutely clear that any such warranty, support, indemnity and/or liability obligation is offered by that Recipient alone. Further, such Recipient agrees to indemnify Government Agency and every other Recipient for any liability incurred by them as a result of warranty, support, indemnity and/or liability offered by such Recipient. + +I. A Recipient may create a Larger Work by combining Subject Software with separate software not governed by the terms of this agreement and distribute the Larger Work as a single product. In such case, the Recipient must make sure Subject Software, or portions thereof, included in the Larger Work is subject to this Agreement. + +J. Notwithstanding any provisions contained herein, Recipient is hereby put on notice that export of any goods or technical data from the United States may require some form of export license from the U.S. Government. Failure to obtain necessary export licenses may result in criminal liability under U.S. laws. Government Agency neither represents that a license shall not be required nor that, if required, it shall be issued. Nothing granted herein provides any such export license. + +DISCLAIMER OF WARRANTIES AND LIABILITIES; WAIVER AND INDEMNIFICATION + +A. No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES IT "AS IS." + +B. Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. + +GENERAL TERMS + +A. Termination: This Agreement and the rights granted hereunder will terminate automatically if a Recipient fails to comply with these terms and conditions, and fails to cure such noncompliance within thirty (30) days of becoming aware of such noncompliance. Upon termination, a Recipient agrees to immediately cease use and distribution of the Subject Software. All sublicenses to the Subject Software properly granted by the breaching Recipient shall survive any such termination of this Agreement. + +B. Severability: If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement. + +C. Applicable Law: This Agreement shall be subject to United States federal law only for all purposes, including, but not limited to, determining the validity of this Agreement, the meaning of its provisions and the rights, obligations and remedies of the parties. + +D. Entire Understanding: This Agreement constitutes the entire understanding and agreement of the parties relating to release of the Subject Software and may not be superseded, modified or amended except by further written agreement duly executed by the parties. + +E. Binding Authority: By accepting and using the Subject Software under this Agreement, a Recipient affirms its authority to bind the Recipient to all terms and conditions of this Agreement and that that Recipient hereby agrees to all terms and conditions herein. + +F. Point of Contact: Any Recipient contact with Government Agency is to be directed to the designated representative as follows: ___________. \ No newline at end of file diff --git a/options/license/NBPL-1.0 b/options/license/NBPL-1.0 new file mode 100644 index 0000000..699619c --- /dev/null +++ b/options/license/NBPL-1.0 @@ -0,0 +1,59 @@ +The Net Boolean Public License + +Version 1, 22 August 1998 Copyright 1998, Net Boolean Incorporated, Redwood City, California, USA All Rights Reserved. + +Note: This license is derived from the "Artistic License" as distributed with the Perl Programming Language. Its terms are different from those of the "Artistic License." + +PREAMBLE + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. + + b) accompany the distribution with the machine-readable source of the Package with your modifications. + + c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. + +7. C subroutines supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. + +8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End \ No newline at end of file diff --git a/options/license/NCSA b/options/license/NCSA new file mode 100644 index 0000000..875e4dd --- /dev/null +++ b/options/license/NCSA @@ -0,0 +1,15 @@ +University of Illinois/NCSA Open Source License + +Copyright (c) < ;match=.+>>. All rights reserved. + +Developed by: < ;match=.+>> + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal with the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers in the documentation and/or other materials provided with the distribution. + + * Neither the names of <;match=.+>>, nor the names of its contributors may be used to endorse or promote products derived from this Software without specific prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. \ No newline at end of file diff --git a/options/license/NGPL b/options/license/NGPL new file mode 100644 index 0000000..6f6ee54 --- /dev/null +++ b/options/license/NGPL @@ -0,0 +1,39 @@ +NETHACK GENERAL PUBLIC LICENSE + +(Copyright 1989 M. Stephenson) +(Based on the BISON general public license, copyright 1988 Richard M. Stallman) + +Everyone is permitted to copy and distribute verbatim copies of this license, but changing it is not allowed. You can also use this wording to make the terms for other programs. + +The license agreements of most software companies keep you at the mercy of those companies. By contrast, our general public license is intended to give everyone the right to share NetHack. To make sure that you get the rights we want you to have, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. Hence this license agreement. + +Specifically, we want to make sure that you have the right to give away copies of NetHack, that you receive source code or else can get it if you want it, that you can change NetHack or use pieces of it in new free programs, and that you know you can do these things. + +To make sure that everyone has such rights, we have to forbid you to deprive anyone else of these rights. For example, if you distribute copies of NetHack, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. + +Also, for our own protection, we must make certain that everyone finds out that there is no warranty for NetHack. If NetHack is modified by someone else and passed on, we want its recipients to know that what they have is not what we distributed. + +Therefore we (Mike Stephenson and other holders of NetHack copyrights) make the following terms which say what you must do to be allowed to distribute or change NetHack. + +COPYING POLICIES + +You may copy and distribute verbatim copies of NetHack source code as you receive it, in any medium, provided that you keep intact the notices on all files that refer to copyrights, to this License Agreement, and to the absence of any warranty; and give any other recipients of the NetHack program a copy of this License Agreement along with the program. + +You may modify your copy or copies of NetHack or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above (including distributing this License Agreement), provided that you also do the following: + + a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, that in whole or in part contains or is a derivative of NetHack or any part thereof, to be licensed at no charge to all third parties on terms identical to those contained in this License Agreement (except that you may choose to grant more extensive warranty protection to some or all third parties, at your option) + + c) You may charge a distribution fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +You may copy and distribute NetHack (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: + + a) accompany it with the complete machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, + + b) accompany it with full information as to how to obtain the complete machine-readable source code from an appropriate archive site. (This alternative is allowed only for noncommercial distribution.) + +For these purposes, complete source code means either the full source distribution as originally released over Usenet or updated copies of the files in this distribution used to create the object code or executable. + +You may not copy, sublicense, distribute or transfer NetHack except as expressly provided under this License Agreement. Any attempt otherwise to copy, sublicense, distribute or transfer NetHack is void and your rights to use the program under this License agreement shall be automatically terminated. However, parties who have received computer software programs from you with this License Agreement will not have their licenses terminated so long as such parties remain in full compliance. +Stated plainly: You are permitted to modify NetHack, or otherwise use parts of NetHack, provided that you comply with the conditions specified above; in particular, your modified NetHack or program containing parts of NetHack must remain freely available as provided in this License Agreement. In other words, go ahead and share NetHack, but don't try to stop anyone else from sharing it farther. diff --git a/options/license/NLOD-1.0 b/options/license/NLOD-1.0 new file mode 100644 index 0000000..a513227 --- /dev/null +++ b/options/license/NLOD-1.0 @@ -0,0 +1,80 @@ +Norwegian Licence for Open Government Data (NLOD) + +Preface of licence + +This licence grants you the right to copy, use and distribute information, provided you acknowledge the contributors and comply with the terms and conditions stipulated in this licence. By using information made available under this licence, you accept the terms and conditions set forth in this licence. As set out in Section 7, the licensor disclaims any and all liability for the quality of the information and what the information is used for. + +This licence shall not impose any limitations on the rights or freedoms of the licensee under the Norwegian Freedom of Information Act or any other legislation granting the general public a right of access to public sector information, or that follow from exemptions or limitations stipulated in the Norwegian Copyright Act. Further, the licence shall not impose any limitations on the licensee's freedom of expression recognized by law. + +1. Definitions + + «Database» shall mean a database or similar protected under Section 43 of the Norwegian Copyright Act. + «Information» shall mean texts, images, recordings, data sets or other works protected under Section 1 of the Norwegian Copyright Act, or which are protected under provisions addressing what is referred to as «neighbouring rights» in Chapter 5 of the Norwegian Copyright Act (including databases and photographs), and which are distributed under this licence. + «Copy» shall mean reproduction in any form. + «Licensee» and «you» shall mean natural or legal persons using information under this licence. + «Licensor» shall mean the natural or legal person that makes information available under this licence. + «Distribute» shall mean any actions whereby information is made available, including to distribute, transfer, communicate, disperse, show, perform, sell, lend and rent. + «Use» shall mean one or more actions relevant to copyright law requiring permission from the owner of the copyright. + +2. Licence +The licensee, subject to the limitations that follow from this licence, may use the information for any purpose and in all contexts, by: + + * copying the information and distributing the information to others, + * modifying the information and/or combining the information with other information, and + * copying and distributing such changed or combined information. + * This is a non-exclusive, free, perpetual and worldwide licence. The information may be used in any medium and format known today and/or which will become known in the future. The Licensee shall not sub-license or transfer this licence. + +3. Exemptions +The licence does not apply to and therefore does not grant a right to use: + + * information which contains personal data covered by the Norwegian Personal Data Act unless there is a legitimate basis for the disclosure and further processing of the personal data + * information distributed in violation of a statutory obligation to observe confidentiality + * information excluded from public disclosure pursuant to law, including information deemed sensitive under the Norwegian National Security Act + * information subject to third party rights which the licensor is not authorised to license to the licensee + * information protected by intellectual property rights other than copyright and neighbouring rights in accordance with Chapter 5 of the Norwegian Copyright Act, such as trademarks, patents and design rights, but this does not entail an impediment to use information where the licensor's logo has been permanently integrated into the information or to attribute the origin of the information in accordance with the article below relating to attribution. + +If the licensor has made available information not covered by the licence according to the above list, the licensee must cease all use of the information under the licence, and erase the information as soon as he or she becomes aware of or should have understood that the information is not covered by the licence. + +4. Effects of breach of the licence +The licence is subject to the licensee's compliance with the terms and conditions of this licence. In the event that the licensee commits a breach of this licence, this will entail that the licensee's right to use the information will be revoked immediately without further notice. In case of such a breach, the licensee must immediately and without further notice take measures to cause the infringement to end. Because the right to use the information has been terminated, the licensee must cease all use of the information by virtue of the licence. + +5. Attribution +The licensee shall attribute the licensor as specified by the licensor and include a reference to this licence. To the extent practically possible, the licensee shall provide a link to both this licence and the source of the information. + +If the licensor has not specified how attributions shall be made, the licensee shall normally state the following: «Contains data under the Norwegian licence for Open Government data (NLOD) distributed by [name of licensor]». + +If the licensor has specified that the information shall only be available under a specific version of this licence, cf. Section 10, the licensee shall also state this. + +If the information has been changed, the licensee must clearly indicate that changes have been made by the licensee. + +6. Proper use +The licensee shall not use the information in a manner that appears misleading nor present the information in a distorted or incorrect manner. +Neither the licensor's nor other contributors' names or trademarks must be used to support, recommend or market the licensee or any products or services using the information. + +7. Disclaimer of liability +The information is licensed «as is». The information may contain errors and omissions. The licensor provides no warranties, including relating to the content and relevance of the information. + +The licensor disclaims any liability for errors and defects associated with the information to the maximum extent permitted by law. + +The licensor shall not be liable for direct or indirect losses as a result of use of the information or in connection with copying or further distribution of the information. + +8. Guarantees regarding data quality and accessibility +This licence does not prevent the licensor from issuing supplementary statements regarding expected or intended data quality and accessibility. Such statements shall be regarded as indicative in nature and not binding on the part of the licensor. The disclaimers in Section 7 also apply in full for such indicative statements. Based on separate agreement, the licensor may provide guarantees and distribute the information on terms and conditions different from those set forth in this licence. + +9. Licence compatibility +If the licensee is to distribute an adapted or combined work based on information covered by this licence and some other work licensed under a licence compatible by contract, such distribution may be based on an appropriate licence compatible by contract, cf. the list below. + +A licence compatible by contract shall mean the following licences: + + * for all information: Open Government Licence (version 1.0), + * for those parts of the information which do not constitute databases: Creative Commons Attribution Licence (generic version 1.0, 2.0, 2.5 and unported version 3.0) and Creative Commons Navngivelse 3.0 Norge, + * for those parts of the information which constitute databases: Open Data Commons Attribution License (version 1.0). + +This provision does not prevent other licences from being compatible with this licence based on their content. + +10. New versions of the licence +The licensee may choose to use the information covered by this licence under any new versions of the Norwegian licence for Open Government data (NLOD) issued by the responsible ministry (currently the Ministry of Government Administration, Reform and Church Affairs) when these versions are final and official, unless the licensor when making the information available under this licence specifically has stated that solely version 1.0 of this licence may be used. + +11. Governing law and legal venue +This licence, including its formation, and any disputes and claims arising in connection with or relating to this licence, shall be regulated by Norwegian law. The legal venue shall be the licensor's ordinary legal venue. The licensor may, with regard to intellectual proprietary rights, choose to pursue a claim at other competent legal venues and/or based on the laws of the country where the intellectual property rights are sought enforced. + diff --git a/options/license/NLPL b/options/license/NLPL new file mode 100644 index 0000000..79f83af --- /dev/null +++ b/options/license/NLPL @@ -0,0 +1,14 @@ +NO LIMIT PUBLIC LICENSE + Version 0, June 2012 + +Gilles LAMIRAL +La Billais +35580 Baulon +France + +NO LIMIT PUBLIC LICENSE + +Terms and conditions for copying, distribution, modification +or anything else. + + 0. No limit to do anything with this work and this license. diff --git a/options/license/NOSL b/options/license/NOSL new file mode 100644 index 0000000..41a874d --- /dev/null +++ b/options/license/NOSL @@ -0,0 +1,151 @@ +NETIZEN OPEN SOURCE LICENSE +Version 1.0 + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. +trend + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single LEDs product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netizen Pty Ltd ("Netizen ") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netizen. No one other than Netizen has the right to modify the terms applicable to Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Netizen", "NOSL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Netizen Open Source License and Xen Open Source License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY. + +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 7.1 To the extent permitted by law and except as expressly provided to the contrary in this Agreement, all warranties whether express, implied, statutory or otherwise, relating in any way to the subject matter of this Agreement or to this Agreement generally, are excluded. Where legislation implies in this Agreement any condition or warranty and that legislation avoids or prohibits provisions in a contract excluding or modifying the application of or the exercise of or liability under such term, such term shall be deemed to be included in this Agreement. However, the liability of Supplier for any breach of such term shall be limited, at the option of Supplier, to any one or more of the following: if the breach related to goods: the replacement of the goods or the supply of equivalent goods; the repair of such goods; the payment of the cost of replacing the goods or of acquiring equivalent goods; or the payment of the cost of having the goods repaired; and if the breach relates to services the supplying of the services again; or the payment of the cost of having the services supplied again. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: + (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + +The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS. + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. +This Agreement shall be governed by and construed according to the law of the State of Victoria. The parties irrevocably submit to the exclusive jurisdiction of the Courts of Victoria and Australia and any Courts hearing appeals from such Courts. This Agreement is deemed to have been made in Victoria. +The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS. + +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + +Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the NPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A - Netizen Open Source License + + ``The contents of this file are subject to the Netizen Open Source License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://netizen.com.au/licenses/NOPL/ + + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the NOSL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the NOSL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] diff --git a/options/license/NPL-1.0 b/options/license/NPL-1.0 new file mode 100644 index 0000000..7e2addf --- /dev/null +++ b/options/license/NPL-1.0 @@ -0,0 +1,99 @@ +NETSCAPE PUBLIC LICENSE
Version 1.0 + +1. Definitions. + + 1.1. ``Contributor'' means each entity that creates or contributes to the creation of Modifications. + + 1.2. ``Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor.
 + 1.3. ``Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof.
 + 1.4. ``Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data.
 + 1.5. ``Executable'' means Covered Code in any form other than Source Code.
 + 1.6. ``Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required byExhibit A.
 + 1.7. ``Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License.
 + 1.8. ``License'' means this document.
 + 1.9. ``Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.
 B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. ``Original Code'' means Source Code of computer software code which is described in the Source Code notice required byExhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License.
 + 1.11. ``Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge.
 + 1.12. ``You'' means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, ``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, ``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and
 (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``Utilize'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + + 2.2. Contributor Grant. 
Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and
 (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + +3. Distribution Obligations. + + 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party.
 + 3.3. Description of Modifications. You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.
 + 3.4. Intellectual Property Matters + (a) Third Party Claims. If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled ``LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. + + 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
 + 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.
 + 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. +This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. + +6. Versions of the License. + 6.1. New Versions. Netscape Communications Corporation (``Netscape'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License.
 + 6.3. Derivative Works. If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY. + +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + +This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +9. LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + +The Covered Code is a ``commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and ``commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS. + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the United States of America: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Santa Clara County, California, under the auspices of JAMS/EndDispute; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS. + +Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. + +AMENDMENTS +Additional Terms applicable to the Netscape Public License. + + I. Effect. 
These additional terms described in this Netscape Public License -- Amendments shall apply to the Mozilla Communicator client code and to all Covered Code under this License.
 + II. ``Netscape's Branded Code'' means Covered Code that Netscape distributes and/or permits others to distribute under one or more trademark(s) which are controlled by Netscape but which are not licensed for use under this License.
 + III. Netscape and logo. 
 This License does not grant any rights to use the trademark ``Netscape'', the ``Netscape N and horizon'' logo or the Netscape lighthouse logo, even if such marks are included in the Original Code.
 + IV. Inability to Comply Due to Contractual Obligation. 
 Prior to licensing the Original Code under this License, Netscape has licensed third party code for use in Netscape's Branded Code. To the extent that Netscape is limited contractually from making such third party code available under this License, Netscape may choose to reintegrate such code into Covered Code without being required to distribute such code in +Source Code form, even if such code would otherwise be considered ``Modifications'' under this License.
 + V. Use of Modifications and Covered Code by Initial Developer. + V.1. In General. The obligations of Section 3 apply to Netscape, except to the extent specified in this Amendment, Section V.2 and V.3.
 V.2. Other Products. Netscape may include Covered Code in products other than the Netscape's Branded Code which are released by Netscape during the two (2) years following the release date of the Original Code, without such additional products becoming subject to the terms of this License, and may license such additional products on different terms from those contained in this License.
 V.3. Alternative Licensing. Netscape may license the Source Code of Netscape's Branded Code, including Modifications incorporated therein, without such additional products becoming subject to the terms of this License, and may license such additional products on different terms from those contained in this License. + + VI. Arbitration and Litigation. 
 Notwithstanding the limitations of Section 11 above, the provisions regarding arbitration and litigation in Section 11(a), (b) and (c) of the License shall apply to all disputes relating to this License. + +EXHIBIT A. + +“The contents of this file are subject to the Netscape Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/NPL/ + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License.
 +The Original Code is Mozilla Communicator client code, released March 31, 1998.
 +The Initial Developer of the Original Code is Netscape Communications Corporation. Portions created by Netscape are Copyright (C) 1998 Netscape Communications Corporation. All Rights Reserved.
 +Contributor(s): ______________________________________.”

[NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. This is due to time constraints encountered in simultaneously finalizing the License and in preparing the Original Code for release. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] diff --git a/options/license/NPL-1.1 b/options/license/NPL-1.1 new file mode 100644 index 0000000..f0640d7 --- /dev/null +++ b/options/license/NPL-1.1 @@ -0,0 +1,176 @@ +Netscape Public LIcense version 1.1 + +AMENDMENTS + +The Netscape Public License Version 1.1 ("NPL") consists of the Mozilla Public License Version 1.1 with the following Amendments, including Exhibit A-Netscape Public License.  Files identified with "Exhibit A-Netscape Public License" are governed by the Netscape Public License Version 1.1. + +Additional Terms applicable to the Netscape Public License. + + I. Effect. + These additional terms described in this Netscape Public License -- Amendments shall apply to the Mozilla Communicator client code and to all Covered Code under this License. + + II. "Netscape's Branded Code" means Covered Code that Netscape distributes and/or permits others to distribute under one or more trademark(s) which are controlled by Netscape but which are not licensed for use under this License.
 + III. Netscape and logo. 
 This License does not grant any rights to use the trademarks "Netscape", the "Netscape N and horizon" logo or the "Netscape lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript", "Smart Browsing" even if such marks are included in the Original Code or Modifications.
 + IV. Inability to Comply Due to Contractual Obligation. 
 Prior to licensing the Original Code under this License, Netscape has licensed third party code for use in Netscape's Branded Code. To the extent that Netscape is limited contractually from making such third party code available under this License, Netscape may choose to reintegrate such code into Covered Code without being required to distribute such code in Source Code form, even if such code would otherwise be considered "Modifications" under this License.
 + V. Use of Modifications and Covered Code by Initial Developer. + V.1. In General. + The obligations of Section 3 apply to Netscape, except to the extent specified in this Amendment, Section V.2 and V.3. + + V.2. Other Products. 
 Netscape may include Covered Code in products other than the Netscape's Branded Code which are released by Netscape during the two (2) years following the release date of the Original Code, without such additional products becoming subject to the terms of this License, and may license such additional products on different terms from those contained in this License.
 + V.3. Alternative Licensing. 
 Netscape may license the Source Code of Netscape's Branded Code, including Modifications incorporated therein, without such Netscape Branded Code becoming subject to the terms of this License, and may license such Netscape Branded Code on different terms from those contained in this License. 
  + VI. Litigation. + Notwithstanding the limitations of Section 11 above, the provisions regarding litigation in Section 11(a), (b) and (c) of the License shall apply to all disputes relating to this License. +
EXHIBIT A-Netscape Public License. +   +"The contents of this file are subject to the Netscape Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/NPL/ + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License.
 +The Original Code is Mozilla Communicator client code, released March 31, 1998.
 +The Initial Developer of the Original Code is Netscape Communications Corporation. Portions created by Netscape are Copyright (C) 1998-1999 Netscape Communications Corporation. All Rights Reserved.
Contributor(s): ______________________________________. +   +Alternatively, the contents of this file may be used under the terms of the _____ license (the  "[___] License"), in which case the provisions of [______] License are applicable  instead of those above.  If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the NPL, indicate your decision by deleting  the provisions above and replace  them with the notice and other provisions required by the [___] License.  If you do not delete the provisions above, a recipient may use your version of this file under either the NPL or the [___] License." + + +Mozilla Public License Version 1.1 + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: +Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. +Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + a. under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + b. under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + c. the licenses granted in this Section 2.1 (a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + d. Notwithstanding Section 2.1 (b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + a. under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + b. under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + c. the licenses granted in Sections 2.2 (a) and 2.2 (b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + d. Notwithstanding Section 2.2 (b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + + (a) Third Party Claims + If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs + If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4 (a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Sections 3.1, 3.2, 3.3, 3.4 and 3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions + Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. + + 6.3. Derivative Works + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. Termination + + 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: + + a. such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + b. any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. government end users +The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. Miscellaneous +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. Responsibility for claims +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +13. Multiple-licensed code +Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the MPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +Exhibit A - Mozilla Public License. + +"The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code is ______________________________________. + +The Initial Developer of the Original Code is ________________________. +Portions created by ______________________ are Copyright (C) ______ +_______________________. All Rights Reserved. + +Contributor(s): ______________________________________. + +Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." + +NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications. diff --git a/options/license/NPOSL-3.0 b/options/license/NPOSL-3.0 new file mode 100644 index 0000000..54bfd8c --- /dev/null +++ b/options/license/NPOSL-3.0 @@ -0,0 +1,59 @@ +Non-Profit Open Software License 3.0 + +This Non-Profit Open Software License ("Non-Profit OSL") version 3.0 (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: + + Licensed under the Non-Profit Open Software License version 3.0 + +1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: + + a) to reproduce the Original Work in copies, either alone or as part of a collective work; + + b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; + + c) to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Non-Profit Open Software License or as provided in section 17(d); + + d) to perform the Original Work publicly; and + + e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. + +5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). + +6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. The Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. + +9) Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). + +10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. + +12) Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + +13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + +16) Modification of This License. This License is Copyright © 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. + +17) Non-Profit Amendment. The name of this amended version of the Open Software License ("OSL 3.0") is "Non-Profit Open Software License 3.0". The original OSL 3.0 license has been amended as follows: + + (a) Licensor represents and declares that it is a not-for-profit organization that derives no revenue whatsoever from the distribution of the Original Work or Derivative Works thereof, or from support or services relating thereto. + + (b) The first sentence of Section 7 ["Warranty of Provenance"] of OSL 3.0 has been stricken. For Original Works licensed under this Non-Profit OSL 3.0, LICENSOR OFFERS NO WARRANTIES WHATSOEVER. + + (c) In the first sentence of Section 8 ["Limitation of Liability"] of this Non-Profit OSL 3.0, the list of damages for which LIABILITY IS LIMITED now includes "direct" damages. + + (d) The proviso in Section 1(c) of this License now refers to this "Non-Profit Open Software License" rather than the "Open Software License". You may distribute or communicate the Original Work or Derivative Works thereof under this Non-Profit OSL 3.0 license only if You make the representation and declaration in paragraph (a) of this Section 17. Otherwise, You shall distribute or communicate the Original Work or Derivative Works thereof only under the OSL 3.0 license and You shall publish clear licensing notices so stating. Also by way of clarification, this License does not authorize You to distribute or communicate works under this Non-Profit OSL 3.0 if You received them under the original OSL 3.0 license. + + (e) Original Works licensed under this license shall reference "Non-Profit OSL 3.0" in licensing notices to distinguish them from works licensed under the original OSL 3.0 license. \ No newline at end of file diff --git a/options/license/NRL b/options/license/NRL new file mode 100644 index 0000000..aa559ef --- /dev/null +++ b/options/license/NRL @@ -0,0 +1,28 @@ +NRL License + +COPYRIGHT NOTICE + +All of the documentation and software included in this software distribution from the US Naval Research Laboratory (NRL) are copyrighted by their respective developers. + +Portions of the software are derived from the Net/2 and 4.4-Lite Berkeley Software Distributions (BSD) of the University of California at Berkeley and those portions are copyright by The Regents of the University of California. All Rights Reserved. The UC Berkeley Copyright and License agreement is binding on those portions of the software. In all cases, the NRL developers have retained the original UC Berkeley copyright and license notices in the respective files in accordance with the UC Berkeley copyrights and license. + +Portions of this software and documentation were developed at NRL by various people. Those developers have each copyrighted the portions that they developed at NRL and have assigned All Rights for those portions to NRL. Outside the USA, NRL has copyright on some of the software developed at NRL. The affected files all contain specific copyright notices and those notices must be retained in any derived work. + +NRL LICENSE + +NRL grants permission for redistribution and use in source and binary forms, with or without modification, of the software and documentation created at NRL provided that the following conditions are met: + + 1. All terms of the UC Berkeley copyright and license must be followed. + 2. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + 3. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + 4. All advertising materials mentioning features or use of this software must display the following acknowledgements: + + This product includes software developed by the University of California, Berkeley and its contributors. + + This product includes software developed at the Information Technology Division, US Naval Research Laboratory. + + 5. Neither the name of the NRL nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THE SOFTWARE PROVIDED BY NRL IS PROVIDED BY NRL AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NRL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of the US Naval Research Laboratory (NRL). \ No newline at end of file diff --git a/options/license/NTP b/options/license/NTP new file mode 100644 index 0000000..e3d118d --- /dev/null +++ b/options/license/NTP @@ -0,0 +1,5 @@ +NTP License (NTP) + +Copyright (c) <> + +Permission to use, copy, modify, and distribute this software and its documentation for any purpose with or without fee is hereby granted, provided that the above copyright notice appears in all copies and that both the copyright notice and this permission notice appear in supporting documentation, and that the name <> not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. <> makes no representations about the suitability this software for any purpose. It is provided "as is" without express or implied warranty. \ No newline at end of file diff --git a/options/license/Naumen b/options/license/Naumen new file mode 100644 index 0000000..a2e0da6 --- /dev/null +++ b/options/license/Naumen @@ -0,0 +1,21 @@ +NAUMEN Public License + +This software is Copyright (c) NAUMEN (tm) and Contributors. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions in source code must retain the above copyright notice, this list of conditions, and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The name NAUMEN (tm) must not be used to endorse or promote products derived from this software without prior written permission from NAUMEN. + +4. The right to distribute this software or to use it for any purpose does not give you the right to use Servicemarks (sm) or Trademarks (tm) of NAUMEN. + +5. If any files originating from NAUMEN or Contributors are modified, you must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + +Disclaimer: + +THIS SOFTWARE IS PROVIDED BY NAUMEN "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NAUMEN OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This software consists of contributions made by NAUMEN and Contributors. Specific attributions are listed in the accompanying credits file. \ No newline at end of file diff --git a/options/license/Net-SNMP b/options/license/Net-SNMP new file mode 100644 index 0000000..14f3fdb --- /dev/null +++ b/options/license/Net-SNMP @@ -0,0 +1,107 @@ + ---- Part 1: CMU/UCD copyright notice: (BSD like) ----- + + Copyright 1989, 1991, 1992 by Carnegie Mellon University + + Derivative Work - 1996, 1998-2000 Copyright 1996, 1998-2000 The Regents of the University of California + + All Rights Reserved + +Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appears in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of CMU and The Regents of the University of California not be used in advertising or publicity pertaining to distribution of the software without specific written permission. + +CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL CMU OR THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM THE LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- Part 2: Networks Associates Technology, Inc copyright notice (BSD) ----- + +Copyright (c) 2001-2003, Networks Associates Technology, Inc All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the Networks Associates Technology, Inc nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---- Part 3: Cambridge Broadband Ltd. copyright notice (BSD) ----- + +Portions of this code are copyright (c) 2001-2003, Cambridge Broadband Ltd. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * The name of Cambridge Broadband Ltd. may not be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---- Part 4: Sun Microsystems, Inc. copyright notice (BSD) ----- + +Copyright © 2003 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, California 95054, U.S.A. All rights reserved. + +Use is subject to license terms below. + +This distribution may include materials developed by third parties. + +Sun, Sun Microsystems, the Sun logo and Solaris are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + * Neither the name of the Sun Microsystems, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---- Part 5: Sparta, Inc copyright notice (BSD) ----- + +Copyright (c) 2003-2009, Sparta, Inc All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of Sparta, Inc nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---- Part 6: Cisco/BUPTNIC copyright notice (BSD) ----- + +Copyright (c) 2004, Cisco, Inc and Information Network Center of Beijing University of Posts and Telecommunications. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of Cisco, Inc, Beijing University of Posts and Telecommunications, nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---- Part 7: Fabasoft R&D Software GmbH & Co KG copyright notice (BSD) ----- + +Copyright (c) Fabasoft R&D Software GmbH & Co KG, 2003 oss@fabasoft.com Author: Bernhard Penz + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + * The name of Fabasoft R&D Software GmbH & Co KG or any of its subsidiaries, brand or product names may not be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---- Part 8: Apple Inc. copyright notice (BSD) ----- + +Copyright (c) 2007 Apple Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + 3. Neither the name of Apple Inc. ("Apple") nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---- Part 9: ScienceLogic, LLC copyright notice (BSD) ----- + +Copyright (c) 2009, ScienceLogic, LLC All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of ScienceLogic, LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/NetCDF b/options/license/NetCDF new file mode 100644 index 0000000..a24607b --- /dev/null +++ b/options/license/NetCDF @@ -0,0 +1,7 @@ +Copyright 1993-2014 University Corporation for Atmospheric Research/Unidata + +Portions of this software were developed by the Unidata Program at the University Corporation for Atmospheric Research. + +Access and use of this software shall impose the following obligations and understandings on the user. The user is granted the right, without any fee or cost, to use, copy, modify, alter, enhance and distribute this software, and any derivative works thereof, and its supporting documentation for any purpose whatsoever, provided that this entire notice appears in all copies of the software, derivative works and supporting documentation. Further, UCAR requests that the user credit UCAR/Unidata in any publications that result from the use of this software or in any product that includes this software, although this is not an obligation. The names UCAR and/or Unidata, however, may not be used in any advertising or publicity to endorse or promote any products or commercial entity unless specific written permission is obtained from UCAR/Unidata. The user also understands that UCAR/Unidata is not obligated to provide the user with any support, consulting, training or assistance of any kind with regard to the use, operation and performance of this software nor to provide the user with any updates, revisions, new versions or "bug fixes." + +THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/options/license/Newsletr b/options/license/Newsletr new file mode 100644 index 0000000..6975008 --- /dev/null +++ b/options/license/Newsletr @@ -0,0 +1,7 @@ +Copyright 1989--2004 by Hunter Goatley. + +Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: + +1. This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. \ No newline at end of file diff --git a/options/license/Nokia b/options/license/Nokia new file mode 100644 index 0000000..399bb30 --- /dev/null +++ b/options/license/Nokia @@ -0,0 +1,159 @@ +Nokia Open Source License (NOKOS License) + +Version 1.0a + +1. DEFINITIONS. + +"Affiliates" of a party shall mean an entity + + a) which is directly or indirectly controlling such party; + + b) which is under the same direct or indirect ownership or control as such party; or + + c) which is directly or indirectly owned or controlled by such party. + + For these purposes, an entity shall be treated as being controlled by another if that other entity has fifty percent (50%) or more of the votes in such entity, is able to direct its affairs and/or to control the composition of its board of directors or equivalent body. + +"Commercial Use" shall mean distribution or otherwise making the Covered Software available to a third party. + +"Contributor" shall mean each entity that creates or contributes to the creation of Modifications. + +"Contributor Version" shall mean in case of any Contributor the combination of the Original Software, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor and in case of Nokia in addition the Original Software in any form, including the form as Exceutable. + +"Covered Software" shall mean the Original Software or Modifications or the combination of the Original Software and Modifications, in each case including portions thereof. + +"Electronic Distribution Mechanism" shall mean a mechanism generally accepted in the software development community for the electronic transfer of data. + +"Executable" shall mean Covered Software in any form other than Source Code. + +"Nokia" shall mean Nokia Corporation and its Affiliates. + +"Larger Work" shall mean a work, which combines Covered Software or portions thereof with code not governed by the terms of this License. + +"License" shall mean this document. + +"Licensable" shall mean having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + +"Modifications" shall mean any addition to or deletion from the substance or structure of either the Original Software or any previous Modifications. When Covered Software is released as a series of files, a Modification is: + + a) Any addition to or deletion from the contents of a file containing Original Software or previous Modifications. + + b) Any new file that contains any part of the Original Software or previous Modifications. + +"Original Software" shall mean the Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Software, and which, at the time of its release under this License is not already Covered Software governed by this License. + +"Patent Claims" shall mean any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + +"Source Code" shall mean the preferred form of the Covered Software for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Software or another well known, available Covered Software of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + +"You" (or "Your") shall mean an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes Affiliates of such entity. + +2. SOURCE CODE LICENSE. + + 2.1 Nokia Grant. + Subject to the terms of this License, Nokia hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + a) under copyrights Licensable by Nokia to use, reproduce, modify, display, perform, sublicense and distribute the Original Software (or portions thereof) with or without Modifications, and/or as part of a Larger Work; + + b) and under Patents Claims necessarily infringed by the making, using or selling of Original Software, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Software (or portions thereof). + + c) The licenses granted in this Section 2.1(a) and (b) are effective on the date Nokia first distributes Original Software under the terms of this License. + + d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Software; 2) separate from the Original Software; or 3) for infringements caused by: i) the modification of the Original Software or ii) the combination of the Original Software with other software or devices. + + 2.2 Contributor Grant. + Subject to the terms of this License and subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + a) under copyrights Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Software and/or as part of a Larger Work; and + + b) under Patent Claims necessarily infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Software. + + d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Software in the absence of Modifications made by that Contributor. + +3. DISTRIBUTION OBLIGATIONS. + + 3.1 Application of License. + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Software may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + You must cause all Covered Software to which You contribute to contain a file documenting the changes You made to create that Covered Software and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Software provided by Nokia and including the name of Nokia in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Software. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Software that new knowledge has been obtained. + + (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + + (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Software. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of Nokia or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify Nokia and every Contributor for any liability incurred by Nokia or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + You may distribute Covered Software in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Software, and if You include a notice stating that the Source Code version of the Covered Software is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Software. You may distribute the Executable version of Covered Software or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by Nokia or any Contributor. You hereby agree to indemnify Nokia and every Contributor for any liability incurred by Nokia or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + You may create a Larger Work by combining Covered Software with other software not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. + +4. INABILITY TO COMPLY DUE TO STATUTE OR REGULATION. +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. + +Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. APPLICATION OF THIS LICENSE. +This License applies to code to which Nokia has attached the notice in Exhibit A and to related Covered Software. + +6. VERSIONS OF THE LICENSE. + + 6.1 New Versions. + Nokia may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + Once Covered Software has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Software under the terms of any subsequent version of the License published by Nokia. No one other than Nokia has the right to modify the terms applicable to Covered Software created under this License. + +7. DISCLAIMER OF WARRANTY. +COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT NOKIA, ITS LICENSORS OR AFFILIATES OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Software which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Nokia or a Contributor (Nokia or Contributor against whom You file such action is referred to as "Participant") alleging that: + + a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + + b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, NOKIA, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, BUT MAY ALLOW LIABILITY TO BE LIMITED; IN SUCH CASES, A PARTY's, ITS EMPLOYEES, LICENSORS OR AFFILIATES' LIABILITY SHALL BE LIMITED TO U.S. $50. Nothing contained in this License shall prejudice the statutory rights of any party dealing as a consumer. + +10. MISCELLANEOUS. +This License represents the complete agreement concerning subject matter hereof. All rights in the Covered Software not expressly granted under this License are reserved. Nothing in this License shall grant You any rights to use any of the trademarks of Nokia or any of its Affiliates, even if any of such trademarks are included in any part of Covered Software and/or documentation to it. + +This License is governed by the laws of Finland excluding its conflict-of-law provisions. All disputes arising from or relating to this Agreement shall be settled by a single arbitrator appointed by the Central Chamber of Commerce of Finland. The arbitration procedure shall take place in Helsinki, Finland in the English language. If any part of this Agreement is found void and unenforceable, it will not affect the validity of the balance of the Agreement, which shall remain valid and enforceable according to its terms. + +11. RESPONSIBILITY FOR CLAIMS. +As between Nokia and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Nokia and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +EXHIBIT A + +The contents of this file are subject to the NOKOS License Version 1.0 (the "License"); you may not use this file except in compliance with the License. + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Software is + +______________________________________. + +Copyright © Nokia and others. All Rights Reserved. + +Contributor(s): ______________________________________. \ No newline at end of file diff --git a/options/license/Noweb b/options/license/Noweb new file mode 100644 index 0000000..f9cda87 --- /dev/null +++ b/options/license/Noweb @@ -0,0 +1,9 @@ +Noweb is copyright 1989-2000 by Norman Ramsey. All rights reserved. + +Noweb is protected by copyright. It is not public-domain software or shareware, and it is not protected by a ``copyleft'' agreement like the one used by the Free Software Foundation. + +Noweb is available free for any use in any field of endeavor. You may redistribute noweb in whole or in part provided you acknowledge its source and include this COPYRIGHT file. You may modify noweb and create derived works, provided you retain this copyright notice, but the result may not be called noweb without my written consent. + +You may sell noweb if you wish. For example, you may sell a CD-ROM including noweb. + +You may sell a derived work, provided that all source code for your derived work is available, at no additional charge, to anyone who buys your derived work in any form. You must give permisson for said source code to be used and modified under the terms of this license. You must state clearly that your work uses or is based on noweb and that noweb is available free of change. You must also request that bug reports on your work be reported to you. \ No newline at end of file diff --git a/options/license/Nunit b/options/license/Nunit new file mode 100644 index 0000000..7e2b0a2 --- /dev/null +++ b/options/license/Nunit @@ -0,0 +1,14 @@ +Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole +Copyright © 2000-2004 Philip A. Craig + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. + +Portions Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole or Copyright © 2000-2004 Philip A. Craig + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. \ No newline at end of file diff --git a/options/license/OCCT-PL b/options/license/OCCT-PL new file mode 100644 index 0000000..85df3c7 --- /dev/null +++ b/options/license/OCCT-PL @@ -0,0 +1,112 @@ +Open CASCADE Technology Public License +Version 6.6, April 2013 + +OPEN CASCADE releases and makes publicly available the source code of the software Open CASCADE Technology to the free software development community under the terms and conditions of this license. + +It is not the purpose of this license to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this license has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +Please read this license carefully and completely before downloading this software. By downloading, using, modifying, distributing and sublicensing this software, you indicate your acceptance to be bound by the terms and conditions of this license. If you do not want to accept or cannot accept for any reasons the terms and conditions of this license, please do not download or use in any manner this software. +  +1. Definitions + +Unless there is something in the subject matter or in the context inconsistent therewith, the capitalized terms used in this License shall have the following meaning. + +"Applicable Intellectual Property Rights" means (a) with respect to the Initial Developer, any rights under patents or patents applications or other intellectual property rights that are now or hereafter acquired, owned by or assigned to the Initial Developer and that cover subject matter contained in the Original Code, but only to the extent necessary to use, reproduce, modify, distribute or sublicense the Original Code without infringement; and (b) with respect to You or any Contributor, any rights under patents or patents applications or other intellectual property rights that are now or hereafter acquired, owned by or assigned to You or to such Contributor and that cover subject matter contained in Your Modifications or in such Contributor's Modifications, taken alone or in combination with Original Code. + +"Contributor" means each individual or legal entity that creates or contributes to the creation of any Modification, including the Initial Developer. + +"Derivative Program": means a new program combining the Software or portions thereof with other source code not governed by the terms of this License. + +"Initial Developer": means OPEN CASCADE, with main offices at 1, place des Frères Montgolfier, 78280, Guyancourt, France. + +"Modifications": mean any addition to, deletion from or change to the substance or the structure of the Software. When source code of the Software is released as a series of files, a Modification is: (a) any addition to, deletion from or change to the contents of a file containing the Software or (b) any new file or other representation of computer program statements that contains any part of the Software. By way of example, Modifications include any debug of, or improvement to, the Original Code or any of its components or portions as well as its next versions or releases thereof. + +"Original Code": means (a) the source code of the software Open CASCADE Technology originally made available by the Initial Developer under this License, including the source code of any updates or upgrades of the Original Code and (b) the object code compiled from such source code and originally made available by Initial Developer under this License. + +"Software": means the Original Code, the Modifications, the combination of Original Code and any Modifications or any respective portions thereof. + +"You" or "Your": means an individual or a legal entity exercising rights under this License +  +2. Acceptance of license +By using, reproducing, modifying, distributing or sublicensing the Software or any portion thereof, You expressly indicate Your acceptance of the terms and conditions of this License and undertake to act in accordance with all the provisions of this License applicable to You. +  +3. Scope and purpose +This License applies to the Software and You may not use, reproduce, modify, distribute, sublicense or circulate the Software, or any portion thereof, except as expressly provided under this License. Any attempt to otherwise use, reproduce, modify, distribute or sublicense the Software is void and will automatically terminate Your rights under this License. +  +4. Contributor license +Subject to the terms and conditions of this License, the Initial Developer and each of the Contributors hereby grant You a world-wide, royalty-free, irrevocable and non-exclusive license under the Applicable Intellectual Property Rights they own or control, to use, reproduce, modify, distribute and sublicense the Software provided that: + + You reproduce in all copies of the Software the copyright and other proprietary notices and disclaimers of the Initial Developer as they appear in the Original Code and attached hereto as Schedule "A" and any other notices or disclaimers attached to the Software and keep intact all notices in the Original Code that refer to this License and to the absence of any warranty; + + You include a copy of this License with every copy of the Software You distribute; + + If you distribute or sublicense the Software (as modified by You or on Your behalf as the case may be), You cause such Software to be licensed as a whole, at no charge, to all third parties, under the terms and conditions of the License, making in particular available to all third parties the source code of the Software; + + You document all Your Modifications, indicate the date of each such Modification, designate the version of the Software You used, prominently include a file carrying such information with respect to the Modifications and duplicate the copyright and other proprietary notices and disclaimers attached hereto as Schedule "B" or any other notices or disclaimers attached to the Software with your Modifications. + +For greater certainty, it is expressly understood that You may freely create Derivative Programs (without any obligation to publish such Derivative Program) and distribute same as a single product. In such case, You must ensure that all the requirements of this License are fulfilled for the Software or any portion thereof. + +5. Your license +You hereby grant all Contributors and anyone who becomes a party under this License a world-wide, non-exclusive, royalty-free and irrevocable license under the Applicable Intellectual Property Rights owned or controlled by You, to use, reproduce, modify, distribute and sublicense all Your Modifications under the terms and conditions of this License. + +6. Software subject to license +Your Modifications shall be governed by the terms and conditions of this License. You are not authorized to impose any other terms or conditions than those prevailing under this License when You distribute and/or sublicense the Software, save and except as permitted under Section 7 hereof. + +7. Additional terms +You may choose to offer, on a non-exclusive basis, and to charge a fee for any warranty, support, maintenance, liability obligations or other rights consistent with the scope of this License with respect to the Software (the "Additional Terms") to the recipients of the Software. However, You may do so only on Your own behalf and on Your sole and exclusive responsibility. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold the Initial Developer and any Contributor harmless for any liability incurred by or claims asserted against the Initial Developer or any Contributors with respect to any such Additional Terms. + +8. Disclaimer of warranty +The Software is provided under this License on an "as is" basis, without warranty of any kind, including without limitation, warranties that the Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Software is with You. + +9. Liability +Under no circumstances shall You, the Initial Developer or any Contributor be liable to any person for any direct or indirect damages of any kind including, without limitation, damages for loss of goodwill, loss of data, work stoppage, computer failure or malfunction or any and all other commercial damages or losses resulting from or relating to this License or indirectly to the use of the Software. + +10. Trademark +This License does not grant any rights to use the trademarks, trade names and domain names "MATRA", "EADS Matra Datavision", "CAS.CADE", "Open CASCADE", "opencascade.com" and "opencascade.org" or any other trademarks, trade names or domain names used or owned by the Initial Developer. + +11. Copyright +The Initial Developer retains all rights, title and interest in and to the Original Code. You may not remove the copyright © notice which appears when You download the Software. + +12. Term +This License is granted to You for a term equal to the remaining period of protection covered by the intellectual property rights applicable to the Original Code. + +13. Termination +In case of termination, as provided in Section 3 above, You agree to immediately stop any further use, reproduction, modification, distribution and sublicensing of the Software and to destroy all copies of the Software that are in Your possession or control. All sublicenses of the Software which have been properly granted prior to termination shall survive any termination of this License. In addition, Sections 5, 8 to 11, 13.2 and 15.2 of this License, in reason of their nature, shall survive the termination of this License for a period of fifteen (15) years. + +14. Versions of the license +The Initial Developer may publish new versions of this License from time to time. Once Original Code has been published under a particular version of this License, You may choose to continue to use it under the terms and conditions of that version or use the Original Code under the terms of any subsequent version of this License published by the Initial Developer. + +15. Miscellaneous + 15.1 Relationship of the Parties This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between You and the Initial Developer, and You will not represent to the contrary, whether expressly, by implication or otherwise. + + 15.2 Independent Development Nothing in this License will impair the Initial Developer's right to acquire, license, develop, have others develop for it, market or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Derivative Programs, technology or products that You may develop, produce, market or distribute. + + 15.3 Severability If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and extent. + +END OF THE TERMS AND CONDITIONS OF THIS LICENSE + +OPEN CASCADE is a French société par actions simplifiée having its registered head office at 1, place des Frères Montgolfier, 78280, Guyancourt, France and main offices at 1, place des Frères Montgolfier, 78280, Guyancourt, France. Its web site is located at the following address opencascade.com + +Open CASCADE Technology Public License +Schedule "A" + + The content of this file is subject to the Open CASCADE Technology Public License (the "License"). You may not use the content of this file except in compliance with the License. Please obtain a copy of the License at opencascade.com and read it completely before using this file. + + The Initial Developer of the Original Code is OPEN CASCADE, with main offices at 1, place des Frères Montgolfier, 78280, Guyancourt, France. The Original Code is copyright © OPEN CASCADE SAS, 2001. All rights reserved. "The Original Code and all software distributed under the License are distributed on an "AS IS" basis, without warranty of any kind, and the Initial Developer hereby disclaims all such warranties, including without limitation, any warranties of merchantability, fitness for a particular purpose or non-infringement. + + Please see the License for the specific terms and conditions governing rights and limitations under the License". + End of Schedule "A" + +Open CASCADE Technology Public License +Schedule "B" + + "The content of this file is subject to the Open CASCADE Technology Public License (the "License"). You may not use the content of this file except in compliance with the License. Please obtain a copy of the License at opencascade.com and read it completely before using this file. + + The Initial Developer of the Original Code is OPEN CASCADE, with main offices at 1, place des Frères Montgolfier, 78280, Guyancourt, France. The Original Code is copyright © Open CASCADE SAS, 2001. All rights reserved. + + Modifications to the Original Code have been made by ________________________. Modifications are copyright © [Year to be included]. All rights reserved. + + The software Open CASCADE Technology and all software distributed under the License are distributed on an "AS IS" basis, without warranty of any kind, and the Initial Developer hereby disclaims all such warranties, including without limitation, any warranties of merchantability, fitness for a particular purpose or non-infringement. + + Please see the License for the specific terms and conditions governing rights and limitations under the License" + End of Schedule "B" diff --git a/options/license/OCLC-2.0 b/options/license/OCLC-2.0 new file mode 100644 index 0000000..7767ecc --- /dev/null +++ b/options/license/OCLC-2.0 @@ -0,0 +1,76 @@ +OCLC Research Public License 2.0 +Terms & Conditions Of Use +May, 2002 +Copyright © 2002. OCLC Online Computer Library Center, Inc. All Rights Reserved + +PLEASE READ THIS DOCUMENT CAREFULLY. BY DOWNLOADING OR USING THE CODE BASE AND/OR DOCUMENTATION ACCOMPANYING THIS LICENSE (THE "License"), YOU AGREE TO THE FOLLOWING TERMS AND CONDITIONS OF THIS LICENSE. + +Section 1. Your Rights + +Subject to these terms and conditions of this License, the OCLC Office of Research (the "Original Contributor") and each subsequent contributor (collectively with the Original Contributor, the "Contributors") hereby grant you a non-exclusive, worldwide, no-charge, transferable license to execute, prepare derivative works of, and distribute (internally and externally), for commercial and noncommercial purposes, the original code contributed by Original Contributor and all Modifications (collectively called the "Program"). + +Section 2. Definitions + +A "Modification" to the Program is any addition to or deletion from the contents of any file of the Program and any new file that contains any part of the Program. If you make a Modification and distribute the Program externally you are a "Contributor." The distribution of the Program must be under the terms of this license including those in Section 3 below. + +A "Combined Work" results from combining and integrating all or parts of the Program with other code. A Combined Work may be thought of as having multiple parents or being result of multiple lines of code development. + +Section 3. Distribution Licensing Terms + +A. General Requirements +Except as necessary to recognize third-party rights or third-party restriction (see below), a distribution of the Program in any of the forms listed below must not put any further restrictions on the recipient’s exercise of the rights granted herein. + +As a Contributor, you represent that your Modification(s) are your original creation(s) and, to the best of your knowledge, no third party has any claim (including but not limited to intellectual property claims) relating to your Modification(s). You represent that each of your Modifications includes complete details of any third-party right or other third-party restriction associated with any part of your Modification (including a copy of any applicable license agreement). + +The Program must be distributed without charge beyond the costs of physically transferring the files to the recipient. + +This Warranty Disclaimer/Limitation of Liability must be prominently displayed with every distribution of the Program in any form: + +YOU AGREE THAT THE PROGRAM IS PROVIDED AS-IS, WITHOUT WARRANTY OF ANY KIND (EITHER EXPRESS OR IMPLIED). ACCORDINGLY, OCLC MAKES NO WARRANTIES, REPRESENTATIONS OR GUARANTEES, EITHER EXPRESS OR IMPLIED, AND DISCLAIMS ALL SUCH WARRANTIES, REPRESENTATIONS OR GUARANTEES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE, AS TO: (A) THE FUNCTIONALITY OR NONINFRINGEMENT OF PROGRAM, ANY MODIFICATION, A COMBINED WORK OR AN AGGREGATE WORK; OR (B) THE RESULTS OF ANY PROJECT UNDERTAKEN USING THE PROGRAM, ANY MODIFICATION, A COMBINED WORK OR AN AGGREGATE WORK. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, CONSEQUENTIAL OR ANY OTHER DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE PROGRAM, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. YOU HEREBY WAIVE ANY CLAIMS FOR DAMAGES OF ANY KIND AGAINST CONTRIBUTORS WHICH MAY RESULT FROM YOUR USE OF THE PROGRAM. + +B. Requirements for a Distribution of Modifiable Code +If you distribute the Program in a form to which the recipient can make Modifications (e.g. source code), the terms of this license apply to use by recipient. In addition, each source and data file of the Program and any Modification you distribute must contain the following notice: + + "Copyright (c) 2000- (insert then current year) OCLC Online Computer Library Center, Inc. and other contributors. All rights reserved. The contents of this file, as updated from time to time by the OCLC Office of Research, are subject to OCLC Research Public License Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a current copy of the License at http://purl.oclc.org/oclc/research/ORPL/. Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. This software consists of voluntary contributions made by many individuals on behalf of OCLC Research. For more information on OCLC Research, please see http://www.oclc.org/research/. The Original Code is ______________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) _____ _______________________. All Rights Reserved. Contributor(s): ______________________________________." + +C. Requirements for a Distribution of Non-modifiable Code +If you distribute the Program in a form to which the recipient cannot make Modifications (e.g. object code), the terms of this license apply to use by recipient and you must include the following statement in appropriate and conspicuous locations: + +"Copyright (c) 2000- (insert then current year) OCLC Online Computer Library Center, Inc. and other contributors. All rights reserved." + +In addition, the source code must be included with the object code distribution or the distributor must provide the source code to the recipient upon request. + +D. Requirements for a Combined Work Distribution +Distributions of Combined Works are subject to the terms of this license and must be made at no charge to the recipient beyond the costs of physically transferring the files to recipient. + +A Combined Work may be distributed as either modifiable or non-modifiable code. The requirements of Section 3.B or 3.C above (as appropriate) apply to such distributions. + +An "Aggregate Work" is when the Program exists, without integration, with other programs on a storage medium. This License does not apply to portions of an Aggregate Work which are not covered by the definition of "Program" provided in this License. You are not forbidden from selling an Aggregate Work. However, the Program contained in an Aggregate Work is subject to this License. Also, should the Program be extracted from an Aggregate Work, this License applies to any use of the Program apart from the Aggregate Work. + +Section 4. License Grant + +For purposes of permitting use of your Modifications by OCLC and other licensees hereunder, you hereby grant to OCLC and such other licensees the non-exclusive, worldwide, royalty-free, transferable, sublicenseable license to execute, copy, alter, delete, modify, adapt, change, revise, enhance, develop, publicly display, distribute (internally and externally) and/or create derivative works based on your Modifications (and derivative works thereof) in accordance with these Terms. This Section 4 shall survive termination of this License for any reason. + +Section 5. Termination of Rights + +This non-exclusive license (with respect to the grant from a particular Contributor) automatically terminates for any entity that initiates legal action for intellectual property infringement (with respect to the Program) against such Contributor as of the initiation of such action. + +If you fail to comply with this License, your rights (but not your obligations) under this License shall terminate automatically unless you cure such breach within thirty (30) days of becoming aware of the noncompliance. All sublicenses granted by you which preexist such termination and are properly granted shall survive such termination. + +Section 6. Other Terms + +Except for the copyright notices required above, you may not use any trademark of any of the Contributors without the prior written consent of the relevant Contributor. You agree not to remove, alter or obscure any copyright or other proprietary rights notice contained in the Program. + +All transfers of the Program or any part thereof shall be made in compliance with U.S. import/export regulations or other restrictions of the U.S. Department of Commerce, as well as other similar trade or commerce restrictions which might apply. + +Any patent obtained by any party covering the Program or any part thereof must include a provision providing for the free, perpetual and unrestricted commercial and noncommercial use by any third party. + +If, as a consequence of a court judgment or settlement relating to intellectual property infringement or any other cause of action, conditions are imposed on you that contradict the conditions of this License, such conditions do not excuse you from compliance with this License. If you cannot distribute the Program so as to simultaneously satisfy your obligations under this License and such other conditions, you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, you could not satisfy both the patent license and this License, and you would be required to refrain entirely from distribution of the Program. + +If you learn of a third party claim or other restriction relating to a Program you have already distributed you shall promptly redo your Program to address the issue and take all reasonable steps to inform those who may have received the Program at issue. An example of an appropriate reasonable step to inform would be posting an announcement on an appropriate web bulletin board. + +The provisions of this License are deemed to be severable, and the invalidity or unenforceability of any provision shall not affect or impair the remaining provisions which shall continue in full force and effect. In substitution for any provision held unlawful, there shall be substituted a provision of similar import reflecting the original intent of the parties hereto to the extent permissible under law. + +The Original Contributor from time to time may change this License, and the amended license will apply to all copies of the Program downloaded after the new license is posted. This License grants only the rights expressly stated herein and provides you with no implied rights or licenses to the intellectual property of any Contributor. + +This License is the complete and exclusive statement of the agreement between the parties concerning the subject matter hereof and may not be amended except by the written agreement of the parties. This License shall be governed by and construed in accordance with the laws of the State of Ohio and the United States of America, without regard to principles of conflicts of law. \ No newline at end of file diff --git a/options/license/ODbL-1.0 b/options/license/ODbL-1.0 new file mode 100644 index 0000000..2115ac0 --- /dev/null +++ b/options/license/ODbL-1.0 @@ -0,0 +1,243 @@ +ODC Open Database License (ODbL) + +Preamble + +The Open Database License (ODbL) is a license agreement intended to allow users to freely share, modify, and use this Database while maintaining this same freedom for others. Many databases are covered by copyright, and therefore this document licenses these rights. Some jurisdictions, mainly in the European Union, have specific rights that cover databases, and so the ODbL addresses these rights, too. Finally, the ODbL is also an agreement in contract for users of this Database to act in certain ways in return for accessing this Database. + +Databases can contain a wide variety of types of content (images, audiovisual material, and sounds all in the same database, for example), and so the ODbL only governs the rights over the Database, and not the contents of the Database individually. Licensors should use the ODbL together with another license for the contents, if the contents have a single set of rights that uniformly covers all of the contents. If the contents have multiple sets of different rights, Licensors should describe what rights govern what contents together in the individual record or in some other way that clarifies what rights apply. + +Sometimes the contents of a database, or the database itself, can be covered by other rights not addressed here (such as private contracts, trade mark over the name, or privacy rights / data protection rights over information in the contents), and so you are advised that you may have to consult other documents or clear other rights before doing activities not covered by this License. + +------ + +The Licensor (as defined below) + +and + +You (as defined below) + +agree as follows: + +1.0 Definitions of Capitalised Words + +"Collective Database" – Means this Database in unmodified form as part of a collection of independent databases in themselves that together are assembled into a collective whole. A work that constitutes a Collective Database will not be considered a Derivative Database. + +"Convey" – As a verb, means Using the Database, a Derivative Database, or the Database as part of a Collective Database in any way that enables a Person to make or receive copies of the Database or a Derivative Database. Conveying does not include interaction with a user through a computer network, or creating and Using a Produced Work, where no transfer of a copy of the Database or a Derivative Database occurs. "Contents" – The contents of this Database, which includes the information, independent works, or other material collected into the Database. For example, the contents of the Database could be factual data or works such as images, audiovisual material, text, or sounds. + +"Database" – A collection of material (the Contents) arranged in a systematic or methodical way and individually accessible by electronic or other means offered under the terms of this License. + +"Database Directive" – Means Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended or succeeded. + +"Database Right" – Means rights resulting from the Chapter III ("sui generis") rights in the Database Directive (as amended and as transposed by member states), which includes the Extraction and Re-utilisation of the whole or a Substantial part of the Contents, as well as any similar rights available in the relevant jurisdiction under Section 10.4. + +"Derivative Database" – Means a database based upon the Database, and includes any translation, adaptation, arrangement, modification, or any other alteration of the Database or of a Substantial part of the Contents. This includes, but is not limited to, Extracting or Re-utilising the whole or a Substantial part of the Contents in a new Database. + +"Extraction" – Means the permanent or temporary transfer of all or a Substantial part of the Contents to another medium by any means or in any form. + +"License" – Means this license agreement and is both a license of rights such as copyright and Database Rights and an agreement in contract. + +"Licensor" – Means the Person that offers the Database under the terms of this License. + +"Person" – Means a natural or legal person or a body of persons corporate or incorporate. + +"Produced Work" – a work (such as an image, audiovisual material, text, or sounds) resulting from using the whole or a Substantial part of the Contents (via a search or other query) from this Database, a Derivative Database, or this Database as part of a Collective Database. + +"Publicly" – means to Persons other than You or under Your control by either more than 50% ownership or by the power to direct their activities (such as contracting with an independent consultant). + +"Re-utilisation" – means any form of making available to the public all or a Substantial part of the Contents by the distribution of copies, by renting, by online or other forms of transmission. + +"Substantial" – Means substantial in terms of quantity or quality or a combination of both. The repeated and systematic Extraction or Re-utilisation of insubstantial parts of the Contents may amount to the Extraction or Re-utilisation of a Substantial part of the Contents. + +"Use" – As a verb, means doing any act that is restricted by copyright or Database Rights whether in the original medium or any other; and includes without limitation distributing, copying, publicly performing, publicly displaying, and preparing derivative works of the Database, as well as modifying the Database as may be technically necessary to use it in a different mode or format. + +"You" – Means a Person exercising rights under this License who has not previously violated the terms of this License with respect to the Database, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + +Words in the singular include the plural and vice versa. + +2.0 What this License covers + +2.1. Legal effect of this document. This License is: + + a. A license of applicable copyright and neighbouring rights; + + b. A license of the Database Right; and + + c. An agreement in contract between You and the Licensor. + +2.2 Legal rights covered. This License covers the legal rights in the Database, including: + + a. Copyright. Any copyright or neighbouring rights in the Database. The copyright licensed includes any individual elements of the Database, but does not cover the copyright over the Contents independent of this Database. See Section 2.4 for details. Copyright law varies between jurisdictions, but is likely to cover: the Database model or schema, which is the structure, arrangement, and organisation of the Database, and can also include the Database tables and table indexes; the data entry and output sheets; and the Field names of Contents stored in the Database; + + b. Database Rights. Database Rights only extend to the Extraction and Re-utilisation of the whole or a Substantial part of the Contents. Database Rights can apply even when there is no copyright over the Database. Database Rights can also apply when the Contents are removed from the Database and are selected and arranged in a way that would not infringe any applicable copyright; and + + c. Contract. This is an agreement between You and the Licensor for access to the Database. In return you agree to certain conditions of use on this access as outlined in this License. + +2.3 Rights not covered. + + a. This License does not apply to computer programs used in the making or operation of the Database; + + b. This License does not cover any patents over the Contents or the Database; and + + c. This License does not cover any trademarks associated with the Database. + +2.4 Relationship to Contents in the Database. The individual items of the Contents contained in this Database may be covered by other rights, including copyright, patent, data protection, privacy, or personality rights, and this License does not cover any rights (other than Database Rights or in contract) in individual Contents contained in the Database. For example, if used on a Database of images (the Contents), this License would not apply to copyright over individual images, which could have their own separate licenses, or one single license covering all of the rights over the images. + +3.0 Rights granted + +3.1 Subject to the terms and conditions of this License, the Licensor grants to You a worldwide, royalty-free, non-exclusive, terminable (but only under Section 9) license to Use the Database for the duration of any applicable copyright and Database Rights. These rights explicitly include commercial use, and do not exclude any field of endeavour. To the extent possible in the relevant jurisdiction, these rights may be exercised in all media and formats whether now known or created in the future. + +The rights granted cover, for example: + + a. Extraction and Re-utilisation of the whole or a Substantial part of the Contents; + + b. Creation of Derivative Databases; + + c. Creation of Collective Databases; + + d. Creation of temporary or permanent reproductions by any means and in any form, in whole or in part, including of any Derivative Databases or as a part of Collective Databases; and + + e. Distribution, communication, display, lending, making available, or performance to the public by any means and in any form, in whole or in part, including of any Derivative Database or as a part of Collective Databases. + +3.2 Compulsory license schemes. For the avoidance of doubt: + + a. Non-waivable compulsory license schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + + b. Waivable compulsory license schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + + c. Voluntary license schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + +3.3 The right to release the Database under different terms, or to stop distributing or making available the Database, is reserved. Note that this Database may be multiple-licensed, and so You may have the choice of using alternative licenses for this Database. Subject to Section 10.4, all other rights not expressly granted by Licensor are reserved. + +4.0 Conditions of Use + +4.1 The rights granted in Section 3 above are expressly made subject to Your complying with the following conditions of use. These are important conditions of this License, and if You fail to follow them, You will be in material breach of its terms. + +4.2 Notices. If You Publicly Convey this Database, any Derivative Database, or the Database as part of a Collective Database, then You must: + + a. Do so only under the terms of this License or another license permitted under Section 4.4; + + b. Include a copy of this License (or, as applicable, a license permitted under Section 4.4) or its Uniform Resource Identifier (URI) with the Database or Derivative Database, including both in the Database or Derivative Database and in any relevant documentation; and + + c. Keep intact any copyright or Database Right notices and notices that refer to this License. + + d. If it is not possible to put the required notices in a particular file due to its structure, then You must include the notices in a location (such as a relevant directory) where users would be likely to look for it. + +4.3 Notice for using output (Contents). Creating and Using a Produced Work does not require the notice in Section 4.2. However, if you Publicly Use a Produced Work, You must include a notice associated with the Produced Work reasonably calculated to make any Person that uses, views, accesses, interacts with, or is otherwise exposed to the Produced Work aware that Content was obtained from the Database, Derivative Database, or the Database as part of a Collective Database, and that it is available under this License. + + a. Example notice. The following text will satisfy notice under Section 4.3: + + Contains information from DATABASE NAME, which is made available here under the Open Database License (ODbL). + +DATABASE NAME should be replaced with the name of the Database and a hyperlink to the URI of the Database. "Open Database License" should contain a hyperlink to the URI of the text of this License. If hyperlinks are not possible, You should include the plain text of the required URI's with the above notice. 4.4 Share alike. + + a. Any Derivative Database that You Publicly Use must be only under the terms of: + + i. This License; + + ii. A later version of this License similar in spirit to this License; or + + iii. A compatible license. + + If You license the Derivative Database under one of the licenses mentioned in (iii), You must comply with the terms of that license. + + b. For the avoidance of doubt, Extraction or Re-utilisation of the whole or a Substantial part of the Contents into a new database is a Derivative Database and must comply with Section 4.4. + + c. Derivative Databases and Produced Works. A Derivative Database is Publicly Used and so must comply with Section 4.4. if a Produced Work created from the Derivative Database is Publicly Used. + + d. Share Alike and additional Contents. For the avoidance of doubt, You must not add Contents to Derivative Databases under Section 4.4 a that are incompatible with the rights granted under this License. + + e. Compatible licenses. Licensors may authorise a proxy to determine compatible licenses under Section 4.4 a iii. If they do so, the authorised proxy's public statement of acceptance of a compatible license grants You permission to use the compatible license. + +4.5 Limits of Share Alike. The requirements of Section 4.4 do not apply in the following: + + a. For the avoidance of doubt, You are not required to license Collective Databases under this License if You incorporate this Database or a Derivative Database in the collection, but this License still applies to this Database or a Derivative Database as a part of the Collective Database; + + b. Using this Database, a Derivative Database, or this Database as part of a Collective Database to create a Produced Work does not create a Derivative Database for purposes of Section 4.4; and + + c. Use of a Derivative Database internally within an organisation is not to the public and therefore does not fall under the requirements of Section 4.4. + +4.6 Access to Derivative Databases. If You Publicly Use a Derivative Database or a Produced Work from a Derivative Database, You must also offer to recipients of the Derivative Database or Produced Work a copy in a machine readable form of: + + a. The entire Derivative Database; or + + b. A file containing all of the alterations made to the Database or the method of making the alterations to the Database (such as an algorithm), including any additional Contents, that make up all the differences between the Database and the Derivative Database. + +The Derivative Database (under a.) or alteration file (under b.) must be available at no more than a reasonable production cost for physical distributions and free of charge if distributed over the internet. + +4.7 Technological measures and additional terms + + a. This License does not allow You to impose (except subject to Section 4.7 b.) any terms or any technological measures on the Database, a Derivative Database, or the whole or a Substantial part of the Contents that alter or restrict the terms of this License, or any rights granted under it, or have the effect or intent of restricting the ability of any person to exercise those rights. + + b. Parallel distribution. You may impose terms or technological measures on the Database, a Derivative Database, or the whole or a Substantial part of the Contents (a "Restricted Database") in contravention of Section 4.74 a. only if You also make a copy of the Database or a Derivative Database available to the recipient of the Restricted Database: + + i. That is available without additional fee; + + ii. That is available in a medium that does not alter or restrict the terms of this License, or any rights granted under it, or have the effect or intent of restricting the ability of any person to exercise those rights (an "Unrestricted Database"); and + + iii. The Unrestricted Database is at least as accessible to the recipient as a practical matter as the Restricted Database. + + c. For the avoidance of doubt, You may place this Database or a Derivative Database in an authenticated environment, behind a password, or within a similar access control scheme provided that You do not alter or restrict the terms of this License or any rights granted under it or have the effect or intent of restricting the ability of any person to exercise those rights. + +4.8 Licensing of others. You may not sublicense the Database. Each time You communicate the Database, the whole or Substantial part of the Contents, or any Derivative Database to anyone else in any way, the Licensor offers to the recipient a license to the Database on the same terms and conditions as this License. You are not responsible for enforcing compliance by third parties with this License, but You may enforce any rights that You have over a Derivative Database. You are solely responsible for any modifications of a Derivative Database made by You or another Person at Your direction. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. + +5.0 Moral rights + +5.1 Moral rights. This section covers moral rights, including any rights to be identified as the author of the Database or to object to treatment that would otherwise prejudice the author's honour and reputation, or any other derogatory treatment: + + a. For jurisdictions allowing waiver of moral rights, Licensor waives all moral rights that Licensor may have in the Database to the fullest extent possible by the law of the relevant jurisdiction under Section 10.4; + + b. If waiver of moral rights under Section 5.1 a in the relevant jurisdiction is not possible, Licensor agrees not to assert any moral rights over the Database and waives all claims in moral rights to the fullest extent possible by the law of the relevant jurisdiction under Section 10.4; and + + c. For jurisdictions not allowing waiver or an agreement not to assert moral rights under Section 5.1 a and b, the author may retain their moral rights over certain aspects of the Database. + +Please note that some jurisdictions do not allow for the waiver of moral rights, and so moral rights may still subsist over the Database in some jurisdictions. + +6.0 Fair dealing, Database exceptions, and other rights not affected + +6.1 This License does not affect any rights that You or anyone else may independently have under any applicable law to make any use of this Database, including without limitation: + + a. Exceptions to the Database Right including: Extraction of Contents from non-electronic Databases for private purposes, Extraction for purposes of illustration for teaching or scientific research, and Extraction or Re-utilisation for public security or an administrative or judicial procedure. + + b. Fair dealing, fair use, or any other legally recognised limitation or exception to infringement of copyright or other applicable laws. + +6.2 This License does not affect any rights of lawful users to Extract and Re-utilise insubstantial parts of the Contents, evaluated quantitatively or qualitatively, for any purposes whatsoever, including creating a Derivative Database (subject to other rights over the Contents, see Section 2.4). The repeated and systematic Extraction or Re-utilisation of insubstantial parts of the Contents may however amount to the Extraction or Re-utilisation of a Substantial part of the Contents. + +7.0 Warranties and Disclaimer + +7.1 The Database is licensed by the Licensor "as is" and without any warranty of any kind, either express, implied, or arising by statute, custom, course of dealing, or trade usage. Licensor specifically disclaims any and all implied warranties or conditions of title, non-infringement, accuracy or completeness, the presence or absence of errors, fitness for a particular purpose, merchantability, or otherwise. Some jurisdictions do not allow the exclusion of implied warranties, so this exclusion may not apply to You. + +8.0 Limitation of liability + +8.1 Subject to any liability that may not be excluded or limited by law, the Licensor is not liable for, and expressly excludes, all liability for loss or damage however and whenever caused to anyone by any use under this License, whether by You or by anyone else, and whether caused by any fault on the part of the Licensor or not. This exclusion of liability includes, but is not limited to, any special, incidental, consequential, punitive, or exemplary damages such as loss of revenue, data, anticipated profits, and lost business. This exclusion applies even if the Licensor has been advised of the possibility of such damages. + +8.2 If liability may not be excluded by law, it is limited to actual and direct financial loss to the extent it is caused by proved negligence on the part of the Licensor. + +9.0 Termination of Your rights under this License + +9.1 Any breach by You of the terms and conditions of this License automatically terminates this License with immediate effect and without notice to You. For the avoidance of doubt, Persons who have received the Database, the whole or a Substantial part of the Contents, Derivative Databases, or the Database as part of a Collective Database from You under this License will not have their licenses terminated provided their use is in full compliance with this License or a license granted under Section 4.8 of this License. Sections 1, 2, 7, 8, 9 and 10 will survive any termination of this License. + +9.2 If You are not in breach of the terms of this License, the Licensor will not terminate Your rights under it. + +9.3 Unless terminated under Section 9.1, this License is granted to You for the duration of applicable rights in the Database. + +9.4 Reinstatement of rights. If you cease any breach of the terms and conditions of this License, then your full rights under this License will be reinstated: + + a. Provisionally and subject to permanent termination until the 60th day after cessation of breach; + + b. Permanently on the 60th day after cessation of breach unless otherwise reasonably notified by the Licensor; or + + c. Permanently if reasonably notified by the Licensor of the violation, this is the first time You have received notice of violation of this License from the Licensor, and You cure the violation prior to 30 days after your receipt of the notice. + +Persons subject to permanent termination of rights are not eligible to be a recipient and receive a license under Section 4.8. + +9.5 Notwithstanding the above, Licensor reserves the right to release the Database under different license terms or to stop distributing or making available the Database. Releasing the Database under different license terms or stopping the distribution of the Database will not withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +10.0 General + +10.1 If any provision of this License is held to be invalid or unenforceable, that must not affect the validity or enforceability of the remainder of the terms and conditions of this License and each remaining provision of this License shall be valid and enforced to the fullest extent permitted by law. + +10.2 This License is the entire agreement between the parties with respect to the rights granted here over the Database. It replaces any earlier understandings, agreements or representations with respect to the Database. + +10.3 If You are in breach of the terms of this License, You will not be entitled to rely on the terms of this License or to complain of any breach by the Licensor. + +10.4 Choice of law. This License takes effect in and will be governed by the laws of the relevant jurisdiction in which the License terms are sought to be enforced. If the standard suite of rights granted under applicable copyright law and Database Rights in the relevant jurisdiction includes additional rights not granted under this License, these additional rights are granted in this License in order to meet the terms of this License. \ No newline at end of file diff --git a/options/license/OFL-1.0 b/options/license/OFL-1.0 new file mode 100644 index 0000000..95894a2 --- /dev/null +++ b/options/license/OFL-1.0 @@ -0,0 +1,49 @@ +SIL OPEN FONT LICENSE + +Version 1.0 - 22 November 2005 + +PREAMBLE + +The goals of the Open Font License (OFL) are to stimulate worldwide development of cooperative font projects, to support the font creation efforts of academic and linguistic communities, and to provide an open framework in which fonts may be shared and improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and sold with any software provided that the font names of derivative works are changed. The fonts and derivatives, however, cannot be released under any other type of license. + +DEFINITIONS + +"Font Software" refers to any and all of the following: + + - font files + - data files + - source code + - build scripts + - documentation + +"Reserved Font Name" refers to the Font Software name as seen by users and any other names as specified after the copyright statement. + +"Standard Version" refers to the collection of Font Software components as distributed by the Copyright Holder. + +"Modified Version" refers to any derivative font software made by adding to, deleting, or substituting — in part or in whole -- any of the components of the Standard Version, by changing formats or by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS + +Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, in Standard or Modified Versions, may be sold by itself. + +2) Standard or Modified Versions of the Font Software may be bundled, redistributed and sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font Name(s), in part or in whole, unless explicit written permission is granted by the Copyright Holder. This restriction applies to all references stored in the Font Software, such as the font menu name and other font description fields, which are used to differentiate the font from others. + +4) The name(s) of the Copyright Holder or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder and the Author(s) or with their explicit written permission. + +5) The Font Software, modified or unmodified, in part or in whole, must be distributed using this license, and may not be distributed under any other license. + +TERMINATION + +This license becomes null and void if any of the above conditions are not met. + +DISCLAIMER + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/options/license/OFL-1.1 b/options/license/OFL-1.1 new file mode 100644 index 0000000..181934d --- /dev/null +++ b/options/license/OFL-1.1 @@ -0,0 +1,43 @@ +SIL OPEN FONT LICENSE + +Version 1.1 - 26 February 2007 + +PREAMBLE + +The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. + +DEFINITIONS + +"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the copyright statement(s). + +"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, or substituting — in part or in whole — any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS + +Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. + +5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. + +TERMINATION + +This license becomes null and void if any of the above conditions are not met. + +DISCLAIMER + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/options/license/OGTSL b/options/license/OGTSL new file mode 100644 index 0000000..f00ec00 --- /dev/null +++ b/options/license/OGTSL @@ -0,0 +1,55 @@ +The Open Group Test Suite License + +Preamble + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Testing is essential for proper development and maintenance of standards-based products. + +For buyers: adequate conformance testing leads to reduced integration costs and protection of investments in applications, software and people. + +For software developers: conformance testing of platforms and middleware greatly reduces the cost of developing and maintaining multi-platform application software. + +For suppliers: In-depth testing increases customer satisfaction and keeps development and support costs in check. API conformance is highly measurable and suppliers who claim it must be able to substantiate that claim. + +As such, since these are benchmark measures of conformance, we feel the integrity of test tools is of importance. In order to preserve the integrity of the existing conformance modes of this test package and to permit recipients of modified versions of this package to run the original test modes, this license requires that the original test modes be preserved. + +If you find a bug in one of the standards mode test cases, please let us know so we can feed this back into the original, and also raise any specification issues with the appropriate bodies (for example the POSIX committees). + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least the following: + + rename any non-standard executables and testcases so the names do not conflict with standard executables and testcases, which must also be provided, and provide a separate manual page for each non-standard executable and testcase that clearly documents how it differs from the Standard Version. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least the following: + + accompany any non-standard executables and testcases with their corresponding Standard Version executables and testcases, giving the non-standard executables and testcases non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + +5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. + +7.Subroutines supplied by you and linked into this Package shall not be considered part of this Package. + +8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End \ No newline at end of file diff --git a/options/license/OLDAP-1.1 b/options/license/OLDAP-1.1 new file mode 100644 index 0000000..d558ec4 --- /dev/null +++ b/options/license/OLDAP-1.1 @@ -0,0 +1,61 @@ +The OpenLDAP Public License +Version 1.1, 25 August 1998 + +Copyright 1998, The OpenLDAP Foundation. All Rights Reserved. + +Note: This license is derived from the "Artistic License" as distributed with the Perl Programming Language. Its terms are different from those of the "Artistic License." + +PREAMBLE + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. + + b) accompany the distribution with the machine-readable source of the Package with your modifications. + + c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. + +7. C subroutines supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. + +8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End + diff --git a/options/license/OLDAP-1.2 b/options/license/OLDAP-1.2 new file mode 100644 index 0000000..7b34a76 --- /dev/null +++ b/options/license/OLDAP-1.2 @@ -0,0 +1,61 @@ +The OpenLDAP Public License +Version 1.2, 1 September 1998 + +Copyright 1998, The OpenLDAP Foundation. All Rights Reserved. + +Note: This license is derived from the "Artistic License" as distributed with the Perl Programming Language. As differences may exist, the complete license should be read. + +PREAMBLE + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. + + b) accompany the distribution with the machine-readable source of the Package with your modifications. + + c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. + +7. C subroutines supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. + +8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End + diff --git a/options/license/OLDAP-1.3 b/options/license/OLDAP-1.3 new file mode 100644 index 0000000..df43e18 --- /dev/null +++ b/options/license/OLDAP-1.3 @@ -0,0 +1,63 @@ +The OpenLDAP Public License +Version 1.3, 17 January 1999 + +Copyright 1998-1999, The OpenLDAP Foundation. All Rights Reserved. + +Note: This license is derived from the "Artistic License" as distributed with the Perl Programming Language. As significant differences exist, the complete license should be read. + +PREAMBLE + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. + + b) accompany the distribution with the machine-readable source of the Package with your modifications. + + c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. + +7. C subroutines supplied by you and linked into this Package in order to emulate subroutines and variables defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the behavior of the Package in any way that would cause it to fail the regression tests for the Package. + +8. Software supplied by you and linked with this Package in order to use subroutines and variables defined by this Package shall not be considered part of this Package and do not automatically fall under the copyright of this Package, and the executables produced by linking your software with this Package may be used and redistributed without restriction and may be sold commercially. + +9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End + diff --git a/options/license/OLDAP-1.4 b/options/license/OLDAP-1.4 new file mode 100644 index 0000000..0b2652a --- /dev/null +++ b/options/license/OLDAP-1.4 @@ -0,0 +1,63 @@ +The OpenLDAP Public License +Version 1.4, 18 January 1999 + +Copyright 1998-1999, The OpenLDAP Foundation. All Rights Reserved. + +Note: This license is derived from the "Artistic License" as distributed with the Perl Programming Language. As significant differences exist, the complete license should be read. + +PREAMBLE + +The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. + +Definitions: + + "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. + + "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. + + "Copyright Holder" is whoever is named in the copyright or copyrights for the package. + + "You" is you, if you're thinking about copying or distributing this Package. + + "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) + + "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. + +1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. + +3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. + + b) use the modified Package only within your corporation or organization. + + c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. + + b) accompany the distribution with the machine-readable source of the Package with your modifications. + + c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + +5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. + +6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. + +7. C subroutines supplied by you and linked into this Package in order to emulate subroutines and variables defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the behavior of the Package in any way that would cause it to fail the regression tests for the Package. + +8. Software supplied by you and linked with this Package in order to use subroutines and variables defined by this Package shall not be considered part of this Package and do not automatically fall under the copyright of this Package. Executables produced by linking your software with this Package may be used and redistributed without restriction and may be sold commercially so long as the primary function of your software is different than the package itself. + +9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. + +10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +The End + diff --git a/options/license/OLDAP-2.0 b/options/license/OLDAP-2.0 new file mode 100644 index 0000000..57efcc9 --- /dev/null +++ b/options/license/OLDAP-2.0 @@ -0,0 +1,19 @@ +The OpenLDAP Public License +Version 2.0, 7 June 1999 + +Copyright 1999, The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices. Redistributions must also contain a copy of this document. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The name "OpenLDAP" must not be used to endorse or promote products derived from this Software without prior written permission of the OpenLDAP Foundation. For written permission, please contact foundation@openldap.org. + +4. Products derived from this Software may not be called "OpenLDAP" nor may "OpenLDAP" appear in their names without prior written permission of the OpenLDAP Foundation. OpenLDAP is a registered trademark of the OpenLDAP Foundation. + +5. Due credit should be given to the OpenLDAP Project (http://www.openldap.org/). + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENLDAP FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/options/license/OLDAP-2.0.1 b/options/license/OLDAP-2.0.1 new file mode 100644 index 0000000..681d4c5 --- /dev/null +++ b/options/license/OLDAP-2.0.1 @@ -0,0 +1,19 @@ +The OpenLDAP Public License +Version 2.0.1, 21 December 1999 + +Copyright 1999, The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices. Redistributions must also contain a copy of this document. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The name "OpenLDAP" must not be used to endorse or promote products derived from this Software without prior written permission of the OpenLDAP Foundation. For written permission, please contact foundation@openldap.org. + +4. Products derived from this Software may not be called "OpenLDAP" nor may "OpenLDAP" appear in their names without prior written permission of the OpenLDAP Foundation. OpenLDAP is a trademark of the OpenLDAP Foundation. + +5. Due credit should be given to the OpenLDAP Project (http://www.openldap.org/). + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENLDAP FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/options/license/OLDAP-2.1 b/options/license/OLDAP-2.1 new file mode 100644 index 0000000..f6b7567 --- /dev/null +++ b/options/license/OLDAP-2.1 @@ -0,0 +1,21 @@ +The OpenLDAP Public License +Version 2.1, 29 February 2000 + +Copyright 1999-2000, The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices. Redistributions must also contain a copy of this document. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The name "OpenLDAP" must not be used to endorse or promote products derived from this Software without prior written permission of the OpenLDAP Foundation. For written permission, please contact foundation@openldap.org. + +4. Products derived from this Software may not be called "OpenLDAP" nor may "OpenLDAP" appear in their names without prior written permission of the OpenLDAP Foundation. OpenLDAP is a trademark of the OpenLDAP Foundation. + +5. Due credit should be given to the OpenLDAP Project (http://www.openldap.org/). + +6. The OpenLDAP Foundation may revise this license from time to time. Each revision is distinguished by a version number. You may use the Software under terms of this license revision or under the terms of any subsequent license revision. + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENLDAP FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/options/license/OLDAP-2.2 b/options/license/OLDAP-2.2 new file mode 100644 index 0000000..df28ba2 --- /dev/null +++ b/options/license/OLDAP-2.2 @@ -0,0 +1,23 @@ +The OpenLDAP Public License +Version 2.2, 1 March 2000 + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices. Redistributions must also contain a copy of this document. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The name "OpenLDAP" must not be used to endorse or promote products derived from this Software without prior written permission of the OpenLDAP Foundation. + +4. Products derived from this Software may not be called "OpenLDAP" nor may "OpenLDAP" appear in their names without prior written permission of the OpenLDAP Foundation. + +5. Due credit should be given to the OpenLDAP Project (http://www.openldap.org/). + +6. The OpenLDAP Foundation may revise this license from time to time. Each revision is distinguished by a version number. You may use the Software under terms of this license revision or under the terms of any subsequent the license. + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENLDAP FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +OpenLDAP is a trademark of the OpenLDAP Foundation. + +Copyright 1999-2000, The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. Permission to copy and distributed verbatim copies of this document is granted. + diff --git a/options/license/OLDAP-2.2.1 b/options/license/OLDAP-2.2.1 new file mode 100644 index 0000000..a83adf3 --- /dev/null +++ b/options/license/OLDAP-2.2.1 @@ -0,0 +1,23 @@ +The OpenLDAP Public License +Version 2.2.1, 1 March 2000 + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices. Redistributions must also contain a copy of this document. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The name "OpenLDAP" must not be used to endorse or promote products derived from this Software without prior written permission of the OpenLDAP Foundation. + +4. Products derived from this Software may not be called "OpenLDAP" nor may "OpenLDAP" appear in their names without prior written permission of the OpenLDAP Foundation. + +5. Due credit should be given to the OpenLDAP Project (http://www.openldap.org/). + +6. The OpenLDAP Foundation may revise this license from time to time. Each revision is distinguished by a version number. You may use the Software under terms of this license revision or under the terms of any subsequent revision of the license. + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENLDAP FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +OpenLDAP is a trademark of the OpenLDAP Foundation. + +Copyright 1999-2000 The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. Permission to copy and distributed verbatim copies of this document is granted. + diff --git a/options/license/OLDAP-2.2.2 b/options/license/OLDAP-2.2.2 new file mode 100644 index 0000000..2a9a8da --- /dev/null +++ b/options/license/OLDAP-2.2.2 @@ -0,0 +1,25 @@ +The OpenLDAP Public License +Version 2.2.2, 28 July 2000 + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices. + +2. Redistributions in binary form must reproduce applicable copyright statements and notices, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Redistributions must contain a verbatim copy of this document. + +4. The name "OpenLDAP" must not be used to endorse or promote products derived from this Software without prior written permission of the OpenLDAP Foundation. + +5. Products derived from this Software may not be called "OpenLDAP" nor may "OpenLDAP" appear in their names without prior written permission of the OpenLDAP Foundation. + +6. Due credit should be given to the OpenLDAP Project (http://www.openldap.org/). + +7. The OpenLDAP Foundation may revise this license from time to time. Each revision is distinguished by a version number. You may use the Software under terms of this license revision or under the terms of any subsequent revision of the license. + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENLDAP FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +OpenLDAP is a trademark of the OpenLDAP Foundation. + +Copyright 1999-2000 The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. Permission to copy and distributed verbatim copies of this document is granted. + diff --git a/options/license/OLDAP-2.3 b/options/license/OLDAP-2.3 new file mode 100644 index 0000000..1a95dff --- /dev/null +++ b/options/license/OLDAP-2.3 @@ -0,0 +1,25 @@ +The OpenLDAP Public License +Version 2.3, 28 July 2000 + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices. + +2. Redistributions in binary form must reproduce applicable copyright statements and notices, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Redistributions must contain a verbatim copy of this document. + +4. The name "OpenLDAP" must not be used to endorse or promote products derived from this Software without prior written permission of the OpenLDAP Foundation. + +5. Products derived from this Software may not be called "OpenLDAP" nor may "OpenLDAP" appear in their names without prior written permission of the OpenLDAP Foundation. + +6. Due credit should be given to the OpenLDAP Project (http://www.openldap.org/). + +7. The OpenLDAP Foundation may revise this license from time to time. Each revision is distinguished by a version number. You may use the Software under terms of this license revision or under the terms of any subsequent revision of the license. + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENLDAP FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +OpenLDAP is a trademark of the OpenLDAP Foundation. + +Copyright 1999-2000 The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. Permission to copy and distributed verbatim copies of this document is granted. + diff --git a/options/license/OLDAP-2.4 b/options/license/OLDAP-2.4 new file mode 100644 index 0000000..bd67198 --- /dev/null +++ b/options/license/OLDAP-2.4 @@ -0,0 +1,23 @@ +The OpenLDAP Public License +Version 2.4, 8 December 2000 + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices. + +2. Redistributions in binary form must reproduce applicable copyright statements and notices, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Redistributions must contain a verbatim copy of this document. + +4. The names and trademarks of the authors and copyright holders must not be used in advertising or otherwise to promote the sale, use or other dealing in this Software without specific, written prior permission. + +5. Due credit should be given to the OpenLDAP Project. + +6. The OpenLDAP Foundation may revise this license from time to time. Each revision is distinguished by a version number. You may use the Software under terms of this license revision or under the terms of any subsequent revision of the license. + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENLDAP FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +OpenLDAP is a trademark of the OpenLDAP Foundation. + +Copyright 1999-2000 The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. Permission to copy and distributed verbatim copies of this document is granted. + diff --git a/options/license/OLDAP-2.7 b/options/license/OLDAP-2.7 new file mode 100644 index 0000000..d9d6c39 --- /dev/null +++ b/options/license/OLDAP-2.7 @@ -0,0 +1,20 @@ +The OpenLDAP Public License +Version 2.7, 7 September 2001 + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices, + +2. Redistributions in binary form must reproduce applicable copyright statements and notices, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution, and + +3. Redistributions must contain a verbatim copy of this document. + +The OpenLDAP Foundation may revise this license from time to time. Each revision is distinguished by a version number. You may use this Software under terms of this license revision or under the terms of any subsequent revision of the license. + +THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENLDAP FOUNDATION, ITS CONTRIBUTORS, OR THE AUTHOR(S) OR OWNER(S) OF THE SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The names of the authors and copyright holders must not be used in advertising or otherwise to promote the sale, use or other dealing in this Software without specific, written prior permission. Title to copyright in this Software shall at all times remain with copyright holders. + +OpenLDAP is a registered trademark of the OpenLDAP Foundation. + +Copyright 1999-2001 The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. Permission to copy and distribute verbatim copies of this document is granted. \ No newline at end of file diff --git a/options/license/OML b/options/license/OML new file mode 100644 index 0000000..526df0d --- /dev/null +++ b/options/license/OML @@ -0,0 +1,5 @@ +This FastCGI application library source and object code (the "Software") and its documentation (the "Documentation") are copyrighted by Open Market, Inc ("Open Market"). The following terms apply to all files associated with the Software and Documentation unless explicitly disclaimed in individual files. + +Open Market permits you to use, copy, modify, distribute, and license this Software and the Documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this Software and Documentation may be copyrighted by their authors and need not follow the licensing terms described here. If modifications to this Software and Documentation have new licensing terms, the new terms must be clearly indicated on the first page of each file where they apply. + +OPEN MARKET MAKES NO EXPRESS OR IMPLIED WARRANTY WITH RESPECT TO THE SOFTWARE OR THE DOCUMENTATION, INCLUDING WITHOUT LIMITATION ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL OPEN MARKET BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY DAMAGES ARISING FROM OR RELATING TO THIS SOFTWARE OR THE DOCUMENTATION, INCLUDING, WITHOUT LIMITATION, ANY INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR SIMILAR DAMAGES, INCLUDING LOST PROFITS OR LOST DATA, EVEN IF OPEN MARKET HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS". OPEN MARKET HAS NO LIABILITY IN CONTRACT, TORT, NEGLIGENCE OR OTHERWISE ARISING OUT OF THIS SOFTWARE OR THE DOCUMENTATION. \ No newline at end of file diff --git a/options/license/OPL-1.0 b/options/license/OPL-1.0 new file mode 100644 index 0000000..3f5a6b9 --- /dev/null +++ b/options/license/OPL-1.0 @@ -0,0 +1,136 @@ +OPEN PUBLIC LICENSE +Version 1.0 + +1. Definitions. + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work, which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document and the corresponding addendum described in section 6.4 below. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + + 1.13 "License Author" means Lutris Technologies, Inc. + +2. Source Code License. + + 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a worldwide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``offer to sell and import'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + + 2.2. Contributor Grant. Each Contributor hereby grants You a worldwide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Contributor, to to make, have made, use and sell (``offer to sell and import'') the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations + +3. Distribution Obligations. + + 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available, prior to any use, except for internal development and practice, in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You shall notify the Initial Developer of the Modification and the location of the Source Code via the contact means provided for in the Developer Specific license. Initial Developer will be acting as maintainer of the Source Code and may provide an Electronic Distribution mechanism for the Modification to be made available. + + 3.3. Description of Modifications. You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + + (a) Third Party Claims. If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. If you distribute executable versions containing Covered Code, you must reproduce the notice in Exhibit B in the documentation and/or other materials provided with the product. + + 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) Cite all of the statutes or regulations that prohibit you from complying fully with this license. (c) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. License Author may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number and shall be submitted to opensource.org for certification. + + 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Initial Developer. No one other than Initial Developer has the right to modify the terms applicable to Covered Code created under this License. + + 6.3. Derivative Works. If you create or use a modified version of this License, except in association with the required Developer Specific License described in section 6.4, (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases ``Open'', ``OpenPL'', ``OPL'' or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Open Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 6.4. Required Additional Developer Specific License +This license is a union of the following two parts that should be found as text files in the same place (directory), in the order of preeminence: + + [1] A Developer specific license. + + [2] The contents of this file OPL_1_0.TXT, stating the general licensing policy of the software. + +In case of conflicting dispositions in the parts of this license, the terms of the lower-numbered part will always be superseded by the terms of the higher numbered part. + +7. DISCLAIMER OF WARRANTY. + +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1 Termination upon Breach +This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code, which are properly granted, shall survive any termination of this License. Provisions that, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2. Termination Upon Litigation. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + +The Covered Code is a ``commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and ``commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS. + + his section was intentionally left blank. The contents of this section are found in the corresponding addendum described above. + +12. RESPONSIBILITY FOR CLAIMS. + +Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute with Initial Developer responsibility on an equitable basis. + +EXHIBIT A. + +Text for this Exhibit A is found in the corresponding addendum, described in section 6.4 above, text file provided by the Initial Developer. This license is not valid or complete with out that file. + +EXHIBIT B. + +Text for this Exhibit B is found in the corresponding addendum, described in section 6.4 above, text file provided by the Initial Developer. This license is not valid or complete with out that file. \ No newline at end of file diff --git a/options/license/OSET-PL-2.1 b/options/license/OSET-PL-2.1 new file mode 100644 index 0000000..2511089 --- /dev/null +++ b/options/license/OSET-PL-2.1 @@ -0,0 +1,138 @@ +OSET Public License
 +(c) 2015 ALL RIGHTS RESERVED VERSION 2.1 + +THIS LICENSE DEFINES THE RIGHTS OF USE, REPRODUCTION, DISTRIBUTION, MODIFICATION, AND REDISTRIBUTION OF CERTAIN COVERED SOFTWARE (AS DEFINED BELOW) ORIGINALLY RELEASED BY THE OPEN SOURCE ELECTION TECHNOLOGY FOUNDATION (FORMERLY “THE OSDV FOUNDATION”). ANYONE WHO USES, REPRODUCES, DISTRIBUTES, MODIFIES, OR REDISTRIBUTES THE COVERED SOFTWARE, OR ANY PART THEREOF, IS BY THAT ACTION, ACCEPTING IN FULL THE TERMS CONTAINED IN THIS AGREEMENT. IF YOU DO NOT AGREE TO SUCH TERMS, YOU ARE NOT PERMITTED TO USE THE COVERED SOFTWARE. + +This license was prepared based on the Mozilla Public License (“MPL”), version 2.0. For annotation of the differences between this license and MPL 2.0, please see the OSET Foundation web site at www.OSETFoundation.org/public-license. + +The text of the license begins here: + +1. Definitions + + 1.1 “Contributor” means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. + + 1.2 “Contributor Version” means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor’s Contribution. + + 1.3 “Contribution” means Covered Software of a particular Contributor. + + 1.4 “Covered Software” means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. + + 1.5 “Incompatible With Secondary Licenses” means:
 + a. That the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or
 b. that the Covered Software was made available under the terms of version 1.x or earlier of the License, but not also under the terms of a Secondary License. + + 1.6 “Executable Form” means any form of the work other than Source Code Form. + + 1.7 “Larger Work” means a work that combines Covered Software with other material, in a separate file (or files) that is not Covered Software. + + 1.8 “License” means this document. + + 1.9 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. + + 1.10 “Modifications” means any of the following:
 + a. any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or
 b. any new file in Source Code Form that contains any Covered Software. + + 1.11 “Patent Claims” of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. + + 1.12 “Secondary License” means one of: the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. + + 1.13 “Source Code Form” means the form of the work preferred for making modifications. + + 1.14 “You” (or “Your”) means an individual or a legal entity exercising rights under this License. For legal entities, “You” includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means: (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. License Grants and Conditions + + 2.1 Grants
Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:

 a. under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and
 b. under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. + + 2.2 Effective Date + The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. + + 2.3 Limitations on Grant Scope + The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor:

 a. for any code that a Contributor has removed from Covered Software; or
 b. for infringements caused by: (i) Your and any other third party’s modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or
 c. under Patent Claims infringed by Covered Software in the absence of its Contributions.

 This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). + + 2.4 Subsequent Licenses
 No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). + + 2.5 Representation
 Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. + + 2.6 Fair Use
 This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. + + 2.7 Conditions
 Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. + +3. Responsibilities + + 3.1 Distribution of Source Form
 All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You must cause any of Your Modifications to carry prominent notices stating that You changed the files. You may not attempt to alter or restrict the recipients’ rights in the Source Code Form. + + 3.2 Distribution of Executable Form
 If You distribute Covered Software in Executable Form then:
 + + a. such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and
 b. You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients’ rights in the Source Code Form under this License. + + 3.3 Distribution of a Larger Work
 You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). + + 3.4 Notices
 You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. + + 3.5 Application of Additional Terms + + 3.5.1 You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. + + 3.5.2 You may place additional conditions upon the rights granted in this License to the extent necessary due to statute, judicial order, regulation (including without limitation state and federal procurement regulation), national security, or public interest. Any such additional conditions must be clearly described in the notice provisions required under Section 3.4. Any alteration of the terms of this License will apply to all copies of the Covered Software distributed by You or by any downstream recipients that receive the Covered Software from You. + +4. Inability to Comply Due to Statute or Regulation +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation, then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the notices required under Section 3.4. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Termination + + 5.1 Failure to Comply
 The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60-days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30-days after Your receipt of the notice. + + 5.2 Patent Infringement Claims
 If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. + + 5.3 Additional Compliance Terms
 Notwithstanding the foregoing in this Section 5, for purposes of this Section, if You breach Section 3.1 (Distribution of Source Form), Section 3.2 (Distribution of Executable Form), Section 3.3 (Distribution of a Larger Work), or Section 3.4 (Notices), then becoming compliant as described in Section 5.1 must also include, no later than 30 days after receipt by You of notice of such violation by a Contributor, making the Covered Software available in Source Code Form as required by this License on a publicly available computer network for a period of no less than three (3) years. + + 5.4 Contributor Remedies
 If You fail to comply with the terms of this License and do not thereafter become
compliant in accordance with Section 5.1 and, if applicable, Section 5.3, then each Contributor reserves its right, in addition to any other rights it may have in law or in equity, to bring an action seeking injunctive relief, or damages for willful copyright or patent infringement (including without limitation damages for unjust enrichment, where available under law), for all actions in violation of rights that would otherwise have been granted under the terms of this License. + + 5.5 End User License Agreements
 In the event of termination under this Section 5, all end user license agreements
(excluding distributors and resellers), which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. + +6. Disclaimer of Warranty +Covered Software is provided under this License on an “as is” basis, without warranty of any kind, either expressed, implied, or statutory, including, without limitation, warranties that the Covered Software is free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the Covered Software is with You. Should any Covered Software prove defective in any respect, You (not any Contributor) assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty constitutes an
essential part of this License. No use of any Covered Software is authorized under this License except under this disclaimer. + +7. Limitation of Liability +Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as permitted above, be liable to You for any direct, indirect, special, incidental, or consequential damages of any character including, without limitation, damages for lost profits, loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages. This limitation of liability shall not apply to liability for death or personal injury resulting from such party’s negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation +Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party’s ability to bring cross-claims or counter-claims. + +9. Government Terms + + 9.1 Commercial Item
 The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. + + 9.2 No Sovereign Immunity
 The U.S. federal government and states that use or distribute Covered Software hereby waive their sovereign immunity with respect to enforcement of the provisions of this License. + + 9.3 Choice of Law and Venue + + 9.3.1 If You are a government of a state of the United States, or Your use of the Covered Software is pursuant to a procurement contract with such a state government, this License shall be governed by the law of such state, excluding its conflict-of-law provisions, and the adjudication of disputes relating to this License will be subject to the exclusive jurisdiction of the state and federal courts located in such state. + 9.3.2 If You are an agency of the United States federal government, or Your use of the Covered Software is pursuant to a procurement contract with such an agency, this License shall be governed by federal law for all purposes, and the adjudication of disputes relating to this License will be subject to the exclusive jurisdiction of the federal courts located in Washington,
D.C. + 9.3.3 You may alter the terms of this Section 9.3 for this License as described in Section 3.5.2. + + 9.4 Supremacy
 This Section 9 is in lieu of, and supersedes, any other Federal Acquisition Regulation, Defense Federal Acquisition Regulation, or other clause or provision that addresses government rights in computer software under this License. + +10. Miscellaneous
 +This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation, which provides that the language of a contract shall be construed against the drafter, shall not be used to construe this License against a Contributor. + +11. Versions of the License + + 11.1 New Versions
The Open Source Election Technology Foundation (“OSET”) (formerly known as the Open Source Digital Voting Foundation) is the steward of this License. Except as provided in Section 11.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. + + 11.2 Effects of New Versions
You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. + + 11.3 Modified Versions
If You create software not governed by this License, and You want to create a new license for such software, You may create and use a modified version of this License if You rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). + + 11.4 Distributing Source Code Form That is Incompatible With Secondary Licenses
If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. + +EXHIBIT A – Source Code Form License Notice + +This Source Code Form is subject to the terms of the OSET Public License, v.2.1
(“OSET-PL-2.1”). If a copy of the OPL was not distributed with this file, You can obtain one at:
www.OSETFoundation.org/public-license. + +If it is not possible or desirable to put the Notice in a particular file, then You may include the Notice in a location (e.g., such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. + +EXHIBIT B - “Incompatible With Secondary License” Notice + +This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the
OSET Public License, v.2.1. + diff --git a/options/license/OSL-1.0 b/options/license/OSL-1.0 new file mode 100644 index 0000000..739b6e0 --- /dev/null +++ b/options/license/OSL-1.0 @@ -0,0 +1,45 @@ +The Open Software License v. 1.0 + +This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: + + "Licensed under the Open Software License version 1.0" + +License Terms + +1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, non-sublicenseable license to do the following: + + a) to reproduce the Original Work in copies; + + b) to prepare derivative works ("Derivative Works") based upon the Original Work; + + c) to distribute copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute shall be licensed under the Open Software License; + + d) to perform the Original Work publicly; and + + e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, non-sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor ("Licensed Claims") to make, use, sell and offer for sale the Original Work. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, non-sublicenseable license under the Licensed Claims to make, use, sell and offer for sale Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to access and modify the Original Work. Licensor hereby agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work, and by publishing the address of that information repository in a notice immediately following the copyright notice that applies to the Original Work. + +4) Exclusions From License Grant. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the Licensed Claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license. + +5) External Deployment. The term "External Deployment" means the use or distribution of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be accessed or used by anyone other than You, whether the Original Work or Derivative Works are distributed to those persons, made available as an application intended for use over a computer network, or used to provide services or otherwise deliver content to anyone other than You. As an express condition for the grants of license hereunder, You agree that any External Deployment by You shall be deemed a distribution and shall be licensed to all under the terms of this License, as prescribed in section 1(c) herein. + +6) Warranty and Disclaimer of Warranty. LICENSOR WARRANTS THAT THE COPYRIGHT IN AND TO THE ORIGINAL WORK IS OWNED BY THE LICENSOR OR THAT THE ORIGINAL WORK IS DISTRIBUTED BY LICENSOR UNDER A VALID CURRENT LICENSE FROM THE COPYRIGHT OWNER. EXCEPT AS EXPRESSLY STATED IN THE IMMEDIATELY PRECEEDING SENTENCE, THE ORIGINAL WORK IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE WARRANTY OF NON-INFRINGEMENT AND WARRANTIES THAT THE ORIGINAL WORK IS MERCHANTABLE OR FIT FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO LICENSE TO ORIGINAL WORK IS GRANTED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +7) Limitation of Liability. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE LICENSOR BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING AS A RESULT OF THIS LICENSE OR THE USE OF THE ORIGINAL WORK INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PERSON SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +8) Acceptance and Termination. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Sections 1 and 2 herein, You indicate Your acceptance of this License and all of its terms and conditions. This license shall terminate immediately and you may no longer exercise any of the rights granted to You by this License upon Your failure to honor the proviso in Section 1(c) herein. + +9) Mutual Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License if You file a lawsuit in any court alleging that any OSI Certified open source software that is licensed under any license containing this "Mutual Termination for Patent Action" clause infringes any patent claims that are essential to use that software. + +10) Jurisdiction, Venue and Governing Law. You agree that any lawsuit arising under or relating to this License shall be maintained in the courts of the jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. + +11) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + +12) Miscellaneous. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + +13) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +This license is Copyright (C) 2002 Lawrence E. Rosen. All rights reserved. Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. \ No newline at end of file diff --git a/options/license/OSL-1.1 b/options/license/OSL-1.1 new file mode 100644 index 0000000..9fbc30f --- /dev/null +++ b/options/license/OSL-1.1 @@ -0,0 +1,47 @@ +The Open Software License v. 1.1 + +This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: + + Licensed under the Open Software License version 1.1 + +1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, non-sublicenseable license to do the following: + + a) to reproduce the Original Work in copies; + + b) to prepare derivative works ("Derivative Works") based upon the Original Work; + + c) to distribute copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute shall be licensed under the Open Software License; + + d) to perform the Original Work publicly; and + + e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, non-sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor ("Licensed Claims") to make, use, sell and offer for sale the Original Work. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, non-sublicenseable license under the Licensed Claims to make, use, sell and offer for sale Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor hereby agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work, and by publishing the address of that information repository in a notice immediately following the copyright notice that applies to the Original Work. + +4) Exclusions From License Grant. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the Licensed Claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license. + +5) External Deployment. The term "External Deployment" means the use or distribution of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether the Original Work or Derivative Works are distributed to those persons or made available as an application intended for use over a computer network. As an express condition for the grants of license hereunder, You agree that any External Deployment by You of a Derivative Work shall be deemed a distribution and shall be licensed to all under the terms of this License, as prescribed in section 1(c) herein. + +6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + +7) Warranty and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work is owned by the Licensor or that the Original Work is distributed by Licensor under a valid current license from the copyright owner. Except as expressly stated in the immediately proceeding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to Original Work is granted hereunder except under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to liability for death or personal injury resulting from Licensor's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. + +9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express and volitional assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Sections 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Sections 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. This License shall terminate immediately and you may no longer exercise any of the rights granted to You by this License upon Your failure to honor the proviso in Section 1(c) herein. + +10) Mutual Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License if You file a lawsuit in any court alleging that any OSI Certified open source software that is licensed under any license containing this "Mutual Termination for Patent Action" clause infringes any patent claims that are essential to use that software. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. å¤ 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. + +12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + +13) Miscellaneous. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + +This license is Copyright (C) 2002 Lawrence E. Rosen. All rights reserved. Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. \ No newline at end of file diff --git a/options/license/Academic Free License v2.0 b/options/license/OSL-2.0 similarity index 81% rename from options/license/Academic Free License v2.0 rename to options/license/OSL-2.0 index cc175eb..43b627c 100644 --- a/options/license/Academic Free License v2.0 +++ b/options/license/OSL-2.0 @@ -1,15 +1,20 @@ -The Academic Free License -v. 2.0 -This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: -Licensed under the Academic Free License version 2.0 +Open Software Licensev. 2.0 + +This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: + + Licensed under the Open Software License version 2.0 1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license to do the following: -a) to reproduce the Original Work in copies; -b) to prepare derivative works ("Derivative Works") based upon the Original Work; -c) to distribute copies of the Original Work and Derivative Works to the public; -d) to perform the Original Work publicly; and -e) to display the Original Work publicly. + a) to reproduce the Original Work in copies; + + b) to prepare derivative works ("Derivative Works") based upon the Original Work; + + c) to distribute copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute shall be licensed under the Open Software License; + + d) to perform the Original Work publicly; and + + e) to display the Original Work publicly. 2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and Derivative Works. @@ -17,7 +22,7 @@ e) to display the Original Work publicly. 4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the licensed claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license. -5) This section intentionally omitted. +5) External Deployment. The term "External Deployment" means the use or distribution of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether the Original Work or Derivative Works are distributed to those persons or made available as an application intended for use over a computer network. As an express condition for the grants of license hereunder, You agree that any External Deployment by You of a Derivative Work shall be deemed a distribution and shall be licensed to all under the terms of this License, as prescribed in section 1(c) herein. 6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. @@ -25,11 +30,11 @@ e) to display the Original Work publicly. 8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to liability for death or personal injury resulting from Licensor's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. -9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. +9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. This License shall terminate immediately and you may no longer exercise any of the rights granted to You by this License upon Your failure to honor the proviso in Section 1(c) herein. 10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, for patent infringement (i) against Licensor with respect to a patent applicable to software or (ii) against any entity with respect to a patent applicable to the Original Work (but excluding combinations of the Original Work with other software or hardware). -11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. ¤ 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. 12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. @@ -39,5 +44,4 @@ e) to display the Original Work publicly. 15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. -This license is Copyright (C) 2003 Lawrence E. Rosen. All rights reserved. -Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. +This license is Copyright (C) 2003 Lawrence E. Rosen. All rights reserved. Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. \ No newline at end of file diff --git a/options/license/Academic Free License v2.1 b/options/license/OSL-2.1 similarity index 82% rename from options/license/Academic Free License v2.1 rename to options/license/OSL-2.1 index 2268d71..7f91b09 100644 --- a/options/license/Academic Free License v2.1 +++ b/options/license/OSL-2.1 @@ -1,16 +1,20 @@ -The Academic Free License -v.2.1 -This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: +The Open Software Licensev. 2.1 -Licensed under the Academic Free License version 2.1 +This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following notice immediately following the copyright notice for the Original Work: + + Licensed under the Open Software License version 2.1 1) Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license to do the following: -a) to reproduce the Original Work in copies; -b) to prepare derivative works ("Derivative Works") based upon the Original Work; -c) to distribute copies of the Original Work and Derivative Works to the public; -d) to perform the Original Work publicly; and -e) to display the Original Work publicly. + a) to reproduce the Original Work in copies; + + b) to prepare derivative works ("Derivative Works") based upon the Original Work; + + c) to distribute copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute shall be licensed under the Open Software License; + + d) to perform the Original Work publicly; and + + e) to display the Original Work publicly. 2) Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free, non-exclusive, perpetual, sublicenseable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, to make, use, sell and offer for sale the Original Work and Derivative Works. @@ -18,7 +22,7 @@ e) to display the Original Work publicly. 4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior written permission of the Licensor. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor except as expressly stated herein. No patent license is granted to make, use, sell or offer to sell embodiments of any patent claims other than the licensed claims defined in Section 2. No right is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any Original Work that Licensor otherwise would have a right to license. -5) This section intentionally omitted. +5) External Deployment. The term "External Deployment" means the use or distribution of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether the Original Work or Derivative Works are distributed to those persons or made available as an application intended for use over a computer network. As an express condition for the grants of license hereunder, You agree that any External Deployment by You of a Derivative Work shall be deemed a distribution and shall be licensed to all under the terms of this License, as prescribed in section 1(c) herein. 6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. @@ -26,11 +30,11 @@ e) to display the Original Work publicly. 8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to any person for any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to liability for death or personal injury resulting from Licensor's negligence to the extent applicable law prohibits such limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or consequential damages, so this exclusion and limitation may not apply to You. -9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. +9) Acceptance and Termination. If You distribute copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. Nothing else but this License (or another written agreement between Licensor and You) grants You permission to create Derivative Works based upon the Original Work or to exercise any of the rights granted in Section 1 herein, and any attempt to do so except under the terms of this License (or another written agreement between Licensor and You) is expressly prohibited by U.S. copyright law, the equivalent laws of other countries, and by international treaty. Therefore, by exercising any of the rights granted to You in Section 1 herein, You indicate Your acceptance of this License and all of its terms and conditions. This License shall terminate immediately and you may no longer exercise any of the rights granted to You by this License upon Your failure to honor the proviso in Section 1(c) herein. 10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. -11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of the U.S. Copyright Act, 17 U.S.C. ¤ 101 et seq., the equivalent laws of other countries, and international treaty. This section shall survive the termination of this License. 12) Attorneys Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. @@ -40,5 +44,4 @@ e) to display the Original Work publicly. 15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. -This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. -Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. +This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission is hereby granted to copy and distribute this license without modification. This license may not be modified without the express written permission of its copyright owner. \ No newline at end of file diff --git a/options/license/OSL-3.0 b/options/license/OSL-3.0 new file mode 100644 index 0000000..2ebd481 --- /dev/null +++ b/options/license/OSL-3.0 @@ -0,0 +1,47 @@ +Open Software License v. 3.0 (OSL-3.0) + +This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: + + Licensed under the Open Software License version 3.0 + +1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: + + a) to reproduce the Original Work in copies, either alone or as part of a collective work; + + b) to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; + + c) to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License; + + d) to perform the Original Work publicly; and + + e) to display the Original Work publicly. + +2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. + +3) Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. + +4) Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor’s trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. + +5) External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). + +6) Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + +7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. + +8) Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. + +9) Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including “fair use” or “fair dealing”). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). + +10) Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. + +12) Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + +13) Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + +16) Modification of This License. This License is Copyright (c) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under " or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. \ No newline at end of file diff --git a/options/license/OpenSSL b/options/license/OpenSSL new file mode 100644 index 0000000..fbdaf2a --- /dev/null +++ b/options/license/OpenSSL @@ -0,0 +1,49 @@ +OpenSSL License + +Copyright (c) 1998-2008 The OpenSSL Project. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. All advertising materials mentioning features or use of this software must display the following acknowledgment: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + +4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact openssl-core@openssl.org. + +5. Products derived from this software may not be called "OpenSSL" nor may "OpenSSL" appear in their names without prior written permission of the OpenSSL Project. + +6. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)" + +THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This product includes cryptographic software written by Eric Young (eay@cryptsoft.com). This product includes software written by Tim Hudson (tjh@cryptsoft.com). + + +Original SSLeay License + +Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved. + +This package is an SSL implementation written by Eric Young (eay@cryptsoft.com). The implementation was written so as to conform with Netscapes SSL. + +This library is free for commercial and non-commercial use as long as the following conditions are aheared to. The following conditions apply to all code found in this distribution, be it the RC4, RSA, lhash, DES, etc., code; not just the SSL code. The SSL documentation included with this distribution is covered by the same copyright terms except that the holder is Tim Hudson (tjh@cryptsoft.com). + +Copyright remains Eric Young's, and as such any Copyright notices in the code are not to be removed. If this package is used in a product, Eric Young should be given attribution as the author of the parts of the library used. This can be in the form of a textual message at program startup or in documentation (online or textual) provided with the package. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. All advertising materials mentioning features or use of this software must display the following acknowledgement: +"This product includes cryptographic software written by Eric Young (eay@cryptsoft.com)" +The word 'cryptographic' can be left out if the rouines from the library being used are not cryptographic related :-). + +4. If you include any Windows specific code (or a derivative thereof) from the apps directory (application code) you must include an acknowledgement: "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + +THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The licence and distribution terms for any publically available version or derivative of this code cannot be changed. i.e. this code cannot simply be copied and put under another distribution licence [including the GNU Public Licence.] + diff --git a/options/license/PDDL-1.0 b/options/license/PDDL-1.0 new file mode 100644 index 0000000..ca04daa --- /dev/null +++ b/options/license/PDDL-1.0 @@ -0,0 +1,136 @@ +Open Data Commons - Public Domain Dedication & License (PDDL) + +Preamble +The Open Data Commons - Public Domain Dedication & Licence is a document intended to allow you to freely share, modify, and use this work for any purpose and without any restrictions. This licence is intended for use on databases or their contents ("data"), either together or individually. + +Many databases are covered by copyright. Some jurisdictions, mainly in Europe, have specific special rights that cover databases called the "sui generis" database right. Both of these sets of rights, as well as other legal rights used to protect databases and data, can create uncertainty or practical difficulty for those wishing to share databases and their underlying data but retain a limited amount of rights under a "some rights reserved" approach to licensing as outlined in the Science Commons Protocol for Implementing Open Access Data. As a result, this waiver and licence tries to the fullest extent possible to eliminate or fully license any rights that cover this database and data. Any Community Norms or similar statements of use of the database or data do not form a part of this document, and do not act as a contract for access or other terms of use for the database or data. + +The position of the recipient of the work + +Because this document places the database and its contents in or as close as possible within the public domain, there are no restrictions or requirements placed on the recipient by this document. Recipients may use this work commercially, use technical protection measures, combine this data or database with other databases or data, and share their changes and additions or keep them secret. It is not a requirement that recipients provide further users with a copy of this licence or attribute the original creator of the data or database as a source. The goal is to eliminate restrictions held by the original creator of the data and database on the use of it by others. + +The position of the dedicator of the work + +Copyright law, as with most other law under the banner of "intellectual property", is inherently national law. This means that there exists several differences in how copyright and other IP rights can be relinquished, waived or licensed in the many legal jurisdictions of the world. This is despite much harmonisation of minimum levels of protection. The internet and other communication technologies span these many disparate legal jurisdictions and thus pose special difficulties for a document relinquishing and waiving intellectual property rights, including copyright and database rights, for use by the global community. Because of this feature of intellectual property law, this document first relinquishes the rights and waives the relevant rights and claims. It then goes on to license these same rights for jurisdictions or areas of law that may make it difficult to relinquish or waive rights or claims. + +The purpose of this document is to enable rightsholders to place their work into the public domain. Unlike licences for free and open source software, free cultural works, or open content licences, rightsholders will not be able to "dual license" their work by releasing the same work under different licences. This is because they have allowed anyone to use the work in whatever way they choose. Rightsholders therefore can’t re-license it under copyright or database rights on different terms because they have nothing left to license. Doing so creates truly accessible data to build rich applications and advance the progress of science and the arts. + +This document can cover either or both of the database and its contents (the data). Because databases can have a wide variety of content - not just factual data - rightsholders should use the Open Data Commons - Public Domain Dedication & Licence for an entire database and its contents only if everything can be placed under the terms of this document. Because even factual data can sometimes have intellectual property rights, rightsholders should use this licence to cover both the database and its factual data when making material available under this document; even if it is likely that the data would not be covered by copyright or database rights. + +Rightsholders can also use this document to cover any copyright or database rights claims over only a database, and leave the contents to be covered by other licences or documents. They can do this because this document refers to the "Work", which can be either - or both - the database and its contents. As a result, rightsholders need to clearly state what they are dedicating under this document when they dedicate it. + +Just like any licence or other document dealing with intellectual property, rightsholders should be aware that one can only license what one owns. Please ensure that the rights have been cleared to make this material available under this document. + +This document permanently and irrevocably makes the Work available to the public for any use of any kind, and it should not be used unless the rightsholder is prepared for this to happen. + +Part I: Introduction + +The Rightsholder (the Person holding rights or claims over the Work) agrees as follows: + +1.0 Definitions of Capitalised Words + +"Copyright" - Includes rights under copyright and under neighbouring rights and similarly related sets of rights under the law of the relevant jurisdiction under Section 6.4. + +"Data" - The contents of the Database, which includes the information, independent works, or other material collected into the Database offered under the terms of this Document. + +"Database" - A collection of Data arranged in a systematic or methodical way and individually accessible by electronic or other means offered under the terms of this Document. + +"Database Right" - Means rights over Data resulting from the Chapter III ("sui generis") rights in the Database Directive (Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases) and any future updates as well as any similar rights available in the relevant jurisdiction under Section 6.4. + +"Document" - means this relinquishment and waiver of rights and claims and back up licence agreement. + +"Person" - Means a natural or legal person or a body of persons corporate or incorporate. + +"Use" - As a verb, means doing any act that is restricted by Copyright or Database Rights whether in the original medium or any other; and includes modifying the Work as may be technically necessary to use it in a different mode or format. This includes the right to sublicense the Work. + +"Work" - Means either or both of the Database and Data offered under the terms of this Document. + +"You" - the Person acquiring rights under the licence elements of this Document. + +Words in the singular include the plural and vice versa. + +2.0 What this document covers + +2.1. Legal effect of this Document. This Document is: + + a. A dedication to the public domain and waiver of Copyright and Database Rights over the Work; and + + b. A licence of Copyright and Database Rights over the Work in jurisdictions that do not allow for relinquishment or waiver. + +2.2. Legal rights covered. + + a. Copyright. Any copyright or neighbouring rights in the Work. Copyright law varies between jurisdictions, but is likely to cover: the Database model or schema, which is the structure, arrangement, and organisation of the Database, and can also include the Database tables and table indexes; the data entry and output sheets; and the Field names of Data stored in the Database. Copyright may also cover the Data depending on the jurisdiction and type of Data; and + + b. Database Rights. Database Rights only extend to the extraction and re-utilisation of the whole or a substantial part of the Data. Database Rights can apply even when there is no copyright over the Database. Database Rights can also apply when the Data is removed from the Database and is selected and arranged in a way that would not infringe any applicable copyright. + +2.2 Rights not covered. + + a. This Document does not apply to computer programs used in the making or operation of the Database; + + b. This Document does not cover any patents over the Data or the Database. Please see Section 4.2 later in this Document for further details; and + + c. This Document does not cover any trade marks associated with the Database. Please see Section 4.3 later in this Document for further details. + +Users of this Database are cautioned that they may have to clear other rights or consult other licences. + +2.3 Facts are free. The Rightsholder takes the position that factual information is not covered by Copyright. This Document however covers the Work in jurisdictions that may protect the factual information in the Work by Copyright, and to cover any information protected by Copyright that is contained in the Work. + +Part II: Dedication to the public domain + +3.0 Dedication, waiver, and licence of Copyright and Database Rights + +3.1 Dedication of Copyright and Database Rights to the public domain. The Rightsholder by using this Document, dedicates the Work to the public domain for the benefit of the public and relinquishes all rights in Copyright and Database Rights over the Work. + + a. The Rightsholder realises that once these rights are relinquished, that the Rightsholder has no further rights in Copyright and Database Rights over the Work, and that the Work is free and open for others to Use. + + b. The Rightsholder intends for their relinquishment to cover all present and future rights in the Work under Copyright and Database Rights, whether they are vested or contingent rights, and that this relinquishment of rights covers all their heirs and successors. + +The above relinquishment of rights applies worldwide and includes media and formats now known or created in the future. + +3.2 Waiver of rights and claims in Copyright and Database Rights when Section 3.1 dedication inapplicable. If the dedication in Section 3.1 does not apply in the relevant jurisdiction under Section 6.4, the Rightsholder waives any rights and claims that the Rightsholder may have or acquire in the future over the Work in: + + a. Copyright; and + + b. Database Rights. + +To the extent possible in the relevant jurisdiction, the above waiver of rights and claims applies worldwide and includes media and formats now known or created in the future. The Rightsholder agrees not to assert the above rights and waives the right to enforce them over the Work. + +3.3 Licence of Copyright and Database Rights when Sections 3.1 and 3.2 inapplicable. If the dedication and waiver in Sections 3.1 and 3.2 does not apply in the relevant jurisdiction under Section 6.4, the Rightsholder and You agree as follows: + + a. The Licensor grants to You a worldwide, royalty-free, non-exclusive, licence to Use the Work for the duration of any applicable Copyright and Database Rights. These rights explicitly include commercial use, and do not exclude any field of endeavour. To the extent possible in the relevant jurisdiction, these rights may be exercised in all media and formats whether now known or created in the future. + +3.4 Moral rights. This section covers moral rights, including the right to be identified as the author of the Work or to object to treatment that would otherwise prejudice the author’s honour and reputation, or any other derogatory treatment: + + a. For jurisdictions allowing waiver of moral rights, Licensor waives all moral rights that Licensor may have in the Work to the fullest extent possible by the law of the relevant jurisdiction under Section 6.4; + + b. If waiver of moral rights under Section 3.4 a in the relevant jurisdiction is not possible, Licensor agrees not to assert any moral rights over the Work and waives all claims in moral rights to the fullest extent possible by the law of the relevant jurisdiction under Section 6.4; and + + c. For jurisdictions not allowing waiver or an agreement not to assert moral rights under Section 3.4 a and b, the author may retain their moral rights over the copyrighted aspects of the Work. + +Please note that some jurisdictions do not allow for the waiver of moral rights, and so moral rights may still subsist over the work in some jurisdictions. + +4.0 Relationship to other rights + +4.1 No other contractual conditions. The Rightsholder makes this Work available to You without any other contractual obligations, either express or implied. Any Community Norms statement associated with the Work is not a contract and does not form part of this Document. + +4.2 Relationship to patents. This Document does not grant You a licence for any patents that the Rightsholder may own. Users of this Database are cautioned that they may have to clear other rights or consult other licences. + +4.3 Relationship to trade marks. This Document does not grant You a licence for any trade marks that the Rightsholder may own or that the Rightsholder may use to cover the Work. Users of this Database are cautioned that they may have to clear other rights or consult other licences. Part III: General provisions + +5.0 Warranties, disclaimer, and limitation of liability + +5.1 The Work is provided by the Rightsholder "as is" and without any warranty of any kind, either express or implied, whether of title, of accuracy or completeness, of the presence of absence of errors, of fitness for purpose, or otherwise. Some jurisdictions do not allow the exclusion of implied warranties, so this exclusion may not apply to You. + +5.2 Subject to any liability that may not be excluded or limited by law, the Rightsholder is not liable for, and expressly excludes, all liability for loss or damage however and whenever caused to anyone by any use under this Document, whether by You or by anyone else, and whether caused by any fault on the part of the Rightsholder or not. This exclusion of liability includes, but is not limited to, any special, incidental, consequential, punitive, or exemplary damages. This exclusion applies even if the Rightsholder has been advised of the possibility of such damages. + +5.3 If liability may not be excluded by law, it is limited to actual and direct financial loss to the extent it is caused by proved negligence on the part of the Rightsholder. + +6.0 General + +6.1 If any provision of this Document is held to be invalid or unenforceable, that must not affect the cvalidity or enforceability of the remainder of the terms of this Document. + +6.2 This Document is the entire agreement between the parties with respect to the Work covered here. It replaces any earlier understandings, agreements or representations with respect to the Work not specified here. + +6.3 This Document does not affect any rights that You or anyone else may independently have under any applicable law to make any use of this Work, including (for jurisdictions where this Document is a licence) fair dealing, fair use, database exceptions, or any other legally recognised limitation or exception to infringement of copyright or other applicable laws. + +6.4 This Document takes effect in the relevant jurisdiction in which the Document terms are sought to be enforced. If the rights waived or granted under applicable law in the relevant jurisdiction includes additional rights not waived or granted under this Document, these additional rights are included in this Document in order to meet the intent of this Document. \ No newline at end of file diff --git a/options/license/PHP-3.0 b/options/license/PHP-3.0 new file mode 100644 index 0000000..0491f11 --- /dev/null +++ b/options/license/PHP-3.0 @@ -0,0 +1,28 @@ +The PHP License, version 3.0 + +Copyright (c) 1999 - 2006 The PHP Group. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, is permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The name "PHP" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact group@php.net. + +4. Products derived from this software may not be called "PHP", nor may "PHP" appear in their name, without prior written permission from group@php.net. You may indicate that your software works in conjunction with PHP by saying "Foo for PHP" instead of calling it "PHP Foo" or "phpfoo" + +5. The PHP Group may publish revised and/or new versions of the license from time to time. Each version will be given a distinguishing version number. Once covered code has been published under a particular version of the license, you may always continue to use it under the terms of that version. You may also choose to use such covered code under the terms of any subsequent version of the license published by the PHP Group. No one other than the PHP Group has the right to modify the terms applicable to covered code created under this License. + +6. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes PHP, freely available from ". + +THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +This software consists of voluntary contributions made by many individuals on behalf of the PHP Group. + +The PHP Group can be contacted via Email at group@php.net. + +For more information on the PHP Group and the PHP project, please see . + +This product includes the Zend Engine, freely available at . \ No newline at end of file diff --git a/options/license/PHP-3.01 b/options/license/PHP-3.01 new file mode 100644 index 0000000..2d49e84 --- /dev/null +++ b/options/license/PHP-3.01 @@ -0,0 +1,27 @@ +The PHP License, version 3.01 + +Copyright (c) 1999 - 2012 The PHP Group. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, is permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The name "PHP" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact group@php.net. + +4. Products derived from this software may not be called "PHP", nor may "PHP" appear in their name, without prior written permission from group@php.net. You may indicate that your software works in conjunction with PHP by saying "Foo for PHP" instead of calling it "PHP Foo" or "phpfoo" + +5. The PHP Group may publish revised and/or new versions of the license from time to time. Each version will be given a distinguishing version number. Once covered code has been published under a particular version of the license, you may always continue to use it under the terms of that version. You may also choose to use such covered code under the terms of any subsequent version of the license published by the PHP Group. No one other than the PHP Group has the right to modify the terms applicable to covered code created under this License. + +6. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes PHP software, freely available from ". + +THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This software consists of voluntary contributions made by many individuals on behalf of the PHP Group. + +The PHP Group can be contacted via Email at group@php.net. + +For more information on the PHP Group and the PHP project, please see . + +PHP includes the Zend Engine, freely available at . \ No newline at end of file diff --git a/options/license/Plexus b/options/license/Plexus new file mode 100644 index 0000000..fe7bebf --- /dev/null +++ b/options/license/Plexus @@ -0,0 +1,15 @@ +Copyright <>. All Rights Reserved. + +Redistribution and use of this software and associated documentation ("Software"), with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain copyright statements and notices. Redistributions must also contain a copy of this document. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The name <> must not be used to endorse or promote products derived from this Software without prior written permission of <>. For written permission, please contact <>. + +4. Products derived from this Software may not be called <> nor may <> appear in their names without prior written permission of <>. <> is a registered trademark of <>. + +5. Due credit should be given to <>. + +THIS SOFTWARE IS PROVIDED BY <> AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL <> OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/PostgreSQL b/options/license/PostgreSQL new file mode 100644 index 0000000..ad2fcdd --- /dev/null +++ b/options/license/PostgreSQL @@ -0,0 +1,12 @@ +PostgreSQL Database Management System +(formerly known as Postgres, then as Postgres95) + +Portions Copyright (c) 1996-2010, The PostgreSQL Global Development Group + +Portions Copyright (c) 1994, The Regents of the University of California + +Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. \ No newline at end of file diff --git a/options/license/Python-2.0 b/options/license/Python-2.0 new file mode 100644 index 0000000..cc821dc --- /dev/null +++ b/options/license/Python-2.0 @@ -0,0 +1,72 @@ +PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 + + 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation. + + 2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. + + 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python. + + 4. PSF is making Python available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + + 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + + 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. + + 7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between PSF and Licensee. This License Agreement does not grant permission to use PSF trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. + + 8. By copying, installing or otherwise using Python, Licensee agrees to be bound by the terms and conditions of this License Agreement. + + +BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 + +BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 + + 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the Individual or Organization ("Licensee") accessing and otherwise using this software in source or binary form and its associated documentation ("the Software"). + + 2. Subject to the terms and conditions of this BeOpen Python License Agreement, BeOpen hereby grants Licensee a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use the Software alone or in any derivative version, provided, however, that the BeOpen Python License is retained in the Software, alone or in any derivative version prepared by Licensee. + + 3. BeOpen is making the Software available to Licensee on an "AS IS" basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + + 4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + + 5. This License Agreement will automatically terminate upon a material breach of its terms and conditions. + + 6. This License Agreement shall be governed by and interpreted in all respects by the law of the State of California, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between BeOpen and Licensee. This License Agreement does not grant permission to use BeOpen trademarks or trade names in a trademark sense to endorse or promote products or services of Licensee, or any third party. As an exception, the "BeOpen Python" logos available at http://www.pythonlabs.com/logos.html may be used according to the permissions granted on that web page. + + 7. By copying, installing or otherwise using the software, Licensee agrees to be bound by the terms and conditions of this License Agreement. + + +CNRI OPEN SOURCE LICENSE AGREEMENT (for Python 1.6b1) + +IMPORTANT: PLEASE READ THE FOLLOWING AGREEMENT CAREFULLY. + +BY CLICKING ON "ACCEPT" WHERE INDICATED BELOW, OR BY COPYING, INSTALLING OR OTHERWISE USING PYTHON 1.6, beta 1 SOFTWARE, YOU ARE DEEMED TO HAVE AGREED TO THE TERMS AND CONDITIONS OF THIS LICENSE AGREEMENT. + + 1. This LICENSE AGREEMENT is between the Corporation for National Research Initiatives, having an office at 1895 Preston White Drive, Reston, VA 20191 ("CNRI"), and the Individual or Organization ("Licensee") accessing and otherwise using Python 1.6, beta 1 software in source or binary form and its associated documentation, as released at the www.python.org Internet site on August 4, 2000 ("Python 1.6b1"). + + 2. Subject to the terms and conditions of this License Agreement, CNRI hereby grants Licensee a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6b1 alone or in any derivative version, provided, however, that CNRIs License Agreement is retained in Python 1.6b1, alone or in any derivative version prepared by Licensee. + + Alternately, in lieu of CNRIs License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6, beta 1, is made available subject to the terms and conditions in CNRIs License Agreement. This Agreement may be located on the Internet using the following unique, persistent identifier (known as a handle): 1895.22/1011. This Agreement may also be obtained from a proxy server on the Internet using the URL:http://hdl.handle.net/1895.22/1011". + + 3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6b1 or any part thereof, and wants to make the derivative work available to the public as provided herein, then Licensee hereby agrees to indicate in any such work the nature of the modifications made to Python 1.6b1. + + 4. CNRI is making Python 1.6b1 available to Licensee on an "AS IS" basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6b1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + + 5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF USING, MODIFYING OR DISTRIBUTING PYTHON 1.6b1, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + + 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. + + 7. This License Agreement shall be governed by and interpreted in all respects by the law of the State of Virginia, excluding conflict of law provisions. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between CNRI and Licensee. This License Agreement does not grant permission to use CNRI trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. + + 8. By clicking on the "ACCEPT" button where indicated, or by copying, installing or otherwise using Python 1.6b1, Licensee agrees to be bound by the terms and conditions of this License Agreement. + +ACCEPT + + +CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 + +Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands. All rights reserved. + + Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Stichting Mathematisch Centrum or CWI not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. + + STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/options/license/QPL-1.0 b/options/license/QPL-1.0 new file mode 100644 index 0000000..6bf8bf7 --- /dev/null +++ b/options/license/QPL-1.0 @@ -0,0 +1,50 @@ +THE Q PUBLIC LICENSE version 1.0 + +Copyright (C) 1999-2005 Trolltech AS, Norway. + +Everyone is permitted to copy and distribute this license document. + +The intent of this license is to establish freedom to share and change the software regulated by this license under the open source model. + +This license applies to any software containing a notice placed by the copyright holder saying that it may be distributed under the terms of the Q Public License version 1.0. Such software is herein referred to as the Software. This license covers modification and distribution of the Software, use of third-party application programs based on the Software, and development of free software which uses the Software. + +Granted Rights + +1. You are granted the non-exclusive rights set forth in this license provided you agree to and comply with any and all conditions in this license. Whole or partial distribution of the Software, or software items that link with the Software, in any form signifies acceptance of this license. + +2. You may copy and distribute the Software in unmodified form provided that the entire package, including - but not restricted to - copyright, trademark notices and disclaimers, as released by the initial developer of the Software, is distributed. + +3. You may make modifications to the Software and distribute your modifications, in a form that is separate from the Software, such as patches. The following restrictions apply to modifications: + +a. Modifications must not alter or remove any copyright notices in the Software. +b. When modifications to the Software are released under this license, a non-exclusive royalty-free right is granted to the initial developer of the Software to distribute your modification in future versions of the Software provided such versions remain available under these terms in addition to any other license(s) of the initial developer. + +4. You may distribute machine-executable forms of the Software or machine-executable forms of modified versions of the Software, provided that you meet these restrictions: + + a. You must include this license document in the distribution. + + b. You must ensure that all recipients of the machine-executable forms are also able to receive the complete machine-readable source code to the distributed Software, including all modifications, without any charge beyond the costs of data transfer, and place prominent notices in the distribution explaining this. + + c. You must ensure that all modifications included in the machine-executable forms are available under the terms of this license. + +5. You may use the original or modified versions of the Software to compile, link and run application programs legally developed by you or by others. + +6. You may develop application programs, reusable components and other software items that link with the original or modified versions of the Software. These items, when distributed, are subject to the following requirements: + + a. You must ensure that all recipients of machine-executable forms of these items are also able to receive and use the complete machine-readable source code to the items without any charge beyond the costs of data transfer. + + b. You must explicitly license all recipients of your items to use and re-distribute original and modified versions of the items in both machine-executable and source code forms. The recipients must be able to do so without any charges whatsoever, and they must be able to re-distribute to anyone they choose. + + c. If the items are not available to the general public, and the initial developer of the Software requests a copy of the items, then you must supply one. + +Limitations of Liability + +In no event shall the initial developers or copyright holders be liable for any damages whatsoever, including - but not restricted to - lost revenue or profits or other direct, indirect, special, incidental or consequential damages, even if they have been advised of the possibility of such damages, except to the extent invariable law, if any, provides otherwise. + +No Warranty + +The Software and this license document are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +Choice of Law + +This license is governed by the Laws of Norway. Disputes shall be settled by Oslo City Court. \ No newline at end of file diff --git a/options/license/Qhull b/options/license/Qhull new file mode 100644 index 0000000..9055f08 --- /dev/null +++ b/options/license/Qhull @@ -0,0 +1,17 @@ +Qhull, Copyright (c) 1993-2003 + +The National Science and Technology Research Center for Computation and Visualization of Geometric Structures (The Geometry Center) University of Minnesota + +email: qhull@qhull.org + +This software includes Qhull from The Geometry Center. Qhull is copyrighted as noted above. Qhull is free software and may be obtained via http from www.qhull.org. It may be freely copied, modified, and redistributed under the following conditions: + +1. All copyright notices must remain intact in all files. + +2. A copy of this text file must be distributed along with any copies of Qhull that you redistribute; this includes copies that you have modified, or copies of programs or other software products that include Qhull. + +3. If you modify Qhull, you must include a notice giving the name of the person performing the modification, the date of modification, and the reason for such modification. + +4. When distributing modified versions of Qhull, or other software products that include Qhull, you must provide notice that the original source code may be obtained as noted above. + +5. There is no warranty or other guarantee of fitness for Qhull, it is provided solely "as is". Bug reports or fixes may be sent to qhull_bug@qhull.org; the authors may or may not act on them as they desire. \ No newline at end of file diff --git a/options/license/RHeCos-1.1 b/options/license/RHeCos-1.1 new file mode 100644 index 0000000..ea77d4a --- /dev/null +++ b/options/license/RHeCos-1.1 @@ -0,0 +1,137 @@ +Red Hat eCos Public License v1.1 + +1. DEFINITIONS + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + + 1.13. "Red Hat Branded Code" is code that Red Hat distributes and/or permits others to distribute under different terms than the Red Hat eCos Public License. Red Hat's Branded Code may contain part or all of the Covered Code. + +2. SOURCE CODE LICENSE + + 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell ("Utilize") the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + + 2.2. Contributor Grant. Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and + + (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations. + +3. DISTRIBUTION OBLIGATIONS + + 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available and to the Initial Developer; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. You are responsible for notifying the Initial Developer of the Modification and the location of the Source if a contact means is provided. Red Hat will be acting as maintainer of the Source and may provide an Electronic Distribution mechanism for the Modification to be made available. You can contact Red Hat to make the Modification available and to notify the Initial Developer. (http://sourceware.cygnus.com/ecos/) + + 3.3. Description of Modifications. You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + + (a) Third Party Claims. If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs. If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. + + 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. + + However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + If you distribute executable versions containing Covered Code, you must reproduce the notice in Exhibit B in the documentation and/or other materials provided with the product. + + 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. INABILITY TO COMPLY DUE TO STATUTE OR REGULATION + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; (b) cite the statute or regulation that prohibits you from adhering to the license; and (c) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. You must submit this LEGAL file to Red Hat for review, and You will not be able use the covered code in any means until permission is granted from Red Hat to allow for the inability to comply due to statute or regulation. + +5. APPLICATION OF THIS LICENSE + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code. + +Red Hat may include Covered Code in products without such additional products becoming subject to the terms of this License, and may license such additional products on different terms from those contained in this License. + +Red Hat may license the Source Code of Red Hat Branded Code without Red Hat Branded Code becoming subject to the terms of this License, and may license Red Hat Branded Code on different terms from those contained in this License. Contact Red Hat for details of alternate licensing terms available. + +6. VERSIONS OF THE LICENSE + + 6.1. New Versions. Red Hat may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Red Hat. No one other than Red Hat has the right to modify the terms applicable to Covered Code beyond what is granted under this and subsequent Licenses. + + 6.3. Derivative Works. If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases "ECOS", "eCos", "Red Hat", "RHEPL" or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Red Hat eCos Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY + +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION + +This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +9. LIMITATION OF LIABILITY + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS + +The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the United States of America: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Santa Clara County, California, under the auspices of JAMS/EndDispute; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS + +Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. + +13. ADDITIONAL TERMS APPLICABLE TO THE RED HAT ECOS PUBLIC LICENSE + +Nothing in this License shall be interpreted to prohibit Red Hat from licensing under different terms than this License any code which Red Hat otherwise would have a right to license. + +Red Hat and logo - This License does not grant any rights to use the trademark Red Hat, the Red Hat logo, eCos logo, even if such marks are included in the Original Code. You may contact Red Hat for permission to display the Red Hat and eCos marks in either the documentation or the Executable version beyond that required in Exhibit B. + +Inability to Comply Due to Contractual Obligation - To the extent that Red Hat is limited contractually from making third party code available under this License, Red Hat may choose to integrate such third party code into Covered Code without being required to distribute such third party code in Source Code form, even if such third party code would otherwise be considered "Modifications" under this License. + +EXHIBIT A + +"The contents of this file are subject to the Red Hat eCos Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.redhat.com/ + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code is eCos - Embedded Configurable Operating System, released September 30, 1998. The Initial Developer of the Original Code is Red Hat. Portions created by Red Hat are Copyright (C) 1998, 1999, 2000 Red Hat, Inc. All Rights Reserved." + +EXHIBIT B + +Part of the software embedded in this product is eCos - Embedded Configurable Operating System, a trademark of Red Hat. Portions created by Red Hat are Copyright (C) 1998, 1999, 2000 Red Hat, Inc. (http://www.redhat.com/). All Rights Reserved. + +THE SOFTWARE IN THIS PRODUCT WAS IN PART PROVIDED BY RED HAT AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/RPL-1.1 b/options/license/RPL-1.1 new file mode 100644 index 0000000..2691652 --- /dev/null +++ b/options/license/RPL-1.1 @@ -0,0 +1,177 @@ +Reciprocal Public License, version 1.1 + +Copyright (C) 2001-2002 Technical Pursuit Inc., All Rights Reserved. + +PREAMBLE + +This Preamble is intended to describe, in plain English, the nature, intent, and scope of this License. However, this Preamble is not a part of this License. The legal effect of this License is dependent only upon the terms of the License and not this Preamble. + +This License is based on the concept of reciprocity. In exchange for being granted certain rights under the terms of this License to Licensor's Software, whose Source Code You have access to, You are required to reciprocate by providing equal access and rights to all third parties to the Source Code of any Modifications, Derivative Works, and Required Components for execution of same (collectively defined as Extensions) that You Deploy by Deploying Your Extensions under the terms of this License. In this fashion the available Source Code related to the original Licensed Software is enlarged for the benefit of everyone. + +Under the terms of this License You may: + +a. Distribute the Licensed Software exactly as You received it under the terms of this License either alone or as a component of an aggregate software distribution containing programs from several different sources without payment of a royalty or other fee. + +b. Use the Licensed Software for any purpose consistent with the rights granted by this License, but the Licensor is not providing You any warranty whatsoever, nor is the Licensor accepting any liability in the event that the Licensed Software doesn't work properly or causes You any injury or damages. + +c. Create Extensions to the Licensed Software consistent with the rights granted by this License, provided that You make the Source Code to any Extensions You Deploy available to all third parties under the terms of this License, document Your Modifications clearly, and title all Extensions distinctly from the Licensed Software. + +d. Charge a fee for warranty or support, or for accepting indemnity or liability obligations for Your customers. + +Under the terms of this License You may not: + +a. Charge for the Source Code to the Licensed Software, or Your Extensions, other than a nominal fee not to exceed Your cost for reproduction and distribution where such reproduction and distribution involve physical media. + +b. Modify or delete any pre-existing copyright notices, change notices, or License text in the Licensed Software. + +c. Assert any patent claims against the Licensor or Contributors, or which would in any way restrict the ability of any third party to use the Licensed Software or portions thereof in any form under the terms of this License, or Your rights to the Licensed Software under this License automatically terminate. + +d. Represent either expressly or by implication, appearance, or otherwise that You represent Licensor or + +Contributors in any capacity or that You have any form of legal association by virtue of this License. + +Under the terms of this License You must: + +a. Document any Modifications You make to the Licensed Software including the nature of the change, the authors of the change, and the date of the change. This documentation must appear both in the Source Code and in a text file titled "CHANGES" distributed with the Licensed Software and Your Extensions. + +b. Make the Source Code for any Extensions You Deploy available in a timely fashion via an Electronic Distribution Mechanism such as FTP or HTTP download. + +c. Notify the Licensor of the availability of Source Code to Your Extensions in a timely fashion and include in such notice a brief description of the Extensions, the distinctive title used, and instructions on how to acquire the Source Code and future updates. + +d. Grant Licensor and all third parties a world-wide, non-exclusive, royalty-free license under any intellectual property rights owned or controlled by You to use, reproduce, display, perform, modify, sublicense, and distribute Your Extensions, in any form, under the terms of this License. + +LICENSE TERMS + +1.0 General; Applicability & Definitions. This Reciprocal Public License Version 1.1 ("License") applies to any programs or other works as well as any and all updates or maintenance releases of said programs or works ("Software") not already covered by this License which the Software copyright holder ("Licensor") makes publicly available containing a Notice (hereinafter defined) from the Licensor specifying or allowing use or distribution under the terms of this License. As used in this License and Preamble: + + 1.1 "Contributor" means any person or entity who created or contributed to the creation of an Extension. + + 1.2 "Deploy" means to use, Serve, sublicense or distribute Licensed Software other than for Your internal Research and/or Personal Use, and includes without limitation, any and all internal use or distribution of Licensed Software within Your business or organization other than for Research and/or Personal Use, as well as direct or indirect sublicensing or distribution of Licensed Software by You to any third party in any form or manner. + + 1.3 "Derivative Works" as used in this License is defined under U.S. copyright law. + + 1.4 "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data such as download from an FTP or web site, where such mechanism is publicly accessible. + + 1.5 "Extensions" means any Modifications, Derivative Works, or Required Components as those terms are defined in this License. + + 1.6 "License" means this Reciprocal Public License. + + 1.7 "Licensed Software" means any Software licensed pursuant to this License. Licensed Software also includes all previous Extensions from any Contributor that You receive. + + 1.8 "Licensor" means the copyright holder of any Software previously uncovered by this License who releases the Software under the terms of this License. + + 1.9 "Modifications" means any additions to or deletions from the substance or structure of (i) a file or other storage containing Licensed Software, or (ii) any new file or storage that contains any part of Licensed Software, or (iii) any file or storage which replaces or otherwise alters the original functionality of Licensed Software at runtime. + + 1.10 "Notice" means the notice contained in EXHIBIT A. + + 1.11 "Personal Use" means use of Licensed Software by an individual solely for his or her personal, private and non-commercial purposes. An individual's use of Licensed Software in his or her capacity as an officer, employee, member, independent contractor or agent of a corporation, business or organization (commercial or non-commercial) does not qualify as Personal Use. + + 1.12 "Required Components" means any text, programs, scripts, schema, interface definitions, control files, or other works created by You which are required by a third party of average skill to successfully install and run Licensed Software containing Your Modifications, or to install and run Your Derivative Works. + + 1.13 "Research" means investigation or experimentation for the purpose of understanding the nature and limits of the Licensed Software and its potential uses. + + 1.14 "Serve" means to deliver Licensed Software and/or Your Extensions by means of a computer network to one or more computers for purposes of execution of Licensed Software and/or Your Extensions. + + 1.15 "Software" means any computer programs or other works as well as any updates or maintenance releases of those programs or works which are distributed publicly by Licensor. + + 1.16 "Source Code" means the preferred form for making modifications to the Licensed Software and/or Your Extensions, including all modules contained therein, plus any associated text, interface definition files, scripts used to control compilation and installation of an executable program or other components required by a third party of average skill to build a running version of the Licensed Software or Your Extensions. + + 1.17 "You" or "Your" means an individual or a legal entity exercising rights under this License. For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2.0 Acceptance Of License. You are not required to accept this License since you have not signed it, however nothing else grants you permission to use, copy, distribute, modify, or create derivatives of either the Software or any Extensions created by a Contributor. These actions are prohibited by law if you do not accept this License. Therefore, by performing any of these actions You indicate Your acceptance of this License and Your agreement to be bound by all its terms and conditions. IF YOU DO NOT AGREE WITH ALL THE TERMS AND CONDITIONS OF THIS LICENSE DO NOT USE, MODIFY, CREATE DERIVATIVES, OR DISTRIBUTE THE SOFTWARE. IF IT IS IMPOSSIBLE FOR YOU TO COMPLY WITH ALL THE TERMS AND CONDITIONS OF THIS LICENSE THEN YOU CAN NOT USE, MODIFY, CREATE DERIVATIVES, OR DISTRIBUTE THE SOFTWARE. + +3.0 Grant of License From Licensor. Subject to the terms and conditions of this License, Licensor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to Licensor's intellectual property rights, and any third party intellectual property claims derived from the Licensed Software under this License, to do the following: + + 3.1 Use, reproduce, modify, display, perform, sublicense and distribute Licensed Software and Your Extensions in both Source Code form or as an executable program. + + 3.2 Create Derivative Works (as that term is defined under U.S. copyright law) of Licensed Software by adding to or deleting from the substance or structure of said Licensed Software. + + 3.3 Under claims of patents now or hereafter owned or controlled by Licensor, to make, use, have made, and/or otherwise dispose of Licensed Software or portions thereof, but solely to the extent that any such claim is necessary to enable You to make, use, have made, and/or otherwise dispose of Licensed Software or portions thereof. + + 3.4 Licensor reserves the right to release new versions of the Software with different features, specifications, capabilities, functions, licensing terms, general availability or other characteristics. Title, ownership rights, and intellectual property rights in and to the Licensed Software shall remain in Licensor and/or its Contributors. + +4.0 Grant of License From Contributor. By application of the provisions in Section 6 below, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to said Contributor's intellectual property rights, and any third party intellectual property claims derived from the Licensed Software under this License, to do the following: + + 4.1 Use, reproduce, modify, display, perform, sublicense and distribute any Extensions Deployed by such Contributor or portions thereof, in both Source Code form or as an executable program, either on an unmodified basis or as part of Derivative Works. + + 4.2 Under claims of patents now or hereafter owned or controlled by Contributor, to make, use, have made, and/or otherwise dispose of Extensions or portions thereof, but solely to the extent that any such claim is necessary to enable You to make, use, have made, and/or otherwise dispose of Contributor's Extensions or portions thereof. + +5.0 Exclusions From License Grant. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor or any Contributor except as expressly stated herein. Except as expressly stated in Sections 3 and 4, no other patent rights, express or implied, are granted herein. Your Extensions may require additional patent licenses from Licensor or Contributors which each may grant in its sole discretion. No right is granted to the trademarks of Licensor or any Contributor even if such marks are included in the Licensed Software. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any code that Licensor otherwise would have a right to license. + + 5.1 You expressly acknowledge and agree that although Licensor and each Contributor grants the licenses to their respective portions of the Licensed Software set forth herein, no assurances are provided by Licensor or any Contributor that the Licensed Software does not infringe the patent or other intellectual property rights of any other entity. Licensor and each Contributor disclaim any liability to You for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, You hereby assume sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow You to distribute the Licensed Software, it is Your responsibility to acquire that license before distributing the Licensed Software. + +6.0 Your Obligations And Grants. In consideration of, and as an express condition to, the licenses granted to You under this License You hereby agree that any Modifications, Derivative Works, or Required Components (collectively Extensions) that You create or to which You contribute are governed by the terms of this License including, without limitation, Section 4. Any Extensions that You create or to which You contribute must be Deployed under the terms of this License or a future version of this License released under Section 7. You hereby grant to Licensor and all third parties a world-wide, non-exclusive, royalty-free license under those intellectual property rights You own or control to use, reproduce, display, perform, modify, create derivatives, sublicense, and distribute Your Extensions, in any form. Any Extensions You make and Deploy must have a distinct title so as to readily tell any subsequent user or Contributor that the Extensions are by You. You must include a copy of this License with every copy of the Extensions You distribute. You agree not to offer or impose any terms on any Source Code or executable version of the Licensed Software, or its Extensions that alter or restrict the applicable version of this License or the recipients' rights hereunder. + + 6.1 Availability of Source Code. You must make available, under the terms of this License, the Source Code of the Licensed Software and any Extensions that You Deploy, either on the same media as You distribute any executable or other form of the Licensed Software, or via an Electronic Distribution Mechanism. The Source Code for any version of Licensed Software, or its Extensions that You Deploy must be made available at the time of Deployment and must remain available for as long as You Deploy the Extensions or at least twelve (12) months after the date You Deploy, whichever is longer. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. You may not charge a fee for the Source Code distributed under this Section in excess of Your actual cost of duplication and distribution where such duplication and distribution involve physical media. + + 6.2 Description of Modifications. You must cause any Modifications that You create or to which You contribute, to update the file titled "CHANGES" distributed with Licensed Software documenting the additions, changes or deletions You made, the authors of such Modifications, and the dates of any such additions, changes or deletions. You must also cause a cross-reference to appear in the Source Code at the location of each change. You must include a prominent statement that the Modifications are derived, directly or indirectly, from the Licensed Software and include the names of the Licensor and any Contributor to the Licensed Software in (i) the Source Code and (ii) in any notice displayed by the Licensed Software You distribute or in related documentation in which You describe the origin or ownership of the Licensed Software. You may not modify or delete any pre-existing copyright notices, change notices or License text in the Licensed Software. + + 6.3 Intellectual Property Matters. + + a. Third Party Claims. If You have knowledge that a license to a third party's intellectual property right is required to exercise the rights granted by this License, You must include a text file with the Source Code distribution titled "LEGAL" that describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If You obtain such knowledge after You make any Extensions available as described in Section 6.1, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Licensed Software from You that new knowledge has been obtained. + + b. Contributor APIs. If Your Extensions include an application programming interface ("API") and You have knowledge of patent licenses that are reasonably necessary to implement that API, You must also include this information in the LEGAL file. + + c. Representations. You represent that, except as disclosed pursuant to 6.3(a) above, You believe that any Extensions You distribute are Your original creations and that You have sufficient rights to grant the rights conveyed by this License. + + 6.4 Required Notices. + + a. License Text. You must duplicate this License in any documentation You provide along with the Source Code of any Extensions You create or to which You contribute, wherever You describe recipients' rights relating to Licensed Software. You must duplicate the notice contained in EXHIBIT A (the "Notice") in each file of the Source Code of any copy You distribute of the Licensed Software and Your Extensions. If You create an Extension, You may add Your name as a Contributor to the text file titled "CONTRIB" distributed with the Licensed Software along with a description of the contribution. If it is not possible to put the Notice in a particular Source Code file due to its structure, then You must include such Notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. + + b. Source Code Availability. You must notify Licensor within one (1) month of the date You initially Deploy of the availability of Source Code to Your Extensions and include in such notification the name under which you Deployed Your Extensions, a description of the Extensions, and instructions on how to acquire the Source Code, including instructions on how to acquire updates over time. Should such instructions change you must provide Licensor with revised instructions within one (1) month of the date of change. Should you be unable to notify Licensor directly, you must provide notification by posting to appropriate news groups, mailing lists, or web sites where a search engine would reasonably be expected to index them. + + 6.5 Additional Terms. You may choose to offer, and charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Licensed Software. However, You may do so only on Your own behalf, and not on behalf of the Licensor or any Contributor. You must make it clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Licensor and every Contributor for any liability plus attorney fees, costs, and related expenses due to any such action or claim incurred by the Licensor or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 6.6 Conflicts With Other Licenses. Where any portion of Your Extensions, by virtue of being Derivative Works of another product or similar circumstance, fall under the terms of another license, the terms of that license should be honored however You must also make Your Extensions available under this License. If the terms of this License continue to conflict with the terms of the other license you may write the Licensor for permission to resolve the conflict in a fashion that remains consistent with the intent of this License. Such permission will be granted at the sole discretion of the Licensor. + +7.0 Versions of This License. Licensor may publish from time to time revised and/or new versions of the License. Once Licensed Software has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Licensed Software under the terms of any subsequent version of the License published by Licensor. No one other than Licensor has the right to modify the terms applicable to Licensed Software created under this License. + + 7.1 If You create or use a modified version of this License, which You may do only in order to apply it to software that is not already Licensed Software under this License, You must rename Your license so that it is not confusingly similar to this License, and must make it clear that Your license contains terms that differ from this License. In so naming Your license, You may not use any trademark of Licensor or of any Contributor. Should Your modifications to this License be limited to alteration of EXHIBIT A purely for purposes of adjusting the Notice You require of licensees, You may continue to refer to Your License as the Reciprocal Public License or simply the RPL. + +8.0 Disclaimer of Warranty. LICENSED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE LICENSED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. FURTHER THERE IS NO WARRANTY MADE AND ALL IMPLIED WARRANTIES ARE DISCLAIMED THAT THE LICENSED SOFTWARE MEETS OR COMPLIES WITH ANY DESCRIPTION OF PERFORMANCE OR OPERATION, SAID COMPATIBILITY AND SUITABILITY BEING YOUR RESPONSIBILITY. LICENSOR DISCLAIMS ANY WARRANTY, IMPLIED OR EXPRESSED, THAT ANY CONTRIBUTOR'S EXTENSIONS MEET ANY STANDARD OF COMPATIBILITY OR DESCRIPTION OF PERFORMANCE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LICENSED SOFTWARE IS WITH YOU. SHOULD LICENSED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (AND NOT THE LICENSOR OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. UNDER THE TERMS OF THIS LICENSOR WILL NOT SUPPORT THIS SOFTWARE AND IS UNDER NO OBLIGATION TO ISSUE UPDATES TO THIS SOFTWARE. LICENSOR HAS NO KNOWLEDGE OF ERRANT CODE OR VIRUS IN THIS SOFTWARE, BUT DOES NOT WARRANT THAT THE SOFTWARE IS FREE FROM SUCH ERRORS OR VIRUSES. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF LICENSED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +9.0 Limitation of Liability. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE LICENSOR, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF LICENSED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10.0 High Risk Activities. THE LICENSED SOFTWARE IS NOT FAULT-TOLERANT AND IS NOT DESIGNED, MANUFACTURED, OR INTENDED FOR USE OR DISTRIBUTION AS ON-LINE CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR COMMUNICATIONS SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE LICENSED SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). LICENSOR AND CONTRIBUTORS SPECIFICALLY DISCLAIM ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES. + +11.0 Responsibility for Claims. As between Licensor and Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License which specifically disclaims warranties and limits any liability of the Licensor. This paragraph is to be used in conjunction with and controlled by the Disclaimer Of Warranties of Section 8, the Limitation Of Damages in Section 9, and the disclaimer against use for High Risk Activities in Section 10. The Licensor has thereby disclaimed all warranties and limited any damages that it is or may be liable for. You agree to work with Licensor and Contributors to distribute such responsibility on an equitable basis consistent with the terms of this License including Sections 8, 9, and 10. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +12.0 Termination. This License and all rights granted hereunder will terminate immediately in the event of the circumstances described in Section 13.6 or if applicable law prohibits or restricts You from fully and or specifically complying with Sections 3, 4 and/or 6, or prevents the enforceability of any of those Sections, and You must immediately discontinue any use of Licensed Software. + + 12.1 Automatic Termination Upon Breach. This License and the rights granted hereunder will terminate automatically if You fail to comply with the terms herein and fail to cure such breach within thirty (30) days of becoming aware of the breach. All sublicenses to the Licensed Software that are properly granted shall survive any termination of this License. Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive. + + 12.2 Termination Upon Assertion of Patent Infringement. If You initiate litigation by asserting a patent infringement claim (excluding declaratory judgment actions) against Licensor or a Contributor (Licensor or Contributor against whom You file such an action is referred to herein as "Respondent") alleging that Licensed Software directly or indirectly infringes any patent, then any and all rights granted by such Respondent to You under Sections 3 or 4 of this License shall terminate prospectively upon sixty (60) days notice from Respondent (the "Notice Period") unless within that Notice Period You either agree in writing (i) to pay Respondent a mutually agreeable reasonably royalty for Your past or future use of Licensed Software made by such Respondent, or (ii) withdraw Your litigation claim with respect to Licensed Software against such Respondent. If within said Notice Period a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Licensor to You under Sections 3 and 4 automatically terminate at the expiration of said Notice Period. + + 12.3 Reasonable Value of This License. If You assert a patent infringement claim against Respondent alleging that Licensed Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by said Respondent under Sections 3 and 4 shall be taken into account in determining the amount or value of any payment or license. + + 12.4 No Retroactive Effect of Termination. In the event of termination under this Section all end user license agreements (excluding licenses to distributors and resellers) that have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +13.0 Miscellaneous. + + 13.1 U.S. Government End Users. The Licensed Software is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Licensed Software with only those rights set forth herein. + + 13.2 Relationship of Parties. This License will not be construed as creating an agency, partnership, joint venture, or any other form of legal association between or among You, Licensor, or any Contributor, and You will not represent to the contrary, whether expressly, by implication, appearance, or otherwise. + + 13.3 Independent Development. Nothing in this License will impair Licensor's right to acquire, license, develop, subcontract, market, or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Extensions that You may develop, produce, market, or distribute. + + 13.4 Consent To Breach Not Waiver. Failure by Licensor or Contributor to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision. + + 13.5 Severability. This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + + 13.6 Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Licensed Software due to statute, judicial order, or regulation, then You cannot use, modify, or distribute the software. + + 13.7 Export Restrictions. You may be restricted with respect to downloading or otherwise acquiring, exporting, or reexporting the Licensed Software or any underlying information or technology by United States and other applicable laws and regulations. By downloading or by otherwise obtaining the Licensed Software, You are agreeing to be responsible for compliance with all applicable laws and regulations. + + 13.8 Arbitration, Jurisdiction & Venue. This License shall be governed by Colorado law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. You expressly agree that any dispute relating to this License shall be submitted to binding arbitration under the rules then prevailing of the American Arbitration Association. You further agree that Adams County, Colorado USA is proper venue and grant such arbitration proceeding jurisdiction as may be appropriate for purposes of resolving any dispute under this License. Judgement upon any award made in arbitration may be entered and enforced in any court of competent jurisdiction. The arbitrator shall award attorney's fees and costs of arbitration to the prevailing party. Should either party find it necessary to enforce its arbitration award or seek specific performance of such award in a civil court of competent jurisdiction, the prevailing party shall be entitled to reasonable attorney's fees and costs. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. You and Licensor expressly waive any rights to a jury trial in any litigation concerning Licensed Software or this License. Any law or regulation that provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 13.9 Entire Agreement. This License constitutes the entire agreement between the parties with respect to the subject matter hereof. + +EXHIBIT A + +The Notice below must appear in each file of the Source Code of any copy You distribute of the Licensed Software or any Extensions thereto, except as may be modified as allowed under the terms of Section 7.1 +Copyright (C) 1999-2002 Technical Pursuit Inc., All Rights Reserved. Patent Pending, Technical Pursuit Inc. + +Unless explicitly acquired and licensed from Licensor under the Technical Pursuit License ("TPL") Version 1.0 or greater, the contents of this file are subject to the Reciprocal Public License ("RPL") Version 1.1, or subsequent versions as allowed by the RPL, and You may not copy or use this file in either source code or executable form, except in compliance with the terms and conditions of the RPL. +You may obtain a copy of both the TPL and the RPL (the "Licenses") from Technical Pursuit Inc. at http://www.technicalpursuit.com. + +All software distributed under the Licenses is provided strictly on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND TECHNICAL PURSUIT INC. HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT, OR NON-INFRINGEMENT. See the Licenses for specific language governing rights and limitations under the Licenses. diff --git a/options/license/RPSL-1.0 b/options/license/RPSL-1.0 new file mode 100644 index 0000000..4fecab4 --- /dev/null +++ b/options/license/RPSL-1.0 @@ -0,0 +1,179 @@ +RealNetworks Public Source License Version 1.0 + +(Rev. Date October 28, 2002) + +1. General Definitions. This License applies to any program or other work which RealNetworks, Inc., or any other entity that elects to use this license, ("Licensor") makes publicly available and which contains a notice placed by Licensor identifying such program or work as "Original Code" and stating that it is subject to the terms of this RealNetworks Public Source License version 1.0 (or subsequent version thereof) ("License"). You are not required to accept this License. However, nothing else grants You permission to use, copy, modify or distribute the software or its derivative works. These actions are prohibited by law if You do not accept this License. Therefore, by modifying, copying or distributing the software (or any work based on the software), You indicate your acceptance of this License to do so, and all its terms and conditions. In addition, you agree to the terms of this License by clicking the Accept button or downloading the software. As used in this License: + + 1.1 "Applicable Patent Rights" mean: (a) in the case where Licensor is the grantor of rights, claims of patents that (i) are now or hereafter acquired, owned by or assigned to Licensor and (ii) are necessarily infringed by using or making the Original Code alone and not in combination with other software or hardware; and (b) in the case where You are the grantor of rights, claims of patents that (i) are now or hereafter acquired, owned by or assigned to You and (ii) are infringed (directly or indirectly) by using or making Your Modifications, taken alone or in combination with Original Code. + + 1.2 "Compatible Source License" means any one of the licenses listed on Exhibit B or at https://www.helixcommunity.org/content/complicense or other licenses specifically identified by Licensor in writing. Notwithstanding any term to the contrary in any Compatible Source License, any code covered by any Compatible Source License that is used with Covered Code must be made readily available in Source Code format for royalty-free use under the terms of the Compatible Source License or this License. + + 1.3 "Contributor" means any person or entity that creates or contributes to the creation of Modifications. + + 1.4 "Covered Code" means the Original Code, Modifications, the combination of Original Code and any Modifications, and/or any respective portions thereof. + + 1.5 "Deploy" means to use, sublicense or distribute Covered Code other than for Your internal research and development (R&D) and/or Personal Use, and includes without limitation, any and all internal use or distribution of Covered Code within Your business or organization except for R&D use and/or Personal Use, as well as direct or indirect sublicensing or distribution of Covered Code by You to any third party in any form or manner. + + 1.6 "Derivative Work" means either the Covered Code or any derivative work under United States copyright law, and including any work containing or including any portion of the Covered Code or Modifications, either verbatim or with modifications and/or translated into another language. Derivative Work also includes any work which combines any portion of Covered Code or Modifications with code not otherwise governed by the terms of this License. + + 1.7 "Externally Deploy" means to Deploy the Covered Code in any way that may be accessed or used by anyone other than You, used to provide any services to anyone other than You, or used in any way to deliver any content to anyone other than You, whether the Covered Code is distributed to those parties, made available as an application intended for use over a computer network, or used to provide services or otherwise deliver content to anyone other than You. + + 1.8. "Interface" means interfaces, functions, properties, class definitions, APIs, header files, GUIDs, V-Tables, and/or protocols allowing one piece of software, firmware or hardware to communicate or interoperate with another piece of software, firmware or hardware. + + 1.9 "Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of the Original Code, any previous Modifications, the combination of Original Code and any previous Modifications, and/or any respective portions thereof. When code is released as a series of files, a Modification is: (a) any addition to or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code. + + 1.10 "Original Code" means (a) the Source Code of a program or other work as originally made available by Licensor under this License, including the Source Code of any updates or upgrades to such programs or works made available by Licensor under this License, and that has been expressly identified by Licensor as such in the header file(s) of such work; and (b) the object code compiled from such Source Code and originally made available by Licensor under this License. + + 1.11 "Personal Use" means use of Covered Code by an individual solely for his or her personal, private and non-commercial purposes. An individual's use of Covered Code in his or her capacity as an officer, employee, member, independent contractor or agent of a corporation, business or organization (commercial or non-commercial) does not qualify as Personal Use. + + 1.12 "Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code). + + 1.13 "You" or "Your" means an individual or a legal entity exercising rights under this License. For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Permitted Uses; Conditions & Restrictions. Subject to the terms and conditions of this License, Licensor hereby grants You, effective on the date You accept this License (via downloading or using Covered Code or otherwise indicating your acceptance of this License), a worldwide, royalty-free, non-exclusive copyright license, to the extent of Licensor's copyrights cover the Original Code, to do the following: + + 2.1 You may reproduce, display, perform, modify and Deploy Covered Code, provided that in each instance: + + (a) You must retain and reproduce in all copies of Original Code the copyright and other proprietary notices and disclaimers of Licensor as they appear in the Original Code, and keep intact all notices in the Original Code that refer to this License; + + (b) You must include a copy of this License with every copy of Source Code of Covered Code and documentation You distribute, and You may not offer or impose any terms on such Source Code that alter or restrict this License or the recipients' rights hereunder, except as permitted under Section 6; + + (c) You must duplicate, to the extent it does not already exist, the notice in Exhibit A in each file of the Source Code of all Your Modifications, and cause the modified files to carry prominent notices stating that You changed the files and the date of any change; + + (d) You must make Source Code of all Your Externally Deployed Modifications publicly available under the terms of this License, including the license grants set forth in Section 3 below, for as long as you Deploy the Covered Code or twelve (12) months from the date of initial Deployment, whichever is longer. You should preferably distribute the Source Code of Your Deployed Modifications electronically (e.g. download from a web site); and + + (e) if You Deploy Covered Code in object code, executable form only, You must include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code. You must also include the Object Code Notice set forth in Exhibit A in the "about" box or other appropriate place where other copyright notices are placed, including any packaging materials. + + 2.2 You expressly acknowledge and agree that although Licensor and each Contributor grants the licenses to their respective portions of the Covered Code set forth herein, no assurances are provided by Licensor or any Contributor that the Covered Code does not infringe the patent or other intellectual property rights of any other entity. Licensor and each Contributor disclaim any liability to You for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, You hereby assume sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow You to make, use, sell, import or offer for sale the Covered Code, it is Your responsibility to acquire such license(s). + + 2.3 Subject to the terms and conditions of this License, Licensor hereby grants You, effective on the date You accept this License (via downloading or using Covered Code or otherwise indicating your acceptance of this License), a worldwide, royalty-free, perpetual, non-exclusive patent license under Licensor's Applicable Patent Rights to make, use, sell, offer for sale and import the Covered Code, provided that in each instance you comply with the terms of this License. + +3. Your Grants. In consideration of, and as a condition to, the licenses granted to You under this License: + + (a) You grant to Licensor and all third parties a non-exclusive, perpetual, irrevocable, royalty free license under Your Applicable Patent Rights and other intellectual property rights owned or controlled by You, to make, sell, offer for sale, use, import, reproduce, display, perform, modify, distribute and Deploy Your Modifications of the same scope and extent as Licensor's licenses under Sections 2.1 and 2.2; and + + (b) You grant to Licensor and its subsidiaries a non-exclusive, worldwide, royalty-free, perpetual and irrevocable license, under Your Applicable Patent Rights and other intellectual property rights owned or controlled by You, to make, use, sell, offer for sale, import, reproduce, display, perform, distribute, modify or have modified (for Licensor and/or its subsidiaries), sublicense and distribute Your Modifications, in any form and for any purpose, through multiple tiers of distribution. + + (c) You agree not use any information derived from Your use and review of the Covered Code, including but not limited to any algorithms or inventions that may be contained in the Covered Code, for the purpose of asserting any of Your patent rights, or assisting a third party to assert any of its patent rights, against Licensor or any Contributor. + +4. Derivative Works. You may create a Derivative Work by combining Covered Code with other code not otherwise governed by the terms of this License and distribute the Derivative Work as an integrated product. In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof, including all Modifications. + + 4.1 You must cause any Derivative Work that you distribute, publish or Externally Deploy, that in whole or in part contains or is derived from the Covered Code or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License and no other license except as provided in Section 4.2. You also must make Source Code available for the Derivative Work under the same terms as Modifications, described in Sections 2 and 3, above. + + 4.2 Compatible Source Licenses. Software modules that have been independently developed without any use of Covered Code and which contain no portion of the Covered Code, Modifications or other Derivative Works, but are used or combined in any way with the Covered Code or any Derivative Work to form a larger Derivative Work, are exempt from the conditions described in Section 4.1 but only to the extent that: the software module, including any software that is linked to, integrated with, or part of the same applications as, the software module by any method must be wholly subject to one of the Compatible Source Licenses. Notwithstanding the foregoing, all Covered Code must be subject to the terms of this License. Thus, the entire Derivative Work must be licensed under a combination of the RPSL (for Covered Code) and a Compatible Source License for any independently developed software modules within the Derivative Work. The foregoing requirement applies even if the Compatible Source License would ordinarily allow the software module to link with, or form larger works with, other software that is not subject to the Compatible Source License. For example, although the Mozilla Public License v1.1 allows Mozilla code to be combined with proprietary software that is not subject to the MPL, if MPL-licensed code is used with Covered Code the MPL-licensed code could not be combined or linked with any code not governed by the MPL. The general intent of this section 4.2 is to enable use of Covered Code with applications that are wholly subject to an acceptable open source license. You are responsible for determining whether your use of software with Covered Code is allowed under Your license to such software. + + 4.3 Mere aggregation of another work not based on the Covered Code with the Covered Code (or with a work based on the Covered Code) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. If You deliver the Covered Code for combination and/or integration with an application previously provided by You (for example, via automatic updating technology), such combination and/or integration constitutes a Derivative Work subject to the terms of this License. + +5. Exclusions From License Grant. Nothing in this License shall be deemed to grant any rights to trademarks, copyrights, patents, trade secrets or any other intellectual property of Licensor or any Contributor except as expressly stated herein. No right is granted to the trademarks of Licensor or any Contributor even if such marks are included in the Covered Code. Nothing in this License shall be interpreted to prohibit Licensor from licensing under different terms from this License any code that Licensor otherwise would have a right to license. Modifications, Derivative Works and/or any use or combination of Covered Code with other technology provided by Licensor or third parties may require additional patent licenses from Licensor which Licensor may grant in its sole discretion. No patent license is granted separate from the Original Code or combinations of the Original Code with other software or hardware. + + 5.1. Trademarks. This License does not grant any rights to use the trademarks or trade names owned by Licensor ("Licensor Marks" defined in Exhibit C) or to any trademark or trade name belonging to any Contributor. No Licensor Marks may be used to endorse or promote products derived from the Original Code other than as permitted by the Licensor Trademark Policy defined in Exhibit C. + +6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with the scope of the license granted herein ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Licensor or any Contributor. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Licensor and every Contributor harmless for any liability incurred by or claims asserted against Licensor or such Contributor by reason of any such Additional Terms. + +7. Versions of the License. Licensor may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Licensor. No one other than Licensor has the right to modify the terms applicable to Covered Code created under this License. + +8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part pre-release, untested, or not fully tested works. The Covered Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies. You expressly acknowledge and agree that use of the Covered Code, or any portion thereof, is at Your sole and entire risk. THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND LICENSOR AND LICENSOR'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS "LICENSOR" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. LICENSOR AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR WRITTEN DOCUMENTATION, INFORMATION OR ADVICE GIVEN BY LICENSOR, A LICENSOR AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You acknowledge that the Covered Code is not intended for use in high risk activities, including, but not limited to, the design, construction, operation or maintenance of nuclear facilities, aircraft navigation, aircraft communication systems, or air traffic control machines in which case the failure of the Covered Code could lead to death, personal injury, or severe physical or environmental damage. Licensor disclaims any express or implied warranty of fitness for such uses. + +9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR STRICT LIABILITY), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF LICENSOR OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Licensor's total liability to You for all damages (other than as may be required by applicable law) under this License exceed the amount of ten dollars ($10.00). + +10. Ownership. Subject to the licenses granted under this License, each Contributor retains all rights, title and interest in and to any Modifications made by such Contributor. Licensor retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Licensor ("Licensor Modifications"), and such Licensor Modifications will not be automatically subject to this License. Licensor may, at its sole discretion, choose to license such Licensor Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all. + +11. Termination. + + 11.1 Term and Termination. The term of this License is perpetual unless terminated as provided below. This License and the rights granted hereunder will terminate: + + (a) automatically without notice from Licensor if You fail to comply with any term(s) of this License and fail to cure such breach within 30 days of becoming aware of such breach; + + (b) immediately in the event of the circumstances described in Section 12.5(b); or + + (c) automatically without notice from Licensor if You, at any time during the term of this License, commence an action for patent infringement against Licensor (including by cross-claim or counter claim in a lawsuit); + + (d) upon written notice from Licensor if You, at any time during the term of this License, commence an action for patent infringement against any third party alleging that the Covered Code itself (excluding combinations with other software or hardware) infringes any patent (including by cross-claim or counter claim in a lawsuit). + + 11.2 Effect of Termination. Upon termination, You agree to immediately stop any further use, reproduction, modification, sublicensing and distribution of the Covered Code and to destroy all copies of the Covered Code that are in your possession or control. All sublicenses to the Covered Code which have been properly granted prior to termination shall survive any termination of this License. Provisions which, by their nature, should remain in effect beyond the termination of this License shall survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for compensation, indemnity or damages of any sort solely as a result of terminating this License in accordance with its terms, and termination of this License will be without prejudice to any other right or remedy of any party. + +12. Miscellaneous. + + 12.1 Government End Users. The Covered Code is a "commercial item" as defined in FAR 2.101. Government software and technical data rights in the Covered Code include only those rights customarily provided to the public as defined in this License. This customary commercial license in technical data and software is provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation). Accordingly, all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 12.2 Relationship of Parties. This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between or among You, Licensor or any Contributor, and You will not represent to the contrary, whether expressly, by implication, appearance or otherwise. + + 12.3 Independent Development. Nothing in this License will impair Licensor's right to acquire, license, develop, have others develop for it, market and/or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Derivative Works, technology or products that You may develop, produce, market or distribute. + + 12.4 Waiver; Construction. Failure by Licensor or any Contributor to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision. Any law or regulation which provides that the language of a contract shall be construed against the drafter will not apply to this License. + + 12.5 Severability. (a) If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and effect. (b) Notwithstanding the foregoing, if applicable law prohibits or restricts You from fully and/or specifically complying with Sections 2 and/or 3 or prevents the enforceability of either of those Sections, this License will immediately terminate and You must immediately discontinue any use of the Covered Code and destroy all copies of it that are in your possession or control. + + 12.6 Dispute Resolution. Any litigation or other dispute resolution between You and Licensor relating to this License shall take place in the Seattle, Washington, and You and Licensor hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that District with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. + + 12.7 Export/Import Laws. This software is subject to all export and import laws and restrictions and regulations of the country in which you receive the Covered Code and You are solely responsible for ensuring that You do not export, re-export or import the Covered Code or any direct product thereof in violation of any such restrictions, laws or regulations, or without all necessary authorizations. + + 12.8 Entire Agreement; Governing Law. This License constitutes the entire agreement between the parties with respect to the subject matter hereof. This License shall be governed by the laws of the United States and the State of Washington. + + Where You are located in the province of Quebec, Canada, the following clause applies: The parties hereby confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exigŽ que le prŽsent contrat et tous les documents connexes soient rŽdigŽs en anglais. + + +EXHIBIT A. + +"Copyright (c) 1995-2002 RealNetworks, Inc. and/or its licensors. All Rights Reserved. + +The contents of this file, and the files included with this file, are subject to the current version of the RealNetworks Public Source License Version 1.0 (the "RPSL") available at https://www.helixcommunity.org/content/rpsl unless you have licensed the file under the RealNetworks Community Source License Version 1.0 (the "RCSL") available at https://www.helixcommunity.org/content/rcsl, in which case the RCSL will apply. You may also obtain the license terms directly from RealNetworks. You may not use this file except in compliance with the RPSL or, if you have a valid RCSL with RealNetworks applicable to this file, the RCSL. Please see the applicable RPSL or RCSL for the rights, obligations and limitations governing use of the contents of the file. + +This file is part of the Helix DNA Technology. RealNetworks is the developer of the Original code and owns the copyrights in the portions it created. + +This file, and the files included with this file, is distributed and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + +Contributor(s): ____________________________________ + +Technology Compatibility Kit Test Suite(s) Location (if licensed under the RCSL): + +________________________________" + +Object Code Notice: Helix DNA Client technology included. Copyright (c) RealNetworks, Inc., 1995-2002. All rights reserved. + +EXHIBIT B + +Compatible Source Licenses for the RealNetworks Public Source License. The following list applies to the most recent version of the license as of October 25, 2002, unless otherwise indicated. + +Academic Free License +Apache Software License +Apple Public Source License +Artistic license +Attribution Assurance Licenses +BSD license +Common Public License1 +Eiffel Forum License +GNU General Public License (GPL)1 +GNU Library or "Lesser" General Public License (LGPL)1 +IBM Public License +Intel Open Source License +Jabber Open Source License +MIT license +MITRE Collaborative Virtual Workspace License (CVW License) +Motosoto License +Mozilla Public License 1.0 (MPL) +Mozilla Public License 1.1 (MPL) +Nokia Open Source License +Open Group Test Suite License +Python Software Foundation License +Ricoh Source Code Public License +Sun Industry Standards Source License (SISSL) +Sun Public License +University of Illinois/NCSA Open Source License +Vovida Software License v. 1.0 +W3C License +X.Net License +Zope Public License +zlib/libpng license + +1Note: because this license contains certain reciprocal licensing terms that purport to extend to independently developed code, You may be prohibited under the terms of this otherwise compatible license from using code licensed under its terms with Covered Code because Covered Code may only be licensed under the RealNetworks Public Source License. Any attempt to apply non RPSL license terms, including without limitation the GPL, to Covered Code is expressly forbidden. You are responsible for ensuring that Your use of Compatible Source Licensed code does not violate either the RPSL or the Compatible Source License. + +The latest version of this list can be found at: https://www.helixcommunity.org/content/complicense + +EXHIBIT C + +RealNetworks' Trademark policy. + +RealNetworks defines the following trademarks collectively as "Licensor Trademarks": "RealNetworks", "RealPlayer", "RealJukebox", "RealSystem", "RealAudio", "RealVideo", "RealOne Player", "RealMedia", "Helix" or any other trademarks or trade names belonging to RealNetworks. + +RealNetworks "Licensor Trademark Policy" forbids any use of Licensor Trademarks except as permitted by and in strict compliance at all times with RealNetworks' third party trademark usage guidelines which are posted at www.realnetworks.com/info/helixlogo.html. \ No newline at end of file diff --git a/options/license/RSA-MD b/options/license/RSA-MD new file mode 100644 index 0000000..e970131 --- /dev/null +++ b/options/license/RSA-MD @@ -0,0 +1,9 @@ +Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. + +License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. <> Message-Digest Algorithm" in all material mentioning or referencing this software or this function. + +License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. <> Message-Digest Algorithm" in all material mentioning or referencing the derived work. + +RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. + +These notices must be retained in any copies of any part of this documentation and/or software. diff --git a/options/license/RSCPL b/options/license/RSCPL new file mode 100644 index 0000000..d3b4243 --- /dev/null +++ b/options/license/RSCPL @@ -0,0 +1,128 @@ +Ricoh Source Code Public License +Version 1.0 + +1. Definitions. + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Electronic Distribution Mechanism" means a website or any other mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.4. "Executable Code" means Governed Code in any form other than Source Code. + + 1.5. "Governed Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.6. "Larger Work" means a work which combines Governed Code or portions thereof with code not governed by the terms of this License. + + 1.7. "Licensable" means the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.8. "License" means this document. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Governed Code is released as a series of files, a Modification is: + + (a) Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + (b) Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. "Original Code" means the "Platform for Information Applications" Source Code as released under this License by RSV. + + 1.11 "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by the grantor of a license thereto. + + 1.12. "RSV" means Ricoh Silicon Valley, Inc., a California corporation with offices at 2882 Sand Hill Road, Suite 115, Menlo Park, CA 94025-7022. + + 1.13. "Source Code" means the preferred form of the Governed Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of Executable Code, or a list of source code differential comparisons against either the Original Code or another well known, available Governed Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.14. "You" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.1. Grant from RSV. RSV hereby grants You a worldwide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, create derivative works of, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + + 2.2. Contributor Grant. Each Contributor hereby grants You a worldwide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) to use, reproduce, modify, create derivative works of, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Governed Code or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: (i) Modifications made by that Contributor (or portions thereof); and (ii) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + +3. Distribution Obligations. + + 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Governed Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable Code version or via an Electronic Distribution Mechanism to anyone to whom you made an Executable Code version available; and if made available via an Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. You must cause all Governed Code to which you contribute to contain a file documenting the changes You made to create that Governed Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by RSV and including the name of RSV in (a) the Source Code, and (b) in any notice in an Executable Code version or related documentation in which You describe the origin or ownership of the Governed Code. + + 3.4. Intellectual Property Matters. + + 3.4.1. Third Party Claims. If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying RSV and appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Governed Code that new knowledge has been obtained. In the event that You are a Contributor, You represent that, except as disclosed in the LEGAL file, your Modifications are your original creations and, to the best of your knowledge, no third party has any claim (including but not limited to intellectual property claims) relating to your Modifications. You represent that the LEGAL file includes complete details of any license or other restriction associated with any part of your Modifications. + + 3.4.2. Contributor APIs. If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file. + + 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Governed Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Governed Code. However, You may do so only on Your own behalf, and not on behalf of RSV or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify RSV and every Contributor for any liability incurred by RSV or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Code Versions. You may distribute Governed Code in Executable Code form only if the requirements of Section 3.1-3.5 have been met for that Governed Code, and if You include a prominent notice stating that the Source Code version of the Governed Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable Code version, related documentation or collateral in which You describe recipients' rights relating to the Governed Code. You may distribute the Executable Code version of Governed Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable Code version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable Code version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by RSV or any Contributor. You hereby agree to indemnify RSV and every Contributor for any liability incurred by RSV or such Contributor as a result of any such terms You offer. + + 3.7. Larger Works. You may create a Larger Work by combining Governed Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Governed Code. + +4. Inability to Comply Due to Statute or Regulation. +If it is impossible for You to comply with any of theterms of this License with respect to some or all of the Governed Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Trademark Usage. + + 5.1. Advertising Materials. All advertising materials mentioning features or use of the Governed Code must display the following acknowledgement: "This product includes software developed by Ricoh Silicon Valley, Inc." + + 5.2. Endorsements. The names "Ricoh," "Ricoh Silicon Valley," and "RSV" must not be used to endorse or promote Contributor Versions or Larger Works without the prior written permission of RSV. + + 5.3. Product Names. Contributor Versions and Larger Works may not be called "Ricoh" nor may the word "Ricoh" appear in their names without the prior written permission of RSV. + +6. Versions of the License. + + 6.1. New Versions. RSV may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions. Once Governed Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Governed Code under the terms of any subsequent version of the License published by RSV. No one other than RSV has the right to modify the terms applicable to Governed Code created under this License. + +7. Disclaimer of Warranty. +GOVERNED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE GOVERNED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE GOVERNED CODE IS WITH YOU. SHOULD ANY GOVERNED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT RSV OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY GOVERNED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. Termination. + + 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Governed Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2. If You initiate patent infringement litigation against RSV or a Contributor (RSV or the Contributor against whom You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Original Code or Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of the Original Code or the Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Original Code or the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + + (b) any software, hardware, or device provided to You by the Participant, other than such Participant's Original Code or Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Original Code or the Modifications made by that Participant. + + 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Original Code or Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. Limitation of Liability. +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL RSV, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF GOVERNED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. TO THE EXTENT THAT ANY EXCLUSION OF DAMAGES ABOVE IS NOT VALID, YOU AGREE THAT IN NO EVENT WILL RSVS LIABILITY UNDER OR RELATED TO THIS AGREEMENT EXCEED FIVE THOUSAND DOLLARS ($5,000). THE GOVERNED CODE IS NOT INTENDED FOR USE IN CONNECTION WITH ANY NUCLER, AVIATION, MASS TRANSIT OR MEDICAL APPLICATION OR ANY OTHER INHERENTLY DANGEROUS APPLICATION THAT COULD RESULT IN DEATH, PERSONAL INJURY, CATASTROPHIC DAMAGE OR MASS DESTRUCTION, AND YOU AGREE THAT NEITHER RSV NOR ANY CONTRIBUTOR SHALL HAVE ANY LIABILITY OF ANY NATURE AS A RESULT OF ANY SUCH USE OF THE GOVERNED CODE. + + +10. U.S. Government End Users. +The Governed Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Governed Code with only those rights set forth herein. + +11. Miscellaneous. +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. The parties submit to personal jurisdiction in California and further agree that any cause of action arising under or related to this Agreement shall be brought in the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California. The losing party shall be responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. Notwithstanding anything to the contrary herein, RSV may seek injunctive relief related to a breach of this Agreement in any court of competent jurisdiction. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. Responsibility for Claims. +Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Governed Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis. + + +EXHIBIT A + +"The contents of this file are subject to the Ricoh Source Code Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.risource.org/RPL + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +This code was initially developed by Ricoh Silicon Valley, Inc. Portions created by Ricoh Silicon Valley, Inc. are Copyright (C) 1995-1999. All Rights Reserved. + +Contributor(s): ______________________________________." \ No newline at end of file diff --git a/options/license/Rdisc b/options/license/Rdisc new file mode 100644 index 0000000..4ec3c64 --- /dev/null +++ b/options/license/Rdisc @@ -0,0 +1,13 @@ +Rdisc (this program) was developed by Sun Microsystems, Inc. and is provided for unrestricted use provided that this legend is included on all tape media and as a part of the software program in whole or part. Users may copy or modify Rdisc without charge, and they may freely distribute it. + +RDISC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + +Rdisc is provided with no support and without any obligation on the part of Sun Microsystems, Inc. to assist in its use, correction, modification or enhancement. + +SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY RDISC OR ANY PART THEREOF. + +In no event will Sun Microsystems, Inc. be liable for any lost revenue or profits or other special, indirect and consequential damages, even if Sun has been advised of the possibility of such damages. + +Sun Microsystems, Inc. +2550 Garcia Avenue +Mountain View, California 94043 \ No newline at end of file diff --git a/options/license/Ruby b/options/license/Ruby new file mode 100644 index 0000000..7bd005e --- /dev/null +++ b/options/license/Ruby @@ -0,0 +1,29 @@ +1. You may make and give away verbatim copies of the source form of the software without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. + +2. You may modify your copy of the software in any way, provided that you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or by allowing the author to include your modifications in the software. + + b) use the modified software only within your corporation or organization. + + c) give non-standard binaries non-standard names, with instructions on where to get the original software distribution. + + d) make other distribution arrangements with the author. + +3. You may distribute the software in object code or binary form, provided that you do at least ONE of the following: + + a) distribute the binaries and library files of the software, together with instructions (in the manual page or equivalent) on where to get the original distribution. + + b) accompany the distribution with the machine-readable source of the software. + + c) give non-standard binaries non-standard names, with instructions on where to get the original software distribution. + + d) make other distribution arrangements with the author. + +4. You may modify and include the part of the software into any other software (possibly commercial). But some files in the distribution are not written by the author, so that they are not under these terms. + +For the list of those files and their copying conditions, see the file LEGAL. + +5. The scripts and library files supplied as input to or produced as output from the software do not automatically fall under the copyright of the software, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this software. + +6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. \ No newline at end of file diff --git a/options/license/SAX-PD b/options/license/SAX-PD new file mode 100644 index 0000000..9eea696 --- /dev/null +++ b/options/license/SAX-PD @@ -0,0 +1,31 @@ +Copyright Status + +SAX is free! + +In fact, it's not possible to own a license to SAX, since it's been placed in the public domain. + +No Warranty + +Because SAX is released to the public domain, there is no warranty for the design or for the software implementation, to the extent permitted by applicable law. Except when otherwise stated in writing the copyright holders and/or other parties provide SAX "as is" without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of SAX is with you. Should SAX prove defective, you assume the cost of all necessary servicing, repair or correction. + +In no event unless required by applicable law or agreed to in writing will any copyright holder, or any other party who may modify and/or redistribute SAX, be liable to you for damages, including any general, special, incidental or consequential damages arising out of the use or inability to use SAX (including but not limited to loss of data or data being rendered inaccurate or losses sustained by you or third parties or a failure of the SAX to operate with any other programs), even if such holder or other party has been advised of the possibility of such damages. + +Copyright Disclaimers + +This page includes statements to that effect by David Megginson, who would have been able to claim copyright for the original work. + +SAX 1.0 + +Version 1.0 of the Simple API for XML (SAX), created collectively by the membership of the XML-DEV mailing list, is hereby released into the public domain. + +No one owns SAX: you may use it freely in both commercial and non-commercial applications, bundle it with your software distribution, include it on a CD-ROM, list the source code in a book, mirror the documentation at your own web site, or use it in any other way you see fit. + +David Megginson, Megginson Technologies Ltd. +1998-05-11 + +SAX 2.0 + +I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and release all of the SAX 2.0 source code, compiled code, and documentation contained in this distribution into the Public Domain. SAX comes with NO WARRANTY or guarantee of fitness for any purpose. + +David Megginson, Megginson Technologies Ltd. +2000-05-05 \ No newline at end of file diff --git a/options/license/SCEA b/options/license/SCEA new file mode 100644 index 0000000..74f2b28 --- /dev/null +++ b/options/license/SCEA @@ -0,0 +1,60 @@ +SCEA Shared Source License 1.0 + +Terms and Conditions: + +1. Definitions: + +"Software" shall mean the software and related documentation, whether in Source or Object Form, made available under this SCEA Shared Source license ("License"), that is indicated by a copyright notice file included in the source files or attached or accompanying the source files. + +"Licensor" shall mean Sony Computer Entertainment America, Inc. (herein "SCEA") + +"Object Code" or "Object Form" shall mean any form that results from translation or transformation of Source Code, including but not limited to compiled object code or conversions to other forms intended for machine execution. +"Source Code" or "Source Form" shall have the plain meaning generally accepted in the software industry, including but not limited to software source code, documentation source, header and configuration files. + +"You" or "Your" shall mean you as an individual or as a company, or whichever form under which you are exercising rights under this License. + +2. License Grant. + +Licensor hereby grants to You, free of charge subject to the terms and conditions of this License, an irrevocable, non-exclusive, worldwide, perpetual, and royalty-free license to use, modify, reproduce, distribute, publicly perform or display the Software in Object or Source Form . + +3. No Right to File for Patent. +In exchange for the rights that are granted to You free of charge under this License, You agree that You will not file for any patent application, seek copyright protection or take any other action that might otherwise impair the ownership rights in and to the Software that may belong to SCEA or any of the other contributors/authors of the Software. + +4. Contributions. + +SCEA welcomes contributions in form of modifications, optimizations, tools or documentation designed to improve or expand the performance and scope of the Software (collectively "Contributions"). Per the terms of this License You are free to modify the Software and those modifications would belong to You. You may however wish to donate Your Contributions to SCEA for consideration for inclusion into the Software. For the avoidance of doubt, if You elect to send Your Contributions to SCEA, You are doing so voluntarily and are giving the Contributions to SCEA and its parent company Sony Computer Entertainment, Inc., free of charge, to use, modify or distribute in any form or in any manner. SCEA acknowledges that if You make a donation of Your Contributions to SCEA, such Contributions shall not exclusively belong to SCEA or its parent company and such donation shall not be to Your exclusion. SCEA, in its sole discretion, shall determine whether or not to include Your donated Contributions into the Software, in whole, in part, or as modified by SCEA. Should SCEA elect to include any such Contributions into the Software, it shall do so at its own risk and may elect to give credit or special thanks to any such contributors in the attached copyright notice. However, if any of Your contributions are included into the Software, they will become part of the Software and will be distributed under the terms and conditions of this License. Further, if Your donated Contributions are integrated into the Software then Sony Computer Entertainment, Inc. shall become the copyright owner of the Software now containing Your contributions and SCEA would be the Licensor. + +5. Redistribution in Source Form + +You may redistribute copies of the Software, modifications or derivatives thereof in Source Code Form, provided that You: + + a. Include a copy of this License and any copyright notices with source + + b. Identify modifications if any were made to the Software + + c. Include a copy of all documentation accompanying the Software and modifications made by You + +6. Redistribution in Object Form + +If You redistribute copies of the Software, modifications or derivatives thereof in Object Form only (as incorporated into finished goods, i.e. end user applications) then You will not have a duty to include any copies of the code, this License, copyright notices, other attributions or documentation. + +7. No Warranty + +THE SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT ANY REPRESENTATIONS OR WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR DETERMINING THE APPROPRIATENESS OF USING, MODIFYING OR REDISTRIBUTING THE SOFTWARE AND ASSUME ANY RISKS ASSOCIATED WITH YOUR EXERCISE OF PERMISSIONS UNDER THIS LICENSE. + +8. Limitation of Liability + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY WILL EITHER PARTY BE LIABLE TO THE OTHER PARTY OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, SPECIAL, INCIDENTAL, OR EXEMPLARY DAMAGES WITH RESPECT TO ANY INJURY, LOSS, OR DAMAGE, ARISING UNDER OR IN CONNECTION WITH THIS LETTER AGREEMENT, WHETHER FORESEEABLE OR UNFORESEEABLE, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH INJURY, LOSS, OR DAMAGE. THE LIMITATIONS OF LIABILITY SET FORTH IN THIS SECTION SHALL APPLY TO THE FULLEST EXTENT PERMISSIBLE AT LAW OR ANY GOVERMENTAL REGULATIONS. + +9. Governing Law and Consent to Jurisdiction + +This Agreement shall be governed by and interpreted in accordance with the laws of the State of California, excluding that body of law related to choice of laws, and of the United States of America. Any action or proceeding brought to enforce the terms of this Agreement or to adjudicate any dispute arising hereunder shall be brought in the Superior Court of the County of San Mateo, State of California or the United States District Court for the Northern District of California. Each of the parties hereby submits itself to the exclusive jurisdiction and venue of such courts for purposes of any such action. In addition, each party hereby waives the right to a jury trial in any action or proceeding related to this Agreement. + +10. Copyright Notice for Redistribution of Source Code + +Copyright 2005 Sony Computer Entertainment Inc. + +Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at: +http://research.scea.com/scea_shared_source_license.html + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/options/license/SGI-B-1.0 b/options/license/SGI-B-1.0 new file mode 100644 index 0000000..a39c02a --- /dev/null +++ b/options/license/SGI-B-1.0 @@ -0,0 +1,82 @@ +SGI FREE SOFTWARE LICENSE B +(Version 1.0 1/25/2000) + +1. Definitions. + + 1.1 "Additional Notice Provisions" means such additional provisions as appear in the Notice in Original Code under the heading "Additional Notice Provisions." + + 1.2 "API" means an application programming interface established by SGI in conjunction with the Original Code. + + 1.3 "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 "Hardware" means any physical device that accepts input, processes input, stores the results of processing, and/or provides output. + + 1.5 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.6 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.7 "License" means this document. + + 1.8 "Modifications" means any addition to the substance or structure of the Original Code and/or any addition to or deletion from previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to the contents of a file containing Original Code and/or any addition to or deletion from previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.9 "Notice" means any notice in Original Code or Covered Code, as required by and in compliance with this License. + + 1.10 "Original Code" means source code of computer software code which is described in the source code Notice required by Exhibit A as Original Code, and updates and error corrections specifically thereto. + + 1.11 "Recipient" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 8. For legal entities, "Recipient" includes any entity which controls, is controlled by, or is under common control with Recipient. For purposes of this definition, "control" of an entity means (a) the power, direct or indirect, to direct or manage such entity, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + + 1.12 SGI" means Silicon Graphics, Inc. + +2. License Grant and Restrictions. + + 2.1v License Grant. Subject to the provisions of this License and any third party intellectual property claims, for the duration of intellectual property protections inherent in the Original Code, SGI hereby grants Recipient a worldwide, royalty-free, non-exclusive license, to do the following: (i) under copyrights Licensable by SGI, to reproduce, distribute, create derivative works from, and, to the extent applicable, display and perform the Original Code alone and/or as part of a Larger Work; and (ii) under any patent claims Licensable by SGI and embodied in the Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code. Recipient accepts the terms and conditions of this License by undertaking any of the aforementioned actions. + + 2.2 Restriction on Patent License. Notwithstanding the provisions of Section 2.1(ii), no patent license is granted: 1) separate from the Original Code; nor 2) for infringements caused by (i) modification of the Original Code, or (ii) the combination of the Original Code with other software or Hardware. + + 2.3 No License For Hardware Implementations. The licenses granted in Section 2.1 are not applicable to implementation in Hardware of the algorithms embodied in the Original Code. + + 2.4 Modifications License and API Compliance. Modifications are only licensed under Section 2.1(i) to the extent such Modifications are fully compliant with any API as may be identified in Additional Notice Provisions as appear in the Original Code. + +3. Redistributions. + + A. Retention of Notice/Copy of License. The Notice set forth in Exhibit A, below, must be conspicuously retained or included in any and all redistributions of Covered Code. For distributions of the Covered Code in source code form, the Notice must appear in every file that can include a text comments field; in executable form, the Notice and a copy of this License must appear in related documentation or collateral where the Recipient’s rights relating to Covered Code are described. Any Additional Notice Provisions which actually appears in the Original Code must also be retained or included in any and all redistributions of Covered Code. + + B. Alternative License. Provided that Recipient is in compliance with the terms of this License, Recipient may distribute the source code and/or executable version(s) of Covered Code under (1) this License; (2) a license identical to this License but for only such changes as are necessary in order to clarify Recipient’s role as licensor of Modifications, without derogation of any of SGI’s rights; and/or (3) a license of Recipient’s choosing, containing terms different from this License, provided that the license terms include this Section 3 and Sections 4, 6, 7, 10, 12, and 13, which terms may not be modified or superseded by any other terms of such license. If Recipient elects to use any license other than this License, Recipient must make it absolutely clear that any of its terms which differ from this License are offered by Recipient alone, and not by SGI. + + C. Indemnity. Recipient hereby agrees to indemnify SGI for any liability incurred by SGI as a result of any such alternative license terms Recipient offers. + +4. Termination. This License and the rights granted hereunder will terminate automatically if Recipient breaches any term herein and fails to cure such breach within 30 days thereof. Any sublicense to the Covered Code that is properly granted shall survive any termination of this License, absent termination by the terms of such sublicense. Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive. + +5. No Trademark Or Other Rights. This License does not grant any rights to: (i) any software apart from the Covered Code, nor shall any other rights or licenses not expressly granted hereunder arise by implication, estoppel or otherwise with respect to the Covered Code; (ii) any trade name, trademark or service mark whatsoever, including without limitation any related right for purposes of endorsement or promotion of products derived from the Covered Code, without prior written permission of SGI; or (iii) any title to or ownership of the Original Code, which shall at all times remains with SGI. All rights in the Original Code not expressly granted under this License are reserved. + +6. Compliance with Laws; Non-Infringement. Recipient hereby assures that it shall comply with all applicable laws, regulations, and executive orders, in connection with any and all dispositions of Covered Code, including but not limited to, all export, re-export, and import control laws, regulations, and executive orders, of the U.S. government and other countries. Recipient may not distribute Covered Code that (i) in any way infringes (directly or contributorily) the rights (including patent, copyright, trade secret, trademark or other intellectual property rights of any kind) of any other person or entity or (ii) breaches any representation or warranty, express, implied or statutory, to which, under any applicable law, it might be deemed to have been subject. + +7. Claims of Infringement. If Recipient learns of any third party claim that any disposition of Covered Code and/or functionality wholly or partially infringes the third party's intellectual property rights, Recipient will promptly notify SGI of such claim. + +8. Versions of the License. SGI may publish revised and/or new versions of the License from time to time, each with a distinguishing version number. Once Covered Code has been published under a particular version of the License, Recipient may, for the duration of the license, continue to use it under the terms of that version, or choose to use such Covered Code under the terms of any subsequent version published by SGI. Subject to the provisions of Sections 3 and 4 of this License, only SGI may modify the terms applicable to Covered Code created under this License. + +9. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED "AS IS." ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. SGI ASSUMES NO RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY IS AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT SUBJECT TO THIS DISCLAIMER. + +10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES NOR LEGAL THEORY, WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY), CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT. + +11. Indemnity. Recipient shall be solely responsible for damages arising, directly or indirectly, out of its utilization of rights under this License. Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from and against any loss, liability, damages, costs or expenses (including the payment of reasonable attorneys fees) arising out of Recipient's use, modification, reproduction and distribution of the Covered Code or out of any representation or warranty made by Recipient. + +12. U.S. Government End Users. The Covered Code is a "commercial item" consisting of "commercial computer software" as such terms are defined in title 48 of the Code of Federal Regulations and all U.S. Government End Users acquire only the rights set forth in this License and are subject to the terms of this License. + +13. Miscellaneous. This License represents the complete agreement concerning the its subject matter. If any provision of this License is held to be unenforceable, such provision shall be reformed so as to achieve as nearly as possible the same legal and economic effect as the original provision and the remainder of this License will remain in effect. This License shall be governed by and construed in accordance with the laws of the United States and the State of California as applied to agreements entered into and to be performed entirely within California between California residents. Any litigation relating to this License shall be subject to the exclusive jurisdiction of the Federal Courts of the Northern District of California (or, absent subject matter jurisdiction in such courts, the courts of the State of California), with venue lying exclusively in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +Exhibit A + +License Applicability. Except to the extent portions of this file are made subject to an alternative license as permitted in the SGI Free Software License B, Version 1.0 (the "License"), the contents of this file are subject only to the provisions of the License. You may not use this file except in compliance with the License. You may obtain a copy of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 Ampitheatre Parkway, Mountain View, CA 94043-1351, or at: + +http://oss.sgi.com/projects/FreeB + +Note that, as provided in the License, the Software is distributed on an "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + +Original Code. The Original Code is: [name of software, version number, and release date], developed by Silicon Graphics, Inc. The Original Code is Copyright (c) [dates of first publication, as appearing in the Notice in the Original Code] Silicon Graphics, Inc. Copyright in any portions created by third parties is as indicated elsewhere herein. All Rights Reserved. + +Additional Notice Provisions: [such additional provisions, if any, as appear in the Notice in the Original Code under the heading "Additional Notice Provisions"] diff --git a/options/license/SGI-B-1.1 b/options/license/SGI-B-1.1 new file mode 100644 index 0000000..654f5c0 --- /dev/null +++ b/options/license/SGI-B-1.1 @@ -0,0 +1,84 @@ +SGI FREE SOFTWARE LICENSE B +(Version 1.1 02/22/2000) + +1. Definitions. + + 1.1 "Additional Notice Provisions" means such additional provisions as appear in the Notice in Original Code under the heading "Additional Notice Provisions." + + 1.2 "Covered Code" means the Original Code or Modifications, or any combination thereof. + + 1.3 "Hardware" means any physical device that accepts input, processes input, stores the results of processing, and/or provides output. + + 1.4 "Larger Work" means a work that combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.5 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.6 "License" means this document. + + 1.7 "Licensed Patents" means patent claims Licensable by SGI that are infringed by the use or sale of Original Code or any Modifications provided by SGI, or any combination thereof. + + 1.8 "Modifications" means any addition to or deletion from the substance or structure of the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to the contents of a file containing Original Code and/or addition to or deletion from the contents of a file containing previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.9 "Notice" means any notice in Original Code or Covered Code, as required by and in compliance with this License. + + 1.10 "Original Code" means source code of computer software code that is described in the source code Notice required by Exhibit A as Original Code, and updates and error corrections specifically thereto. + + 1.11 "Recipient" means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 8. For legal entities, "Recipient" includes any entity that controls, is controlled by, or is under common control with Recipient. For purposes of this definition, "control" of an entity means (a) the power, direct or indirect, to direct or manage such entity, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + + 1.12 "Recipient Patents" means patent claims Licensable by a Recipient that are infringed by the use or sale of Original Code or any Modifications provided by SGI, or any combination thereof. + + 1.13 "SGI" means Silicon Graphics, Inc. + + 1.14 "SGI Patents" means patent claims Licensable by SGI other than the Licensed Patents. + +2. License Grant and Restrictions. + + 2.1 SGI License Grant. Subject to the terms of this License and any third party intellectual property claims, for the duration of intellectual property protections inherent in the Original Code, SGI hereby grants Recipient a worldwide, royalty-free, non-exclusive license, to do the following: (i) under copyrights Licensable by SGI, to reproduce, distribute, create derivative works from, and, to the extent applicable, display and perform the Original Code and/or any Modifications provided by SGI alone and/or as part of a Larger Work; and (ii) under any Licensable Patents, to make, have made, use, sell, offer for sale, import and/or otherwise transfer the Original Code and/or any Modifications provided by SGI. Recipient accepts the terms and conditions of this License by undertaking any of the aforementioned actions. The patent license shall apply to the Covered Code if, at the time any related Modification is added, such addition of the Modification causes such combination to be covered by the Licensed Patents. The patent license in Section 2.1(ii) shall not apply to any other combinations that include the Modification. No patent license is provided under SGI Patents for infringements of SGI Patents by Modifications not provided by SGI or combinations of Original Code and Modifications not provided by SGI. + + 2.2 Recipient License Grant. Subject to the terms of this License and any third party intellectual property claims, Recipient hereby grants SGI and any other Recipients a worldwide, royalty-free, non-exclusive license, under any Recipient Patents, to make, have made, use, sell, offer for sale, import and/or otherwise transfer the Original Code and/or any Modifications provided by SGI. + + 2.3 No License For Hardware Implementations. The licenses granted in Section 2.1 and 2.2 are not applicable to implementation in Hardware of the algorithms embodied in the Original Code or any Modifications provided by SGI . + +3. Redistributions. + + 3.1 Retention of Notice/Copy of License. The Notice set forth in Exhibit A, below, must be conspicuously retained or included in any and all redistributions of Covered Code. For distributions of the Covered Code in source code form, the Notice must appear in every file that can include a text comments field; in executable form, the Notice and a copy of this License must appear in related documentation or collateral where the Recipient’s rights relating to Covered Code are described. Any Additional Notice Provisions which actually appears in the Original Code must also be retained or included in any and all redistributions of Covered Code. + + 3.2 Alternative License. Provided that Recipient is in compliance with the terms of this License, Recipient may, so long as without derogation of any of SGI’s rights in and to the Original Code, distribute the source code and/or executable version(s) of Covered Code under (1) this License; (2) a license identical to this License but for only such changes as are necessary in order to clarify Recipient’s role as licensor of Modifications; and/or (3) a license of Recipient’s choosing, containing terms different from this License, provided that the license terms include this Section 3 and Sections 4, 6, 7, 10, 12, and 13, which terms may not be modified or superseded by any other terms of such license. If Recipient elects to use any license other than this License, Recipient must make it absolutely clear that any of its terms which differ from this License are offered by Recipient alone, and not by SGI. It is emphasized that this License is a limited license, and, regardless of the license form employed by Recipient in accordance with this Section 3.2, Recipient may relicense only such rights, in Original Code and Modifications by SGI, as it has actually been granted by SGI in this License. + + 3.3 Indemnity. Recipient hereby agrees to indemnify SGI for any liability incurred by SGI as a result of any such alternative license terms Recipient offers. + +4. Termination. This License and the rights granted hereunder will terminate automatically if Recipient breaches any term herein and fails to cure such breach within 30 days thereof. Any sublicense to the Covered Code that is properly granted shall survive any termination of this License, absent termination by the terms of such sublicense. Provisions that, by their nature, must remain in effect beyond the termination of this License, shall survive. + +5. No Trademark Or Other Rights. This License does not grant any rights to: (i) any software apart from the Covered Code, nor shall any other rights or licenses not expressly granted hereunder arise by implication, estoppel or otherwise with respect to the Covered Code; (ii) any trade name, trademark or service mark whatsoever, including without limitation any related right for purposes of endorsement or promotion of products derived from the Covered Code, without prior written permission of SGI; or (iii) any title to or ownership of the Original Code, which shall at all times remains with SGI. All rights in the Original Code not expressly granted under this License are reserved. + +6. Compliance with Laws; Non-Infringement. There are various worldwide laws, regulations, and executive orders applicable to dispositions of Covered Code, including without limitation export, re-export, and import control laws, regulations, and executive orders, of the U.S. government and other countries, and Recipient is reminded it is obliged to obey such laws, regulations, and executive orders. Recipient may not distribute Covered Code that (i) in any way infringes (directly or contributorily) any intellectual property rights of any kind of any other person or entity or (ii) breaches any representation or warranty, express, implied or statutory, to which, under any applicable law, it might be deemed to have been subject. + +7. Claims of Infringement. If Recipient learns of any third party claim that any disposition of Covered Code and/or functionality wholly or partially infringes the third party's intellectual property rights, Recipient will promptly notify SGI of such claim. + +8. Versions of the License. SGI may publish revised and/or new versions of the License from time to time, each with a distinguishing version number. Once Covered Code has been published under a particular version of the License, Recipient may, for the duration of the license, continue to use it under the terms of that version, or choose to use such Covered Code under the terms of any subsequent version published by SGI. Subject to the provisions of Sections 3 and 4 of this License, only SGI may modify the terms applicable to Covered Code created under this License. + +9. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED "AS IS." ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. SGI ASSUMES NO RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY IS AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT SUBJECT TO THIS DISCLAIMER. + +10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES NOR LEGAL THEORY, WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY), CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT. + +11. Indemnity. Recipient shall be solely responsible for damages arising, directly or indirectly, out of its utilization of rights under this License. Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from and against any loss, liability, damages, costs or expenses (including the payment of reasonable attorneys fees) arising out of Recipient's use, modification, reproduction and distribution of the Covered Code or out of any representation or warranty made by Recipient. + +12. U.S. Government End Users. The Covered Code is a "commercial item" consisting of "commercial computer software" as such terms are defined in title 48 of the Code of Federal Regulations and all U.S. Government End Users acquire only the rights set forth in this License and are subject to the terms of this License. + +13. Miscellaneous. This License represents the complete agreement concerning the its subject matter. If any provision of this License is held to be unenforceable, such provision shall be reformed so as to achieve as nearly as possible the same legal and economic effect as the original provision and the remainder of this License will remain in effect. This License shall be governed by and construed in accordance with the laws of the United States and the State of California as applied to agreements entered into and to be performed entirely within California between California residents. Any litigation relating to this License shall be subject to the exclusive jurisdiction of the Federal Courts of the Northern District of California (or, absent subject matter jurisdiction in such courts, the courts of the State of California), with venue lying exclusively in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation that provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +Exhibit A + +License Applicability. Except to the extent portions of this file are made subject to an alternative license as permitted in the SGI Free Software License B, Version 1.1 (the "License"), the contents of this file are subject only to the provisions of the License. You may not use this file except in compliance with the License. You may obtain a copy of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: + +http://oss.sgi.com/projects/FreeB + +Note that, as provided in the License, the Software is distributed on an "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + +Original Code. The Original Code is: [name of software, version number, and release date], developed by Silicon Graphics, Inc. The Original Code is Copyright (c) [dates of first publication, as appearing in the Notice in the Original Code] Silicon Graphics, Inc. Copyright in any portions created by third parties is as indicated elsewhere herein. All Rights Reserved. + +Additional Notice Provisions: [such additional provisions, if any, as appear in the Notice in the Original Code under the heading "Additional Notice Provisions"] diff --git a/options/license/SGI-B-2.0 b/options/license/SGI-B-2.0 new file mode 100644 index 0000000..4195ee5 --- /dev/null +++ b/options/license/SGI-B-2.0 @@ -0,0 +1,13 @@ +SGI FREE SOFTWARE LICENSE B +(Version 2.0, Sept. 18, 2008) + +Copyright (C) [dates of first publication] Silicon Graphics, Inc. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice including the dates of first publication and either this permission notice or a reference to http://oss.sgi.com/projects/FreeB/ shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of Silicon Graphics, Inc. shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Silicon Graphics, Inc. + diff --git a/options/license/SISSL b/options/license/SISSL new file mode 100644 index 0000000..1d84d36 --- /dev/null +++ b/options/license/SISSL @@ -0,0 +1,116 @@ +Sun Industry Standards Source License - Version 1.1 + +1.0 DEFINITIONS + + 1.1 "Commercial Use" means distribution or otherwise making the Original Code available to a third party. + + 1.2 "Contributor Version" means the combination of the Original Code, and the Modifications made by that particular Contributor. + + 1.3 "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.4 "Executable" means Original Code in any form other than Source Code. + + 1.5 "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.6 "Larger Work" means a work which combines Original Code or portions thereof with code not governed by the terms of this License. + + 1.7 "License" means this document. + + 1.8 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. A Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code. + + 1.11 "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.12 "Source Code" means the preferred form of the Original Code for making modifications to it, including all modules it contains, plus any associated interface definition files, or scripts used to control compilation and installation of an Executable. + + 1.13 "Standards" means the standards identified in Exhibit B. + + 1.14 "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2.0 SOURCE CODE LICENSE + + 2.1 The Initial Developer Grant The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:  + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof).
 + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License.
 + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices, including but not limited to Modifications.  + +3.0 DISTRIBUTION OBLIGATIONS + + 3.1 Application of License. The Source Code version of Original Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. Your license for shipment of the Contributor Version is conditioned upon Your full compliance with this Section. The Modifications which You create must comply with all requirements set out by the Standards body in effect one hundred twenty (120) days before You ship the Contributor Version. In the event that the Modifications do not meet such requirements, You agree to publish either (i) any deviation from the Standards protocol resulting from implementation of Your Modifications and a reference implementation of Your Modifications or (ii) Your Modifications in Source Code form, and to make any such deviation and reference implementation or Modifications available to all third parties under the same terms as this license on a royalty free basis within thirty (30) days of Your first customer shipment of Your Modifications. + + 3.2 Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add Your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Initial Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Your version of the Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer for any liability incurred by the Initial Developer as a result of warranty, support, indemnity or liability terms You offer. + + 3.3 Distribution of Executable Versions. You may distribute Original Code in Executable and Source form only if the requirements of Sections 3.1 and 3.2 have been met for that Original Code, and if You include a notice stating that the Source Code version of the Original Code is available under the terms of this License. The notice must be conspicuously included in any notice in an Executable or Source versions, related documentation or collateral in which You describe recipients' rights relating to the Original Code. You may distribute the Executable and Source versions of Your version of the Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License. If You distribute the Executable and Source versions under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer. You hereby agree to indemnify the Initial Developer for any liability incurred by the Initial Developer as a result of any such terms You offer. + + 3.4 Larger Works. You may create a Larger Work by combining Original Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Original Code. + +4.0 INABILITY TO COMPLY DUE TO STATUTE OR REGULATION + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Original Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.2 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5.0 APPLICATION OF THIS LICENSE + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Modifications as set out in Section 3.1. + +6.0 VERSIONS OF THE LICENSE + + 6.1 New Versions. Sun may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. Once Original Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of the License published by Sun. No one other than Sun has the right to modify the terms applicable to Original Code. + +7.0 DISCLAIMER OF WARRANTY + +ORIGINAL CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE ORIGINAL CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE ORIGINAL CODE IS WITH YOU. SHOULD ANY ORIGINAL CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY ORIGINAL CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8.0 TERMINATION + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Original Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 In the event of termination under Section 8.1 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9.0 LIMIT OF LIABILITY + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF ORIGINAL CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10.0 U.S. GOVERNMENT END USERS + +U.S. Government: If this Software is being acquired by or on behalf of the U.S. Government or by a U.S. Government prime contractor or subcontractor (at any tier), then the Government's rights in the Software and accompanying documentation shall be only as set forth in this license; this is in accordance with 48 C.F.R. 227.7201 through 227.7202-4 (for Department of Defense (DoD) acquisitions) and with 48 C.F.R. 2.101 and 12.212 (for non-DoD acquisitions). + +11.0 MISCELLANEOUS + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +EXHIBIT A - Sun Standards License + +"The contents of this file are subject to the Sun Standards License Version 1.1 (the "License"); You may not use this file except in compliance with the License. You may obtain a copy of the License at _______________________________. + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either  +express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code is ______________________________________. + +The Initial Developer of the Original Code is:  +Sun Microsystems, Inc.. + +Portions created by: _______________________________________ + +are Copyright (C): _______________________________________ + +All Rights Reserved. + +Contributor(s): _______________________________________ +
EXHIBIT B - Standards + +The Standard is defined as the following: +OpenOffice.org XML File Format Specification, located at http://xml.openoffice.org +OpenOffice.org Application Programming Interface Specification, located at 
http://api.openoffice.org diff --git a/options/license/SISSL-1.2 b/options/license/SISSL-1.2 new file mode 100644 index 0000000..19f59ea --- /dev/null +++ b/options/license/SISSL-1.2 @@ -0,0 +1,115 @@ +SUN INDUSTRY STANDARDS SOURCE LICENSE +Version 1.2 +
1.0 DEFINITIONS + + 1.1 Commercial Use means distribution or otherwise making the Original Code available to a third party. + + 1.2 Contributor Version means the combination of the Original Code, and the Modifications made by that particular Contributor. + + 1.3 Electronic Distribution Mechanism means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.4 Executable means Original Code in any form other than Source Code. + + 1.5 Initial Developer means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.6 Larger Work means a work which combines Original Code or portions thereof with code not governed by the terms of this License. + + 1.7 License means this document. + + 1.8 Licensable means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 Modifications means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. A Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 Original Code means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code. + + 1.11 Patent Claims means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.12 Source Code means the preferred form of the Original Code for making modifications to it, including all modules it contains, plus any associated interface definition files, or scripts used to control compilation and installation of an Executable. + + 1.13 Standards means the standards identified in Exhibit B. + + 1.14 You (or Your) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, You includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, control means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2.0 SOURCE CODE LICENSE + + 2.1 The Initial Developer Grant The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a)under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices, including but not limited to Modifications. + +3.0 DISTRIBUTION OBLIGATIONS + + 3.1 Application of License. The Source Code version of Original Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients rights hereunder. Your license for shipment of the Contributor Version is conditioned upon Your full compliance with this Section. The Modifications which You create must comply with all requirements set out by the Standards body in effect one hundred twenty (120) days before You ship the Contributor Version. In the event that the Modifications do not meet such requirements, You agree to publish either (i) any deviation from the Standards protocol resulting from implementation of Your Modifications and a reference implementation of Your Modifications or (ii) Your Modifications in Source Code form, and to make any such deviation and reference implementation or Modifications available to all third parties under the same terms a this license on a royalty free basis within thirty (30) days of Your first customer shipment of Your Modifications. Additionally, in the event that the Modifications you create do not meet the requirements set out in this Section, You agree to comply with the Standards requirements set out in Exhibit B. + + 3.2 Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add Your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients rights or ownership rights relating to Initial Code. + + You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Your version of the Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer for any liability incurred by the Initial Developer as a result of warranty, support, indemnity or liability terms You offer. + + 3.3 Distribution of Executable Versions. You may distribute Original Code in Executable and Source form only if the requirements of Sections 3.1 and 3.2 have been met for that Original Code, and if You include a notice stating that the Source Code version of the Original Code is available under the terms of this License. The notice must be conspicuously included in any notice in an Executable or Source versions, related documentation or collateral in which You describe recipients rights relating to the Original Code. You may distribute the Executable and Source versions of Your version of the Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License. If You distribute the Executable and Source versions under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer. You hereby agree to indemnify the Initial Developer for any liability incurred by the Initial Developer as a result of any such terms You offer. + + 3.4 Larger Works. You may create a Larger Work by combining Original Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Original Code. + +4.0 INABILITY TO COMPLY DUE TO STATUTE OR REGULATION + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Original Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.2 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5.0 APPLICATION OF THIS LICENSE + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Modifications as set out in Section 3.1. + +6.0 VERSIONS OF THE LICENSE + + 6.1 New Versions. Sun may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. Once Original Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of the License published by Sun. No one other than Sun has the right to modify the terms applicable to Original Code. + +7.0 DISCLAIMER OF WARRANTY + +ORIGINAL CODE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE ORIGINAL CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE ORIGINAL CODE IS WITH YOU. SHOULD ANY ORIGINAL CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY ORIGINAL CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8.0 TERMINATION + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Original Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 8.2 In the event of termination under Section 8.1 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + +EXHIBIT A - Sun Industry Standards Source License + +"The contents of this file are subject to the Sun Industry Standards Source License Version 1.2 (the License); You +may not use this file except in compliance with the License." + +"You may obtain a copy of the License at gridengine.sunsource.net/license.html" + +"Software distributed under the License is distributed on an AS IS basis, WITHOUT WARRANTY OF ANY KIND, either express or +implied. See the License for the specific language governing rights and limitations under the License." + +"The Original Code is Grid Engine." + +"The Initial Developer of the Original Code is: +Sun Microsystems, Inc." + +"Portions created by: Sun Microsystems, Inc. are Copyright (C) 2001 Sun Microsystems, Inc." + +"All Rights Reserved." + +"Contributor(s):__________________________________" + +EXHIBIT B - Standards + +1.0 Requirements for project Standards. The requirements for project Standards are version-dependent and are defined at: Grid Engine standards. + +2.0 Additional requirements. The additional requirements pursuant to Section 3.1 are defined as: + + 2.1 Naming Conventions. If any of your Modifications do not meet the requirements of the Standard, then you must change the product name so that Grid Engine, gridengine, gridengine.sunsource, and similar naming conventions are not used. + + 2.2 Compliance Claims. If any of your Modifications do not meet the requirements of the Standards you may not claim, directly or indirectly, that your implementation of the Standards is compliant. + + diff --git a/options/license/SMLNJ b/options/license/SMLNJ new file mode 100644 index 0000000..8ee7738 --- /dev/null +++ b/options/license/SMLNJ @@ -0,0 +1,7 @@ +STANDARD ML OF NEW JERSEY COPYRIGHT NOTICE, LICENSE AND DISCLAIMER. + +Copyright (c) 2001-2011 by The Fellowship of SML/NJ
Copyright (c) 1989-2001 by Lucent Technologies + +Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Lucent Technologies, Bell Labs or any Lucent entity not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. + +Lucent disclaims all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall Lucent be liable for any special, indirect or consequential damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortious action, arising out of or in connection with the use or performance of this software. diff --git a/options/license/SMPPL b/options/license/SMPPL new file mode 100644 index 0000000..cfcc838 --- /dev/null +++ b/options/license/SMPPL @@ -0,0 +1,29 @@ +Secure Messaging Protocol (SMP) Libraries [ACL, CML, SFL] + +Distribution Rights + +All source code for the SMP is being provided at no cost and with no financial limitations regarding its use and distribution. Organizations can use the SMP without paying any royalties or licensing fees. The SMP was originally developed by the U.S. Government. BAE Systems is enhancing and supporting the SMP under contract to the U.S. Government. The U.S. Government is furnishing the SMP software at no cost to the vendor subject to the conditions of the SMP Public License provided with the SMP software. + +29 May 2002 + +Secure Messaging Protocol (SMP) Public License + +The United States Government/Department of Defense/National Security Agency/Office of Network Security (collectively "the U.S. Government") hereby grants permission to any person obtaining a copy of the SMP source and object files (the "SMP Software") and associated documentation files (the "SMP Documentation"), or any portions thereof, to do the following, subject to the following license conditions: + +You may, free of charge and without additional permission from the U.S. Government, use, copy, modify, sublicense and otherwise distribute the SMP Software or components of the SMP Software, with or without modifications developed by you and/or by others. + +You may, free of charge and without additional permission from the U.S. Government, distribute copies of the SMP Documentation, with or without modifications developed by you and/or by others, at no charge or at a charge that covers the cost of reproducing such copies, provided that this SMP Public License is retained. + +Furthermore, if you distribute the SMP Software or parts of the SMP Software, with or without modifications developed by you and/or others, then you must either make available the source code to all portions of the SMP Software (exclusive of any modifications made by you and/or by others) upon request, or instead you may notify anyone requesting the SMP Software source code that it is freely available from the U.S. Government. + +Transmission of this SMP Public License must accompany whatever portions of the SMP Software you redistribute. + +The SMP Software is provided without warranty or guarantee of any nature, express or implied, including without limitation the warranties of merchantability and fitness for a particular purpose. + +The U.S. Government cannot be held liable for any damages either directly or indirectly caused by the use of the SMP Software. + +It is not permitted to copy, sublicense, distribute or transfer any of the SMP Software except as expressly indicated herein. Any attempts to do otherwise will be considered a violation of this License and your rights to the SMP Software will be voided. + +The SMP uses the Enhanced SNACC (eSNACC) Abstract Syntax Notation One (ASN.1) C++ Library to ASN.1 encode and decode security-related data objects. The eSNACC ASN.1 C++ Library is covered by the ENHANCED SNACC SOFTWARE PUBLIC LICENSE. None of the GNU public licenses apply to the eSNACC ASN.1 C++ Library. The eSNACC Compiler is not distributed as part of the SMP. + +Copyright © 1997-2002 National Security Agency diff --git a/options/license/SNIA b/options/license/SNIA new file mode 100644 index 0000000..4879a5e --- /dev/null +++ b/options/license/SNIA @@ -0,0 +1,122 @@ +STORAGE NETWORKING INDUSTRY ASSOCIATION +PUBLIC LICENSE +Version 1.1 + +1. Definitions. + +1.1 "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. + +1.2 "Contributor" means each entity that creates or contributes to the creation of Modifications. + +1.3 "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + +1.4 "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + +1.5 "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + +1.6 "Executable" means Covered Code in any form other than Source Code. + +1.7 "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + +1.8 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + +1.9 "License" means this document. + +1.10 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + +1.11 "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + +1.12 "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + +1.13 "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + +1.14 "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + +1.15 "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity + +2. Source Code License. + +2.1 The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + +2.2 Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + +3.1 Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + +3.2 Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + +3.3 Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + +3.4 Intellectual Property Matters. + (a) Third Party Claims. If Contributor has actual knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter. + (b) Contributor API's. If Contributor's Modifications include an application programming interface and Contributor has actual knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + +3.5 Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be most likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability (excluding any liability arising from intellectual property claims relating to the Covered Code) incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + +3.6 Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligation of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability (excluding any liability arising from intellectual property claims relating to the Covered Code) incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + +3.7 Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + +6.1 New Versions. The Storage Networking Industry Association (the "SNIA") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + +6.2 Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by the SNIA. No one other than the SNIA has the right to modify the terms applicable to Covered Code created under this License. + +6.3 Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Storage Networking Industry Association," "SNIA," or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the SNIA Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + +8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within a reasonable time after becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +8.2 If You initiate litigation by asserting a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: o (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + +8.3 If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + +8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of this License or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +14. ACCEPTANCE. This License is accepted by You if You retain, use, or distribute the Covered Code for any purpose. + +EXHIBIT A The SNIA Public License. + +The contents of this file are subject to the SNIA Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +www.snia.org/smi/developers/cim/ + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code is . + +The Initial Developer of the Original Code is [COMPLETE THIS] . + +Contributor(s): ______________________________________. + +Read more about this license at http://www.snia.org/smi/developers/open_source/ \ No newline at end of file diff --git a/options/license/SPL-1.0 b/options/license/SPL-1.0 new file mode 100644 index 0000000..8ad00f1 --- /dev/null +++ b/options/license/SPL-1.0 @@ -0,0 +1,149 @@ +SUN PUBLIC LICENSE Version 1.0 + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof and corresponding documentation released with the source code. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. "Original Code"../ means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code"../ means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated documentation, interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control"../ means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.1 The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: + + i) the modification of the Original Code or + + ii) the combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + + b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + + (d) notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters. + + (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "../LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs. If Contributor's Modifications include an application programming interface ("API"../) and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + + (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. Sun Microsystems, Inc. ("Sun") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Sun. No one other than Sun has the right to modify the terms applicable to Covered Code created under this License. + + 6.3. Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must: (a) rename Your license so that the phrases "Sun," "Sun Public License," or "SPL"../ or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Sun Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY. + +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + +The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation,"../ as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS. + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS. + +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + +Initial Developer may designate portions of the Covered Code as ?Multiple-Licensed?. ?Multiple-Licensed? means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +Exhibit A -Sun Public License Notice. + +The contents of this file are subject to the Sun Public License Version 1.0 (the License); you may not use this file except in compliance with the License. A copy of the License is available at http://www.sun.com/ + +The Original Code is _________________. The Initial Developer of the Original Code is ___________. Portions created by ______ are Copyright (C)_________. All Rights Reserved. + +Contributor(s): ______________________________________. + +Alternatively, the contents of this file may be used under the terms of the _____ license (the ?[___] License?), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the SPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the SPL or the [___] License. [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] \ No newline at end of file diff --git a/options/license/SWL b/options/license/SWL new file mode 100644 index 0000000..c89a755 --- /dev/null +++ b/options/license/SWL @@ -0,0 +1,7 @@ +The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the U.S. government, the Government shall have only "Restricted Rights" in the software and related documentation as defined in the Federal Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you are acquiring the software on behalf of the Department of Defense, the software shall be classified as "Commercial Computer Software" and the Government shall have only "Restricted Rights" as defined in Clause 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the authors grant the U.S. Government and others acting in its behalf permission to use and distribute the software in accordance with the terms specified in this license. + +BY INSTALLING THIS SOFTWARE, YOU ACKNOWLEDGE THAT YOU HAVE READ THIS AGREEMENT, THAT YOU UNDERSTAND IT, AND THAT YOU AGREE TO BE BOUND BY ITS TERMS AND CONDITIONS. \ No newline at end of file diff --git a/options/license/Saxpath b/options/license/Saxpath new file mode 100644 index 0000000..04da510 --- /dev/null +++ b/options/license/Saxpath @@ -0,0 +1,19 @@ +Copyright (C) 2000-2002 werken digital. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the disclaimer that follows these conditions in the documentation and/or other materials provided with the distribution. + + 3. The name "SAXPath" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact license@saxpath.org. + + 4. Products derived from this software may not be called "SAXPath", nor may "SAXPath" appear in their name, without prior written permission from the SAXPath Project Management (pm@saxpath.org). + +In addition, we request (but do not require) that you include in the end-user documentation provided with the redistribution and/or in the software itself an acknowledgement equivalent to the following: + "This product includes software developed by the SAXPath Project (http://www.saxpath.org/)." + +Alternatively, the acknowledgment may be graphical using the logos available at http://www.saxpath.org/ + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE SAXPath AUTHORS OR THE PROJECT CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/Sendmail b/options/license/Sendmail new file mode 100644 index 0000000..a386e58 --- /dev/null +++ b/options/license/Sendmail @@ -0,0 +1,36 @@ +SENDMAIL LICENSE + +The following license terms and conditions apply, unless a redistribution agreement or other license is obtained from Sendmail, Inc., 6475 Christie Ave, Third Floor, Emeryville, CA 94608, USA, or by electronic mail at license@sendmail.com. + +License Terms: + +Use, Modification and Redistribution (including distribution of any modified or derived work) in source and binary forms is permitted only if each of the following conditions is met: + +1. Redistributions qualify as "freeware" or "Open Source Software" under one of the following terms: + + (a) Redistributions are made at no charge beyond the reasonable cost of materials and delivery. + + (b) Redistributions are accompanied by a copy of the Source Code or by an irrevocable offer to provide a copy of the Source Code for up to three years at the cost of materials and delivery. Such redistributions must allow further use, modification, and redistribution of the Source Code under substantially the same terms as this license. For the purposes of redistribution "Source Code" means the complete compilable and linkable source code of sendmail including all modifications. + +2. Redistributions of Source Code must retain the copyright notices as they appear in each Source Code file, these license terms, and the disclaimer/limitation of liability set forth as paragraph 6 below. + +3. Redistributions in binary form must reproduce the Copyright Notice, these license terms, and the disclaimer/limitation of liability set forth as paragraph 6 below, in the documentation and/or other materials provided with the distribution. For the purposes of binary distribution the "Copyright Notice" refers to the following language: +"Copyright (c) 1998-2010 Sendmail, Inc. All rights reserved." + +4. Neither the name of Sendmail, Inc. nor the University of California nor names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. The name "sendmail" is a trademark of Sendmail, Inc. + +5. All redistributions must comply with the conditions imposed by the University of California on certain embedded code, which copyright Notice and conditions for redistribution are as follows: + + (a) Copyright (c) 1988, 1993 The Regents of the University of California. All rights reserved. + + (b) Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + (i) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 139848.1 + + (ii) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + (iii) Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +6. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY SENDMAIL, INC. AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SENDMAIL, INC., THE REGENTS OF THE UNIVERSITY OF CALIFORNIA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +$Revision: 8.16 $, Last updated $Date: 2010/10/25 23:11:19 $, Document 139848.1 \ No newline at end of file diff --git a/options/license/SimPL-2.0 b/options/license/SimPL-2.0 new file mode 100644 index 0000000..a8123ed --- /dev/null +++ b/options/license/SimPL-2.0 @@ -0,0 +1,37 @@ +Simple Public License (SimPL) + +Preamble + +This Simple Public License 2.0 (SimPL 2.0 for short) is a plain language implementation of GPL 2.0. The words are different, but the goal is the same - to guarantee for all users the freedom to share and change software. If anyone wonders about the meaning of the SimPL, they should interpret it as consistent with GPL 2.0. + +Simple Public License (SimPL) 2.0 + +The SimPL applies to the software's source and object code and comes with any rights that I have in it (other than trademarks). You agree to the SimPL by copying, distributing, or making a derivative work of the software. + +You get the royalty free right to: + +- Use the software for any purpose; +- Make derivative works of it (this is called a "Derived Work"); +- Copy and distribute it and any Derived Work. + +If you distribute the software or a Derived Work, you must give back to the community by: + +- Prominently noting the date of any changes you make; +- Leaving other people's copyright notices, warranty disclaimers, and license terms in place; +- Providing the source code, build scripts, installation scripts, and interface definitions in a form that is easy to get and best to modify; +- Licensing it to everyone under SimPL, or substantially similar terms (such as GPL 2.0), without adding further restrictions to the rights provided; +- Conspicuously announcing that it is available under that license. + +There are some things that you must shoulder: + +- You get NO WARRANTIES. None of any kind; +- If the software damages you in any way, you may only recover direct damages up to the amount you paid for it (that is zero if you did not pay anything). You may not recover any other damages, including those called "consequential damages." (The state or country where you live may not allow you to limit your liability in this way, so this may not apply to you); + +The SimPL continues perpetually, except that your license rights end automatically if: + +- You do not abide by the "give back to the community" terms (your licensees get to keep their rights if they abide); +- Anyone prevents you from distributing the software under the terms of the SimPL. + +License for the License + +You may do anything that you want with the SimPL text; it's a license form to use in any way that you find helpful. To avoid confusion, however, if you change the terms in any way then you may not call your license the Simple Public License or the SimPL (but feel free to acknowledge that your license is "based on the Simple Public License"). \ No newline at end of file diff --git a/options/license/Sleepycat b/options/license/Sleepycat new file mode 100644 index 0000000..580a6e9 --- /dev/null +++ b/options/license/Sleepycat @@ -0,0 +1,37 @@ +The Sleepycat License Copyright (c) 1990-1999 Sleepycat Software. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + - Redistributions in any form must be accompanied by information on how to obtain complete source code for the DB software and any accompanying software that uses the DB software. The source code must either be included in the distribution or be available for no more than the cost of distribution plus a nominal fee, and must be freely redistributable under reasonable conditions. For an executable file, complete source code means the source code for all modules it contains. It does not include source code for modules or files that typically accompany the major components of the operating system on which the executable file runs. + +THIS SOFTWARE IS PROVIDED BY SLEEPYCAT SOFTWARE ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL SLEEPYCAT SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Copyright (c) 1990, 1993, 1994, 1995 The Regents of the University of California. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + - Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Copyright (c) 1995, 1996 The President and Fellows of Harvard University. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + - Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY HARVARD AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL HARVARD OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/Spencer-86 b/options/license/Spencer-86 new file mode 100644 index 0000000..692a0bb --- /dev/null +++ b/options/license/Spencer-86 @@ -0,0 +1,11 @@ +Copyright (c) 1986 by University of Toronto. Written by Henry Spencer. Not derived from licensed software. + +Permission is granted to anyone to use this software for any purpose on any computer system, and to redistribute it freely, subject to the following restrictions: + +1. The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from defects in it. + +2. The origin of this software must not be misrepresented, either by explicit claim or by omission. + +3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. + +Beware that some of this code is subtly aware of the way operator precedence is structured in regular expressions. Serious changes in regular-expression syntax might require a total rethink. \ No newline at end of file diff --git a/options/license/Spencer-94 b/options/license/Spencer-94 new file mode 100644 index 0000000..75ba7f7 --- /dev/null +++ b/options/license/Spencer-94 @@ -0,0 +1,12 @@ +Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved. +This software is not subject to any license of the American Telephone and Telegraph Company or of the Regents of the University of California. + +Permission is granted to anyone to use this software for any purpose on any computer system, and to alter it and redistribute it, subject to the following restrictions: + +1. The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from flaws in it. + +2. The origin of this software must not be misrepresented, either by explicit claim or by omission. Since few users ever read sources, credits must appear in the documentation. + +3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. Since few users ever read sources, credits must appear in the documentation. + +4. This notice may not be removed or altered. diff --git a/options/license/Spencer-99 b/options/license/Spencer-99 new file mode 100644 index 0000000..256ec20 --- /dev/null +++ b/options/license/Spencer-99 @@ -0,0 +1,9 @@ +Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. + +Development of this software was funded, in part, by Cray Research Inc., UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics Corporation, none of whom are responsible for the results. The author thanks all of them. + +Redistribution and use in source and binary forms - with or without modification - are permitted for any purpose, provided that redistributions in source form retain this entire copyright notice and indicate the origin and nature of any modifications. + +I'd appreciate being given credit for this package in the documentation of software which uses it, but that is not a requirement. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/SugarCRM-1.1.3 b/options/license/SugarCRM-1.1.3 new file mode 100644 index 0000000..10dc083 --- /dev/null +++ b/options/license/SugarCRM-1.1.3 @@ -0,0 +1,149 @@ +SUGARCRM PUBLIC LICENSE + +Applies to Sugar Open Source Edition v1 through v4. Please note that these releases are no longer supported or distributed. + +Version 1.1.3 + +The SugarCRM Public License Version ("SPL") consists of the Mozilla Public License Version 1.1, modified to be specific to SugarCRM, with the Additional Terms in Exhibit B. The original Mozilla Public License 1.1 can be found at: http://www.mozilla.org/MPL/MPL-1.1.html + +1. Definitions. + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + B. Any new file that contains any part of the Original Code or previous Modifications. + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.2. Contributor Grant. +Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + +3. Distribution Obligations. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + + (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + + (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by SugarCRM. No one other than SugarCRM has the right to modify the terms applicable to Covered Code created under this License. + + 6.3. Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "SugarCRM", "SPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the SugarCRM Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY. + +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + +The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. MISCELLANEOUS. + +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. RESPONSIBILITY FOR CLAIMS. + +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + +Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the SPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +SugarCRM Public License 1.1.3 - Exhibit A + +The contents of this file are subject to the SugarCRM Public License Version 1.1.3 ("License"); You may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.sugarcrm.com/SPL Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code is: SugarCRM Open Source + +The Initial Developer of the Original Code is SugarCRM, Inc. +Portions created by SugarCRM are Copyright (C) 2004 SugarCRM, Inc.; +All Rights Reserved. +Contributor(s): ______________________________________. + +[NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + +SugarCRM Public License 1.1.3 - Exhibit B + +Additional Terms applicable to the SugarCRM Public License. + +I. Effect. +These additional terms described in this SugarCRM Public License - Additional Terms shall apply to the Covered Code under this License. + +II. SugarCRM and logo. +This License does not grant any rights to use the trademarks "SugarCRM" and the "SugarCRM" logos even if such marks are included in the Original Code or Modifications. + +However, in addition to the other notice obligations, all copies of the Covered Code in Executable and Source Code form distributed must, as a form of attribution of the original author, include on each user interface screen (i) the "Powered by SugarCRM" logo and (ii) the copyright notice in the same form as the latest version of the Covered Code distributed by SugarCRM, Inc. at the time of distribution of such copy. In addition, the "Powered by SugarCRM" logo must be visible to all users and be located at the very bottom center of each user interface screen. Notwithstanding the above, the dimensions of the "Powered By SugarCRM" logo must be at least 106 x 23 pixels. When users click on the "Powered by SugarCRM" logo it must direct them back to http://www.sugarforge.org. In addition, the copyright notice must remain visible to all users at all times at the bottom of the user interface screen. When users click on the copyright notice, it must direct them back to http://www.sugarcrm.com \ No newline at end of file diff --git a/options/license/TCL b/options/license/TCL new file mode 100644 index 0000000..1ea5f85 --- /dev/null +++ b/options/license/TCL @@ -0,0 +1,9 @@ +This software is copyrighted by <> and other parties. The following terms apply to all files associated with the software unless explicitly disclaimed in individual files. + +The authors hereby grant permission to use, copy, modify, distribute, and license this software and its documentation for any purpose, provided that existing copyright notices are retained in all copies and that this notice is included verbatim in any distributions. No written agreement, license, or royalty fee is required for any of the authorized uses. Modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated on the first page of each file where they apply. + +IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +GOVERNMENT USE: If you are acquiring this software on behalf of the U.S. government, the Government shall have only "Restricted Rights" in the software and related documentation as defined in the Federal Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you are acquiring the software on behalf of the Department of Defense, the software shall be classified as "Commercial Computer Software" and the Government shall have only "Restricted Rights" as defined in Clause 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the authors grant the U.S. Government and others acting in its behalf permission to use and distribute the software in accordance with the terms specified in this license. \ No newline at end of file diff --git a/options/license/TCP-wrappers b/options/license/TCP-wrappers new file mode 100644 index 0000000..e13d4f5 --- /dev/null +++ b/options/license/TCP-wrappers @@ -0,0 +1,7 @@ +Copyright 1995 by Wietse Venema. All rights reserved. Some individual files may be covered by other copyrights. + +This material was originally written and compiled by Wietse Venema at Eindhoven University of Technology, The Netherlands, in 1990, 1991, 1992, 1993, 1994 and 1995. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that this entire copyright notice is duplicated in all such copies. + +This software is provided "as is" and without any expressed or implied warranties, including, without limitation, the implied warranties of merchantibility and fitness for any particular purpose. diff --git a/options/license/TMate b/options/license/TMate new file mode 100644 index 0000000..ded80a4 --- /dev/null +++ b/options/license/TMate @@ -0,0 +1,21 @@ +The TMate Open Source License. + +This license applies to all portions of TMate SVNKit library, which are not externally-maintained libraries (e.g. Ganymed SSH library). + +All the source code and compiled classes in package org.tigris.subversion.javahl except SvnClient class are covered by the license in JAVAHL-LICENSE file + +Copyright (c) 2004-2012 TMate Software. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + * Redistributions in any form must be accompanied by information on how to obtain complete source code for the software that uses SVNKit and any accompanying software that uses the software that uses SVNKit. The source code must either be included in the distribution or be available for no more than the cost of distribution plus a nominal fee, and must be freely redistributable under reasonable conditions. For an executable file, complete source code means the source code for all modules it contains. It does not include source code for modules or files that typically accompany the major components of the operating system on which the executable file runs. + + * Redistribution in any form without redistributing source code for software that uses SVNKit is possible only when such redistribution is explictly permitted by TMate Software. Please, contact TMate Software at support@svnkit.com to get such permission. + +THIS SOFTWARE IS PROVIDED BY TMATE SOFTWARE ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. + +IN NO EVENT SHALL TMATE SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/TORQUE-1.1 b/options/license/TORQUE-1.1 new file mode 100644 index 0000000..578b13a --- /dev/null +++ b/options/license/TORQUE-1.1 @@ -0,0 +1,25 @@ +TORQUE v2.5+ Software License v1.1 +Copyright (c) 2010-2011 Adaptive Computing Enterprises, Inc. All rights reserved. + +Use this license to use or redistribute the TORQUE software v2.5+ and later versions. For free support for TORQUE users, questions should be emailed to the community of TORQUE users at torqueusers@supercluster.org. Users can also subscribe to the user mailing list at http://www.supercluster.org/mailman/listinfo/torqueusers. Customers using TORQUE that also are licensed users of Moab branded software from Adaptive Computing Inc. can get TORQUE support from Adaptive Computing via: +Email: torque-support@adaptivecomputing.com. +Phone: (801) 717-3700 +Web: www.adaptivecomputing.com www.clusterresources.com + +This license covers use of the TORQUE v2.5 software (the "Software") at your site or location, and, for certain users, redistribution of the Software to other sites and locations1. Later versions of TORQUE are also covered by this license. Use and redistribution of TORQUE v2.5 in source and binary forms, with or without modification, are permitted provided that all of the following conditions are met. + +1. Any Redistribution of source code must retain the above copyright notice and the acknowledgment contained in paragraph 5, this list of conditions and the disclaimer contained in paragraph 5. + +2. Any Redistribution in binary form must reproduce the above copyright notice and the acknowledgment contained in paragraph 4, this list of conditions and the disclaimer contained in paragraph 5 in the documentation and/or other materials provided with the distribution. + +3. Redistributions in any form must be accompanied by information on how to obtain complete source code for TORQUE and any modifications and/or additions to TORQUE. The source code must either be included in the distribution or be available for no more than the cost of distribution plus a nominal fee, and all modifications and additions to the Software must be freely redistributable by any party (including Licensor) without restriction. + +4. All advertising materials mentioning features or use of the Software must display the following acknowledgment: +"TORQUE is a modification of OpenPBS which was developed by NASA Ames Research Center, Lawrence Livermore National Laboratory, and Veridian TORQUE Open Source License v1.1. 1 Information Solutions, Inc. Visit www.clusterresources.com/products/ for more information about TORQUE and to download TORQUE. For information about Moab branded products and so receive support from Adaptive Computing for TORQUE, see www.adaptivecomputing.com.” + +5. DISCLAIMER OF WARRANTY THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED. IN NO EVENT SHALL ADAPTIVE COMPUTING ENTERPRISES, INC. CORPORATION, ITS AFFILIATED COMPANIES, OR THE U.S. GOVERNMENT OR ANY OF ITS AGENCIES BE LIABLE FOR ANY DIRECT OR INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This license will be governed by the laws of Utah, without reference to its choice of law rules. + +Note 1: TORQUE is developed from an earlier version v2.3 of OpenPBS. TORQUE has been developed beyond OpenPBS v2.3. The OpenPBS v2.3 license and OpenPBS software can be obtained at: +http://www.pbsworks.com/ResLibSearchResult.aspx?keywords=openpbs&industry=All&pro duct_service=All&category=Free%20Software%20Downloads&order_by=title. Users of TORQUE should comply with the TORQUE license as well as the OpenPBS license. \ No newline at end of file diff --git a/options/license/TOSL b/options/license/TOSL new file mode 100644 index 0000000..806ec81 --- /dev/null +++ b/options/license/TOSL @@ -0,0 +1,9 @@ +Trusster Open Source License version 1.0a (TRUST) copyright (c) 2006 Mike Mintz and Robert Ekendahl. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Redistributions in any form must be accompanied by information on how to obtain complete source code for this software and any accompanying software that uses this software. The source code must either be included in the distribution or be available in a timely fashion for no more than the cost of distribution plus a nominal fee, and must be freely redistributable under reasonable and no more restrictive conditions. For an executable file, complete source code means the source code for all modules it contains. It does not include source code for modules or files that typically accompany the major components of the operating system on which the executable file runs. + +THIS SOFTWARE IS PROVIDED BY MIKE MINTZ AND ROBERT EKENDAHL ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL MIKE MINTZ AND ROBERT EKENDAHL OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/UPL-1.0 b/options/license/UPL-1.0 new file mode 100644 index 0000000..a3ef9bb --- /dev/null +++ b/options/license/UPL-1.0 @@ -0,0 +1,19 @@ +The Universal Permissive License (UPL), Version 1.0 + +Copyright (c) [year] [copyright holders] + +The Universal Permissive License (UPL), Version 1.0 + +Subject to the condition set forth below, permission is hereby granted to any person obtaining a copy of this software, associated documentation and/or data (collectively the "Software"), free of charge and under any and all copyright rights in the Software, and any and all patent rights owned or freely licensable by each licensor hereunder covering either (i) the unmodified Software as contributed to or provided by such licensor, or (ii) the Larger Works (as defined below), to deal in both + +(a) the Software, and + +(b) any piece of software and/or hardware listed in the lrgrwrks.txt file if one is included with the Software (each a “Larger Work” to which the Software is contributed by such licensors), + +without restriction, including without limitation the rights to copy, create derivative works of, display, perform, and distribute the Software and make, use, sell, offer for sale, import, export, have made, and have sold the Software and the Larger Work(s), and to sublicense the foregoing rights on either these or other terms. + +This license is subject to the following condition: + +The above copyright notice and either this complete permission notice or at a minimum a reference to the UPL must be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/options/license/Unicode-DFS-2015 b/options/license/Unicode-DFS-2015 new file mode 100644 index 0000000..e9c4150 --- /dev/null +++ b/options/license/Unicode-DFS-2015 @@ -0,0 +1,19 @@ +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +Unicode Data Files include all data files under the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF online code charts under the directory http://www.unicode.org/Public/. Software includes any source code published in the Unicode Standard or under the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/. + +NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2015 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that + + (a) this copyright and permission notice appear with all copies of the Data Files or Software, + (b) this copyright and permission notice appear in associated documentation, and + (c) there is clear notice in each modified Data File or in the Software as well as in the documentation associated with the Data File(s) or Software that the data or software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. \ No newline at end of file diff --git a/options/license/Unicode-DFS-2016 b/options/license/Unicode-DFS-2016 new file mode 100644 index 0000000..c78e8b4 --- /dev/null +++ b/options/license/Unicode-DFS-2016 @@ -0,0 +1,22 @@ +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +Unicode Data Files include all data files under the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and http://www.unicode.org/utility/trac/browser/. + +Unicode Data Files do not include PDF online code charts under the directory http://www.unicode.org/Public/. + +Software includes any source code published in the Unicode Standard or under the directories http://www.unicode.org/Public/, http://www.unicode.org/reports/, http://www.unicode.org/cldr/data/, http://source.icu-project.org/repos/icu/, and http://www.unicode.org/utility/trac/browser/. + +NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2016 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that either + + (a) this copyright and permission notice appear with all copies of the Data Files or Software, or + (b) this copyright and permission notice appear in associated Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. \ No newline at end of file diff --git a/options/license/Unicode-TOU b/options/license/Unicode-TOU new file mode 100644 index 0000000..b10fef1 --- /dev/null +++ b/options/license/Unicode-TOU @@ -0,0 +1,51 @@ +Unicode Terms of Use + +For the general privacy policy governing access to this site, see the Unicode Privacy Policy. For trademark usage, see the Unicode® Consortium Name and Trademark Usage Policy. + +A. Unicode Copyright. + + 1. Copyright © 1991-2014 Unicode, Inc. All rights reserved. + + 2. Certain documents and files on this website contain a legend indicating that "Modification is permitted." Any person is hereby authorized, without fee, to modify such documents and files to create derivative works conforming to the Unicode® Standard, subject to Terms and Conditions herein. + + 3. Any person is hereby authorized, without fee, to view, use, reproduce, and distribute all documents and files solely for informational purposes in the creation of products supporting the Unicode Standard, subject to the Terms and Conditions herein. + + 4. Further specifications of rights and restrictions pertaining to the use of the particular set of data files known as the "Unicode Character Database" can be found in Exhibit 1. + + 5. Each version of the Unicode Standard has further specifications of rights and restrictions of use. For the book editions (Unicode 5.0 and earlier), these are found on the back of the title page. The online code charts carry specific restrictions. All other files, including online documentation of the core specification for Unicode 6.0 and later, are covered under these general Terms of Use. + + 6. No license is granted to "mirror" the Unicode website where a fee is charged for access to the "mirror" site. + + 7. Modification is not permitted with respect to this document. All copies of this document must be verbatim. + +B. Restricted Rights Legend. Any technical data or software which is licensed to the United States of America, its agencies and/or instrumentalities under this Agreement is commercial technical data or commercial computer software developed exclusively at private expense as defined in FAR 2.101, or DFARS 252.227-7014 (June 1995), as applicable. For technical data, use, duplication, or disclosure by the Government is subject to restrictions as set forth in DFARS 202.227-7015 Technical Data, Commercial and Items (Nov 1995) and this Agreement. For Software, in accordance with FAR 12-212 or DFARS 227-7202, as applicable, use, duplication or disclosure by the Government is subject to the restrictions set forth in this Agreement. + +C. Warranties and Disclaimers. + + 1. This publication and/or website may include technical or typographical errors or other inaccuracies . Changes are periodically added to the information herein; these changes will be incorporated in new editions of the publication and/or website. Unicode may make improvements and/or changes in the product(s) and/or program(s) described in this publication and/or website at any time. + + 2. If this file has been purchased on magnetic or optical media from Unicode, Inc. the sole and exclusive remedy for any claim will be exchange of the defective media within ninety (90) days of original purchase. + + 3. EXCEPT AS PROVIDED IN SECTION C.2, THIS PUBLICATION AND/OR SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. UNICODE AND ITS LICENSORS ASSUME NO RESPONSIBILITY FOR ERRORS OR OMISSIONS IN THIS PUBLICATION AND/OR SOFTWARE OR OTHER DOCUMENTS WHICH ARE REFERENCED BY OR LINKED TO THIS PUBLICATION OR THE UNICODE WEBSITE. + +D. Waiver of Damages. In no event shall Unicode or its licensors be liable for any special, incidental, indirect or consequential damages of any kind, or any damages whatsoever, whether or not Unicode was advised of the possibility of the damage, including, without limitation, those resulting from the following: loss of use, data or profits, in connection with the use, modification or distribution of this information or its derivatives. + +E. Trademarks & Logos. + + 1. The Unicode Word Mark and the Unicode Logo are trademarks of Unicode, Inc. “The Unicode Consortium” and “Unicode, Inc.” are trade names of Unicode, Inc. Use of the information and materials found on this website indicates your acknowledgement of Unicode, Inc.’s exclusive worldwide rights in the Unicode Word Mark, the Unicode Logo, and the Unicode trade names. + + 2. The Unicode Consortium Name and Trademark Usage Policy (“Trademark Policy”) are incorporated herein by reference and you agree to abide by the provisions of the Trademark Policy, which may be changed from time to time in the sole discretion of Unicode, Inc. + + 3. All third party trademarks referenced herein are the property of their respective owners. + +F. Miscellaneous. + + 1. Jurisdiction and Venue. This server is operated from a location in the State of California, United States of America. Unicode makes no representation that the materials are appropriate for use in other locations. If you access this server from other locations, you are responsible for compliance with local laws. This Agreement, all use of this site and any claims and damages resulting from use of this site are governed solely by the laws of the State of California without regard to any principles which would apply the laws of a different jurisdiction. The user agrees that any disputes regarding this site shall be resolved solely in the courts located in Santa Clara County, California. The user agrees said courts have personal jurisdiction and agree to waive any right to transfer the dispute to any other forum. + + 2. Modification by Unicode Unicode shall have the right to modify this Agreement at any time by posting it to this site. The user may not assign any part of this Agreement without Unicode’s prior written consent. + + 3. Taxes. The user agrees to pay any taxes arising from access to this website or use of the information herein, except for those based on Unicode’s net income. + + 4. Severability. If any provision of this Agreement is declared invalid or unenforceable, the remaining provisions of this Agreement shall remain in effect. + + 5. Entire Agreement. This Agreement constitutes the entire agreement between the parties. \ No newline at end of file diff --git a/options/license/Unlicense b/options/license/Unlicense new file mode 100644 index 0000000..cde4ac6 --- /dev/null +++ b/options/license/Unlicense @@ -0,0 +1,10 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. + +In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/options/license/Updating the SPDX Licenses b/options/license/Updating the SPDX Licenses new file mode 100644 index 0000000..b4cd080 --- /dev/null +++ b/options/license/Updating the SPDX Licenses @@ -0,0 +1,29 @@ +Steps to update the SPDX License List on the spdx.org website: + +1. Download the current version of the SPDX licenses into a local directory (if you already have a git clone on your local machine, + that directory may be referenced). +2. Create an output directory for the output files from the tool. Note: do NOT create this output directory as a subdirectory of your + local git repository - we don't want output files stored in the Git repo. +3. Run the SPDX workgroup tool generateRdfaLicenses using the command: + java -jar spdx-tools.jar LicenseRDFAGenerator spreadsheet.xls outputDirectory [version] [releasedate] + where spreadsheet.xls is the excel version of the SPDX license list downloaded in step 1 and outputDirectory is the path the the directory you + created in step 2. If [version] and/or [releasedate] are specified, they will override the values in the spreadsheet (not reccomended). +4. Review the console output for any errors - any slight variation in the spreadsheet columns will cause an error. +5. Review the output in the created in the build output directory +6. Create an archive file from the build folder named htmlfiles-vx.xx where x.xx is the version number of the license list. +7. SFTP the archive file up to the Linux foundation server php1.linuxfoundation.org +8. Log into the Linux Foundation server +9. Create a new subdirectory in the ~/licenseArchive directory with the format mm-dd-yyyy where mm is the month, dd is the day, and yyyy + is the year the files were uploaded. +10. Unarchive the uploaded file in the subdirectory created in step 9. +11. Backup the current files by replacing the files in the ~/backup folder with the files in ~/www/spdx/content/licenses. + IMPORTANT NOTE: Do NOT do a recursive copy, only copy the files and do NOT copy any subdirectories. +12. Create a new subdirectory ~/www/spdx/content/licenses/archive/archived_ll_vx.xx where x.xx is the version of the PREVIOUSLY PUBLISHED + license list being replaced. +13. Copy the files from ~/backup to the subdirectory created in step 11 +14. Edit the file ~/www/spdx/content/licenses/archive/archived_ll_vx.xx/index.html. Add the line + "

THIS IS NOT THE CURRENT VERSION OF THE SPDX LICENSE LIST. PLEASE USE THE CURRENT VERSION, LOCATED AT: http://spdx.org/licenses/

" + immediately prior to the line "

SPDX License List

" +15. Copy the files from the subdirectory created in steps 9 and 10 to ~/www/spdx/content/licenses +16. In the web browser, clear the browser cache and test the licenses at http://spdx.org/licenses +17. If there are any problems, copy the files from the backup back to ~/www/spdx/content/licenses diff --git a/options/license/VOSTROM b/options/license/VOSTROM new file mode 100644 index 0000000..b21c41d --- /dev/null +++ b/options/license/VOSTROM @@ -0,0 +1,27 @@ +VOSTROM Public License for Open Source + +Copyright (c) 2007 VOSTROM Holdings, Inc. + +This VOSTROM Holdings, Inc. (VOSTROM) Distribution (code and documentation) is made available to the open source community as a public service by VOSTROM. Contact VOSTROM at license@vostrom.com for information on other licensing arrangements (e.g. for use in proprietary applications). + +Under this license, this Distribution may be modified and the original version and modified versions may be copied, distributed, publicly displayed and performed provided that the following conditions are met: + +1. Modified versions are distributed with source code and documentation and with permission for others to use any code and documentation (whether in original or modified versions) as granted under this license; + +2. if modified, the source code, documentation, and user run-time elements should be clearly labeled by placing an identifier of origin (such as a name, initial, or other tag) after the version number; + +3. users, modifiers, distributors, and others coming into possession or using the Distribution in original or modified form accept the entire risk as to the possession, use, and performance of the Distribution; + +4. this copyright management information (software identifier and version number, copyright notice and license) shall be retained in all versions of the Distribution; + +5. VOSTROM may make modifications to the Distribution that are substantially similar to modified versions of the Distribution, and may make, use, sell, copy, distribute, publicly display, and perform such modifications, including making such modifications available under this or other licenses, without obligation or restriction; + +6. modifications incorporating code, libraries, and/or documentation subject to any other open source license may be made, and the resulting work may be distributed under the terms of such open source license if required by that open source license, but doing so will not affect this Distribution, other modifications made under this license or modifications made under other VOSTROM licensing arrangements; + +7. no permission is granted to distribute, publicly display, or publicly perform modifications to the Distribution made using proprietary materials that cannot be released in source format under conditions of this license; + +8. the name of VOSTROM may not be used in advertising or publicity pertaining to Distribution of the software without specific, prior written permission. + +This software is made available "as is", and + +VOSTROM DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL VOSTROM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/options/license/VSL-1.0 b/options/license/VSL-1.0 new file mode 100644 index 0000000..4cef076 --- /dev/null +++ b/options/license/VSL-1.0 @@ -0,0 +1,18 @@ +Vovida Software License v. 1.0 + +This license applies to all software incorporated in the "Vovida Open Communication Application Library" except for those portions incorporating third party software specifically identified as being licensed under separate license. + +The Vovida Software License, Version 1.0 +Copyright (c) 2000 Vovida Networks, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. The names "VOCAL", "Vovida Open Communication Application Library", and "Vovida Open Communication Application Library (VOCAL)" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact vocal@vovida.org. + +4. Products derived from this software may not be called "VOCAL", nor may "VOCAL" appear in their name, without prior written permission. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DAMAGES IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/Vim b/options/license/Vim new file mode 100644 index 0000000..2b370fe --- /dev/null +++ b/options/license/Vim @@ -0,0 +1,30 @@ +VIM LICENSE + +I) There are no restrictions on distributing unmodified copies of Vim except that they must include this license text. You can also distribute unmodified parts of Vim, likewise unrestricted except that they must include this license text. You are also allowed to include executables that you made from the unmodified Vim sources, plus your own usage examples and Vim scripts. + +II) It is allowed to distribute a modified (or extended) version of Vim, including executables and/or source code, when the following four conditions are met: + + 1) This license text must be included unmodified. + + 2) The modified Vim must be distributed in one of the following five ways: + + a) If you make changes to Vim yourself, you must clearly describe in the distribution how to contact you. When the maintainer asks you (in any way) for a copy of the modified Vim you distributed, you must make your changes, including source code, available to the maintainer without fee. The maintainer reserves the right to include your changes in the official version of Vim. What the maintainer will do with your changes and under what license they will be distributed is negotiable. If there has been no negotiation then this license, or a later version, also applies to your changes. The current maintainer is Bram Moolenaar . If this changes it will be announced in appropriate places (most likely vim.sf.net, www.vim.org and/or comp.editors). When it is completely impossible to contact the maintainer, the obligation to send him your changes ceases. Once the maintainer has confirmed that he has received your changes they will not have to be sent again. + + b) If you have received a modified Vim that was distributed as mentioned under a) you are allowed to further distribute it unmodified, as mentioned at I). If you make additional changes the text under a) applies to those changes. + + c) Provide all the changes, including source code, with every copy of the modified Vim you distribute. This may be done in the form of a context diff. You can choose what license to use for new code you add. The changes and their license must not restrict others from making their own changes to the official version of Vim. + + d) When you have a modified Vim which includes changes as mentioned under c), you can distribute it without the source code for the changes if the following three conditions are met: + - The license that applies to the changes permits you to distribute the changes to the Vim maintainer without fee or restriction, and permits the Vim maintainer to include the changes in the official version of Vim without fee or restriction. + - You keep the changes for at least three years after last distributing the corresponding modified Vim. When the maintainer or someone who you distributed the modified Vim to asks you (in any way) for the changes within this period, you must make them available to him. + - You clearly describe in the distribution how to contact you. This contact information must remain valid for at least three years after last distributing the corresponding modified Vim, or as long as possible. + + e) When the GNU General Public License (GPL) applies to the changes, you can distribute the modified Vim under the GNU GPL version 2 or any later version. + + 3) A message must be added, at least in the output of the ":version" command and in the intro screen, such that the user of the modified Vim is able to see that it was modified. When distributing as mentioned under 2)e) adding the message is only required for as far as this does not conflict with the license used for the changes. + + 4) The contact information as required under 2)a) and 2)d) must not be removed or changed, except that the person himself can make corrections. + +III) If you distribute a modified version of Vim, you are encouraged to use the Vim license for your changes and make them available to the maintainer, including the source code. The preferred way to do this is by e-mail or by uploading the files to a server and e-mailing the URL. If the number of changes is small (e.g., a modified Makefile) e-mailing a context diff will do. The e-mail address to be used is + +IV) It is not allowed to remove this license from the distribution of the Vim sources, parts of it or from a modified version. You may use this license for previous Vim releases instead of the license that they came with, at your option. \ No newline at end of file diff --git a/options/license/W3C b/options/license/W3C new file mode 100644 index 0000000..ddb7ddb --- /dev/null +++ b/options/license/W3C @@ -0,0 +1,29 @@ +W3C SOFTWARE NOTICE AND LICENSE + +This work (and included software, documentation such as READMEs, or other related items) is being provided by the copyright holders under the following license. + +License + +By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions. + +Permission to copy, modify, and distribute this software and its documentation, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the software and documentation or portions thereof, including modifications: + + The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. + + Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software Short Notice should be included (hypertext is preferred, text is permitted) within the body of any redistributed or derivative code. + + Notice of any changes or modifications to the files, including the date changes were made. (We recommend you provide URIs to the location from which the code is derived.) + +Disclaimers + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission. Title to copyright in this software and any associated documentation will at all times remain with copyright holders. + +Notes + +This version: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + +This formulation of W3C's notice and license became active on December 31 2002. This version removes the copyright ownership notice such that this license can be used with materials other than those owned by the W3C, reflects that ERCIM is now a host of the W3C, includes references to this specific dated version of the license, and removes the ambiguous grant of "use". Otherwise, this version is the same as the previous version and is written so as to preserve the Free Software Foundation's assessment of GPL compatibility and OSI's certification under the Open Source Definition. \ No newline at end of file diff --git a/options/license/W3C-19980720 b/options/license/W3C-19980720 new file mode 100644 index 0000000..ee02314 --- /dev/null +++ b/options/license/W3C-19980720 @@ -0,0 +1,23 @@ +W3C® SOFTWARE NOTICE AND LICENSE + +Copyright (c) 1994-2002 World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/ + +This W3C work (including software, documents, or other related items) is being provided by the copyright holders under the following license. By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its documentation, with or without modification,  for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the software and documentation or portions thereof, including modifications, that you make: + + 1. The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. + + 2. Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, a short notice of the following form (hypertext is preferred, text is permitted) should be used within the body of any redistributed or derivative code: "Copyright © [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/" + + 3. Notice of any changes or modifications to the W3C files, including the date changes were made. (We recommend you provide URIs to the location from which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission. Title to copyright in this software and any associated documentation will at all times remain with copyright holders. + +____________________________________ + +This formulation of W3C's notice and license became active on August 14 1998 so as to improve compatibility with GPL. This version ensures that W3C software licensing terms are no more restrictive than GPL and consequently W3C software may be distributed in GPL packages. See the older formulation for the policy prior to this date. Please see our Copyright FAQ for common questions about using materials from our site, including specific terms and conditions for packages like libwww, Amaya, and Jigsaw. Other questions about this notice can be directed to site-policy@w3.org. diff --git a/options/license/W3C-20150513 b/options/license/W3C-20150513 new file mode 100644 index 0000000..7c9a838 --- /dev/null +++ b/options/license/W3C-20150513 @@ -0,0 +1,17 @@ +This work is being provided by the copyright holders under the following license. + +License +By obtaining and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions. + +Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications: + + • The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. + • Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included. + • Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright (c) [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)." + +Disclaimers +THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENT. + +The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the work without specific, written prior permission. Title to copyright in this work will at all times remain with copyright holders. \ No newline at end of file diff --git a/options/license/WTFPL b/options/license/WTFPL new file mode 100644 index 0000000..7a3094a --- /dev/null +++ b/options/license/WTFPL @@ -0,0 +1,11 @@ +DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE +Version 2, December 2004 + +Copyright (C) 2004 Sam Hocevar + +Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. + +DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/options/license/Watcom-1.0 b/options/license/Watcom-1.0 new file mode 100644 index 0000000..031b90f --- /dev/null +++ b/options/license/Watcom-1.0 @@ -0,0 +1,106 @@ +Sybase Open Watcom Public License version 1.0 + +USE OF THE SYBASE OPEN WATCOM SOFTWARE DESCRIBED BELOW ("SOFTWARE") IS SUBJECT TO THE TERMS AND CONDITIONS SET FORTH IN THE SYBASE OPEN WATCOM PUBLIC LICENSE SET FORTH BELOW ("LICENSE"). YOU MAY NOT USE THE SOFTWARE IN ANY MANNER UNLESS YOU ACCEPT THE TERMS AND CONDITIONS OF THE LICENSE. YOU INDICATE YOUR ACCEPTANCE BY IN ANY MANNER USING (INCLUDING WITHOUT LIMITATION BY REPRODUCING, MODIFYING OR DISTRIBUTING) THE SOFTWARE. IF YOU DO NOT ACCEPT ALL OF THE TERMS AND CONDITIONS OF THE LICENSE, DO NOT USE THE SOFTWARE IN ANY MANNER. + +Sybase Open Watcom Public License version 1.0 + +1. General; Definitions. This License applies only to the following software programs: the open source versions of Sybase's Watcom C/C++ and Fortran compiler products ("Software"), which are modified versions of, with significant changes from, the last versions made commercially available by Sybase. As used in this License: + + 1.1 "Applicable Patent Rights" mean: (a) in the case where Sybase is the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to Sybase and (ii) that cover subject matter contained in the Original Code, but only to the extent necessary to use, reproduce and/or distribute the Original Code without infringement; and (b) in the case where You are the grantor of rights, (i) claims of patents that are now or hereafter acquired, owned by or assigned to You and (ii) that cover subject matter in Your Modifications, taken alone or in combination with Original Code. + + 1.2 "Contributor" means any person or entity that creates or contributes to the creation of Modifications. + + 1.3 "Covered Code" means the Original Code, Modifications, the combination of Original Code and any Modifications, and/or any respective portions thereof. + + 1.4 "Deploy" means to use, sublicense or distribute Covered Code other than for Your internal research and development (R&D) and/or Personal Use, and includes without limitation, any and all internal use or distribution of Covered Code within Your business or organization except for R&D use and/or Personal Use, as well as direct or indirect sublicensing or distribution of Covered Code by You to any third party in any form or manner. + + 1.5 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.6 "Modifications" mean any addition to, deletion from, and/or change to, the substance and/or structure of the Original Code, any previous Modifications, the combination of Original Code and any previous Modifications, and/or any respective portions thereof. When code is released as a series of files, a Modification is: (a) any addition to or deletion from the contents of a file containing Covered Code; and/or (b) any new file or other representation of computer program statements that contains any part of Covered Code. + + 1.7 "Original Code" means (a) the Source Code of a program or other work as originally made available by Sybase under this License, including the Source Code of any updates or upgrades to such programs or works made available by Sybase under this License, and that has been expressly identified by Sybase as such in the header file(s) of such work; and (b) the object code compiled from such Source Code and originally made available by Sybase under this License. + + 1.8 "Personal Use" means use of Covered Code by an individual solely for his or her personal, private and non-commercial purposes. An individual's use of Covered Code in his or her capacity as an officer, employee, member, independent contractor or agent of a corporation, business or organization (commercial or non-commercial) does not qualify as Personal Use. + + 1.9 "Source Code" means the human readable form of a program or other work that is suitable for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an executable (object code). + + 1.10 "You" or "Your" means an individual or a legal entity exercising rights under this License. For legal entities, "You" or "Your" includes any entity which controls, is controlled by, or is under common control with, You, where "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity. + +2. Permitted Uses; Conditions & Restrictions.Subject to the terms and conditions of this License, Sybase hereby grants You, effective on the date You accept this License and download the Original Code, a world-wide, royalty-free, non-exclusive license, to the extent of Sybase's Applicable Patent Rights and copyrights covering the Original Code, to do the following: + + 2.1 You may use, reproduce, display, perform, modify and distribute Original Code, with or without Modifications, solely for Your internal research and development and/or Personal Use, provided that in each instance: + + (a) You must retain and reproduce in all copies of Original Code the copyright and other proprietary notices and disclaimers of Sybase as they appear in the Original Code, and keep intact all notices in the Original Code that refer to this License; and + + (b) You must retain and reproduce a copy of this License with every copy of Source Code of Covered Code and documentation You distribute, and You may not offer or impose any terms on such Source Code that alter or restrict this License or the recipients' rights hereunder, except as permitted under Section 6. + + (c) Whenever reasonably feasible you should include the copy of this License in a click-wrap format, which requires affirmative acceptance by clicking on an "I accept" button or similar mechanism. If a click-wrap format is not included, you must include a statement that any use (including without limitation reproduction, modification or distribution) of the Software, and any other affirmative act that you define, constitutes acceptance of the License, and instructing the user not to use the Covered Code in any manner if the user does not accept all of the terms and conditions of the License. + + 2.2 You may use, reproduce, display, perform, modify and Deploy Covered Code, provided that in each instance: + + (a) You must satisfy all the conditions of Section 2.1 with respect to the Source Code of the Covered Code; + + (b) You must duplicate, to the extent it does not already exist, the notice in Exhibit A in each file of the Source Code of all Your Modifications, and cause the modified files to carry prominent notices stating that You changed the files and the date of any change; + + (c) You must make Source Code of all Your Deployed Modifications publicly available under the terms of this License, including the license grants set forth in Section 3 below, for as long as you Deploy the Covered Code or twelve (12) months from the date of initial Deployment, whichever is longer. You should preferably distribute the Source Code of Your Deployed Modifications electronically (e.g. download from a web site); + + (d) if You Deploy Covered Code in object code, executable form only, You must include a prominent notice, in the code itself as well as in related documentation, stating that Source Code of the Covered Code is available under the terms of this License with information on how and where to obtain such Source Code; and + + (e) the object code form of the Covered Code may be distributed under Your own license agreement, provided that such license agreement contains terms no less protective of Sybase and each Contributor than the terms of this License, and stating that any provisions which differ from this License are offered by You alone and not by any other party. + + 2.3 You expressly acknowledge and agree that although Sybase and each Contributor grants the licenses to their respective portions of the Covered Code set forth herein, no assurances are provided by Sybase or any Contributor that the Covered Code does not infringe the patent or other intellectual property rights of any other entity. Sybase and each Contributor disclaim any liability to You for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, You hereby assume sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow You to distribute the Covered Code, it is Your responsibility to acquire that license before distributing the Covered Code. + +3. Your Grants. In consideration of, and as a condition to, the licenses granted to You under this License, You hereby grant to Sybase and all third parties a non-exclusive, royalty-free license, under Your Applicable Patent Rights and other intellectual property rights (other than patent) owned or controlled by You, to use, reproduce, display, perform, modify, distribute and Deploy Your Modifications of the same scope and extent as Sybase's licenses under Sections 2.1 and 2.2. + +4. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In each such instance, You must make sure the requirements of this License are fulfilled for the Covered Code or any portion thereof. + +5. Limitations on Patent License. Except as expressly stated in Section 2, no other patent rights, express or implied, are granted by Sybase herein. Modifications and/or Larger Works may require additional patent licenses from Sybase which Sybase may grant in its sole discretion. + +6. Additional Terms. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations and/or other rights consistent with this License ("Additional Terms") to one or more recipients of Covered Code. However, You may do so only on Your own behalf and as Your sole responsibility, and not on behalf of Sybase or any Contributor. You must obtain the recipient's agreement that any such Additional Terms are offered by You alone, and You hereby agree to indemnify, defend and hold Sybase and every Contributor harmless for any liability incurred by or claims asserted against Sybase or such Contributor by reason of any such Additional Terms. + +7. Versions of the License. Sybase may publish revised and/or new versions of this License from time to time. Each version will be given a distinguishing version number. Once Original Code has been published under a particular version of this License, You may continue to use it under the terms of that version. You may also choose to use such Original Code under the terms of any subsequent version of this License published by Sybase. No one other than Sybase has the right to modify the terms applicable to Covered Code created under this License. + +8. NO WARRANTY OR SUPPORT. The Covered Code may contain in whole or in part pre-release, untested, or not fully tested works. The Covered Code may contain errors that could cause failures or loss of data, and may be incomplete or contain inaccuracies. You expressly acknowledge and agree that use of the Covered Code, or any portion thereof, is at Your sole and entire risk. THE COVERED CODE IS PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND AND SYBASE AND SYBASE'S LICENSOR(S) (COLLECTIVELY REFERRED TO AS "SYBASE" FOR THE PURPOSES OF SECTIONS 8 AND 9) AND ALL CONTRIBUTORS EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. SYBASE AND EACH CONTRIBUTOR DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE COVERED CODE, THAT THE FUNCTIONS CONTAINED IN THE COVERED CODE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE COVERED CODE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE COVERED CODE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY SYBASE, A SYBASE AUTHORIZED REPRESENTATIVE OR ANY CONTRIBUTOR SHALL CREATE A WARRANTY. You acknowledge that the Covered Code is not intended for use in the operation of nuclear facilities, aircraft navigation, communication systems, or air traffic control machines in which case the failure of the Covered Code could lead to death, personal injury, or severe physical or environmental damage. + +9. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL SYBASE OR ANY CONTRIBUTOR BE LIABLE FOR ANY DIRECT, INCIDENTAL, SPECIAL, INDIRECT, CONSEQUENTIAL OR OTHER DAMAGES OF ANY KIND ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO USE THE COVERED CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY OR OTHERWISE, EVEN IF SYBASE OR SUCH CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF ANY REMEDY. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY OF INCIDENTAL OR CONSEQUENTIAL OR OTHER DAMAGES OF ANY KIND, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Sybase's or any Contributor's total liability to You for all damages (other than as may be required by applicable law) under this License exceed the amount of five hundred dollars ($500.00). + +10. Trademarks. This License does not grant any rights to use the trademarks or trade names "Sybase" or any other trademarks or trade names belonging to Sybase (collectively "Sybase Marks") or to any trademark or trade name belonging to any Contributor("Contributor Marks"). No Sybase Marks or Contributor Marks may be used to endorse or promote products derived from the Original Code or Covered Code other than with the prior written consent of Sybase or the Contributor, as applicable. + +11. Ownership. Subject to the licenses granted under this License, each Contributor retains all rights, title and interest in and to any Modifications made by such Contributor. Sybase retains all rights, title and interest in and to the Original Code and any Modifications made by or on behalf of Sybase ("Sybase Modifications"), and such Sybase Modifications will not be automatically subject to this License. Sybase may, at its sole discretion, choose to license such Sybase Modifications under this License, or on different terms from those contained in this License or may choose not to license them at all. + +12. Termination. + + 12.1 Termination. This License and the rights granted hereunder will terminate: + + (a) automatically without notice if You fail to comply with any term(s) of this License and fail to cure such breach within 30 days of becoming aware of such breach; + + (b) immediately in the event of the circumstances described in Section 13.5(b); or + + (c) automatically without notice if You, at any time during the term of this License, commence an action for patent infringement (including as a cross claim or counterclaim) against Sybase or any Contributor. + + 12.2 Effect of Termination. Upon termination, You agree to immediately stop any further use, reproduction, modification, sublicensing and distribution of the Covered Code and to destroy all copies of the Covered Code that are in your possession or control. All sublicenses to the Covered Code that have been properly granted prior to termination shall survive any termination of this License. Provisions which, by their nature, should remain in effect beyond the termination of this License shall survive, including but not limited to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. No party will be liable to any other for compensation, indemnity or damages of any sort solely as a result of terminating this License in accordance with its terms, and termination of this License will be without prejudice to any other right or remedy of any party. + +13. Miscellaneous. + + 13.1 Government End Users. The Covered Code is a "commercial item" as defined in FAR 2.101. Government software and technical data rights in the Covered Code include only those rights customarily provided to the public as defined in this License. This customary commercial license in technical data and software is provided in accordance with FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- Commercial Items) and 227.7202-3 (Rights in Commercial Computer Software or Computer Software Documentation). Accordingly, all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 13.2 Relationship of Parties. This License will not be construed as creating an agency, partnership, joint venture or any other form of legal association between or among you, Sybase or any Contributor, and You will not represent to the contrary, whether expressly, by implication, appearance or otherwise. + + 13.3 Independent Development. Nothing in this License will impair Sybase's or any Contributor's right to acquire, license, develop, have others develop for it, market and/or distribute technology or products that perform the same or similar functions as, or otherwise compete with, Modifications, Larger Works, technology or products that You may develop, produce, market or distribute. + + 13.4 Waiver; Construction. Failure by Sybase or any Contributor to enforce any provision of this License will not be deemed a waiver of future enforcement of that or any other provision. Any law or regulation which provides that the language of a contract shall be construed against the drafter will not apply to this License. + + 13.5 Severability. (a) If for any reason a court of competent jurisdiction finds any provision of this License, or portion thereof, to be unenforceable, that provision of the License will be enforced to the maximum extent permissible so as to effect the economic benefits and intent of the parties, and the remainder of this License will continue in full force and effect. (b) Notwithstanding the foregoing, if applicable law prohibits or restricts You from fully and/or specifically complying with Sections 2 and/or 3 or prevents the enforceability of either of those Sections, this License will immediately terminate and You must immediately discontinue any use of the Covered Code and destroy all copies of it that are in your possession or control. + + 13.6 Dispute Resolution. Any litigation or other dispute resolution between You and Sybase relating to this License shall take place in the Northern District of California, and You and Sybase hereby consent to the personal jurisdiction of, and venue in, the state and federal courts within that District with respect to this License. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. + + 13.7 Entire Agreement; Governing Law. This License constitutes the entire agreement between the parties with respect to the subject matter hereof. This License shall be governed by the laws of the United States and the State of California, except that body of California law concerning conflicts of law. +Where You are located in the province of Quebec, Canada, the following clause applies: The parties hereby confirm that they have requested that this License and all related documents be drafted in English. Les parties ont exigè que le prèsent contrat et tous les documents connexes soient rèdiès en anglais. + + +EXHIBIT A. + +"Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved. +This file contains Original Code and/or Modifications of Original Code as defined in and that are subject to the Sybase Open Watcom Public License version 1.0 (the 'License'). You may not use this file except in compliance with the License. BY USING THIS FILE YOU AGREE TO ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is provided with the Original Code and Modifications, and is also available at www.sybase.com/developer/opensource. + +The Original Code and all software distributed under the License are distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the specific language governing rights and limitations under the License." \ No newline at end of file diff --git a/options/license/Wsuipa b/options/license/Wsuipa new file mode 100644 index 0000000..7f81ede --- /dev/null +++ b/options/license/Wsuipa @@ -0,0 +1,5 @@ +This file was added by Clea F. Rees on 2008/11/30 with the permission of Dean Guenther and pointers to this file were added to all source files. + +Unlimited copying and redistribution of each of the files is permitted as long as the file is not modified. Modifications, and redistribution of modified versions, are also permitted, but only if the resulting file is renamed. + +The copyright holder is Washington State University. The original author of the fonts is Janene Winter. The primary contact (as of 2008) is Dean Guenther. \ No newline at end of file diff --git a/options/license/X11 b/options/license/X11 new file mode 100644 index 0000000..6b41092 --- /dev/null +++ b/options/license/X11 @@ -0,0 +1,13 @@ +X11 License + +Copyright (C) 1996 X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. + +X Window System is a trademark of X Consortium, Inc. diff --git a/options/license/XFree86-1.1 b/options/license/XFree86-1.1 new file mode 100644 index 0000000..8bfdef0 --- /dev/null +++ b/options/license/XFree86-1.1 @@ -0,0 +1,16 @@ +XFree86 License (version 1.1) + +Copyright (C) 1994-2006 The XFree86 Project, Inc. +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution, and in the same place and form as other copyright, license and disclaimer information. + + 3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and its contributors", in the same place and form as other third-party acknowledgments. Alternately, this acknowledgment may appear in the software itself, in the same form and location as other such third-party acknowledgments. + + 4. Except as contained in this notice, the name of The XFree86 Project, Inc shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The XFree86 Project, Inc. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE XFREE86 PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/XSkat b/options/license/XSkat new file mode 100644 index 0000000..0b77a07 --- /dev/null +++ b/options/license/XSkat @@ -0,0 +1,10 @@ +This program is free software; you can redistribute it freely. +Use it at your own risk; there is NO WARRANTY. + +Redistribution of modified versions is permitted provided that the following conditions are met: + +1. All copyright & permission notices are preserved. + +2.a) Only changes required for packaging or porting are made. + or +2.b) It is clearly stated who last changed the program. The program is renamed or the version number is of the form x.y.z, where x.y is the version of the original program and z is an arbitrary suffix. diff --git a/options/license/Xerox b/options/license/Xerox new file mode 100644 index 0000000..acd6dd6 --- /dev/null +++ b/options/license/Xerox @@ -0,0 +1,5 @@ +Copyright (c) 1995, 1996 Xerox Corporation. All Rights Reserved. + +Use and copying of this software and preparation of derivative works based upon this software are permitted. Any copy of this software or of any derivative work must include the above copyright notice of Xerox Corporation, this paragraph and the one after it. Any distribution of this software or derivative works must comply with all applicable United States export control laws. + +This software is made available AS IS, and XEROX CORPORATION DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND NOTWITHSTANDING ANY OTHER PROVISION CONTAINED HEREIN, ANY LIABILITY FOR DAMAGES RESULTING FROM THE SOFTWARE OR ITS USE IS EXPRESSLY DISCLAIMED, WHETHER ARISING IN CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, EVEN IF XEROX CORPORATION IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/options/license/Xnet b/options/license/Xnet new file mode 100644 index 0000000..309f8e1 --- /dev/null +++ b/options/license/Xnet @@ -0,0 +1,11 @@ +The X.Net, Inc. License + +Copyright (c) 2000-2001 X.Net, Inc. Lafayette, California, USA + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +This agreement shall be governed in all respects by the laws of the State of California and by the laws of the United States of America. \ No newline at end of file diff --git a/options/license/YPL-1.0 b/options/license/YPL-1.0 new file mode 100644 index 0000000..1877139 --- /dev/null +++ b/options/license/YPL-1.0 @@ -0,0 +1,47 @@ +Yahoo! Public License, Version 1.0 (YPL) + +This Yahoo! Public License (this "Agreement") is a legal agreement that describes the terms under which Yahoo! Inc., a Delaware corporation having its principal place of business at 701 First Avenue, Sunnyvale, California 94089 ("Yahoo!") will provide software to you via download or otherwise ("Software"). By using the Software, you, an individual or an entity ("You") agree to the terms of this Agreement. + +In consideration of the mutual promises and upon the terms and conditions set forth below, the parties agree as follows: + +1. Grant of Copyright License + + 1.1 - Subject to the terms and conditions of this Agreement, Yahoo! hereby grants to You, under any and all of its copyright interest in and to the Software, a royalty-free, non-exclusive, non-transferable license to copy, modify, compile, execute, and distribute the Software and Modifications. For the purposes of this Agreement, any change to, addition to, or abridgement of the Software made by You is a "Modification;" however, any file You add to the Software that does not contain any part of the Software is not a "Modification." + + 1.2 - If You are an individual acting on behalf of a corporation or other entity, Your use of the Software or any Modification is subject to Your having the authority to bind such corporation or entity to this Agreement. Providing copies to persons within such corporation or entity is not considered distribution for purposes of this Agreement. + + 1.3 - For the Software or any Modification You distribute in source code format, You must do so only under the terms of this Agreement, and You must include a complete copy of this Agreement with Your distribution. With respect to any Modification You distribute in source code format, the terms of this Agreement will apply to You in the same way those terms apply to Yahoo! with respect to the Software. In other words, when You are distributing Modifications under this Agreement, You "stand in the shoes" of Yahoo! in terms of the rights You grant and how the terms and conditions apply to You and the licensees of Your Modifications. Notwithstanding the foregoing, when You "stand in the shoes" of Yahoo!, You are not subject to the jurisdiction provision under Section 7, which requires all disputes under this Agreement to be subject to the jurisdiction of federal or state courts of northern California. + + 1.4 - For the Software or any Modification You distribute in compiled or object code format, You must also provide recipients with access to the Software or Modification in source code format along with a complete copy of this Agreement. The distribution of the Software or Modifications in compiled or object code format may be under a license of Your choice, provided that You are in compliance with the terms of this Agreement. In addition, You must make absolutely clear that any license terms applying to such Software or Modification that differ from this Agreement are offered by You alone and not by Yahoo!, and that such license does not restrict recipients from exercising rights in the source code to the Software granted by Yahoo! under this Agreement or rights in the source code to any Modification granted by You as described in Section 1.3. + + 1.5 - This Agreement does not limit Your right to distribute files that are entirely Your own work (i.e., which do not incorporate any portion of the Software and are not Modifications) under any terms You choose. + +2. Support +Yahoo! has no obligation to provide technical support or updates to You. Nothing in this Agreement requires Yahoo! to enter into any license with You for any other edition of the Software. + +3. Intellectual Property Rights + + 3.1 - Except for the license expressly granted under copyright in Section 1.1, no rights, licenses or forbearances are granted or may arise in relation to this Agreement whether expressly, by implication, exhaustion, estoppel or otherwise. All rights, including all intellectual property rights, that are not expressly granted under this Agreement are hereby reserved. + + 3.2 - In any copy of the Software or in any Modification you create, You must retain and reproduce, any and all copyright, patent, trademark, and attribution notices that are included in the Software in the same form as they appear in the Software. This includes the preservation of attribution notices in the form of trademarks or logos that exist within a user interface of the Software. + + 3.3 - This license does not grant You rights to use any party's name, logo, or trademarks, except solely as necessary to comply with Section 3.2. + +4. Disclaimer of Warranties +THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND. YAHOO! MAKES NO WARRANTIES, WHETHER EXPRESS, IMPLIED, OR STATUTORY REGARDING OR RELATING TO THE SOFTWARE. SPECIFICALLY, YAHOO! DOES NOT WARRANT THAT THE SOFTWARE WILL BE ERROR FREE OR WILL PERFORM IN AN UNINTERRUPTED MANNER. TO THE GREATEST EXTENT ALLOWED BY LAW, YAHOO! SPECIFICALLY DISCLAIMS ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE (EVEN IF YAHOO! HAD BEEN INFORMED OF SUCH PURPOSE), AND NONINFRINGEMENT WITH RESPECT TO THE SOFTWARE, ANY MODIFICATIONS THERETO AND WITH RESPECT TO THE USE OF THE FOREGOING. + +5. Limitation of Liability +IN NO EVENT WILL YAHOO! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES OF ANY KIND (INCLUDING WITHOUT LIMITATION LOSS OF PROFITS, LOSS OF USE, BUSINESS INTERRUPTION, LOSS OF DATA, COST OF COVER) IN CONNECTION WITH OR ARISING OUT OF OR RELATING TO THE FURNISHING, PERFORMANCE OR USE OF THE SOFTWARE OR ANY OTHER RIGHTS GRANTED HEREUNDER, WHETHER ALLEGED AS A BREACH OF CONTRACT OR TORTIOUS CONDUCT, INCLUDING NEGLIGENCE, AND EVEN IF YAHOO! HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6. Term and Termination + + 6.1 - This Agreement will continue in effect unless and until terminated earlier pursuant to this Section 6. + + 6.2 - In the event Yahoo! determines that You have breached this Agreement, Yahoo! may terminate this Agreement. + + 6.3 - All licenses granted hereunder shall terminate upon the termination of this Agreement. Termination will be in addition to any rights and remedies available to Yahoo! at law or equity or under this Agreement. + + 6.4 - Termination of this Agreement will not affect the provisions regarding reservation of rights (Section 3.1), provisions disclaiming or limiting Yahoo!'s liability (Sections 4 and 5), Termination (Section 6) or Miscellaneous (Section 7), which provisions will survive termination of this Agreement. + +7. Miscellaneous +This Agreement contains the entire agreement of the parties with respect to the subject matter of this Agreement and supersedes all previous communications, representations, understandings and agreements, either oral or written, between the parties with respect to said subject matter. The relationship of the parties hereunder is that of independent contractors, and this Agreement will not be construed as creating an agency, partnership, joint venture or any other form of legal association between the parties. If any term, condition, or provision in this Agreement is found to be invalid, unlawful or unenforceable to any extent, this Agreement will be construed in a manner that most closely effectuates the intent of this Agreement. Such invalid term, condition or provision will be severed from the remaining terms, conditions and provisions, which will continue to be valid and enforceable to the fullest extent permitted by law. This Agreement will be interpreted and construed in accordance with the laws of the State of California and the United States of America, without regard to conflict of law principles. The U.N. Convention on Contracts for the International Sale of Goods shall not apply to this Agreement. All disputes arising out of this Agreement involving Yahoo! or any of its subsidiaries shall be subject to the jurisdiction of the federal or state courts of northern California, with venue lying in Santa Clara County, California. No rights may be assigned, no obligations may be delegated, and this Agreement may not be transferred by You, in whole or in part, whether voluntary or by operation of law, including by way of sale of assets, merger or consolidation, without the prior written consent of Yahoo!, and any purported assignment, delegation or transfer without such consent shall be void ab initio. Any waiver of the provisions of this Agreement or of a party's rights or remedies under this Agreement must be in writing to be effective. Failure, neglect or delay by a party to enforce the provisions of this Agreement or its rights or remedies at any time, will not be construed or be deemed to be a waiver of such party's rights under this Agreement and will not in any way affect the validity of the whole or any part of this Agreement or prejudice such party's right to take subsequent action. \ No newline at end of file diff --git a/options/license/YPL-1.1 b/options/license/YPL-1.1 new file mode 100644 index 0000000..b5e9f21 --- /dev/null +++ b/options/license/YPL-1.1 @@ -0,0 +1,47 @@ +Yahoo! Public License, Version 1.1 (YPL) + +This Yahoo! Public License (this "Agreement") is a legal agreement that describes the terms under which Yahoo! Inc., a Delaware corporation having its principal place of business at 701 First Avenue, Sunnyvale, California 94089 ("Yahoo!") will provide software to you via download or otherwise ("Software"). By using the Software, you, an individual or an entity ("You") agree to the terms of this Agreement. + +In consideration of the mutual promises and upon the terms and conditions set forth below, the parties agree as follows: + +1. Grant of Copyright License + + 1.1 - Subject to the terms and conditions of this Agreement, Yahoo! hereby grants to You, under any and all of its copyright interest in and to the Software, a royalty-free, non-exclusive, non-transferable license to copy, modify, compile, execute, and distribute the Software and Modifications. For the purposes of this Agreement, any change to, addition to, or abridgement of the Software made by You is a "Modification;" however, any file You add to the Software that does not contain any part of the Software is not a "Modification." + + 1.2 - If You are an individual acting on behalf of a corporation or other entity, Your use of the Software or any Modification is subject to Your having the authority to bind such corporation or entity to this Agreement. Providing copies to persons within such corporation or entity is not considered distribution for purposes of this Agreement. + + 1.3 - For the Software or any Modification You distribute in source code format, You must do so only under the terms of this Agreement, and You must include a complete copy of this Agreement with Your distribution. With respect to any Modification You distribute in source code format, the terms of this Agreement will apply to You in the same way those terms apply to Yahoo! with respect to the Software. In other words, when You are distributing Modifications under this Agreement, You "stand in the shoes" of Yahoo! in terms of the rights You grant and how the terms and conditions apply to You and the licensees of Your Modifications. Notwithstanding the foregoing, when You "stand in the shoes" of Yahoo!, You are not subject to the jurisdiction provision under Section 7, which requires all disputes under this Agreement to be subject to the jurisdiction of federal or state courts of northern California. + + 1.4 - For the Software or any Modification You distribute in compiled or object code format, You must also provide recipients with access to the Software or Modification in source code format along with a complete copy of this Agreement. The distribution of the Software or Modifications in compiled or object code format may be under a license of Your choice, provided that You are in compliance with the terms of this Agreement. In addition, You must make absolutely clear that any license terms applying to such Software or Modification that differ from this Agreement are offered by You alone and not by Yahoo!, and that such license does not restrict recipients from exercising rights in the source code to the Software granted by Yahoo! under this Agreement or rights in the source code to any Modification granted by You as described in Section 1.3. + + 1.5 - This Agreement does not limit Your right to distribute files that are entirely Your own work (i.e., which do not incorporate any portion of the Software and are not Modifications) under any terms You choose. + +2. Support +Yahoo! has no obligation to provide technical support or updates to You. Nothing in this Agreement requires Yahoo! to enter into any license with You for any other edition of the Software. + +3. Intellectual Property Rights + + 3.1 - Except for the license expressly granted under copyright in Section 1.1, no rights, licenses or forbearances are granted or may arise in relation to this Agreement whether expressly, by implication, exhaustion, estoppel or otherwise. All rights, including all intellectual property rights, that are not expressly granted under this Agreement are hereby reserved. + + 3.2 - In any copy of the Software or in any Modification you create, You must retain and reproduce, any and all copyright, patent, trademark, and attribution notices that are included in the Software in the same form as they appear in the Software. This includes the preservation of attribution notices in the form of trademarks or logos that exist within a user interface of the Software. + + 3.3 - This license does not grant You rights to use any party's name, logo, or trademarks, except solely as necessary to comply with Section 3.2. + +4. Disclaimer of Warranties +THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND. YAHOO! MAKES NO WARRANTIES, WHETHER EXPRESS, IMPLIED, OR STATUTORY REGARDING OR RELATING TO THE SOFTWARE. SPECIFICALLY, YAHOO! DOES NOT WARRANT THAT THE SOFTWARE WILL BE ERROR FREE OR WILL PERFORM IN AN UNINTERRUPTED MANNER. TO THE GREATEST EXTENT ALLOWED BY LAW, YAHOO! SPECIFICALLY DISCLAIMS ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE (EVEN IF YAHOO! HAD BEEN INFORMED OF SUCH PURPOSE), AND NONINFRINGEMENT WITH RESPECT TO THE SOFTWARE, ANY MODIFICATIONS THERETO AND WITH RESPECT TO THE USE OF THE FOREGOING. + +5. Limitation of Liability +IN NO EVENT WILL YAHOO! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES OF ANY KIND (INCLUDING WITHOUT LIMITATION LOSS OF PROFITS, LOSS OF USE, BUSINESS INTERRUPTION, LOSS OF DATA, COST OF COVER) IN CONNECTION WITH OR ARISING OUT OF OR RELATING TO THE FURNISHING, PERFORMANCE OR USE OF THE SOFTWARE OR ANY OTHER RIGHTS GRANTED HEREUNDER, WHETHER ALLEGED AS A BREACH OF CONTRACT OR TORTIOUS CONDUCT, INCLUDING NEGLIGENCE, AND EVEN IF YAHOO! HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6. Term and Termination + + 6.1 - This Agreement will continue in effect unless and until terminated earlier pursuant to this Section 6. + + 6.2 - In the event You violate the terms of this Agreement, Yahoo! may terminate this Agreement. + + 6.3 - All licenses granted hereunder shall terminate upon the termination of this Agreement. Termination will be in addition to any rights and remedies available to Yahoo! at law or equity or under this Agreement. + + 6.4 - Termination of this Agreement will not affect the provisions regarding reservation of rights (Section 3.1), provisions disclaiming or limiting Yahoo!'s liability (Sections 4 and 5), Termination (Section 6) or Miscellaneous (Section 7), which provisions will survive termination of this Agreement. + +7.Miscellaneous +This Agreement contains the entire agreement of the parties with respect to the subject matter of this Agreement and supersedes all previous communications, representations, understandings and agreements, either oral or written, between the parties with respect to said subject matter. The relationship of the parties hereunder is that of independent contractors, and this Agreement will not be construed as creating an agency, partnership, joint venture or any other form of legal association between the parties. If any term, condition, or provision in this Agreement is found to be invalid, unlawful or unenforceable to any extent, this Agreement will be construed in a manner that most closely effectuates the intent of this Agreement. Such invalid term, condition or provision will be severed from the remaining terms, conditions and provisions, which will continue to be valid and enforceable to the fullest extent permitted by law. This Agreement will be interpreted and construed in accordance with the laws of the State of California and the United States of America, without regard to conflict of law principles. The U.N. Convention on Contracts for the International Sale of Goods shall not apply to this Agreement. All disputes arising out of this Agreement involving Yahoo! or any of its subsidiaries shall be subject to the jurisdiction of the federal or state courts of northern California, with venue lying in Santa Clara County, California. No rights may be assigned, no obligations may be delegated, and this Agreement may not be transferred by You, in whole or in part, whether voluntary or by operation of law, including by way of sale of assets, merger or consolidation, without the prior written consent of Yahoo!, and any purported assignment, delegation or transfer without such consent shall be void ab initio. Any waiver of the provisions of this Agreement or of a party's rights or remedies under this Agreement must be in writing to be effective. Failure, neglect or delay by a party to enforce the provisions of this Agreement or its rights or remedies at any time, will not be construed or be deemed to be a waiver of such party's rights under this Agreement and will not in any way affect the validity of the whole or any part of this Agreement or prejudice such party's right to take subsequent action. diff --git a/options/license/ZPL-1.1 b/options/license/ZPL-1.1 new file mode 100644 index 0000000..ee87fa8 --- /dev/null +++ b/options/license/ZPL-1.1 @@ -0,0 +1,33 @@ +Zope Public License (ZPL) Version 1.1 + +Copyright (c) Zope Corporation. All rights reserved. + +This license has been certified as open source. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions in source code must retain the above copyright notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. All advertising materials and documentation mentioning features derived from or use of this software must display the following acknowledgement: + + "This product includes software developed by Zope Corporation for use in the Z Object Publishing Environment (http://www.zope.com/)." + + In the event that the product being advertised includes an intact Zope distribution (with copyright and license included) then this clause is waived. + + 4. Names associated with Zope or Zope Corporation must not be used to endorse or promote products derived from this software without prior written permission from Zope Corporation. + + 5. Modified redistributions of any form whatsoever must retain the following acknowledgment: + + "This product includes software developed by Zope Corporation for use in the Z Object Publishing Environment (http://www.zope.com/)." + + Intact (re-)distributions of any official Zope release do not require an external acknowledgement. + + 6. Modifications are encouraged but must be packaged separately as patches to official Zope releases. Distributions that do not clearly separate the patches from the original work must be clearly labeled as unofficial distributions. Modifications which do not carry the name Zope may be packaged in any form, as long as they conform to all of the clauses above. + +Disclaimer + +THIS SOFTWARE IS PROVIDED BY ZOPE CORPORATION ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ZOPE CORPORATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This software consists of contributions made by Zope Corporation and many individuals on behalf of Zope Corporation. Specific attributions are listed in the accompanying credits file. \ No newline at end of file diff --git a/options/license/ZPL-2.0 b/options/license/ZPL-2.0 new file mode 100644 index 0000000..5fee14b --- /dev/null +++ b/options/license/ZPL-2.0 @@ -0,0 +1,23 @@ +Zope Public License (ZPL) Version 2.0 + +This software is Copyright (c) Zope Corporation (tm) and Contributors. All rights reserved. + +This license has been certified as open source. It has also been designated as GPL compatible by the Free Software Foundation (FSF). + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions in source code must retain the above copyright notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. The name Zope Corporation (tm) must not be used to endorse or promote products derived from this software without prior written permission from Zope Corporation. + + 4. The right to distribute this software or to use it for any purpose does not give you the right to use Servicemarks (sm) or Trademarks (tm) of Zope Corporation. Use of them is covered in a separate agreement (see http://www.zope.com/Marks). + + 5. If any files are modified, you must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + +Disclaimer + +THIS SOFTWARE IS PROVIDED BY ZOPE CORPORATION ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ZOPE CORPORATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +This software consists of contributions made by Zope Corporation and many individuals on behalf of Zope Corporation. Specific attributions are listed in the accompanying credits file. \ No newline at end of file diff --git a/options/license/ZPL-2.1 b/options/license/ZPL-2.1 new file mode 100644 index 0000000..8b42a72 --- /dev/null +++ b/options/license/ZPL-2.1 @@ -0,0 +1,21 @@ +Zope Public License (ZPL) Version 2.1 + +A copyright notice accompanies this license document that identifies the copyright holders. + +This license has been certified as open source. It has also been designated as GPL compatible by the Free Software Foundation (FSF). + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions in source code must retain the accompanying copyright notice, this list of conditions, and the following disclaimer. + + 2. Redistributions in binary form must reproduce the accompanying copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Names of the copyright holders must not be used to endorse or promote products derived from this software without prior written permission from the copyright holders. + + 4. The right to distribute this software or to use it for any purpose does not give you the right to use Servicemarks (sm) or Trademarks (tm) of the copyright holders. Use of them is covered by separate agreement with the copyright holders. + + 5. If any files are modified, you must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + +Disclaimer + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/Zed b/options/license/Zed new file mode 100644 index 0000000..5f7cd2c --- /dev/null +++ b/options/license/Zed @@ -0,0 +1,3 @@ +(c) Jim Davies, January 1995 +You may copy and distribute this file freely. Any queries and complaints should be forwarded to Jim.Davies@comlab.ox.ac.uk. +If you make any changes to this file, please do not distribute the results under the name `zed-csp.sty'. diff --git a/options/license/Zend-2.0 b/options/license/Zend-2.0 new file mode 100644 index 0000000..edbe653 --- /dev/null +++ b/options/license/Zend-2.0 @@ -0,0 +1,18 @@ +The Zend Engine License, version 2.00 +Copyright (c) 1999-2002 Zend Technologies Ltd. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, is permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. The names "Zend" and "Zend Engine" must not be used to endorse or promote products derived from this software without prior permission from Zend Technologies Ltd. For written permission, please contact license@zend.com. + + 4. Zend Technologies Ltd. may publish revised and/or new versions of the license from time to time. Each version will be given a distinguishing version number. Once covered code has been published under a particular version of the license, you may always continue to use it under the terms of that version. You may also choose to use such covered code under the terms of any subsequent version of the license published by Zend Technologies Ltd. No one other than Zend Technologies Ltd. has the right to modify the terms applicable to covered code created under this License. + + 5. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes the Zend Engine, freely available at http://www.zend.com" + + 6. All advertising materials mentioning features or use of this software must display the following acknowledgment: "The Zend Engine is freely available at http://www.zend.com" + +THIS SOFTWARE IS PROVIDED BY ZEND TECHNOLOGIES LTD. ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ZEND TECHNOLOGIES LTD. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/options/license/Zimbra-1.3 b/options/license/Zimbra-1.3 new file mode 100644 index 0000000..4f8a248 --- /dev/null +++ b/options/license/Zimbra-1.3 @@ -0,0 +1,47 @@ +Zimbra Public License, Version 1.3 (ZPL) + +This Zimbra Public License (this "Agreement") is a legal agreement that describes the terms under which VMware, Inc., a Delaware corporation having its principal place of business at 3401 Hillview Avenue, Palo Alto, California 94304 ("VMware") will provide software to you via download or otherwise ("Software"). By using the Software, you, an individual or an entity ("You") agree to the terms of this Agreement. + +In consideration of the mutual promises and upon the terms and conditions set forth below, the parties agree as follows: + +1. Grant of Copyright License + + 1.1 - Subject to the terms and conditions of this Agreement, VMware hereby grants to You, under any and all of its copyright interest in and to the Software, a royalty-free, non-exclusive, non-transferable license to copy, modify, compile, execute, and distribute the Software and Modifications. For the purposes of this Agreement, any change to, addition to, or abridgement of the Software made by You is a "Modification;" however, any file You add to the Software that does not contain any part of the Software is not a "Modification." + + 1.2 - If You are an individual acting on behalf of a corporation or other entity, Your use of the Software or any Modification is subject to Your having the authority to bind such corporation or entity to this Agreement. Providing copies to persons within such corporation or entity is not considered distribution for purposes of this Agreement. + + 1.3 - For the Software or any Modification You distribute in source code format, You must do so only under the terms of this Agreement, and You must include a complete copy of this Agreement with Your distribution. With respect to any Modification You distribute in source code format, the terms of this Agreement will apply to You in the same way those terms apply to VMware with respect to the Software. In other words, when You are distributing Modifications under this Agreement, You "stand in the shoes" of VMware in terms of the rights You grant and how the terms and conditions apply to You and the licensees of Your Modifications. Notwithstanding the foregoing, when You "stand in the shoes" of VMware, You are not subject to the jurisdiction provision under Section 7, which requires all disputes under this Agreement to be subject to the jurisdiction of federal or state courts of northern California. + + 1.4 - For the Software or any Modification You distribute in compiled or object code format, You must also provide recipients with access to the Software or Modification in source code format along with a complete copy of this Agreement. The distribution of the Software or Modifications in compiled or object code format may be under a license of Your choice, provided that You are in compliance with the terms of this Agreement. In addition, You must make absolutely clear that any license terms applying to such Software or Modification that differ from this Agreement are offered by You alone and not by VMware, and that such license does not restrict recipients from exercising rights in the source code to the Software granted by VMware under this Agreement or rights in the source code to any Modification granted by You as described in Section 1.3. + + 1.5 - This Agreement does not limit Your right to distribute files that are entirely Your own work (i.e., which do not incorporate any portion of the Software and are not Modifications) under any terms You choose. + +2. Support +VMware has no obligation to provide technical support or updates to You. Nothing in this Agreement requires VMware to enter into any license with You for any other edition of the Software. + +3. Intellectual Property Rights + + 3.1 - Except for the license expressly granted under copyright in Section 1.1, no rights, licenses or forbearances are granted or may arise in relation to this Agreement whether expressly, by implication, exhaustion, estoppel or otherwise. All rights, including all intellectual property rights, that are not expressly granted under this Agreement are hereby reserved. + + 3.2 - In any copy of the Software or in any Modification you create, You must retain and reproduce, any and all copyright, patent, trademark, and attribution notices that are included in the Software in the same form as they appear in the Software. This includes the preservation of attribution notices in the form of trademarks or logos that exist within a user interface of the Software. + + 3.3 - This license does not grant You rights to use any party's name, logo, or trademarks, except solely as necessary to comply with Section 3.2. + +4. Disclaimer of Warranties +THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND. VMWARE MAKES NO WARRANTIES, WHETHER EXPRESS, IMPLIED, OR STATUTORY REGARDING OR RELATING TO THE SOFTWARE. SPECIFICALLY, VMWARE DOES NOT WARRANT THAT THE SOFTWARE WILL BE ERROR FREE OR WILL PERFORM IN AN UNINTERRUPTED MANNER. TO THE GREATEST EXTENT ALLOWED BY LAW, VMWARE SPECIFICALLY DISCLAIMS ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE (EVEN IF VMWARE HAD BEEN INFORMED OF SUCH PURPOSE), AND NONINFRINGEMENT WITH RESPECT TO THE SOFTWARE, ANY MODIFICATIONS THERETO AND WITH RESPECT TO THE USE OF THE FOREGOING. + +5. Limitation of Liability +IN NO EVENT WILL VMWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES OF ANY KIND (INCLUDING WITHOUT LIMITATION LOSS OF PROFITS, LOSS OF USE, BUSINESS INTERRUPTION, LOSS OF DATA, COST OF COVER) IN CONNECTION WITH OR ARISING OUT OF OR RELATING TO THE FURNISHING, PERFORMANCE OR USE OF THE SOFTWARE OR ANY OTHER RIGHTS GRANTED HEREUNDER, WHETHER ALLEGED AS A BREACH OF CONTRACT OR TORTIOUS CONDUCT, INCLUDING NEGLIGENCE, AND EVEN IF VMWARE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6. Term and Termination + + 6.1 - This Agreement will continue in effect unless and until terminated earlier pursuant to this Section 6. + + 6.2 - In the event You violate the terms of this Agreement, VMware may terminate this Agreement. + + 6.3 - All licenses granted hereunder shall terminate upon the termination of this Agreement. Termination will be in addition to any rights and remedies available to VMware at law or equity or under this Agreement. + + 6.4 - Termination of this Agreement will not affect the provisions regarding reservation of rights (Section 3.1), provisions disclaiming or limiting VMware's liability (Sections 4 and 5), Termination (Section 6) or Miscellaneous (Section 7), which provisions will survive termination of this Agreement. + +7. Miscellaneous +This Agreement contains the entire agreement of the parties with respect to the subject matter of this Agreement and supersedes all previous communications, representations, understandings and agreements, either oral or written, between the parties with respect to said subject matter. The relationship of the parties hereunder is that of independent contractors, and this Agreement will not be construed as creating an agency, partnership, joint venture or any other form of legal association between the parties. If any term, condition, or provision in this Agreement is found to be invalid, unlawful or unenforceable to any extent, this Agreement will be construed in a manner that most closely effectuates the intent of this Agreement. Such invalid term, condition or provision will be severed from the remaining terms, conditions and provisions, which will continue to be valid and enforceable to the fullest extent permitted by law. This Agreement will be interpreted and construed in accordance with the laws of the State of California and the United States of America, without regard to conflict of law principles. The U.N. Convention on Contracts for the International Sale of Goods shall not apply to this Agreement. All disputes arising out of this Agreement involving VMware or any of its subsidiaries shall be subject to the jurisdiction of the federal or state courts of northern California, with venue lying in Santa Clara County, California. No rights may be assigned, no obligations may be delegated, and this Agreement may not be transferred by You, in whole or in part, whether voluntary or by operation of law, including by way of sale of assets, merger or consolidation, without the prior written consent of VMware, and any purported assignment, delegation or transfer without such consent shall be void ab initio. Any waiver of the provisions of this Agreement or of a party's rights or remedies under this Agreement must be in writing to be effective. Failure, neglect or delay by a party to enforce the provisions of this Agreement or its rights or remedies at any time, will not be construed or be deemed to be a waiver of such party's rights under this Agreement and will not in any way affect the validity of the whole or any part of this Agreement or prejudice such party's right to take subsequent action. \ No newline at end of file diff --git a/options/license/Zimbra-1.4 b/options/license/Zimbra-1.4 new file mode 100644 index 0000000..098aabb --- /dev/null +++ b/options/license/Zimbra-1.4 @@ -0,0 +1,47 @@ +Zimbra Public License, Version 1.4 (ZPL) + +This Zimbra Public License (this “Agreement”) is a legal agreement that describes the terms under which Zimbra, Inc., a Texas corporation (“Zimbra”) will provide software to you via download or otherwise (“Software”). By using the Software, you, an individual or an entity (“You”) agree to the terms of this Agreement. + +In consideration of the mutual promises and upon the terms and conditions set forth below, the parties agree as follows: + +1. Grant of Copyright License + + 1.1 - Subject to the terms and conditions of this Agreement, Zimbra hereby grants to You, under any and all of its copyright interest in and to the Software, a royalty-free, non-exclusive, non-transferable license to copy, modify, compile, execute, and distribute the Software and Modifications. For the purposes of this Agreement, any change to, addition to, or abridgement of the Software made by You is a “Modification;” however, any file You add to the Software that does not contain any part of the Software is not a “Modification.” + + 1.2 - If You are an individual acting on behalf of a corporation or other entity, Your use of the Software or any Modification is subject to Your having the authority to bind such corporation or entity to this Agreement. Providing copies to persons within such corporation or entity is not considered distribution for purposes of this Agreement. + + 1.3 - For the Software or any Modification You distribute in source code format, You must do so only under the terms of this Agreement, and You must include a complete copy of this Agreement with Your distribution. With respect to any Modification You distribute in source code format, the terms of this Agreement will apply to You in the same way those terms apply to Zimbra with respect to the Software. In other words, when You are distributing Modifications under this Agreement, You “stand in the shoes” of Zimbra in terms of the rights You grant and how the terms and conditions apply to You and the licensees of Your Modifications. Notwithstanding the foregoing, when You “stand in the shoes” of Zimbra, You are not subject to the jurisdiction provision under Section 7, which requires all disputes under this Agreement to be subject to the jurisdiction of federal or state courts of Northern Texas. + + 1.4 - For the Software or any Modification You distribute in compiled or object code format, You must also provide recipients with access to the Software or Modification in source code format along with a complete copy of this Agreement. The distribution of the Software or Modifications in compiled or object code format may be under a license of Your choice, provided that You are in compliance with the terms of this Agreement. In addition, You must make absolutely clear that any license terms applying to such Software or Modification that differ from this Agreement are offered by You alone and not by Zimbra, and that such license does not restrict recipients from exercising rights in the source code to the Software granted by Zimbra under this Agreement or rights in the source code to any Modification granted by You as described in Section 1.3. + + 1.5 - This Agreement does not limit Your right to distribute files that are entirely Your own work (i.e., which do not incorporate any portion of the Software and are not Modifications) under any terms You choose. + +2. Support +Zimbra has no obligation to provide technical support or updates to You. Nothing in this Agreement requires Zimbra to enter into any license with You for any other edition of the Software. + +3. Intellectual Property Rights + + 3.1 - Except for the license expressly granted under copyright in Section 1.1, no rights, licenses or forbearances are granted or may arise in relation to this Agreement whether expressly, by implication, exhaustion, estoppel or otherwise. All rights, including all intellectual property rights, that are not expressly granted under this Agreement are hereby reserved. + + 3.2 - In any copy of the Software or in any Modification you create, You must retain and reproduce any and all copyright, patent, trademark, and attribution notices that are included in the Software in the same form as they appear in the Software. This includes the preservation of attribution notices in the form of trademarks or logos that exist within a user interface of the Software. + + 3.3 - This license does not grant You rights to use any party’s name, logo, or trademarks, except solely as necessary to comply with Section 3.2. + +4. Disclaimer of Warranties +THE SOFTWARE IS PROVIDED “AS IS” AND WITHOUT WARRANTY OF ANY KIND. ZIMBRA MAKES NO WARRANTIES, WHETHER EXPRESS, IMPLIED, OR STATUTORY, REGARDING OR RELATING TO THE SOFTWARE. SPECIFICALLY, ZIMBRA DOES NOT WARRANT THAT THE SOFTWARE WILL BE ERROR FREE OR WILL PERFORM IN AN UNINTERRUPTED MANNER. TO THE GREATEST EXTENT ALLOWED BY LAW, ZIMBRA SPECIFICALLY DISCLAIMS ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE (EVEN IF ZIMBRA HAD BEEN INFORMED OF SUCH PURPOSE), AND NONINFRINGEMENT WITH RESPECT TO THE SOFTWARE, ANY MODIFICATIONS THERETO, AND WITH RESPECT TO THE USE OF THE FOREGOING. + +5. Limitation of Liability +IN NO EVENT WILL ZIMBRA BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES OF ANY KIND (INCLUDING WITHOUT LIMITATION LOSS OF PROFITS, LOSS OF USE, BUSINESS INTERRUPTION, LOSS OF DATA, AND COST OF COVER) IN CONNECTION WITH OR ARISING OUT OF OR RELATING TO THE FURNISHING, PERFORMANCE, OR USE OF THE SOFTWARE OR ANY OTHER RIGHTS GRANTED HEREUNDER, WHETHER ALLEGED AS A BREACH OF CONTRACT OR TORTIOUS CONDUCT, INCLUDING NEGLIGENCE, AND EVEN IF ZIMBRA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +6. Term and Termination + + 6.1 - This Agreement will continue in effect unless and until terminated earlier pursuant to this Section 6. + + 6.2 - In the event You violate the terms of this Agreement, Zimbra may terminate this Agreement. + + 6.3 - All licenses granted hereunder shall terminate upon the termination of this Agreement. Termination will be in addition to any rights and remedies available to Zimbra at law or equity or under this Agreement. + + 6.4 - Termination of this Agreement will not affect the provisions regarding reservation of rights (Section 3.1), provisions disclaiming or limiting Zimbra’s liability (Sections 4 and 5), Termination (Section 6), or Miscellaneous (Section 7), which provisions will survive termination of this Agreement. + +7. Miscellaneous +This Agreement contains the entire agreement of the parties with respect to the subject matter of this Agreement and supersedes all previous communications, representations, understandings, and agreements, either oral or written, between the parties with respect to said subject matter. The relationship of the parties hereunder is that of independent contractors, and this Agreement will not be construed as creating an agency, partnership, joint venture, or any other form of legal association between the parties. If any term, condition, or provision in this Agreement is found to be invalid, unlawful, or unenforceable to any extent, this Agreement will be construed in a manner that most closely effectuates the intent of this Agreement. Such invalid term, condition or provision will be severed from the remaining terms, conditions, and provisions, which will continue to be valid and enforceable to the fullest extent permitted by law. This Agreement will be interpreted and construed in accordance with the laws of the State of Delaware and the United States of America, without regard to conflict of law principles. The U.N. Convention on Contracts for the International Sale of Goods shall not apply to this Agreement. All disputes arising out of this Agreement involving Zimbra or any of its parents or subsidiaries shall be subject to the jurisdiction of the federal or state courts of Northern Texas, with venue lying in Dallas County, Texas. No rights may be assigned, no obligations may be delegated, and this Agreement may not be transferred by You, in whole or in part, whether voluntary or by operation of law, including by way of sale of assets, merger, or consolidation, without the prior written consent of Zimbra, and any purported assignment, delegation, or transfer without such consent shall be void ab initio. Any waiver of the provisions of this Agreement or of a party’s rights or remedies under this Agreement must be in writing to be effective. Failure, neglect, or delay by a party to enforce the provisions of this Agreement or its rights or remedies at any time will not be construed or be deemed to be a waiver of such party’s rights under this Agreement and will not in any way affect the validity of the whole or any part of this Agreement or prejudice such party’s right to take subsequent action. diff --git a/options/license/Zlib b/options/license/Zlib new file mode 100644 index 0000000..1c0c9ad --- /dev/null +++ b/options/license/Zlib @@ -0,0 +1,11 @@ +zlib License + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. diff --git a/options/license/curl b/options/license/curl new file mode 100644 index 0000000..dd333ab --- /dev/null +++ b/options/license/curl @@ -0,0 +1,10 @@ +COPYRIGHT AND PERMISSION NOTICE + +Copyright (c) 1996 - 2015, Daniel Stenberg, . +All rights reserved. + +Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder. diff --git a/options/license/diffmark b/options/license/diffmark new file mode 100644 index 0000000..02d3b50 --- /dev/null +++ b/options/license/diffmark @@ -0,0 +1,2 @@ +1. you can do what you want with it +2. I refuse any responsibility for the consequences diff --git a/options/license/dvipdfm b/options/license/dvipdfm new file mode 100644 index 0000000..b73cb48 --- /dev/null +++ b/options/license/dvipdfm @@ -0,0 +1 @@ +A modified version of this file may be distributed, but it should be distributed with a *different* name. Changed files must be distributed *together with a complete and unchanged* distribution of these files. diff --git a/options/license/eGenix b/options/license/eGenix new file mode 100644 index 0000000..1593259 --- /dev/null +++ b/options/license/eGenix @@ -0,0 +1,40 @@ +EGENIX.COM PUBLIC LICENSE AGREEMENT +Version 1.1.0 + +This license agreement is based on the Python CNRI License Agreement, a widely accepted open- source license. + +1. Introduction +This "License Agreement" is between eGenix.com Software, Skills and Services GmbH ("eGenix.com"), having an office at Pastor-Loeh-Str. 48, D-40764 Langenfeld, Germany, and the Individual or Organization ("Licensee") accessing and otherwise using this software in source or binary form and its associated documentation ("the Software"). + +2. License +Subject to the terms and conditions of this eGenix.com Public License Agreement, eGenix.com hereby grants Licensee a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use the Software alone or in any derivative version, provided, however, that the eGenix.com Public License Agreement is retained in the Software, or in any derivative version of the Software prepared by Licensee. + +3. NO WARRANTY +eGenix.com is making the Software available to Licensee on an "AS IS" basis. SUBJECT TO ANY STATUTORY WARRANTIES WHICH CAN NOT BE EXCLUDED, EGENIX.COM MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, EGENIX.COM MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + +4. LIMITATION OF LIABILITY +EGENIX.COM SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE EXCLUSION OR LIMITATION MAY NOT APPLY TO LICENSEE. + +5. Termination +This License Agreement will automatically terminate upon a material breach of its terms and conditions. + +6. Third Party Rights +Any software or documentation in source or binary form provided along with the Software that is associated with a separate license agreement is licensed to Licensee under the terms of that license agreement. This License Agreement does not apply to those portions of the Software. Copies of the third party licenses are included in the Software Distribution. + +7. General +Nothing in this License Agreement affects any statutory rights of consumers that cannot be waived or limited by contract. + +Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between eGenix.com and Licensee. + +If any provision of this License Agreement shall be unlawful, void, or for any reason unenforceable, such provision shall be modified to the extent necessary to render it enforceable without losing its intent, or, if no such modification is possible, be severed from this License Agreement and shall not affect the validity and enforceability of the remaining provisions of this License Agreement. + +This License Agreement shall be governed by and interpreted in all respects by the law of Germany, excluding conflict of law provisions. It shall not be governed by the United Nations Convention on Contracts for International Sale of Goods. This License Agreement does not grant permission to use eGenix.com trademarks or trade names in a trademark sense to endorse or promote products or services of Licensee, or any third party. + +The controlling language of this License Agreement is English. If Licensee has received a translation into another language, it has been provided for Licensee's convenience only. + +8. Agreement +By downloading, copying, installing or otherwise using the Software, Licensee agrees to be bound by the terms and conditions of this License Agreement. For question regarding this License Agreement, please write to: + eGenix.com Software, Skills and Services GmbH + Pastor-Loeh-Str. 48 + D-40764 Langenfeld + Germany \ No newline at end of file diff --git a/options/license/gSOAP-1.3b b/options/license/gSOAP-1.3b new file mode 100644 index 0000000..c34dd0e --- /dev/null +++ b/options/license/gSOAP-1.3b @@ -0,0 +1,148 @@ +gSOAP Public License + +Version 1.3b + +The gSOAP public license is derived from the Mozilla Public License (MPL1.1). The sections that were deleted from the original MPL1.1 text are 1.0.1, 2.1.(c),(d), 2.2.(c),(d), 8.2.(b), 10, and 11. Section 3.8 was added. The modified sections are 2.1.(b), 2.2.(b), 3.2 (simplified), 3.5 (deleted the last sentence), and 3.6 (simplified). + +This license applies to the gSOAP software package, with the exception of the soapcpp2 and wsdl2h source code located in gsoap/src and gsoap/wsdl, all code generated by soapcpp2 and wsdl2h, the UDDI source code gsoap/uddi2, and the Web server sample source code samples/webserver. To use any of these software tools and components commercially, a commercial license is required and can be obtained from www.genivia.com. + +1 DEFINITIONS. + +1.0.1. + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code, or Modifications or the combination of the Original Code, and Modifications, in each case including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code, or previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2 SOURCE CODE LICENSE. + +2.1. The Initial Developer Grant. +The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell ("offer to sell and import") the Original Code, Modifications, or portions thereof, but solely to the extent that any such patent is reasonably necessary to enable You to utilize, alone or in combination with other software, the Original Code, Modifications, or any combination or portions thereof. + (c) + (d) + +2.2. Contributor Grant. +Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under patents now or hereafter owned or controlled by Contributor, to make, have made, use and sell ("offer to sell and import") the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to utilize, alone or in combination with other software, the Contributor Version (or portions thereof). + (c) + (d) + +3 DISTRIBUTION OBLIGATIONS. + +3.1. Application of License. +The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + +3.2. Availability of Source Code. +Any Modification created by You will be provided to the Initial Developer in Source Code form and are subject to the terms of the License. + +3.3. Description of Modifications. +You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + +3.4. Intellectual Property Matters. + (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + + (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + +3.5. Required Notices. +You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. + +3.6. Distribution of Executable Versions. +You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. If you distribute executable versions containing Covered Code as part of a product, you must reproduce the notice in Exhibit B in the documentation and/or other materials provided with the product. + +3.7. Larger Works. +You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +3.8. Restrictions. +You may not remove any product identification, copyright, proprietary notices or labels from gSOAP. + +4 INABILITY TO COMPLY DUE TO STATUTE OR REGULATION. + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5 APPLICATION OF THIS LICENSE. + +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6 VERSIONS OF THE LICENSE. + +6.1. New Versions. +Grantor may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + +6.2. Effect of New Versions. +Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License. + +6.3. Derivative Works. +If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrase "gSOAP" or any confusingly similar phrase do not appear in your license (except to note that you license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the gSOAP Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7 DISCLAIMER OF WARRANTY. + +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, AND ANY WARRANTY THAT MAY ARISE BY REASON OF TRADE USAGE, CUSTOM, OR COURSE OF DEALING. WITHOUT LIMITING THE FOREGOING, YOU ACKNOWLEDGE THAT THE SOFTWARE IS PROVIDED "AS IS" AND THAT THE AUTHORS DO NOT WARRANT THE SOFTWARE WILL RUN UNINTERRUPTED OR ERROR FREE. LIMITED LIABILITY THE ENTIRE RISK AS TO RESULTS AND PERFORMANCE OF THE SOFTWARE IS ASSUMED BY YOU. UNDER NO CIRCUMSTANCES WILL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES OF ANY KIND OR NATURE WHATSOEVER, WHETHER BASED ON CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, ARISING OUT OF OR IN ANY WAY RELATED TO THE SOFTWARE, EVEN IF THE AUTHORS HAVE BEEN ADVISED ON THE POSSIBILITY OF SUCH DAMAGE OR IF SUCH DAMAGE COULD HAVE BEEN REASONABLY FORESEEN, AND NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY EXCLUSIVE REMEDY PROVIDED. SUCH LIMITATION ON DAMAGES INCLUDES, BUT IS NOT LIMITED TO, DAMAGES FOR LOSS OF GOODWILL, LOST PROFITS, LOSS OF DATA OR SOFTWARE, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION OR IMPAIRMENT OF OTHER GOODS. IN NO EVENT WILL THE AUTHORS BE LIABLE FOR THE COSTS OF PROCUREMENT OF SUBSTITUTE SOFTWARE OR SERVICES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT DESIGNED FOR USE IN ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS SUCH AS OPERATION OF NUCLEAR FACILITIES, AIRCRAFT NAVIGATION OR CONTROL, OR LIFE-CRITICAL APPLICATIONS. THE AUTHORS EXPRESSLY DISCLAIM ANY LIABILITY RESULTING FROM USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS AND ACCEPTS NO LIABILITY IN RESPECT OF ANY ACTIONS OR CLAIMS BASED ON THE USE OF THE SOFTWARE IN ANY SUCH ON-LINE EQUIPMENT IN HAZARDOUS ENVIRONMENTS BY YOU. FOR PURPOSES OF THIS PARAGRAPH, THE TERM "LIFE-CRITICAL APPLICATION" MEANS AN APPLICATION IN WHICH THE FUNCTIONING OR MALFUNCTIONING OF THE SOFTWARE MAY RESULT DIRECTLY OR INDIRECTLY IN PHYSICAL INJURY OR LOSS OF HUMAN LIFE. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8 TERMINATION. + +8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + +8.2. + +8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + +8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9 LIMITATION OF LIABILITY. + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10 U.S. GOVERNMENT END USERS. + +11 MISCELLANEOUS. + +12 RESPONSIBILITY FOR CLAIMS. + +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +EXHIBIT A. + +"The contents of this file are subject to the gSOAP Public License Version 1.3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +http://www.cs.fsu.edu/ engelen/soaplicense.html +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. +The Original Code of the gSOAP Software is: stdsoap.h, stdsoap2.h, stdsoap.c, stdsoap2.c, stdsoap.cpp, stdsoap2.cpp, soapcpp2.h, soapcpp2.c, soapcpp2_lex.l, soapcpp2_yacc.y, error2.h, error2.c, symbol2.c, init2.c, soapdoc2.html, and soapdoc2.pdf, httpget.h, httpget.c, stl.h, stldeque.h, stllist.h, stlvector.h, stlset.h. +The Initial Developer of the Original Code is Robert A. van Engelen. Portions created by Robert A. van Engelen are Copyright (C) 2001-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved. +Contributor(s): +"________________________." +[Note: The text of this Exhibit A may differ slightly form the text of the notices in the Source Code files of the Original code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + +EXHIBIT B. + +"Part of the software embedded in this product is gSOAP software. +Portions created by gSOAP are Copyright (C) 2001-2009 Robert A. van Engelen, Genivia inc. All Rights Reserved. +THE SOFTWARE IN THIS PRODUCT WAS IN PART PROVIDED BY GENIVIA INC AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." \ No newline at end of file diff --git a/options/license/gnuplot b/options/license/gnuplot new file mode 100644 index 0000000..7f3e4d5 --- /dev/null +++ b/options/license/gnuplot @@ -0,0 +1,14 @@ +Copyright 1986 - 1993, 1998, 2004 Thomas Williams, Colin Kelley + +Permission to use, copy, and distribute this software and its documentation for any purpose with or without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. + +Permission to modify the software is granted, but not the right to distribute the complete modified source code. Modifications are to be distributed as patches to the released version. Permission to distribute binaries produced by compiling modified sources is granted, provided you + + 1. distribute the corresponding source modifications from the released version in the form of a patch file along with the binaries, + 2. add special version identification to distinguish your version in addition to the base release version number, + 3. provide your name and address as the primary contact for the support of your modified version, and + 4. retain our contact information in regard to use of the base software. + +Permission to distribute the released version of the source code along with corresponding source modifications in the form of a patch file is granted with same provisions 2 through 4 for binary distributions. + +This software is provided "as is" without express or implied warranty to the extent permitted by applicable law. \ No newline at end of file diff --git a/options/license/iMatix b/options/license/iMatix new file mode 100644 index 0000000..344bf17 --- /dev/null +++ b/options/license/iMatix @@ -0,0 +1,39 @@ +The SFL License Agreement + +This license agreement covers your use of the iMatix STANDARD FUNCTION LIBRARY (SFL), its source code, documentation, and executable files, hereinafter referred to as "the Product". + +The Product is Copyright (c) 1991-2000 iMatix Corporation. You may use it and distribute it according to this following License Agreement. If you do not agree with these terms, please remove the Product from your system. By incorporating the Product in your work or distributing the Product to others you implicitly agree to these license terms. + +Statement Of Copyright + +The Product is, and remains, Copyright © 1991-2000 iMatix Corporation, with exception of specific copyrights as noted in the individual source files. + +Conditions Of Use + +You do not need to provide the source code for the Product as part of your product. However, you must do one of these things to comply with the Product License Agreement: + + 1. Provide the source code for Product modules that you use, or + 2. Make your product freely available according to a license similar to the GNU General Public License, or the Perl Artistic License, or + 3. Add this phrase to the documentation for your product: "This product uses parts of the iMatix SFL, Copyright © 1991-2000 iMatix Corporation ". + +Rights Of Usage + +You may freely and at no cost use the Product in any project, commercial, academic, military, or private, so long as you respect the License Agreement. The License Agreement does not affect any software except the Product. In particular, any application that uses the Product does not itself fall under the License Agreement. + +You may modify any part of the Product, including sources and documentation, except this License Agreement, which you may not modify. + +You must clearly indicate any modifications at the start of each source file. The user of any modified Product code must know that the source file is not original. + +At your discretion, you may rewrite or reuse any part of the Product so that your derived code is not obviously part of the Product. This derived code does not fall under the Product License Agreement directly, but you must include a credit at the start of each source file indicating the original authorship and source of the code, and a statement of copyright as follows:
"Parts copyright (c) 1991-2000 iMatix Corporation." + +Rights Of Distribution + +You may freely distribute the Product, or any subset of the Product, by any means. The License, in the form of the file called "LICENSE.TXT" must accompany any such distribution. + +You may charge a fee for distributing the Product, for providing a warranty on the Product, for making modifications to the Product, or for any other service provided in relation to the Product. You are not required to ask our permission for any of these activities. + +At no time will iMatix associate itself with any distribution of the Product except that supplied from the Internet site http://www.imatix.com. + +Disclaimer Of Warranty + +The Product is provided as free software, in the hope that it will be useful. It is provided "as-is", without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the Product is with you. Should the Product prove defective, the full cost of repair, servicing, or correction lies with you. diff --git a/options/license/libtiff b/options/license/libtiff new file mode 100644 index 0000000..b11996b --- /dev/null +++ b/options/license/libtiff @@ -0,0 +1,8 @@ +Copyright (c) 1988-1997 Sam Leffler +Copyright (c) 1991-1997 Silicon Graphics, Inc. + +Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that (i) the above copyright notices and this permission notice appear in all copies of the software and related documentation, and (ii) the names of Sam Leffler and Silicon Graphics may not be used in any advertising or publicity relating to the software without the specific, prior written permission of Sam Leffler and Silicon Graphics. + +THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/options/license/mpich2 b/options/license/mpich2 new file mode 100644 index 0000000..1776574 --- /dev/null +++ b/options/license/mpich2 @@ -0,0 +1,18 @@ +COPYRIGHT + +The following is a notice of limited availability of the code, and disclaimer which must be included in the prologue of the code and in all source listings of the code. + +Copyright Notice ++ 2002 University of Chicago + +Permission is hereby granted to use, reproduce, prepare derivative works, and to redistribute to others. This software was authored by: + +Argonne National Laboratory Group W. Gropp: (630) 252-4318; FAX: (630) 252-5986; e-mail: gropp@mcs.anl.gov E. Lusk: (630) 252-7852; FAX: (630) 252-5986; e-mail: lusk@mcs.anl.gov Mathematics and Computer Science Division Argonne National Laboratory, Argonne IL 60439 + +GOVERNMENT LICENSE + +Portions of this material resulted from work developed under a U.S. Government Contract and are subject to the following license: the Government is granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable worldwide license in this computer software to reproduce, prepare derivative works, and perform publicly and display publicly. + +DISCLAIMER + +This computer code material was prepared, in part, as an account of work sponsored by an agency of the United States Government. Neither the United States, nor the University of Chicago, nor any of their employees, makes any warranty express or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights. \ No newline at end of file diff --git a/options/license/psfrag b/options/license/psfrag new file mode 100644 index 0000000..8667d59 --- /dev/null +++ b/options/license/psfrag @@ -0,0 +1,5 @@ +psfrag.dtx +Copyright (C) 1996 Craig Barratt, Michael C. Grant, and David Carlisle. +All rights are reserved. + +This system is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Don't come complaining to us if you modify this file and it doesn't work! If this file is modified by anyone but the authors, those changes and their authors must be explicitly stated HERE. \ No newline at end of file diff --git a/options/license/psutils b/options/license/psutils new file mode 100644 index 0000000..a420741 --- /dev/null +++ b/options/license/psutils @@ -0,0 +1,29 @@ +PS Utilities Package + +The constituent files of this package listed below are copyright (C) 1991-1995 Angus J. C. Duggan. + +LICENSE Makefile.msc Makefile.nt Makefile.os2 +Makefile.unix README config.h descrip.mms +epsffit.c epsffit.man extractres.man extractres.pl +fixdlsrps.man fixdlsrps.pl fixfmps.man fixfmps.pl +fixmacps.man fixmacps.pl fixpsditps.man fixpsditps.pl +fixpspps.man fixpspps.pl fixscribeps.man fixscribeps.pl +fixtpps.man fixtpps.pl fixwfwps.man fixwfwps.pl +fixwpps.man fixwpps.pl fixwwps.man fixwwps.pl +getafm getafm.man includeres.man includeres.pl +maketext patchlev.h psbook.c psbook.man +pserror.c pserror.h psmerge.man psmerge.pl +psnup.c psnup.man psresize.c psresize.man +psselect.c psselect.man psspec.c psspec.h +pstops.c pstops.man psutil.c psutil.h +showchar + +They may be copied and used for any purpose (including distribution as part of a for-profit product), provided: + +1) The original attribution of the programs is clearly displayed in the product and/or documentation, even if the programs are modified and/or renamed as part of the product. + +2) The original source code of the programs is provided free of charge (except for reasonable distribution costs). For a definition of reasonable distribution costs, see the Gnu General Public License or Larry Wall's Artistic License (provided with the Perl 4 kit). The GPL and Artistic License in NO WAY affect this license; they are merely used as examples of the spirit in which it is intended. + +3) These programs are provided "as-is". No warranty or guarantee of their fitness for any particular task is provided. Use of these programs is completely at your own risk. + +Basically, I don't mind how you use the programs so long as you acknowledge the author, and give people the originals if they want them. diff --git a/options/license/xinetd b/options/license/xinetd new file mode 100644 index 0000000..7a1141c --- /dev/null +++ b/options/license/xinetd @@ -0,0 +1,25 @@ +ORIGINAL LICENSE: This software is + +(c) Copyright 1992 by Panagiotis Tsirigotis + +The author (Panagiotis Tsirigotis) grants permission to use, copy, and distribute this software and its documentation for any purpose and without fee, provided that the above copyright notice extant in files in this distribution is not removed from files included in any redistribution and that this copyright notice is also included in any redistribution. + +Modifications to this software may be distributed, either by distributing the modified software or by distributing patches to the original software, under the following additional terms: + +1. The version number will be modified as follows: + a. The first 3 components of the version number (i.e ..) will remain unchanged. + b. A new component will be appended to the version number to indicate the modification level. The form of this component is up to the author of the modifications. + +2. The author of the modifications will include his/her name by appending it along with the new version number to this file and will be responsible for any wrong behavior of the modified software. + +The author makes no representations about the suitability of this software for any purpose. It is provided "as is" without any express or implied warranty. + +Modifications: Version: 2.1.8.7-current Copyright 1998-2001 by Rob Braun + +Sensor Addition Version: 2.1.8.9pre14a Copyright 2001 by Steve Grubb + +This is an exerpt from an email I recieved from the original author, allowing xinetd as maintained by me (Rob Braun), to use the higher version numbers: + +I appreciate your maintaining the version string guidelines as specified in the copyright. But I did not mean them to last as long as they did. + +So, if you want, you may use any 2.N.* (N >= 3) version string for future xinetd versions that you release. Note that I am excluding the 2.2.* line; using that would only create confusion. Naming the next release 2.3.0 would put to rest the confusion about 2.2.1 and 2.1.8.*. \ No newline at end of file diff --git a/options/license/xpp b/options/license/xpp new file mode 100644 index 0000000..9606258 --- /dev/null +++ b/options/license/xpp @@ -0,0 +1,21 @@ +LICENSE FOR THE Extreme! Lab PullParser + +Copyright (c) 2002 The Trustees of Indiana University. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1) All redistributions of source code must retain the above copyright notice, the list of authors in the original source code, this list of conditions and the disclaimer listed in this license; + +2) All redistributions in binary form must reproduce the above copyright notice, this list of conditions and the disclaimer listed in this license in the documentation and/or other materials provided with the distribution; + +3) Any documentation included with all redistributions must include the following acknowledgement: + + "This product includes software developed by the Indiana University Extreme! Lab. For further information please visit http://www.extreme.indiana.edu/" + +Alternatively, this acknowledgment may appear in the software itself, and wherever such third-party acknowledgments normally appear. + +4) The name "Indiana Univeristy" and "Indiana Univeristy Extreme! Lab" shall not be used to endorse or promote products derived from this software without prior written permission from Indiana University. For written permission, please contact http://www.extreme.indiana.edu/. + +5) Products derived from this software may not use "Indiana Univeristy" name nor may "Indiana Univeristy" appear in their name, without prior written permission of the Indiana University. Indiana University provides no reassurances that the source code provided does not infringe the patent or any other intellectual property rights of any other entity. Indiana University disclaims any liability to any recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. + +LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", "VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE. LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION GENERATED USING SOFTWARE. \ No newline at end of file diff --git a/options/license/zlib-acknowledgement b/options/license/zlib-acknowledgement new file mode 100644 index 0000000..cf95431 --- /dev/null +++ b/options/license/zlib-acknowledgement @@ -0,0 +1,15 @@ +Copyright (c) 2002-2007 Charlie Poole +Copyright (c) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov +Copyright (c) 2000-2002 Philip A. Craig + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. + + Portions Copyright (c) 2002-2007 Charlie Poole or Copyright (c) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright (c) 2000-2002 Philip A. Craig + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/options/locale/locale_bg-BG.ini b/options/locale/locale_bg-BG.ini index 3abae27..594533b 100644 --- a/options/locale/locale_bg-BG.ini +++ b/options/locale/locale_bg-BG.ini @@ -28,7 +28,6 @@ mirror=Огледало new_repo=Ново хранилище new_migrate=Нова миграция new_mirror=Ново огледало -new_fork=Ново разклонено хранилище new_org=Нова организация manage_org=Управление на организации admin_panel=Административен панел @@ -37,6 +36,7 @@ settings=Настройки your_profile=Вашият профил your_settings=Вашите настройки + activities=Активности pull_requests=Заявки за сливане issues=Задачи @@ -45,39 +45,29 @@ cancel=Отказ [install] install=Инсталация -title=Стъпки за инсталиране при първоначално стартиране -docker_helper=Ако Gitea е стартиран в Docker контейнер, моля прочетете нашите указания внимателно, преди да правите промени по настройките на тази страница! -requite_db_desc=Gitea изисква MySQL, PostgreSQL, SQLite3 или TiDB. db_title=Настройки на базата данни db_type=Тип на база данни host=Сървър user=Потребител password=Парола db_name=Име на база данни -db_helper=Моля, използвайте INNODB engine с utf8_general_ci кодиране на знаци за MySQL. ssl_mode=Режим SSL path=Път -sqlite_helper=Файл на SQLite3 или TiDB база данни.
Моля използвайте абсолютен път до файл когато стартирате Gitea като услуга. err_empty_db_path=Пътят до SQLite3 или TiDB база данни не може да е празен. err_invalid_tidb_name=TiDB не позволява "." и "-" в името на базата данни. no_admin_and_disable_registration=Невъзможно изключване на регистрациите без предварително да е създаден поне един административен профил. err_empty_admin_password=Паролата на администратор не може да е празна. -general_title=Общи настройки на приложението app_name=Име на приложението -app_name_helper=Постави името на твоята организация тук - голямо е крещящо! repo_path=Основен път към хранилищата -repo_path_helper=Всички отдалечени хранилища на Git ще бъдат съхранени в тази директория. run_user=Потребителски контекст run_user_helper=Този потребител трябва да има достъп до основния път към хранилищата и права да стартира Gitea. domain=Домейн domain_helper=Тази настройка влияе на URL адреса за клониране чрез SSH. ssh_port=SSH порт -ssh_port_helper=Номер на порт на SSH сървъра. Оставете празно за да изключите достъп през SSH. http_port=HTTP порт http_port_helper=Порт, на който приложението ще слуша. app_url=URL адрес на приложението -app_url_helper=Този настройка променя HTTP/HTTPS адреса за клониране, а понякога и адреса на ел. поща. log_root_path=Път към журналите log_root_path_helper=Директория в която се записват журналите. @@ -85,14 +75,10 @@ optional_title=Опционални настройки email_title=Настройки на пощенска услуга smtp_host=SMTP сървър smtp_from=Подател -smtp_from_helper=Адрес на подател на поща по RFC 5322. Може да бъде обикновен адрес на ел. поща или във формат "Име" . -mailer_user=Ел. поща за изпращане mailer_password=Парола за изпращане register_confirm=Включи потвърждението на регистрациите -mail_notify=Включи уведомления по пощата server_service_title=Настройки на сървъра и други услуги offline_mode=Включи офлайн режима -offline_mode_popup=Изключи CDN дори в продукционен режим, всички ресурсни файлове ще бъдат доставяни локално. disable_gravatar=Изключи връзка с Gravatar disable_gravatar_popup=Изключва Gravatar и външни източници, така че всички аватари трябва да са или качени от потребителите или да се ползват аватари по подразбиране. federated_avatar_lookup=Използване на външни аватари @@ -103,7 +89,6 @@ enable_captcha=Включи Captcha enable_captcha_popup=Изисква валидиране с captcha при саморегистрация на потребители. require_sign_in_view=Включи задължително вписване за преглед на страници require_sign_in_view_popup=Само вписани потребители могат да виждат страниците, анонимните посетители виждат само страниците за регистрация и вход. -admin_setting_desc=Няма нужда от създаване на администраторски профил в момента, защото потребителят с първо ID в базата автоматично получава администраторски достъп. admin_title=Настройки на профил на администратора admin_name=Потребителско име admin_password=Парола @@ -111,13 +96,8 @@ confirm_password=Потвърждение на паролата admin_email=Ел. поща install_btn_confirm=Инсталирай Gitea test_git_failed=Неуспешно тестването на "git" команда: %v -sqlite3_not_available=Вашата версия не поддържа SQLite3, моля, изтеглете официалната двоична версия от %s, а не gobuild версията. -invalid_db_setting=Настройките на базата данни са некоректни: %v invalid_repo_path=Основният път към хранилищата е невалиден: %v -run_user_not_match=Потребителският контекст на приложението не е на текущия потребител: %s -> %s -save_config_failed=Неуспешно запазване на конфигурация: %v invalid_admin_setting=Настройките на профил на администратора са невалидни: %v -install_success=Добре дошли! Радваме се, че избрахте Gitea, и Ви пожелаваме приятна работа и сърдечни поздрави! invalid_log_root_path=Основният път към журналите е невалиден: %v [home] @@ -125,7 +105,6 @@ uname_holder=Име или ел. поща password_holder=Парола switch_dashboard_context=Превключи контекст на таблото my_repos=Моите хранилища -show_more_repos=Покажи още хранилища... collaborative_repos=Съвместни хранилища my_orgs=Моите организации my_mirrors=Моите огледала @@ -139,36 +118,23 @@ users=Потребители search=Търсене [auth] -create_new_account=Създай нов профил register_helper_msg=Вече имате профил? Впишете се сега! -social_register_helper_msg=Вече имате профил? Свържете се сега! disable_register_prompt=За съжаление създаването на нови регистрации е изключено. Обърнете се към администратора на сайта. disable_register_mail=За съжаление потвърждението на регистрации е изключено. remember_me=Запомни ме -forgot_password=Забравена парола -forget_password=Забравена парола? sign_up_now=Нуждаете се от профил? Регистрирайте се сега. -confirmation_mail_sent_prompt=Ново писмо за потвърждение е изпратено до %s. Моля проверете пощенската си кутия в рамките на следващите %d часа, за да завършите процеса на регистрация. active_your_account=Активиране на профил prohibit_login=Влизане забранено -prohibit_login_desc=Вашият профил е със забрана за влизане, моля свържете се с администратора. -resent_limit_prompt=За съжаление Вие съвсем наскоро изпратихте писмо за активация. Моля изчакайте 3 минути, след което опитайте отново. has_unconfirmed_mail=Здравейте %s, имате непотвърден адрес на ел. поща (%s). Ако не сте получили писмо за потвърждение или имате нужда да се изпрати ново писмо, моля щракнете бутона по-долу. resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение -email_not_associate=Този адрес на ел. поща не е свързан с никой профил. -send_reset_mail=Щракнете тук, за да получите (отново) писмо за нулиране на паролата reset_password=Нулиране на паролата -invalid_code=За съжаление Вашия код за потвърждение е изтекъл или е невалиден. reset_password_helper=Щракнете тук, за да нулирате паролата си password_too_short=Размерът на паролата не може да бъде по-малък от %d знака. -non_local_account=Нелокални потребители не могат да сменят паролата си през Gitea. [mail] activate_account=Моля активирайте Вашия профил activate_email=Провери адрес на ел. поща reset_password=Нулиране на паролата -register_success=Успешна регистрация и добре дошли -register_notify=Добре дошли [modal] yes=Да @@ -196,8 +162,6 @@ TreeName=Път до файл Content=Съдържание require_error=` не може да бъде празен.` -alpha_dash_error=` трябва да e валидна буква, число или тире(-_).` -alpha_dash_dot_error=` трябва да e валидна буква, число, тире(-_) или точка.` size_error=` трябва да е с размер %s.` min_size_error=` трябва да съдържа поне %s знака.` max_size_error=` трябва да съдържа най-много %s знака.` @@ -205,28 +169,10 @@ email_error=` не е валиден адрес на ел. поща.` url_error=` не е валиден URL адрес.` include_error=` трябва да съдържа текст '%s'.` unknown_error=Неизвестна грешка: -captcha_incorrect=Captcha не е потвърдена. -password_not_match=Паролата и потвърждението ѝ не съвпадат. -username_been_taken=Потребителското име вече се ползва. -repo_name_been_taken=Името на хранилището вече се ползва. -org_name_been_taken=Името на организацията вече се ползва. -team_name_been_taken=Името на екипа вече се ползва. -email_been_used=Този адрес на ел. поща вече се ползва. -username_password_incorrect=Потребителското име или паролата не са верни. -enterred_invalid_repo_name=Моля уверете се, че въведеното име на хранилище е вярно. -enterred_invalid_owner_name=Моля уверете се, че въведеното име на притежател е вярно. -enterred_invalid_password=Моля уверете се, че въведената парола е вярна. -user_not_exist=Даденият потребител не съществува. -last_org_owner=Премахване на последния потребител от екип притежатели не е позволено, тъй като винаги трябва да има поне един притежател в дадена организация. -invalid_ssh_key=За съжаление, ние не сме в състояние да проверим Вашия SSH ключ: %s -unable_verify_ssh_key=Gitea не може да провери Вашия SSH ключ, но предполагаме, че е валиден. Моля, проверете го. auth_failed=Неуспешно удостоверяване: %v -still_own_repo=Вашият профил притежава поне едно хранилище. Първо трябва да ги изтриете или да ги прехвърлите на друг потребител. -still_has_org=Вашият профил все още участва в поне една организация. Първо трябва да напуснете или изтриете Вашите участия в организациите. -org_still_own_repo=Тази организация все още притежава хранилище. Първо трябва да го изтриете или да го прехвърлите на друга организация. target_branch_not_exist=Целевият клон не съществува. @@ -241,14 +187,11 @@ following=Следване follow=Следване unfollow=Не следвай -form.name_reserved=Потребителското име '%s' е запазено. -form.name_pattern_not_allowed=Потребителското име '%s' не е допустимо. [settings] profile=Профил password=Парола avatar=Аватар -ssh_keys=SSH ключове social=Социални профили applications=Приложения orgs=Организации @@ -256,15 +199,11 @@ delete=Изтрий профил uid=UID public_profile=Публичен профил -profile_desc=Вашият адрес на ел. поща е публичен и ще бъде използван за всички свързани с профила Ви уведомления и всички уеб базирани операции, направени чрез сайта. -password_username_disabled=Нелокални потребители не могат да променят името си от тук. full_name=Пълно име website=Уебсайт location=Локация update_profile=Запази профила -update_profile_success=Вашият профил е запазен успешно. change_username=Потребителското име е променено -change_username_prompt=Този промяна ще засегне всички връзки сочещи към профила Ви. continue=Продължи cancel=Отказ @@ -275,15 +214,11 @@ choose_new_avatar=Избор на нов аватар update_avatar=Запази настройките на аватара delete_current_avatar=Изтрий аватар uploaded_avatar_not_a_image=Каченият файл не е изображение. -update_avatar_success=Настройките на аватара са запазени успешно. change_password=Промяна на собствената парола old_password=Текуща парола new_password=Нова парола retype_new_password=Повторно новата парола -password_incorrect=Въведената парола не е вярна. -change_password_success=Вашата парола е променена успешно. Вече може да влизате, използвайки тази нова парола. -password_change_disabled=Нелокални потребители не могат да променят паролата си от тук. emails=Адреси на ел. поща manage_emails=Управление на адреси на ел. поща @@ -291,70 +226,50 @@ email_desc=Вашият основен адрес на ел. поща ще се primary=Основен primary_email=Задай като основен delete_email=Изтрий -email_deletion=Изтрий ел. поща -email_deletion_desc=При изтриване на тази ел. поща ще се премахне свързаната информация от Вашия профил. Желаете ли да продължите? email_deletion_success=Ел. пощата беше изтрита успешно! add_new_email=Добавяне на нов адрес на ел. поща add_email=Добави ел. поща -add_email_confirmation_sent=Ново писмо за потвърждение е изпратено до '%s'. Моля проверете пощенската си кутия в рамките на следващите %d часа, за да завършите процеса на регистрация. add_email_success=Ваш нов адрес на ел. поща е добавен успешно. manage_ssh_keys=Управление на SSH ключове add_key=Добави ключ -ssh_desc=Това е списък на SSH ключове, свързани с Вашия акаунт. Тъй като тези ключове позволяват на всеки, който ги използва да получи достъп до хранилищата Ви, много е важно да се уверите, че ги разпознавате. -ssh_helper=Не знаете как? Проверете упътването на GitHub за създаване на собствени SSH ключове или погледнете Общи проблеми, които може да възникнат при използване на SSH. add_new_key=Добавяне на SSH ключ -ssh_key_been_used=Съдържанието на публичния ключ е използвано. -ssh_key_name_used=Вече съществува публичен ключ с това име. key_name=Име на ключа key_content=Съдържание -add_key_success=Новият SSH ключ '%s' е добавен успешно! delete_key=Изтрий ssh_key_deletion=Изтрий SSH ключ -ssh_key_deletion_desc=При изтриване на този SSH ключ ще се премахнат свързаните права за достъп за Вашия профил. Желаете ли да продължите? -ssh_key_deletion_success=SSH ключа беше изтрит успешно! add_on=Добавен на last_used=Последно използван на no_activity=Няма скорошна дейност -key_state_desc=Този ключ е използван през последните 7 дни -token_state_desc=Този API ключ е използван през последните 7 дни manage_social=Управление на свързани профили в социалните мрежи -social_desc=Това е списък на свързани профили в социалните мрежи. Премахнете всички, които не разпознавате. unbind=Освобождаване -unbind_success=Социалния профил е освободен. manage_access_token=Управление на индивидуални API ключове за достъп generate_new_token=Генериране на нов API ключ -tokens_desc=Генерирани API ключове, които могат да се използват за достъп до API на Gitea. new_token_desc=Всеки API ключ ще има пълен достъп до Вашия профил. token_name=Име на API ключ generate_token=Генериране на API ключ -generate_token_succees=Успешно е генериран API ключ за достъп. Уверете се, че сте го копирали, тъй като няма да можете да го видите отново! delete_token=Изтрий access_token_deletion=Изтрий индивидуален API ключ за достъп -access_token_deletion_desc=При изтриване на този индивидуален API ключ за достъп ще се премахнат всички свързани права на приложението. Желаете ли да продължите? -delete_token_success=Индивидуалният API ключ за достъп е изтрит успешно! Не забравяйте да преконфигурирате приложението също. + + delete_account=Изтриване на собствения профил delete_prompt=Тази операция ще изтрие Вашия профил завинаги и тя НЕ МОЖЕ да бъде отменена в последствие! confirm_delete_account=Потвърди изтриването delete_account_title=Изтриване на профил -delete_account_desc=Този профил ще бъде окончателно изтрит. Желаете ли да продължите? [repo] owner=Притежател repo_name=Име на хранилището -repo_name_helper=Добро име на хранилище е име, състоящо от кратки, запомнящи се и уникални ключови думи. visibility=Видимост visiblity_helper=Това хранилище е Частно -visiblity_helper_forced=Административна настройка задължава всички нови хранилища да бъдат Частни visiblity_fork_helper=(Промяна на тази стойност ще се отрази на всички разклонения) clone_helper=Нуждаете се от помощ при клониране? Посетете Помощ! fork_repo=Разклони хранилището fork_from=Разклонение от -fork_visiblity_helper=Не може да променяте видимостта на разклонено хранилище. repo_desc=Описание repo_lang=Програмен език repo_gitignore_helper=Избор на .gitignore шаблони @@ -365,18 +280,12 @@ auto_init=Инициализиране на това хранилище с из create_repo=Създай хранилище default_branch=Клон по подразбиране mirror_prune=Окастряне -mirror_prune_desc=Премахва всички препратки за отдалечено проследяване, които не съществуват отдалечено -mirror_interval=Интервал на отразяване (часове) mirror_address=Адрес на огледало -mirror_address_desc=Моля включете потребител и парола в адреса ако са нужни. mirror_last_synced=Последна синхр. watchers=Наблюдаващи stargazers=Харесващи forks=Разклонения -form.reach_limit_of_creation=Притежателят е достигнал настроения лимит от %d брой хранилища. -form.name_reserved=Името на хранилището '%s' е запазено. -form.name_pattern_not_allowed=Име на хранилището от вида '%s' не е позволено. need_auth=Изисква потребител и парола migrate_type=Тип мигриране @@ -403,9 +312,6 @@ fork=Разклонения no_desc=Няма описание quick_guide=Бърз справочник clone_this_repo=Клонирай хранилището -create_new_repo_command=Създай ново хранилище чрез командния ред -push_exist_repo=Предай съществуващо хранилище през командния ред -repo_is_empty=Това хранилище е празно. Моля проверете по-късно пак! code=Код branch=Клон @@ -429,7 +335,6 @@ editor.new_file=Нов файл editor.upload_file=Качи файл editor.edit_file=Редактирай файл editor.preview_changes=Преглед на промени -editor.cannot_edit_non_text_files=Невъзможна редакция на нетекстови файлове editor.edit_this_file=Редактирай този файл editor.must_be_on_a_branch=Трябва да сте избрали клон за да предложите промени в този файл editor.fork_before_edit=Първо трябва да разклоните хранилището преди да редактирате файл @@ -455,7 +360,6 @@ editor.branch_already_exists=Клон '%s' вече съществува в то editor.directory_is_a_file=Частта '%s' в пътя е файл, не директория в това хранилище. editor.filename_is_a_directory=Име '%s' вече съществува като директория в това хранилище. editor.file_editing_no_longer_exists=Файл '%s' който редактирате вече не съществува в това хранилище. -editor.file_changed_while_editing=Съдържанието на файла е било променено докато правихте редакциите. Щракнете тук за да прегледате какво е променено или натиснете Запис на ревизия отново за да презапишете чуждите промени. editor.file_already_exists=Файл с име '%s' вече съществува в това хранилище. editor.no_changes_to_show=Няма промени. editor.fail_to_update_file=Невъзможно модифициране/създаване на файл '%s' заради грешка: %v @@ -465,13 +369,13 @@ editor.upload_files_to_dir=Качи файлове в '%s' commits.commits=Ревизии commits.search=Търсене в ревизии -commits.find=Намери commits.author=Автор commits.message=Съобщение commits.date=Дата commits.older=По-стари commits.newer=По-нови + issues.new=Нова задача issues.new.labels=Етикети issues.new.no_label=Няма етикет @@ -489,7 +393,6 @@ issues.new_label=Нов етикет issues.new_label_placeholder=Име на етикета... issues.create_label=Създай етикет issues.label_templates.title=Зареждане на предварително зададен набор от етикети -issues.label_templates.info=Липсват етикети все още. Можете да щракнете върху "Нов етикет" по-горе, за да създадете нов или да изберете предварително зададени набори от по-долу. issues.label_templates.helper=Изберете набор етикети issues.label_templates.use=Използвай този набор етикети issues.label_templates.fail_to_load_file=Неуспешно зареждане на шаблон с етикети '%s': %v @@ -546,8 +449,6 @@ issues.label_edit=Редакция issues.label_delete=Изтрий issues.label_modify=Промяна на етикет issues.label_deletion=Изтрий етикет -issues.label_deletion_desc=При изтриване на този етикет ще се премахне информацията за него във всички свързани задачи. Желаете ли да продължите? -issues.label_deletion_success=Етикетът е изтрит успешно! issues.num_participants=%d участника issues.attachment.open_tab=`Щракнете за да прегледате "%s" в нов раздел` issues.attachment.download=`Щракнете за да изтеглите "%s"` @@ -567,16 +468,12 @@ pulls.merged_title_desc=обедини %[1]d ревизии от %[2]s"%s". Моля, бъдете сигурни. wiki.page_already_exists=Страница със същото име вече съществува. wiki.pages=Страници wiki.last_updated=Последна модификация на %s @@ -632,7 +524,6 @@ settings.githooks=Git куки settings.basic_settings=Основни настройки settings.mirror_settings=Настройки на огледало settings.sync_mirror=Синхр. сега -settings.mirror_sync_in_progress=Синхронизация на огледалото е в ход, моля обновете страницата след минута. settings.site=Официален сайт settings.update_settings=Запази настройките settings.advanced_settings=Разширени настройки @@ -653,29 +544,18 @@ settings.pulls_desc=Включва заявки за сливане за да м settings.danger_zone=Опасна зона settings.new_owner_has_same_repo=Новият притежател вече има хранилище със същото име. Изберете друго име. settings.convert=Промени към редовно хранилище -settings.convert_desc=Можете да промените това огледало към редовно хранилище. Конверсията не може да се отмени. settings.convert_notices_1=- Тази операция ще конвертира огледалото към редовно хранилище и не може да бъде отменена в последствие. settings.convert_confirm=Потвърдете конверсията -settings.convert_succeed=Конверсията към редовно хранилище е извършена успешно. settings.transfer=Прехвърли притежание settings.transfer_desc=Прехвърля това хранилище на друг потребител или към организация, в която имате права на администратор. -settings.transfer_notices_1=- Вие ще загубите достъп, ако новият притежател е индивидуален потребител. -settings.transfer_notices_2=- Вие ще запазите достъпа си, ако новият притежател е организация и ако вие сте един от притежателите ѝ. -settings.transfer_form_title=Моля въведете следната информация за да потвърдите операцията: settings.wiki_delete=Изтриване на данни на уики settings.wiki_delete_desc=След като изтриете данни за уики, няма връщане назад. Моля, бъдете сигурни. settings.wiki_delete_notices_1=- Това ще изтрие и ще деактивира уики за %s -settings.wiki_deletion_success=Данните за уики на това хранилище са изтрити успешно. settings.delete=Изтрий това хранилище settings.delete_desc=След като изтриете хранилището, няма връщане назад. Моля, бъдете сигурни. settings.delete_notices_1=- Тази операция НЕ МОЖЕ да бъде отменена в последствие. -settings.delete_notices_2=- Тази операция ще изтрие всичко от това хранилище, включително Git данни, задачи, коментари и достъпа на сътрудници. -settings.delete_notices_fork_1=- Всички разклонения ще станат независими след изтриването. -settings.deletion_success=Хранилището е изтрито успешно! -settings.update_settings_success=Настройките на хранилището са запазени успешно. settings.transfer_owner=Нов притежател settings.make_transfer=Прехвърли -settings.transfer_succeed=Притежанието на хранилището е прехвърлено успешно. settings.confirm_delete=Потвърди изтриването settings.add_collaborator=Добави нов сътрудник settings.add_collaborator_success=Добавен е нов сътрудник. @@ -687,13 +567,10 @@ settings.search_user_placeholder=Име на потребител... settings.org_not_allowed_to_be_collaborator=Невъзможно добавяне на организация като сътрудник. settings.user_is_org_member=Потребителят вече участва в организацията и не може да бъде добавен като сътрудник. settings.add_webhook=Добави уеб-кука -settings.hooks_desc=Уеб-куките много приличат на обикновен HTTP POST тригер. Когато нещо се случи в Gitea, ние ще изпратим уведомление до сървъра, който посочите. Научете повече в Ръководство за уеб-куки. settings.webhook_deletion=Изтрий уеб-кука -settings.webhook_deletion_desc=При изтриване на тази уеб-кука ще се премахне информацията за нея и цялата хронология на нейното изпращане. Желаете ли да продължите? settings.webhook_deletion_success=Уеб-куката е изтрита успешно! settings.webhook.test_delivery=Тестово изпращане settings.webhook.test_delivery_desc=Симулира тестово изпращане за тест на настройките на уеб-куката -settings.webhook.test_delivery_success=Тестовата уеб-кука е добавена в опашката за изпращане. Може да отнеме няколко секунди преди да се появи в историята с доставени. settings.webhook.request=Заявка settings.webhook.response=Отговор settings.webhook.headers=Заглавки @@ -704,7 +581,6 @@ settings.githook_edit_desc=Ако куката е неактивна, ще бъ settings.githook_name=Име на куката settings.githook_content=Съдържание на куката settings.update_githook=Запази куката -settings.add_webhook_desc=Gitea ще изпрати POST заявка към указания URL адрес заедно с информация за събитието, което е настъпило. Също можете да укажете в какъв формат желаете да получите данните при задействане на куката (JSON, x-www-form-urlencoded, XML) и др. Допълнително описание можете да намерите в нашето Ръководство за уеб-куки. settings.payload_url=URL адрес на изпращане settings.content_type=Тип на съдържанието settings.secret=Тайна @@ -722,7 +598,6 @@ settings.event_pull_request_desc=Заявка за сливане е отвор settings.event_push=Предаване settings.event_push_desc=Git предаване към хранилището settings.active=Активна -settings.active_helper=Подробности относно събитието, което е задействало куката, също ще бъдат изпратени. settings.add_hook_success=Новата уеб-кука е добавена успешно. settings.update_webhook=Запази уеб-куката settings.update_hook_success=Уеб-куката е запазена успешно. @@ -743,13 +618,10 @@ settings.key_been_used=Съдържанието на ключа за внедр settings.key_name_used=Ключ за внедряване с такова име вече съществува. settings.add_key_success=Новият ключ за внедряване '%s' е добавен успешно! settings.deploy_key_deletion=Изтрий ключ за внедряване -settings.deploy_key_deletion_desc=При изтриването на този ключ за внедряване ще се премахнат свързаните права за достъп до това хранилище. Желаете ли да продължите? -settings.deploy_key_deletion_success=Ключът за внедряване е изтрит успешно! diff.browse_source=Преглед на файлове diff.parent=родител diff.commit=ревизия -diff.data_not_available=Няма данни за разлики. diff.show_diff_stats=Покажи статистика за разликите diff.show_split_view=Разделен изглед diff.show_unified_view=Обединен изглед @@ -766,11 +638,8 @@ release.stable=Стабилни release.edit=редактиране release.ahead=%d ревизии на %s след тази версия release.source_code=Изходен код -release.new_subheader=Публикувайте версия на всяка нова итерация. -release.edit_subheader=Подробният журнал на промените ще помогне на потребителите да разберат какви подобрения са направени. release.tag_name=Име на маркера release.target=Цел -release.tag_helper=Изберете съществуващ маркер или създайте нов маркер по време на публикуване. release.title=Заглавие release.content=Съдържание release.write=Редактор @@ -784,8 +653,6 @@ release.save_draft=Запис на чернова release.edit_release=Редактирай версия release.delete_release=Изтриване на тази версия release.deletion=Изтрий версията -release.deletion_desc=При изтриване на тази версия ще се премахне и съответния Git маркер. Желаете ли да продължите? -release.deletion_success=Версията беше изтрита успешно! release.tag_name_already_exist=Версия с това име на маркер вече съществува. release.tag_name_invalid=Името на етикета е невалидно. release.downloads=Изтегляния @@ -806,9 +673,6 @@ create_new_team=Създай нов екип org_desc=Описание team_name=Име на екипа team_desc=Описание -team_name_helper=Ще използвате това име при споменаване на този екип в разговори. -team_desc_helper=Каква е целта на този екип? -team_permission_desc=Какво ниво на достъп трябва да има този екип? form.name_reserved=Името на организацията '%s' е запазено. form.name_pattern_not_allowed=Име на организацията от вида '%s' не е разрешено. @@ -819,16 +683,11 @@ settings.full_name=Пълно име settings.website=Уебсайт settings.location=Локация settings.update_settings=Запази настройките -settings.update_setting_success=Настройките на организацията са запазени успешно. -settings.change_orgname_prompt=Този промяна ще засегне всички връзки сочещи към организацията. -settings.update_avatar_success=Настройките на аватара на организацията са запазени успешно. settings.delete=Изтрий организацията settings.delete_account=Изтриване на тази организация settings.delete_prompt=Организацията ще бъде изтрита и операцията НЕ МОЖЕ да бъде отменена в последствие! settings.confirm_delete_account=Потвърди изтриването settings.delete_org_title=Изтрий организацията -settings.delete_org_desc=Тази организация ще бъде окончателно изтрита. Желаете ли да продължите? -settings.hooks_desc=Добави уеб-куки, които ще бъдат използвани от всички хранилища в тази организация. members.membership_visibility=Видимост: members.public=Публични @@ -848,9 +707,7 @@ teams.leave=Напусни teams.read_access=Достъп за четене teams.read_access_helper=Този екип ще може да вижда и клонира своите хранилища. teams.write_access=Достъп за запис -teams.write_access_helper=Този екип ще може да чете своите хранилища и ще може да предава към тях. teams.admin_access=Администраторски достъп -teams.admin_access_helper=Този екип ще може да добавя код, данни и нови сътрудници в своите хранилища. teams.no_desc=Този екип няма описание teams.settings=Настройки teams.owners_permission_desc=Притежателите имат пълен достъп до всички хранилища и имат права на администратори на организацията. @@ -859,8 +716,6 @@ teams.update_settings=Запази настройките teams.delete_team=Изтриване на този екип teams.add_team_member=Добави участник в екипа teams.delete_team_title=Изтрий екипа -teams.delete_team_desc=Тъй като този екип ще бъдат изтрит, участниците му може да загубят достъп до някои хранилища. Желаете ли да продължите? -teams.delete_team_success=Този екип е бил изтрит успешно. teams.read_permission_desc=Този екип предоставя достъп за четене: участниците могат да разглеждат и клонират хранилищата на този екип. teams.write_permission_desc=Този екип предоставя достъп за писане: участниците могат да четат от и да предават към хранилищата на този екип. teams.admin_permission_desc=Този екип предоставя администраторски достъп: участниците могат да четат от, да предават към и да добавя нови сътрудници към хранилищата на този екип. @@ -890,23 +745,8 @@ dashboard.statistic_info=Gitea базата данни има %d потр dashboard.operation_name=Име на операцията dashboard.operation_switch=Превключи dashboard.operation_run=Изпълни -dashboard.clean_unbind_oauth=Почисти несвързани OAuthes -dashboard.clean_unbind_oauth_success=Всички несвързани OAuthes са изтрити успешно. dashboard.delete_inactivate_accounts=Изтрий всички неактивни профили -dashboard.delete_inactivate_accounts_success=Всички неактивни профили са изтрити успешно. dashboard.delete_repo_archives=Изтрий всички архиви на хранилища -dashboard.delete_repo_archives_success=Всички архиви на хранилищата са изтрити успешно. -dashboard.delete_missing_repos=Изтрий всички записи за хранилища, за които липсват Git файлове -dashboard.delete_missing_repos_success=Всички записи за хранилища, за които липсват съответни Git файлове са изтрити успешно. -dashboard.git_gc_repos=Почисти изтрити данни в хранилищата -dashboard.git_gc_repos_success=Всички хранилища са почистени от изтрити данни успешно. -dashboard.resync_all_sshkeys=Презапис на ".ssh/authorized_keys" файл (внимание: не-Gitea ключове ще бъдат загубени) -dashboard.resync_all_sshkeys_success=Всички публични ключове са презаписани успешно. -dashboard.resync_all_update_hooks=Презапис на всички куки, закачени на актуализация на хранилищата (необходимо, когато се ползва собствен път за конфигурацията) -dashboard.resync_all_update_hooks_success=Всички куки, закачени на актуализация на хранилищата, са презаписани успешно. -dashboard.reinit_missing_repos=Реинициализира всички записи за хранилища -dashboard.reinit_missing_repos_success=Всички записи за хранилища със загубени Git файлове са реинициализирани успешно. - dashboard.server_uptime=Операционно време dashboard.current_goroutine=Текущи Goroutines dashboard.current_memory_usage=Текущо използвана памет @@ -937,7 +777,6 @@ dashboard.total_gc_pause=Общо пауза за GC dashboard.last_gc_pause=Последна пауза за GC dashboard.gc_times=Брой GC -users.user_manage_panel=Управление на потребителя users.new_account=Създай нов профил users.name=Име users.activated=Активиран @@ -945,33 +784,23 @@ users.admin=Администратор users.repos=Хранилища users.created=Създаване users.send_register_notify=Прати уведомление на потребителя при регистрация -users.new_success=Новият профил '%s' е добавен успешно. users.edit=Редакция users.auth_source=Начин на удостоверяване users.local=Локално users.auth_login_name=Потребителско име за вход users.password_helper=Оставете празна ако не се променя. -users.update_profile_success=Профилът е запазен успешно. users.edit_account=Редактирай профил users.max_repo_creation=Макс. брой хранилища users.max_repo_creation_desc=(Задайте -1 за да се използва глобалния лимит) -users.is_activated=Този профил е активиран -users.prohibit_login=Този профил има забрана за влизане users.is_admin=Този профил има административни права -users.allow_git_hook=Този профил има разрешение да създава Git куки users.allow_import_local=Този профил има права за импорт на локални хранилища users.update_profile=Запази профила users.delete_account=Изтрий този профил -users.still_own_repo=Този профил притежава поне едно хранилище. Първо трябва да изтриете хранилището или да го прехвърлите на друг потребител. -users.still_has_org=Този профил участва в поне една организация. Първо трябва да напуснете или изтриете тези организации. -users.deletion_success=Профилът е изтрит успешно! -orgs.org_manage_panel=Управление на организацията orgs.name=Име orgs.teams=Екипи orgs.members=Участници -repos.repo_manage_panel=Управление на хранилището repos.owner=Притежател repos.name=Име repos.private=Частно @@ -979,7 +808,6 @@ repos.watches=Наблюдавания repos.stars=Харесвания repos.issues=Задачи -auths.auth_manage_panel=Управление на удостоверявания auths.new=Добави нов начин на удостоверяване auths.name=Име auths.type=Тип @@ -993,7 +821,6 @@ auths.host=Сървър auths.port=Порт auths.bind_dn=Име (DN) за свръзка auths.bind_password=Парола за свръзка -auths.bind_password_helper=Внимание: Тази парола се запазва некриптирана. Моля използвайте потребител, който няма административен достъп. auths.user_base=Базов OU за търсене auths.user_dn=Име (DN) на потребител auths.attribute_username=Атрибут за име @@ -1008,21 +835,12 @@ auths.smtp_auth=SMTP удостоверяване auths.smtphost=SMTP сървър auths.smtpport=SMTP порт auths.allowed_domains=Разрешени домейни -auths.allowed_domains_helper=Оставете празно за да не се ограничават домейните. За множество домейни използвайте запетая за разделител. auths.enable_tls=Включи TLS криптиране auths.skip_tls_verify=Пропусни проверка на TLS сертификат auths.pam_service_name=Име на PAM услуга auths.enable_auto_register=Включи автоматична регистрация auths.tips=Съвети -auths.edit=Редактирай настройки за удостоверяване auths.activated=Това удостоверяване е активно -auths.new_success=Новото удостоверяване '%s' е добавено успешно. -auths.update_success=Настройките за удостоверяване са запазени успешно. -auths.update=Запази настройки за удостоверяване -auths.delete=Изтриване на това удостоверяване -auths.delete_auth_title=Изтрий удостоверяването -auths.delete_auth_desc=Това удостоверяване ще бъде изтрито. Желаете ли да продължите? -auths.still_in_used=Това удостоверяване все още се използва от някои потребители. Моля изтрийте ги или ги конвертирайте до друг тип на влизане първо. auths.deletion_success=Удостоверяването е изтрито успешно! config.server_config=Сървърни настройки @@ -1042,7 +860,6 @@ config.reverse_auth_user=Потребителско име при обратно config.ssh_config=SSH конфигурация config.ssh_enabled=Активен -config.ssh_start_builtin_server=Стартирай вграден сървър config.ssh_domain=Домейн config.ssh_port=Порт config.ssh_listen_port=Порт за слушане @@ -1071,12 +888,10 @@ config.mail_notify=Уведомяване по ел. поща config.disable_key_size_check=Изключи проверка минимален размер на ключ config.enable_captcha=Включи Captcha config.active_code_lives=Кодове за активиране -config.reset_password_code_lives=Кодове за изчистване на парола config.webhook_config=Конфигурация на уеб-куки config.queue_length=Дължина на опашка config.deliver_timeout=Време за отказ при изпращане -config.skip_tls_verify=Пропусни проверка на TLS config.mailer_config=Конфигурация на мейлър config.mailer_enabled=Активен @@ -1085,7 +900,6 @@ config.mailer_name=Име config.mailer_host=Сървър config.mailer_user=Потребител config.send_test_mail=Изпрати тестово писмо -config.test_mail_failed=Невъзможно изпращане на тестово писмо до '%s': %v config.test_mail_sent=Тестово писмо беше изпратено до '%s'. config.oauth_config=OAuth конфигурация @@ -1138,7 +952,6 @@ monitor.start=Начален час monitor.execute_time=Време за изпълнение notices.system_notice_list=Системни известия -notices.view_detail_header=Преглед на детайли на съобщение notices.actions=Действия notices.select_all=Избери всички notices.deselect_all=Без избрани @@ -1149,7 +962,6 @@ notices.type=Тип notices.type_1=Хранилище notices.desc=Описание notices.op=Oп. -notices.delete_success=Системните съобщения са изтрити успешно. [action] create_repo=създаде хранилище %s @@ -1165,34 +977,35 @@ comment_issue=`коментира задача %s#%[2]s"< merge_pull_request=`обедини заявка за сливане %s#%[2]s` transfer_repo=прехвърли хранилище %s към %s push_tag=предаде маркер %[2]s към [3]s -compare_commits=Сравнение между тези %d ревизии [tool] -ago=преди -from_now=след +ago=преди %s +from_now=след %s now=сега -1s=%s 1 секунда -1m=%s 1 минута -1h=%s 1 час -1d=%s 1 ден -1w=%s 1 седмица -1mon=%s 1 месец -1y=%s 1 година -seconds=%[2]s %[1]d секунди -minutes=%[2]s %[1]d минути -hours=%[2]s %[1]d часа -days=%[2]s %[1]d дни -weeks=%[2]s %[1]d седмици -months=%[2]s %[1]d месеца -years=%[2]s %[1]d години +1s=1 секунда +1m=1 минута +1h=1 час +1d=1 ден +1w=1 седмица +1mon=1 месец +1y=1 година +seconds=%d секунди +minutes=%d минути +hours=%d часа +days=%d дни +weeks=%d седмици +months=%d месеца +years=%d години raw_seconds=секунди raw_minutes=минути [dropzone] -default_message=Тук пуснете файлове с влачене или просто щракнете за избор на файл за качване. invalid_input_type=Невъзможно качване на файловете от този тип. -file_too_big=Размер на файла ({{filesize}} MB) надвишава максималния размер ({{maxFilesize}} MB). remove_file=Премахни файл [notification] +[gpg] + +[units] + diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index d632b58..bfcf37a 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -29,7 +29,6 @@ mirror=Zrcadlo new_repo=Nový repozitář new_migrate=Nová migrace new_mirror=Nové zrcadlo -new_fork=Nový repositář rozštěpení new_org=Nová organizace manage_org=Spravovat organizace admin_panel=Panel správce @@ -38,6 +37,7 @@ settings=Nastavení your_profile=Váš profil your_settings=Vaše nastavení + activities=Aktivity pull_requests=Požadavek na natažení issues=Úkoly @@ -46,39 +46,29 @@ cancel=Zrušit [install] install=Instalace -title=Kroky instalace pro první běh -docker_helper=Spouštíte-li Gitea uvnitř Dockeru, přečtěte si prosím pečlivě návod, než něco změníte na této stránce! -requite_db_desc=Gitea vyžaduje MySQL, PostgreSQL, SQLite3 nebo TiDB. db_title=Nastavení databáze db_type=Typ databáze host=Hostitel user=Uživatel password=Heslo db_name=Název databáze -db_helper=Prosíme, pro MySQL použijte INNODB engine se znakovou sadou utf8_general_ci. ssl_mode=SSL Mód path=Cesta -sqlite_helper=Cesta k souboru s SQLite3 nebo TiDB databází.
Prosíme, použijte absolutní cestu, když startujete službu. err_empty_db_path=Cesty k databázovým souborům SQLite3 nebo TiDB nemohou být prázdné. err_invalid_tidb_name=Název databáze TiDB nemůže obsahovat znaky "." a "-". no_admin_and_disable_registration=Nemůžete vypnout registraci účtů bez vytvoření účtu správce. err_empty_admin_password=Heslo správce nemůže být prázdné. -general_title=Obecné nastavení aplikace app_name=Název aplikace -app_name_helper=Zde zadejte název vaší organizace velkým a tučným písmem! repo_path=Kořenový adresář repositářů -repo_path_helper=Všechny vzdálené repositáře Gitu budou uloženy do tohoto adresáře. run_user=Účet pro spouštění run_user_helper=Tento uživatel musí mít přístup do kořenového adresáře repositářů a právo spustit Gitea. domain=Doména domain_helper=Toto ovlivňuje URL klonů skrze SSH. ssh_port=Port SSH -ssh_port_helper=Číslo portu, které používá váš SSH server. Nechte jej prázdné pro vypnutí používání SSH. http_port=Port HTTP http_port_helper=Číslo portu, na kterém aplikace naslouchá. app_url=URL aplikace -app_url_helper=Toto ovlivňuje URL klonů skrze HTTP/HTTPS a odkazů v e-mailech. log_root_path=Adresář logů log_root_path_helper=Adresář, kam se budou zapisovat logy. @@ -86,14 +76,10 @@ optional_title=Dodatečná nastavení email_title=Nastavení e-mailové služby smtp_host=Server SMTP smtp_from=Od -smtp_from_helper=E-mailová adresa podle RFC 5322. Může být zadána pouze e-mailová adresa nebo adresa ve formátu "Name" . -mailer_user=E-mailová adresa odesílatele mailer_password=Heslo register_confirm=Povolit potvrzení registrace -mail_notify=Povolit upozornění e-mailem server_service_title=Nastavení serveru a ostatních služeb offline_mode=Zapnout režim offline -offline_mode_popup=Vypnout síť doručování obsahu (CDN) i v produkčním režimu, vše bude obslouženo místně. disable_gravatar=Vypnout službu Gravatar disable_gravatar_popup=Vypnout službu Gravatar a ostatní zdroje. Všechny ikony uživatelů budou nahrány uživateli nebo výchozí. federated_avatar_lookup=Povolit vyhledání avatarů z veřejných zdrojů @@ -104,7 +90,6 @@ enable_captcha=Povolit službu CAPTCHA enable_captcha_popup=Vyžadovat správně zadaný text CAPTCHA při registraci. require_sign_in_view=Zapnout nutnost přihlášení pro zobrazení stránek require_sign_in_view_popup=Stránky budou zobrazeny pouze přihlášeným uživatelům, ostatní návštěvníci uvidí pouze přihlašovací a registrační formulář. -admin_setting_desc=Nemusíte teď hned vytváře správce, kterýkoliv uživatel s ID=1 dostane automaticky správcovský přístup. admin_title=Nastavení účtu správce admin_name=Uživatelské jméno admin_password=Heslo @@ -112,13 +97,8 @@ confirm_password=Potvrdit heslo admin_email=E-mailová adresa správce install_btn_confirm=Nainstalovat Gitea test_git_failed=Chyba při testu příkazu 'git': %v -sqlite3_not_available=Vaše verze vydání Gitea nepodporuje SQLite3, prosíme stáhněte si oficiální binární balíček z %s, ne gobuild verzi. -invalid_db_setting=Nastavení databáze není správné: %v invalid_repo_path=Kořenový adresář repositáře není správný: %v -run_user_not_match=Uživatel pro spuštění není aktuální uživatel: %s -> %s -save_config_failed=Uložení konfigurace se nezdařilo: %v invalid_admin_setting=Nastavení účtu správce není správné: %v -install_success=Vítejte! Jsme rádi, že jste si vybrali Gitea. Bavte se a opatrujte se. invalid_log_root_path=Kořenový adresář logů není správný: %v [home] @@ -126,7 +106,6 @@ uname_holder=Uživatelské jméno nebo e-mailová adresa password_holder=Heslo switch_dashboard_context=Přepnout kontext přehledu my_repos=Mé repositáře -show_more_repos=Zobrazit více repositářů... collaborative_repos=Společné repositáře my_orgs=Mé organizace my_mirrors=Má zrcadla @@ -140,36 +119,23 @@ users=Uživatelé search=Vyhledat [auth] -create_new_account=Vytvořit nový účet register_helper_msg=Již máte účet? Přihlašte se! -social_register_helper_msg=Již máte účet? Připojte se! disable_register_prompt=Omlouváme se, ale registrace jsou vypnuty. Prosíme, spojte se správcem systému. disable_register_mail=Omlouváme se, potvrzovací registrační e-maily byly vypnuty. remember_me=Zapamatovat si mne -forgot_password=Zapomenuté heslo -forget_password=Zapomněli jste heslo? sign_up_now=Potřebujete účet? Zaregistrujte se. -confirmation_mail_sent_prompt=Nový potvrzovací e-mail byl zaslán na %s, prosíme, zkontrolujte si vaši doručenou poštu během následující %d hodin pro dokončení registračního procesu. active_your_account=Aktivujte si váš účet prohibit_login=Přihlášení zakázáno -prohibit_login_desc=Vašemu účtu je zakázáno se přihlásit, kontaktujte prosím správce webu. -resent_limit_prompt=Omlouváme se, ale před chvílí jste požádal o aktivační e-mail. Prosíme, počkejte 3 minuty a pak to zkuste znovu. has_unconfirmed_mail=Zdravím, %s, máte nepotvrzenou e-mailovou adresu (%s). Pokud jste nedostali e-mail pro potvrzení nebo potřebujete zaslat nový, klikněte prosím na tlačítku níže. resend_mail=Klikněte zde pro odeslání aktivačního e-mailu -email_not_associate=Tato e-mailová adresa není spojena s žádným účtem. -send_reset_mail=Klikněte zde pro znovuposlání e-mailu pro změnu vašeho hesla reset_password=Obnova vašeho hesla -invalid_code=Omlouváme se, ale kód potvrzení vašeho účtu vypršel nebo není správný. reset_password_helper=Klikněte zde pro obnovu vašeho hesla password_too_short=Délka hesla musí být minimálně %d znaků. -non_local_account=Externí účty nemohou měnit hesla přes Gitea. [mail] activate_account=Prosíme, aktivujte si váš účet activate_email=Ověřte vaši e-mailovou adresu reset_password=Obnova vašeho hesla -register_success=Vítejte, registrace vašeho účtu se zdařila -register_notify=Vítejte [modal] yes=Ano @@ -196,8 +162,6 @@ TreeName=Cesta k souboru Content=Obsah require_error=` nemůže být prázdný.` -alpha_dash_error=` musí být pouze písmena, číslice či znaky - a _ .` -alpha_dash_dot_error=` musí být pouze písmena, číslice, tečka či znaky - a _ .` size_error=` musí být minimálně velikosti %s.` min_size_error=` musí obsahovat nejméně %s znaků.` max_size_error=` musí obsahovat maximálně %s znaků.` @@ -205,28 +169,10 @@ email_error=` není správná e-mailová adresa.` url_error=` není správná URL.` include_error=` musí obsahovat řetězec '%s'.` unknown_error=Neznámá chyba: -captcha_incorrect=Zadaná CAPTCHA se neshoduje. -password_not_match=Heslo a znovu zadané heslo nejsou shodné. -username_been_taken=Uživatelské jméno je již obsazeno. -repo_name_been_taken=Název repositáře je již obsazen. -org_name_been_taken=Název organizace je již obsazen. -team_name_been_taken=Název týmu je již obsazen. -email_been_used=E-mailová adresa je již použita. -username_password_incorrect=Chybné uživatelské jméno nebo heslo. -enterred_invalid_repo_name=Ujistěte se, prosím, že zadaný název repositáře je správný. -enterred_invalid_owner_name=Ujistěte se, prosím, že jméno vlastníka je zadáno správně. -enterred_invalid_password=Ujistěte se, prosím, že zadané heslo je správné. -user_not_exist=Zadaný uživatel neexistuje. -last_org_owner=Odstranění posledního uživatele z týmu vlastníka není dovoleno, neboť vždy musí v každé organizaci existovat jeden vlastník. -invalid_ssh_key=Omlouváme se, ale není možné ověřit váš klíč SSH: %s -unable_verify_ssh_key=Gitea nemohl ověřit váš klíč SSH, ale předpokládáme, že je platný, nicméně zkontrolujte jej prosím. auth_failed=Ověření selhalo: %v -still_own_repo=Váš účet stále vlastní minimálně jeden repositář. Musíte je nejdříve smazat nebo předat. -still_has_org=Váš účet je stále členem minimálně jedné organizace. Je nutné ji nejdříve opustit nebo smazat vaše členství. -org_still_own_repo=Tato organizace stále vlastní repositáře, musíte je nejdříve smazat nebo předat. target_branch_not_exist=Cílová větev neexistuje. @@ -241,14 +187,11 @@ following=Sledovaní follow=Sledovat unfollow=Přestat sledovat -form.name_reserved=Uživatelské jméno '%s' je rezervováno. -form.name_pattern_not_allowed=Vzor uživatelského jména '%s' není povolen. [settings] profile=Profil password=Heslo avatar=Uživatelská ikona -ssh_keys=Klíče SSH social=Sociální účty applications=Aplikace orgs=Organizace @@ -256,15 +199,11 @@ delete=Smazat účet uid=UID public_profile=Veřejný profil -profile_desc=Vaše e-mailová adresa je veřejná a bude použita pro upozornění vztahující se k vašemu účtu a jakékoliv operaci, která se provede pomocí systému. -password_username_disabled=Uživatelé, kteří jsou ověřováni jinak než lokálně, si nemohou změnit uživatelské jméno. full_name=Celé jméno website=Web location=Místo update_profile=Změnit profil -update_profile_success=Váš profil byl úspěšně změněn. change_username=Uživatelské jméno změněno -change_username_prompt=Tato změna ovlivní vztah odkazů k vašemu účtu. continue=Pokračovat cancel=Zrušit @@ -275,15 +214,11 @@ choose_new_avatar=Vybrat novou ikonu uživatele update_avatar=Aktualizovat nastavení ikony uživatele delete_current_avatar=Smazat aktuální ikonu uživatele uploaded_avatar_not_a_image=Nahraný soubor není obrázkem. -update_avatar_success=Nastavení vaší ikony uživatele bylo změněno. change_password=Změna hesla old_password=Stávající heslo new_password=Nové heslo retype_new_password=Zadat znovu heslo -password_incorrect=Zadané heslo není správné. -change_password_success=Vaše heslo bylo úspěšně změněno. Nyní se můžete přihlásit pomocí tohoto nového hesla. -password_change_disabled=Uživatelé, kteří jsou ověřováni jinak než lokálně, si nemohou změnit heslo. emails=E-mailová adresa manage_emails=Správa e-mailových adres @@ -291,70 +226,50 @@ email_desc=Vaše hlavní e-mailová adresa bude použita pro oznámení a dalš primary=Hlavní primary_email=Nastavit jako hlavní delete_email=Smazat -email_deletion=Smazání e-mailové adresy -email_deletion_desc=Smazání této e-mailové adresy odstraní návazné informace z vašeho účtu. Chcete pokračovat? email_deletion_success=E-mailová adresa byla úspěšně smazána! add_new_email=Přidat novou e-mailovou adresu add_email=Přidat e-mailovou adresu -add_email_confirmation_sent=Nový e-mail pro potvrzení byl odeslán na adresu '%s', prosíme zkontrolujte si vaši doručenou poštu během následujících %d hodin pro dokončení procesu potvrzení. add_email_success=Vaše nová e-mailová adresa byla úspěšně přidána. manage_ssh_keys=Správa klíčů SSH add_key=Přidat klíč -ssh_desc=Toto je seznam klíčů SSH vašeho účtu. Jelikož tyto samotné klíče umožňují přístup k vašim repositářům, je velmi důležité, abyste je rozpoznal. -ssh_helper=Nevíte jak? Podívejte se do příručky GitHubu na to vytvoření vlastních klíčů SSH nebo vyřešte bežné problémy, se kterými se můžete potkat při použití SSH. add_new_key=Přidat klíč SSH -ssh_key_been_used=Obsah veřejného klíče byl použit. -ssh_key_name_used=Veřejný klíč se stejným jménem již existuje. key_name=Název klíče key_content=Obsah -add_key_success=Nový klíč SSH '%s' byl úspěšně přidán! delete_key=Smazat ssh_key_deletion=Smazání klíče SSH -ssh_key_deletion_desc=Smazání tohoto klíče SSH odstraní přístup k vašemu účtu. Chcete pokračovat? -ssh_key_deletion_success=Klíč SSH byl úspěšně smazán! add_on=Přidáno dne last_used=Naposledy použito dne no_activity=Žádná aktuální aktivita -key_state_desc=Tento klíč je používán posledních 7 dní -token_state_desc=Tato poukázka je používána posledních 7 dní manage_social=Správa propojených sociálních účtů -social_desc=Toto je seznam propojených sociálních účtů. Odpojte kterékoliv připojení, které nepoznáváte. unbind=Odpojit -unbind_success=Sociální účet byl odpojen. manage_access_token=Správa osobních přístupových poukázek generate_new_token=Vygenerovat novou poukázku -tokens_desc=Poukázky, které jste vygeneroval, mohou být použity pro přístup k Gitea API. new_token_desc=Každá poukázka má úplný přístup k vašemu účtu. token_name=Název poukázky generate_token=Vygenerovat poukázku -generate_token_succees=Vaše přístupová poukázka byl úspěšně vygenerován. Nyní si ji zkopírujte, neboť později to již nebude možné! delete_token=Smazat access_token_deletion=Smazání osobní přístupové poukázky -access_token_deletion_desc=Smazáním této osobní přístupové poukázky odstraní všechen návazný přístup aplikace. Chcete pokračovat? -delete_token_success=Osobní přístupová poukázka byla úspěšně odstraněna! Nezapomeňte také aktualizovat vaši aplikaci. + + delete_account=Smazat váš účet delete_prompt=Tato operace permanentně smaže váš účet a tato změna nemůže být vrácena! confirm_delete_account=Potvrdit smazání delete_account_title=Smazání účtu -delete_account_desc=Tento účet bude trvale smazán. Chcete pokračovat? [repo] owner=Vlastník repo_name=Název repositáře -repo_name_helper=Dobrý název repositáře se většinou skládá z krátkých, zapamatovatelných a unikátních klíčových slov. visibility=Viditelnost visiblity_helper=Tento repositář je soukromý -visiblity_helper_forced=Správce vynutil na všech nových repositářích, aby byly soukromé visiblity_fork_helper=(Změna této hodnoty ovlivní všechny repositáře rozštěpení) clone_helper=Potřebujete pomoci s klonováním? Navštivte nápovědu! fork_repo=Repositář rozštěpení fork_from=Rozštěpit z -fork_visiblity_helper=Nemůžete změnit viditelnost repositáře rozštěpení. repo_desc=Popis repo_lang=Jazyk repo_gitignore_helper=Vyberte šablony .gitignore @@ -366,18 +281,12 @@ auto_init=Inicializovat tento repositář s vybranými soubory a šablonou create_repo=Vytvořit repositář default_branch=Výchozí větev mirror_prune=Vyčistit -mirror_prune_desc=Odstranit vzdálené odkazy, které již ve vzdáleném repozitáři neexistují -mirror_interval=Odstup zrcadlení (hodina) mirror_address=Adresa zrcadla -mirror_address_desc=Prosím, přidejte do adresy potřebné přihlašovací údaje. mirror_last_synced=Naposledy synchronizováno watchers=Sledující stargazers=Sledující forks=Rozštěpení -form.reach_limit_of_creation=Vlastník dosáhl maximálního počtu %d vytvořených repositořů. -form.name_reserved=Název repositáře '%s' je rezervován. -form.name_pattern_not_allowed=Vzor názvu repositáře '%s' není povolen. need_auth=Ověření je vyžadováno migrate_type=Typ migrace @@ -404,9 +313,6 @@ fork=Rozštěpit no_desc=Bez popisu quick_guide=Krátká příručka clone_this_repo=Naklonovat tento repositář -create_new_repo_command=Vytvořit nový repositář v příkazové řádce -push_exist_repo=Nahrát existující repositář z příkazové řádky -repo_is_empty=Tento repositář je prázdný, prosíme, vraťte se brzo zpátky! code=Zdrojový kód branch=Větev @@ -430,7 +336,6 @@ editor.new_file=Nový soubor editor.upload_file=Nahrát soubor editor.edit_file=Upravit soubor editor.preview_changes=Náhled změn -editor.cannot_edit_non_text_files=Netextové soubory není možné upravovat editor.edit_this_file=Upravit tento soubor editor.must_be_on_a_branch=Musíte mít zvolenu větev pro úpravu či návrh změn tohoto souboru editor.fork_before_edit=Musíte provést rozvětvení repositáře před úpravou souboru @@ -444,7 +349,7 @@ editor.cancel_lower=zrušit editor.commit_changes=Uložit změny revize editor.add_tmpl=Přidat '%s/' editor.add=Přidat '%s' -editor.update=Aktualizovat "%s" +editor.update=Aktualizovat "%s editor.delete=Smazat '%s' editor.commit_message_desc=Přidat dobrovolný rozšířený popis... editor.commit_directly_to_this_branch=Uložte změny revize přímo do větve %s. @@ -456,7 +361,6 @@ editor.branch_already_exists=Repositář větev '%s' již obsahuje. editor.directory_is_a_file=Položka '%s' v nadřazené cestě je v tomto repozitáři soubor, ne adresář. editor.filename_is_a_directory=Jméno souboru '%s' koliduje v tomto repozitáři se jménem adresáře. editor.file_editing_no_longer_exists=Soubor '%s', který upravujete, již neexistuje v tomto repozitáři. -editor.file_changed_while_editing=Obsah souboru se změnil od začátku úprav. Klepnutím sem zobrazíte, co se změnilo, nebo stiskněte potvrdit znovu pro přepsání změn. editor.file_already_exists=Soubor '%s' již existuje v tomto repozitáři. editor.no_changes_to_show=Žádné změny k zobrazení. editor.fail_to_update_file=Vytvoření nebo změna souboru '%s' skončilo chybou: %v @@ -466,13 +370,13 @@ editor.upload_files_to_dir=Nahrát soubory do '%s' commits.commits=Revize commits.search=Hledání revizí -commits.find=Hledat commits.author=Autor commits.message=Zpráva commits.date=Datum commits.older=Starší commits.newer=Novější + issues.new=Nový úkol issues.new.labels=Štítky issues.new.no_label=Bez štítku @@ -490,7 +394,6 @@ issues.new_label=Nový štítek issues.new_label_placeholder=Název štítku... issues.create_label=Vytvořit štítek issues.label_templates.title=Nahrát předdefinovanou sadu značek -issues.label_templates.info=Nejsou zadány žádné značky. Pro vytvoření nové klikněte na tlačítko Nová značka nebo použijte předdefinovanou sadu. issues.label_templates.helper=Vyberte sadu značek issues.label_templates.use=Použít tuto sadu značek issues.label_templates.fail_to_load_file=Nepodařilo se nahrát soubor šablony značek '%s': %v @@ -547,8 +450,6 @@ issues.label_edit=Upravit issues.label_delete=Smazat issues.label_modify=Změna štítku issues.label_deletion=Smazání štítku -issues.label_deletion_desc=Smazání tohoto štítku jej smaže také ze všech návazných úkolech. Chcete pokračovat? -issues.label_deletion_success=Štítek byl úspěšně smazán! issues.num_participants=%d účastníků issues.attachment.open_tab=`Klikněte pro zobrazení "%s" v nové záložce` issues.attachment.download=`Klikněte pro stažení "%s"` @@ -568,16 +469,12 @@ pulls.merged_title_desc=sloučil %[1]d revizí z větve %[2]s do v pulls.tab_conversation=Konverzace pulls.tab_commits=Revize pulls.tab_files=Změněné soubory -pulls.reopen_to_merge=Prosíme, otevřete znovu tento požadavek na natažení, aby se provedla operace sloučení. pulls.merged=Sloučený -pulls.has_merged=Tento požadavek na natažení byl úspěšně sloučen! pulls.data_broken=Data této žádosti na natažení byla narušena z důvodu smazání informací o rozštěpení. pulls.is_checking=Kontrola konfliktů stále pokračuje, prosíme obnovte za několik okamžiků stránku. pulls.can_auto_merge_desc=Tento požadavek na natažení může být automaticky sloučen. -pulls.cannot_auto_merge_desc=Tento požadavek na natažení nemůže být automaticky sloučen, neboť se v něm nachází konflikty. pulls.cannot_auto_merge_helper=Prosíme proveďte sloučení ručně, aby byly vyřešeny konflitky. pulls.merge_pull_request=Sloučit požadavek na stažení -pulls.open_unmerged_pull_exists=`Nemůžete znovuotevřít požadavek na stažení, neboť požadavek na stažení ze stejného repositáře se stejnými informacemi pro sloučení již existuje (#%d).` milestones.new=Nový milník milestones.open_tab=%d otevřených @@ -595,27 +492,22 @@ milestones.clear=Zrušit milestones.invalid_due_date_format=Formát data termínu je neplatný, musí být 'yyyy-mm-dd'. milestones.create_success=Milník '%s' byl úspěšně vytvořen! milestones.edit=Upravit milník -milestones.edit_subheader=Zadejte lepší popis milníků, aby lidé nebyli zmateni. milestones.cancel=Zrušit milestones.modify=Změnit milník milestones.edit_success=Změny milníku '%s' byly úspěšně uloženy! milestones.deletion=Smazání milníku -milestones.deletion_desc=Smazání tohoto milníku jej smaže také ze všech návazných úkolech. Chcete pokračovat? milestones.deletion_success=Milník byl úspěšně smazán! -wiki.welcome=Vítejte ve Wiki! -wiki.welcome_desc=Wiki je místo pro vaši společnou dokumentaci projektu a návodů jak jej zlepšit. + wiki.create_first_page=Vytvořte první stránku wiki.page=Stránka wiki.filter_page=Filtr stránky wiki.new_page=Vytvořit novou stránku -wiki.default_commit_message=Napište (volitelnou) poznámku k této úpravě. wiki.save_page=Uložit stránku wiki.last_commit_info=%s upravil tuto stránku %s wiki.edit_page_button=Změnit stránku wiki.new_page_button=Nová stránka wiki.delete_page_button=Smazat stránku -wiki.delete_page_notice_1=Toto smaže stránku "%s". Buďte si prosím jisti. wiki.page_already_exists=Stránka Wiki se stejným názvem již existuje. wiki.pages=Stránky wiki.last_updated=Naposledy aktualizováno: %s @@ -632,7 +524,6 @@ settings.githooks=Háčky Gitu settings.basic_settings=Základní nastavení settings.mirror_settings=Nastavení zrcadla settings.sync_mirror=Provést synchronizaci -settings.mirror_sync_in_progress=Synchronizace zrcadel probíhá, prosím načtěte znovu stránku přibližně za minutu. settings.site=Oficiální stránky settings.update_settings=Změnit nastavení settings.advanced_settings=Pokročilá nastavení @@ -653,29 +544,18 @@ settings.pulls_desc=Povolit požadavky na stažení, aby veřejné příspěvky settings.danger_zone=Nebezpečná zóna settings.new_owner_has_same_repo=Nový vlastník již repositář se stejným názvem má. Vyberte, prosíme, jiné jméno. settings.convert=Převést na běžný repositář -settings.convert_desc=Můžete převést toto zrcadlo na běžný repositář. Tato změna nemůže být vrácena. settings.convert_notices_1=- Tato operace převede tento zrcadlový repositář na běžný repositář a tato změna nemůže být vrácena. settings.convert_confirm=Potvrdit převod -settings.convert_succeed=Repositář byl úspěšně převeden na běžný typ. settings.transfer=Předat vlastnictví settings.transfer_desc=Předat tento repositář jinému uživateli nebo organizaci, ve které jste správce. -settings.transfer_notices_1=- Ztratíte přístup, pokud nový vlastník je samostatný uživatel. -settings.transfer_notices_2=- Přístup vám bude zachován, pokud nový vlastník je organizace a vy jste jedním z vlastníků. -settings.transfer_form_title=Zadejte prosím následující informace pro potvrzení operace: settings.wiki_delete=Smazat data Wiki settings.wiki_delete_desc=Pokud smažete data Wiki, nebude možné se vrátit. Buďte si, prosím, jist. settings.wiki_delete_notices_1=- Toto smaže a vypne Wiki pro %s -settings.wiki_deletion_success=Data Wiki tohoto repositáře byla úspěšně smazána. settings.delete=Smazat tento repositář settings.delete_desc=Jakmile smažete repositář, není možné se vrátit. Buďte si, prosím, jist. settings.delete_notices_1=- Tuto operaci nelze zvrátit. -settings.delete_notices_2=Tato operace permanentně smaže vše v tomto repositáři, včetně dat Gitu, úkolů, komentářů a přístupu spolupracovníků. -settings.delete_notices_fork_1=- Po smazání se všechny forky se stanou nezávislé. -settings.deletion_success=Repositář byl úspěšně smazán! -settings.update_settings_success=Možnosti repositáře byly úspěšně změněny. settings.transfer_owner=Nový vlastník settings.make_transfer=Předat -settings.transfer_succeed=Repositář byl úspěšně předán. settings.confirm_delete=Potvrdit smazání settings.add_collaborator=Přidat nového spolupracovníka settings.add_collaborator_success=Nový spolupracovník byl přidán. @@ -687,13 +567,10 @@ settings.search_user_placeholder=Hledat uživatele... settings.org_not_allowed_to_be_collaborator=Není dovoleno přidat organizaci jako spolupracovníka. settings.user_is_org_member=Uživatel je již členem organizace, tudíž nemůže být přidán jako spolupracovník. settings.add_webhook=Přidat webový háček -settings.hooks_desc=Webové háčky jsou podobné základním spouštím HTTP POST událostí. Kdykoliv se něco stane v Gitea, bude postaráno o oznámení specifikovanému cílovému serveru. Více se o daném dozvíte v příručce webových háčků. settings.webhook_deletion=Smazat webový háček -settings.webhook_deletion_desc=Smazáním tohoto webového háčku dojte také ke smazání veškerých informací o něm a také historie volání. Chcete pokračovat? settings.webhook_deletion_success=Webový háček byl úspěšně smazán! settings.webhook.test_delivery=Test doručitelnosti settings.webhook.test_delivery_desc=Odeslat falešnou událost doručení nahrání pro test vašeho nastavení webových háčků -settings.webhook.test_delivery_success=Testovací webový háček byl přidán do fronty doručení. Bude to trvat několik sekund, než se ukáže v historii doručení. settings.webhook.request=Požadavek settings.webhook.response=Odpověď settings.webhook.headers=Hlavičky @@ -704,7 +581,6 @@ settings.githook_edit_desc=Je-li háček neaktivní, bude zobrazen vzorový obsa settings.githook_name=Název háčku settings.githook_content=Obsah háčku settings.update_githook=Upravit háček -settings.add_webhook_desc=Gitea zašle požadavek typu POST na zadanou URL, společně s informacemi o události, která nastala. Můžete také specifikovat, jaký datový formát se má použít po spuštění daného háčku (JSON, x-www-form-urlencoded, XML atp.). Více informací je k nalezení v našem Návodu na webové háčky. settings.payload_url=URL obsahu settings.content_type=Typ obsahu settings.secret=Tajný klíč @@ -722,7 +598,6 @@ settings.event_pull_request_desc=Pull request byl otevřen, uzavřen, znovu-otev settings.event_push=Nahrát settings.event_push_desc=Nahrání pomocí Gitu do repositáře settings.active=Aktivní -settings.active_helper=Podrobnosti vztahující se k události, která spustila háček, budou doručeny taktéž. settings.add_hook_success=Nový webový háček byl přidán. settings.update_webhook=Upravit webový háček settings.update_hook_success=Webový háček byl upraven. @@ -743,13 +618,10 @@ settings.key_been_used=Obsah klíče pro nasazení byl použit. settings.key_name_used=Klíč pro nasazení se stejným jménem již existuje. settings.add_key_success=Nový klíč pro nasazení '%s' byl úspěšně přidán! settings.deploy_key_deletion=Smazat klíč pro nasazení -settings.deploy_key_deletion_desc=Smazání toho klíče pro nasazení smaže také veškerý k němu svázaný přístup do tohoto repositáře. Chcete pokračovat? -settings.deploy_key_deletion_success=Klíč pro nasazení byl úspěšně smazán! diff.browse_source=Procházet zdrojové kódy diff.parent=rodič diff.commit=revize -diff.data_not_available=Rozdílová data nejsou dostupná. diff.show_diff_stats=Ukázat statistiku rozdílových dat diff.show_split_view=Rozdělené zobrazení diff.show_unified_view=Jednotný pohled @@ -767,11 +639,8 @@ release.stable=Stabilní release.edit=upravit release.ahead=%d revizí do větve %s od tohoto vydání release.source_code=Zdrojový kód -release.new_subheader=Pro iteraci produktu zveřejňujte vydání. -release.edit_subheader=Detailní log změn může pomoci uživatelům porozumět, co bylo vylepšeno. release.tag_name=Název značky release.target=Cíl -release.tag_helper=Vyberte existující značku nebo vytvořte novou značku při vydání. release.title=Název release.content=Obsah release.write=Zapsat @@ -785,8 +654,6 @@ release.save_draft=Uložit koncept release.edit_release=Upravit vydání release.delete_release=Smazat toto vydání release.deletion=Smazání vydání -release.deletion_desc=Smazáním tohoto vydání se také smaže odpovídající značka. Chcete pokračovat? -release.deletion_success=Vydání bylo úspěšně smazáno! release.tag_name_already_exist=Vydání s touto značkou již existuje. release.tag_name_invalid=Název štítku není platný. release.downloads=Soubory ke stažení @@ -807,9 +674,6 @@ create_new_team=Vytvořit nový tým org_desc=Popis team_name=Název týmu team_desc=Popis -team_name_helper=Tento název budete používat při zmiňovaní týmu v konverzacích. -team_desc_helper=Popište prosím tento tým -team_permission_desc=Jakou úroveň přístupu má mít tento tým? form.name_reserved=Název organizace '%s' je již rezervován. form.name_pattern_not_allowed=Vzor názvu organizace '%s' není povolen. @@ -820,16 +684,11 @@ settings.full_name=Celé jméno settings.website=Webové stránky settings.location=Umístění settings.update_settings=Upravit nastavení -settings.update_setting_success=Nastavení organizace bylo úspěšně upraveno. -settings.change_orgname_prompt=Tato změna ovlivní vztah odkazů k organizaci. -settings.update_avatar_success=Nastavení ikony organizace bylo úspěšně změněno. settings.delete=Smazat organizaci settings.delete_account=Smazat tuto organizaci settings.delete_prompt=Organizace bude trvale smazána a tato změna nemůže být vrácena! settings.confirm_delete_account=Potvrdit smazání settings.delete_org_title=Smazání organizace -settings.delete_org_desc=Organizace bude trvale smazána, chcete pokračovat? -settings.hooks_desc=Přidejte webového háčky, které budou spouštěny nad všemi repositáři této organizace. members.membership_visibility=Viditelnost členství: members.public=Veřejný @@ -849,9 +708,7 @@ teams.leave=Opustit teams.read_access=Právo čtení teams.read_access_helper=Tento tým bude moci prohlížet a klonovat své repositáře. teams.write_access=Právo zápisu -teams.write_access_helper=Tento tým bude schopen jak číst své repositáře, tak do nich nahrávat. teams.admin_access=Přístup správce -teams.admin_access_helper=Tento tým bude schopen odeslat a natáhnout změny do svých repositářů, stejně tak přidat k těmto repositářům další spolupracovníky. teams.no_desc=Tento tým není žádný popis teams.settings=Nastavení teams.owners_permission_desc=Vlastníci mají plný přístup do všech repositářů a jsou správci této organizace. @@ -860,8 +717,6 @@ teams.update_settings=Upravit nastavení teams.delete_team=Smazat tento tým teams.add_team_member=Přidat člena týmu teams.delete_team_title=Smazání týmu -teams.delete_team_desc=Jelikož bude tento tým smazán, jeho členové mohou ztratit přístup do některých repositářů. Chcete pokračovat? -teams.delete_team_success=Daný tým byl úspěšně smazán. teams.read_permission_desc=Členství v tom týmu poskytuje právo čtení: členové mohou číst z a vytvářet klony repositářů týmu. teams.write_permission_desc=Členství v tom týmu poskytuje právo zápisu: členové mohou číst z a nahrávat do repositářů týmu. teams.admin_permission_desc=Členství v tom týmu poskytuje právo správce: členové mohou číst z, nahrávat do a přidávat spolupracovníky do repositářů týmu. @@ -891,23 +746,8 @@ dashboard.statistic_info=Databáze Gitea obsahuje %d uživatelů, %d%s @@ -1162,34 +974,35 @@ comment_issue=`přidal komentář k úkolu %s#%[2]s` merge_pull_request=`sloučil požadavek na stažení %s#%[2]s` transfer_repo=předal repositář %s uživateli/organizaci %s push_tag=nahrál značku %[2]s do %[3]s -compare_commits=Zobrazit porovnání pro tyto %d revize [tool] -ago=před -from_now=od teď +ago=před %s +from_now=od teď %s now=nyní -1s=%s 1 sekundou -1m=%s před jednou minutou -1h=%s jednou hodinou -1d=%s 1 dnem -1w=%s 1 týdnem -1mon=%s 1 měsícem -1y=%s 1 rokem -seconds=%[2]s %[1]d sekundami -minutes=%[2]s %[1]d minutami -hours=%[2]s %[1]d hodinami -days=%[2]s %[1]d dny -weeks=%[2]s %[1]d týdny -months=%[2]s %[1]d měsíci -years=%[2]s %[1]d roky +1s=1 sekundou +1m=jednou minutou +1h=jednou hodinou +1d=1 dnem +1w=1 týdnem +1mon=1 měsícem +1y=1 rokem +seconds=%d sekundami +minutes=%d minutami +hours=%d hodinami +days=%d dny +weeks=%d týdny +months=%d měsíci +years=%d roky raw_seconds=sekund raw_minutes=minut [dropzone] -default_message=Přetáhněte soubory sem nebo stiskněte Nahrát. invalid_input_type=Nelze nahrát soubory tohoto typu. -file_too_big=Velikost souboru ({{filesize}} MB) je vyšší než maximální velikost ({{maxFilesize}} MB). remove_file=Smazat soubor [notification] +[gpg] + +[units] + diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 6398dff..3e56c09 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -5,8 +5,11 @@ dashboard=Übersicht explore=Erkunden help=Hilfe sign_in=Anmelden +sign_in_with=Anmelden mit sign_out=Abmelden sign_up=Registrieren +link_account=Account verbinden +link_account_signin_or_signup=Logge dich mit alten Zugangsdaten ein, um den alten Account mit diesem neuen zu verbinden, oder registriere dich register=Registrieren website=Webseite version=Version @@ -33,16 +36,22 @@ mirror=Mirror new_repo=Neues Repository new_migrate=Neue Migration new_mirror=Neuer Mirror -new_fork=Neues Fork-Repository +new_fork=Neuer Fork new_org=Neue Organisation manage_org=Organisationen verwalten admin_panel=Administration account_settings=Kontoeinstellungen settings=Einstellungen your_profile=Profil -your_starred=Favoriten +your_starred=Deine Favoriten your_settings=Einstellungen +all=Alle +sources=Quellen +mirrors=Mirrors +collaborative=Kollaborativ +forks=Forks + activities=Aktivitäten pull_requests=Pull-Requests issues=Issues @@ -51,8 +60,8 @@ cancel=Abbrechen [install] install=Installation -title=Installationsschritte für den ersten Start -docker_helper=Wenn Gitea innerhalb von Docker läuft, lies bitte den Leitfaden genau durch, bevor du irgendwas auf dieser Seite änderst! +title=Erstkonfiguration +docker_helper=Wenn du Gitea in einem Docker-Container nutzt, lese bitte die Hinweise sorgfältig, bevor du irgendetwas auf dieser Seite änderst. requite_db_desc=Gitea benötigt MySQL, PostgreSQL, SQLite3 oder TiDB. db_title=Datenbankeinstellungen db_type=Datenbanktyp @@ -69,11 +78,11 @@ err_invalid_tidb_name=Der TiDB Datenbankname darf nicht "." und "-" enthalten. no_admin_and_disable_registration=Du kannst Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen. err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein. -general_title=Allgemeine Einstellungen +general_title=Anwendungseinstellungen app_name=Name der Anwendung -app_name_helper=Hier den Namen der Organisation einfügen! +app_name_helper=Du kannst hier den Organisationsnamen eintragen. repo_path=Repository-Verzeichnis -repo_path_helper=Alle Git-Repositories werden in diesem Verzeichnis gespeichert. +repo_path_helper=Alle Remote-Git-Repositories werden in diesem Verzeichnis gespeichert. lfs_path=LFS-Wurzelpfad lfs_path_helper=In diesem Verzeichnis werden die Dateien von Git LFS abgespeichert. Leer lassen um LFS zu deaktivieren. run_user=Ausführender Benutzer @@ -85,7 +94,7 @@ ssh_port_helper=Der Port deines SSH-Servers. Leer lassen um SSH zu deaktivieren. http_port=HTTP Port http_port_helper=Auf diesem Port wird Gitea erreichbar sein. app_url=Anwendungs-URL -app_url_helper=Dies hat Auswirkung auf die HTTP/HTTPS Klon-URLs und den Inhalt der E-Mails. +app_url_helper=Dies hat Auswirkung auf die HTTP/HTTPS Klon-URLs und den Inhalt der E-Mail Benachrichtigungen. log_root_path=Logdateipfad log_root_path_helper=Verzeichnis in das Logdateien geschrieben werden. @@ -94,13 +103,13 @@ email_title=E-Mail-Service Einstellungen smtp_host=SMTP-Server smtp_from=Von smtp_from_helper=Absender-Adresse nach RFC 5322. Entweder nur eine E-Mail Adresse oder im Format: "Name" . -mailer_user=Absender E-Mail +mailer_user=Absender mailer_password=Absender Passwort register_confirm=Registrierungsbestätigung aktivieren -mail_notify=E-Mail-Benachrichtigung aktivieren +mail_notify=E-Mail-Benachrichtigungen aktivieren server_service_title=Server- und sonstige Diensteinstellungen offline_mode=Offline-Modus aktivieren -offline_mode_popup=CDN auch im Produktivmodus deaktivieren. Alle Dateien werden von diesem Server ausgeliefert. +offline_mode_popup=CDN deaktivieren. Alle benötigten Dateien werden von diesem Server ausgeliefert. disable_gravatar=Gravatar-Dienst deaktivieren disable_gravatar_popup=Gravatar und benutzerdefinierte Quellen deaktivieren. Alle Profilbilder werden vom Nutzer hochgeladen oder sind das Standard-Profilbild. federated_avatar_lookup=Suche nach föderierten Profilbildern einschalten @@ -111,7 +120,7 @@ enable_captcha=Captcha aktivieren enable_captcha_popup=Captcha-Eingabe bei der Registrierung erforderlich. require_sign_in_view=Seiten nur für angemeldete Benutzer zugänglich. require_sign_in_view_popup=Nur angemeldete Benutzer können auf alle Seiten zugreifen. Gäste sehen nur die Seiten Anmelden/Registrieren. -admin_setting_desc=`Du musst jetzt kein Administrator-Konto anlegen. Der erste Benutzer (Id=1) erhält automatisch Administrator-Rechte.` +admin_setting_desc=Du musst jetzt kein Administrator-Konto anlegen. Der erste Benutzer, der sich registriert, erhält automatisch Administrator-Rechte. admin_title=Administrator Einstellungen admin_name=Benutzername admin_password=Passwort @@ -120,15 +129,17 @@ admin_email=Administrator E-Mail install_btn_confirm=Gitea installieren test_git_failed=Fehler beim Test des 'git' Kommandos: %v sqlite3_not_available=Deine Gitea-Version unterstützt SQLite3 nicht. Bitte lade die offizielle binäre Version von %s herunter, NICHT die gobuild-Version. -invalid_db_setting=Datenbankeinstellungen sind nicht korrekt: %v +invalid_db_setting=Datenbankeinstellungen sind ungültig: %v invalid_repo_path=Repository Verzeichnis ist ungültig: %v run_user_not_match=Der ausführende Benutzer ist nicht der aktuelle Benutzer: %s -> %s save_config_failed=Fehler beim Speichern der Konfiguration: %v invalid_admin_setting=Admin-Konto Einstellungen sind ungültig: %v -install_success=Herzlich Willkommen! Wir sind froh, dass du dich für Gitea entschieden hast. Wir wünschen viel Vergnügen damit. +install_success=Willkommen! Danke, dass du Gitea gewählt hast. Viel Spaß! invalid_log_root_path=Pfad zum Log-Verzeichnis ist ungültig: %v -default_keep_email_private=Standard-Wert für "Private E-Mail-Adressen" +default_keep_email_private=Standard-Wert für "Private E-Mail-Adressen default_keep_email_private_popup=Das ist der der Standardwert für die Sichtbarkeit der E-Mail-Adresse der Benutzer. Die E-Mail-Adressen aller neu registrierten Benutzer werden versteckt wenn eingeschalten, außer der Benutzer ändert seine Einstellung. +default_allow_create_organization=Berechtigung, die es neuen Benutzern erlaubt Organisationen zu erstellen +default_allow_create_organization_popup=Dies ist die Berechtigung, die neue Benutzer standartmäßig haben. Wenn dies auf "wahr" gesetzt ist, können neue Benutzer Organisationen erstellen. no_reply_address=No-Reply Adresse no_reply_address_helper=Domain für die E-Mail-adresse des Benutzers in den git logs, wenn der Benutzer seine E-Mail privat halten möchte. (z.B. Benutzer 'joe' und 'noreply.example.org' als Einstellung -> 'joe@noreply.example.org') @@ -151,25 +162,26 @@ repos=Repositories users=Benutzer organizations=Organisationen search=Suche -repo_no_results=Es wurden keine passenden Repositories gefunden. -user_no_results=Es wurden keine passenden Benutzer gefunden. -org_no_results=Es wurden keine passenden Organisationen gefunden. +repo_no_results=Es konnten keine passenden Repositories gefunden werden. +user_no_results=Es konnten keine passenden Benutzer gefunden werden. +org_no_results=Es konnten keine passenden Organisation gefunden werden. [auth] -create_new_account=Neues Konto erstellen +create_new_account=Konto erstellen register_helper_msg=Haben Sie bereits ein Konto? Jetzt anmelden! -social_register_helper_msg=Hast du bereits ein Konto? Jetzt verknüpfen! +social_register_helper_msg=Haben Sie bereits ein Konto? Jetzt anmelden! disable_register_prompt=Die Registrierung wurde deaktiviert. Bitte wende dich an den Administrator. disable_register_mail=Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert. remember_me=Angemeldet bleiben -forgot_password=Passwort vergessen -forget_password=Passwort vergessen? +forgot_password_title=Passwort vergessen +forgot_password=Passwort vergessen? sign_up_now=Möchtest du ein Konto? Registriere dich jetzt. -confirmation_mail_sent_prompt=Eine neue Bestätigungs-E-Mail wurde an %s gesendet. Bitte kontrolliere dein Postfach innerhalb der nächsten %d Stunden, um die Registrierung abzuschließen. +confirmation_mail_sent_prompt=Eine neue Bestätigungs-E-Mail wurde an %s gesendet. Bitte kontrolliere dein Postfach innerhalb der nächsten %s, um die Registrierung abzuschließen. +reset_password_mail_sent_prompt=Eine E-Mail wurde an %s gesendet. Bitte kontrolliere dein Postfach innerhalb der nächsten %s, um das Passwort zurückzusetzen. active_your_account=Aktiviere dein Konto prohibit_login=Anmelden verboten -prohibit_login_desc=Die Anmeldung mit diesem Konto ist nicht gestattet. Bitte kontaktiere den Administrator. -resent_limit_prompt=Es tut uns leid, aber du hast bereits eine Aktivierungs-E-Mail angefordert. Bitte warte 3 Minuten und probiere es dann nochmal. +prohibit_login_desc=Dein Account wurde gesperrt, bitte wende dich an den Administrator. +resent_limit_prompt=Du hast bereits eine Aktivierungs-E-Mail angefordert. Bitte warte 3 Minuten und probiere es dann nochmal. has_unconfirmed_mail=Hallo %s, du hast eine unbestätigte E-Mail-Adresse (%s). Wenn du keine Bestätigungs-E-Mail erhalten hast oder eine neue senden möchtest, klicke bitte auf den folgenden Button. resend_mail=Hier klicken, um die Aktivierungs-E-Mail erneut zu versenden email_not_associate=Diese E-Mail-Adresse ist mit keinem Konto verknüpft. @@ -178,20 +190,29 @@ reset_password=Passwort zurücksetzen invalid_code=Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig. reset_password_helper=Hier klicken, um das Passwort zurückzusetzen password_too_short=Das Passwort muss mindenstens %d Zeichen lang sein. -non_local_account=Nicht-lokale Konten können Passwörter nicht via Gitea ändern. +non_local_account=Nicht-Lokale Accounts können ihre Passwörter nicht über das Gitea-Webinterface ändern. verify=Verifizieren scratch_code=Einmalpasswort use_scratch_code=Einmalpasswort verwenden twofa_scratch_used=Du hast dein Einmalpasswort verwendet. Du wurdest zu den Einstellung der Zwei-Faktor-Authentifizierung umgeleitet, dort kannst du dein Gerät abmelden oder ein neues Einmalpasswort erzeugen. twofa_passcode_incorrect=Ungültiger PIN. Wenn du dein Gerät verlegt hast, verwende dein Einmalpasswort. twofa_scratch_token_incorrect=Dein Einmalpasswort ist falsch. +login_userpass=Benutzer / Passwort +login_openid=OpenID +openid_connect_submit=Verbinden +openid_connect_title=Mit bestehendem Account verbinden +openid_connect_desc=Die eingegebene OpenID ist uns unbekannt, du kannst sie mit einem bestehendem Account verbinden. +openid_register_title=Neues Konto einrichten +openid_register_desc=Die eingegebene OpenID ist uns unbekannt, du kannst sie hier mit einem neuen Account verbinden. +openid_signin_desc=Beispiel-URIs: https://anne.me, bob.openid.org.cn, gnusocial.net/carry +disable_forgot_password_mail=Das zurücksetzen von Passwörtern wurde deaktiviert. Bitte kontaktiere den Administrator. [mail] activate_account=Bitte aktiviere dein Konto activate_email=Bestätige deine E-Mail-Adresse reset_password=Passwort zurücksetzen -register_success=Registrierung erfolgreich, Willkommen -register_notify=Willkommen an Bord +register_success=Registrierung erfolgreich +register_notify=Willkommen bei Gitea [modal] yes=Ja @@ -219,8 +240,9 @@ TreeName=Dateipfad Content=Inhalt require_error=` darf nicht leer sein.` -alpha_dash_error=` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.` -alpha_dash_dot_error=` kann ausschließlich alphanumerische Zeichen und ".-_" enthalten.` +alpha_dash_error=` kann ausschließlich alphanumerische Zeichen und (-_) enthalten.` +alpha_dash_dot_error=` müssen gültige alphanumerische, dash(-_) oder Punkt-Zeichen sein. ` +git_ref_name_error=` muss ein wohlgeformter Git-Referenzname sein ` size_error=` muss die Größe %s haben.` min_size_error=` muss mindestens %s Zeichen enthalten.` max_size_error=` darf höchstens %s Zeichen enthalten.` @@ -232,24 +254,29 @@ captcha_incorrect=Captcha stimmt nicht überein. password_not_match=Die Passwörter stimmen nicht überein. username_been_taken=Benutzername ist bereits vergeben. -repo_name_been_taken=Repository-Name ist bereits vergeben. -org_name_been_taken=Organisationsname ist bereits vergeben. -team_name_been_taken=Teamname ist bereits vergeben. +repo_name_been_taken=Dieser Repository-Name wird schon verwendet. +org_name_been_taken=Name der Organisation wird bereits verwendet. +team_name_been_taken=Teamname ist bereits vorhanden. +team_no_units_error=Das Team muss mindestens eine Einheit aktiviert haben. email_been_used=E-Mail-Adresse wird bereits verwendet. -username_password_incorrect=Benutzername oder Passwort ist nicht korrekt. +openid_been_used=OpenID-Adresse "%s" wurde bereits verwendet. +username_password_incorrect=Falscher Benutzername oder Passwort. enterred_invalid_repo_name=Bitte achte darauf, dass der eingegebene Repository-Name korrekt ist. enterred_invalid_owner_name=Bitte achte darauf, dass der eingegebene Name des Besitzers korrekt ist. enterred_invalid_password=Bitte achte darauf, dass das eingegebene Passwort richtig ist. -user_not_exist=Angegebener Benutzer existiert nicht. -last_org_owner=Entfernen des letzten Mitglieds aus einem Eigentümer-Team ist nicht zulässig, da es immer mindestens einen Eigentümer je Organisation geben muss. +user_not_exist=Dieser Benutzer ist nicht vorhanden. +last_org_owner=Entfernen des letzten Mitglieds aus einem Eigentümer-Team ist nicht zulässig, da es immer mindestens einen Eigentümer pro Organisation geben muss. +cannot_add_org_to_team=Organisationen können nicht als Teammitglied hinzugefügt werden. +cannot_invite_org_to_org=Organisationen können nicht in Teams eingeladen werden. invalid_ssh_key=Leider konnte der SSH-Schlüssel vom Server nicht überprüfen werden: %s -unable_verify_ssh_key=Gitea kann deinen SSH-Schlüssel nicht überprüfen, nimmt aber an, dass er gültig ist. Bitte stell das sicher. +invalid_gpg_key=Leider konnte der GPG-Schlüssel vom Server nicht überprüft werden: %s +unable_verify_ssh_key=Bitte überprüfe den SSH-Schlüssel nochmal, da er nicht verifiziert werden konnte. auth_failed=Authentifizierung fehlgeschlagen: %v -still_own_repo=Dein Konto besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden. -still_has_org=Du bist noch Mitglied bei mindestens einer Organisation. Du musst alle Organisationen verlassen oder löschen. -org_still_own_repo=Diese Organisation besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden. +still_own_repo=Dein Konto ist noch der Besitzer von mindestens einer Repository. Bitte lösche oder transferiere diese zuerst. +still_has_org=Ihr Konto ist noch ein Mitglied mindestens einer Organisation, du musst diese zuerst verlassen. +org_still_own_repo=Diese Organisation besitzt noch Repositories, diese musst du vorher löschen oder transferieren. target_branch_not_exist=Ziel-Branch existiert nicht @@ -271,24 +298,26 @@ form.name_pattern_not_allowed=Benutzernamen der Form '%s' sind nicht erlaubt. profile=Profil password=Passwort avatar=Profilbild -ssh_keys=SSH-Schlüssel +ssh_gpg_keys=SSH / GPG Schlüssel social=Soziale Konten applications=Anwendungen orgs=Organisationen delete=Konto löschen twofa=Zwei-Faktor-Authentifizierung +account_link=Externe Accounts +organization=Organisation uid=Uid public_profile=Öffentliches Profil profile_desc=Deine E-Mail-Adresse ist öffentlich einsehbar und dient dazu, dir Benachrichtigungen bezüglich deines Kontos sowie Aktivitäten auf der Webseite zukommen zu lassen. -password_username_disabled=Nicht-lokalen Benutzern ist es nicht erlaubt, ihren Benutzernamen zu ändern. +password_username_disabled=Nutzer, die nicht von Gitea verwaltet sind, können ihren Benutzernamen nicht ändern. Bitte kontaktiere den Gitea-Administrator für mehr Details. full_name=Vollständiger Name website=Webseite location=Standort update_profile=Profil aktualisieren -update_profile_success=Dein Profil wurde erfolgreich aktualisiert. +update_profile_success=Ihr Profil wurde aktualisiert. change_username=Benutzername geändert -change_username_prompt=Diese Änderung wirkt sich auf die Links zu deinem Profil aus. +change_username_prompt=Diese Änderung wird den Link zu Ihrem Profil ändern. continue=Weiter cancel=Abbrechen @@ -307,88 +336,121 @@ new_password=Neues Passwort retype_new_password=Neues Passwort erneut eingeben password_incorrect=Aktuelles Passwort ist nicht korrekt. change_password_success=Dein Passwort wurde geändert. Du kannst dich jetzt mit deinem neuen Passwort anmelden. -password_change_disabled=Nicht-lokalen Benutzern ist es nicht erlaubt, ihr Passwort zu ändern. +password_change_disabled=Nicht-lokale Benutzer dürfen nicht ihr Kennwort über das Webinterface ändern. emails=E-Mail-Adressen manage_emails=E-Mail-Adressen verwalten +manage_openid=OpenID-Adressen verwalten email_desc=Deine primäre E-Mail-Adresse wird für Benachrichtigungen und andere Funktionen verwendet. primary=Primär primary_email=Als primäre Adresse verwenden delete_email=Löschen -email_deletion=E-Mail löschen -email_deletion_desc=Das Löschen dieser E-Mail Adresse wird alle Informationen entfernen, die mit dieser E-Mail Adresse verknüpft sind. Wollen Sie fortfahren? +email_deletion=E-Mail-Adresse löschen +email_deletion_desc=Wenn du diese E-Mail-Adresse löschst, werden alle mit deinem Konto verknüpften Informationen verloren gehen. Git commits, die mit dieser E-Mail ausgeführt werden, bleiben ungeändert. Willst du fortfahren? email_deletion_success=E-Mail-Adresse wurde erfolgreich gelöscht! +openid_deletion=OpenID Löschen +openid_deletion_desc=Du wirst dich nicht mehr mit dieser OpenID anmelden können, wenn du sie löschst. Weiter? +openid_deletion_success=OpenID wurde erfolgreich gelöscht! add_new_email=Neue E-Mail-Adresse hinzufügen +add_new_openid=Neue OpenID-URI hinzufügen add_email=E-Mail-Adresse hinzufügen -add_email_confirmation_sent=Eine neue Bestätigungsmail wurde an '%s' gesendet, bitte überprüfe deinen Posteingang innerhalb von %d Stunden um die E-Mail-Adresse zu bestätigen. +add_openid=OpenID-URI hinzufügen +add_email_confirmation_sent=Eine neue Bestätigungs-E-Mail wurde an '%s' gesendet. Kontrolliere dein Postfach innerhalb der nächsten %s, um die Verifizierung abzuschließen. add_email_success=Dein neue E-Mail-Adresse wurde erfolgreich hinzugefügt. -keep_email_private=Private E-Mail-Adressen +add_openid_success=Deine neue OpenID-Adresse wurde erfolgreich hinzugefügt. +keep_email_private=E-Mail-Adresse nicht veröffentlichen keep_email_private_popup=Deine E-Mail-Adresse wird vor anderen Benutzern versteckt, wenn diese Option gesetzt ist. +openid_desc=Mit deinen OpenID-Adressen kannst du die Authentifizierung an einen provider deiner Wahl delegieren manage_ssh_keys=SSH-Schlüssel verwalten +manage_gpg_keys=GPG-Schlüssel verwalten add_key=Schlüssel hinzufügen ssh_desc=Dies ist eine Liste aller SSH-Schlüssel, die deinem Konto zugeordnet sind. Bitte entferne alle Schlüssel, die dir unbekannt sind. +gpg_desc=Dies ist eine Liste aller GPG-Schlüssel, die deinem konto zugeordnet sind. Bitte entferne alle Schlüssel, die dir unbekannt sind. ssh_helper=Brauchst du Hilfe? Hier ist eine Anleitung zum Erzeugen von SSH-Schlüsseln oder Lösen einfacher SSH-Probleme. +gpg_helper=Brauchst du Hilfe? Hier ist GitHubs Anleitung über GPG. add_new_key=SSH-Schlüssel hinzufügen -ssh_key_been_used=Inhalt des öffentlichen Schlüssels wurde verwendet. -ssh_key_name_used=Ein öffentlicher Schlüssel mit diesem Namen existiert bereits. +add_new_gpg_key=GPG-Schlüssel hinzufügen +ssh_key_been_used=Dieser öffentliche Schlüssel wird bereits verwendet. +ssh_key_name_used=Ein öffentlicher Schlüssel mit demselben Namen ist bereits vorhanden. +gpg_key_id_used=Ein öffentlicher GPG-Schlüssel mit der gleichen ID existiert bereits. +gpg_key_email_not_found=Folgende mit dem GPG-Schlüssel verbundene E-Mail konnte nicht gefunden werden oder ist noch nicht bestätigt: %s +subkeys=Unterschlüssel +key_id=Schlüssel-ID key_name=Schlüsselname key_content=Inhalt -add_key_success=Neuer SSH-Schlüssel '%s' wurde erfolgreich hinzugefügt! +add_key_success=Ihr SSH-Schlüssel "%s" wurde hinzugefügt. +add_gpg_key_success=Ihr GPG-Schlüssel "%s" wurde hinzugefügt. delete_key=Löschen ssh_key_deletion=SSH-Schlüssel löschen -ssh_key_deletion_desc=Alle zu diesem SSH-Schlüssel zugehörigen Zugriffsberechtigungen auf dein Konto werden entfernt. Möchtest du fortfahren? -ssh_key_deletion_success=SSH-Schlüssel wurde erfolgreich gelöscht! +gpg_key_deletion=GPG-Schlüssel löschen +ssh_key_deletion_desc=Wenn du diesen SSH-Schlüssel löschst, wirst du nicht mehr in der Lage sein, dich mit diesem Schlüssel auf deinem Account anzumelden. Fortfahren? +gpg_key_deletion_desc=Wenn du diesen GPG-Schlüssel löschst, werden alle Commits, die damit signiert wurden als unsigniert makiert. Fortfahren? +ssh_key_deletion_success=Der SSH-Schlüssel wurde gelöscht. +gpg_key_deletion_success=Der GPG-Schlüssel wurde gelöscht. add_on=Hinzugefügt am +valid_until=Gültig bis +valid_forever=Gültig für immer last_used=Zuletzt verwendet am no_activity=Keine neuen Aktivitäten key_state_desc=Dieser Schlüssel wurde in den letzten 7 Tagen verwendet token_state_desc=Dieses Token wurde in den letzten 7 Tagen benutzt +show_openid=Im Profil anzeigen +hide_openid=Nicht im Profil anzeigen manage_social=Verknüpfte soziale Konten verwalten -social_desc=Dies ist eine Liste verknüpfter sozialer Konten. Bitte entferne alle Verknüpfungen, die dir nicht bekannt sind. +social_desc=Dies ist eine Liste der zugeordneten Konten von sozialen Netzwerken. Bitte stelle sicher, dass du alle dieser Accounts kennst, da sie benutzt werden können, um sich mit deinem Account anzumelden. unbind=Verknüpfung entfernen -unbind_success=Die Verknüpfung zum sozialen Konto wurde entfernt. +unbind_success=Das Social-Konto wurde von deinem Account entfernt. manage_access_token=Verwaltung persönlicher Zugangs-Token generate_new_token=Neuen Token erzeugen -tokens_desc=Die von Ihnen erzeugten Token können zum Zugriff auf die Gitea-API verwendet werden. +tokens_desc=Von dir erzeugten Token, können zum Zugriff auf die Gitea-API verwendet werden. new_token_desc=Jeder Token ermöglicht vollen Zugriff auf dein Konto. token_name=Token-Name generate_token=Token generieren -generate_token_succees=Dein Zugangs-Token wurde erfolgreich generiert! Stelle sicher, dass du den Token kopiert hast, da du ihn später nicht mehr betrachten kannst! +generate_token_success=Dein Zugangs-Token wurde erfolgreich erstellt! Denk daran, es jetzt gleich zu kopieren, später wirst du es nicht mehr sehen! delete_token=Löschen access_token_deletion=Persönlichen Token entfernen -access_token_deletion_desc=Das Löschen dieses persönlichen Zugangs-Tokens wird alle zugehörigen Zugriffe der Anwendung entfernen. Möchtest du fortfahren? -delete_token_success=Persönlicher Zugriffs-Token wurde erfolgreich entfernt! Vergiss nicht deine Anwendungen zu aktualisieren. +access_token_deletion_desc=Wenn du dieses Zugangs-Token löschst, wird das der Zugang für sämtliche Applikationen, die es nutzen, nicht mehr möglich sein. Fortfahren? +delete_token_success=Das persönliche Zugangstoken wurde erfolgreich entfernt! Vergiss nicht, es aus Apps zu entfernen, welche es nutzen. -twofa_desc=Gitea unterstützt Zwei-Faktor-Authentifizierung um dir eine erhöhte Sicherheit deines Accounts bieten zu können. -twofa_is_enrolled=Für dein Konto ist die Zwei-Faktor-Authentifizierung eingeschalten. -twofa_not_enrolled=Für dein Konto ist momentan die Zwei-Faktor-Authentifizierung nicht eingeschalten. +twofa_desc=Gitea unterstützt Zwei-Faktor-Authentifizierung, um dir eine erhöhte Sicherheit deines Accounts bieten zu können. +twofa_is_enrolled=Für dein Konto ist die Zwei-Faktor-Authentifizierung eingeschaltet. +twofa_not_enrolled=Für dein Konto ist momentan die Zwei-Faktor-Authentifizierung nicht eingeschaltet. twofa_disable=Zwei-Faktor-Authentifizierung deaktivieren twofa_scratch_token_regenerate=Neues Einmalpasswort erstellen twofa_scratch_token_regenerated=Ein neues Einmalpasswort wurde generiert. Es lautet %s. Bewahre es an einem sicheren Ort auf. twofa_enroll=Zwei-Faktor-Authentifizierung aktivieren twofa_disable_note=Du kannst Zwei-Faktor-Authentifizierung auch deaktivieren. -twofa_disable_desc=Die Deaktivierung von Zwei-Faktor-Authentifizierung wird dein Benutzerkonto weniger sicher machen. Möchtest du wirklich fortfahren? -regenerate_scratch_token_desc=Wenn du dein Einmalpasswort verlegt oder du dich damit eingeloggt hast, kannst du es zurücksetzen. +twofa_disable_desc=Die Deaktivierung von Zwei-Faktor-Authentifizierung wird die Sicherheit deines Kontos verringern. Möchtest du wirklich fortfahren? +regenerate_scratch_token_desc=Wenn du dein Einmalpasswort verlegt oder du dich damit eingeloggt hast, kannst du es hier zurücksetzen. twofa_disabled=Zwei-Faktor-Authentifizierung wurde deaktiviert. scan_this_image=Scanne dieses Grafik mit deiner Authentifizierungs-App: or_enter_secret=Oder gib das Secret ein: %s -then_enter_passcode=Dann gib den PIN ein, die Anwendung gibt dir zurück: +then_enter_passcode=Und gebe den PIN ein, die die Anwendung dir gibt: passcode_invalid=Der PIN ist ungültig. Versuche es erneut. twofa_enrolled=Die Zwei-Faktor-Authentifizierung ist jetzt für dein Konto aktiviert. Vergewissere dich, dass du das Einmalpasswort (%s) gespeichert hast, da es nur einmal angezeigt wird! +manage_account_links=Verknüpfte Konten verwalten +manage_account_links_desc=Externe, mit diesem Accounts verknüpfte Accounts +account_links_not_available=Es sind keine externen Accounts mit diesem verknüpft +remove_account_link=Verknüpftes Konto entfernen +remove_account_link_desc=Das Löschen dieses Kontos wird sämtlichen verbundenen Zugang zu deinem Account entfernen. Fortfahren? +remove_account_link_success=Verknüpftes Konto wurde erfolgreich entfernt! + +orgs_none=Sie sind kein Mitglied einer Organisation. + delete_account=Konto löschen delete_prompt=Diese Aktion wird dein Konto dauerhaft löschen und kann NICHT rückgängig gemacht werden! confirm_delete_account=Löschvorgang bestätigen delete_account_title=Konto löschen -delete_account_desc=Du bist dabei dieses Konto dauerhaft zu löschen. Möchten du wirklich fortfahren? +delete_account_desc=Sind Sie sicher, dass Sie dieses Konto dauerhaft löschen möchten? [repo] owner=Besitzer repo_name=Repository-Name -repo_name_helper=Ein guter Repository-Name besteht gewöhnlich aus kurzen, leicht zu merkenden und eindeutigen Schlüsselworten. +repo_name_helper=Ein guter Repository-Name besteht normalerweise aus kurzen, unvergessliche und einzigartige Schlagwörtern. visibility=Sichtbarkeit visiblity_helper=Dieses Repository ist privat visiblity_helper_forced=Der Administrator hat festgelegt, dass alle neuen Repositories privat sein müssen @@ -408,8 +470,9 @@ auto_init=Repository mit ausgewählten Dateien und Vorlagen initialisieren create_repo=Repository erstellen default_branch=Standard-Branch mirror_prune=Entfernen -mirror_prune_desc=Entferne alle Verweise auf nicht mehr existierende entfernte Repositories -mirror_interval=Mirror-Intervall (in Stunden) +mirror_prune_desc=Entferne alle Verweise auf nicht mehr existierende Remote-Repositories +mirror_interval=Spiegel Intervall (gültige Zeiteinheiten sind "h", "m", "s") +mirror_interval_invalid=Spiegel-Intervall ist nicht gültig mirror_address=Mirror-Adresse mirror_address_desc=Bitte die nötigen Zugangsdaten in die Adresse mit aufnehmen. mirror_last_synced=Zuletzt synchronisiert @@ -417,8 +480,8 @@ watchers=Beobachter stargazers=In Favoriten von forks=Forks -form.reach_limit_of_creation=Der Besitzer hat die maximale Anzahl von %d erstellbaren Repositories erreicht. -form.name_reserved=Repository-Name '%s' ist reserviert. +form.reach_limit_of_creation=Sie haben bereits das Limit von %d Repositories erreicht. +form.name_reserved=Der Repository-Name '%s' ist reserviert. form.name_pattern_not_allowed=Repository-Namen der Form '%s' sind nicht erlaubt. need_auth=Authorisierung benötigt @@ -428,12 +491,14 @@ migrate_repo=Repository migrieren migrate.clone_address=Adresse kopieren migrate.clone_address_desc=Dies kann eine HTTP/HTTPS/GIT URL oder ein lokaler Serverpfad sein. migrate.clone_local_path=oder Pfad auf dem lokalen Server -migrate.permission_denied=Ihnen fehlen die Rechte zum Importieren lokaler Repositories. +migrate.permission_denied=Dir wurde die Berechtigung zum Importieren lokaler Repositories nicht erteilt. migrate.invalid_local_path=Der lokale Pfad ist ungültig, existiert nicht oder ist kein Ordner. migrate.failed=Fehler bei Migration: %v +migrate.lfs_mirror_unsupported=Spiegelung von LFS-Objekten wird nicht unterstützt - nutze stattdessen 'git lfs fetch --all' and 'git lfs push --all'. mirror_from=Mirror von forked_from=geforkt von +fork_from_self=Du kannst kein Repository forken, das dir gehört! copy_link=Kopieren copy_link_success=Kopiert! copy_link_error=Drücke ⌘-C oder Strg-C zum Kopieren @@ -449,10 +514,11 @@ no_desc=Keine Beschreibung quick_guide=Kurzanleitung clone_this_repo=Dieses Repository klonen create_new_repo_command=Erstelle ein neues Repository mittels der Kommandozeile -push_exist_repo=Bestehendes Repository von der Kommandozeile pushen -repo_is_empty=Dieses Repository ist leer. Bitte komm später wieder! +push_exist_repo=Bestehendes Repository via Kommandozeile pushen +bare_message=Diese Repository hat noch keinen Inhalt. code=Code +code.desc=Code ist der Speicherort des Codes branch=Branch tree=Struktur filter_branch_and_tag=Nach Branch oder Tag filtern @@ -471,12 +537,13 @@ file_permalink=Permalink file_too_large=Diese Datei ist zu groß zum Anzeigen video_not_supported_in_browser=Dein Browser unterstützt den HTML5 Video-Tag nicht. stored_lfs=Gespeichert mit Git LFS +commit_graph=Commit graph editor.new_file=Neue Datei editor.upload_file=Datei hochladen editor.edit_file=Datei bearbeiten editor.preview_changes=Vorschau der Änderungen -editor.cannot_edit_non_text_files=Nicht-Text Dateien können nicht bearbeitet werden +editor.cannot_edit_non_text_files=Binärdateien können nicht über das Web-Interface bearbeitet werden editor.edit_this_file=Datei bearbeiten editor.must_be_on_a_branch=Sie müssen sich in einem Branch befinden, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen editor.fork_before_edit=Du musst die Repository forken um die Datei bearbeiten zu können @@ -510,17 +577,25 @@ editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: editor.add_subdir=Unterverzeichnis erstellen... editor.unable_to_upload_files=Fehler beim Hochladen der Dateien zu '%s'. Fehler: %v editor.upload_files_to_dir=Dateien hochladen nach '%s' +editor.cannot_commit_to_protected_branch=Auf die geschützte Branch "%s" kann nicht geschrieben werden. +commits.desc=Commits zeigen die Änderungshistorie des Codes commits.commits=Commits commits.search=Commits durchsuchen -commits.search_all=Alle -commits.find=Finden +commits.find=Suchen +commits.search_all=Alle Branches commits.author=Autor commits.message=Nachricht commits.date=Datum commits.older=Älter commits.newer=Neuer +commits.signed_by=Signiert von +commits.gpg_key_id=GPG Schlüssel ID +ext_issues=Ext Issues +ext_issues.desc=Externe Issues zu einer externen Website zuweisen + +issues.desc=Issues ist der Platz zum Verwalten der Aufgaben und Fehler issues.new=Neues Issue issues.new.labels=Label issues.new.no_label=Kein Label @@ -542,11 +617,12 @@ issues.label_templates.info=Es sind noch keine Label vorhanden. Du kannst vordef issues.label_templates.helper=Wähle ein Label issues.label_templates.use=Dieses Label Set benutzen issues.label_templates.fail_to_load_file=Fehler beim Laden der Label Template Datei '%s': %v -issues.add_label_at=`fügte hinzu
%s
label %s` -issues.remove_label_at=`entfernte
%s
label %s` +issues.add_label_at=`fügte hinzu
%s
label %s` +issues.remove_label_at=`entfernte
%s
label %s` issues.add_milestone_at=`fügte das Issue zum %s Meilenstein hinzu %s` issues.change_milestone_at=`änderte den Meilenstein von %s zu %s %s` issues.remove_milestone_at=`entfernte das Issue vom %s Meilenstein %s` +issues.deleted_milestone=`(gelöscht)` issues.self_assign_at=`wies sich das Issue selbst zu %s` issues.add_assignee_at=`wurde zugewiesen von %s %s` issues.remove_assignee_at=`entfernte seine Zuweisung %s` @@ -562,8 +638,8 @@ issues.filter_assignee=Zuständig issues.filter_assginee_no_select=Keine Zuständigkeit ausgewählt issues.filter_type=Typ issues.filter_type.all_issues=Alle Issues -issues.filter_type.assigned_to_you=Ihnen zugewiesen -issues.filter_type.created_by_you=Von Ihnen erstellt +issues.filter_type.assigned_to_you=Dir zugewiesen +issues.filter_type.created_by_you=Von dir erstellt issues.filter_type.mentioning_you=Erwähnt Sie issues.filter_sort=Sortieren issues.filter_sort.latest=Neueste @@ -572,6 +648,13 @@ issues.filter_sort.recentupdate=Kürzlich aktualisiert issues.filter_sort.leastupdate=Am längsten nicht aktualisiert issues.filter_sort.mostcomment=Am meisten kommentiert issues.filter_sort.leastcomment=Am wenigsten kommentiert +issues.action_open=Offen +issues.action_close=Schließen +issues.action_label=Label +issues.action_milestone=Meilenstein +issues.action_milestone_no_select=Kein Meilenstein +issues.action_assignee=Zuständig +issues.action_assignee_no_select=Niemand zuständig issues.opened_by=%[1]s geöffnet von %[3]s issues.opened_by_fake=geöffnet %[1]s von %[2]s issues.previous=Vorherige @@ -605,14 +688,19 @@ issues.label_edit=Bearbeiten issues.label_delete=Löschen issues.label_modify=Label ändern issues.label_deletion=Label löschen -issues.label_deletion_desc=Das Label wird von allen verknüpften Issues entfernt. Möchtest du fortfahren? -issues.label_deletion_success=Label wurde erfolgreich gelöscht! +issues.label_deletion_desc=Durch das löschen des Labels wird dieses von jeden Issues entfernt. Bist du dir sicher? +issues.label_deletion_success=Das Label wurde erfolgreich gelöscht! issues.label.filter_sort.alphabetically=Alphabetisch issues.label.filter_sort.reverse_alphabetically=Umgekehrt alphabetisch +issues.label.filter_sort.by_size=Größe +issues.label.filter_sort.reverse_by_size=Umgekehrte Größe issues.num_participants=%d Beteiligte issues.attachment.open_tab=`Klicken um "%s" in einem neuen Tab zu öffnen` issues.attachment.download=`Klicken um "%s" herunterzuladen` +issues.subscribe=Abonnieren +issues.unsubscribe=Abbestellen +pulls.desc=Pull-Requests helfen dir deinen Code zu überprüfen und neuen Code mit der Codebasis zusammenzuführen pulls.new=Neuer Pull-Request pulls.compare_changes=Änderungen vergleichen pulls.compare_changes_desc=Zwei Branches vergleichen und einen Pull-Request für die Änderungen erstellen. @@ -628,24 +716,24 @@ pulls.merged_title_desc=hat %[1]d Commits von %[2]s nach %[3] pulls.tab_conversation=Diskussion pulls.tab_commits=Commits pulls.tab_files=Geänderte Dateien -pulls.reopen_to_merge=Bitte diesen Pull-Request wieder eröffnen, um die Merge-Operation auszuführen. +pulls.reopen_to_merge=Bitte diesen Pull-Request wieder öffnen, um die Merge-Operation auszuführen. pulls.merged=Zusammengeführt -pulls.has_merged=Dieser Pull-Request wurde erfolgreich zusammengeführt! +pulls.has_merged=Dieser Pull-Request wurde erfolgreich zusammengeführt. pulls.data_broken=Die Daten dieses Pull-Requests sind defekt, da Fork-Informationen gelöscht wurden. pulls.is_checking=Die Konfliktprüfung läuft noch. Bitte aktualisiere die Seite in wenigen Augenblicken. pulls.can_auto_merge_desc=Dieser Pull-Request kann automatisch zusammengeführt werden. pulls.cannot_auto_merge_desc=Dieser Pull-Request kann nicht automatisch zusammengeführt werden, da es Konflikte gibt. pulls.cannot_auto_merge_helper=Bitte manuell zusammenführen, um die Konflikte zu lösen. pulls.merge_pull_request=Pull-Request zusammenführen -pulls.open_unmerged_pull_exists=`Sie können diesen Pull-Request nicht wieder öffnen, da bereits ein offener Pull-Request (#%d) aus dem selben Repository mit den gleichen Merge-Informationen existiert und auf das Zusammenführen wartet.` +pulls.open_unmerged_pull_exists=`Du kannst diesen Pull-Request nicht wieder öffnen, da bereits ein offener Pull-Request (#%d) aus dem selben Repository mit den gleichen Merge-Informationen existiert und auf das Zusammenführen wartet.` milestones.new=Neuer Meilenstein milestones.open_tab=%d offen milestones.close_tab=%d geschlossen milestones.closed=Geschlossen %s milestones.no_due_date=Kein Fälligkeitsdatum -milestones.open=Offen -milestones.close=Geschlossen +milestones.open=Öffnen +milestones.close=Schließen milestones.new_subheader=Erstelle Meilensteine um Issues zu organisieren. milestones.create=Meilenstein erstellen milestones.title=Titel @@ -669,9 +757,13 @@ milestones.filter_sort.most_complete=Vollständigste milestones.filter_sort.most_issues=Meiste Issues milestones.filter_sort.least_issues=Wenigste Issues +ext_wiki=Ext Wiki +ext_wiki.desc=Externe Wiki Links zu einer externen Website + wiki=Wiki -wiki.welcome=Willkommen im Wiki! +wiki.welcome=Willkommen im Wiki wiki.welcome_desc=Im Wiki kann das Projekt gemeinsam dokumentiert werden. +wiki.desc=Das Wiki ist der Platz für Dokumentationen wiki.create_first_page=Erstelle die erste Seite wiki.page=Seite wiki.filter_page=Seite filtern @@ -682,12 +774,13 @@ wiki.last_commit_info=%s hat diese Seite bearbeitet %s wiki.edit_page_button=Bearbeiten wiki.new_page_button=Neue Seite wiki.delete_page_button=Seite löschen -wiki.delete_page_notice_1=Die Seite "%s" wird gelöscht. Bitte sei vorsichtig. +wiki.delete_page_notice_1=Die Seite "%s" wird gelöscht. Bitte stelle sicher, dass das deine Absicht ist. wiki.page_already_exists=Eine Wiki-Seite mit dem gleichen Namen existiert bereits. wiki.pages=Seiten wiki.last_updated=Zuletzt aktualisiert %s settings=Einstellungen +settings.desc=In den Einstellungen kannst du die Einstellungen des Repository anpassen settings.options=Optionen settings.collaboration=Zusammenarbeit settings.collaboration.admin=Adminrechte @@ -699,7 +792,7 @@ settings.githooks=Git-Hooks settings.basic_settings=Grundeinstellungen settings.mirror_settings=Mirror Einstellungen settings.sync_mirror=Jetzt synchronisieren -settings.mirror_sync_in_progress=Mirror Synchronisierung läuft, bitte die Seite in ca. einer Minute neu laden. +settings.mirror_sync_in_progress=Mirror sync wird ausgeführt. Bitte lade die Seite in einer Minute neu. settings.site=Offizielle Webseite settings.update_settings=Einstellungen speichern settings.advanced_settings=Erweiterte Einstellungen @@ -707,11 +800,13 @@ settings.wiki_desc=Wiki einschalten settings.use_internal_wiki=Eingebautes Wiki verwenden settings.use_external_wiki=Externes Wiki verwenden settings.external_wiki_url=Externe Wiki URL +settings.external_wiki_url_error=Externe Wiki-URL ist ungültig settings.external_wiki_url_desc=Besucher werden auf diese URL umgeleitet, wenn sie auf den Tab klicken. settings.issues_desc=Issue-Tracker einschalten settings.use_internal_issue_tracker=Eingebauten Issue-Tracker verwenden settings.use_external_issue_tracker=Externes Issue-System verwenden settings.external_tracker_url=URL eines externen Issue Trackers +settings.external_tracker_url_error=URL des externen Issue-Systems ist ungültig settings.external_tracker_url_desc=Besucher werden auf diese URL umgeleitet, wenn sie auf den Tab klicken. settings.tracker_url_format=URL-Format des externen Issue-Systems settings.tracker_issue_style=Namenskonvention des externen Issue-Trackers: @@ -729,22 +824,22 @@ settings.convert_succeed=Das Repository wurde erfolgreich in ein normales Reposi settings.transfer=Besitz übertragen settings.transfer_desc=Dieses Repository auf einen anderen Benutzer bzw. eine Organisation in der du Admin-Rechte hast, übertragen. settings.transfer_notices_1=- Du wirst keinen Zugriff mehr haben, wenn der neue Besitzer ein individueller Benutzer ist. -settings.transfer_notices_2=- Du wirst weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und du einer der Besitzer sind. -settings.transfer_form_title=Bitte gib eine die folgenden Informationen ein, um die Operation zu bestätigen: +settings.transfer_notices_2=- Du wirst weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und du einer der Besitzer bist. +settings.transfer_form_title=Bitte gib die folgenden Informationen ein, um die Operation zu bestätigen: settings.wiki_delete=Wiki-Daten löschen settings.wiki_delete_desc=Das Löschen von Wiki Daten kann nicht rückgängig gemacht werden. Bitte seien Sie vorsichtig. settings.wiki_delete_notices_1=- Dies löscht und deaktiviert das Wiki für %s -settings.wiki_deletion_success=Repository Wiki Daten erfolgreich gelöscht. +settings.wiki_deletion_success=Repository Wiki Daten wurden erfolgreich gelöscht. settings.delete=Dieses Repository löschen settings.delete_desc=Wenn dieses Repository gelöscht wurde, gibt es keinen Weg zurück. Bitte sei vorsichtig. settings.delete_notices_1=- Diese Operation kann NICHT rückgängig gemacht werden. settings.delete_notices_2=- Die Operation wird alles, was mit diesem Git-Repository verbunden ist, dauerhaft löschen, inklusive der Daten, Issues, Kommentare und Zugriffsrechte von Mitarbeitern. settings.delete_notices_fork_1=- Nach dem Löschen werden alle Forks unabhängig. -settings.deletion_success=Repository wurde erfolgreich gelöscht! -settings.update_settings_success=Repository-Optionen aktualisiert. +settings.deletion_success=Das Repository würde gelöscht. +settings.update_settings_success=Repository Einstellungen wurden aktualisiert. settings.transfer_owner=Neuer Besitzer settings.make_transfer=Transfer starten -settings.transfer_succeed=Das Repository wurde erfolgreich übertragen. +settings.transfer_succeed=Repository-Eigentum wurde übertragen. settings.confirm_delete=Löschen settings.add_collaborator=Mitarbeiter hinzufügen settings.add_collaborator_success=Neuer Mitarbeiter wurde hinzugefügt. @@ -762,7 +857,7 @@ settings.webhook_deletion_desc=Das Löschen dieses Webhooks wird alle zugehörig settings.webhook_deletion_success=Webhook wurde erfolgreich entfernt! settings.webhook.test_delivery=Senden testen settings.webhook.test_delivery_desc=Sendet ein simuliertes Push-Ereignis, um die Webhook-Einstellungen zu testen -settings.webhook.test_delivery_success=Test-Webhook wurde zur Auslieferungswarteschlange hinzugefügt. Es kann einige Sekunden dauern, bevor es in der Auslieferungshistorie erscheint. +settings.webhook.test_delivery_success=Test-Webhook wurde zur Auslieferungswarteschlange hinzugefügt. Es kann einige Sekunden dauern, bevor er in der Auslieferungshistorie erscheint. settings.webhook.request=Anfrage settings.webhook.response=Antwort settings.webhook.headers=Kopfzeilen @@ -773,7 +868,7 @@ settings.githook_edit_desc=Wenn ein Hook inaktiv ist, wird der Standardinhalt be settings.githook_name=Hook-Name settings.githook_content=Hook-Inhalt settings.update_githook=Hook aktualisieren -settings.add_webhook_desc=Gitea sendet einen POST-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du empfangen möchtest (JSON, x-www-form-urlencoded, etc). Mehr Informationen findest du im Webhooks Guide. +settings.add_webhook_desc=Gitea sendet einen POST-Request an die unten stehende URL mit Details aller abonnierten Ereignisse. Du kannst auch angeben, welches Datenformat du empfangen möchtest (JSON, x-www-form-urlencoded, etc.). Mehr Informationen findest du im Webhooks Guide. settings.payload_url=Payload-URL settings.content_type=Inhaltstyp settings.secret=Secret @@ -791,7 +886,7 @@ settings.event_pull_request_desc=Pull-Request geöffnet, geschlossen, wieder ge settings.event_push=Push settings.event_push_desc=Git push auf ein Repository settings.active=Aktiv -settings.active_helper=Details über das auslösende Ereignis des Webhooks werden ebenfalls mit gesendet +settings.active_helper=Informationen über das auslösende Ereignis werden auch mitgesendet. settings.add_hook_success=Webhook hinzugefügt settings.update_webhook=Webhook aktualisieren settings.update_hook_success=Webhook wurde aktualisiert. @@ -812,13 +907,28 @@ settings.key_been_used=Deploy-Schlüssel wurde verwendet. settings.key_name_used=Ein Deploy-Schlüssel mit diesem Namen existiert bereits. settings.add_key_success=Der Deploy-Schlüssel '%s' wurde erfolgreich hinzugefügt! settings.deploy_key_deletion=Deploy-Schlüssel löschen -settings.deploy_key_deletion_desc=Nach dem Löschen dieses Deploy-Schlüssels werden entsprechende Zugriffe auf dieses Repository nicht mehr möglich sein. Möchtest du wirklich fortfahren? -settings.deploy_key_deletion_success=Deploy-Schlüssel wurde erfolgreich gelöscht! +settings.deploy_key_deletion_desc=Durch das Löschen dieses Keys wird ein Zugriff damit nicht mehr möglich sein. Fortfahren? +settings.deploy_key_deletion_success=Der Deploy-Schlüssel wurde erfolgreich gelöscht! +settings.branches=Branches +settings.protected_branch=Branch-Schutz +settings.protected_branch_can_push=Push erlauben? +settings.protected_branch_can_push_yes=Du kannst pushen +settings.protected_branch_can_push_no=Du kannst nicht pushen +settings.add_protected_branch=Schutz aktivieren +settings.delete_protected_branch=Schutz deaktivieren +settings.add_protected_branch_success=%s erfolgreich gesperrt +settings.add_protected_branch_failed=%s sperren fehlgeschlagen +settings.remove_protected_branch_success=%s erfolgreich entsperrt +settings.protected_branch_deletion=Eine geschützte Branch löschen +settings.protected_branch_deletion_desc=Jeder mit Schreibzugriff wird direkt in diese Branch pushen können. Bist du sicher? +settings.default_branch_desc=Die Standardbranch ist als "basis"-Branch in deinem Repository definiert, Commits und Pull-Requests werden automatisch mit dieser Branch durchgeführt wenn du keine andere angibst. +settings.choose_branch=Wähle einen Branch... +settings.no_protected_branch=Es gibt keine geschützten Branches diff.browse_source=Quellcode durchsuchen diff.parent=Ursprung diff.commit=Commit -diff.data_not_available=Keine Diff-Daten verfügbar. +diff.data_not_available=Keine Diff-Daten verfügbar diff.show_diff_stats=Diff-Statistik anzeigen diff.show_split_view=Geteilte Ansicht diff.show_unified_view=Gesamtansicht @@ -828,6 +938,7 @@ diff.view_file=Datei anzeigen diff.file_suppressed=Datei-Diff unterdrückt, da er zu groß ist diff.too_many_files=Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden. +releases.desc=Unter Releases kannst du die Versionen deines Projekts verwalten release.releases=Releases release.new_release=Neues Release release.draft=Entwurf @@ -836,11 +947,11 @@ release.stable=Stabil release.edit=bearbeiten release.ahead=%d Commits zu %s seit diesem Release release.source_code=Quelltext -release.new_subheader=Neue Version des Projekts veröffentlichen. -release.edit_subheader=Eine detaillierte Liste aller Änderungen verrät Benutzern, was verbessert wurde. +release.new_subheader=Veröffentliche Versionen um Projektversionen zu verfolgen. +release.edit_subheader=Ein ausführliche Changelog kann helfen, Benutzer verstehen, was sich geändert hat. release.tag_name=Tag-Name release.target=Ziel -release.tag_helper=Wähle einen existierenden Tag, oder erstelle einen neuen Tag bei der Veröffentlichung. +release.tag_helper=Wähle einen existierenden oder erstelle einen neuen Tag. release.title=Titel release.content=Inhalt release.write=Schreiben @@ -855,16 +966,16 @@ release.edit_release=Release bearbeiten release.delete_release=Dieses Release löschen release.deletion=Release löschen release.deletion_desc=Beim Löschen dieses Releases wird das entsprechende Git-Tag gelöscht. Möchtest du fortfahren? -release.deletion_success=Release wurde erfolgreich gelöscht! +release.deletion_success=Das Release wurde gelöscht. release.tag_name_already_exist=Ein Release mit diesem Tag existiert bereits. release.tag_name_invalid=Tag-Name ist nicht gültig. release.downloads=Downloads branch.delete=Branch %s löschen -branch.delete_desc=Wurde ein Branch gelöscht, so gibt es kein Zurück. Bitte sei vorsichtig. +branch.delete_desc=Das Löschen eines Branches kann nicht Rückgängig gemacht werden. branch.delete_notices_1=- Diese Operation kann nicht rückgängig gemacht werden. -branch.delete_notices_2=- Diese Operation wird permanent alle Inhalte von Branch %s löschen. -branch.deletion_success=%s wurde erfolgreich entfernt! +branch.delete_notices_2=- Diese Operation wird permanent alle Inhalte des Branches %s löschen. +branch.deletion_success=%s wurde gelöscht. branch.deletion_failed=Branch %s konnte nicht gelöscht werden. branch.delete_branch_has_new_commits=%s kann nicht gelöscht weden, da es ungemergte Commits gibt. @@ -884,8 +995,9 @@ org_desc=Beschreibung team_name=Teamname team_desc=Beschreibung team_name_helper=Unter diesem Namen kannst du in Diskussionen auf das Team verweisen. -team_desc_helper=Worum geht es bei diesem Team? +team_desc_helper=Wofür ist dieses Team da? team_permission_desc=Welche Berechtigungsstufe soll das Team haben? +team_unit_desc=Auf welche Bestandteile sollte dieses Team Zugriff haben? form.name_reserved=Organisationsname '%s' ist bereits vergeben. form.name_pattern_not_allowed=Organisationsnamen der Form '%s' sind nicht erlaubt. @@ -897,9 +1009,9 @@ settings.full_name=Vollständiger Name settings.website=Webseite settings.location=Standort settings.update_settings=Einstellungen speichern -settings.update_setting_success=Organisationseinstellungen aktualisiert -settings.change_orgname_prompt=Diese Änderung wird sich auf die Linkbezüge zur Organisation auswirken. -settings.update_avatar_success=Profilbild-Einstellung für die Organisation wurde erfolgreich aktualisiert. +settings.update_setting_success=Organisationseinstellungen wurden aktualisiert. +settings.change_orgname_prompt=Diese Änderung wird die Links zur Organisation ändern. +settings.update_avatar_success=Der Organisationsavatar wurde aktualisiert. settings.delete=Organisation löschen settings.delete_account=Diese Organisation löschen settings.delete_prompt=Die Organisation wird dauerhaft gelöscht. Dies kann NICHT rückgängig gemacht werden! @@ -926,7 +1038,7 @@ teams.leave=Verlassen teams.read_access=Lesezugriff teams.read_access_helper=Dieses Team wird Repositories einsehen und klonen können. teams.write_access=Schreibzugriff -teams.write_access_helper=Dieses Team wird seine Repositories einsehen und darauf pushen können. +teams.write_access_helper=Dieses Team wird Repositories einsehen und klonen können. teams.admin_access=Adminzugriff teams.admin_access_helper=Dieses Team wird Pull- und Push-Rechte für seine Repositories haben und Mitarbeiter hinzufügen können. teams.no_desc=Dieses Team hat keine Beschreibung @@ -938,7 +1050,7 @@ teams.delete_team=Dieses Team löschen teams.add_team_member=Teammitglied hinzufügen teams.delete_team_title=Team löschen teams.delete_team_desc=Mitglieder dieses Teams verlieren möglicherweise ihren Zugang zu einigen Repositories, wenn dieses Team gelöscht wird. Möchtest du fortfahren? -teams.delete_team_success=Team gelöscht +teams.delete_team_success=Das Team wurde gelöscht. teams.read_permission_desc=Dieses Team hat Lesezugriff: Mitglieder können Team-Repositories einsehen und klonen. teams.write_permission_desc=Dieses Team hat Schreibzugriff: Mitglieder können Team-Repositories einsehen und darauf pushen. teams.admin_permission_desc=Dieses Team hat Adminzugriff: Mitglieder dieses Teams können pullen, pushen und Mitarbeiter zu Team-Repositories hinzufügen. @@ -968,23 +1080,24 @@ dashboard.statistic_info=Gitea Datenbank hat %d Benutzer, %d Organ dashboard.operation_name=Name der Operation dashboard.operation_switch=Wechseln dashboard.operation_run=Ausführen -dashboard.clean_unbind_oauth=Nicht verbundene OAuths bereinigen -dashboard.clean_unbind_oauth_success=Alle nicht verbundenen OAuth-Tokens wurden gelöscht. +dashboard.clean_unbind_oauth=Nicht verbundene OAuths Verbindungen löschen +dashboard.clean_unbind_oauth_success=Alle unverbundene OAuth-Verbindungen wurden gelöscht. dashboard.delete_inactivate_accounts=Deaktivierte Konten löschen dashboard.delete_inactivate_accounts_success=Alle deaktivierten Konten wurden erfolgreich gelöscht. dashboard.delete_repo_archives=Alle Repository-Archive löschen dashboard.delete_repo_archives_success=Alle Repository-Archive wurden gelöscht. dashboard.delete_missing_repos=Alle Repository-Datensätze mit verlorenen gegangenen Git-Dateien löschen -dashboard.delete_missing_repos_success=Alle Repository-Datensätze, mit verlorenen Git-Dateien wurden erfolgreich gelöscht. -dashboard.git_gc_repos=Garbage Collection auf Repositories ausführen -dashboard.git_gc_repos_success=Garbage Collection wurde auf allen Repositories erfolgreich ausgeführt. -dashboard.resync_all_sshkeys=Datei '.ssh/authorized_keys' neu anlegen (Achtung: Schlüssel, die nicht zu Gitea gehören gehen verloren) +dashboard.delete_missing_repos_success=Alle Repository-Datensätze mit verlorenen Git-Dateien wurden erfolgreich gelöscht. +dashboard.git_gc_repos=Garbage Collection auf allen Repositories ausführen +dashboard.git_gc_repos_success=Alle Repositories haben garbage collection erfolgreich beendet. +dashboard.resync_all_sshkeys=Datei '.ssh/Authorized_keys' neuschreiben (für Gitea SSH-Schlüssel) dashboard.resync_all_sshkeys_success=Alle öffentlichen Keys wurden erfolgreich neu geschrieben. -dashboard.resync_all_update_hooks=Alle Aktualisierungs-Hooks von Repositories neu anlegen (wird benötigt, wenn der angepasste Konfigurationspfad geändert wurde) -dashboard.resync_all_update_hooks_success=Die Hooks aller Repositories wurden erfolgreich neu angelegt. -dashboard.reinit_missing_repos=Alle Repository-Datensätze mit verloren gegangenen Git-Dateien neu initialisieren -dashboard.reinit_missing_repos_success=Alle Repository-Datensätze, die Git-Dateien verloren haben wurden erfolgreich neu initialisiert. - +dashboard.resync_all_hooks=Synchronisiere pre-receive, update und post-receive Hooks für alle Repositories. +dashboard.resync_all_hooks_success=Pre-receive, update und post-receive Hooks aller Repositories wurden erfolgreich synchronisiert. +dashboard.reinit_missing_repos=Alle Git-Repositories für welche Einträge existieren neu einlesen +dashboard.reinit_missing_repos_success=Alle verlorenen Git-Repositories mit existierenden Einträgen wurden erfolgreich aktualisiert. +dashboard.sync_external_users=Externe Benutzerdaten synchronisieren +dashboard.sync_external_users_started=Externe Benutzer Synchronisation gestartet dashboard.server_uptime=Server-Uptime dashboard.current_goroutine=Aktuelle Goroutines dashboard.current_memory_usage=Aktuelle Speichernutzung @@ -1015,7 +1128,7 @@ dashboard.total_gc_pause=Gesamte GC-Pause dashboard.last_gc_pause=Letzte GC-Pause dashboard.gc_times=Anzahl GC -users.user_manage_panel=Benutzer +users.user_manage_panel=Benutzerverwaltung users.new_account=Neues Konto erstellen users.name=Name users.activated=Aktiviert @@ -1025,7 +1138,7 @@ users.created=Erstellt am users.last_login=Letzte Anmeldung users.never_login=Niemals eingeloggt users.send_register_notify=Bei der Registrierung eine Benachrichtigung an den Benutzer senden -users.new_success=Das neue Konto '%s' wurde erfolgreich erstellt. +users.new_success=Der Account '%s' wurde erfolgreich erstellt. users.edit=Bearbeiten users.auth_source=Authentifizierungsquelle users.local=Lokal @@ -1035,36 +1148,39 @@ users.update_profile_success=Kontoprofil wurde erfolgreich aktualisiert. users.edit_account=Konto bearbeiten users.max_repo_creation=Maximale Anzahl erstellbarer Repositories users.max_repo_creation_desc=(Auf -1 setzen, um das globale Standardlimit zu verwenden) -users.is_activated=Dieses Konto ist aktiviert -users.prohibit_login=Diesem Konto ist es nicht gestattet sich anzumelden +users.is_activated=Dieses Konto hat die Aktivierung abgeschlossen +users.prohibit_login=Diesem Konto den Login verweigern users.is_admin=Dieses Konto hat Administratorrechte -users.allow_git_hook=Dieses Konto ist berechtigt Git-Hooks zu erstellen +users.allow_git_hook=Dieses Konto ist berechtigt, Git-Hooks zu erstellen users.allow_import_local=Dieses Konto ist berechtigt, lokale Repositories zu importieren -users.allow_create_organization=Mit diesem Konto ist das erstellen von Organisiationen erlaubt +users.allow_create_organization=Mit diesem Konto ist das Erstellen von Organisationen erlaubt users.update_profile=Konto aktualisieren users.delete_account=Dieses Konto löschen -users.still_own_repo=Dieses Konto besitzt noch Repositories. Du musst diese zuerst löschen oder übertragen. -users.still_has_org=Dieses Konto ist noch Mitglied von Organisationen. Du musst alle Organisationen erst verlassen oder löschen. -users.deletion_success=Das Konto wurde erfolgreich gelöscht! +users.still_own_repo=Dieses Konto besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden. +users.still_has_org=Dieses Konto ist noch Mitglied von mindestens einer Organisation. Du musst alle Organisationen erst verlassen oder löschen. +users.deletion_success=Das Konto wurde erfolgreich gelöscht. -orgs.org_manage_panel=Organisationen +orgs.org_manage_panel=Organisationsverwaltung orgs.name=Name orgs.teams=Teams orgs.members=Mitglieder +orgs.new_orga=Organisation erstellen -repos.repo_manage_panel=Repositories +repos.repo_manage_panel=Repositoryverwaltung repos.owner=Besitzer repos.name=Name repos.private=Privat repos.watches=Beobachtungen repos.stars=Favoriten repos.issues=Issues +repos.size=Größe auths.auth_manage_panel=Authentifizierung auths.new=Neue Quelle hinzufügen auths.name=Name auths.type=Typ auths.enabled=Aktiviert +auths.syncenabled=Benutzersynchronisation aktivieren auths.updated=Aktualisiert auths.auth_type=Authentifizierungstyp auths.auth_name=Authentifizierungsname @@ -1090,19 +1206,39 @@ auths.smtp_auth=SMTP-Authentifizierung auths.smtphost=SMTP-Host auths.smtpport=SMTP-Port auths.allowed_domains=Erlaubte Domains -auths.allowed_domains_helper=Leer lassen für keine Einschränkungen. Mehrere Domains können durch Komma "," getrennt werden. +auths.allowed_domains_helper=Leer lassen um alle Domains zu erlauben. Mehrere Domains können durch Komma "," getrennt werden. auths.enable_tls=TLS-Verschlüsselung aktivieren auths.skip_tls_verify=TLS-Prüfung überspringen auths.pam_service_name=PAM Dienstname +auths.oauth2_provider=OAuth2 Anbieter +auths.oauth2_clientID=Client-ID (Schlüssel) +auths.oauth2_clientSecret=Client-Secret +auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery URL +auths.oauth2_use_custom_url=Benutzerdefinierte URLs anstelle von Standard-URLs verwenden +auths.oauth2_tokenURL=Token-URL +auths.oauth2_authURL=Authorisier-URL +auths.oauth2_profileURL=Profil-URL +auths.oauth2_emailURL=E-Mail-URL auths.enable_auto_register=Automatische Registrierung aktivieren auths.tips=Tipps +auths.tips.oauth2.general=OAuth2 Authentifizierung +auths.tips.oauth2.general.tip=Beim Registrieren einer neuen OAuth2 Authentifizierung sollte die callback/weiterleitungs-URL /user/oauth2//callback sein +auths.tip.oauth2_provider=OAuth2 Anbieter +auths.tip.bitbucket=Registriere einen neuen OAuth consumer unter https://bitbucket.org/account/user//oauth-consumers/new und füge die Berechtigung "Account"-"Read" hinzu +auths.tip.dropbox=Erstelle unter https://www.dropbox.com/developers/apps eine neue App +auths.tip.facebook=Registriere unter https://developers.facebook.com/apps eine neue App und füge das Produkt "Facebook Login" hinzu +auths.tip.github=Registriere unter https://github.com/settings/applications/new eine neue OAuth Anwendung +auths.tip.gitlab=Registriere unter https://gitlab.com/profile/applications eine neue Anwendung +auths.tip.google_plus=Du erhälst die OAuth2 Client Zugangsdaten in der Google API Console (https://console.developers.google.com) +auths.tip.openid_connect=Benutze die OpenID Connect Discovery URL (/.well-known/openid-configuration), um den Endpunkt zu spezifizieren +auths.tip.twitter=Gehe auf https://dev.twitter.com/apps, erstelle eine Anwendung und stelle sicher, dass die Option “Allow this application to be used to Sign in with Twitter” aktiviert ist. auths.edit=Authentifizierungseinstellungen bearbeiten auths.activated=Diese Authentifizierung ist aktiv -auths.new_success=Neue Authentifizierung '%s' wurde erfolgreich hinzugefügt. -auths.update_success=Die Authentifizierungseinstellungen wurden erfolgreich aktualisiert. +auths.new_success=Die Authentifizierung "%s" wurde hinzugefügt. +auths.update_success=Die Authentifizierungseinstellungen wurden aktualisiert. auths.update=Authentifizierungseinstellungen aktualisieren -auths.delete=Diese Authentifizierung löschen -auths.delete_auth_title=Authentifizierung löschen +auths.delete=Diese Authentifizierungsquelle löschen +auths.delete_auth_title=Authentifizierungsquelle löschen auths.delete_auth_desc=Diese Authentifizierung wird gelöscht. Möchtest du fortfahren? auths.still_in_used=Diese Authentifizierung wird noch von einigen Benutzern verwendet. Bitte lösche diese Benutzer oder ändere deren Anmeldetyp. auths.deletion_success=Authentifizierung wurde erfolgreich gelöscht! @@ -1112,6 +1248,7 @@ config.server_config=Serverkonfiguration config.app_name=Name der Anwendung config.app_ver=Anwendungsversion config.app_url=Anwendungs-URL +config.custom_conf=Konfigurations-Datei-Pfad config.domain=Domain config.offline_mode=Offline-Modus config.disable_router_log=Router-Log deaktivieren @@ -1150,20 +1287,23 @@ config.db_path_helper=(für "sqlite3" und "tidb") config.service_config=Service-Konfiguration config.register_email_confirm=E-Mail-Bestätigung bei Registrierung config.disable_register=Registrierung deaktivieren +config.enable_openid_signup=Registrierung via OpenID aktivieren +config.enable_openid_signin=Anmelden via OpenID aktivieren config.show_registration_button=Schaltfläche Registrieren anzeigen config.require_sign_in_view=Ansehen erfordert Anmeldung config.mail_notify=E-Mail-Benachrichtigung config.disable_key_size_check=Prüfung der Mindestschlüssellänge deaktiveren config.enable_captcha=Captcha aktivieren config.active_code_lives=Aktivierungscode Lebensdauer -config.reset_password_code_lives=Passwortcode Lebensdauer -config.default_keep_email_private=Standard-Wert für "Private E-Mail-Adressen" +config.reset_password_code_lives=Ablaufdatum des Passworts zurücksetzen +config.default_keep_email_private=Standard-Wert für "Private E-Mail-Adressen +config.default_allow_create_organization=Standardmäßige Erlaubnis eine Organisation zu erstellen config.no_reply_address=No-Reply Adresse config.webhook_config=Webhook-Konfiguration config.queue_length=Warteschlangenlänge config.deliver_timeout=Zeitlimit für Zustellung -config.skip_tls_verify=TLS verifikation überspringen +config.skip_tls_verify=Überspringe die Überprüfung des TLS-Zertifikats config.mailer_config=Mailer-Konfiguration config.mailer_enabled=Aktiviert @@ -1172,7 +1312,7 @@ config.mailer_name=Name config.mailer_host=Host config.mailer_user=Benutzer config.send_test_mail=Test-E-Mail senden -config.test_mail_failed=Das Senden der Test-E-Mail an '%s': %v ist fehlgeschlagen +config.test_mail_failed=Das Senden der Test-E-Mail an '%s' ist fehlgeschlagen: %v config.test_mail_sent=Test-E-Mail wurde an '%s' gesendet. config.oauth_config=OAuth-Konfiguration @@ -1225,7 +1365,7 @@ monitor.start=Startzeit monitor.execute_time=Ausführungszeit notices.system_notice_list=Systemmitteilungen -notices.view_detail_header=Mitteilungsdetails ansehen +notices.view_detail_header=Meldungsdetails ansehen notices.actions=Aktionen notices.select_all=Alles auswählen notices.deselect_all=Alles abwählen @@ -1236,7 +1376,7 @@ notices.type=Typ notices.type_1=Repository notices.desc=Beschreibung notices.op=Aktion -notices.delete_success=Systemmitteilungen wurden erfolgreich gelöscht. +notices.delete_success=Diese Systemmeldung wurde gelöscht. [action] create_repo=hat das Repository %s erstellt @@ -1252,26 +1392,27 @@ comment_issue=`hat Issue %s#%[2]s kommentiert` merge_pull_request=`hat Pull-Request %s#%[2]s zuammengeführt` transfer_repo=hat Repository %s transferiert an %s push_tag=hat Tag %[2]s auf %[3]s gepusht -compare_commits=Zeige Vergleich für diese %d Commits +compare_commits=Vergleiche %d Commits [tool] -ago=vor -from_now=in +ago=vor %s +from_now=in %s now=jetzt -1s=%s 1 Sekunde -1m=%s 1 Minute -1h=%s 1 Stunde -1d=%s 1 Tag -1w=%s 1 Woche -1mon=%s 1 Monat -1y=%s 1 Jahr -seconds=%[2]s %[1]d Sekunden -minutes=%[2]s %[1]d Minuten -hours=%[2]s %[1]d Stunden -days=%[2]s %[1]d Tagen -weeks=%[2]s %[1]d Wochen -months=%[2]s %[1]d Monaten -years=%[2]s %[1]d Jahren +future=Zukunft +1s=1 Sekunde +1m=1 Minute +1h=1 Stunde +1d=1 Tag +1w=1 Woche +1mon=1 Monat +1y=1 Jahr +seconds=%d Sekunden +minutes=%d Minuten +hours=%d Stunden +days=%d Tagen +weeks=%d Wochen +months=%d Monaten +years=%d Jahren raw_seconds=Sekunden raw_minutes=Minuten @@ -1284,10 +1425,22 @@ remove_file=Datei entfernen [notification] notifications=Nachrichten unread=Ungelesen -read=Lesen -no_unread=Sie haben keine neuen Nachrichten. -no_read=Sie haben keine gelesenen Nachrichten. -pin=Anpinnen +read=Gelesen +no_unread=Du hast momentan keine ungelesenen Benachrichtigungen. +no_read=Du hast momentan keine gelesenen Benachrichtigungen. +pin=Benachrichtigung pinnen mark_as_read=Als gelesen markieren mark_as_unread=Als ungelesen markieren +[gpg] +error.extract_sign=Die Signatur konnte nicht extrahiert werden +error.generate_hash=Es konnte kein Hash vom Commit generiert werden +error.no_committer_account=Es ist kein Account mit dieser Commiter-Email verbunden +error.no_gpg_keys_found=Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden +error.not_signed_commit=Kein signierter Commit +error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Accounts + +[units] +error.no_unit_allowed_repo=Es konnte kein Bestandteil in dieser Repository gefunden werden auf den der Zugriff erlaubt ist +error.unit_not_allowed=Du bist nicht berechtigt diesen Repository-Bestandteil zu benutzen + diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 93151a2..9931d91 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -9,7 +9,7 @@ sign_in_with = Sign in with sign_out = Sign Out sign_up = Sign Up link_account = Link Account -link_account_signin_or_signup = Login with existing credentials to link your existing account to this new account, or sign up for a new account +link_account_signin_or_signup = Login with existing credentials to link your existing account to this account, or sign up for a new one register = Register website = Website version = Version @@ -46,6 +46,12 @@ your_profile = Your Profile your_starred = Your Starred your_settings = Your Settings +all = All +sources = Sources +mirrors = Mirrors +collaborative = Collaborative +forks = Forks + activities = Activities pull_requests = Pull Requests issues = Issues @@ -54,9 +60,9 @@ cancel = Cancel [install] install = Installation -title = Install Steps For First-time Run -docker_helper = If you're running Gitea inside Docker, please read the Guidelines carefully before you change anything on this page! -requite_db_desc = Gitea requires MySQL, PostgreSQL, SQLite3 or TiDB. +title = Initial configuration +docker_helper = If you are running Gitea inside Docker, please read the guidelines carefully before changing anything on this page. +requite_db_desc = Gitea requires MySQL, PostgreSQL, SQLite3, or TiDB. db_title = Database Settings db_type = Database Type host = Host @@ -66,17 +72,17 @@ db_name = Database Name db_helper = Please use the INNODB engine with utf8_general_ci charset for MySQL. ssl_mode = SSL Mode path = Path -sqlite_helper = The file path of SQLite3 or TiDB database.
Please use the absolute path when you start as service. +sqlite_helper = The file path to the SQLite3 or TiDB database.
Please use the absolute path when you start as service. err_empty_db_path = SQLite3 or TiDB database path cannot be empty. err_invalid_tidb_name = TiDB database name does not allow characters "." and "-". no_admin_and_disable_registration = You cannot disable registration without creating an admin account. err_empty_admin_password = Admin password cannot be empty. -general_title = Application General Settings +general_title = General Application Settings app_name = Application Name -app_name_helper = Put your organization name here huge and loud! +app_name_helper = You can put your organization name here. repo_path = Repository Root Path -repo_path_helper = All Git remote repositories will be saved to this directory. +repo_path_helper = All remote Git repositories will be saved to this directory. lfs_path = LFS Root Path lfs_path_helper = Files stored with Git LFS will be stored in this directory. Leave empty to disable LFS. run_user = Run User @@ -84,11 +90,11 @@ run_user_helper = The user must have access to Repository Root Path and run Gite domain = Domain domain_helper = This affects SSH clone URLs. ssh_port = SSH Port -ssh_port_helper = Port number which your SSH server is using, leave it empty to disable SSH feature. +ssh_port_helper = Port number which your SSH server is using, leave it empty to disable. http_port = HTTP Port http_port_helper = Port number which application will listen on. app_url = Application URL -app_url_helper = This affects HTTP/HTTPS clone URL and somewhere in email. +app_url_helper = This affects HTTP/HTTPS clone URL and some email notifications. log_root_path = Log Path log_root_path_helper = Directory to write log files to. @@ -96,25 +102,29 @@ optional_title = Optional Settings email_title = Email Service Settings smtp_host = SMTP Host smtp_from = From -smtp_from_helper = Mail from address, RFC 5322. It can be just an email address, or the "Name" format. +smtp_from_helper = Mail from address, RFC 5322. It can be only an email address, or the "Name" format. mailer_user = Sender User mailer_password = Sender Password register_confirm = Enable Register Confirmation -mail_notify = Enable Mail Notification +mail_notify = Enable Mail Notifications server_service_title = Server and Other Services Settings offline_mode = Enable Offline Mode -offline_mode_popup = Disable CDN even in production mode, all resource files will be served locally. +offline_mode_popup = Disable CDN so all resource files will be served locally. disable_gravatar = Disable Gravatar Service disable_gravatar_popup = Disable Gravatar and custom sources. All avatars must be uploaded by users or the default avatar will be used. federated_avatar_lookup = Enable Federated Avatars Lookup federated_avatar_lookup_popup = Enable federated avatar lookup using Libravatar. disable_registration = Disable Self-registration disable_registration_popup = Disable user self-registration, only admin can create accounts. +openid_signin = Enable OpenID Sign-In +openid_signin_popup = Enable user login via OpenID +openid_signup = Enable OpenID Self-registration +openid_signup_popup = Enable OpenID based Self-registration enable_captcha = Enable Captcha enable_captcha_popup = Require a CAPTCHA for user self-registration. require_sign_in_view = Enable Require Sign In to View Pages require_sign_in_view_popup = Only signed in users can view pages, visitors will only be able to see sign in/up pages. -admin_setting_desc = You do not have to create an admin account right now. The first user who registers on the site will gain admin access automatically. +admin_setting_desc = You do not need to create an admin account right now. The first user who registers on the site will gain admin access automatically. admin_title = Admin Account Settings admin_name = Username admin_password = Password @@ -122,16 +132,18 @@ confirm_password = Confirm Password admin_email = Admin Email install_btn_confirm = Install Gitea test_git_failed = Could not test 'git' command: %v -sqlite3_not_available = Your release version does not support SQLite3, please download the official binary version from %s, NOT the gobuild version. -invalid_db_setting = Database setting is not correct: %v +sqlite3_not_available = Your current version does not support SQLite3, please download the official binary version from %s, NOT the gobuild version. +invalid_db_setting = Database setting is invalid: %v invalid_repo_path = Repository root path is invalid: %v -run_user_not_match = Run user isn't the current user: %s -> %s -save_config_failed = Fail to save configuration: %v +run_user_not_match = Run user is not the current user: %s -> %s +save_config_failed = Failed to save configuration: %v invalid_admin_setting = Admin account setting is invalid: %v -install_success = Welcome! We're glad that you chose Gitea, have fun and take care. +install_success = Welcome! Thank you for choosing Gitea, have fun and take care. invalid_log_root_path = Log root path is invalid: %v default_keep_email_private = Default Value for Keep Email Private default_keep_email_private_popup = This is the default value for the visibility of the user's email address. If set to true the email address of all new users will be hidden until the user changes his setting. +default_allow_create_organization = Default permission value for new users to create organizations +default_allow_create_organization_popup = This is default permission value that will be assigned for new users. If set to true new users will be allowed to create Organizations. no_reply_address = No-reply Address no_reply_address_helper = Domain for the user's email address in git logs if he keeps his email address private. E.g. user 'joe' and 'noreply.example.org' will be 'joe@noreply.example.org' @@ -140,7 +152,7 @@ uname_holder = Username or email password_holder = Password switch_dashboard_context = Switch Dashboard Context my_repos = My Repositories -show_more_repos = Show more repositories... +show_more_repos = Show more repositories ... collaborative_repos = Collaborative Repositories my_orgs = My Organizations my_mirrors = My Mirrors @@ -154,31 +166,32 @@ repos = Repositories users = Users organizations = Organizations search = Search -repo_no_results = There are no matched repositories found. -user_no_results = There are no matched users found. -org_no_results = There are no matched organizations found. +repo_no_results = No matching repositories have been found. +user_no_results = No matching users have been found. +org_no_results = No matching organizations have been found. [auth] -create_new_account = Create New Account +create_new_account = Create Account register_helper_msg = Already have an account? Sign in now! -social_register_helper_msg = Already have an account? Bind now! +social_register_helper_msg = Already have an account? Join it now! disable_register_prompt = Sorry, registration has been disabled. Please contact the site administrator. disable_register_mail = Sorry, Register Mail Confirmation has been disabled. remember_me = Remember Me -forgot_password= Forgot Password -forget_password = Forgot password? +forgot_password_title= Forgot Password +forgot_password = Forgot password? sign_up_now = Need an account? Sign up now. -confirmation_mail_sent_prompt = A new confirmation email has been sent to %s. Please check your inbox within the next %d hours to complete the registration process. +confirmation_mail_sent_prompt = A new confirmation email has been sent to %s. Please check your inbox within the next %s to complete the registration process. +reset_password_mail_sent_prompt = A confirmation email has been sent to %s. Please check your inbox within the next %s to complete the password reset process. active_your_account = Activate Your Account prohibit_login = Login Prohibited prohibit_login_desc = Your account is prohibited to login, please contact the site administrator. resent_limit_prompt = Sorry, you have already requested an activation email recently. Please wait 3 minutes then try again. has_unconfirmed_mail = Hi %s, you have an unconfirmed email address (%s). If you haven't received a confirmation email or need to resend a new one, please click on the button below. resend_mail = Click here to resend your activation email -email_not_associate = This email address is not associated with any account. -send_reset_mail = Click here to (re)send your password reset email +email_not_associate = The email address is not associated with any account. +send_reset_mail = Click here to resend your password reset email reset_password = Reset Your Password -invalid_code = Sorry, your confirmation code has expired or not valid. +invalid_code = Sorry, your confirmation code has expired or is not valid. reset_password_helper = Click here to reset your password password_too_short = Password length cannot be less then %d. non_local_account = Non-local accounts cannot change passwords through the Gitea web interface. @@ -186,15 +199,24 @@ verify = Verify scratch_code = Scratch code use_scratch_code = Use a scratch code twofa_scratch_used = You have used your scratch code. You have been redirected to the two-factor settings page so you may remove your device enrollment or generate a new scratch code. -twofa_passcode_incorrect = Your passcode is not correct. If you misplaced your device, use your scratch code to login. -twofa_scratch_token_incorrect = Your scratch code is not correct. +twofa_passcode_incorrect = Your passcode is incorrect. If you misplaced your device, use your scratch code to login. +twofa_scratch_token_incorrect = Your scratch code is incorrect. +login_userpass = User / Password +login_openid = OpenID +openid_connect_submit = Connect +openid_connect_title = Connect to an existing account +openid_connect_desc = The chosen OpenID URIs is not known by the system, you can join it an existing account. +openid_register_title = Create new account +openid_register_desc = The chosen OpenID URIs is not known by the system, you can associate it to a new account here. +openid_signin_desc = Example URIs: https://anne.me, bob.openid.org.cn, gnusocial.net/carry +disable_forgot_password_mail = Sorry, password reset has been disabled. Please contact the site administrator. [mail] activate_account = Please activate your account activate_email = Verify your email address reset_password = Reset your password register_success = Registration successful -register_notify = Welcome on board +register_notify = Welcome to Gitea [modal] yes = Yes @@ -224,35 +246,41 @@ Content = Content require_error = ` cannot be empty.` alpha_dash_error = ` must be valid alphanumeric or dash(-_) characters.` alpha_dash_dot_error = ` must be valid alphanumeric, dash(-_) or dot characters.` -size_error = ` must be size %s.` +git_ref_name_error = ` must be well formed git reference name.` +size_error = ` must be size %s.` min_size_error = ` must contain at least %s characters.` max_size_error = ` must contain at most %s characters.` email_error = ` is not a valid email address.` url_error = ` is not a valid URL.` include_error = ` must contain substring '%s'.` unknown_error = Unknown error: -captcha_incorrect = CAPTCHA is incorrect. -password_not_match = Password and confirm password are not same. +captcha_incorrect = CAPTCHA response is incorrect. +password_not_match = Your chosen passwords do not match. -username_been_taken = Username has already been taken. -repo_name_been_taken = Repository name has already been used. -org_name_been_taken = Organization name has already been taken. -team_name_been_taken = Team name has already been taken. -email_been_used = Email address has already been used. -username_password_incorrect = Username or password is not correct. -enterred_invalid_repo_name = Please make sure that the repository name you entered is correct. -enterred_invalid_owner_name = Please make sure that the owner name you entered is correct. -enterred_invalid_password = Please make sure the that password you entered is correct. -user_not_exist = The given user does not exist. -last_org_owner = Removing the last user from a owner team isn't allowed because there must always be at least one owner in any given organization. +username_been_taken = Username already taken. +repo_name_been_taken = Repository name already used. +org_name_been_taken = Organization name already taken. +team_name_been_taken = Team name already taken. +team_no_units_error = Team must have at least one unit enabled. +email_been_used = Email already used. +openid_been_used = OpenID address '%s' already used. +username_password_incorrect = Incorrect username or password. +enterred_invalid_repo_name = Please ensure that the repository name you entered is correct. +enterred_invalid_owner_name = Please ensure that the owner name you entered is correct. +enterred_invalid_password = Please ensure the that password you entered is correct. +user_not_exist = The user does not exist. +last_org_owner = Removing the last user from the owner team is not allowed because there must always be at least one owner in any given organization. +cannot_add_org_to_team = Organization cannot be added as a team member. +cannot_invite_org_to_org = Organization cannot be invited as an organization member. -invalid_ssh_key = Sorry, we're not able to verify your SSH key: %s -unable_verify_ssh_key = Gitea cannot verify your SSH key, but we are assuming that it is valid, please double-check it. +invalid_ssh_key = Sorry, we were not able to verify your SSH key: %s +invalid_gpg_key = Sorry, we were not able to verify your GPG key: %s +unable_verify_ssh_key = The ssh key could not be verified, please double-check it for any mistakes. auth_failed = Authentication failed: %v -still_own_repo = Your account still has ownership over at least one repository, you have to delete or transfer them first. -still_has_org = Your account still has membership in at least one organization, you have to leave or delete your memberships first. -org_still_own_repo = This organization still owns repositories, you must delete or transfer them first. +still_own_repo = Your account still has ownership of at least one repository, you need to delete or transfer them first. +still_has_org = Your account still is still a member of least one organization, you need to leave them first. +org_still_own_repo = This organization still owns repositories, you need to delete or transfer them first. target_branch_not_exist = Target branch does not exist. @@ -267,32 +295,33 @@ following = Following follow = Follow unfollow = Unfollow -form.name_reserved = Username '%s' is reserved. -form.name_pattern_not_allowed = Username pattern '%s' is not allowed. +form.name_reserved = The username '%s' is reserved. +form.name_pattern_not_allowed = The username pattern '%s' is not allowed. [settings] profile = Profile password = Password avatar = Avatar -ssh_keys = SSH Keys +ssh_gpg_keys = SSH / GPG Keys social = Social Accounts applications = Applications orgs = Organizations delete = Delete Account twofa = Two-Factor Authentication account_link = External Accounts +organization = Organization uid = Uid public_profile = Public Profile -profile_desc = Your email address is public and will be used for any account related notifications and any web based operations made via the site. -password_username_disabled = Non-local type users are not allowed to change their username. +profile_desc = Your email address is public and will be used for any account related notifications and web based operations made through the web interface. +password_username_disabled = Non-local users are not allowed to change their username. Please contact your system administrator for more details. full_name = Full Name website = Website location = Location update_profile = Update Profile -update_profile_success = Your profile has been updated successfully. +update_profile_success = Your profile has been updated. change_username = Username Changed -change_username_prompt = This change will affect the way how links relate to your account. +change_username_prompt = This change will change the links to your account. continue = Continue cancel = Cancel @@ -303,51 +332,75 @@ choose_new_avatar = Choose new avatar update_avatar = Update Avatar Setting delete_current_avatar = Delete Current Avatar uploaded_avatar_not_a_image = Uploaded file is not a image. -update_avatar_success = Your avatar setting has been updated successfully. +update_avatar_success = Your avatar setting has been updated. change_password = Change Password old_password = Current Password new_password = New Password retype_new_password = Retype New Password -password_incorrect = Current password is not correct. +password_incorrect = Current password is incorrect. change_password_success = Your password was successfully changed. You can now sign using your new password. password_change_disabled = Non-local users are not allowed to change their password through the web interface. emails = Email Addresses manage_emails = Manage email addresses +manage_openid = Manage OpenID addresses email_desc = Your primary email address will be used for notifications and other operations. primary = Primary primary_email = Set as primary delete_email = Delete -email_deletion = Email Deletion -email_deletion_desc = Deleting this email address will remove all related information from your account. Do you want to continue? +email_deletion = Delete Email +email_deletion_desc = Deleting this email address will remove all related information from your account. Git commits using this email will remain unchanged. Do you want to continue? email_deletion_success = Email has been deleted successfully! +openid_deletion = OpenID Deletion +openid_deletion_desc = Deleting this OpenID address from your account will prevent you from signing in with it. Are you sure you want to continue ? +openid_deletion_success = OpenID has been deleted successfully! add_new_email = Add new email address +add_new_openid = Add new OpenID URI add_email = Add email -add_email_confirmation_sent = A new confirmation email has been sent to '%s', please check your inbox within the next %d hours to complete the confirmation process. +add_openid = Add OpenID URI +add_email_confirmation_sent = A new confirmation email has been sent to '%s'. Please check your inbox within the next %s to confirm your email. add_email_success = Your new email address was successfully added. +add_openid_success = Your new OpenID address was successfully added. keep_email_private = Keep Email Address Private keep_email_private_popup = Your email address will be hidden from other users if this option is set. +openid_desc = Your OpenID addresses will let you delegate authentication to your provider of choice manage_ssh_keys = Manage SSH Keys +manage_gpg_keys = Manage GPG Keys add_key = Add Key -ssh_desc = This is a list of SSH keys associated with your account. Because these keys allow anyone using them to gain access to your repositories, it is highly important that you make sure you recognize them. -ssh_helper = Don't know how? Check out GitHub's guide to create your own SSH keys or solve common problems you might encounter using SSH. +ssh_desc = These are the SSH keys associated with your account. Because these keys allow anyone using them to gain access to your repositories, it is very important you make sure you recognize them. +gpg_desc = These are the GPG keys associated with your account. Because these keys allow commits to be verified, it is very important that you keep the corresponding private key safe. +ssh_helper = Need help? Have a look at GitHub's guide to create your own SSH keys or solve common problems you may encounter using SSH. +gpg_helper = Need help? Have a look at GitHub's guide about GPG. add_new_key = Add SSH Key -ssh_key_been_used = Public key content has already been used. -ssh_key_name_used = Public key with same name already exists. +add_new_gpg_key = Add GPG Key +ssh_key_been_used = This public key has already been used. +ssh_key_name_used = A public key with same name already exists. +gpg_key_id_used = A public GPG key with same id already exists. +gpg_key_email_not_found = The email attached to the GPG key couldn't be found or is not confirmed yet: %s +subkeys = Subkeys +key_id = Key ID key_name = Key Name key_content = Content -add_key_success = Your new SSH key '%s' has been added successfully! +add_key_success = Your SSH key '%s' has been added. +add_gpg_key_success = Your GPG key '%s' has been added. delete_key = Delete ssh_key_deletion = SSH Key Deletion -ssh_key_deletion_desc = Delete this SSH key will disable all access using this SSH key for your account. Do you want to continue? -ssh_key_deletion_success = SSH key has been deleted successfully! +gpg_key_deletion = GPG Key Deletion +ssh_key_deletion_desc = Deleting this SSH key will revoke all access using this SSH key for your account. Do you want to continue? +gpg_key_deletion_desc = Deleting this GPG key will unverify all commits signed with this GPG key. Are you sure you want to continue? +ssh_key_deletion_success = The SSH key has been deleted. +gpg_key_deletion_success = The GPG key has been deleted. add_on = Added on +valid_until = Valid until +valid_forever = Valid forever last_used = Last used on no_activity = No recent activity -key_state_desc = This key is used in last 7 days -token_state_desc = This token is used in last 7 days +key_state_desc = This key has been used in the last 7 days +token_state_desc = This token has been used in the last 7 days +show_openid = Show on profile +hide_openid = Hide from profile manage_social = Manage Associated Social Accounts social_desc = This is a list of associated social accounts. For security reasons, please make sure you recognize all of these entries, as they can be used to log in to your account. @@ -360,54 +413,56 @@ tokens_desc = Tokens you have generated which can be used to access the Gitea AP new_token_desc = Each token will have full access to your account. token_name = Token Name generate_token = Generate Token -generate_token_succees = Your access token was successfully generated! Be sure to copy it right now, because you will not be able to see it again later! +generate_token_success = Your access token was successfully generated! Be sure to copy it right now, because you will not be able to see it again later! delete_token = Delete access_token_deletion = Personal Access Token Deletion -access_token_deletion_desc = Delete this personal access token will disable access for any application using this token. Do you want to continue? -delete_token_success = Personal access token has been removed successfully! Don't forget to update any applications using this token as well. +access_token_deletion_desc = Delete this personal access token will revoke access for any application using this token. Do you want to continue? +delete_token_success = The personal access token has been removed. Don't forget to update any applications using this token. -twofa_desc = Gitea supports two-factor authentication to provide additional security for your account. -twofa_is_enrolled = Your account is enrolled in two-factor authentication. +twofa_desc = Gitea supports two-factor authentication to enhance the security of your account. +twofa_is_enrolled = Your account is currently enrolled in two-factor authentication. twofa_not_enrolled = Your account is not currently enrolled in two-factor authentication. twofa_disable = Disable two-factor authentication twofa_scratch_token_regenerate = Regenerate scratch token twofa_scratch_token_regenerated = Your scratch token has been regenerated. It is now %s. Keep it in a safe place. twofa_enroll = Enroll into two-factor authentication twofa_disable_note = If needed, you can disable two-factor authentication. -twofa_disable_desc = Disabling two-factor authentication will make your account less secure. Are you sure you want to proceed? -regenerate_scratch_token_desc = If you misplaced your scratch token, or had to use it to log in, you can reset it. +twofa_disable_desc = Disabling two-factor authentication will make your account less secure. Are you sure you want to continue? +regenerate_scratch_token_desc = If you misplaced your scratch token, or have already used it to log in, you can reset it here. twofa_disabled = Two-factor authentication has been disabled. scan_this_image = Scan this image with your authentication application: or_enter_secret = Or enter the secret: %s -then_enter_passcode = Then enter the passcode the application gives you: +then_enter_passcode = And enter the passcode the application gives you: passcode_invalid = That passcode is invalid. Try again. twofa_enrolled = Your account has now been enrolled in two-factor authentication. Make sure to save your scratch token (%s), as it will only be shown once! manage_account_links = Manage account links manage_account_links_desc = External accounts linked to this account -account_links_not_available = There are no external accounts linked to this account +account_links_not_available = There are currently no external accounts linked to this account remove_account_link = Remove linked account -remove_account_link_desc = Delete this account link will remove all related access for your account. Do you want to continue? +remove_account_link_desc = Removing this linked account will revoke all related access using this account. Do you want to continue? remove_account_link_success = Account link has been removed successfully! +orgs_none = You are not a member of any organizations. + delete_account = Delete Your Account delete_prompt = The operation will delete your account permanently, and CANNOT be undone! confirm_delete_account = Confirm Deletion delete_account_title = Account Deletion -delete_account_desc = This account is going to be deleted permanently, do you want to continue? +delete_account_desc = Are you sure you want to permanently delete this account? [repo] owner = Owner repo_name = Repository Name -repo_name_helper = A good repository name is usually composed of short, memorable, and unique keywords. +repo_name_helper = A good repository name is composed of short, memorable, and unique keywords. visibility = Visibility visiblity_helper = This repository is Private -visiblity_helper_forced = Site admin has forced all new repositories to be Private +visiblity_helper_forced = Your system administrator has forced all new repositories to be Private visiblity_fork_helper = (Change of this value will affect all forks) clone_helper = Need help cloning? Visit Help! fork_repo = Fork Repository fork_from = Fork From -fork_visiblity_helper = You cannot alter the visibility of a forked repository. +fork_visiblity_helper = You cannot change the visibility of a forked repository. repo_desc = Description repo_lang = Language repo_gitignore_helper = Select .gitignore templates @@ -419,16 +474,17 @@ auto_init = Initialize this repository with selected files and template create_repo = Create Repository default_branch = Default Branch mirror_prune = Prune -mirror_prune_desc = Remove any remote-tracking references that no longer exist on the remote -mirror_interval = Mirror Interval (hour) +mirror_prune_desc = Remove any remote-tracking references which no longer exist on the remote +mirror_interval = Mirror interval (valid time units are "h", "m", "s") +mirror_interval_invalid = Mirror interval is not valid mirror_address = Mirror Address -mirror_address_desc = Please include necessary user credentials in the address. +mirror_address_desc = Please include any necessary user credentials in the address. mirror_last_synced = Last Synced watchers = Watchers stargazers = Stargazers forks = Forks -form.reach_limit_of_creation = You have reached your maximum creation limit of %d repositories. +form.reach_limit_of_creation = You have already reached your limit of %d repositories. form.name_reserved = The repository name '%s' is reserved. form.name_pattern_not_allowed = The repository name pattern '%s' is not allowed. @@ -442,9 +498,11 @@ migrate.clone_local_path = or local server path migrate.permission_denied = You are not allowed to import local repositories. migrate.invalid_local_path = Invalid local path, it does not exist or not a directory. migrate.failed = Migration failed: %v +migrate.lfs_mirror_unsupported = Mirroring LFS objects is not supported - use 'git lfs fetch --all' and 'git lfs push --all' instead. mirror_from = mirror of forked_from = forked from +fork_from_self = You cannot fork a repository you already own! copy_link = Copy copy_link_success = Copied! copy_link_error = Press ⌘-C or Ctrl-C to copy @@ -459,11 +517,12 @@ download_archive = Download this repository no_desc = No Description quick_guide = Quick Guide clone_this_repo = Clone this repository -create_new_repo_command = Create a new repository on the command line -push_exist_repo = Push an existing repository from the command line -repo_is_empty = This repository is empty, please come back later! +create_new_repo_command = Creating a new repository on the command line +push_exist_repo = Pushing an existing repository from the command line +bare_message = This repository does not contain any content. code = Code +code.desc = Code is where the code is stored branch = Branch tree = Tree filter_branch_and_tag = Filter branch or tag @@ -482,12 +541,13 @@ file_permalink = Permalink file_too_large = This file is too large to be shown video_not_supported_in_browser = Your browser doesn't support HTML5 video tag. stored_lfs = Stored with Git LFS +commit_graph = Commit graph editor.new_file = New file editor.upload_file = Upload file editor.edit_file = Edit file editor.preview_changes = Preview Changes -editor.cannot_edit_non_text_files = Cannot edit non-text files +editor.cannot_edit_non_text_files = Cannot edit binary files from the web interface editor.edit_this_file = Edit this file editor.must_be_on_a_branch = You must be on a branch to make or propose changes to this file editor.fork_before_edit = You must fork this repository before editing the file @@ -521,17 +581,25 @@ editor.fail_to_update_file = Failed to update/create file '%s' with error: %v editor.add_subdir = Add subdirectory... editor.unable_to_upload_files = Failed to upload files to '%s' with error: %v editor.upload_files_to_dir = Upload files to '%s' +editor.cannot_commit_to_protected_branch = Can not commit to protected branch '%s'. +commits.desc = Commits show the change history of the code commits.commits = Commits commits.search = Search commits -commits.search_all = All -commits.find = Find +commits.find = Search +commits.search_all = All branches commits.author = Author commits.message = Message commits.date = Date commits.older = Older commits.newer = Newer +commits.signed_by = Signed by +commits.gpg_key_id = GPG key ID +ext_issues = Ext Issues +ext_issues.desc = Ext Issues link to an external issue management page + +issues.desc = Issues is the place to manage tasks and bugs issues.new = New Issue issues.new.labels = Labels issues.new.no_label = No Label @@ -558,6 +626,7 @@ issues.remove_label_at = `removed the
%[3]s issues.opened_by_fake = opened %[1]s by %[2]s issues.previous = Previous @@ -616,14 +692,19 @@ issues.label_edit = Edit issues.label_delete = Delete issues.label_modify = Label Modification issues.label_deletion = Label Deletion -issues.label_deletion_desc = Deleting this label will remove its information in all related issues. Are you sure you want to continue? -issues.label_deletion_success = This label has been deleted successfully! +issues.label_deletion_desc = Deleting this label will remove it from all issues. Are you sure you want to continue? +issues.label_deletion_success = The label has been deleted successfully! issues.label.filter_sort.alphabetically = Alphabetically issues.label.filter_sort.reverse_alphabetically = Reverse alphabetically +issues.label.filter_sort.by_size = Size +issues.label.filter_sort.reverse_by_size = Reverse size issues.num_participants = %d Participants issues.attachment.open_tab = `Click to see "%s" in a new tab` issues.attachment.download = `Click to download "%s"` +issues.subscribe = Subscribe +issues.unsubscribe = Unsubscribe +pulls.desc = Pulls management your code review and merge requests pulls.new = New Pull Request pulls.compare_changes = Compare Changes pulls.compare_changes_desc = Compare two branches and make a pull request for changes. @@ -641,14 +722,14 @@ pulls.tab_commits = Commits pulls.tab_files = Files changed pulls.reopen_to_merge = Please reopen this pull request to perform a merge. pulls.merged = Merged -pulls.has_merged = This pull request has been merged successfully! +pulls.has_merged = This pull request has been merged successfully. pulls.data_broken = Data of this pull request has been broken due to deletion of fork information. pulls.is_checking = The conflict checking is still in progress, please refresh page in few moments. pulls.can_auto_merge_desc = This pull request can be merged automatically. pulls.cannot_auto_merge_desc = This pull request cannot be merged automatically because there are conflicts. pulls.cannot_auto_merge_helper = Please merge manually in order to resolve the conflicts. pulls.merge_pull_request = Merge Pull Request -pulls.open_unmerged_pull_exists = `You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.` +pulls.open_unmerged_pull_exists = `You cannot perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.` milestones.new = New Milestone milestones.open_tab = %d Open @@ -666,12 +747,12 @@ milestones.clear = Clear milestones.invalid_due_date_format = Due date format is invalid, must be 'yyyy-mm-dd'. milestones.create_success = Milestone '%s' has been created successfully! milestones.edit = Edit Milestone -milestones.edit_subheader = Use a better description for milestones so people won't be confused. +milestones.edit_subheader = Use a good description for milestones so people won't be confused. milestones.cancel = Cancel milestones.modify = Modify Milestone milestones.edit_success = Changes of milestone '%s' has been saved successfully! milestones.deletion = Milestone Deletion -milestones.deletion_desc = Deleting this milestone will remove its information in all related issues. Do you want to continue? +milestones.deletion_desc = Deleting this milestone will remove it from all related issues. Do you want to continue? milestones.deletion_success = Milestone has been deleted successfully! milestones.filter_sort.closest_due_date = Closest due date milestones.filter_sort.furthest_due_date = Furthest due date @@ -680,9 +761,13 @@ milestones.filter_sort.most_complete = Most complete milestones.filter_sort.most_issues = Most issues milestones.filter_sort.least_issues = Least issues +ext_wiki = Ext Wiki +ext_wiki.desc = Ext Wiki links to an external wiki system + wiki = Wiki -wiki.welcome = Welcome to the project wiki! -wiki.welcome_desc = A wiki allows you or your users to easily document your project. +wiki.welcome = Welcome to the project wiki +wiki.welcome_desc = A wiki allows you and your collaborators to easily document your project. +wiki.desc = Wiki is a place to store documentation wiki.create_first_page = Create the first page wiki.page = Page wiki.filter_page = Filter page @@ -699,6 +784,7 @@ wiki.pages = Pages wiki.last_updated = Last updated %s settings = Settings +settings.desc = Settings is where you can manage the settings for the repository settings.options = Options settings.collaboration = Collaboration settings.collaboration.admin = Admin @@ -710,7 +796,7 @@ settings.githooks = Git Hooks settings.basic_settings = Basic Settings settings.mirror_settings = Mirror Settings settings.sync_mirror = Sync Now -settings.mirror_sync_in_progress = Mirror syncing is in progress, please refresh page in about a minute. +settings.mirror_sync_in_progress = Mirror sync in progress. Please refresh the page to check again in a minute. settings.site = Official Site settings.update_settings = Update Settings settings.advanced_settings = Advanced Settings @@ -738,7 +824,7 @@ settings.convert = Convert To Regular Repository settings.convert_desc = You can convert this mirror to a regular repository. This cannot be undone. settings.convert_notices_1 = - This operation will convert this repository mirror into a regular repository and cannot be undone. settings.convert_confirm = Confirm Conversion -settings.convert_succeed = Repository has been converted to a regular repository successfully. +settings.convert_succeed = Repository has been converted to a regular repository. settings.transfer = Transfer Ownership settings.transfer_desc = Transfer this repository to another user or to an organization in which you have admin rights. settings.transfer_notices_1 = - You will lose access if the new owner is a individual user. @@ -747,17 +833,17 @@ settings.transfer_form_title = Please enter the following information to confirm settings.wiki_delete = Erase Wiki Data settings.wiki_delete_desc = Once you erase wiki data there is no going back. Please be certain. settings.wiki_delete_notices_1 = - This will delete and disable the wiki for %s -settings.wiki_deletion_success = Repository wiki data have been erased successfully. +settings.wiki_deletion_success = Repository wiki data have been erased. settings.delete = Delete This Repository settings.delete_desc = Once you delete a repository, there is no going back. Please be certain. settings.delete_notices_1 = - This operation CANNOT be undone. -settings.delete_notices_2 = - This operation will permanently delete the everything of this repository, including Git data, issues, comments and accesses of collaborators. -settings.delete_notices_fork_1 = - All forks will become independent after deletion. -settings.deletion_success = Repository has been deleted successfully! -settings.update_settings_success = Repository options has been updated successfully. +settings.delete_notices_2 = - This operation will permanently delete everything in this repository including code, issues, comments, the wiki, and collaborators associations. +settings.delete_notices_fork_1 = - All forks will become independent repositories after deletion. +settings.deletion_success = Repository has been deleted. +settings.update_settings_success = Repository options have been updated. settings.transfer_owner = New Owner settings.make_transfer = Make Transfer -settings.transfer_succeed = Repository ownership has been transferred successfully. +settings.transfer_succeed = Repository ownership has been transferred. settings.confirm_delete = Confirm Deletion settings.add_collaborator = Add New Collaborator settings.add_collaborator_success = New collaborator has been added. @@ -769,7 +855,7 @@ settings.search_user_placeholder = Search user... settings.org_not_allowed_to_be_collaborator = Organization is not allowed to be added as a collaborator. settings.user_is_org_member = User is organization member who cannot be added as a collaborator. settings.add_webhook = Add Webhook -settings.hooks_desc = Webhooks are much like basic HTTP POST event triggers. Whenever something occurs in Gitea, we will handle the notification to the target host you specify. Learn more in this Webhooks Guide. +settings.hooks_desc = Webhooks are much like basic HTTP POST event triggers. Whenever something occurs in Gitea, we will send a notification to the target host. Learn more in the webhooks guide. settings.webhook_deletion = Delete Webhook settings.webhook_deletion_desc = Deleting this webhook will remove its information and all delivery history. Are you sure you want to continue? settings.webhook_deletion_success = Webhook has been deleted successfully! @@ -786,7 +872,7 @@ settings.githook_edit_desc = If the hook is inactive, sample content will be pre settings.githook_name = Hook Name settings.githook_content = Hook Content settings.update_githook = Update Hook -settings.add_webhook_desc = Gitea will send a POST request to the URL you specify, along with regarding the event that occured. You can also specify what kind of data format you'd like to get upon triggering the hook (JSON, x-www-form-urlencoded, XML, etc). More information can be found in our Webhooks Guide. +settings.add_webhook_desc = Gitea will send a POST request to the URL you specify, along with information about the event that occurred. You can also specify what data format you would like to receive upon triggering the hook (JSON, x-www-form-urlencoded, XML, etc). More information can be found in our webhooks guide. settings.payload_url = Payload URL settings.content_type = Content Type settings.secret = Secret @@ -804,7 +890,7 @@ settings.event_pull_request_desc = Pull request opened, closed, reopened, edited settings.event_push = Push settings.event_push_desc = Git push to a repository settings.active = Active -settings.active_helper = Details regarding the event which triggered the hook will be delivered as well. +settings.active_helper = Information about the event which triggered the hook will be sent as well. settings.add_hook_success = New webhook has been added. settings.update_webhook = Update Webhook settings.update_hook_success = Webhook has been updated. @@ -825,7 +911,7 @@ settings.key_been_used = Deploy key content has been used. settings.key_name_used = Deploy key with the same name already exists. settings.add_key_success = New deploy key '%s' has been added successfully! settings.deploy_key_deletion = Delete Deploy Key -settings.deploy_key_deletion_desc = Deleting this deploy key will remove all related accesses for this repository. Do you want to continue? +settings.deploy_key_deletion_desc = Deleting this deploy key will prevent this repository from being accessed with it. Do you want to continue? settings.deploy_key_deletion_success = The deploy key has been deleted successfully! settings.branches=Branches settings.protected_branch=Branch Protection @@ -839,11 +925,14 @@ settings.add_protected_branch_failed= %s Locked failed settings.remove_protected_branch_success=%s Unlocked successfully settings.protected_branch_deletion=To delete a protected branch settings.protected_branch_deletion_desc=Anyone with write permissions will be able to push directly to this branch. Are you sure? +settings.default_branch_desc = The default branch is considered the "base" branch in your repository against which all pull requests and code commits are automatically made, unless you specify a different branch. +settings.choose_branch = Choose a branch... +settings.no_protected_branch = There are no protected branches diff.browse_source = Browse Source diff.parent = parent diff.commit = commit -diff.data_not_available = Diff Content Not Availaible +diff.data_not_available = Diff Content Not Available diff.show_diff_stats = Show Diff Stats diff.show_split_view = Split View diff.show_unified_view = Unified View @@ -853,6 +942,7 @@ diff.view_file = View File diff.file_suppressed = File diff suppressed because it is too large diff.too_many_files = Some files were not shown because too many files changed in this diff +releases.desc = Releases is the place to manage versions of your project release.releases = Releases release.new_release = New Release release.draft = Draft @@ -862,10 +952,10 @@ release.edit = edit release.ahead = %d commits to %s since this release release.source_code = Source Code release.new_subheader = Publish releases to keep track of project versions. -release.edit_subheader = A detailed change log can help users understand what has been changed. +release.edit_subheader = A detailed changelog can help users understand what has been changed. release.tag_name = Tag name release.target = Target -release.tag_helper = Choose an existing tag, or create a new tag on publish. +release.tag_helper = Choose an existing tag, or create a new tag. release.title = Title release.content = Content release.write = Write @@ -879,19 +969,19 @@ release.save_draft = Save Draft release.edit_release = Edit Release release.delete_release = Delete This Release release.deletion = Release Deletion -release.deletion_desc = Deleting this release will delete the corresponding Git tag. Do you want to continue? -release.deletion_success = Release has been deleted successfully! +release.deletion_desc = Deleting this release will delete the corresponding Git tag. You will not lose any code. Do you want to continue? +release.deletion_success = The release has been deleted. release.tag_name_already_exist = Release with this tag name already exists. release.tag_name_invalid = Tag name is not valid. release.downloads = Downloads branch.delete = Delete Branch %s -branch.delete_desc = Once you delete a branch, there is no going back. Please be certain. +branch.delete_desc = Deleting a branch is permanent. There is no way to undo it. branch.delete_notices_1 = - This operation CANNOT be undone. -branch.delete_notices_2 = - This operation will permanently delete everything of branch %s. -branch.deletion_success = %s has been deleted successfully! +branch.delete_notices_2 = - This operation will permanently delete everything in branch %s. +branch.deletion_success = %s has been deleted. branch.deletion_failed = Failed to delete branch %s. -branch.delete_branch_has_new_commits = %s cannot be deleted because it has new commits after merging. +branch.delete_branch_has_new_commits = %s cannot be deleted because new commits have been added after merging. [org] org_name_holder = Organization Name @@ -908,9 +998,10 @@ create_new_team = Create New Team org_desc = Description team_name = Team Name team_desc = Description -team_name_helper = You'll use this name to mention this team in conversations. +team_name_helper = You will use this name to mention this team in conversations. team_desc_helper = What is this team for? -team_permission_desc = What permission level should this team have? +team_permission_desc = What permissions should this team have? +team_unit_desc = Which units should this team have access to? form.name_reserved = Organization name '%s' is reserved. form.name_pattern_not_allowed = Organization name pattern '%s' is not allowed. @@ -922,16 +1013,16 @@ settings.full_name = Full Name settings.website = Website settings.location = Location settings.update_settings = Update Settings -settings.update_setting_success = Organization settings has been updated successfully. -settings.change_orgname_prompt = This change will affect how links relate to the organization. -settings.update_avatar_success = Organization avatar setting has been updated successfully. +settings.update_setting_success = Organization settings have been updated. +settings.change_orgname_prompt = This change will change the links to the organization. +settings.update_avatar_success = The organization avatar has been updated. settings.delete = Delete Organization settings.delete_account = Delete This Organization settings.delete_prompt = The organization will be permanently removed, and this CANNOT be undone! settings.confirm_delete_account = Confirm Deletion settings.delete_org_title = Organization Deletion -settings.delete_org_desc = This organization is going to be deleted permanently, do you want to continue? -settings.hooks_desc = Add webhooks that will be triggered for all repositories under this organization. +settings.delete_org_desc = This organization is going to be deleted permanently, are you sure you want to continue? +settings.hooks_desc = Add webhooks which will be triggered for all repositories under this organization. members.membership_visibility = Membership Visibility: members.public = Public @@ -962,8 +1053,8 @@ teams.update_settings = Update Settings teams.delete_team = Delete This Team teams.add_team_member = Add Team Member teams.delete_team_title = Team Deletion -teams.delete_team_desc = As this team will be deleted, members of this team may lose access to some repositories. Do you want to continue? -teams.delete_team_success = Given team has been deleted successfully. +teams.delete_team_desc = Because this team will be deleted, members of this team may lose access to some repositories. Do you want to continue? +teams.delete_team_success = The team has been deleted. teams.read_permission_desc = This team grants Read access: members can view and clone the team's repositories. teams.write_permission_desc = This team grants Write access: members can read from and push to the team's repositories. teams.admin_permission_desc = This team grants Admin access: members can read from, push to, and add collaborators to the team's repositories. @@ -993,23 +1084,24 @@ dashboard.statistic_info = Gitea database has %d users, %d organiz dashboard.operation_name = Operation Name dashboard.operation_switch = Switch dashboard.operation_run = Run -dashboard.clean_unbind_oauth = Clean unbound OAuthes -dashboard.clean_unbind_oauth_success = All unbound OAuthes have been deleted successfully. +dashboard.clean_unbind_oauth = Clean unbound OAuth connections +dashboard.clean_unbind_oauth_success = All unbound OAuth connections have been deleted. dashboard.delete_inactivate_accounts = Delete all inactive accounts -dashboard.delete_inactivate_accounts_success = All inactivate accounts have been deleted successfully. +dashboard.delete_inactivate_accounts_success = All inactive accounts have been deleted. dashboard.delete_repo_archives = Delete all repositories archives -dashboard.delete_repo_archives_success = All repositories archives have been deleted successfully. -dashboard.delete_missing_repos = Delete all repository records which have lost their corresponding Git files -dashboard.delete_missing_repos_success = All repository records which have lost their corresponding Git files have been deleted successfully. +dashboard.delete_repo_archives_success = All repositories archives have been deleted. +dashboard.delete_missing_repos = Delete all repository records which are missing their Git files +dashboard.delete_missing_repos_success = All repository records which are missing their Git files have been deleted. dashboard.git_gc_repos = Execute garbage collection on all repositories -dashboard.git_gc_repos_success = All repositories have executed garbage collection successfully. -dashboard.resync_all_sshkeys = Rewrite '.ssh/authorized_keys' file (caution: non-Gitea keys will be lost) -dashboard.resync_all_sshkeys_success = All public keys have been rewritten successfully. +dashboard.git_gc_repos_success = All repositories have finished executing garbage collection. +dashboard.resync_all_sshkeys = Rewrite '.ssh/authorized_keys' file (for Gitea SSH keys) +dashboard.resync_all_sshkeys_success = All public keys have been rewritten. dashboard.resync_all_hooks = Resync pre-receive, update and post-receive hooks of all repositories. -dashboard.resync_all_hooks_success = All repositories' pre-receive, update and post-receive hooks have been resynced successfully. -dashboard.reinit_missing_repos = Reinitialize all lost Git repositories for which records exist -dashboard.reinit_missing_repos_success = All lost Git repositories for which records existed have been reinitialized successfully. - +dashboard.resync_all_hooks_success = All repositories' pre-receive, update and post-receive hooks have been resynced. +dashboard.reinit_missing_repos = Reinitialize all missing Git repositories for which records exist +dashboard.reinit_missing_repos_success = All missing Git repositories for which records existed have been reinitialized. +dashboard.sync_external_users = Synchronize external user data +dashboard.sync_external_users_started = External user synchronization started dashboard.server_uptime = Server Uptime dashboard.current_goroutine = Current Goroutines dashboard.current_memory_usage = Current Memory Usage @@ -1040,7 +1132,7 @@ dashboard.total_gc_pause = Total GC Pause dashboard.last_gc_pause = Last GC Pause dashboard.gc_times = GC Times -users.user_manage_panel = User Manage Panel +users.user_manage_panel = User Management Panel users.new_account = Create New Account users.name = Name users.activated = Activated @@ -1050,46 +1142,49 @@ users.created = Created users.last_login = Last Login users.never_login = Never Login users.send_register_notify = Send Registration Notification To User -users.new_success = New account '%s' has been created successfully. +users.new_success = The account '%s' has been created. users.edit = Edit users.auth_source = Authentication Source users.local = Local users.auth_login_name = Authentication Login Name users.password_helper = Leave it empty to remain unchanged. -users.update_profile_success = Account profile has been updated successfully. +users.update_profile_success = Account profile has been updated. users.edit_account = Edit Account users.max_repo_creation = Maximum Repository Creation Limit users.max_repo_creation_desc = (Set -1 to use global default limit) -users.is_activated = This account is activated -users.prohibit_login = This account is prohibited to login +users.is_activated = This account has completed activation +users.prohibit_login = This account is blocked from logging in users.is_admin = This account has administrator permissions users.allow_git_hook = This account has permission to create Git hooks users.allow_import_local = This account has permissions to import local repositories -users.allow_create_organization = This account has permissions to create Organizations +users.allow_create_organization = This account has permissions to create organizations users.update_profile = Update Account Profile users.delete_account = Delete This Account -users.still_own_repo = This account still has ownership over at least one repository, you need to delete or transfer them first. -users.still_has_org = This account still has membership in at least one organization, you need to leave or delete the organizations first. -users.deletion_success = Account has been deleted successfully! +users.still_own_repo = This account still owns one or more repositories, you need to delete or transfer them first. +users.still_has_org = This account still is a member of one or more organizations, you need to leave or delete the organizations first. +users.deletion_success = Account has been deleted successfully. -orgs.org_manage_panel = Organization Manage Panel +orgs.org_manage_panel = Organization Management orgs.name = Name orgs.teams = Teams orgs.members = Members +orgs.new_orga = Create Organization -repos.repo_manage_panel = Repository Manage Panel +repos.repo_manage_panel = Repository Management repos.owner = Owner repos.name = Name repos.private = Private repos.watches = Watches repos.stars = Stars repos.issues = Issues +repos.size = Size -auths.auth_manage_panel = Authentication Manage Panel +auths.auth_manage_panel = Authentication Management auths.new = Add New Source auths.name = Name auths.type = Type auths.enabled = Enabled +auths.syncenabled = Enable user synchronization auths.updated = Updated auths.auth_type = Authentication Type auths.auth_name = Authentication Name @@ -1099,7 +1194,7 @@ auths.host = Host auths.port = Port auths.bind_dn = Bind DN auths.bind_password = Bind Password -auths.bind_password_helper = Warning: This password is stored in plain text. Do not use a high privileged account. +auths.bind_password_helper = Warning: This password is stored in plain text. Do not use a highly privileged account. auths.user_base = User Search Base auths.user_dn = User DN auths.attribute_username = Username attribute @@ -1115,24 +1210,40 @@ auths.smtp_auth = SMTP Authentication Type auths.smtphost = SMTP Host auths.smtpport = SMTP Port auths.allowed_domains = Allowed Domains -auths.allowed_domains_helper = Leave it empty to not restrict any domains. Multiple domains should be separated by comma ','. +auths.allowed_domains_helper = Leave it empty to allow all domains. Multiple domains should be separated by comma ','. auths.enable_tls = Enable TLS Encryption auths.skip_tls_verify = Skip TLS Verify auths.pam_service_name = PAM Service Name -auths.oauth2_provider = OAuth2 provider +auths.oauth2_provider = OAuth2 Provider auths.oauth2_clientID = Client ID (Key) auths.oauth2_clientSecret = Client Secret +auths.openIdConnectAutoDiscoveryURL = OpenID Connect Auto Discovery URL +auths.oauth2_use_custom_url = Use custom URLs instead of default URLs +auths.oauth2_tokenURL = Token URL +auths.oauth2_authURL = Authorize URL +auths.oauth2_profileURL = Profile URL +auths.oauth2_emailURL = Email URL auths.enable_auto_register = Enable Auto Registration auths.tips = Tips -auths.tip.github = Register a new OAuth application on https://github.com/settings/applications/new and use /user/oauth2//callback as "Authorization callback URL" -auths.edit = Edit Authentication Setting +auths.tips.oauth2.general = OAuth2 Authentication +auths.tips.oauth2.general.tip = When registering a new OAuth2 authentication, the callback/redirect URL should be: /user/oauth2//callback +auths.tip.oauth2_provider = OAuth2 Provider +auths.tip.bitbucket = Register a new OAuth consumer on https://bitbucket.org/account/user//oauth-consumers/new and add the permission "Account"-"Read" +auths.tip.dropbox = Create a new App on https://www.dropbox.com/developers/apps +auths.tip.facebook = Register a new App on https://developers.facebook.com/apps and add the product "Facebook Login" +auths.tip.github = Register a new OAuth application on https://github.com/settings/applications/new +auths.tip.gitlab = Register a new application on https://gitlab.com/profile/applications +auths.tip.google_plus = Obtain OAuth2 client credentials from the Google API console (https://console.developers.google.com/) +auths.tip.openid_connect = Use the OpenID Connect Discovery URL (/.well-known/openid-configuration) to specify the endpoints +auths.tip.twitter = Go to https://dev.twitter.com/apps , create an application and ensure that the “Allow this application to be used to Sign in with Twitter” option is enabled. +auths.edit = Edit Authentication Settings auths.activated = This authentication is activated -auths.new_success = New authentication '%s' has been added successfully. -auths.update_success = The authentication settings have been updated successfully. -auths.update = Update Authentication Setting +auths.new_success = The authentication '%s' has been added. +auths.update_success = The authentication settings have been updated. +auths.update = Update Authentication Settings auths.delete = Delete This Authentication Source -auths.delete_auth_title = Authentication Deletion -auths.delete_auth_desc = This authentication source is going to be deleted, do you want to continue? +auths.delete_auth_title = Delete Authentication Source +auths.delete_auth_desc = This authentication source will be deleted, are you sure you want to continue? auths.still_in_used = This authentication source is still used by some users, please delete or convert these users to another login type first. auths.deletion_success = Authentication has been deleted successfully! auths.login_source_exist = Login source '%s' already exists. @@ -1141,6 +1252,7 @@ config.server_config = Server Configuration config.app_name = Application Name config.app_ver = Application Version config.app_url = Application URL +config.custom_conf = Configuration File Path config.domain = Domain config.offline_mode = Offline Mode config.disable_router_log = Disable Router Log @@ -1156,7 +1268,7 @@ config.reverse_auth_user = Reverse Authentication User config.ssh_config = SSH Configuration config.ssh_enabled = Enabled -config.ssh_start_builtin_server = Start Builtin Server +config.ssh_start_builtin_server = Start built-in Server config.ssh_domain = Domain config.ssh_port = Port config.ssh_listen_port = Listen Port @@ -1179,20 +1291,23 @@ config.db_path_helper = (for "sqlite3" and "tidb") config.service_config = Service Configuration config.register_email_confirm = Require Email Confirmation config.disable_register = Disable Registration +config.enable_openid_signup = Enable Registration via OpenID +config.enable_openid_signin = Enable OpenID Sign In config.show_registration_button = Show Register Button config.require_sign_in_view = Require Sign In View config.mail_notify = Mail Notification config.disable_key_size_check = Disable Minimum Key Size Check config.enable_captcha = Enable Captcha config.active_code_lives = Active Code Lives -config.reset_password_code_lives = Reset Password Code Lives +config.reset_password_code_lives = Reset Password Code Expiry Time config.default_keep_email_private = Default Value for Keep Email Private +config.default_allow_create_organization = Default permission to create organizations config.no_reply_address = No-reply Address config.webhook_config = Webhook Configuration config.queue_length = Queue Length config.deliver_timeout = Deliver Timeout -config.skip_tls_verify = Skip TLS Verify +config.skip_tls_verify = Skip TLS Verification config.mailer_config = Mailer Configuration config.mailer_enabled = Enabled @@ -1201,7 +1316,7 @@ config.mailer_name = Name config.mailer_host = Host config.mailer_user = User config.send_test_mail = Send Test Email -config.test_mail_failed = Fail to send test email to '%s': %v +config.test_mail_failed = Failed to send test email to '%s': %v config.test_mail_sent = Test email has been sent to '%s'. config.oauth_config = OAuth Configuration @@ -1254,7 +1369,7 @@ monitor.start = Start Time monitor.execute_time = Execution Time notices.system_notice_list = System Notices -notices.view_detail_header = View Notice Detail +notices.view_detail_header = View Notice Details notices.actions = Actions notices.select_all = Select All notices.deselect_all = Deselect All @@ -1265,7 +1380,7 @@ notices.type = Type notices.type_1 = Repository notices.desc = Description notices.op = Op. -notices.delete_success = System notices have been deleted successfully. +notices.delete_success = The system notices have been deleted. [action] create_repo = created repository %s @@ -1281,31 +1396,32 @@ comment_issue = `commented on issue %s#%[2]s` merge_pull_request = `merged pull request %s#%[2]s` transfer_repo = transferred repository %s to %s push_tag = pushed tag %[2]s to %[3]s -compare_commits = View comparison for these %d commits +compare_commits = Compare %d commits [tool] -ago = ago -from_now = from now +ago = %s ago +from_now = %s from now now = now -1s = 1 second %s -1m = 1 minute %s -1h = 1 hour %s -1d = 1 day %s -1w = 1 week %s -1mon = 1 month %s -1y = 1 year %s -seconds = %d seconds %s -minutes = %d minutes %s -hours = %d hours %s -days = %d days %s -weeks = %d weeks %s -months = %d months %s -years = %d years %s +future = future +1s = 1 second +1m = 1 minute +1h = 1 hour +1d = 1 day +1w = 1 week +1mon = 1 month +1y = 1 year +seconds = %d seconds +minutes = %d minutes +hours = %d hours +days = %d days +weeks = %d weeks +months = %d months +years = %d years raw_seconds = seconds raw_minutes = minutes [dropzone] -default_message = Drop files here or click to upload. +default_message = Drop files or click to upload. invalid_input_type = You can't upload files of this type. file_too_big = File size ({{filesize}} MB) exceeds the maximum size of ({{maxFilesize}} MB). remove_file = Remove file @@ -1319,3 +1435,15 @@ no_read = You do not have any read notifications. pin = Pin notification mark_as_read = Mark as read mark_as_unread = Mark as unread + +[gpg] +error.extract_sign = Failed to extract signature +error.generate_hash = Failed to generate hash of commit +error.no_committer_account = No account linked to committer's email +error.no_gpg_keys_found = "No known key found for this signature in database" +error.not_signed_commit = "Not a signed commit" +error.failed_retrieval_gpg_keys = "Failed to retrieve any key attached to the committer account" + +[units] +error.no_unit_allowed_repo = Cannot find any unit on this repository which you are allowed to access +error.unit_not_allowed = You are not allowed to visit this repository unit diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 9f1cf56..eb910b3 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -5,6 +5,7 @@ dashboard=Panel de control explore=Explorar help=Ayuda sign_in=Iniciar sesión +sign_in_with=Iniciar sesión con sign_out=Cerrar sesión sign_up=Registro register=Registro @@ -13,6 +14,7 @@ version=Versión page=Página template=Plantilla language=Idioma +notifications=Notificaciones create_new=Crear... user_profile_and_more=Perfil de usuario y más signed_in_as=Identificado como @@ -21,6 +23,8 @@ username=Nombre de usuario email=Correo electrónico password=Contraseña re_type=Ingrese de nuevo +captcha=Captcha +twofa=Autenticación en dos pasos repository=Repositorio organization=Organización @@ -28,15 +32,16 @@ mirror=Réplica new_repo=Nuevo repositorio new_migrate=Nueva migración new_mirror=Nueva réplica -new_fork=Nuevo fork del repositorio new_org=Nueva organización manage_org=Administrar organizaciones admin_panel=Panel de administración account_settings=Configuraciones de la cuenta settings=Configuraciones your_profile=Tu perfil +your_starred=Tus favoritos your_settings=Tu configuración + activities=Actividad issues=Incidencias @@ -44,52 +49,38 @@ cancel=Cancelar [install] install=Instalación -title=Pasos de la instalación por primera vez -docker_helper=Si está ejecutando Gitea usando Docker, ¡por favor lea estas pautas antes de cambiar nada en esta página! -requite_db_desc=Gitea requiere una base de datos MySQL, PostgreSQL, SQLite3 o TiDB. db_title=Configuración de base de datos db_type=Tipo de base de datos user=Usuario password=Contraseña db_name=Nombre de la base de datos -db_helper=Por favor utilice el motor INNODB con la configuración de caracteres utf8_general_ci para MySQL. ssl_mode=Modo SSL path=Ruta -sqlite_helper=Ruta al archivo de base de datos SQLite3 o TiDB.
Por favor, usa una ruta absoluta cuando inicies como servicio. err_empty_db_path=La ruta a la base de datos SQLite3 o TiDB no puede estar vacía. err_invalid_tidb_name=El nombre de la base de datos TiDB no puede contener los caracteres "." ni "-". no_admin_and_disable_registration=No puede deshabilitar el registro sin crear una cuenta de administrador. err_empty_admin_password=La contraseña de administrador no puede estar vacía. -general_title=Configuración General de Gitea app_name=Nombre de la aplicación -app_name_helper=Pon aquí el nombre de tu organización, ¡alto y claro! repo_path=Ruta del repositorio de Raiz (Root) -repo_path_helper=Todos los repositorios remotos de Git se guardarán en este directorio. run_user=Ejecutar como Usuario run_user_helper=El usuario necesita tener acceso a la Ruta Raíz del Repositorio y ejecutar Gitea. domain=Dominio domain_helper=Esto afecta a las URLs para clonar por SSH. ssh_port=Puerto SSH -ssh_port_helper=Número de puerto de su servidor SSH, déjelo en blanco para desactivar SSH. http_port=Puerto HTTP http_port_helper=Puerto en el que escuchará la aplicación. app_url=URL de la aplicación -app_url_helper=Esto afecta a las URLs para clonar por HTTP/HTTPS y a algunos correos electrónicos. log_root_path=Ruta del registro log_root_path_helper=Directorio donde almacenar los registros. optional_title=Configuración opcional email_title=Configuración del servicio de correo smtp_from=Desde -smtp_from_helper=Remitente del email, RFC 5322. Puede ser solamente una dirección de correo electrónico, o estar en el formato "Nombre" . -mailer_user=Remitente del Correo Electrónico mailer_password=Contraseña del Remitente register_confirm=Habilitar la Confirmación en el Registro -mail_notify=Habilitar las Notificaciones de Correo server_service_title=Configuración del servidor y otros servicios offline_mode=Activar el modo Sin Conexión -offline_mode_popup=Desactivar el CDN incluso en el modo de producción, todos los recursos se servirán localmente. disable_gravatar=Desactivar el servicio Gravatar disable_gravatar_popup=Desactivar Gravatar y cualquier otra fuente personalizada. Todos los avatares deben ser cargados por los usuarios o en su defecto se mostrará el avatar predeterminado. federated_avatar_lookup=Habilitar búsqueda de Avatares Federados @@ -100,7 +91,6 @@ enable_captcha=Activar la Captcha enable_captcha_popup=Requiere validar la captcha para el auto-registro de usuario. require_sign_in_view=Activar el Inicio de Sesión obligatorio para Ver Páginas require_sign_in_view_popup=Solo los usuarios logados pueden ver páginas, los visitantes anónimos solo podrán ver las páginas de login/registro. -admin_setting_desc=No es necesario crear una cuenta de administrador ahora mismo, el usuario que tenga ID=1 obtendrá privilegios de administrador automáticamente. admin_title=Configuración de la cuenta de administrador admin_name=Nombre de usuario admin_password=Contraseña @@ -108,13 +98,8 @@ confirm_password=Confirmar Contraseña admin_email=Correo electrónico del administrador install_btn_confirm=Instalar Gitea test_git_failed=Fallo al probar el comando 'git': %v -sqlite3_not_available=Tu versión no soporta SQLite3, por favor descarga el binario oficial desde %s, NO la versión de gobuild. -invalid_db_setting=La configuración de la base de datos no es correcta: %v invalid_repo_path=La ruta de la raíz del repositorio es inválida: %v -run_user_not_match=El usuario que está ejecutando la aplicación no es el usuario actual: %s -> %s -save_config_failed=Error al guardar la configuración: %v invalid_admin_setting=La configuración de la cuenta de administración es inválida: %v -install_success=Bienvenido! Estamos encantados de que hayas escogido Gitea, diviértete y cuídate. invalid_log_root_path=La ruta para los registros es inválida: %v [home] @@ -122,53 +107,51 @@ uname_holder=Nombre de usuario o correo electrónico password_holder=Contraseña switch_dashboard_context=Cambiar el contexto del Dashboard my_repos=Mis repositorios -show_more_repos=Mostrar más repositorios... collaborative_repos=Repositorios colaborativos my_orgs=Mis organizaciones my_mirrors=Mis réplicas view_home=Ver %s +search_repos=Encontrar un repositorio... issues.in_your_repos=En tus repositorios [explore] repos=Repositorios users=Usuarios +organizations=Organizaciones search=Buscar [auth] -create_new_account=Crear una nueva cuenta register_helper_msg=¿Ya tienes una cuenta? ¡Inicia sesión! -social_register_helper_msg=¿Ya tienes una cuenta? ¡Enlázala! disable_register_prompt=Lo sentimos, el registro está deshabilitado. Por favor, contacta con el administrador del sitio. disable_register_mail=Lo sentimos. Los correos de Confirmación de Registro están deshabilitados. remember_me=Recuérdame -forgot_password=He olvidado mi contraseña -forget_password=¿Has olvidado tu contraseña? +forgot_password_title=He olvidado mi contraseña +forgot_password=¿Has olvidado tu contraseña? sign_up_now=¿Necesitas una cuenta? Regístrate ahora. -confirmation_mail_sent_prompt=Un nuevo correo de confirmación se ha enviado a %s. Por favor, comprueba tu bandeja de entrada en las siguientes %d horas para completar el proceso de registro. active_your_account=Activa tu cuenta prohibit_login=Ingreso prohibido -prohibit_login_desc=Su cuenta tiene prohibido ingresar al sistema, fovor contactar al administrador del sistema. -resent_limit_prompt=Lo sentimos, estás solicitando el reenvío del mail de activación con demasiada frecuencia. Por favor, espera 3 minutos. has_unconfirmed_mail=Hola %s, tu correo electrónico (%s) no está confirmado. Si no has recibido un correo de confirmación o necesitas que lo enviemos de nuevo, por favor, haz click en el siguiente botón. resend_mail=Haz click aquí para reenviar tu correo electrónico de activación -email_not_associate=Esta dirección de correo electrónico no esta asociada a ninguna cuenta. -send_reset_mail=Haga clic aquí para (re)enviar el correo para el restablecimiento de la contraseña reset_password=Restablecer su contraseña -invalid_code=Lo sentimos, su código de confirmación ha expirado o no es valido. reset_password_helper=Haga Clic aquí para restablecer su contraseña password_too_short=La longitud de la contraseña no puede ser menor a %d. -non_local_account=Cuentas que no son locales no pueden cambiar las contraseñas a través de Gitea. +verify=Verificar +login_userpass=Usuario / contraseña +login_openid=OpenID +openid_connect_submit=Conectar +openid_connect_title=Accede con una cuenta existente +openid_register_title=Crear una nueva cuenta [mail] activate_account=Por favor, active su cuenta activate_email=Verifique su correo electrónico reset_password=Restablezca su contraseña -register_success=Registro completado, bienvenido -register_notify=Bienvenido a bordo +register_success=Registro completado [modal] yes=Sí +no=No modify=Editar [form] @@ -178,6 +161,7 @@ Email=Dirección de correo electrónico Password=Contraseña Retype=Vuelva a escribir la contraseña SSHTitle=Nombre de la Clave de SSH +HttpsUrl=URL HTTPS PayloadUrl=URL de carga TeamName=Nombre del equipo AuthName=Nombre de autorización @@ -191,8 +175,6 @@ TreeName=Ruta del archivo Content=Contenido require_error=` no puede estar vacío.` -alpha_dash_error=` los caracteres deben ser Alfanumericos o dash(-_).` -alpha_dash_dot_error=` debe ser un caracter alfanumérivo válido, un guión alto o bajo (-_) o un signo de puntuación.` size_error=` debe ser de tamaño %s.` min_size_error=` debe contener al menos %s caracteres.` max_size_error=` debe contener como máximo %s caracteres.` @@ -200,28 +182,10 @@ email_error=` no es una dirección de correo válida.` url_error=` no es una URL válida.` include_error=` debe contener la subcadena '%s'.` unknown_error=Error desconocido: -captcha_incorrect=El captcha no es válido. -password_not_match=La contraseña de confirmación no coincide. -username_been_taken=Ya existe un usuario con este nombre. -repo_name_been_taken=Ya existe un repositorio con este nombre. -org_name_been_taken=Ya existe una organización con este nombre. -team_name_been_taken=Ya existe un equipo con este nombre. -email_been_used=Esta dirección de correo electrónico ya está en uso. -username_password_incorrect=Nombre de usuario o contraseña incorrectos. -enterred_invalid_repo_name=Por favor, asegúrate de que has introducido correctamente el nombre del repositorio. -enterred_invalid_owner_name=Por favor, asegúrate de que has introducido correctamente el nombre del propietario. -enterred_invalid_password=Por favor, asegúrate de que has introducido correctamente tu contraseña. -user_not_exist=El usuario indicado no existe. -last_org_owner=El usuario que se intenta eliminar es el último miembro del equipo de propietarios. Debe existir otro propietario. -invalid_ssh_key=Lo sentimos, no somos capaces de verificar tu clave SSH: %s -unable_verify_ssh_key=Gitea no puede velificar tu clave SSH, pero asumimos que es válida. Por favor, asegúrate de que es así. auth_failed=Error de autenticación: %v -still_own_repo=Tu cuenta es la propietaria de uno o más repositorios, tienes que borrarlos o transferirlos primero. -still_has_org=Tu cuenta es miembro de una o más organizaciones, tienes que abandonarlas o eliminarlas primero. -org_still_own_repo=Esta organización es dueña de uno o más repositorios, tienes que eliminarlos o transferirlos primero. target_branch_not_exist=La rama de destino no existe @@ -236,29 +200,24 @@ following=Siguiendo follow=Seguir unfollow=Dejar de seguir -form.name_reserved=El usuario '%s' está reservado. -form.name_pattern_not_allowed=El patrón de nombre de usuario '%s' no está permitido. [settings] profile=Perfil password=Contraseña -ssh_keys=Claves SSH +avatar=Avatar social=Redes Sociales applications=Aplicaciones orgs=Organizaciones delete=Eliminar cuenta +twofa=Autenticación en dos pasos uid=UUID public_profile=Perfil público -profile_desc=Tu correo electrónico es público y será usado para todas las notificaciones relacionadas con cualquier cuenta y cualquier operación hecha a través de la web. -password_username_disabled=Los usuarios que no son locales no tienen permitido cambiar su nombre de usuario. full_name=Nombre completo website=Página web location=Localización update_profile=Actualizar perfil -update_profile_success=Tu perfil se ha actualizado correctamente. change_username=Nombre de usuario modificado -change_username_prompt=Este cambio afectará a los enlaces que hacen referencia a su cuenta. continue=Continuar cancel=Cancelar @@ -269,15 +228,11 @@ choose_new_avatar=Selecciona nuevo avatar update_avatar=Actualizar configuración del avatar delete_current_avatar=Eliminar avatar uploaded_avatar_not_a_image=El archivo enviado no es una imagen. -update_avatar_success=La configuración de tu avatar se ha actualizado correctamente. change_password=Cambiar contraseña old_password=Contraseña actual new_password=Nueva contraseña retype_new_password=Confirmar nueva contraseña -password_incorrect=Contraseña actual incorrecta. -change_password_success=La contraseña se ha modificado correctamente. Ya puedes iniciar sesión con tu nueva contraseña. -password_change_disabled=Los usuarios que no son locales no tienen permitido cambiar su contraseña. emails=Direcciones de correo electrónico manage_emails=Gestionar direcciones de correo electrónico @@ -285,91 +240,74 @@ email_desc=Tu dirección de correo principal se utilizará para las notificacion primary=Principal primary_email=Marcar como principal delete_email=Eliminar -email_deletion=Eliminar correo electrónico -email_deletion_desc=Al eliminar esta dirección de correo electrónico se eliminará toda la información asociada a esta. ¿Deseas continuar? email_deletion_success=¡El correo electrónico ha sido eliminado correctamente! add_new_email=Añadir nueva dirección de correo electrónico add_email=Añadir correo electrónico -add_email_confirmation_sent=Un nuevo correo de confirmación ha sido enviado a '%s'. Por favor, comprueba tu bandeja de entrada en las próximas %d horas para completar el proceso. add_email_success=Tu nuevo correo electrónico se ha añadido correctamente. +keep_email_private=Mantener la dirección de correo electrónico privada +keep_email_private_popup=Si activa esta opción se ocultará su dirección de correo electrónico a otros usuarios. manage_ssh_keys=Gestionar Claves SSH add_key=Añadir Clave -ssh_desc=Esta es la lista de claves SSH asociadas con tu cuenta. Elimina cualquier clave que no reconozcas. -ssh_helper=¿Necesitas ayuda? Consulta la guía de GitHub para generar claves SSH o solucionar problemas comunes al usar SSH. add_new_key=Añadir clave SSH -ssh_key_been_used=El contenido de la clave pública se ha utilizado. -ssh_key_name_used=Ya existe una clave pública con el mismo nombre. +add_new_gpg_key=Añadir clave GPG key_name=Nombre de la Clave key_content=Contenido -add_key_success=¡Nueva clave SSH '%s' añadida correctamente! delete_key=Eliminar ssh_key_deletion=Borrado de Clave SSH -ssh_key_deletion_desc=Si elimina esta clave SSH no podrá volver a usarla para acceder a su cuenta. ¿Desea continuar? -ssh_key_deletion_success=¡La clave SSH ha sido eliminada con éxito! add_on=Añadido en +valid_until=Válido hasta last_used=Utilizado por última vez en no_activity=No hay actividad reciente -key_state_desc=Esta clave ha sido usada en los últimos 7 días -token_state_desc=Token usado en los últimos 7 días manage_social=Gestionar Redes Sociales asociadas -social_desc=Esta es una lista de las Redes Sociales asociadas. Elimina cualquier vínculo que no reconozcas. unbind=Desvincular -unbind_success=La Red Social ha sido desvinculada. manage_access_token=Gestionar los Tokens de Acceso personales generate_new_token=Generar nuevo Token -tokens_desc=Tokens usados para acceder al API de Gitea. new_token_desc=Desde ahora, todos los tokens tendrán acceso completo a tu cuenta. token_name=Nombre del Token generate_token=Generar Token -generate_token_succees=¡Los nuevos tokens de acceso se han generado correctamente! Asegúrate de copiar tu nuevo token de acceso personal. ¡No podrás verlo de nuevo! delete_token=Eliminar access_token_deletion=Borrado de Token de Acceso Personal -access_token_deletion_desc=Si elimina este token de acceso personal la aplicación asociada perderá el permiso de acceso. ¿Desea continuar? -delete_token_success=¡El token de acceso personal ha sido eliminado con éxito! No se olvide de actualizar también las aplicaciones asociadas. + +twofa_disable_note=Si es necesario, puede deshabilitar la autenticación en dos pasos. +twofa_disabled=La autenticación en dos pasos ha sido deshabilitada. +scan_this_image=Analiza esta imagen con la aplicación de autenticación: + delete_account=Elimina tu cuenta delete_prompt=La operación eliminará tu cuenta de forma permanente y ¡NO se puede deshacer! confirm_delete_account=Confirmar Eliminación delete_account_title=Eliminación de Cuenta -delete_account_desc=Esta cuenta se va a eliminar permanentemente, ¿quieres continuar? [repo] owner=Propietario repo_name=Nombre del repositorio -repo_name_helper=Los grandes nombres de repositorios son cortos, memorables y únicos. visibility=Visibilidad visiblity_helper=Este repositorio es privado -visiblity_helper_forced=El administrador web ha obligado a todos los repositorios nuevos a ser privados visiblity_fork_helper=(Este cambio afectará a todos los forks) clone_helper=¿Necesitas ayuda con el clone? ¡Consulta la Ayuda! fork_repo=Hacer Fork del repositorio fork_from=Crear un Fork desde -fork_visiblity_helper=No es posible cambiar la visibilidad de un Fork repo_desc=Descripción repo_lang=Idioma repo_gitignore_helper=Seleccionar plantillas de .gitignore license=Licencia license_helper=Selecciona un fichero de licencia +readme=Léeme readme_helper=Seleccione una plantilla de archivo readme auto_init=Inicializar los archivos seleccionados y plantillas de este repositorio create_repo=Crear repositorio default_branch=Rama por defecto mirror_prune=Purgar -mirror_prune_desc=Remover referencias remotas que no existan remotamente -mirror_interval=Intervalo de la réplica (en horas) mirror_address=Dirección de la réplica -mirror_address_desc=Por favor, incluya las credenciales de usuario necesarias en la dirección. mirror_last_synced=Última sincronización watchers=Seguidores stargazers=Fans +forks=Forks -form.reach_limit_of_creation=El propietario ha alcanzado el límite máximo de %d repositorios creados. -form.name_reserved=El nombre del repositorio '%s' está reservado. -form.name_pattern_not_allowed=El patrón del nombre del repositorio '%s' no está permitido. need_auth=Requiere autorización migrate_type=Tipo de migración @@ -391,14 +329,12 @@ unwatch=Dejar de vigilar watch=Seguir unstar=Eliminar destacado star=Destacar +fork=Fork download_archive=Descargar este repositorio no_desc=Sin descripción quick_guide=Guía Rápida clone_this_repo=Clonar este repositorio -create_new_repo_command=Crear un nuevo repositorio desde línea de comandos -push_exist_repo=Hacer Push de un repositorio existente desde línea de comandos -repo_is_empty=Este repositorio está vacío, por favor, ¡vuelva más tarde! code=Código branch=Rama @@ -407,7 +343,11 @@ filter_branch_and_tag=Filtrar por rama o etiqueta branches=Ramas tags=Etiquetas issues=Incidencias +pulls=Pull Requests labels=Etiquetas +milestones=Milestones +commits=Commits +releases=Releases file_history=Histórico file_view_raw=Ver Raw file_too_large=Este archivo es demasiado grande para ser mostrado @@ -416,7 +356,6 @@ editor.new_file=Nuevo archivo editor.upload_file=Subir archivo editor.edit_file=Editar archivo editor.preview_changes=Vista previa de los cambios -editor.cannot_edit_non_text_files=Sólo puede editar archivos de texto editor.edit_this_file=Editar este archivo editor.must_be_on_a_branch=Debes estar en una rama para hacer o proponer cambios en este archivo editor.fork_before_edit=Debes hacer un fork de este repositorio antes de editar el archivo @@ -440,9 +379,9 @@ editor.cancel=Cancelar editor.filename_cannot_be_empty=El nombre del archivo no puede estar vacío. editor.branch_already_exists=La rama '%s' ya existe en este repositorio. editor.directory_is_a_file=La entrada '%s' en el directorio padre es un archivo no un directorio en este repositorio. +editor.file_is_a_symlink=El archivo '%s' es un enlace simbólico que no puede ser modificado desde el editor web editor.filename_is_a_directory=El nombre del fichero '%s' es un directorio existente en este repositorio. editor.file_editing_no_longer_exists=El archivo '%s' que estás editando ya no existe en este repositorio. -editor.file_changed_while_editing=El contenido del archivo ha sido modificado desde que empezó a editarlo. Clic aquí para ver qué ha sido modificado o presiona confirmar de nuevo para sobrescribir estos cambios. editor.file_already_exists=Ya existe un archivo con nombre '%s' en este repositorio. editor.no_changes_to_show=No existen cambios para mostrar. editor.fail_to_update_file=Error al actualizar/crear el archivo '%s', error: %v @@ -450,18 +389,22 @@ editor.add_subdir=Añadir subdirectorio... editor.unable_to_upload_files=Error al subir archivos a '%s', error: %v editor.upload_files_to_dir=Subir archivos a '%s' +commits.commits=Commits commits.search=Buscar commits commits.find=Buscar +commits.search_all=Todas las ramas commits.author=Autor commits.message=Mensaje commits.date=Fecha commits.older=Anterior commits.newer=Posterior + issues.new=Nueva incidencia issues.new.labels=Etiquetas issues.new.no_label=Sin etiquetas issues.new.clear_labels=Limpiar etiquetas +issues.new.milestone=Milestone issues.new.no_milestone=Sin Milestone issues.new.clear_milestone=Limpiar Milestone issues.new.open_milestone=Milestones abiertas @@ -474,14 +417,18 @@ issues.new_label=Nueva Etiqueta issues.new_label_placeholder=Nombre etiqueta... issues.create_label=Crear etiqueta issues.label_templates.title=Carga un conjunto predefinido de etiquetas -issues.label_templates.info=Todavía no hay ninguna etiqueta. Puede hacer clic en el botón "Nueva etiqueta" para crear una o utilizar un conjunto predefinido abajo. issues.label_templates.helper=Seleccionar un conjunto de etiquetas issues.label_templates.use=Usar este conjunto de etiquetas issues.label_templates.fail_to_load_file=Error al cargar el archivo de plantilla de etiqueta '%s': %v +issues.add_label_at=`añadida la etiqueta
%s
label %s` +issues.remove_label_at=`eliminada la etiqueta
%s
label %s` +issues.add_assignee_at='fue asignado por %s %s' +issues.delete_branch_at=`rama eliminada %s %s` issues.open_tab=%d abiertas issues.close_tab=%d cerradas issues.filter_label=Etiqueta issues.filter_label_no_select=Ninguna etiqueta seleccionada +issues.filter_milestone=Milestone issues.filter_milestone_no_select=Ningún Milestone seleccionado issues.filter_assignee=Asignada a issues.filter_assginee_no_select=Sin asignar @@ -530,8 +477,6 @@ issues.label_edit=Editar issues.label_delete=Borrar issues.label_modify=Edición de Etiqueta issues.label_deletion=Borrado de Etiqueta -issues.label_deletion_desc=Al borrar la etiqueta su información será eliminada de todas las incidencias relacionadas. Desea continuar? -issues.label_deletion_success=Etiqueta borrada con éxito! issues.num_participants=%d participantes issues.attachment.open_tab='Haga clic para ver "%s" en una pestaña nueva' issues.attachment.download=`Haga clic para descargar "%s"` @@ -549,16 +494,12 @@ pulls.title_desc=desea fusionar %[1]d commits de %[2]s en %[3 pulls.merged_title_desc=fusionados %[1]d commits de %[2]s en %[3]s %[4]s pulls.tab_conversation=Conversación pulls.tab_files=Archivos modificados -pulls.reopen_to_merge=Por favor reabra este Pull Request para proceder con la operación de fusionado. pulls.merged=Fusionado -pulls.has_merged=¡Este Pull Request se ha completado con éxito! pulls.data_broken=Los datos de este pull request ya no están disponibles porque se ha eliminado la información del fork. pulls.is_checking=Se está procediendo a la búsqueda de conflictos, por favor actualice la página en unos momentos. pulls.can_auto_merge_desc=Este Pull Request puede ser fusionado automáticamente. -pulls.cannot_auto_merge_desc=Este Pull Request no puede ser fusionado automáticamente porque hay conflictos. pulls.cannot_auto_merge_helper=Por favor, fusiona manualmente para resolver los conflictos. pulls.merge_pull_request=Fusionar Pull Request -pulls.open_unmerged_pull_exists=`Usted no puede realizar la operación de reapertura porque en estos momentos existe una solicitud de pull request (#%d) para el mismo repositorio con la misma información que se encuentra a la espera de aprobación` milestones.new=Nuevo Milestone milestones.open_tab=%d abiertas @@ -576,27 +517,23 @@ milestones.clear=Eliminar milestones.invalid_due_date_format=El formato de la fecha límite no es válido, debe ser 'yyyy-mm-dd'. milestones.create_success=¡El milestone '%s' ha sido creado con éxito! milestones.edit=Editar Milestone -milestones.edit_subheader=Use una buena descripción en el milestone para no confundir al resto de usuarios. milestones.cancel=Cancelar milestones.modify=Modificar Milestone milestones.edit_success=¡Los cambios al milestone '%s' se han guardado con éxito! milestones.deletion=Borrar milestone -milestones.deletion_desc=Eliminar este Milestone eliminará su información y las incidencias asociadas. ¿Desea continuar? milestones.deletion_success=¡El milestone ha sido eliminado con éxito! -wiki.welcome=¡Bienvenido a la Wiki! -wiki.welcome_desc=La Wiki es el lugar donde os gustaría documentar juntos vuestro proyecto y hacerlo mejor. + +wiki=Wiki wiki.create_first_page=Crear la primera página wiki.page=Página wiki.filter_page=Filtrar página wiki.new_page=Crear nueva página -wiki.default_commit_message=Escribe una nota sobre esta actualización (opcional). wiki.save_page=Guardar página wiki.last_commit_info=%s editó esta página %s wiki.edit_page_button=Editar wiki.new_page_button=Nueva página wiki.delete_page_button=Eliminar página -wiki.delete_page_notice_1=Esto eliminará la página "%s". Por favor, asegúrate de que es lo que quieres. wiki.page_already_exists=Ya existe una página con el mismo nombre. wiki.pages=Páginas wiki.last_updated=Última actualización %s @@ -608,10 +545,11 @@ settings.collaboration.admin=Administrador settings.collaboration.write=Escritura settings.collaboration.read=Lectura settings.collaboration.undefined=Indefinido +settings.hooks=Webhooks +settings.githooks=Git Hooks settings.basic_settings=Configuración Básica settings.mirror_settings=Configuración de réplica settings.sync_mirror=Sincronizar ahora -settings.mirror_sync_in_progress=Sincronización de réplica en curso, por favor actualice la página en unos minutos. settings.site=Sitio oficial settings.update_settings=Actualizar configuración settings.advanced_settings=Ajustes avanzados @@ -623,6 +561,7 @@ settings.external_wiki_url_desc=Los visitantes serán redireccionados a la URL c settings.issues_desc=Habilitar rastreo de incidencias settings.use_internal_issue_tracker=Usar rastreo de incidencias ligero incluido settings.use_external_issue_tracker=Usar tracker externo de incidencias +settings.external_tracker_url_desc=Los visitantes serán redireccionados a la URL cuando hagan click en la pestaña. settings.tracker_url_format=Formato URL del tracker de incidencias externo settings.tracker_issue_style=Estilo de etiquetado del tracker externo de incidencias: settings.tracker_issue_style.numeric=Numérico @@ -632,29 +571,18 @@ settings.pulls_desc=Habilitar Pull Requests para aceptar contribuciones pública settings.danger_zone=Zona de Peligro settings.new_owner_has_same_repo=El nuevo propietario tiene un repositorio con el mismo nombre. settings.convert=Convertir en un repositorio normal -settings.convert_desc=Puedes convertir este repositorio en un repositorio normal. Este cambio no se puede deshacer. settings.convert_notices_1=- Esta operación convertirá este repositorio espejo en un repositorio normal y no podrá deshacerse. settings.convert_confirm=Confirmar conversión -settings.convert_succeed=El repositorio ha sido convertido en normal satisfactoriamente. settings.transfer=Transferir la propiedad settings.transfer_desc=Transferir este repositorio a otro usuario u organización donde tengas permisos de administración. -settings.transfer_notices_1=- Perderá el permiso de acceso si el nuevo propietario es otro usuario. -settings.transfer_notices_2=- Conservará el privilegio de acceso si el nuevo propietario es una organización y usted es uno de los propietarios de dicha organización. -settings.transfer_form_title=Por favor introduzca esta información para confirmar la operación: settings.wiki_delete=Eliminar datos de la wiki settings.wiki_delete_desc=Una vez borrados los datos de la wiki no habrá vuelta atrás. Por favor, asegúrate de que es lo que quieres. settings.wiki_delete_notices_1=- Esto eliminará y deshabilitará la wiki para %s -settings.wiki_deletion_success=Los datos de la wiki del repositorio han sido borrados correctamente. settings.delete=Eliminar este repositorio settings.delete_desc=Una vez has eliminado un repositorio, no hay vuelta atrás. Por favor, asegúrate de que es lo que quieres. settings.delete_notices_1=- Esta operación NO PUEDE revertirse. -settings.delete_notices_2=- Esta operación eliminará de manera permanente todo el contenido de este repositorio, incluyendo los datos de git, las incidencias, los comentarios y los permisos de acceso de los colaboradores. -settings.delete_notices_fork_1=- Todos los forks se convertirán en independientes tras el borrado. -settings.deletion_success=¡El respositorio ha sido eliminado satisfactoriamente! -settings.update_settings_success=Las opciones del repositorio se han actualizado correctamente. settings.transfer_owner=Nuevo Propietario settings.make_transfer=Transferir -settings.transfer_succeed=La propiedad del repositorio ha sido transferida exitosamente. settings.confirm_delete=Confirmar eliminación settings.add_collaborator=Añadir nuevo colaborador settings.add_collaborator_success=El nuevo colaborador ha sido añadido. @@ -666,13 +594,10 @@ settings.search_user_placeholder=Buscar usuario... settings.org_not_allowed_to_be_collaborator=Las organizaciones no tiene permitido ser añadidas como colaboradores. settings.user_is_org_member=El usuario es miembro de la organización, no puede ser añadido como colaborador. settings.add_webhook=Añadir Webhook -settings.hooks_desc=Los Webhooks permiten a servicios externos recibir notificaciones cuando sucedan ciertos eventos en Gitea. Cuando sucedan los eventos especificados, enviaremos una petición POST a cada una de las URLs indicadas. Para obtener más información, consulta nuestra Guía de Webhooks. settings.webhook_deletion=Eliminar Webhook -settings.webhook_deletion_desc=Al borrar este webhook se eliminará su información y todo su historial. ¿Desea continuar? settings.webhook_deletion_success=¡Webhook eliminado con éxito! settings.webhook.test_delivery=Test de entrega settings.webhook.test_delivery_desc=Enviar un falso evento Push de entrega para probar tus ajustes de webhook -settings.webhook.test_delivery_success=Probar que los webhook han sido añadidos a la cola de entrega. Esto puede tomar algunos segundos antes de aparecer en el historial de entregas. settings.webhook.request=Petición settings.webhook.response=Respuesta settings.webhook.headers=Encabezado @@ -682,12 +607,12 @@ settings.githook_edit_desc=Si el hook no está activo, se mostrará contenido de settings.githook_name=Nombre del Hook settings.githook_content=Contenido del Hook settings.update_githook=Actualizar Hook -settings.add_webhook_desc=Enviaremos una petición POST a la siguiente URL con los detalles de cualquier evento suscrito. También puedes especificar qué formato de datos te gustaría recibir (JSON, x-www-form-urlencoded, etc). Puedes encontrar más información en la Guía de Webhooks. settings.payload_url=URL de Payload settings.content_type=Tipo de contenido settings.secret=Secreto settings.slack_username=Nombre de usuario settings.slack_icon_url=URL de icono +settings.slack_color=Color settings.event_desc=¿Qué eventos te gustaría que desencadenasen este webhook? settings.event_push_only=Solo el evento push. settings.event_send_everything=Necesito todo. @@ -697,7 +622,6 @@ settings.event_create_desc=Rama o etiqueta creada settings.event_pull_request_desc=Pull request, abierta, cerrada, reabierta, editada, asignada, desasignada, con etiqueta actualizada, con etiqueta eliminada, o sincronizada. settings.event_push_desc=Git push a un repositorio settings.active=Activo -settings.active_helper=Enviaremos detalles del evento cuando este hook se dispare. settings.add_hook_success=Se ha añadido un nuevo webhook. settings.update_webhook=Actualizar Webhook settings.update_hook_success=Se ha actualizado el Webhook. @@ -705,6 +629,7 @@ settings.delete_webhook=Borrar Webhook settings.recent_deliveries=Envíos Recientes settings.hook_type=Tipo de Hook settings.add_slack_hook_desc=Añade integración con Slack a tu repositorio. +settings.slack_token=Token settings.slack_domain=Dominio settings.slack_channel=Canal settings.deploy_keys=Claves de Despliegue @@ -717,16 +642,15 @@ settings.key_been_used=Se ha usado la clave de despliegue. settings.key_name_used=Ya existe una clave de despliegue con el mismo nombre. settings.add_key_success=¡La nueva clave de desplieque '%s' ha sido creada con éxito! settings.deploy_key_deletion=Eliminar Clave de Despliegue -settings.deploy_key_deletion_desc=Al eliminar esta clave de despliegue se perderán el permiso de acceso a este repositorio con dicha clave. ¿Deseas continuar? -settings.deploy_key_deletion_success=¡Clave de despliegue eliminada con éxito! diff.browse_source=Explorar el Código diff.parent=padre -diff.data_not_available=Los datos del Diff no están disponibles. +diff.commit=commit diff.show_diff_stats=Mostrar estadísticas de diff diff.show_split_view=Dividir vista diff.show_unified_view=Unificar vista diff.stats_desc=Se han modificado %d ficheros con %d adiciones y %d borrados +diff.bin=BIN diff.view_file=Ver fichero diff.file_suppressed=La diferencia del archivo ha sido suprimido porque es demasiado grande diff.too_many_files=Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio @@ -737,11 +661,8 @@ release.stable=Estable release.edit=editar release.ahead=%d commits en %s desde esta release release.source_code=Código Fuente -release.new_subheader=Publicar releases del proyecto. -release.edit_subheader=Un registro de cambios detallado ayudará a los usuarios a comprender lo que se ha mejorado. release.tag_name=Nombre de la etiqueta release.target=Destino -release.tag_helper=Escoge una etiqueta o crea una nueva al publicar. release.title=Título release.content=Contenido release.write=Escribir @@ -755,12 +676,12 @@ release.save_draft=Guardar borrador release.edit_release=Editar Release release.delete_release=Borrar este Release release.deletion=Eliminar Release -release.deletion_desc=Eliminar este Release eliminará la etiqueta correspondiente. ¿Desea continuar? -release.deletion_success=¡El release ha sido eliminado correctamente! release.tag_name_already_exist=Ya existe una Release con esta etiqueta. release.tag_name_invalid=Nombre de la etiqueta no es válido. release.downloads=Descargas +branch.delete=Eliminar la rama %s +branch.deletion_failed=Error al borrar la rama %s. [org] org_name_holder=Nombre de la organización @@ -777,9 +698,6 @@ create_new_team=Crear un nuevo equipo org_desc=Descripción team_name=Nombre del equipo team_desc=Descripción -team_name_helper=Utiliza este nombre para mencionar a este equipo en las conversaciones. -team_desc_helper=¿En qué consiste este equipo? -team_permission_desc=¿Qué nivel de permisos debería tener este equipo? form.name_reserved=El nombre de la organización '%s' está reservado. form.name_pattern_not_allowed=El patrón de nombre de la organización '%s' no está permitido. @@ -790,16 +708,11 @@ settings.full_name=Nombre completo settings.website=Página web settings.location=Localización settings.update_settings=Actualizar configuración -settings.update_setting_success=La configuración de la organización se ha actualizado correctamente. -settings.change_orgname_prompt=Este cambio afectará a los enlaces que hacen referencia a la organización. -settings.update_avatar_success=La configuración de avatar de la organización ha sido actualizada con éxito. settings.delete=Eliminar organización settings.delete_account=Eliminar esta organización settings.delete_prompt=Esta operación eliminará esta organización de manera permanente, y ¡NO PUEDE deshacerse! settings.confirm_delete_account=Confirmar eliminación settings.delete_org_title=Eliminación de la organización -settings.delete_org_desc=Esta organización se va a eliminar permanentemente, ¿quieres continuar? -settings.hooks_desc=Añadir webhooks que serán ejecutados para todos los repositorios de esta organización. members.membership_visibility=Visibilidad de Membresía: members.public=Público @@ -819,9 +732,7 @@ teams.leave=Abandonar teams.read_access=Acceso de Lectura teams.read_access_helper=Este equipo podrá ver y clonar sus repositorios. teams.write_access=Acceso de Escritura -teams.write_access_helper=Este equipo podrá leer sus repositorios, así como hacer push en ellos. teams.admin_access=Acceso de administrador -teams.admin_access_helper=Este equipo podrá hacer push/pull en sus repositorios, así como añadir colaboradores a ellos. teams.no_desc=Este equipo no tiene descripción teams.settings=Configuración teams.owners_permission_desc=Los propietarios tienen acceso completo a todos los repositorios y tienen derechos de administración en la organización. @@ -830,8 +741,6 @@ teams.update_settings=Actualizar configuración teams.delete_team=Eliminar este equipo teams.add_team_member=Añadir miembro al equipo teams.delete_team_title=Eliminar equipo -teams.delete_team_desc=Este equipo va a ser eliminado, ¿seguro que quieres continuar? Los miembros de este equipo pueden perder acceso a algunos repositorios. -teams.delete_team_success=El equipo ha sido eliminado correctamente. teams.read_permission_desc=Este equipo tiene permisos de Lectura: sus miembros pueden ver y clonar los repositorios del equipo. teams.write_permission_desc=Este equipo tiene permisos de Escritura: sus miembros pueden leer y hacer push a los repositorios del equipo. teams.admin_permission_desc=Este equipo tiene permisos de Administración: sus miembros pueden leer, hacer push y añadir colaboradores a los repositorios del equipo. @@ -842,6 +751,7 @@ teams.remove_repo=Eliminar teams.add_nonexistent_repo=El repositorio que estás intentando añadir no existe, por favor, créalo primero. [admin] +dashboard=Panel de control users=Usuarios organizations=Organizaciones repositories=Repositorios @@ -851,6 +761,7 @@ notices=Notificaciones del sistema monitor=Monitorización first_page=Primera last_page=Última +total=Total: %d dashboard.statistic=Estadísticas dashboard.operations=Operaciones @@ -859,23 +770,8 @@ dashboard.statistic_info=La base de datos de Gitea contiene %d usuarios, dashboard.operation_name=Nombre de la operación dashboard.operation_switch=Interruptor dashboard.operation_run=Ejecutar -dashboard.clean_unbind_oauth=Limpiar solicitudes de OAuth sin confirmar -dashboard.clean_unbind_oauth_success=Las solicitudes de OAuth sin confirmar se han eliminado correctamente. dashboard.delete_inactivate_accounts=Eliminar todas las cuentas inactivas -dashboard.delete_inactivate_accounts_success=Todas las cuentas inactivas se han eliminado correctamente. dashboard.delete_repo_archives=Eliminar todos los archivos de repositorios -dashboard.delete_repo_archives_success=Todos los archivos de repositorios se han eliminado correctamente. -dashboard.delete_missing_repos=Borrar todos los registros de los repositorios para los que ya no se dispone de los archivos Git -dashboard.delete_missing_repos_success=Todos los registros de repositorios para los que ya no se dispone de los archivos Git se han eliminado correctamente. -dashboard.git_gc_repos=Ejecutar la recolección de basura en los repositorios -dashboard.git_gc_repos_success=Todos los repositorios han ejecutado correctamente el recolector de basuras. -dashboard.resync_all_sshkeys=Reescribir el fichero '.ssh/authorized_keys'(atención: se perderán las claves que no pertenezcan a Gitea) -dashboard.resync_all_sshkeys_success=Todas las claves públicas se han reescrito correctamente. -dashboard.resync_all_update_hooks=Reescribir todos los hooks de actualización de los repositorios (necesario cuando se modifica la ruta de configuración personalizada) -dashboard.resync_all_update_hooks_success=Todos los hooks de actualización de los repositorios se han reescrito correctamente. -dashboard.reinit_missing_repos=Reinicializar todos los registros del repositorio que tienen archivos Git eliminados -dashboard.reinit_missing_repos_success=Todos los registros del repositorio con archivos Git eliminados han sido reinicializados con éxito. - dashboard.server_uptime=Tiempo de actividad del servidor dashboard.current_goroutine=Gorutinas actuales dashboard.current_memory_usage=Uso de memoria actual @@ -906,40 +802,32 @@ dashboard.total_gc_pause=Pausa Total por GC dashboard.last_gc_pause=Última Pausa por GC dashboard.gc_times=Ejecuciones GC -users.user_manage_panel=Panel de Gestión de Usuarios users.new_account=Crear Nueva Cuenta users.name=Nombre users.activated=Activado users.admin=Administrador users.repos=Repositorios users.created=Creado +users.last_login=Último inicio de sesión +users.never_login=Nunca inició sesión users.send_register_notify=Enviar notificación de registro al usuario -users.new_success=La cuenta '%s' ha sido creada con éxito. users.edit=Editar users.auth_source=Fuente de Autenticación +users.local=Local users.auth_login_name=Nombre de Inicio de sesión de autenticación users.password_helper=Deje el campo vacío si no desea cambiar la contraseña. -users.update_profile_success=El perfil de la cuenta se ha actualizado correctamente. users.edit_account=Editar Cuenta users.max_repo_creation=Límite máximo de repositorios users.max_repo_creation_desc=(Configura a -1 para usar el límite global por defecto) -users.is_activated=Esta cuenta está activada -users.prohibit_login=Esta cuenta no tiene permitido ingresar users.is_admin=Esta cuenta tiene permisos de administrador -users.allow_git_hook=Esta cuenta tiene permisos para crear hooks de Git users.allow_import_local=Esta cuenta dispone de permisos para importar repositorios locales users.update_profile=Actualizar Perfil de la Cuenta users.delete_account=Eliminar esta Cuenta -users.still_own_repo=Esta cuenta es propietaria de uno o más repositorios, tienes que borrarlos o transferirlos primero. -users.still_has_org=Esta cuenta es miembro de una o más organizaciones, tienes que abandonarlas o eliminarlas primero. -users.deletion_success=Su cuenta ha sido eliminada correctamente! -orgs.org_manage_panel=Panel de Gestión de Organización orgs.name=Nombre orgs.teams=Equipos orgs.members=Miembros -repos.repo_manage_panel=Panel de Gestión de Repositorios repos.owner=Propietario repos.name=Nombre repos.private=Privado @@ -947,7 +835,6 @@ repos.watches=Vigilantes repos.stars=Estrellas repos.issues=Incidencias -auths.auth_manage_panel=Panel de administración de autenticación auths.new=Añadir nuevo origen auths.name=Nombre auths.type=Tipo @@ -959,7 +846,6 @@ auths.security_protocol=Protocolo de seguridad auths.domain=Dominio auths.port=Puerto auths.bind_password=Contraseña Bind -auths.bind_password_helper=Advertencia: La contraseña se almacena como texto plano. No utilice una cuenta con privilegios elevados. auths.user_base=Base de búsqueda de usuarios auths.user_dn=DN de Usuario auths.attribute_username=Atributo de nombre de usuario @@ -973,21 +859,12 @@ auths.admin_filter=Filtro de aministrador auths.smtp_auth=Tipo de autenticación SMTP auths.smtpport=Puerto SMTP auths.allowed_domains=Dominios Permitidos -auths.allowed_domains_helper=Deje el campo vacío si no desea restringir ningún dominio. Para restringir más de uno, separe los dominios con una coma ','. auths.enable_tls=Habilitar cifrado TLS auths.skip_tls_verify=Omitir la verificación TLS auths.pam_service_name=Nombre del Servicio PAM auths.enable_auto_register=Hablilitar Auto-Registro auths.tips=Consejos -auths.edit=Editar la Configuración de Autenticación auths.activated=Esta autenticación ha sido activada -auths.new_success=¡La autenticación '%s' ha sido añadida con éxito! -auths.update_success=La configuración de autenticación ha sido actualizada con éxito. -auths.update=Actualizar la configuración de autenticación -auths.delete=Eliminar Autenticación -auths.delete_auth_title=Borrado de autenticación -auths.delete_auth_desc=Esta autenticación será eliminada. ¿Deseas continuar? -auths.still_in_used=Este método de autentificación aún es utilizado por algunos usuarios, por favor elimine o convierta estos usuarios a otro tipo de autentificación. auths.deletion_success=¡La autenticación ha sido eliminada con éxito! config.server_config=Configuración del servidor @@ -999,6 +876,7 @@ config.offline_mode=Modo Sin Conexión config.disable_router_log=Deshabilitar Log del Router config.run_user=Ejecutada como Usuario config.run_mode=Modo de ejecución +config.git_version=Versión de Git config.repo_root_path=Ruta del Repositorio config.static_file_root_path=Ruta de los Ficheros Estáticos config.log_file_root_path=Ruta de los Ficheros de Log @@ -1007,7 +885,6 @@ config.reverse_auth_user=Autenticación Inversa de Usuario config.ssh_config=Configuración SSH config.ssh_enabled=Habilitado -config.ssh_start_builtin_server=Iniciar servidor integrado config.ssh_domain=Dominio config.ssh_port=Puerto config.ssh_listen_port=Puerto de escucha @@ -1035,12 +912,10 @@ config.mail_notify=Notificación por Correo Electrónico config.disable_key_size_check=Deshabilitar la comprobación de Tamaño Mínimo de Clave config.enable_captcha=Activar Captcha config.active_code_lives=Habilitar Vida del Código -config.reset_password_code_lives=Restablecer Contraseña de Vida del Código config.webhook_config=Configuración de Webhooks config.queue_length=Tamaño de Cola de Envío config.deliver_timeout=Timeout de Entrega -config.skip_tls_verify=Omitir la Verificación TLS config.mailer_config=Configuración del servidor de correo config.mailer_enabled=Activado @@ -1048,7 +923,6 @@ config.mailer_disable_helo=Desactivar HELO config.mailer_name=Nombre config.mailer_user=Usuario config.send_test_mail=Enviar email de prueba -config.test_mail_failed=Fallo al enviar el email de prueba a '%s': %v config.test_mail_sent=El email de prueba ha sido enviado a '%s'. config.oauth_config=Configuración OAuth @@ -1101,7 +975,6 @@ monitor.start=Hora de Inicio monitor.execute_time=Tiempo de ejecución notices.system_notice_list=Notificaciones del Sistema -notices.view_detail_header=Ver detalles de la notificación notices.actions=Acciones notices.select_all=Sleccionar todo notices.deselect_all=Deseleccionar todo @@ -1111,7 +984,6 @@ notices.delete_all=Eliminar todas las notificaciones notices.type=Tipo notices.type_1=Repositorio notices.desc=Descripción -notices.delete_success=Las notificaciones del sistema han sido eliminadas satisfactoriamente. [action] create_repo=creó el repositorio %s @@ -1127,34 +999,39 @@ comment_issue=`comentó en la incidencia %s#%[2]s` merge_pull_request=`fusionado pull request %s#%[2]s` transfer_repo=transfirió el repositorio %s a %s push_tag=hizo push del tag %[2]s a %[3]s -compare_commits=Ver comparación de estos %d commits [tool] -ago=hace -from_now=desde ahora +ago=hace %s +from_now=desde ahora %s now=ahora -1s=%s 1 segundo -1m=%s 1 minuto -1h=%s 1 hora -1d=%s 1 día -1w=%s 1 semana -1mon=%s 1 mes -1y=%s 1 año -seconds=%[2]s %[1]d segundos -minutes=%[2]s %[1]d minutos -hours=%[2]s %[1]d horas -days=%[2]s %[1]d días -weeks=%[2]s %[1]d semanas -months=%[2]s %[1]d meses -years=%[2]s %[1]d años +1s=1 segundo +1m=1 minuto +1h=1 hora +1d=1 día +1w=1 semana +1mon=1 mes +1y=1 año +seconds=%d segundos +minutes=%d minutos +hours=%d horas +days=%d días +weeks=%d semanas +months=%d meses +years=%d años raw_seconds=segundos raw_minutes=minutos [dropzone] -default_message=Suéltelos aquí o pulse para cargar archivos. invalid_input_type=No está permitido cargar archivos de este tipo. -file_too_big=El tamaño del archivo ({{filesize}} MB) excede el tamaño máximo ({{maxFilesize}} MB). remove_file=Eliminar archivo [notification] +unread=Sin leer +read=Leídas +mark_as_read=Marcar como leído +mark_as_unread=Marcar como no leído + +[gpg] + +[units] diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 0b5f4c9..8733e55 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -32,16 +32,15 @@ mirror=Peili new_repo=Uusi repo new_migrate=Uusi migraatio new_mirror=Uusi peilaus -new_fork=Uusi haara reposta new_org=Uusi organisaatio manage_org=Ylläpidä organisaatioita admin_panel=Ylläpito paneeli account_settings=Tilin asetukset settings=Asetukset your_profile=Profiilisi -your_starred=Suosikit your_settings=Asetuksesi + activities=Toimet pull_requests=Pull requestit issues=Ongelmat @@ -50,40 +49,30 @@ cancel=Peruuta [install] install=Asennus -title=Asennusvaiheet ottaessa ensi kertaa käyttöön -docker_helper=Jos käytät Giteaia Dockerin sisällä, ole hyvä ja lue ohjeet huolellisesti ennen kuin muutat mitään tältä sivulta! -requite_db_desc=Gitea tarvitsee MySQL, PostgreSQL, SQLite3 tai TiDB. db_title=Tietokanta asetukset db_type=Tietokanta tyyppi host=Isäntä user=Käyttäjä password=Salasana db_name=Tietokannan nimi -db_helper=Ole hyvä ja käytä INNODB moottoria ja utf8_general_ci merkistöä MySQLssä. ssl_mode=SSL tila path=Polku -sqlite_helper=SQLite3 tai TiDB tietokanta polku.
Käytä absoluuttista polkua kun käynnistät palvelun. err_empty_db_path=SQLite3 tai TiDB tietokanta polku ei voi olla tyhjä. err_invalid_tidb_name=TiDB tietokannan nimessä ei voi olla merkkejä "." ja "-". no_admin_and_disable_registration=Et voi poistaa käytöstä rekisteröintiä luomatta ylläpito tiliä. err_empty_admin_password=Ylläpito salasana ei voi olla tyhjä. -general_title=Sovellus yleiset asetukset app_name=Sovellus nimi -app_name_helper=Laita organisaatiosi nimi tähän isolla ja kovaäänisesti! repo_path=Repon juuren polku -repo_path_helper=Kaikki Git etä repot tullaan tallentamaan tähän hakemistoon. lfs_path=LFS-juuripolku run_user=Suorita käyttäjänä run_user_helper=Käyttäjällä täytyy olla pääsy repo juuri polkuun ja suorittaa Gitea. domain=Verkkotunnus domain_helper=Tämä vaikuttaa SSH klooni URLeihin. ssh_port=SSH portti -ssh_port_helper=Portti numero jota SSH palvelimesi käyttää, jätä tyhjäksi poistaaksesi käytöstä SSH toiminnon. http_port=HTTP portti http_port_helper=Portti numero jota sovellus tulee kuuntelemaan. app_url=Sovellus URL -app_url_helper=Tämä vaikuttaa HTTP/HTTPS klooni URLeihin ja joihinkin sähköposteihin. log_root_path=Lokin polku log_root_path_helper=Lokien tallennushakemisto. @@ -91,14 +80,10 @@ optional_title=Valinnaiset asetukset email_title=Sähköposti palvelu asetukset smtp_host=SMTP isäntä smtp_from=Lähettäjä -smtp_from_helper=Sähköposti lähettäjän osoite, RFC 5322. Se voi olla pelkkä sähköposti osoite, tai "Nimi" muodossa. -mailer_user=Lähettäjän sähköposti mailer_password=Lähettäjän salasana register_confirm=Ota käyttöön rekisteröinti varmistus -mail_notify=Ota käyttöön sähköposti ilmoitukset server_service_title=Palvelin ja muut palvelu asetukset offline_mode=Ota käyttöön Offline tila -offline_mode_popup=Poista käytöstä CDN myös tuotanto tilassa, kaikki resurssi tiedostot palvellaan paikallisesti. disable_gravatar=Poista käytöstä Gravatar palvelu disable_gravatar_popup=Poista käytöstä Gravatar ja mukautetut lähteet, kaikki profiilikuvat on käyttäjien palvelimelle lähettämiä tai oletus. federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. @@ -108,7 +93,6 @@ enable_captcha=Ota käyttöön Captcha enable_captcha_popup=Pakollinen captcha käyttäjän itse rekisteröityessä. require_sign_in_view=Ota käyttöön vaadi sisäänkirjautuminen nähdäksesi sivut require_sign_in_view_popup=Vain sisään kirjautuneet käyttäjät voivat nähdä sivut, vierailijat tulevat näkemään vain kirjautumis/rekisteröinti sivut. -admin_setting_desc="Sinun ei tarvitse luoda ylläpito tiliä nyt, ensimmäinen käyttäjä ID=1 saa ylläpito oikeudet automaattisesti." admin_title=Ylläpito tili asetukset admin_name=Käyttäjätunnus admin_password=Salasana @@ -116,13 +100,8 @@ confirm_password=Varmista salasana admin_email=Ylläpito sähköposti install_btn_confirm=Asenna Gitea test_git_failed=Epäonnistui testata 'git' komentoa: %v -sqlite3_not_available=Julkaisu versiosi ei tue SQLite3, ole hyvä ja lataa virallinen binääri versio osoitteesta %s, EI gobuild versiota. -invalid_db_setting=Tietokanta asetus ei ole oikea: %v invalid_repo_path=Repo juuri polku on virheellinen: %v -run_user_not_match=Suoritus käyttäjä ei ole nykyinen käyttäjä: %s -> %s -save_config_failed=Asetuksien tallennus epäonnistui: %v invalid_admin_setting=Ylläpito tili asetus virheellinen: %v -install_success=Tervetuloa! Olemme iloisia että valitsit Gitea, pidä hauskaa ja pidä huolta itsestäsi. invalid_log_root_path=Loki juurihakemisto ei kelpaa: %v default_keep_email_private=Oletusarvo sähköpostiosoitteiden yksityisenä pitämiselle no_reply_address=Osoite, josta lähetetään automaattiset viestit @@ -146,25 +125,16 @@ organizations=Organisaatiot search=Hae [auth] -create_new_account=Luo uusi tili register_helper_msg=On jo tili? Kirjaudu sisään nyt! -social_register_helper_msg=On jo tili? Liitä nyt! disable_register_prompt=Sori, rekisteröinti on poistettu käytöstä. Ole hyvä ja ota yhteyttä sivuston ylläpitoon. disable_register_mail=Sori, rekisteröinti sähköpostivarmistukset on poistettu käytöstä. remember_me=Muista minut -forgot_password=Unohtuiko salasana -forget_password=Unohtuiko salasana? sign_up_now=Tarvitsetko tilin? Rekisteröidy nyt. -confirmation_mail_sent_prompt=Uusi varmistus sähköposti on lähetetty osoitteeseen %s, ole hyvä ja tarkista saapuneet seuraavan %d tunnin sisällä saadaksesi rekisteröintiprosessin valmiiksi. active_your_account=Aktivoi tilisi prohibit_login=Kirjautuminen kielletty -resent_limit_prompt=Sori, olet jo tilannut aktivointi sähköpostin lähiaikoina. Ole hyvä ja odota 3 minuuttia ja yritä sitten uudelleen. has_unconfirmed_mail=Hei %s, sinulla on varmistamaton sähköposti osoite (%s). Jos et ole saanut varmistus sähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja klikkaa allaolevaa painiketta. resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi -email_not_associate=Tätä sähköposti osoitetta ei ole liitetty mihinkään tiliin. -send_reset_mail=Klikkaa tästä (uudelleen)lähettääksesi salasanan nollaus sähköpostin reset_password=Nollaa salasanasi -invalid_code=Sori, varmistuskoodisi on vanhentunut tai väärä. reset_password_helper=Klikkaa tästä nollataksesi salasanasi password_too_short=Salasanan pituus ei voi olla vähemmän kuin %d merkkiä. verify=Vahvista @@ -173,8 +143,6 @@ verify=Vahvista activate_account=Ole hyvä ja aktivoi tilisi activate_email=Vahvista sähköpostiosoitteesi reset_password=Tyhjennä salasana -register_success=Rekisteröinti onnistunut, tervetuloa -register_notify=Tervetuloa mukaan [modal] yes=Kyllä @@ -196,8 +164,6 @@ TreeName=Tiedostopolku Content=Sisältö require_error=` ei voi olla tyhjä.` -alpha_dash_error=` täytyy olla kirjaimia tai numeroita tai väliviiva(-_) merkkejä.` -alpha_dash_dot_error=` täytyy olla kirjaimia tai numeroita tai väliviiva(-_) tai piste merkkejä.` size_error=` täytyy olla kokoa %s.` min_size_error=` täytyy sisältää vähintään %s merkkiä.` max_size_error=` täytyy sisältää enintään %s merkkiä.` @@ -205,28 +171,10 @@ email_error=` ei ole kelvollinen sähköpostiosoite.` url_error=` ei ole kelvollinen URL.` include_error=` täytyy sisältää tekstiosa '%s'.` unknown_error=Tuntematon virhe: -captcha_incorrect=Captcha ei ollut oikein. -password_not_match=Salasana ja salasanan varmistus eivät ole samoja. -username_been_taken=Käyttäjätunnus on jo käytössä. -repo_name_been_taken=Repon nimi on jo käytössä. -org_name_been_taken=Organisaation nimi on jo käytössä. -team_name_been_taken=Tiimin nimi on jo käytössä. -email_been_used=Sähköpostiosoite on jo käytössä. -username_password_incorrect=Käyttäjätunnus tai salasana ei ole oikein. -enterred_invalid_repo_name=Ole hyvä ja varmista että kirjoittamasi repon nimi on oikein. -enterred_invalid_owner_name=Ole hyvä ja varmista että kirjoittamasi omistajan nimi on oikein. -enterred_invalid_password=Ole hyvä ja varmista että kirjoittamasi salasana on oikein. -user_not_exist=Käyttäjää ei ole olemassa. -last_org_owner=Viimeisen käyttäjän poistaminen omistaja tiimistä ei ole sallittu, koska organisaatiossa tulee olla ainakin yksi omistaja. -invalid_ssh_key=Sori, emme pystyneet varmistamaan SSH avainta: %s -unable_verify_ssh_key=Gitea ei voi varmistaa SSH avaintasi, mutta oletamme että se on toimiva, ole hyvä ja tarkista se. auth_failed=Todennus epäonnistui: %v -still_own_repo=Tililläsi on yhä omistajuus ainakin yhteen repoon, sinun täytyy poistaa tai siirtää ne ensin. -still_has_org=Tililläsi on yhä jäsenyys ainakin yhteen organisaatioon, sinun täytyy jäädä pois tai poistaa jäsenyyksiä ensin. -org_still_own_repo=Tällä organisaatiolla on yhä omistajuus repoon, sinun täytyy poistaa tai siirtää ne ensin. target_branch_not_exist=Kohde branchia ei ole olemassa. @@ -241,14 +189,11 @@ following=Seurataan follow=Seuraa unfollow=Lopeta seuraaminen -form.name_reserved=Käyttäjätunnus '%s' on varattu. -form.name_pattern_not_allowed=Käyttäjätunnus mallia '%s' ei ole sallittu. [settings] profile=Profiili password=Salasana avatar=Profiilikuva -ssh_keys=SSH avaimet social=Sosiaaliset tilit applications=Sovellukset orgs=Organisaatiot @@ -257,15 +202,11 @@ twofa=Kaksivaiheinen todennus uid=Käyttäjä ID public_profile=Julkinen profiili -profile_desc=Sähköposti osoitteesi on julkinen ja käytetään tiliin liittyviin ilmoituksiin, ja nettipohjaisiin toimintoihin joita on tehty sivujen kautta. -password_username_disabled=Ei-paikallinen tyyppisten käyttäjien ei sallita vaihtavan käyttäjänimeä. full_name=Kokonimi website=Nettisivut location=Sijainti update_profile=Päivitä profiili -update_profile_success=Profiilisi on päivitetty onnistuneesti. change_username=Käyttäjätunnus vaihdettu -change_username_prompt=Tämä muutos vaikuttaa tapaan kuinka linkit liittyvät tiliisi. continue=Jatka cancel=Peruuta @@ -275,15 +216,11 @@ choose_new_avatar=Valitse uusi profiilikuva update_avatar=Päivitä profiilikuva asetus delete_current_avatar=Poista nykyinen profiilikuva uploaded_avatar_not_a_image=Palvelimelle lähetetty tiedosto ei ole kuva. -update_avatar_success=Profiilikuvasi asetus on päivitetty onnistuneesti. change_password=Vaihda salasana old_password=Nykyinen salasana new_password=Uusi salasana retype_new_password=Kirjoita uudelleen uusi salasana -password_incorrect=Nykyinen salasana ei ole oikea. -change_password_success=Salasanasi on onnistuneesti vaihdettu. Voit nyt kirjautua sisään käyttäen tätä uutta salasanaa. -password_change_disabled=Ei-paikallinen tyyppisten käyttäjien ei sallita vaihtavan salasanaa. emails=Sähköposti osoitteet manage_emails=Hallitse sähköposti osoitteita @@ -291,74 +228,54 @@ email_desc=Ensisijaista sähköpostiosoitettasi käytetään ilmoituksiin ja mui primary=Ensisijainen primary_email=Aseta ensisijaiseksi delete_email=Poista -email_deletion=Sähköpostin poistaminen -email_deletion_desc=Tämän sähköposti osoitteen poistaminen poistaa siihen liittyvät tiedot tililtäsi. Haluatko jatkaa? email_deletion_success=Sähköposti on poistettu onnistuneesti! add_new_email=Lisää uusi sähköpostiosoite add_email=Lisää sähköposti -add_email_confirmation_sent=Uusi varmistus sähköposti on lähetetty osoitteeseen '%s', ole hyvä ja tarkista saapuneet seuraavan %d tunnin sisällä saadaksesi rekisteröintiprosessin valmiiksi. add_email_success=Uusi sähköpostiosoitteesi on lisätty onnistuneesti. manage_ssh_keys=Hallitse SSH avaimia add_key=Lisää avain -ssh_desc=Tämä on luettelo tiliisi liitetyistä SSH avaimista. Koska nämä avaimet sallivat kenen tahansa niitä käyttävän pääsevän repoihisi, on erittäin tärkeää että tunnistat ne. -ssh_helper=Etkö tiedä miten?Tarkista Githubin opas luo oma SSH avain tai ratkaise yleisiä ongelmia joita voit kohdata SSHta käyttäessä. add_new_key=Lisää SSH avain -ssh_key_been_used=Julkisen avaimen sisältö on käytetty. -ssh_key_name_used=Samanniminen julkinen avain on jo olemassa. key_name=Avaimen nimi key_content=Sisältö -add_key_success=Uusi SSH avain '%s' on lisätty onnistuneesti! delete_key=Poista ssh_key_deletion=SSH avaimen poistaminen -ssh_key_deletion_desc=Tämän SSH avaimen poistaminen poistaa kaikki siihen liittyvät vierailut tililtäsi. Haluatko jatkaa? -ssh_key_deletion_success=SSH avain on poistettu onnistuneesti! add_on=Lisätty last_used=Käytetty viimeksi no_activity=Ei viimeaikaista toimintaa -key_state_desc=Tätä avainta on käytetty 7 päivän sisällä -token_state_desc=Tätä pääsymerkkiä on käytetty 7 päivän sisällä manage_social=Hallitse liitettyjä sosiaalisia tilejä -social_desc=Tämä on luettelo liitetyistä sosiaalisista tileistä. Poista kaikki liitokset joita et tunnista. unbind=Poista liitos -unbind_success=Sosiaalisen tilin liitos on poistettu. manage_access_token=Hallitse henkilökohtaisia pääsymerkkejä generate_new_token=Luo uusi pääsymerkki -tokens_desc=Luomiasi pääsymerkkejä voidaan käyttää Gitea APIn kanssa. new_token_desc=Joka pääsymerkillä on täysi pääsy tiliisi. token_name=Pääsymerkin nimi generate_token=Luo pääsymerkki -generate_token_succees=Pääsymerkkisi luotiin onnistuneesti! Varmista että kopioit sen juuri nyt, koska et voi nähdä sitä uudelleen myöhemmin! delete_token=Poista access_token_deletion=Henkilökohtaisen pääsymerkin poisto -access_token_deletion_desc=Tämän henkilökohtaisen pääsymerkin poistaminen poistaa kaikki siihen liittyvät pääsyt sovellukseen. Haluatko jatkaa? -delete_token_success=Henkilökohtainen pääsymerkki on poistettu onnistuneesti! Älä unohda päivittää sovellustasi myös. twofa_disable=Poista kaksivaiheinen todennus käytöstä twofa_enroll=Ota kaksivaiheinen todennus käyttöön twofa_disable_note=Tarvittaessa voit poistaa kaksivaiheisen todennuksen käytöstä. twofa_disabled=Kaksivaiheinen todennus on otettu pois käytöstä. + + delete_account=Poista tilisi delete_prompt=Toiminto poistaa tilisi pysyvästi ja tätä EI VOI peruuttaa myöhemmin! confirm_delete_account=Varmista poisto delete_account_title=Tilin poisto -delete_account_desc=Tämä tili poistetaan lopullisesti, haluatko jatkaa? [repo] owner=Omistaja repo_name=Repon nimi -repo_name_helper=Hyvä repon nimi yleensä koostuu lyhyistä, mieleenpainuvista ja ainutlaatuisista avainsanoista. visibility=Näkyvyys visiblity_helper=Tämä repo on yksityinen -visiblity_helper_forced=Sivuston ylläpito on pakottanut kaikkien uusien repojen olevan yksityisiä visiblity_fork_helper=(Arvon vaihtaminen vaikuttaa kaikkiin forkkeihin) clone_helper=Tarvitsetko apua kloonauksessa? Vieraile osoitteessa Apua! fork_repo=Forkkaa repo fork_from=Forkkaa lähteestä -fork_visiblity_helper=Et voi muuttaa forkatun repon näkyvyyttä. repo_desc=Kuvaus repo_lang=Kieli license=Lisenssi @@ -368,17 +285,12 @@ readme_helper=Valitse Lueminut-malli auto_init=Alusta tämä repo valituilla tiedostoilla ja mallilla create_repo=Luo repo default_branch=Oletus branch -mirror_interval=Peili aikaväli (tuntia) mirror_address=Peili osoite -mirror_address_desc=Ole hyvä ja liitä osoitteeseen tarvittavat käyttäjätunnukset. mirror_last_synced=Synkronoitu viimeksi watchers=Tarkkailijat stargazers=Tähtiharrastajat forks=Haarat -form.reach_limit_of_creation=Omistaja on saavuttanut maksimi luontirajan %d repoa. -form.name_reserved=Repon nimi '%s' on varattu. -form.name_pattern_not_allowed=Repon nimi mallia '%s' ei ole sallittu. need_auth=Tarvitaan lupa migrate_type=Siirtotyyppi @@ -404,9 +316,6 @@ star=Äänestä no_desc=Ei kuvausta quick_guide=Pikaopas clone_this_repo=Kloonaa tämä repo -create_new_repo_command=Luo uusi repo komentoriviltä -push_exist_repo=Työnnä olemassaoleva repo komentoriviltä -repo_is_empty=Tämä repo on tyhjä, ole hyvä ja tule takaisin myöhemmin! code=Koodi branch=Haara @@ -438,9 +347,9 @@ editor.name_your_file=Nimeä tiedostosi... editor.or=tai editor.cancel_lower=peruuta editor.add_tmpl=Lisää '%s/' -editor.add=Lisää "%s" +editor.add=Lisää "%s editor.update=Päivitä '%s' -editor.delete=Poista "%s" +editor.delete=Poista "%s editor.commit_message_desc=Lisää pidennetty selite (valinnainen)... editor.cancel=Peruuta editor.filename_cannot_be_empty=Tiedostonimi ei voi olla tyhjä. @@ -449,14 +358,13 @@ editor.add_subdir=Lisää alihakemisto... commits.commits=Commitit commits.search=Etsi commiteista -commits.search_all=Kaikki -commits.find=Etsi commits.author=Tekijä commits.message=Viesti commits.date=Päivämäärä commits.older=Vanhemmat commits.newer=Uudemmat + issues.new=Uusi ongelma issues.new.labels=Tunnisteet issues.new.no_label=Ei tunnistetta @@ -473,7 +381,6 @@ issues.create=Ilmoita ongelma issues.new_label=Uusi tunniste issues.new_label_placeholder=Tunnisteen nimi... issues.create_label=Luo tunniste -issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.open_tab=%d avoinna issues.close_tab=%d suljettu issues.filter_label=Tunniste @@ -524,8 +431,6 @@ issues.label_edit=Muokkaa issues.label_delete=Poista issues.label_modify=Tunnisteen muokkaus issues.label_deletion=Tunnisteen poistaminen -issues.label_deletion_desc=Tämän tunnisteen poistaminen poistaa sen tiedot kaikista siihen liittyvistä ongelmista. Haluatko jatkaa? -issues.label_deletion_success=Tunniste on poistettu onnistuneesti! issues.label.filter_sort.alphabetically=Aakkosjärjestyksessä issues.label.filter_sort.reverse_alphabetically=Käänteisessä aakkosjärjestyksessä issues.num_participants=%d osallistujaa @@ -544,16 +449,12 @@ pulls.merged_title_desc=yhdistetty %[1]d committia lähteestä %[2]s"%s"
. Varmista että haluat todella tehdä tämän. wiki.page_already_exists=Wiki-sivu, jolla on sama nimi on jo olemassa. wiki.pages=Sivut wiki.last_updated=Viimeksi päivitetty: %s @@ -609,7 +505,6 @@ settings.githooks=Git koukut settings.basic_settings=Perusasetukset settings.mirror_settings=Peilauksen asetukset settings.sync_mirror=Synkronisoi nyt -settings.mirror_sync_in_progress=Peilaus käynnissä. Päivitä sivu hetken kuluttua uudelleen. settings.site=Virallinen sivusto settings.update_settings=Päivitä asetukset settings.advanced_settings=Lisäasetukset @@ -628,28 +523,18 @@ settings.pulls_desc=Ota käyttöön pull-pyynnöt salliaksesi julkiset koodilahj settings.danger_zone=Vaaravyöhyke settings.new_owner_has_same_repo=Uudella omistajalla on jo samanniminen repo. Ole hyvä ja valitse toinen nimi. settings.convert=Muunna tavalliseksi repoksi -settings.convert_desc=Voit muuntaa tämän peilin tavalliseksi repoksi. Tätä ei voi peruuttaa. settings.convert_notices_1=- Tämä toiminto muuntaa tämän repon peilin tavalliseksi repoksi ja sitä ei voi peruuttaa. settings.convert_confirm=Vahvista muunnos -settings.convert_succeed=Repo on muunnetettu tavallisen tyyppiseksi onnistuneesti. settings.transfer=Siirrä omistajuus settings.transfer_desc=Tämän repon siirtäminen toiselle käyttäjälle tai organisaatiolle johon sinulla on ylläpito oikeudet. -settings.transfer_notices_1=- Voit menettää pääsyn jos uusi omistaja on yksittäinen käyttäjä. -settings.transfer_notices_2=- Voit pitää oikeutesi jos uusi omistaja on organisaatio ja olet yksi omistajista. -settings.transfer_form_title=Kirjoita seuraavat tiedot varmistaaksesi toimintosi: settings.wiki_delete=Poista wiki tiedot settings.wiki_delete_desc=Kun poistat wiki tiedot, niin ei ole paluuta. Varmista että haluat todella tehdä tämän. settings.wiki_delete_notices_1=- Tämä poistaa ja ottaa pois käytöstä %s wikin -settings.wiki_deletion_success=Repo wiki tiedot on poistettu onnistuneesti. settings.delete=Poista tämä repo settings.delete_desc=Huomio, kun kerran poistat repon, niin ei ole paluuta. Varmista että haluat todella tehdä tämän. settings.delete_notices_1=- Tätä toimintoa EI VOI peruuttaa myöhemmin. -settings.delete_notices_2=- Tämä toiminto poistaa pysyvästi kaikki tästä reposta, mukaanlukien Git tiedot, ongelmat, kommentit ja yhteistyökumppanien pääsyoikeudet. -settings.deletion_success=Repo on poistettu onnistuneesti! -settings.update_settings_success=Repom asetukset on päivitetty onnistuneesti. settings.transfer_owner=Uusi omistaja settings.make_transfer=Tee siirto -settings.transfer_succeed=Arkiston omistusoikeus on siirretty onnistuneesti. settings.confirm_delete=Vahvista poisto settings.add_collaborator=Lisää uusi yhteistyökumppani settings.add_collaborator_success=Uusi yhteistyökumppani on lisätty. @@ -661,13 +546,10 @@ settings.search_user_placeholder=Etsi käyttäjä... settings.org_not_allowed_to_be_collaborator=Yhteistyökumppaniksi ei voi lisätä organisaatiota. settings.user_is_org_member=Käyttäjä on organisaation jäsen, jota ei voi lisätä yhteistyökumppaniksi. settings.add_webhook=Lisää webkoukku -settings.hooks_desc=Webkoukut muistuttavat paljon perus HTTP POST tapahtuma laukaisimia. Aina kun jotain tapahtuu Giteaissa, käsittelemme ilmoituksen määrittäämääsi kohteeseen. Lisätietoja webkoukku oppaassa. settings.webhook_deletion=Poista webkoukku -settings.webhook_deletion_desc=Tämän webkoukun poistaminen poistaa sen tiedot ja kaiken toimitushistorian. Haluatko jatkaa? settings.webhook_deletion_success=Webkoukku on poistettu onnistuneesti! settings.webhook.test_delivery=Testitoimitus settings.webhook.test_delivery_desc=Lähetä väärennetty push toimitusjakelu testataksesi webkoukku asetuksia -settings.webhook.test_delivery_success=Testi webkoukku on lisätty toimitusjonoon. Muutama sekunti voi mennä ennenkuin se näkyy toimitushistoriassa. settings.webhook.request=Pyyntö settings.webhook.response=Vastaus settings.webhook.headers=Otsikot @@ -677,7 +559,6 @@ settings.githook_edit_desc=Jos koukku ei ole käytössä, esitellään esimerkki settings.githook_name=Koukun nimi settings.githook_content=Koukun sisältö settings.update_githook=Päivitys koukku -settings.add_webhook_desc=Gitea lähettää POST requestin määrittämääsi URLiin, mukaanlukien tapahtuneen eventin. Voit myös määrittää millaisen tiedostomuodon haluat saada koukun lauettua (JSON, x-www-form-urlencoded, XML, jne). Lisätietoa löytyy meidän koukut oppaasta. settings.content_type=Sisältötyyppi settings.secret=Salaus settings.slack_username=Käyttäjätunnus @@ -691,7 +572,6 @@ settings.event_create=Luo settings.event_create_desc=Branch, tai tagi luotu settings.event_push_desc=Git push repoon settings.active=Aktiivinen -settings.active_helper=Yksityiskohdat koskien tapahtumaa joka laukaisi koukun toimitetaan myös. settings.add_hook_success=Uusi webkoukku on lisätty. settings.update_webhook=Päivitä webkoukku settings.update_hook_success=Webkoukku on päivitetty. @@ -712,12 +592,9 @@ settings.key_been_used=Deploy avain sisältö on käytetty. settings.key_name_used=Deploy avain samalla nimellä on jo olemassa. settings.add_key_success=Uusi deploy avain '%s' on lisätty onnistuneesti! settings.deploy_key_deletion=Poista deploy avain -settings.deploy_key_deletion_desc=Deploy avaimen poistaminen poistaa myös kaikki liitetyt käyttötiedot tästä reposta. Haluatko jatkaa? -settings.deploy_key_deletion_success=Deploy avain on poistettu onnistuneesti! diff.browse_source=Selaa lähdekoodia diff.parent=vanhempi -diff.data_not_available=Diff tiedot eivät ole saatavilla. diff.show_diff_stats=Näytä diff tilastot diff.show_split_view=Jaettu näkymä diff.show_unified_view=Yhdistetty näkymä @@ -732,11 +609,8 @@ release.stable=Vakaa release.edit=muokkaa release.ahead=%d committia kohteeseen %s version jälkeen release.source_code=Lähdekoodi -release.new_subheader=Julkaise versioita iteroidaksesi tuotetta. -release.edit_subheader=Yksityskohtainen muutosloki auttaa käyttäjiä ymmärtämään mitä on parannettu. release.tag_name=Taginimi release.target=Kohde -release.tag_helper=Valitse olemassaoleva tagi, tai luo uusi tagi julkaistaessa. release.title=Otsikko release.content=Sisältö release.write=Kirjoita @@ -750,8 +624,6 @@ release.save_draft=Tallenna luonnos release.edit_release=Muokkaa versiota release.delete_release=Poista tämä versio release.deletion=Version poisto -release.deletion_desc=Tämän version poistaminen poistaa vastaavan Git tagin. Haluatko jatkaa? -release.deletion_success=Versio on poistettu onnistuneesti! release.tag_name_already_exist=Versio tällä taginimellä on jo olemassa. release.tag_name_invalid=Tagin nimi ei kelpaa. release.downloads=Lataukset @@ -772,9 +644,6 @@ create_new_team=Luo uusi tiimi org_desc=Kuvaus team_name=Tiimin nimi team_desc=Kuvaus -team_name_helper=Käytät tätä nimeä mainitessasi tämän tiimin keskusteluissa. -team_desc_helper=Mistä on kyse tässä tiimissä? -team_permission_desc=Mikä käyttöoikeustaso tuliti tällä tiimillä olla? form.name_reserved=Organisaation nimi '%s' on varattu. form.name_pattern_not_allowed=Organisaation nimi mallia '%s' ei ole sallittu. @@ -786,16 +655,11 @@ settings.full_name=Kokonimi settings.website=Nettisivu settings.location=Sijainti settings.update_settings=Päivitä asetukset -settings.update_setting_success=Organisaatioasetukset on päivitetty onnistuneesti. -settings.change_orgname_prompt=Tämä muutos vaikuttaa siihen miten linkit liittyvät organisaatioon. -settings.update_avatar_success=Organisaation profiilikuva asetus on päivitetty onnistuneesti. settings.delete=Poista organisaatio settings.delete_account=Poista tämä organisaatio settings.delete_prompt=Organisaatio poistetaan pysyvästi, ja tätä EI VOI peruuttaa myöhemmin! settings.confirm_delete_account=Vahvista poisto settings.delete_org_title=Organisaation poistaminen -settings.delete_org_desc=Tämä organisaatio poistetaan lopullisesti, haluatko jatkaa? -settings.hooks_desc=Lisää webkoukkuja jotka laukeavat kaikissa repoissa tässä organisaatiossa. members.membership_visibility=Jäsenyyden näkyvyys: members.public=Julkinen @@ -815,9 +679,7 @@ teams.leave=Poistu teams.read_access=Lukuoikeus teams.read_access_helper=Tämä tiimi tulee voimaan katsella ja kloonata reponsa. teams.write_access=Kirjoitusoikeus -teams.write_access_helper=Tämä tiimi tulee voimaan katsella repojaan, sekä työntää niihin. teams.admin_access=Ylläpito pääsy -teams.admin_access_helper=Tämä tiimi tulee voimaan tehdä push/pull repoihinsa, kuten myös lisäämään niihin muita työtovereita. teams.no_desc=Tällä tiimillä ei ole kuvausta teams.settings=Asetukset teams.owners_permission_desc=Omistajilla on täysi pääsy kaikkiin repoihin ja omaavat ylläpito oikeudet organisaatioon. @@ -826,8 +688,6 @@ teams.update_settings=Päivitä asetukset teams.delete_team=Poista tämä ryhmä teams.add_team_member=Lisää tiimin jäsen teams.delete_team_title=Ryhmän poistaminen -teams.delete_team_desc=Kun tämä tiimi poistetaan, tiimin jäsenet voivat menettää pääsyn joihinkin repoihin. Haluatko jatkaa? -teams.delete_team_success=Valittu tiimi on poistettu onnistuneesti. teams.read_permission_desc=Tämä tiimi myöntää lukuoikeuden: jäsenet voivat katsella ja kloonata tiimin repot. teams.write_permission_desc=Tämä tiimi myöntää kirjoitusoikeuden: jäsenet voivat lukea ja pushata tiimin repoihin. teams.admin_permission_desc=Tämä tiimi myöntää ylläpito-oikeuden: jäsenet voivat lukea, pushata, ja lisätä yhteistyökumppaneita tiimin repoihin. @@ -857,23 +717,8 @@ dashboard.statistic_info=Gitea tietokannassa on %d käyttäjää, %d%s @@ -1127,42 +944,40 @@ comment_issue=`kommentoi ongelmaa %s#%[2]s` merge_pull_request=`yhdistetty pull-pyyntö %s#%[2]s` transfer_repo=siirretty repo %s kohteeseen %s push_tag=pushattu tagi %[2]s kohteeseen %[3]s -compare_commits=Näytä vertailu näille %d commiteille [tool] -ago=sitten -from_now=alkaen nyt +ago=%s sitten +from_now=%s alkaen nyt now=nyt -1s=1 sekunti %s -1m=1 minuutti %s -1h=1 tunti %s -1d=1 päivä %s -1w=1 viikko %s -1mon=1 kuukausi %s -1y=1 vuosi %s -seconds=%d sekuntia %s -minutes=%d minuuttia %s -hours=%d tuntia %s -days=%d päivää %s -weeks=%d viikkoa %s -months=%d kuukautta %s -years=%d vuotta %s +1s=1 sekunti +1m=1 minuutti +1h=1 tunti +1d=1 päivä +1w=1 viikko +1mon=1 kuukausi +1y=1 vuosi +seconds=%d sekuntia +minutes=%d minuuttia +hours=%d tuntia +days=%d päivää +weeks=%d viikkoa +months=%d kuukautta +years=%d vuotta raw_seconds=sekuntia raw_minutes=minuuttia [dropzone] -default_message=Pudota tiedostot tähän tai klikkaa lataamista varten. invalid_input_type=Tämäntyyppisiä tiedostoja ei voi ladata. -file_too_big=Tiedostokoko ({{filesize}} MB) koko ylittää enimmäiskoon ({{maxFilesize}} MB). remove_file=Poista tiedosto [notification] notifications=Ilmoitukset unread=Lukematon read=Luettu -no_unread=Sinulla ei ole lukemattomia ilmoituksia. -no_read=Sinulla ei ole luettuja ilmoituksia. -pin=Kiinnitä mark_as_read=Merkitse luetuksi mark_as_unread=Merkitse lukemattomaksi +[gpg] + +[units] + diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 8080977..441a333 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -5,8 +5,10 @@ dashboard=Tableau de bord explore=Explorateur help=Aide sign_in=Connexion +sign_in_with=Se connecter avec sign_out=Déconnexion sign_up=Inscription +link_account=Lier un Compte register=S'inscrire website=Site web version=Version @@ -24,7 +26,7 @@ password=Mot de passe re_type=Confirmez captcha=Captcha twofa=Authentification à deux facteurs -twofa_scratch=Code supplémentaire pour l'authentification à deux facteurs +twofa_scratch=Code de secours pour l'authentification à deux facteurs passcode=Code d'accès repository=Dépôt @@ -33,7 +35,7 @@ mirror=Miroir new_repo=Nouveau dépôt new_migrate=Nouvelle migration new_mirror=Nouveau miroir -new_fork=Nouveau fork +new_fork=Nouveau Fork new_org=Nouvelle organisation manage_org=Gérer les organisations admin_panel=Administration @@ -43,6 +45,7 @@ your_profile=Votre profil your_starred=Vos favoris your_settings=Vos paramètres + activities=Activités pull_requests=Demandes d'ajout issues=Tickets @@ -51,8 +54,8 @@ cancel=Annuler [install] install=Installation -title=Instructions pour la première exécution -docker_helper=Si vous exécutez Gitea grâce à Docker, merci de lire la procédure attentivement avant de modifier quoi que ce soit sur cette page ! +title=Configuration initiale +docker_helper=Si vous exécutez Gitea grâce à Docker, merci de lire la procédure attentivement avant de modifier quoi que ce soit sur cette page. requite_db_desc=Gitea requiert MySQL, PostgreSQL, SQLite3 ou TiDB. db_title=Paramètres de la base de données db_type=Type de base de données @@ -69,11 +72,11 @@ err_invalid_tidb_name=Le nom de la base de données TiDB ne peut contenir les ca no_admin_and_disable_registration=Vous ne pouvez pas désactiver l'enregistrement sans créer un compte administrateur. err_empty_admin_password=Le mot de passe du compte administrateur ne peut être vide. -general_title=Paramètres généraux de Gitea +general_title=Paramètres généraux de l'application app_name=Nom de l'application -app_name_helper=Inscrivez fièrement le nom de votre organisation ici ! +app_name_helper=Vous pouvez mettre le nom de votre organisation ici. repo_path=Emplacement racine des dépôts -repo_path_helper=Tous les dépôts Git distants seront sauvegardés ici. +repo_path_helper=Tous les dépôts Git distants seront stockés dans ce répertoire. lfs_path=Répertoire racine LFS lfs_path_helper=Les fichiers transmis avec Git LFS seront stockés dans ce dossier. Laissez vide pour désactiver LFS. run_user=Utilisateur système @@ -93,14 +96,14 @@ optional_title=Paramètres facultatifs email_title=Paramètres du service de messagerie smtp_host=Hôte SMTP smtp_from=Provenant de -smtp_from_helper=Adresse de l'expéditeur, RFC 5322. Soit une adresse courriel simple, soit au format "Nom" . -mailer_user=E-mail de l'expéditeur +smtp_from_helper=Adresse de l'expéditeur, RFC 5322. Cela peut être une adresse courriel ou sous la forme "Nom" . +mailer_user=Expéditeur mailer_password=Mot de passe de l'expéditeur register_confirm=Activer la confirmation de l'inscription -mail_notify=Activer la notification par e-mail +mail_notify=Activer les notifications par e-mail server_service_title=Paramètres du serveur et des autres services offline_mode=Activer le mode hors connexion -offline_mode_popup=Désactiver le CDN, même en production. Toutes les ressources seront distribuées en local. +offline_mode_popup=Désactiver le CDN. Toutes les ressources seront distribuées localement. disable_gravatar=Désactiver le service Gravatar disable_gravatar_popup=Désactiver Gravatar et les sources personnalisées, tous les avatars sont téléchargés par les utilisateurs ou par défaut. federated_avatar_lookup=Activer les recherches d'avatars unifiés @@ -111,7 +114,7 @@ enable_captcha=Activez le Captcha enable_captcha_popup=Demande la validation Captcha pour l'auto-enregistrement de l'utilisateur. require_sign_in_view=Exiger l'identification pour afficher les pages require_sign_in_view_popup=Seules les personnes connectées peuvent voir les pages. Les visiteurs anonymes ne pourront voir que les pages de connexion/enregistrement. -admin_setting_desc="Vous n'avez pas besoin de créer un compte administrateur. L'utilisateur ayant l'ID = 1 aura automatiquement accès à l'administration." +admin_setting_desc=Vous n'avez pas besoin de créer un compte admin maintenant. Le premier utilisateur qui s'enregistrera obtiendra les droits administrateur automatiquement. admin_title=Paramètres du compte administrateur admin_name=Nom d'utilisateur admin_password=Mot de passe @@ -119,24 +122,24 @@ confirm_password=Confirmez le mot de passe admin_email=E-mail de l'administrateur install_btn_confirm=Installer Gitea test_git_failed=Le test de la commande "git" a échoué : %v -sqlite3_not_available=Votre version publiée ne prend pas en charge SQLite3. Veuillez télécharger la version binaire officielle à cette adresse %s. -invalid_db_setting=Paramètres de base de données incorrects : %v +sqlite3_not_available=Vous version actuelle ne supporte par SQLite3, merci de télécharger le binaire officiel depuis %s et NON pas la version version de gobuild. +invalid_db_setting=Les paramètres de la base de données sont invalides : %v invalid_repo_path=Chemin vers la racine du dépôt invalide : %v -run_user_not_match=L'utilisateur d'exécution saisi n'est pas l'utilisateur d'exécution actuel : %s -> %s -save_config_failed=La sauvegarde de la configuration a échoué : %v +run_user_not_match=L'utilisateur utilisé n'est pas celui configuré : %s -> %s +save_config_failed=L'enregistrement de la configuration %v a échoué invalid_admin_setting=Paramètres du compte administrateur invalides : %v -install_success=Bienvenue ! Nous sommes heureux que vous ayez choisi Gitea, amusez-vous et prenez soin de vous. +install_success=Bienvenue ! Merci d'avoir choisi Gitea, profitez-en bien. invalid_log_root_path=L'emplacement racine des fichiers logs est invalide : %v -default_keep_email_private=Valeur par défaut pour "Masquer mon adresse email" +default_keep_email_private=Valeur par défaut pour "Masquer mon adresse email default_keep_email_private_popup=C'est la valeur par défaut pour la visibilité de l'adresse e-mail de l'utilisateur. Si cette option est définie sur true, l'adresse e-mail de tous les nouveaux utilisateurs ne sera pas affichée tant que l'utilisateur ne modifiera pas le paramètre. no_reply_address=Adresse de non-réponse +no_reply_address_helper=Le domaine de l'adresse email de l'utilisateur dans les logs Git si celui-ci souhaite masquer son adresse. Par exemple, l'utilisateur 'joe' avec le domaine 'noreply.example.org' deviendra 'joe@noreploy.example.org' [home] uname_holder=Nom d'utilisateur ou e-mail password_holder=Mot de passe switch_dashboard_context=Basculer le contexte du tableau de bord my_repos=Mes dépôts -show_more_repos=Afficher plus de dépôts... collaborative_repos=Dépôts collaboratifs my_orgs=Mes organisations my_mirrors=Mes miroirs @@ -150,45 +153,45 @@ repos=Dépôts users=Utilisateurs organizations=Organisations search=Rechercher -repo_no_results=Aucun dépôt correspondant n'a été trouvé. -user_no_results=Aucun utilisateur correspondant n'a été trouvé. -org_no_results=Aucune organisation correspondante n'a été trouvée. [auth] -create_new_account=Créer un nouveau compte +create_new_account=Créer un compte register_helper_msg=Déjà enregistré ? Connectez-vous ! -social_register_helper_msg=Déjà enregistré ? Associez-le ! disable_register_prompt=Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site. disable_register_mail=Désolé, la confirmation par e-mail des enregistrements a été désactivée. remember_me=Se souvenir de moi -forgot_password=Mot de passe oublié -forget_password=Mot de passe oublié ? +forgot_password_title=Mot de passe oublié +forgot_password=Mot de passe oublié ? sign_up_now=Pas de compte ? Inscrivez-vous maintenant. -confirmation_mail_sent_prompt=Un nouveau mail de confirmation à été envoyé à %s. Veuillez vérifier votre boîte de réception dans un délai de %d heures pour compléter votre enregistrement. active_your_account=Activer votre compte prohibit_login=Connexion interdite -prohibit_login_desc=Votre compte est interdit de se connecter, contactez l’administrateur du site. -resent_limit_prompt=Désolé, vos tentatives d'activation sont trop fréquentes. Veuillez réessayer dans 3 minutes. +prohibit_login_desc=Votre compte n'est pas autorisé à se connecter, contactez l’administrateur du site. +resent_limit_prompt=Désolé, vous avez déjà demandé un email d’activation récemment. Veuillez réessayer dans 3 minutes. has_unconfirmed_mail=Bonjour %s, votre adresse e-mail (%s) n'a pas été confirmée. Si vous n'avez reçu aucun mail de confirmation ou souhaitez renouveler l'envoi, cliquez sur le bouton ci-dessous. resend_mail=Cliquez ici pour renvoyer un mail de confirmation -email_not_associate=Cette adresse e-mail n'est associée à aucun compte. -send_reset_mail=Cliquez ici pour (r)envoyer le mail de réinitialisation du mot de passe reset_password=Réinitialiser le mot de passe invalid_code=Désolé, votre code de confirmation est invalide ou a expiré. reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe password_too_short=Le mot de passe doit contenir %d caractères minimum. -non_local_account=Les comptes non locaux ne peuvent pas changer leur mot de passe via Gitea. +non_local_account=Les comptes non locaux ne peuvent pas changer leur mot de passe via l’interface web de Gitea. verify=Vérifier -scratch_code=Code de grattage -twofa_passcode_incorrect=Votre code est incorrect. Si vous avez perdu votre mobile, veuillez utiliser le code de grattage. -twofa_scratch_token_incorrect=Votre code de grattage est incorrect. +scratch_code=Code de secours +use_scratch_code=Utiliser un code de secours +twofa_scratch_used=Vous avez utilisé votre code de secours. Vous avez été redirigé vers cette page de configuration afin de supprimer l'authentification à deux facteurs de votre appareil ou afin de générer un nouveau code de secours. +twofa_passcode_incorrect=Votre code d’accès n’est pas correct. Si vous avez égaré votre appareil, utilisez votre code de secours pour vous connecter. +twofa_scratch_token_incorrect=Votre code de secours est incorrect. +login_userpass=Utilisateur / mot de passe +login_openid=OpenID +openid_connect_submit=Se connecter +openid_connect_title=Se connecter à un compte existant +openid_register_title=Créer un nouveau compte [mail] activate_account=Veuillez activer votre compte activate_email=Veuillez vérifier votre adresse e-mail reset_password=Réinitialiser votre mot de passe -register_success=Inscription réussie, bienvenue -register_notify=Bienvenue à bord +register_success=Inscription réussie +register_notify=Bienvenue sur Gitea [modal] yes=Oui @@ -211,13 +214,11 @@ AdminEmail=E-mail de l'administrateur NewBranchName=Nouveau nom de la branche CommitSummary=Résumé de la révision CommitMessage=Message de révision -CommitChoice=Choix de commit +CommitChoice=Choix de révision TreeName=Chemin du fichier Content=Contenu require_error=` ne peut pas être vide.` -alpha_dash_error=` doivent être des caractères alpha, numériques ou tirets (-_) valides.` -alpha_dash_dot_error=` doivent être des caractères alpha, numériques, tirets (-_) valides ou des points.` size_error=` doit être à la taille de %s.` min_size_error=` %s caractères minimum ` max_size_error=` %s caractères maximum ` @@ -226,27 +227,30 @@ url_error=` URL invalide ` include_error=`doit contenir la sous-chaîne '%s'.` unknown_error=Erreur inconnue : captcha_incorrect=Le Captcha ne correspond pas. -password_not_match=Le mot de passe et la confirmation de mot de passe ne correspondent pas. -username_been_taken=Nom d'utilisateur déjà pris. -repo_name_been_taken=Nom de dépôt déjà utilisé. -org_name_been_taken=Nom d'organisation déjà pris. +username_been_taken=Un utilisateur avec ce nom est déjà enregistré. +repo_name_been_taken=Un dépôt avec ce nom est déjà enregistré. +org_name_been_taken=Ce nom d'organisation est déjà pris. team_name_been_taken=Nom d'équipe déjà pris. -email_been_used=Adresse e-mail déjà utilisée. +email_been_used=E-mail déjà utilisé. +openid_been_used=Adresse OpenID '%s' déjà utilisée. username_password_incorrect=Nom d'utilisateur ou mot de passe incorrect. enterred_invalid_repo_name=Veuillez vérifier que le nom saisi du dépôt soit correct. enterred_invalid_owner_name=Veuillez vérifier que le nom du propriétaire saisi soit correct. enterred_invalid_password=Veuillez vérifier que le mot de passe saisi soit correct. user_not_exist=Cet utilisateur n'existe pas. last_org_owner=L'utilisateur à exclure est le dernier membre de l'équipe propriétaire. Il doit y avoir un autre propriétaire. +cannot_add_org_to_team=Une organisation ne peut être ajoutée comme membre d'une équipe. +cannot_invite_org_to_org=Une organisation ne peut être invitée comme membre d'une équipe. invalid_ssh_key=Désolé, impossible de valider votre clé SSH : %s -unable_verify_ssh_key=Gitea n'a pu vérifier la validité de votre clé SSH, même si nous partons du principe qu'elle le soit. Cela-dit, veuillez vous en assurer. +invalid_gpg_key=Désolé, nous ne sommes pas en mesure de vérifier votre clé GPG : %s +unable_verify_ssh_key=La clé ssh ne peut être vérifiée, merci de vérifier toute erreur possible. auth_failed=Échec d'authentification : %s -still_own_repo=Votre compte est toujours propriétaire d'un ou plusieurs dépôts. Vous devez d'abord les supprimer ou les transférer. -still_has_org=Votre compte fait toujours partie d'une ou plusieurs organisations. Vous devez d'abord les quitter ou les supprimer. -org_still_own_repo=Cette organisation est toujours propriétaire d'un ou plusieurs dépôts. Vous devez d'abord les supprimer ou les transférer. +still_own_repo=Votre compte est toujours propriétaire d'au moins un dépôt. Vous devez d'abord les supprimer ou les transférer. +still_has_org=Votre compte est toujours membre d'au moins une organisation. Vous devez d'abord la quitter. +org_still_own_repo=Cette organisation possède encore un ou plusieurs dépôts. Vous devez d'abord les supprimer ou les transférer. target_branch_not_exist=La branche cible n'existe pas. @@ -261,31 +265,31 @@ following=Abonnements follow=Suivre unfollow=Ne plus suivre -form.name_reserved=Le nom '%s' est réservé. +form.name_reserved=Le nom d’utilisateur "%s" est réservé. form.name_pattern_not_allowed=Motif '%s' interdit pour les noms d'utilisateur. [settings] profile=Profil -password=Mot de Passe +password=Mot de passe avatar=Avatar -ssh_keys=Clés SSH +ssh_gpg_keys=Clés SSH / GPG social=Réseaux Sociaux applications=Applications orgs=Organisations delete=Supprimer le compte twofa=Authentification à deux facteurs +account_link=Comptes externes +organization=Organisation uid=ID d'Utilisateur public_profile=Profil public -profile_desc=Votre adresse e-mail est publique et sera utilisée pour les notifications relatives au compte, ainsi que pour toute opération Web effectuée via le site. -password_username_disabled=Les utilisateurs non-locaux n'ont pas le droit de modifier leur nom d'utilisateur. +profile_desc=Votre adresse e-mail est publique et sera utilisée pour les notifications relatives au compte, ainsi que pour toute opération effectuée via le site web. full_name=Nom complet website=Site Web location=Localisation update_profile=Valider les modifications -update_profile_success=Profil mis à jour avec succès. +update_profile_success=Votre profil a été mis à jour. change_username=Non d'utilisateur modifié -change_username_prompt=Cette modification affectera la manière dont les liens se rapportent à votre compte. continue=Continuer cancel=Annuler @@ -296,104 +300,90 @@ choose_new_avatar=Sélectionner un nouvel avatar update_avatar=Mettre à jour l'avatar delete_current_avatar=Supprimer l'avatar actuel uploaded_avatar_not_a_image=Le fichier téléchargé n'est pas une image. -update_avatar_success=Votre avatar a été mis à jour avec succès. change_password=Modifier le mot de passe old_password=Mot de passe actuel new_password=Nouveau mot de passe retype_new_password=Retapez le nouveau mot de passe -password_incorrect=Mot de passe actuel incorrect. change_password_success=Mot de passe modifié avec succès. Vous pouvez à présent vous connecter avec le nouveau mot de passe. -password_change_disabled=Les utilisateurs non-locaux n'ont pas le droit de modifier leur mot de passe. +password_change_disabled=Les utilisateurs non locaux ne sont pas autorisés à modifier leur mot de passe via l’interface web. emails=Adresses e-mail manage_emails=Gérer les adresses e-mail +manage_openid=Gérer les adresses OpenID email_desc=Votre adresse e-mail principale sera utilisée pour les notifications et d'autres opérations. primary=Principale primary_email=Définir comme principale delete_email=Supprimer -email_deletion=Suppression de l'adresse e-mail -email_deletion_desc=Supprimer cette adresse e-mail supprimera les informations associées à votre compte. Voulez-vous continuer ? +email_deletion=Supprimer l’Email email_deletion_success=L'adresse e-mail a été supprimée avec succès ! +openid_deletion=Suppression de l'OpenID add_new_email=Ajouter une nouvelle adresse e-mail add_email=Ajouter un e-mail -add_email_confirmation_sent=Une nouvelle confirmation d'adresse e-mail a été envoyé à '%s', veuillez vérifier votre boîte de réception dans un délai de %d heures pour terminer le processus de confirmation. add_email_success=Votre nouvelle adresse e-mail a été ajoutée avec succès. keep_email_private=Masquer l'adresse email keep_email_private_popup=Votre adresse email sera masquée aux autres utilisateurs si cette option est activée. manage_ssh_keys=Gérer les clés SSH -add_key=Ajouter une Clé -ssh_desc=Ceci est une liste des clés SSH associées à votre compte. Supprimez celles que vous ne reconnaissez pas. -ssh_helper=Besoin d'aide? Consultez notre guide pour générer des clés SSH ou résoudre les problèmes courants de SSH. -add_new_key=Ajouter une Clé SSH -ssh_key_been_used=Le contenu de la clé publique a été utilisée. -ssh_key_name_used=Un clé publique avec le même nom existe déjà. +manage_gpg_keys=Gérer les clés GPG +add_key=Ajouter une clé +add_new_key=Ajouter une clé SSH +add_new_gpg_key=Ajouter une clé GPG +subkeys=Sous-clés +key_id=Clé ID key_name=Nom de la Clé key_content=Contenu -add_key_success=La nouvelle clé SSH '%s' a été ajoutée avec succès ! +add_key_success=Votre clef SSH "%s" a été ajouté. +add_gpg_key_success=Votre clef SSH "%s" a été ajouté. delete_key=Supprimer ssh_key_deletion=Suppression de la clé SSH -ssh_key_deletion_desc=Supprimer cette clé SSH supprimera tous les accès à votre compte. Voulez-vous continuer ? -ssh_key_deletion_success=Clé SSH supprimée avec succès ! +gpg_key_deletion=Suppression de la clé GPG add_on=Ajouté le +valid_until=Valide jusqu’à last_used=Dernière utilisation le no_activity=Aucune activité récente -key_state_desc=Cette clé a été utilisée durant les 7 derniers jours -token_state_desc=Ce jeton a été utilisé durant les 7 derniers jours +show_openid=Afficher sur mon profil +hide_openid=Masquer du profil manage_social=Gérer les réseaux sociaux associés -social_desc=Ceci est la liste des comptes de réseaux sociaux associés. Supprimez ceux que vous ne reconnaissez pas. unbind=Dissocier -unbind_success=Compte de réseau social dissocié. manage_access_token=Gérer les jetons d'accès personnels generate_new_token=Générer le nouveau jeton -tokens_desc=Jetons, que vous avez généré, qui peuvent être utilisés pour accéder à l'API Gitea. new_token_desc=Chaque Jeton donnera un accès complet à votre compte. token_name=Nom du jeton generate_token=Générer le jeton -generate_token_succees=Nouveau jeton d'accès a été généré avec succès ! Assurez-vous de copier votre nouveau jeton d'accès personnel maintenant. Vous ne serez pas en mesure de le revoir ! delete_token=Supprimer access_token_deletion=Suppression du jeton d'accès -access_token_deletion_desc=Supprimer ce jeton d'accès supprimera tous les accès de l'application. Voulez-vous continuer ? -delete_token_success=Le jeton d'accèsa été supprimé avec succès ! N'oubliez pas de mettre à jour vos applications. -twofa_desc=Gitea supporte l'authentification à deux facteurs pour garantir à votre compte une sécurité accrue. -twofa_is_enrolled=Votre compte est inscrit à l'authentification à deux facteurs. -twofa_not_enrolled=Votre compte n'est pas inscrit à l'authentification à deux facteurs. twofa_disable=Désactiver l'authentification à deux facteurs -twofa_scratch_token_regenerate=Régénérer le code de grattage +twofa_scratch_token_regenerate=Régénérer le code de secours twofa_scratch_token_regenerated=Votre code de grattage a été régénéré. Il est à présent %s. Gardez-le à un endroit sûr. twofa_enroll=Activer l'authentification à deux facteurs twofa_disable_note=Si nécessaire, vous pouvez désactiver l'authentification à deux facteurs. -twofa_disable_desc=Désactiver l'authentification à deux facteurs rendra votre compte plus vulnérable. Êtes-vous sûr(e) de vouloir continuer? -regenerate_scratch_token_desc=Si vous avez perdu votre code de grattage, ou avez du l'utiliser pour vous authentifier, vous pouvez le réinitialiser. twofa_disabled=L'authentification à deux facteurs a été désactivée. scan_this_image=Scannez cette image avec votre application d'authentification : or_enter_secret=Ou saisissez le code secret: %s -then_enter_passcode=Puis saisissez le mot de passe que l'application vous fournit : passcode_invalid=Le mot de passe est invalide. Réessayez. -twofa_enrolled=Votre compte est à présent activé avec l'authentification à deux facteurs. Assurez-vous de conserver votre code de grattage (%s), c'est la dernière fois que vous le verrez! +twofa_enrolled=L'authentification à deux facteurs est à présent activée sur votre compte. Assurez-vous de conserver votre code de secours (%s) en lieu sûr, c'est la dernière fois que vous le voyez ! + +remove_account_link=Supprimer le compte lié + delete_account=Supprimer votre compte delete_prompt=Votre compte sera définitivement supprimé et cette opération est irréversible ! confirm_delete_account=Confirmer la suppression delete_account_title=Suppression de compte -delete_account_desc=Ce compte sera supprimé définitivement. Voulez-vous continuer ? [repo] owner=Propriétaire repo_name=Nom du dépôt -repo_name_helper=Idéalement, le nom d'un dépot devrait être court, mémorable et unique. visibility=Visibilité visiblity_helper=Ce dépôt est privé -visiblity_helper_forced=L'administrateur du site a forcé tous les nouveaux dépôts à être privés -visiblity_fork_helper=(Les changement de cette valeur affecteront tous les forks) +visiblity_fork_helper=(Les changement de cette valeur affecteront toutes les bifurcations) clone_helper=Besoin d'aide pour dupliquer ? Visitez l'aide ! -fork_repo=Créer un fork du dépôt -fork_from=Fork de -fork_visiblity_helper=La visibilité d'un fork ne peut pas être modifiée. +fork_repo=Créer une bifurcation du dépôt +fork_from=Bifurquer depuis repo_desc=Description repo_lang=Langue repo_gitignore_helper=Choisissez un modèle de fichier .gitignore @@ -405,19 +395,16 @@ auto_init=Initialiser ce dépôt avec le modèle et les fichiers sélectionnés create_repo=Créer un dépôt default_branch=Branche par défaut mirror_prune=Purger -mirror_prune_desc=Supprimez toute référence de suivi à distance qui n'existe plus sur le dépôt distant -mirror_interval=Intervalle du miroir (heure) +mirror_interval_invalid=L'intervalle du miroir n'est pas valide mirror_address=Adresse du miroir -mirror_address_desc=Veuillez inclure les informations d'identification nécessaires dans l'adresse. mirror_last_synced=Dernière synchronisation watchers=Observateurs -forks=Fourches +stargazers=Fans +forks=Bifurcations -form.reach_limit_of_creation=Le propriétaire a atteint le nombre maximal de %d dépôts créés. -form.name_reserved=Le nom de dépôt '%s' est réservé. -form.name_pattern_not_allowed=Motif '%s' interdit pour les noms de dépôt. +form.name_reserved=Le dépôt "%s" a un nom réservé. -need_auth=Nécessite une Autorisation +need_auth=Nécessite une autorisation migrate_type=Type de migration migrate_type_helper=Ce dépôt sera un miroir migrate_repo=Migrer le dépôt @@ -429,7 +416,7 @@ migrate.invalid_local_path=Chemin local non valide, non existant ou n'étant pas migrate.failed=Echec de migration: %v mirror_from=miroir de -forked_from=forké depuis +forked_from=bifurqué depuis copy_link=Copier copy_link_success=Copié! copy_link_error=Appuyez sur ⌘-C ou Ctrl-C pour copier @@ -438,15 +425,12 @@ unwatch=Ne plus suivre watch=Suivre unstar=Retirer le vote star=Voter -fork=Fourcher +fork=Bifurcation download_archive=Télécharger ce dépôt no_desc=Aucune description quick_guide=Introduction rapide clone_this_repo=Cloner ce dépôt -create_new_repo_command=Créer un nouveau dépôt en ligne de commande -push_exist_repo=Soumettre un dépôt existant par ligne de commande -repo_is_empty=Ce dépôt est vide, veuillez revenir plus tard ! code=Code branch=Branche @@ -456,7 +440,7 @@ branches=Branches tags=Tags issues=Tickets pulls=Demandes d'ajout -labels=Etiquettes +labels=Étiquettes milestones=Jalons commits=Révisions releases=Publications @@ -467,30 +451,30 @@ file_permalink=Lien permanent file_too_large=Ce fichier est trop gros pour être afficher video_not_supported_in_browser=Votre navigateur ne supporte pas le tag video HTML5. stored_lfs=Stocké avec Git LFS +commit_graph=Graphique des révisions editor.new_file=Nouveau fichier editor.upload_file=Téléverser un fichier editor.edit_file=Modifier fichier editor.preview_changes=Aperçu des modifications -editor.cannot_edit_non_text_files=Impossible de modifier les fichiers non-texte editor.edit_this_file=Modifier ce fichier editor.must_be_on_a_branch=Vous devez être sur une branche pour appliquer ou proposer des modifications à ce fichier -editor.fork_before_edit=Vous devez fourcher ce dépôt avant de modifier le fichier +editor.fork_before_edit=Vous devez bifurquer ce dépôt avant de modifier le fichier editor.delete_this_file=Supprimer ce fichier editor.must_have_write_access=Vous devez avoir un accès en écriture pour appliquer ou proposer des modifications à ce fichier editor.file_delete_success=Fichier '%s' a été supprimé avec succès! editor.name_your_file=Nommez votre fichier... -editor.filename_help=Pour ajouter un répertoire, il suffit de le taper puis d'appuyer sur /. Pour supprimer un répertoire, aller au début du champ et appuyerz sur retour arrière. +editor.filename_help=Pour ajouter un répertoire, il suffit de le saisir puis d'appuyer sur /. Pour supprimer un répertoire, aller au début du champ et appuyez sur retour arrière. editor.or=ou editor.cancel_lower=annuler -editor.commit_changes=Commit les modifications +editor.commit_changes=Committer les modifications editor.add_tmpl=Ajouter '%s/' editor.add=Ajouter '%s' editor.update=Mettre à jour '%s' editor.delete=Supprimer '%s' -editor.commit_message_desc=Ajouter une optionnelle description détaillée... -editor.commit_directly_to_this_branch=Soumettre directement à la branche %s. -editor.create_new_branch=Créer une nouvelle branche pour cette validation et envoyer une nouvelle demande d'ajout. +editor.commit_message_desc=Ajouter une description détaillée facultative... +editor.commit_directly_to_this_branch=Soumettre directement dans la branche %s. +editor.create_new_branch=Créer une nouvelle branche pour cette révision et envoyer une nouvelle demande d'ajout. editor.new_branch_name_desc=Nouveau nom de la branche... editor.cancel=Annuler editor.filename_cannot_be_empty=Nom de fichier ne peut pas être vide. @@ -499,7 +483,6 @@ editor.directory_is_a_file=L'entrée '%s' dans le chemin d’accès parent est u editor.file_is_a_symlink=Le fichier '%s' est un lien symbolique qui ne peut pas être modifié par l'éditeur web editor.filename_is_a_directory=Le nom de fichier '%s' existe déjà dans ce dépot. editor.file_editing_no_longer_exists=Le fichier '%s' que vous modifiez n'existe plus dans le dépôt. -editor.file_changed_while_editing=Le contenu du fichier à changé depuis que vous avez commencé à l'éditer. Cliquez ici pour voir ce qui à été modifié ou appuyez sur commit encore une fois pour remplacer ces changements. editor.file_already_exists=La branche '%s' existe déjà dans ce dépôt. editor.no_changes_to_show=Il n’y a aucun changement à afficher. editor.fail_to_update_file=Échec lors de la mise à jour/création du fichier '%s' avec l’erreur : %v @@ -509,16 +492,17 @@ editor.upload_files_to_dir=Transférer les fichiers vers '%s' commits.commits=Révisions commits.search=Rechercher des révisions -commits.search_all=Tous -commits.find=Trouver +commits.find=Chercher +commits.search_all=Toutes les branches commits.author=Auteur commits.message=Message commits.date=Date commits.older=Précédemment commits.newer=Récemment + issues.new=Nouveau ticket -issues.new.labels=Etiquettes +issues.new.labels=Étiquettes issues.new.no_label=Pas d'étiquette issues.new.clear_labels=Effacer les étiquettes issues.new.milestone=Jalon @@ -534,12 +518,12 @@ issues.new_label=Nouvelle étiquette issues.new_label_placeholder=Nom de l'étiquette... issues.create_label=Créer une étiquette issues.label_templates.title=Charger un ensemble prédéfini d'étiquettes -issues.label_templates.info=Il n'y a pas encore d'étiquettes. Vous pouvez cliquer sur le bouton "Nouveau Label" ci-dessus pour créer une ou utiliser un ensemble prédéfini ci-dessous. +issues.label_templates.info=Il n'y a pas encore d'étiquettes. Vous pouvez cliquer sur le bouton "Nouvelle étiquette" pour en créer une ou en utiliser une prédéfinies ci-dessous. issues.label_templates.helper=Sélectionnez un ensemble d'étiquettes -issues.label_templates.use=Utilisez ce jeu d'étiquettes +issues.label_templates.use=Utiliser ce jeu d'étiquettes issues.label_templates.fail_to_load_file=Impossible de charger le fichier de modèle étiquette '%s' : %v -issues.add_label_at=`ajouté le
%s
label %s` -issues.remove_label_at=`supprimé le
%s
label %s` +issues.add_label_at=`ajouté le
%s
label %s` +issues.remove_label_at=`supprimé le
%s
label %s` issues.add_milestone_at=`a ajouté cela au jalon %s %s` issues.change_milestone_at=`a modifié le jalon de %s à %s %s` issues.remove_milestone_at=`a supprimé cela du jalon %s %s` @@ -551,7 +535,7 @@ issues.delete_branch_at=`a supprimé la branche %s %s` issues.open_tab=%d Ouvert issues.close_tab=%d Fermé issues.filter_label=Étiquette -issues.filter_label_no_select=Aucun étiquette sélectionnée +issues.filter_label_no_select=Aucune étiquette sélectionnée issues.filter_milestone=Jalon issues.filter_milestone_no_select=Aucun jalon sélectionné issues.filter_assignee=Assigné @@ -559,7 +543,7 @@ issues.filter_assginee_no_select=Pas d'assignataire selectionné issues.filter_type=Type issues.filter_type.all_issues=Tous les tickets issues.filter_type.assigned_to_you=Qui vous sont assignés -issues.filter_type.created_by_you=Crées par vous +issues.filter_type.created_by_you=Créés par vous issues.filter_type.mentioning_you=Vous mentionnant issues.filter_sort=Trier issues.filter_sort.latest=Plus récent @@ -568,6 +552,12 @@ issues.filter_sort.recentupdate=Mis à jour récemment issues.filter_sort.leastupdate=Moins récemment mis à jour issues.filter_sort.mostcomment=Les plus commentés issues.filter_sort.leastcomment=Les moins commentés +issues.action_open=Ouvrir +issues.action_close=Fermer +issues.action_label=Étiquette +issues.action_milestone=Jalon +issues.action_assignee=Assigné à +issues.action_assignee_no_select=Pas d'assignataire issues.opened_by=Créé %[1]s par %[3]s issues.opened_by_fake=ouvert %[1]s par %[2]s issues.previous=Page Précédente @@ -593,21 +583,24 @@ issues.sign_in_require_desc=Connectez-vous pour rejoindre cette issues.edit=Modifier issues.cancel=Annuler issues.save=Enregistrer -issues.label_title=Nom du Label -issues.label_color=Couleur du Label -issues.label_count=%d labels +issues.label_title=Nom de l'étiquette +issues.label_color=Couleur de l'étiquette +issues.label_count=%d étiquettes issues.label_open_issues=%d tickets ouverts issues.label_edit=Éditer issues.label_delete=Supprimer -issues.label_modify=Modification du Label -issues.label_deletion=Suppression du Label -issues.label_deletion_desc=Cette opération supprimera également toutes les informations relatives aux tickets. Voulez-vous continuer ? -issues.label_deletion_success=Label supprimé avec succès ! +issues.label_modify=Modification de l'étiquette +issues.label_deletion=Suppression de l'étiquette +issues.label_deletion_success=L'étiquette a été supprimé avec succès ! issues.label.filter_sort.alphabetically=Par ordre alphabétique issues.label.filter_sort.reverse_alphabetically=Par ordre alphabétique inversé +issues.label.filter_sort.by_size=Taille +issues.label.filter_sort.reverse_by_size=Taille inverse issues.num_participants=%d participants issues.attachment.open_tab=`Cliquez ici pour voir '%s' dans un nouvel onglet` issues.attachment.download=`Cliquez pour télécharger "%s"` +issues.subscribe=S’abonner +issues.unsubscribe=Se désabonner pulls.new=Nouvelle demande d'ajout pulls.compare_changes=Comparer les changements @@ -616,26 +609,24 @@ pulls.compare_base=Base pulls.compare_compare=Comparer pulls.filter_branch=Filtre de branche pulls.no_results=Aucun résultat trouvé. -pulls.nothing_to_compare=Il n'y a rien de comparable parce que les deux branches sont égales. +pulls.nothing_to_compare=Il n'y a rien à comparer car les deux branches sont équivalentes. pulls.has_pull_request=`Il y a déjà une demande d'ajout entre ces deux cibles : %[2]s#%[3]d` pulls.create=Creer une demande d'ajout -pulls.title_desc=veut fusionner %[1]d commits à partir de %[2]s vers %[3]s +pulls.title_desc=veut fusionner %[1]d révision(s) depuis %[2]s vers %[3]s pulls.merged_title_desc=a fusionné %[1]d révision(s) à partir de %[2]s vers %[3]s %[4]s pulls.tab_conversation=Discussion pulls.tab_commits=Révisions pulls.tab_files=Fichiers modifiés -pulls.reopen_to_merge=Veuillez rouvrir cette demande de Pull Request pour effectuer l'opération de fusion. +pulls.reopen_to_merge=Veuillez rouvrir cette demande d'ajout pour effectuer l'opération de fusion. pulls.merged=Fusionnée -pulls.has_merged=Cette demande d'ajout a été fusionnée avec succès ! -pulls.data_broken=Les données de cette pull request ont été compromises en raison de la suppression d'informations sur le fork. +pulls.data_broken=Les données de cette demande d'ajout ont été perdues en raison de la suppression des informations concernant la bifurcation. pulls.is_checking=La recherche de conflits est toujours en cours, veuillez rafraichir la page dans quelques instants. pulls.can_auto_merge_desc=Cette demande d'ajout peut être fusionnée automatiquement. pulls.cannot_auto_merge_desc=Cette demande d'ajout ne peut pas être fusionnée automatiquement à cause de conflits. pulls.cannot_auto_merge_helper=Fusionner manuellement afin de résoudre les conflits. pulls.merge_pull_request=Fusionner la demande d'ajout -pulls.open_unmerged_pull_exists=`Vous ne pouvez effectuer une réouverture car il y a déjà une pull-request ouverte (#%d) depuis le même dépôt avec les mêmes informations de fusion et est en attente de fusion.` -milestones.new=Nouveau Jalon +milestones.new=Nouveau jalon milestones.open_tab=%d Ouvert milestones.close_tab=%d Fermé milestones.closed=%s fermé @@ -651,12 +642,10 @@ milestones.clear=Effacer milestones.invalid_due_date_format=Le format de la date d'échéance est invalide, il doit être comme suit 'AAAA-mm-jj'. milestones.create_success=Le Jalon '%s' a été crée avec succès ! milestones.edit=Éditer le Jalon -milestones.edit_subheader=Utilisez une description claire pour les jalons pour ne pas induire les gens en erreur. milestones.cancel=Annuler milestones.modify=Modifier le Jalon milestones.edit_success=Le Jalon '%s' a été modifié avec succès ! milestones.deletion=Supprimer le Jalon -milestones.deletion_desc=Supprimer ce jalon effacera ses informations dans tous les tickets relatifs. Voulez-vous continuer ? milestones.deletion_success=Le Jalon a été supprimé avec succès ! milestones.filter_sort.closest_due_date=Date d'échéance la plus proche milestones.filter_sort.furthest_due_date=Date d'échéance la plus éloignée @@ -665,9 +654,10 @@ milestones.filter_sort.most_complete=Le plus complété milestones.filter_sort.most_issues=Le plus de tickets milestones.filter_sort.least_issues=Le moins de tickets + wiki=Wiki -wiki.welcome=Bienvenue sur le Wiki ! -wiki.welcome_desc=Le Wiki est l'endroit où vous pouvez documenter votre projet ensemble et l'améliorer. +wiki.welcome=Bienvenue sur le Wiki +wiki.desc=Le wiki est un endroit pour stocker des informations wiki.create_first_page=Créer la première page wiki.page=Page wiki.filter_page=Filtrer la page @@ -678,7 +668,6 @@ wiki.last_commit_info=%s a édité cette page %s wiki.edit_page_button=Modifier wiki.new_page_button=Nouvelle Page wiki.delete_page_button=Supprimer la page -wiki.delete_page_notice_1=Cela supprimera la page "%s". Soyez-en sûr. wiki.page_already_exists=Une page de wiki avec le même nom existe déjà. wiki.pages=Pages wiki.last_updated=Dernière mise à jour: %s @@ -687,15 +676,14 @@ settings=Paramètres settings.options=Options settings.collaboration=Collaboration settings.collaboration.admin=Administrateur -settings.collaboration.write=Écrire -settings.collaboration.read=Lire +settings.collaboration.write=Écriture +settings.collaboration.read=Lecture settings.collaboration.undefined=Indéfini settings.hooks=Déclencheurs Web settings.githooks=Déclencheurs Git settings.basic_settings=Paramètres de base settings.mirror_settings=Réglages Miroir settings.sync_mirror=Synchroniser maintenant -settings.mirror_sync_in_progress=Synchronisation du miroir en cours, merci de rafraîchir la page dans une minute environ. settings.site=Site officiel settings.update_settings=Valider settings.advanced_settings=Paramètres avancés @@ -703,14 +691,15 @@ settings.wiki_desc=Activer le wiki settings.use_internal_wiki=Utiliser le wiki interne settings.use_external_wiki=Utiliser un wiki externe settings.external_wiki_url=URL Wiki externe +settings.external_wiki_url_error=URL externe de Wiki invalide settings.external_wiki_url_desc=Les visiteurs seront redirigés vers cette URL lorsqu'ils cliqueront sur l'onglet. settings.issues_desc=Activer le système de tickets -settings.use_internal_issue_tracker=Utiliser le système simplifié de tickets interne +settings.use_internal_issue_tracker=Utiliser le système de tickets interne settings.use_external_issue_tracker=Utiliser un système de tickets externe -settings.external_tracker_url=Adresse du gestionnaire de bugs externe +settings.external_tracker_url=Adresse du système de tickets externe settings.external_tracker_url_desc=Les visiteurs seront redirigés vers cette URL lorsqu'ils cliqueront sur l'onglet. -settings.tracker_url_format=Format d'URL du bug tracker -settings.tracker_issue_style=Style de nommage des bugs du tracker externe : +settings.tracker_url_format=Format de l'URL du système de tickets +settings.tracker_issue_style=Style de nommage des tickets : settings.tracker_issue_style.numeric=Numérique settings.tracker_issue_style.alphanumeric=Alphanumérique settings.tracker_url_format_desc=Vous pouvez utiliser l'espace réservé {user} {repo} {index} pour le nom d'utilisateur, le nom du dépôt et le numéro de bug. @@ -718,29 +707,18 @@ settings.pulls_desc=Activer les pull requests pour accepter les contributions pu settings.danger_zone=Zone de danger settings.new_owner_has_same_repo=Le nouveau propriétaire a déjà un dépôt nommé ainsi. settings.convert=Convertir en dépôt ordinaire -settings.convert_desc=Vous pouvez convertir ce miroir en dépôt ordinaire. Cela ne peut pas être inversée. settings.convert_notices_1=- Cette opération va convertir ce dépôt miroir en un dépôt standard et ne peut être annulée. settings.convert_confirm=Confirmer la conversion -settings.convert_succeed=Le dépôt a été converti avec succès en dépôt ordinaire. settings.transfer=Changer de propriétaire settings.transfer_desc=Transférer ce dépôt à un autre utilisateur ou une organisation dont vous possédez des droits d'administrateur. -settings.transfer_notices_1=- Vous perdrez l'accès si le nouveau propriétaire est un utilisateur individuel. -settings.transfer_notices_2=- Vous conserverez l'accès si le nouveau propriétaire est une organisation et que vous y appartenez. -settings.transfer_form_title=Veuillez recopier le texte suivant afin de confirmer votre opération : settings.wiki_delete=Effacer les données du Wiki settings.wiki_delete_desc=Une fois que vous effacez les données du wiki, on ne peut revenir en arrière. Soyez-en sûr. settings.wiki_delete_notices_1=- Cela va supprimer et désactiver le wiki pour %s -settings.wiki_deletion_success=Le dépôt de données wiki ont été effacés avec succès. settings.delete=Supprimer ce dépôt -settings.delete_desc=Attention, cette action est action irréversible. Soyez sûr de vous. +settings.delete_desc=La suppression d'un dépôt est irréversible. Soyez sûr de vous. settings.delete_notices_1=- Cette opération ne peut pas être annulée. -settings.delete_notices_2=- Cette opération supprimera définitivement le dépôt, y compris les données Git, les tickets, les commentaires et les accès des collaborateurs. -settings.delete_notices_fork_1=-Tous les forks deviendront indépendants après l’effacement. -settings.deletion_success=Le dépôt a été supprimé avec succès! -settings.update_settings_success=Options mises à jour avec succès. settings.transfer_owner=Nouveau propriétaire settings.make_transfer=Transférer -settings.transfer_succeed=Le contrôle du dépôt a été transféré avec succès. settings.confirm_delete=Confirmer la suppression settings.add_collaborator=Ajouter un collaborateur settings.add_collaborator_success=Nouveau collaborateur ajouté. @@ -751,25 +729,21 @@ settings.remove_collaborator_success=Collaborateur supprimé. settings.search_user_placeholder=Rechercher un utilisateur... settings.org_not_allowed_to_be_collaborator=Une organisation n'est pas autorisée à être ajoutée en tant que collaborateur. settings.user_is_org_member=Cet utilisateur ne peut pas être ajouté en tant que collaborateur car il fait partie d'une organisation. -settings.add_webhook=Ajouter un Webhook -settings.hooks_desc=Les Webhooks sont des déclencheurs de POST HTTP . Lorsque qu'un événement se produit dans Gitea, une notification sera envoyée vers l'hôte cible préalablement spécifié. Apprenez-en davantage dans le Guide des Webhooks. +settings.add_webhook=Ajouter un déclencheur Web settings.webhook_deletion=Supprimer le Webhook -settings.webhook_deletion_desc=Supprimer ce webhook va supprimer ses informations et l'historique de livraison. Voulez-vous continuer ? settings.webhook_deletion_success=Le webhook a été supprimé avec succès ! settings.webhook.test_delivery=Tester la version settings.webhook.test_delivery_desc=Envoyer un faux push pour tester la configuration des webhooks -settings.webhook.test_delivery_success=Le webhook de test a été ajouté à la file d'attente de livraison. L'affichage dans l'historique de livraison peut prendre quelques secondes. settings.webhook.request=Requête settings.webhook.response=Réponse settings.webhook.headers=Entêtes settings.webhook.payload=Données settings.webhook.body=Corps -settings.githooks_desc=Les Hooks Git sont alimentés par Git lui même. Les Hooks compatibles sont modifiables dans la liste ci-dessous pour effectuer des opérations personnalisées. +settings.githooks_desc=Les déclencheurs Git sont lancés par Git lui-même. Ils sont modifiables dans la liste ci-dessous afin de configurer des opérations personnalisées. settings.githook_edit_desc=Si un Hook est inactif, un exemple de contenu vous sera proposé. Un contenu laissé vide signifie un Hook inactif. settings.githook_name=Nom du Hook settings.githook_content=Contenu du Hook settings.update_githook=Mettre le Hook à jour -settings.add_webhook_desc=Une requête POST sera transmise vers l'URL spécifiée selon l'événement produit. Vous pouvez également choisir le format souhaité pour la réception des données (JSON, x-www-form-urlencoded, XML etc). Pour plus d'infos, lisez le Guide des WebHooks. settings.payload_url=URL des Données Utiles settings.content_type=Type de contenu settings.secret=Confidentiel @@ -787,7 +761,6 @@ settings.event_pull_request_desc=Pull request ouvert, fermé, rouvert, édité, settings.event_push=Pousser settings.event_push_desc=Git push vers un dépôt settings.active=Actif -settings.active_helper=Les détails seront délivrés lorsque ce Hook sera déclenché. settings.add_hook_success=Nouveau Webhook ajouté. settings.update_webhook=Mettre à jour le Webhook settings.update_hook_success=Webhook mis à jour. @@ -799,8 +772,8 @@ settings.slack_token=Jeton settings.slack_domain=Domaine settings.slack_channel=Canal settings.deploy_keys=Clés de déploiement -settings.add_deploy_key=Ajouter une Clé de Déploiement -settings.deploy_key_desc=Déployer une clé uniquement en lecture seule. Il ne s'agit pas des clés ssh de compte personnel. +settings.add_deploy_key=Ajouter une clé de déploiement +settings.deploy_key_desc=Les clés de déploiement ont un accès en lecture seule. Elles sont différentes des clés SSH personnelles. settings.no_deploy_keys=Vous n'avez ajouté aucune clé de déploiement. settings.title=Titre settings.deploy_key_content=Contenu @@ -808,13 +781,19 @@ settings.key_been_used=Le contenu de la clé de déploiement a été utilisé. settings.key_name_used=Une clé de déploiement avec le même nom existe déjà. settings.add_key_success=La nouvelle clé de déploiement '%s' a été ajoutée avec succès ! settings.deploy_key_deletion=Supprimer la Clé de Déploiement -settings.deploy_key_deletion_desc=Supprimer cette clé de déploiement effacera tous les accès relatifs pour ce référentiel. Voulez-vous continuer ? -settings.deploy_key_deletion_success=La clé de déploiement a été supprimée avec succès ! +settings.branches=Branches +settings.protected_branch=Protection de branche +settings.add_protected_branch=Activer la protection +settings.delete_protected_branch=Désactiver la protection +settings.add_protected_branch_success=%s verrouillé avec succès +settings.remove_protected_branch_success=%s déverrouillé avec succès +settings.protected_branch_deletion=Pour supprimer une branche protégée +settings.choose_branch=Choisissez une branche... +settings.no_protected_branch=Il n’y a aucune branches protégées -diff.browse_source=Parcourir la Source +diff.browse_source=Parcourir la source diff.parent=Parent diff.commit=révision -diff.data_not_available=Données Diff indisponibles. diff.show_diff_stats=Afficher les stats Diff diff.show_split_view=Vue séparée diff.show_unified_view=Vue unifiée @@ -830,13 +809,10 @@ release.draft=Brouillon release.prerelease=Pré-publication release.stable=Stable release.edit=Éditer -release.ahead=%d commits jusqu'à %s depuis cette publication +release.ahead=%d révisions sur %s depuis cette publication release.source_code=Code source -release.new_subheader=Publier une version pour itérer sur le produit. -release.edit_subheader=Un changelog détaillé peut aider les utilisateurs à comprendre ce qui a été amélioré. release.tag_name=Nom du tag release.target=Cible -release.tag_helper=Choisissez un tag existant ou créez-en un nouveau à publier. release.title=Titre release.content=Contenu release.write=Écrire @@ -850,19 +826,13 @@ release.save_draft=Sauvegarder le Brouillon release.edit_release=Modifier la version release.delete_release=Supprimer cette version release.deletion=Suppression de la Version -release.deletion_desc=Supprimer cette version supprimera le tag Git correspondant. Voulez-vous continuer ? -release.deletion_success=La version à été supprimée avec succès ! release.tag_name_already_exist=Une version avec ce nom de tag existe déjà. release.tag_name_invalid=Nom de tag invalide. release.downloads=Téléchargements branch.delete=Supprimer la branche %s -branch.delete_desc=La suppression d'une branche ne peut pas être annulée. Soyez sûr de vous. branch.delete_notices_1=- Cette opération NE PEUT PAS être annulée. -branch.delete_notices_2=- Cette opération supprimera définitivement le contenu de la branche %s. -branch.deletion_success=%s a été correctement supprimé ! branch.deletion_failed=Impossible de supprimer la branche %s. -branch.delete_branch_has_new_commits=%s ne peut pas être supprimé(e) car de nouvelles révisions ont été effectuées après la fusion. [org] org_name_holder=Nom de l'organisation @@ -877,11 +847,9 @@ lower_members=Membres lower_repositories=dépôts create_new_team=Créer une nouvelle équipe org_desc=Description -team_name=Nom d'Équipe +team_name=Nom de l'équipe team_desc=Description -team_name_helper=Ce nom sera utilisé pour mentionner l'équipe dans les conversations. -team_desc_helper=Présentation de l'équipe -team_permission_desc=Quel niveau d'accès cette équipe devrait-elle posséder ? +team_desc_helper=A quoi sert cette équipe ? form.name_reserved=Le nom d'organisation '%s' est réservé. form.name_pattern_not_allowed=Motif '%s' interdit pour les noms d'organisation. @@ -893,16 +861,11 @@ settings.full_name=Non Complet settings.website=Site Web settings.location=Localisation settings.update_settings=Valider -settings.update_setting_success=Paramètres d'organisation modifiés avec succès. -settings.change_orgname_prompt=Cette modification affectera comment des liens se rapportent à l'organisation. -settings.update_avatar_success=Les paramètres de l'avatar de l'organisation ont été mis à jour avec succès. settings.delete=Supprimer l'organisation settings.delete_account=Supprimer cette organisation settings.delete_prompt=Cela supprimera cette organisation définitivement. Cette opération est IRRÉVERSIBLE ! settings.confirm_delete_account=Confirmez la suppression settings.delete_org_title=Suppression d'organisation -settings.delete_org_desc=Cette organisation sera définitivement supprimée. Continuer ? -settings.hooks_desc=Ajoute des webhooks qui seront activés pour tous les dépôts de cette organisation. members.membership_visibility=Visibilité des membres: members.public=Public @@ -919,12 +882,10 @@ members.invite_now=Envoyer une invitation teams.join=Rejoindre teams.leave=Quitter -teams.read_access=Accès en Lecture +teams.read_access=Accès en lecture teams.read_access_helper=Cette équipe aura la possibilité de voir et cloner ses dépôts. -teams.write_access=Accès en Écriture -teams.write_access_helper=Cette équipe possèdera aussi bien des droits de lecture que d'écriture sur ses dépôts. -teams.admin_access=Accès Administrateur -teams.admin_access_helper=Cette équipe possèdera des droits de lecture, d'écriture, ainsi que le pouvoir d'ajouter des collaborateurs. +teams.write_access=Accès en écriture +teams.admin_access=Accès administrateur teams.no_desc=Aucune description teams.settings=Paramètres teams.owners_permission_desc=Les propriétaires possèdent les droits d'administrateur et disposent d'un accès complet à tous les dépôts de l'organisation. @@ -933,8 +894,7 @@ teams.update_settings=Valider teams.delete_team=Supprimer cette Équipe teams.add_team_member=Ajouter un Membre teams.delete_team_title=Suppression de l'équipe -teams.delete_team_desc=Cette équipe sera supprimée. Les membres pourraient perdre leurs accès à certains dépôts. -teams.delete_team_success=Équipe supprimée avec succès. +teams.delete_team_success=L’équipe a été supprimé. teams.read_permission_desc=Cette équipe permet l'accès en lecture : les membres peuvent voir et dupliquer ses dépôts. teams.write_permission_desc=Cette équipe permet l'accès en écriture : les membres peuvent participer à ses dépôts. teams.admin_permission_desc=Cette équipe permet l'accès en administrateur : les membres peuvent voir, participer et ajouter des collaborateurs à ses dépôts. @@ -964,23 +924,10 @@ dashboard.statistic_info=La base de données Gitea contient %d utilisateu dashboard.operation_name=Nom de l'Opération dashboard.operation_switch=Basculer dashboard.operation_run=Exécuter -dashboard.clean_unbind_oauth=Nettoyer les associations OAuthes -dashboard.clean_unbind_oauth_success=Tous unbind OAuthes ont été supprimés avec succès. dashboard.delete_inactivate_accounts=Supprimer tous les comptes inactifs -dashboard.delete_inactivate_accounts_success=Tous les comptes inactifs ont été supprimés avec succès. dashboard.delete_repo_archives=Supprimer toutes les archives des dépôts -dashboard.delete_repo_archives_success=Toutes les archives des dépôts ont été supprimées avec succès. -dashboard.delete_missing_repos=Supprimer tous les dépôts ayant perdu leurs fichiers Git -dashboard.delete_missing_repos_success=Tous les dépôts ayant perdu leurs fichiers Git ont été supprimés avec succès. -dashboard.git_gc_repos=Collecter les déchets des dépôts -dashboard.git_gc_repos_success=Tous les dépôts ont effectué la collecte avec succès. -dashboard.resync_all_sshkeys=Ré-écrire le fichier '.ssh/authorized_keys' (attention : les clés hors-Gitea vont être perdues) -dashboard.resync_all_sshkeys_success=Toutes les clés publiques ont été ré-écrites avec succès. -dashboard.resync_all_update_hooks=Ré-écrire tous les hooks de mises à jour des dépôts (requis quand le chemin de la configuration personnalisé est modifié) -dashboard.resync_all_update_hooks_success=Tous les hooks de mises à jour des dépôts ont été ré-écris avec succès. -dashboard.reinit_missing_repos=Réinitialiser tous les dépôts qui ont perdu des fichiers Git -dashboard.reinit_missing_repos_success=Tous les enregistrements de dépôts qui ont perdu des fichiers Git ont été réinitialisés avec succès. - +dashboard.resync_all_sshkeys=Réécrire le fichier '.ssh/authorized_keys' (pour les clés SSH Gitea) +dashboard.sync_external_users=Synchroniser les données de l’utilisateur externe dashboard.server_uptime=Uptime du serveur dashboard.current_goroutine=Goroutines actuelles dashboard.current_memory_usage=Utilisation Mémoire actuelle @@ -1011,52 +958,43 @@ dashboard.total_gc_pause=Pause GC dashboard.last_gc_pause=Dernière Pause GC dashboard.gc_times=Nombres de GC -users.user_manage_panel=Gestion des Utilisateurs users.new_account=Créer un nouveau compte users.name=Nom -users.activated=Activés +users.activated=Activé users.admin=Administrateur users.repos=Dépôts users.created=Créés users.last_login=Dernière connexion users.never_login=Jamais connecté users.send_register_notify=Envoyer une Notification d'enregistrement à l'utilisateur -users.new_success=Nouveau compte '%s' a été créé avec succès. +users.new_success=Le compte "%s" a été créé. users.edit=Éditer users.auth_source=Sources d'authentification users.local=Locales users.auth_login_name=Nom d'utilisateur d'authentification users.password_helper=Laissez-le vide pour ne pas changer. -users.update_profile_success=Profil mis à jour avec succès. +users.update_profile_success=Le profil a été mis à jour. users.edit_account=Modifier le Compte users.max_repo_creation=Nombre maximum de dépôts créés users.max_repo_creation_desc=(Mettre à -1 pour utiliser la limite globale par défaut) -users.is_activated=Ce compte est activé -users.prohibit_login=Ce compte est interdit de se connecter users.is_admin=Ce compte possède un niveau d'accès administrateur -users.allow_git_hook=Ce compte dispose des autorisations pour créer des crochets de Git -users.allow_import_local=Ce compte dispose des permissions nécessaire à l'import des dépôts locaux +users.allow_import_local=Ce compte a l'autorisation d'importer des dépôts locaux users.allow_create_organization=Ce compte a l'autorisation de créer des organisations users.update_profile=Mettre à jour le profil users.delete_account=Supprimer ce Compte -users.still_own_repo=Ce compte possède toujours des dépôts. Vous devez d'abord les supprimer ou les transférer. -users.still_has_org=Ce compte est toujours membre d'une ou plusieurs organisations. Vous devez d'abord les supprimer ou en retirer ce compte. -users.deletion_success=Le compte a été supprimé avec succès ! -orgs.org_manage_panel=Gestion des Organisations orgs.name=Nom orgs.teams=Équipes orgs.members=Membres -repos.repo_manage_panel=Gestion des Dépôts repos.owner=Propriétaire repos.name=Nom repos.private=Privé repos.watches=Suivi par repos.stars=Votes repos.issues=Tickets +repos.size=Taille -auths.auth_manage_panel=Panel d'administration des authentifications auths.new=Ajouter une nouvelle source d'authentification auths.name=Nom auths.type=Type @@ -1068,8 +1006,8 @@ auths.security_protocol=Protocole de sécurité auths.domain=Domaine auths.host=Hôte auths.port=Port +auths.bind_dn=Bind DN auths.bind_password=Bind mot de passe -auths.bind_password_helper=Avertissement : Ce mot de passe est stocké en clair. N'utilisez pas le mot de passe d'un compte doté de privilèges élevés. auths.user_base=Utilisateur Search Base auths.user_dn=Utilisateur DN auths.attribute_username=Attribut nom d'utilisateur @@ -1080,29 +1018,21 @@ auths.attribute_mail=Attribut de l'e-mail auths.attributes_in_bind=Aller chercher les attributs dans le contexte de liaison DN auths.filter=Filtre utilisateur auths.admin_filter=Filtre administrateur +auths.ms_ad_sa=Ms Ad SA auths.smtp_auth=Type d'authentification SMTP auths.smtphost=Hôte SMTP auths.smtpport=Port SMTP auths.allowed_domains=Domaines autorisés -auths.allowed_domains_helper=Laissez-le vide pour ne pas restreindre de domaines. Plusieurs domaines doivent être séparés par une virgule «, ». auths.enable_tls=Activer le Chiffrement TLS auths.skip_tls_verify=Ne pas vérifier TLS auths.pam_service_name=Nom du Service PAM auths.enable_auto_register=Connexion Automatique auths.tips=Conseils -auths.edit=Modifier les paramètres d'authentification auths.activated=Authentification activée -auths.new_success=Nouvelle authentification «%s » a été ajoutée avec succès. -auths.update_success=Les paramètre d'authentification a été mis à jour avec succès. -auths.update=Mettre à jour les paramètres d'authentifications -auths.delete=Supprimer cette authentification -auths.delete_auth_title=Suppression de l'authentification -auths.delete_auth_desc=Cette authentification va être supprimée. voulez-vous continuer ? -auths.still_in_used=Cette authentification est encore utilisée par d'autres utilisateurs, supprimez-les ou convertir ces utilisateurs vers un autre type de session, avant. auths.deletion_success=L'authentification a été supprimée avec succès ! auths.login_source_exist=La source d'authentification '%s' existe déjà. -config.server_config=Configuration du Serveur +config.server_config=Configuration du serveur config.app_name=Nom de l'application config.app_ver=Version de l'application config.app_url=URL de l'application @@ -1121,7 +1051,6 @@ config.reverse_auth_user=Annuler l'Authentification de l'Utilisateur config.ssh_config=Configuration SSH config.ssh_enabled=Activé -config.ssh_start_builtin_server=Démarrer le serveur intégré config.ssh_domain=Domaine config.ssh_port=Port config.ssh_listen_port=Port d'écoute @@ -1131,7 +1060,7 @@ config.ssh_keygen_path=Chemin vers le générateur de clefs ("ssh-keygen") config.ssh_minimum_key_size_check=Vérification de la longueur de clé minimale config.ssh_minimum_key_sizes=Tailles de clé minimales -config.db_config=Configuration de la Base de Données +config.db_config=Configuration de la base de données config.db_type=Type config.db_host=Hôte config.db_name=Nom @@ -1141,7 +1070,7 @@ config.db_ssl_mode_helper=("postgres" uniquement) config.db_path=Emplacement config.db_path_helper=(pour « sqlite3 » et « TIDB ») -config.service_config=Configuration du Service +config.service_config=Configuration du service config.register_email_confirm=Nécessite une confirmation par e-mail config.disable_register=Désactiver les inscriptions config.show_registration_button=Afficher le bouton d'enregistrement @@ -1150,14 +1079,12 @@ config.mail_notify=Notifier par mail config.disable_key_size_check=Désactiver la vérification de la taille de clé minimale config.enable_captcha=Activez le Captcha config.active_code_lives=Limites de Code Actif -config.reset_password_code_lives=Réinitialiser le Mot De Passe des Limites de Code -config.default_keep_email_private=Valeur par défaut pour "Masquer mon adresse email" +config.default_keep_email_private=Valeur par défaut pour "Masquer mon adresse email config.no_reply_address=Adresse de non-réponse config.webhook_config=Configuration Webhook config.queue_length=Longueur de la file d'attente config.deliver_timeout=Expiration d'Envoi -config.skip_tls_verify=Ne pas vérifier TLS config.mailer_config=Configuration du service de mail config.mailer_enabled=Activé @@ -1166,13 +1093,12 @@ config.mailer_name=Nom config.mailer_host=Hôte config.mailer_user=Utilisateur config.send_test_mail=Envoyer courriel de Test -config.test_mail_failed=Impossible d'envoyer un e-mail de test à '%s': %v config.test_mail_sent=Un e-mail de test à été envoyé à '%s'. config.oauth_config=Configuration OAuth config.oauth_enabled=Activé -config.cache_config=Configuration du Cache +config.cache_config=Configuration du cache config.cache_adapter=Adaptateur du Cache config.cache_interval=Intervales du Cache config.cache_conn=Liaison du Cache @@ -1200,11 +1126,11 @@ config.git_max_diff_files=Nombre max de fichiers de Diff (à afficher) config.git_gc_args=Arguments de GC config.git_migrate_timeout=Délai imparti pour une migration config.git_mirror_timeout=Délai imparti pour mettre à jour le miroir -config.git_clone_timeout=Délai imparti pour l'opération "Clone" -config.git_pull_timeout=Délai imparti pour l'opération "Pull" -config.git_gc_timeout=Délai imparti pour l'opération "GC" +config.git_clone_timeout=Délai imparti pour l'opération "Clone +config.git_pull_timeout=Délai imparti pour l'opération "Pull +config.git_gc_timeout=Délai imparti pour l'opération "GC -config.log_config=Configuration du Journal +config.log_config=Configuration du journal config.log_mode=Mode du journal monitor.cron=Tâches Cron @@ -1212,14 +1138,13 @@ monitor.name=Nom monitor.schedule=Planification monitor.next=Suivant monitor.previous=Précédent -monitor.execute_times=Nombre d'Éxécutions -monitor.process=Processus en cours d'éxécution +monitor.execute_times=Nombre d'exécutions +monitor.process=Processus en cours d'exécution monitor.desc=Description -monitor.start=Heure de Démarrage +monitor.start=Heure de démarrage monitor.execute_time=Heure d'Éxécution notices.system_notice_list=Notes Systèmes -notices.view_detail_header=Voir les détails de la notification notices.actions=Actions notices.select_all=Tout Sélectionner notices.deselect_all=Tous déselectionner @@ -1230,7 +1155,6 @@ notices.type=Type notices.type_1=Dépôt notices.desc=Description notices.op=Opération -notices.delete_success=Notifications système supprimées avec succès. [action] create_repo=a créé le dépôt %s @@ -1246,41 +1170,40 @@ comment_issue=`a commenté le problème %s#%[2]s` merge_pull_request=`demande d'ajout fusionnée le %s#%[2]s` transfer_repo=a transféré le dépôt %s à %s push_tag=a soumis le tag %[2]s sur %[3]s -compare_commits=Comparer ces %d révisions [tool] -ago=il y a -from_now=dans +ago=il y a %s +from_now=dans %s now=maintenant -1s=%s 1 seconde -1m=%s 1 minute -1h=%s 1 heure -1d=%s 1 jour -1w=%s 1 semaine -1mon=%s 1 mois -1y=%s 1 an -seconds=%[2]s %[1]d secondes -minutes=%[2]s %[1]d minutes -hours=%[2]s %[1]d heures -days=%[2]s %[1]d jours -weeks=%[2]s %[1]d semaines -months=%[2]s %[1]d mois -years=%[2]s %[1]d ans +1s=1 seconde +1m=1 minute +1h=1 heure +1d=1 jour +1w=1 semaine +1mon=1 mois +1y=1 an +seconds=%d secondes +minutes=%d minutes +hours=%d heures +days=%d jours +weeks=%d semaines +months=%d mois +years=%d ans raw_seconds=secondes raw_minutes=minutes [dropzone] -default_message=Déposez les fichiers ici ou cliquez pour télécharger. invalid_input_type=Vous ne pouvez pas télécharger des fichiers de ce type. -file_too_big=Le fichier de taille ({{filesize}} Mo) dépasse la taille maximale ({{maxFilesize}} MB). remove_file=Supprimer le fichier [notification] notifications=Notifications -unread=Non lus -read=Lu(s) -no_unread=Vous n'avez aucune notification non lue. -no_read=Vous n'avez aucune notification. -pin=Épingler +unread=Non lue(s) +read=Lue(s) mark_as_read=Marquer comme lu +mark_as_unread=Marquer comme non lue + +[gpg] + +[units] diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini new file mode 100644 index 0000000..cffe9ca --- /dev/null +++ b/options/locale/locale_hu-HU.ini @@ -0,0 +1,1446 @@ +app_desc=Fájdalommentes, saját gépre telepíthető Git szolgáltatás + +home=Főoldal +dashboard=Műszerfal +explore=Felfedezés +help=Súgó +sign_in=Bejelentkezés +sign_in_with=Bejelentkezés a következővel +sign_out=Kijelentkezés +sign_up=Regisztráció +link_account=Fiók Összekötés +link_account_signin_or_signup=Bejelentkezés meglévő felhasználóval, hogy a meglévő fiókodhoz kösd, vagy új fiók létrehozása +register=Regisztráció +website=Webhely +version=Verzió +page=Oldal +template=Sablon +language=Nyelv +notifications=Értesítések +create_new=Létrehozás... +user_profile_and_more=Felhasználói profil és egyebek +signed_in_as=Bejelentkezve mint + +username=Felhasználónév +email=E-mail +password=Jelszó +re_type=Újra +captcha=Captcha +twofa=Kétlépcsős hitelesítés +twofa_scratch=Kétlépcsős bejelentkezés kaparós kódja +passcode=Jelkód + +repository=Tároló +organization=Szervezet +mirror=Tükör +new_repo=Új tároló +new_migrate=Új migráció +new_mirror=Új tükör +new_fork=Új másolat +new_org=Új szervezet +manage_org=Szervezetek kezelése +admin_panel=Rendszergazdai felület +account_settings=Fiók beállítások +settings=Beállítások +your_profile=Saját Profil +your_starred=Csillagozottjaid +your_settings=Beállításaid + +all=Összes +sources=Források +mirrors=Tükrök +collaborative=Együttműködés +forks=Másolatok + +activities=Tevékenységek +pull_requests=Egyesítési Kérések +issues=Hibajegyek + +cancel=Mégsem + +[install] +install=Telepítés +title=Kezdeti konfiguráció +docker_helper=Hogyha a Gitea-t Docker-en belül futtatod, akkor kérlek olvasd el az irányelveket mielőtt bármit megváltoztatnál ezen az oldalon. +requite_db_desc=Giteához szükséges MySQL, PostgreSQL, SQLite3 vagy TiDB. +db_title=Adatbázis beállításai +db_type=Adatbázis típusa +host=Kiszolgáló +user=Felhasználó +password=Jelszó +db_name=Adatbázis neve +db_helper=A MySQL-hez az INNODB motort használd utf8_general_ci karakter kódolással. +ssl_mode=SSL mód +path=Elérési út +sqlite_helper=Az elérési útvonal az SQLite3 vagy TiDB adatbázishoz.
Kérjük használjon abszolút útvonalat ha szolgáltatásként akarja futtatni. +err_empty_db_path=SQLite3 vagy TiDB adatbázis elérési útja nem lehet üres. +err_invalid_tidb_name=TiDB adatbázis neve nem tartalmazhat "." és "-" karaktereket. +no_admin_and_disable_registration=Nem tilthatod le a regisztrációt anélkül, hogy nem hozol létre egy rendszergazdai fiókot. +err_empty_admin_password=Rendszergazda jelszó nem lehet üres. + +general_title=Általános Alkalmazás Beállítások +app_name=Alkalmazás neve +app_name_helper=Ide írhatod a szervezeted nevét. +repo_path=Tárolók gyökérkönyvtára +repo_path_helper=Minden távoli Git tároló ebbe a mappába lesz mentve. +lfs_path=LFS Gyökérkönyvtár +lfs_path_helper=A fájlok amiket Git LFS-el elmentesz ebbe a könyvtárba kerülnek. Hagyd üresen az LFS kikapcsolásához. +run_user=Futtató felhasználó +run_user_helper=Ezen felhasználónak jogosultnak kell lennie a tároló gyökérkönyvtárának elérésére és a Gitea futtatására. +domain=Tartomány +domain_helper=Ez befolyásolja az SSH klónozási URL-jeit. +ssh_port=SSH port +ssh_port_helper=SSH port amit a szervered használni fog, vagy hagyd üresen a kikapcsoláshoz. +http_port=HTTP port +http_port_helper=Ezen a porton érhető el az alkalmazás webfelülete. +app_url=Alkalmazás URL-je +app_url_helper=Ez hatással van a HTTP/HTTPS-klón URL és néhány E-Mail értesítésre. +log_root_path=Naplófájl elérési útja +log_root_path_helper=Naplófájlok könyvtára. + +optional_title=További beállítások +email_title=E-mail szolgáltatás beállításai +smtp_host=SMTP kiszolgáló +smtp_from=Feladó +smtp_from_helper=E-Mail feladójának a címe az RFC 5322 formátumban. Lehet megadni csak egy e-mail címet, vagy "Név" formátumban. +mailer_user=Feladó Felhasználója +mailer_password=Feladó Jelszava +register_confirm=Regisztráció megerősítésének engedélyezése +mail_notify=E-Mail értesítés engedélyezése +server_service_title=Szerver és egyéb szolgáltatások beállítása +offline_mode=Offline Mód Bekapcsolása +offline_mode_popup=CDN kikapcsolása, hogy minden kért fájl helyileg legyen kiszolgálva. +disable_gravatar=Gravatar szolgáltatás kikapcsolása +disable_gravatar_popup=Gravatar és egyéb külső források kikapcsolása. Profil képet a felhasználónak kell feltöltenie, vagy az alapértelmezett lesz használva. +federated_avatar_lookup=Összevont profilkép lekérés engedélyezése +federated_avatar_lookup_popup=Összevont profilkép lekérés engedélyezése a libravatar használatával. +disable_registration=Ön-regisztráció kikapcsolása +disable_registration_popup=Ön-regisztráció kikapcsolása, csak a rendszergazda hozhat létre fiókot. +enable_captcha=Captcha Engedélyezése +enable_captcha_popup=CAPTCHA megkövetelése amikor egy felhasználó ön-regisztrál. +require_sign_in_view=Bejelentkezés megkövetelése az oldalak megtekintéséhez +require_sign_in_view_popup=Csak bejelentkezett felhasználók nézhetik meg az oldalakat; a látogatók csak a bejelentkező és regisztrációs oldalt láthatják. +admin_setting_desc=Nem kell most rendszergazda fiókot létrehozni. Az első felhasználó aki az oldalon regisztrál automatikusan rendszergazdai jogot kap. +admin_title=Rendszergazda fiók beállításai +admin_name=Felhasználónév +admin_password=Jelszó +confirm_password=Jelszó megerősítése +admin_email=Rendszergazdai e-mail +install_btn_confirm=Gitea telepítése +test_git_failed=Nem sikerült a 'git' parancs kipróbálása: %v +sqlite3_not_available=Az aktuális verziód nem támogatja az SQLite3-at, kérlek töltsd le a hivatalos binárist a(z) %s oldalról, NEM a gobuild verziót. +invalid_db_setting=Adatbázis beállítás érvénytelen: %v +invalid_repo_path=Repository gyökérkönyvtára helytelen: %v +run_user_not_match=A futtató felhasználó nem az aktuális felhasználó: %s -> %s +save_config_failed=Hiba történt a konfiguráció mentése közben: %v +invalid_admin_setting=Rendszergazda fiók beállítása helytelen: %v +install_success=Üdvözlünk! Köszönjük, hogy a Gitea-t választottad és jó szórakozást kívánunk a használatához! +invalid_log_root_path=Napó gyökérkönyvtára helytelen: %v +default_keep_email_private=Email cím ne látszódjon" alapértelmezett értéke +default_keep_email_private_popup=Ez az alapértelmezett értéke a felhasználó e-mail cím láthatóságának. Ha értéke igaz, akkor minden új felhasználó e-mail címe rejtve marad, amíg a felhasználó nem módosítja a beállítását. +default_allow_create_organization=Felhasználó létrehozhat Szervezeteket" jogosultság alapértelmezett értéke +default_allow_create_organization_popup=Ez az alapértelmezetten értéke ennek a jognak, ami az új felhasználókhoz lesz rendelve. Ha igaz, akkor az új felhasználók létre tudnak hozni Szervezeteket. +no_reply_address=No-reply Cím +no_reply_address_helper=Tartománynév a rejtett email című felhasználók commitjaihoz ami a git logban fog megjelenni. Pl.: 'joe' és a 'noreply.example.org'-ból 'joe@noreply.example.org' lesz. + +[home] +uname_holder=Felhasználónév vagy E-mail +password_holder=Jelszó +switch_dashboard_context=Műszerfal nézőpont váltás +my_repos=Tárolóim +show_more_repos=Mutass több tárolót... +collaborative_repos=Együttműködési tárolók +my_orgs=Szervezeteim +my_mirrors=Tükreim +view_home=Nézet %s +search_repos=Tároló keresése... + +issues.in_your_repos=A tárolóidban + +[explore] +repos=Tárolók +users=Felhasználók +organizations=Szervezetek +search=Keresés +repo_no_results=Nem található a keresésnek megfelelő tároló. +user_no_results=Nem található a keresésnek megfelelő felhasználó. +org_no_results=Nem található a keresésnek megfelelő szervezet. + +[auth] +create_new_account=Felhasználó létrehozása +register_helper_msg=Van már felhasználói fiókja? Jelentkezzen be! +social_register_helper_msg=Van már felhasználói fiókja? Csatlakoztassa most! +disable_register_prompt=Elnézést, a regisztráció ki van kapcsolva. Vegye fel a kapcsolatot a rendszergazdával. +disable_register_mail=Elnézést, a regisztrációt megerősítő levél szolgáltatás ki van kapcsolva. +remember_me=Emlékezz rám +forgot_password_title=Elfelejtett jelszó +forgot_password=Elfelejtette a jelszavát? +sign_up_now=Felhasználói fiókra van szüksége? Regisztráljon most. +confirmation_mail_sent_prompt=Új megerősítő email lett küldve ide: %s. Ellenőrizze postafiókját az elkövetkező %s a regisztrációs folyamat befejezéséhez. +reset_password_mail_sent_prompt=Megerősítő email lett küldve ide: %s. Ellenőrizze postafiókját az elkövetkező %s a jelszó visszaállítási folyamat befejezéséhez. +active_your_account=Aktiválja a fiókját +prohibit_login=Bejelentkezés letiltva +prohibit_login_desc=A fiókjával nem engedélyezett a bejelentkezés, vegye fel a kapcsolatot a rendszergazdával. +resent_limit_prompt=Elnézést, de nemrég már kért aktivációs emailt. Kérem várjon 3 percet és utána próbálja újra. +has_unconfirmed_mail=Tisztelt %s, az email címe (%s) nincsen megerősítve. Amennyiben nem kapta még meg a megerősítő email-t, vagy egy újra van szüksége, az alábbi gombra kattintson. +resend_mail=Kattintson ide az aktivációs email újraküldéséhez +email_not_associate=Az email cím nincsen hozzárendelve egyetlen fiókhoz sem. +send_reset_mail=Kattints ide hogy újraküldd a jelszó visszaállító emailt +reset_password=Jelszó visszaállítása +invalid_code=Elnézést, de a megerősítő kód lejárt vagy érvénytelen. +reset_password_helper=Kattintson ide, hogy visszaállítsa a jelszavát +password_too_short=A jelszó nem lehet rövidebb, mint %d karakter. +non_local_account=Nem helyben regisztrált felhasználók nem cserélhetnek jelszót a webes felületen keresztül. +verify=Ellenőrzés +scratch_code=Kaparós kód +use_scratch_code=Kaparós kód használata +twofa_scratch_used=Ön már használta a kaparós kódját. Visszairányítottuk a kétlépcsős bejelentkezési beállítások oldalra, hogy eltávolíthassa eszközét vagy generálhasson új kaparós kódot. +twofa_passcode_incorrect=A kód hibás. Ha nem találja az eszközét, akkor használja a kaparós kódját a bejelentkezéshez. +twofa_scratch_token_incorrect=A kaparós kód nem megfelelő. +login_userpass=Felhasználó / jelszó +login_openid=OpenID +openid_connect_submit=OpenID kapcsolódás +openid_connect_title=Kapcsolás meglévő fiókhoz +openid_connect_desc=A megadott OpenID URI ismeretlen a rendszer számára, hozzáadhatja egy meglévő fiókhoz. +openid_register_title=Új fiók létrehozása +openid_register_desc=A megadott OpenID URI ismeretlen a rendszer számára, hozzáadhatja egy új fiókhoz. +openid_signin_desc=Példa URI: https://anne.me, bob.openid.org.cn, gnusocial.net/carry +disable_forgot_password_mail=Elnézést, a jelszó visszaállítás le van tiltva. Vegye fel a kapcsolatot a rendszergazdával. + +[mail] +activate_account=Kérjük aktiválja a fiókját +activate_email=E-mail cím megerősítése +reset_password=Jelszó visszaállítása +register_success=Sikeres regisztráció +register_notify=A Gitea üdvözli + +[modal] +yes=Igen +no=Nem +modify=Módosítás + +[form] +UserName=Felhasználónév +RepoName=Tároló neve +Email=E-mail cím +Password=Jelszó +Retype=Jelszó megerősítése +SSHTitle=SSH kulcs neve +HttpsUrl=HTTPS URL +PayloadUrl=Tartalom URL-címe +TeamName=Csoport neve +AuthName=Engedélyezési név +AdminEmail=Rendszergazdai e-mail + +NewBranchName=Új ág neve +CommitSummary=Commit áttekintő +CommitMessage=Commit üzenet +CommitChoice=Commit választás +TreeName=Elérési útvonal +Content=Tartalom + +require_error=` nem lehet üres` +alpha_dash_error=` betű, szám vagy kötőjel (-_) karakterek lehetnek.` +alpha_dash_dot_error=` betű, szám vagy kötőjel (-_) vagy pont karakterek lehetnek.` +git_ref_name_error=` egy jól formált git referenciának kell lennie.` +size_error=` %s méretűnek kell lennie.` +min_size_error=` legalább %s karaktert kell tartalmaznia.` +max_size_error=` legfeljebb %s karaktert tartalmazhat.` +email_error=` nem valódi e-mail cím.` +url_error=` nem érvényes URL.` +include_error=` tartalmaznia kell a '%s' karakterláncot.` +unknown_error=Ismeretlen hiba: +captcha_incorrect=A CAPCHA megfejtése hibás. +password_not_match=Az általad beírt jelszavak nem egyeznek meg. + +username_been_taken=Felhasználónév már foglalt. +repo_name_been_taken=A tároló neve már foglalt. +org_name_been_taken=A szervezet neve már foglalt. +team_name_been_taken=A csoportnév már foglalt. +team_no_units_error=A csoportnak legalább egy egységet engedélyezni kell. +email_been_used=Az E-mail már használatban van. +openid_been_used=Az OpenID cím "%s" már használatban van. +username_password_incorrect=Helytelen felhasználónév vagy jelszó. +enterred_invalid_repo_name=Ellenőrizze, hogy a tároló neve helyes. +enterred_invalid_owner_name=Kérlek ellenőrizd, hogy a beírt tulajdonos neve helyes. +enterred_invalid_password=Kérlek ellenőrizd, hogy a beírt jelszó helyes. +user_not_exist=A fiók nem létezik. +last_org_owner=Az utolsó felhasználót nem lehet eltávolítani a tulajdonosi csapatból, mert legalább egy tulajdonosnak lennie kell minden szervezetben. +cannot_add_org_to_team=Szervezet nem adható hozzá egy csoport tagjaként. +cannot_invite_org_to_org=Szervezet nem hívható meg egy csoport tagjának. + +invalid_ssh_key=Sajnáljuk, de nem tudtuk ellenőrizni az SSH kulcsod: %s +invalid_gpg_key=Sajnáljuk, de nem tudtuk ellenőrizni a GPG kulcsod: %s +unable_verify_ssh_key=Az ssh kulcsot nem tudtuk ellenőrizni, kérjük nézze át még egyszer hibák után. +auth_failed=A hitelesítés sikertelen: %v + +still_own_repo=A felhasználód még legalább egy tároló tulajdonosa, először törölnöd kell őket vagy átruháznod másokra. +still_has_org=A felhasználód még mindig legalább egy szervezet tagja, előbb ki kell lépned belőlük. +org_still_own_repo=Ennek a szervezetnek még mindig vannak tárolói, előbb le kell törölnöd vagy másra átruháznod őket. + +target_branch_not_exist=Cél ág nem létezik. + +[user] +change_avatar=Profilkép megváltoztatása +join_on=Csatlakozott +repositories=Tárolók +activity=Nyilvános tevékenységek +followers=Követők +starred=Csillagozott tárolók +following=Követve +follow=Követés +unfollow=Követés törlése + +form.name_reserved=A(z) '%s' felhasználónév a rendszernek van fenntartva, kérlek válassz másikat. +form.name_pattern_not_allowed=A(z) '%s' felhasználónév minta nem megengedett. + +[settings] +profile=Profil +password=Jelszó +avatar=Profilkép +ssh_gpg_keys=SSH / GPG kulcsok +social=Közösségi fiókok +applications=Alkalmazások +orgs=Szervezetek +delete=Fiók törlése +twofa=Kétlépcsős hitelesítés +account_link=Külső fiókok +organization=Szervezet +uid=UID + +public_profile=Nyilvános profil +profile_desc=Az e-mail címed nyilvános, és ez lesz használva minden a felhasználódat érintő változtatás, és az oldalon történt művelettel kapcsolatos értesítés küldésére. +password_username_disabled=A nem helyi felhasználóknak nem engedélyezett, hogy megváltoztassák a felhasználói nevüket. Kérjük lépjen kapcsolatba a helyi rendszergazdájával több információért. +full_name=Teljes név +website=Webhely +location=Hely +update_profile=Profil frissítése +update_profile_success=A profilod frissítve lett. +change_username=Felhasználónév megváltoztatva +change_username_prompt=Ez a változtatás meg fogja változtatni a hivatkozásokat a felhasználójára. +continue=Folytatás +cancel=Mégsem + +lookup_avatar_by_mail=Profilkép keresése e-mail alapján +federated_avatar_lookup=Összevont profilkép keresés +enable_custom_avatar=Egyéni profilkép használata +choose_new_avatar=Új profilkép kiválasztása +update_avatar=Profilkép beállítások frissítése +delete_current_avatar=Jelenlegi profilkép törlése +uploaded_avatar_not_a_image=A feltöltött fájl nem kép. +update_avatar_success=A profilkép beállítás frissítve lett. + +change_password=Jelszó megváltoztatása +old_password=Jelenlegi jelszó +new_password=Új jelszó +retype_new_password=Új jelszó megerősítése +password_incorrect=A megadott jelenlegi jelszó helytelen. +change_password_success=A jelszavad sikeresen meg lett változtatva. Most már bejelentkezhetsz az új jelszavaddal. +password_change_disabled=A nem helyi felhasználók nem jogosultak megváltoztatni a jelszavukat a webes felületen keresztül. + +emails=E-mail címek +manage_emails=E-mail címek kezelése +manage_openid=OpenID címek kezelése +email_desc=Elsődleges e-mail címedet használjuk értesítésekre és más műveletekre. +primary=Elsődleges +primary_email=Beállítás elsődlegesként +delete_email=Törlés +email_deletion=Email törlése +email_deletion_desc=Ennek az e-mail címnek a törlése el fog távolítani minden ezzel kapcsolatos információ a felhasználói fiókjából. Ez nem befolyásolja azokat a git commit-okat, amik ezt az e-mail címet használják. Folytatni akarod? +email_deletion_success=Az e-mail címet sikeresen töröltük! +openid_deletion=OpenID Törlése +openid_deletion_desc=Ha törli ezt az OpenID-t a fiókjából, akkor utána nem lesz képes bejelentkezni vele. Biztos, hogy folytatni akarja? +openid_deletion_success=Az OpenID sikeresen törölve lett! +add_new_email=Új e-mail cím hozzáadása +add_new_openid=Új OpenID URI hozzáadása +add_email=E-mail cím hozzáadása +add_openid=OpenID URI hozzáadása +add_email_confirmation_sent=Egy új megerősítő e-mail el lett küldve a(z) '%s' címre. Kérlek nézd meg a fiókod a következő %s, hogy megerősítsd az e-mail címedet. +add_email_success=Az új e-mail cím hozzáadása sikeres volt. +add_openid_success=Az új OpenID hozzáadása sikeres volt. +keep_email_private=Email cím ne látszódjon +keep_email_private_popup=Ha ez be van pipálva, akkor más felhasználók nem láthatják az e-mail címedet. +openid_desc=A megadott OpenID címeid lehetőséget adnak arra, hogy a hitelesítést a te általad választott szolgáltatókra bízhasd + +manage_ssh_keys=SSH kulcsok kezelése +manage_gpg_keys=GPG kulcsok kezelése +add_key=Kulcs hozzáadása +ssh_desc=Ezek az SSH kulcsok vannak a felhasználói fiókodhoz kötve. Mivel ezek a kulcsok lehetőséget adnak bárkinek, hogy hozzáférést kapjanak a tárolóidhoz, ezért nagyon fontos, hogy meggyőződj arról, hogy felismered őket. +gpg_desc=Ezek a GPG kulcsok vannak a felhasználódhoz kötve. Mivel ezek a kulcsok lehetővé teszik a commit-ok hitelesítését, ezért nagyon fontos, hogy a hozzájuk tartozó privát kulcsot biztonságban tartsad. +ssh_helper=Segítség kell? Nézd meg a következő cikket a GitHub oldalán: saját SSH kulcs létrehozása. Vagy oldj meg gyakran előforduló problémákat az SSH használatakor. +gpg_helper=Segítség kell? Nézd meg a GitHub GPG-s cikkjét. +add_new_key=SSH kulcs hozzáadása +add_new_gpg_key=GPG kulcs hozzáadása +ssh_key_been_used=Ezt a nyilvános kulcsot már felhasználták. +ssh_key_name_used=Ilyen néven már létezik nyilvános kulcs. +gpg_key_id_used=Ilyen azonosítóval már létezik nyilvános GPG kulcs. +gpg_key_email_not_found=Az e-mail amihez a GPG kulcs csatolva van nem található meg vagy még nincs megerősítve: %s +subkeys=Alkulcsok +key_id=Kulcs ID +key_name=Kulcs neve +key_content=Tartalom +add_key_success=Az SSH kulcsod sikeresen hozzáadva: '%s' +add_gpg_key_success=A GPG kulcsod sikeresen hozzáadva: '%s' +delete_key=Törlés +ssh_key_deletion=SSH kulcs törlése +gpg_key_deletion=GPG kulcs törlése +ssh_key_deletion_desc=Ennek az SSH kulcsnak a törlése minden hozzáférést letilt a felhasználódhoz ami azt használja. Biztos, hogy folytatni szeretnéd? +gpg_key_deletion_desc=Ennek a GPG kulcsnak a törlése megszünteti a hitelesítését az összes commit-nak ami azt használja. Biztos hogy folytatni szeretné? +ssh_key_deletion_success=Az SSH kulcs törölve lett. +gpg_key_deletion_success=A GPG kulcs törölve lett. +add_on=Hozzáadva +valid_until=Érvényesség vége: +valid_forever=Érvényes örökre +last_used=Utolsó használat: +no_activity=Mostanság nem aktívan használt +key_state_desc=Ezt a kulcsot már használta az elmúlt 7 napban +token_state_desc=Ez a token volt használva az elmúlt 7 napban +show_openid=Megjelenítés a profilon +hide_openid=Elrejtés a profilról + +manage_social=Kapcsolódó fiókok kezelése +social_desc=Ez a kapcsolódó fiókok listáját. Biztonsági okokból győződj meg róla, hogy mindegyiket felismered, mert ezeket használva be lehet jelentkezni a fiókodba. +unbind=Leoldás +unbind_success=A fiók le lett oldva a fiókodról. + +manage_access_token=Személyes hozzáférési tokenek kezelése +generate_new_token=Új token generálása +tokens_desc=Általad generált tokenek, amikkel hozzá lehet férni a Gitea API-khoz. +new_token_desc=Minden token teljes hozzáférést ad a fiókodhoz. +token_name=Token neve +generate_token=Token generálása +generate_token_success=A hozzáférési jegy sikeresen legenerálva! Másolja le most, később már nem lesz visszanézhető! +delete_token=Törlés +access_token_deletion=Személyes hozzáférési token törlése +access_token_deletion_desc=Ezen személyes hozzáférési token törlése megvonja a hozzáférést minden kapcsolódó alkalmazáshoz. Biztosan folytatja? +delete_token_success=A személyes hozzáférési token törlésre került. Ne feledje frissíteni a hozzá tartozott alkalmazások beállítását. + +twofa_desc=A Gitea támogatja a kétlépcsős bejelentkezést, hogy elősegítse a fiókja biztonságát. +twofa_is_enrolled=A fiókja jelenleg használ kétlépcsős hitelesítést. +twofa_not_enrolled=A fiókja jelenleg nem használ kétlépcsős hitelesítést. +twofa_disable=Kétlépcsős hitelesítés letiltása +twofa_scratch_token_regenerate=Kaparós kód újragenerálása +twofa_scratch_token_regenerated=Kaparós kódja újragenerálva. Jelenleg %s. Őrizze biztonságos helyen. +twofa_enroll=Kétlépcsős hitelesítés használata +twofa_disable_note=Ha szükséges, a kétlépcsős hitelesítés kikapcsolható. +twofa_disable_desc=A kétlépcsős hitelesítés kikapcsolásának hatására fiókja kevésbé lesz biztonságos. Biztosan folytatni szeretné? +regenerate_scratch_token_desc=Ha elfelejtette a kaparós kódját, vagy már elhasználta, itt visszaállíthatja. +twofa_disabled=Kétlépcsős hitelesítés letiltva. +scan_this_image=Olvassa be ezt a hitelesítő alkalmazásával: +or_enter_secret=Vagy adja meg a titkot: %s +then_enter_passcode=És adja meg a kódot a hitelesítő alkalmazásból: +passcode_invalid=A PIN-kód érvénytelen. Próbálja újra. +twofa_enrolled=A fiókjához engedélyezve lett a kétlépcsős hitelesítés. Győződjön meg róla, hogy a kaparós kódot (%s) biztonságban tudja, mert csak egyszer jelenik meg! + +manage_account_links=Fiók-kapcsolatok kezelése +manage_account_links_desc=Külső fiókok kapcsolva ehhez a fiókhoz +account_links_not_available=Jelenleg nincs külső fiók kapcsolva ehhez a fiókhoz +remove_account_link=Csatolt fiók eltávolítása +remove_account_link_desc=Ezen külső fiók eltávolítása megvonja a hozzá tartozó hozzáféréseket. Biztosan folytatja? +remove_account_link_success=Hozzárendelt külső fiók sikeresen törölve! + +orgs_none=Nem tagja egy szervezetnek sem. + +delete_account=Fiókod törlése +delete_prompt=Ez a művelet véglegesen törli a fiókot, ezt NEM lehet visszavonni! +confirm_delete_account=Törlés megerősítése +delete_account_title=Fióktörlés +delete_account_desc=Biztosan véglegesen törölni szeretné ezt a fiókot? + +[repo] +owner=Tulajdonos +repo_name=Tároló neve +repo_name_helper=A jó tárolónév általában rövid, megjegyezhető és egyedi kulcsszavakból tevődik össze. +visibility=Láthatóság +visiblity_helper=Ez a tároló privát +visiblity_helper_forced=Az adminisztrátor kötelezővé tette, hogy minden új tároló privát legyen +visiblity_fork_helper=(Az érték megváltoztatása kihat minden másolatra) +clone_helper=Segítségre van szüksége a klónozáshoz? Látogassa meg a súgót! +fork_repo=Tároló lemásolása +fork_from=Másolás innen +fork_visiblity_helper=Nem módosítható egy tároló másolatának láthatósága. +repo_desc=Leírás +repo_lang=Nyelv +repo_gitignore_helper=Válasszon .gitignore sablont +license=Licenc +license_helper=Licencfájl kiválasztása +readme=Olvassel +readme_helper=Válassz egy Olvassel sablont +auto_init=Tároló inicializálása a kiválasztott fájlokkal és sablonokkal +create_repo=Tároló létrehozása +default_branch=Alapértelmezett ág +mirror_prune=Tükörkapcsolat eltávolítása +mirror_prune_desc=Minden olyan távoli követési referencia törlése, mely már nem érhető el a távoli oldalon +mirror_interval=Tükrözés gyakorisága (időegységek: óra "h", perc "m", másodperc "s") +mirror_interval_invalid=A tükrözés gyakorisága hibás +mirror_address=Tükör cím +mirror_address_desc=Kérlek, add meg a szükséges belépési adatokat a címben. +mirror_last_synced=Utoljára szinkronizálva +watchers=Figyelők +stargazers=Csillagozók +forks=Másolások + +form.reach_limit_of_creation=Elérte a tárolók maximális számát (%d). +form.name_reserved=A tárolónév ('%s') a rendszernek van fenntartva. +form.name_pattern_not_allowed=Ez a tároló név ('%s') nem megengedett. + +need_auth=Engedély szükséges +migrate_type=Migráció típusa +migrate_type_helper=Ez a tároló tükörként fog működni +migrate_repo=Tároló migrációja +migrate.clone_address=Migráció innen: +migrate.clone_address_desc=Ez lehet egy HTTP/HTTPS/GIT URL +migrate.clone_local_path=vagy a helyi szerver elérési útja +migrate.permission_denied=Nem engedélyezett számodra a helyi tárolók importálása. +migrate.invalid_local_path=Érvénytelen helyi elérési út; nem létezik vagy nem mappára mutat. +migrate.failed=A migráció sikertelen: %v +migrate.lfs_mirror_unsupported=LFS objektumok tükrözése nem támogatott - használja a 'git lfs fetch --all' és a 'git lfs push --all" parancsokat helyette. + +mirror_from=tükörképe a: +forked_from=másolva innen: +fork_from_self=Nem fork-olhat önmaga által birtokolt tárolót! +copy_link=Másolás +copy_link_success=Másolva! +copy_link_error=Nyomja meg a ⌘-C vagy Ctrl-C gombokat a másoláshoz +copied=Másolás rendben +unwatch=Figyelés törlése +watch=Figyelés +unstar=Csillag törlése +star=Csillagozás +fork=Másolás +download_archive=Töltse le ezt a tárolót + +no_desc=Nincs leírás +quick_guide=Gyors útmutató +clone_this_repo=Tároló klónozása +create_new_repo_command=Egy új tároló létrehozása a parancssorból +push_exist_repo=Meglévő tároló feltöltése parancssorból +bare_message=A tároló nem tartalmaz semmit, üres. + +code=Kód +code.desc=Itt van tárolva a kód +branch=Ág +tree=Fa +filter_branch_and_tag=Ág vagy címke szűrése +branches=Ágak +tags=Címkék +issues=Hibajegyek +pulls=Egyesítési kérések +labels=Címkék +milestones=Mérföldkövek +commits=Commit-ok +releases=Kiadások +file_raw=Nyers +file_history=Előzmények +file_view_raw=Nyers fájl megtekintése +file_permalink=Állandó hivatkozás +file_too_large=Ez a fájl túl nagy, nem megjeleníthető +video_not_supported_in_browser=A böngésző nem támogatja a HTML5 video tag-et. +stored_lfs=Git LFS-el eltárolva +commit_graph=Commit gráf + +editor.new_file=Új fájl +editor.upload_file=Fájl feltöltése +editor.edit_file=Fájl szerkesztése +editor.preview_changes=Változások előnézete +editor.cannot_edit_non_text_files=Nem lehet szerkeszteni a bináris fájlokat a webes felületen +editor.edit_this_file=A fájl szerkesztése +editor.must_be_on_a_branch=Egy ágon kell lennie, hogy változtatásokat végezhessen, vagy javasolhasson ehhez a fájlhoz +editor.fork_before_edit=Először csinálnia kell egy másolatot tárolóról mielőtt szerkesztheti a fájlt +editor.delete_this_file=A fájl törlése +editor.must_have_write_access=Írási jog szükséges hogy módosíthassa, vagy módosításokat javasolhasson ehhez a fájlhoz +editor.file_delete_success=A(z) '%s' fájl sikeresen törölve! +editor.name_your_file=Nevezd el a fájlod... +editor.filename_help=Egy könyvtár hozzáadásához gépelje be és üssön egy /-t. Egy könyvtár eltávolításához menyjen a mező elejére és nyomjon backspace-t. +editor.or=vagy +editor.cancel_lower=mégsem +editor.commit_changes=Változások véglegesítése +editor.add_tmpl='%s/' hozzáadása +editor.add='%s' hozzáadása +editor.update='%s' módosítása +editor.delete='%s' törlése +editor.commit_message_desc=Opcionális hosszabb leírás hozzáadása... +editor.commit_directly_to_this_branch=Commit egyenesen a(z) %s ágba. +editor.create_new_branch=Hozzon létre egy új ágat ennek a commit-nak és indíts egy egyesítési kérést. +editor.new_branch_name_desc=Új ág neve... +editor.cancel=Mégsem +editor.filename_cannot_be_empty=A fájlnév nem lehet üres. +editor.branch_already_exists=A(z) '%s' ág már létezik ebben a tárolóban. +editor.directory_is_a_file=A(z) '%s' útvonal egy fájl, nem egy mappa a repository-ban. +editor.file_is_a_symlink=A fájl '%s' egy szimbolikus link amit nem lehet módosítani a webes szerkesztőből +editor.filename_is_a_directory=A(z) '%s' fájlnév egy létező mappa ebben a tárolóban. +editor.file_editing_no_longer_exists=A(z) '%s' fájl amit szerkesztesz már nem létezik a tárolóban. +editor.file_changed_while_editing=A fájlt tartalma megváltozott mióta elkezdte a szerkesztést. Kattintson ide hogy lássa mi változott, vagy kattintson még egyszer a commit-ra hogy felülírja azokat a változtatásokat. +editor.file_already_exists=A(z) '%s' nevű fájl már létezik a tárolóban. +editor.no_changes_to_show=Nincsen megjeleníthető változás. +editor.fail_to_update_file=Nem sikerült létrehozni/módosítani a következő fájlt: '%s' A hiba oka: %v +editor.add_subdir=Alkönyvtár hozzáadása... +editor.unable_to_upload_files=Nem sikerült feltölteni a fájlokat a "%s" hiba: %v +editor.upload_files_to_dir=Fájlok feltöltése a következőre: '%s' +editor.cannot_commit_to_protected_branch=Nem lehet a következő védett ágra commit-olni: '%s'. + +commits.desc=A commitok mutatják a kód változását az időben +commits.commits=Commit-ok +commits.search=Commit-ok keresése +commits.find=Keresés +commits.search_all=Minden ág +commits.author=Szerző +commits.message=Üzenet +commits.date=Dátum +commits.older=Régebbi +commits.newer=Újabb +commits.signed_by=Aláírta +commits.gpg_key_id=GPG kulcs azonosító + +ext_issues=Külső hibajegyek +ext_issues.desc=Külső Hibajegy kezelő: link egy külső hibajegy kezelő rendszer oldalára + +issues.desc=Hibajegyek: itt lehet a feladatokat és javítandó hibákat kezelni +issues.new=Új hibajegy +issues.new.labels=Címkék +issues.new.no_label=Nincs címke +issues.new.clear_labels=Címkék kiürítése +issues.new.milestone=Mérföldkő +issues.new.no_milestone=Nincs mérföldkő +issues.new.clear_milestone=Mérföldkő eltávolítása +issues.new.open_milestone=Nyitott mérföldkövek +issues.new.closed_milestone=Lezárt mérföldkövek +issues.new.assignee=Megbízott +issues.new.clear_assignee=Megbízott eltávolítása +issues.new.no_assignee=Nincs megbízott +issues.create=Hibajegy létrehozása +issues.new_label=Új címke +issues.new_label_placeholder=Címke neve... +issues.create_label=Címke létrehozása +issues.label_templates.title=Előre definiált címkék betöltése +issues.label_templates.info=Még nincsenek címkék. Rákattinthatsz az "Új Címke" gombra felül hogy létrehozz egyet, vagy választhatsz egy már létezőt a lenti listából. +issues.label_templates.helper=Címkekészlet választása +issues.label_templates.use=Használja ezt a címke készletet +issues.label_templates.fail_to_load_file=Nem sikerült betölteni a cimkekészlet sablon fájlt "%s": %v +issues.add_label_at=`következő hozzáadva:
%s
label %s` +issues.remove_label_at=`következő eltávolítva:
%s
label %s` +issues.add_milestone_at=`A hibajegy hozzá lett adva a %s mérföldkőhöz %s` +issues.change_milestone_at=`módosítva lett a mérföldkő %s-ról/ről %s-ra/re %s` +issues.remove_milestone_at=`eltávolítva a %s mérföldkőből %s` +issues.deleted_milestone=`(törölt)` +issues.self_assign_at=`önmagához rendelte %s` +issues.add_assignee_at=`hozzárendelve %s által %s` +issues.remove_assignee_at=`eltávolította a hozzárendelést %s` +issues.change_title_at=`a cím változott %s-ról/ről %s-ra/re %s` +issues.delete_branch_at=`letörölte a(z) %s ágat %s` +issues.open_tab=%d Nyitva +issues.close_tab=%d Lezárva +issues.filter_label=Címke +issues.filter_label_no_select=Nincs kijelölt címke +issues.filter_milestone=Mérföldkő +issues.filter_milestone_no_select=Nincs kijelölt mérföldkő +issues.filter_assignee=Megbízott +issues.filter_assginee_no_select=Nincs kijelölt megbízott +issues.filter_type=Típus +issues.filter_type.all_issues=Minden hibajegy +issues.filter_type.assigned_to_you=Hozzám rendelt +issues.filter_type.created_by_you=Általam létrehozottak +issues.filter_type.mentioning_you=Engem említ +issues.filter_sort=Rendezés +issues.filter_sort.latest=Legújabb +issues.filter_sort.oldest=Legrégebbi +issues.filter_sort.recentupdate=Nemrég frissített +issues.filter_sort.leastupdate=Legrégebben frissített +issues.filter_sort.mostcomment=Legtöbbet hozzászólt +issues.filter_sort.leastcomment=Legkevesebbet hozzászólt +issues.action_open=Megnyitás +issues.action_close=Lezárás +issues.action_label=Címke +issues.action_milestone=Mérföldkő +issues.action_milestone_no_select=Nincs mérföldkő +issues.action_assignee=Megbízott +issues.action_assignee_no_select=Nincs megbízott +issues.opened_by=megnyitva %[1]s %[3]s által +issues.opened_by_fake=megnyitva %[1]s %[2]s által +issues.previous=Előző +issues.next=Következő +issues.open_title=Nyitott +issues.closed_title=Lezárt +issues.num_comments=%d hozzászólás +issues.commented_at=`hozzászólt %s` +issues.delete_comment_confirm=Biztos vagy benne, hogy törölni akarod ezt a hozzászólást? +issues.no_content=Még nincs tartalom. +issues.close_issue=Lezárás +issues.close_comment_issue=Hozzászólás és lezárás +issues.reopen_issue=Újranyitás +issues.reopen_comment_issue=Hozzászólás és újranyitás +issues.create_comment=Hozzászólás +issues.closed_at=`lezárta %[2]s` +issues.reopened_at=`újranyitotta %[2]s` +issues.commit_ref_at=`hivatkozott erre a hibajegyre egy commit-ból %[2]s` +issues.poster=Posztoló +issues.collaborator=Közreműködő +issues.owner=Tulajdonos +issues.sign_in_require_desc=Jelentkezz be hogy csatlakozz a beszélgetéshez. +issues.edit=Szerkesztés +issues.cancel=Mégsem +issues.save=Mentés +issues.label_title=Címke neve +issues.label_color=Címke színe +issues.label_count=%d címke +issues.label_open_issues=%d nyitott hibajegy +issues.label_edit=Szerkesztés +issues.label_delete=Törlés +issues.label_modify=Címke módosítása +issues.label_deletion=Címke törlése +issues.label_deletion_desc=A címke törlése eltávolítja azt minden hibajegyről. Biztosan folytatni szeretné? +issues.label_deletion_success=A címke sikeresen törölve lett! +issues.label.filter_sort.alphabetically=Betűrendben +issues.label.filter_sort.reverse_alphabetically=Fordított betűrendben +issues.label.filter_sort.by_size=Méret szerint +issues.label.filter_sort.reverse_by_size=Méret szerint fordítottan +issues.num_participants=%d Résztvevő +issues.attachment.open_tab=`A(z) "%s" megnyitása új fülön` +issues.attachment.download=`Kattintson a(z) "%s" letöltéséhez` +issues.subscribe=Feliratkozás +issues.unsubscribe=Leiratkozás + +pulls.desc=Kód felülvizsgálata és egyesítése +pulls.new=Egyesítési kérés +pulls.compare_changes=Változások összehasonlítása +pulls.compare_changes_desc=Két ág összehasonlítása és egyesítési kérés készítése a változtatásokkal. +pulls.compare_base=alap +pulls.compare_compare=összehasonlítás +pulls.filter_branch=Ágra szűrés +pulls.no_results=Nincs találat. +pulls.nothing_to_compare=Nincs mit összehasonlítani, mert az alap és a jelenlegi ág megegyezik. +pulls.has_pull_request=`Már létezik egyesítési kérés a két ág között: %[2]s#%[3]d` +pulls.create=Egyesítési kérés létrehozása +pulls.title_desc=egyesíteni szeretné %[1]d változás(oka)t a(z) %[2]s-ból %[3]s-ba +pulls.merged_title_desc=egyesítve %[1]d változás(ok) a %[2]s-ból %[3]s-ba %[4]s +pulls.tab_conversation=Beszélgetés +pulls.tab_commits=Commit-ok +pulls.tab_files=Módosított fájlok +pulls.reopen_to_merge=Kérjük, nyissa újra az egyesítési kérést. +pulls.merged=Egyesítve +pulls.has_merged=Az egyesítési kérés sikeresen végrehajtva. +pulls.data_broken=Az egyesítési kérés adatai sérültek mivel a helyi másolat infomáció törölve lett. +pulls.is_checking=Az ütközési ellenőrzés még folyamatban van, kérjük frissítse az oldalt pár másodperc múlva. +pulls.can_auto_merge_desc=Ez az egyesítési kérés automatikusan végrehajtható. +pulls.cannot_auto_merge_desc=Ez az egyesítési kérés ütközések miatt nem hajtható végre automatikusan. +pulls.cannot_auto_merge_helper=Kérjük, egyesítse kézileg az ütközések megoldásához. +pulls.merge_pull_request=Egyesítési kérés végrehajtása +pulls.open_unmerged_pull_exists=`Nem tudja újranyitni, mert már van egy nyitott egyesítési kérés (#%d) ugyanebben a tárolóban, ugyanezekket az egyesítési információkkal, és végrehajtásra vár.` + +milestones.new=Új mérföldkő +milestones.open_tab=%d Nyitott +milestones.close_tab=%d Zárt +milestones.closed=Lezárva: %s +milestones.no_due_date=Nincs határidő +milestones.open=Megnyitás +milestones.close=Lezárás +milestones.new_subheader=Hozzon létre mérföldköveket a hibajegyek rendszerezéséhez. +milestones.create=Mérföldkő létrehozása +milestones.title=Cím +milestones.desc=Leírás +milestones.due_date=Határidő (nem kötelező) +milestones.clear=Kiürít +milestones.invalid_due_date_format=Érvénytelen határidő formátum, az elvárt: 'éééé-hh-nn'. +milestones.create_success=A mérföldkő ('%s') létrehozása sikeresen megtörtént! +milestones.edit=Mérföldkő szerkesztése +milestones.edit_subheader=Használjon érthető leírást a mérföldkövekhez, hogy ne zavarjon össze senkit. +milestones.cancel=Mégsem +milestones.modify=Mérföldkő módosítása +milestones.edit_success=A mérföldkő ('%s') módosításai sikeresen elmentésre kerültek! +milestones.deletion=Mérföldkő törlése +milestones.deletion_desc=A mérföldkő törlése eltávolítja az összes hozzárendelt hibajegyet. Biztosan folytatja? +milestones.deletion_success=A mérföldkő törlése sikeresen megtörtént! +milestones.filter_sort.closest_due_date=Legközelebbi határidő +milestones.filter_sort.furthest_due_date=Legtávolabbi határidő +milestones.filter_sort.least_complete=Legkevésbé befejezve +milestones.filter_sort.most_complete=Leginkább befejezve +milestones.filter_sort.most_issues=Legtöbb hibajegy +milestones.filter_sort.least_issues=Legkevesebb hibajegy + +ext_wiki=Külső Wiki +ext_wiki.desc=A külső Wiki egy másik rendszerre hivatkozik + +wiki=Wiki +wiki.welcome=Üdvözöljük a projekt Wikijében +wiki.welcome_desc=A Wiki lehetővé teszi, hogy Ön vagy az együttműködők könnyen dokumentálhassák a projektet. +wiki.desc=A Wiki egy hely a projektdokumentáció tárolására +wiki.create_first_page=Első oldal létrehozása +wiki.page=Oldal +wiki.filter_page=Oldal szűrése +wiki.new_page=Új oldal létrehozása +wiki.default_commit_message=Megjegyzés írása az oldalról (nem kötelező). +wiki.save_page=Oldal mentése +wiki.last_commit_info=%s módosította ezt az oldalt ekkor: %s +wiki.edit_page_button=Szerkesztés +wiki.new_page_button=Új oldal +wiki.delete_page_button=Oldal törlése +wiki.delete_page_notice_1=A(z) "%s" oldal törlésre kerül. Győződjön meg róla, hogy biztosan törölni szeretné-e. +wiki.page_already_exists=Már létezik azonos nevű Wiki oldal. +wiki.pages=Oldalak +wiki.last_updated=Utoljára módosítva: %s + +settings=Beállítások +settings.desc=A beállítások menüpontban állítható a tároló paraméterei +settings.options=Beállítások +settings.collaboration=Együttműködés +settings.collaboration.admin=Rendszergazda +settings.collaboration.write=Írás +settings.collaboration.read=Olvasás +settings.collaboration.undefined=Nincs definiálva +settings.hooks=Webhook-ok +settings.githooks=Git Hook-ok +settings.basic_settings=Alap beállítások +settings.mirror_settings=Tükrözési beállítások +settings.sync_mirror=Szinkronizálás most +settings.mirror_sync_in_progress=Tükör szinkronizálás elindítva. Kérjük néhány perc múlva frissítse az oldalt. +settings.site=Hivatalos honlap +settings.update_settings=Beállítások frissítése +settings.advanced_settings=Haladó beállítások +settings.wiki_desc=Engedélyezi a Wiki rendszert +settings.use_internal_wiki=Beépített Wiki használata +settings.use_external_wiki=Külső Wiki használata +settings.external_wiki_url=Külső Wiki URL +settings.external_wiki_url_error=A külső Wiki URL-cím érvénytelen +settings.external_wiki_url_desc=A látogatók átirányításra kerülnek a beállított URL-re amikor a fülre kattintanak. +settings.issues_desc=Hibajegykezelő engedélyezése +settings.use_internal_issue_tracker=Beépített hibajegy kezelő használata +settings.use_external_issue_tracker=Külső hibajegy kezelő használata +settings.external_tracker_url=Külső hibajegy kezelő URL +settings.external_tracker_url_error=A külső hibajegykezelő URL érvénytelen +settings.external_tracker_url_desc=A látogatók átirányításra kerülnek a beállított URL-re amikor a fülre kattintanak. +settings.tracker_url_format=Külső hibajegykezelő URL formátuma +settings.tracker_issue_style=Külső hibajegy kezelő elnevezési konvenciója: +settings.tracker_issue_style.numeric=Numerikus +settings.tracker_issue_style.alphanumeric=Alfanumerikus +settings.tracker_url_format_desc=Használhat behelyettesítéseket: {user} {repo} {index} a felhasználónévhez, tárolónévhez és hibajegy azonosítóhoz. +settings.pulls_desc=Nyilvános hozzájárulások engedélyezése egyesítési kérések esetén +settings.danger_zone=Veszélyes terület +settings.new_owner_has_same_repo=Az új tulajdonos már rendelkezik ilyen nevű tárolóval. Kérjük válasszon egy másik nevet. +settings.convert=Hagyományos tárolóvá alakítás +settings.convert_desc=Átalakíthatja ezt a tükörtárolót hagyományos tárolóvá. A művelet nem visszavonható. +settings.convert_notices_1=- Ez a művelet át fogja konvertálni ezt a tükör-tárolót egy rendes tárolóvá, és nem lehet visszavonni. +settings.convert_confirm=Átalakítás Megerősítése +settings.convert_succeed=A tárolót egy rendes tárolóvá kell konvertálni. +settings.transfer=Tulajdonjog átadása +settings.transfer_desc=A tároló tulajdonának átruházása egy másik felhasználóra, vagy egy szervezetre ahol rendszergazdai jogai van. +settings.transfer_notices_1=- El fogja veszteni a hozzáférését, ha az új tulajdonos egy egyéni felhasználó. +settings.transfer_notices_2=- Megmarad a hozzáférése, ha az új tulajdonos egy szervezet és te az egyik tulajdonosa vagy. +settings.transfer_form_title=Kérlek, add meg a követező információt a művelet megerősítéséhez: +settings.wiki_delete=Wiki adatok törlése +settings.wiki_delete_desc=Miután kitörli a Wiki adatokat nincs visszaút. Jól gondolja meg. +settings.wiki_delete_notices_1=- Ez le fogja törölni, és kikapcsolni a Wiki a következőnek: %s +settings.wiki_deletion_success=A tároló Wikijében lévő összes adat törölve. +settings.delete=A tároló törlése +settings.delete_desc=Ha egyszer letöröl egy tárolót, azt nem lehet visszavonni. Bizonyosodjon meg benne, hogy ezt szeretné. +settings.delete_notices_1=- Ezt a műveletet NEM lehet visszavonni. +settings.delete_notices_2=- Ez a művelet véglegesen törölni fog mindent ami a tárolóhoz tartozik, például kódot, hibajegyeket, hozzászólásokat, Wiki oldalakat és a közreműködők jogait. +settings.delete_notices_fork_1=- Minden tároló másolat önállóvá válik a törlés után. +settings.deletion_success=A tároló törölve lett. +settings.update_settings_success=A tároló beállításai firssítve lettek. +settings.transfer_owner=Új tulajdonos +settings.make_transfer=Átadás végrehajtása +settings.transfer_succeed=A tároló tulajdonának átadása megtörtént. +settings.confirm_delete=Törlés megerősítése +settings.add_collaborator=Új együttműködő +settings.add_collaborator_success=Az együttműködő hozzáadva. +settings.delete_collaborator=Törlés +settings.collaborator_deletion=Együttműködő törlése +settings.collaborator_deletion_desc=Ennek a felhasználónak nem lesz joga közreműködni a tárolóban a törlés után. Biztos, hogy folytatni szeretné? +settings.remove_collaborator_success=Az együttműködő eltávolítva. +settings.search_user_placeholder=Felhasználók keresése... +settings.org_not_allowed_to_be_collaborator=Szervezet hozzáadása együttműködőként nem engedélyezett. +settings.user_is_org_member=A felhasználó olyan szervezeti tag, aki nem adható hozzá együttműködőként. +settings.add_webhook=Webhook hozzáadása +settings.hooks_desc=A Webhook-ok olyanok, mint az alapvető HTTP POST esemény triggerek. Amikor valami történik a Giteában, akkor küldünk róla értesítést a címre amit beállít. Többet olvashat erről a Webhooks Guide-ban. +settings.webhook_deletion=Webhook törlése +settings.webhook_deletion_desc=Ennek a WebHook-nak a törlése eltávolít róla minden információt, és a korábbi kézbesítéseknek a naplóját is. Biztos, hogy folytatni szeretné? +settings.webhook_deletion_success=A Webhook sikeresen törölve lett! +settings.webhook.test_delivery=Küldés Kipróbálása +settings.webhook.test_delivery_desc=Egy hamis push esemény küldése, hogy a webhook beállításaidat kipróbálhassa +settings.webhook.test_delivery_success=A teszt webhook hozzá lett adva a küldési listához. Eltelhet néhány másodperc mire meg fog jelenni a küldési listában. +settings.webhook.request=Kérés +settings.webhook.response=Válasz +settings.webhook.headers=Fejlécek +settings.webhook.payload=Tartalom +settings.webhook.body=Törzs +settings.githooks_desc=A Git Hook-okat maga a Git működteti, szerkesztheted a támogatott hook-ok fájljait a következő listában hogy egyéni műveleteket is végezzenek. +settings.githook_edit_desc=Ha a hook nincs aktiválva, akkor egy sablon lesz mutatva. Ha a tartalmát üresre hagyod, akkor ez a hook ki lesz kapcsolva. +settings.githook_name=Hook megnevezés +settings.githook_content=Hook tartalom +settings.update_githook=Hook frissítése +settings.add_webhook_desc=A Gitea küldeni fog egy POST kérést az URL-re amit megad, azzal az eseménnyel együtt ami történt. Azt is megadható, hogy milyen formátumban tegye ezt (JSON, x-www-form-urlencoded, XML, stb). További információt a Webhooks Guide-ban találhat róla. +settings.payload_url=Tartalom URL-címe +settings.content_type=Tartalomtípus +settings.secret=Titok +settings.slack_username=Felhasználónév +settings.slack_icon_url=Ikon URL +settings.slack_color=Szín +settings.event_desc=Mikor aktiválódjon ez a webhook? +settings.event_push_only=Csak a push eseményre. +settings.event_send_everything=Mindenre szükségem van. +settings.event_choose=Én szeretném kiválasztani amire szükségem van. +settings.event_create=Létrehozás +settings.event_create_desc=Ág vagy címke létrehozva +settings.event_pull_request=Egyesítési Kérés +settings.event_pull_request_desc=Egyesítési kérés megnyitva, lecsukva, újranyitva, szerkesztve, hozzárendelve, senkihez sem rendelve, címke frissítve, címke törölve vagy szinkronizálva. +settings.event_push=Feltöltés +settings.event_push_desc=Push-olás egy tárolóba +settings.active=Aktív +settings.active_helper=Az információ az eseményről, amely miatt lefutott is el lesz küldve. +settings.add_hook_success=Új Webhook hozzáadva. +settings.update_webhook=Webhook frissítése +settings.update_hook_success=A Webhook frissítve. +settings.delete_webhook=Webhook törlése +settings.recent_deliveries=Legutóbbi Küldések +settings.hook_type=Hook típusa +settings.add_slack_hook_desc=Slack integráció hozzáadása a tárolójához. +settings.slack_token=Token +settings.slack_domain=Tartomány +settings.slack_channel=Csatorna +settings.deploy_keys=Telepítési kulcsok +settings.add_deploy_key=Telepítési kulcs hozzáadása +settings.deploy_key_desc=A Deploy kulcsoknak csak olvasási joga van. Nem ugyan azok mint a személyes SSH kulcsok. +settings.no_deploy_keys=Még nem adott hozzá egyetlen Deploy kulcsot sem. +settings.title=Cím +settings.deploy_key_content=Tartalom +settings.key_been_used=Deploy kulcs tartalma már fel lett használva. +settings.key_name_used=Ezzel a névvel már létezik Deploy kulcs. +settings.add_key_success=Az új Deploy kulcs '%s' sikeresen hozzáadva! +settings.deploy_key_deletion=Telepítési kulcs törlése +settings.deploy_key_deletion_desc=Ha ezt a Deploy kulcsot eltávolítja, akkor onnantól nem lehet hozzáférni a tárolóhoz vele. Biztos, hogy folytatni szeretné? +settings.deploy_key_deletion_success=Telepítési kulcs sikeresen hozzáadva! +settings.branches=Ágak +settings.protected_branch=Ág védeleme +settings.protected_branch_can_push=Push engedélyezése? +settings.protected_branch_can_push_yes=Most már push-olhatja +settings.protected_branch_can_push_no=Nem push-olhatja +settings.add_protected_branch=Védelem engedélyezése +settings.delete_protected_branch=Védelem letiltása +settings.add_protected_branch_success=%s sikeresen lezárva +settings.add_protected_branch_failed=%s-t nem sikerült lezárni +settings.remove_protected_branch_success=%s-t sikeresen feloldva +settings.protected_branch_deletion=Védett ág törlése +settings.protected_branch_deletion_desc=Bárki írási joggal tud majd push-olni közvetlenül erre az ágra. Biztos vagy benne? +settings.default_branch_desc=Az alapértelmezett ág az "alap", ahova automatikusan az összes commit készül, és az egyesítési kérések is ezt veszik az összehasonlítás alapjául, ha nem állítasz be egy másik ágat. +settings.choose_branch=Válasszon egy ágat... +settings.no_protected_branch=Nincsenek védett ágak + +diff.browse_source=Forráskód böngészése +diff.parent=szülő +diff.commit=commit +diff.data_not_available=A különbségek nem megjeleníthetőek +diff.show_diff_stats=Különbségstatisztika +diff.show_split_view=Osztott nézet +diff.show_unified_view=Egyesített nézet +diff.stats_desc=%d fájl változott, egészen pontosan %d új sor hozzáadva és %d régi sor törölve +diff.bin=BINáris +diff.view_file=Fájl megtekintése +diff.file_suppressed=A különbségek nem kerülnek megjelenítésre, mivel a fájl túl nagy +diff.too_many_files=Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott + +releases.desc=A Kiadások az a hely, ahol a projekt verzióit kezelheti +release.releases=Kiadások +release.new_release=Új kiadás +release.draft=Piszkozat +release.prerelease=Elő-kiadás +release.stable=Stabil +release.edit=szerkesztés +release.ahead=%d commit a(z) %s ágon a legutóbbi kiadás óta +release.source_code=Forráskód +release.new_subheader=Tegyen közzé kiadásokat, hogy nyomon követhesse a verziókat. +release.edit_subheader=Egy részletes változásnapló segít a felhasználóknak megérteni mi változott. +release.tag_name=Címke neve +release.target=Cél +release.tag_helper=Válasszon egy meglévő címkét, vagy hozzon létre egy új címkét a kiadáshoz. +release.title=Cím +release.content=Tartalom +release.write=Írás +release.preview=Előnézet +release.loading=Betöltés... +release.prerelease_desc=Ez egy előzetes kiadás +release.prerelease_helper=Tájékoztatjuk, hogy a kiadás nem kész éles rendszerben használatra. +release.cancel=Mégsem +release.publish=Kiadás közzététele +release.save_draft=Piszkozat mentése +release.edit_release=Kiadás szerkesztése +release.delete_release=Kiadás törlése +release.deletion=Kiadás törlése +release.deletion_desc=A kiadás törlésével a kapcsolódó címke is törlésre kerül. A tárolóban adatvesztés nem fordul elő. Szeretné folytatni? +release.deletion_success=A kiadás törölve. +release.tag_name_already_exist=Kiadás ilyen címkével már létezik. +release.tag_name_invalid=Érvénytelen címkenév. +release.downloads=Letöltések + +branch.delete=%s ág törlése +branch.delete_desc=Egy ág törlése végleges. Visszavonásra nincs lehetőség. +branch.delete_notices_1=- Ez a művelet NEM visszavonható. +branch.delete_notices_2=- A művelet véglegesen töröl mindent a(z) %s ágban. +branch.deletion_success=%s törölve lett. +branch.deletion_failed=Nem sikerült törölni a(z) %s ágat. +branch.delete_branch_has_new_commits=%s ág nem törölhető, mert tartalmaz olyan új változásokat melyek nem lettek még egyesítve. + +[org] +org_name_holder=Szervezet neve +org_full_name_holder=Szervezet teljes neve +org_name_helper=A jó szervezetnevek rövidek és könnyen megjegyezhetőek. +create_org=Szervezet létrehozása +repo_updated=Frissítve +people=Emberek +invite_someone=Hívj meg valakit +teams=Csoportok +lower_members=tagok +lower_repositories=tárolók +create_new_team=Új csoport létrehozása +org_desc=Leírás +team_name=Csoport neve +team_desc=Leírás +team_name_helper=Ezt a nevet használhatja a csoport megemlítésére. +team_desc_helper=Mire van ez a csoport? +team_permission_desc=Milyen jogosultságai legyenek ennek a csoportnak? +team_unit_desc=Mihez legyen ennek a csoportnak hozzáférése? + +form.name_reserved=Ez a szervezetnév ('%s') le van foglalva. +form.name_pattern_not_allowed=A szervezetnév ('%s') nem engedélyezett. +form.create_org_not_allowed=Ez a fiók nem rendelkezik jogosultsággal szervezet létrehozásához. + +settings=Beállítások +settings.options=Opciók +settings.full_name=Teljes név +settings.website=Webhely +settings.location=Tartózkodási hely +settings.update_settings=Beállítások frissítése +settings.update_setting_success=A szervezet beállításai frissültek. +settings.change_orgname_prompt=Ez a változtatás meg fogja változtatni a szervezet hivatkozásait is. +settings.update_avatar_success=A szervezet profilképe firssítve. +settings.delete=Szervezet törlése +settings.delete_account=A szervezet törlése +settings.delete_prompt=A szervezet véglegesen eltávolításra kerül, ezt a műveletet NEM lehet visszavonni! +settings.confirm_delete_account=Törlés megerősítése +settings.delete_org_title=Szervezet törlése +settings.delete_org_desc=Ez a szervezet véglegesen törlésre kerül, biztosan folytatja? +settings.hooks_desc=Webhook hozzáadása a szervezet összes tárolójához. + +members.membership_visibility=Tagság láthatósága: +members.public=Nyilvános +members.public_helper=priváttá tétel +members.private=Privát +members.private_helper=nyilvánossá tétel +members.member_role=Tag szerepkör: +members.owner=Tulajdonos +members.member=Tag +members.remove=Eltávolítás +members.leave=Távozás +members.invite_desc=Tag hozzáadása a(z) %s szervezethez: +members.invite_now=Meghívás most + +teams.join=Csatlakozás +teams.leave=Távozás +teams.read_access=Olvasási jogosultság +teams.read_access_helper=Ez a csapat képes lesz megtekinteni és klónozni a tárolóit. +teams.write_access=Írási jogosultság +teams.write_access_helper=Ez a csapat képes lesz olvasni a tárolóit, és feltölteni beléjük. +teams.admin_access=Rendszergazdai jogosultság +teams.admin_access_helper=Ez a csapat képes lesz másolni, feltölteni a tárolóiba és további együttműködőket hozzájuk adni. +teams.no_desc=Ennek a csoportnak nincs leírása +teams.settings=Beállítások +teams.owners_permission_desc=A tulajdonosok a szervezet összes tárolójához rendszergazdai hozzáféréssel rendelkeznek. +teams.members=Csoporttagok +teams.update_settings=Beállítások frissítése +teams.delete_team=A csoport törlése +teams.add_team_member=Csapattag hozzáadása +teams.delete_team_title=Csoport törlése +teams.delete_team_desc=A csoport törlése során a csoporttagok elveszthetik hozzáféréseiket bizonyos tárolóikhoz. Biztosan folytatja? +teams.delete_team_success=A csoport törölve lett. +teams.read_permission_desc=Ez a csoport Olvasási jogosultságot ad: a tagok olvasni és klónozni tudják a csoport tárolóit. +teams.write_permission_desc=Ez a csoport Írási jogosultságot ad: a tagok olvasni és feltölteni is tudnak a csoport tárolóiba. +teams.admin_permission_desc=A csoport rendszergazdai jogosultságot ad: a tagok olvasási, írási jogosultsággal rendelkeznek és együttműködőket adhatnak hozzá a csoport tárolóihoz. +teams.repositories=Csoport tárolói +teams.search_repo_placeholder=Tároló keresés... +teams.add_team_repository=Új csoport tároló +teams.remove_repo=Eltávolítás +teams.add_nonexistent_repo=A tároló, melybe feltölteni szeretne, még nem létezik. Először hozza létre. + +[admin] +dashboard=Műszerfal +users=Felhasználók +organizations=Szervezetek +repositories=Tárolók +authentication=Hitelesítések +config=Konfiguráció +notices=Rendszer-értesítések +monitor=Figyelés +first_page=Első +last_page=Utolsó +total=Összesen: %d + +dashboard.statistic=Statisztika +dashboard.operations=Műveletek +dashboard.system_status=Rendszerfigyelő +dashboard.statistic_info=Az adatbázisban van %d felhasználó, %d szervezet, %d publikus kulcs, %d tároló, %d figyelő, %d csillagozás, %d művelet, %d hozzáférés, %d hibajegy, %d megjegyzés, %d közösségi fiók, %d követő, %d tükör, %d kiadás, %d hitelesítési forrás, %d webhook, %d mérföldkő, %d címke, %d hook feladat, %d csoport, %d frissítési feladat, %d csatolmány. +dashboard.operation_name=Művelet neve +dashboard.operation_switch=Váltás +dashboard.operation_run=Futtatás +dashboard.clean_unbind_oauth=Megszüntetett OAuth kapcsolatok törlése +dashboard.clean_unbind_oauth_success=Összes megszüntetett OAuth kapcsolat törlése. +dashboard.delete_inactivate_accounts=Minden inaktív fiók törlése +dashboard.delete_inactivate_accounts_success=Minden inaktív fiók törölve. +dashboard.delete_repo_archives=Összes archív tároló törlése +dashboard.delete_repo_archives_success=Az összes archivált tároló törölve lett. +dashboard.delete_missing_repos=Az összes tárolóban az elveszett Git fájl rekordok törlése +dashboard.delete_missing_repos_success=Az összes tároló bejegyzés törölve, amiknek a kapcsolódó Git fájljai elvesztek. +dashboard.git_gc_repos=Memóriaszemét-gyűjtő (GC) futtatása az összes tárolón +dashboard.git_gc_repos_success=Minden tárolón befejezte a memóriaszemét-gyűjtő (GC) a futását. +dashboard.resync_all_sshkeys=A '.ssh/authorized_keys' fájl újraírása (a Gitea SSH publikus kulcsaival) +dashboard.resync_all_sshkeys_success=Minden kulcs újraírva. +dashboard.resync_all_hooks=pre-receive, update és post-receive hook-ok újraszinkronizálása az összes tárolóban. +dashboard.resync_all_hooks_success=Az összes tároló pre-receive, update és post-receive hook-ja szinkronizálva lett. +dashboard.reinit_missing_repos=Az összes Git tároló újra-inicializálása amihez léteznek bejegyzések +dashboard.reinit_missing_repos_success=Az összes Git tároló amihez létezett bejegyzés újra lett iniciaizálva. +dashboard.sync_external_users=Külső felhasználói adatok szinkronizálása +dashboard.sync_external_users_started=Külső felhasználó szinkronizálása elkezdődött +dashboard.server_uptime=Kiszolgáló futási ideje +dashboard.current_goroutine=Jelenlegi Goroutinok +dashboard.current_memory_usage=Jelenlegi memória használat +dashboard.total_memory_allocated=Összes lefoglalt memória +dashboard.memory_obtained=Megszerzett Memória +dashboard.pointer_lookup_times=Pointer Lookup Idők +dashboard.memory_allocate_times=Memória Foglalási Idők +dashboard.memory_free_times=Memória Felszabadítási Idők +dashboard.current_heap_usage=Aktuális Heap Használat +dashboard.heap_memory_obtained=Heap Memória Megszerezve +dashboard.heap_memory_idle=Tétlen Heap Memória +dashboard.heap_memory_in_use=Használatban lévő Heap Memória +dashboard.heap_memory_released=Elengedett Heap Memória +dashboard.heap_objects=Heap Objektumok +dashboard.bootstrap_stack_usage=Bootstrap Stack Használat +dashboard.stack_memory_obtained=Stack Memória Megszerezve +dashboard.mspan_structures_usage=MSpan Struktúrák Használata +dashboard.mspan_structures_obtained=MSpan Struktúrák Megszerezve +dashboard.mcache_structures_usage=MCache Struktúrák Használata +dashboard.mcache_structures_obtained=MCache Struktúrák Megszerezve +dashboard.profiling_bucket_hash_table_obtained=Profilozó Vödrös Hash Tábla Megszerezve +dashboard.gc_metadata_obtained=GC Metaadat Megszerezve +dashboard.other_system_allocation_obtained=Másik Rendszer Allokáció Megszerezve +dashboard.next_gc_recycle=Következő GC Ciklus +dashboard.last_gc_time=Utolsó GC óta eltelt idő +dashboard.total_gc_time=Teljes GC szünet +dashboard.total_gc_pause=Teljes GC szünet +dashboard.last_gc_pause=Utolsó GC szünet +dashboard.gc_times=GC Idők + +users.user_manage_panel=Felhasználó Menedzsment Fül +users.new_account=Új fiók létrehozása +users.name=Név +users.activated=Aktivált +users.admin=Rendszergazda +users.repos=Tárolók +users.created=Létrehozva +users.last_login=Utolsó bejelentkezés +users.never_login=Soha nem jelentkezett be +users.send_register_notify=Regisztrációról értesítés küldése a felhasználónak +users.new_success=A(z) '%s' felhasználó sikeresen létrehozva. +users.edit=Szerkesztés +users.auth_source=Hitelesítési forrás +users.local=Helyi +users.auth_login_name=Hitelesítési bejelentkezési név +users.password_helper=Hagy üresen, hogy változatlan maradjon. +users.update_profile_success=A felhasználói profil sikeresen módosítva. +users.edit_account=Fiók szerkesztése +users.max_repo_creation=Maximálisan létrehozható tárolók számának korlátozása +users.max_repo_creation_desc=(Állítsd -1-re, hogy az alapértelmezett korlátot használja) +users.is_activated=Ez a fiók elvégezte az aktivációt +users.prohibit_login=A bejelentkezés ehhez a fiókhoz le van tiltva +users.is_admin=Ez a fiók rendszergazdai jogokkal rendelkezik +users.allow_git_hook=Ez a fiók létrehozhat Git Hook-okat +users.allow_import_local=Ez a fiók importálhat helyi tárolókat +users.allow_create_organization=Ez a fiók létrehozhat szervezeteket +users.update_profile=Fiók profiljának frissítése +users.delete_account=A fiók törlése +users.still_own_repo=Ennek a felhasználónak legalább egy tárolója van még, le kell törölnie, vagy valakinek átadnia. +users.still_has_org=Ez a felhasználó még mindig tagja legalább egy szervezetnek, távoznia kell onnan, vagy a szervezetet előbb törölni kell. +users.deletion_success=Fiók sikeresen törölve. + +orgs.org_manage_panel=Szervezetek kezelése +orgs.name=Név +orgs.teams=Csoportok +orgs.members=Tagok +orgs.new_orga=Szervezet létrehozása + +repos.repo_manage_panel=Tárolók kezelése +repos.owner=Tulajdonos +repos.name=Név +repos.private=Privát +repos.watches=Figyelők +repos.stars=Csillagok +repos.issues=Hibajegyek +repos.size=Méret + +auths.auth_manage_panel=Hitelesítések kezelése +auths.new=Új forrás hozzáadása +auths.name=Név +auths.type=Típus +auths.enabled=Engedélyezve +auths.syncenabled=Felhasználó-szinkronizálás engedélyezése +auths.updated=Frissítve +auths.auth_type=Hitelesítés típusa +auths.auth_name=Hitelesítési név +auths.security_protocol=Biztonsági protokoll +auths.domain=Tartomány +auths.host=Kiszolgáló +auths.port=Port +auths.bind_dn=Bind DN +auths.bind_password=Bind jelszó +auths.bind_password_helper=Figyelmeztetés: Ez a jelszó egyszerű szöveges formátumban kerül metésre. Ne használjon egy magas szintű jogosultsággal rendelkező fiókot. +auths.user_base=Felhasználókeresés alapja +auths.user_dn=Felhasználó DN +auths.attribute_username=Felhasználónév attribútum +auths.attribute_username_placeholder=Hagyja üresen, hogy a bejelentkező űrlap felhasználónév mezőjét használja. +auths.attribute_name=Vezetéknév attribútum +auths.attribute_surname=Keresztnév attribútum +auths.attribute_mail=E-mail attribútum +auths.attributes_in_bind= Attribútumok lekérdezése a DN környezetben +auths.filter=Felhasználói szűrő +auths.admin_filter=Rendszergazdai szűrő +auths.ms_ad_sa=Microsoft Active Directory SA +auths.smtp_auth=SMTP Autentikáció Típusa +auths.smtphost=SMTP kiszolgáló +auths.smtpport=SMTP port +auths.allowed_domains=Engedélyezett tartományok +auths.allowed_domains_helper=Hagyja üresen, hogy ne legyen egyetlen tartomány sem korlátozva. Ha több tartományt szeretne felvenni, akkor vesszővel válassza el őket ','. +auths.enable_tls=TLS titkosítás engedélyezése +auths.skip_tls_verify=TLS ellenőrzés kihagyása +auths.pam_service_name=PAM szolgáltatás neve +auths.oauth2_provider=OAuth2 szolgáltató +auths.oauth2_clientID=Ügyfél-azonosító (kulcs) +auths.oauth2_clientSecret=Ügyfél titka +auths.openIdConnectAutoDiscoveryURL=OpenID Connect Automatikus Felfedezés URL-je +auths.oauth2_use_custom_url=Testre szabott URL-ek használata az alapértelmezettek helyett +auths.oauth2_tokenURL=Token URL +auths.oauth2_authURL=URL Engedélyezése +auths.oauth2_profileURL=Profil URL +auths.oauth2_emailURL=E-mail URL +auths.enable_auto_register=Automatikus regisztráció engedélyezése +auths.tips=Tippek +auths.tips.oauth2.general=OAuth2 hitelesítés +auths.tips.oauth2.general.tip=Amikor egy új OAuth2 hitelesítési módot hoz létre, a visszahívási/átirányítási URL-nek így kell kinéznie: /user/oauth2//callback +auths.tip.oauth2_provider=OAuth2 szolgáltató +auths.tip.bitbucket=Igényeljen egy új OAuth jogosultságot itt: https://bitbucket.org/account/user//oauth-consumers/new és adja hozzá jogosultságot a "Fiókok"-"Olvasás" alá. +auths.tip.dropbox=Vegyen fel új alkalmazást itt: https://www.dropbox.com/developers/apps +auths.tip.facebook=Vegyen fel új alkalmazást itt: https://developers.facebook.com/apps majd adja hozzá a "Facebook Login"-t. +auths.tip.github=Vegyen fel új OAuth alkalmazást itt: https://github.com/settings/applications/new +auths.tip.gitlab=Vegyen fel új alkalmazást itt: https://gitlab.com/profile/applications +auths.tip.google_plus=Szerezzen OAuth2 kliens hitelesítési adatokat a Google API konzolban (https://console.developers.google.com/) +auths.tip.openid_connect=Használja az OpenID kapcsolódás felfedező URL-t (/.well-known/openid-configuration) a végpontok beállításához +auths.tip.twitter=Menyjen ide: https://dev.twitter.com/apps , hozzon létre egy alkalmazást és győződjön meg róla, hogy az “Allow this application to be used to Sign in with Twitter” opció be van kapcsolva. +auths.edit=Hitelesítési beállítások szerkesztése +auths.activated=Ez a hitelesítés mód aktiválva van +auths.new_success=A hitelesítési mód ('%s') hozzá lett adva. +auths.update_success=A hitelesítési mód beállításai frissítve lettek. +auths.update=Hitelesítési forrás frissítése +auths.delete=A hitelesítési forrás törlése +auths.delete_auth_title=Hitelesítési forrás törlése +auths.delete_auth_desc=A hitelesítési forrás törlésre kerül, biztosan folytatni szeretné? +auths.still_in_used=A hitelesítési mód még használatban van, mielőtt törölné válasszon más hitelesítési módot az érintett fiókokhoz, vagy törölje őket. +auths.deletion_success=Hitelesítési forrás sikeresen törölve! +auths.login_source_exist=Bejelentkezési forrás "%s" már létezik. + +config.server_config=Szerver konfiguráció +config.app_name=Alkalmazás neve +config.app_ver=Alkalmazás verziója +config.app_url=Alkalmazás URL-je +config.custom_conf=Konfigurációs fájl elérési útja +config.domain=Tartomány +config.offline_mode=Kapcsolat nélküli mód +config.disable_router_log=Útválasztás naplózásának letiltása +config.run_user=Futtató felhasználó +config.run_mode=Futtatás módja +config.git_version=Git verzió +config.repo_root_path=Tárolók gyökérkönyvtára +config.lfs_root_path=LFS gyökérkönyvtár +config.static_file_root_path=Statikus fájlok gyökérútvonala +config.log_file_root_path=Naplófájl gyökérútvonal +config.script_type=Szkript típus +config.reverse_auth_user=Visszafelé hitelesítés felhasználója + +config.ssh_config=SSH konfiguráció +config.ssh_enabled=Engedélyezett +config.ssh_start_builtin_server=Beépített kiszolgáló indítása +config.ssh_domain=Tartomány +config.ssh_port=Port +config.ssh_listen_port=Figyelő port +config.ssh_root_path=Gyökérkönyvtár +config.ssh_key_test_path=Kulcs ellenőrzés útvonala +config.ssh_keygen_path=Kulcsgeneráló ('ssh-keygen') elérési útja +config.ssh_minimum_key_size_check=Kulcsok Minimum Méretének Ellenőrzése +config.ssh_minimum_key_sizes=Kulcsok Minimális Mérete + +config.db_config=Adatbázis konfiguráció +config.db_type=Típus +config.db_host=Kiszolgáló +config.db_name=Név +config.db_user=Felhasználó +config.db_ssl_mode=SSL titkosítás +config.db_ssl_mode_helper=(csak "postgres"-nek) +config.db_path=Útvonal +config.db_path_helper=("sqlite3" és "tidb"-nek) + +config.service_config=Szolgáltatás konfiguráció +config.register_email_confirm=E-mail Megerősítés Szükséges +config.disable_register=Regisztráció Letiltása +config.enable_openid_signup=Regisztráció engedélyezése OpenID-n keresztül +config.enable_openid_signin=OpenID bejelentkezés engedélyezése +config.show_registration_button=Regisztrációs Gomb Megjelenítése +config.require_sign_in_view=Bejelentkező Nézet +config.mail_notify=E-mailes értesítések +config.disable_key_size_check=Minimális kulcsméret ellenőrzés letiltása +config.enable_captcha=Captcha Engedélyezése +config.active_code_lives=Aktív kód életek +config.reset_password_code_lives=Jelszó visszaállításnál használt kód elévülési ideje +config.default_keep_email_private=Email cím ne látszódjon" alapértelmezett értéke +config.default_allow_create_organization=Szervezet létrehozása jogosultság alapértelmezett értéke +config.no_reply_address=No-reply cím + +config.webhook_config=Webhook Beállítása +config.queue_length=Várakozási Sor Hossza +config.deliver_timeout=Küldés Időtúllépés +config.skip_tls_verify=A TLS hitelesítés kihagyása + +config.mailer_config=Levelező beállítások +config.mailer_enabled=Engedélyezett +config.mailer_disable_helo=HELO letiltása +config.mailer_name=Név +config.mailer_host=Kiszolgáló +config.mailer_user=Felhasználó +config.send_test_mail=Teszt E-mail küldése +config.test_mail_failed=Nem sikerült kiküldeni a teszt e-mailt '%s'-nek: %v +config.test_mail_sent=Teszt e-mail kiküldve '%s'-nek. + +config.oauth_config=OAuth-konfiguráció +config.oauth_enabled=Engedélyezett + +config.cache_config=Gyorsítótár Beállítása +config.cache_adapter=Gyorsítótár Adapter +config.cache_interval=Gyorsítótár Intervallum +config.cache_conn=Gyorsítótár Kapcsolat + +config.session_config=Munkamenet Beállítás +config.session_provider=Munkamenet Szolgáltató +config.provider_config=Szolgáltató Beállítás +config.cookie_name=Süti Név +config.enable_set_cookie=Süti használatának engedélyezése +config.gc_interval_time=GC Intervallum Idő +config.session_life_time=Munkamenet Élettartama +config.https_only=csak HTTPS +config.cookie_life_time=Süti Élettartam + +config.picture_config=Kép Beállítás +config.picture_service=Kép Szolgáltatás +config.disable_gravatar=Gravatar Kikapcsolása +config.enable_federated_avatar=Összevont profilkép lekérés engedélyezése + +config.git_config=Git Beállítás +config.git_disable_diff_highlight=Diff-nél Szintakszis kiemelés kikapcsolása +config.git_max_diff_lines=Maximális Diff sorok száma (egy fájlban) +config.git_max_diff_line_characters=Maximális Diff karakterek száma (egy sorban) +config.git_max_diff_files=Maximálisan hány fájl látszódjon Diff-ben +config.git_gc_args=Szemétgyűjtő Argumentumok +config.git_migrate_timeout=Migrációs Időtúllépés +config.git_mirror_timeout=Tükör Frissítési Időtúllépés +config.git_clone_timeout=Klónozási művelet időtúllépés +config.git_pull_timeout=Frissítő Időtúllépés +config.git_gc_timeout=Szemétgyűjtő (GC) időtúllépés + +config.log_config=Naplózási beállítások +config.log_mode=Naplózási szint + +monitor.cron=Ütemező feladatok +monitor.name=Név +monitor.schedule=Ütemezés +monitor.next=Legközelebb +monitor.previous=Legutóbb +monitor.execute_times=Futási idők +monitor.process=Futó folyamatok +monitor.desc=Leírás +monitor.start=Kezdés időpontja +monitor.execute_time=Végrehajtási idő + +notices.system_notice_list=Rendszer-értesítések +notices.view_detail_header=Értesítés részleteinek megtekintése +notices.actions=Műveletek +notices.select_all=Összes kijelölése +notices.deselect_all=Összes kijelölés törlése +notices.inverse_selection=A kijelölés megfordítása +notices.delete_selected=Kiválasztottak törlése +notices.delete_all=Minden értesítés törlése +notices.type=Típus +notices.type_1=Tároló +notices.desc=Leírás +notices.op=Op. +notices.delete_success=A rendszer-értesítések törölve lettek. + +[action] +create_repo=létrehozott tárolót: %s +rename_repo=átnevezte a %[1]s tárolót %[3]s-ra +commit_repo=feltöltött a %[3]s-ba ekkor: %[4]s +create_issue=` hibajegyet megnyitott: %s#%[2]s` +close_issue=`hibajegyet lezárt: %s#%[2]s` +reopen_issue=`újranyitott egy hibajegyet: %s#%[2]s` +create_pull_request=`létrehozott egy egyesítési kérést: %s#%[2]s` +close_pull_request=`lezárt egy egyesítési kérést: %s#%[2]s` +reopen_pull_request=`újranyitott egy egyesítési kérést: %s#%[2]s` +comment_issue=`hozzászólt egy problémához: %s#%[2]s` +merge_pull_request=`végrehajtott egy egyesítési kérést: %s#%[2]s` +transfer_repo=áthelyezett egy tárolót innen: %s ide: %s +push_tag=feltöltött egy címkét: %[2]s ide: %[3]s +compare_commits=%d commit összehasonlítása + +[tool] +ago=%s ezelőtt +from_now=%s mostantól +now=most +future=jövőbeli +1s=1 másodperc +1m=1 perc +1h=1 óra +1d=1 nap +1w=1 hét +1mon=1 hónap +1y=1 év +seconds=%d másodperc +minutes=%d perc +hours=%d óra +days=%d nap +weeks=%d hét +months=%d hónap +years=%d év +raw_seconds=másodperc +raw_minutes=perc + +[dropzone] +default_message=Húzzon ide fájlokat, vagy kattintson a feltöltéshez. +invalid_input_type=Ilyen típusú fájlt nem tölthet fel. +file_too_big=A fájl mérete ({{filesize}} MB) meghaladja a maximális méretet ({{maxFilesize}} MB). +remove_file=Fájl eltávolítása + +[notification] +notifications=Értesítések +unread=Olvasatlan +read=Olvasott +no_unread=Nincsen olvasatlan értesítés. +no_read=Nincsen olvasott értesítés. +pin=PIN értesítés +mark_as_read=Megjelölés olvasottként +mark_as_unread=Megjelölés olvasatlanként + +[gpg] +error.extract_sign=Nem sikerült kinyerni az aláírást +error.generate_hash=Nem sikerült létrehozni a commitot azonosító hash-t +error.no_committer_account=Nincsen fiók a commit szerzőjének e-mail címével +error.no_gpg_keys_found=Nem található kulcs ehhez az aláíráshoz az adatbázisban +error.not_signed_commit=Nem aláírt commit +error.failed_retrieval_gpg_keys=Nem sikerült beolvasni kulcsot a commit szerzőjének fiókjából + +[units] +error.no_unit_allowed_repo=Nem található semmi ebben a tároló egységben amihez hozzáférhet +error.unit_not_allowed=Nincsen jogosultsága ennek a tároló egységnek a megtekintéséhez + diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index afb8f6c..b7b352f 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -32,16 +32,15 @@ mirror=Mirror new_repo=Nuovo Repository new_migrate=Nuova Migrazione new_mirror=Nuovo Mirror -new_fork=Nuovo Fork Repository new_org=Nuova organizzazione manage_org=Gestisci le organizzazioni admin_panel=Pannello di amministrazione account_settings=Impostazioni dell'account settings=Impostazioni your_profile=Il tuo profilo -your_starred=I tuoi preferiti your_settings=Impostazioni + activities=Attivitá pull_requests=Pull Request issues=Problemi @@ -50,29 +49,21 @@ cancel=Annulla [install] install=Installazione -title=Passi d'installazione per il primo avvio -docker_helper=Se stai utilizzando Gitea su Docker, per favore leggi le Linee guida con attenzione prima di cambiare qualcosa su questa pagina! -requite_db_desc=Gitea necessita MySQL, PostgreSQL, SQLite3 o TiDB. db_title=Impostazioni Database db_type=Tipo di database host=Host user=Utente password=Password db_name=Nome del database -db_helper=Utilizza il motore INNODB con codifica utf8_general_ci per MySQL. ssl_mode=Modalità SSL path=Percorso -sqlite_helper=Il path assoluto per il database SQLite3 o TiDB.
Per favore usa il path assoluto quando lo avvii come servizio. err_empty_db_path=Il percorso file del database SQLite3 o TiDB non può essere vuoto. err_invalid_tidb_name=Il nome del database TiDB non ammette caratteri "." e "-". no_admin_and_disable_registration=Non puoi disabilitare la registrazione senza aver creato un amministratore. err_empty_admin_password=La password dell'amministratore non puo' essere vuota. -general_title=Impostazioni di Base dell'Applicazione app_name=Nome Applicazione -app_name_helper=Scrivi qui il nome della tua organizzazione forte e chiaro! repo_path=Percorso Root del Repository -repo_path_helper=Tutti i repository Git remoti saranno salvati in questa directory. lfs_path=Percorso file LFS lfs_path_helper=I file aggiunti con Git LFS verranno salvati in questa cartella. Lascia vuoto per disabilitare LFS. run_user=Esegui con l'utente @@ -80,11 +71,9 @@ run_user_helper=L'utente deve avere accesso al percorso root del repository e av domain=Dominio domain_helper=Questo influisce sugli URL per il clonaggio via SSH. ssh_port=Porta SSH -ssh_port_helper=Numero di porta utilizzato dal server SSH, lasciare vuoto per disabilitare l'integrazione SSH. http_port=Porta HTTP http_port_helper=Porta di ascolto dell'applicazione. app_url=URL Applicazione -app_url_helper=Questo influisce sugli URL per il clonaggio via HTTP/HTTPS e da qualche parte nella posta elettronica. log_root_path=Percorso dei log log_root_path_helper=Directory in cui scrivere i file di log. @@ -92,14 +81,10 @@ optional_title=Impostazioni Facoltative email_title=Impostazioni E-mail smtp_host=Host SMTP smtp_from=Da -smtp_from_helper=Mail da indirizzo, RFC 5322. Può essere solo un indirizzo email o il formato "Nome" . -mailer_user=E-mail del Mittente mailer_password=Password del Mittente register_confirm=Abilita Conferma di Registrazione -mail_notify=Abilita Notifiche via Email server_service_title=Impostazioni del Server e Altri Servizi offline_mode=Abilita Modalità Offline -offline_mode_popup=Disabilita il CDN anche in modalità produttiva, tutte le risorse saranno servite localmente. disable_gravatar=Disattiva il servizio Gravatar disable_gravatar_popup=Disabilita Gravatar e sorgenti customizzate, tutti gli avatar vengono caricati dagli utenti o come predefinito. federated_avatar_lookup=Abilita Ricerca di Federated Avatar @@ -110,7 +95,6 @@ enable_captcha=Abilita Captcha enable_captcha_popup=Richiedi convalida captcha per i nuovi utenti. require_sign_in_view=Abilita Richiesta di Accesso per Vedere le Pagine require_sign_in_view_popup=Solo gli utenti loggati possono vedere le pagine, i visitatori potranno vedere solo le pagine di accesso e registrazione. -admin_setting_desc="Non devi per forza creare un account admin proprio adesso, ma comunque l'utente ID=1 otterrà l'accesso da amministratore automaticamente." admin_title=Impostazioni Account Amministratore admin_name=Nome utente admin_password=Password @@ -118,20 +102,14 @@ confirm_password=Conferma Password admin_email=E-mail dell'Admin install_btn_confirm=Installare Gitea test_git_failed=Fallito il test del comando git: %v -sqlite3_not_available=Questa versione non supporta SQLite3, si prega di scaricare la versione binaria ufficiale da %s, NON la versione gobuild. -invalid_db_setting=La configurazione del database non è corretta: %v invalid_repo_path=Percorso root del repository invalido: %v -run_user_not_match=Run user non è l'utente corrente: %s -> %s -save_config_failed=Fallito il salvataggio della configurazione: %v invalid_admin_setting=Impostazioni account Admin non valide: %v -install_success=Benvenuto! Siamo felici che tu abbia scelto Gitea, buon divertimento. invalid_log_root_path=Percorso dei log invalido: %v [home] uname_holder=Nome Utente o E-mail switch_dashboard_context=Cambia Dashboard Context my_repos=I miei Repository -show_more_repos=Visualizza altre repositories... collaborative_repos=Repository Condivisi my_orgs=Le mie Organizzazioni my_mirrors=I miei Mirror @@ -145,36 +123,23 @@ users=Utenti search=Cerca [auth] -create_new_account=Crea un nuovo Account register_helper_msg=Hai già un account? Accedi ora! -social_register_helper_msg=Hai già un account? Associalo ora! disable_register_prompt=Siamo spiacenti, registrazione è stata disabilitata. Si prega di contattare l'amministratore del sito. disable_register_mail=Siamo spiacenti, la conferma di registrazione via Mail è stata disattivata. remember_me=Ricordami -forgot_password=Password dimenticata -forget_password=Password dimenticata? sign_up_now=Bisogno di un account? Iscriviti ora. -confirmation_mail_sent_prompt=Una nuova email di conferma è stata inviata a %s, verifica la tua casella di posta entro le prossime %d ore per completare la registrazione. active_your_account=Attiva il tuo Account prohibit_login=Accesso Vietato -prohibit_login_desc=Il tuo account è impossibilitato al login, contatta l'amministratore del sito. -resent_limit_prompt=Siamo spiacenti, si stanno inviando e-mail di attivazione troppo spesso. Si prega di attendere 3 minuti. has_unconfirmed_mail=Ciao %s, hai un indirizzo di posta elettronica non confermato (%s). Se non hai ricevuto una e-mail di conferma o vuoi riceverla nuovamente, fare clic sul pulsante qui sotto. resend_mail=Clicca qui per inviare nuovamente l'e-mail di attivazione -email_not_associate=Questo indirizzo e-mail non è associato ad alcun account. -send_reset_mail=Clicca qui per (ri)inviare la tua e-mail di reimpostazione password reset_password=Reimposta la tua Password -invalid_code=Siamo spiacenti, il codice di conferma è scaduto o non valido. reset_password_helper=Clicca qui per reimpostare la password password_too_short=La lunghezza della password non può essere meno %d caratteri. -non_local_account=Gli account non locali non possono modificare le password tramite Gitea. [mail] activate_account=Per favore attiva il tuo account activate_email=Verifica il tuo indirizzo e-mail reset_password=Reimposta la tua password -register_success=Registrazione completata con successo, Benvenuto -register_notify=Benvenuti a bordo [modal] yes=Sì @@ -202,8 +167,6 @@ TreeName=Percorso del file Content=Contenuto require_error=` non può essere vuoto.` -alpha_dash_error=` ammessi solo caratteri alfanumerici o trattini(-_).` -alpha_dash_dot_error=` ammessi solo caratteri alfanumerici o trattini(-_) o punti.` size_error='deve essere %s.' min_size_error=` deve contenere almeno %s caratteri.` max_size_error=` deve contenere massimo %s caratteri.` @@ -211,28 +174,10 @@ email_error=` non è un indirizzo e-mail valido.` url_error=` non è un URL valido.` include_error=` deve contenere la stringa '%s'.` unknown_error=Errore sconosciuto: -captcha_incorrect=Il Captcha non corrisponde. -password_not_match=Le due password non corrispondono. -username_been_taken=Il nome utente è già utilizzato. -repo_name_been_taken=Il nome del Repository è già utilizzato. -org_name_been_taken=Il nome dell'Organizzazione è già utlizzato. -team_name_been_taken=Il nome del Team è già utilizzato. -email_been_used=L'indirizzo E-mail è già utilizzato. -username_password_incorrect=Nome utente o password incorretti. -enterred_invalid_repo_name=Si prega di assicurarsi che il nome del repository inserito sia corretto. -enterred_invalid_owner_name=Si prega di assicurarsi che il nome del proprietario inserito sia corretto. -enterred_invalid_password=Verificare che la password inserita sia corretta. -user_not_exist=L'utente inserito non esiste. -last_org_owner=L'utente che si vuole rimuovere è l'ultimo membro admin del team. Ci deve essere un altro proprietario. -invalid_ssh_key=Siamo spiacenti, non siamo in grado di verificare la chiave SSH: %s -unable_verify_ssh_key=Gitea non può verificare la chiave SSH, ma assumiamo che sia valida, si prega di verificare voi stessi. auth_failed=Autenticazione non riuscita: %v -still_own_repo=Il tuo account possiede ancora almeno un repository, dovete prima cancellarli o trasferirne la proprietà. -still_has_org=Il tuo account è ancora associato ad almeno un'organizzazione, disassociarsi prima. -org_still_own_repo=Questa organizzazione ha ancora la proprietà del repository, dovete cancellarla o trasferirli prima. target_branch_not_exist=Il ramo (branch) di destinazione non esiste. @@ -247,14 +192,11 @@ following=Seguiti follow=Segui unfollow=Non seguire più -form.name_reserved=L'username '%s' è riservato. -form.name_pattern_not_allowed=La struttura del nome utente '%s' non è consentita. [settings] profile=Profilo password=Password avatar=Avatar -ssh_keys=Chiavi SSH social=Account Sociali applications=Applicazioni orgs=Organizzazioni @@ -262,15 +204,11 @@ delete=Elimina account twofa=Verifica in due passaggi public_profile=Profilo pubblico -profile_desc=Il tuo indirizzo e-mail è pubblico e sarà usato per ogni notifica inerente al tuo account, e per qualsiasi operazione web effettuata attraverso il sito. -password_username_disabled=Gli utenti non locali non possono cambiare il proprio nome utente. full_name=Nome Completo website=Sito web location=Posizione update_profile=Aggiorna Profilo -update_profile_success=Il tuo profilo è stato aggiornato con successo. change_username=Username Cambiato -change_username_prompt=Questa modifica influenzerà il modo in cui i link si riferiscono al tuo account. continue=Continua cancel=Annulla @@ -280,15 +218,11 @@ choose_new_avatar=Scegli un nuovo avatar update_avatar=Aggiorna le impostazioni avatar delete_current_avatar=Elimina Avatar attuale uploaded_avatar_not_a_image=Il file caricato non è un'immagine. -update_avatar_success=Le tue impostazioni avatar sono state aggiornate con successo. change_password=Cambia Password old_password=Password attuale new_password=Nuova Password retype_new_password=Re-inserisci la password -password_incorrect=La Password attuale non è corretta. -change_password_success=La tua password è stata cambiata con successo. Ora puoi accedere usando la nuova password. -password_change_disabled=Gli utenti non locali non possono cambiare la propria password. emails=Indirizzi e-mail manage_emails=Gestisci indirizzi email @@ -296,76 +230,53 @@ email_desc=Il tuo indirizzo e-mail primario sarà usato per le notifiche e altre primary=Primario primary_email=Imposta come primario delete_email=Elimina -email_deletion=Eliminazione e-mail -email_deletion_desc=La procedura di rimozione indirizzo email eliminerà tutte le informazioni correlate dal tuo account. Si desidera continuare? email_deletion_success=Indirizzo e-mail eliminato con successo! add_new_email=Aggiungi un nuovo indirizzo E-mail add_email=Aggiungi E-mail -add_email_confirmation_sent=Una nuova email di conferma è stata inviata a '%s', per favore controlla la tua posta in arrivo nelle prossime %d ore per completare il processo di registrazione. add_email_success=Il tuo nuovo indirizzo e-mail è stato aggiunto con successo. keep_email_private=Mantieni Indirizzo Email Privato keep_email_private_popup=Il tuo indirizzo email sarà nascosto agli altri utenti se questa opzione è abilitata. manage_ssh_keys=Gestisci chiavi SSH add_key=Aggiungi Chiave -ssh_desc=Questa è una lista di chiavi SSH associate al tuo account. Poiché queste chiavi consentono a chiunque di ottenere accesso alle tue repository, è molto importante che tu le riconosca. -ssh_helper=Non sai come? Controlla la guida di GitHub sul creare le tue chiavi SSH o sul risolvere problemi frequenti che potresti incontrare usando SSH. add_new_key=Aggiungi Chiave SSH -ssh_key_been_used=È stato utilizzato il contenuto della chiave pubblica. -ssh_key_name_used=Chiave pubblica con lo stesso nome esiste già. key_name=Nome della Chiave key_content=Contenuto -add_key_success=La nuova chiave SSH '%s' è stata aggiunta con successo! delete_key=Elimina ssh_key_deletion=Eliminazione chiave SSH -ssh_key_deletion_desc=Cancellare la chiave SSH rimuoverà tutti i relativi accessi per il tuo account. Vuoi continuare? -ssh_key_deletion_success=La chiave SSH e' stata cancellata con successo! add_on=Aggiunto il last_used=Ultimo accesso il no_activity=Nessuna attività recente -key_state_desc=Hai utilizzato questa chiave negli ultimi 7 giorni -token_state_desc=Questo token e' satato utilizzato negli ultimi 7 giorni manage_social=Gestisci gli Account Sociali Associati -social_desc=Questa è un elenco degli account sociali associati. Rimuovere qualsiasi account che non si riconosce. unbind=Disassocia -unbind_success=Account sociale disassociato. manage_access_token=Gestisci i Token di Accesso Personale generate_new_token=Genera Nuovo Token -tokens_desc=I Token che hai generato e che possono essere utilizzati per accedere alle API Gitea. new_token_desc=Da questo momento, ogni token avrà pieno accesso al tuo account. token_name=Nome Token generate_token=Genera Token -generate_token_succees=Nuovo token di accesso generato con successo! Assicurarsi di copiare il nuovo token di accesso personale ora: non sarà possibile visualizzarlo nuovamente! delete_token=Elimina access_token_deletion=Eliminazione Token di accesso personale -access_token_deletion_desc=Eliminare questo token di accesso personale rimuoverà tutti i relativi accessi di applicazione. Si desidera continuare? -delete_token_success=Il token di accesso personale è stato eliminato! Non dimenticare di aggiornare anche l'applicazione. -twofa_desc=Gitea ha la verifica in due passaggi per fornire ulteriore sicurezza al tuo account. -twofa_is_enrolled=La verifica in due passaggi è abilitata sul tuo account. -twofa_not_enrolled=La verifica in due passaggi al momento non è abilitata sul tuo account. twofa_disable=Disattiva verifica in due passaggi + + delete_account=Elimina Account delete_prompt=L'operazione eliminerà permanentemente l'account e NON POTRÀ essere annullata! confirm_delete_account=Conferma Eliminazione delete_account_title=Eliminazione account -delete_account_desc=Questo account sta per essere eliminato in modo definitivo, vuoi continuare? [repo] owner=Proprietario repo_name=Nome Repository -repo_name_helper=I migliori nomi dei repository sono brevi, facili da memorizzare e univoci. visibility=Visibilità visiblity_helper=Questo repository è privato -visiblity_helper_forced=L'amministratore del sito ha deciso che tutti i nuovi repository devono essere privati visiblity_fork_helper=(La modifica di questo valore avrà effetto su tutti i fork) clone_helper=Hai bisogno di aiuto per la clonazione? Visita Aiuto! fork_repo=Forka Repository fork_from=Forka da -fork_visiblity_helper=Non puoi cambiare la visibilità di un repository forkato. repo_desc=Descrizione repo_lang=Lingua repo_gitignore_helper=Seleziona i templates di .gitignore @@ -376,16 +287,11 @@ auto_init=Inizializzare questo repository con i file e il modello selezionati create_repo=Crea Repository default_branch=Ramo (Branch) predefinito mirror_prune=Rimuovi -mirror_interval=Intervallo Mirror (in ore) mirror_address=Indirizzo del mirror -mirror_address_desc=Si prega di includere nell'indirizzo le credenziali utente necessarie. watchers=Osservatori stargazers=Fan forks=Fork -form.reach_limit_of_creation=Il proprietario ha raggiunto il limite massimo di %d repository creati. -form.name_reserved=Il nome repository %s è riservato. -form.name_pattern_not_allowed=La struttura del nome del repository %s non è consentita. need_auth=Richiesta di autorizzazione migrate_type=Tipo di migrazione @@ -412,9 +318,6 @@ fork=Forka no_desc=Nessuna descrizione quick_guide=Guida rapida clone_this_repo=Clona questo repository -create_new_repo_command=Crea nuovo repository da riga di comando -push_exist_repo=Push un repo esistente dalla riga di comando -repo_is_empty=Questo repository è vuoto, si prega di tornare più tardi! code=Codice branch=Ramo (Branch) @@ -436,17 +339,16 @@ editor.new_file=Nuovo file editor.upload_file=Carica File editor.edit_file=Modifica file editor.preview_changes=Anteprima modifiche -editor.cannot_edit_non_text_files=Non è possibile modificare i file non di testo editor.edit_this_file=Modifica questo file commits.search=Ricerca una versione -commits.find=Cerca commits.author=Autore commits.message=Messaggio commits.date=Data commits.older=Più vecchio commits.newer=Più recente + issues.new=Nuovo Problema issues.new.labels=Etichette issues.new.no_label=Nessuna etichetta @@ -463,7 +365,6 @@ issues.create=Crea Problema issues.new_label=Nuova etichetta issues.new_label_placeholder=Nome dell'etichetta... issues.create_label=Crea Etichetta -issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.open_tab=%d Aperti issues.close_tab=%d Chiusi issues.filter_label=Etichetta @@ -513,8 +414,6 @@ issues.label_edit=Modifica issues.label_delete=Elimina issues.label_modify=Modifica Etichetta issues.label_deletion=Elimina Etichetta -issues.label_deletion_desc=Eliminare l'etichetta rimuovera le sue informazioni in tutti i problemi correlati. Vuoi continuare? -issues.label_deletion_success=Etichetta eliminata con successo! issues.num_participants=%d Partecipanti pulls.new=Nuova Pull Request @@ -531,13 +430,10 @@ pulls.merged_title_desc=ha unito %[1]d commit da %[2]s a %[3] pulls.tab_conversation=Conversazione pulls.tab_commits=Commit pulls.tab_files=File modificati -pulls.reopen_to_merge=Riapri questa pull request per effettuare il merge. pulls.merged=Unito -pulls.has_merged=Questo contributo è stato incluso con successo! pulls.data_broken=I dati di questa pull request si sono rotti causa dell'eliminazione delle informazioni di fork. pulls.is_checking=Il controllo dei conflitti è ancora in corso, per favore aggiorna pagina tra qualche istante. pulls.can_auto_merge_desc=La pull request non può essere mergiata automaticamente. -pulls.cannot_auto_merge_desc=Questa pull request non può essere mergiata automaticamente perchè ci sono dei conflitti. pulls.cannot_auto_merge_helper=Effettua il merge manualmente per risolvere i conflitti. pulls.merge_pull_request=Unisci Pull Request @@ -557,27 +453,22 @@ milestones.clear=Pulisci milestones.invalid_due_date_format=Il formato della data di scadenza non è valido, deve essere 'yyyy-mm-dd'. milestones.create_success=La Milestone '%s' è stata creata con successo! milestones.edit=Modifica Milestone -milestones.edit_subheader=Scrivi una descrizione della Milestone, così la gente non si confonderà. milestones.cancel=Annulla milestones.modify=Modifica Milestone milestones.edit_success=Le modifiche alla milestone '%s' sono state salvate con successo! milestones.deletion=Cancellazione Milestone -milestones.deletion_desc=L'eliminazione di questa Milestone rimuoverà le sue informazioni in tutti i problemi correlati. Si desidera continuare? milestones.deletion_success=La milestone è stata cancellata con successo! -wiki.welcome=Benvenuto nel Wiki! -wiki.welcome_desc=Wiki è il posto dove puoi documentare collaborativamente il tuo progetto così da renderlo migliore. + wiki.create_first_page=Crea la prima pagina wiki.page=Pagina wiki.filter_page=Filtra pagina wiki.new_page=Crea nuova pagina -wiki.default_commit_message=Scrivere una nota su questo aggiornamento (opzionale). wiki.save_page=Salva pagina wiki.last_commit_info=%s ha modificato questa pagina %s wiki.edit_page_button=Modifica wiki.new_page_button=Nuova pagina wiki.delete_page_button=Cancella Pagina -wiki.delete_page_notice_1=Questo cancellerà lapagina "%s". Si prega di esserne certi. wiki.page_already_exists=Esiste già una pagina Wiki con questo stesso nome. wiki.pages=Pagine wiki.last_updated=Ultimo aggiornamento: %s @@ -599,25 +490,17 @@ settings.pulls_desc=Abilita le pull requests per accettare contributi pubblici settings.danger_zone=Zona Pericolosa settings.new_owner_has_same_repo=Il nuovo proprietario ha già un repository con lo stesso nome. Per favore scegli un altro nome. settings.convert=Converti in Repository Regolare -settings.convert_desc=Puoi convertire questo mirror in un repository regolare. Questa operazione non può essere annullata. settings.convert_notices_1=- Questa operazione non potrà essere annullata e convertirà questo mirror in un repository regolare. settings.convert_confirm=Conferma la conversione -settings.convert_succeed=Il repository è stato convertito con successo al formato normale. settings.transfer=Trasferisci proprietà settings.transfer_desc=Trasferisci questa repository a un altro utente o a un'organizzazione nella quale hai diritti d'amministratore. -settings.transfer_form_title=Per favore inserisci le informazioni seguenti per confermare l'operazione: settings.wiki_delete=Elimina i dati della Wiki settings.wiki_delete_notices_1=Questo eliminerà e disabiliterà la wiki per %s -settings.wiki_deletion_success=I dati della wiki del repository sono stati eliminati con successo. settings.delete=Elimina questo repository settings.delete_desc=Una volta che hai cancellato il repository, non puoi tornare indietro. Si prega di fare attenzione. settings.delete_notices_1=-Questa operazione NON PUÒ essere annullata. -settings.delete_notices_2=-Questa operazione eliminerà definitivamente il tutto il contenuto del repository, inclusi i dati di Git, incidenti, commenti e accessi dei collaboratori. -settings.deletion_success=Il repository è stato eliminato con successo! -settings.update_settings_success=Le opzioni repository sono state aggiornate con successo. settings.transfer_owner=Nuovo Proprietario settings.make_transfer=Trasferisci -settings.transfer_succeed=Proprietà del repository trasferita con successo. settings.confirm_delete=Conferma eliminazione settings.add_collaborator=Aggiungi nuovo collaboratore settings.add_collaborator_success=Il nuovo collaboratore è stato aggiunto. @@ -629,7 +512,6 @@ settings.search_user_placeholder=Cerca utente... settings.org_not_allowed_to_be_collaborator=Un'organizzazione non può essere aggiunta come collaboratore. settings.user_is_org_member=L'utente è un membro dell'organizzazione che non può essere aggiunto come collaboratore. settings.add_webhook=Aggiungi Webhook -settings.hooks_desc=I Webhooks sono molto simili a un basilare evento trigger HTTP POST. Ogni volta che qualcosa si verifica in Gitea, tratteremo la notifica all'host di destinazione specificato. Ulteriori informazioni in questa Guida ai Webhooks. settings.webhook_deletion=Elimina Webhook settings.webhook_deletion_success=Il Webhook è stato eliminato con successo! settings.webhook.test_delivery=Test di consegna @@ -640,7 +522,6 @@ settings.githook_edit_desc=Se l'hook è inattivo, sarà presentato un contenuto settings.githook_name=Nome hook settings.githook_content=Contenuto hook settings.update_githook=Aggiorna Hook -settings.add_webhook_desc=Gitea manderà una richiesta POST all'URL specificata, insieme alle informazioni sull'evento avvenuto. Puoi anche specificare quale tipo di formato dati vorresti ottenere all'innesco dell'hook (JSON, x-www-form-urlencoded, XML, ecc). Puoi trovare più informazioni nella nostra Guida ai Webhook. settings.slack_username=Nome utente settings.slack_icon_url=URL icona settings.slack_color=Colore @@ -652,7 +533,6 @@ settings.event_create=Crea settings.event_create_desc=Branch, o tag creato settings.event_push_desc=Git push in un repository settings.active=Attivo -settings.active_helper=Anche i dettagli riguardanti l'evento che ha innescato l'hook saranno inviati. settings.add_hook_success=Il nuovo webhook è stato aggiunto. settings.update_webhook=Aggiorna Webhook settings.update_hook_success=Il webhook è stato aggiornato. @@ -672,11 +552,8 @@ settings.key_been_used=La deploy key è già in uso. settings.key_name_used=Esiste già una deploy key con questo nome. settings.add_key_success=La nuova deploy key '%s' è stata aggiunta con successo! settings.deploy_key_deletion=Elimina Deploy Key -settings.deploy_key_deletion_desc=Cancellando questa deploy key verrà rismosso ogni accesso relativo a questa repository. Vuoi continuare? -settings.deploy_key_deletion_success=Deploy key eliminata con successo! diff.browse_source=Sfoglia il codice sorgente -diff.data_not_available=Diff Data non disponibile. diff.show_diff_stats=Mostra Diff Stats diff.show_split_view=Visualizzazione separata diff.show_unified_view=Visualizzazione unificata @@ -693,7 +570,6 @@ release.ahead=%d commits da %s da questo rilascio release.source_code=Codice Sorgente release.tag_name=Nome tag release.target=Obbiettivo -release.tag_helper=Scegli un tag esistente o crea un nuovo tag una volta pubblicato. release.title=Titolo release.content=Contenuto release.write=Scrivi @@ -707,8 +583,6 @@ release.save_draft=Salva Bozza release.edit_release=Modifica Rilascio release.delete_release=Cancela questa Release release.deletion=Eliminazione Release -release.deletion_desc=Eliminando questa release cancellarai anche i tag Git corrispondenti. Vuoi continuare? -release.deletion_success=La release è stata eliminata con successo! release.tag_name_already_exist=Un rilascio con questo tag esiste già. release.downloads=Download @@ -728,9 +602,6 @@ create_new_team=Crea Nuovo Team org_desc=Descrizione team_name=Nome Team team_desc=Descrizione -team_name_helper=Verrà usato questo nome per riferirsi a questo team nella conversazioni. -team_desc_helper=In cosa consiste questo team? -team_permission_desc=Quale livello di autorizzazione dovrebbe avere questa squadra? form.name_reserved=Il nome organizzazione '%s' è riservato. form.name_pattern_not_allowed=La struttura del nome dell'organizzazione '%s' non è consentita. @@ -741,15 +612,11 @@ settings.full_name=Nome Completo settings.website=Sito Web settings.location=Residenza settings.update_settings=Aggiorna Impostazioni -settings.update_setting_success=Impostazioni dell'organizzazione aggiornate con successo. -settings.change_orgname_prompt=Questa operazione modificherà il modo in cui i links sono in relazione con l'organizzazione. settings.delete=Elimina organizzazione settings.delete_account=Elimina questa organizzazione settings.delete_prompt=L'organizzazione verrà rimossa definitivamente, e questa operazione NON PUÒ essere annullata! settings.confirm_delete_account=Conferma Eliminazione settings.delete_org_title=Eliminazione Organizzazione -settings.delete_org_desc=Questa organizzazione sta per essere eliminato in modo permanente, vuoi continuare? -settings.hooks_desc=Aggiungi i webhooks che verranno attivati per tutti i repository sotto questa organizzazione. members.public=Pubblico members.public_helper=rendi privato @@ -768,9 +635,7 @@ teams.leave=Abbandona teams.read_access=Accesso di Lettura teams.read_access_helper=Questo team sarà in grado di visualizzare e clonare i suoi repository. teams.write_access=Accesso di Scrittura -teams.write_access_helper=Questo team sarà in grado di leggere i suoi repository, come pure pusharli. teams.admin_access=Accesso Amministratore -teams.admin_access_helper=Questo team sarà in grado di pushare/pullare i propri repo, così come aggiungere altri collaboratori. teams.no_desc=Questo team non ha alcuna descrizione teams.settings=Impostazioni teams.owners_permission_desc=I Proprietari hanno pieno accesso a tutti i repository e hanno diritti di amministatore nell'organizzazione. @@ -779,8 +644,6 @@ teams.update_settings=Aggiorna Impostazioni teams.delete_team=Elimina questo Team teams.add_team_member=Aggiungere un Membro al Team teams.delete_team_title=Eliminazione Team -teams.delete_team_desc=Quando questo team verrà eliminato, i membri di questa squadra potrebbero perdere l'accesso ad alcuni repository. Si desidera continuare? -teams.delete_team_success=Team eliminato con successo. teams.read_permission_desc=Questo Team concede accesso di Lettura: i membri possono visualizzare e clonare i repository del Team. teams.write_permission_desc=Questo Team concede accesso di Scrittura: i membri possono leggere e pushare i repository del Team. teams.admin_permission_desc=Questo Team concede accesso di Amministratore: i membri possono leggere i, pushare a, e aggiungere collaboratori ai repository del Team. @@ -810,19 +673,8 @@ dashboard.statistic_info=Il database di Gitea ha %d utenti, %d org dashboard.operation_name=Nome Operazione dashboard.operation_switch=Cambia dashboard.operation_run=Esegui -dashboard.clean_unbind_oauth=Pulire OAuthes non associati -dashboard.clean_unbind_oauth_success=Tutti gli OAuthes non associati eliminati con successo. dashboard.delete_inactivate_accounts=Elimina tutti gli account inattivi -dashboard.delete_inactivate_accounts_success=Tutti gli account inattivi eliminati con successo. dashboard.delete_repo_archives=Elimina tutti gli archivi dei repository -dashboard.delete_repo_archives_success=Tutti gli archivi del repository sono stati eliminati con successo. -dashboard.git_gc_repos=Fare la procedura di garbage collection sui repository -dashboard.git_gc_repos_success=Tutti i repository hanno fatto la procedura di garbage collection con successo. -dashboard.resync_all_sshkeys=Riscrivi il file '.ssh/authorized_keys' (attenzione: le chiavi non appartenenti a Gitea saranno perse) -dashboard.resync_all_sshkeys_success=Tutte le chiavi pubbliche riscritte con successo. -dashboard.resync_all_update_hooks=Riscrivere tutti gli update hook dei repository (necessario quando il percorso di configurazione personalizzata viene modificato) -dashboard.resync_all_update_hooks_success=Tutti gli update hook dei repository riscritti con successo. - dashboard.server_uptime=Tempo in Attività del Server dashboard.current_goroutine=Goroutine Correnti dashboard.current_memory_usage=Utilizzo di Memoria Corrente @@ -853,36 +705,26 @@ dashboard.total_gc_pause=Pausa Totale della GC dashboard.last_gc_pause=Ultima pausa della GC dashboard.gc_times=Esecuzioni GC -users.user_manage_panel=Pannello Gestione Utenti users.new_account=Crea Nuovo Account users.name=Nome users.activated=Attivato users.admin=Amministratore users.repos=Repo users.created=Creato -users.new_success=Il nuovo account '%s' è stato creato correttamente. users.edit=Modifica users.local=Locale -users.update_profile_success=Profilo dell'account aggiornato con successo. users.edit_account=Modifica Account users.max_repo_creation=Limite massimo per la creazione di Repository users.max_repo_creation_desc=(Inserire -1 per usare il limite globale di default) -users.is_activated=Questo account è attivato users.is_admin=Questo account ha permessi di amministratore -users.allow_git_hook=Questo account ha il permesso di creare hooks di Git users.allow_import_local=Questo account dispone delle autorizzazioni per importare repository locali users.update_profile=Aggiornare Profilo Account users.delete_account=Elimina Questo Account -users.still_own_repo=Questo account possiede ancora almeno un repository, devi prima cancellarli o trasferirli. -users.still_has_org=Questo account appartiene ancora ad almeno un'organizzazione, è necessario prima abbandonarle o eliminale. -users.deletion_success=Account eliminato correttamente! -orgs.org_manage_panel=Pannello Gestione Organizzazioni orgs.name=Nome orgs.teams=Team orgs.members=Membri -repos.repo_manage_panel=Pannello Organizzazione Repository repos.owner=Proprietario repos.name=Nome repos.private=Privati @@ -901,7 +743,6 @@ auths.domain=Dominio auths.port=Porta auths.bind_dn=Binda DN auths.bind_password=Binda Password -auths.bind_password_helper=Attenzione: Questa password è salvata in chiaro. Non usare su un acount con alti privilegi. auths.user_dn=DN dell'utente auths.attribute_username=Attributo username auths.attribute_name=Attributo Nome @@ -918,10 +759,7 @@ auths.skip_tls_verify=Salta verifica TLS auths.pam_service_name=Nome del Servizio PAM auths.enable_auto_register=Abilitare Registrazione Automatica auths.tips=Consigli -auths.edit=Modifica impostazioni di autenticazione auths.activated=Questa Autenticazione è stata attivata -auths.update=Aggiornare le impostazioni di autenticazione -auths.delete=Elimina questa autenticazione config.server_config=Configurazione Server config.app_name=Nome Applicazione @@ -940,7 +778,6 @@ config.reverse_auth_user=Autenticazione Utente Inversa config.ssh_config=Configurazione SSH config.ssh_enabled=Attivo -config.ssh_start_builtin_server=Avvia server builtin config.ssh_domain=Dominio config.ssh_port=Porta config.ssh_listen_port=Porta in ascolto @@ -968,12 +805,10 @@ config.mail_notify=Email di Notifica config.disable_key_size_check=Disabilita controllo sulle dimensioni minime della chiave config.enable_captcha=Abilita Captcha config.active_code_lives=Attiva Vita del Codice -config.reset_password_code_lives=Reimpostare Password della Vita del Codice config.webhook_config=Configurazione Webhook config.queue_length=Lunghezza della coda config.deliver_timeout=Tempo Limite di Consegna -config.skip_tls_verify=Salta verifiche TLS config.mailer_config=Configurazione Mailer config.mailer_enabled=Attivo @@ -981,7 +816,6 @@ config.mailer_disable_helo=Disattiva HELO config.mailer_name=Nome config.mailer_user=Utente config.send_test_mail=Invia email di test -config.test_mail_failed=Impossibile inviare mail a '%s': %v config.test_mail_sent=Una mail di prova è stata inviata a '%s'. config.oauth_config=Configurazione OAuth @@ -1022,7 +856,6 @@ monitor.start=Orario Avvio monitor.execute_time=Tempo di Esecuzione notices.system_notice_list=Avvisi di Sistema -notices.view_detail_header=Visualizza dettagli dell'avviso notices.actions=Azioni notices.select_all=Seleziona tutto notices.deselect_all=Deseleziona tutto @@ -1031,7 +864,6 @@ notices.delete_selected=Elimina selezionati notices.delete_all=Elimina tutti gli avvisi notices.type=Tipo notices.desc=Descrizione -notices.delete_success=Gli avvisi di sistema sono stati successivamente eliminati. [action] create_repo=ha creato il repository %s @@ -1042,34 +874,35 @@ create_pull_request=`creata pull request %s#%[2]s` comment_issue=`ha commentato il problema %s#%[2]s` transfer_repo=ha trasferito il repository %s a %s push_tag=ha pushato il tag %[2]s a %[3]s -compare_commits=Visualizza comparazione tra questi %d commit [tool] -ago=fa -from_now=da adesso +ago=%s fa +from_now=%s da adesso now=ora -1s=1 secondo %s -1m=1 minuto %s -1h=1 ora %s -1d=1 giorno %s -1w=1 settimana %s -1mon=1 mese %s -1y=1 anno %s -seconds=%d secondi %s -minutes=%d minuti %s -hours=%d ore %s -days=%d giorni %s -weeks=%d settimane %s -months=%d mesi %s -years=%d anni %s +1s=1 secondo +1m=1 minuto +1h=1 ora +1d=1 giorno +1w=1 settimana +1mon=1 mese +1y=1 anno +seconds=%d secondi +minutes=%d minuti +hours=%d ore +days=%d giorni +weeks=%d settimane +months=%d mesi +years=%d anni raw_seconds=secondi raw_minutes=minuti [dropzone] -default_message=Trascina i file qui o clicca per caricare. invalid_input_type=Non è possibile caricare file di questo tipo. -file_too_big=La dimensione del file ({{filesize}} MB) supera la dimensione massima ({{maxFilesize}} MB). remove_file=Rimuovi file [notification] +[gpg] + +[units] + diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 5bdffb1..71836b6 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -29,7 +29,6 @@ mirror=ミラー new_repo=新しいリポジトリ new_migrate=新しい移行 new_mirror=新しいミラー -new_fork=新しいフォークのリポジトリ new_org=新しい組織 manage_org=組織を管理 admin_panel=管理者パネル @@ -38,6 +37,7 @@ settings=設定 your_profile=プロフィール your_settings=設定 + activities=アクティビティ pull_requests=プルリクエスト issues=課題 @@ -46,39 +46,29 @@ cancel=キャンセル [install] install=インストール -title=インストールをする前に必要な準備をしましょう -docker_helper=DockerでGiteaを稼動する場合は、このページに変更を加える前に、 ガイドラインをよく読んでください! -requite_db_desc=Gitea は、MySQL、PostgreSQL、SQLite3 または TiDB が必要です。 db_title=データベース設定 db_type=データベースの種類 host=ホスト user=ユーザ password=パスワード db_name=データベース名 -db_helper=MySQLではエンジンがINNODB、文字セットがutf8_general_ciである必要があります。 ssl_mode=SSL モード path=パス -sqlite_helper=SQLite3かTiDBのデータベースのファイルパス。
サービスとして開始する際には絶対パスを利用してください。 err_empty_db_path=SQLite3 または TiDB データベースのパスを空にすることはできません。 err_invalid_tidb_name=TiDB データベース名は文字"."と"-"を許可しない。 no_admin_and_disable_registration=管理者アカウントを作成せずに登録を無効にすることはできません。 err_empty_admin_password=管理者パスワードは空白にできません。 -general_title=Gitea の全般設定 app_name=アプリケーション名 -app_name_helper=素晴らしい組織名を入れてください! repo_path=リポジトリのルートパス -repo_path_helper=すべての Git リモート リポジトリはこのディレクトリに保存されます。 run_user=実行ユーザ run_user_helper=ユーザーはリポジトリ ルートパスへのアクセス、及びGitea を実行する権限を所有する必要があります。 domain=ドメイン domain_helper=これはSSH用クローンURLに影響します。 ssh_port=SSH ポート -ssh_port_helper=SSHサーバーを使用する場合はポート番号を入力してください。 空白にした場合は無効化されます。 http_port=HTTP ポート http_port_helper=アプリケーションが待ち受けするポート番号。 app_url=アプリケーションの URL -app_url_helper=この設定は、HTTP / HTTPSのクローンURLおよび、一部のメールボックスへのリンクに影響を与えます。 log_root_path=ログのパス log_root_path_helper=ログファイルを書き込むディレクトリ。 @@ -86,14 +76,10 @@ optional_title=オプション設定 email_title=メールサービス設定 smtp_host=SMTP ホスト smtp_from=差出人 -smtp_from_helper=送信者メールアドレス、RFC 5322。フォーマットはメールアドレスのみ、または"Name" 。 -mailer_user=送信者の電子メール mailer_password=送信者のパスワード register_confirm=登録の確認を有効にする -mail_notify=メール通知を有効にする server_service_title=サーバーとその他のサービスの設定 offline_mode=オフラインモードを有効にする -offline_mode_popup=プロダクションモードでは、CDNを使用せずにローカルからリソースファイルを使用します。 disable_gravatar=Gravatarのサービスを無効にします disable_gravatar_popup=Gravatarとカスタムソースを無効にして、全てのアバターをユーザーによってアップロードされたものかデフォルトなものにします。 federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. @@ -103,7 +89,6 @@ enable_captcha=Captchaを有効にする enable_captcha_popup=ユーザによる自己登録のため、有効なcaptchaが必要です。 require_sign_in_view=サインインしたユーザのみページ閲覧を許可 require_sign_in_view_popup=サインインしたユーザのみがページを閲覧できます。ビジターはサインインもしくはサインアップページのみ見られます。 -admin_setting_desc=今管理者アカウントを作成する必要はありません。ID = 1のユーザ は自動的に管理者の権限を獲得します。 admin_title=管理者アカウントの設定 admin_name=ユーザ名 admin_password=パスワード @@ -111,13 +96,8 @@ confirm_password=パスワード確認 admin_email=管理者の電子メール install_btn_confirm=Gitea をインストール test_git_failed='Git' コマンドテストに失敗: %v -sqlite3_not_available=このリリース バージョンは SQLite3 をサポートしていません。gobuild バージョンではない、公式のバイナリ バージョンを %s からダウンロードしてください。 -invalid_db_setting=データベースの設定が正しくありません: %v invalid_repo_path=リポジトリのルート パスが無効です: %v -run_user_not_match=実行ユーザーは、現在のユーザーではない: %s-> %s -save_config_failed=構成の保存に失敗した: %v invalid_admin_setting=管理者アカウントの設定が無効です: %v -install_success=ようこそ!我々はあなたが Gitea を選んでくれて嬉しいです!楽しみましょう! invalid_log_root_path=ログのルートパスがむこうです: %v [home] @@ -125,7 +105,6 @@ uname_holder=ユーザー名またはEメール password_holder=パスワード switch_dashboard_context=ダッシュ ボードのコンテキストを切替 my_repos=自分のリポジトリ -show_more_repos=リポジトリをさらに表示… collaborative_repos=共同リポジトリ my_orgs=自分の組織 my_mirrors=自分のミラー @@ -139,26 +118,16 @@ users=ユーザ search=検索 [auth] -create_new_account=新規アカウントを作成 register_helper_msg=既にアカウントをお持ちですか?今すぐログインしましょう! -social_register_helper_msg=既にアカウントをお持ちですか?連携しましょう! disable_register_prompt=申し訳ありませんが、現在登録は受け付けておりません。サイトの管理者にお問い合わせください。 disable_register_mail=申し訳ありませんが、登録メールの確認機能が無効になっています。 remember_me=ログインしたままにする -forgot_password=パスワードを忘れた -forget_password=パスワードを忘れましたか? sign_up_now=アカウントが必要ですか?今すぐ登録しましょう! -confirmation_mail_sent_prompt=新しい確認メールを %s に送りました。登録を完了させるために、%d時間以内にあなたのメールボックスを確認してください。 active_your_account=アカウントを有効化 prohibit_login=ログイン禁止 -prohibit_login_desc=あなたのアカウントはログインを禁止されています。サイト管理者にお問い合わせください。 -resent_limit_prompt=申し訳ありませんが、アクティベーションメールは頻繁に送信しています。3 分お待ちください。 has_unconfirmed_mail=こんにちは %s さん、あなたの電子メール アドレス (%s) は未確認です。もし確認メールをまだ確認できていないか、改めて再送信する場合は、下のボタンをクリックしてください。 resend_mail=アクティベーションメールを再送信するにはここをクリック -email_not_associate=この電子メール アドレスは、アカウントには関連付けられません。 -send_reset_mail=パスワードリセットのメールを再送するにはここをクリック reset_password=パスワードリセット -invalid_code=申し訳ありませんが、確認用コードが期限切れまたは無効です。 reset_password_helper=パスワードをリセットするにはここをクリック password_too_short=%d文字未満のパスワードは設定できません。 @@ -166,8 +135,6 @@ password_too_short=%d文字未満のパスワードは設定できません。 activate_account=あなたのアカウントを有効にしてください。 activate_email=電子メール アドレスを確認します。 reset_password=パスワードをリセットします. -register_success=ようこそ、登録成功 -register_notify=ボードへようこそ [modal] yes=はい @@ -189,8 +156,6 @@ AdminEmail=管理者の電子メール Content=コンテンツ require_error=空にできません -alpha_dash_error=アルファベット、数字、ハイフン"-"、アンダースコア"_"のいずれかの必要があります -alpha_dash_dot_error=' アルファベット、数値、ダッシュ(-)、アンダースコア(_) 、ドット(.)のいずれかを入力する必要があります。 ' size_error=`サイズは %s である必要があります` min_size_error=' 少なくとも %s 文字の必要があります ' max_size_error=' %s 文字以下の必要があります ' @@ -198,28 +163,10 @@ email_error=' は有効な電子メール アドレスではない ' url_error=' は有効な URL はありません。 ' include_error=' 文字列 '%s' を含める必要があります。 ' unknown_error=不明なエラー: -captcha_incorrect=Captcha が一致しませんでした。 -password_not_match=パスワードと確認用パスワードが一致同していません。 -username_been_taken=ユーザー名は既に使用されています。 -repo_name_been_taken=リポジトリ名は既に使用されています。 -org_name_been_taken=組織名は既に使用されています。 -team_name_been_taken=チーム名は既に使用されています。 -email_been_used=電子メール アドレスは既に使用されています。 -username_password_incorrect=ユーザー名またはパスワードが正しくありません。 -enterred_invalid_repo_name=入力したリポジトリの名前が正しいかどうかを確認してください。 -enterred_invalid_owner_name=入力された所有者名が正しいかどうかを確認してください。 -enterred_invalid_password=入力したパスワードが正しいかを確認してください。 -user_not_exist=指定されたユーザーは存在しません。 -last_org_owner=削除するユーザーはチームの最後のメンバーです。別の所有者設定が必要です。 -invalid_ssh_key=SSHを確認できません:%s -unable_verify_ssh_key=GiteaはあなたのSSH keyを確認できません。しかし、我々は有効とみなしますので、自分自身で確認してください。 auth_failed=認証に失敗しました: %v -still_own_repo=アカウント所有のリポジトリがあり、リポジトリの削除または所有者の移譲が必要です。 -still_has_org=アカウントはまだ組織のメンバーであり、組織から退出するか削除する必要があります。 -org_still_own_repo=この組織はまだリポジトリの所有しています、リポジトリを削除または転送する必要があります。 target_branch_not_exist=ターゲットブランチが存在しない @@ -234,29 +181,22 @@ following=フォロー follow=フォロー unfollow=フォロー解除 -form.name_reserved=ユーザー名 '%s' は予約されています。 -form.name_pattern_not_allowed=ユーザ名のパターン '%s' は許可されていません。 [settings] profile=プロフィール password=パスワード avatar=アバター -ssh_keys=SSH キー social=SNSアカウント applications=アプリケーション orgs=組織 delete=アカウントを削除 public_profile=パブリック プロフィール -profile_desc=あなたのメールアドレスは公開され、任意のアカウント関連の通知に使用されます。また、Webベースの操作はサイトを介して行います。 -password_username_disabled=ローカルユーザ以外はユーザ名を変更できません。 full_name=フルネーム website=WEBサイト location=ロケーション update_profile=プロファイル更新 -update_profile_success=あなたのプロフィールが更新されました。 change_username=ユーザー名が変更されました -change_username_prompt=この変更はリンクをアカウントに関連付ける方法に影響します。 continue=続行 cancel=キャンセル @@ -266,15 +206,11 @@ choose_new_avatar=新しいアバターを選択 update_avatar=アバターの設定を更新 delete_current_avatar=現在のアバターを削除 uploaded_avatar_not_a_image=アップロードされたファイルは画像ではない。 -update_avatar_success=あなたのアバターの設定が更新されました。 change_password=パスワードを変更 old_password=現在のパスワード new_password=新しいパスワード retype_new_password=新しいパスワードを再入力します。 -password_incorrect=現在のパスワードが正しくありません。 -change_password_success=パスワードが正常に変更されました。今すぐ新しいパスワード経由でサインインすることができます。 -password_change_disabled=ローカルユーザ以外はパスワードを変更できません。 emails=E-mail アドレス manage_emails=E-mail アドレスを管理 @@ -282,70 +218,50 @@ email_desc=あなたのプライマリメールアドレスは、通知やその primary=プライマリー primary_email=プライマリに設定 delete_email=削除 -email_deletion=電子メールの削除 -email_deletion_desc=この電子メール アドレスを削除すると、あなたのアカウントの関連情報も削除されます。続行しますか。 email_deletion_success=電子メールが正常に削除されました。 add_new_email=新しいe-mailアドレスを追加 add_email=電子メールを追加します。 -add_email_confirmation_sent='%s' に新しい確認メールを送信しました、次の %d 時間以内に受信トレイを確認し、確認プロセスを完了してください。 add_email_success=新しいe-mail アドレスが追加されました。 manage_ssh_keys=SSH キーを管理 add_key=キーを追加 -ssh_desc=これはあなたのアカウントに関連付けられている SSH キーの一覧です。あなたが認識していないキーを削除します。 -ssh_helper=ヘルプが必要ですか? 我々のガイドをご覧ください。 SSH キーを生成 SSH の一般的な問題 add_new_key=SSH キーを追加 -ssh_key_been_used=公開鍵は使用されています。 -ssh_key_name_used=同じ名前の公開鍵は既に存在しています。 key_name=キーの名前 key_content=コンテンツ -add_key_success=新しいSSHキー '%s' が正常に追加されました! delete_key=削除 ssh_key_deletion=SSH キーの削除 -ssh_key_deletion_desc=このSSHキーを削除すると、あなたのアカウントに関連するすべてのアクセスが削除されます。続行しますか? -ssh_key_deletion_success=SSH キーは正常に削除されました! add_on=追加された last_used=最終使用日 no_activity=最近の活動なし -key_state_desc=この鍵は7日間以内に使われています。 -token_state_desc=この鍵は7日間以内に使われています。 manage_social=関連付けられているSNSアカウントを管理 -social_desc=これは関連付けられたソーシャルアカウントのリストです。あなたが認識していない結び付けを削除します。 unbind=バインド解除 -unbind_success=SNSアカウントがバインドされていない。 manage_access_token=パーソナルアクセス トークンを管理 generate_new_token=新しいトークンを生成 -tokens_desc=生成したトークンを利用して Gitea の API にアクセスすることができます。 new_token_desc=今のところ、全てのトークンはあなたのアカウントにフルアクセスできます。 token_name=トークン名 generate_token=トークンを生成 -generate_token_succees=新しいアクセス トークンは正常に生成されました !今すぐあなたの新しいアクセス トークンをコピーしておいてください。二度と見ることはできませんので確認してください! delete_token=削除 access_token_deletion=パーソナルアクセストークンの削除 -access_token_deletion_desc=パーソナルアクセストークンを削除すると、関連するアプリケーションのすべてのアクセスが削除されます。続行しますか? -delete_token_success=パーソナルアクセストークンは正常に削除されました!同時にあなたのアプリケーションを更新することを忘れないでください。 + + delete_account=アカウントを削除 delete_prompt=この操作をするとアカウントが完全に削除され、二度と元に戻すことができなくなります ! confirm_delete_account=削除の確認 delete_account_title=アカウントの削除 -delete_account_desc=このアカウントは永久に削除しようとしている、継続しますか? [repo] owner=オーナー repo_name=リポジトリ名 -repo_name_helper=短くて分かりやすく重複しないリポジトリ名を決めてください。 visibility=公開/非公開 visiblity_helper=このリポジトリはプライベートです。 -visiblity_helper_forced=サイト管理者は、強制的にすべての新しいリポジトリを プライベート にしています。 visiblity_fork_helper=(この値の変更はすべてのフォークに適用されます) clone_helper=クローンに関してお困りであれば ヘルプ を参照しましょう。 fork_repo=リポジトリをフォーク fork_from=フォーク元 -fork_visiblity_helper=フォークされたリポジトリの可視状態は変更できません。 repo_desc=説明 repo_lang=言語 license=ライセンス @@ -354,14 +270,11 @@ readme_helper=Readme ファイルのテンプレートを選択 auto_init=選択されたファイルおよびテンプレートでリポジトリを初期化 create_repo=リポジトリを作成 default_branch=デフォルトのブランチ -mirror_interval=ミラー 間隔(時) mirror_address=ミラー アドレス mirror_last_synced=最終同期 watchers=ウォッチャー forks=フォーク -form.name_reserved=リポジトリ名 '%s' は使用されています。 -form.name_pattern_not_allowed=リポジトリ名に '%s' は使用できません。 need_auth=認証が必要 migrate_type=マイグレーションの種類 @@ -383,9 +296,6 @@ copied=コピー成功 no_desc=説明なし quick_guide=クイック ガイド clone_this_repo=このリポジトリのクローンを作成 -create_new_repo_command=コマンドラインで新しいリポジトリを作成します。 -push_exist_repo=コマンド ・ ラインから既存のリポジトリをプッシュ -repo_is_empty=このリポジトリは空です、後で戻って来て下さい! code=コード branch=ブランチ @@ -416,13 +326,13 @@ editor.cancel=キャンセル commits.commits=コミット commits.search=コミットの検索 -commits.find=検索 commits.author=作者 commits.message=メッセージ commits.date=日付 commits.older=古い commits.newer=新しい + issues.new=新しい問題 issues.new.labels=ラベル issues.new.no_label=ラベルなし @@ -439,7 +349,6 @@ issues.create=問題を作成 issues.new_label=新しいラベル issues.new_label_placeholder=ラベル名... issues.create_label=ラベルを作成 -issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.open_tab=%d オープン issues.close_tab=%d クローズ issues.filter_label=ラベル @@ -484,8 +393,6 @@ issues.label_edit=編集 issues.label_delete=削除 issues.label_modify=ラベルの変更 issues.label_deletion=ラベルの削除 -issues.label_deletion_desc=ラベルを削除すると、関連するすべての問題の情報が削除されます。続行しますか。 -issues.label_deletion_success=ラベルは正常に削除されました。 pulls.new=新しいプルリクエスト pulls.compare_changes=変更を比較 @@ -500,7 +407,6 @@ pulls.tab_conversation=会話 pulls.tab_commits=コミット pulls.tab_files=ファイルが変更された pulls.merged=マージされた -pulls.has_merged=このプルプルリクエストは正常にマージされました! pulls.cannot_auto_merge_helper=競合を解決するためには、手動でマージする必要があります。 pulls.merge_pull_request=プルリクエストをマージします。 @@ -520,21 +426,17 @@ milestones.clear=消去 milestones.invalid_due_date_format=期限日付のフォーマットが無効、'yyyy-mm-dd' のフォーマットが必要です。 milestones.create_success=マイルス トーン '%s' が正常に作成されました! milestones.edit=マイルス トーンを編集 -milestones.edit_subheader=人々を混乱させないため、マイルス トーンにより良い説明を使用します。 milestones.cancel=キャンセル milestones.modify=マイルス トーンを変更します。 milestones.edit_success=マイルス トーン '%s' の変更が正常に保存されました。 milestones.deletion=マイルス トーンの削除 -milestones.deletion_desc=このマイルス トーンを削除すると、関連課題に該当情報が削除されます。続行しますか。 milestones.deletion_success=マイルス トーンは正常に削除されました。 -wiki.welcome=Wiki へようこそ! -wiki.welcome_desc=Wikiとは、あなたのプロジェクトを文書化し、複数人で一緒に編集する場所です。 + wiki.create_first_page=最初のページを作成する。 wiki.page=ページ wiki.filter_page=フィルターページ wiki.new_page=新しいページを作成 -wiki.default_commit_message=このアップデートについてメモを書く(オプション) wiki.save_page=ページを保存 wiki.last_commit_info=%s このページを編集 %s wiki.edit_page_button=編集 @@ -567,18 +469,13 @@ settings.danger_zone=危険地帯 settings.new_owner_has_same_repo=新しいオーナーは、既に同じ名前のリポジトリを持っています。 settings.transfer=オーナー移転 settings.transfer_desc=リポジトリをあなたが管理者権限を持っている別のユーザーまた組織に移譲します。 -settings.transfer_notices_1=-新しい所有者が個人ユーザーの場合、あなたがアクセスできなくなります。 -settings.transfer_form_title=操作を確認するために、以下の情報を入力してください。 settings.wiki_delete=Wikiのデータ消去 settings.wiki_delete_desc=Wikiのデータを消去すると元に戻すことは出来ません。よく確認してください。 -settings.wiki_deletion_success=Wikiのデータ消去が完了しました。 settings.delete=このリポジトリを削除 settings.delete_desc=リポジトリを削除すると元に戻せません。確実に確認してください。 settings.delete_notices_1=-この操作は元に戻せません 。 -settings.update_settings_success=リポジトリ オプションが更新されました。 settings.transfer_owner=新しいオーナー settings.make_transfer=転送 -settings.transfer_succeed=リポジトリの所有権は正常に転送されました。 settings.confirm_delete=削除を確認 settings.add_collaborator=新しい共同編集者を追加 settings.add_collaborator_success=新しい共同編集者が追加されました。 @@ -587,9 +484,7 @@ settings.search_user_placeholder=Search users settings.org_not_allowed_to_be_collaborator=組織を共同編集者として追加することはできません。 settings.user_is_org_member=ユーザーは組織の一員なので、共同編集者として追加することはできません。 settings.add_webhook=Webhook を追加 -settings.hooks_desc=Webhooksは、Giteaで特定のイベントの発生時に指定された外部サービスに通知を許可します。イベントが発生すると、それぞれ指定されたUrlに、POSTリクエストが送られます。詳細はこちらのの Webhooks ガイドをご覧ください。 settings.webhook_deletion=Webhook を削除 -settings.webhook_deletion_desc=このwebhookを削除すると、すべての情報と配信履歴が削除されます。続行しますか? settings.webhook_deletion_success=Webhook が正常に削除されました。 settings.webhook.test_delivery=テスト配信 settings.webhook.request=リクエスト @@ -602,7 +497,6 @@ settings.githook_edit_desc=もしフックがアクティブではない場合 settings.githook_name=フックの名前 settings.githook_content=コンテンツをフック settings.update_githook=フックを更新 -settings.add_webhook_desc=私たちは、指定されたURLに購読されたイベントの詳細を POSTリクエストとして送信します。あなたは、異なるデータ受信モード(JSONまたは, x-www-form-urlencoded, その他) を設定することができます。詳細については、Webhookガイドを参照してください。 settings.payload_url=ペイロードの URL settings.content_type=コンテンツ タイプ settings.secret=秘密 @@ -617,7 +511,6 @@ settings.event_create_desc=ブランチ、またはタグを作成 settings.event_push=プッシュ settings.event_push_desc=Git リポジトリにプッシュ settings.active=アクティブ -settings.active_helper=このフックのトリガーが引かれた時に、イベントの詳細を配信します。 settings.add_hook_success=新しい webhook が追加されました。 settings.update_webhook=Webhookを更新 settings.update_hook_success=Webhook を更新しました。 @@ -638,13 +531,10 @@ settings.key_been_used=デプロイキーが使用されています。 settings.key_name_used=同じ名前のデプロイキーが既に存在しています。 settings.add_key_success=新しいデプロイキー '%s'が正常に追加されました! settings.deploy_key_deletion=デプロイキーを削除 -settings.deploy_key_deletion_desc=このデプロイキーを削除すると、このリポジトリに関連するすべてのアクセス権も削除されます。続行しますか。 -settings.deploy_key_deletion_success=デプロイキーが正常に削除された! diff.browse_source=ソースを参照 diff.parent=親 diff.commit=コミット -diff.data_not_available=差分データは利用できません。 diff.show_diff_stats=差分情報を表示 diff.show_split_view=分割表示 diff.stats_desc=共有%d 個のファイルを変更した%d 個の追加%d 個の削除を含む @@ -658,10 +548,8 @@ release.stable=安定 release.edit=編集 release.ahead=このリリース以降 %s へ %d コミット release.source_code=ソース コード -release.edit_subheader=詳細な変更ログは、ユーザーに何が改善されたかの理解を助けることができます。 release.tag_name=タグ名 release.target=ターゲット -release.tag_helper=既存のタグを選択するか、新しいタグを作成し発行します。 release.title=タイトル release.content=コンテント release.write=書込み @@ -675,8 +563,6 @@ release.save_draft=下書きを保存 release.edit_release=リリースを編集 release.delete_release=このリリースを削除 release.deletion=リリースの削除 -release.deletion_desc=このリリースを削除すると、対応するGitのタグも削除されます。よろしいですか? -release.deletion_success=リリースが正常に削除されました。 release.tag_name_already_exist=このタグ名には既にリリースが存在します。 @@ -695,9 +581,6 @@ create_new_team=新しいチームを作成 org_desc=説明 team_name=チーム名 team_desc=説明 -team_name_helper=会話の時、この名前を使用しチーム名を表明します。 -team_desc_helper=このチームに関する全ての情報は? -team_permission_desc=このチームに必要な権限レベルは? form.name_reserved=組織名 '%s' は予約されています。 form.name_pattern_not_allowed=組織名のパターン '%s' は許可されていません。 @@ -708,15 +591,11 @@ settings.full_name=フルネーム settings.website=WEBサイト settings.location=ロケーション settings.update_settings=設定の更新 -settings.update_setting_success=組織の設定が更新されました。 -settings.update_avatar_success=組織のアバター画像が正常に更新されました。 settings.delete=組織を削除 settings.delete_account=この組織を削除 settings.delete_prompt=この操作をすると組織が完全に削除され、二度と元に戻すことができなくなります ! settings.confirm_delete_account=削除を確認 settings.delete_org_title=組織の削除 -settings.delete_org_desc=この組織は完全に削除されます、継続しますか? -settings.hooks_desc=この組織のもとで すべてのリポジトリ に対してトリガーされる webhook を追加します。 members.public=パブリック members.public_helper=プライベートにする @@ -735,9 +614,7 @@ teams.leave=退出 teams.read_access=読み取りアクセス権 teams.read_access_helper=このチームはリポジトリの閲覧とクローンをすることができます。 teams.write_access=書き込みアクセス権 -teams.write_access_helper=このチームはリポジトリを読むだけではなく、プッシュすることもできます。 teams.admin_access=管理者のアクセス権 -teams.admin_access_helper=このチームはリポジトリにプッシュ/プル、及び他の共同編集者を追加することができます。 teams.no_desc=このチームは説明がありません。 teams.settings=設定 teams.owners_permission_desc=オーナーはすべてのリポジトリ へのフルアクセス権、組織の 管理権限を持ちます。 @@ -746,8 +623,6 @@ teams.update_settings=設定の更新 teams.delete_team=このチームを削除 teams.add_team_member=チーム メンバーを追加 teams.delete_team_title=チームの削除 -teams.delete_team_desc=このチームを削除します、継続しますか?このチームのメンバーはいくつかのリポジトリへのアクセスを失う可能性があります。 -teams.delete_team_success=指定のチームが正常に削除されました。 teams.read_permission_desc=このチームは読み取り権限を持ち: メンバーはリポジトリの表示及びクローンの作成ができます。 teams.write_permission_desc=このチームは書き込み権限を持ち: メンバーはリポジトリの表示及リポジトリへのプッシュができます。 teams.admin_permission_desc=このチームは管理者の権限を持ち: メンバーはチームのリポジトリに対して、読み取り、プッシュや共同編集者の追加ができます。 @@ -775,20 +650,8 @@ dashboard.statistic_info=Gitea データベースは %d ユーザ, %d< dashboard.operation_name=操作の名前 dashboard.operation_switch=スイッチ dashboard.operation_run=実行 -dashboard.clean_unbind_oauth=結び付けられていない OAuth をクリーン -dashboard.clean_unbind_oauth_success=結び付けられていない全ての OAuth を正常に削除しました。 dashboard.delete_inactivate_accounts=非アクティブのアカウントをすべて削除 -dashboard.delete_inactivate_accounts_success=すべての非アクティブアカウントは正常に削除されました。 dashboard.delete_repo_archives=リポジトリのすべてのアーカイブを削除 -dashboard.delete_repo_archives_success=リポジトリのすべてのアーカイブが正常に削除されました。 -dashboard.delete_missing_repos=Gitファイルが失われたリポジトリのすべてのレコードを削除 -dashboard.git_gc_repos=リポジトリでのガベージコレクションを実行します。 -dashboard.git_gc_repos_success=すべてのリポジトリは正常にガベージ コレクションを行いました。 -dashboard.resync_all_sshkeys='.ssh/ authorized_keys' ファイルを再生成します。(警告:Giteaキー以外は失われます) -dashboard.resync_all_sshkeys_success=すべての公開鍵が正常に書き換えられました。 -dashboard.resync_all_update_hooks=リポジトリの update フックをすべて再更新する(カスタムの設定パスが変更されたときに必要) -dashboard.resync_all_update_hooks_success=リポジトリの update フックがすべて正常に再更新されました。 - dashboard.server_uptime=サーバーの稼働時間 dashboard.current_goroutine=現在のGoroutine dashboard.current_memory_usage=現在のメモリ使用量 @@ -819,7 +682,6 @@ dashboard.total_gc_pause=GC一時停止の合計 dashboard.last_gc_pause=直近のGC一時停止 dashboard.gc_times=GC実行回数 -users.user_manage_panel=ユーザー管理パネル users.new_account=新規アカウントを作成 users.name=名前 users.activated=アクティブ化 @@ -827,35 +689,25 @@ users.admin=アドミン users.repos=リポジトリ users.created=作成されました users.send_register_notify=登録通知をユーザーに送信 -users.new_success=新規アカウント '%s' が正常に作成されました。 users.edit=編集 users.auth_source=認証ソース users.local=ローカル users.auth_login_name=認証ログイン名 users.password_helper=それをそのまま空のままにします。 -users.update_profile_success=アカウントのプロファイルが更新されました。 users.edit_account=アカウントの編集 -users.is_activated=アカウントがアクティブされました users.is_admin=このアカウントには管理者の権限を持つ -users.allow_git_hook=このアカウントには Git のフックを作成する権限を持つ users.update_profile=アカウント ・ プロファイルを更新 users.delete_account=このアカウントを削除 -users.still_own_repo=アカウント所有のリポジトリがあり、リポジトリの削除または所有者の移譲が必要です。 -users.still_has_org=アカウントはまだ組織のメンバーであり、組織から退出するか削除する必要があります。 -users.deletion_success=アカウントが正常に削除されました。 -orgs.org_manage_panel=組織の管理パネル orgs.name=名前 orgs.teams=チーム orgs.members=メンバー -repos.repo_manage_panel=リポジトリの管理パネル repos.owner=オーナー repos.name=名前 repos.private=プライベート repos.issues=課題 -auths.auth_manage_panel=認証管理パネル auths.new=新しいソースを追加 auths.name=名前 auths.type=タイプ @@ -867,7 +719,6 @@ auths.host=ホスト auths.port=ポート auths.bind_dn=バインド DN auths.bind_password=バインド パスワード -auths.bind_password_helper=警告: このパスワードは暗号化されずに格納されます。特権を持つアカウントに使用しないでください。 auths.user_base=ユーザ検索ベース auths.attribute_name=名前属性 auths.attribute_surname=名字属性 @@ -883,14 +734,7 @@ auths.skip_tls_verify=TLSベリファイを省略 auths.pam_service_name=PAMサービス名 auths.enable_auto_register=自動登録を有効にする auths.tips=ヒント -auths.edit=認証設定を編集 auths.activated=認証がアクティブされました -auths.new_success=新しい認証 '%s' が正常に追加されました。 -auths.update_success=認証の設定が正常に更新されました。 -auths.update=認証設定を更新 -auths.delete=この認証を削除 -auths.delete_auth_title=認証削除 -auths.delete_auth_desc=認証を削除します、継続しますか? auths.deletion_success=認証が正常に削除されました。 config.server_config=サーバーの構成 @@ -927,12 +771,10 @@ config.mail_notify=メール通知 config.disable_key_size_check=最小キー サイズ チェックを無効にします config.enable_captcha=Captchaを有効にする config.active_code_lives=コードリンクの有効期限をアクティブ -config.reset_password_code_lives=パスワードリンクの有効期限をリセット config.webhook_config=Webhook設定 config.queue_length=キューの長さ config.deliver_timeout=送信タイムアウト -config.skip_tls_verify=TLSの確認を省略 config.mailer_config=メーラーの構成 config.mailer_enabled=有効にした @@ -978,7 +820,6 @@ monitor.start=開始日時 monitor.execute_time=実行時間: notices.system_notice_list=システム通知 -notices.view_detail_header=お知らせの詳細を表示 notices.actions=アクション notices.select_all=全て選択 notices.deselect_all=すべて選択解除 @@ -989,7 +830,6 @@ notices.type=タイプ notices.type_1=リポジトリ notices.desc=説明 notices.op=Op。 -notices.delete_success=システム通知が正常に削除されました。 [action] create_repo=がリポジトリ %s を作成しました @@ -1001,34 +841,35 @@ comment_issue=`問題 %s#%[2]s のコメント` merge_pull_request=`プルリクエスト %s[2]sをマージしました` transfer_repo=リポジトリ %s%s へ転送しました push_tag=%[3]s に タグ %[2]s をプッシュしました -compare_commits=これらの %d コミットの比較を表示 [tool] -ago=前 -from_now=今から +ago=%s 前 +from_now=%s 今から now=今 -1s=1 秒 %s -1m=1 分 %s -1h=1 時間 %s -1d=1 日 %s -1w=1 週間 %s -1mon=1 ヶ月 %s -1y=1 年間 %s -seconds=%d 秒 %s -minutes=%d分%s -hours=%d 時間 %s -days=%d 日 %s -weeks=%d 週間 %s -months=%d ヶ月 %s -years=%d 年 %s +1s=1 秒 +1m=1 分 +1h=1 時間 +1d=1 日 +1w=1 週間 +1mon=1 ヶ月 +1y=1 年間 +seconds=%d 秒 +minutes=%d 分 +hours=%d 時間 +days=%d 日 +weeks=%d 週間 +months=%d ヶ月 +years=%d 年 raw_seconds=秒 raw_minutes=分 [dropzone] -default_message=ここにファイルをドロップまたはクリックしてアップロードします。 invalid_input_type=このタイプのファイルはアップロードできません. -file_too_big=ファイルのサイズ ({{filesize}} MB) では、最大サイズ ({{maxFilesize}} MB) を超えています。 remove_file=ファイル削除 [notification] +[gpg] + +[units] + diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index 01390d2..b7528d4 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -29,7 +29,6 @@ mirror=미러 new_repo=새 저장소 new_migrate=새 마이그레이션 new_mirror=새로운 미러 -new_fork=새로운 포크 저장소 new_org=새로운 조직 manage_org=조직 관리 admin_panel=관리자 패널 @@ -38,6 +37,7 @@ settings=설정 your_profile=프로필 your_settings=설정 + activities=활동 pull_requests=풀 리퀘스트 issues=이슈들 @@ -46,53 +46,39 @@ cancel=취소 [install] install=설치 -title=첫 실행을 위한 설치단계 -docker_helper=Gitea를 Docker에서 운영하고 있다면 안내를 읽고 변경해 주세요! -requite_db_desc=Gitea는 MySQL, PostgreSQL, SQLite3 또는 TiDB가 필요입니다. db_title=데이터베이스 설정 db_type=데이터베이스 유형 host=호스트 user=사용자 password=비밀번호 db_name=데이터베이스 이름 -db_helper=MySQL에서는 utf8_general_ci 캐릭터셋으로 INNODB엔진을 이용해 주세요 ssl_mode=SSL 모드 path=경로 -sqlite_helper=SQLite3 또는 TiDB 데이터베이스의 파일 경로.
서비스로 시작할 때 절대 경로를 사용하십시오. err_empty_db_path=SQLite3또는 TiDB의 DB파일 경로는 비어있을 수 없습니다. err_invalid_tidb_name=TiDB 파일 이름은 "."과 "-"를 허용하지 않습니다. no_admin_and_disable_registration=관리자 계정을 만들지 않고 등록을 비활성화할 수 없습니다. err_empty_admin_password=관리자 암호는 비워둘 수 없습니다. -general_title=애플리케이션 일반 설정 app_name=애플리케이션 이름 -app_name_helper=이곳에 조직 이름을 입력해 주세요 repo_path=저장소 최상위 경로 -repo_path_helper=모든 Git 원격 저장소는 이 디렉터리에 저장 됩니다. run_user=데몬 사용자 계정 run_user_helper=사용자 계정은 저장소에 접근할 권한과 Gitea를 실행 할 권한이 있어야 합니다. domain=도메인 domain_helper=Git SSH url에 영향을 미칩니다. ssh_port=SSH 포트 -ssh_port_helper=SSH서버가 실행되고 있는 포트를 입력하세요. 비워둘 경우 SSH를 사용하지 않습니다. http_port=HTTP 포트 http_port_helper=포트 번호는 애플리케이션에서 열고 있습니다. app_url=애플리케이션 URL -app_url_helper=이 작업은 HTTP/HTTPS 클론 URL과 이메일의 어딘가에 영향을 미칩니다. log_root_path=로그 경로 log_root_path_helper=로그 파일을 쓸 디렉터리. optional_title=추가설정 email_title=이메일 서비스 설정 smtp_host=SMTP 호스트 -smtp_from_helper=메일 발송 주소(RFC 5322). 일반적인 이메일 주소형태나 "Name" 형태를 입력할 수 있습니다. -mailer_user=발송 주소 메일 mailer_password=발송 주소의 비밀번호 register_confirm=등록 확인 활성화 -mail_notify=메일 알림 활성화 server_service_title=서버 및 기타 서비스 설정 offline_mode=오프라인 모드 활성화 -offline_mode_popup=프로덕션 모드에서도 CDN을 사용하지 않습니다. 모든 리소스가 로컬에서 전송됩니다. disable_gravatar=Gravatar 서비스를 사용 안 함 disable_gravatar_popup=Gravatar 및 사용자 지정 소스를 사용 하지 않습니다. 모든 아바타는 업로드하거나 기본 아바타가 제공됩니다. federated_avatar_lookup=연합 아바타 조회 활성화 @@ -103,7 +89,6 @@ enable_captcha=Captcha 활성화 enable_captcha_popup=사용자 등록시 캡차 요구 require_sign_in_view=페이지를 보기 위해 로그인 사용 활성화 require_sign_in_view_popup=로그인 사용자만 페이지를 볼 수 있습니다. 방문자는 로그인/가입 페이지만 볼 수 있을 것입니다. -admin_setting_desc=ID가 1인, 첫번째로 생성된 계정이 관리자 계정이 되므로, 지금 계정을 생성하지 않으셔도 됩니다. admin_title=관리자 계정 설정 admin_name=이름 admin_password=비밀번호 @@ -111,13 +96,8 @@ confirm_password=비밀번호 확인 admin_email=관리자 이메일 install_btn_confirm=Gitea 설치하기 test_git_failed='git' 명령 테스트 실패: %v -sqlite3_not_available=설치하신 버전은 SQLite3을 지원하지 않으므로, %s로부터 공식 빌드를 설치하시기 바랍니다. gobuild 버전이 아닙니다. -invalid_db_setting=데이터베이스 설정이 올바르지 않습니다: %v invalid_repo_path=저장소 루트 경로가 올바르지 않습니다: %v -run_user_not_match=실행 유저가 현재 유저가 아닙니다: %s -> %s -save_config_failed=설정을 저장할 수 없습니다: %v invalid_admin_setting=관리자 계정 설정이 잘못되었습니다: %v -install_success=환영합니다! Gitea를 선택해 주셔서 감사합니다. invalid_log_root_path=로그 루트 경로가 올바르지 않습니다: %v [home] @@ -125,7 +105,6 @@ uname_holder=사용자 이름이나 이메일 password_holder=비밀번호 switch_dashboard_context=대시보드 컨텍스트 바꾸기 my_repos=내 저장소 -show_more_repos=더 많은 저장소 보기 collaborative_repos=협업 저장소 my_orgs=내 조직 my_mirrors=내 미러 저장소들 @@ -139,36 +118,23 @@ users=유저 search=검색 [auth] -create_new_account=새 계정 생성 register_helper_msg=이미 계정을 가지고 계신가요? 로그인하세요! -social_register_helper_msg=계정을 가지고 계신가요? 연결하세요! disable_register_prompt=죄송합니다, 가입이 비활성화 되어있습니다. 사이트 관리자에게 문의 해주세요. disable_register_mail=죄송합니다. 메일 등록이 비활성화 되었습니다. remember_me=자동 로그인 -forgot_password=비밀번호 찾기 -forget_password=비밀번호를 잊으셨습니까? sign_up_now=계정이 필요하신가요? 지금 가입하세요. -confirmation_mail_sent_prompt=새로운 확인 메일이 %s로 전송되었습니다. 받은 편지함으로 도착한 메일을 %d시간 안에 확인해서 등록 절차를 완료하십시오. active_your_account=계정 활성화 prohibit_login=로그인 금지됨 -prohibit_login_desc=당신의 계정이 로그인 금지 되었습니다. 관리자에게 문의해주세요. -resent_limit_prompt=죄송합니다. 이미 최근에 활성화 메일을 요청하셨습니다. 다른 이메일 요청을 하시기 전 3분을 기다리셔야 합니다. has_unconfirmed_mail=안녕하세요 %s, 이메일 주소(%s)가 확인되지 않았습니다. 확인 메일을 받으시지 못하겼거나 새로운 확인 메일이 필요하다면, 아래 버튼을 클릭해 재발송하실 수 있습니다. resend_mail=여기를 눌러 확인 메일 재전송 -email_not_associate=이 이메일 주소로 등록된 계정이 없습니다. -send_reset_mail=여기를 눌러 비밀번호 초기화 메일을 (재)전송 reset_password=비밀번호 초기화 -invalid_code=죄송합니다. 확인 코드가 만료되었거나 유효하지 않습니다. reset_password_helper=이곳을 눌러 비밀번호를 재설정 password_too_short=비밀번호의 길이는 %d글자 미만일 수 없습니다. -non_local_account=Gitea 계정이 아니면 암호를 변경할 수 없습니다. [mail] activate_account=계정을 활성화하세요 activate_email=이메일 주소 확인 reset_password=비밀번호 초기화 -register_success=등록 성공, 환영합니다. -register_notify=잘 오셨습니다 [modal] yes=예 @@ -195,8 +161,6 @@ TreeName=파일 경로 Content=컨텐츠 require_error=` 비어 있을 수 없습니다.` -alpha_dash_error=`은(는) 숫자, 알파벳, 대시(-_) 문자로만 구성되어야 합니다.` -alpha_dash_dot_error=` 숫자, 알파벳, 점(.), 대시(-_) 문자로만 구성되어야 합니다.` size_error=` %s 글자여야 합니다.` min_size_error=` 최소 %s 글자여야 합니다.` max_size_error=` %s 글자를 넘을 수 없습니다.` @@ -204,28 +168,10 @@ email_error=` 올바른 이메일 주소가 아닙니다.` url_error=` 올바른 URL이 아닙니다.` include_error=` 반드시 '%s'를 포함해야 합니다.` unknown_error=알 수 없는 오류: -captcha_incorrect=보안문자가 일치하지 않습니다. -password_not_match=비밀번호와 비밀번호 확인이 동일하지 않습니다. -username_been_taken=이미 사용중인 사용자 이름입니다. -repo_name_been_taken=이미 사용중인 저장소 이름입니다. -org_name_been_taken=이미 사용중인 조직 이름입니다. -team_name_been_taken=이미 사용중인 팀 이름입니다. -email_been_used=이미 사용중인 이메일 주소입니다. -username_password_incorrect=사용자 이름이나 비밀번호가 올바르지 않습니다. -enterred_invalid_repo_name=입력한 저장소 이름이 올바른지 확인하십시오. -enterred_invalid_owner_name=입력한 사용자 이름이 올바른지 확인하십시오. -enterred_invalid_password=입력한 비밀번호가 올바른지 확인하십시오. -user_not_exist=존재하지 않는 사용자입니다. -last_org_owner=소유자 팀에서 마지막 사용자를 제거하는 것은 허용되지 않습니다. 최소한 한명의 소유자가 있어야 합니다. -invalid_ssh_key=죄송합니다. SSH 키를 확인할 수 없습니다: %s -unable_verify_ssh_key=Gitea에서 SSH 키를 검증할 수 없었지만 유효한 키로 가정하였습니다. 키가 올바른지 다시 확인해 주세요. auth_failed=인증 실패: %v -still_own_repo=하나 이상의 저장소를 소유하고 있습니다. 저장소를 삭제하거나 다른사람에게 이전해야 합니다. -still_has_org=하나 이상의 조직의 멤버로 소속되어 있습니다. 탈퇴하거나 조직을 삭제해야 합니다. -org_still_own_repo=조직이 소유하고 있는 저장소가 있습니다. 삭제하거나 이전해야 합니다. target_branch_not_exist=대상 브랜치가 존재하지 않습니다. @@ -240,29 +186,22 @@ following=팔로우 중 follow=추적하기 unfollow=추적해제 -form.name_reserved=사용자 이름 '%s'는 예약되어 있습니다. -form.name_pattern_not_allowed=사용자 이름 패턴 '%s'은 허용 되지 않습니다. [settings] profile=프로필 password=비밀번호 avatar=아바타 -ssh_keys=SSH 키 social=소셜 계정 applications=애플리케이션 orgs=조직 delete=계정 삭제 public_profile=공개 프로필 -profile_desc=이메일 주소가 공개되며, 사이트를 통해 작업하거나 계정과 관련된 모든 알림에 사용됩니다. -password_username_disabled=내부계정이 아닌 유형의 사용자는 이름 변경이 허용되지 않습니다. full_name=성명 website=웹 사이트 location=위치 update_profile=프로필 업데이트 -update_profile_success=프로필이 성공적으로 업데이트 되었습니다. change_username=사용자명 변경 -change_username_prompt=이 변경은 당신의 계정과 연관된 모든 링크에 영향을 줍니다. continue=계속하기 cancel=취소 @@ -273,15 +212,11 @@ choose_new_avatar=새로운 아바타 선택 update_avatar=아바타 설정 업데이트 delete_current_avatar=현재 아바타 삭제 uploaded_avatar_not_a_image=업로드 된 파일은 이미지가 아닙니다. -update_avatar_success=아바타 설정을 성공적으로 변경하였습니다. change_password=비밀번호 변경 old_password=현재 비밀번호 new_password=새 비밀번호 retype_new_password=새 비밀번호 다시 입력 -password_incorrect=현재 비밀번호가 잘못되었습니다. -change_password_success=비밀번호가 성공적으로 변경되었습니다. 이제 새로운 비밀번호로 로그인할 수 있습니다. -password_change_disabled=로컬이 아닌 사용자는 자기 암호를 변경할 수 없습니다. emails=이메일 주소 manage_emails=이메일 주소 관리 @@ -289,70 +224,50 @@ email_desc=주 사용 이메일 주소는 알림과 기타 작업에 사용됩 primary=기본 primary_email=기본으로 설정 delete_email=삭제 -email_deletion=이메일 삭제 -email_deletion_desc=이메일 주소를 삭제하면 당신의 계정과 연관된 정보도 함께 삭제됩니다. 계속 하시겠습니까? email_deletion_success=이메일 주소를 성공적으로 삭제되하였습니다! add_new_email=새 이메일 주소 추가 add_email=이메일 추가 -add_email_confirmation_sent=새로운 이메일 주소 인증이 '%s'로 발송되었습니다. %d시간 안에 확인 절차를 완료하셔야 합니다. add_email_success=새로운 이메일 주소를 성공적으로 추가하였습니다. manage_ssh_keys=SSH 키 관리 add_key=키 추가 -ssh_desc=다음은 이 계정과 연결된 SSH키 목록입니다. 이 키들은 누구든지 당신의 모든 저장소에 접근할 수 있게 해줍니다. 매우 중요한 것이므로 직접 등록한 것인지 확인하십시오. -ssh_helper=방법을 모르나요?SSH key에 대한 Github의 가이드를 참조하거나 SSH를 사용하면서 생길 수 있는 문제를 해결하세요 add_new_key=SSH 키 추가 -ssh_key_been_used=공개키 내용이 사용 되었습니다. -ssh_key_name_used=같은 이름의 공개키가 이미 존재합니다. key_name=키 이름 key_content=컨텐츠 -add_key_success=새로운 SSH 키 '%s'가 성공적으로 추가 되었습니다! delete_key=삭제 ssh_key_deletion=SSH 키 삭제 -ssh_key_deletion_desc=이 SSH키를 삭제하면 관계된 계정의 모든 접근권한이 삭제됩니다. 계속 하시겠습니까? -ssh_key_deletion_success=SSH key가 삭제되었습니다. add_on=추가 : last_used=마지막 사용 : no_activity=최근 활동 없음 -key_state_desc=이 키는 최근 1주일 동안 사용된 적이 있습니다. -token_state_desc=이 토큰은 최근 1주일 동안 사용된 적이 있습니다. manage_social=SNS계정 관리 -social_desc=연결된 SNS계정 리스트입니다. 직접 로그인 하지 않은 계정은 연결을 해제하세요. unbind=해제 -unbind_success=SNS계정이 연결 해제되었습니다. manage_access_token=개인 액세스 토큰 관리 generate_new_token=새 토큰을 생성 -tokens_desc=Gitea Api에 액세스 하는 데 사용할 수 있는 토큰입니다. new_token_desc=각 토큰은 당신의 모든 권한을 행사할 수 있습니다. token_name=토큰 이름 generate_token=토큰 생성 -generate_token_succees=액세스 토큰이 생성되었습니다. 이번에만 확인할 수 있으니 잘 보관하세요. delete_token=삭제 access_token_deletion=개인 액세스 토큰 삭제 -access_token_deletion_desc=이 토큰을 사용하는 애플리케이션의 접근권한 또한 삭제됩니다. 계속 하시겠습니까? -delete_token_success=액세스 토큰이 삭제되었습니다. 애플리케이션의 업데이트도 잊지 마세요. + + delete_account=계정 삭제 delete_prompt=당신의 계정을 삭제합니다. 완료된 후에는 취소할 수 없습니다. confirm_delete_account=삭제 승인 delete_account_title=계정 삭제 -delete_account_desc=이 계정은 영구적으로 삭제 될 것입니다. 계속 하시겠습니까? [repo] owner=소유자 repo_name=저장소 이름 -repo_name_helper=좋은 저장소 이름은 짧고 기억하기 좋은 유니크한 키워드로 이루어 집니다. visibility=가시성 visiblity_helper=이 저장소는 비공개 저장소입니다 -visiblity_helper_forced=사이트 관리자가 모든 저장소를 비공개로 변경하였습니다. visiblity_fork_helper=(이 값의 변경은 모든 포크에 영향을 줍니다) clone_helper=클론하는데에 도움이 필요하면 Help에 방문하세요. fork_repo=저장소 포크 fork_from=원본 프로젝트 : -fork_visiblity_helper=포크한 저장소의 공개 설정을 변경할 수 없습니다. repo_desc=설명 repo_lang=언어 repo_gitignore_helper=.gitignore 서식을 선택합니다 @@ -363,18 +278,12 @@ auto_init=선택한 파일과 템플릿으로 이 저장소를 초기화 합니 create_repo=저장소 만들기 default_branch=기본 브랜치 mirror_prune=정리 -mirror_prune_desc=원격에 존재하지 않는 모든 원격 추적 참조들을 제거 -mirror_interval=미러링 주기 (시간) mirror_address=미러 대상 주소 -mirror_address_desc=주소에 필요한 자격 증명을 포함하십시오. mirror_last_synced=마지막으로 동기화됨 watchers=주시하고 있는 사람들 stargazers=별을 준 사람들 forks=포크 -form.reach_limit_of_creation=소유자가 저장소 만들기 최대 제한에 (%d개) 도달했습니다. -form.name_reserved=저장소 이름 '%s'은 예약 되어 있습니다. -form.name_pattern_not_allowed=저장소 이름 패턴 '%s'은 허용 되지 않습니다. need_auth=인증 필요 migrate_type=마이그레이션 유형 @@ -397,9 +306,6 @@ fork=포크 no_desc=설명 없음 quick_guide=퀵 가이드 clone_this_repo=이 저장소 복제 -create_new_repo_command=커맨드 라인에서 새 저장소 만들기 -push_exist_repo=커맨드 라인에서 기존 저장소 푸시하기 -repo_is_empty=이 저장소는 비어 있습니다. 나중에 다시 와주세요! code=코드 branch=브렌치 @@ -422,7 +328,6 @@ editor.new_file=파일 생성 editor.upload_file=파일 업로드 editor.edit_file=파일 수정 editor.preview_changes=변경내용 미리보기 -editor.cannot_edit_non_text_files=텍스트가 아닌 파일을 편집할 수 없습니다. editor.edit_this_file=해당 파일 편집 editor.must_be_on_a_branch=파일 변경을 제안하려면 해당하는 브랜치에 있어야 합니다. editor.fork_before_edit=파일을 편집 하기 전에 이 저장소를 포크 해야 합니다. @@ -448,7 +353,6 @@ editor.branch_already_exists=이 저장소에 브랜치 '%s'가 이미 존재합 editor.directory_is_a_file=항목 '%s'의 상위 경로는 이 저장소의 디렉토리가 아닌 파일입니다. editor.filename_is_a_directory=파일명 '%s'는 이 저장소에 이미 존재하는 디렉토리명입니다. editor.file_editing_no_longer_exists=편집중인 파일 '%s'는 저장소에 더 이상 존재하지 않습니다. -editor.file_changed_while_editing=편집을 시작한 이후 파일 내용이 변경되었습니다. 변경된 내용을 보려면 여기를 누르십시오. 변경 사항을 덮어 쓰려면 다시 커밋을 누르십시오. editor.file_already_exists=이 저장소에 이름이 '%s'인 파일이 이미 존재합니다. editor.no_changes_to_show=표시할 변경사항이 없습니다. editor.fail_to_update_file=파일 '%s'를 변경/추가 하는데 실패하였습니다. 에러: %v @@ -458,13 +362,13 @@ editor.upload_files_to_dir=파일 업로드 '%s' commits.commits=커밋 commits.search=커밋 검색 -commits.find=찾기 commits.author=작성자 commits.message=메시지 commits.date=날짜 commits.older=이전 commits.newer=최신 + issues.new=새로운 이슈 issues.new.labels=레이블 issues.new.no_label=레이블 없음 @@ -482,7 +386,6 @@ issues.new_label=새로운 레이블 issues.new_label_placeholder=레이블 이름... issues.create_label=레이블 만들기 issues.label_templates.title=사전정의 라벨 로드 -issues.label_templates.info=아직 라벨이 없습니다. 위의 '새 라벨' 버튼을 클릭하여 라벨을 하나 만들거나 사전정의 세트를 사용할 수 있습니다. issues.label_templates.helper=라벨 세트 선택 issues.label_templates.use=라벨 세트 사용 issues.label_templates.fail_to_load_file=라벨 템플릿 파일 '%s'를 로드하는데 실패하였습니다.: %v @@ -538,8 +441,6 @@ issues.label_edit=수정 issues.label_delete=삭제 issues.label_modify=레이블 수정 issues.label_deletion=레이블 삭제 -issues.label_deletion_desc=이 라벨 삭제시 관련된 모든 이슈도 제거 됩니다. 계속 하시겠습니까? -issues.label_deletion_success=라벨이 성공적으로 삭제 되었습니다! issues.num_participants=참여자 %d명 issues.attachment.open_tab=`클릭하여 "%s" 새탭으로 보기` issues.attachment.download=' "%s"를 다운로드 하려면 클릭 하십시오 ' @@ -559,16 +460,12 @@ pulls.merged_title_desc=%[2]s 에서 %[3]s 로 %[1]d c pulls.tab_conversation=대화 pulls.tab_commits=커밋 pulls.tab_files=파일 변경됨 -pulls.reopen_to_merge=머지 작업을 수행하려면 이 풀리퀘스트를 다시 열어주세요. pulls.merged=병합 -pulls.has_merged=이 풀리퀘스트가 성공적으로 머지되었습니다! pulls.data_broken=fork 정보의 삭제로 인해 이 풀리퀘스트의 데이터는 손상되었습니다. pulls.is_checking=아직 컨플릭트 여부 체크 중입니다, 잠시 후 이 페이지를 리프레시 해주세요. pulls.can_auto_merge_desc=이 풀리퀘스트는 자동적으로 머지될 수 있습니다. -pulls.cannot_auto_merge_desc=컨플릭이 존재해서 이 풀리퀘스트는 자동을 머지될 수 없습니다. pulls.cannot_auto_merge_helper=컨플릭을 해결하려면 수동으로 머지해 주십시오. pulls.merge_pull_request=풀리퀘스트 머지 -pulls.open_unmerged_pull_exists=`같은 리파지토리에서 같은 머지 정보로 만들어진 풀리퀘스트 (#%d) 가 이미 오픈 상태이고 머지를 기다리고 있기 때문에 다시 열기 작업을 할 수 없습니다.` milestones.new=새로운 마일스톤 milestones.open_tab=%d개 열림 @@ -586,27 +483,22 @@ milestones.clear=지우기 milestones.invalid_due_date_format=기한일 형식이 잘못되었습니다 'yyyy-mm-dd'. milestones.create_success=마일스톤 '%s'가 생성되었습니다! milestones.edit=마일스톤 편집 -milestones.edit_subheader=마일스톤에 대한 자세한 설명을 기술하여 사용자들의 이해를 도우세요. milestones.cancel=취소 milestones.modify=마일스톤 수정 milestones.edit_success=마일스톤 '%s'의 변경사항이 성공적으로 저장되었습니다. milestones.deletion=마일스톤 삭제 -milestones.deletion_desc=이 마일스톤 삭제시 관련된 모든 이슈도 제거 됩니다. 계속 하시겠습니까? milestones.deletion_success=마일스톤이 성공적으로 삭제 되었습니다! + wiki=위키 -wiki.welcome=위키에 오신것을 환영합니다! -wiki.welcome_desc=위키는 프로젝트를 문서화 하고 더 좋게 만들어 나가는 곳입니다. wiki.create_first_page=첫 번째 페이지 만들기 wiki.page=페이지 wiki.new_page=새 페이지 만들기 -wiki.default_commit_message=이 업데이트에 대한 메모를 작성하세요.(선택사항) wiki.save_page=페이지 저장하기 wiki.last_commit_info=%s이(가) %s에 이 페이지를 수정함 wiki.edit_page_button=수정하기 wiki.new_page_button=새로운 페이지 wiki.delete_page_button=페이지 삭제 -wiki.delete_page_notice_1=이것은 페이지 %s 를 삭제할 것입니다. 다시 한번 확인하세요. wiki.page_already_exists=같은 이름의 위키 페이지가 이미 존재 합니다. wiki.pages=페이지 wiki.last_updated=마지막 업데이트: %s @@ -621,7 +513,6 @@ settings.collaboration.undefined=미정의 settings.basic_settings=기본 설정 settings.mirror_settings=미러 설정 settings.sync_mirror=지금 동기화 -settings.mirror_sync_in_progress=미러 동기화 진행 중입니다. 약 1분 뒤에 페이지를 새로 고침 하세요. settings.site=공식 사이트 settings.update_settings=설정 저장 settings.advanced_settings=고급 설정 @@ -642,29 +533,18 @@ settings.pulls_desc=끌어오기 요청을 공개적으로 기여받을 수 있 settings.danger_zone=위험 설정 settings.new_owner_has_same_repo=새로운 소유자가 같은 이름의 저장소를 이미 가지고 있습니다. 다른 이름을 선택해주세요. settings.convert=일반 리파지토리로 변환 -settings.convert_desc=이 미러를 일반 리파지토리로 변환할 수 없습니다. 반대로는 할 수 없습니다. settings.convert_notices_1=- 이 작업은 저장소 미러를 일반 저장소로 변환하며 취소할 수 없습니다. settings.convert_confirm=변환 확인 -settings.convert_succeed=저장소를 일반 형식으로 변환하는데 성공하였습니다. settings.transfer=소유권 이전 settings.transfer_desc=이 저장소를 다른 사용자 또는 관리자 권한이 있는 조직으로 이전하십시오. -settings.transfer_notices_1=- 새 소유자가 개인 사용자인 경우 접근 권한을 잃게됩니다. -settings.transfer_notices_2=- 새 소유자가 조직이고 소유자인 경우 접근 권한이 유지됩니다. -settings.transfer_form_title=작업을 확인하려면 다음 정보를 입력하십시오. settings.wiki_delete=위키 데이터 지우기 settings.wiki_delete_desc=위키 데이터를 지우고 나면 되돌릴 수 없습니다. 다시 한번 확인하세요. settings.wiki_delete_notices_1=- 이것은 %s의 Wiki를 비활성화 시키고 삭제할 것입니다. -settings.wiki_deletion_success=저장소의 Wiki 데이터가 성공적으로 삭제 되었습니다. settings.delete=이 저장소 삭제 settings.delete_desc=저장소를 지우고 나면 되돌릴 수 없습니다. 다시 한번 확인하세요. settings.delete_notices_1=- 이 작업은 취소할 수 없습니다. -settings.delete_notices_2=- 이 작업은 저장소의 모든 항목을 영구적으로 삭제합니다. Git 데이터, 이슈, 주석 및 공동 작업자의 액세스를 포함합니다. -settings.delete_notices_fork_1=- 모든 포크들은 삭제 후에도 독립적으로 유지됩니다. -settings.deletion_success=저장소가 성공적으로 삭제 되었습니다! -settings.update_settings_success=저장소 옵션이 성공적으로 업데이트 되었습니다. settings.transfer_owner=새 소유자 settings.make_transfer=저장소 전송 -settings.transfer_succeed=저장소 소유권을 성공적으로 이전했습니다. settings.confirm_delete=삭제 확인 settings.add_collaborator=새 공동작업자 추가 settings.add_collaborator_success=새로운 공동작업자가 추가 되었습니다. @@ -676,13 +556,10 @@ settings.search_user_placeholder=사용자 검색... settings.org_not_allowed_to_be_collaborator=조직을 공동 작업자로 추가할 수 없습니다. settings.user_is_org_member=사용자가 조직 구성원이므로 공동 작업자로 추가할 수 없습니다. settings.add_webhook=Webhook 추가 -settings.hooks_desc=웹후크는 기본적인 HTTP POST 이벤트 트리거입니다. Gitea에서 무슨 일이 발생할 때마다, 지정한 대상 호스트에 알림을 보냅니다. 웹후크 안내서에서 자세히 알아보십시오. settings.webhook_deletion=Webhook 삭제 -settings.webhook_deletion_desc=이 웹훅을 삭제하면 정보와 모든 전송기록이 제거됩니다. 계속 하시겠습니까? settings.webhook_deletion_success=Webhook을 성공적으로 삭제했습니다! settings.webhook.test_delivery=전달 시험 settings.webhook.test_delivery_desc=가짜 푸시 이벤트 전달하여 웹훅 설정을 테스트합니다. -settings.webhook.test_delivery_success=Webhook 테스트가 delivery 큐에 추가되었습니다. delivery 기록에서 나오기까지 몇 초의 시간이 걸릴 것입니다. settings.webhook.request=요청 settings.webhook.response=응답 settings.webhook.headers=제목 @@ -693,7 +570,6 @@ settings.githook_edit_desc=후크가 비활성인 경우 샘플 콘텐츠가 표 settings.githook_name=Hook 이름 settings.githook_content=Hook 내용 settings.update_githook=Hook 갱신 -settings.add_webhook_desc=Gitea는 발생한 이벤트와 관련하여 지정한 URL로 POST 요청을 보냅니다. 또한 후크를 트리거 할 때 어떤 데이터 형식을 사용할지 지정할 수 있습니다.(JSON, x-www-form-urlencoded, XML 등) 자세한 내용은 웹훅 안내서를 참조하십시오. settings.payload_url=페이로드 URL settings.content_type=컨텐츠 타입 settings.secret=비밀 @@ -711,7 +587,6 @@ settings.event_pull_request_desc=끌어오기 요청 열기, 닫기, 다시 열 settings.event_push=푸시 settings.event_push_desc=깃 저장소로 푸시 settings.active=활성 -settings.active_helper=후크를 트리거하면 이벤트에 대한 세부 정보도 전달됩니다. settings.add_hook_success=새로운 웹훅이 생성되었습니다. settings.update_webhook=Webhook 갱신 settings.update_hook_success=웹훅이 업데이트 되었습니다. @@ -732,13 +607,10 @@ settings.key_been_used=배포 키 컨텐츠가 사용되었습니다. settings.key_name_used=동일한 이름 가진 배포 키가 이미 존재합니다. settings.add_key_success=새로운 배포 키 '%s'가 성공적으로 추가 되었습니다! settings.deploy_key_deletion=배포 키 삭제 -settings.deploy_key_deletion_desc=이 배포키를 삭제하면 이 저장소와 관련된 모든 접근 권한이 삭제됩니다. 계속 하시겠습니까? -settings.deploy_key_deletion_success=배포 키가 성공적으로 삭제되었습니다! diff.browse_source=소스 검색 diff.parent=부모 diff.commit=커밋 -diff.data_not_available=아직 변경 데이터를 사용할 수 없습니다. diff.show_diff_stats=변경상태 보기 diff.show_split_view=분할 보기 diff.show_unified_view=통합 보기 @@ -755,11 +627,8 @@ release.stable=안정 release.edit=편집 release.ahead=이 릴리스 이후로 %d %s에 커밋합니다. release.source_code=소스 코드 -release.new_subheader=릴리스를 게시하여 제품 반복하기. -release.edit_subheader=상세한 변경 로그는 개선된 내용을 사용자가 이해할 수 있도록 도와줍니다. release.tag_name=태그 이름 release.target=대상 -release.tag_helper=태그를 선택하거나 새로운 태그를 만들어 게시 release.title=제목 release.content=컨텐츠 release.write=쓰기 @@ -773,8 +642,6 @@ release.save_draft=초안 저장 release.edit_release=릴리즈 편집 release.delete_release=이 릴리즈를 삭제 release.deletion=릴리즈 삭제 -release.deletion_desc=이 릴리즈를 삭제하면 깃 태그도 삭제됩니다. 정말로 진행하시겠습니까? -release.deletion_success=릴리즈가 성공적으로 삭제되었습니다! release.tag_name_already_exist=이 태그 이름을 가진 릴리즈가 이미 존재합니다. release.tag_name_invalid=태그 명이 올바르지 않습니다. release.downloads=다운로드 @@ -795,9 +662,6 @@ create_new_team=새로운 팀 생성 org_desc=설명 team_name=팀 이름 team_desc=설명 -team_name_helper=대화에서 이 팀을 언급할 때 이 이름을 사용합니다. -team_desc_helper=이 팀은 무엇입니까? -team_permission_desc=이 팀이 가진 권한이 무엇입니까? form.name_reserved=조직이름 '%s'는 예약되어있습니다. form.name_pattern_not_allowed=조직이름 패턴 '%s'는 허용되지 않았습니다. @@ -808,16 +672,11 @@ settings.full_name=성명 settings.website=웹 사이트 settings.location=위치 settings.update_settings=설정 업데이트 -settings.update_setting_success=조직 설정이 성공적으로 변경되었습니다. -settings.change_orgname_prompt=이 변경은 이 저장소와 연관된 조직들에 영향을 줄 것입니다. -settings.update_avatar_success=조직 아바타 설정을 성공적으로 변경하였습니다. settings.delete=조직 삭제 settings.delete_account=이 조직을 삭제합니다. settings.delete_prompt=조직이 영구적으로 삭제됩니다. 그리고 취소할 수 없습니다. settings.confirm_delete_account=삭제 승인 settings.delete_org_title=조직 삭제 -settings.delete_org_desc=이 조직이 영구적으로 삭제됩니다. 정말로 진행하시겠습니까? -settings.hooks_desc=이 조직의 모든 저장소에서 실행되는 웹훅을 추가합니다. members.membership_visibility=회원 표시: members.public=공개 @@ -837,9 +696,7 @@ teams.leave=탈퇴 teams.read_access=읽기 접근 teams.read_access_helper=이 팀이 저장소들을 복제하거나 열람할 수 있게됩니다. teams.write_access=쓰기 접근 -teams.write_access_helper=이 팀이 저장소들을 읽거나 푸시할 수 있게 됩니다. teams.admin_access=관리자 접근 -teams.admin_access_helper=이 팀이 저장소들을 푸시하거나 끌어오고, 새로운 공동 작업자를 추가할 수 있게됩니다. teams.no_desc=이 팀은 설명이 없습니다. teams.settings=설정 teams.owners_permission_desc=소유자는 모든 저장소에 대한 모든 권한을 가지며 조직에 관리자 권한을 가지고 있습니다. @@ -848,8 +705,6 @@ teams.update_settings=설정 업데이트 teams.delete_team=이 팀을 삭제하기 teams.add_team_member=팀 구성원 추가 teams.delete_team_title=팀 삭제 -teams.delete_team_desc=이 팀을 삭제하면 몇몇 저장소에대해 팀 구성원이 접근 권한을 잃게됩니다. 계속하시겠습니까? -teams.delete_team_success=팀이 성공적으로 삭제되었습니다. teams.read_permission_desc=이 팀의 읽기 권한을 부여: 회원은 이 팀의 저장소를 보거나 복제할 수 있습니다. teams.write_permission_desc=이 팀의 쓰기 권한을 부여: 회원은 이 팀의 저장소를 읽거나 푸시할 수 있습니다. teams.admin_permission_desc=이 팀의 관리자 권한을 부여: 회원은 이 팀의 저장소를 읽거나 푸시하거나 추가하고 공동 작업자를 추가할 수 있습니다. @@ -879,23 +734,8 @@ dashboard.statistic_info=Gitea 데이터베이스에는 %d명의 사용 dashboard.operation_name=작업 명 dashboard.operation_switch=스위치 dashboard.operation_run=실행 -dashboard.clean_unbind_oauth=연결되지 않은 OAuth들을 정리 -dashboard.clean_unbind_oauth_success=연결되지 않은 모든 OAuth들이 성공적으로 삭제되었습니다. dashboard.delete_inactivate_accounts=활성화되지 않은 모든 계정을 삭제합니다. -dashboard.delete_inactivate_accounts_success=활성화 되지 않은 모든 계정들이 성공적으로 삭제되었습니다. dashboard.delete_repo_archives=모든 저장소와 아카이브를 삭제합니다. -dashboard.delete_repo_archives_success=모든 저장소와 아카이브가 성공적으로 삭제되었습니다. -dashboard.delete_missing_repos=깃 파일들을 잃어버린 모든 저장소를 삭제합니다. -dashboard.delete_missing_repos_success=깃 파일을 잃은 모든 저장소가 성공적으로 삭제되었습니다. -dashboard.git_gc_repos=저장소들의 가비지 콜렉션을 진행합니다. -dashboard.git_gc_repos_success=모든 저장소의 가비지 콜렉션이 성공적으로 완료되었습니다. -dashboard.resync_all_sshkeys='.ssh/authorized_keys' 파일을 다시 작성합니다. (주의: non-Gitea키는 손실됩니다) -dashboard.resync_all_sshkeys_success=모든 공개키들이 성공적으로 재작성되었습니다. -dashboard.resync_all_update_hooks=모든 저장소의 업데이트 훅들을 재작성합니다. (사용자 설정 경로가 변경될때 필요) -dashboard.resync_all_update_hooks_success=모든 저장소의 업데이트 훅이 성공적으로 재작성되었습니다. -dashboard.reinit_missing_repos=깃 파일들을 잃어버린 모든 저장소를 다시 초기화합니다. -dashboard.reinit_missing_repos_success=깃 파일을 잃은 모든 저장소를 다시 초기화 하는데 성공하였습니다. - dashboard.server_uptime=서버를 켠 시간 dashboard.current_goroutine=현재 Go루틴 dashboard.current_memory_usage=현재 메모리 사용율 @@ -926,7 +766,6 @@ dashboard.total_gc_pause=모든 가비지 콜렉션 중지 dashboard.last_gc_pause=마지막 가비지 콜렉션 중지 dashboard.gc_times=가비지 콜렉션 시간 -users.user_manage_panel=사용자 관리 패널 users.new_account=새 계정 생성 users.name=이름 users.activated=활성화됨 @@ -934,40 +773,29 @@ users.admin=관리자 users.repos=저장소 users.created=작성일 users.send_register_notify=사용자에게 등록 알림 보내기 -users.new_success=새로운 계정 '%s'가 성공적으로 생성 되었습니다. users.edit=수정하기 users.auth_source=인증 소스 users.local=로컬 users.auth_login_name=인증 로그인 이름 users.password_helper=변경되지 않은 상태로 두려면 비워둡니다. -users.update_profile_success=프로필이 성공적으로 업데이트 되었습니다. users.edit_account=계정 설정 users.max_repo_creation=최대 저장소 생성 제한 users.max_repo_creation_desc=(-1로 설정하면 전역 기본 제한을 따릅니다.) -users.is_activated=계정이 활성화되었습니다. -users.prohibit_login=이 계정은 로그인할 수 없습니다. users.is_admin=이 계정은 관리자 권한이 있습니다. -users.allow_git_hook=이 계정은 깃훅을 생성할 수 있습니다. users.allow_import_local=이 계정은 로컬 저장소 가져오기 권한이 있습니다. users.update_profile=프로필 변경 users.delete_account=계정 삭제 -users.still_own_repo=이 계정은 하나 이상의 저장소를 소유하고 있습니다. 먼저 저장소를 삭제하거나 다른 사람에게 이전해야 합니다. -users.still_has_org=이 계정은 하나 이상의 조직의 멤버로 소속되어 있습니다. 먼저 탈퇴하거나 조직을 삭제해야 합니다. -users.deletion_success=계정이 성공적으로 삭제되었습니다. -orgs.org_manage_panel=조직 관리 패널 orgs.name=이름 orgs.teams=팀 orgs.members=멤버 -repos.repo_manage_panel=저장소 관리 패널 repos.owner=소유자 repos.name=이름 repos.private=비공개 repos.watches=지켜보기 repos.issues=이슈 -auths.auth_manage_panel=인증 관리 패널 auths.new=새로운 소스를 추가 auths.name=이름 auths.type=유형 @@ -981,7 +809,6 @@ auths.host=호스트 auths.port=포트 auths.bind_dn=DN 연결 auths.bind_password=비밀번호 연결 -auths.bind_password_helper=경고: 이 암호는 일반 텍스트로 저장됩니다. 높은 권한의 계정을 사용하지 마십시오. auths.user_base=사용자 검색 기준 auths.user_dn=사용자 DN auths.attribute_username=유저 명 속성 @@ -996,21 +823,12 @@ auths.smtp_auth=SMTP 인증 유형 auths.smtphost=SMTP 호스트 auths.smtpport=SMTP 포트 auths.allowed_domains=허용된 도메인 -auths.allowed_domains_helper=도메인을 제안하지 않으려면 비워둡니다. 여러 도메인은 ',' 콤마를 이용해 구분합니다. auths.enable_tls=TLS 암호화 활성화 auths.skip_tls_verify=TLS 검증 건너뛰기 auths.pam_service_name=PAM 서비스 명 auths.enable_auto_register=자동 등록을 활성화 auths.tips=도움말 -auths.edit=인증 설정 편집 auths.activated=이 인증정보는 활성화되어있습니다. -auths.new_success=새로운 인증 '%s'가 성공적으로 추가 되었습니다. -auths.update_success=인증 설정이 성공적으로 변경되었습니다. -auths.update=인증 설정 업데이트 -auths.delete=이 인증을 삭제합니다. -auths.delete_auth_title=인증 삭제 -auths.delete_auth_desc=이 인증이 삭제됩니다. 정말로 진행하시겠습니까? -auths.still_in_used=이 인증은 아직 몇몇 사용자들이 사용하고 있습니다, 먼저 사용자들의 로그인 유형을 삭제하거나 변경해주십시오. auths.deletion_success=인증이 성공적으로 삭제 되었습니다! config.server_config=서버 설정 @@ -1030,7 +848,6 @@ config.reverse_auth_user=역방향 사용자 인증 config.ssh_config=SSH 설정 config.ssh_enabled=활성화됨 -config.ssh_start_builtin_server=빌트인 서버 시작 config.ssh_domain=도메인 config.ssh_port=포트 config.ssh_listen_port=수신 대기 포트 @@ -1059,12 +876,10 @@ config.mail_notify=메일 알림 config.disable_key_size_check=최소 키 크기 검사를 비활성화 config.enable_captcha=Captcha 활성화 config.active_code_lives=코드 만료 기한 -config.reset_password_code_lives=비밀번호 코드 만료 기한 config.webhook_config=웹훅 설정 config.queue_length=큐 길이 config.deliver_timeout=시간 제한 사용 -config.skip_tls_verify=TLS 확인 건너뛰기 config.mailer_config=메일러 설정 config.mailer_enabled=활성화됨 @@ -1073,7 +888,6 @@ config.mailer_name=이름 config.mailer_host=호스트 config.mailer_user=사용자 config.send_test_mail=테스트 이메일 보내기 -config.test_mail_failed='%s'로 테스트 이메일을 보내는데 실패하였습니다.: %v config.test_mail_sent='%s'로 테스트 이메일을 보냈습니다. config.oauth_config=OAuth 설정 @@ -1126,7 +940,6 @@ monitor.start=시작 시간 monitor.execute_time=실행 시간 notices.system_notice_list=시스템 공지 -notices.view_detail_header=공지 세부사항 보기 notices.actions=동작 notices.select_all=모두 선택 notices.deselect_all=모두 선택 해제 @@ -1137,7 +950,6 @@ notices.type=유형 notices.type_1=저장소 notices.desc=설명 notices.op=일. -notices.delete_success=시스템 알림들이 성공적으로 삭제되었습니다. [action] create_repo=저장소를 만들었습니다. %s @@ -1153,34 +965,35 @@ comment_issue=`이슈에 댓글이 달렸습니다. %s # merge_pull_request=`병합된 끌어오기 요청 %s #%[2]s` transfer_repo=%s에서 %s로 저장소가 전송되었습니다. push_tag=태그 %[2]s%[3]s로 푸시함 -compare_commits=이 %d개의 커밋에 대한 비교 보기 [tool] -ago=전 -from_now=지금부터 +ago=%s 전 +from_now=%s 지금부터 now=현재 -1s=1 초 %s -1m=1 분 %s -1h=1 시간 %s -1d=1 일 %s -1w=1 주 %s -1mon=1 개월 %s -1y=1 년 %s -seconds=%d 초 %s -minutes=%d 분 %s -hours=%d 시간 %s -days=%d 일 %s -weeks=%d 주 %s -months=%d 달 %s -years=%d 년 %s +1s=1 초 +1m=1 분 +1h=1 시간 +1d=1 일 +1w=1 주 +1mon=1 개월 +1y=1 년 +seconds=%d 초 +minutes=%d 분 +hours=%d 시간 +days=%d 일 +weeks=%d 주 +months=%d 달 +years=%d 년 raw_seconds=초 raw_minutes=분 [dropzone] -default_message=여기에 파일을 끌어 놓거나 클릭하여 업로드하세요. invalid_input_type=이 종류의 파일은 업로드할 수 없습니다. -file_too_big=파일 크기({{filesize}} MB)가 최대 크기({{maxFilesize}} MB)를 초과합니다. remove_file=파일 제거 [notification] +[gpg] + +[units] + diff --git a/options/locale/locale_lt-LT.ini b/options/locale/locale_lt-LT.ini new file mode 100644 index 0000000..e530a3b --- /dev/null +++ b/options/locale/locale_lt-LT.ini @@ -0,0 +1,344 @@ + +home=Pagrindinis +dashboard=Skydelis +explore=Naršyti +help=Pagalba +sign_in=Prisijungti +sign_out=Atsijungti +sign_up=Registruotis +register=Užsiregistruoti +website=Tinklalapis +version=Versija +page=Puslapis +template=Šablonas +language=Kalba +notifications=Pranešimai +create_new=Sukurti... +user_profile_and_more=Vartotojo profilis ir daugiau +signed_in_as=Prisijungta kaip + +username=Vartotojo vardas +email=El. paštas +password=Slaptažodis +re_type=Iš naujo įveskite +captcha=Saugos kodas +twofa=Dviejų-žingsnių atpažinimas + +repository=Saugykla +organization=Organizacija +mirror=Veidrodis +new_repo=Nauja saugykla +new_mirror=Naujas veidrodis +new_org=Nauja organizacija +manage_org=Valdyti organizacijas +account_settings=Paskyros nustatymai +settings=Nustatymai +your_profile=Jūsų profilis +your_settings=Jūsų parametrai + + +activities=Veiklos +issues=Problemos + +cancel=Atšaukti + +[install] +install=Diegimas +db_title=Duombazės nustatymai +db_type=Duomenų bazės tipas +host=Serveris +user=Vartotojas +password=Slaptažodis +db_name=Duomenų bazės pavadinimas +ssl_mode=SSL režimas +path=Kelias +err_empty_db_path=SQLite3 arba TiDB duomenų bazės kelias negali būti tuščias. +err_invalid_tidb_name=TiDB duomenų bazės pavadinime negalima naudoti simbolių "." ir "-". +no_admin_and_disable_registration=Jūs negalite išjungti registravimo nesukūrę administratoriaus paskyros. +err_empty_admin_password=Administratoriaus slaptažodis negali būti neįvestas. + +app_name=Programos pavadinimas +repo_path=Saugyklos šakninis kelias +lfs_path=FTP šakninis kelias +run_user=Paleisti vartotoju +domain=Domenas +ssh_port=SSH prievadas +http_port=HTTP prievadas +log_root_path=Žurnalo kelias + +optional_title=Pasirenkami nustatymai +smtp_host=SMTP serveris +smtp_from=Nuo +mailer_password=Siuntėjo slaptažodis +admin_name=Vartotojo vardas +admin_password=Slaptažodis +confirm_password=Patvirtinkite slaptažodį + +[home] +uname_holder=Naudotojo vardas ar el. paštas +password_holder=Slaptažodis +my_repos=Mano saugyklos +my_orgs=Mano organizacijos +my_mirrors=Mano veidrodžiai +view_home=Rodyti %s +search_repos=Rasti saugyklą... + +issues.in_your_repos=Savo saugyklose + +[explore] +repos=Saugyklos +users=Vartotojai +organizations=Organizacijos +search=Ieškoti + +[auth] +register_helper_msg=Jau turite paskyrą? Prisijunkite dabar! +disable_register_prompt=Atsiprašome, registracija yra išjungta. Prašome susisiekti su svetainės administratoriumi. +remember_me=Prisiminti mane +sign_up_now=Reikia paskyros? Prisiregistruokite dabar. +active_your_account=Aktyvinkite savo paskyrą +prohibit_login=Prisijungimas uždraustas +resend_mail=Spauskite čia norėdami persiųsti aktyvacijos laišką +reset_password=Atstatyti slaptažodį +reset_password_helper=Paspauskite čia norėdami pakeisti savo slaptažodį +password_too_short=Slaptažodis negali būti trumpesnis nei %d simbolių. +verify=Patikrinti + +[mail] +activate_account=Prašome suaktyvinti savo paskyrą +activate_email=Patvirtinkite savo elektroninio pašto adresą +reset_password=Atstatyti slaptažodį + +[modal] +yes=Taip +no=Ne +modify=Pakeisti + +[form] +UserName=Vartotojo vardas +RepoName=Saugyklos pavadinimas +Email=El. pašto adresas +Password=Slaptažodis +Retype=Pakartokite slaptažodį +SSHTitle=SSH rakto pavadinimas +HttpsUrl=HTTPS URL +TeamName=Komandos pavadinimas +AdminEmail=Administratoriaus el. paštas + +TreeName=Failo kelias +Content=Turinys + +unknown_error=Nežinoma klaida: + + +auth_failed=Autentifikacija nepavyko: %v + + + +[user] +change_avatar=Pakeisti savo avatarą +join_on=Prisijungė +repositories=Saugyklos +activity=Viešas aktyvumas +followers=Stebėtojai +starred=Žvaigždute pažymėtos saugyklos +following=Stebi +follow=Sekti +unfollow=Nebesekti + + +[settings] +profile=Profilis +password=Slaptažodis +avatar=Avataras +social=Socialinės paskyros +applications=Programos +orgs=Organizacijos +delete=Panaikinti paskyrą +twofa=Dviejų faktorių atpažinimas +uid=Uid + +update_profile=Atnaujinti profilį +continue=Tęsti +cancel=Atšaukti + +choose_new_avatar=Pasirinkite naują avatarą + +change_password=Pakeisti slaptažodį +old_password=Dabartinis slaptažodis +new_password=Naujas slaptažodis +retype_new_password=Pakartokite slaptažodį + +emails=El. pašto adresai +manage_emails=Tvarkyti el. pašto adresus +email_desc=Jūsų pagrindinis elektroninio pašto adresas bus naudojamas pranešimams ir kitoms operacijoms. +primary=Pagrindinis +primary_email=Nustatyti kaip pagrindinį +delete_email=Pašalinti +email_deletion_success=El. pašto adresas panaikintas sėkmingai! +add_new_email=Pridėti naują el. pašto adresą +keep_email_private=Išlaikyti elektroninio pašto adresą privatų + +manage_ssh_keys=Valdyti SSH raktus +add_key=Pridėti raktą +add_new_key=Pridėti SSH raktą +key_name=Rakto pavadinimas +key_content=Turinys +delete_key=Pašalinti +ssh_key_deletion=SSH raktų naikinimas +add_on=Pridėtas +last_used=Paskutinį kartą naudotas +no_activity=Nėra neseniai atliktų veiksmų + +unbind=Atsieti + +manage_access_token=Tvarkyti asmeninės prieigos žetonus +generate_new_token=Sukurti naują žetoną +new_token_desc=Kiekvienas žetonas turės visišką prieigą prie jūsų paskyros. +token_name=Žetono vardas +generate_token=Sukurti naują žetoną +delete_token=Pašalinti +access_token_deletion=Asmeninės prieigos žetono naikinimas + +twofa_disable=Išjungti dviejų žingsnių atpažinimą +twofa_enroll=Įjungti dviejų žingsnių atpažinimą +twofa_disable_note=Jei reikia, galite išjungti dviejų žingsnių atpažinimą. + + + + +[repo] +repo_desc=Aprašymas +repo_lang=Kalba +repo_gitignore_helper=Pasirinkite .gitignore šablonus +license=Licencija +license_helper=Pasirinkite licencijos failą +readme=Readme +readme_helper=Pasirinkti readme šabloną +auto_init=Inicijuoti šią saugyklą su pažymėtais failais ir šablonais +create_repo=Sukurti saugyklą +mirror_address=Veidrodžio adresas +mirror_last_synced=Paskutinį kartą sinchronizuota +watchers=Stebėtojų + + +migrate.clone_address_desc=Tai gali būti HTTP/HTTPS/GIT URL +migrate.clone_local_path=arba vietinio serverio kelias + +mirror_from=veidrodis +copy_link=Kopijuoti +copy_link_success=Nukopijuota! +copy_link_error=Paspauskite ⌘-C arba Ctrl-C, kad nukopijuotumėte +copied=Nukopijuota sėkmingai +unwatch=Nebestebėti +watch=Stebėti +download_archive=Atsisiųsti šią saugyklą + +no_desc=Nėra aprašymo + +code=Kodas +issues=Problemos + +editor.edit_this_file=Redaguoti šį failą +editor.delete_this_file=Ištrinti šį failą +editor.file_delete_success=Sėkmingai panaikintas failas '%s'! +editor.name_your_file=Pavadinkite failą... +editor.or=arba +editor.cancel_lower=atšaukti +editor.add=Pridėti '%s' +editor.update=Atnaujinti '%s' +editor.delete=Pašalinti '%s' +editor.cancel=Atšaukti + +commits.author=Autorius +commits.message=Žinutė +commits.date=Data +commits.older=Senesni +commits.newer=Naujesni + + +issues.new=Nauja problema +issues.new.labels=Etiketės +issues.new.no_label=Be etiketės +issues.new.clear_labels=Išvalyti etiketes +issues.open_tab=%d atidaryta +issues.close_tab=%d uždaryta +issues.filter_label=Etiketė +issues.filter_label_no_select=Nėra pasirinktos etiketės +issues.filter_type=Tipas +issues.filter_type.all_issues=Visos problemos +issues.filter_type.assigned_to_you=Priskirta jums +issues.filter_type.created_by_you=Jūsų sukurta +issues.filter_type.mentioning_you=Jūs paminėti +issues.filter_sort=Rikiuoti +issues.filter_sort.latest=Naujausi +issues.filter_sort.oldest=Seniausi +issues.filter_sort.recentupdate=Vėliausiai atnaujinti +issues.filter_sort.leastupdate=Seniausiai atnaujinti +issues.filter_sort.mostcomment=Daugiausia komentuojami +issues.filter_sort.leastcomment=Mažiausiai komentuojami +issues.previous=Ankstesnis +issues.next=Kitas +issues.open_title=Atidarytas +issues.closed_title=Uždarytas +issues.num_comments=%d komentarų +issues.commented_at=`komentavo %s"` +issues.delete_comment_confirm=Ar tikrai norite pašalinti šį komentarą? +issues.no_content=Dar nėra jokio turinio. +issues.close_issue=Užverti +issues.close_comment_issue=Komentuoti ir užverti +issues.reopen_issue=Iš naujo atidaryti +issues.reopen_comment_issue=Komentuoti ir iš naujo atidaryti +issues.create_comment=Komentuoti +issues.owner=Savininkas +issues.edit=Redaguoti +issues.cancel=Atšaukti +issues.save=Saugoti + + + + + + + + + +[org] + + + + + +[admin] + + + + + + + + + + + + + + + + + + + + +[action] + +[tool] + +[dropzone] + +[notification] + +[gpg] + +[units] + diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 9a7e5b0..d387d0b 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -5,14 +5,18 @@ dashboard=Infopanelis explore=Izpētīt help=Palīdzība sign_in=Pierakstīties +sign_in_with=Autorizēties ar sign_out=Izrakstīties sign_up=Reģistrēties +link_account=Saistītie konti +link_account_signin_or_signup=Autorizējieties ar esošo lietotāja vārdu un paroli, lai piesaistītu esošam kontam, vai reģistrējieties, ja nepieciešams izveidot jaunu register=Reģistrēties website=Mājas lapa version=Versija page=Lapa template=Sagatave language=Valoda +notifications=Paziņojumi create_new=Izveidot... user_profile_and_more=Lietotāja profilu un vairāk signed_in_as=Pierakstījies kā @@ -22,6 +26,9 @@ email=E-pasts password=Parole re_type=Parole atkārtoti captcha=Pārbaudes kods +twofa=Divu faktoru autentifikācija +twofa_scratch=Divu faktoru vienreizējais kods +passcode=Kods repository=Repozitorijs organization=Organizācija @@ -29,15 +36,22 @@ mirror=Spogulis new_repo=Jauns repozitorijs new_migrate=Jauna migrācija new_mirror=Jauns spogulis -new_fork=Jauns atdalītais repozitorijs +new_fork=Jauns atdalīts repozitorijs new_org=Jauna organizācija manage_org=Pārvaldīt organizācijas admin_panel=Admin panelis account_settings=Konta iestatījumi settings=Iestatījumi your_profile=Tavs profils +your_starred=Tavi atzīmētie ar zvaigznīti your_settings=Tavi iestatījumi +all=Visi +sources=Avoti +mirrors=Spoguļi +collaborative=Sadarbības +forks=Atdalītie + activities=Aktivitāte pull_requests=Izmaiņu pieprasījumi issues=Problēmas @@ -46,8 +60,8 @@ cancel=Atcelt [install] install=Instalācija -title=Instalācijas soļi pirmo reizi palaižot -docker_helper=Ja Gitea tiek lietots zem Docker, izlasiet uzmanīgi vadlīnijas, pirms ko maināt šajā lapā! +title=Sākotnējā konfigurācija +docker_helper=Ja Gitea ir uzstādīts Docker konteinerī, izlasiet vadlīnijas pirms ko mainiet šajā lapā. requite_db_desc=Gitea nepieciešams MySQL, PostgreSQL, SQLite3 vai TiDB. db_title=Datu bāzes iestatījumi db_type=Datu bāzes veids @@ -64,21 +78,23 @@ err_invalid_tidb_name=TiDB datu bāzes nosaukums nevar saturēt simbolus "." un no_admin_and_disable_registration=Reģistrāciju nevar atslēgt, kamēr nav izveidots administratora konts. err_empty_admin_password=Administratora kontam ir obligāti jānorāda parole. -general_title=Gitea vispārīgie iestatījumi +general_title=Vispārīgie iestatījumi app_name=Lietotnes nosaukums -app_name_helper=Norādiet organizācijas nosaukumu šeit! +app_name_helper=Šeit var ievadīt savas organizācijas nosaukumu. repo_path=Repozitoriju glabāšanas vieta -repo_path_helper=Visi Git attālinātie repozitoriji tiks glabāti šajā direktorijā. +repo_path_helper=Visi Git repozitoriji tiks glabāti šajā direktorijā. +lfs_path=LFS saknes ceļš +lfs_path_helper=Git LFS glabātie faili tiks saglabāti šajā direktorijā. Atstājiet tukšu, ja nevēlaties izmantot LFS. run_user=Izpildes lietotājs run_user_helper=Lietotājam ir jābūt rakstīšanas tiesībām repozitorija saknes direktorijai un Gitea jābūt palaistam zem šī lietotāja. domain=Domēns domain_helper=Tas ietekmē SSH klonēšanas URL. ssh_port=SSH ports -ssh_port_helper=Porta numurs, kuru izmanto Jūsu SSH serveris, atstājiet tukšu, ja nevēlaties izmantot SSH. +ssh_port_helper=Ports, kuru izmantot SSH serverim. Var atstāt tukšu, ja SSH serveri nav nepieciešams iespējot. http_port=HTTP ports http_port_helper=Porta numurs pēc kura lietojumprogrammai būs iespējams pieslēgties. app_url=Lietotnes URL -app_url_helper=Tas ietekmē HTTP/HTTPS klonēšanas URL un e-pasta saturā izsūtītās saites. +app_url_helper=Tas ietekmē HTTP/HTTPS klonēšanas URL un dažus e-pasta paziņojumus. log_root_path=Žurnalizēšanas direktorija log_root_path_helper=Direktorija, kurā tiks glabāti žurnāla faili. @@ -87,13 +103,13 @@ email_title=E-pasta pakalpojuma iestatījumi smtp_host=SMTP resursdators smtp_from=Sūtītājs smtp_from_helper=E-pasta adrese, RFC 5322. Drīkst būt vienkārši e-pasta adrese vai formātā "Nosaukums" . -mailer_user=Sūtītāja e-pasta adrese +mailer_user=Nosūtīšanas lietotājs mailer_password=Sūtītāja parole register_confirm=Iespējot reģistrēšanās apstiprināšanu mail_notify=Iespējot e-pasta paziņojumus server_service_title=Servera un citu servisu iestatījumi offline_mode=Iespējot bezsaistes režīmu -offline_mode_popup=Atspējot CDN arī produkcijas režīmā, visi resursu faili tiks piegādāti no servera. +offline_mode_popup=Atspējot CDN, lai visi resursa faili tiktu ņemti lokāli. disable_gravatar=Atspējot Gravatar pakalpojumu disable_gravatar_popup=Atspējot Gravatar un citus avotus, visus avatarus augšupielādēts lietotāji vai izmantos noklusēto attēlu. federated_avatar_lookup=Iespējot apvienoto profila bilžu meklētāju @@ -104,7 +120,7 @@ enable_captcha=Iespējot drošības kodu enable_captcha_popup=Lietotājam reģistrējoties, pieprasīt ievadīt drošības kodu. require_sign_in_view=Iespējot nepieciešamību autorizēties, lai aplūkotu lapas require_sign_in_view_popup=Tika autorizēti lietotāji var aplūkot lapas, neautorizēti lietotāji var piekļūt tikai autorizācijas un reģistrēšanās lapām. -admin_setting_desc=Nav nepieciešams izveidot administratora kontu uzreiz, lietotājs ar ID=1 saņems administratora tiesības automātiski. +admin_setting_desc=Nav nepieciešams izveidot administratora kontu uzreiz, pirmais reģistrētais lietotājs saņems administratora tiesības automātiski. admin_title=Admin konta iestatījumi admin_name=Lietotājvārds admin_password=Parole @@ -112,64 +128,91 @@ confirm_password=Apstipriniet paroli admin_email=Administratora e-pasts install_btn_confirm=Instalēt Gitea test_git_failed=Kļūda pārbaudot 'git' komandu: %v -sqlite3_not_available=Jūsu versija neatbalsta SQLite3, lūdzu lejupielādējiet oficiālo bināro versiju no %s, NEVIS gobuild versiju. -invalid_db_setting=Datu bāzes iestatījums nav pareizs: %v +sqlite3_not_available=Jūsu pašreizējā versija neatbalsta SQLite3, lūdzu lejupielādējiet oficiālo bināro versiju no %s, NEVIS gobuild versiju. +invalid_db_setting=Datu bāzes iestatījums ir kļūdains: %v invalid_repo_path=Repozitorija atrašanās vieta ir nekorekta: %v run_user_not_match=Izpildes lietotājs nav pašreizējais lietotājs: %s -> %s save_config_failed=Neizdevās saglabāt konfigurāciju: %v invalid_admin_setting=Nekorekts admin konta iestatījums: %v -install_success=Laipni lūdzam! Mēs priecājamies, ka Jūs izvēlaties Gitea, patīkamu lietošanu! +install_success=Laipni lūdzam! Paldies, ka izvēlējāties Gitea, patīkamu lietošanu. invalid_log_root_path=Norādītā žurnalizēšanas direktorija ir kļūdaina: %v +default_keep_email_private=Noklusētā pazīme, ka e-pasts ir privāts +default_keep_email_private_popup=Šī ir noklusētā pazīme, lai noteiktu lietotāja e-pasta adreses redzamību. Atzīmējot to e-pasta adrese visiem jaunajiem lietotājiem nebūs redzama līdz lietotājs neizmainīs to savos iestatījumos. +default_allow_create_organization=Pēc noklusējuma ļaut jauniem lietotājiem veidot organizācijas +default_allow_create_organization_popup=Atzīmējiet šo pazīmi, ja vēlaties, lai jauniem lietotājiem pēc noklusējuma tiek piešķirtas tiesības veidot organizācijas. +no_reply_address=Neatbildēt adrese +no_reply_address_helper=Domēns lietotaja e-pasta adresei git žurnālos, ja lietotājs izvēlas paturēt savu e-pasta adresi privātu. Piemēram, ja lietotājs ir 'janis' un domēns 'neatbildet.piemers.lv', tad e-pasta adrese būs 'janis@neatbildet.piemers.lv' [home] uname_holder=Lietotājvārds vai e-pasts password_holder=Parole switch_dashboard_context=Mainīt infopaneļa kontekstu my_repos=Mani repozitoriji -show_more_repos=Parādīt vairāk repozitorojus... +show_more_repos=Parādīt vairāk repozitorijus ... collaborative_repos=Sadarbības repozitoriji my_orgs=Manas organizācijas my_mirrors=Mani spoguļi view_home=Skatīties %s +search_repos=Meklēt repozitoriju... issues.in_your_repos=Jūsu repozitorijos [explore] repos=Repozitoriji users=Lietotāji +organizations=Organizācijas search=Meklēt +repo_no_results=Netika atrasts neviens repozitorijs, kas atbilstu kritērijiem. +user_no_results=Netika atrasts neviens lietotājs, kas atbilstu kritērijiem. +org_no_results=Netika atrasta neviena organizācija, kas atbilstu kritērijiem. [auth] -create_new_account=Izveidot jaunu kontu +create_new_account=Izveidot kontu register_helper_msg=Jau ir konts? Pieraksties tagad! -social_register_helper_msg=Jau ir konts? Sasaisti tagad! +social_register_helper_msg=Jau ir konts? Pievienojies! disable_register_prompt=Atvainojiet, reģistrācija ir atspējota. Lūdzu, sazinieties ar vietnes administratoru. disable_register_mail=Atvainojiet, reģistrācijas e-pasta apstiprināšana ir atspējota. remember_me=Atcerēties mani -forgot_password=Aizmirsu paroli -forget_password=Aizmirsi paroli? +forgot_password_title=Aizmirsu paroli +forgot_password=Aizmirsi paroli? sign_up_now=Nepieciešams konts? Reģistrējies tagad. -confirmation_mail_sent_prompt=Jauns apstiprināšanas e-pasts ir nosūtīts uz %s, lūdzu, pārbaudies savu e-pasta kontu tuvāko %d stundu laikā, lai pabeigtu reģistrācijas procesu. +confirmation_mail_sent_prompt=Jauns apstiprināšanas e-pasts ir nosūtīts uz %s, pārbaudies savu e-pasta kontu tuvāko %s laikā, lai pabeigtu reģistrācijas procesu. +reset_password_mail_sent_prompt=Apstiprināšanas e-pasts tika nosūtīts uz %s. Pārbaudiet savu e-pasta kontu tuvāko %s laikā, lai pabeigtu paroles atjaunošanas procesu. active_your_account=Aktivizēt savu kontu prohibit_login=Aizliegt pieteikšanos -prohibit_login_desc=Ar Jūsu kontu nav atļauts pieteikties, sazinoties ar lapas administratoru. -resent_limit_prompt=Atvainojiet, Jūs sūtījāt aktivizācijas e-pastu pārāk bieži. Lūdzu, gaidiet 3 minūtes. +prohibit_login_desc=Jūsu konts ir bloķēts, sazinieties ar sistēmas administratoru. +resent_limit_prompt=Atvainojiet, Jūs pieprasījāt aktivizācijas e-pastu pārāk bieži. Lūdzu, uzgaidiet 3 minūtes un mēģiniet vēlreiz. has_unconfirmed_mail=Sveiki %s, Jums ir neapstiprināta e-pasta adrese (%s). Ja neesat saņēmis apstiprināšanas e-pastu vai Jums ir nepieciešams nosūtīt jaunu, lūdzu, nospiediet pogu, kas atrodas zemāk. resend_mail=Nospiediet šeit, lai vēlreiz nosūtītu aktivizācijas e-pastu -email_not_associate=Šī e-pasta adrese nav saistīta ar Jūsu kontu. +email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu. send_reset_mail=Spiediet šeit, lai nosūtītu paroles maiņas vēstuli uz Jūsu e-pastu reset_password=Atjaunot savu paroli invalid_code=Atvainojiet, Jūsu apstiprināšanas kodam ir beidzies derīguma termiņš vai arī tas ir nepareizs. reset_password_helper=Nospiediet šeit, lai atjaunotu paroli password_too_short=Paroles garums nedrīkst būt mazāks par %d. -non_local_account=Tikai lokālie konti var nomainīt savu paroli Gitea. +non_local_account=Ārējie konti nevar mainīt paroli, izmantojot, Gitea saskarni. +verify=Pārbaudīt +scratch_code=Vienreizējais kods +use_scratch_code=Izmantot vienreizējo kodu +twofa_scratch_used=Jūs esat izmantojis vienreizējo kodu. Jūs tikāt pārsūtīts uz divu faktoru iestatījumu lapu, lai varētu piesaistīto ierīci vai lai uzģenerētu jaunu vienreizējo kodu. +twofa_passcode_incorrect=Jūsu kods nav pareizs. Ja esat pazaudējis ierīci, izmantojiet vienreizējo kodu, lai autorizētos. +twofa_scratch_token_incorrect=Ievadīts nepareizs vienreizējais kods. +login_userpass=Lietotāja vārds / parole +login_openid=OpenID +openid_connect_submit=Pievienoties +openid_connect_title=Pievienoties jau esošam kontam +openid_connect_desc=Izvēlētais OpenID konts sistēmā netika atpazīts, bet Jūs to varat piesaistīt esošam kontam. +openid_register_title=Izveidot jaunu kontu +openid_register_desc=Izvēlētais OpenID konts sistēmā netika atpazīts, bet Jūs to varat piesaistīt jaunam kontam. +openid_signin_desc=Piemēram: https://anna.me, peteris.openid.org.lv, gnusocial.net/janis +disable_forgot_password_mail=Atvainojiet, bet paroles atjaunošana nav pieejama. Sazinieties ar sistēmas administratoru. [mail] activate_account=Lūdzu, aktivizējiet savu kontu activate_email=Apstipriniet savu e-pasta adresi reset_password=Atiestatīt savu paroli -register_success=Reģistrācija notikusi veiksmīgi -register_notify=Laipni lūgti uz klāja +register_success=Veiksmīga reģistrācija +register_notify=Laipni lūdzam Gitea [modal] yes=Jā @@ -183,6 +226,7 @@ Email=E-pasta adrese Password=Parole Retype=Parole atkārtoti SSHTitle=SSH atslēgas nosaukums +HttpsUrl=HTTPS URL PayloadUrl=Vērtuma URL TeamName=Komandas nosaukums AuthName=Autorizācijas nosaukums @@ -198,6 +242,7 @@ Content=Saturs require_error=` nedrīkst būt tukšs.` alpha_dash_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus vai domuzīmes (-_).` alpha_dash_dot_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus, domuzīmes (-_) vai punktu.` +git_ref_name_error=` jābūt korektam git references nosaukumam.` size_error=` jābūt %s simbolus garam.` min_size_error=` jabūt vismaz %s simbolu garumā.` max_size_error=` jabūt ne mazāk kā %s simbolu garumā.` @@ -205,28 +250,33 @@ email_error=` nav derīga e-pasta adrese.` url_error=` nav korekts URL.` include_error=` ir jāsatur tekstu '%s'.` unknown_error=Nezināma kļūda: -captcha_incorrect=Pārbaudes kods nesakrīt ar attēlā redzamo. -password_not_match=Parole un atkārtoti ievadītā parole nav vienādas. +captcha_incorrect=Ievadīts nepareizs drošības kods. +password_not_match=Izvēlētā parole nesakrīt ar atkārtoti ievadīto. -username_been_taken=Lietotājvārds ir jau aizņemts. -repo_name_been_taken=Repozitorija vārds ir jau aizņemts. -org_name_been_taken=Organizācijas nosaukums ir jau aizņemts. -team_name_been_taken=Komandas nosaukums ir jau aizņemts. -email_been_used=E-pasta adrese jau tiek izmantota. -username_password_incorrect=Lietotājvārds vai parole nav pareiza. +username_been_taken=Lietotājvārds jau ir aizņemts. +repo_name_been_taken=Jau eksistē repozitorijs ar šādu nosaukumu. +org_name_been_taken=Organizācijas nosaukums jau ir aizņemts. +team_name_been_taken=Komandas nosaukums jau ir aizņemts. +team_no_units_error=Komandai ir jābūt iespējotai vismaz vienai sadaļai. +email_been_used=E-pasta adrese jau ir izmantota. +openid_been_used=OpenID adrese '%s' jau ir izmantota. +username_password_incorrect=Nepareizs lietotājvārds vai parole. enterred_invalid_repo_name=Lūdzu, pārliecinieties, vai ievadītā repozitorija nosaukums ir pareizs. enterred_invalid_owner_name=Lūdzu, pārliecinieties, vai ievadītā īpašnieka vārds ir pareizs. -enterred_invalid_password=Lūdzu pārliecinieties, vai Jūsu ievadītā parole ir pareiza. -user_not_exist=Šāds lietotājs neeksistē. -last_org_owner=Nav iespējams noņemt vienīgo komandas īpašnieku. Pirms tam ir nepieciešams norādīt jauno īpašnieku. +enterred_invalid_password=Lūdzu, pārliecinieties, vai ievadītā parole ir pareiza. +user_not_exist=Lietotājs neeksistē. +last_org_owner=Nevar noņemt pēdējo īpašnieku komandas lietotāju, jo organizācijām ir jābūt vismaz vienam īpašniekam. +cannot_add_org_to_team=Organizāciju nevar pievienot kā komandas biedru. +cannot_invite_org_to_org=Organizāciju nevar uzaicināt kā organizācijas biedru. -invalid_ssh_key=Atvainojiet, nav iespējams pārbaudīt Jūsu SSH atslēgu: %s -unable_verify_ssh_key=Nav iespējams pārbaudīt jūsu SSH atslēgu, bet tiks pieņemts, ka tā ir derīga, lūdzu, pārliecinieties par to pats. +invalid_ssh_key=Nav iespējams pārbaudīt SSH atslēgu: %s +invalid_gpg_key=Nav iespējams pārbaudīt GPG atslēgu: %s +unable_verify_ssh_key=SSH atslēgu nav iespējams pārbaudīt, pārliecinieties, ka tajā nav kļūdu. auth_failed=Autentifikācija neizdevās: %v -still_own_repo=Jūsu esat vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku. -still_has_org=Jūsu esat vismaz vienas organizācijas biedrs, sākumā nepieciešams pamest vai izdzēst šo organizāciju. -org_still_own_repo=Šī organizācija ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku. +still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku. +still_has_org=Jūsu konts ir piesaistīts vismaz vienai organizācijai, sākumā nepieciešams to pamest. +org_still_own_repo=Organizācijai pieder repozitoriji, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku. target_branch_not_exist=Mērķa atzars neeksistē @@ -241,30 +291,33 @@ following=Seko follow=Sekot unfollow=Nesekot -form.name_reserved=Lietotāja vārds '%s' jau ir aizņemts. -form.name_pattern_not_allowed=Lietotāja vārds '%s' nav atļauts. +form.name_reserved=Lietotājvārdu '%s' nedrīkst izmantot. +form.name_pattern_not_allowed=Lietotājvārds '%s' nav atļauts. [settings] profile=Profils password=Parole avatar=Profila attēls -ssh_keys=SSH atslēgas +ssh_gpg_keys=SSH / GPG atslēgas social=Sociālie konti applications=Lietotnes orgs=Organizācijas delete=Dzēst kontu +twofa=Divu faktoru autentifikācija +account_link=Ārējie konti +organization=Organizācija uid=Lietotāja ID public_profile=Publiskais profils -profile_desc=Jūsu e-pasta adrese ir publiska un tiks izmantota, lai nosūtītju Jums paziņojumus, kas saistīti ar Jūsu kontu vai darbībām veiktām caur šo mājas lapu. -password_username_disabled=Ne-lokālie lietotāji nevar mainīt savus lietotājvārdus. +profile_desc=Konta e-pasta adrese ir publiska un tiks izmantota visiem ar kontu saistītiem paziņojumiem un no pārlūka veiktajām darbībām. +password_username_disabled=Ārējiem lietotājiem nav atļauts mainīt savu lietotāja vārdu. Sazinieties ar sistēmas administratoru, lai uzzinātu sīkāk. full_name=Pilns vārds website=Mājas lapa location=Atrašanās vieta update_profile=Mainīt profilu -update_profile_success=Jūsu profila dati ir veiksmīgi saglabāti. +update_profile_success=Jūsu profila informācija tika saglabāta. change_username=Lietotāja vārds mainīts -change_username_prompt=Šī izmaiņa ietekmēs saites, kas norāda uz Jūsu kontu. +change_username_prompt=Šī darbība izmainīs norādes uz šo kontu. continue=Turpināt cancel=Atcelt @@ -275,86 +328,137 @@ choose_new_avatar=Izvēlēties jaunu profila attēlu update_avatar=Saglabāt profila bildi delete_current_avatar=Dzēst pašreizējo profila bildi uploaded_avatar_not_a_image=Augšupielādētais fails nav attēls. -update_avatar_success=Jūsu profila bilde tika veiksmīgi saglabāta. +update_avatar_success=Profila attēls tika saglabāts. change_password=Mainīt paroli old_password=Pašreizējā parole new_password=Jauna parole retype_new_password=Ievadīt paroli atkāroti password_incorrect=Ievadīta nepareiza pašreizējā parole. -change_password_success=Parole tika veiksmīgi nomainīta. Tagad jūs varat pieraksītites, izmantojot jauno paroli. -password_change_disabled=Ne-lokālie lietotāji nevar mainīt savas paroles. +change_password_success=Parole tika veiksmīgi nomainīta. Tagad varat autorizēties ar jauno paroli. +password_change_disabled=Tikai lokālie konti var nomainīt savu paroli, izmantojot tīmekļa saskarni. emails=E-pasta adreses manage_emails=Pārvaldīt e-pasta adreses +manage_openid=Pārvaldīt OpenID adreses email_desc=Primārā e-pasta adrese tiks izmantota sūtot notifikācijas un citām dabībām. primary=Primārā primary_email=Iestatīt kā primāro delete_email=Dzēst -email_deletion=E-pasta dzēšana -email_deletion_desc=Dzēšot šo e-pasta adresi, tiks dzēsta arī visa ar to saistītā informācija no Jūsu konta. Vai vēlaties turpināt? +email_deletion=Dzēst e-pastu +email_deletion_desc=Dzēšot šo e-pasta adresi visa ar to saistītā informācija tiks noņemta no Jūsu konta. Git revīzijas, kam piesaistīta šī e-pasta adrese netiks mainītas. Vai patiešām vēlaties turpināt? email_deletion_success=E-pasta adrese ir veiksmīgi izdzēsta! +openid_deletion=OpenID dzēšana +openid_deletion_desc=Dzēšot šo OpenID adresi no Jūsu konta, ar to vairs nebūs iespējams autorizēties. Vai patiešām vēlaties turpināt? +openid_deletion_success=OpenID tika veiksmīgi izdzēsts! add_new_email=Pievienot jaunu e-pasta adresi +add_new_openid=Pievienot jaunu OpenID vietrādi add_email=Pievienot e-pastu -add_email_confirmation_sent=Jauns apstiprinājuma e-pasts tika nosūtīts uz '%s', pārbaudiet savu e-pastu tuvāko %d stundu laikā, lai pabeigtu apstiprināšanas procesu. +add_openid=Pievienot OpenID vietrādi +add_email_confirmation_sent=Jauns apstiprināšanas e-pasts tika nosūtīts uz '%s'. Pārbaudiet savu e-pasta kontu tuvāko %s laikā, lai apstiprinātu savu e-pasta adresi. add_email_success=Jūsu jaunā e-pasta adrese tika veiksmīgi pievienota. +add_openid_success=Jūsu jaunā OpenID adrese tika veiksmīgi pievienota. +keep_email_private=Paturēt e-pasta adresi privātu +keep_email_private_popup=Atzīmējot šo pazīmi, e-pasta adrese tiks paslēpta no citiem lietotājiem. +openid_desc=Jūsu OpenID adreses ļauj autorizēties, izmantojot Jūsu izvēlēto pakalpojumu sniedzēju manage_ssh_keys=Pārvaldīt SSH atslēgas +manage_gpg_keys=Pārvaldīt GPG atslēgas add_key=Pievienot atslēgu -ssh_desc=Šis ir saraksts ar Jūsu kontam piesaistītajām SSH atslēgām. Dzēsiet visas, kuras Jūs neatpazīstat. -ssh_helper=Vajadzīga palīdzība? Apskatieties pamācību kā ģenerēt SSH atslēgas vai kā novērst biežāk sastopamās SSH problēmas. +ssh_desc=Šīs SSH atslēgas ir piesaistītas Jūsu kontam. Ir svarīgi pārliecināties, ka visas atpazīstat, jo tās ļauj piekļūt Jūsu repozitorijiem. +gpg_desc=Šīs GPG atslēgas ir piesaistītas Jūsu kontam. Ir svarīgi glabāt to privātās atslēgas drošā vietā, jo šīs atslēgas tiek izmantotas, lai pārbaudītu Jūsu parakstītās revīzijas. +ssh_helper=Vajadzīga palīdzība? Iepazīstieties ar GitHub pamācību kā izveidot jaunu SSH atslēgu vai atrisinātu biežāk sastopamās problēmas ar kurām varat saskarties, izmantojot SSH. +gpg_helper=Vajadzīga palīdzība? Iepazīstieties ar GitHub pamācību par GPG. add_new_key=Pievienot SSH atslēgu -ssh_key_been_used=Šī publiskā atslēga jau ir izmantota. +add_new_gpg_key=Pievienot GPG atslēgu +ssh_key_been_used=SSH atslēga jau ir izmantota. ssh_key_name_used=Publiskā atslēga ar šādu nosaukumu jau eksistē. +gpg_key_id_used=Publiskā GPG atslēga ar šādu ID jau eksistē. +gpg_key_email_not_found=E-pasta adresei piesaistītā GPG atslēga netika atrasta vai tā vēl nav apstiprināta: %s +subkeys=Apakšatslēgas +key_id=Atslēgas ID key_name=Atslēgas nosaukums key_content=Saturs -add_key_success=Jauna SSH atslēga '%s' tika veiksmīgi pievienota! +add_key_success=SSH atslēga '%s' tika pievienota. +add_gpg_key_success=GPG atslēga '%s' tika pievienota. delete_key=Dzēst ssh_key_deletion=SSH atslēgas dzēšana -ssh_key_deletion_desc=Dzēšot šo SSH atslēgu, tiks dzēsta visa ar to saistītā piekļuve Jūsu kontam. Vai vēlaties turpināt? -ssh_key_deletion_success=SSH atslēga tika veiksmīgi izdzēsta! +gpg_key_deletion=GPG atslēgas dzēšana +ssh_key_deletion_desc=Dzēšot šo SSH atslēgu, ar to vairs nebūs iespējams autorizēties Jūsu kontā. Vai vēlaties turpināt? +gpg_key_deletion_desc=Dzēšot šo GPG atslēgu, visas ar to parakstītās revīzijas vairs nebūs iespējams pārbaudīt. Vai vēlaties turpināt? +ssh_key_deletion_success=SSH atslēga tika izdzēsta. +gpg_key_deletion_success=GPG atslēga tika izdzēsta. add_on=Pievienota +valid_until=Derīga līdz +valid_forever=Derīgs mūžīgi last_used=Pēdējo reizi izmantota no_activity=Nav nesenas aktivitātes -key_state_desc=Šī atslēga tika izmantota pēdējo 7 dienu laikā -token_state_desc=Šis talons tika izmantots pēdējo 7 dienu laikā +key_state_desc=Šī atslēga ir izmantota pēdējo 7 dienu laikā +token_state_desc=Šis talons ir izmantots pēdējo 7 dienu laikā +show_openid=Rādīt profilā +hide_openid=Paslēpt no profila manage_social=Pārvaldīt piesaistītos sociālos kontus -social_desc=Šeit tiek attēloti visi sociālie konti, kas ir piesaistīti Jūsu kontam. Dzēsiet visus, kurus Jūs neatpazīstat. +social_desc=Šis ir saraksts ar saistītajiem sociālajiem kontiem. Drošības nolūkos, pārliecinieties, ka atpazīstat visus no tiem, jo tos var izmantot, lai pieslēgtos Jūsu kontam. unbind=Atsaistīt -unbind_success=Sociālais konts tika atsaistīts. +unbind_success=Sociālais konts tika atsaistīts no Jūsu konta. manage_access_token=Pārvaldīt personīgos piekļuves talonus generate_new_token=Ģenerēt jaunu talonu -tokens_desc=Taloni, kurus esat uzģenerējuši, kas var tikt izmantoti, lai piekļūtu Gitea API. +tokens_desc=Taloni, ko esat ģenerējis, kurus var izmantot lai piekļūtu Gitea API. new_token_desc=Pašlaik visiem taloniem ir pilna piekļuve Jūsu kontam. token_name=Talona nosaukums generate_token=Ģenerēt talonu -generate_token_succees=Jauns piekļuves talons tika veiksmīgi uzģenerēts! Pārliecinieties, ka esat to nokopējis, jo to Jums vairāk nebūs iespēja izdarīt! +generate_token_success=Jūsu piekļuves talons tika veiksmīgi uzģenerēts! Nokopējiet to tagad, jo vēlāk to vairs nebūs iespējams redzēt! delete_token=Dzēst access_token_deletion=Personīgā piekļuves talona dzēšana -access_token_deletion_desc=Dzēšot personīgo piekļuves talonu, tiks liegta piekļuve aplikācijām, kas to izmanto. Vai vēlaties turpināt? -delete_token_success=Personīgās piekļuves talons veiksmīgi izdzēsts! Neaizmirstiet nomainīt uz citu aplikācijās, kas to izmantoja. +access_token_deletion_desc=Dzēšot personīgo piekļuves talonu tiks liegta piekļuve visām aplikācijām, kas to izmanto. Vai patiešām vēlaties turpināt? +delete_token_success=Personīgais piekļuves talons tika noņemts. Neaizmirstiet atjaunot informāciju aplikācijās, kas izmantoja šo talonu. +twofa_desc=Gitea atbalsta divu faktoru autentifikāciju, lai uzlabotu Jūsu konta drošību. +twofa_is_enrolled=Kontam ir ieslēgta divu faktoru autentifikācija. +twofa_not_enrolled=Jūsu kontam nav ieslēgta divu faktoru autentifikācija. +twofa_disable=Atslēgt divu faktoru autentifikāciju +twofa_scratch_token_regenerate=Ģenerēt jaunu vienreizējo kodu +twofa_scratch_token_regenerated=Vienreizējais kods tika uzģenerēts. Tagad tas ir %s. Saglabājiet to drošā vietā. +twofa_enroll=Ieslēgt divu faktoru autentifikāciju +twofa_disable_note=Nepieciešamības gadījumā divu faktoru autentifikāciju ir iespējams atslēgt. +twofa_disable_desc=Atslēdzot divu faktoru autentifikāciju konts vairs nebūs tik drošs. Vai patiešām vēlaties turpināt? +regenerate_scratch_token_desc=Ja esat aizmirsis vienreizējo kodu vai jau esat to izmantojis, lai autorizētos, atjaunojiet to šeit. +twofa_disabled=Divu faktoru autentifikācija ir atslēgta. +scan_this_image=Noskenējiet šo attēlu ar autentifikācijas lietojumprogrammu: +or_enter_secret=Vai ievadiet šo noslēpumu: %s +then_enter_passcode=Ievadiet piekļuves kodu no lietojumprogrammas: +passcode_invalid=Nederīgs piekļuves kods. Mēģiniet vēlreiz. +twofa_enrolled=Kontam tagad ir ieslēgta divu faktoru autentifikācija. Saglabājiet savu vienreizējo kodu (%s), jo tas vairāk netiks parādīts! + +manage_account_links=Pārvaldīt saistītos kontus +manage_account_links_desc=Šim kontam piesaistītie ārējie konti +account_links_not_available=Šim kontam nav piesaistīts neviens ārējais konts +remove_account_link=Noņemt saistīto kontu +remove_account_link_desc=Noņemot saistīto kontu, tiks tam tiks liegta piekļuve. Vai patiešām vēlaties turpināt? +remove_account_link_success=Konta piesaiste tika veiksmīgi noņemta! + +orgs_none=Jūs neesat nevienas organizācijas biedrs. delete_account=Dzēst savu kontu delete_prompt=Šī darbība pilnībā izdzēsīs Jūsu kontu, kā arī tā ir NEATGRIEZENISKA! confirm_delete_account=Apstiprināt dzēšanu delete_account_title=Konta dzēšana -delete_account_desc=Šis konts tiks neatgriezeniski dzēsts, vai vēlaties turpināt? +delete_account_desc=Vai patiešām vēlaties neatgriezeniski dzēst šo kontu? [repo] owner=Īpašnieks repo_name=Repozitorija nosaukums -repo_name_helper=Labi repzotoriju nosaukumi ir īsi, tādi kurus viegli atcerēties un unikāli. +repo_name_helper=Labi repozitoriju nosaukumi ir īsi, tādi kurus viegli atcerēties un unikāli. visibility=Redzamība visiblity_helper=Šis repozitorijs ir privāts -visiblity_helper_forced=Lapas administrators ir noteicis, ka visiem repozitorijiem ir jābūt privātiem +visiblity_helper_forced=Jūsu sistēmas administrators ir noteicis, ka visi no jauna izveidotie repozitoriji būs privāti visiblity_fork_helper=(Šīs vērtības maiņa ietekmēs arī visus atdalītos repozitorijus) clone_helper=Nepieciešama palīdzība kā veikt klonēšana? Apmeklējiet Palīdzība lapu! fork_repo=Atdalīt repozitoriju fork_from=Atdalīt no -fork_visiblity_helper=Atdalītam repozitorijam nav iespējams nomainīt tā redzamību +fork_visiblity_helper=Atdalītam repozitorijam nav iespējams nomainīt tā redzamību. repo_desc=Apraksts repo_lang=Valoda repo_gitignore_helper=Izvēlieties .gitignore sagatavi @@ -367,7 +471,8 @@ create_repo=Izveidot repozitoriju default_branch=Noklusējuma atzars mirror_prune=Izmest mirror_prune_desc=Izdzēst visas ārējās atsauces, kas ārējā repozitorijā vairs neeksistē -mirror_interval=Spoguļošanas intervāls (stundās) +mirror_interval=Spoguļošanas intervāls (derīgās laika vienības ir "h", "m" un "s") +mirror_interval_invalid=Nekorekts spoguļošanas intervāls mirror_address=Spoguļa adrese mirror_address_desc=Lūdzu iekļaujiet adresē nepieciešamo lietotājvārdu/paroli. mirror_last_synced=Pēdējo reizi sinhronizēts @@ -375,8 +480,8 @@ watchers=Novērotāji stargazers=Zvaigžņdevēji forks=Atdalītie repozitoriji -form.reach_limit_of_creation=Īpašnieks sasniedza maksimālu pieļaujamo (%d) izveidoto repozitoriju skaitu. -form.name_reserved=Repozitorija nosaukums '%s' ir rezervēts. +form.reach_limit_of_creation=Ir sasniegts Jums noteiktais %d repozitoriju ierobežojums. +form.name_reserved=Repozitorija nosaukums '%s' ir jau rezervēts. form.name_pattern_not_allowed=Repozitorija nosaukums '%s' nav atļauts. need_auth=Nepieciešama autorizācija @@ -385,12 +490,15 @@ migrate_type_helper=Šis repozitorijs būs spogulisNospiediet šeit, lai redzētu kas ir mainījies vai nospiediet atkārtoti pabeigt revīziju, lai pārrakstītu izmaiņas. +editor.file_changed_while_editing=Faila saturs ir mainījies kopš Jūs sākāt to labot. Nospiediet šeit, lai redzētu kas ir ticis mainīts vai nospiediet saglabāt vēlreiz, lai pārrakstītu šīs izmaiņas. editor.file_already_exists=Fails ar nosaukumu '%s' repozitorijā jau eksistē. editor.no_changes_to_show=Nav izmaiņu, ko rādīt. editor.fail_to_update_file=Neizdevās izmainīt/izveidot failu '%s', kļūda: %v editor.add_subdir=Pievienot apakšdirektoriju... editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju '%s', kļūda: %v editor.upload_files_to_dir=Augšupielādēt failus uz direktoriju '%s' +editor.cannot_commit_to_protected_branch=Nav atļauts veikt izmaiņas aizsargātam atzaram '%s'. +commits.desc=Revīzijas parāda koda izmaiņu vēsturi commits.commits=Revīzijas commits.search=Meklēt revīzijas commits.find=Meklēt +commits.search_all=Visi atzari commits.author=Autors commits.message=Ziņojums commits.date=Datums commits.older=Vecāki commits.newer=Jaunāki +commits.signed_by=Parakstījis +commits.gpg_key_id=GPG atslēgas ID +ext_issues=Ārējās problēmas +ext_issues.desc=Ārējās problēmas ir saite uz ārējo problēmu vadības lapu + +issues.desc=Problēmas ir vieta kur pārvaldīt uzdevumus un kļūdas issues.new=Jauna problēma issues.new.labels=Etiķetes issues.new.no_label=Nav etiķešu @@ -490,10 +613,21 @@ issues.new_label=Jauna etiķete issues.new_label_placeholder=Etiķetes nosaukums... issues.create_label=Izveidot etiķeti issues.label_templates.title=Ielādēt sākotnēji noteikto etiķešu kopu -issues.label_templates.info=Nav definēta neviena etiķete. Nospiediet pogu "Izveidot etiķeti", lai to izveidotu vai izmantojiet zemāk piedāvātās etiķetes. +issues.label_templates.info=Nav izveidota neviena etiķete. Jūs varat noklikšķināt uz "Jauna etiķete" augstāk, lai to izveidotu vai izmantot zemāk piedāvātās etiķetes. issues.label_templates.helper=Izvēlieties etiķešu kopu issues.label_templates.use=Izmantot šo etiķešu kopu issues.label_templates.fail_to_load_file=Neizdevās ielādēt etiķetes sagataves failu '%s': %v +issues.add_label_at=` pievienoja
%s
label %s` +issues.remove_label_at=`noņēma
%s
label %s` +issues.add_milestone_at=`pievienoja atskaites punktu %s %s` +issues.change_milestone_at=`nomainīja atskaites punktu no %s uz %s %s` +issues.remove_milestone_at=`noņēma atskaites punktu %s %s` +issues.deleted_milestone=`(dzēsts)` +issues.self_assign_at=`piešķīra sev %s` +issues.add_assignee_at=`tika piešķirta problēma %s %s` +issues.remove_assignee_at=`tika noņemta problēma %s` +issues.change_title_at=`nomainīts virsraksts no %s uz %s %s` +issues.delete_branch_at=`izdzēsts atzars %s %s` issues.open_tab=%d atvērti issues.close_tab=%d aizvērti issues.filter_label=Etiķete @@ -514,6 +648,13 @@ issues.filter_sort.recentupdate=Nesen atjaunotās issues.filter_sort.leastupdate=Vissenāk atjaunotās issues.filter_sort.mostcomment=Visvairāk komentētās issues.filter_sort.leastcomment=Vismazāk komentētās +issues.action_open=Atvērt +issues.action_close=Aizvērt +issues.action_label=Etiķete +issues.action_milestone=Atskaites punkts +issues.action_milestone_no_select=Nav atskaites punkta +issues.action_assignee=Atbildīgais +issues.action_assignee_no_select=Nav atbildīgā issues.opened_by=%[3]s atvēra %[1]s issues.opened_by_fake=%[2]s atvēra %[1]s issues.previous=Iepriekšējā @@ -547,12 +688,19 @@ issues.label_edit=Labot issues.label_delete=Dzēst issues.label_modify=Etiķetes labošana issues.label_deletion=Etiķetes dzēšana -issues.label_deletion_desc=Dzēšot šo etiķeti, tā tiks noņemta no visām saistītajām problēmām. Vai vēlaties turpināt? +issues.label_deletion_desc=Dzēšot šo etiķeti, tā tiks noņemta no visām saistītajām problēmām. Vai patiešām vēlaties turpināt? issues.label_deletion_success=Etiķete tika veiksmīgi izdzēsta! +issues.label.filter_sort.alphabetically=Alfabētiski +issues.label.filter_sort.reverse_alphabetically=Pretēji alfabētiski +issues.label.filter_sort.by_size=Izmērs +issues.label.filter_sort.reverse_by_size=Pretēji izmēram issues.num_participants=%d dalībnieki issues.attachment.open_tab=`Noklikšķiniet, lai apskatītos "%s" jaunā logā` issues.attachment.download=`Noklikšķiniet, lai lejupielādētu "%s"` +issues.subscribe=Abonēt +issues.unsubscribe=Atrakstīties +pulls.desc=Izmaiņu pieprasījumi ļauj veikt koda pārskatīšanu un sapludināt izmaiņas pulls.new=Jauns izmaiņu pieprasījums pulls.compare_changes=Salīdzināt izmaiņas pulls.compare_changes_desc=Salīdzināt divus atzarus un izveidot izmaiņu pieprasījumu. @@ -568,9 +716,9 @@ pulls.merged_title_desc=sapludināja %[1]d revīzijas no %[2]s uz < pulls.tab_conversation=Saruna pulls.tab_commits=Revīzijas pulls.tab_files=Izmainītie faili -pulls.reopen_to_merge=Lūdzu, atkārtoti atveriet šo izmaiņu pieprasījumu, lai veiktu sapludināšanu. +pulls.reopen_to_merge=Atkārtoti atveriet izmaiņu pieprasījumu, lai veiktu sapludināšanu. pulls.merged=Sapludināts -pulls.has_merged=Šo izmaiņu pieprasījums tika veiksmīgi sapludināts! +pulls.has_merged=Šo izmaiņu pieprasījums tika veiksmīgi sapludināts. pulls.data_broken=Nepieejami izmaiņu pieprasījuma dati, jo dzēsta informācija no atdalītā repozitorija. pulls.is_checking=Notiek konfliktu pārbaude, mirkli uzgaidiet un atjaunojiet lapu. pulls.can_auto_merge_desc=Šo izmaiņu pieprasījumu var automātiski saplūdināt. @@ -600,28 +748,39 @@ milestones.cancel=Atcelt milestones.modify=Mainīt atskaites punktu milestones.edit_success=Izmaiņas atskaites punktā '%s' tika veiksmīgi saglabātas! milestones.deletion=Atskaites punkta dzēšana -milestones.deletion_desc=Dzēšot šo atskaites punktu tiks noņemta arī saistītā informācija no problēmu ziņojumiem. Vai vēlaties turpināt? +milestones.deletion_desc=Dzēšot šo atskaites punktu, tas tiks noņemts no visām saistītajām problēmām. Vai patiešām vēlaties turpināt? milestones.deletion_success=Atskaites punkts tika veiksmīgi izdzēsts! +milestones.filter_sort.closest_due_date=Tuvākais termiņš +milestones.filter_sort.furthest_due_date=Tālākais termiņš +milestones.filter_sort.least_complete=Vismazāk pabeigtais +milestones.filter_sort.most_complete=Visvairāk pabeigtais +milestones.filter_sort.most_issues=Visvairāk problēmu +milestones.filter_sort.least_issues=Vismazāk problēmu + +ext_wiki=Ārējā vikivietne +ext_wiki.desc=Ārējā vikivietne norāda uz ārējo vikivietnes adresi wiki=Vikivietne -wiki.welcome=Laipni lūgti vikivietnē! -wiki.welcome_desc=Vikivietne ir vieta, kur Jūs varat dokumentēt savu projektu, lai padarīto to labāku. +wiki.welcome=Laipni lūgti vikivietnē +wiki.welcome_desc=Vikivietne ļauj Jums un Jūsu līdzstrādniekiem viegli dokumentēt projektu. +wiki.desc=Vikivietne ir vieta, kur uzglabāt dokumentāciju wiki.create_first_page=Izveidot pirmo lapu wiki.page=Lapa wiki.filter_page=Meklēt lapu wiki.new_page=Izveidot jaunu lapu -wiki.default_commit_message=Uzrakstiet piezīmes par šīm izmaiņām (neobligāti). +wiki.default_commit_message=Ierakstiet piezīmes par šīs lapas izmaiņām (neobligāts). wiki.save_page=Saglabāt lapu wiki.last_commit_info=%s laboja lapu %s wiki.edit_page_button=Labot wiki.new_page_button=Jauna lapa wiki.delete_page_button=Dzēst lapu -wiki.delete_page_notice_1=Tiks izdzēsta lapa "%s". Pārliecinieties, ka patiešām to vēlaties. +wiki.delete_page_notice_1=Šī darbība izdzēsīs lapu "%s". Pārliecinieties, ka vēlāties dzēst šo lapu. wiki.page_already_exists=Vikivietnes lapa ar šādu nosaukumu jau eksistē. wiki.pages=Lapas wiki.last_updated=Pēdējo reizi labota %s settings=Iestatījumi +settings.desc=Iestatījumi ir vieta, kur varat pārvaldīt repozitorija iestatījumus settings.options=Opcijas settings.collaboration=Sadarbība settings.collaboration.admin=Administrators @@ -633,7 +792,7 @@ settings.githooks=Git āķi settings.basic_settings=Pamatiestatījumi settings.mirror_settings=Spoguļa iestatījumi settings.sync_mirror=Sinhronizēt tagad -settings.mirror_sync_in_progress=Notiek spoguļa sinhronizācija, uzgaidiet aptuveni minūti un atjaunojiet lapu. +settings.mirror_sync_in_progress=Notiek spoguļa sinhronizācija. Atjaunojiet lapu, lai pārbaudītu atkārtoti, pēc minūtes. settings.site=Oficiālā mājas lapa settings.update_settings=Mainīt iestatījumus settings.advanced_settings=Papildu iestatījumi @@ -641,10 +800,14 @@ settings.wiki_desc=Iespējot vikivietnes settings.use_internal_wiki=Izmantot iebūvēto vikivietni settings.use_external_wiki=Izmantot ārējo vikivietni settings.external_wiki_url=Ārējās Vikivietnes adrese +settings.external_wiki_url_error=Ārējās vikivietnes URL nav korekts settings.external_wiki_url_desc=Apmeklētāji tiks novirzīti uz adresi, kad viņi uzklikšķinās uz cilnes. settings.issues_desc=Iespējot problēmu sekotāju settings.use_internal_issue_tracker=Izmantot iebūvētu vieglu problēmu sekotāju settings.use_external_issue_tracker=Izmantot ārējo problēmu sekotāju +settings.external_tracker_url=Ārējā problēmu reģistra URL +settings.external_tracker_url_error=Ārējā problēmu sekotāja URL nav korekts +settings.external_tracker_url_desc=Apmeklētāji nospiežot uz cilnes tiks pārsūtīti uz norādīto URL. settings.tracker_url_format=Ārējā problēmu sekotāja adreses formāts settings.tracker_issue_style=Ārējā problēmu reģistra nosaukumu stils: settings.tracker_issue_style.numeric=Cipari @@ -654,29 +817,29 @@ settings.pulls_desc=Iespējot izmaiņu pieprasījumus lai saņemtu publiskus ieg settings.danger_zone=Bīstamā zona settings.new_owner_has_same_repo=Jaunajam īpašniekam jau ir repozitorijs ar šādu nosaukumu. settings.convert=Konvertēt uz parastu repozitoriju -settings.convert_desc=Šo spoguli ir iespējams konvertēt par parastu repozitoriju. Šī ir neatgriezeniska darbība. +settings.convert_desc=Jūs varat nomainīt šo spoguli uz parastu repozitoriju. Šī darbība ir neatgriezeniska. settings.convert_notices_1=- Šī darbība konvertēs šo repozitoriju par parastu repozitoriju un to nebūs iespējams atcelt. settings.convert_confirm=Apstiprināt konvertēšanu -settings.convert_succeed=Repozitorijs tika veiksmīgi konvertēts uz parastu repozitoriju. +settings.convert_succeed=Repozitorijs tika izmainīts par parastu repozitoriju. settings.transfer=Mainīt īpašnieku settings.transfer_desc=Mainīt šī repozitorija īpašnieku uz citu lietotāju vai organizāciju, kurai Jums ir administratora tiesībs. -settings.transfer_notices_1=- Jūs pazaudēsiet piekļuvi, ja jaunais īpašnieks ir lietotājs. +settings.transfer_notices_1=- Jūs zaudēsiet piekļuvi, ja jaunais īpašnieks ir individuāls lietotājs. settings.transfer_notices_2=- Jūs saglabāsiet piekļuvi, ja jaunais īpašnieks ir organizācija un Jūs esat viens no tās īpašniekiem. -settings.transfer_form_title=Lūdzu, ievadiet sekojošu informāciju, lai apstiprinātu šo darbību: +settings.transfer_form_title=Ievadiet sekojošu informāciju, lai apstiprinātu savu darbību: settings.wiki_delete=Dzēst Vikivietnes datus settings.wiki_delete_desc=Vikivietnes datu dzēšana ir neatgriezeniska. Pārliecinieties vai patiešām to vēlaties. settings.wiki_delete_notices_1=- Šī darbība dzēsīs un atspējos %s Vikivietni -settings.wiki_deletion_success=Repozitorija Vikivietnes dati tika veiksmīgi izdzēsti. +settings.wiki_deletion_success=Repozitorija vikivietnes dati tika izdzēsti. settings.delete=Dzēst šo repozitoriju -settings.delete_desc=Dzēšot repozitoriju, tā datus vairs nebūs iespējams atgūt. Pirms dzēšanas pārliecinieites vai patiešām vēlaties to darīt. +settings.delete_desc=Dzēšot repozitoriju, tā datus vairs nebūs iespējams atgūt. Pirms dzēšanas pārliecinieties vai patiešām vēlaties to darīt. settings.delete_notices_1=- Šī darbība ir NEATGRIEZENISKA. -settings.delete_notices_2=- Šī darbība neatgriezeniski izdzēsīs visus šī repozitorija datus, tai skaitā Git datus, problēmu ziņojumus, komentārus un definētās piekļuves tiesības. -settings.delete_notices_fork_1=- Visi atdalītie repozitoriji kļūs neatkarīgi pēc dzēšanas. -settings.deletion_success=Repozitorijs tika veiksmīgi dzēsts! -settings.update_settings_success=Repozitorija opcijas ir veiksmīgi saglabātas. +settings.delete_notices_2=- Šī darbība neatgriezeniski dzēsīs šī repozitorija kodu, problēmas, komentārus, vikivietni un līdzstrādnieku piekļuvi. +settings.delete_notices_fork_1=- Visi atdalītie repozitoriju pēc dzēšanas kļūs neatkarīgi. +settings.deletion_success=Repozitorijs tika izdzēsts. +settings.update_settings_success=Repozitorija iestatījumi tika saglabāti. settings.transfer_owner=Jaunais īpašnieks settings.make_transfer=Mainīt -settings.transfer_succeed=Repozitorija īpašnieks ir veiksmīgi nomainīts. +settings.transfer_succeed=Repozitorija īpašnieks tika nomainīts. settings.confirm_delete=Apstiprināt dzēšanu settings.add_collaborator=Pievienot jaunu līdzstrādnieku settings.add_collaborator_success=Jauns līdzstrādnieks ir pievienots. @@ -688,13 +851,13 @@ settings.search_user_placeholder=Meklēt lietotāju... settings.org_not_allowed_to_be_collaborator=Organizāciju nav atļauts pievienot kā līdzstrādnieku. settings.user_is_org_member=Lietotājs ir organizācijas biedrs, kas nevar tikt pievienots kā līdzstrādnieks. settings.add_webhook=Pievienot tīmekļa āķi -settings.hooks_desc=Tīmekļa āķi ļauj paziņot ārējiem servisiem par noteiktiem notikomiem, kas notiek Git servisā. Kad iestāsies kāds notikums, katram ārējā servisa URL tiks nosūtīts POST pieprasījums. Lai uzzinātu sīkāk skatieties Tīmekļa āķu rokasgrāmatā. +settings.hooks_desc=Tīmekļa āķi ļauj paziņot ārējiem servisiem par noteiktiem notikomiem, kas notiek Git servisā. Kad iestāsies kāds notikums, katram ārējā servisa URL tiks nosūtīts POST pieprasījums. Lai uzzinātu sīkāk skatieties tīmekļa āķu rokasgrāmatā. settings.webhook_deletion=Dzēst tīmekļa āķi -settings.webhook_deletion_desc=Dzēšot tīmekļa āķi tiks dzēsta visa ar to saistītā informācija un izpildes vēsture. Vai vēlaties turpināt? +settings.webhook_deletion_desc=Dzēšot šo tīmekļa āķi, tiks izdzēsta arī visa tā informācija un piegāžu vēsture. Vai patiešām vēlaties turpināt? settings.webhook_deletion_success=Tīmekļa āķis tika veiksmīgi izdzēsts! settings.webhook.test_delivery=Testa piegāde settings.webhook.test_delivery_desc=Veikt viltus push-notikuma piegādi lai notestētu Jūsu tīmekļa āķa iestatījumus -settings.webhook.test_delivery_success=Testa web-āķis ir pievienots piegādes rindai. Var paiet dažas sekundes, kamēr tas parādīsies piegāžu vēsturē. +settings.webhook.test_delivery_success=Pārbaudes tīmekļa āķis tika veiksmīgi pievienots piegādes rinda. Var paiet vairākas sekundes līdz tas parādās piegādes vēsturē. settings.webhook.request=Pieprasījums settings.webhook.response=Atbilde settings.webhook.headers=Galvenes @@ -705,7 +868,7 @@ settings.githook_edit_desc=Ja āķis nav aktīvs, tiks attēlots piemērs kā to settings.githook_name=Āķa nosaukums settings.githook_content=Āķa saturs settings.update_githook=Labot āķi -settings.add_webhook_desc=Uz norādīto URL tiks nosūtīts POST pieprasījums ar notikuma datiem. Jūs varat norādīt arī datu formātu, kādā datus vēlaties saņemt (JSON, x-www-form-urlencoded utt.). Detalizētāku informāciju ir iespējams uzzināt Tīmekļa āķu rokasgrāmatā. +settings.add_webhook_desc=Uz norādīto URL tiks nosūtīts POST pieprasījums ar notikuma datiem. Jūs varat norādīt arī datu formātu, kādā datus vēlaties saņemt (JSON, x-www-form-urlencoded, XML u. c.). Detalizētāku informāciju ir iespējams uzzināt tīmekļa āķu rokasgrāmatā. settings.payload_url=Vērtuma URL settings.content_type=Satura tips settings.secret=Noslēpums @@ -723,7 +886,7 @@ settings.event_pull_request_desc=Atvērts, aizvērts, atkāroti atvērts, labots settings.event_push=Izmaiņu nosūtīšana settings.event_push_desc=Git izmaiņu nosūtīšana uz repozitoriju settings.active=Aktīvs -settings.active_helper=Tiks nosūtīti notikuma dati, kad nostrādās šis āķis. +settings.active_helper=Arī informācija par notikumu, kas izraisīja āķi, tiks nosūtīta. settings.add_hook_success=Jauns tīmekļa āķis tika veiksmīgi pievienots. settings.update_webhook=Mainīt tīmekļa āķi settings.update_hook_success=Tīmekļa āķist tika veiksmīgi saglabāts. @@ -744,21 +907,38 @@ settings.key_been_used=Šāda izvietošanas atslēga jau eksistē. settings.key_name_used=Izvietošanas atslēga ar šādu nosaukumu jau eksistē. settings.add_key_success=Izvietošanas atslēga '%s' tik veiksmīgi pievienota! settings.deploy_key_deletion=Dzēst izvietošanas atslēgu -settings.deploy_key_deletion_desc=Dzēšot šo izvietošanas atslēgu tiks noņemta arī ar to saistītā piekļuve šim repozitorijam. Vai vēlaties turpināt? -settings.deploy_key_deletion_success=Izvietošanas atslēga tika veiksmīgi izdzēsta! +settings.deploy_key_deletion_desc=Dzēšot izvietošanas atslēgu, ar to vairs nebūs iespējams piekļūt šim repozitorijam. Vai patiešām vēlaties turpināt? +settings.deploy_key_deletion_success=Izvietošanas atslēga tikai veiksmīgi izdzēsta! +settings.branches=Atzari +settings.protected_branch=Atzaru aizsargāšana +settings.protected_branch_can_push=Atļaut izmaiņu nosūtīšanu? +settings.protected_branch_can_push_yes=Jūs varat nosūtīt izmaiņas +settings.protected_branch_can_push_no=Jūs nevarat nosūtīt izmaiņas +settings.add_protected_branch=Iespējot aizsargāšanu +settings.delete_protected_branch=Atspējot aizsargāšanu +settings.add_protected_branch_success=%s veiksmīgi slēgts +settings.add_protected_branch_failed=%s slēgšana neizdevās +settings.remove_protected_branch_success=%s veiksmīgi atslēgts +settings.protected_branch_deletion=Lai dzēstu atzara aizsardzību +settings.protected_branch_deletion_desc=Ikviens ar rakstīšanas tiesībām varēs nosūtīt izmaiņas uz šo zaru. Vai patiešām to vēlaties? +settings.default_branch_desc=Noklusētais atzars tiek uzskatīts par bāzes atzaru repozitorijā uz kuru tiks veidoti izmaiņu pieprasījumu un pēc noklusējuma tiek veiktas koda izmaiņas, ja vien nav norādīts cits atzars. +settings.choose_branch=Izvēlieties atzaru... +settings.no_protected_branch=Nav neviena aizsargātā atzara diff.browse_source=Pārlūkot izejas kodu diff.parent=vecāks diff.commit=revīzija -diff.data_not_available=Salīdzināšanas dati nav pieejami. +diff.data_not_available=Satura salīdzināšana nav pieejama diff.show_diff_stats=Rādīt salīdzināšanas statistiku diff.show_split_view=Dalītais skats diff.show_unified_view=Apvienotais skats diff.stats_desc=%d mainītis faili ar %d papildinājumiem un %d dzēšanām +diff.bin=Binārs diff.view_file=Parādīt failu diff.file_suppressed=Failā izmaiņas netiks attēlotas, jo tās ir par lielu diff.too_many_files=Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels +releases.desc=Laidieni ir vieta, kur pārvaldīt projekta versijas release.releases=Laidieni release.new_release=Jauns laidiens release.draft=Melnraksts @@ -767,11 +947,11 @@ release.stable=Stabila release.edit=labot release.ahead=%d revīzijas atzarā %s kopš šī laidiena release.source_code=Izejas kods -release.new_subheader=Publicējiet laidienus, lai veiktu produkta iterācijas. -release.edit_subheader=Detalizēts žurnāls var palīdzēt lietotājiem saprast, kas tika uzlabots. +release.new_subheader=Publicējiet laidienus, lai varētu veikt atsekošanu projekta versijām. +release.edit_subheader=Detalizēts izmaiņu žurnāls palīdz lietotajiem saprast, kas ir ticis mainīts. release.tag_name=Taga nosaukums release.target=Mērķis -release.tag_helper=Publicējot, izvēlieties esošu vai izveidojiet jaunu tagu. +release.tag_helper=Izvēlieties jau esošu tagu vai izveidojiet jaunu. release.title=Virsraksts release.content=Saturs release.write=Rakstīt @@ -785,12 +965,19 @@ release.save_draft=Saglabāt melnrakstu release.edit_release=Labot laidienu release.delete_release=Dzēst šo laidienu release.deletion=Laidiena dzēšana -release.deletion_desc=Dzēšot šo laidienu tiks dzēsts arī atbilstošs Git tags. Vai vēlaties turpināt? -release.deletion_success=Laidiens tika veiksmīgi dzēsts! +release.deletion_desc=Dzēšot šo laidienu tiks izdzēsts arī attiecīgais Git tags. Kods netiks pazaudēts. Vai vēlaties turpināt? +release.deletion_success=Laidiens tika izdzēsts. release.tag_name_already_exist=Laidiens ar šādu taga nosaukumu jau eksistē. release.tag_name_invalid=Nekorekts birkas nosaukams. release.downloads=Lejupielādes +branch.delete=Dzēst atzaru %s +branch.delete_desc=Atzara dzēšana ir neatgriezeniska. To nav iespējams atcelt. +branch.delete_notices_1=- Šī darbība ir NEATGRIEZENISKA. +branch.delete_notices_2=- Šī darbība neatgriezeniski izdzēsīs visu zarā %s. +branch.deletion_success=Atzars '%s' tika izdzēsts. +branch.deletion_failed=Neizdevās izdzēst atzaru %s. +branch.delete_branch_has_new_commits=%s nevar tikt dzēsts, jo tam ir jaunas revīzijas pēc tā sapludināšanas. [org] org_name_holder=Organizācijas nosaukums @@ -808,11 +995,13 @@ org_desc=Apraksts team_name=Komandas nosaukums team_desc=Apraksts team_name_helper=Šo nosaukumu varēs izmantot, lai pieminētu komandu sarunās. -team_desc_helper=Komandas apraksts -team_permission_desc=Kādām tiesībām šai komandai būtu jābūt? +team_desc_helper=Kam šī komanda ir domāta? +team_permission_desc=Kādas būs šīs komandas tiesības? +team_unit_desc=Kādām sadaļām šai komandai būs piekļuve? form.name_reserved=Organizācijas nosaukums '%s' ir rezervēts. form.name_pattern_not_allowed=Organizācijas nosaukums '%s' nav atļauts. +form.create_org_not_allowed=Šim lietotājam nav tiesību veidot organizācijas. settings=Iestatījumi settings.options=Opcijas @@ -820,15 +1009,15 @@ settings.full_name=Pilns vārds, uzvārds settings.website=Mājas lapa settings.location=Atrašanās vieta settings.update_settings=Mainīt iestatījumus -settings.update_setting_success=Organizācijas iestatījumi tika veiksmīgi saglabāti. -settings.change_orgname_prompt=Šī izmaiņa ietekmēs saites, kas ir saistītas ar šo organizāciju. -settings.update_avatar_success=Organizācijas avatara iestatījumi tika veiksmīgi saglabāti. +settings.update_setting_success=Organizācijas iestatījumi tika saglabāti. +settings.change_orgname_prompt=Šo izmaiņu rezultātā tiks izmainītas šīs organizācijas saites. +settings.update_avatar_success=Organizācijas attēls tika saglabāts. settings.delete=Dzēst organizāciju settings.delete_account=Dzēst šo organizāciju settings.delete_prompt=Šī darbība pilnībā dzēsīs šo organizāciju, kā arī tā ir NEATGRIEZENISKA! settings.confirm_delete_account=Apstiprināt dzēšanu settings.delete_org_title=Organizācijas dzēšana -settings.delete_org_desc=Šī organizācija tiks pilnībā izdzēsta, vai vēlaties turpināt? +settings.delete_org_desc=Šī organizācijas tiks neatgriezeniski izdzēsta, vai patiešām vēlaties turpināt? settings.hooks_desc=Pievienot tīmekļa āķus, kas nostrādās visiem repozitorijiem šajā organizācijā. members.membership_visibility=Dalībnieka redzamība: @@ -849,9 +1038,9 @@ teams.leave=Atstāt teams.read_access=Lasīšanas piekļuve teams.read_access_helper=Komanda varēs skatīties un klonēt šīs organizācijas repozitorijus. teams.write_access=Rakstīšanas piekļuve -teams.write_access_helper=Komanda varēs skatīties un klonēt, kā arī nosūtīt izmaiņas šīs organizācijas repozitorijiem. +teams.write_access_helper=Šī komanda varēs lasīt un nosūtīt izmaiņas uz tās repozitorijiem. teams.admin_access=Administratora piekļuve -teams.admin_access_helper=Šī komanda varēs veikt push/pull komandas tās repozitorijiem, kā arī tiem pievienot citus līdzstrādniekus. +teams.admin_access_helper=Šī komanda varēs nosūtīt un saņemt izmaiņas no tās repozitorijiem, kā arī pievienot tiem citus līdzstrādniekus. teams.no_desc=Komandai nav apraksta teams.settings=Iestatījumi teams.owners_permission_desc=Īpašniekiem ir pilna piekļuve visiem repozitorijiem un ir organizācijas administratora tiesības. @@ -860,8 +1049,8 @@ teams.update_settings=Saglabāt iestatījumus teams.delete_team=Dzēst komandu teams.add_team_member=Pievienot komandas biedru teams.delete_team_title=Komandas dzēšana -teams.delete_team_desc=Komanda tiks dzēsta, vai vēlaties turpināt? Komandas biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem. -teams.delete_team_success=Komanda tika veiksmīgi izdzēsta. +teams.delete_team_desc=Dzēšot komandu, tās biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem. Vai vēlaties turpināt? +teams.delete_team_success=Komanda tika izdzēsta. teams.read_permission_desc=Šai komandai ir lasīšanas tiesības: dalībnieki var skatīties un klonēt komandas repozitorijus. teams.write_permission_desc=Šai komandai ir rakstīšanas tiesības: dalībnieki var lasīt un nosūtīt izmaiņas repozitorijiem. teams.admin_permission_desc=Šai komandai ir administratora tiesības: dalībnieki var lasīt, rakstīt un pievienot citus dalībniekus komandas repozitorijiem. @@ -891,23 +1080,24 @@ dashboard.statistic_info=Gitea datu bāze satur %d lietotājus, %d dashboard.operation_name=Darbības nosaukums dashboard.operation_switch=Pārslēgt dashboard.operation_run=Palaist -dashboard.clean_unbind_oauth=Notīrīt nesaistītās OAuth biļetes -dashboard.clean_unbind_oauth_success=Visas nesaistītās OAuth biļetes tika veiksmīgi izdzēstas. +dashboard.clean_unbind_oauth=Notīrīt nepiesaistītos OAuth savienojumus +dashboard.clean_unbind_oauth_success=Visi nepiesaistītie OAuth savienojumu tika izdzēsti. dashboard.delete_inactivate_accounts=Dzēst visus neaktīvos kontus -dashboard.delete_inactivate_accounts_success=Visi neaktīvie kotni tika veiksmīgi izdzēsti. +dashboard.delete_inactivate_accounts_success=Visi neaktīvie konti tika izdzēsti. dashboard.delete_repo_archives=Dzēst visu repozitoriju arhīvus -dashboard.delete_repo_archives_success=Visu repozitoriju arhīvi tika veiksmīgi izdzēsti. -dashboard.delete_missing_repos=Dzēst visus repozitorija ierakstus, kas zaudēja Git failus -dashboard.delete_missing_repos_success=Visi repozitorija ieraksti, kas zaudēja Git failus tika veiksmīgi dzēsti. -dashboard.git_gc_repos=Veikt repozitoriju datu sakārtošānu (git gc) -dashboard.git_gc_repos_success=Datu sakārtošana visiem repozitorijiem veiksmīgi pabeigta. -dashboard.resync_all_sshkeys=Pārrakstīt '.ssh/authorized_keys' failu (brīdinājums: ne-Git atslēgas tiks pazaudētas) -dashboard.resync_all_sshkeys_success=Visas publiskās atslēgas tika veiksmīgi pārrakstītas. -dashboard.resync_all_update_hooks=Pārrakstīt visu repozitoriju izmaiņu āķus (nepieciešams, ja tiek mainīta konfigurācijas faila atrašanās vieta) -dashboard.resync_all_update_hooks_success=Visu repozitoriju izmaiņu āķi tika veiksmīgi pārrakstīti. -dashboard.reinit_missing_repos=Atkārtoti inicializēt visus repozitorija ierakstus, kam trūkst Git failu -dashboard.reinit_missing_repos_success=Visi repozitorija ieraksti, kam trūkst Git faili, tika atkārtoti inicializēti. - +dashboard.delete_repo_archives_success=Visu repozitoriju arhīvi tika izdzēsti. +dashboard.delete_missing_repos=Dzēst visus repozitorijus, kuriem trūkst Git faili +dashboard.delete_missing_repos_success=Visi repozitoriji, kuriem trūkst Git faili, tika izdzēsti. +dashboard.git_gc_repos=Izpildīt visu repozitoriju datu sakārtošanu +dashboard.git_gc_repos_success=Visiem repozitorijiem ir pabeigta datu sakārtošana. +dashboard.resync_all_sshkeys=Pārrakstīt '.ssh/authorized_keys' failu (Gitea SSH atslēgām) +dashboard.resync_all_sshkeys_success=Visas publiskās atslēgas tika pārrakstītas. +dashboard.resync_all_hooks=Pārsinhronizēt pirms-saņemšanas, atjaunošanas un pēc-saņemšanas āķus visiem repozitorijiem. +dashboard.resync_all_hooks_success=Visu repozitoriju pirms-saņemšanas, atjaunošanas un pēc-saņemšanas āķi tika atjaunoti. +dashboard.reinit_missing_repos=Atkārtoti inicializēt visus pazaudētos Git repozitorijus par kuriem eksistē ieraksti +dashboard.reinit_missing_repos_success=Visi pazaudētie Git repozitoriji, par kuriem eksistēja ieraksti, tika atkārtoti inicializēti. +dashboard.sync_external_users=Sinhronizēt ārējo lietotāju datus +dashboard.sync_external_users_started=Uzsākta ārējo lietotāju sinhronizācija dashboard.server_uptime=Servera darbības laiks dashboard.current_goroutine=Izmantotās Gorutīnas dashboard.current_memory_usage=Pašreiz izmantotā atmiņa @@ -938,53 +1128,59 @@ dashboard.total_gc_pause=Kopējais GC izpildes laiks dashboard.last_gc_pause=Pedējās GC izpildes laiks dashboard.gc_times=GC reizes -users.user_manage_panel=Lietotāju pārvaldības panelis +users.user_manage_panel=Lietotāju vadības panelis users.new_account=Izveidot jaunu kontu users.name=Vārds users.activated=Aktivizēts users.admin=Administrators users.repos=Repozitoriji users.created=Izveidots +users.last_login=Pēdējā autorizācija +users.never_login=Nekad nav autorizējies users.send_register_notify=Nosūtīt lietotājam reģistrācijas paziņojumu -users.new_success=Jauns konts '%s' tika veiksmīgi izveidots. +users.new_success=Lietotājs '%s' tika izveidots. users.edit=Labot users.auth_source=Autentificēšanas avots users.local=Iebūvētā users.auth_login_name=Autentifikācijas pieteikšanās vārds users.password_helper=Atstājiet tukšu, ja nevēlaties mainīt. -users.update_profile_success=Konta profils tika veiksmīgi saglabāts. +users.update_profile_success=Lietotāja profils tika atjaunots. users.edit_account=Labot kontu users.max_repo_creation=Maksimāls repozitoriju veidošanas limits users.max_repo_creation_desc=(Uzlikt -1 lai izmantotu globālu limitu pēc noklusējuma) -users.is_activated=Konts ir aktivizēts -users.prohibit_login=Šim kontam ir aizliegts autorizēties +users.is_activated=Šis konts ir pabeidzis aktivizāciju +users.prohibit_login=Šis konts ir bloķēts un ar to nevar autorizēties users.is_admin=Šim kontam ir administratora piekļuves tiesības -users.allow_git_hook=Šim kontam ir tiesības pievienot/labot Git āķus +users.allow_git_hook=Šim kontam ir tiesības veidot Git āķus users.allow_import_local=Šim kontam ir tiesības importēt lokālus repozitorijus +users.allow_create_organization=Jums nav tiesību veidot organizācijas users.update_profile=Mainīt konta profilu users.delete_account=Dzēst šo kontu -users.still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai nomainīt to īpašnieku. -users.still_has_org=Šis konts ir vismaz vienas organizācijas biedrs, sākumā nepieciešams pamest vai izdzēst šo organizāciju. -users.deletion_success=Konts tika veiksmīgi izdzēsts! +users.still_own_repo=Šim kontam pieder vismaz viens repozitorijs, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku. +users.still_has_org=Šis konts ir piesaistīts vismaz vienai organizācijai. Sākumā ir nepieciešams to atsaistīt vai izdzēst šo organizāciju. +users.deletion_success=Konts tika veiksmīgi izdzēsts. -orgs.org_manage_panel=Organizāciju pārvaldības panelis +orgs.org_manage_panel=Organizāciju pārvaldība orgs.name=Nosaukums orgs.teams=Komandas orgs.members=Dalībnieki +orgs.new_orga=Izveidot organizāciju -repos.repo_manage_panel=Repozitoriju pārvaldības panelis +repos.repo_manage_panel=Repozitoriju pārvaldība repos.owner=Īpašnieks repos.name=Vārds repos.private=Privāts repos.watches=Vērošana repos.stars=Atzīmētās zvaigznītes repos.issues=Problēmas +repos.size=Izmērs -auths.auth_manage_panel=Autentifikācijas pārvaldības panelis +auths.auth_manage_panel=Autentifikāciju pārvaldība auths.new=Pievienot jaunu avotu auths.name=Nosaukums auths.type=Veids auths.enabled=Iespējota +auths.syncenabled=Iespējot lietotāju sinhronizāciju auths.updated=Atjaunināta auths.auth_type=Autentifikācijas tips auths.auth_name=Autentifikācijas nosaukums @@ -1010,33 +1206,57 @@ auths.smtp_auth=SMTP autentifikācijas tips auths.smtphost=SMTP resursdators auths.smtpport=SMTP ports auths.allowed_domains=Atļautie domēni -auths.allowed_domains_helper=Atstājiet tukšu, ja nevēlaties ierobežot domēnu vārdus. Domēna vārdus nepieciešams atdalīt ar komatu ','. +auths.allowed_domains_helper=Atstājiet tukšu, lai atļautu visus domēnus. Lai norādītu vairākus domēnus, tos var atdalīt ar komatu. auths.enable_tls=Iespējot TLS šifrēšanu auths.skip_tls_verify=Izlaist TLS verifikāciju auths.pam_service_name=PAM servisa nosaukums +auths.oauth2_provider=OAuth2 pakalpojuma sniedzējs +auths.oauth2_clientID=Klienta ID (atslēga) +auths.oauth2_clientSecret=Klienta noslēpums +auths.openIdConnectAutoDiscoveryURL=OpenID Connect automātiskās atklāšanas URL +auths.oauth2_use_custom_url=Noklusēto URL vietā izmantot pielāgotos URL +auths.oauth2_tokenURL=Talona URL +auths.oauth2_authURL=Autorizācijas URL +auths.oauth2_profileURL=Profila URL +auths.oauth2_emailURL=E-pasta adreses URL auths.enable_auto_register=Iespējot automātisko reģistrāciju auths.tips=Padomi +auths.tips.oauth2.general=OAuth2 autentifikācija +auths.tips.oauth2.general.tip=Reģistrējot jaunu OAuth2 autentifikāciju, atsauces/pārsūtīšanas URL ir jābūt: /user/oauth2//callback +auths.tip.oauth2_provider=OAuth2 pakalpojuma sniedzējs +auths.tip.bitbucket=Reģistrējiet jaunu OAuth klientu adresē https://bitbucket.org/account/user//oauth-consumers/new un piešķiriet tam "Account"-"Read" tiesības +auths.tip.dropbox=Pievienojiet jaunu aplikāciju adresē https://www.dropbox.com/developers/apps +auths.tip.facebook=Reģistrējiet jaunu aplikāciju adresē https://developers.facebook.com/apps un pievienojiet produktu "Facebook Login +auths.tip.github=Reģistrējiet jaunu aplikāciju adresē https://github.com/settings/applications/new +auths.tip.gitlab=Reģistrējiet jaunu aplikāciju adresē https://gitlab.com/profile/applications +auths.tip.google_plus=Iegūstiet OAuth2 klienta pilnvaru no Google API konsoles (https://console.developers.google.com/) +auths.tip.openid_connect=Izmantojiet OpenID pieslēgšanās atklāšanas URL (/.well-known/openid-configuration), lai norādītu galapunktus +auths.tip.twitter=Dodieties uz adresi https://dev.twitter.com/apps, izveidojiet aplikāciju un pārliecinieties, ka ir atzimēts “Allow this application to be used to Sign in with Twitter”. auths.edit=Labot autentifikācijas iestatījumus auths.activated=Autentifikācija ir aktivizēta -auths.new_success=Jauna autentifikācija '%s' tika veiksmīgi pievienota. -auths.update_success=Autentifikācijas iestatījumi tika veiksmīgi saglabāti. +auths.new_success=Jauna autentifikācija'%s' tika pievienota. +auths.update_success=Autentifikācijas iestatījumi tika saglabāti. auths.update=Mainīt autentifikācijas iestatījumus -auths.delete=Dzēst šo autentifikāciju -auths.delete_auth_title=Autentifikācijas dzēšana -auths.delete_auth_desc=Šī autentifikācija tiks dzēsta, vai vēlaties turpināt? -auths.still_in_used=Daži lietotāji joprojām izmanto šo autentifikācijas veidu. Nepieciešams veikt šo lietotāju konvertāciju vai dzēšanu. +auths.delete=Dzēst šo autentifikācijas avotu +auths.delete_auth_title=Dzēst autentifikācijas avotu +auths.delete_auth_desc=Šis autentificēšanas avots tiks dzēsts, vai patiešām vēlaties turpināt? +auths.still_in_used=Daži lietotāji joprojām izmanto šo autentifikācijas avotu. Nepieciešams veikt šo lietotāju konvertāciju vai dzēšanu. auths.deletion_success=Autentifikācija tika veiksmīgi izdzēsta! +auths.login_source_exist=Pieteikšanās avots '%s' jau eksistē. config.server_config=Servera konfigurācija config.app_name=Lietotnes nosaukums config.app_ver=Lietotnes versija config.app_url=Lietotnes URL +config.custom_conf=Konfigurācijas faila ceļš config.domain=Domēns config.offline_mode=Bezsaistes režīms config.disable_router_log=Atspējot maršrutētāja žurnalizēšanu config.run_user=Izpildes lietotājs config.run_mode=Izpildes režīms +config.git_version=Git versija config.repo_root_path=Repozitoriju glabāšanas vieta +config.lfs_root_path=LFS saknes ceļš config.static_file_root_path=Statisko failu atrašanās vieta config.log_file_root_path=Žurnalizēšanas failu glabāšanas vieta config.script_type=Skripta veids @@ -1067,13 +1287,18 @@ config.db_path_helper=(priekš "sqlite3" and "tidb") config.service_config=Pakalpojuma konfigurācija config.register_email_confirm=Pieprasīt e-pasta apstiprināšanu config.disable_register=Atspējot jaunu lietotāju reģistrāciju +config.enable_openid_signup=Iespējot reģistrāciju, izmantojot, OpenID +config.enable_openid_signin=Iespējot OpenID autorizāciju config.show_registration_button=Rādīt reģistrēšanās pogu config.require_sign_in_view=Nepieciešama autorizācija config.mail_notify=Pasta paziņojumi config.disable_key_size_check=Atspējot atslēgas minimālā garuma pārbaudi config.enable_captcha=Iespējot drošības kodu config.active_code_lives=Aktīvā koda ilgums -config.reset_password_code_lives=Paroles atiestatīšanas koda ilgums +config.reset_password_code_lives=Atjaunot paroles koda derīguma laiku +config.default_keep_email_private=Noklusēta vērtība pazīmei vai e-pasta adrese ir privāta +config.default_allow_create_organization=Tiesības pēc noklusējuma veidot organizācijas +config.no_reply_address=No-reply adrese config.webhook_config=Tīkla āķu konfigurācija config.queue_length=Rindas garums @@ -1150,7 +1375,8 @@ notices.delete_all=Dzēst visus paziņojumus notices.type=Veids notices.type_1=Repozitorijs notices.desc=Apraksts -notices.delete_success=Sistēmas paziņojumi tika veiksmīgi izdzēstas. +notices.op=Op. +notices.delete_success=Sistēmas paziņojumi ir dzēsti. [action] create_repo=izveidoja repozitoriju %s @@ -1166,34 +1392,55 @@ comment_issue=`pievienoja komentāru problēmai %s#%[2]s< merge_pull_request=`sapludināja izmaiņu pieprasījumu %s#%[2]s` transfer_repo=mainīja repozitorija %s īpašnieku uz %s push_tag=pievienoja tagu %[2]s repozitorijam %[3]s -compare_commits=Salīdzināt šīs %d revīzijas +compare_commits=Salīdzināt %d revīzijas [tool] -ago=atpakaļ -from_now=no šī brīža +ago=%s atpakaļ +from_now=%s no šī brīža now=tagad -1s=1 sekundi %s -1m=1 minūti %s -1h=1 stundu %s -1d=1 dienu %s -1w=1 nedēļu %s -1mon=1 mēnesi %s -1y=1 gadu %s -seconds=%d sekundes %s -minutes=%d minūtes %s -hours=%d stundas %s -days=%d dienas %s -weeks=%d nedēļas %s -months=%d mēneši %s -years=%d gadi %s +future=nākotnē +1s=1 sekundi +1m=1 minūti +1h=1 stundu +1d=1 dienu +1w=1 nedēļu +1mon=1 mēnesi +1y=1 gadu +seconds=%d sekundes +minutes=%d minūtes +hours=%d stundas +days=%d dienas +weeks=%d nedēļas +months=%d mēnešus +years=%d gadus raw_seconds=sekundes raw_minutes=minūtes [dropzone] -default_message=Ievelciet failus šeit vai noklikšķiniet, lai augšupielādētu. +default_message=Ievelciet failus vai nospiediet šeit, lai augšupielādētu. invalid_input_type=Šādus failus nav iespējams augšupielādēt. -file_too_big=Faila izmērs ({{filesize}} MB) pārsniedz maksimālo atļauto izmēru ({{maxFilesize}} MB). +file_too_big=Faila izmērs ({{filesize}} MB) pārsniedz maksimāli atļauto izmēru ({{maxFilesize}} MB). remove_file=Noņemt failu [notification] +notifications=Paziņojumi +unread=Neizlasītie +read=Izlasītie +no_unread=Jums nav neviena neizlasīta paziņojuma. +no_read=Jums nav neviena izlasīta paziņojuma. +pin=Piespraust paziņojumu +mark_as_read=Atzīmēt kā izlasītu +mark_as_unread=Atzīmēt kā nelasītu + +[gpg] +error.extract_sign=Neizdevās izgūt parakstu +error.generate_hash=Neizdevās uzģenerēt revīzijas jaucējkodu +error.no_committer_account=Revīzijas autora e-pasts nav piesaistīts nevienam kontam +error.no_gpg_keys_found=Šim parakstam datu bāzē netika atrasta zināma atslēga +error.not_signed_commit=Nav parakstīta revīzija +error.failed_retrieval_gpg_keys=Neizdevās saņemt nevienu atslēgu, kas ir piesaistīta revīzijas autora kontam + +[units] +error.no_unit_allowed_repo=Jums nav tiesību aplūkot nevienu šī repozitorija sadaļu +error.unit_not_allowed=Jums nav tiesību piekļūt šai repozitorija sadaļai diff --git a/options/locale/locale_nb-NO.ini b/options/locale/locale_nb-NO.ini new file mode 100644 index 0000000..2ae8a5a --- /dev/null +++ b/options/locale/locale_nb-NO.ini @@ -0,0 +1,156 @@ +app_desc=En smidig Git-tjeneste du kjører selv + +home=Startside +dashboard=Skrivebord +explore=Utforsk +help=Hjelp +sign_in=Logg inn +sign_in_with=Logge på med +sign_out=Logg ut +sign_up=Registrer deg +register=Registrer +website=Nettsted +version=Versjon +page=Side +template=Mal +language=Språk +notifications=Varsler +create_new=Opprett... +user_profile_and_more=Brukerprofil med mer +signed_in_as=Logget inn som + +username=Brukernavn +email=Epost +password=Passord +re_type=Gjennta +captcha=Bekreftelsekode +twofa=To-faktor autentisering +passcode=Kode + +repository=Kodelager +organization=Organisasjon +mirror=Speil +new_repo=Nytt kodelager +new_migrate=Ny migrering +new_mirror=Nytt speil +new_org=Ny organisasjon +manage_org=Administer organisasjoner +admin_panel=Administrasjonspanel +account_settings=Kontoinstillinger +settings=Innstillinger + + +issues=Problemer + +cancel=Avbryt + +[install] +install=Installasjon +db_title=Databaseinnstillinger +db_type=Databasetype +host=Tjener +user=Bruker +password=Passord +db_name=Databasenavn +ssl_mode=SSL-modus +path=Bane + + +optional_title=Valgfrie innstillinger +email_title=Innstillinger for e-post +smtp_host=SMTP-vert +smtp_from=Fra + +[home] + + +[explore] + +[auth] + +[mail] + +[modal] + +[form] + + + + + + + +[user] + + +[settings] + + + + + + + + + + + + +[repo] + + + + + + + + + + + + + + + + + + +[org] + + + + + +[admin] + + + + + + + + + + + + + + + + + + + + +[action] + +[tool] + +[dropzone] + +[notification] + +[gpg] + +[units] + diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index b2bf414..6209601 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -1,17 +1,22 @@ app_desc=Een eenvoudige zelfgehoste Git service geschreven in Go +home=Beginscherm dashboard=Overzicht explore=Verkennen help=Help sign_in=Inloggen +sign_in_with=Aanmelden met sign_out=Uitloggen sign_up=Aanmelden +link_account=Account Koppelen +link_account_signin_or_signup=Login met bestaand gebruikersnaam/wachtwoord om een bestaand account te koppelen aan dit account, of maak een nieuw account aan register=Registreren website=Website version=Versie page=Pagina template=Sjabloon language=Taal +notifications=Meldingen create_new=Creëren... user_profile_and_more=Gebruikersprofiel en meer signed_in_as=Aangemeld als @@ -22,6 +27,8 @@ password=Wachtwoord re_type=Verificatie captcha=CAPTCHA twofa=Twee-traps authenticatie +twofa_scratch=Eenmalige tweeledige authenticatie code +passcode=PIN repository=Repository organization=Organisatie @@ -29,16 +36,17 @@ mirror=Kopie new_repo=Nieuwe repository new_migrate=Nieuwe migratie new_mirror=Nieuwe kopie -new_fork=Nieuwe fork +new_fork=Nieuwe Repository Fork new_org=Nieuwe organisatie manage_org=Beheer organisaties admin_panel=Adminpaneel account_settings=Accountinstellingen settings=Instellingen your_profile=Uw profiel -your_starred=Jouw sterren +your_starred=Jouw Sterren your_settings=Uw instellingen + activities=Activiteiten pull_requests=Pull requests issues=Kwesties @@ -47,9 +55,9 @@ cancel=Annuleren [install] install=Installatie -title=Installatiestappen voor de eerste keer opstarten -docker_helper=Als u gebruik maakt Gitea binnen Docker, lees dan de richtlijnen voordat u iets veranderen op deze pagina! -requite_db_desc=Gitea vereist MySQL, PostgreSQL, SQite3 of TiDB. +title=Initiële configuratie +docker_helper=Als u gebruik maakt van Gitea in Docker, lees dan de richtlijnen voordat u iets verandert op deze pagina. +requite_db_desc=Gitea vereist MySQL, PostgreSQL, SQLite3 of TiDB. db_title=Database-instellingen db_type=Database-type host=Server @@ -59,27 +67,29 @@ db_name=Database naam db_helper=Gebruik InnoDB engine met utf8_general_ci karakterset voor MySQL. ssl_mode=SSL-modus path=Pad -sqlite_helper=Het pad van de SQLite3- of TiDB-database.
Als u Gitea start als een service, geef dan een absoluut pad op. +sqlite_helper=Het pad van de SQLite3- of TiDB-database.
Als u Gitea als een service start, geef dan een absoluut pad op. err_empty_db_path=SQLite3 of TiDB database mag niet leeg zijn. err_invalid_tidb_name=TiDB database naam mag geen "." en "-" bevatten. no_admin_and_disable_registration=U kunt de registratie niet uitschakelen als u geen beheerder bent. err_empty_admin_password=Beheerder wachtwoord mag niet leeg zijn. -general_title=Toepassing algemene instellingen +general_title=Algemene Applicatie-instellingen app_name=Applicatienaam -app_name_helper=Plaats hier uw organisatienaam in hoofdletters! +app_name_helper=Hier kun je de naam van je organisatie invullen. repo_path=Repositories basis map -repo_path_helper=Alle remote Git repositories worden in deze map opgeslagen +repo_path_helper=Alle remote Git repositories worden in deze map opgeslagen. +lfs_path=LFS rootpad +lfs_path_helper=In deze map worden Git LFS bestanden opgeslagen. Laat dit veld leeg om LFS uit te schakelen. run_user=Uitvoerende gebruikersnaam run_user_helper=Deze gebruiker moet toegang hebben tot de git repository map en moet Gitea kunnen starten domain=Domein domain_helper=Dit heeft invloed op de SSH kloon URLs ssh_port=SSH-poort -ssh_port_helper=Nummer van de poort die uw SSH-server gebruikt, laat dit leeg om de SSH functie uit te schakelen. +ssh_port_helper=Nummer van de poort die uw SSH-server gebruikt. Laat dit veld leeg om de SSH functie uit te schakelen. http_port=HTTP-poort http_port_helper=Poortnummer waar het programma naar luistert. app_url=Applicatie URL -app_url_helper=Dit heeft invloed op de HTTP/HTTPS kloon urls en de urls die in de email worden gebruikt +app_url_helper=Dit heeft invloed op de HTTP/HTTPS kloon urls en de urls die in sommige emails worden gebruikt. log_root_path=Log-pad log_root_path_helper=Map waar logbestanden opgeslagen worden. @@ -87,16 +97,17 @@ optional_title=Optionele instellingen email_title=E-mail service instellingen smtp_host=SMTP host smtp_from=Afzender -smtp_from_helper=Email afzender, RFC 5322. Dit kan gewoon een email adres zijn of het "Naam" formaat. -mailer_user=Afzender e-mail / gebruikersnaam +smtp_from_helper=Email afzender, RFC 5322. Dit kan gewoon een emailadres zijn of het "Naam" formaat. +mailer_user=Afzender mailer_password=Wachtwoord register_confirm=Activeer registratie emails mail_notify=Activeer e-mailnotificaties server_service_title=Server en andere Services-instellingen offline_mode=Offline modus inschakelen -offline_mode_popup=Schakel CDN uit in productiemodus, alle bestanden worden lokaal aangeboden. +offline_mode_popup=Schakel CDN uit zodat alle bestanden lokaal worden aangeboden. disable_gravatar=Gravatar Service uitschakelen disable_gravatar_popup=Schakel Gravatar en andere bronnen uit, alle avatars worden door gebruikers geüpload of zijn standaard. +federated_avatar_lookup=Federated Avatars zoekopdracht inschakelen federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. disable_registration=Schakel zelfregistratie uit disable_registration_popup=Schakel zelfregistratie uit, alleen admins kunnen accounts maken. @@ -104,7 +115,7 @@ enable_captcha=Inschakelen Captcha enable_captcha_popup=Vereis captcha validatie voor zelf-registratie van gebruiker. require_sign_in_view=Schakel vereiste aanmelding om pagina's te zien in require_sign_in_view_popup=Alleen ingelogde gebruikers kunnen pagina's bekijken, bezoekers kunnen alleen de login/registratie pagina's zien. -admin_setting_desc="U hoeft niet meteen een administratie account te maken, de gebruiker met ID=1 krijgt automatisch administratierechten." +admin_setting_desc=Je hoeft niet meteen een administratie account te maken. De eerste gebruiker die zich aanmeldt krijgt automatisch administratieve rechten. admin_title=Instellingen beheerdersaccount admin_name=Gebruikersnaam admin_password=Wachtwoord @@ -112,14 +123,20 @@ confirm_password=Verifieer wachtwoord admin_email=Beheerder E-mail install_btn_confirm=Installeer Gitea test_git_failed=Git test niet gelukt: 'git' commando %v -sqlite3_not_available=Uw versie biedt geen ondersteuning voor SQLite3, download de officiële binaire versie van %s, niet de gobuild versie. -invalid_db_setting=Uw database instellingen zijn niet correct: %v +sqlite3_not_available=Je huidige versie biedt geen ondersteuning voor SQLite3, download de officiële binaire versie van %s, niet de gobuild versie. +invalid_db_setting=Database-instelling is ongeldig: %v invalid_repo_path=Repository basis map is niet correct: %v run_user_not_match=De uitvoerende gebruiker is niet de huidig gebruiker: %s -> %s save_config_failed=Kan de configuratie niet opslaan: %v invalid_admin_setting=Uw admin-instellingen zijn niet geldig: %v -install_success=Welkom! Wij zijn veheugd dat u voor Gitea heeft gekozen, veel plezier! +install_success=Welkom! Bedankt voor het kiezen van Gitea. invalid_log_root_path=Ongeldig log-pad: %v +default_keep_email_private=Standaardwaarde voor "Houdt Emailadressen Privé +default_keep_email_private_popup=Dit is de standaardwaarde voor de zichtbaarheid van het e-mailadres van gebruikers. Als dit is ingesteld op true zal voor alle nieuwe gebruikers het e-mailadres worden verborgen tot de gebruiker zijn voorkeur aanpast. +default_allow_create_organization=Standaardwaarde voor de machtiging om nieuwe gebruikers organisaties te laten aanmaken +default_allow_create_organization_popup=Dit is de standaardwaarde voor een machtiging die zal worden toegewezen voor nieuwe gebruikers. Als deze is ingesteld op true zullen nieuwe gebruikers de machtiging krijgen om organisaties aan te maken. +no_reply_address=No-reply emailadres +no_reply_address_helper=Domein voor het emailadres van gebruikers in git logboeken als hij zijn emailadres privé houdt. Bijvoorbeeld zal gebruiker 'joe' en 'noreply.example.org' worden samengevoegd tot 'joe@noreply.example.org' [home] uname_holder=Gebruikersnaam of e-mail @@ -131,6 +148,7 @@ collaborative_repos=Gedeelde repositories my_orgs=Mijn organisaties my_mirrors=Mijn kopieën view_home=Bekijk %s +search_repos=Zoek een repository... issues.in_your_repos=In uw repositories @@ -139,38 +157,57 @@ repos=Repositories users=Gebruikers organizations=Organisaties search=Zoeken +repo_no_results=Er zijn geen overeenkomende repositories gevonden. +user_no_results=Er zijn geen overeenkomende gebruikers gevonden. +org_no_results=Er zijn geen overeenkomende organisaties gevonden. [auth] -create_new_account=Maak nieuw account aan +create_new_account=Account aanmaken register_helper_msg=Heeft u al een account? Klik hier om in te loggen -social_register_helper_msg=Heeft u al een account? Koppel nu! +social_register_helper_msg=Heeft u al een account? Koppel deze nu! disable_register_prompt=Sorry, registratie is uitgeschakeld. Neem contact op met de beheerder van deze site. disable_register_mail=Sorry, bevestiging van registratie per e-mail is uitgeschakeld. remember_me=Onthoud mij -forgot_password=Wachtwoord vergeten -forget_password=Wachtwoord vergeten? +forgot_password_title=Wachtwoord vergeten +forgot_password=Wachtwoord vergeten? sign_up_now=Een account nodig? Meld u nu aan. -confirmation_mail_sent_prompt=Een bevestigingsemail is gestuurd naar %s, Bevestig u aanvraag binnen %d uren om uw registratie te voltooien. +confirmation_mail_sent_prompt=Een nieuwe bevestigingsmail is gestuurd naar %s. De mail moet binnen %s worden bevestigd om je registratie te voltooien. +reset_password_mail_sent_prompt=Een bevestigingsmail is gestuurd naar %s. De mail moet binnen %s worden bevestigd om wachtwoord reset proces te voltooien. active_your_account=Activeer uw account prohibit_login=Login verbode -prohibit_login_desc=U mag met dit account niet inloggen, neem contact op met de site administrator. -resent_limit_prompt=Sorry, u heeft te snel na elkaar een aanvraag gedaan voor een activatie mail. Wacht drie minuten voor uw volgende aanvraag. +prohibit_login_desc=Je mag met dit account niet inloggen, neem contact op met de beheerder van de site. +resent_limit_prompt=Sorry, je hebt te snel na elkaar een aanvraag gedaan voor een activatiemail. Wacht drie minuten voor je volgende aanvraag. has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (%s). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop. resend_mail=Klik hier om uw activatie mail nog een keer te verzenden -email_not_associate=Dit e-mailadres is niet gekoppeld aan een account. -send_reset_mail=Klik hier om uw wachtwoord reset mail (nogmaals) te versturen +email_not_associate=Dit emailadres is niet gekoppeld aan een account. +send_reset_mail=Klik hier om de wachtwoord reset mail (nogmaals) te versturen reset_password=Reset uw wachtwoord -invalid_code=Sorry, uw bevestigingscode is verlopen of niet meer geldig. +invalid_code=Sorry, de bevestigingscode is verlopen of niet meer geldig. reset_password_helper=Klik hier om uw wachtwoord opnieuw in te stellen. password_too_short=De lengte van uw wachtwoord moet minimaal %d karakters zijn. non_local_account=Niet lokale accounts mogen hun wachtwoord niet veranderen via Gitea. +verify=Verifiëren +scratch_code=Eenmalige code +use_scratch_code=Gebruik een eenmalige code +twofa_scratch_used=Je hebt je eenmalige code gebruikt. Je wordt omgeleid naar de tweeledige-authenticatie instellingen pagina zodat je de inschrijving van het apparaat kan verwijderen of een nieuwe eenmalige code kan genereren. +twofa_passcode_incorrect=Je PIN is onjuist. Als je je geregistreerde apparaat kwijt bent gebruik dan je eenmalige code. +twofa_scratch_token_incorrect=Je eenmalige code is onjuist. +login_userpass=Gebruikersnaam / Wachtwoord +login_openid=OpenID +openid_connect_submit=Verbinden +openid_connect_title=Verbind met een bestaand account +openid_connect_desc=De gekozen OpenID url is niet bekend bij het systeem, je kan het met een bestaand account verbinden. +openid_register_title=Nieuw account aanmaken +openid_register_desc=De gekozen OpenID url is niet bekend bij het systeem, je kan het hier met een bestaand account verbinden. +openid_signin_desc=Voorbeeld urls: https://anne.me, bob.openid.org.cn, gnusocial.net/carry +disable_forgot_password_mail=Sorry, het resetten van wachtwoorden is uitgeschakeld. Neem contact op met de beheerder van deze site. [mail] activate_account=Activeer uw account activate_email=Verifieer uw e-mailadres reset_password=Stel uw wachtwoord opnieuw in -register_success=Registratie succesvol, welkom -register_notify=Welkom aan boord +register_success=Registratie succesvol +register_notify=Welkom bij Gitea [modal] yes=Ja @@ -185,6 +222,7 @@ Password=Wachtwoord Retype=Verifieer wachtwoord SSHTitle=SSH sleutel naam HttpsUrl=HTTPS-URL +PayloadUrl=Payload url TeamName=Team naam AuthName=Autorisatienaam AdminEmail=E-mail beheerder @@ -197,8 +235,9 @@ TreeName=Bestandspad Content=Inhoud require_error=kan niet leeg zijn. -alpha_dash_error=moet een valide alfanumeriek of dash(-_) karakter zijn. -alpha_dash_dot_error=moet een valide alfanumeriek, dash(-_) of (.) punt karakter zijn. +alpha_dash_error=` moeten valide alfanumerieke karakters of streepjes (-_) zijn.` +alpha_dash_dot_error=` moeten valide alfanumerieke karakters, streepjes (-_) of punten zijn.` +git_ref_name_error=` moet een correct geformatteerde git referentie naam zijn.` size_error=moet groter zijn dan %s min_size_error=moet minimaal %s karakters bevatten. max_size_error=mag maximaal %s karakters bevatten. @@ -207,27 +246,29 @@ url_error=is niet een valide URL. include_error=` moet substring '%s' bevatten.` unknown_error=Onbekende fout: captcha_incorrect=Captcha komt niet overeen. -password_not_match=Wachtwoord en verificatie wachtwoord komen niet overeen. +password_not_match=Wachtwoorden komen niet overeen. username_been_taken=Gebruikersnaam is al in gebruik. -repo_name_been_taken=Deze naam is al in gebruik. -org_name_been_taken=Organisatie naam is al in gebruik. -team_name_been_taken=Team naam is al in gebruik. -email_been_used=e-mailadres is al in gebruik. -username_password_incorrect=Gebruikersnaam of wachtwoord is niet correct. +repo_name_been_taken=Repository naam reeds gebruikt. +org_name_been_taken=Organisatienaam is al in gebruik. +team_name_been_taken=Teamnaam is al in gebruik. +email_been_used=Emailadres is reeds gebruikt. +openid_been_used=OpenID adres '%s' reeds gebruikt. +username_password_incorrect=Onjuiste gebruikersnaam en/of wachtwoord. enterred_invalid_repo_name=U heeft een onjuiste repository naam ingevoerd. enterred_invalid_owner_name=U heeft een onjuiste eigenaar ingevoerd. -enterred_invalid_password=U heeft een onjuiste wachtwoord ingevoerd. -user_not_exist=Gegeven gebruiker bestaat niet. -last_org_owner=De gebruiker die u probeert te verwijderen is het enige lid (eigenaar) van dit team. U moet eerst nieuwe lid (eigenaar) aanstellen. +enterred_invalid_password=U heeft een onjuist wachtwoord ingevoerd. +user_not_exist=De gebruiker bestaat niet. +last_org_owner=De gebruiker die u probeert te verwijderen is het enige lid (eigenaar) van dit team. U moet eerst een nieuw lid (eigenaar) aanstellen. +cannot_add_org_to_team=Organisatie kan niet worden toegevoegd als een teamlid. +cannot_invite_org_to_org=Organisatie kan niet worden toegevoegd als een organisatielid. invalid_ssh_key=Sorry, we zijn niet in staat om uw SSH-sleutel te verifiëren: %s -unable_verify_ssh_key=Gitea kan uw SSH-sleutel niet verifieren, wij gaan ervan uit dat deze geldig is, controleert u het aub nog eens. +invalid_gpg_key=Sorry, we zijn niet in staat om uw GPG-sleutel te verifiëren: %s +unable_verify_ssh_key=De ssh sleutel niet kon worden geverifieerd, Controleer het voor eventuele fouten. auth_failed=Verificatie mislukt: %v still_own_repo=Uw account heeft nog een eigendom op een repository. U moet deze eerst verwijderen of overdragen. -still_has_org=Uw account is nog steeds lid van een organisatie, u moet deze eerst verwijderen of overdragen. -org_still_own_repo=De organisatie is nog eigenaar van een repository. U moet deze eerst verwijderen of overdragen. target_branch_not_exist=Doel branch bestaat niet @@ -249,22 +290,25 @@ form.name_pattern_not_allowed=Het gebruikersnaam patroon '%s' is niet toegestaan profile=Profiel password=Wachtwoord avatar=Profielfoto -ssh_keys=SSH-sleutels +ssh_gpg_keys=SSH / GPG sleutels social=Sociale netwerk-accounts applications=Toepassingen orgs=Organisaties delete=Verwijder account +twofa=Twee factor authenticatie +account_link=Externe accounts +organization=Organisatie uid=uid public_profile=Openbaar profiel profile_desc=Uw e-mailadres is openbaar en zal gebruikt worden voor alle account gerelateerde berichtgevingen en bewerkingingen die via de website worden gedaan. -password_username_disabled=Extern opgeslagen gebruikers zijn niet toegestaan om hun gebruikersnaam veranderen. full_name=Volledige naam +website=Website location=Locatie update_profile=Profiel bijwerken -update_profile_success=Uw profiel is succesvol bijgewerkt. +update_profile_success=Je profiel is bijgewerkt. change_username=Username veranderd -change_username_prompt=Deze verandering zal de waarop links zich verhouden tot uw account veranderen. +change_username_prompt=Deze wijziging zal de links naar uw account wijzigen. continue=Doorgaan cancel=Annuleren @@ -282,7 +326,6 @@ new_password=Nieuw wachtwoord retype_new_password=Herhaal Nieuw Wachtwoord password_incorrect=Huidig wachtwoord is niet correct. change_password_success=Wachtwoord is succesvol gewijzigd. U kunt nu met uw nieuwe wachtwoord inloggen. -password_change_disabled=Voor extern opgeslagen gebruikers is het niet toegestaan om hun wachtwoord te wijzigen. emails=E-mailadressen manage_emails=E-mailadressen beheren @@ -290,62 +333,66 @@ email_desc=Uw primaire e-mailadres zal worden gebruikt voor meldingen en andere primary=Primair primary_email=Instellen als primair delete_email=Verwijder -email_deletion=E-mail Verwijderen -email_deletion_desc=Dit e-mailadres verwijdert, worden gerelateerde informatie van uw account te verwijderen. Wilt u verdergaan? +email_deletion=Verwijder email email_deletion_success=E-mail is succesvol verwijderd! add_new_email=Nieuw e-mailadres toevoegen add_email=E-mailadres toevoegen -add_email_confirmation_sent=Een nieuwe bevestigings e-mail werd verstuurd naar '%s', gelieve uw inbox in de komende %d uren te controleren om het bevestigingsproces te voltooien. add_email_success=Het e-mailadres was toegevoegd. manage_ssh_keys=Beheer SSH sleutels +manage_gpg_keys=Beheer GPG sleutels add_key=Sleutel toevoegen ssh_desc=Dit is een lijst van alle SSH sleutels die gekoppeld zijn aan uw account. Verwijder alle sleutels die u niet herkent. ssh_helper=Weet u niet hoe? Lees dan onze handleiding voor het genereren van SSH sleutels of voor algemene SSH problemen. add_new_key=SSH sleutel toevoegen -ssh_key_been_used=Publieke sleutel werd gebruikt. +add_new_gpg_key=GPG sleutel toevoegen ssh_key_name_used=Een publieke sleutel met dezelfde naam bestaat al. +gpg_key_id_used=Een publieke GPG-sleutel met dezelfde naam bestaat al. +gpg_key_email_not_found=De e-mail die is gekoppeld aan de GPG-sleutel kon niet worden gevonden of is nog niet bevestigd: %s key_name=Sleutel naam key_content=Inhoud -add_key_success=Nieuwe SSH sleutel '%s' werd met succes toegevoegd! +add_key_success=Uw SSH-sleutel '%s' is toegevoegd. +add_gpg_key_success=Uw GPG-sleutel '%s' is toegevoegd. delete_key=Verwijder ssh_key_deletion=SSH sleutel verwijderen +gpg_key_deletion=GPG-sleutel verwijderen ssh_key_deletion_desc=Het verwijderen van deze SSH sleutel zal alle verwante toegang tot uw account verwijderen. Wilt u doorgaan? -ssh_key_deletion_success=SSH sleutel is succesvol verwijderd! +ssh_key_deletion_success=De SSH-sleutel is verwijderd. +gpg_key_deletion_success=De GPG-sleutel is verwijderd. add_on=Toegevoegd op +valid_until=Geldig tot en met +valid_forever=Voor altijd geldig last_used=Laatst gebruikt op no_activity=Geen recente activiteiten key_state_desc=Deze sleutel werd gebruikt in de laatste 7 dagen -token_state_desc=Dit token is de laatste 7 dagen gebruikt +token_state_desc=Dit token werd gebruikt in de laatste 7 dagen manage_social=Beheer gekoppelde sociale accounts -social_desc=Dit is een lijst van de bijbehorende sociale accounts koppelingen, Verwijder eventueel koppelingen die u niet herkent. unbind=Loskoppelen -unbind_success=Sociaal account is ontkoppeld. manage_access_token=Persoonlijke toegangstokens beheren generate_new_token=Nieuw Token genereren -tokens_desc=Tokens die u hebt gegenereerd om toegang tot de Gitea APIs te verkrijgen. new_token_desc=Alle tokens hebben volledig toegang tot uw account. token_name=Symbolische naam generate_token=Token genereren -generate_token_succees=Nieuw toegangstoken is met succes gegenereerd! Kopieer uw toegangstoken nu. Dit is de enige keer dat u uw toegangstoken te zien krijgt! delete_token=Verwijderen access_token_deletion=Persoonlijke toegangstoken verwijderen -access_token_deletion_desc=Verwijderen van dit persoonlijke toegangstoken zal alle verwante toegang verwijderen. Wilt u doorgaan? -delete_token_success=Persoonlijke toegangstoken is met succes verwijderd! Vergeet niet uw toepassingen ook bij te werken. +remove_account_link=Gekoppeld account verwijderen + +orgs_none=U bent geen lid van een organisatie. + delete_account=Verwijder uw account delete_prompt=Deze handeling zal uw account definitief verwijderen, u kunt dit NIET terug draaien! confirm_delete_account=Bevestig verwijdering delete_account_title=Account verwijderen -delete_account_desc=Dit account zal permanent worden verwijderd. Wilt u doorgaan? +delete_account_desc=Weet u zeker dat u dit account permanent wilt verwijderen? [repo] owner=Eigenaar repo_name=Naam van repository -repo_name_helper=Een goede repository-naam is kort, makkelijk te onthouden en uniek. +repo_name_helper=Een goede repository-naam is kort, makkelijk te onthouden en uniek. visibility=Zichtbaarheid visiblity_helper=Deze repository is privé visiblity_helper_forced=Sitebeheerder heeft alle nieuwe repositories gedwongen privé te zijn @@ -364,13 +411,16 @@ readme_helper=Selecteer een sjabloon voor het Leesmij-bestand auto_init=Initialiseer deze repository met de geselecteerde bestanden en sjabloon create_repo=Nieuwe repository default_branch=Standaard branch -mirror_interval=Kopie interval(uur) +mirror_prune=Opschonen +mirror_interval=Kloon interval (geldige tijdseenheden "h", "m", "s") +mirror_interval_invalid=Kloon-interval is niet geldig mirror_address=Kopie-adres -mirror_address_desc=Gelieve alle noodzakelijke gebruikersgegevens toe te voegen aan de adresbalk. mirror_last_synced=Laatste synchronisatie watchers=Volgers +stargazers=Stargazers +forks=Forks -form.reach_limit_of_creation=De eigenaar heeft maximale creatie limiet van %d repositories bereikt. +form.reach_limit_of_creation=U hebt uw limiet van %d repositories al bereikt. form.name_reserved=Repositorienaam '%s' is gereserveerd. form.name_pattern_not_allowed=Repository naampatroon '%s' is niet toegestaan. @@ -396,14 +446,16 @@ watch=Volgen unstar=Ontster star=Ster fork=Vork +download_archive=Download deze repository no_desc=Geen omschrijving quick_guide=Snelstart gids clone_this_repo=Kloon deze repository create_new_repo_command=Maak een nieuwe repository aan vanaf de console -push_exist_repo=Push een bestaande repository vanaf de console -repo_is_empty=Deze repositories is leeg, probeer het later opnieuw! +push_exist_repo=Push een bestaande repositorie vanaf de console +bare_message=Deze repository bevat geen inhoud. +code=Code branch=Branch tree=Tree filter_branch_and_tag=Filter op branch of tag @@ -411,32 +463,64 @@ branches=Branches tags=Labels issues=Kwesties pulls=Pull-aanvragen +labels=Labels milestones=Mijlpalen +commits=Commits releases=Publicaties file_raw=Ruw file_history=Geschiedenis file_view_raw=Weergave ruw bestand +file_permalink=Permalink file_too_large=Dit bestand is te groot om te tonen +video_not_supported_in_browser=Uw browser ondersteunt geen HTML5 video. +stored_lfs=Opgeslagen met Git LFS +commit_graph=Commit grafiek editor.new_file=Nieuw bestand editor.upload_file=Bestand uploaden editor.edit_file=Bewerk bestand editor.preview_changes=Voorbeeld tonen -editor.cannot_edit_non_text_files=Kan niet-tekstbestanden niet bewerken editor.edit_this_file=Bestand aanpassen editor.must_be_on_a_branch=U moet in een branch zijn om aanpassingen te maken of voor te stellen editor.fork_before_edit=U moet deze repository eerst forken om dit bestand aan te kunnen passen editor.delete_this_file=Verwijder dit bestand +editor.file_delete_success=Bestand '%s' is succesvol verwijderd! +editor.name_your_file=Bestandsnaam... +editor.or=of +editor.cancel_lower=annuleer +editor.add_tmpl='%s/' toevoegen +editor.add='%s' toevoegen +editor.update='%s' updaten +editor.delete='%s' verwijderen +editor.commit_message_desc=Voeg een optionele beschrijving toe... +editor.create_new_branch=Maak een nieuwe branch voor deze commit en start van een pull-aanvraag. +editor.new_branch_name_desc=Nieuwe branch naam... +editor.cancel=Annuleer +editor.filename_cannot_be_empty=Bestandsnaam mag niet leeg zijn. +editor.branch_already_exists=Branch '%s' bestaat al in deze repository. +editor.file_is_a_symlink=Het bestand '%s' is een symlink die niet kan worden gewijzigd via de web editor +editor.filename_is_a_directory=De bestandsnaam '%s' is een bestaande map in deze repository. +editor.file_editing_no_longer_exists=Het bestand '%s' dat u aan het bewerken bent is niet langer aanwezig in de repository. +editor.file_changed_while_editing=Inhoud van het bestand is gewijzigd sinds u begon met bewerken. Klik hier om te zien wat er is veranderd of Druk op commit opnieuw om deze wijzigingen te overschrijven. +editor.file_already_exists=Een bestand met de naam '%s' bestaat al in deze repository. +editor.no_changes_to_show=Er zijn geen wijzigingen om weer te geven. +editor.fail_to_update_file=Update/maken van bestand '%s' is mislukt: %v +editor.add_subdir=Submap toevoegen... +editor.upload_files_to_dir=Bestanden uploaden naar '%s' +commits.commits=Commits commits.search=Zoeken -commits.find=zoek +commits.find=Zoek +commits.search_all=Alle branches commits.author=Auteur commits.message=Bericht commits.date=Datum commits.older=Ouder commits.newer=Nieuwer + issues.new=Nieuw probleem +issues.new.labels=Labels issues.new.no_label=Geen label issues.new.clear_labels=Verwijder labels issues.new.milestone=Mijlpaal @@ -451,13 +535,21 @@ issues.create=Maak probleem issues.new_label=Nieuw Label issues.new_label_placeholder=Tekst label... issues.create_label=Maak label -issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. +issues.label_templates.title=Laad een vooraf gedefinieerde set labels +issues.label_templates.helper=Selecteer een labelset +issues.label_templates.use=Deze labelset gebruiken +issues.change_milestone_at='mijlpaal bewerkt van %s %s %s' +issues.remove_milestone_at=' %s is verwijderd uit de %s mijlpaal' +issues.deleted_milestone=` (verwijderd)` +issues.open_tab=%d Open issues.close_tab=%d gesloten +issues.filter_label=Label issues.filter_label_no_select=Geen label geselecteerd issues.filter_milestone=Mijlpaal issues.filter_milestone_no_select=Geen geselecteerde mijlpaal issues.filter_assignee=Aangewezene issues.filter_assginee_no_select=Geen geselecteerde verantwoordelijke +issues.filter_type=Type issues.filter_type.all_issues=Alle kwesties issues.filter_type.assigned_to_you=Aan jou toegewezen issues.filter_type.created_by_you=Aangemaakt door jou @@ -469,12 +561,22 @@ issues.filter_sort.recentupdate=Recent bijgewerkt issues.filter_sort.leastupdate=Minst recent bijgewerkt issues.filter_sort.mostcomment=Meest besproken issues.filter_sort.leastcomment=Minst besproken +issues.action_open=Open +issues.action_close=Sluit +issues.action_label=Label +issues.action_milestone=Mijlpaal +issues.action_milestone_no_select=Geen mijlpaal +issues.action_assignee=Toegewezene +issues.action_assignee_no_select=Geen verantwoordelijke issues.opened_by=%[1]s werd geopend door %[3]s issues.opened_by_fake=%[1]s werd geopend door %[2]s issues.previous=Vorige issues.next=Volgende +issues.open_title=Open issues.closed_title=Gesloten issues.num_comments=%d opmerkingen +issues.commented_at=`reageerde %s` +issues.delete_comment_confirm=Weet u zeker dat u deze reactie wilt verwijderen? issues.no_content=Er is nog geen inhoud. issues.close_issue=Sluit issues.close_comment_issue=Sluit en geef commentaar @@ -491,14 +593,22 @@ issues.cancel=Annuleren issues.save=Opslaan issues.label_title=Labelnaam issues.label_color=Labelkleur +issues.label_count=%d labels issues.label_open_issues=%d geopende problemen issues.label_edit=Bewerken issues.label_delete=Verwijder issues.label_modify=Wijzig label issues.label_deletion=Verwijder label -issues.label_deletion_desc=Het verwijderen van dit label zal alle informatie in de gerelateerde problemen verwijderen. Wilt u doorgaan? issues.label_deletion_success=Label werd met succes verwijderd! +issues.label.filter_sort.alphabetically=Alfabetisch +issues.label.filter_sort.reverse_alphabetically=Omgekeerd alfabetisch +issues.label.filter_sort.by_size=Grootte +issues.label.filter_sort.reverse_by_size=Omgekeerde grootte issues.num_participants=%d deelnemers +issues.attachment.open_tab=`Klik om "%s" in een nieuw tabblad te bekijken` +issues.attachment.download=`Klik om "%s" te downloaden` +issues.subscribe=Abonneren +issues.unsubscribe=Uitschrijven pulls.new=Nieuwe Pull aanvraag pulls.compare_changes=Vergelijk veranderingen @@ -506,28 +616,28 @@ pulls.compare_changes_desc=Vergelijk twee branches en maak een pull verzoek voor pulls.compare_compare=vergelijk pulls.no_results=Geen resultaten gevonden. pulls.nothing_to_compare=Er is niets te vergelijken omdat base en head branches dezelfde zijn. -pulls.has_pull_request=` Er is al een pull-aanvraag tussen deze twee targets: %[2]s #% [3]d%[2]s
samenvoegen met %[3]s pulls.merged_title_desc=heeft %[1]d commits samengevoegd van %[2]s naar %[3]s %[4]s pulls.tab_conversation=Discussie +pulls.tab_commits=Commits pulls.tab_files=Bestanden gewijzigd -pulls.reopen_to_merge=Heropen deze pull request aub om een een merge actie uit te voeren. +pulls.reopen_to_merge=Heropen dit pull request aub om een een merge actie uit te voeren. pulls.merged=Samengevoegd -pulls.has_merged=Dit pull-request is samengevoegd! +pulls.has_merged=Dit pull-request is succesvol samengevoegd. pulls.data_broken=Omdat informatie over de fork is verwijderd, zijn de gegevens van dit pull-request niet beschikbaar. pulls.is_checking=Controle van conflicten is nog bezig, ververs deze pagina in enkele ogenblikken. pulls.can_auto_merge_desc=Dit pull-request kan automatisch samengevoegd worden. -pulls.cannot_auto_merge_desc=Dit pull-request kan niet worden gemerged omdat er conflicten zijn. pulls.cannot_auto_merge_helper=Gelieve beide versies manueel samen te voegen om de conflicten op te lossen. pulls.merge_pull_request=Samenvoegen van pull verzoek -pulls.open_unmerged_pull_exists=`U kan de bewerking 'heropenen' niet uitvoeren omdat er al een pull-aanvraag (#%d) is van dezelfde repository met dezelfde informatie. Voeg deze eerst samen.` milestones.new=Nieuwe mijlpaal milestones.open_tab=%d geopend milestones.close_tab=%d gesloten milestones.closed=%s werd gesloten milestones.no_due_date=Geen vervaldatum +milestones.open=Open milestones.close=Sluit milestones.new_subheader=Maak mijlpalen voor het organiseren van uw problemen. milestones.create=Mijlpaal maken @@ -538,16 +648,21 @@ milestones.clear=Leegmaken milestones.invalid_due_date_format=Formaat vervaldatum is ongeldig, moet zijn "jjjj-mm-dd". milestones.create_success=Mijlpaal '%s' is met succes aangemaakt! milestones.edit=Bewerk mijlpaal -milestones.edit_subheader=Gebruik een goede beschrijving voor mijlpalen, om verwarring te voorkomen. milestones.cancel=Annuleer milestones.modify=Mijlpaal wijzigen milestones.edit_success=Wijzigingen van mijlpaal '%s' is met succes opgeslagen! milestones.deletion=Mijlpaal verwijderen -milestones.deletion_desc=Het verwijderen van dit label zal alle informatie in de gerelateerde problemen verwijderen. Wilt u doorgaan? milestones.deletion_success=Mijlpaal is met succes verwijderd! +milestones.filter_sort.most_issues=Meeste problemen +milestones.filter_sort.least_issues=Minste problemen -wiki.welcome=Welkom op de Wiki! +ext_wiki=Ext wiki +ext_wiki.desc=Ext Wiki linkt naar een extern wiki systeem + +wiki=Wiki +wiki.welcome=Welkom op de wiki wiki.welcome_desc=In een wiki kunnen gebruikers samen een project documenteren en bediscussiëren. +wiki.desc=De wiki is een plek om documentatie op te slaan wiki.create_first_page=Maak de eerste pagina wiki.page=Pagina wiki.filter_page=Filter pagina @@ -558,7 +673,6 @@ wiki.last_commit_info=%s heeft deze pagina aangepast %s wiki.edit_page_button=Bewerken wiki.new_page_button=Nieuwe pagina wiki.delete_page_button=Verwijder pagina -wiki.delete_page_notice_1=Dit zal pagina "%s" verwijderen. Weet u het zeker? wiki.page_already_exists=Er bestaat al een wiki-pagina met deze naam. wiki.pages=Pagina’s wiki.last_updated=Laatst bijgewerkt: %s @@ -566,19 +680,27 @@ wiki.last_updated=Laatst bijgewerkt: %s settings=Instellingen settings.options=Opties settings.collaboration=Samenwerking +settings.collaboration.write=Schrijf +settings.collaboration.read=Lees +settings.collaboration.undefined=Ongedefinieerd settings.githooks=Git-hooks settings.basic_settings=Basis instellingen settings.mirror_settings=Kopie Settings -settings.mirror_sync_in_progress=Kopie synchronisatie is bezig, vernieuw de pagina over ongeveer een minuut. +settings.sync_mirror=Nu synchroniseren settings.site=Officiële site settings.update_settings=Instellingen bewerken settings.advanced_settings=Geavanceerde opties +settings.wiki_desc=Wiki-systeem inschakelen +settings.use_internal_wiki=Ingebouwde wiki gebruiken settings.use_external_wiki=Externe wiki gebruiken settings.external_wiki_url=Externe wiki-URL +settings.external_wiki_url_error=Externe Wiki URL is ongeldig settings.external_wiki_url_desc=Bezoekers worden doorgestuurd naar de URL als ze op het tabblad klikken. settings.use_internal_issue_tracker=Use builtin lightweight issue tracker settings.use_external_issue_tracker=Externe issuetracker gebruiken settings.tracker_url_format=URL-formaat externe issuetracker +settings.tracker_issue_style.numeric=Nummeriek +settings.tracker_issue_style.alphanumeric=Alfanummeriek settings.tracker_url_format_desc=U kan de aanduidingen {user} {repo} {index} gebruiken voor de gebruikersnaam, de naam van de repository en de lijst van open tickets. settings.pulls_desc=Schakel 'pull request' in om publieke bijdragen te mogelijk te maken settings.danger_zone=Gevaren zone @@ -600,12 +722,11 @@ settings.wiki_deletion_success=De repository met wiki data is succesvol gewist. settings.delete=Verwijder deze repository settings.delete_desc=Als u eenmaal een repository verwijderd is er geen weg terug. Gelieve zeker te zijn van uw acties. settings.delete_notices_1=- Deze bewerking kan NIET ongedaan gemaakt worden. -settings.delete_notices_2=- Deze bewerking verwijdert permanent alle informatie van deze repository met inbegrip van Git gegevens, tickets, opmerkingen en de toegang van medewerkers. -settings.deletion_success=Repository is succesvol verwijderd! -settings.update_settings_success=Repository instellingen zijn succesvol bijgewerkt. +settings.deletion_success=De repository is verwijderd. +settings.update_settings_success=Repository opties zijn verwijderd. settings.transfer_owner=Nieuwe eigenaar settings.make_transfer=Maak overdracht -settings.transfer_succeed=Eigendom repository succesvol overgedragen +settings.transfer_succeed=Eigendom repository succesvol overgedragen. settings.confirm_delete=Bevestig verwijdering settings.add_collaborator=Nieuwe medewerker toevoegen settings.add_collaborator_success=medewerker is toegevoegd. @@ -617,15 +738,13 @@ settings.search_user_placeholder=Zoek gebruiker... settings.org_not_allowed_to_be_collaborator=De organisatie kan niet toegevoegd worden als medewerker. settings.user_is_org_member=Gebruiker is lid van de organisatie die als een medewerker kan niet worden toegevoegd. settings.add_webhook=Webhook toevoegen -settings.hooks_desc=Webhooks dat de externe diensten om kennisgevingen te ontvangen wanneer bepaalde gebeurtenissen op Gitea plaatsvinden. Wanneer de opgegeven gebeurtenissen plaatsvinden, sturen we een POST-aanvraag naar elk van de URL's die u opgeeft. Meer informatie vindt u in onze Webhooks gids. settings.webhook_deletion=Webhook verwijderen -settings.webhook_deletion_desc=Verwijderen van deze webhook zal de informatie en alle geschiedenis verwijderen. Wilt u doorgaan? settings.webhook_deletion_success=Webhook is succesvol verwijderd! settings.webhook.test_delivery=Test-bezorging settings.webhook.test_delivery_desc=Stuur een nep push bericht om de webhook te testen -settings.webhook.test_delivery_success=De test webhook is toegevoegd aan de wachtrij. Het kan enkele seconden duren voor deze in de geschiedenis wordt weergegeven. settings.webhook.request=Verzoek settings.webhook.response=Antwoord +settings.webhook.headers=Headers settings.webhook.payload=Lading settings.webhook.body=Inhoud settings.githooks_desc=Git haken worden aangedreven door Git zelf, u kunt bestanden van ondersteunde haken in de lijst hieronder om aangepaste acties van toepassing bewerken. @@ -633,7 +752,6 @@ settings.githook_edit_desc=Als haak niet actief is, zal monster inhoud worden ge settings.githook_name=Haak naam settings.githook_content=Haak inhoud settings.update_githook=Haak bijwerken -settings.add_webhook_desc=We sturen een POST-aanvraag naar de onderstaande URL met details voor alle geplaatste gebeurtenissen. U kunt ook opgeven welke gegevensindeling u wenst te ontvangen (JSON, x-1-800-www-Dell-vorm-urlencoded, enz.). Meer informatie kan gevonden worden in Webhooks gids. settings.payload_url=Nettolading URL settings.content_type=Content type settings.secret=Geheim @@ -646,9 +764,9 @@ settings.event_send_everything=Ik moet alles hebben. settings.event_choose=Laat me kiezen wat ik nodig heb. settings.event_create=Creëer settings.event_create_desc=Branch, of tag aangemaakt +settings.event_pull_request=Pull request settings.event_push_desc=Git push naar een repository settings.active=Actief -settings.active_helper=We zullen details van de gebeurtenissen af leveren wanneer deze webhook wordt geactiveerd. settings.add_hook_success=Nieuwe webhook toegevoegd. settings.update_webhook=Bewerk webhook settings.update_hook_success=Webhook is bijgewerkt. @@ -669,18 +787,29 @@ settings.key_been_used=Deploy sleutel inhoud werd gebruikt. settings.key_name_used=Deploy sleutel met eenzelfde naam bestaat al. settings.add_key_success=Nieuwe deploy sleutel '%s' werd succesvol toegevoegd! settings.deploy_key_deletion=Verwijder deploy sleutel -settings.deploy_key_deletion_desc=Het verwijderen van deze deploy sleutel zal alle gerelateerde toegang verwijderen voor deze repository. Wilt u doorgaan? settings.deploy_key_deletion_success=Deploy sleutel werd met succes verwijderd! +settings.branches=Branches +settings.protected_branch=Branch bescherming +settings.protected_branch_can_push=Push toestaan? +settings.add_protected_branch=Bescherming aanzetten +settings.delete_protected_branch=Bescherming uitzetten +settings.add_protected_branch_failed=%s vergrendelen is mislukt +settings.remove_protected_branch_success=%s is ontgrendeld +settings.choose_branch=Kies een branch... +settings.no_protected_branch=Er zijn geen beschermde branches diff.browse_source=Bladeren bron diff.parent=bovenliggende -diff.data_not_available=Diff gegevens niet beschikbaar. +diff.commit=commit +diff.data_not_available=Diff gegevens niet beschikbaar diff.show_diff_stats=Toon Diff Stats diff.show_split_view=Zij-aan-zij weergave diff.show_unified_view=Gecombineerde weergave diff.stats_desc=%d gewijzigde bestanden met toevoegingen van %d en %d verwijderingen diff.view_file=Bestand weergeven +diff.file_suppressed=Diff onderdrukt omdat het te groot bestand +release.releases=Publicaties release.new_release=Nieuwe release release.draft=Concept release.prerelease=Voorlopige versie @@ -688,11 +817,8 @@ release.stable=Stabiel release.edit=bewerken release.ahead=%d aanpassingen aan %s sinds deze versie release.source_code=Broncode -release.new_subheader=Publiceer releases om te itereren. -release.edit_subheader=Een gedetailleerd changelog helpt gebruikers te begrijpen wat er is verbeterd in deze release. release.tag_name=Tagnaam release.target=Doel -release.tag_helper=Kies een bestaande tag, of creëer een nieuwe tag bij publiceren. release.title=Titel release.content=Inhoud release.write=Schrijf @@ -706,10 +832,15 @@ release.save_draft=Concept opslaan release.edit_release=Release bewerken release.delete_release=Deze release verwijderen release.deletion=Release verwijderen -release.deletion_desc=Als deze release verwijdert, worden de bijbehorende Git tag ook gewist. Wilt u doorgaan? -release.deletion_success=Release is verwijderd! release.tag_name_already_exist=Versie met deze naam bestaat al. +release.tag_name_invalid=Labelnaam is niet geldig. +release.downloads=Downloads +branch.delete=Verwijder branch %s +branch.delete_desc=Het verwijderen van een branch is permanent. Er is geen manier om dit ongedaan te maken. +branch.delete_notices_1=- Deze bewerking kan NIET ongedaan gemaakt worden. +branch.deletion_success=%s is verwijderd. +branch.deletion_failed=%s verwijderen is mislukt. [org] org_name_holder=Organisatienaam @@ -719,33 +850,36 @@ create_org=Nieuwe organisatie aanmaken repo_updated=Geupdate people=Mensen invite_someone=Iemand uitnodigen +teams=Teams lower_members=leden +lower_repositories=repositories create_new_team=Nieuw team aanmaken org_desc=Omschrijving team_name=Teamnaam team_desc=Omschrijving team_name_helper=U gebruikt deze naam om dit team te vermelden in conversaties. -team_desc_helper=Waar gaat dit team doen? +team_desc_helper=Waar is dit team voor? team_permission_desc=Welke privileges zou dit team moeten hebben? form.name_reserved=Organisatienaam '%s' is gereserveerd. form.name_pattern_not_allowed=Organisatie naampatroon '%s' is niet toegestaan. +form.create_org_not_allowed=Deze gebruiker mag geen organisaties maken. settings=Instellingen settings.options=Opties settings.full_name=Volledige naam +settings.website=Website settings.location=Locatie settings.update_settings=Instellingen bijwerken settings.update_setting_success=Organisatie instellingen zijn succesvol bijgewerkt. settings.change_orgname_prompt=Deze verandering beinvloed de verhouding tussen links en de organisatie. -settings.update_avatar_success=Organisatie avatar-instellingen zijn succesvol gewijzigd. +settings.update_avatar_success=De avatar van de organisatie is aangepast. settings.delete=Verwijder organisatie settings.delete_account=Verwijder deze organisatie settings.delete_prompt=Deze actie zal de origanisatie permanent verwijderen. U kunt dit NIET terug draaien! settings.confirm_delete_account=Bevestig verwijdering settings.delete_org_title=Verwijderen organsiatie settings.delete_org_desc=Deze organisatie zal permanent worden verwijderd, wilt u doorgaan? -settings.hooks_desc=Een webhook toevoegen die door alle repositories in deze organisatie getriggerd kan worden. members.membership_visibility=Zichtbaarheid lidmaatschap: members.public=Openbaar @@ -765,9 +899,7 @@ teams.leave=Vertlaat teams.read_access=Leestoegang teams.read_access_helper=Dit team is in staat om zijn repositories te bekijken en te klonen. teams.write_access=Schrijf toegang -teams.write_access_helper=Dit team is in staat om zijn repositories te bekijken en push aanvragen te verwerken. teams.admin_access=Beheerder toegang -teams.admin_access_helper=Dit team is in staat om push & pull aanvragen te verwerken en om nieuwe medewerkers toe te voegen. teams.no_desc=Dit team heeft geen omschrijving teams.settings=Instellingen teams.owners_permission_desc=Eigenaren hebben volledige toegang tot alle repositories en hebben beheerder rechten over de organisatie. @@ -776,8 +908,7 @@ teams.update_settings=Instellingen bijwerken teams.delete_team=Verwijder deze team teams.add_team_member=Nieuwe team lid aanmaken teams.delete_team_title=Team verwijderen -teams.delete_team_desc=Dit team zal worden verwijderd. De leden van dit team zullen toegang tot alle repositories van het team verliezen. Wilt u doorgaan? -teams.delete_team_success=Gekozen team is succesvol verwijderd. +teams.delete_team_success=Het team is verwijderd. teams.read_permission_desc=Dit team heeft Lees rechten : leden kunnen repositories lezen en klonen. teams.write_permission_desc=Dit team heeft Schrijf rechten : leden kunnen repositories lezen en push aanvragen verwerken. teams.admin_permission_desc=Dit team heeft Beheerders rechten : leden kunnen repositories lezen en push aanvragen verwerken en medewerkers toevoegen. @@ -788,8 +919,10 @@ teams.remove_repo=Verwijder teams.add_nonexistent_repo=De opslagplaats die u probeert toe te voegen bestaat niet: maak deze eerst aan. [admin] +dashboard=Overzicht users=Gebruikers organizations=Organisaties +repositories=Repositories authentication=Authenticaties config=Configuratie notices=Systeem aankondigingen @@ -805,23 +938,14 @@ dashboard.statistic_info=Gitea database heeft %d gebruikers, %d or dashboard.operation_name=Bewerking naam dashboard.operation_switch=Omschakelen dashboard.operation_run=Uitvoeren -dashboard.clean_unbind_oauth=Clean unbound OAuths -dashboard.clean_unbind_oauth_success=Alle OAuth bindingen zijn verwijderd. dashboard.delete_inactivate_accounts=Verwijder alle inactieve accounts dashboard.delete_inactivate_accounts_success=Alle inactieve accounts zijn verwijderd. dashboard.delete_repo_archives=Verwijderen van alle repositories archieven -dashboard.delete_repo_archives_success=Alle repositories archieven zijn verwijderd. -dashboard.delete_missing_repos=Verwijder alle repositories zonder Git files -dashboard.delete_missing_repos_success=Alle repositories zonder Git files zijn verwijderd. -dashboard.git_gc_repos=Garbage collectie uitvoeren -dashboard.git_gc_repos_success=Garbage collectie met succes uitgevoerd. -dashboard.resync_all_sshkeys=Herschrijf '.ssh/authorized_keys' (Let op: alle sleutels die niet van Gitea zijn zullen verloren gaan!) +dashboard.delete_repo_archives_success=Alle repositorie archieven zijn verwijderd. +dashboard.git_gc_repos=Garbage collectie op alle repositories uitvoeren dashboard.resync_all_sshkeys_success=Alle publieke sleutels zijn herschreven. -dashboard.resync_all_update_hooks=Herschrijf alle repository-hooks (nodig als de configuratie bestandslocatie is gewijzigd) -dashboard.resync_all_update_hooks_success=Alle repository-hooks zijn herschreven. -dashboard.reinit_missing_repos=Alle repositories zonder Git files opnieuw initialiseren -dashboard.reinit_missing_repos_success=Alle repositories zonder Git files zijn succesvol opnieuw geinitializeerd. - +dashboard.sync_external_users=Externe gebruikersgegevens synchroniseren +dashboard.sync_external_users_started=Externe gebruiker synchronisatie gestart dashboard.server_uptime=Uptime server dashboard.current_goroutine=Huidige Goroutines dashboard.current_memory_usage=Huidig geheugen gebruik @@ -852,52 +976,58 @@ dashboard.total_gc_pause=Totaal GC verwerkingstijd dashboard.last_gc_pause=Laatste GC verwerkingstijd dashboard.gc_times=GC verwerkingen -users.user_manage_panel=Gebruikers beheren users.new_account=Nieuw account aanmaken users.name=Naam users.activated=Geactiveerd +users.repos=Repos users.created=Aangemaakt +users.last_login=Laatste Login +users.never_login=Nooit ingelogd users.send_register_notify=Stuur notificatie voor registratie naar gebruiker -users.new_success=Nieuw account '%s' is aangemaakt. +users.new_success=Het account '%s' is aangemaakt. users.edit=Bewerken users.auth_source=Authenticatiebron users.local=Lokaal users.auth_login_name=Authenticatie-loginnaam users.password_helper=Laat leeg om ongewijzigd te blijven. -users.update_profile_success=Profiel is succesvol bijgewerkt. +users.update_profile_success=Je profiel is bijgewerkt. users.edit_account=Bewerk account users.max_repo_creation=Maximum-limiet voor aanmaken van repositories users.max_repo_creation_desc=(Zet op -1 om de globale limiet te gebruiken) -users.is_activated=Dit account is geactiveerd +users.prohibit_login=Deze account is geblokkeerd users.is_admin=Dit account heeft beheerdersrechten -users.allow_git_hook=Deze account beschikt over machtigingen voor het maken van Git haken users.allow_import_local=Dit account mag lokale repositories importeren +users.allow_create_organization=Deze account beschikt over machtigingen voor het maken van organisaties users.update_profile=Account profiel bijwerken users.delete_account=Dit account verwijderen -users.still_own_repo=Dit account is nog steeds eigendom van een repository. U moet deze repository eerst verwijderen of overdragen. -users.still_has_org=Deze account nog steeds lidmaatschap van organisatie, u hebt naar links of hen eerst verwijderen. -users.deletion_success=Het account is verwijderd! +users.deletion_success=Account is succesvol verwijderd. orgs.org_manage_panel=Organisaties beheren orgs.name=Naam +orgs.teams=Teams orgs.members=Leden +orgs.new_orga=Nieuwe organisatie maken -repos.repo_manage_panel=Repositoriebeheerpaneel +repos.repo_manage_panel=Repositories beheren repos.owner=Eigenaar repos.name=Naam repos.private=Prive repos.watches=Volgers repos.stars=Sterren repos.issues=Kwesties +repos.size=Grootte -auths.auth_manage_panel=Authenticatie-beheer paneel +auths.auth_manage_panel=Authenticatie beheer auths.new=Nieuwe bron toevoegen auths.name=Naam +auths.type=Type auths.enabled=Ingeschakeld auths.updated=Bijgewerkt auths.auth_type=Authenticatietype auths.auth_name=Authenticatienaam +auths.security_protocol=Beveiligingsprotocol auths.domain=Domein +auths.host=Host auths.port=Poort auths.bind_dn=Binden DN auths.bind_password=Bind wachtwoord @@ -915,19 +1045,20 @@ auths.smtp_auth=SMTP-authenticatietype auths.smtphost=SMTP host auths.smtpport=SMTP poort auths.allowed_domains=Toegelaten domeinen -auths.allowed_domains_helper=Laat dit leeg om geen enkel domein te beperken. Meerdere domeinen moeten door een komma (',') gescheiden worden. auths.enable_tls=Activeer TLS-encryptie auths.skip_tls_verify=TLS-verificatie overslaan auths.pam_service_name=PAM servicenaam +auths.oauth2_use_custom_url=Aangepaste URL's gebruiken in plaats van de standaard-URL 's +auths.oauth2_tokenURL=Token URL +auths.oauth2_authURL=Autorisatie URL +auths.oauth2_profileURL=Profiel URL +auths.oauth2_emailURL=E-mail URL auths.enable_auto_register=Activeer automatische registratie -auths.edit=Verificatie-instelling bewerken +auths.tips=Tips auths.activated=Deze autorisatiemethode is geactiveerd -auths.new_success=Nieuwe authenticatie '%s' werd toegevoegd. -auths.update_success=Authenticatie instellingen zijn succesvol gewijzigd. auths.update=Authenticatie-instellingen bijwerken auths.delete=Deze authenticatiewijze verwijderen -auths.delete_auth_title=Authenticatie verwijderd -auths.delete_auth_desc=Deze authenticatie zal verwijderd worden, wilt u verdergaan? +auths.login_source_exist=Er bestaat al een login bron '%s'. config.server_config=Serverconfiguratie config.app_name=Applicatienaam @@ -938,7 +1069,9 @@ config.offline_mode=Offline-modus config.disable_router_log=Router-log uitschakelen config.run_user=Uitvoerende gebruiker config.run_mode=Uitvoer modus +config.git_version=Git versie config.repo_root_path=Repository basis pad +config.lfs_root_path=LFS rootpad config.static_file_root_path=Statische bestanden basis pad config.log_file_root_path=Log bestand basis pad config.script_type=Script type @@ -946,7 +1079,6 @@ config.reverse_auth_user=Omgekeerde verificatie gebruiker config.ssh_config=SSH-configuratie config.ssh_enabled=Ingeschakeld -config.ssh_start_builtin_server=Ingebouwde server starten config.ssh_domain=Domein config.ssh_port=Poort config.ssh_listen_port=Luister op poort @@ -957,6 +1089,8 @@ config.ssh_minimum_key_size_check=Controleer minimale key-lengte config.ssh_minimum_key_sizes=Minimale key-lengtes config.db_config=Databaseconfiguratie +config.db_type=Type +config.db_host=Host config.db_name=Naam config.db_user=Gebruiker config.db_ssl_mode=SSL modus @@ -973,20 +1107,19 @@ config.mail_notify=E-mailnotificaties config.disable_key_size_check=Controle op key-lengte uitschakelen config.enable_captcha=CAPTCHA inschakelen config.active_code_lives=Actieve Code leven -config.reset_password_code_lives=Reset wachtwoord Code leven +config.no_reply_address=No-reply emailadres config.webhook_config=Webhook configuratie config.queue_length=Lengte van wachtrij config.deliver_timeout=Bezorging verlooptijd -config.skip_tls_verify=TLS certificaat controle overslaan config.mailer_config=Mailerconfiguatie config.mailer_enabled=Ingeschakeld config.mailer_disable_helo=Schakel HELO uit config.mailer_name=Naam +config.mailer_host=Host config.mailer_user=Gebruiker config.send_test_mail=Testbericht verzenden -config.test_mail_failed=Verzending van een testmail naar '%s' is mislukt: %v config.test_mail_sent=Test-email is verstuurd naar '%s'. config.oauth_config=OAuth-configuratie @@ -1011,6 +1144,7 @@ config.picture_config=Foto configuratie config.picture_service=Foto service config.disable_gravatar=Gravatar uitschakelen +config.git_migrate_timeout=Migratie time-out config.git_mirror_timeout=Kopie Update Timeout config.log_config=Logconfiguratie @@ -1028,50 +1162,72 @@ monitor.start=Starttijd monitor.execute_time=Uitvoertijd notices.system_notice_list=Systeem aankondigingen -notices.view_detail_header=Bekijk bericht details notices.actions=Acties notices.select_all=Alles selecteren notices.deselect_all=Alles deselecteren notices.inverse_selection=Selectie omkeren notices.delete_selected=Selectie verwijderen notices.delete_all=Verwijder alle berichten +notices.type=Type notices.type_1=Opslagplaats notices.desc=Beschrijving [action] create_repo=repository aangemaakt in %s +rename_repo=hernoemde repository van %[1]s naar %[3]s commit_repo=push update naar %[3]s in %[4]s create_issue=`opende issue in %s#%[2]s` -comment_issue=`reactie op issue %s#%[2]s`" +close_issue=`sloot kwestie %s#%[2]s` +reopen_issue=`heropende kwestie %s#%[2]s` +create_pull_request=`maakte pull request %s#%[2]s` +close_pull_request=`sloot pull request %s#%[2]s` +reopen_pull_request=`heropende pull request %s#%[2]s` +comment_issue=`reactie op issue %s#%[2]s` +merge_pull_request=`voegde pull request samen %s#%[2]s` transfer_repo=repository verplaatst naar %s naar %s push_tag=geduwd label %[2]s naar %[3]s -compare_commits=Toon vergelijking voor deze %d commits +compare_commits=Vergelijk %d commits [tool] -ago=geleden -from_now=vanaf nu +ago=%s geleden +from_now=%s vanaf nu now=nu -1s=1 seconde %s -1m=1 minuut %s -1h=1 uur %s -1d=1 dag %s -1mon=1 maand %s -1y=1 jaar %s -seconds=%d seconden %s -minutes=%d minuten %s -hours=%d uur %s -days=%d dagen %s -weeks=%d weken %s -months=%d maanden %s -years=%d jaren %s +future=toekomst +1s=1 seconde +1m=1 minuut +1h=1 uur +1d=1 dag +1w=1 week +1mon=1 maand +1y=1 jaar +seconds=%d seconden +minutes=%d minuten +hours=%d uur +days=%d dagen +weeks=%d weken +months=%d maanden +years=%d jaren raw_seconds=seconden raw_minutes=minuten [dropzone] -default_message=Drop bestanden hier of klik om te uploaden. +default_message=Sleep bestanden hier of klik om te uploaden. invalid_input_type=U kunt geen bestanden van dit type uploaden. file_too_big=Bestandsgrootte ({{filesize}} MB) overschrijdt de maximale grootte ({{maxFilesize}} MB). remove_file=Verwijder bestand [notification] +notifications=Notificaties +unread=Ongelezen +read=Gelezen +no_unread=Je hebt geen ongelezen meldingen. +no_read=Je hebt geen gelezen meldingen. +mark_as_read=Markeer als gelezen +mark_as_unread=Markeer als ongelezen + +[gpg] +error.no_committer_account=Geen account gekoppeld aan de committers e-mail +error.no_gpg_keys_found=Geen bekende sleutel gevonden voor deze handtekening in de database + +[units] diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 0cf0092..e4c5dc0 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -28,7 +28,6 @@ mirror=Kopia lustrzana new_repo=Nowe repozytorium new_migrate=Nowa migracja new_mirror=Nowa kopia lustrzana -new_fork=Forkuj repozytorium new_org=Nowa organizacja manage_org=Zarządzaj organizacjami admin_panel=Panel admina @@ -37,6 +36,7 @@ settings=Ustawienia your_profile=Twój profil your_settings=Twoje ustawienia + activities=Aktywności pull_requests=Oczekujące zmiany issues=Problemy @@ -45,38 +45,28 @@ cancel=Anuluj [install] install=Instalacja -title=Kroki instalacyjne dla pierwszego uruchomienia -docker_helper=Jeśli używasz Gitea wewnątrz Dockera, proszę przeczytaj wytyczne, zanim zmienisz coś na tej stronie! -requite_db_desc=Gitea wymaga MySQL, PostgreSQL, SQLite3 lub TiDB. db_title=Ustawienia bazy danych db_type=Typ bazy danych user=Użytkownik password=Hasło db_name=Nazwa bazy danych -db_helper=Proszę użyć silnika INNODB z kodowaniem utf8_general_ci dla MySQL. ssl_mode=Tryb SSL path=Ścieżka -sqlite_helper=Ścieżka do pliku bazy danych SQLite3 lub TiDB.
Proszę użyć ścieżki bezwzględnej podczas uruchamiania usługi. err_empty_db_path=Ścieżka do bazy danych SQLite3 lub TiDB nie może być pusta. err_invalid_tidb_name=Nazwa bazy danych TiDB nie może zawierać znaków „.” i „-”. no_admin_and_disable_registration=Rejestracji nie można wyłączyć bez tworzenia konta admina. err_empty_admin_password=Hasło admina nie może być puste. -general_title=Ustawienia ogólne Gitea app_name=Nazwa aplikacji -app_name_helper=Umieść tutaj wielką i głośną nazwę swojej organizacji! repo_path=Katalog repozytoriów -repo_path_helper=W tym katalogu zostaną zapisane wszystkie repozytoria Git. run_user=Użytkownik uruchomieniowy run_user_helper=Użytkownik musi mieć dostęp do katalogu repozytoriów i uruchamiania Gitea. domain=Domena domain_helper=To wpłynie na URLe do klonowania poprzez SSH. ssh_port=Port SSH -ssh_port_helper=Numer portu, z którego korzysta z serwer SSH http_port=Port HTTP http_port_helper=Numer portu na którym aplikacja jest dostępna. app_url=Adres URL aplikacji -app_url_helper=To wpłynie na adresy klonowania HTTP/HTTPS i w wiadomościach e-mail. log_root_path=Ścieżka dla logów log_root_path_helper=Katalog do zapisu logów. @@ -84,14 +74,10 @@ optional_title=Ustawienia opcjonalne email_title=Ustawienia serwera e-mail smtp_host=Serwer SMTP smtp_from=Od -smtp_from_helper=Adres w polu „Od”, zgodnie z RFC 5322. Może być to po prostu adres email, bądź adres w formacie „Nazwa” . -mailer_user=E-mail nadawcy mailer_password=Hasło nadawcy register_confirm=Włącz potwierdzenia rejestracji -mail_notify=Włącz powiadomienia e-mail server_service_title=Ustawienia serwera i innych usług offline_mode=Włącz tryb offline -offline_mode_popup=Wyłącz CDN, nawet w trybie produkcyjnym, wszystkie pliki zasobów będą podawane lokalnie. disable_gravatar=Wyłącz usługę Gravatar disable_gravatar_popup=Wyłącz Gravatar i niestandardowe źrodła, awatary muszą być przesyłane przez użytkowników. federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. @@ -101,7 +87,6 @@ enable_captcha=Włącz Captcha enable_captcha_popup=Wymagaj walidacji captcha przy samodzielnej rejestracji użytkownika. require_sign_in_view=Włącz wymóg zalogowania do przeglądania stron require_sign_in_view_popup=Tylko zalogowani użytkownicy będą mogli przeglądać strony, goście zobaczą tylko stronę logowania. -admin_setting_desc=Nie musisz tworzyć konta administratora teraz, użytkownik z ID = 1 zyska dostęp administratora automatycznie. admin_title=Ustawienia konta administratora admin_name=Nazwa Użytkownika admin_password=Hasło @@ -109,13 +94,8 @@ confirm_password=Potwierdź hasło admin_email=E-mail administratora install_btn_confirm=Zainstaluj Gitea test_git_failed=Nie udało się przetestować polecenia „git”: %v -sqlite3_not_available=Twoje wydanie nie obsługuje SQLite3, proszę pobrać oficjalne wydanie z %s, a NIE wersję z gobuild. -invalid_db_setting=Ustawienia bazy danych nie są poprawne: %v invalid_repo_path=Ścieżka repozytoriów nie jest poprawna: %v -run_user_not_match=Użytkownik aplikacji nie jest aktualnym użytkownikiem: %s -> %s -save_config_failed=Nie udało się zapisać konfiguracji: %v invalid_admin_setting=Nieprawidłowe ustawienia konta admina: %v -install_success=Cześć! Cieszymy się, że wybierałeś Gitea, baw się dobrze. invalid_log_root_path=Ścieżka dla logów jest niepoprawna: %v [home] @@ -123,7 +103,6 @@ uname_holder=Nazwa użytkownika lub e-mail password_holder=Hasło switch_dashboard_context=Przełącz kontekst pulpitu my_repos=Moje repozytoria -show_more_repos=Pokaż więcej repozytoriów... collaborative_repos=Wspólne repozytoria my_orgs=Moje organizacje my_mirrors=Moje kopie lustrzane @@ -137,36 +116,23 @@ users=Użytkownicy search=Wyszukiwanie [auth] -create_new_account=Załóż nowe konto register_helper_msg=Masz już konto? Zaloguj się teraz! -social_register_helper_msg=Masz już konto? Powiąż je teraz! disable_register_prompt=Przepraszamy rejestracja została wyłączona. Prosimy o kontakt z administratorem serwisu. disable_register_mail=Przepraszamy, potwierdzenia rejestracji zostały wyłączone przez administratora. remember_me=Zapamiętaj mnie -forgot_password=Zapomniałem hasła -forget_password=Zapomniałeś hasła? sign_up_now=Potrzebujesz konta? Zarejestruj się teraz. -confirmation_mail_sent_prompt=Nowa wiadomość e-mail z potwierdzeniem została wysłana do %s, proszę sprawdzić swoją skrzynkę odbiorczą w ciągu najbliższych godzin %d aby dokończyć proces rejestracji. active_your_account=Aktywuj swoje konto prohibit_login=Logowanie zabronione -prohibit_login_desc=Nie możesz się zalogować na to konto, skontaktuj się z administratorem strony. -resent_limit_prompt=Niestety, zbyt często wysyłasz e-mail aktywacyjny. Proszę odczekać 3 minuty. has_unconfirmed_mail=Witaj, %s, masz niepotwierdzony adres e-mail (%s). Jeśli nie otrzymałeś wiadomości e-mail z potwierdzeniem lub potrzebujesz wysłać nową, kliknij na poniższy przycisk. resend_mail=Kliknij tutaj, aby wysłać e-mail aktywacyjny -email_not_associate=Ten adres e-mail nie jest skojarzony z żadnym kontem. -send_reset_mail=Kliknij tutaj, aby (ponownie) wysłać e-mail z instrukcjami resetowania hasła reset_password=Resetowanie hasła -invalid_code=Niestety, Twój kod potwierdzający wygasł lub jest nieprawidłowy. reset_password_helper=Kliknij tutaj, aby zresetować hasło password_too_short=Długość hasła nie może być mniejsza niż %d znaków. -non_local_account=Nie lokalne konta nie mogą zmieniać haseł przez Gitea. [mail] activate_account=Prosimy aktywować swoje konto activate_email=Potwierdź swój adres e-mail reset_password=Zmień swoje hasło -register_success=Zostałeś zarejestrowany, witamy -register_notify=Witamy na pokładzie [modal] yes=Tak @@ -193,8 +159,6 @@ TreeName=Ścieżka pliku Content=Treść require_error=` nie może być puste.` -alpha_dash_error=` musi się składać z prawidłowych znaków alfanumerycznych, myślników oraz podkreśleń.` -alpha_dash_dot_error=` musi się składać z prawidłowych znaków alfanumerycznych, myślników, podkreśleń oraz kropek.` size_error=` musi być wielkości %s.` min_size_error=` musi zawierać co najwyżej %s znaków.` max_size_error=` musi zawierać co najwyżej %s znaków.` @@ -202,28 +166,10 @@ email_error=` nie jest poprawnym adresem e-mail.` url_error=` nie jest poprawnym adresem URL.` include_error=`musi zawierać tekst '%s'.` unknown_error=Nieznany błąd: -captcha_incorrect=Kod captcha nie zgadza się. -password_not_match=Hasło i potwierdzenie nie zgadzają się. -username_been_taken=Nazwa użytkownika jest już zajęta. -repo_name_been_taken=Nazwa repozytorium jest już zajęta. -org_name_been_taken=Nazwa organizacji jest już zajęta. -team_name_been_taken=Nazwa zespołu jest już zajęta. -email_been_used=Adres e-mail jest już zarejestrowany. -username_password_incorrect=Nazwa użytkownika lub hasło nie jest prawidłowe. -enterred_invalid_repo_name=Upewnij się, że wprowadzona nazwa repozytorium jest poprawna. -enterred_invalid_owner_name=Upewnij się, że nazwa właściciela repozytorium jest poprawna. -enterred_invalid_password=Proszę upewnij się, że wprowadzono hasło jest poprawne. -user_not_exist=Podany użytkownik nie istnieje. -last_org_owner=Usuwany użytkownik jest ostatnim członkiem ekipy właścicieli. Musi być inny właściciel. -invalid_ssh_key=Niestety, nie jesteśmy stanie zweryfikować Twojego klucza SSH: %s -unable_verify_ssh_key=Gitea nie może zweryfikować Twojego klucza SSH, ale zakładamy, że jest poprawny, proszę sprawdź to samodzielnie. auth_failed=Uwierzytelnianie nie powiodło się: %v -still_own_repo=Twoje konto dalej posiada przynajmniej jedno repozytorium, które musisz usunąć lub przekazać. -still_has_org=Twoje konto dalej posiada członkostwo w przynajmniej jednej organizacji, którą musisz najpierw opuścić. -org_still_own_repo=Ta organizacja dalej jest właścicielem repozytorium, które musisz usunąć bądź przekazać. target_branch_not_exist=Gałąź docelowa nie istnieje. @@ -238,14 +184,11 @@ following=Obserwowani follow=Obserwuj unfollow=Przestań obserwować -form.name_reserved=Nazwa użytkownika „%s” jest zarezerwowana. -form.name_pattern_not_allowed=Wzorzec nazwy użytkownika „%s” jest niedozwolony. [settings] profile=Profil password=Hasło avatar=Awatar -ssh_keys=Klucze SSH social=Konta społecznościowe applications=Aplikacje orgs=Organizacje @@ -253,15 +196,11 @@ delete=Usuń konto uid=UID public_profile=Profil publiczny -profile_desc=Twój adres e-mail jest publiczny i będzie używany dla wszystkich powiadomień związanych z kontem i dla każdej operacji wykonanej przez tę stronę. -password_username_disabled=Nie lokalni użytkownicy nie mogą zmieniać swojej nazwy użytkownika. full_name=Imię i nazwisko website=Strona location=Lokalizacja update_profile=Zaktualizuj profil -update_profile_success=Twój profil został pomyślnie zaktualizowany. change_username=Zmieniono nazwę użytkownika -change_username_prompt=Ta zmiana wpłynie na sposób w jaki łącza odnoszą się do Twojego konta. continue=Kontynuuj cancel=Anuluj @@ -271,15 +210,11 @@ choose_new_avatar=Wybierz nowy avatar update_avatar=Zaktualizuj ustawienia awatara delete_current_avatar=Usuń obecny Avatar uploaded_avatar_not_a_image=Załadowany plik nie jest obrazem. -update_avatar_success=Ustawienia awatarów zostały pomyślnie zaktualizowane. change_password=Zmień hasło old_password=Aktualne hasło new_password=Nowe hasło retype_new_password=Powtórz nowe hasło -password_incorrect=Bieżące hasło nie jest prawidłowe. -change_password_success=Hasło zostało zmienione pomyślnie. Możesz teraz zalogować się za pomocą nowego hasła. -password_change_disabled=Nie lokalni użytkownicy nie mogą zmieniać swoich haseł. emails=Adresy e-mail manage_emails=Zarządzaj adresami e-mail @@ -287,70 +222,50 @@ email_desc=Twój podstawowy adres e-mail będzie używany do powiadomień i inny primary=Podstawowy primary_email=Ustaw jako podstawowy delete_email=Usuń -email_deletion=Usunięcie wiadomości e-mail -email_deletion_desc=Usunięcie tego adresu e-mail spowoduje usunięcie innych informacji związanych z Twoim kontem. Czy chcesz kontynuować? email_deletion_success=E-mail został usunięty pomyślnie! add_new_email=Dodaj nowy e-mail add_email=Dodaj e-mail -add_email_confirmation_sent=Nowa wiadomość e-mail z potwierdzeniem została wysłana do '%s', proszę sprawdzić swoją skrzynkę odbiorczą w ciągu %d godzin, aby dokończyć proces potwierdzania. add_email_success=Twój nowy e-mail został dodany pomyślnie. manage_ssh_keys=Zarządzaj kluczami SSH add_key=Dodaj klucz -ssh_desc=To jest lista kluczy SSH powiązanych z Twoim kontem. Usuń klucze, które nie rozpoznajesz. -ssh_helper=Potrzebujesz pomocy? Sprawdź nasz przewodnik generowania kluczy SSH lub rozwiązywanie typowych problemów z SSH. add_new_key=Dodaj klucz SSH -ssh_key_been_used=Użyto już klucza publicznego o podanej zawartości. -ssh_key_name_used=Klucz publiczny o tej samej nazwie już istnieje. key_name=Nazwa klucza key_content=Treść -add_key_success=Pomyślnie dodano nowy klucz SSH '%s'! delete_key=Usuń ssh_key_deletion=Usunięcie klucza SSH -ssh_key_deletion_desc=Usunięcie tego klucza SSH będzie skutkować usunięciem wszystkich powiązanych dostępów do Twojego konta. Czy chcesz kontynuować? -ssh_key_deletion_success=Klucz SSH został usunięty pomyślnie! add_on=Dodano last_used=Ostatnio użyto no_activity=Brak aktywności -key_state_desc=Ten klucz został użyty w ciągu ostatnich 7 dni -token_state_desc=Ten token został użyty w ciągu ostatnich 7 dni manage_social=Zarządzaj powiązanymi kontami społecznościowymi -social_desc=To jest lista powiązanych kont społecznościowych. Usuń powiązania, których nie rozpoznajesz. unbind=Usuń powiązanie -unbind_success=Konto społecznościowe zostało odpięte. manage_access_token=Zarządzaj osobistymi tokenami dostępu generate_new_token=Wygeneruj nowy token -tokens_desc=Tokeny, które wygenerowałeś, mogą być użyte do dostępu do API Gitea. new_token_desc=Jak na razie, każdy token zapewnia pełen dostęp do Twojego konta. token_name=Nazwa tokena generate_token=Wygeneruj token -generate_token_succees=Nowy token dostępu został wygenerowany pomyślnie! Upewnij się, że teraz go skopiowałeś. Nie będziesz mógł go zobaczyć ponownie! delete_token=Usuń access_token_deletion=Usuwanie osobistego tokena dostępu -access_token_deletion_desc=Usunięcie tego tokena osobistego dostęp spowoduje usunięcie wszystkich powiązanych dostępów do aplikacji. Czy chcesz kontynuować? -delete_token_success=Osobisty token dostępu został usunięty pomyślnie! Nie zapomnij również zaktualizować swoich aplikacji. + + delete_account=Usuń swoje konto delete_prompt=Ta operacja trwale usunie Twoje konto i NIE MOŻE zostać cofnięta! confirm_delete_account=Potwierdź usunięcie delete_account_title=Usunięcie konta -delete_account_desc=To konto będzie usunięte na zawsze, chcesz kontynuować? [repo] owner=Właściciel repo_name=Nazwa repozytorium -repo_name_helper=Dobre nazwy repozytorium są krótkie, wpadające w pamięć i unikalne. visibility=Widoczność visiblity_helper=To repozytorium jest prywatne -visiblity_helper_forced=Administrator systemu wymaga, żeby wszystkie nowe repozytoria były Prywatne visiblity_fork_helper=(Zmiana tej wartości wpłynie na wszystkie forki) clone_helper=Potrzebujesz pomocy z klonowaniem? Odwiedź Pomoc! fork_repo=Sforkowane fork_from=Forkuj z -fork_visiblity_helper=Fork nie może zmieniać swojej widoczności repo_desc=Opis repo_lang=Język repo_gitignore_helper=Wybierz szablony pliku .gitignore @@ -361,18 +276,12 @@ auto_init=Zainicjuj to repozytorium używając wybranych plików i szablonu create_repo=Utwórz repozytorium default_branch=Domyślna gałąź mirror_prune=Wyczyść -mirror_prune_desc=Usuń wszystkie śledzone odwołania które nie istnieją w zdalnym repozytorium -mirror_interval=Częstotliwość kopiowania (godziny) mirror_address=Adres kopii lustrzanej -mirror_address_desc=Proszę podać wymagane poświadczenia użytkownika w adresie. mirror_last_synced=Ostatnia synchronizacja watchers=Obserwujący stargazers=Polubienia forks=Forki -form.reach_limit_of_creation=Właściciel osiągnął limit maksymalnej ilości repozytoriów %d. -form.name_reserved=Nazwa repozytorium „%s” jest zarezerwowana. -form.name_pattern_not_allowed=Wzorzec nazwy repozytorium „%s” jest niedozwolony. need_auth=Wymaga autoryzacji migrate_type=Typ migracji @@ -399,9 +308,6 @@ fork=Forkuj no_desc=Brak opisu quick_guide=Skrócona instrukcja clone_this_repo=Klonuj repozytorium -create_new_repo_command=Utwórz nowe repozytorium z wiersza poleceń -push_exist_repo=Prześlij istniejące repozytorium z wiersza poleceń -repo_is_empty=To repozytorium jest puste, proszę wrócić później! code=Kod branch=Gałąź @@ -425,7 +331,6 @@ editor.new_file=Nowy plik editor.upload_file=Załaduj plik editor.edit_file=Edytuj plik editor.preview_changes=Podgląd zmian -editor.cannot_edit_non_text_files=Nie można edytować plików nietekstowych editor.edit_this_file=Edytuj ten plik editor.must_be_on_a_branch=Musisz być na gałęzi aby zgłosić lub zaproponować zmiany do tego pliku editor.fork_before_edit=Musisz sforkować to repozytorium przed edycją tego pliku @@ -449,7 +354,6 @@ editor.cancel=Anuluj editor.filename_cannot_be_empty=Nazwa pliku nie może być pusta. editor.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium. editor.file_editing_no_longer_exists=Plik '%s' który edytujesz nie istnieje już w tym repozytorium. -editor.file_changed_while_editing=Zawartość pliku została zmieniona od rozpoczęcia edycji. Kliknij tutaj aby zobaczyć, co zostało zmienione lub naciśnij commit ponownie aby nadpisać te zmiany. editor.file_already_exists=Nazwa pliku '%s' już istnieje w tym repozytorium. editor.no_changes_to_show=Brak zmian do pokazania. editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v @@ -459,13 +363,13 @@ editor.upload_files_to_dir=Prześlij pliki do '%s' commits.commits=Commity commits.search=Przeszukaj commity -commits.find=Szukaj commits.author=Autor commits.message=Wiadomość commits.date=Data commits.older=Starsze commits.newer=Nowsze + issues.new=Nowy problem issues.new.labels=Etykiety issues.new.no_label=Brak etykiety @@ -483,7 +387,6 @@ issues.new_label=Nowa etykieta issues.new_label_placeholder=Etykieta... issues.create_label=Utwórz etykietę issues.label_templates.title=Załaduj wstępnie przygotowany zestaw etykiet -issues.label_templates.info=Nie ma jeszcze żadnych etykiet. Kliknij na przycisk „Nowa etykieta” powyżej, aby utworzyć lub użyć poniższego zestawu wstępnie zdefiniowanego. issues.label_templates.helper=Wybierz zestaw etykiet issues.label_templates.use=Użyj ten zestaw etykiet issues.label_templates.fail_to_load_file=Ładowanie pliku szablonu etykiety '%s' nie powiodło się: %v @@ -540,8 +443,6 @@ issues.label_edit=Edytuj issues.label_delete=Usuń issues.label_modify=Modyfikacja etykiety issues.label_deletion=Usunięcie etykiety -issues.label_deletion_desc=Usunięcie tej etykiety spowoduje usuniecie jej ze wszystkich powiązanych problemów. Czy na pewno chcesz kontynuować? -issues.label_deletion_success=Etykieta została usunięta pomyślnie! issues.num_participants=%d uczestników issues.attachment.open_tab=`Kliknij, aby zobaczyć „%s” w nowej karcie` issues.attachment.download=`Kliknij, aby pobrać „%s”` @@ -561,16 +462,12 @@ pulls.merged_title_desc=scala %[1]d commity/ów z %[2]s do %[ pulls.tab_conversation=Dyskusja pulls.tab_commits=Commity pulls.tab_files=Pliki zmodyfikowane -pulls.reopen_to_merge=Proszę otworzyć ponownie pull request aby wykonać operację scalenia. pulls.merged=Scalone -pulls.has_merged=Ten pull request został pomyślnie scalony! pulls.data_broken=Dane pull request zostały uszkodzone poprzez usunięcie informacji forka. pulls.is_checking=Sprawdzanie konfliktów jeszcze trwa, proszę odświeżyć stronę za moment. pulls.can_auto_merge_desc=Pull request może być automatycznie scalony. -pulls.cannot_auto_merge_desc=Pull request nie może być automatycznie scalony z powodu konfliktów. pulls.cannot_auto_merge_helper=Proszę scalić ręcznie, aby rozwiązać konflikty. pulls.merge_pull_request=Scal Pull Request -pulls.open_unmerged_pull_exists=`Nie można otworzyć ponownie ponieważ już istnieje gotowy do scalenia pull request (#%d) z tego samego repozytorium z tymi samymi informacjami.` milestones.new=Nowy kamień milowy milestones.open_tab=Otwarte %d @@ -588,27 +485,22 @@ milestones.clear=Wyczyść milestones.invalid_due_date_format=Format daty realizacji jest nieprawidłowy, musi być "rrrr-mm-dd". milestones.create_success=Kamień milowy „%s” został utworzony pomyślnie! milestones.edit=Edytuj kamień milowy -milestones.edit_subheader=Użyj lepszego opisu, tak aby nie wprowadzać w błąd użytkowników. milestones.cancel=Anuluj milestones.modify=Modyfikuj kamień milowy milestones.edit_success=Zmiana kamienia milowego '%s' została pomyślnie zapisana! milestones.deletion=Usuwanie kamienia milowego -milestones.deletion_desc=Usunięcie tego kamienia milowego spowoduje usuniecie go ze wszystkich powiązanych problemów. Czy na pewno chcesz kontynuować? milestones.deletion_success=Kamień milowy został usunięty pomyślnie! -wiki.welcome=Witamy w Wiki! -wiki.welcome_desc=Wiki to miejsce, gdzie chcesz udokumentować swój projekt wspólnie z innymi, żeby był lepszy. + wiki.create_first_page=Stwórz pierwszą stronę wiki.page=Strona wiki.filter_page=Filtruj stronę wiki.new_page=Utwórz nową stronę -wiki.default_commit_message=Opisz tą zmianę (opcjonalnie). wiki.save_page=Zapisz stronę wiki.last_commit_info=%s edytuje tę stronę %s wiki.edit_page_button=Edytuj wiki.new_page_button=Nowa strona wiki.delete_page_button=Usuń stronę -wiki.delete_page_notice_1=Strona zostanie usunięta „%s”. Bądź ostrożny. wiki.page_already_exists=Strona Wiki o tej samej nazwie już istnieje. wiki.pages=Strony wiki.last_updated=Ostatnia aktualizacja %s @@ -625,7 +517,6 @@ settings.githooks=Hooki Git settings.basic_settings=Ustawienia podstawowe settings.mirror_settings=Kopia lustrzana ustawień settings.sync_mirror=Synchronizuj teraz -settings.mirror_sync_in_progress=Synchronizacja kopii lustrzanej jest w toku, odśwież stronę w ciągu minuty. settings.site=Oficjalna Strona settings.update_settings=Aktualizuj ustawienia settings.advanced_settings=Ustawienia zaawansowane @@ -646,29 +537,18 @@ settings.pulls_desc=Włącz obsługę pull request, aby akceptować publiczny wk settings.danger_zone=Strefa niebezpieczeństwa settings.new_owner_has_same_repo=Nowy właściciel już posiada repozytorium o tej samej nazwie. settings.convert=Konwersja na repozytorium regularne -settings.convert_desc=Możesz przekonwertować ten mirror na repozytorium regularne. Ta czynność nie może być odwrócona. settings.convert_notices_1=- Ta operacja przekonwertuje mirror tego repozytorium na repozytorium regularne. Ta czynność nie może być odwrócona. settings.convert_confirm=Potwierdź konwersję -settings.convert_succeed=Typ repozytorium został zamieniony na regularne. settings.transfer=Przeniesienie własności settings.transfer_desc=Przenieś to repozytorium do innego użytkownika lub organizacji gdzie masz uprawnienia administratora. -settings.transfer_notices_1=- Stracisz dostęp jeśli nowy właściciel jest indywidualnym użytkownikiem. -settings.transfer_notices_2=- Zachowasz dostęp jeśli nowym właścicielem jest organizacja, której jesteś współwłaścicielem. -settings.transfer_form_title=Proszę wpisz co następuje w celu potwierdzenia operacji: settings.wiki_delete=Kasowanie danych Wiki settings.wiki_delete_desc=Usunięcie danych z wiki jest nieodwracalne. Bądź ostrożny. settings.wiki_delete_notices_1=- To usunie i wyłączy wiki dla %s -settings.wiki_deletion_success=Dane wiki zostały usunięte. settings.delete=Usuń to repozytorium settings.delete_desc=Po usunięciu repozytorium nie ma odwrotu. Upewnij się, że tego chcesz. settings.delete_notices_1=- Ta operacja NIE MOŻE zostać cofnięta. -settings.delete_notices_2=- Ta operacja trwale usunie wszystko z tego repozytorium, w tym dane Git, problemy, komentarze i dostęp dla współpracowników. -settings.delete_notices_fork_1=Wszystkie forki staną się niezależne po usunięciu. -settings.deletion_success=Repozytorium zostało pomyślnie usunięte! -settings.update_settings_success=Opcje repozytorium zostały pomyślnie zaktualizowane. settings.transfer_owner=Nowy właściciel settings.make_transfer=Przenieś -settings.transfer_succeed=Własność repozytorium została przeniesiona pomyślnie. settings.confirm_delete=Potwierdź usunięcie settings.add_collaborator=Dodaj nowego współpracownika settings.add_collaborator_success=Został dodany nowy współpracownik. @@ -680,13 +560,10 @@ settings.search_user_placeholder=Szukaj użytkownika... settings.org_not_allowed_to_be_collaborator=Organizacji nie można dodać jako współpracownika. settings.user_is_org_member=Użytkownik jest członkiem organizacji, który nie może być dodany jako współpracownik. settings.add_webhook=Dodaj webhooka -settings.hooks_desc=Webooki działają tak jak proste wywołania HTTP POST. Jeśli cokolwiek zdarzy się w Gitea, wyślemy powiadomienie do wybranego hosta. Więcej informacji można znaleźć w przewodniku webhooków. settings.webhook_deletion=Usuń webhooka -settings.webhook_deletion_desc=Usunięcie tego webooka spowoduje usunięcie powiązanych informacji i wpisów w historii. Czy chcesz kontynuować? settings.webhook_deletion_success=Webhook został pomyślnie usunięty! settings.webhook.test_delivery=Testuj dostawę settings.webhook.test_delivery_desc=Wyślij fałszywe zdarzenie push aby przetestować ustawienie webhooka -settings.webhook.test_delivery_success=Testowy webhook został dodany do kolejki dostawy. To może zająć kilka sekund, zanim to pojawia się w historii dostawy. settings.webhook.request=Żądanie settings.webhook.response=Odpowiedź settings.webhook.headers=Nagłówki @@ -697,7 +574,6 @@ settings.githook_edit_desc=Jeśli hook jest nieaktywny, zaprezentowana zostanie settings.githook_name=Nazwa hooka settings.githook_content=Treść hooka settings.update_githook=Zaktualizuj hook -settings.add_webhook_desc=Wyślemy żądanie POST pod poniższy adres ze szczegółami zdarzeń. Możesz również ustalić format danych zapytania (JSON, x-www-form-urlencoded, XML, itp.). Więcej informacji można znaleźć w przewodniku webhooków. settings.payload_url=URL do wywołania settings.content_type=Typ zawartości settings.secret=Sekret @@ -714,7 +590,6 @@ settings.event_pull_request_desc=Otworzono żądanie pull, zamknięto, otwarto p settings.event_push=Wypchnięcie settings.event_push_desc=Wypchnięcie (push) do repozytorium Git settings.active=Aktywny -settings.active_helper=Dostarczymy szczegóły zdarzenia, gdy ten webhook zostanie wywołany. settings.add_hook_success=Nowy webhook został dodany. settings.update_webhook=Zaktualizuj webhook settings.update_hook_success=Webhook został zaktualizowany. @@ -734,12 +609,9 @@ settings.key_been_used=Użyto już klucza wzdrożenia o podanej zawartości. settings.key_name_used=Klucz wdrożenia o tej samej nazwie już istnieje. settings.add_key_success=Nowy klucz wdrożenia '%s' został pomyślnie dodany! settings.deploy_key_deletion=Utwórz klucz wdrożenia -settings.deploy_key_deletion_desc=Usunięcie tego klucza wdrożenia spowoduje usunięcie powiązanego dostępu do tego repozytorium. Czy chcesz kontynuować? -settings.deploy_key_deletion_success=Klucz wdrożenia został pomyślnie usunięty! diff.browse_source=Przeglądaj źródła diff.parent=rodzic -diff.data_not_available=Informacje nt. zmiany nie są dostępne. diff.show_diff_stats=Pokaż statystyki zmian diff.show_split_view=Widok podzielony diff.show_unified_view=Zunifikowany widok @@ -756,11 +628,8 @@ release.stable=Stabilny release.edit=edytuj release.ahead=%d commitów w %s od tego wydania release.source_code=Kod źródłowy -release.new_subheader=Twórz wydania aby rozwijać produkt. -release.edit_subheader=Szczegółowy dziennik zmian może pomóc użytkownikom zrozumieć, co zostało ulepszone. release.tag_name=Nazwa tagu release.target=Cel -release.tag_helper=Wybierz istniejący tag, bądź utwórz nowy podczas publikacji. release.title=Tytuł release.content=Treść release.write=Napisz @@ -774,8 +643,6 @@ release.save_draft=Zapisz szkic release.edit_release=Edytuj wydanie release.delete_release=Usuń to wydanie release.deletion=Usuwanie wydania -release.deletion_desc=Usunięcie tego wydania spowoduje usunięcie odpowiednich tagów Git. Czy chcesz kontynuować? -release.deletion_success=Wydanie zostało pomyślnie usunięte! release.tag_name_already_exist=Wersja o tej nazwie tagu już istnieje. release.tag_name_invalid=Nazwa tagu jest niepoprawna. release.downloads=Pliki do pobrania @@ -796,9 +663,6 @@ create_new_team=Utwórz nowy zespół org_desc=Opis team_name=Nazwa zespołu team_desc=Opis -team_name_helper=Będziesz używał tej nazwy do wywoływania tego zespołu w dyskusjach. -team_desc_helper=Czym zajmuje się ten zespół? -team_permission_desc=Jaki poziom uprawnień powinien mieć ten zespół? form.name_reserved=Nazwa organizacji „%s” jest zarezerwowana. form.name_pattern_not_allowed=Wzorzec nazwy organizacji „%s” jest niedozwolony. @@ -809,16 +673,11 @@ settings.full_name=Imię i nazwisko settings.website=Strona settings.location=Lokalizacja settings.update_settings=Aktualizuj ustawienia -settings.update_setting_success=Ustawienia organizacji zostały pomyślnie zaktualizowane. -settings.change_orgname_prompt=Ta zmiana wpłynie, jak łącza będą odnosić się do organizacji. -settings.update_avatar_success=Awatar organizacji został pomyślnie zaktualizowany. settings.delete=Usuń organizację settings.delete_account=Usuń tą organizację settings.delete_prompt=Organizacja zostanie trwale usunięta, a to NIE MOŻE być cofnięte! settings.confirm_delete_account=Potwierdź usunięcie settings.delete_org_title=Usunięcie organizacji -settings.delete_org_desc=Ta organizacja zostanie trwale usunięta, czy chcesz kontynuować? -settings.hooks_desc=Dodaj webhooki, uruchamiane dla wszystkich repozytoriów w tej organizacji. members.membership_visibility=Widoczność członkostwa: members.public=Publiczne @@ -838,9 +697,7 @@ teams.leave=Opuść teams.read_access=Dostęp do odczytu teams.read_access_helper=Ten zespół będzie mógł wyświetlać i klonować swoje repozytoria. teams.write_access=Dostęp do zapisu -teams.write_access_helper=Ten zespół będzie mógł odczytywać i wysyłać do swoich repozytoriów. teams.admin_access=Uprawnienia admina -teams.admin_access_helper=Ten zespół będzie mógł wysyłać i pobierać swoje repozytoria, oraz dodawać do nich współpracowników. teams.no_desc=Ten zespół nie ma opisu teams.settings=Ustawienia teams.owners_permission_desc=Właściciele mają pełny dostęp do wszystkich repozytoriów i mają prawa administratora w organizacji. @@ -849,8 +706,6 @@ teams.update_settings=Aktualizuj ustawienia teams.delete_team=Usuń ten zespół teams.add_team_member=Dodaj członka zespołu teams.delete_team_title=Usuwanie zespołu -teams.delete_team_desc=Ten zespół zostanie usunięty, czy na pewno chcesz kontynuować? Jego członkowie mogą utracić dostęp do części repozytoriów. -teams.delete_team_success=Zespół został usunięty pomyślnie. teams.read_permission_desc=Ten zespół daje dostęp do odczytu: członkowie mogą wyświetlać i klonować repozytoria zespołu. teams.write_permission_desc=Ten zespół daje dostęp do zapisu: członkowie mogą wyświetlać i wysyłać do repozytoriów zespołu. teams.admin_permission_desc=Ten zespół daje dostęp pełny: członkowie mogą wyświetlać, wysyłać i dodawać współpracowników do repozytoriów zespołu. @@ -880,23 +735,8 @@ dashboard.statistic_info=Baza danych Gitea zawiera %d użytkowników, dashboard.operation_name=Nazwa operacji dashboard.operation_switch=Przełącz dashboard.operation_run=Uruchom -dashboard.clean_unbind_oauth=Usuń niepowiązane wpisy OAuth -dashboard.clean_unbind_oauth_success=Wszystkie niepowiązane wpisy OAuth zostały pomyślnie usunięte. dashboard.delete_inactivate_accounts=Usuń wszystkie nieaktywne konta -dashboard.delete_inactivate_accounts_success=Wszystkie nieaktywne konta zostały usunięte pomyślnie. dashboard.delete_repo_archives=Usuń wszystkie archiwa repozytoriów -dashboard.delete_repo_archives_success=Pomyślnie usunięto wszystkie archiwa repozytoriów. -dashboard.delete_missing_repos=Usuń wszystkie rekordy repozytoriów, które utraciły pliki Git -dashboard.delete_missing_repos_success=Wszystkie rekordy repozytoriów, które utraciły pliki Git, zostały pomyślnie usunięte. -dashboard.git_gc_repos=Usuń śmieci z repozytoriów -dashboard.git_gc_repos_success=Wszystkie repozytoria zakończyły odśmiecanie pomyślnie. -dashboard.resync_all_sshkeys=Przeładuj klucze publiczne w pliku '.ssh/authorized_keys' (uwaga: klucze poza Gitea zostaną usunięte) -dashboard.resync_all_sshkeys_success=Przeładowanie kluczy publicznych zakończyło się sukcesem. -dashboard.resync_all_update_hooks=Przepisz pliki update hook repozytoriów (wymagane przy zmianie ścieżki do pliku konfiguracji) -dashboard.resync_all_update_hooks_success=Wszystkie pliki update hook repozytoriów zostały pomyślnie przepisane. -dashboard.reinit_missing_repos=Ponownie inicjalizuj wszystkie repozytoria, które straciły pliki Git -dashboard.reinit_missing_repos_success=Wszystkie repozytoria, które straciły pliki Git, zostały ponownie zainicjować pomyślnie. - dashboard.server_uptime=Uptime serwera dashboard.current_goroutine=Bieżące Goroutines dashboard.current_memory_usage=Bieżące użycie pamięci @@ -927,40 +767,29 @@ dashboard.total_gc_pause=Sumaryczny czas wstrzymania przez GC dashboard.last_gc_pause=Ostatnie wstrzymanie przez GC dashboard.gc_times=Ilość wywołań GC -users.user_manage_panel=Panel zarządzania kontem użytkownika users.new_account=Załóż nowe konto users.name=Nazwa users.activated=Aktywowany users.repos=Repozytoria users.created=Utworzony users.send_register_notify=Wysyłaj powiadomienie o rejestracji do użytkownika -users.new_success=Nowe konto '%s' zostało pomyślnie utworzone. users.edit=Edytuj users.auth_source=Źródło uwierzytelniania users.local=Lokalne users.auth_login_name=Nazwa logowania uwierzytelnienia users.password_helper=Pozostaw puste, aby zostawić niezmienione. -users.update_profile_success=Profil konta został pomyślnie zaktualizowany. users.edit_account=Edytuj konto users.max_repo_creation=Maksymalna liczba repozytoriów users.max_repo_creation_desc=(Ustaw -1, aby użyć globalnego limitu) -users.is_activated=To konto jest aktywne -users.prohibit_login=Nie możesz się zalogować na to konto users.is_admin=To konto ma uprawnienia administratora -users.allow_git_hook=To konto posiada uprawnienia do tworzenia hooków Git users.allow_import_local=To konto ma uprawnienia do importu lokalnych repozytoriów users.update_profile=Zaktualizuj profil konta users.delete_account=Usuń to konto -users.still_own_repo=Twoje konto jest dalej właścicielem repozytorium, musisz je usunąć lub przekazać. -users.still_has_org=Twoje konto dalej posiada członkostwo w organizacji, musisz ją opuścić bądź usunąć. -users.deletion_success=Konto zostało pomyślnie usunięte! -orgs.org_manage_panel=Panel zarządzania organizacją orgs.name=Nazwa orgs.teams=Zespoły orgs.members=Członkowie -repos.repo_manage_panel=Panel zarządzania repozytorium repos.owner=Właściciel repos.name=Nazwa repos.private=Prywatne @@ -968,7 +797,6 @@ repos.watches=Obserwujących repos.stars=Polubienia repos.issues=Problemy -auths.auth_manage_panel=Panel zarządzania uwierzytelnianiem auths.new=Dodaj nowe źródło auths.name=Nazwa auths.type=Typ @@ -979,7 +807,6 @@ auths.auth_name=Nazwa uwierzytelniania auths.security_protocol=Protokół zabezpieczeń auths.domain=Domena auths.bind_password=Hasło Bind -auths.bind_password_helper=Ostrzeżenie: To hasło jest przechowywane w postaci zwykłego tekstu. Nie należy używać wysoko uprzywilejowanego konta. auths.user_base=Baza wyszukiwania auths.user_dn=DN użytkownika auths.attribute_username=Atrybut nazwy użytkownika @@ -994,21 +821,12 @@ auths.smtp_auth=Typ uwierzytelnienia SMTP auths.smtphost=Serwer SMTP auths.smtpport=Port SMTP auths.allowed_domains=Dozwolone domeny -auths.allowed_domains_helper=Pozostaw puste aby nie ograniczać domen. Wiele domen powinno być oddzielone przecinkami ','. auths.enable_tls=Włącz szyfrowanie TLS auths.skip_tls_verify=Pomiń weryfikację protokołu TLS auths.pam_service_name=Nazwa usługi PAM auths.enable_auto_register=Włącz automatyczną rejestrację auths.tips=Wskazówki -auths.edit=Edytuj ustawienia uwierzytelniania auths.activated=To uwierzytelnienie zostało aktywowane -auths.new_success=Pomyślnie dodano nowe uwierzytelnianie '%s'. -auths.update_success=Ustawienia uwierzytelnienia zostały zaktualizowane pomyślnie. -auths.update=Aktualizuj ustawienia uwierzytelniania -auths.delete=Usuń to uwierzytelnienie -auths.delete_auth_title=Usunięcie uwierzytelnienia -auths.delete_auth_desc=To uwierzytelnienie zostanie usunięte, czy chcesz kontynuować? -auths.still_in_used=Ten rodzaj autentykacji jest wciąż wykorzystywany przez niektórych użytkowników. Usuń lub przekonwertuj użytkowników, aby wykorzystywali inny typ logowania. auths.deletion_success=Uwierzytelnienie zostało usunięte pomyślnie! config.server_config=Konfiguracja serwera @@ -1028,7 +846,6 @@ config.reverse_auth_user=Użytkownik dostarczony przez odwrotne proxy config.ssh_config=Konfiguracja SSH config.ssh_enabled=Aktywne -config.ssh_start_builtin_server=Uruchom serwer wbudowany config.ssh_domain=Domena config.ssh_listen_port=Port nasłuchu config.ssh_root_path=Ścieżka katalogu głównego @@ -1055,12 +872,10 @@ config.mail_notify=Powiadomienia e-mail config.disable_key_size_check=Wyłącz sprawdzanie minimalnego rozmiaru klucza config.enable_captcha=Włącz Captcha config.active_code_lives=Ważność kodów aktywacyjnych -config.reset_password_code_lives=Czas życia kodu resetowania hasła config.webhook_config=Konfiguracja webhooka config.queue_length=Długość kolejki config.deliver_timeout=Limit czasu zdarzenia -config.skip_tls_verify=Pomiń weryfikację protokołu TLS config.mailer_config=Konfiguracja poczty config.mailer_enabled=Aktywne @@ -1068,7 +883,6 @@ config.mailer_disable_helo=Wyłącz HELO config.mailer_name=Nazwa config.mailer_user=Użytkownik config.send_test_mail=Wyślij email testowy -config.test_mail_failed=Nieudane wysłanie wiadomości email do '%s': %v config.test_mail_sent=Testowa wiadomość email została wysłana do '%s'. config.oauth_config=Konfiguracja OAuth @@ -1120,7 +934,6 @@ monitor.start=Czas rozpoczęcia monitor.execute_time=Czas wykonania notices.system_notice_list=Powiadomienia systemu -notices.view_detail_header=Pokaż szczegóły powiadomienia notices.actions=Czynności notices.select_all=Wybierz wszystko notices.deselect_all=Odznacz wszystko @@ -1130,7 +943,6 @@ notices.delete_all=Usuń wszystkie powiadomienia notices.type=Typ notices.type_1=Repozytorium notices.desc=Opis -notices.delete_success=Powiadomienia systemowe zostały pomyślnie usunięte. [action] create_repo=tworzy repozytorium %s @@ -1146,34 +958,35 @@ comment_issue=`komentuje problem %s#%[2]s` merge_pull_request=`scala pull request %s#%[2]s` transfer_repo=przenosi repozytorium %s do %s push_tag=taguje %[2]s w %[3]s -compare_commits=Zobacz porównanie tych %d commitów [tool] -ago=temu -from_now=od teraz +ago=%s temu +from_now=%s od teraz now=teraz -1s=1 sekundę %s -1m=1 minutę %s -1h=1 godzinę %s -1d=1 dzień %s -1w=1 tydzień %s -1mon=1 miesiąc %s -1y=1 rok %s -seconds=%d sekund %s -minutes=%d minut %s -hours=%d godzin %s -days=%d dni %s -weeks=%d tygodni %s -months=%d miesięcy %s -years=%d lat %s +1s=1 sekundę +1m=1 minutę +1h=1 godzinę +1d=1 dzień +1w=1 tydzień +1mon=1 miesiąc +1y=1 rok +seconds=%d sekund +minutes=%d minut +hours=%d godzin +days=%d dni +weeks=%d tygodni +months=%d miesięcy +years=%d lat raw_seconds=sekund raw_minutes=minut [dropzone] -default_message=Upuść pliki tutaj lub kliknij, aby przesłać. invalid_input_type=Nie można przesłać plików tego typu. -file_too_big=Rozmiar pliku ({{filesize}} MB) przekracza rozmiar maksymalny ({{maxFilesize}} MB). remove_file=Usuń plik [notification] +[gpg] + +[units] + diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 4a4e592..484c61e 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -5,8 +5,11 @@ dashboard=Painel explore=Explorar help=Ajuda sign_in=Entrar +sign_in_with=Fazer login com sign_out=Sair sign_up=Cadastrar +link_account=Conectar Conta +link_account_signin_or_signup=Faça login para conectar sua conta existente à sua nova conta, ou cadastre-se para uma nova conta register=Registrar website=Site version=Versão @@ -33,16 +36,17 @@ mirror=Espelho new_repo=Novo repositório new_migrate=Nova migração new_mirror=Novo mirror -new_fork=Novo fork de repositório +new_fork=Novo Fork de Repositório new_org=Nova organização manage_org=Gerenciar organizações admin_panel=Painel do administrador account_settings=Configurações da conta settings=Configurações your_profile=Seu perfil -your_starred=Seus favoritos +your_starred=Você favoritou your_settings=Suas configurações + activities=Atividades pull_requests=Pull requests issues=Issues @@ -51,8 +55,8 @@ cancel=Cancelar [install] install=Instalação -title=Etapas de instalação para primeira execução -docker_helper=Se você está rodando o Gitea dentro do Docker, por favor leia os Guias cuidadosamente antes de mudar qualquer coisa nesta página! +title=Configuração inicial +docker_helper=Se você está rodando o Gitea dentro do Docker, por favor leia as instruções cuidadosamente antes de alterar qualquer coisa nesta página. requite_db_desc=Gitea requer MySQL, PostgreSQL, SQLite3 ou TiDB. db_title=Configurações de banco de dados db_type=Tipo de banco de dados @@ -60,18 +64,18 @@ host=Servidor user=Usuário password=Senha db_name=Nome do banco de dados -db_helper=Por favor, use o mecanismo INNODB com o conjunto de caracteres utf8_general_ci para MySQL. +db_helper=Por favor, use InnoDB como Engine e utf8_general_ci como o charset para o MySQL. ssl_mode=Modo SSL path=Caminho -sqlite_helper=O caminho do arquivo de banco de dados SQLite3 ou TiDB.
Por favor use o caminho absoluto quando você iniciar como serviço. +sqlite_helper=O caminho do arquivo de banco de dados SQLite3 ou TiDB.
Por favor use o caminho absoluto se rodar o Gitea como serviço. err_empty_db_path=O Caminho do banco de dados SQLite3 ou TiDB não pode ser vazio. err_invalid_tidb_name=Nome do banco de dados TiDB não permite os caracteres "." e "-". no_admin_and_disable_registration=Você não pode desabilitar o registro sem criar uma conta de administrador. err_empty_admin_password=A senha de administrador não pode ser vazia. -general_title=Configurações gerais do Gitea +general_title=Configurações gerais do aplicativo app_name=Nome do aplicativo -app_name_helper=Coloque o nome da sua organização aqui! +app_name_helper=Você pode colocar o nome de sua organização aqui. repo_path=Caminho raíz do repositório repo_path_helper=Todos os repositórios remotos do Git serão salvos neste diretório. lfs_path=Caminho raiz do LFS @@ -85,7 +89,7 @@ ssh_port_helper=Número da porta que seu servidor SSH está usando, deixe vazio http_port=Porta HTTP http_port_helper=Número da porta em que a aplicação irá executar. app_url=URL do aplicativo -app_url_helper=Isto afeta a URL de clone via HTTP/HTTPs e também o e-mail. +app_url_helper=Isto afeta a URL de clone via HTTP/HTTPS e também algumas notificações por e-mail. log_root_path=Caminho do log log_root_path_helper=Pasta dos arquivos de log. @@ -93,14 +97,14 @@ optional_title=Configurações opcionais email_title=Configurações do serviço de e-mail smtp_host=Host SMTP smtp_from=De -smtp_from_helper=O endereço de email deve atender a especificação RFC 5322. O formato deve ser um email ou "Nome" . -mailer_user=E-mail do remetente +smtp_from_helper=Endereço do remetente de e-mails, no formato RFC 5322. Pode ser apenas o endereço de e-mail ou "Nome" . +mailer_user=Usuário do envio mailer_password=Senha do remetente register_confirm=Habilitar confirmação de registro -mail_notify=Habilitar notificação de e-mail +mail_notify=Habilitar notificações de e-mail server_service_title=Configurações de servidor e outros serviços offline_mode=Ativar modo off-line -offline_mode_popup=Desative o CDN mesmo em modo de produção, todos os recursos serão disponibilizados localmente. +offline_mode_popup=Desative o uso de CDNs para que todos os recursos sejam servidos localmente. disable_gravatar=Desativar serviço Gravatar disable_gravatar_popup=Desabilitar o Gravatar e fontes personalizadas, todos os avatares são enviados por usuários ou padrão. federated_avatar_lookup=Habilitar a busca federativa de avatares @@ -111,7 +115,7 @@ enable_captcha=Habilitar captcha enable_captcha_popup=Obrigar validação por captcha para auto-registro de usuários. require_sign_in_view=Obrigar login para a visualização de páginas require_sign_in_view_popup=Somente usuários autenticados podem ver todas as páginas, visitantes somente podem entrar ou se cadastrar. -admin_setting_desc="Você não precisa criar uma conta de administrador agora, no entanto o primeiro usuário (ID=1) automaticamente terá acesso de administrador." +admin_setting_desc=Você não precisa criar uma conta de administrador agora. O primeiro usuário a se registrar no site automaticamente terá acesso de administrador. admin_title=Configurações da conta de administrador admin_name=Nome de usuário admin_password=Senha @@ -119,16 +123,18 @@ confirm_password=Confirmar senha admin_email=E-mail do administrador install_btn_confirm=Instalar Gitea test_git_failed=Falha ao testar o comando 'git': %v -sqlite3_not_available=Sua versão não suporta SQLite3, por favor faça o download da versão binária oficial em %s, NÃO da versão gobuild. -invalid_db_setting=Configuração do banco de dados não está correta: %v +sqlite3_not_available=Sua versão não suporta SQLite3, por favor faça o download do executável oficial em %s, e NÃO da versão gobuild. +invalid_db_setting=Configuração de banco de dados inválida: %v invalid_repo_path=A raiz do repositório é inválida: %v -run_user_not_match=O usuário da execução não é o usuário atual: %s -> %s +run_user_not_match=O usuário configurado não é o mesmo que está executando o aplicativo no momento: %s -> %s save_config_failed=Falha ao salvar a configuração: %v invalid_admin_setting=Configuração da conta de administrador está inválida: %v -install_success=Bem-vindo! Estamos contentes que você escolheu o Gitea, divirta-se e tenha cuidado. +install_success=Bem-vindo! Obrigado por escolher o Gitea. Divirta-se! invalid_log_root_path=Pasta raíz do log é inválida: %v default_keep_email_private=Valor padrão para manter o e-mail privado default_keep_email_private_popup=Esse é o valor padrão para a visibilidade do endereço de e-mail do usuário. Se definido como true, o endereço de e-mail de todos os novos usuários será ocultado até que o usuário altere sua configuração. +default_allow_create_organization=Permissão para que novos usuários possam criar organizações por padrão +default_allow_create_organization_popup=Este é o valor de permissão padrão que será atribuído à novos usuários. Se ativado, novos usuários poderão criar organizações. no_reply_address=Endereço de sem resposta no_reply_address_helper=Domínio para o endereço de e-mail do usuário nos registros do git se ele mantiver seu endereço de e-mail privado. Por exemplo. O usuário 'joe' e 'noreply.example.org' será 'joe@noreply.example.org' @@ -151,47 +157,53 @@ repos=Repositórios users=Usuários organizations=Organizações search=Pesquisar -repo_no_results=Não foram encontrados os repositórios correspondentes. -user_no_results=Não foram encontrados os usuários correspondentes. -org_no_results=Não foram encontradas as organizações correspondentes. +repo_no_results=Nenhum repositório correspondente foi encontrado. +user_no_results=Nenhum usuário correspondente foi encontrado. +org_no_results=Nenhuma organização correspondente foi encontrada. [auth] -create_new_account=Criar nova conta +create_new_account=Criar conta register_helper_msg=Já tem uma conta? Entre agora! -social_register_helper_msg=Já tem uma conta? Junte-se agora! +social_register_helper_msg=Já tem uma conta? Entre agora! disable_register_prompt=Desculpe, novos registros estão desabilitados. Por favor entre em contato com o administrador do site. disable_register_mail=Desculpe, a confirmação de registro por e-mail foi desabilitada. remember_me=Lembrar de mim -forgot_password=Esqueci a senha -forget_password=Esqueceu a senha? +forgot_password_title=Esqueci minha senha +forgot_password=Esqueceu sua senha? sign_up_now=Precisa de uma conta? Cadastre-se agora. -confirmation_mail_sent_prompt=Um novo e-mail de confirmação foi enviado para %s, por favor, verifique sua caixa de entrada nas próximas %d horas para completar seu registro. active_your_account=Ativar sua conta prohibit_login=Login proibido -prohibit_login_desc=Sua conta foi proibida de efetuar login, por favor contate o administrador do site. -resent_limit_prompt=Desculpe, você está enviando um e-mail de ativação com muita frequência. Por favor, aguarde 3 minutos. +prohibit_login_desc=Sua conta foi proibida de fazer login, por favor contate o administrador. +resent_limit_prompt=Desculpe, você já requisitou um e-mail de ativação recentemente. Por favor, espere 3 minutos para tentar novamente. has_unconfirmed_mail=Oi %s, você possui um endereço de e-mail não confirmado (%s). Se você não recebeu um e-mail de confirmação ou precisa reenviar um novo, clique no botão abaixo. resend_mail=Clique aqui para reenviar seu e-mail de ativação -email_not_associate=Este endereço de e-mail não é associado à nenhuma conta. -send_reset_mail=Clique aqui para (re)enviar seu e-mail de redefinição da senha +email_not_associate=O endereço de e-mail não está associado à nenhuma conta. +send_reset_mail=Clique aqui para re-enviar seu e-mail de redefinição de senha reset_password=Redefinir sua senha invalid_code=Desculpe, seu código de confirmação expirou ou não é válido. reset_password_helper=Clique aqui para redefinir sua senha password_too_short=O comprimento da senha não pode ser menor que %d. -non_local_account=Não é possível mudar a senha de contas remotas pelo Gitea. +non_local_account=Contas não-locais não podem mudar sua senha através da interface web do Gitea. verify=Verificar scratch_code=Código de backup use_scratch_code=Use um código de backup twofa_scratch_used=Você usou seu código de backup. Você foi redirecionado para a página de configurações de dois fatores para que você possa remover a inscrição de seu dispositivo ou gerar um novo código de backup. -twofa_passcode_incorrect=O código está incorreto. Se você perdeu o seu dispositivo, use seu código de backup. -twofa_scratch_token_incorrect=O código de backup está incorreto. +twofa_passcode_incorrect=Seu código de acesso está incorreto. Se você perdeu seu dispositivo, use seu código de backup para fazer login. +twofa_scratch_token_incorrect=Seu código de backup está incorreto. +login_userpass=Usuário / Senha +login_openid=OpenID +openid_connect_submit=Conectar +openid_connect_title=Conectar à uma conta existente +openid_register_title=Criar uma nova conta +openid_signin_desc=URIs de exemplo: https://anne.me, bob.openid.org.cn, gnusocial.net/carry +disable_forgot_password_mail=Desculpe, a recuperação de senha foi desabilitada. Por favor, entre em contato com o administrador. [mail] activate_account=Por favor, ative sua conta activate_email=Verifique seu endereço de e-mail reset_password=Resetar sua senha -register_success=Registrado com sucesso. Bem vindo -register_notify=Bem-vindo a bordo +register_success=Registro bem-sucedido +register_notify=Bem-vindo ao Gitea [modal] yes=Sim @@ -220,7 +232,8 @@ Content=Conteúdo require_error=` não pode estar vazio.` alpha_dash_error=` devem ser caracteres alfanuméricos, hífen (-) ou sublinhado (_).` -alpha_dash_dot_error=` devem ser caracteres alfanuméricos ou hífen (-) ou sublinhado (_).` +alpha_dash_dot_error=` devem ser caracteres alfanuméricos, hífen (-) sublinhado (_) or ponto (.).` +git_ref_name_error=` deve ser um nove de referência Git válido.` size_error=`deve ser do tamanho %s.` min_size_error=` deve conter pelo menos %s caracteres.` max_size_error=` deve conter no máximo %s caracteres.` @@ -228,28 +241,32 @@ email_error=` não é um endereço de e-mail válido.` url_error=`não é uma URL válida.` include_error=` deve conter '%s'.` unknown_error=Erro desconhecido: -captcha_incorrect=O captcha não correspondeu. -password_not_match=Senha e confirmação da senha não são as mesmas. +captcha_incorrect=Resposta ao CAPTCHA incorreta. +password_not_match=As senhas escolhidas não coincidem. -username_been_taken=O nome de usuário já existe. -repo_name_been_taken=Nome do repositório já existe. -org_name_been_taken=Nome da organização já foi tomado. -team_name_been_taken=Nome da equipe já existe. -email_been_used=Endereço de e-mail já foi usado. -username_password_incorrect=Usuário ou senha incorretos. -enterred_invalid_repo_name=Por favor certifique-se que informou o nome do repositório corretamente. -enterred_invalid_owner_name=Por favor, verifique se o nome do proprietário está correto. -enterred_invalid_password=Por favor, verifique se a senha que você digitou está correta. -user_not_exist=O usuário informado não existe. -last_org_owner=O usuário a ser removido é o último membro na equipe de proprietários. É obrigatório ter pelo menos um proprietário. +username_been_taken=O nome de usuário já está sendo usado. +repo_name_been_taken=O nome de repositório já está sendo usado. +org_name_been_taken=O nome da organização já está sendo usado. +team_name_been_taken=O nome de equipe já está sendo usado. +email_been_used=O endereço de e-mail já está sendo usado. +openid_been_used=O endereço OpenID '%s' já está sendo usado. +username_password_incorrect=Nome de usuário ou senha incorretos. +enterred_invalid_repo_name=Por favor certifique-se de que o nome do repositório está correto. +enterred_invalid_owner_name=Por favor certifique-se de que o nome do proprietário está correto. +enterred_invalid_password=Por favor certifique-se de que a senha está correta. +user_not_exist=O usuário não existe. +last_org_owner=Não é permitido remover o último usuário da equipe de proprietários, pois deve haver pelo menos um proprietário em uma organização. +cannot_add_org_to_team=Uma organização não pode ser adicionada como membro de uma equipe. +cannot_invite_org_to_org=Uma organização não pode ser convidada a fazer parte de outra organização. invalid_ssh_key=Desculpe, não conseguimos verificar a sua chave SSH: %s -unable_verify_ssh_key=Gitea não pode verificar sua chave SSH, mas assumimos que é válida, por favor, verifique a chave pessoalmente. +invalid_gpg_key=Desculpe, não conseguimos verificar a sua chave GPG: %s +unable_verify_ssh_key=A chave SSH não pôde ser verificada. Por favor cheque se não há nenhum problema com ela. auth_failed=A autenticação falhou: %v -still_own_repo=Sua conta ainda tem propriedade do repositório, você tem que excluir ou transferí-la primeiro. -still_has_org=Sua conta ainda faz parte da organização, você deve sair ou excluí-la primeiro. -org_still_own_repo=Esta organização ainda tem a propriedade do repositório, você deve excluir ou transferí-la primeiro. +still_own_repo=Sua conta ainda é proprietária de ao menos um repositório; você tem que excluí-los ou transferi-los primeiro. +still_has_org=Sua conta ainda é membro de ao menos uma organização. Você precisa deixá-las primeiro. +org_still_own_repo=Esta organização ainda é proprietária de ao menos um repositório; você tem que excluí-los ou transferi-los primeiro. target_branch_not_exist=O branch de destino não existe. @@ -264,31 +281,31 @@ following=Seguindo follow=Seguir unfollow=Deixar de seguir -form.name_reserved=O nome de usuário '%s' não pode ser usado. -form.name_pattern_not_allowed=Não é permitido usar o padrão '%s' para o nome de usuário. [settings] profile=Perfil password=Senha avatar=Avatar -ssh_keys=Chaves SSH +ssh_gpg_keys=Chaves SSH / GPG social=Contas sociais applications=Aplicativos orgs=Organizações delete=Excluir conta twofa=Autenticação de dois fatores +account_link=Contas externas +organization=Organização uid=Uid public_profile=Perfil público -profile_desc=Seu endereço de e-mail é publico e será usado para qualquer notificação relacionada à conta, e qualquer operação na web feita através do site. -password_username_disabled=Usuários remotos não tem permissão para mudarem seu nome de usuário. +profile_desc=Seu endereço de e-mail é publico e será usado para quaisquer notificações relacionadas à sua conta, além de operações pela interface web do Gitea. +password_username_disabled=Usuários não-locais não podem alterar seus nomes de usuário. Por favor contate o administrador do sistema para mais informações. full_name=Nome completo website=Site location=Localização update_profile=Atualizar o perfil -update_profile_success=O seu perfil foi atualizado com sucesso. +update_profile_success=Seu perfil foi atualizado. change_username=Nome de usuário alterado -change_username_prompt=Essa alteração afetará os links para a sua conta. +change_username_prompt=Esta mudança vai alterar os links para sua conta. continue=Continuar cancel=Cancelar @@ -299,104 +316,101 @@ choose_new_avatar=Escolha um novo avatar update_avatar=Atualizar configuração de avatar delete_current_avatar=Excluir o avatar atual uploaded_avatar_not_a_image=O arquivo enviado não é uma imagem. -update_avatar_success=Sua configuração de avatar foi atualizada com sucesso. change_password=Mudança de senha old_password=Senha Atual new_password=Nova senha retype_new_password=Digite novamente a nova senha -password_incorrect=A senha atual não está correta. -change_password_success=A senha está alterada com sucesso. Você pode agora entrar com a senha nova. -password_change_disabled=Usuários remotos não tem permissão para mudar sua senha. +password_incorrect=A senha atual está incorreta. +change_password_success=Sua senha foi alterada com sucesso. Agora você pode fazer login usando sua nova conta. +password_change_disabled=Usuários não-locais não são permitidos mudar suas senhas pela interface web. emails=Endereços de e-mail manage_emails=Gerenciar endereços de e-mail +manage_openid=Gerencia endereços OpenID email_desc=Seu endereço de e-mail principal será usado para notificações e outras operações. primary=Principal primary_email=Definir como principal delete_email=Excluir -email_deletion=Exclusão do email -email_deletion_desc=Ao excluir este endereço de e-mail será removido informações relacionadas com a sua conta. Você deseja continuar? +email_deletion=Excluir e-mail email_deletion_success=O e-mail foi excluído com sucesso! +openid_deletion=Deleção de OpenID +openid_deletion_success=OpenID foi deletado com sucesso! add_new_email=Adicionar novo endereço de e-mail +add_new_openid=Adicionar novo URI OpenID add_email=Adicionar e-mail -add_email_confirmation_sent=Um novo e-mail de confirmação foi enviado para '%s'. Por favor, verifique sua Caixa de Entrada dentro das próximas %d horas, para concluir o processo de confirmação. +add_openid=Adicionar URI OpenID add_email_success=Seu novo endereço de e-mail foi adicionado com sucesso. +add_openid_success=Seu novo endereço OpenID foi adicionado com sucesso. keep_email_private=Manter o endereço de e-mail privado keep_email_private_popup=Seu endereço de e-mail será ocultado de outros usuários se essa opção estiver definida. +openid_desc=Seus endereços OpenID vão permitir que você delegue a autenticação para seu provedor de escolha manage_ssh_keys=Gerenciar Chaves SSH +manage_gpg_keys=Gerenciar chaves GPG add_key=Adicionar chave -ssh_desc=Esta é uma lista de chaves SSH associadas com a sua conta. Como essas chaves permitem que qualquer um que as usem tenham acesso aos seus repositórios, é altamente importante que você reconheça elas. -ssh_helper=Precisa de ajuda? Confira nosso guia para gerar chaves SSH ou solucionar problemas comuns com SSH. add_new_key=Adicionar Chave SSH -ssh_key_been_used=Uma chave pública com esse mesmo conteúdo já está em uso. -ssh_key_name_used=Uma outra chave pública já existe com esse mesmo nome. +add_new_gpg_key=Adicionar chave GPG +subkeys=Subchaves +key_id=ID da chave key_name=Nome da Chave key_content=Conteúdo -add_key_success=A nova chave pública '%s' foi adicionada com sucesso! delete_key=Excluir ssh_key_deletion=Exclusão da chave de SSH -ssh_key_deletion_desc=Ao excluir esta chave de SSH será removido todos os acessos para sua conta. Você deseja continuar? -ssh_key_deletion_success=A chave de SSH foi excluída com sucesso! +gpg_key_deletion=Deleção de chave GPG add_on=Adicionado em +valid_until=Válido até last_used=Última vez usado em no_activity=Nenhuma atividade recente -key_state_desc=Usada a pelo menos 7 dias -token_state_desc=Este token é usado em pelo menos 7 dias +show_openid=Mostrar no perfil +hide_openid=Ocultar no perfil manage_social=Gerenciar contas sociais associadas -social_desc=Esta é uma lista de contas sociais. Remova qualquer ligação que você não reconheça. +social_desc=Esta é uma lista de contas sociais associadas. Por razões de segurança, por favor tenha certeza que você reconhece todas essas contas, já que elas pode ser usadas para fazer login na sua conta. unbind=Desvincular -unbind_success=A conta social foi desvinculada. +unbind_success=Conta social foi desconectada da sua conta. manage_access_token=Gerenciar tokens de acesso pessoal generate_new_token=Gerar novo token -tokens_desc=Tokens gerados por você que podem ser usados para acessar a API do Gitea. +tokens_desc=Tokens que você gerou que podem ser usados para acessar as APIs do Gitea. new_token_desc=Por enquanto, todo token terá acesso completo à sua conta. token_name=Nome do token generate_token=Gerar token -generate_token_succees=Novo token de acesso gerado com sucesso! Certifique-se de copiar seu novo token de acesso pessoal agora. Você não poderá vê-lo novamente! delete_token=Excluir access_token_deletion=Exclusão do token de acesso pessoal -access_token_deletion_desc=Ao excluir este token de acesso pessoal será removido todos os acessos do aplicativo. Você deseja continuar? -delete_token_success=O Token de acesso pessoal foi removido com sucesso! Não se esqueça de atualizar seus aplicativos também. -twofa_desc=O Gitea suporta autenticação de dois fatores para fornecer uma segurança adicional para sua conta. -twofa_is_enrolled=Sua conta está inscrita para a autenticação de dois fatores. -twofa_not_enrolled=Sua conta não está atualmente inscrita para a autenticação de dois fatores. +twofa_not_enrolled=Sua conta não está atualmente inscrita para a autenticação em duas etapas. twofa_disable=Desativar a autenticação de dois fatores twofa_scratch_token_regenerate=Regenerar código de backup twofa_scratch_token_regenerated=Seu código backup foi regenerado. Agora é %s. Mantenha-o em um lugar seguro. twofa_enroll=Inscrever para a autenticação de dois fatores twofa_disable_note=Se necessário, você pode desativar a autenticação de dois fatores. -twofa_disable_desc=Desativar a autenticação de dois fatores fará com que a sua conta menos segura. Tem certeza de que deseja continuar? -regenerate_scratch_token_desc=Se você perdeu o seu código de backup, ou teve que usá-lo para fazer um login, você pode redefini-lo. twofa_disabled=A autenticação de dois fatores foi desativada. scan_this_image=Escaneie esta imagem com o seu aplicativo de autenticação: or_enter_secret=Ou digite esse código: %s -then_enter_passcode=Em seguida, digite a senha que o seu aplicativo lhe fornece: passcode_invalid=Essa senha é inválida. Tente novamente. twofa_enrolled=Sua conta foi inscrita para a autenticação de dois fatores. Certifique-se de salvar seu token de rascunho (%s), pois ele só será mostrado uma vez! +manage_account_links=Gerenciar conexões de conta +manage_account_links_desc=Contas external conectadas a esta conta +remove_account_link=Remover conta conectada +remove_account_link_success=Conexão de conta deletada com sucesso! + + delete_account=Excluir sua conta delete_prompt=A operação irá excluir sua conta permanentemente, e NÃO PODERÁ ser desfeita! confirm_delete_account=Confirmar exclusão delete_account_title=Exclusão da conta -delete_account_desc=Esta conta será excluída permanentemente, você quer continuar? [repo] owner=Dono repo_name=Nome do repositório -repo_name_helper=Nomes de repositórios bons são pequenos, memorizáveis e únicos. visibility=Visibilidade visiblity_helper=Este é um repositório privado -visiblity_helper_forced=O adminstrador forçou todos os novos repositórios para serem privados visiblity_fork_helper=(A alteração desse valor irá afetar todos os forks) clone_helper=Precisa de ajuda com o clone? Visite a Ajuda! fork_repo=Fork do repositório fork_from=Fork de -fork_visiblity_helper=Não é possível alterar a visibilidade de um repositório fork. repo_desc=Descrição repo_lang=Linguagem repo_gitignore_helper=Selecionar templates de .gitignore @@ -408,18 +422,16 @@ auto_init=Inicializar este repositório com os arquivos selecionados e modelo create_repo=Criar repositório default_branch=Branch padrão mirror_prune=Varrer -mirror_prune_desc=Remova quaisquer referências que não existem mais no remote -mirror_interval=Intervalo de mirror (hora) +mirror_interval=Intervalo de mirror (unidades de tempo válidas são "h", "m" e "s") +mirror_interval_invalid=Intervalo de mirror é inválido mirror_address=Endereço do mirror -mirror_address_desc=Por favor, inclua as credenciais do usuário necessários no endereço. mirror_last_synced=Última sincronização watchers=Observadores stargazers=Usuários que estrelaram forks=Forks -form.reach_limit_of_creation=O proprietário atingiu o limite máximo de criação de repositórios de %d. -form.name_reserved=O nome de repositório '%s' não pode ser usado. -form.name_pattern_not_allowed=Não é permitido usar o padrão '%s' para o nome de repositório. +form.name_reserved=O nome de repositório '%s' é reservado e não pode ser usado. +form.name_pattern_not_allowed=O padrão de nome de repositório '%s' não é permitido. need_auth=Precisa de autorização migrate_type=Tipo de migração @@ -431,6 +443,7 @@ migrate.clone_local_path=ou um caminho de diretório local migrate.permission_denied=Você não pode importar repositórios locais. migrate.invalid_local_path=Caminho local inválido, não existe ou não é um diretório. migrate.failed=Migração falhou: %v +migrate.lfs_mirror_unsupported=Mirror de objetos Git LFS não é suportado - ao invés use 'git lfs fetch --all' e 'git lfs push --all'. mirror_from=mirror de forked_from=fork de @@ -448,9 +461,6 @@ download_archive=Baixar este repositório no_desc=Nenhuma descrição quick_guide=Guia rápido clone_this_repo=Clonar este repositório -create_new_repo_command=Criar um novo repositório na linha de comando -push_exist_repo=Push um repositório existente na linha de comando -repo_is_empty=Este repositório está vazio, por favor volte mais tarde! code=Código branch=Branch @@ -471,12 +481,12 @@ file_permalink=Link permanente file_too_large=Este arquivo é muito grande para ser exibido video_not_supported_in_browser=Seu navegador não suporta tag de vídeo HTML5. stored_lfs=Armazenado com Git LFS +commit_graph=Gráfico de commits editor.new_file=Novo arquivo editor.upload_file=Enviar arquivo editor.edit_file=Editar arquivo editor.preview_changes=Visualizar alterações -editor.cannot_edit_non_text_files=Impossível editar arquivos que não são do tipo texto plano editor.edit_this_file=Editar este arquivo editor.must_be_on_a_branch=Você deve estar em um branch para propor mudanças neste arquivo editor.fork_before_edit=Você deve fazer fork deste repositório antes de editar o arquivo @@ -503,7 +513,7 @@ editor.directory_is_a_file=Entrada '%s' no caminho pai é um arquivo e não uma editor.file_is_a_symlink=O arquivo '%s' é um link simbólico que não pode ser modificado a partir do editor da web editor.filename_is_a_directory=O arquivo '%s' é uma pasta existente neste repositório. editor.file_editing_no_longer_exists=O arquivo '%s' que você está editando não existe mais neste repositório. -editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você começou a editar. Clique aqui para ver o que mudou ou pressione efetivar novamente para sobrescrever esses mudanças. +editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você começou a editar. Clique aqui para ver o que foi editado ou clique em commit novamemente para sobreescrever essas mudanças. editor.file_already_exists=Um arquivo com nome '%s' já existe neste repositório. editor.no_changes_to_show=Nenhuma alteração a mostrar. editor.fail_to_update_file=Houve erro ao criar ou atualizar arquivo '%s': %v @@ -513,14 +523,15 @@ editor.upload_files_to_dir=Enviar arquivos para '%s' commits.commits=Commits commits.search=Pesquisar commits -commits.search_all=Todos -commits.find=Buscar +commits.find=Pesquisar +commits.search_all=Todos os branches commits.author=Autor commits.message=Mensagem commits.date=Data commits.older=Mais Antigo commits.newer=Mais recente + issues.new=Novo issue issues.new.labels=Etiquetas issues.new.no_label=Sem etiqueta @@ -538,12 +549,12 @@ issues.new_label=Nova etiqueta issues.new_label_placeholder=Nome da etiqueta... issues.create_label=Criar etiqueta issues.label_templates.title=Carregue um conjunto de etiquetas pré-definidas -issues.label_templates.info=Não existem etiquetas ainda. Você pode clicar em "Nova etiqueta" acima para criar uma ou usar um conjunto pré-definido abaixo. +issues.label_templates.info=Não há nenhuma etiqueta ainda. Você pode clicar no botão "Nova etiqueta" acima para criar uma ou usar um conjunto pré-definido acima. issues.label_templates.helper=Selecione um conjunto de etiquetas issues.label_templates.use=Usar este conjunto de etiquetas issues.label_templates.fail_to_load_file=Houve erro ao carregar arquivo de template '%s': %v -issues.add_label_at=`adicionou a etiqueta
%s
label %s` -issues.remove_label_at=`removeu a etiqueta
%s
label %s` +issues.add_label_at=`adicionou a etiqueta
%s
label %s` +issues.remove_label_at=`removeu a etiqueta
%s
label %s` issues.add_milestone_at=`adicionou esta issue para a milestone %s %s` issues.change_milestone_at=`modificou a milestone de %s para %s %s` issues.remove_milestone_at=`removeu esta issue da milestone %s %s` @@ -572,6 +583,13 @@ issues.filter_sort.recentupdate=Mais recentemente atualizados issues.filter_sort.leastupdate=Menos recentemente atualizados issues.filter_sort.mostcomment=Mais comentados issues.filter_sort.leastcomment=Menos comentados +issues.action_open=Abrir +issues.action_close=Fechar +issues.action_label=Etiqueta +issues.action_milestone=Marco +issues.action_milestone_no_select=Sem marco +issues.action_assignee=Responsável +issues.action_assignee_no_select=Sem responsável issues.opened_by=aberto por %[3]s %[1]s issues.opened_by_fake=aberto por %[2]s %[1]s issues.previous=Anterior @@ -605,13 +623,13 @@ issues.label_edit=Editar issues.label_delete=Excluir issues.label_modify=Editar etiqueta issues.label_deletion=Exclusão de etiqueta -issues.label_deletion_desc=Excluir uma etiqueta a retirará de todos os problemas que ela estiver marcando. Quer mesmo continuar? -issues.label_deletion_success=A etiqueta foi excluída com sucesso! issues.label.filter_sort.alphabetically=Alfabeticamente issues.label.filter_sort.reverse_alphabetically=Alfabeticamente inverso issues.num_participants=%d participantes issues.attachment.open_tab=`Clique para ver "%s" em uma nova aba` issues.attachment.download=`Clique para baixar "%s"` +issues.subscribe=Inscrever-se +issues.unsubscribe=Desinscrever pulls.new=Novo pull request pulls.compare_changes=Comparar mudanças @@ -628,16 +646,14 @@ pulls.merged_title_desc=mesclou %[1]d commits de %[2]s em %[3 pulls.tab_conversation=Conversação pulls.tab_commits=Commits pulls.tab_files=Arquivos alterados -pulls.reopen_to_merge=Por favor reabra este pull request para executar a operação de merge. +pulls.reopen_to_merge=Por favor reabra este pull request para realizar o merge. pulls.merged=Merge realizado -pulls.has_merged=O merge deste pull request foi aplicado com sucesso! pulls.data_broken=Dados deste pull request foram quebrados devido à remoção de informação do fork. pulls.is_checking=A verificação do conflito ainda está em progresso, por favor recarregue a página em instantes. pulls.can_auto_merge_desc=O merge deste Pull Pequest pode ser aplicado automaticamente. -pulls.cannot_auto_merge_desc=O merge deste pull request não pode ser aplicado automaticamente pois há conflitos. +pulls.cannot_auto_merge_desc=Este pull request não pode ser mesclado automaticamente porque há conflitos. pulls.cannot_auto_merge_helper=Por favor, aplique o merge manualmente para resolver os conflitos. pulls.merge_pull_request=Solicitação de merge de pull request -pulls.open_unmerged_pull_exists=`Você não pode executar a operação de reabrir porque já existe um Pull request aberto (#%d) do mesmo repositório com as mesmas informações de merge e está esperando pelo merge.` milestones.new=Novo milestone milestones.open_tab=%d abertos @@ -655,12 +671,10 @@ milestones.clear=Limpar milestones.invalid_due_date_format=Formato inválido. O valor de data deve ser algo como 'aaaa-mm-dd'. milestones.create_success=O marco '%s' foi configurado com sucesso! milestones.edit=Editar milestone -milestones.edit_subheader=Descreva bem a proposta do milestone, assim as pessoas não ficarão confusas. milestones.cancel=Cancelar milestones.modify=Modificar milestone milestones.edit_success=O milestone '%s' foi alterado com sucesso! milestones.deletion=Exclusão de milestone -milestones.deletion_desc=Excluir este milestone irá remover toda sua informação em todos as issues que estiver associado. Você quer mesmo continuar? milestones.deletion_success=Milestone excluído com sucesso! milestones.filter_sort.closest_due_date=Prazo mais próximo milestones.filter_sort.furthest_due_date=Prazo mais longe @@ -669,20 +683,19 @@ milestones.filter_sort.most_complete=Mais completo milestones.filter_sort.most_issues=Com mais issues milestones.filter_sort.least_issues=Com menos issues + wiki=Wiki -wiki.welcome=Bem-vindo ao wiki! -wiki.welcome_desc=Wiki é o lugar onde você gostaria de documentar o seu projeto em conjunto e torná-lo melhor. wiki.create_first_page=Criar a primeira página wiki.page=Página wiki.filter_page=Filtrar página wiki.new_page=Criar nova página -wiki.default_commit_message=Escrever um comentário sobre esta atualização (opcional). +wiki.default_commit_message=Escreva uma nota sobre a atualização nesta página (opcional). wiki.save_page=Salvar página wiki.last_commit_info=%s editou esta página %s wiki.edit_page_button=Editar wiki.new_page_button=Nova página wiki.delete_page_button=Excluir página -wiki.delete_page_notice_1=Isto irá excluir a página "%s". Por favor, certifique-se. +wiki.delete_page_notice_1=Isso vai deletar a página "%s". Por favor, verifique se você quer mesmo deletar esta página. wiki.page_already_exists=já existe uma página de wiki com o mesmo nome. wiki.pages=Páginas wiki.last_updated=Última atualização %s @@ -699,7 +712,6 @@ settings.githooks=Hooks do Git settings.basic_settings=Configurações básicas settings.mirror_settings=Opções de mirror settings.sync_mirror=Sincronizar agora -settings.mirror_sync_in_progress=A sincronização do mirror está em andamento, por favor atualize a página em aproximadamente um minuto. settings.site=Site oficial settings.update_settings=Atualizar configurações settings.advanced_settings=Configurações avançadas @@ -707,11 +719,13 @@ settings.wiki_desc=Habilitar sistema de wiki settings.use_internal_wiki=Usar wiki nativa settings.use_external_wiki=Usar wiki externa settings.external_wiki_url=URL externa da wiki +settings.external_wiki_url_error=URL de Wiki externa é inválida settings.external_wiki_url_desc=Os visitantes serão redirecionados para a URL ao clicar na aba. settings.issues_desc=Habilitar issue tracker settings.use_internal_issue_tracker=Usar o issue tracker nativo settings.use_external_issue_tracker=Usar issue tracker externo settings.external_tracker_url=URL do issue tracker externo +settings.external_tracker_url_error=URL de issue tracker externo é inválido settings.external_tracker_url_desc=Os visitantes serão redirecionados para o URL quando clicarem na guia. settings.tracker_url_format=Formato de URL do issue tracker externo settings.tracker_issue_style=Estilo de nome de issue tracker externo: @@ -722,29 +736,22 @@ settings.pulls_desc=Habilitar pull requests para aceitar contribuições públic settings.danger_zone=Zona de perigo settings.new_owner_has_same_repo=O novo dono já tem um repositório com o mesmo nome. Por favor, escolha outro nome. settings.convert=Converter para repositório tradicional -settings.convert_desc=Você pode converter este espelho em um repositório tradicional. Esta ação não pode ser revertida. +settings.convert_desc=Você pode converter esse mirror em um repositório comum. Está ação não pode ser desfeita. settings.convert_notices_1=- Esta operação vai converter este repositório espelho em um repositório tradicional. Esta ação não pode ser desfeita. settings.convert_confirm=Confirmar conversão -settings.convert_succeed=Repositório espelho convertido para tradicional com sucesso. settings.transfer=Transferir propriedade settings.transfer_desc=Transferir este repositório para outro usuário ou para uma organização onde você tem direitos de administrador. -settings.transfer_notices_1=- Você irá perder o acesso se o novo dono for um usuário individual. -settings.transfer_notices_2=- Você irá continuar tendo acesso se o novo dono é uma organização e você é um dos membros. -settings.transfer_form_title=Informe a seguinte informação para confirmar a sua operação: +settings.transfer_notices_1=- Você perderá acesso se o novo owner é um usuário individual. +settings.transfer_notices_2=- Você continuará a ter acesso se o novo owner for uma organização e você é um dos owners. +settings.transfer_form_title=Por favor entre a seguinte informação para confirmar a operação: settings.wiki_delete=Excluir dados da wiki settings.wiki_delete_desc=Uma vez que você apague os dados da wiki, não há volta. Por favor, certifique-se. settings.wiki_delete_notices_1=- Isso irá excluir e desativar a wiki para %s -settings.wiki_deletion_success=Dados de wiki do repositório foram excluídos com sucesso. settings.delete=Excluir este repositório settings.delete_desc=Uma vez que você remova um repositório, não tem volta. Por favor, tenha certeza. settings.delete_notices_1=-Esta operação NÃO PODERÁ ser desfeita. -settings.delete_notices_2=- Esta operação irá excluir permanentemente o tudo deste repositório, incluindo os dados do Git, Issues, comentários e acessos dos colaboradores. -settings.delete_notices_fork_1=-Todos os forks se tornarão independentes após a exclusão. -settings.deletion_success=Repositório excluído com sucesso! -settings.update_settings_success=As opções do repositório foram atualizadas com sucesso. settings.transfer_owner=Novo dono settings.make_transfer=Fazer transferência -settings.transfer_succeed=A posse do repositório foi transferido com sucesso. settings.confirm_delete=Confirmar exclusão settings.add_collaborator=Adicionar um novo colaborador settings.add_collaborator_success=O novo colaborador foi adicionado. @@ -756,13 +763,12 @@ settings.search_user_placeholder=Pesquisar usuário... settings.org_not_allowed_to_be_collaborator=Organização não tem permissão para ser adicionada como um colaborador. settings.user_is_org_member=O usuário é um membro da organização que não pode ser adicionado como um colaborador. settings.add_webhook=Adicionar webhook -settings.hooks_desc=Hooks da web ou webhooks permitem serviços externos serem notificados quando certos eventos acontecem no Gitea. Quando acontecem os eventos especificados, enviaremos uma solicitação POST para cada uma das URLs que você fornecer. Saiba mais no nosso Guia de webhooks. settings.webhook_deletion=Excluir webhook -settings.webhook_deletion_desc=Excluir este webhook vai remover sua informação e todo o histórico de entrega. Deseja continuar? +settings.webhook_deletion_desc=Deletar este webhook vai deletar toda sua informação e todo histório de entrega. Tem certeza que deseja continuar? settings.webhook_deletion_success=Webhook excluído com sucesso! settings.webhook.test_delivery=Entrega de teste settings.webhook.test_delivery_desc=Enviar uma entrega de evento de Push falso para testar suas configurações de webhook -settings.webhook.test_delivery_success=O webhook de teste foi adicionado para a fila de entrega. Pode demorar alguns segundos antes de ser exibido no histórico de entrega. +settings.webhook.test_delivery_success=Um webhook de teste foi adicionado a file de envio. Pode levar alguns segundos até ele apareça no histórico de envio. settings.webhook.request=Solicitação settings.webhook.response=Resposta settings.webhook.headers=Cabeçalhos @@ -773,7 +779,6 @@ settings.githook_edit_desc=Se o hook não estiver ativo, o conteúdo de exemplo settings.githook_name=Nome do Hook settings.githook_content=Conteúdo do Hook settings.update_githook=Atualizar Hook -settings.add_webhook_desc=Enviaremos uma solicitação POST para o URL abaixo com detalhes de quaisquer eventos inscritos. Você pode também especificar qual formato de dados você gostaria de receber (JSON, x-www-form-urlencoded, etc). Mais informação pode ser encontrada em Webhooks Guide. settings.payload_url=URL de payload settings.content_type=Tipo de conteúdo settings.secret=Senha @@ -791,7 +796,6 @@ settings.event_pull_request_desc=Pull request aberto, fechado, reaberto, atribu settings.event_push=Push settings.event_push_desc=Git push para o repositório settings.active=Ativo -settings.active_helper=Enviaremos detalhes do evento quando este hook for acionado. settings.add_hook_success=Novos hooks de web foram adicionados. settings.update_webhook=Atualizar webhook settings.update_hook_success=Webhook atualizado. @@ -812,13 +816,26 @@ settings.key_been_used=Uma chave de Deploy com esse mesmo conteúdo já está em settings.key_name_used=Uma chave de Deploy já existe com esse com mesmo nome. settings.add_key_success=A nova chave de Deploy '%s' foi adicionada com sucesso! settings.deploy_key_deletion=Exclusão de chave de Deploy -settings.deploy_key_deletion_desc=Excluir esta chave de Deploy removerá permissões de acesso a este repositório. Quer mesmo continuar? -settings.deploy_key_deletion_success=Chave de Deploy excluída com sucesso! +settings.deploy_key_deletion_success=A chave de deploy foi atualizada com sucesso! +settings.branches=Branches +settings.protected_branch=Poteção de Branch +settings.protected_branch_can_push=Permitir push? +settings.protected_branch_can_push_yes=Você pode fazer push +settings.protected_branch_can_push_no=Você não pode fazer push +settings.add_protected_branch=Habilitar proteção +settings.delete_protected_branch=Desabilitar proteção +settings.add_protected_branch_success=%s bloqueado com sucesso +settings.add_protected_branch_failed=Bloqueio de %s falhou +settings.remove_protected_branch_success=%s desbloqueado com sucesso +settings.protected_branch_deletion=Para deletar a proteção de branch +settings.protected_branch_deletion_desc=Qualquer um com permissões de escrita poderá fazer push diretamente para este branch. Tem certeza? +settings.default_branch_desc=O branch default é considerado o "base branch" no seu repositório para todos os pull requests abertos e commit feitos automaticamente, a menos que você especifique outro branch. +settings.choose_branch=Escolha um branch... +settings.no_protected_branch=No há branches protegidos diff.browse_source=Ver código fonte diff.parent=pai diff.commit=commit -diff.data_not_available=Dados de Diff não disponíveis. diff.show_diff_stats=Mostrar estatísticas do Diff diff.show_split_view=Visão dividida diff.show_unified_view=Visão unificada @@ -836,11 +853,9 @@ release.stable=Estável release.edit=editar release.ahead=%d commits para %s depois desta versão release.source_code=Código fonte -release.new_subheader=Publicar versões para iterar o produto. -release.edit_subheader=Um changelog detalhado ajuda os usuários a entenderem o que foi melhorado. +release.new_subheader=Publique lançamentos e gerencie as versões do projeto. release.tag_name=Nome da tag release.target=Destino -release.tag_helper=Escolha uma tag existente, ou crie uma nova tag em publicar. release.title=Título release.content=Conteúdo release.write=Escrever @@ -854,19 +869,13 @@ release.save_draft=Salvar rascunho release.edit_release=Editar versão release.delete_release=Excluir esta versão release.deletion=Exclusão de versão -release.deletion_desc=Excluir esta versão vai remover a tag do git correspondente. Você deseja continuar? -release.deletion_success=A versão foi removida com sucesso! release.tag_name_already_exist=Já existe uma versão com esse nome de tag. release.tag_name_invalid=Nome de tag não é válido. release.downloads=Downloads branch.delete=Excluir branch %s -branch.delete_desc=Depois de excluir uma branch, não há volta. Tenha certeza. branch.delete_notices_1=- Esta operação NÃO PODE ser desfeita. -branch.delete_notices_2=- Esta operação irá excluir permanentemente todos os conteúdos da branch %s. -branch.deletion_success=%s foi excluído com sucesso! branch.deletion_failed=Falha ao excluir branch %s. -branch.delete_branch_has_new_commits=%s não pode ser excluído porque ele tem novos commits após a mesclagem. [org] org_name_holder=Nome da organização @@ -883,9 +892,7 @@ create_new_team=Criar nova equipe org_desc=Descrição team_name=Nome da equipe team_desc=Descrição -team_name_helper=Você usará este nome para mencionar esta equipe em conversas. -team_desc_helper=Do que trata essa equipe? -team_permission_desc=Que nível de permissão esta equipe deve ter? +team_desc_helper=O que fará esse time? form.name_reserved=O nome de organização '%s' não pode ser usado. form.name_pattern_not_allowed=Não é permitido usar o padrão '%s' para o nome de organização. @@ -897,16 +904,11 @@ settings.full_name=Nome completo settings.website=Site settings.location=Localização settings.update_settings=Atualizar Configurações -settings.update_setting_success=Configuração da organização atualizada com sucesso. -settings.change_orgname_prompt=Esta mudança vai afetar os links para esta organização. -settings.update_avatar_success=A configuração de avatar da organização foi atualizado com sucesso. settings.delete=Excluir organização settings.delete_account=Excluir esta organização settings.delete_prompt=A operação irá excluir esta organização permanentemente, e NÃO PODERÁ ser desfeita! settings.confirm_delete_account=Confirmar exclusão settings.delete_org_title=Exclusão da organização -settings.delete_org_desc=Esta organização será excluída permanentemente, você quer continuar? -settings.hooks_desc=Adicionar webhooks que serão acionados para todos os repositórios dessa organização. members.membership_visibility=Visibilidade da associação: members.public=Público @@ -926,9 +928,9 @@ teams.leave=Deixar teams.read_access=Acesso de leitura teams.read_access_helper=Esta equipe poderá ver e clonar os repositórios dela. teams.write_access=Acesso de escrita -teams.write_access_helper=Esta equipa será capaz de ler os seus repositórios, bem como fazer push para eles. +teams.write_access_helper=Este time poderá ler e fazer push para seus repositórios. teams.admin_access=Acesso do administrador -teams.admin_access_helper=Esta equipe será capaz de fazer push/pull em seus repositórios, bem como adicionar-lhes outros colaboradores. +teams.admin_access_helper=Este time poderá fazer push e pull dos seus repositórios, assim como adicionar outros colaboradores ao time. teams.no_desc=Esta equipe não tem descrição teams.settings=Configurações teams.owners_permission_desc=Donos tem acesso total a todos repositórios e também direitos de administrador para a organização. @@ -937,8 +939,6 @@ teams.update_settings=Atualizar configurações teams.delete_team=Excluir esta equipe teams.add_team_member=Adicionar membro na equipe teams.delete_team_title=Exclusão da equipe -teams.delete_team_desc=Este equipe será excluída, você quer continuar? Membros desta equipe poderão perder acesso a alguns repositórios. -teams.delete_team_success=A equipe dada foi excluída com sucesso. teams.read_permission_desc=Essa equipe concede acesso para Leitura: membros podem ver e clonar os repositórios da equipe. teams.write_permission_desc=Esta equipe concede acesso para escrita: Membros podem ler e fazer push para os repositórios da equipe. teams.admin_permission_desc=Esta equipe concede acesso de Administrador: Membros podem ler, fazer push e adicionar outros colaboradores para os repositórios da equipe. @@ -968,23 +968,11 @@ dashboard.statistic_info=O banco de dados do Gitea contém %d usuários, dashboard.operation_name=Nome da operação dashboard.operation_switch=Trocar dashboard.operation_run=Executar -dashboard.clean_unbind_oauth=Limpar OAuthes não acoplados -dashboard.clean_unbind_oauth_success=Todos OAuthes desvinculados foram excluídos com sucesso. dashboard.delete_inactivate_accounts=Excluir todas as contas inativas -dashboard.delete_inactivate_accounts_success=Todas as contas inativas foram excluídas com sucesso. dashboard.delete_repo_archives=Excluir todos os arquivos dos repositórios -dashboard.delete_repo_archives_success=Todos os arquivos dos repositórios foram excluídos com sucesso. -dashboard.delete_missing_repos=Excluir todos os repositórios que perderam arquivos do git -dashboard.delete_missing_repos_success=Todos os registros de repositórios que perderam arquivos do git foram excluídos com sucesso. -dashboard.git_gc_repos=Fazer coleta de lixo nos repositórios -dashboard.git_gc_repos_success=A coleta de lixo foi realizada com sucesso em todos os repositórios. -dashboard.resync_all_sshkeys=Reescrever o arquivo '.ssh/authorized_keys' (atenção: chaves que não sejam do Gitea serão perdidas) -dashboard.resync_all_sshkeys_success=Todas as chaves públicas foram reescritas com sucesso. -dashboard.resync_all_update_hooks=Reescrever todos os hooks de atualização dos repositórios (necessário quando o caminho de configuração customizado é alterado) -dashboard.resync_all_update_hooks_success=Os hooks de atualização de todos os repositórios foram reescritos com sucesso. -dashboard.reinit_missing_repos=Reinicializar todos os registros de repositório que perderam os arquivos do Git -dashboard.reinit_missing_repos_success=Todos os repositórios que perderam arquivos do Git foram reinicializados com sucesso. - +dashboard.git_gc_repos=Executar a coleção de lixo em todos os repositórios +dashboard.resync_all_sshkeys=Reescrever arquivo '.ssh/authorized_keys' (para chaves SSH do Gitea) +dashboard.resync_all_hooks=Resincronizar hooks pre-receive, update e post-receive de todos os repositórios. dashboard.server_uptime=Uptime do Servidor dashboard.current_goroutine=Goroutines Atuais dashboard.current_memory_usage=Uso de memória atual @@ -1015,7 +1003,6 @@ dashboard.total_gc_pause=Pausa total do GC dashboard.last_gc_pause=Última pausa do GC dashboard.gc_times=Nº de execuções do GC -users.user_manage_panel=Painel de gerenciamento do usuário users.new_account=Criar nova conta users.name=Nome users.activated=Ativado @@ -1025,42 +1012,32 @@ users.created=Criado users.last_login=Último login users.never_login=Nunca logado users.send_register_notify=Enviar notificação de registro para ao usuário -users.new_success=Nova conta '%s' foi criada com sucesso. users.edit=Editar users.auth_source=Fonte da autenticação users.local=Local users.auth_login_name=Nome de login da autenticação users.password_helper=Deixe em branco para não mudar. -users.update_profile_success=O perfil da conta foi atualizado com sucesso. users.edit_account=Editar conta users.max_repo_creation=Limite máximo de criação de repositórios users.max_repo_creation_desc=(Use "-1" para utilizar o limite padrão) -users.is_activated=Esta conta está ativada -users.prohibit_login=Esta conta está proibida de efetuar login users.is_admin=Esta conta tem permissões de administrador -users.allow_git_hook=Esta conta tem permissões para criar hooks do Git +users.allow_git_hook=Esta conta possui permissão para criar hooks do Git users.allow_import_local=Esta conta tem permissões para importar repositórios locais -users.allow_create_organization=Esta conta tem permissão para criar Organizações users.update_profile=Atualizar perfil da conta users.delete_account=Excluir esta conta -users.still_own_repo=Sua conta ainda é proprietária do repositório, você tem que excluir ou transferi-lo primeiro. -users.still_has_org=Sua conta ainda faz parte da organização, você deve sair ou excluí-la primeiro. -users.deletion_success=Conta excluída com sucesso! -orgs.org_manage_panel=Painel de gerenciamento da organização orgs.name=Nome orgs.teams=Equipes orgs.members=Membros -repos.repo_manage_panel=Painel de gerenciamento do repositório repos.owner=Dono repos.name=Nome repos.private=Privado repos.watches=Observadores repos.stars=Favoritos repos.issues=Issues +repos.size=Tamanho -auths.auth_manage_panel=Painel de gerenciamento da autenticação auths.new=Adicionar nova fonte auths.name=Nome auths.type=Tipo @@ -1074,7 +1051,6 @@ auths.host=Servidor auths.port=Porta auths.bind_dn=Vincular DN auths.bind_password=Vincular senha -auths.bind_password_helper=Atenção: Esta senha é armazenada em texto plano. Não use uma conta com muitos privilégios. auths.user_base=Base de pesquisa do usuário auths.user_dn=Usuário do DN auths.attribute_username=Atributo nome de usuário @@ -1090,21 +1066,16 @@ auths.smtp_auth=Tipo de autenticação SMTP auths.smtphost=Host SMTP auths.smtpport=Porta SMTP auths.allowed_domains=Domínios autorizados -auths.allowed_domains_helper=Deixe em branco para permitir qualquer domínio do host SMTP. Vários domínios devem ser separados por vírgula ','. auths.enable_tls=Habilitar Criptografia TLS auths.skip_tls_verify=Ignorar verificação de TLS auths.pam_service_name=Nome de Serviço PAM +auths.oauth2_clientID=ID do cliente (chave) +auths.oauth2_clientSecret=Senha do cliente auths.enable_auto_register=Habilitar Registro Automático auths.tips=Dicas -auths.edit=Editar a configuração de autenticação auths.activated=Esta autenticação foi ativada -auths.new_success=Nova autenticação '%s' foi adicionada com sucesso. -auths.update_success=A configuração da autenticação foi atualizada com sucesso. -auths.update=Atualizar a configuração da autenticação -auths.delete=Excluir esta autenticação -auths.delete_auth_title=Exclusão da autenticação -auths.delete_auth_desc=Esta autenticação esta prestes a ser excluída, deseja continuar? -auths.still_in_used=Esta autenticação ainda é usada por alguns usuários. Por favor remova ou converta esses usuários para outro tipo de login primeiro. +auths.delete=Deletar este método de autenticação +auths.still_in_used=Esta fonte de autenticação ainda está sendo usada por alguns usuários. Por favor, delete ou converta esses usuários para outro tipo de login primeiro. auths.deletion_success=Autenticação excluída com sucesso! auths.login_source_exist=A fonte '%s' já existe. @@ -1127,7 +1098,6 @@ config.reverse_auth_user=Usuário de autenticação reversa config.ssh_config=Configuração de SSH config.ssh_enabled=Habilitado -config.ssh_start_builtin_server=Iniciar servidor embutido config.ssh_domain=Domínio config.ssh_port=Porta config.ssh_listen_port=Porta de escuta @@ -1150,20 +1120,20 @@ config.db_path_helper=(para "sqlite3" e "tidb") config.service_config=Configuração do serviço config.register_email_confirm=Requerer confirmação de e-mail config.disable_register=Desabilitar registro +config.enable_openid_signup=Habilitar registro via OpenID +config.enable_openid_signin=Habilitar login via OpenID config.show_registration_button=Mostrar botão de registo config.require_sign_in_view=Requerer o usuário a entrar no Gitea para visualizar config.mail_notify=Notificação de e-mail config.disable_key_size_check=Desativar verificação de tamanho mínimo da chave config.enable_captcha=Habilitar o captcha config.active_code_lives=Ativar Code Lives -config.reset_password_code_lives=Redefinir senha de Code Lives config.default_keep_email_private=Valor padrão para manter o e-mail privado config.no_reply_address=Endereço de sem resposta config.webhook_config=Configuração de Hook da Web config.queue_length=Tamanho da fila config.deliver_timeout=Intervalo de entrega -config.skip_tls_verify=Pular verificação de TLS config.mailer_config=Configuração de envio de e-mail config.mailer_enabled=Habilitado @@ -1172,7 +1142,6 @@ config.mailer_name=Nome config.mailer_host=Servidor config.mailer_user=Usuário config.send_test_mail=Enviar email de teste -config.test_mail_failed=Falha ao enviar o email de teste para '%s': %v config.test_mail_sent=O email de teste foi enviado para '%s'. config.oauth_config=Configuração do OAuth @@ -1225,7 +1194,6 @@ monitor.start=Hora de início monitor.execute_time=Tempo de execução notices.system_notice_list=Sistema de notificações -notices.view_detail_header=Ver detalhe do anúncio notices.actions=Ações notices.select_all=Selecionar tudo notices.deselect_all=Desmarcar tudo @@ -1236,7 +1204,6 @@ notices.type=Tipo notices.type_1=Repositório notices.desc=Descrição notices.op=Op. -notices.delete_success=Avisos do sistema foram excluídos com sucesso. [action] create_repo=criou o repositório %s @@ -1252,42 +1219,48 @@ comment_issue=`comentou sobre a issue %s#%[2]s` merge_pull_request=`mesclou o pull request %s#%[2]s` transfer_repo=transferiu repositório de %s para %s push_tag=fez push da tag %[2]s para %[3]s -compare_commits=Ver comparação entre esses %d commits [tool] -ago=atrás -from_now=a partir de agora +ago=%s atrás +from_now=%s a partir de agora now=agora -1s=1 segundo %s -1m=1 minuto %s -1h=1 hora %s -1d=1 dia %s -1w=1 semana %s -1mon=1 mês %s -1y=1 ano %s -seconds=%d segundos %s -minutes=%d minutos %s -hours=%d horas %s -days=%d dias %s -weeks=%d semanas %s -months=%d meses %s -years=%d anos %s +1s=1 segundo +1m=1 minuto +1h=1 hora +1d=1 dia +1w=1 semana +1mon=1 mês +1y=1 ano +seconds=%d segundos +minutes=%d minutos +hours=%d horas +days=%d dias +weeks=%d semanas +months=%d meses +years=%d anos raw_seconds=segundos raw_minutes=minutos [dropzone] -default_message=Arraste e solte arquivos aqui, ou clique para selecioná-los. invalid_input_type=Você não pode enviar arquivos deste tipo. -file_too_big=O tamanho do arquivo ({{filesize}} MB) excede o limite máximo ({{maxFilesize}} MB). +file_too_big=Tamanho de arquivo ({{filesize}} MB) excede o máximo de ({{maxFilesize}} MB). remove_file=Remover [notification] notifications=Notificações unread=Não lidas read=Lidas -no_unread=Você não possui notificações não lidas. -no_read=Você não possui notificações lidas. -pin=Fixar +no_unread=Você não possui nenhuma notificação não lida. +no_read=Você não possui nenhuma notificação lida. +pin=Fixar notificação mark_as_read=Marcar como lida mark_as_unread=Marcar como não lida +[gpg] +error.extract_sign=Falha ao extrair assinatura +error.generate_hash=Falha ao gerar hash de commit +error.no_gpg_keys_found=Nenhuma chave conhecida encontrada para esta assinatura no banco de dados +error.not_signed_commit=Não é um commit assinado + +[units] + diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index cdfb111..cf4f8dd 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -5,8 +5,10 @@ dashboard=Панель управления explore=Обзор help=Помощь sign_in=Вход +sign_in_with=Войдите с помощью sign_out=Выход sign_up=Регистрация +link_account=Привязать Аккаунт register=Регистрация website=Веб-сайт version=Версия @@ -23,6 +25,8 @@ email=Эл. почта password=Пароль re_type=Введите повторно captcha=Капча +twofa=Двухфакторная аутентификация +twofa_scratch=Двухфакторный одноразовый пароль repository=Репозиторий organization=Организация @@ -30,7 +34,7 @@ mirror=Зеркало new_repo=Новый репозиторий new_migrate=Новая миграция new_mirror=Новое зеркало -new_fork=Новое ответвление репозитория +new_fork=Новый форк репозитория new_org=Новая организация manage_org=Управление организациями admin_panel=Панель администратора @@ -40,6 +44,11 @@ your_profile=Ваш профиль your_starred=Ваше избранное your_settings=Ваши настройки +all=Все +sources=Источники +mirrors=Зеркала +forks=Ответвления + activities=Активность pull_requests=Запросы на слияние issues=Задачи @@ -48,8 +57,8 @@ cancel=Отмена [install] install=Установка -title=Установочные шаги для первого запуска -docker_helper=Если вы запускаете Gitea внутри Docker, пожалуйста прочтите эти советы внимательно перед тем как что-либо изменить на этой странице! +title=Начальная конфигурация +docker_helper=Если вы запускаете Gitea внутри Docker, пожалуйста прочтите эти советы внимательно перед тем как что-либо изменить на этой странице. requite_db_desc=Gitea требует MySQL, PostgreSQL, SQLite3 или TiDB. db_title=Настройки базы данных db_type=Тип базы данных @@ -66,21 +75,20 @@ err_invalid_tidb_name=Имя базы данных TiDB не может соде no_admin_and_disable_registration=Вы не можете отключить регистрацию до создания учетной записи администратора. err_empty_admin_password=Пароль администратора не может быть пустым. -general_title=Общие параметры Gitea +general_title=Общие параметры приложения app_name=Имя приложения -app_name_helper=Укажите здесь название вашей потрясающей организации! repo_path=Путь корня репозитория -repo_path_helper=Все сетевые репозитории Git будут сохранены в этой директории. +repo_path_helper=Все удаленные Git репозиториии будут сохранены в этот каталог. +lfs_path=Корень LFS +lfs_path_helper=В этой папке будут храниться файлы, хранящиеся Git LFS. Оставьте пустым, чтобы отключить LFS. run_user=Пользователь run_user_helper=У пользователя должен быть доступ к пути к корню репозитория и к запуску Gitea. domain=Домен domain_helper=Влияет на URL-адреса для клонирования по SSH. ssh_port=SSH порт -ssh_port_helper=Номер порта, который использует SSH сервер. Оставьте пустым, чтобы отключить SSH. http_port=Порт HTTP http_port_helper=Номер порта, который приложение будет слушать. app_url=URL приложения -app_url_helper=Этот параметр влияет на URL для клонирования по HTTP/HTTPS и на адреса в электронной почте. log_root_path=Путь к журналу log_root_path_helper=Каталог для записи файлов журнала. @@ -89,13 +97,11 @@ email_title=Настройки службы электронной почты smtp_host=Узел SMTP smtp_from=Из smtp_from_helper=Почта от адреса, RFC 5322. Это может быть email адрес или формат "Имя" . -mailer_user=Электронная почта отправителя mailer_password=Пароль отправителя register_confirm=Включить подтверждение регистрации mail_notify=Разрешить почтовые уведомления server_service_title=Сервер и другие настройки служб offline_mode=Включение офлайн режима -offline_mode_popup=Отключить CDN даже в производственном режиме, все файлы ресурсов будут раздаваться локально. disable_gravatar=Отключить службу Gravatar disable_gravatar_popup=Отключить Gravatar и пользовательские источники, все аватары по-умолчанию загружаются пользователями. federated_avatar_lookup=Включить поиск внешних Аватаров @@ -106,7 +112,7 @@ enable_captcha=Включить капчу enable_captcha_popup=Запрашивать капчу при регистрации пользователя. require_sign_in_view=Разрешить требовать авторизацию для просмотра страниц require_sign_in_view_popup=Только авторизированные пользователи могут просматривать страницы, посетители смогут увидеть только ссылку на авторизацию вверху страницы. -admin_setting_desc=Вы не должны создать учетную запись администратора прямо сейчас, пользователь с ID = 1 получит доступ с правами администратора автоматически. +admin_setting_desc=Вы не должны создать учетную запись администратора прямо сейчас, первый пользователь получит доступ с правами администратора автоматически. admin_title=Настройки учётной записи администратора admin_name=Имя пользователя admin_password=Пароль @@ -115,16 +121,16 @@ admin_email=Электронная почта администратора install_btn_confirm=Установить Gitea test_git_failed=Не удалось проверить 'git' команду: %v sqlite3_not_available=Ваша версия не поддерживает SQLite3, пожалуйста скачайте официальную бинарную версию от %s, а не версию gobuild. -invalid_db_setting=Настройки базы данных не правильные: %v invalid_repo_path=Недопустимый путь к корню репозитория: %v run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s save_config_failed=Не удалось сохранить конфигурацию: %v invalid_admin_setting=Указан недопустимый параметр учетной записи администратора: %v -install_success=Добро пожаловать! Мы рады, что вы выбрали Gitea. Веселитесь и берегите себя. invalid_log_root_path=Недопустимый путь для логов: %v +default_keep_email_private_popup=Это значение по умолчанию видимости адреса электронной почты пользователей. Если задано значение true, адрес электронной почты всех новых пользователей будет скрыт до того, как пользователь сам изменит настройки приватности. +no_reply_address=No-reply адрес [home] -uname_holder=Имя пользователь или E-mail +uname_holder=Имя пользователя или E-mail password_holder=Пароль switch_dashboard_context=Переключить контекст панели управления my_repos=Мои репозитории @@ -133,6 +139,7 @@ collaborative_repos=Совместные репозитории my_orgs=Мои организации my_mirrors=Мои зеркала view_home=Показать %s +search_repos=Поиск репозитория... issues.in_your_repos=В ваших репозиториях @@ -141,24 +148,19 @@ repos=Репозитории users=Пользователи organizations=Организации search=Поиск -repo_no_results=Не найдено ни одного репозитория. -user_no_results=Не найдено ни одного пользователя. -org_no_results=Не найдено ни одной организации. [auth] -create_new_account=Создать новый аккаунт +create_new_account=Регистрация register_helper_msg=Уже есть аккаунт? Авторизуйтесь! -social_register_helper_msg=Уже есть учетная запись? Свяжите ее с соцсетью! disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта. disable_register_mail=К сожалению подтверждение регистрации по почте отключено. remember_me=Запомнить меня -forgot_password=Забыли пароль -forget_password=Забыли пароль? +forgot_password_title=Забыл пароль +forgot_password=Забыли пароль? sign_up_now=Нужен аккаунт? Зарегистрируйтесь. -confirmation_mail_sent_prompt=Новое письмо для подтверждения было направлено на %s, пожалуйста, проверьте ваш почтовый ящик в течение %d часов для завершения регистрации. +confirmation_mail_sent_prompt=Новое письмо для подтверждения было направлено на %s, пожалуйста, проверьте ваш почтовый ящик в течение %s для завершения регистрации. active_your_account=Активируйте свой аккаунт prohibit_login=Вход запрещен -prohibit_login_desc=Вход для вашей учетной записи был запрещен, пожалуйста, свяжитесь с администратором сайта. resent_limit_prompt=Извините, вы уже запросили активацию по электронной почте недавно. Пожалуйста, подождите 3 минуты, а затем повторите попытку. has_unconfirmed_mail=Здравствуйте, %s! У вас есть неподтвержденный адрес электронной почты (%s). Если вам не приходило письмо с подтверждением или нужно выслать новое письмо, нажмите на кнопку ниже. resend_mail=Нажмите здесь, чтобы переотправить активационное письмо @@ -168,14 +170,18 @@ reset_password=Сброс пароля invalid_code=Извините, ваш код подтверждения истек или не является допустимым. reset_password_helper=Нажмите здесь, чтобы сбросить свой пароль password_too_short=Длина пароля не менее %d символов. -non_local_account=Нелокальные аккаунты не могут изменить пароль через Gitea. +verify=Проверить +scratch_code=Одноразовый пароль +login_userpass=Пользователь / пароль +login_openid=OpenID +openid_register_title=Создать новый аккаунт [mail] activate_account=Пожалуйста активируйте свой аккаунт activate_email=Подтвердите адрес своей электронной почты reset_password=Восстановите ваш пароль -register_success=Регистрация окончена. Добро пожаловать! -register_notify=Добро пожаловать на борт +register_success=Регистрация прошла успешно +register_notify=Добро пожаловать на Gitea [modal] yes=Да @@ -203,8 +209,6 @@ TreeName=Путь к файлу Content=Содержимое require_error=` не может быть пустым.` -alpha_dash_error=«должен быть допустимым символьным, числовым или dash(-_) значением.» -alpha_dash_dot_error=«должен быть допустимым символьным, числовым или dash(-_) символами, включая точку.» size_error=` должен быть размер %s.` min_size_error=«должен содержать по крайней мере %s символов.» max_size_error=` должен содержать максимум %s символов.` @@ -213,27 +217,24 @@ url_error=` не является допустимым URL-адресом.` include_error=` должен содержать '%s'.` unknown_error=Неизвестная ошибка: captcha_incorrect=Капча не пройдена. -password_not_match=Пароли не совпадают. -username_been_taken=Имя пользователя занято. -repo_name_been_taken=Имя репозитория занято. -org_name_been_taken=Название организации занято. -team_name_been_taken=Название команды занято. -email_been_used=Адрес электронной почты уже используется. -username_password_incorrect=Имя пользователя или пароль не правильный. +username_been_taken=Имя пользователя уже занято. +repo_name_been_taken=Имя репозитория уже используется. +org_name_been_taken=Название организации уже занято. +team_name_been_taken=Название команды уже занято. +email_been_used=Адрес электронной почты уже занят. +openid_been_used=Адрес OpenID '%s' уже используется. +username_password_incorrect=Неверное имя пользователя или пароль. enterred_invalid_repo_name=Пожалуйста, убедитесь, что введено правильное имя репозитория. enterred_invalid_owner_name=Убедитесь, что введенное имя владельца верное. enterred_invalid_password=Убедитесь, что введенный пароль верен. -user_not_exist=Данный пользователь не существует. -last_org_owner=Удаление последнего пользователя из команды владельцев невозможно, поскольку всегда должен быть хотя бы один владелец в любой организации. +user_not_exist=Пользователь не существует. +last_org_owner=Удаление последнего пользователя из команды владельцев не разрешается, поскольку всегда должен быть по крайней мере один владелец в любой организации. invalid_ssh_key=К сожалению, мы не смогли проверить ваш SSH-ключ: %s -unable_verify_ssh_key=Gitea не может проверить ваш SSH-ключ, но мы допускаем, что он действителен. Пожалуйста, удостоверьтесь самостоятельно, что ключ действителен. +invalid_gpg_key=К сожалению, мы не смогли проверить ваш GPG-ключ: %s auth_failed=Ошибка аутентификации: %v -still_own_repo=На вашем аккаунте все еще остается как минимум один репозиторий, сначала вам нужно удалить или передать его. -still_has_org=Вы находитесь в организации, сперва Вам необходимо покинуть ее или удалить. -org_still_own_repo=Данная организация все еще является владельцем репозиториев, необходимо удалить или переместить их в начале. target_branch_not_exist=Целевая ветка не существует @@ -249,29 +250,30 @@ follow=Подписаться unfollow=Отписаться form.name_reserved=Имя пользователя '%s' зарезервировано. -form.name_pattern_not_allowed=Имя пользователя «%s» не допускается. +form.name_pattern_not_allowed=Шаблон имени пользователя '%s' не допускается. [settings] profile=Профиль password=Пароль avatar=Аватар -ssh_keys=SSH ключи +ssh_gpg_keys=SSH / GPG ключи social=Учетные записи в соцсетях applications=Приложения orgs=Организации delete=Удалить аккаунт +twofa=Двухфакторная аутентификация +account_link=Внешние учетные записи +organization=Организация uid=UID public_profile=Открытый профиль -profile_desc=Адрес вашей электронной почты является публичным и будет использован для любых уведомлений, связанных с аккаунтом, а также для любых действий, совершенных через сайт. -password_username_disabled=Нелокальные пользователи не могут изменить своё имя. full_name=ФИО website=Веб-сайт location=Местоположение update_profile=Обновить профиль -update_profile_success=Ваш профиль был успешно обновлен. +update_profile_success=Ваш профиль успешно обновлен. change_username=Имя пользователя изменено -change_username_prompt=Это изменение может повлечь за собой изменение ссылок относительно вашего аккаунта. +change_username_prompt=Это изменение изменит ссылки на ваш аккаунт. continue=Далее cancel=Отмена @@ -282,15 +284,13 @@ choose_new_avatar=Выбрать новый аватар update_avatar=Обновить настройку аватара delete_current_avatar=Удалить текущий аватар uploaded_avatar_not_a_image=Загружаемый файл не является изображением. -update_avatar_success=Настройка вашего аватара обновлена успешно. +update_avatar_success=Настройка вашего аватара обновлена. change_password=Сменить пароль old_password=Текущий пароль new_password=Новый пароль retype_new_password=Подтверждение нового пароля -password_incorrect=Текущий пароль не правильный. -change_password_success=Пароль сменен успешно. Теперь вы можете войти с новым паролем. -password_change_disabled=Нелокальные пользователи не могут изменить свой пароль. +password_incorrect=Текущий пароль неправильный. emails=Адреса электронной почты manage_emails=Управление адресами электронной почты @@ -298,38 +298,37 @@ email_desc=Ваш основной адрес электронной почты primary=Основной primary_email=Установить как основной delete_email=Удалить -email_deletion=Удаление адреса электронной почты -email_deletion_desc=Удаление этого адреса электронной почты, приведет к удалению связанной с вашим аккаунтом, информации. Вы точно хотите продолжить? email_deletion_success=Адрес электронной почты успешно удален. add_new_email=Добавить новый адрес электронной почты add_email=Добавить электронную почту -add_email_confirmation_sent=Новое подтверждение по электронной почте было отправлено '%s', пожалуйста, проверьте свой почтовый ящик в течение следующих %d часов, чтобы завершить процесс подтверждения. add_email_success=Новый адрес электронной почты успешно добавлен. manage_ssh_keys=Управление SSH ключами add_key=Добавить ключ -ssh_desc=Это список ключей SSH связанных с вашей учетной записью. Удаляйте любые неизвестные вам ключи. -ssh_helper=Нужна помощь? Ознакомьтесь с нашим руководством по созданию SSH-ключей или посмотрите решения частых проблем, связанных с SSH. add_new_key=Добавить SSH ключ -ssh_key_been_used=Будет использован публичный ключ. +add_new_gpg_key=Добавить GPG ключ +ssh_key_been_used=Этот публичный ключ уже был использован. ssh_key_name_used=Публичный ключ с таким же именем уже существует. +gpg_key_id_used=Публичный GPG ключ с таким же идентификатором уже существует. +key_id=ИД ключа key_name=Имя ключа key_content=Содержимое -add_key_success=Был успешно добавлен новый ключ SSH «%s»! delete_key=Удалить ssh_key_deletion=Удаление ключа SSH -ssh_key_deletion_desc=Удалить этот SSH ключ удалит все связанные с ним доступы для вашей учетной записи. Вы хотите продолжить? -ssh_key_deletion_success=SSH ключ был успешно удален! +ssh_key_deletion_success=SSH ключ был удален. +gpg_key_deletion_success=GPG ключ был удален. add_on=Добавлено +valid_until=Действителен до +valid_forever=Действителен навсегда last_used=Последний раз использовался no_activity=Еще не применялся -key_state_desc=Этот ключ использовался за последние 7 дней -token_state_desc=Этот токен использовался за последние 7 дней +key_state_desc=Этот ключ использовался в течение последних 7 дней +token_state_desc=Этот токен использовался в течение последних 7 дней +show_openid=Показывать в профиле +hide_openid=Скрыть из профиля manage_social=Управление привязанными учетными записями в соцсетях -social_desc=Это список привязанных учетных записей в соцсетях. Удаляйте любые неизвестные вам привязки. unbind=Отвязать -unbind_success=Социальная учетная запись отвязана. manage_access_token=Управление Токенами Персонального Доступа generate_new_token=Создать новый token @@ -337,53 +336,44 @@ tokens_desc=Созданные вами токены могут использо new_token_desc=Пока что каждый токен будет иметь полный доступ к вашей учетной записи. token_name=Имя маркера generate_token=Генерировать маркер -generate_token_succees=Успешно создан новый токен доступа! Пожалуйста сделайте копию вашего нового токена персонального доступа. Вы не сможете увидеть его снова! delete_token=Удалить access_token_deletion=Удаление личного токена доступа -access_token_deletion_desc=Удаление этого персонального токена доступа приведет к удалению всех связанных прав доступа к приложению. Вы хотите продолжить? -delete_token_success=Персональный токен доступа успешно удален! Не забудьте изменить настройки вашего приложения. + +twofa_disable=Отключить двухфакторную аутентификацию + delete_account=Удалить свой аккаунт delete_prompt=Этим действием вы удалите свою учетную запись навсегда и НЕ СМОЖЕТЕ ее вернуть! confirm_delete_account=Подтвердите удаление delete_account_title=Удаление аккаунта -delete_account_desc=Эта учетная запись будет удалена насовсем. Вы хотите продолжить? [repo] owner=Владелец repo_name=Имя репозитория -repo_name_helper=Лучшие названия репозиториев коротки, запоминаемы и уникальны. visibility=Видимость visiblity_helper=Личный репозиторий -visiblity_helper_forced=Все новые репозитории являются Личными по желанию администратора сайта visiblity_fork_helper=(Изменение этого значения затронет все ответвления) clone_helper=Нужна помощь в клонировании? Посетите страницу помощи! fork_repo=Ответвить репозиторий fork_from=Ответвление от -fork_visiblity_helper=Ответвленному репозиторию нельзя поменять уровень видимости repo_desc=Описание repo_lang=Язык repo_gitignore_helper=Выберите шаблоны .gitignore license=Лицензия license_helper=Выберите файл лицензии +readme=Readme readme_helper=Выберите шаблон для файла readme auto_init=Инициализировать этот репозиторий выбранными файлами и шаблоном create_repo=Создать репозиторий default_branch=Ветка по умолчанию mirror_prune=Очистить -mirror_prune_desc=Удалите ссылки на удаленно отслеживаемые объекты, которых больше нет на удаленном сервере -mirror_interval=Интервал зеркалирования (час) mirror_address=Адрес зеркала -mirror_address_desc=Укажите необходимые учетные данные в адрес. mirror_last_synced=Последняя синхронизация watchers=Наблюдатели stargazers=Звездочеты forks=Ответвления -form.reach_limit_of_creation=У владельца достигнут максимальный предел в %d создаваемых репозиториев. -form.name_reserved=Имя репозитория '%s' зарезервировано. -form.name_pattern_not_allowed=Шаблон имени репозитория '%s' не допускается. need_auth=Требуется авторизация migrate_type=Тип миграции @@ -391,6 +381,7 @@ migrate_type_helper=Этот репозиторий будет нажмите здесь, чтобы увидеть, что было изменено, или нажмите кнопку commit снова, чтобы перезаписать эти изменения. @@ -472,13 +465,15 @@ editor.upload_files_to_dir=Загрузить файлы '%s' commits.commits=Коммиты commits.search=Поиск коммитов -commits.find=Найти +commits.find=Поиск +commits.search_all=Все ветки commits.author=Автор commits.message=Сообщение commits.date=Дата commits.older=Раньше commits.newer=Новее + issues.new=Новая задача issues.new.labels=Метки issues.new.no_label=Нет меток @@ -496,7 +491,6 @@ issues.new_label=Новая метка issues.new_label_placeholder=Имя метки... issues.create_label=Добавить метку issues.label_templates.title=Загрузить набор предопределённых меток -issues.label_templates.info=Меток пока нет. Вы можете нажать на кнопку «Создать метку», чтобы создать новую или использовать одну из готового набора ниже. issues.label_templates.helper=Выберите метку issues.label_templates.use=Использовать ярлык issues.label_templates.fail_to_load_file=Не удалось загрузить файл шаблона метки «%s»: %v @@ -520,6 +514,12 @@ issues.filter_sort.recentupdate=Недавно обновленные issues.filter_sort.leastupdate=Давно обновленные issues.filter_sort.mostcomment=Большего комментариев issues.filter_sort.leastcomment=Меньше комментариев +issues.action_open=Открыть +issues.action_label=Метка +issues.action_milestone=Этап +issues.action_milestone_no_select=Нет этапа +issues.action_assignee=Ответственный +issues.action_assignee_no_select=Нет ответственного issues.opened_by=%[1]s открыта %[3]s issues.opened_by_fake=%[1]s открыта %[2]s issues.previous=Предыдущая страница @@ -553,13 +553,14 @@ issues.label_edit=Редактировать issues.label_delete=Удалить issues.label_modify=Изменение метки issues.label_deletion=Удаление метки -issues.label_deletion_desc=Удаление ярлыка затронет все связанные задачи. Продолжить? -issues.label_deletion_success=Метка была удалена успешно! issues.label.filter_sort.alphabetically=По алфавиту issues.label.filter_sort.reverse_alphabetically=С конца алфавита +issues.label.filter_sort.by_size=Размер issues.num_participants=%d участников issues.attachment.open_tab=`Нажмите, чтобы увидеть "%s" в новой вкладке` issues.attachment.download=`Нажмите, чтобы скачать "%s"` +issues.subscribe=Подписаться +issues.unsubscribe=Отказаться от подписки pulls.new=Новый запрос на слияние pulls.compare_changes=Сравнить изменения @@ -576,9 +577,8 @@ pulls.merged_title_desc=слито %[1]d коммит(ов) из %[2]s«%s». wiki.page_already_exists=Вики-страница с таким именем уже существует. wiki.pages=Страницы wiki.last_updated=Последнее обновление %s @@ -641,7 +638,6 @@ settings.githooks=Git хуки settings.basic_settings=Основные параметры settings.mirror_settings=Настройки Зеркала settings.sync_mirror=Синхронизировать -settings.mirror_sync_in_progress=Выполняется синхронизация Зеркала, пожалуйста, обновите эту страницу через минуту. settings.site=Официальный сайт settings.update_settings=Обновить настройки settings.advanced_settings=Расширенные настройки @@ -653,6 +649,8 @@ settings.external_wiki_url_desc=Посетители будут перенапр settings.issues_desc=Включить систему отслеживания ошибок settings.use_internal_issue_tracker=Использовать встроенную легковесную систему отслеживания ошибок settings.use_external_issue_tracker=Использовать внешнюю систему отслеживания ошибок +settings.external_tracker_url=URL внешней системы отслеживания ошибок +settings.external_tracker_url_desc=Посетители будут перенаправлены на URL-адрес, когда они кликнут по вкладке. settings.tracker_url_format=Внешний формат ссылки системы отслеживания ошибок. settings.tracker_issue_style=Стиль Именования Внешней Системы Учета Задач: settings.tracker_issue_style.numeric=Цифровой @@ -665,7 +663,6 @@ settings.convert=Преобразовать в обычный репозитор settings.convert_desc=Это зеркало можно преобразовать в обычный репозиторий. Это не может быть отменено. settings.convert_notices_1=- Эта операция преобразует это зеркало в обычный репозиторий, и она не может быть отменена. settings.convert_confirm=Подтвердите преобразование -settings.convert_succeed=Репозиторий был успешно преобразован в обычный. settings.transfer=Передать права собственности settings.transfer_desc=Передать репозиторий другому пользователю или организации где у вас есть права администратора. settings.transfer_notices_1=- Вы можете потерять доступ, если новый владелец является отдельным пользователем. @@ -674,17 +671,11 @@ settings.transfer_form_title=Введите сопутствующую инфо settings.wiki_delete=Стереть данные Вики settings.wiki_delete_desc=Будьте внимательны! Как только вы удалите Вики — пути назад не будет. settings.wiki_delete_notices_1=-Это будет удалено и отключит Вики для %s -settings.wiki_deletion_success=Данные Вики успешно стерты. settings.delete=Удалить этот репозиторий settings.delete_desc=Будьте внимательны! Как только вы удалите репозиторий — пути назад не будет. settings.delete_notices_1=- Эта операция НЕ МОЖЕТ быть отменена. -settings.delete_notices_2=- Эта операция навсегда удалит всё из этого репозитория, включая данные Git, связанные с ним задачи, комментарии и права доступа для сотрудников. -settings.delete_notices_fork_1=- Все отвлетвления станут независимыми после удаления. -settings.deletion_success=Репозиторий был успешно удалён! -settings.update_settings_success=Настройки репозитория обновлены успешно. settings.transfer_owner=Новый владелец settings.make_transfer=Выполнить передачу -settings.transfer_succeed=Владение репозиторием было успешно передано. settings.confirm_delete=Подтвердить удаление settings.add_collaborator=Добавить нового соавтора settings.add_collaborator_success=Был добавлен новый соавтор. @@ -696,9 +687,8 @@ settings.search_user_placeholder=Поиск пользователя... settings.org_not_allowed_to_be_collaborator=Организации не могут быть добавлены как соавторы. settings.user_is_org_member=Пользователь является членом организации, члены которой не могут быть добавлены в качестве соавтора. settings.add_webhook=Добавить Webhook -settings.hooks_desc=Webhooks позволяют внешним службам получать уведомления при возникновении определенных событий на Gitea. При возникновении указанных событий мы отправим запрос POST на каждый заданный вами URL. Узнать больше можно в нашем Руководстве по Webhooks. +settings.hooks_desc=Webhooks позволяют внешним службам получать уведомления при возникновении определенных событий на Gitea. При возникновении указанных событий мы отправим запрос POST на каждый заданный вами URL. Узнать больше можно в нашем руководстве по webhooks. settings.webhook_deletion=Удалить веб-хук -settings.webhook_deletion_desc=Удаление этого веб-хука приведет к удалению всей, связанной с ним, информации, включая историю. Хотите продолжить? settings.webhook_deletion_success=Веб-хук успешно удален! settings.webhook.test_delivery=Проверить доставку settings.webhook.test_delivery_desc=Отправить push для тестирования настройки веб-хуков @@ -713,7 +703,6 @@ settings.githook_edit_desc=Если хук не активен, будет по settings.githook_name=Название Hook'a settings.githook_content=Перехватить содержание settings.update_githook=Обновить Hook -settings.add_webhook_desc=Мы отправим запрос POST на указанный ниже URL с информацией о событиях. Можно также указать формат, в котором вы бы хотели получить данные (JSON, x-www-form-urlencoded, и т.д.). Дополнительную информацию можно найти в Руководстве по Webhook. settings.payload_url=URL обработчика settings.content_type=Тип содержимого settings.slack_username=Имя пользователя @@ -729,7 +718,6 @@ settings.event_pull_request=Запросы на слияние settings.event_pull_request_desc=Запрос слияния открыт, закрыт, переоткрыт, изменён, назначен, снят, метка обновлена, метка убрана, или синхронизирован. settings.event_push_desc=Push в репозиторий settings.active=Активен -settings.active_helper=Подробности о событии, вызвавшем срабатывание хука, также будут предоставлены. settings.add_hook_success=Был добавлен новый webhook. settings.update_webhook=Обновление Webhook settings.update_hook_success=Webhook обновлен. @@ -749,13 +737,10 @@ settings.key_been_used=Содержимое ключа развертывани settings.key_name_used=Ключ развертывания с таким заголовком уже существует. settings.add_key_success=Новый ключ развертывания '%s' успешно добавлен! settings.deploy_key_deletion=Удалить ключ развертывания -settings.deploy_key_deletion_desc=Удаление ключа развертывания приведет к удалению всех связанных прав доступа к репозиторию. Вы хотите продолжить? -settings.deploy_key_deletion_success=Ключ развертывания успешно удален! diff.browse_source=Просмотр исходного кода diff.parent=Родитель diff.commit=Сommit -diff.data_not_available=Данные Diff недоступны. diff.show_diff_stats=Показать статистику Diff diff.show_split_view=Разделённый вид diff.show_unified_view=Единый вид @@ -772,11 +757,8 @@ release.stable=Стабильный release.edit=Редактировать release.ahead=%d коммитов %s начиная с этого релиза release.source_code=Исходный код -release.new_subheader=Публикуйте релизы для итерации продукта. -release.edit_subheader=Подробный журнал изменений может помочь пользователям понять, что было улучшено. release.tag_name=Имя тега release.target=Цель -release.tag_helper=Выберите существующий тег, или создайте новый. release.title=Заголовок release.content=Содержимое release.write=Запись @@ -790,8 +772,6 @@ release.save_draft=Сохранить черновик release.edit_release=Редактировать релиз release.delete_release=Удалить этот релиз release.deletion=Удаление релиза -release.deletion_desc=Удаление этого релиза удалит соответствующую Git метку. Вы хотите продолжить? -release.deletion_success=Релиз был успешно удален! release.tag_name_already_exist=Релиз с этим именем метки уже существует. release.tag_name_invalid=Имя тега является не допустимым. release.downloads=Загрузки @@ -812,9 +792,6 @@ create_new_team=Создать Новую Команду org_desc=Описание team_name=Название команды team_desc=Описание -team_name_helper=Вы будете использовать это имя для упоминания этой команды в обсуждении. -team_desc_helper=Что это за команда? -team_permission_desc=Какой уровень разрешений должен быть у этой команды? form.name_reserved=Наименование организации '%s' зарезервированно. form.name_pattern_not_allowed=Шаблон организации '%s' не допускается. @@ -825,16 +802,11 @@ settings.full_name=Полное имя settings.website=Сайт settings.location=Местоположение settings.update_settings=Обновить настройки -settings.update_setting_success=Настройки Организации были успешно обновлены. -settings.change_orgname_prompt=Это изменение затронет все связанные с организацией, ссылки. -settings.update_avatar_success=Аватар организации успешно обновлен. settings.delete=Удалить Организацию settings.delete_account=Удалить Эту Организацию settings.delete_prompt=Это действие безвозвратно удалит эту организацию навсегда. settings.confirm_delete_account=Подтвердить удаление settings.delete_org_title=Удаление Организации -settings.delete_org_desc=Эта организация будет удалена навсегда. Хотите всё-равно продолжить? -settings.hooks_desc=Добавьте автоматическое обновление, который будет вызываться для всех репозиций под этой Группой. members.membership_visibility=Видимость участника команды: members.public=Публичный @@ -854,9 +826,7 @@ teams.leave=Выйти teams.read_access=Доступ на чтение teams.read_access_helper=Эта команда будет иметь возможность просматривать и клонировать ее репозитории. teams.write_access=Доступ на запись -teams.write_access_helper=Эта команда будет в состоянии прочитать ее репозитории, а также посылать изменения. teams.admin_access=Доступ администратора -teams.admin_access_helper=Эта команда будет иметь возможность выполнять push/pull в его репозиториях, а также добавлять других сотрудников к нему. teams.no_desc=Эта группа не имеет описания teams.settings=Настройки teams.owners_permission_desc=Владельцы имеют полный доступ ко всем репозиториям и имеют права администратора организации. @@ -865,8 +835,6 @@ teams.update_settings=Обновить настройки teams.delete_team=Удалить эту группу разработки teams.add_team_member=Добавление члена группы разработки teams.delete_team_title=Удалить группу разработки -teams.delete_team_desc=Эта команда будет удалена. Вы хотите продолжить? Члены этой группы могут потерять доступ к некоторым репозиториям. -teams.delete_team_success=Данная команда была удалена успешно. teams.read_permission_desc=Эта команда предоставляет доступ на Чтение: члены могут просматривать и клонировать репозитории команды. teams.write_permission_desc=Эта команда предоставляет доступ на Запись: члены могут получать и выполнять push команды в репозитории. teams.admin_permission_desc=Эта команда дает административный доступ: участники могут читать, пушить и добавлять соавторов к ее репозиториям. @@ -896,23 +864,8 @@ dashboard.statistic_info=В базе данных Gitea записано %d %s @@ -1170,31 +1099,30 @@ comment_issue=`прокомментировал(а) вопрос %s#%[2]s` transfer_repo=перенес репозиторий %s в %s push_tag=запушил(а) метку %[2]s в %[3]s -compare_commits=Просмотр сравнение для этих %d коммитов [tool] -ago=назад -from_now=с этого момента +ago=%s назад +from_now=%s с этого момента now=сейчас -1s=1 секунду %s -1m=1 минута %s -1h=1 час %s -1d=1 день %s -1w=1 неделя %s -1mon=1 месяц %s -1y=1 год %s -seconds=секунд %[2]s: %[1]d -minutes=минут %[2]s: %[1]d -hours=%d часов %s -days=дней %[2]s: %[1]d -weeks=недель %[2]s: %[1]d -months=месяцев %[2]s: %[1]d -years=лет %[2]s: %[1]d +future=в будущем +1s=1 секунду +1m=1 минуту +1h=1 час +1d=1 день +1w=1 неделю +1mon=1 месяц +1y=1 год +seconds=%d секунд +minutes=%d минут +hours=%d часов +days=%d дней +weeks=%d недель +months=%d месяцев +years=%d лет raw_seconds=секунд raw_minutes=минут [dropzone] -default_message=Перетащите файл сюда, или кликните для загрузки. invalid_input_type=Вы не можете загружать файлы этого типа. file_too_big=Размер файла ({{filesize}} МБ) больше чем максимальный размер ({{maxFilesize}} МБ). remove_file=Удалить файл @@ -1203,6 +1131,10 @@ remove_file=Удалить файл notifications=Уведомления unread=Непрочитанные read=Прочитанные -no_unread=Нет непрочитанных уведомлений. -no_read=Нет прочитанных уведомлений. +mark_as_read=Отметить как прочитанное +mark_as_unread=Пометить как непрочитанное + +[gpg] + +[units] diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index 4cf86d2..bd68ad9 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -28,7 +28,6 @@ mirror=Огледало new_repo=Ново спремиште new_migrate=Нова миграција new_mirror=Ново огледало -new_fork=Нова грана спремишта new_org=Нова организација manage_org=Управљање организацијама admin_panel=Админ панела @@ -37,6 +36,7 @@ settings=Подешавања your_profile=Ваш профил your_settings=Ваша подешавања + activities=Активности pull_requests=Захтеви за спајање issues=Дискусије @@ -45,39 +45,29 @@ cancel=Откажи [install] install=Инсталација -title=Инсталационе кораке за првог покретања -docker_helper=Ако покрећете Gitea унутар Docker, молимо прочитајте ове савете пажљиво пре него што сте било шта променили на овој страници! -requite_db_desc=Gitea-у је потребно MySQL, PostgreSQL, SQLite3 или TiDB. db_title=Подешавања базе db_type=Тип базе података host=Хост user=Корисник password=Лозинка db_name=Име базе података -db_helper=За MySQL користите тип табела InnoDB са кодирањем utf8_general_ci. ssl_mode=Режим SSL path=Пут -sqlite_helper=Пут датотеке за базу података врсте SQLite3 или TiDB.
Унесите апсолутни пут када покренете као сервис. err_empty_db_path=Пут ка бази података SQLite3 или TiDB не може бити празно. err_invalid_tidb_name=Име базе података TiDB не може садржати симболе "." и "-". no_admin_and_disable_registration=Ви не можете онемогућити регистрацију до стварања налог администратора. err_empty_admin_password=Лозинка администратора не може бити празна. -general_title=Општа подешавања апликације app_name=Име апликације -app_name_helper=Унесите овде име ваше фантастичне организације! repo_path=Пут до корена спремишта -repo_path_helper=Сва мрежна Git спремишта ће бити сачувана у овом директоријуму. run_user=Корисник run_user_helper=Корисник мора имати приступ путу корена спремишта и за покретање Gitea. domain=Домен domain_helper=Утиче на URL адресе клониране преко SSH. ssh_port=SSH порт -ssh_port_helper=Број порта који користи SSH сервер. Оставите празно да бисте онемогућили SSH. http_port=Порт HTTP http_port_helper=Број порта преко којој ће апликација слушати. app_url=URL адреса апликације -app_url_helper=Ова поставка утиче на URL за клонирање преко HTTP/HTTPS протокола и на адресама е-поште. log_root_path=Пут до журнала log_root_path_helper=Директоријум где ће бити снимане датотеке журнала. @@ -85,14 +75,10 @@ optional_title=Напредна подешавања email_title=Подешавања сервиса е-поште smtp_host=SMTP сервер smtp_from=Од -smtp_from_helper=Адреса е-поште према RFC 5322 стандарду. То може бити адреса е-поште или формату "Име" . -mailer_user=Адреса пошиљаоца mailer_password=Лозинка пошиљаоца register_confirm=Укључи потврду регистрације -mail_notify=Укључи поштанска обавештења server_service_title=Подешавања сервера и других услуга offline_mode=Омогући режим ван мреже -offline_mode_popup=Искључи CDN чак и у производњом режиму, све датотеке ресурса ће бити дистрибуирани локално. disable_gravatar=Искључи услугу Gravatar disable_gravatar_popup=Искључи Gravatar и прилагођене извори, све аватаре ће бити преузимани од стране корисника. federated_avatar_lookup=Омогући Federated Avatars Lookup @@ -103,7 +89,6 @@ enable_captcha=Укључи Captcha enable_captcha_popup=Тражи Captcha приликом регистрације корисника. require_sign_in_view=Укљући захтев за пријаву за преглед страница require_sign_in_view_popup=Само пријављени корисници могу да виде странице, посетиоци ће моћи бидети само линк на пријаву. -admin_setting_desc=Не морате да креирате налог администратора сада, корисник са ID = 1 ће имати приступ са администраторским правима. admin_title=Подешавања налога администратора admin_name=Корисничко име admin_password=Лозинка @@ -111,13 +96,8 @@ confirm_password=Потврдите лозинку admin_email=Адреса е-поште адмниистратора install_btn_confirm=Успостави Gitea test_git_failed=Команда 'git' није успела: %v -sqlite3_not_available=Ваша верзија не подржава SQLite3, молимо вас преузмите званичну бинарну верзију од %s, а не верзију gobuild. -invalid_db_setting=Подешавања базе података су неправилна: %v invalid_repo_path=Пут до корена спремишта не неправилно: %v -run_user_not_match=Тренутни корисник није корисник за покретање: %s -> %s -save_config_failed=Није могуће сачувати конфигурацију: %v invalid_admin_setting=Подешавањна администратора су неправилна: %v -install_success=Добродошли! Ми смо срећни што сте изабрали Gitea. invalid_log_root_path=Пут до корена журнала је неправилан: %v [home] @@ -125,7 +105,6 @@ uname_holder=Корисничко име или адреса е-поште password_holder=Лозинка switch_dashboard_context=Пребаците контекст контролној панели my_repos=Моја спремишта -show_more_repos=Прикажи више спремишта... collaborative_repos=Заједничка спремишта my_orgs=Моје организације my_mirrors=Моја огледала @@ -139,36 +118,23 @@ users=Корисници search=Претрага [auth] -create_new_account=Креирате нови налог register_helper_msg=Већ имате налог? Пријавите се! -social_register_helper_msg=Већ имате налог? Повежите се преко социалне мреже! disable_register_prompt=Извините регистрација је онемогућено. Молимо вас, контактирајте администратора. disable_register_mail=Извините, потврда путем поште је онемогућено. remember_me=Запамти ме -forgot_password=Заборављена лозинка -forget_password=Заборавили сте лозинку? sign_up_now=Немате налог? Пријавите се. -confirmation_mail_sent_prompt=Потврда упућена %s је послата, молимо проверите ваше поруке пре %d сати да завршите регистрацију. active_your_account=Активирајте ваш налог prohibit_login=Пријава забрањено -prohibit_login_desc=Улаз у ваш налог је забрањено, молимо вас, контактирајте администратора. -resent_limit_prompt=Извините, већ сте недавно тражили активацију путем е-поште. Молимо вас, сачекајте 3 минута и покушајте поново. has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (%s). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме. resend_mail=Кликните овде да поново пошаљете писмо -email_not_associate=Ова адреса е-поште није повезана ни са једним налогом. -send_reset_mail=Кликните овде да (поново) пошаљете поруку како би променили лозинку reset_password=Ресет лозинке -invalid_code=Извините, ваш код за потврду је истекао или није валидан. reset_password_helper=Кликните овде да ресетујете вашу лозинку password_too_short=Лозинка неможе бити краћа од %d карактера. -non_local_account=Нелокални налози не могу да промените лозинку преко Gitea. [mail] activate_account=Молимо вас активирајте ваш налог activate_email=Потврдите вашу адресу е-поште reset_password=Ресет лозинке -register_success=Регистрација успешна, добродошли -register_notify=Добро дошли [modal] yes=Да @@ -196,8 +162,6 @@ TreeName=Пут до датотеке Content=Садржај require_error=` не може бити празно.` -alpha_dash_error=` мора се састојати словима, бројевима или dash(-_) карактера.` -alpha_dash_dot_error=` мора се састојати словима, бројевима, dash(-_) карактера, или тачком.` size_error=` мора бити величине %s.` min_size_error=` мора да садржи најмање %s карактера.` max_size_error=` мора да садржи највише %s карактера.` @@ -205,28 +169,10 @@ email_error=` није важећа адреса е-поште.` url_error=` није исправна URL адреса.` include_error=` мора да садржи текст '%s'.` unknown_error=Непозната грешка: -captcha_incorrect=Captcha није прошло. -password_not_match=Лозинке се не поклапају. -username_been_taken=Корисничко име је заузето. -repo_name_been_taken=Име спремиштa је већ заузето. -org_name_been_taken=Име организације је већ заузето. -team_name_been_taken=Име екипе је већ заузето. -email_been_used=Адреса е-поште се већ користи. -username_password_incorrect=Корисничко име или лозинка није исправна. -enterred_invalid_repo_name=Молимо вас, проверите да је име спремишта тачно унешено. -enterred_invalid_owner_name=Молимо вас проверите да сте добро унели име власника. -enterred_invalid_password=Молимо вас проверите да сте добро унели лозинку. -user_not_exist=Овај корисник не постоји. -last_org_owner=Брисање последњег корисника из тима власника није дозволено, јер мора увек бити бар један власник к организацији. -invalid_ssh_key=Нажалост, нисмо могли проверити ваш SSH-кључ: %s -unable_verify_ssh_key=Gitea не може да провери ваш SSH-кључ, али претпостављамо, да он важи. Уверите се да је кључ важећи. auth_failed=Грешка идентитета: %v -still_own_repo=На вашем налогу и даље остаје најмање једно спремиште. Прво уклоните или га пренесите. -still_has_org=Још сте члан неке организације, прво морате је напустити или уклонити. -org_still_own_repo=Ова организација садржи спремиштa, прво их избришете или преместите. target_branch_not_exist=Ова грана не постоји. @@ -241,29 +187,22 @@ following=Пратим follow=Прати unfollow=Престани да пратиш -form.name_reserved=Корисничко име '%s' је резервирано. -form.name_pattern_not_allowed=Корисничко име ликом '%s' није дозвољено. [settings] profile=Профил password=Лозинка avatar=Аватар -ssh_keys=SSH Кључеви social=Налози на друштвеним мрежама applications=Апликације orgs=Организације delete=Уклоните налог public_profile=Јавни профил -profile_desc=Ваша адреса е-поште је јавна и коришће се за све обавести везане са налогом, као и друге операције почињене кроз Gitea. -password_username_disabled=Нелокални корисници не могу да промене своје кориничко име. full_name=Име и презиме website=Веб страница location=Локација update_profile=Ажурирај профил -update_profile_success=Ваш профил је успешно ажуриран. change_username=Корисничко име је промењено -change_username_prompt=Ова промена може довести до промене линковима везане за ваш налог. continue=Настави cancel=Откажи @@ -274,15 +213,11 @@ choose_new_avatar=Изаберите нови аватар update_avatar=Ажурирајте поставке аватара delete_current_avatar=Обришите тренутни аватар uploaded_avatar_not_a_image=Учитана датотека није слика. -update_avatar_success=Поставке аватара су успешно ажурирни. change_password=Промените лозинку old_password=Тренутна лозинка new_password=Нова лозинка retype_new_password=Потврда нове лозинке -password_incorrect=Тренутна лозинка је нетачна. -change_password_success=Лозинка је успешно промењена. Можете се пријавити са новом лозинком. -password_change_disabled=Нелокални корисници не могу да промене своје лозинке. emails=Адреса ел. поште manage_emails=Управљање адресама е-поште @@ -290,70 +225,50 @@ email_desc=Ваша главна адреса ће се користити за primary=Главно primary_email=Постави као главну delete_email=Уклони -email_deletion=Брисање адресе е-поште -email_deletion_desc=Брисање ове адресе ће довести до уклањања података. Да ли желите да наставите? email_deletion_success=Адреса је успешно избрисана! add_new_email=Додај нови адресу е-поште add_email=Додај адресу -add_email_confirmation_sent=Послан је нова потврда на '%s', молимо вас проверите ваше поруке унутар %d сата да бисте завршили поступак потврде. add_email_success=Нова адреса е-поште је успешно додатa. manage_ssh_keys=Управљање SSH кључева add_key=Додај кључ -ssh_desc=Ово је списак SSH кључева повезано са вашем налогу. Уклоните све непознате кључеве. -ssh_helper=Потребно вам је помоћ? Погледајте водич за стварању SSH кључева или погледајте решења за честих проблема у вези са SSH. add_new_key=Додај SSH кључ -ssh_key_been_used=Јавни кључ је коришћен. -ssh_key_name_used=Јавни кључ са тим именом већ постоји. key_name=Име кључа key_content=Садржај -add_key_success=Нови SSH кључ '%s' jе успешно додат! delete_key=Уклони ssh_key_deletion=Брисање SSH кључа -ssh_key_deletion_desc=Брисање овог SSH кључa ће онемогућити свог приступ за ваш налог. Да ли желите да наставите? -ssh_key_deletion_success=SSH кључ '%s' jе успешно избрисан! add_on=Додато last_used=Задње корршћено no_activity=Нема недавних активности -key_state_desc=Овај кључ је коришћен у задњих 7 дана -token_state_desc=Токен је коришћен у задњих 7 дана manage_social=Управљање прикључених друштвеним мрежама -social_desc=Ово је списак повезаних друштвених мрежа. Уклоните све непознате. unbind=Обвежи -unbind_success=Друштвена мрежа је обвежена. manage_access_token=Управљање токенима особном приступу generate_new_token=Генериши нови токен -tokens_desc=Tокени се могу користити за приступ на API за Gitea. new_token_desc=Сваки API токен ће имати пун приступ вашем налогу. token_name=Име токена generate_token=Генериши токен -generate_token_succees=Успешно креиран нови токен! Молимо вас да направите копију овог токена, не ће се моћи видети накнадно! delete_token=Уклони access_token_deletion=Уклоњење токена личног приступа -access_token_deletion_desc=Уклоњење овог токена ће онемогућити сав приступ. Да ли желите да наставите? -delete_token_success=Лични токен је успешно избришен! Не заборавите да ажурирате апликацију. + + delete_account=Уклоните ваш налог delete_prompt=Операција ће трајно избрисати ваш налог, што се НЕ може поввратити! confirm_delete_account=Потврдите брисање delete_account_title=Брисање налога -delete_account_desc=Овај налог ће бити трајно избрисан. Да ли желите да наставите? [repo] owner=Власник repo_name=Име спремишта -repo_name_helper=Најбоља имена су кратка и јединствена. visibility=Видљивост visiblity_helper=Приватно спремиште -visiblity_helper_forced=Сва нова спремишта су приватна по одлуци администратора. visiblity_fork_helper=(Промена ове вредности ће утицати на све гране) clone_helper=Потребна вам помоћ клонирањем? Посетите страницу Помоћ! fork_repo=Креирај огранак спремишта fork_from=Огранак од -fork_visiblity_helper=Ниво видљивости не може бити промењено за огранак спремишта. repo_desc=Опис repo_lang=Језик repo_gitignore_helper=Изаберите шаблоне .gitignore @@ -364,18 +279,12 @@ auto_init=Инициализирај ово спремиште са одабра create_repo=Ново спремиште default_branch=Главна грана mirror_prune=Очисти -mirror_prune_desc=Уклоните све референце за даљинко праћење које више не постоје на удаљеног -mirror_interval=Интервал огледања (сат) mirror_address=Адреса огледала -mirror_address_desc=Унесите тражене акредитиве у адресу. mirror_last_synced=Задње синхронизовано watchers=Посматрачи stargazers=Пратиоци forks=Огранци -form.reach_limit_of_creation=Власник има максимум број %d спремишта. -form.name_reserved=Име спремишта '%s' је резервирано. -form.name_pattern_not_allowed=Име спремишта по шаблоном '%s' није дозвољено. need_auth=Потребна ауторизација migrate_type=Тип миграције @@ -402,9 +311,6 @@ fork=Креирај огранак no_desc=Нема описа quick_guide=Кратак водич clone_this_repo=Клонирај спремиште -create_new_repo_command=Направите ново спремиште са командне линије -push_exist_repo=Push постојећe спремиште са командне линије -repo_is_empty=Овo спремиште je празнo, молимо вас, вратите се касније! code=Код branch=Грана @@ -428,7 +334,6 @@ editor.new_file=Нова датотека editor.upload_file=Отпреми датотеку editor.edit_file=Ажурирај датотеку editor.preview_changes=Преглед промена -editor.cannot_edit_non_text_files=Не можете мењати датотеке чији садржај није текстуалан editor.edit_this_file=Ажурирај ову датотеку editor.must_be_on_a_branch=Морате бити на грани да би променили или предложили промене над датотеком editor.fork_before_edit=Морате креирати огранак да би могли ажурирати датотеку @@ -454,7 +359,6 @@ editor.branch_already_exists=Грана '%s' већ постоји за ово editor.directory_is_a_file='%s' је већ постојећа датотека а не директоријум у спремишту. editor.filename_is_a_directory='%s' је постојећи директоријум у спремишту. editor.file_editing_no_longer_exists=Датотека '%s' више не постоји у спремишту. -editor.file_changed_while_editing=Садржај датотеке је промењен од почетка уређивања. Кликните овде да видите шта је промењено или опет поднесите комит да пребришете промене. editor.file_already_exists=Датотека са именом '%s' већ постоји у овом спремишту. editor.no_changes_to_show=Нема никаквих промена. editor.fail_to_update_file=Промена над '%s' није успело са грешком: %v @@ -464,13 +368,13 @@ editor.upload_files_to_dir=Пошаљи датотеке на '%s' commits.commits=Комити commits.search=Претражи комите -commits.find=Претражи commits.author=Аутор commits.message=Порука commits.date=Датум commits.older=Старије commits.newer=Новије + issues.new=Нови задатак issues.new.labels=Лавеле issues.new.no_label=Нема лабеле @@ -488,7 +392,6 @@ issues.new_label=Нова лабела issues.new_label_placeholder=Име лабеле... issues.create_label=Креирај лабелу issues.label_templates.title=Преузмите унапред дефинисани скуп лабела -issues.label_templates.info=Нема још лабеле. Можете кликнути на дугме "Креирај лабелу" да направите или да Користи претходно дефинисани скуп. issues.label_templates.helper=Изаберите скуп лабела issues.label_templates.use=Користи овај скуп лабела issues.label_templates.fail_to_load_file=Није могуће преузети датотеку '%s': %v @@ -545,8 +448,6 @@ issues.label_edit=Уреди issues.label_delete=Уклони issues.label_modify=Промена лабеле issues.label_deletion=Брисање лабеле -issues.label_deletion_desc=Брисање ознаке ће утицати на све њене задатке. Да ли желите да наставите? -issues.label_deletion_success=Лабела је успешно избрисана! issues.num_participants=%d учесника issues.attachment.open_tab=`Кликните "%s" да видите у новом прозору` issues.attachment.download=`Кликните да преузмете "%s"` @@ -566,16 +467,12 @@ pulls.merged_title_desc=споји(ла) %[1]d комит(е) из %[2]s"%s" ће бити избрисана. wiki.page_already_exists=Страница са овим именом већ постоји. wiki.pages=Странице wiki.last_updated=Последње ажурирано %s @@ -630,7 +522,6 @@ settings.githooks=Git хуки settings.basic_settings=Основна подешавања settings.mirror_settings=Подешавања огледала settings.sync_mirror=Изврши синхронизацију сада -settings.mirror_sync_in_progress=Синхронизација је у току, молимо вас да освежите страницу ускоро. settings.site=Званични сајт settings.update_settings=Примени промене settings.advanced_settings=Напредна подешавања @@ -651,29 +542,18 @@ settings.pulls_desc=Омогући систем захтева за спајањ settings.danger_zone=Опасна зона settings.new_owner_has_same_repo=Нови власник већ има спремиште по истим називом. Молимо вас изаберите друго име. settings.convert=Претворити у обично спремиште -settings.convert_desc=Можете претворити огледало у обично спремиште, али та операција не може се укинути. settings.convert_notices_1=Ова операција ће претворити то огледало у обично спремиште, што не може се отказати. settings.convert_confirm=Потврдите конверзију -settings.convert_succeed=Спремиште је успешно претворено у обичну врсту спремишта. settings.transfer=Пренеси власништво settings.transfer_desc=Пренеси спремиште другом кориснику или организацији у којој имате администраторска права. -settings.transfer_notices_1=- Изгубићете приступ ако је нови власник појединац. -settings.transfer_notices_2=- Задржићете приступ ако је нови власник организација и ви сте члан њега. -settings.transfer_form_title=Унесите релевантне информације за потврду операције: settings.wiki_delete=Обриши Вики податке settings.wiki_delete_desc=Будите пажљиви! Када уклоните Вики податке — нећете мочи их повратити. settings.wiki_delete_notices_1=- Ова операција је избрисати и онемогућити Вики за %s -settings.wiki_deletion_success=Вики подаци за ово спремиште су успешно избрисани. settings.delete=Уклони ово спремиште settings.delete_desc=Нећете мочи повратити спремиште после брисања. Молимо вас, будите сигурни. settings.delete_notices_1=- Ова операција НЕЋЕ МОЧИ бити укинута. -settings.delete_notices_2=- Ова операција ће трајно избрисати све из овог спремишта, укључујући и податке Git, задатци, коментаре и приступ сарадницима. -settings.delete_notices_fork_1=- Сви огранци ће постати независни после уклањање. -settings.deletion_success=Спремиште је успешно избрисано! -settings.update_settings_success=Подешавања спремишта су успешно ажурирани. settings.transfer_owner=Нови власник settings.make_transfer=Изврши пренос -settings.transfer_succeed=Власништво спремишта успешно преношено. settings.confirm_delete=Потврдите брисање settings.add_collaborator=Додај новог сарадника settings.add_collaborator_success=Додат је нови сарадник. @@ -685,13 +565,10 @@ settings.search_user_placeholder=Претрага корисника... settings.org_not_allowed_to_be_collaborator=Неможе се додати организација као сарадник. settings.user_is_org_member=Корисник је члан организације и потом неможе бити додат као сарадник. settings.add_webhook=Додај Webhook -settings.hooks_desc=Webhooks омогућавају спољашњим услугама да приме обавештења када се нешто одређено догоди на Gitea. Сазнајте више у овом водичу за Webhooks. settings.webhook_deletion=Уклони Webhook -settings.webhook_deletion_desc=Брисање овог Webhook ће довести до уклањања сву наведену информацију, укључујући и историју. Да ли желите да наставите? settings.webhook_deletion_success=Webhook успешно избрисан! settings.webhook.test_delivery=Провери испоруку settings.webhook.test_delivery_desc=Пошаљи push за тестирање подешавања webhook -settings.webhook.test_delivery_success=Тест webhook је додат у месту испоруке. Процес може да потраје неколико секунди пре него што ће показати у историји испоруке. settings.webhook.request=Захтев settings.webhook.response=Одговор settings.webhook.headers=Наслови @@ -702,7 +579,6 @@ settings.githook_edit_desc=Aко Webhook није активан, примерн settings.githook_name=Име Hook-а settings.githook_content=Садржај Hook-а settings.update_githook=Ажурирај Hook -settings.add_webhook_desc=Послаћемо захтев POST на наведену URL адресу са информацијама о догађајима. Такође можете да одредите формат у коме би желели да добију податке (JSON, x-www-form-urlencoded, XML, итд.). Додатне информације могу се наћи у Упутство за Webhooks. settings.payload_url=URL адреса за слање settings.content_type=Тип садржаја settings.secret=Тајна @@ -719,7 +595,6 @@ settings.event_pull_request=Захтев за спајање settings.event_pull_request_desc=Захтев за спајање отворенo, затворено, додељено, недодељенo, лабела ажурирана, лабела избрисана, или синхронизовано. settings.event_push_desc=Git push у спремиште settings.active=Активно -settings.active_helper=Детаљи о догађају што је проузроковало hook ће исто бити испоручено. settings.add_hook_success=Додат је нови webhook. settings.update_webhook=Ажурирај Webhook settings.update_hook_success=Webhook је ажуриран. @@ -740,13 +615,10 @@ settings.key_been_used=Садржај кључа је већ искоришће settings.key_name_used=Кључ распоређивање са тим насловом већ постоји. settings.add_key_success=Нови кључ распоређивање '%s' је додат успешно! settings.deploy_key_deletion=Уклони кључ распоређивањa -settings.deploy_key_deletion_desc=Брисање овог кључа за распоређивање ће довести до укидање приступ на овом спремишту. Да ли желите да наставите? -settings.deploy_key_deletion_success=Кључ за распоређивање је успешно обрисан! diff.browse_source=Преглед изворни кода diff.parent=родитељ diff.commit=комит -diff.data_not_available=Подаци Diff нису доступни. diff.show_diff_stats=Покажи статистику Diff diff.show_split_view=Подељен поглед diff.show_unified_view=Један поглед @@ -763,11 +635,8 @@ release.stable=Стабилно release.edit=уреди release.ahead=%d комита на %s почев од овог издања release.source_code=Изворни код -release.new_subheader=Објављивање издања за итерација производа. -release.edit_subheader=Детаљни журнал промена може помоћи корисницима да схвате побољшања у новом издању. release.tag_name=Име ознаке release.target=Циљ -release.tag_helper=Изаберите посујућу ознаку, или креирај нову. release.title=Наслов release.content=Садржај release.write=Напиши @@ -781,8 +650,6 @@ release.save_draft=Сачувај нацрт release.edit_release=Уреди издање release.delete_release=Уклони ово издање release.deletion=Брисање издања -release.deletion_desc=Брисање овог издања ће избрисати одговарајућу Git ознаку. Да ли желите да наставите? -release.deletion_success=Издање је успешно избрисано! release.tag_name_already_exist=Издање са тим именом ознаке већ постоји. release.tag_name_invalid=Име ознаке није исправно. release.downloads=Преузимања @@ -803,9 +670,6 @@ create_new_team=Креирај нови тим org_desc=Опис team_name=Име тима team_desc=Опис -team_name_helper=Ви ћете користити то име помињете овог тима у дискусијама. -team_desc_helper=Шта је циљ овог тима? -team_permission_desc=Који ниво приступа треба имати овај тим? form.name_reserved=Име организације '%s' је резервирано. form.name_pattern_not_allowed=Шаблон имена '%s' није дозвољено. @@ -816,16 +680,11 @@ settings.full_name=Пуно име settings.website=Саит settings.location=Локација settings.update_settings=Ажурирај подешавања -settings.update_setting_success=Подешавања организације су успешно ажурирана. -settings.change_orgname_prompt=Ова промена ће утицати на свим ликовима према организацији. -settings.update_avatar_success=Аватар организације је успешно ажуриран. settings.delete=Уклони организацију settings.delete_account=Уклони ову организацију settings.delete_prompt=Ова организација ће бото избрисана и операција НЕ МОЖЕ бити отказана у будућности! settings.confirm_delete_account=Потврди брисање settings.delete_org_title=Брисање организација -settings.delete_org_desc=Ова организација ће бити избрисана заувек. Дали желите да наставите? -settings.hooks_desc=Додајте аутоматско ажурирање, које ће важити за сва спремишта под овој организацији. members.membership_visibility=Видљивост: members.public=Јавно @@ -845,9 +704,7 @@ teams.leave=Изаћи teams.read_access=Приступ за читање teams.read_access_helper=Овај тим ће моћи видити и клонирари спремишта. teams.write_access=Приступ за писање -teams.write_access_helper=Овај тим ће моћи видити своја спремишта, и извршити push на њима. teams.admin_access=Администраторски приступ -teams.admin_access_helper=Овај тим ће моћи извршити push/pull на своја спремишта, и још чланова додавати. teams.no_desc=Овај тим нема описа teams.settings=Подешавања teams.owners_permission_desc=Власници имају пун приступ свим спремиштима и имају права администратора организации. @@ -856,8 +713,6 @@ teams.update_settings=Примени промене teams.delete_team=Уклони овај тим teams.add_team_member=Додај члан тиму teams.delete_team_title=Уклони тим -teams.delete_team_desc=Овај потез ће чинити да чланови ове групе ће можта изгубе приступ неким спремиштима. Да ли желите да наставите? -teams.delete_team_success=Овај тим је успешно избрисан. teams.read_permission_desc=Овај тим даје приступ на Читање: чланови могу да виде и да клонира спремишта. teams.write_permission_desc=Овај тим даје приступ на Писање: чланови могу да виде и врше push операције на спремишта. teams.admin_permission_desc=Овај тим даје администраторки приступ: чланови могу да виде, врше push операције, и додавају сараднике. @@ -887,23 +742,8 @@ dashboard.statistic_info=У бази података Gitea забележено dashboard.operation_name=Име операције dashboard.operation_switch=Пребаци dashboard.operation_run=Покрени -dashboard.clean_unbind_oauth=Уклони неповазане OAuth -dashboard.clean_unbind_oauth_success=Неповезане OAuth налози су успешно избрисани. dashboard.delete_inactivate_accounts=Уклони све неактивне налоге -dashboard.delete_inactivate_accounts_success=Сви неактивни налози су успешно избрисани. dashboard.delete_repo_archives=Избриши све архиве спремишта -dashboard.delete_repo_archives_success=Све архиве су успешно избрисане. -dashboard.delete_missing_repos=Избриши све податке са изгубљеним Git датотецима -dashboard.delete_missing_repos_success=Сви подаци са игубљеним Git датотекама су успешно избрисани. -dashboard.git_gc_repos=Изврши cакупљање смећа на спремишту -dashboard.git_gc_repos_success=Сва спремишта су успешно извршили cакупљање смећа. -dashboard.resync_all_sshkeys=Препиши '.ssh/authorized_keys' (опрез: не Gitea тастери ће бити изгубљени) -dashboard.resync_all_sshkeys_success=Сви јавни кључеви су успешно преписани. -dashboard.resync_all_update_hooks=Препиши сва hook-а за ажурирање спремишта (потребно кад пут конфигурације је промењен) -dashboard.resync_all_update_hooks_success=Сва hook-а за ажурирање спремишта су успешно промењена. -dashboard.reinit_missing_repos=Поново постави све податке са изгубљеним Git датотекама -dashboard.reinit_missing_repos_success=Сви подаци са изгубљеним Git датотекама су успешно поново постављени. - dashboard.server_uptime=Време непрекидног рада сервера dashboard.current_goroutine=Тренутнe Goroutine dashboard.current_memory_usage=Тренутна употреба меморије @@ -934,7 +774,6 @@ dashboard.total_gc_pause=Укупно време cакупљању смећа dashboard.last_gc_pause=Задња пауза у cакупљању смећа dashboard.gc_times=Времена cакупљању смећа -users.user_manage_panel=Контролни панел корисника users.new_account=Креирај нови налог users.name=Име users.activated=Активиран @@ -942,40 +781,29 @@ users.admin=Администратор users.repos=Спремишта users.created=Креирано users.send_register_notify=Пошаљи кориснику обавештење о регистрацији -users.new_success=Нови налог '%s' је успешно креиран. users.edit=Уреди users.auth_source=Извор аутентикације users.local=Локално users.auth_login_name=Корисничко име за пријављивање users.password_helper=Оставите празно да остане непромењено. -users.update_profile_success=Профил налога је успешно уређен. users.edit_account=Уреди налог users.max_repo_creation=Максимални број спремишта users.max_repo_creation_desc=(Поставите -1 да користите стандардну глобалну вредност) -users.is_activated=Овај налог је активиран -users.prohibit_login=Улаз са овог налога је забрањено users.is_admin=Овај налог има администраторска права -users.allow_git_hook=Налог има право да крејира Git hooks users.allow_import_local=Налог има право да увезе локална спремишта users.update_profile=Ажурирај профил налога users.delete_account=Уклони овај налог -users.still_own_repo=На вашем налогу и даље остаје најмање једно спремиште, прво је потребно да уклоните или да га пренесете. -users.still_has_org=Овај налог још увек је члан најмање једне организације. За наставак, напустите или уклоните ову организацију. -users.deletion_success=Налог је успешно избрисан! -orgs.org_manage_panel=Управљање групама orgs.name=Име orgs.teams=Тимови orgs.members=Чланови -repos.repo_manage_panel=Контролна панела спремишта repos.owner=Власник repos.name=Име repos.private=Приватно repos.stars=Фаворити repos.issues=Задаци -auths.auth_manage_panel=Контролна панела аутентикације auths.new=Додај нови извор auths.name=Име auths.type=Тип @@ -988,7 +816,6 @@ auths.domain=Домен auths.host=Хост auths.port=Порт auths.bind_password=Bind лозинкa -auths.bind_password_helper=Упозорење: Ова лозинка је сачувана у облику нешифрованом текцту. Не користите високо-привилеговану налог. auths.user_base=База претраживање корисника auths.user_dn=DN корисника auths.attribute_username=Атрибут username @@ -1003,21 +830,12 @@ auths.smtp_auth=Тип SMTP аутентикације auths.smtphost=SMTP хост auths.smtpport=SMTP порт auths.allowed_domains=Дозвољени домени -auths.allowed_domains_helper=Оставите празно да не ограничавају домени. Више домена морају да буду одвојени зарезима ','. auths.enable_tls=Омогући TLS шифровање auths.skip_tls_verify=Прескочи TLS проверу auths.pam_service_name=Назив PAM сервиса auths.enable_auto_register=Омогући аутоматску регистрацију auths.tips=Савети -auths.edit=Промените подешавања канала аутентикације auths.activated=Овај канал аутентикације је активан -auths.new_success=Нови канал аутентикације '%s' је успешно креиран. -auths.update_success=Подешавања канала аутентикације су успешно ажурирана. -auths.update=Ажурирај подешавања аутентикације -auths.delete=Уклони овај канал аутентикације -auths.delete_auth_title=Брисање канала аутентикације -auths.delete_auth_desc=Овај канал аутентикације ће бити избрисан. Да ли желите да наставите? -auths.still_in_used=Овај канал аутентикације још увек се користи од стране неких корисника, уклоните или пребаци ове кориснике у друг врсту аутентикације. auths.deletion_success=Канал аутентикације успешно избрисан! config.server_config=Конфигурација сервера @@ -1037,7 +855,6 @@ config.reverse_auth_user=Корисничко име при обрнуту ау config.ssh_config=SSH конфигурација config.ssh_enabled=Омогућено -config.ssh_start_builtin_server=Покрени уграђени сервер config.ssh_domain=Домен config.ssh_port=Порт config.ssh_listen_port=Порт за слушање @@ -1066,12 +883,10 @@ config.mail_notify=Обавештења преко е-поште config.disable_key_size_check=Онемогући проверу на минималној величини кључа config.enable_captcha=Омогући Captcha config.active_code_lives=Дужина живота активних кодова -config.reset_password_code_lives=Дужина живота ресетних кодова за лозинку config.webhook_config=Подешавања Webhook config.queue_length=Дужина реда config.deliver_timeout=Време до отказивање слања -config.skip_tls_verify=Прескочи TLS проверу config.mailer_config=Подешавања поште config.mailer_enabled=Омогућено @@ -1080,7 +895,6 @@ config.mailer_name=Име config.mailer_host=Хост config.mailer_user=Корисник config.send_test_mail=Пошаљи тест поруку -config.test_mail_failed=Тест писмо '%s' није пошаљено: %v config.test_mail_sent=Тест писмо је послато '%s'. config.oauth_config=Подешавања OAuth @@ -1133,7 +947,6 @@ monitor.start=Почетно време monitor.execute_time=Време извршивања notices.system_notice_list=Системска обавештавања -notices.view_detail_header=Детаљи обавештења notices.actions=Акције notices.select_all=Изабери све notices.deselect_all=Уклоните избор свих @@ -1144,7 +957,6 @@ notices.type=Тип notices.type_1=Спремиште notices.desc=Опис notices.op=Oп. -notices.delete_success=Системска обавештавања су успешно избрисана. [action] create_repo=креира спремиште %s @@ -1160,34 +972,35 @@ comment_issue=`коментарише на задатаку %s#%[2]s` transfer_repo=преноси спремиште %s на %s push_tag=извршује push са ознаком %[2]s на %[3]s -compare_commits=Поређење ових %d комита [tool] -ago=пре -from_now=од сада +ago=пре %s +from_now=од сада %s now=сада -1s=%s 1 секунд -1m=%s 1 минут -1h=%s 1 час -1d=%s 1 дан -1w=%s 1 недеља -1mon=%s 1 месец -1y=%s 1 година -seconds=%[2]s %[1]d секунди -minutes=%[2]s %[1]d минута -hours=%[2]s %[1]d часа -days=%[2]s %[1]d дана -weeks=%[2]s %[1]d недеља -months=%[2]s %[1]d месеци -years=%[2]s %[1]d година +1s=1 секунд +1m=1 минут +1h=1 час +1d=1 дан +1w=1 недеља +1mon=1 месец +1y=1 година +seconds=%d секунди +minutes=%d минута +hours=%d часа +days=%d дана +weeks=%d недеља +months=%d месеци +years=%d година raw_seconds=секунди raw_minutes=минута [dropzone] -default_message=Превуците датотеку овде или кликните за преузимање. invalid_input_type=Не можемо преузети датотеку овог типа. -file_too_big=Величина датотеке ({{filesize}} MB) је више него максимална величина ({{maxFilesize}} MB). remove_file=Уклони датотеку [notification] +[gpg] + +[units] + diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index a80b1dc..0ad2a0a 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -5,8 +5,11 @@ dashboard=Instrumentpanel explore=Utforska help=Hjälp sign_in=Logga in +sign_in_with=Logga in med sign_out=Logga ut sign_up=Registrera dig +link_account=Länka konto +link_account_signin_or_signup=Logga in med befintliga inloggningsuppgifter för att länka det kontot till detta konto, eller registrera ett nytt register=Registrera dig website=Webbplats version=Version @@ -22,6 +25,7 @@ username=Användarnamn email=E-post password=Lösenord re_type=Ange igen +captcha=Captcha twofa=Tvåfaktorsautentisering twofa_scratch=Tvåfaktorsskrapkod passcode=Kod @@ -32,15 +36,17 @@ mirror=Spegel new_repo=Ny utvecklingskatalog new_migrate=Ny migrering new_mirror=Ny Spegling -new_fork=Nytt gafflat repo +new_fork=Ny förgrening av utvecklingskatalog new_org=Ny organisation manage_org=Hantera organisationer admin_panel=Admin-panel account_settings=Kontoinställningar settings=inställningar your_profile=Din profil +your_starred=Dina Stjärnmärkta your_settings=Dina inställningar + activities=Aktiviteter pull_requests=Pull förfrågningar issues=Problem @@ -49,8 +55,8 @@ cancel=Avbryt [install] install=Installation -title=Steg för att installera för första gången -docker_helper=Om du kör Gitea inuti Docker, vänligen läs Riktninjerna nogrant innan du ändrar någonting på denna sida! +title=Inledande konfiguration +docker_helper=Om du kör Gitea inuti Docker, vänligen läs riktninjerna noggrant innan du ändrar någonting på denna sida. requite_db_desc=Gitea kräver MySQL, PostgreSQL, SQLite3 eller TiDB. db_title=Databasinställningar db_type=Databastyp @@ -67,23 +73,23 @@ err_invalid_tidb_name=TiDB databasnamn tillåter inte tecknen "." och "-". no_admin_and_disable_registration=Du kan inte inaktivera registrering utan att skapa ett administratörskonto. err_empty_admin_password=Administratörslösenordet får ej vara tomt. -general_title=Allmänna inställningar för Gitea +general_title=Allmänna applikationsinställningar app_name=Applikationsnamn -app_name_helper=Skriv ditt organisationsnamn här stort och tydligt! +app_name_helper=Här kan du sätta ditt organisationsnamn. repo_path=Rotsökväg för utvecklingskatalog -repo_path_helper=Alla fjärr Git repos kommer bli sparade till denna mappen. +repo_path_helper=Alla git repos kommer att sparas i denna katalog. lfs_path=LFS Rotsökväg lfs_path_helper=Filer lagrade i Git LFS kommer att sparas i denna mapp. Lämna tom för att avaktivera LFS. run_user=Exekverande Användare -run_user_helper=Denna användaren måste ha till gång till Huvudsökvägen för Repos och köra Gitea. +run_user_helper=Denna användaren måste ha till gång till guvudsökvägen för repos och köra Gitea. domain=Domän domain_helper=Detta påverkar SSH klonings webbadresser. ssh_port=SSH-port -ssh_port_helper=Portnumret som din SSH-server brukar, lämna tomt för att inaktivera SSH-funktionaliteten. +ssh_port_helper=Portnumret som din SSH-server använder, lämna tomt för att inaktivera SSH. http_port=HTTP Port http_port_helper=Portnumret vilket applikationen kommer lyssnar på. app_url=Applikationsadressen -app_url_helper=Detta påverkar HTTP/HTTPS kloningsadressen och på platser i e-post. +app_url_helper=Detta påverkar HTTP/HTTPS kloningsadressen och vissa e-postmeddelanden. log_root_path=Loggsökväg log_root_path_helper=Katalog till vilken loggfiler skrivs. @@ -91,14 +97,14 @@ optional_title=Övriga inställningar email_title=E-post tjänstens inställningar smtp_host=SMTP-server smtp_from=Från -smtp_from_helper=Epostaddress att skicka email ifrån, enligt RFC 5322. Den kan vara skriven i formatet 'email@example.com' alternativt '"Namn" '. -mailer_user=Avsändares e-post +smtp_from_helper=Avsändaraddress för epost, enligt RFC 5322. Den kan vara skriven i formatet 'email@example.com' alternativt '"Namn" '. +mailer_user=Avsändarens Användarnamn mailer_password=Avsändares lösenord register_confirm=Aktivera registreringsbekräftelse mail_notify=Aktivera e-postavisering server_service_title=Serverns och andra Tjänsters inställningar offline_mode=Aktivera Nedkopplat Läge -offline_mode_popup=Inaktivera CDN även i produktionsläge, alla resursfiler kommer att distribureras lokalt. +offline_mode_popup=Inaktivera CDN så att alla resursfiler kommer att distribureras lokalt. disable_gravatar=Inaktivera Gravatar-tjänsten disable_gravatar_popup=Inaktivera Gravatar och externa källor, alla avatarer är uppladdade av användaren alternativt standard. federated_avatar_lookup=Aktivera förenad uppslagning av avatarer @@ -109,7 +115,7 @@ enable_captcha=Aktivera Captcha enable_captcha_popup=Kräv captcha för användarregistrering. require_sign_in_view=Kräv inloggning för att visa sidor require_sign_in_view_popup=Bara inloggade användare kan besöka sidorna, besökare kommer enbart kunna se inloggings/registreringssidor. -admin_setting_desc="Du behöver inte skapa ett administratörskonto just nu, kontot som har ID = 1 kommer automatiskt att bli administratör." +admin_setting_desc=Du behöver inte skapa ett administratörskonto just nu. Den första användaren att registrerar sig kommer automatiskt att bli administratör. admin_title=Admin-konto inställningar admin_name=Användarnamn admin_password=Lösenord @@ -117,16 +123,18 @@ confirm_password=Bekräfta lösenord admin_email=Administratörs Epost install_btn_confirm=Installera Gitea test_git_failed=Misslyckades att testa 'git' kommando: %v -sqlite3_not_available=Din release stödjer ej SQLite3, ladda vänligen ner den officiella binären via %s, inte gobuild varianten. -invalid_db_setting=Databas inställningen är inkorrekt: %v +sqlite3_not_available=Den nuvarande versionen stödjer ej SQLite3, ladda vänligen ner den officiella binären via %s, inte gobuild varianten. +invalid_db_setting=Ogiltig databasinställning: %v invalid_repo_path=Utvecklingskatalogens rotsökväg är ogiltig: %v -run_user_not_match=Köranvändaren är inte aktuell användare: %s -> %s -save_config_failed=Konfigurationssparningen misslyckades: %v +run_user_not_match=Köranvändaren är inte den aktuella användaren: %s -> %s +save_config_failed=Misslyckades att spara konfigurationen: %v invalid_admin_setting=Inställningarna för administratörskontot är felaktiga: %v -install_success=Välkommen! Vi är glada att du väljer Gitea, ha kul och ta hand om dig. +install_success=Välkommen! Tack för att du valde Gitea. invalid_log_root_path=Ogiltig rotsökväg för loggfiler: %v default_keep_email_private=Standardvärde för Håll Epostaddress Hemlig default_keep_email_private_popup=Detta är standardvärdet för synligheten av användares epostaddress. Om sätt till sant så kommer nya användares epostaddress vara gömd tills dess att användare ändrar det i sina inställningar. +default_allow_create_organization=Standardrättigheter för nya användare att skapa organisationer +default_allow_create_organization_popup=Detta är standardvärdet för behörighet som tilldelas för nya användare. Om satt till sant så kommer nya användare få tillåtelse att skapa organisationer. no_reply_address=Ingen Mottagare Address no_reply_address_helper=Domännamn för användares epostaddress i git-loggarna om denne väljer att gömma sin epostappress. Ex. användaren 'joe' och 'noreply.example.org' kommer att bli 'joe@noreply.example.org' @@ -135,7 +143,7 @@ uname_holder=Användarnamn eller e-post password_holder=Lösenord switch_dashboard_context=Växla Visad Instrumentpanel my_repos=Mina utvecklingskataloger -show_more_repos=Visa fler förråd... +show_more_repos=Visa flera repos ... collaborative_repos=Kollaborativa Utvecklingskataloger my_orgs=Mina organisationer my_mirrors=Mina speglar @@ -149,21 +157,22 @@ repos=Utvecklingskataloger users=Användare organizations=Organisationer search=Sök -repo_no_results=Inga matchande utvecklingskataloger funna. -user_no_results=Inga matchande användare funna. -org_no_results=Inga matchande organisationer funna. +repo_no_results=Inga matchande repos har hittats. +user_no_results=Inga matchande användare har hittats. +org_no_results=Inga matchande organisationer har hittats. [auth] -create_new_account=Skapa nytt konto +create_new_account=Skapa Konto register_helper_msg=Har du redan ett konto? Logga in nu! social_register_helper_msg=Har du redan ett konto? Anslut det nu! disable_register_prompt=Tyvärr är användarregistreringen inaktiverad. Vänligen kontakta din administratör. disable_register_mail=Tyvärr så är registreringsbekräftelemailutskick inaktiverat. remember_me=Kom ihåg mig -forgot_password=Glömt lösenord -forget_password=Glömt lösenordet? +forgot_password_title=Glömt lösenord +forgot_password=Glömt lösenord? sign_up_now=Behöver du ett konto? Registrera dig nu. -confirmation_mail_sent_prompt=Ett nytt bekräftelsemail has skickats till %s, vänligen kolla din inkorg inom dom kommande %d timmarna för att slutföra registreringsprocessen. +confirmation_mail_sent_prompt=Ett nytt bekräftelsemail has skickats till %s. Vänligen kolla din inkorg inom dom kommande %s för att slutföra registreringsprocessen. +reset_password_mail_sent_prompt=Ett bekräftelsemail has skickats till %s. Vänligen kolla din inkorg inom dom kommande %s för att slutföra lösenordsändringsprocessen. active_your_account=Aktivera ditt konto prohibit_login=Inloggning förhindrad prohibit_login_desc=Ditt konto är förhindrat från att logga in. Vänligen kontakta webbplatsadministratören. @@ -171,25 +180,34 @@ resent_limit_prompt=Tyvärr, du har nyligen begärt ett aktiveringsmail. Vänlig has_unconfirmed_mail=Hej %s, du har en obekräftad epostaddress (%s). Om du inte har fått ett bekräftelsemail eller behöver ett nytt, klicka på knappen nedan. resend_mail=Klicka här för att skicka ditt aktiveringsmejl igen email_not_associate=Denna e-postadress är inte knutet till något konto. -send_reset_mail=Klicka här för att skicka e-post med lösenordsåterställning (igen) +send_reset_mail=Klicka här för att skicka e-post med lösenordsåterställning igen reset_password=Återställ ditt lösenord invalid_code=Tyvärr, din bekräftelsekod har antingen upphört att gälla eller är ogiltig. reset_password_helper=Klicka här för att återställa ditt lösenord password_too_short=Lösenordet får ej vara kortare än %d tecken. -non_local_account=Icke-lokala konton får inte ändra lösenord genom Gitea. +non_local_account=Icke-lokala konton kan inte ändra lösenord genom Giteas webbgränssnitt. verify=Verifiera scratch_code=Skrapkod use_scratch_code=Använd en skrapkod twofa_scratch_used=Du har använt din skrapkod. Du har blivit omdirigerad till tvåfaktorsinställningarna så att du kan ta bort din aktiverade enhet eller generera en ny skrapkod. -twofa_passcode_incorrect=Din kod är inte giltig. Om du har tappat bort din enhet, använd din skrapkod. +twofa_passcode_incorrect=Din kod är inte giltig. Om du har tappat bort din enhet, använd din skrapkod för att logga in. twofa_scratch_token_incorrect=Din skrapkod är ogiltlig. +login_userpass=Användarnamn / Lösenord +login_openid=OpenID +openid_connect_submit=Anslut +openid_connect_title=Anslut ett existerande konto +openid_connect_desc=Vald OpenID URI är inte känd av systemet, du kan ansluta den med ett befintligt konto. +openid_register_title=Skapa nytt konto +openid_register_desc=Vald OpenID URI är inte känd av systemet, du kan associera den med ett nytt konto här. +openid_signin_desc=Exempel URIer: https://anne.me, bob.openid.org.cn, gnusocial.net/carry +disable_forgot_password_mail=Tyvärr är lösenordsnollställning inaktiverad. Vänligen kontakta din administratör. [mail] activate_account=Vänligen aktivera ditt konto activate_email=Verifiera din epostaddress reset_password=Återställ ditt lösenord -register_success=Registreringen slutförd, välkommen -register_notify=Välkommen ombord +register_success=Registreringen lyckades +register_notify=Välkommen till Gitea [modal] yes=Ja @@ -218,7 +236,6 @@ Content=Innehåll require_error=får inte vara tomt alpha_dash_error=` får bara innehålla bokstäver, nummer och bindestreck (-_).` -alpha_dash_dot_error=` får bara innehålla bokstäver, nummer, bindestreck (-_) och punkt` size_error=` måste vara av storleken %s` min_size_error=` måste innehålla minst %s tecken.` max_size_error=` får inte innehålla mer än %s tecken.` @@ -227,26 +244,26 @@ url_error=Den givna URL-adressen är inte valid include_error=` måste innehålla texten '%s'.` unknown_error=Okänt fel: captcha_incorrect=Captcha stämmer inte överens. -password_not_match=Givna lösenord stämmer inte överens med varandra. +password_not_match=Dina valda lösenord matchar inte. -username_been_taken=Användarnamnet finns redan. -repo_name_been_taken=Namnet på utvecklingskatalogen har redan används. -org_name_been_taken=Organisationsnamnet har redan används. -team_name_been_taken=Team namn är redan använt. -email_been_used=E-postadressen har redan använts. -username_password_incorrect=Användarnamnet eller lösenordet är inte korrekt. -enterred_invalid_repo_name=Se till att utvecklingskatalogen som du angav är rätt. +username_been_taken=Användarnamnet är upptaget. +org_name_been_taken=Organisationsnamnet är upptaget. +team_name_been_taken=Gruppnamnet är upptaget. +email_been_used=E-postadress används redan. +openid_been_used=OpenID-adressen '%s' används redan. +username_password_incorrect=Felaktigt användarnamn eller lösenord. enterred_invalid_owner_name=Kontrollera att ägarnamnet som du angav är rätt. -enterred_invalid_password=Se till att den som lösenord du angett är rätt. -user_not_exist=Angiven användare saknas. +enterred_invalid_password=Kontrollera att lösenordet som du angav är rätt. +user_not_exist=Användaren finns inte. last_org_owner=Att ta bort den sista användaren i ägare-teamet är inte tillåtet då det måste finnas minst en användare i ägare-teamet. +cannot_add_org_to_team=En organisation kan inte läggas till som en gruppmedlem. +cannot_invite_org_to_org=En organisation kan inte bjudas in som medlem i en annan organisation. -invalid_ssh_key=Tyvärr, Din SSH-nyckel: %s kan inte verifieras -unable_verify_ssh_key=Gitea kan inte verifiera din SSH-nyckel, men Gitea antar att den är giltigt, vänligen dubbelkolla din SSH-nyckel. +invalid_ssh_key=Tyvärr, din SSH-nyckel: %s kan inte verifieras +invalid_gpg_key=Tyvärr, din GPG-nyckel: %s kan inte verifieras auth_failed=Autentisering misslyckades: %v -still_own_repo=Ditt konto har fortfarande ägandeskap över minst en utvecklingskatalog, måste du ta bort eller överföra dem först. -still_has_org=Ditt konto har fortfarande medlemskap i en organisation, du måste lämna den eller ta bort dina medlemskap först. +still_has_org=Ditt konto fortfarande är fortfarande medlem i minst en organisation, du måste lämna dem först. org_still_own_repo=Denna organisation har fortfarande ägandeskap över en eller flera utvecklingskataloger, du måste ta bort eller överföra dem först. target_branch_not_exist=Målgrenen finns inte. @@ -262,30 +279,32 @@ following=Följer follow=Följ unfollow=Sluta följa -form.name_reserved=Användarnamnet "%s" är reserverad. +form.name_reserved=Användarnamnet '%s' är reserverat. form.name_pattern_not_allowed=Användarnamnet '%s' är inte tillåtet. [settings] profile=Profil password=Lösenord avatar=Visningsbild -ssh_keys=SSH-nycklar +ssh_gpg_keys=SSH / GPG-nycklar social=Sociala konton applications=Applikationer orgs=Organisationer delete=Radera konto twofa=Tvåfaktorsautentisering +account_link=Externa konton +organization=Organisation +uid=AnvändarID public_profile=Offentlig profil -profile_desc=Din epostaddress är offentlig och kommer att användas för alla kontorelaterade notifieringar och alla webbaserade åtgärder gjorda på sidan. -password_username_disabled=Icke-lokala användare är inte tillåtna att ändra sitt användarnamn. +profile_desc=Din e-postaddress är offentlig och kommer att användas för alla kontorelaterade notifieringar och alla webbaserade åtgärder gjorda på sidan. +password_username_disabled=Icke-lokala användare har tillåtelse att ändra sitt användarnamn. Kontakta din systemadministratör för mer information. full_name=Fullständigt namn website=Webbplats location=Plats update_profile=Uppdatera profil update_profile_success=Din profil har uppdaterats. change_username=Användarnamn ändrat -change_username_prompt=Denna ändring kommer att påverka hur länkar refererar till ditt konto. continue=Fortsätt cancel=Avbryt @@ -303,97 +322,121 @@ old_password=Nuvarande lösenord new_password=Nytt lösenord retype_new_password=Skriv ditt nya lösenord igen password_incorrect=Nuvarande lösenord är felaktigt. -change_password_success=Lösenordet ändrades. Du kan nu logga in med ditt nya lösenord. -password_change_disabled=Icke-lokala användare är inte tillåtna att ändra sina lösenord. +change_password_success=Ditt lösenord har ändrats. Du kan nu logga in med ditt nya lösenord. emails=E-postadresser manage_emails=Hantera e-postadresser +manage_openid=Hantera OpenID-adresser email_desc=Din primära e-postadress kommer att användas för notifieringar och andra åtgärder. primary=Primär primary_email=Ställ in som primär delete_email=Radera -email_deletion=Borttagning Av Epostaddress -email_deletion_desc=Borttagning av denna epostaddress kommer att ta bort relaterad information. Vill du fortsätta? +email_deletion=Ta bort e-post email_deletion_success=Epostaddressen har tagits bort! +openid_deletion_success=OpenID har tagits bort! add_new_email=Lägg till ny e-postadress +add_new_openid=Lägg till ny OpenID URI add_email=Lägga till e-post -add_email_confirmation_sent=Ett nytt bekräftelsemail har skickats till '%s', kontrollera vänligen din inbox inom dom närmsta %d timmarna för att slutföra bekräftelsen. +add_openid=Lägg till OpenID URI add_email_success=Din nya epostaddress har lagts till. keep_email_private=Håll Epostadressen Gömd keep_email_private_popup=Om denna inställningar är påslagen kommer din epostaddress att hållas gömd från andra användare. manage_ssh_keys=Hantera SSH-nycklar +manage_gpg_keys=Hantera GPG-nycklar add_key=Lägg till nyckel -ssh_desc=Detta är en lista över SSH-nycklar som hör till ditt konto. Ta bort alla nycklar som du inte känner igen. -ssh_helper=Vet du inte hur? Kolla in Github's guide för att skapa din egen SSH-nycklar eller lösa vanliga problem som kan uppstå med SSH. +gpg_desc=Dessa GPG-nycklar är associerade med ditt konto. Eftersom dessa nycklar tillåter revisioner att verifieras är det mycket viktigt att du håller den motsvarande privata nyckeln säker. +ssh_helper=Behöver du hjälp? Kolla in Github's guide för att skapa din egen SSH-nycklar eller lösa vanliga problem som kan uppstå med SSH. +gpg_helper=Behöver du hjälp? Ta en titt på Github's guide om GPG. add_new_key=Lägg till SSH-nyckel -ssh_key_been_used=Innehåll i publik nyckel har använts. -ssh_key_name_used=Offentlig nyckel med samma namn har redan existerat. +add_new_gpg_key=Lägg till GPG-nyckel +ssh_key_been_used=Denna offentliga nyckel används redan. +ssh_key_name_used=En offentlig nyckel med samma namn existerar redan. +gpg_key_id_used=En offentlig GPG-nyckel med samma id existerar redan. +gpg_key_email_not_found=E-postaddressen kopplad till GPG-nyckeln kunde inte hittas eller är inte bekräftad ännu: %s +subkeys=Undernycklar +key_id=Nyckel-ID key_name=Nyckelnamn key_content=Innehåll -add_key_success=Ny SSH-nyckel "%s" har lagts till! +add_key_success=Din SSH-nyckel '%s' har lagts till. +add_gpg_key_success=Din GPG-nyckel '%s' har lagts till. delete_key=Ta bort ssh_key_deletion=SSH-nyckel radering -ssh_key_deletion_desc=Borttagning av denna SSH-nyckel kommer att ta bort all relaterad åtkomst för ditt konto. Vill du fortsätta? -ssh_key_deletion_success=SSH-nyckeln har tagits bort! +gpg_key_deletion=Borttagning av GPG-nyckel +ssh_key_deletion_desc=Borttagning av denna SSH-nyckel kommer att ta bort all åtkomst med denna nyckel för ditt konto. Vill du fortsätta? +gpg_key_deletion_desc=Borttagning av denna GPG-nyckel kommer att avverifiera alla revisioner som är signerade med detta GPG-nyckel. Är du säker på att du vill fortsätta? +ssh_key_deletion_success=SSH-nyckeln har tagits bort. +gpg_key_deletion_success=GPG-nyckeln har tagits bort. add_on=Tillagd +valid_until=Giltig t.om. last_used=Användes senast no_activity=Ingen nylig aktivitet key_state_desc=Denna nyckel har använts inom dom senaste 7 dagarna token_state_desc=Denna token har används inom dom senaste 7 dagarna +show_openid=Synlig på min profil +hide_openid=Dold från min profil manage_social=Hantera länkade sociala konton -social_desc=Detta är en lista över länkade sociala konton. Ta bort alla länkningar som du inte känner igen. +social_desc=Detta är en lista över associerade sociala konton. Av säkerhetsskäl, vänligen verifiera att du igen alla dessa konton, eftersom de kan användas för att logga in på ditt konto. unbind=Ta bort länkning -unbind_success=Socialt konto är inte längre länkat. +unbind_success=Socialt konto har avregistrerats från ditt konto. manage_access_token=Hantera personliga åtkomst-tokens generate_new_token=Generera Nya Tokens -tokens_desc=Tokens som du har genererat kan användas för åtkomst av Gitea APIer. +tokens_desc=Tokens du har genererat som kan användas för åtkomst av Gitea APIer. new_token_desc=Varje token har full tillgång till ditt konto. token_name=Tokennamn generate_token=Generera Token -generate_token_succees=Din åtkomst-token har genererats! Se till att kopiera den nu, eftersom du inte kommer att kunna se den igen senare! +generate_token_success=Din åtkomst-token har genererats! Se till att kopiera den nu, eftersom du inte kommer att kunna se den igen senare! delete_token=Radera access_token_deletion=Borttagning Av Personlig Åtkomsttoken -access_token_deletion_desc=Borttagning av denna personliga åtkomsttoken kommer att ta bort all relaterad åtkomst för applikationer. Vill du fortsätta? -delete_token_success=Personlig åtkomsttoken har tagits bort! Glöm inte bort att uppdatera din applikation också. +access_token_deletion_desc=Borttagning av denna personliga åtkomsttoken kommer återkalla åtkomsten för att applikationer som använder denna token. Vill du fortsätta? +delete_token_success=Personlig åtkomsttoken har tagits bort. Glöm inte att uppdatera alla eventuella program som använder denna token. -twofa_desc=Gitea har stöd för tvåfaktorsautentisering för att ge utökad säkerhet till ditt konto. -twofa_is_enrolled=Ditt konto är uppsäkrad med tvåfaktorsautentisering. -twofa_not_enrolled=Dit konto är inte än uppsäkrat med tvåfaktorsautentisering. +twofa_desc=Gitea har stöd för tvåfaktorsautentisering för att utöka säkerheten på ditt konto. +twofa_is_enrolled=Ditt konto är för närvarande uppsäkrad med tvåfaktorsautentisering. +twofa_not_enrolled=Ditt konto är för närvarande inte uppsäkrad med tvåfaktorsautentisering. twofa_disable=Avaktivera tvåfaktorsautentisering twofa_scratch_token_regenerate=Generera ny skrapkod twofa_scratch_token_regenerated=Din nya skrapkod har blivit genererad. Den är nu %s. Spara den på ett säkert ställe. twofa_enroll=Aktivera tvåfaktorsautentisering twofa_disable_note=Om nödvändigt så kan du stänga av tvåfaktorsautentisering. twofa_disable_desc=Avaktivering av tvåfaktorsautentisering sänker säkerheten av ditt konto. Är du säker på att du vill fortsätta? -regenerate_scratch_token_desc=Om du tappar bort din skrapkod, eller använder den för att logga in, så kan du generera en ny. +regenerate_scratch_token_desc=Om du tappar bort din skrapkod, eller redan använt den för att logga in, så kan du generera en ny här. twofa_disabled=Tvåfaktorsautentisering har blivit avaktiverat. scan_this_image=Skanna denna bild med ditt autentiseringsprogram: or_enter_secret=Eller skriv in följande sträng: %s -then_enter_passcode=Skriv sedan in koden som programmet ger dig: +then_enter_passcode=Ange sedan koden som applikationen ger dig: passcode_invalid=Koden är ogiltig. Försök igen. twofa_enrolled=Ditt konto är nu uppsäkrad med tvåfaktorsautentisering. Se till att spara din skrapkod (%s), då den endast kommer att visas denna gång! +manage_account_links=Hantera kontolänkningar +manage_account_links_desc=Externa konton kopplade till detta konto +account_links_not_available=För närvarande finns det inga externa konton kopplade till detta konto +remove_account_link=Ta bort länkat konto +remove_account_link_desc=Borttagning av det länkade kontot kommer att återkalla all relaterad åtkomst via detta konto. Vill du forsätta? +remove_account_link_success=Kontolänk borttagen! + +orgs_none=Du är inte en medlem i någon organisation. + delete_account=Radera ditt konto delete_prompt=Åtgärden kommer at ta bort ditt konto permanent, och kan INTE ångras! confirm_delete_account=Bekräfta Borttagelsen delete_account_title=Kontoborttagning -delete_account_desc=Detta konto kommer att tas bort permanent, vill du fortsätta? +delete_account_desc=Är du säker på att du vill ta bort detta konto? [repo] owner=Ägare repo_name=Utvecklingskatalogens namn -repo_name_helper=Ett bra utvecklingskatalogsnamn består vanligtvis av korta, minnesvärda och unika nyckelord. +repo_name_helper=Ett bra repo-namn består vanligtvis av korta, minnesvärda och unika nyckelord. visibility=Synligt för visiblity_helper=Denna utvecklingskatalog är Privat -visiblity_helper_forced=Administratören har tvingat alla nya utvecklingskataloger att vara Privata +visiblity_helper_forced=Administratören påtvingar alla nya repos att vara Privata visiblity_fork_helper=(Ändring av detta värde kommer att påverka alla forks) clone_helper=Behöver du hjälp med kloning? Gå till Hjälp! fork_repo=Forka Repo fork_from=Forka Från -fork_visiblity_helper=Du kan inte ändra offentligheten på ett forkat repo. +fork_visiblity_helper=Du kan inte ändra synligheten på en förgrenad utvecklingskatalog. repo_desc=Beskrivning repo_lang=Språk repo_gitignore_helper=Välj .gitignore-mallar @@ -406,16 +449,16 @@ create_repo=Skapa utvecklingskatalog default_branch=Standardgren mirror_prune=Rensa mirror_prune_desc=Tag bort fjärrspårande referenser som inte längre finns på fjärren -mirror_interval=Speglingsintervall (timmar) +mirror_interval=Speglingsintervall (giltiga enheter är ”h”, ”m”, ”s”) +mirror_interval_invalid=Speglingsintervallen är inte giltig mirror_address=Speglingsaddress -mirror_address_desc=Vänligen inkludera nödvändiga användaruppgifter i adressen. +mirror_address_desc=Vänligen inkludera alla nödvändiga autentiseringsuppgifter i adressen. mirror_last_synced=Senast synkad watchers=Observerare stargazers=Stjärnmärkare +forks=Förgreningar -form.reach_limit_of_creation=Ägaren har nått maxgränsen av %d skapade repon. -form.name_reserved=Namnet '%s' på utvecklingskatalogen är reserverat. -form.name_pattern_not_allowed=Reponamnet '%s' är inte tillåtet. +form.reach_limit_of_creation=Du har redan nått gränsen av %d repos. need_auth=Tillstånd Krävs migrate_type=Migreringstyp @@ -438,14 +481,12 @@ unwatch=Avsluta bevakning watch=Bevaka unstar=Ta bort stjärnmärkning star=Stjärnmärk +fork=Förgrening download_archive=Ladda ned utvecklingskatalogen no_desc=Ingen beskrivning quick_guide=Snabbguide clone_this_repo=Klona detta repo -create_new_repo_command=Skapa ett nytt repo på kommandoraden -push_exist_repo=Knuffa ett existerande repo från kommandoraden -repo_is_empty=Detta repo är tomt, vänligen kom tillbaka senare! code=Kod branch=Gren @@ -471,7 +512,7 @@ editor.new_file=Ny fil editor.upload_file=Ladda upp fil editor.edit_file=Redigera fil editor.preview_changes=Förhandsgranska ändringar -editor.cannot_edit_non_text_files=Endast textfiler kan redigeras +editor.cannot_edit_non_text_files=Kan inte redigera binära filer från webbgränssnittet editor.edit_this_file=Redigera denna fil editor.must_be_on_a_branch=Du måste vara på en gren för att genomföra eller föreslå ändringar i denna fil editor.fork_before_edit=Du måste förgrena detta förråd innan du kan redigera filen @@ -508,7 +549,6 @@ editor.upload_files_to_dir=Ladda upp filer till '%s' commits.commits=Incheckningar commits.search=Sök bland incheckningar -commits.search_all=Alla commits.find=Sök commits.author=Upphovsman commits.message=Meddelande @@ -516,6 +556,7 @@ commits.date=Datum commits.older=Äldre commits.newer=Nyare + issues.new=Nytt Ärende issues.new.labels=Etiketter issues.new.no_label=Ingen Etikett @@ -537,6 +578,16 @@ issues.label_templates.info=Det finns inga etiketter än. Du kan klicka på knap issues.label_templates.helper=Markera en uppsättning etiketter issues.label_templates.use=Använd denna etikettuppsättning issues.label_templates.fail_to_load_file=Laddning av etikettmallen '%s' misslyckades: %v +issues.add_label_at=`lade till
%s
etiketten %s`" ; background-color: %s">%s
label %s` +issues.remove_label_at=`tog bort
%s
etiketten %s`" ; background-color: %s">%s label %s` +issues.add_milestone_at=`lade till denna till milstolpe %s %s` +issues.change_milestone_at='modifierade milstolpen från %s till %s %s' +issues.remove_milestone_at='tog bort denna från milstolpen %s %s' +issues.self_assign_at=`tilldelade denna till sig själv %s` +issues.add_assignee_at=`blev tilldelad denna av %s %s` +issues.remove_assignee_at=`tog bort sin tilldelning %s` +issues.change_title_at='ändrade titeln från %s till %s %s' +issues.delete_branch_at='tog bort grenen %s %s' issues.open_tab=%d Öppna issues.close_tab=%d Stängda issues.filter_label=Etikett @@ -557,6 +608,11 @@ issues.filter_sort.recentupdate=Nyligen uppdaterade issues.filter_sort.leastupdate=Äldst uppdaterad issues.filter_sort.mostcomment=Mest kommenterade issues.filter_sort.leastcomment=Minst kommenterade +issues.action_open=Öppna +issues.action_close=Stäng +issues.action_label=Etikett +issues.action_milestone=Milsten +issues.action_milestone_no_select=Ingen Milsten issues.opened_by=öppnade %[1]s av %[3]s issues.opened_by_fake=öppnade %[1]s av %[2]s issues.previous=Föregående @@ -590,13 +646,16 @@ issues.label_edit=Redigera issues.label_delete=Radera issues.label_modify=Etikettsändring issues.label_deletion=Etikettsborttagning -issues.label_deletion_desc=Borttagning av denna etikett kommer att ta bort information från alla relaterade ärenden. Vill du fortsätta? issues.label_deletion_success=Etiketten har tagits bort! issues.label.filter_sort.alphabetically=Alfabetiskt A-Ö issues.label.filter_sort.reverse_alphabetically=Alfabetiskt Ö-A +issues.label.filter_sort.by_size=Storlek +issues.label.filter_sort.reverse_by_size=Omvänd storlek issues.num_participants=%d Deltagare issues.attachment.open_tab=`Klicka för att se "%s" i en ny flik` issues.attachment.download=`Klicka för att hämta "%s"` +issues.subscribe=Prenumerera +issues.unsubscribe=Avsluta prenumerationen pulls.new=Ny Pull-Förfrågan pulls.compare_changes=Jämför Ändringar @@ -606,23 +665,19 @@ pulls.compare_compare=jämför pulls.filter_branch=Filtrera gren pulls.no_results=Inga resultat hittades. pulls.nothing_to_compare=Det finns inget att jämföra eftersom bas och huvudgrenar är lika. -pulls.has_pull_request=`Det finns redan en pullförfrågan mellan detta två mål: %[2]s#%[3]s` +pulls.has_pull_request=`Det finns redan en pullförfrågan mellan dessa två mål: %[2]s#%[3]s` pulls.create=Skapa Pullförfrågan pulls.title_desc=vill sammanfoga %[1]d incheckningar från s[2]s in i %[3]s pulls.merged_title_desc=sammanfogade %[1]d incheckningar från %[2]s in i %[3]s %[4]s pulls.tab_conversation=Konversation pulls.tab_commits=Incheckningar pulls.tab_files=Ändrade filer -pulls.reopen_to_merge=Vänligen öppna denna Pull-förfrågan igen för att utföra sammanfogningen. pulls.merged=Sammanfogat -pulls.has_merged=Denna pull-förfrågan har blivit sammanfogad! pulls.data_broken=Data för denna pull-förfrågan har gått sönder på grund av borttagning av fork-information. -pulls.is_checking=Konfliktkontroll är fortfarande pågågående, vänligen uppdatera sidan om ett tag. +pulls.is_checking=Konfliktkontroll är fortfarande pågående, vänligen uppdatera sidan om ett tag. pulls.can_auto_merge_desc=Denna pull-förfrågan kan sammanfogas automatiskt. -pulls.cannot_auto_merge_desc=Denna pull-förfrågan kan inte sammanfogas automatiskt eftersom det finns konflikter. pulls.cannot_auto_merge_helper=Vänligen sammanfoga manuellt för att lösa konflikter. pulls.merge_pull_request=Sammanfoga Pull-förfrågan -pulls.open_unmerged_pull_exists="`Du kan inte utföra återöppningsoperationen eftersom det finns redan en öppen pull-förfrågan (#%d) från samma repo med samma sammanfogningsinformation som väntar på sammanfogning.`" milestones.new=Ny milstolpe milestones.open_tab=%d Öppna @@ -640,32 +695,36 @@ milestones.clear=Rensa milestones.invalid_due_date_format=Datumformatet är ogiltig, måste vara "åååå-mm-dd". milestones.create_success=Milstolpe "%s" har skapats! milestones.edit=Redigera milstolpe -milestones.edit_subheader=Använda en bättre beskrivning för milstolpar så folk inte blir förvirrade. +milestones.edit_subheader=Använd en bra beskrivning för milstolpar så folk inte blir förvirrade. milestones.cancel=Avbryt milestones.modify=Ändra milstolpe milestones.edit_success=Ändringar av milstolpen "%s" har sparats! milestones.deletion=Milstolpsborttagning milestones.deletion_desc=Borttagning av denna milstope kommer att ta bort information från alla relaterade ärenden. Vill du fortsätta? milestones.deletion_success=Milstolpe har tagits bort! +milestones.filter_sort.closest_due_date=Närmaste förfallodatum +milestones.filter_sort.furthest_due_date=Mest avlägsna förfallodatum milestones.filter_sort.least_complete=Minst klar milestones.filter_sort.most_complete=Mest klar milestones.filter_sort.most_issues=Mest ärenden milestones.filter_sort.least_issues=Minst ärenden +ext_wiki=Extern wiki + wiki=Wiki -wiki.welcome=Välkommen till Wiki! -wiki.welcome_desc=Wiki är den plats där du vill att dokumentera projektet tillsammans och göra det bättre. +wiki.welcome=Välkommen till Wiki +wiki.welcome_desc=I en wiki kan du och dina medarbetare enkelt dokumentera ditt projekt. +wiki.desc=Wiki är ett ställe att förvara dokumentation wiki.create_first_page=Skapa den första sidan wiki.page=Sida wiki.filter_page=Filtrera sida wiki.new_page=Skapa ny sida -wiki.default_commit_message=Skriva en anteckning om den här uppdateringen (valfritt). +wiki.default_commit_message=Skriv en anteckning om den här uppdateringen (valfritt). wiki.save_page=Spara sidan wiki.last_commit_info=%s redigerade denna sida %s wiki.edit_page_button=Redigera wiki.new_page_button=Ny Sida wiki.delete_page_button=Tag bort sida -wiki.delete_page_notice_1=Sidan "%s" kommer tas bort. Se till att du är säker. wiki.page_already_exists=Wiki-sida med samma namn finns redan. wiki.pages=Sidor wiki.last_updated=Senast uppdaterad %s @@ -682,7 +741,7 @@ settings.githooks=Githookar settings.basic_settings=Basinställningar settings.mirror_settings=Inställningar för spegling settings.sync_mirror=Synkronisera nu -settings.mirror_sync_in_progress=Spegningssynkronisering pågår, vänligen ladda om sidan om cirka en minut. +settings.mirror_sync_in_progress=Spegel-synkronisering pågår. Vänligen uppdatera sidan för att kolla igen om en liten stund. settings.site=Officiell webbplats settings.update_settings=Uppdatera inställningar settings.advanced_settings=Advancerade Inställningar @@ -690,6 +749,7 @@ settings.wiki_desc=Aktivera wikisystem settings.use_internal_wiki=Använd inbyggd wiki settings.use_external_wiki=Använd extern wiki settings.external_wiki_url=Extern Wiki-URL +settings.external_wiki_url_error=Extern wiki URL är ogiltig settings.external_wiki_url_desc=Besökare kommer att bli omdirigerade till denna URL när dom klickar på fliken. settings.issues_desc=Aktivera ärendehantering settings.use_internal_issue_tracker=Använd enkel inbyggd ärendehantering @@ -705,29 +765,23 @@ settings.pulls_desc=Aktivera pullförfrågningar för att ta emot publika bidrag settings.danger_zone=Högrisksområde settings.new_owner_has_same_repo=Den nya ägaren har redan ett repo med det namnet. Vänligen välj ett annat namn. settings.convert=Konvertera Till Vanligt Repo -settings.convert_desc=Du kan konvertera denna spegling till ett vanligt förråd. Detta kan inte ångras. settings.convert_notices_1=- Denna operation konverterar denna förrådsspegning till ett vanligt förråd och kan inte ångras. settings.convert_confirm=Bekräfta Konvertering -settings.convert_succeed=Förrådet har konverterats till ett vanligt förråd. +settings.convert_succeed=Repot har konverterats till ett vanligt repo. settings.transfer=Överför Ägarskap settings.transfer_desc=Överför detta repo till en annan användare, eller till en organisation där du har administratörsrättigheter. -settings.transfer_notices_1=- Du förlorar åtkomst om den nya ägaren är en enskild användare. +settings.transfer_notices_1=- Du kommer förlora åtkomst om den nya ägaren är en enskild användare. settings.transfer_notices_2=- Du kommer bevara tillgång om den nya ägaren är en organisation, och om du är en av ägarna. settings.transfer_form_title=Ange följande information för att bekräfta åtgärden: settings.wiki_delete=Tag bort wikidata settings.wiki_delete_desc=När du väl tagit bort wikidatan finns det ingen återvända. Se till att du är säker. settings.wiki_delete_notices_1=- Detta tar bort och avaktiverar wikin för %s -settings.wiki_deletion_success=Förrådets wikidata har tagits bort. +settings.wiki_deletion_success=Repots wikidata har tagits bort. settings.delete=Ta Bort Detta Repo settings.delete_desc=När du har tagit bort ett repo så finns det ingen återvändo. Var säker på vad du gör. settings.delete_notices_1=- Denna åtgärd kan INTE ångras. -settings.delete_notices_2=- Denna åtgärd kommer permanent ta bort hela repot, includerat git-datan, ärenden, kommentarer, och åtkomst för deltagare. -settings.delete_notices_fork_1=- Alla förgreningar kommer bli oberoende efter borttagning. -settings.deletion_success=Repot har tagits bort! -settings.update_settings_success=Repo-inställningar har uppdaterats. settings.transfer_owner=Ny Ägare settings.make_transfer=Överför -settings.transfer_succeed=Repo-ägarskapet har blivit överfört. settings.confirm_delete=Bekräfta Borttagelsen settings.add_collaborator=Lätt Till Ny Kollaboratör settings.add_collaborator_success=Ny kollaboratör har blivit tillagd. @@ -739,13 +793,10 @@ settings.search_user_placeholder=Sök användare... settings.org_not_allowed_to_be_collaborator=Organisationen kan inte läggas till som en deltagare. settings.user_is_org_member=Änvändaren är en organisationsmedlem som inte kan bli tillagd som deltagare. settings.add_webhook=Lägg Till Webbhook -settings.hooks_desc=Webbhookar påminner mycket om vanliga HTTP POST-händelseutlösare. När något inträffar i Gitea, kommer vi att meddela måldatorn som du anger. Läs mera i Webbhook Guide. settings.webhook_deletion=Ta Bort Webbhook -settings.webhook_deletion_desc=Borttagning av denna webbhook kommer att ta bort all dess information och all leveranshistorik. Är du säker på att du vill fortsätta? settings.webhook_deletion_success=Webbhook har tagits bort! settings.webhook.test_delivery=Testa Leverans settings.webhook.test_delivery_desc=Skicka en falsk pushhändelse för att testa dina webbhook-inställningar -settings.webhook.test_delivery_success=Testwebbhook har lagts till leveranskön. Det kan ta några sekunder innan den visas i leveranshistoriken. settings.webhook.request=Begäran settings.webhook.response=Svar settings.webhook.headers=Huvuden @@ -756,7 +807,6 @@ settings.githook_edit_desc=Om kroken är inaktiv visas exempelinnehåll. Inaktiv settings.githook_name=Kroknamn settings.githook_content=Krokinnehåll settings.update_githook=Uppdatera krok -settings.add_webhook_desc=Gitea kommer skicka POST-anrop till webbadressen du anger, tillsammans med information om händelsen som inträffade. Du kan också ange vilken sorts dataformat du vill få när kroken triggas (JSON, x-www-form-urlencoded, XML et.c.). Mer information finns i vår Webhooks Guide. settings.payload_url=Adress till innehåll settings.content_type=Typ av innehåll settings.secret=Hemlighet @@ -774,7 +824,6 @@ settings.event_pull_request_desc=Hämtningsbegäran öppnad, stängd, återöppn settings.event_push=Pusha settings.event_push_desc=Uppladdning till ett förråd settings.active=Aktiv -settings.active_helper=Detaljer kring händelsen som triggade kroken kommer också levereras. settings.add_hook_success=Ny webbkrok har lagts till. settings.update_webhook=Uppdatera Webhook settings.update_hook_success=Webbkrok har uppdaterats. @@ -787,7 +836,7 @@ settings.slack_domain=Domän settings.slack_channel=Kanal settings.deploy_keys=Driftsättningsnycklar settings.add_deploy_key=Lägg till driftsättningsnyckel -settings.deploy_key_desc=Driftsättningsnycklar har endast läsrättigheter. De är inte desamma som personliga SSH-kontonycklar. +settings.deploy_key_desc=Driftsättningsnycklar har endast läsrättigheter. De är inte detsamma som personliga SSH-kontonycklar. settings.no_deploy_keys=Du har inte lagt till några driftsättningsnycklar. settings.title=Titel settings.deploy_key_content=Innehåll @@ -795,20 +844,17 @@ settings.key_been_used=Driftsättningsnyckelns innehåll har använts. settings.key_name_used=En driftsättningsnyckel med samma namn finns redan. settings.add_key_success=Den nya driftsättningsnyckeln '%s' har lagts till! settings.deploy_key_deletion=Ta bort distribueringsnyckel -settings.deploy_key_deletion_desc=Borttagning av detta distributionsnyckel kommer att ta bort all relaterad åtkomst till det här repot. Vill du fortsätta? -settings.deploy_key_deletion_success=Distributionsnyckeln har tagits bort! diff.browse_source=Bläddra i källkod diff.parent=förälder diff.commit=incheckning -diff.data_not_available=Diff-uppgifter Inte Tillgänglig. diff.show_diff_stats=Visa Diff Statistik diff.show_split_view=Delad Vy diff.show_unified_view=Unifierad Vy diff.stats_desc= %d ändrade filer med %d tillägg och %d borttagningar diff.bin=Binär diff.view_file=Visa fil -diff.file_suppressed=Filskillnaden har hållts tillbaka eftersom den är för stor +diff.file_suppressed=Filskillnaden har hållits tillbaka eftersom den är för stor diff.too_many_files=Vissa filer visades inte eftersom för många filer har ändrats release.releases=Släpp @@ -819,11 +865,8 @@ release.stable=Stabil release.edit=redigera release.ahead=%d ändringar mot %s sedan detta släpp release.source_code=Källkod -release.new_subheader=Publicera släpp för att iterera produkten. -release.edit_subheader=Detaljerad ändringslogg kan hjälpa användarna att förstå vad har förbättrats. release.tag_name=Taggnamn release.target=Mål -release.tag_helper=Välj en befintlig tagg, eller skapa en ny tagg på publicera. release.title=Titel release.content=Innehåll release.write=Skriv @@ -837,19 +880,15 @@ release.save_draft=Spara Utkast release.edit_release=Redigera Släpp release.delete_release=Ta Bort Detta Släpp release.deletion=Släppborttagning -release.deletion_desc=Borttagning av detta släpp kommer att ta bort motsvarande Git-tagg. Vill du fortsätta? -release.deletion_success=Släppet har tagits bort! release.tag_name_already_exist=Ett släpp med denna tagg finns redan. release.tag_name_invalid=Etikettnamnet är ogiltigt. -release.downloads=Nerladdningar +release.downloads=Nedladdningar branch.delete=Ta bort gren %s -branch.delete_desc=När du har tagit bort en gren så finns det ingen återvändo. Var säker på vad du gör. branch.delete_notices_1=- Denna åtgärd kan INTE ångras. branch.delete_notices_2=- Denna åtgärd kommer att permanent ta bort allt i grenen %s. -branch.deletion_success=%s har tagits bort! +branch.deletion_success=%s har tagits bort. branch.deletion_failed=Kunde inte ta bort grenen %s. -branch.delete_branch_has_new_commits=%s kan inte tas bort då den innehåller ändringar efter sammanfogningen. [org] org_name_holder=Organisationsnamn @@ -867,7 +906,7 @@ org_desc=Beskrivning team_name=Gruppnamn team_desc=Beskrivning team_name_helper=Du kan använda detta namn för att nämna denna grupp i konversationer. -team_desc_helper=Vad handlar denna grupp om? +team_desc_helper=Vad är detta teamet för? team_permission_desc=Vilka behörigheter ska denna grupp ha? form.name_reserved=Organisationsnamnet "%s" är reserverat. @@ -881,15 +920,11 @@ settings.website=Webbplats settings.location=Plats settings.update_settings=Uppdatera inställningar settings.update_setting_success=Organisationsinställningarna har uppdaterats. -settings.change_orgname_prompt=Denna förändring kommer att påverka hur länkar relaterar till organisationen. -settings.update_avatar_success=Organisationens avatar-inställningar har uppdaterats. settings.delete=Tag bort organisation settings.delete_account=Tag bort denna organisation settings.delete_prompt=Organisationen kommer tas bort permanent, och det går INTE att ångra detta! settings.confirm_delete_account=Bekräfta borttagning settings.delete_org_title=Organisation borttagen -settings.delete_org_desc=Denna organisation kommer att tas bort permanent, vill du fortsätta? -settings.hooks_desc=Lägg till webbkrokar som triggas för alla förråd under denna organisation. members.membership_visibility=Synlighet för medlemskap: members.public=Publik @@ -909,9 +944,7 @@ teams.leave=Gå ur teams.read_access=Läsåtkomst teams.read_access_helper=Detta team kommer att kunna visa och klona dess repon. teams.write_access=Skrivåtkomst -teams.write_access_helper=Detta team kommer att kunna läsa alla repositories samt pusha till dessa. teams.admin_access=Adminåtkomst -teams.admin_access_helper=Detta team kommer att kunna pusha/pulla till sina repositories, samt lägga till deltagare till dessa. teams.no_desc=Detta team har ingen beskrivning teams.settings=Inställningar teams.owners_permission_desc=Ägare har full tillgång till alla förråd och har administratörsrättigheter för organisationen. @@ -920,8 +953,6 @@ teams.update_settings=Uppdatera inställningar teams.delete_team=Ta bort detta team teams.add_team_member=Lägg till teammedlem teams.delete_team_title=Borttagning av team -teams.delete_team_desc=Eftersom detta team tas bort kan medlemmar i teamet förlora sin tillgång till visa förråd. Vill du fortsätta? -teams.delete_team_success=Teamet togs bort. teams.read_permission_desc=Medlemskap i detta team ger läsrättigheter: medlemmar kan visa och klona teamets förråd. teams.write_permission_desc=Medlemskap i detta team ger skrivrättigheter: medlemmar kan läsa från och ladda upp till teamets förråd. teams.admin_permission_desc=Medlemskap i detta team ger administratörsrättigheter: medlemmar kan läsa från, ladda upp till och lägga till deltagare till teamets förråd. @@ -951,24 +982,29 @@ dashboard.statistic_info=Gitea-databasen innehåller %d användare, %d dashboard.operation_name=Operationsnamn dashboard.operation_switch=Byt till dashboard.operation_run=Kör -dashboard.clean_unbind_oauth=Rensa obundna OAuth-begäran -dashboard.clean_unbind_oauth_success=Alla obundna OAuth-begäran har tagit dashboard.delete_inactivate_accounts=Ta bort alla inaktiva konton -dashboard.delete_inactivate_accounts_success=Alla inaktiva konton har tagits bort. dashboard.delete_repo_archives=Ta bort alla utvecklingskatalogers arkiv -dashboard.delete_repo_archives_success=Alla utvecklingskatalogers arkiv har tagits bort. -dashboard.delete_missing_repos=Ta bort alla utvecklingskataloger som saknar Git-filer -dashboard.delete_missing_repos_success=Alla utvecklingskatalogers information, vars Git-filer var borttappade, har blivit borttagna. -dashboard.git_gc_repos=Kör skräpborttagning på utvecklingskataloger -dashboard.git_gc_repos_success=Skräpborttagning av alla utvecklingskataloger är slutförd. - +dashboard.resync_all_sshkeys_success=Alla publika nycklar har skrivits om. dashboard.server_uptime=Serverns upptid +dashboard.current_goroutine=Aktuella Goroutiner dashboard.current_memory_usage=Nuvarande Minnesanvändning dashboard.total_memory_allocated=Total Minnesanvändning dashboard.memory_obtained=Minnesåtgång dashboard.pointer_lookup_times=Pekaruppslagstider dashboard.memory_allocate_times=Minnesallokeringstider dashboard.memory_free_times=Minnesfrigöringstider +dashboard.current_heap_usage=Nuvarande Heap användning +dashboard.heap_memory_obtained=Heap-minne som erhållits +dashboard.heap_memory_idle=Heap-minne som är inaktivt +dashboard.heap_memory_in_use=Heap-minne som används +dashboard.heap_memory_released=Heap-minne som har släppts +dashboard.heap_objects=Heap objekt +dashboard.bootstrap_stack_usage=Bootstrap Stack-användning +dashboard.stack_memory_obtained=Stackminne som erhålls +dashboard.mspan_structures_usage=MSpan strukturanvändning +dashboard.mspan_structures_obtained=MSpan strukturer som erhållits +dashboard.mcache_structures_usage=MCache strukturanvändning +dashboard.mcache_structures_obtained=MCache-strukturer som erhållits dashboard.gc_metadata_obtained=Metainformation om Skräpsamlaren Ihopsamlad dashboard.other_system_allocation_obtained=Övriga Systemallokeringar dashboard.next_gc_recycle=Nästa Skräpsamlarrunda @@ -978,7 +1014,7 @@ dashboard.total_gc_pause=Total tid för pauser vid skräpsamling dashboard.last_gc_pause=Senaste paus vid skräpsamling dashboard.gc_times=Skräpsamlingstider -users.user_manage_panel=Panel för hantering av användare +users.user_manage_panel=Användarhantering users.new_account=Skapa nytt konto users.name=Namn users.activated=Aktiverad @@ -988,46 +1024,44 @@ users.created=Skapad users.last_login=Senaste Inloggning users.never_login=Aldrig Inloggad users.send_register_notify=Skicka registreringsnotifikation till användare -users.new_success=Nytt konto '%s' har skapats. users.edit=Redigera users.auth_source=Autentiseringskälla users.local=Lokal users.auth_login_name=Användarnamn för autentisering users.password_helper=Lämna det tomt för att låta det vara oförändrat. -users.update_profile_success=Kontoprofilen har uppdaterats. +users.update_profile_success=Kontoprofil har uppdaterats. users.edit_account=Redigera konto users.max_repo_creation=Gräns för antal skapade förråd users.max_repo_creation_desc=(Sätt till -1 för att använda den globala standardgränsen) -users.is_activated=Detta konto är aktivt -users.prohibit_login=Detta konto är förhindrat från att logga in +users.is_activated=Detta konto har slutfört aktiveringen +users.prohibit_login=Detta konto är blockerat från att logga in users.is_admin=Detta konto har administratörsrättigheter users.allow_git_hook=Detta konto har tillåtelse att skapa Git-krokar users.allow_import_local=Detta konto har tillåtelse att importera lokal förråd -users.allow_create_organization=Denna användare har tillåtelse att skapa organisationer +users.allow_create_organization=Detta konto har tillåtelse att skapa organisationer users.update_profile=Uppdatera kontoprofil users.delete_account=Tag bort detta konto -users.still_own_repo=Detta konto äger fortfarande åtminstone ett förråd, du måste ta bort eller överföra ägarskapen för dessa först. -users.still_has_org=Detta konto har fortfarande medlemskap i åtminstone en organisation, du måste lämna eller ta bort organisationerna först. -users.deletion_success=Kontot har tagits bort! +users.deletion_success=Kontot har tagits bort. -orgs.org_manage_panel=Panel för hantering av organisation +orgs.org_manage_panel=Organisationshantering orgs.name=Namn orgs.teams=Team orgs.members=Medlemmar +orgs.new_orga=Skapa organisation -repos.repo_manage_panel=Panel för hantering av förråd repos.owner=Ägare repos.name=Namn repos.private=Privat repos.watches=Vakter repos.stars=Stjärnor repos.issues=Ärenden +repos.size=Storlek -auths.auth_manage_panel=Panel för hantering av autentisering auths.new=Lägg till ny källa auths.name=Namn auths.type=Typ auths.enabled=Aktiv +auths.syncenabled=Aktivera användarsynkronisering auths.updated=Uppdaterad auths.auth_type=Autentiseringstyp auths.auth_name=Autentiseringsnamn @@ -1037,34 +1071,37 @@ auths.host=Värd auths.port=Port auths.bind_dn=Bind DN auths.bind_password=Bind Lösenord -auths.bind_password_helper=Varning: Detta lösenord lagras okrypterat. Använd inte ett konto med utökade rättigheter. +auths.bind_password_helper=Varning: Detta lösenord lagras i klartext. Använd inte ett privilegierat konto. +auths.user_base=Användarsökbas auths.user_dn=Användarnas DN auths.attribute_username=Användarnamnsattribut auths.attribute_username_placeholder=Lämna tom för att använda inloggningsformuläretets användarnamn. auths.attribute_name=Förnamnsattribut auths.attribute_surname=Efternamnsattribut auths.attribute_mail=E-postattribut +auths.attributes_in_bind=Hämta attribut från Bind DN auths.filter=Användarfilter auths.admin_filter=Administratörsfilter +auths.ms_ad_sa=Ms Ad SA auths.smtp_auth=SMTP Autentiseringstyp auths.smtphost=SMTP-server auths.smtpport=SMTP-port auths.allowed_domains=Tillåtna Domäner -auths.allowed_domains_helper=Lämnas tom för att tillåta alla domäner. Multipla domäner separeras med ett kommatecken ','. auths.enable_tls=Aktivera TLS-kryptering auths.skip_tls_verify=Skippa verifikation av TLS auths.pam_service_name=PAM Tjänstnamn +auths.oauth2_profileURL=Profil-URL +auths.oauth2_emailURL=E-post URL auths.enable_auto_register=Aktivera Automatisk Registrering auths.tips=Tips -auths.edit=Ändra Autentiseringsinställningar +auths.tip.dropbox=Skapa en ny applikation på https://www.dropbox.com/developers/apps +auths.tip.facebook=Registrera en ny appliaktion på https://developers.facebook.com/apps och lägg till produkten ”Facebook-inloggning” +auths.tip.github=Registrera en ny OAuth applikation på https://github.com/settings/applications/new +auths.tip.gitlab=Registrera en ny applikation på https://gitlab.com/profile/applications +auths.tip.twitter=Gå till https://dev.twitter.com/apps, skapa en applikation och kontrollera att alternativet ”Tillåt denna ansökan används för att logga in med Twitter” är aktiverat. auths.activated=Denna autentisering är aktiverad -auths.new_success=Ny autentisering '%s' has lagts till. -auths.update_success=Autentiseringsinställningarna har uppdaterats. -auths.update=Uppdatera Autentiseringsinställningar -auths.delete=Tag bort denna autentisering -auths.delete_auth_title=Autentiseringsborttagning -auths.delete_auth_desc=Denna autentisering kommer att tas bort, vill du verkligen fortsätta? -auths.still_in_used=Denna autentisering används fortfarande av vissa användare, vänligen ta bort eller konvertera dessa användare till en annan inloggningstyp först. +auths.new_success=Autentisering '%s' har lagts till. +auths.update_success=Inställningarna för autentisering har uppdaterats. auths.deletion_success=Autentiseringen har tagits bort! auths.login_source_exist=Inloggningskölla '%s' finns redan. @@ -1072,8 +1109,10 @@ config.server_config=Server-konfiguration config.app_name=Applikationsnamn config.app_ver=Applikationsversion config.app_url=Applikationsadressen +config.custom_conf=Konfigurationsfil config.domain=Domännamn config.offline_mode=Nedkopplat läge +config.disable_router_log=Avaktivera Router Loggning config.run_user=Exekverande Användare config.run_mode=Exekveringsläge config.git_version=Git Version @@ -1085,7 +1124,6 @@ config.script_type=Script-typ config.ssh_config=SSH-konfiguration config.ssh_enabled=Aktiverad -config.ssh_start_builtin_server=Starta Inbyggd Server config.ssh_domain=Domän config.ssh_port=Port config.ssh_listen_port=Lyssningsport @@ -1114,14 +1152,12 @@ config.mail_notify=E-postavisering config.disable_key_size_check=Avaktivera kontroll av minsta tillåtna nyckelstorlek config.enable_captcha=Aktivera Captcha config.active_code_lives=Aktivera livstid för koder -config.reset_password_code_lives=Livstid för koder för återställning av lösenord config.default_keep_email_private=Standardvärde för Håll Epostaddress Hemlig config.no_reply_address=Ingen Mottagare Address config.webhook_config=Webbkrokskonfiguration config.queue_length=Kölängd config.deliver_timeout=Tidsfrist för leverans -config.skip_tls_verify=Skippa verifikation av TLS config.mailer_config=Konfiguration för e-postutskick config.mailer_enabled=Aktiverad @@ -1130,7 +1166,6 @@ config.mailer_name=Namn config.mailer_host=Server config.mailer_user=Användare config.send_test_mail=Skicka testmeddelande -config.test_mail_failed=Misslyckades skicka testmeddelande till '%s': %v config.test_mail_sent=Testmeddelande har skickats till '%s'. config.oauth_config=OAuth-konfiguration @@ -1157,10 +1192,15 @@ config.disable_gravatar=Inaktivera Gravatar config.enable_federated_avatar=Aktivera Förenad Uppslaging av Profilbilder config.git_config=Git-konfiguration +config.git_max_diff_lines=Max Diff-rader (per fil) +config.git_max_diff_line_characters=Max Diff-tecken (per rad) +config.git_max_diff_files=Max Diff-filer (att visa) config.git_gc_args=Skräpsamlarargument config.git_migrate_timeout=Migreringstimeout config.git_mirror_timeout=Spelgingsuppdateringstimeout config.git_clone_timeout=Klonoperationstimeout +config.git_pull_timeout=Klonoperationstimeout +config.git_gc_timeout=GC-operationstimeout config.log_config=Logg-konfiguration config.log_mode=Loggningsläge @@ -1177,7 +1217,7 @@ monitor.start=Starttid monitor.execute_time=Exekveringstid notices.system_notice_list=Systemnotiser -notices.view_detail_header=Visa Notisdetaljer +notices.view_detail_header=Visa notisdetaljer notices.actions=Åtgärder notices.select_all=Markera Alla notices.deselect_all=Avmarkera alla @@ -1187,48 +1227,57 @@ notices.delete_all=Ta Bort Alla Notiser notices.type=Typ notices.type_1=Utvecklingskatalog notices.desc=Beskrivning -notices.delete_success=Systemnotiser har tagits bort. +notices.op=Op. [action] create_repo=skapade utvecklingskatalog %s rename_repo=döpte om utvecklingskalatogen från %[1]s till %[3]s +commit_repo=laddade upp till %[3]s i %[4]s +create_issue=`öppnade ärende %s#%[2]s` +close_issue='stängde ärende %s #%[2]s' +reopen_issue=`återöppnade ärende %s#%[2]s` +create_pull_request=`skapade pull request %s#%[2]s` +close_pull_request=`stängde pull-request %s#%[2]s` +reopen_pull_request=`öppnade upp pull request %s#%[2]s` +comment_issue=`kommenterade på ärende %s#%[2]s` +merge_pull_request=`sammanslog pull-request %s#%[2]s` transfer_repo=överförde utvecklingskalatogen %s till %s -compare_commits=Jämför dessa %d incheckningar +push_tag=laddade upp taggen %[2]s till %[3]s [tool] -ago=sedan -from_now=från och med nu +ago=%s sedan +from_now=%s från och med nu now=nu -1s=1 sekund %s -1m=1 minut %s -1h=1 timme %s -1d=1 dag %s -1w=1 vecka %s -1mon=1 månad %s -1y=1 år %s -seconds=%d sekunder %s -minutes=%d minuter %s -hours=%d timmar %s -days=%d dagar %s -weeks=%d veckor %s -months=%d månader %s -years=%d år %s +1s=1 sekund +1m=1 minut +1h=1 timme +1d=1 dag +1w=1 vecka +1mon=1 månad +1y=1 år +seconds=%d sekunder +minutes=%d minuter +hours=%d timmar +days=%d dagar +weeks=%d veckor +months=%d månader +years=%d år raw_seconds=sekunder raw_minutes=minuter [dropzone] -default_message=Släpp filer här eller klicka för att ladda upp. invalid_input_type=Du kan inte ladda upp filer av denna typ. -file_too_big=Filstorleken ({{filesize}} MB) överskrider storleksgränsen ({{maxFilesize}} MB). remove_file=Ta bort fil [notification] notifications=Notiser unread=Olästa read=Lästa -no_unread=Du har inga olästa notiser. -no_read=Du har inte lästa notiser. -pin=Fäst mark_as_read=Markera som läst mark_as_unread=Markera som oläst +[gpg] +error.extract_sign=Det gick inte att extrahera signatur + +[units] + diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index 91ae7d5..8234a67 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -28,7 +28,6 @@ mirror=Yansıma new_repo=Yeni Depo new_migrate=Yeni Göç new_mirror=Yeni Yansıma -new_fork=Yeni Çatal Depo new_org=Yeni Organizasyon manage_org=Organizasyonları Yönet admin_panel=Yönetim Paneli @@ -37,6 +36,7 @@ settings=Ayarlar your_profile=Profiliniz your_settings=Ayarlarınız + activities=Aktiviteler pull_requests=Değişiklik İsteği issues=Sorunlar @@ -45,39 +45,29 @@ cancel=İptal [install] install=Kurulum -title=İlk Kez Çalıştırma İçin Kurulum Adımları -docker_helper=Gitea'u Docker içinde kullanıyorsanız bu sayfada herhangi bir değişiklik yapmadan önce lütfen kılavuzu dikkatlice okuyunuz! -requite_db_desc=Gitea MySQL, PostgreSQL, SQLite3 veya TiDB gerektirir. db_title=Veritabanı Ayarları db_type=Veritabanı Türü host=Sunucu user=Kullanıcı password=Parola db_name=Veritabanı Adı -db_helper=Lütfen MySQL için INNODB motorunu utf8_general_ci karakter setiyle kullanın. ssl_mode=SSL Biçimi path=Yol -sqlite_helper=SQLite3 veya TiDB veritabanının dosya yolu.
Lütfen servis olarak başlatırken mutlak yolu kullanın. err_empty_db_path=SQLite3 veya TiDB veritabanı yolu boş olamaz. err_invalid_tidb_name=TiDB veritabanı adında "." ve "-" karakterlerine izin verilmez. no_admin_and_disable_registration=Bir yönetici hesabı oluşturmadan kullanıcı kaydını devre dışı bırakamazsınız. err_empty_admin_password=Yönetici parolası boş olamaz. -general_title=Genel Uygulama Ayarları app_name=Uygulama Adı -app_name_helper=Buraya organizasyonunuzun harika ismini koyun! repo_path=Depo Kök Dizini -repo_path_helper=Tüm uzak Git depoları bu dizine kaydedilecektir. run_user=Çalıştıran Kullanıcı run_user_helper=Kullanıcının deponun kök dizinine ve Gitea'u çalıştırmaya erişim izni olmalıdır. domain=Alan Adı domain_helper=Bu, SSH klon bağlantılarını etkiler. ssh_port=SSH Portu -ssh_port_helper=SSH sunucunuzun portu kullanılıyor, boş bırakın ya da SSH özelliğini devre dışı bırakın. http_port=HTTP Portu http_port_helper=Uygulamanın dinleyeceği port. app_url=Uygulama Bağlantısı -app_url_helper=Bu, HTTP/HTTPS klon bağlantılarını ve e-postadaki bazı kısımları etkiler. log_root_path=Günlük Dosyaları Yolu log_root_path_helper=Günlük dosyalarının yazılacağı dizin. @@ -85,14 +75,10 @@ optional_title=İsteğe Bağlı Ayarlar email_title=E-Posta Servisi Ayarları smtp_host=SMTP Sunucusu smtp_from=Kimden -smtp_from_helper=RFC 5322 standardına uygun posta "kimden" adresiniz. Bu sadece bir e-posta adresi veya "İsim" biçiminde bir adres olabilir. -mailer_user=Gönderen E-posta mailer_password=Gönderen Parolası register_confirm=Kayıt Onayını Etkinleştir -mail_notify=E-Posta Bildirimlerini Etkinleştir server_service_title=Sunucu ve Diğer Servis Ayarları offline_mode=Çevrim Dışı Modu Etkinleştir -offline_mode_popup=CDN'i, üretim modunda bile devre dışı bırak, tüm kaynak dosyaları yerel olarak sunulacaktır. disable_gravatar=Gravatar Servisini Devre Dışı Bırak disable_gravatar_popup=Gravatar ve özel kaynakları devre dışı bırak. Tüm avatarlar kullanıcılar tarafından yüklenir veya varsayılan kalır. federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. @@ -102,7 +88,6 @@ enable_captcha=Captcha'yı Etkinleştir enable_captcha_popup=Kullanıcının kendi kendine kaydolması için captcha doğrulaması gereksin. require_sign_in_view=Sayfaları Görüntüleyebilmek İçin Giriş Yapmayı Mecbur Kıl require_sign_in_view_popup=Yalnızca giriş yapmış kullanıcılar sayfaları görüntüleyebilir, ziyaretçiler yalnızca giriş yap/kaydol sayfalarını görüntüleyebilir. -admin_setting_desc=Şu an için yönetici hesabı oluşturmak zorunda değilsiniz, ilk kullanıcı otomatik olarak yönetici yetkilerine sahip olacaktır. admin_title=Yönetici Hesabı Ayarları admin_name=Kullanıcı Adı admin_password=Parola @@ -110,13 +95,8 @@ confirm_password=Parolayı Doğrula admin_email=Yönetici E-Postası install_btn_confirm=Gitea'u Kur test_git_failed='git' komut testi başarısız: %v -sqlite3_not_available=Yayın sürümünüz SQLite3'ü desteklemiyor, lütfen %s'den resmi sürümü (gobuild sürümünü DEĞİL) indirin. -invalid_db_setting=Veritabanı ayarları geçersiz: %v invalid_repo_path=Depo kök dizini geçersiz: %v -run_user_not_match=Çalıştırma kullanıcısı geçerli kullanıcı değil: %s -> %s -save_config_failed=Yapılandırma kaydedilemedi: %v invalid_admin_setting=Yönetici hesap ayarları geçersiz: %v -install_success=Merhaba! Gitea'u tercih ettiğiniz için çok mutluyuz, keyfini çıkarın! invalid_log_root_path=Günlük kök dizini geçersiz: %v [home] @@ -124,7 +104,6 @@ uname_holder=Kullanıcı Adı veya E-Posta password_holder=Parola switch_dashboard_context=Panoya Geçiş Yap my_repos=Depolarım -show_more_repos=Daha fazla depo göster... collaborative_repos=Katkıya Açık Depolar my_orgs=Organizasyonlarım my_mirrors=Yansılarım @@ -138,36 +117,23 @@ users=Kullanıcılar search=Ara [auth] -create_new_account=Yeni Hesap Oluştur register_helper_msg=Bir hesabınız var mı? Şimdi giriş yapın! -social_register_helper_msg=Zaten bir hesabınız var mı? Şimdi bağlanın! disable_register_prompt=Üzgünüz, kaydolma devre dışı bırakıldı. Lütfen site yöneticisiyle irtibata geçin. disable_register_mail=Üzgünüz, kayıt doğrulama e-postası devre dışı bırakıldı. remember_me=Beni Hatırla -forgot_password=Parolamı Unuttum -forget_password=Parolanızı mı unuttunuz? sign_up_now=Bir hesaba mı ihtiyacınız var? Şimdi kaydolun. -confirmation_mail_sent_prompt=%s adresinize yeni bir doğrulama e-postası gönderildi, kaydolma aşamalarını tamamlamak için lütfen %d saat içinde e-posta adresinizi kontrol edin. active_your_account=Hesabınızı Aktifleştirin prohibit_login=Oturum açılması yasak -prohibit_login_desc=Hesabınızla oturum açmanız yasaklanmış, lütfen site yöneticisi ile iletişime geçin. -resent_limit_prompt=Üzgünüz, zaten bir doğrulama e-postası talep ettiniz. Lütfen 3 dakika bekleyip tekrar deneyin. has_unconfirmed_mail=Merhaba %s, doğrulanmamış bir e-posta adresin var (%s). Bir doğrulama e-postası almadıysanız ya da yenisine ihtiyacınız varsa lütfen aşağıdaki düğmeye tıklayın. resend_mail=Doğrulama e-postasını tekrar almak için buraya tıklayın -email_not_associate=Bu e-posta adresi hiçbir hesaba bağlı değil. -send_reset_mail=Parola sıfırlama e-postasını (yeniden) göndermek için buraya tıklayın reset_password=Parolanızı Sıfırlayın -invalid_code=Üzgünüz, doğrulama kodunuz geçersiz veya süresi dolmuş. reset_password_helper=Parolanızı sıfırlamak için buraya tıklayın password_too_short=Parola uzunluğu %d karakterden az olamaz. -non_local_account=Yerel olmayan hesapların şifrelerini Gitea aracılığıyla değiştiremezsiniz. [mail] activate_account=Lütfen hesabınızı aktifleştirin activate_email=E-posta adresinizi doğrulayın reset_password=Parolanızı sıfırlayın -register_success=Kayıt başarılı, hoşgeldiniz -register_notify=Hoşgeldiniz [modal] yes=Evet @@ -190,8 +156,6 @@ AdminEmail=Yönetici e-postası TreeName=Dosya yolu require_error=` boş olamaz.` -alpha_dash_error=` sadece karakter, rakam veya çizgi(-_) içermelidir.` -alpha_dash_dot_error=` sadece karakter, rakam, çizgi(-_) veya nokta içermelidir.` size_error=` uzunluk en fazla %s olmalıdır.` min_size_error=` en az %s karakter içermelidir.` max_size_error=` en fazla %s karakter içermelidir.` @@ -199,28 +163,10 @@ email_error=' geçerli bir e-posta adresi değil.' url_error=` geçerli bir bağlantı değil.` include_error=` '%s' içermelidir.` unknown_error=Bilinmeyen hata: -captcha_incorrect=Captcha eşleşmedi. -password_not_match=Parola ve parola doğrulama aynı değil. -username_been_taken=Bu kullanıcı adı zaten alınmış. -repo_name_been_taken=Bu depo adı zaten alınmış. -org_name_been_taken=Bu organizasyon adı zaten alınmış. -team_name_been_taken=Bu takım adı zaten alınmış. -email_been_used=Bu e-posta adresi zaten kullanımda. -username_password_incorrect=Kullanıcı adı veya parola hatalı. -enterred_invalid_repo_name=Lütfen girdiğiniz depo isminin doğru olduğundan emin olun. -enterred_invalid_owner_name=Lütfen girdiğiniz depo sahibi isminin doğru olduğundan emin olun. -enterred_invalid_password=Lütfen girdiğiniz parolanın doğru olduğundan emin olun. -user_not_exist=Belirtilen kullanıcı bulunamadı. -last_org_owner=Bir takım içerisinde bu takımın sahibi olan en az bir kişi bulunmalıdır. -invalid_ssh_key=Üzgünüz, SSH anahtarınızı doğrulayamadık: %s -unable_verify_ssh_key=Gitea, SSH anahtarınızı doğrulayamıyor. Fakat anahtarınızın doğru olduğunu düşünüyoruz. Lütfen tekrar kontrol edin. auth_failed=Kimlik doğrulaması başarısız oldu: %v -still_own_repo=Hesabınıza bağlı bir depo var. Öncelikle bu depoyu silmeniz ya da başka birine transfer etmeniz gerekiyor. -still_has_org=Hesabınız şu an bir organizasyonun üyesi. Öncelikle bu organizasyondan çıkmanız ya da üyeliğinizi silmeniz gerekiyor. -org_still_own_repo=Bu organizasyon hala bazı depoların sahibi durumunda. Öncelikle bunları silmeniz ya da başka birine transfer etmeniz gerekiyor. target_branch_not_exist=Hedef dal mevcut değil. @@ -235,13 +181,10 @@ following=Takip Edilenler follow=Takip Et unfollow=Takibi Bırak -form.name_reserved=Kullanıcı adı '%s' başka birine ayrılmış. -form.name_pattern_not_allowed=Kullanıcı adında '%s' modeline izin verilmez. [settings] profile=Profil password=Parola -ssh_keys=SSH Anahtarları social=Sosyal Medya Hesapları applications=Uygulamalar orgs=Organizasyonlar @@ -249,15 +192,11 @@ delete=Hesabı Sil uid=Tekil ID public_profile=Herkese Açık Profil -profile_desc=E-posta adresiniz herkese açıktır ve hesabınızla ilgili bilgilendirmelerde ve web tabanlı operasyonlarda kullanılacaktır. -password_username_disabled=Yerel olmayan kullanıcılar kendi kullanıcı adlarını değiştiremezler. full_name=Ad Soyad website=Web Sitesi location=Konum update_profile=Profili Güncelle -update_profile_success=Profiliniz başarıyla güncellendi. change_username=Kullanıcı Adınız Değiştirildi -change_username_prompt=Bu değişiklik, hesabınızla ilişkili olan bağlantıları etkileyecektir. continue=Devam Et cancel=İptal @@ -266,15 +205,11 @@ choose_new_avatar=Yeni Avatar Seç update_avatar=Avatar Ayarlarını Güncelle delete_current_avatar=Güncel Avatarı Sil uploaded_avatar_not_a_image=Yüklenen dosya bir resim dosyası değil. -update_avatar_success=Avatar ayarlarınız başarıyla güncellendi. change_password=Parolayı Değiştir old_password=Mevcut Parola new_password=Yeni Parola retype_new_password=Yeni parolayı tekrar yazın -password_incorrect=Güncel parola hatalı. -change_password_success=Parolanız başarıyla değiştirildi. Yeni parolanızı kullanarak giriş yapabilirsiniz. -password_change_disabled=Yerel olmayan kullanıcılar kendi parolalarını değiştiremezler. emails=E-Posta Adresleri manage_emails=E-Posta Adreslerini Yönet @@ -282,70 +217,50 @@ email_desc=Birincil e-posta adresiniz bilgilendirmeler ve diğer işlemler için primary=Birincil primary_email=Birincil yap delete_email=Sil -email_deletion=E-Posta Silme -email_deletion_desc=Bu e-posta adresini silerseniz hesabınıza ilişkin tüm bilgileriniz de silinecektir. Devam etmek istiyor musunuz? email_deletion_success=E-posta adresi başarıyla silindi! add_new_email=Yeni e-posta adresi ekle add_email=E-posta ekle -add_email_confirmation_sent='%s' adresine yeni bir doğrulama e-postası gönderildi. Doğrulama aşamalarını tamamlamak için lütfen %d saat içinde gelen kutunuzu kontrol edin. add_email_success=Yeni e-posta adresiniz başarıyla eklendi. manage_ssh_keys=SSH Anahtarlarını Yönet add_key=Anahtar Ekle -ssh_desc=Bu, hesabınıza iliştirilmiş SSH anahtarlarınızın listedir. Bu anahtarları kullanma yetkisi olan herkes depolarınıza erişebilir, dolayısıyla bu kişileri tanıyor olmanız son derece önemlidir. -ssh_helper=Nasıl yapılacağını bilmiyor musunuz? GitHub'ın kendi SSH anahtarınızı oluşturma kılavuzunu inceleyin veya SSH kullanırken karşılaşabileceğiniz genel problemleri çözün. add_new_key=SSH Anahtarı Ekle -ssh_key_been_used=Genel anahtar içeriği kullanımda. -ssh_key_name_used=Genel anahtar, aynı isimle kullanımda. key_name=Anahtar İsmi key_content=İçerik -add_key_success=Yeni SSH anahtarı '%s' başarıyla eklendi! delete_key=Sil ssh_key_deletion=SSH Anahtarı Silme -ssh_key_deletion_desc=Bu SSH anahtarını silerseniz hesabınıza ilişkin tüm erişimler de kaldırılacaktır. Devam etmek istiyor musunuz? -ssh_key_deletion_success=SSH anahtarı başarıyla silindi! add_on=Eklendiği tarih last_used=Son kullanım no_activity=Yeni aktivite yok -key_state_desc=Bu anahtar son 7 gün içinde kullanıldı -token_state_desc=Bu erişim anahtarı son 7 gün içinde kullanıldı manage_social=Bağlanmış Sosyal Hesapları Yönet -social_desc=Bu, bağlanmış sosyal hesapların bir listesidir. Tanımadığınız bağlantıyı kaldırın. unbind=Bağlantıyı Kopar -unbind_success=Sosyal hesabın bağlantısı koparıldı. manage_access_token=Kişisel Erişim Anahtarlarını Yönet generate_new_token=Yeni Erişim Anahtarı Üret -tokens_desc=Ürettiğiniz erişim anahtarları, Gitea API'lerine erişimde kullanılabilir. new_token_desc=Her bir erişim anahtarının hesabınıza tam erişim yetkisi olacaktır. token_name=Erişim Anahtarı İsmi generate_token=Erişim Anahtarı Üret -generate_token_succees=Erişim anahtarınız başarıyla üretilmiştir! Bir daha göremeyeceğiniz için hemen şimdi bir yere kopyaladığınızdan emin olun! delete_token=Sil access_token_deletion=Kişisel Erişim Anahtarını Silme -access_token_deletion_desc=Bu kişisel erişim anahtarını silerseniz uygulamanıza ilişkin tüm erişimler de kaldırılacaktır. Devam etmek istiyor musunuz? -delete_token_success=Kişisel erişim anahtarı başarıyla kaldırıldı! Uygulamanızı güncellemeyi de unutmayın! + + delete_account=Hesabınızı Silin delete_prompt=Bu işlem hesabınızı kalıcı olarak silecektir ve GERİ ALINAMAZ! confirm_delete_account=Silmeyi Onayla delete_account_title=Hesap Silme -delete_account_desc=Bu hesap kalıcı olarak silinecektir. Devam etmek istiyor musunuz? [repo] owner=Sahibi repo_name=Depo İsmi -repo_name_helper=İyi bir depo ismi genellikle kısa, akılda kalıcı ve benzersiz kelimelerden oluşur. visibility=Görünürlük visiblity_helper=Bu depo Özel -visiblity_helper_forced=Site yöneticisi tüm depolara erişimleri Özel olarak ayarlamaya zorladı visiblity_fork_helper=(Bu değerin değişmesi tüm çatallamaları etkileyecektir) clone_helper=Klonlama konusunda yardıma mı ihtiyacınız var? Yardım bağlantısını ziyaret edin! fork_repo=Depoyu Çatalla fork_from=Buradan Çatalla -fork_visiblity_helper=Çatallanmış bir deponun görünürlüğünü değiştiremezsiniz. repo_desc=Açıklama repo_lang=Dil license=Lisans @@ -356,17 +271,11 @@ auto_init=Bu depoyu seçilen dosya ve şablonlarla oluştur create_repo=Depo Oluştur default_branch=Varsayılan Dal mirror_prune=Buda -mirror_prune_desc=Uzakta olmayan bütün uzaktan-izleme referanslarını sil -mirror_interval=Yansı Aralığı (saat) mirror_address=Yansı Adresi -mirror_address_desc=Lütfen gerekli kimlik bilgilerini adreste bulundurun. watchers=İzleyenler stargazers=Yıldızlayanlar forks=Çatallamalar -form.reach_limit_of_creation=Sahip, maksimum %d depo oluşturma limitine ulaşmıştır. -form.name_reserved=Depo ismi '%s' başkasına ayrılmış. -form.name_pattern_not_allowed=Depo isminde '%s' modeline izin verilmiyor. need_auth=Yetkilendirme Gereklidir migrate_type=Göç Türü @@ -393,9 +302,6 @@ fork=Çatalla no_desc=Açıklama Yok quick_guide=Hızlı Başlangıç Kılavuzu clone_this_repo=Bu depoyu klonla -create_new_repo_command=Komut satırında yeni bir depo oluştur -push_exist_repo=Var olan bir depoyu komut satırında gönder -repo_is_empty=Bu depo boş. Lütfen daha sonra tekrar gelin! code=Kod branch=Dal @@ -416,19 +322,18 @@ file_permalink=Kalıcı Bağlantı file_too_large=Bu dosya sergilenmek için çok büyük editor.edit_file=Dosya düzenle -editor.cannot_edit_non_text_files=Metin dışı dosyalar düzenlenemez editor.cancel_lower=iptal editor.cancel=İptal commits.commits=İşlemeler commits.search=İşleme Arama -commits.find=Bul commits.author=Yazar commits.message=Mesaj commits.date=Tarih commits.older=Daha Eski commits.newer=Daha yeni + issues.new=Yeni Sorun issues.new.labels=Etiketler issues.new.no_label=Etiket Yok @@ -445,7 +350,6 @@ issues.create=Sorun Oluştur issues.new_label=Yeni Etiket issues.new_label_placeholder=Etiket adı... issues.create_label=Etiket Oluştur -issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.open_tab=%d açık issues.close_tab=%d kapanmış issues.filter_label=Etiket @@ -497,8 +401,6 @@ issues.label_edit=Düzenle issues.label_delete=Sil issues.label_modify=Etiket Düzenleme issues.label_deletion=Etiket Silme -issues.label_deletion_desc=Bu etiketi silerseniz, bu etikete iliştirilmiş sorunlardaki tüm bilgiler de silinecektir. Devam etmek istiyor musunuz? -issues.label_deletion_success=Etiket başarıyla silindi! issues.num_participants=%d Katılımcı pulls.new=Yeni Değişiklik İsteği @@ -516,16 +418,12 @@ pulls.merged_title_desc=%[3]s %[4]s içindeki %[2]s i pulls.tab_conversation=Sohbet pulls.tab_commits=İşlemeler pulls.tab_files=Değiştirilen dosyalar -pulls.reopen_to_merge=Birleştirme işlemini gerçekleştirmek için lütfen bu değişiklik isteğini tekrar açın. pulls.merged=Birleştirildi -pulls.has_merged=Bu değişiklik isteği başarıyla birleştirildi! pulls.data_broken=Bu değişiklik isteğinin verisi, çatallama bilgilerinin silinmesi nedeniyle bozulmuş. pulls.is_checking=Çakışma kontrolü sürüyor. Lütfen birkaç dakika içinde sayfayı yenileyin. pulls.can_auto_merge_desc=Bu değişiklik isteği otomatik olarak birleştirilebilir. -pulls.cannot_auto_merge_desc=Çakışmalardan dolayı bu değişiklik isteği otomatik olarak birleştirilemez. pulls.cannot_auto_merge_helper=Çakışmaları çözmek için lütfen elle birleştirin. pulls.merge_pull_request=Değişiklik İsteğini Birleştir -pulls.open_unmerged_pull_exists=`Yeniden açma işlemini gerçekleştiremezsiniz. Çünkü zaten aynı depodan, aynı birleştirme bilgisiyle açık olan bir değişiklik isteği var (#%d) ve birleştirme bekliyor.` milestones.new=Yeni Kilometre Taşı milestones.open_tab=%d Açık @@ -543,27 +441,22 @@ milestones.clear=Temizle milestones.invalid_due_date_format=Bitiş tarihi formatı geçersiz. 'yyyy-mm-dd' şeklinde olmalı. milestones.create_success=Kilometre taşı '%s' başarıyla oluşturuldu! milestones.edit=Kilometre Taşını Düzenle -milestones.edit_subheader=Kilometre taşları için daha iyi açıklamalar kullanın ki insanların kafaları karışmasın. milestones.cancel=İptal milestones.modify=Kilometre Taşını Düzenle milestones.edit_success='%s' kilometre taşının değişiklikleri başarıyla kaydedildi! milestones.deletion=Kilometre Taşı Silme -milestones.deletion_desc=Bu kilometre taşını silerseniz iliştirilmiş tüm sorunlardaki bilgiler de silinecektir. Devam etmek istiyor musunuz? milestones.deletion_success=Kilometre taşı başarıyla silindi! -wiki.welcome=Wiki'ye Hoşgeldiniz! -wiki.welcome_desc=Wiki, projenizi belgelendirebileceğiniz ve daha iyi bir hale getirebileceğiniz yerdir. + wiki.create_first_page=İlk sayfayı oluştur wiki.page=Sayfa wiki.filter_page=Sayfa filtrele wiki.new_page=Yeni Sayfa Oluştur -wiki.default_commit_message=Bu güncelleme için bir not yazın (isteğe bağlı). wiki.save_page=Sayfayı Kaydet wiki.last_commit_info=%s bu sayfayı düzenledi %s wiki.edit_page_button=Düzenle wiki.new_page_button=Yeni Sayfa wiki.delete_page_button=Sayfayı Sil -wiki.delete_page_notice_1=Bu işlem "%s" sayfasını silecektir. Lütfen emin olun. wiki.page_already_exists=Aynı isimde bir Wiki sayfası zaten var. wiki.pages=Sayfalar wiki.last_updated=Son güncelleme %s @@ -596,29 +489,18 @@ settings.pulls_desc=Herkese açık katkıları kabul etmek için değişiklik is settings.danger_zone=Tehlike Alanı settings.new_owner_has_same_repo=Yeni sahibin aynı isimde başka bir deposu var. Lütfen farklı bir isim seçin. settings.convert=Düzenli Depoya Dönüştür -settings.convert_desc=Bu yansıyı düzenli bir depoya dönüştürebilirsiniz. Bu işlem geri alınamaz. settings.convert_notices_1=- Bu işlem, bu depo yansımasını düzenli türe dönüştürür ve geri alınamaz. settings.convert_confirm=Sohbeti Onayla -settings.convert_succeed=Depo başarıyla düzenli türe dönüştürüldü. settings.transfer=Sahipliği Aktar settings.transfer_desc=Bu depoyu başka bir kullanıcıya veya yönetici yetkilerine sahip olduğunuz başka bir organizasyona aktarın. -settings.transfer_notices_1=- Yeni sahip, bireysel bir kullanıcı ise erişim iznini kaybedeceksiniz. -settings.transfer_notices_2=- Yeni sahip, bir organizasyon ise ve siz de sahiplerinden biriyseniz erişim izninizi koruyacaksınız. -settings.transfer_form_title=İşleminizi onaylamak için lütfen aşağıdaki bilgileri girin: settings.wiki_delete=Wiki Verisini Sil settings.wiki_delete_desc=Wiki verisini bir kez sildiğiniz taktirde geri getiremezsiniz. Lütfen emin olun. settings.wiki_delete_notices_1=- Bu işlem %s için Wiki'yi silecek ve devre dışı bırakacaktır. -settings.wiki_deletion_success=Deponun Wiki verisi başarıyla silindi. settings.delete=Bu Depoyu Sil settings.delete_desc=Bir depoyu bir kez sildiğiniz taktirde geri getiremezsiniz. Lütfen emin olun. settings.delete_notices_1=- Bu işlem geri ALINAMAZ. -settings.delete_notices_2=- Bu işlem, bu depodaki her şeyi (Git verisini, sorunları, yorumları ve katkıcı erişimlerini) kalıcı olarak silecektir. -settings.delete_notices_fork_1=Silme işleminden sonra bütün çatallar bağımsız hale gelir. -settings.deletion_success=Depo başarıyla silindi! -settings.update_settings_success=Depo seçenekleri başarıyla güncellendi. settings.transfer_owner=Yeni Sahip settings.make_transfer=Transfer Et -settings.transfer_succeed=Depo, yeni sahibine başarıyla transfer edildi. settings.confirm_delete=Silmeyi Onayla settings.add_collaborator=Yeni Katkıcı Ekle settings.add_collaborator_success=Yeni katkıcı eklendi. @@ -630,13 +512,10 @@ settings.search_user_placeholder=Kullanıcı ara... settings.org_not_allowed_to_be_collaborator=Organizasyon, bir katkıcı olarak eklenemez. settings.user_is_org_member=Kullanıcı organizasyon üyesi olduğu için katkıcı olarak eklenemez. settings.add_webhook=Web İsteği Ekle -settings.hooks_desc=Web istekleri, HTTP POST olay tetikleyicileri gibidirler. Gitea'ta ne zaman bir şey olsa, hedef belirttiğiniz sunuculara bildirim yapabilecek duruma geliriz. Daha fazla bilgiyi Web İstekleri Kılavuzu'nda bulabilirsiniz. settings.webhook_deletion=Web İsteğini Sil -settings.webhook_deletion_desc=Bu web isteğini silerseniz buna bağlı olan tüm bilgiler ve dağıtım geçmişi de silinecektir. Devam etmek istiyor musunuz? settings.webhook_deletion_success=Web isteği başarıyla silindi! settings.webhook.test_delivery=Test Dağıtımı settings.webhook.test_delivery_desc=Web isteği ayarlarınızı test etmek için sahte bir anlık olay gönderin -settings.webhook.test_delivery_success=Test web isteği, dağıtım kuyruğuna eklendi. Bunun dağıtım geçmişinde görünmesi birkaç saniye sürebilir. settings.webhook.request=İstekler settings.webhook.response=Cevaplar settings.webhook.headers=Başlıklar @@ -647,7 +526,6 @@ settings.githook_edit_desc=İstek aktif değilse örnek içerik sunulacaktır. settings.githook_name=İstek İsmi settings.githook_content=İstek İçeriği settings.update_githook=İsteği Güncelle -settings.add_webhook_desc=Gitea, meydana gelen olay ile birlikte belirttiğiniz bağlantıya bir POST isteği gönderecektir. Ayrıca tetiklenen istek (JSON, x-www-form-urlencoded, XML, vb) üzerine bir veri formatı belirtebilirsiniz. Daha fazla bilgiyi Web İstekleri Kılavuzu bağlantımızda bulabilirsiniz. settings.payload_url=Yük Bağlantısı settings.content_type=İçerik Türü settings.secret=Gizli @@ -662,7 +540,6 @@ settings.event_create=Oluştur settings.event_create_desc=Dal veya biçim imi oluşturuldu settings.event_push_desc=Bir depoya git push settings.active=Aktif -settings.active_helper=Bu isteği tetikleyen olaya ilişkin detaylar da gönderilecektir. settings.add_hook_success=Yeni web isteği eklendi. settings.update_webhook=Web İsteğini Düzenle settings.update_hook_success=Web isteği güncellendi. @@ -683,13 +560,10 @@ settings.key_been_used=Dağıtım anahtarının içeriği kullanımda. settings.key_name_used=Aynı isimde bir dağıtım anahtarı zaten var. settings.add_key_success=Yeni dağıtım anahtarı '%s' başarıyla eklendi! settings.deploy_key_deletion=Dağıtım Anahtarını Sil -settings.deploy_key_deletion_desc=Bu dağıtım anahtarını silerseniz bu depoya ilişkin tüm erişimler de kaldırılacaktır. Devam etmek istiyor musunuz? -settings.deploy_key_deletion_success=Dağıtım anahtarı başarıyla silindi! diff.browse_source=Kaynağa Gözat diff.parent=ebeveyn diff.commit=işleme -diff.data_not_available=Farklılık Verisi Yok. diff.show_diff_stats=Farklılık Durumunu Göster diff.show_split_view=Görünümü Böl diff.show_unified_view=Birleşik Görünüm @@ -706,11 +580,8 @@ release.stable=Kararlı release.edit=düzenle release.ahead=%s son sürümden beri %d işleme release.source_code=Kaynak Kodu -release.new_subheader=Ürünü yinelemek için sürümleri yayınla. -release.edit_subheader=Detaylı değişiklik günlükleri, kullanıcıların neyin geliştirildiğini anlamasına yardımcı olur. release.tag_name=Biçim imi adı release.target=Hedef -release.tag_helper=Var olan bir biçim imi seçin veya yayında yenisini oluşturun. release.title=Başlık release.content=İçerik release.write=Yaz @@ -724,8 +595,6 @@ release.save_draft=Taslağı Kaydet release.edit_release=Taslağı Düzenle release.delete_release=Bu Sürümü Sil release.deletion=Sürüm Silme -release.deletion_desc=Bu sürümü silerseniz buna uyan tüm Git biçim imleri de silinecektir. Devam etmek istiyor musunuz? -release.deletion_success=Sürüm başarıyla silindi! release.tag_name_already_exist=Bu biçim imi adıyla başka bir sürüm zaten var. release.tag_name_invalid=Etiket adı geçerli değil. release.downloads=İndirmeler @@ -746,9 +615,6 @@ create_new_team=Yeni Ekip Oluştur org_desc=Açıklama team_name=Ekip Adı team_desc=Açıklama -team_name_helper=Sohbetlerde bu takımdan bahsetmek için bu ismi kullanacaksınız. -team_desc_helper=Bu takım ne hakkında? -team_permission_desc=Bu takım, ne gibi bir izin seviyesine sahiptir? form.name_reserved=Organizasyon adı '%s' başka birisine ayrılmış. form.name_pattern_not_allowed=Organizasyon adı modeli '%s' geçersiz. @@ -759,16 +625,11 @@ settings.full_name=Tam İsim settings.website=Web Sitesi settings.location=Lokasyon settings.update_settings=Ayarları Güncelle -settings.update_setting_success=Organizasyon ayarları başarıyla güncellendi. -settings.change_orgname_prompt=Bu değişiklik, organizasyonla ilişkilendirilmiş bağlantıları da etkileyecektir. -settings.update_avatar_success=Organizasyonun avatar ayarları başarıyla değiştirildi. settings.delete=Organizasyonu Sil settings.delete_account=Bu Organizasyonu Sil settings.delete_prompt=Organizasyon kalıcı olarak kaldırılacaktır ve bu işlem geri ALINAMAZ! settings.confirm_delete_account=Silmeyi Onaylıyorum settings.delete_org_title=Organizasyon Silme -settings.delete_org_desc=Bu organizasyon kalıcı olarak silinecektir. Devam etmek istiyor musunuz? -settings.hooks_desc=Bu organizasyona bağlı tüm depoları tetikleyecek bir web isteği oluştur. members.membership_visibility=Üyelik Görünürlüğü: members.public=Herkese Açık @@ -788,9 +649,7 @@ teams.leave=Ayrıl teams.read_access=Okuma Erişimi teams.read_access_helper=Bu takım, tüm depolarını görüntüleyebilecek ve klonlayabilecektir. teams.write_access=Yazma Erişimi -teams.write_access_helper=Bu takım tüm depolarını okuyabilecek ve aynı zamanda push atabilecektir. teams.admin_access=Yönetici Erişimi -teams.admin_access_helper=Bu takım tüm depolarına ve aynı zamanda diğer katkıcılara push/pull yapabilecektir. teams.no_desc=Herhangi bir takım açıklaması yok teams.settings=Ayarlar teams.owners_permission_desc=Sahiplerin tüm depolara tam yetkisi ve organizasyona yönetici yetkisi vardır. @@ -799,8 +658,6 @@ teams.update_settings=Ayarları Güncelle teams.delete_team=Bu Ekibi Sil teams.add_team_member=Ekip Üyesi Ekle teams.delete_team_title=Takım Silme -teams.delete_team_desc=Bu takımı silerseniz üyeler bazı depolara olan erişimlerini kaybedebilirler. Devam etmek istiyor musunuz? -teams.delete_team_success=Verilen takım adı başarıyla silindi. teams.read_permission_desc=Bu takımın yetkilerinden Okuma izni: üyeler görüntüleyebilir ve takımın depolarını klonlayabilir. teams.write_permission_desc=Bu takımın yetkilerinden Yazma izni: üyeler okuyabilir ve takımın depolarına push yapabilir. teams.admin_permission_desc=Bu takımın yetkilerinden Yönetici izni: üyeler okuyabilir, push yapabilir ve takımın depolarına yeni katkıcılar ekleyebilir. @@ -830,23 +687,8 @@ dashboard.statistic_info=Gitea veritabanında %d kullanıcı, %d o dashboard.operation_name=İşlem Adı dashboard.operation_switch=Geç dashboard.operation_run=Çalıştır -dashboard.clean_unbind_oauth=Bağlanmamış OAuth'ları Temizle -dashboard.clean_unbind_oauth_success=Bağlanmamış tüm OAuth'lar başarıyla silindi. dashboard.delete_inactivate_accounts=Etkin olmayan tüm hesapları sil -dashboard.delete_inactivate_accounts_success=Pasif olan tüm hesaplar başarıyla silindi. dashboard.delete_repo_archives=Tüm depo arşivlerini sil -dashboard.delete_repo_archives_success=Tüm depo arşivleri başarıyla silindi. -dashboard.delete_missing_repos=Git dosyalarını kaybetmiş tüm depo kayıtlarını sil -dashboard.delete_missing_repos_success=Git dosyalarını kaybetmiş tüm depo kayıtları başarıyla silindi. -dashboard.git_gc_repos=Depolarda çöp toplama işlemini gerçekleştir -dashboard.git_gc_repos_success=Tüm depolarda çöp toplama işlemi başarıyla gerçekleştirildi. -dashboard.resync_all_sshkeys='.ssh/authorized_keys' dosyasını yeniden yaz (dikkat: Gitea'un olmayan anahtarlar silinecektir) -dashboard.resync_all_sshkeys_success=Tüm genel anahtarlar başarıyla yeniden yazıldı. -dashboard.resync_all_update_hooks=Tüm depoların güncel web isteklerini yeniden yaz (özel yapılandırma yolu değiştiğinde gerekir) -dashboard.resync_all_update_hooks_success=Tüm depoların güncel web istekleri başarıyla yeniden yazıldı. -dashboard.reinit_missing_repos=Git dosyalarını kaybetmiş tüm depoları yeniden oluştur -dashboard.reinit_missing_repos_success=Git dosyalarını kaybetmiş tüm depolar başarıyla yeniden oluşturuldu. - dashboard.server_uptime=Sunucunun Ayakta Kalma Süresi dashboard.current_goroutine=Güncel Goroutine'ler dashboard.current_memory_usage=Güncel Bellek Kullanımı @@ -877,7 +719,6 @@ dashboard.total_gc_pause=Toplam GC Durması dashboard.last_gc_pause=Son GC Durması dashboard.gc_times=GC Zamanları -users.user_manage_panel=Kullanıcı Yönetim Paneli users.new_account=Yeni Hesap Oluştur users.name=İsim users.activated=Aktifleştirilmiş @@ -885,33 +726,23 @@ users.admin=Yönetici users.repos=Depolar users.created=Oluşturuldu users.send_register_notify=Kullanıcıya Kaydolma Bildirimi Gönder -users.new_success=Yeni hesap '%s' başarıyla oluşturuldu. users.edit=Düzenle users.auth_source=Yetkilendirme Kaynağı users.local=Yerel users.auth_login_name=Yetkilendirmeye Giriş İsmi users.password_helper=Değiştirmemek için burayı boş bırakın. -users.update_profile_success=Hesap profili başarıyla güncellendi. users.edit_account=Hesabı Düzenle users.max_repo_creation=Maksimum Depo Oluşturma Limiti users.max_repo_creation_desc=(Genel varsayılan limiti kullanmak için -1 yazın) -users.is_activated=Bu hesap aktivleştirildi -users.prohibit_login=Bu hesap oturum açmaya engellenmiş users.is_admin=Bu hesap, yönetici izinlerine sahiptir -users.allow_git_hook=Bu hesap, Git istekleri oluşturmak için gereken yetkilere sahip users.allow_import_local=Bu hesap, yerel depoları içeri aktarmak için gereken yetkilere sahip users.update_profile=Hesap Profilini Güncelle users.delete_account=Bu Hesabı Sil -users.still_own_repo=Bu hesap en az bir deponun sahibi durumunda. Öncelikle o depoyu silmeli ya da başka birine transfer etmelisiniz. -users.still_has_org=Bu hesabın en az bir organizasyonda üyeliği var. Öncelikle o organizasyondan ayrılmalı ya da o organizasyonu silmelisiniz. -users.deletion_success=Hesap başarıyla silindi! -orgs.org_manage_panel=Organizasyon Yönetim Paneli orgs.name=İsim orgs.teams=Ekipler orgs.members=Üyeler -repos.repo_manage_panel=Depo Yönetim Paneli repos.owner=Sahibi repos.name=İsim repos.private=Özel @@ -919,7 +750,6 @@ repos.watches=İzlemeler repos.stars=Yıldızlar repos.issues=Sorunlar -auths.auth_manage_panel=Yetkilendirme Yönetim Paneli auths.new=Yeni Kaynak Ekle auths.name=İsim auths.type=Tür @@ -932,7 +762,6 @@ auths.domain=Alan Adı auths.host=Sunucu auths.bind_dn=Bağlama DN'i auths.bind_password=Bağlama Parolası -auths.bind_password_helper=Uyarı: Bu parola, ham halde bir metin dosyası içerisinde saklanacaktır. Yüksek izinli bir hesap kullanmayın. auths.user_base=Kullanıcı Arama Tabanı auths.user_dn=Kullanıcı DN'i auths.attribute_username=Kullanıcı özelliği @@ -947,21 +776,12 @@ auths.smtp_auth=SMTP Yetkilendirme Türü auths.smtphost=SMTP Sunucusu auths.smtpport=SMTP Portu auths.allowed_domains=İzin Verilen Alan Adları -auths.allowed_domains_helper=Her alan adını kısıtlamak için burayı boş bırakın. Çoklu alan adları virgülle ',' ayrılmalıdır. auths.enable_tls=TLS Şifrelemeyi Aktifleştir auths.skip_tls_verify=TLS Doğrulamasını Atla auths.pam_service_name=PAM Servis Adı auths.enable_auto_register=Otomatik Kaydolmayı Aktifleştir auths.tips=İpuçları -auths.edit=Yetkilendirme Ayarlarını Düzenle auths.activated=Bu yetkilendirme aktif -auths.new_success=Yeni yetkilendirme '%s' başarıyla eklendi. -auths.update_success=Yetkilendirme ayarları başarıyla güncellendi. -auths.update=Yetkilendirme Ayarlarını Güncelle -auths.delete=Bu Yetkilendirmeyi Sil -auths.delete_auth_title=Yetkilendirme Silme -auths.delete_auth_desc=Bu yetkilendirme silinecek. Devam etmek istiyor musunuz? -auths.still_in_used=Bu yetkilendirme hala bazı kullanıcılar tarafından kullanılıyor. Lütfen öncelikle bunları silin ya da başka oturum açma türlerine çevirin. auths.deletion_success=Yetkilendirme başarıyla silindi! config.server_config=Sunucu Yapılandırması @@ -981,7 +801,6 @@ config.reverse_auth_user=Tersine Yetkilendirme Kullanıcısı config.ssh_config=SSH Yapılandırması config.ssh_enabled=Aktif -config.ssh_start_builtin_server=Hazır Sunucuyu Başlat config.ssh_domain=Alan Adı config.ssh_listen_port=Port'u Dinle config.ssh_root_path=Kök Yol @@ -1009,12 +828,10 @@ config.mail_notify=E-posta Bildirimi config.disable_key_size_check=Minimum Anahtar Uzunluğu Kontrolünü Devre Dışı Bırak config.enable_captcha=Captcha'yı Aktifleştir config.active_code_lives=Kod Yaşamlarını Aktifleştir -config.reset_password_code_lives=Kod Yaşamları Parolasını Yenile config.webhook_config=Web İstekleri Yapılandırması config.queue_length=Kuyruk Uzunluğu config.deliver_timeout=Dağıtım Zaman Aşımı -config.skip_tls_verify=TLS Doğrulamasını Atla config.mailer_config=Mailer Yapılandırması config.mailer_enabled=Aktif @@ -1023,7 +840,6 @@ config.mailer_name=İsim config.mailer_host=Sunucu config.mailer_user=Kullanıcı config.send_test_mail=Test E-Postası Gönder -config.test_mail_failed='%s' adresine test e-postası gönderimi başarısız: %v config.test_mail_sent='%s' adresine test e-postası gönderildi. config.oauth_config=OAuth Yapılandırması @@ -1064,7 +880,6 @@ monitor.start=Başlangıç Zamanı monitor.execute_time=Çalıştırma Zamanı notices.system_notice_list=Sistem Bildirimleri -notices.view_detail_header=Bildirim Detayını Görüntüle notices.actions=İşlemler notices.select_all=Tümünü Seç notices.deselect_all=Tümünü Seçmeyi Bırak @@ -1075,7 +890,6 @@ notices.type=Tip notices.type_1=Depo notices.desc=Açıklama notices.op=İşlem -notices.delete_success=Sistem bildirimleri başarıyla silindi. [action] create_repo=depo %s oluşturuldu @@ -1091,34 +905,35 @@ comment_issue=`%s#%[2]s sorununa yorum yazdı` merge_pull_request=`%s#%[2]s değişim isteğini birleştirdi` transfer_repo=depo %s %s'a aktarıldı push_tag=etiket %[2]s %[3]s'a itelendi -compare_commits=Bu %d işlemeler için karşılaştırmaları görüntüle [tool] -ago=önce -from_now=şu andan +ago=%s önce +from_now=%s şu andan now=şimdi -1s=1 saniye %s -1m=1 dakika %s -1h=1 saat %s -1d=1 gün %s -1w=1 hafta %s -1mon=1 ay %s -1y=1 yıl %s -seconds=%d saniye %s -minutes=%d dakika %s -hours=%d saat %s -days=%d gün %s -weeks=%d hafta %s -months=%d ay %s -years=%d yıl %s +1s=1 saniye +1m=1 dakika +1h=1 saat +1d=1 gün +1w=1 hafta +1mon=1 ay +1y=1 yıl +seconds=%d saniye +minutes=%d dakika +hours=%d saat +days=%d gün +weeks=%d hafta +months=%d ay +years=%d yıl raw_seconds=saniyeler raw_minutes=dakikalar [dropzone] -default_message=Dosyaları yüklemek için sürükleyin veya tıklayın. invalid_input_type=Bu türdeki dosyaları yükleyemezsiniz. -file_too_big=Dosyanızın boyutu:({{filesize}} MB) Boyut sınırını aşıyor. Maksimum boyut:({{maxFilesize}} MB). remove_file=Dosya Kaldır [notification] +[gpg] + +[units] + diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index e2633b4..eb28473 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -5,8 +5,11 @@ dashboard=控制面板 explore=探索 help=帮助 sign_in=登录 +sign_in_with=登录方式 sign_out=退出 sign_up=注册 +link_account=链接帐户 +link_account_signin_or_signup=使用已有账号登录来连接到此账号,或者注册一个新账号 register=注册 website=官方网站 version=当前版本 @@ -33,7 +36,7 @@ mirror=镜像 new_repo=创建新的仓库 new_migrate=迁移外部仓库 new_mirror=创建新的镜像 -new_fork=创建新的派生仓库 +new_fork=新的仓库Fork new_org=创建新的组织 manage_org=管理我的组织 admin_panel=管理面板 @@ -43,6 +46,12 @@ your_profile=个人信息 your_starred=我点赞的仓库 your_settings=用户设置 +all=所有 +sources=自建 +mirrors=镜像 +collaborative=协作 +forks=派生 + activities=最近活动 pull_requests=合并请求 issues=工单管理 @@ -51,7 +60,7 @@ cancel=取消 [install] install=安装页面 -title=首次运行安装程序 +title=初始配置 docker_helper=如果您正在使用 Docker 容器运行 Gitea,请务必先仔细阅读 官方文档 后再对本页面进行填写。 requite_db_desc=Gitea 要求安装 MySQL、PostgreSQL、SQLite3 或 TiDB。 db_title=数据库设置 @@ -69,11 +78,11 @@ err_invalid_tidb_name=TiDB 数据库名称不允许包含字符 "." 或 "-" 。 no_admin_and_disable_registration=您不能够在未创建管理员用户的情况下禁止注册。 err_empty_admin_password=管理员密码不能为空。 -general_title=应用基本设置 +general_title=通用应用设置 app_name=应用名称 -app_name_helper=快用狂拽酷炫的组织名称闪瞎我们! +app_name_helper=您可以把您的组织名称写在这里。 repo_path=仓库根目录 -repo_path_helper=所有 Git 远程仓库都将被存放于该目录。 +repo_path_helper=所有远程 Git 仓库将保存到此目录。 lfs_path=LFS根目录 lfs_path_helper=存储为Git LFS的文件将被存储在此目录。留空禁用LFS run_user=运行系统用户 @@ -81,11 +90,11 @@ run_user_helper=该用户必须具有对仓库根目录和运行 Gitea 的操作 domain=域名 domain_helper=该设置影响 SSH 克隆地址。 ssh_port=SSH 端口号 -ssh_port_helper=SSH 服务器的监听端口号,留空表示禁用 SSH 功能。 +ssh_port_helper=SSH 服务器的端口号,为空则禁用它。 http_port=HTTP 端口号 http_port_helper=应用监听的端口号 app_url=应用 URL -app_url_helper=该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。 +app_url_helper=这会影响 HTTP/HTTPS 克隆 URL 和一些电子邮件通知。 log_root_path=日志路径 log_root_path_helper=存放日志文件的目录 @@ -94,7 +103,7 @@ email_title=邮件服务设置 smtp_host=SMTP 主机 smtp_from=邮件来自 smtp_from_helper=邮件来自地址,遵循 RFC 5322 标准。可以是一个单纯的邮箱地址或使用 "Name" 的格式。 -mailer_user=发送邮箱 +mailer_user=发件人 mailer_password=发送邮箱密码 register_confirm=启用注册邮箱确认 mail_notify=启用邮件通知提醒 @@ -120,17 +129,19 @@ admin_email=管理员邮箱 install_btn_confirm=立即安装 test_git_failed=无法识别 'git' 命令:%v sqlite3_not_available=您所使用的发行版不支持 SQLite3,请从 %s 下载官方构建版,而不是 gobuild 版本。 -invalid_db_setting=数据库设置不正确:%v +invalid_db_setting=数据库设置无效: %v invalid_repo_path=仓库根目录设置不正确:%v run_user_not_match=运行系统用户非当前用户:%s -> %s save_config_failed=应用配置保存失败:%v invalid_admin_setting=管理员帐户设置不正确:%v -install_success=您好!我们很高兴您选择使用 Gitea,祝您使用愉快,代码从此无 BUG! +install_success=欢迎 !非常感谢您选择 Gitea,玩得开心。 invalid_log_root_path=无效的日志路径:%v default_keep_email_private=隐藏邮箱地址的默认值 default_keep_email_private_popup=这是用户邮箱地址可见性的默认值,当它设置为true,所有的新用户的邮箱地址将被隐藏,除非用户修改他的配置。 +default_allow_create_organization=新用户创建组织的默认的权限 +default_allow_create_organization_popup=这是将分配给新用户的默认权限值。如果设置为 true 的新用户将被允许创建组织。 no_reply_address=不可回邮地址 -no_reply_address_helper=用来隐藏用户在git日志里的邮箱地址的域名。例如:用户 '张三' 和域名 'noreply.example.org' 会变成 'zhangsan@noreply.example.org'。 +no_reply_address_helper=用来隐藏用户在git日志里的邮箱地址的域名。例如:用户’张三‘和域名’noreply.example.org'会变成‘zhangsan@noreply.example.org'。 [home] uname_holder=用户名或邮箱 @@ -151,24 +162,25 @@ repos=仓库 users=用户 organizations=组织 search=搜索 -repo_no_results=没有匹配的仓库。 -user_no_results=没有匹配的用户。 -org_no_results=没有匹配的组织。 +repo_no_results=没有找到匹配的仓库。 +user_no_results=没有找到匹配的用户。 +org_no_results=没有找到匹配的组织。 [auth] create_new_account=创建帐户 register_helper_msg=已经注册?立即登录! -social_register_helper_msg=已经注册?立即绑定! +social_register_helper_msg=已经有账户了?现在就加入! disable_register_prompt=对不起,注册功能已被关闭。请联系网站管理员。 disable_register_mail=对不起,注册邮箱确认功能已被关闭。 remember_me=记住登录 -forgot_password=忘记密码 -forget_password=忘记密码? +forgot_password_title=忘记密码 +forgot_password=忘记密码? sign_up_now=还没帐户?马上注册。 -confirmation_mail_sent_prompt=一封新的确认邮件已经被发送至 %s,请检查您的收件箱并在 %d 小时内完成确认注册操作。 +confirmation_mail_sent_prompt=一封新的确认邮件已经被发送至 %s,请检查您的收件箱并在 %s 内完成确认注册操作。 +reset_password_mail_sent_prompt=确认电子邮件已被发送到 %s。请您在 %s 内检查您的收件箱 ,完成密码重置过程。 active_your_account=激活您的帐户 prohibit_login=禁止登录 -prohibit_login_desc=您的帐户被禁止登录,请联系网站管理员。 +prohibit_login_desc=您的帐户被禁止登录,请与网站管理员联系。 resent_limit_prompt=对不起,您请求发送激活邮件过于频繁,请等待 3 分钟后再试! has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 %s 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。 resend_mail=单击此处重新发送确认邮件 @@ -178,20 +190,29 @@ reset_password=重置密码 invalid_code=对不起,您的确认代码已过期或已失效。 reset_password_helper=单击此处重置密码 password_too_short=密码长度不能少于 %d 位! -non_local_account=非本地类型的帐户无法通过 Gitea 修改密码。 +non_local_account=非本地帐户不能通过 Gitea 的 web 界面更改密码。 verify=验证 scratch_code=验证口令 use_scratch_code=使用验证口令 twofa_scratch_used=你已经使用了你的验证口令。你将会转到两步验证设置页面以便移除你的注册设备或者重新生成新的验证口令。 twofa_passcode_incorrect=你的验证码不正确。如果你丢失了你的设备,请使用你的验证口令。 twofa_scratch_token_incorrect=你的验证口令不正确。 +login_userpass=用户 / 密码 +login_openid=OpenID +openid_connect_submit=连接 +openid_connect_title=连接到现有的帐户 +openid_connect_desc=所选择的 OpenID URIs 不可识别,你可以加入一个现有的帐户。 +openid_register_title=创建新帐户 +openid_register_desc=所选择的 OpenID URIs 不可识别,你可以将它关联到一个新的帐户。 +openid_signin_desc=示例 URI: https://anne.me、 bob.openid.org.cn、 gnusocial.net/carry +disable_forgot_password_mail=对不起,密码重置已被禁用。请与网站管理员联系。 [mail] activate_account=请激活您的帐户 activate_email=请验证您的邮箱地址 reset_password=重置您的密码 -register_success=注册成功,欢迎使用 -register_notify=欢迎使用 +register_success=注册成功 +register_notify=欢迎来到 Gitea [modal] yes=确认操作 @@ -221,6 +242,7 @@ Content=内容 require_error=不能为空。 alpha_dash_error=必须为英文字母、阿拉伯数字或横线(-_)。 alpha_dash_dot_error=必须为英文字母、阿拉伯数字、横线(-_)或点。 +git_ref_name_error=必须是格式良好的 git 引用名称。 size_error=长度必须为 %s。 min_size_error=长度最小为 %s 个字符。 max_size_error=长度最大为 %s 个字符。 @@ -229,26 +251,31 @@ url_error=不是一个有效的 URL。 include_error=必须包含子字符串 '%s'。 unknown_error=未知错误: captcha_incorrect=验证码未匹配。 -password_not_match=密码与确认密码未匹配。 +password_not_match=密码不匹配。 -username_been_taken=用户名已经被占用。 -repo_name_been_taken=仓库名称已经被占用。 -org_name_been_taken=组织名称已经被占用。 -team_name_been_taken=团队名称已经被占用。 -email_been_used=邮箱地址已经被使用。 -username_password_incorrect=用户名或密码不正确。 +username_been_taken=用户名已被使用 +repo_name_been_taken=仓库名称已被使用。 +org_name_been_taken=组织名称已被使用。 +team_name_been_taken=团队名称已被使用。 +team_no_units_error=团队必须启用至少一个单元。 +email_been_used=电子邮件已被占用。 +openid_been_used=OpenID 地址 '%s' 已被使用。 +username_password_incorrect=用户名或密码错误 enterred_invalid_repo_name=请检查您输入的仓库名称是正确。 enterred_invalid_owner_name=请检查您输入的新所有者用户名是否正确。 enterred_invalid_password=请检查您输入的密码是否正确。 -user_not_exist=被操作的用户不存在! +user_not_exist=该用户名不存在 last_org_owner=被移除用户为最后一位管理员。请添加一位新的管理员再进行移除成员操作! +cannot_add_org_to_team=组织不能被加入到团队中。 +cannot_invite_org_to_org=组织不能被邀请为团队成员。 invalid_ssh_key=很抱歉,我们无法验证您输入的 SSH 密钥:%s -unable_verify_ssh_key=Gitea 无法验证您输入的 SSH 密钥,但我们假设那是有效的密钥,请您自行确保其有效性! +invalid_gpg_key=很抱歉,我们无法验证您输入的 GPG 密钥:%s +unable_verify_ssh_key=SSH 密钥不能验证,请仔细检查它的任何错误。 auth_failed=授权验证失败:%v still_own_repo=您的帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作! -still_has_org=您的帐户仍旧是某些组织的成员,您必须先离开或删除组织。 +still_has_org=您的帐户仍然是至少一个组织的成员,你需要先离开他们。 org_still_own_repo=该组织仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除组织操作! target_branch_not_exist=目标分支不存在。 @@ -264,31 +291,33 @@ following=关注中 follow=关注 unfollow=取消关注 -form.name_reserved=用户名 '%s' 是被保留的。 +form.name_reserved='%s' 用户名被保留。 form.name_pattern_not_allowed=用户名不允许 '%s' 的格式。 [settings] profile=个人信息 password=修改密码 avatar=头像设置 -ssh_keys=管理 SSH 密钥 +ssh_gpg_keys=SSH / GPG 密钥 social=社交帐号绑定 applications=管理授权应用 orgs=管理组织 delete=删除帐户 twofa=两步验证 +account_link=外部帐户 +organization=组织 uid=用户 ID public_profile=公开信息 profile_desc=您的邮箱地址将会被公开,并被用于接收帐户的所有提醒和通知。 -password_username_disabled=非本地类型的用户被禁止修改用户名。 +password_username_disabled=不允许非本地用户更改他们的用户名。更多详情请联系您的系统管理员。 full_name=自定义名称 website=个人网站 location=所在地区 update_profile=更新信息 -update_profile_success=您的个人信息更新成功! +update_profile_success=您的资料信息已经更新 change_username=用户名将被修改 -change_username_prompt=该操作将会影响到所有与您帐户有关的链接 +change_username_prompt=该操作将会影响到所有与该组织有关的链接 continue=继续操作 cancel=取消操作 @@ -307,48 +336,72 @@ new_password=新的密码 retype_new_password=重新输入新的密码 password_incorrect=当前密码不正确! change_password_success=密码修改成功!您现在可以使用新的密码登录。 -password_change_disabled=非本地类型的用户被禁止修改密码。 +password_change_disabled=不允许非本地用户通过 web 界面更改其密码。 emails=邮箱地址 manage_emails=管理邮箱地址 +manage_openid=管理 OpenID 地址 email_desc=您的主要邮箱地址将被用于通知提醒和其它操作。 primary=主要 primary_email=设为主要 delete_email=删除 -email_deletion=邮箱删除操作 -email_deletion_desc=删除该邮箱地址将会移除所有相关的信息。是否继续? +email_deletion=删除电子邮件 +email_deletion_desc=删除此电子邮件地址将从您的帐户删除所有的相关的信息。Git 提交使用此电子邮件将保持不变。你想要继续吗? email_deletion_success=邮箱删除成功! +openid_deletion=OpenID 删除 +openid_deletion_desc=删除此 OpenID 地址从您的帐户将会阻止你使用它进行登录。你确定要继续吗? +openid_deletion_success=OpenID 已成功删除 ! add_new_email=添加新的邮箱地址 +add_new_openid=添加新的 OpenID URI add_email=添加邮箱 -add_email_confirmation_sent=一封待确认的电子邮件已发送到 '%s',请在 %d 小时内检查您的收件箱,并完成确认过程。 +add_openid=添加 OpenID URI +add_email_confirmation_sent=一封新的确认邮件已经被发送至 %s,请检查您的收件箱并在 %s 内完成确认注册操作。 add_email_success=新的邮箱地址添加成功! +add_openid_success=新 OpenID 地址添加成功! keep_email_private=不公开Email地址 keep_email_private_popup=设置该选项会使得其他用户看不到你的邮箱地址 +openid_desc=你的 OpenID 地址将让您的身份验证委派到选择的提供商 manage_ssh_keys=管理 SSH 密钥 +manage_gpg_keys=管理 GPG 密钥 add_key=增加密钥 ssh_desc=以下是与您帐户所关联的 SSH 密钥,如果您发现有陌生的密钥,请立即删除它! +gpg_desc=这些是与您的帐户相关联的 GPG 密钥。因为这些公钥允许提交被验证,它非常重要,可以保证相应的私钥安全。 ssh_helper=需要帮助? 请查看有关 如何生成 SSH 密钥常见 SSH 问题 寻找答案。 +gpg_helper=需要帮助吗?看一看 GitHub 关于GPG 的指导。 add_new_key=增加 SSH 密钥 -ssh_key_been_used=公开密钥已经被使用! -ssh_key_name_used=使用相同名称的公开密钥已经存在! +add_new_gpg_key=添加的 GPG 密钥 +ssh_key_been_used=这个公钥已被使用 +ssh_key_name_used=使用相同名称的公钥已经存在! +gpg_key_id_used=使用相同名称的GPG公钥已经存在! +gpg_key_email_not_found=附加到 GPG 密钥的电子邮件找不到或还没确认: %s +subkeys=子项 +key_id=键ID key_name=密钥名称 key_content=密钥内容 -add_key_success=新的 SSH 密钥 '%s' 添加成功! +add_key_success=您的 SSH 密钥 '%s' 添加成功。 +add_gpg_key_success=您的 SSH 密钥 '%s' 添加成功。 delete_key=删除 ssh_key_deletion=删除 SSH 公钥操作 -ssh_key_deletion_desc=删除该 SSH 公钥将删除所有与您帐户相关的访问权限。是否继续? -ssh_key_deletion_success=SSH 公钥删除成功! +gpg_key_deletion=GPG 密钥删除 +ssh_key_deletion_desc=删去此 SSH 密钥将撤销您的帐户使用此 SSH 密钥的所有访问。你想要继续吗? +gpg_key_deletion_desc=删去此 GPG 密钥将 unverify 与此 GPG 密钥签署的所有提交。确实要继续吗? +ssh_key_deletion_success=SSH 密钥已被删除。 +gpg_key_deletion_success=GPG 密钥已被删除。 add_on=增加于 +valid_until=有效期至 +valid_forever=永久有效 last_used=上次使用在 no_activity=没有最近活动 -key_state_desc=该密钥在 7 天内被使用过 -token_state_desc=该令牌在 7 天内被使用过 +key_state_desc=7 天内使用过该密钥 +token_state_desc=7 天内使用过该密钥 +show_openid=在个人信息上显示 +hide_openid=在个人信息上隐藏 manage_social=管理关联社交帐户 -social_desc=以下是与您帐户所关联的社交帐号,如果您发现有陌生的关联,请立即解除绑定! +social_desc=这是相关联的社会帐户的列表。出于安全考虑,请确保你认识的所有这些条目,因为它们可以用于登录到您的帐户。 unbind=解除绑定 -unbind_success=社交帐号解除绑定成功! +unbind_success=社会帐户已从您的帐户中解除绑定。 manage_access_token=管理个人操作令牌 generate_new_token=生成新的令牌 @@ -356,14 +409,14 @@ tokens_desc=您可以使用这些已生成的令牌来操作 Gitea API。 new_token_desc=目前为止,任何令牌都对您的帐户拥有完整的操作权限。 token_name=令牌名称 generate_token=生成令牌 -generate_token_succees=新的操作令牌生成成功!您必须立即复制到一个安全的地方,因为该令牌只会显示一次! +generate_token_success=新的操作令牌生成成功!您必须立即复制到一个安全的地方,因为该令牌只会显示一次! delete_token=删除令牌 access_token_deletion=删除个人操作令牌操作 -access_token_deletion_desc=删除该个人操作令牌将删除所有相关的应用程序的访问权限。是否继续? -delete_token_success=个人操作令牌删除成功!请更新与该令牌有关的所有应用。 +access_token_deletion_desc=删除此个人访问令牌将撤销使用此标记的任何应用程序的访问。你想要继续吗? +delete_token_success=个人访问令牌已被删除。别忘了更新使用此标记的任何应用程序。 twofa_desc=Gitea支持两步验证来加强账户的安全性 -twofa_is_enrolled=你的账户已注册了两步验证。 +twofa_is_enrolled=你的账户已启用了两步验证。 twofa_not_enrolled=你的账号未开启两步验证。 twofa_disable=停用两步验证 twofa_scratch_token_regenerate=重新生成验证口令 @@ -379,11 +432,20 @@ then_enter_passcode=然后输入应用提供给你的验证码: passcode_invalid=无效验证码,请重试 twofa_enrolled=你的账户已经注册了两步验证。请务必保存好你的验证口令 (%s),这只会出现一次! +manage_account_links=管理帐户链接 +manage_account_links_desc=连接到此账号的外部账号 +account_links_not_available=目前没有外部帐户链接到此账户 +remove_account_link=删除链接的账号 +remove_account_link_desc=删除此链接的帐户将撤销所有相关的访问使用此帐户。你想要继续吗? +remove_account_link_success=用户删除成功! + +orgs_none=您现在还不是任何组织的成员。 + delete_account=删除当前帐户 delete_prompt=删除操作会永久清除您的帐户信息,并且 不可恢复! confirm_delete_account=确认删除帐户 delete_account_title=帐户删除操作 -delete_account_desc=该帐户将被永久性删除,您确定要继续操作吗? +delete_account_desc=您确认要永久删除此消息吗? [repo] owner=拥有者 @@ -409,7 +471,8 @@ create_repo=创建仓库 default_branch=默认分支 mirror_prune=修剪 mirror_prune_desc=当远程追踪的引用被删除时本地也同步删除 -mirror_interval=镜像同步周期(小时) +mirror_interval=镜像间隔 (单位是"h"、"m"、"s"的有效时间) +mirror_interval_invalid=镜像间隔无效 mirror_address=镜像地址 mirror_address_desc=请在镜像地址中写入必要的用户凭据信息。 mirror_last_synced=上次同步时间: @@ -417,7 +480,7 @@ watchers=关注者 stargazers=称赞者 forks=派生仓库 -form.reach_limit_of_creation=该用户已经达到允许创建 %d 个仓库的最大上限。 +form.reach_limit_of_creation=你已经达到了您的 %d 仓库的限制。 form.name_reserved=仓库名称 '%s' 是被保留的。 form.name_pattern_not_allowed=仓库名称不允许 '%s' 的格式。 @@ -431,9 +494,11 @@ migrate.clone_local_path=或服务器本地路径 migrate.permission_denied=您没有获得导入本地仓库的权限。 migrate.invalid_local_path=无效的本地路径,不存在或不是一个目录! migrate.failed=迁移失败:%v +migrate.lfs_mirror_unsupported=不支持镜像 LFS 对象 - 使用 'git lfs fetch --all' 和 'git lfs push --all' 替代。 mirror_from=镜像自地址 forked_from=派生自 +fork_from_self=无法派生已经拥有的仓库! copy_link=复制链接 copy_link_success=复制成功! copy_link_error=请按下 ⌘-C 或 Ctrl-C 复制 @@ -450,9 +515,10 @@ quick_guide=快速帮助 clone_this_repo=克隆当前仓库 create_new_repo_command=从命令行创建一个新的仓库 push_exist_repo=从命令行推送已经创建的仓库 -repo_is_empty=该仓库不包含任何内容,请稍后再进行访问! +bare_message=这个家伙很懒,什么都没有推送。 code=代码 +code.desc=代码是访问代码的单元 branch=分支 tree=目录树 filter_branch_and_tag=过滤分支或标签 @@ -471,12 +537,13 @@ file_permalink=永久链接 file_too_large=文件过大导致无法显示 video_not_supported_in_browser=您的浏览器不支持使用 HTML5 播放视频。 stored_lfs=存储到Git LFS +commit_graph=提交图 editor.new_file=新的文件 editor.upload_file=上传文件 editor.edit_file=编辑文件 editor.preview_changes=预览变更 -editor.cannot_edit_non_text_files=无法编辑非文本文件 +editor.cannot_edit_non_text_files=不能从 web 界面编辑二进制文件 editor.edit_this_file=编辑此文件 editor.must_be_on_a_branch=您必须在某个分支上才能对此文件进行修改操作 editor.fork_before_edit=您必须派生此仓库才能对此文件进行修改操作 @@ -510,17 +577,25 @@ editor.fail_to_update_file=更新/创建文件 '%s' 时发生错误:%v editor.add_subdir=添加子目录... editor.unable_to_upload_files=上传文件至 '%s' 时发生错误:%v editor.upload_files_to_dir=上传文件至 '%s' +editor.cannot_commit_to_protected_branch=不可以提交到受保护的分支 '%s'。 +commits.desc=提交显示代码的更改历史记录 commits.commits=次代码提交 commits.search=搜索提交历史 -commits.search_all=所有 -commits.find=查找 +commits.find=搜索 +commits.search_all=所有分支 commits.author=作者 commits.message=备注 commits.date=提交日期 commits.older=更旧的提交 commits.newer=更新的提交 +commits.signed_by=签署人: +commits.gpg_key_id=GPG 密钥 ID +ext_issues=外部工单 +ext_issues.desc=外部工单连接到一个外部工单管理系统 + +issues.desc=工单是管理任务和 bug的地方 issues.new=创建工单 issues.new.labels=标签 issues.new.no_label=未选择标签 @@ -542,11 +617,12 @@ issues.label_templates.info=此仓库还未创建任何标签,您可以通过 issues.label_templates.helper=选择标签模板 issues.label_templates.use=加载标签模板 issues.label_templates.fail_to_load_file=加载标签模板文件 '%s' 时发生错误:%v -issues.add_label_at=` %[4]s 添加了标签
%s
label %s` -issues.remove_label_at=` %[4]s 删除了标签
%s
label %s` +issues.add_label_at=` %[4]s 添加了标签
%s
label %s` +issues.remove_label_at=` %[4]s 删除了标签
%s
label %s` issues.add_milestone_at=` %[2]s 添加了里程碑 %[1]s` issues.change_milestone_at=`%[3]s 修改了里程碑从 %[1]s%[2]s` issues.remove_milestone_at=`%[2]s 删除了里程碑 %[1]s` +issues.deleted_milestone= (已删除) issues.self_assign_at=`于 %s 指派给自己` issues.add_assignee_at=`于 %[2]s 被 %[1]s 指派` issues.remove_assignee_at=`于 %s 取消了指派` @@ -572,6 +648,13 @@ issues.filter_sort.recentupdate=最近更新 issues.filter_sort.leastupdate=最少更新 issues.filter_sort.mostcomment=最多评论 issues.filter_sort.leastcomment=最少评论 +issues.action_open=开启 +issues.action_close=关闭 +issues.action_label=标签 +issues.action_milestone=里程碑 +issues.action_milestone_no_select=无里程碑 +issues.action_assignee=指派人筛选 +issues.action_assignee_no_select=未指派 issues.opened_by=由 %[3]s 于 %[1]s创建 issues.opened_by_fake=由 %[2]s 于 %[1]s创建 issues.previous=上一页 @@ -605,14 +688,19 @@ issues.label_edit=编辑 issues.label_delete=删除 issues.label_modify=修改标签 issues.label_deletion=删除标签操作 -issues.label_deletion_desc=删除该标签将会移除所有工单中相关的信息。是否继续? -issues.label_deletion_success=标签删除成功! +issues.label_deletion_desc=删除此标签会将会把它从所有的工单中删除。你确定要继续吗? +issues.label_deletion_success=标签已被成功删除 ! issues.label.filter_sort.alphabetically=按字母顺序排序 issues.label.filter_sort.reverse_alphabetically=按字母逆序排序 +issues.label.filter_sort.by_size=大小 +issues.label.filter_sort.reverse_by_size=从大到小 issues.num_participants=%d 名参与者 issues.attachment.open_tab=`在新的标签页中查看 '%s'` issues.attachment.download=`点击下载 '%s'` +issues.subscribe=订阅 +issues.unsubscribe=取消订阅 +pulls.desc=合并请求管理您的代码审查和合并请求 pulls.new=创建合并请求 pulls.compare_changes=对比文件变化 pulls.compare_changes_desc=对比两个分支间的文件变化并发起一个合并请求。 @@ -628,7 +716,7 @@ pulls.merged_title_desc=于 %[4]s 将 %[1]d 次代码提交从 %[2]s"%s"
,请三思而后行。 +wiki.delete_page_notice_1=此操作将删除页面 "%s"。请确保您想要删除此页。 wiki.page_already_exists=相同名称的 Wiki 页面已经存在。 wiki.pages=所有页面 wiki.last_updated=最后更新于 %s settings=仓库设置 +settings.desc=设置是你可以管理仓库设置的地方 settings.options=基本设置 settings.collaboration=管理协作者 settings.collaboration.admin=管理权限 @@ -699,7 +792,7 @@ settings.githooks=管理 Git 钩子 settings.basic_settings=基本设置 settings.mirror_settings=镜像设置 settings.sync_mirror=立即同步 -settings.mirror_sync_in_progress=镜像同步请求已经生效,请稍后刷新页面。 +settings.mirror_sync_in_progress=正在进行镜像同步。请稍后刷新此页面检查。 settings.site=官方网站 settings.update_settings=更新仓库设置 settings.advanced_settings=高级设置 @@ -707,11 +800,13 @@ settings.wiki_desc=启用 Wiki 系统 settings.use_internal_wiki=使用内置 Wiki 系统 settings.use_external_wiki=使用外部 Wiki settings.external_wiki_url=外部 Wiki 链接 +settings.external_wiki_url_error=外部的 Wiki URL 无效 settings.external_wiki_url_desc=当访问者单击分页标签时,将会被重定向到该链接。 settings.issues_desc=启用工单管理系统 settings.use_internal_issue_tracker=使用内置的轻量级工单管理系统 settings.use_external_issue_tracker=使用外部的工单管理系统 settings.external_tracker_url=外部工单系统 URL +settings.external_tracker_url_error=外部工单系统链接无效 settings.external_tracker_url_desc=当访问者单击分页标签时,将会被重定向到该链接。 settings.tracker_url_format=外部工单管理系统的 URL 格式 settings.tracker_issue_style=外部工单管理系统命名风格: @@ -725,11 +820,11 @@ settings.convert=转换为普通仓库 settings.convert_desc=您可以将该镜像仓库转换为普通仓库,且此操作不可逆。 settings.convert_notices_1=- 该操作会将该镜像仓库转换为普通仓库,且操作不可逆。 settings.convert_confirm=确认转换 -settings.convert_succeed=转换为普通仓库类型成功! +settings.convert_succeed=此仓库已经转换为普通仓库。 settings.transfer=转移仓库所有权 settings.transfer_desc=您可以将仓库转移至您拥有管理员权限的帐户或组织。 -settings.transfer_notices_1=- 如果您将仓库转移给个人用户,您将会丢失操作权限。 -settings.transfer_notices_2=- 如果您将仓库转移给您是所有者的组织,您的操作权限将被保留。 +settings.transfer_notices_1=- 如果新拥有者是个人,你将无法再访问。 +settings.transfer_notices_2=- 如果新拥有者是组织,你将成为组织的拥有者之一 settings.transfer_form_title=请输入以下信息以确认您的操作: settings.wiki_delete=清除 Wiki 数据 settings.wiki_delete_desc=清除 Wiki 数据操作不可逆转,请三思而后行。 @@ -740,11 +835,11 @@ settings.delete_desc=删除仓库操作不可逆转,请三思而后行。 settings.delete_notices_1=- 此操作 不可以 被回滚。 settings.delete_notices_2=- 此操作将永久删除该仓库,包括 Git 数据、 工单、 评论和协作者的操作权限。 settings.delete_notices_fork_1=- 删除完成后所有的派生仓库都将转换为独立的仓库。 -settings.deletion_success=仓库删除成功! -settings.update_settings_success=仓库设置更新成功! +settings.deletion_success=仓库已被删除。 +settings.update_settings_success=仓库选项已更新。 settings.transfer_owner=新拥有者 settings.make_transfer=确认转移仓库 -settings.transfer_succeed=仓库所有权转移成功! +settings.transfer_succeed=仓库所有权已转移。 settings.confirm_delete=确认删除仓库 settings.add_collaborator=增加新的协作者 settings.add_collaborator_success=成功添加新的协作者! @@ -791,7 +886,7 @@ settings.event_pull_request_desc=开启、关闭、重新开启、编辑、指 settings.event_push=推送 settings.event_push_desc=Git 仓库推送 settings.active=是否激活 -settings.active_helper=当指定事件发生时我们将会触发此 Web 钩子。 +settings.active_helper=触发勾子的事件信息将被同时发送。 settings.add_hook_success=Web 钩子添加成功! settings.update_webhook=更新 Web 钩子 settings.update_hook_success=Web 钩子更新成功! @@ -812,13 +907,28 @@ settings.key_been_used=部署密钥已经被使用! settings.key_name_used=使用相同名称的部署密钥已经存在! settings.add_key_success=新的部署密钥 '%s' 添加成功! settings.deploy_key_deletion=删除部署密钥 -settings.deploy_key_deletion_desc=删除该部署密钥会移除本仓库所以相关的操作权限。是否继续? +settings.deploy_key_deletion_desc=删除部署密钥将会拒绝使用此密钥的访问,你确定继续吗? settings.deploy_key_deletion_success=删除部署密钥成功! +settings.branches=分支列表 +settings.protected_branch=分支保护 +settings.protected_branch_can_push=允许推吗? +settings.protected_branch_can_push_yes=你可以推 +settings.protected_branch_can_push_no=你不能推 +settings.add_protected_branch=启用保护 +settings.delete_protected_branch=禁用保护 +settings.add_protected_branch_success=%s 成功锁定 +settings.add_protected_branch_failed=%s 锁定失败 +settings.remove_protected_branch_success=%s 成功解锁 +settings.protected_branch_deletion=若要删除一个受保护的分支 +settings.protected_branch_deletion_desc=具有写权限的任何人都将能够直接推向这个分支。是否确定? +settings.default_branch_desc=默认分支被认为是仓库中的"基础"分支,如果不特别指定所有的合并请求和代码提交默认提交到这个分支。 +settings.choose_branch=选择一个分支... +settings.no_protected_branch=没有受保护的分支 diff.browse_source=浏览代码 diff.parent=父节点 diff.commit=当前提交 -diff.data_not_available=暂无可用数据 +diff.data_not_available=比较内容不可用 diff.show_diff_stats=显示文件统计 diff.show_split_view=分列视图 diff.show_unified_view=合并视图 @@ -828,6 +938,7 @@ diff.view_file=查看文件 diff.file_suppressed=文件差异内容过多而无法显示 diff.too_many_files=部分文件因为文件数量过多而无法显示 +releases.desc=版本发布是管理发布的版本的地方 release.releases=版本发布 release.new_release=发布新版 release.draft=草稿 @@ -836,7 +947,7 @@ release.stable=稳定 release.edit=编辑 release.ahead=在该版本发布之后已有 %d 次代码提交到 %s 分支 release.source_code=源代码 -release.new_subheader=发布版本对产品进行迭代。 +release.new_subheader=发布版本来跟踪项目版本。 release.edit_subheader=详细的变更日志可以帮助用户更好地了解产品做了哪些改进。 release.tag_name=标签名称 release.target=目标分支 @@ -855,16 +966,16 @@ release.edit_release=编辑发布信息 release.delete_release=删除此次发布 release.deletion=删除版本发布操作 release.deletion_desc=删除该版本发布将会移除相应的 Git 标签。是否继续? -release.deletion_success=版本发布删除成功! +release.deletion_success=Release已被删除。 release.tag_name_already_exist=已经存在使用相同标签进行发布的版本。 release.tag_name_invalid=标签名称不是有效的名称。 release.downloads=下载附件 branch.delete=删除分支 %s -branch.delete_desc=请注意,一旦分支被删除,无法恢复。 +branch.delete_desc=删除一个分支是永久性的,无法撤消。 branch.delete_notices_1=- 此操作 不可以 被回滚。 branch.delete_notices_2=- 该操作会永久删除%s分支的所有东西 -branch.deletion_success=%s 已经成功被删除! +branch.deletion_success=%s 已被删除。 branch.deletion_failed=删除分支 %s 失败。 branch.delete_branch_has_new_commits=因为合并之后有新的提交,%s 无法被删除 @@ -885,7 +996,8 @@ team_name=团队名称 team_desc=团队描述 team_name_helper=您可以使用该名称来通知该组全体成员。 team_desc_helper=一句话描述这个团队是做什么的。 -team_permission_desc=请选择该团队所具有的权限等级: +team_permission_desc=此团队应该拥有什么权限? +team_unit_desc=这个团队应该可访问哪些仓库单元? form.name_reserved=组织名称 '%s' 是被保留的。 form.name_pattern_not_allowed=组织名称不允许 '%s' 的格式。 @@ -897,9 +1009,9 @@ settings.full_name=组织全名 settings.website=官方网站 settings.location=所在地区 settings.update_settings=更新组织设置 -settings.update_setting_success=组织设置更新成功! +settings.update_setting_success=组织设置已更新。 settings.change_orgname_prompt=该操作将会影响到所有与该组织有关的链接 -settings.update_avatar_success=组织头像更新成功! +settings.update_avatar_success=组织头像已经更新。 settings.delete=删除组织 settings.delete_account=删除当前组织 settings.delete_prompt=删除操作会永久清除该组织的信息,并且 不可恢复! @@ -926,7 +1038,7 @@ teams.leave=离开团队 teams.read_access=读取权限 teams.read_access_helper=这个团队将拥有查看和克隆所属仓库的权限。 teams.write_access=写入权限 -teams.write_access_helper=这个团队将拥有查看、克隆和推送所属仓库的权限。 +teams.write_access_helper=这个团队将拥有查看和克隆所属仓库的权限。 teams.admin_access=管理权限 teams.admin_access_helper=这个团队将拥有查看、克隆、推送和添加其他组织成员到团队的权限。 teams.no_desc=该团队暂无描述 @@ -938,7 +1050,7 @@ teams.delete_team=删除当前团队 teams.add_team_member=添加团队成员 teams.delete_team_title=团队删除操作 teams.delete_team_desc=删除操作会永久清除有关该团队的信息,您确定要继续操作吗?团队成员可能会失去对某些仓库的操作权限。 -teams.delete_team_success=指定团队删除成功! +teams.delete_team_success=该团队已被删除。 teams.read_permission_desc=该团队拥有对所属仓库的 读取 权限,团队成员可以进行查看和克隆等只读操作。 teams.write_permission_desc=该团队拥有对所属仓库的 读取写入 的权限。 teams.admin_permission_desc=该团队拥有一定的 管理 权限,团队成员可以读取、克隆、推送以及添加其它仓库协作者。 @@ -968,23 +1080,24 @@ dashboard.statistic_info=Gitea 数据库统计:%d 位用户,%d dashboard.operation_name=操作名称 dashboard.operation_switch=开关 dashboard.operation_run=执行 -dashboard.clean_unbind_oauth=清理未绑定社交帐号 -dashboard.clean_unbind_oauth_success=所有未绑定社交数据清除成功! +dashboard.clean_unbind_oauth=清理未绑定的 OAuth 连接 +dashboard.clean_unbind_oauth_success=所有未绑定的 OAuth 连接已被删除。 dashboard.delete_inactivate_accounts=删除所有未激活帐户 dashboard.delete_inactivate_accounts_success=所有未激活帐号清除成功! dashboard.delete_repo_archives=删除所有仓库存档 dashboard.delete_repo_archives_success=所有仓库存档清除成功! dashboard.delete_missing_repos=删除所有丢失 Git 文件的仓库记录 -dashboard.delete_missing_repos_success=所有丢失 Git 文件的仓库记录删除成功! +dashboard.delete_missing_repos_success=已失去其对应的 Git 文件的所有仓库已被删除。 dashboard.git_gc_repos=对仓库进行垃圾回收 -dashboard.git_gc_repos_success=所有仓库垃圾回收成功! -dashboard.resync_all_sshkeys=重新生成 '.ssh/authorized_keys' 文件(警告:不是 Gitea 的密钥也会被删除) -dashboard.resync_all_sshkeys_success=所有公钥重新生成成功! -dashboard.resync_all_update_hooks=重新生成所有仓库的 Update 钩子(用于自定义配置文件被修改) -dashboard.resync_all_update_hooks_success=所有仓库的 Update 钩子重新生成成功! -dashboard.reinit_missing_repos=重新初始化所有丢失 Git 文件的仓库 -dashboard.reinit_missing_repos_success=所有丢失 Git 文件的仓库重新初始化成功! - +dashboard.git_gc_repos_success=所有仓库已完成执行垃圾回收。 +dashboard.resync_all_sshkeys=重写 '.ssh/authorized_keys ' 文件 (仅作用于 Gitea SSH 密钥) +dashboard.resync_all_sshkeys_success=所有的公共密钥已重写。 +dashboard.resync_all_hooks=重新同步所有仓库的 pre-receive、update 和 post-receive 钩子 +dashboard.resync_all_hooks_success=所有仓库的 pre-receive、update 和 post-receive 钩子重新同步成功! +dashboard.reinit_missing_repos=重新初始化所有丢失的 Git 仓库存在的记录 +dashboard.reinit_missing_repos_success=所有丢失的 Git 仓库存在的记录已经被重新初始化。 +dashboard.sync_external_users=同步外部用户数据 +dashboard.sync_external_users_started=外部用户同步已开始 dashboard.server_uptime=服务运行时间 dashboard.current_goroutine=当前 Goroutines 数量 dashboard.current_memory_usage=当前内存使用量 @@ -1025,46 +1138,49 @@ users.created=创建时间 users.last_login=最后登陆 users.never_login=从未登录 users.send_register_notify=向用户发送注册通知邮件 -users.new_success=新的用户 '%s' 创建成功! +users.new_success=帐户 '%s' 已被创建。 users.edit=编辑 users.auth_source=认证源 users.local=本地 users.auth_login_name=认证登录名称 users.password_helper=将值留空使其保持不变。 -users.update_profile_success=该用户信息更新成功! +users.update_profile_success=账号信息已被更新。 users.edit_account=编辑用户信息 users.max_repo_creation=最大允许创建仓库数量 users.max_repo_creation_desc=(设置为 -1 表示使用全局默认值) -users.is_activated=该用户已被激活 -users.prohibit_login=该帐户被禁止登录 +users.is_activated=此帐户已完成激活 +users.prohibit_login=此帐户被阻止登录 users.is_admin=该用户具有管理员权限 users.allow_git_hook=该用户具有创建 Git 钩子的权限 users.allow_import_local=该用户具有导入本地仓库的权限 users.allow_create_organization=此账号有权限创建组织 users.update_profile=更新用户信息 users.delete_account=删除该用户 -users.still_own_repo=该帐户仍然是某些仓库的拥有者,您必须先转移或删除它们才能执行删除帐户操作! +users.still_own_repo=此帐户仍拥有至少一个仓库,您需要先删除或转移它们。 users.still_has_org=该帐户仍旧是某些组织的成员,您必须先使其离开或删除组织。 users.deletion_success=用户删除成功! -orgs.org_manage_panel=组织管理面板 +orgs.org_manage_panel=组织管理 orgs.name=组织名称 orgs.teams=团队数 orgs.members=成员数 +orgs.new_orga=创建组织 -repos.repo_manage_panel=仓库管理界面 +repos.repo_manage_panel=仓库管理 repos.owner=所有者 repos.name=仓库名称 repos.private=私有库 repos.watches=关注数 repos.stars=点赞数 repos.issues=工单数 +repos.size=大小 -auths.auth_manage_panel=认证管理面板 +auths.auth_manage_panel=认证管理 auths.new=添加新的源 auths.name=认证名称 auths.type=认证类型 auths.enabled=已启用 +auths.syncenabled=启用用户同步 auths.updated=最后更新时间 auths.auth_type=认证类型 auths.auth_name=认证名称 @@ -1094,15 +1210,35 @@ auths.allowed_domains_helper=将值留空表示不对域名做任何限制。多 auths.enable_tls=启用 TLS 加密 auths.skip_tls_verify=忽略 TLS 验证 auths.pam_service_name=PAM 服务名称 +auths.oauth2_provider=OAuth2 提供程序 +auths.oauth2_clientID=客户端 ID (键) +auths.oauth2_clientSecret=客户端密钥 +auths.openIdConnectAutoDiscoveryURL=OpenID 连接自动发现 URL +auths.oauth2_use_custom_url=使用自定义的 URL 而不是默认的 URL +auths.oauth2_tokenURL=令牌的 URL +auths.oauth2_authURL=授权的 URL +auths.oauth2_profileURL=配置文件的 URL +auths.oauth2_emailURL=电子邮件 URL auths.enable_auto_register=允许授权用户自动注册 auths.tips=帮助提示 +auths.tips.oauth2.general=OAuth2 身份验证 +auths.tips.oauth2.general.tip=当注册一个新的 OAuth2 认证,回调/重定向 URL 应该是: /user/oauth2//callback +auths.tip.oauth2_provider=OAuth2 提供程序 +auths.tip.bitbucket=注册新的 OAuth 消费者 https://bitbucket.org/account/user//oauth-consumers/new 同时添加权限"帐户"-"读 +auths.tip.dropbox=在 https://www.dropbox.com/developers/apps 上创建一个新的应用程序 +auths.tip.facebook=在 https://developers.facebook.com/apps 注册一个新的应用,并添加产品"Facebook 登录 +auths.tip.github=在 https://github.com/settings/applications/new 注册一个 OAuth 应用程序 +auths.tip.gitlab=在 https://github.com/settings/applications/new 注册一个 OAuth 应用程序 +auths.tip.google_plus=从谷歌 API 控制台 (https://console.developers.google.com/) 获得 OAuth2 客户端凭据 +auths.tip.openid_connect=使用 OpenID 连接发现 URL (/.well-known/openid-configuration) 来指定终点 +auths.tip.twitter=访问 https://dev.twitter.com/apps,创建应用程序并确保启用了"允许此应用程序用于登录 Twitter"选项。 auths.edit=编辑认证设置 auths.activated=该授权认证已经启用 -auths.new_success=新的授权源 "%s" 添加成功! -auths.update_success=认证设置更新成功! +auths.new_success=已添加身份验证 '%s'。 +auths.update_success=身份验证设置已更新。 auths.update=更新认证设置 -auths.delete=删除该认证 -auths.delete_auth_title=删除认证操作 +auths.delete=删除此验证来源 +auths.delete_auth_title=删除身份验证源 auths.delete_auth_desc=该认证将被删除。是否继续? auths.still_in_used=此认证仍旧与一些用户有关联,请先删除或者将这些用户转换为其它登录类型。 auths.deletion_success=授权源删除成功! @@ -1112,6 +1248,7 @@ config.server_config=服务器配置 config.app_name=应用名称 config.app_ver=应用版本 config.app_url=应用 URL +config.custom_conf=配置文件路径 config.domain=应用域名 config.offline_mode=离线模式 config.disable_router_log=关闭路由日志 @@ -1127,7 +1264,7 @@ config.reverse_auth_user=反向代理认证 config.ssh_config=SSH 配置 config.ssh_enabled=启用服务 -config.ssh_start_builtin_server=启用内置服务 +config.ssh_start_builtin_server=启动内置服务 config.ssh_domain=域名 config.ssh_port=端口 config.ssh_listen_port=监听端口 @@ -1150,20 +1287,23 @@ config.db_path_helper=(用于 "sqlite3" 和 "tidb") config.service_config=服务配置 config.register_email_confirm=注册邮件确认 config.disable_register=关闭注册功能 +config.enable_openid_signup=启用通过 OpenID 注册 +config.enable_openid_signin=启用 OpenID 登录 config.show_registration_button=显示注册按钮 config.require_sign_in_view=强制登录浏览 config.mail_notify=邮件通知提醒 config.disable_key_size_check=禁用密钥最小长度检查 config.enable_captcha=启用验证码服务 config.active_code_lives=激活用户链接有效期 -config.reset_password_code_lives=重置密码链接有效期 +config.reset_password_code_lives=重置密码验证码到期时间 config.default_keep_email_private=隐藏邮箱地址的默认值 +config.default_allow_create_organization=创建组织的默认权限 config.no_reply_address=不可回邮地址 config.webhook_config=Web 钩子配置 config.queue_length=队列长度 config.deliver_timeout=推送超时 -config.skip_tls_verify=忽略 TLS 验证 +config.skip_tls_verify=跳过 TLS 验证 config.mailer_config=邮件配置 config.mailer_enabled=启用服务 @@ -1236,12 +1376,12 @@ notices.type=提示类型 notices.type_1=仓库 notices.desc=描述 notices.op=操作 -notices.delete_success=系统提示删除成功! +notices.delete_success=系统通知已被删除。 [action] -create_repo=`创建了仓库 %s` -rename_repo=`重命名仓库 %[1]s%[3]s` -commit_repo=`推送了 %[3]s 分支的代码到 %[4]s` +create_repo=创建了仓库 %s +rename_repo=重命名仓库 %[1]s%[3]s +commit_repo=推送了 %[3]s 分支的代码到 %[4]s create_issue=`创建了工单 %s#%[2]s` close_issue=`关闭了工单 %s#%[2]s` reopen_issue=`重新开启了工单 %s#%[2]s` @@ -1252,31 +1392,32 @@ comment_issue=`评论了工单 %s#%[2]s` merge_pull_request=`合并了合并请求 %s#%[2]s` transfer_repo=将仓库 %s 转移至 %s push_tag=推送了标签 %[2]s%[3]s -compare_commits=对比 %d 次代码提交 +compare_commits=比较 %d 提交 [tool] -ago=之前 -from_now=之后 +ago=%s前 +from_now=%s 之后 now=现在 -1s=1 秒%s -1m=1 分钟%s -1h=1 小时%s -1d=1 天%s -1w=1 周%s -1mon=1 月%s -1y=1 年%s -seconds=%d 秒%s -minutes=%d 分钟%s -hours=%d 小时%s -days=%d 天%s -weeks=%d 周%s -months=%d 月%s -years=%d 年%s +future=将来 +1s=1 秒 +1m=1分钟 +1h=1 小时 +1d=1 天 +1w=1周 +1mon=1 个月 +1y=1年 +seconds=%d 秒 +minutes=%d 分钟 +hours=%d 小时 +days=%d 天 +weeks=%d 周 +months=%d 个月 +years=%d 年 raw_seconds=秒 raw_minutes=分钟 [dropzone] -default_message=拖曳文件到此处或单击上传 +default_message=拖动文件或者点击上传。 invalid_input_type=您不能上传该类型的文件 file_too_big=文件体积({{filesize}} MB)超过了最大允许体积({{maxFilesize}} MB) remove_file=移除文件 @@ -1285,9 +1426,21 @@ remove_file=移除文件 notifications=通知 unread=未读消息 read=已读消息 -no_unread=您目前没有未读消息。 -no_read=您目前没有已读消息。 -pin=钉上 +no_unread=您没有任何未读的通知。 +no_read=您没有任何已读的通知。 +pin=Pin 通知 mark_as_read=标记为已读 mark_as_unread=标记为未读 +[gpg] +error.extract_sign=无法提取签名 +error.generate_hash=无法生成提交的哈希 +error.no_committer_account=没有帐户链接到提交者的电子邮件 +error.no_gpg_keys_found=找不到此签名对应的密钥 +error.not_signed_commit=未签名的提交 +error.failed_retrieval_gpg_keys=找不到任何与该提交者账号相关的密钥 + +[units] +error.no_unit_allowed_repo=该存储库中找不到任何被允许访问的单元 +error.unit_not_allowed=您没有权限访问此仓库单元 + diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index bf8b569..be3c8b3 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -30,16 +30,15 @@ mirror=鏡像 new_repo=新增儲存庫 new_migrate=遷移外部儲存庫 new_mirror=新鏡像 -new_fork=新增程式庫分支 new_org=新增組織 manage_org=管理組織 admin_panel=管理面板 account_settings=帳號設定 settings=設定 your_profile=個人資料 -your_starred=個人收藏 your_settings=用戶設定 + activities=活動 pull_requests=合併請求 issues=問題 @@ -48,39 +47,29 @@ cancel=取消 [install] install=安裝頁面 -title=首次安裝步驟 -docker_helper=如果您正在使用 Docker 容器運行 Gitea,請務必先仔細閱讀 官方文檔 後再對本頁面進行填寫。 -requite_db_desc=Gitea 要求安裝 MySQL、PostgreSQL、SQLite3 或 TiDB。 db_title=資料庫設定 db_type=資料庫類型 host=主機 user=帳號 password=密碼 db_name=資料庫名稱 -db_helper=如果您使用 MySQL,請使用 INNODB 引擎以及 utf8_general_ci 字元集。 ssl_mode=SSL 模式 path=資料庫文件路徑 -sqlite_helper=SQLite3 或 TiDB 資料庫檔案路徑。
作為以服務執行時,請使用絕對路徑。 err_empty_db_path=SQLite3 或 TiDB 的資料庫路徑不能為空。 err_invalid_tidb_name=TiDB 資料庫名稱不允許包含字符 "." 或 "-" 。 no_admin_and_disable_registration=您不能夠在未建立管理員用戶的情況下禁止註冊。 err_empty_admin_password=管理員密碼不能為空。 -general_title=基本設定 app_name=應用名稱 -app_name_helper=為您的組織取個響亮而又偉大的名稱 repo_path=儲存庫的根目錄 -repo_path_helper=所有 Git 遠端儲存庫將會儲存在這個目錄之下。 run_user=執行使用者 run_user_helper=該用戶必須具有對儲存庫根目錄和執行 Gitea 的操作權限。 domain=域名 domain_helper=該設定影響 SSH 複製地址。 ssh_port=SSH 連接埠 -ssh_port_helper=您的 SSH 服務正在使用此埠號,若要禁用SSH 功能請保持欄位空白。 http_port=HTTP 連接埠 http_port_helper=應用監聽的連接埠 app_url=應用程式網址 -app_url_helper=該設定影響 HTTP/HTTPS 複製地址和一些郵箱中的連結。 log_root_path=日誌路徑 log_root_path_helper=寫入日誌檔目錄 @@ -88,14 +77,10 @@ optional_title=可選設定 email_title=電子郵件服務設定 smtp_host=SMTP 主機 smtp_from=寄件者 -smtp_from_helper=郵件來自地址,遵循 RFC 5322 標准。可以是一個單純的郵箱地址或使用 "name" 的格式。 -mailer_user=寄件者 E-mail mailer_password=發送郵件密碼 register_confirm=啟用註冊郵件確認 -mail_notify=啟用郵件通知提醒 server_service_title=伺服器和其他服務設定 offline_mode=啓用離線模式 -offline_mode_popup=在部署模式下也禁用從 CDN 獲取文件,所有的資源將從本地伺服器獲取。 disable_gravatar=禁用 Gravatar 服務 disable_gravatar_popup=禁用 Gravatar 和自定義源,僅使用由用戶上傳或默認的頭像。 federated_avatar_lookup=開啟聯合頭像查詢 @@ -106,7 +91,6 @@ enable_captcha=啟用驗證碼服務 enable_captcha_popup=要求在用戶註冊時輸入驗證碼 require_sign_in_view=啓用登錄訪問限制 require_sign_in_view_popup=只有已登錄的用戶才能夠訪問頁面,否則將只能看到登錄或註冊頁面。 -admin_setting_desc=建立管理員帳號並不是必須的,因為 ID=1 的用戶將自動獲得管理員權限。 admin_title=管理員帳號設定 admin_name=管理員用戶名 admin_password=管理員密碼 @@ -114,13 +98,8 @@ confirm_password=確認密碼 admin_email=管理員郵箱 install_btn_confirm=立即安裝 test_git_failed=無法識別 'git' 命令:%v -sqlite3_not_available=您所使用的發行版本不支持 SQLite3,請從 %s 下載官方構建版,而不是 gobuild 版本。 -invalid_db_setting=資料庫設定不正確:%v invalid_repo_path=儲存庫根目錄設定不正確:%v -run_user_not_match=執行系統用戶非當前用戶:%s -> %s -save_config_failed=應用設定儲存失敗:%v invalid_admin_setting=管理員帳戶設定不正確:%v -install_success=您好!我們很高興您選擇使用 Gitea,祝您使用愉快,代碼從此無 BUG! invalid_log_root_path=日誌根目錄無效: %v [home] @@ -128,7 +107,6 @@ uname_holder=用戶名或郵箱 password_holder=密碼 switch_dashboard_context=切換控制面版用戶 my_repos=我的儲存庫 -show_more_repos=顯示更多儲存庫... collaborative_repos=參與協作的儲存庫 my_orgs=我的組織 my_mirrors=我的鏡像 @@ -142,41 +120,25 @@ repos=儲存庫 users=用戶 organizations=組織 search=搜尋 -repo_no_results=找不到符合搜尋字詞的儲存庫。 -user_no_results=找不到符合搜尋字詞的用戶。 -org_no_results=找不到符合搜尋字詞的組織。 [auth] -create_new_account=建立帳戶 register_helper_msg=已經註冊?立即登錄! -social_register_helper_msg=已經註冊?立即綁定! disable_register_prompt=對不起,註冊功能已被關閉。請聯系網站管理員。 disable_register_mail=對不起,註冊郵箱確認功能已被關閉。 remember_me=記住登錄 -forgot_password=忘記密碼 -forget_password=忘記密碼? sign_up_now=還沒帳戶?馬上註冊。 -confirmation_mail_sent_prompt=一封新的確認郵件已經被發送至 %s,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。 active_your_account=啟用您的帳戶 prohibit_login=禁止登錄 -prohibit_login_desc=您的帳戶被停用,請聯繫網站管理員。 -resent_limit_prompt=對不起,您請求發送啟用郵件過於頻繁,請等待 3 分鐘後再試! has_unconfirmed_mail=%s 您好,您有一封發送至( %s) 但未被確認的郵件。如果您未收到啟用郵件,或需要重新發送,請單擊下方的按鈕。 resend_mail=單擊此處重新發送確認郵件 -email_not_associate=您輸入的郵箱地址未被關聯到任何帳號! -send_reset_mail=單擊此處(重新)發送您的密碼重置郵件 reset_password=重置密碼 -invalid_code=對不起,您的確認代碼已過期或已失效。 reset_password_helper=單擊此處重置密碼 password_too_short=密碼長度不能少於 %d 位! -non_local_account=非本地帳戶無法通過 Gitea 修改密碼。 [mail] activate_account=請啟用您的帳戶 activate_email=請驗證您的郵箱地址 reset_password=重置密碼 -register_success=註冊成功,歡迎使用 -register_notify=歡迎使用 [modal] yes=確認操作 @@ -204,8 +166,6 @@ TreeName=檔案路徑 Content=內容 require_error=不能為空。 -alpha_dash_error=必須為英文字母、阿拉伯數字或橫線(-_)。 -alpha_dash_dot_error=必須為英文字母、阿拉伯數字、橫線(-_)或點。 size_error=長度必須為 %s。 min_size_error=長度最小為 %s 個字符。 max_size_error=長度最大為 %s 個字符。 @@ -213,28 +173,10 @@ email_error=不是一個有效的郵箱地址。 url_error=不是一個有效的 URL。 include_error=必須包含子字符串 '%s'。 unknown_error=未知錯誤: -captcha_incorrect=驗證碼未匹配。 -password_not_match=密碼與確認密碼未匹配。 -username_been_taken=用戶名已經被佔用。 -repo_name_been_taken=儲存庫名稱已經被佔用。 -org_name_been_taken=組織名稱已經被佔用。 -team_name_been_taken=團隊名稱已經被佔用。 -email_been_used=郵箱地址已經被使用。 -username_password_incorrect=用戶名或密碼不正確。 -enterred_invalid_repo_name=請檢查您輸入的儲存庫名稱是正確。 -enterred_invalid_owner_name=請檢查您輸入的新所有者用戶名是否正確。 -enterred_invalid_password=請檢查您輸入的密碼是否正確。 -user_not_exist=被操作的用戶不存在! -last_org_owner=被移除用戶為最後一位管理員。請新增一位新的管理員再進行移除成員操作! -invalid_ssh_key=很抱歉,我們無法驗證您輸入的 SSH 金鑰:%s -unable_verify_ssh_key=Gitea 無法驗證您輸入的 SSH 金鑰,但我們假設那是有效的金鑰,請您自行確保其有效性! auth_failed=授權驗證失敗:%v -still_own_repo=您的帳戶仍然是某些儲存庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作! -still_has_org=您的帳戶仍舊是某些組織的成員,您必須先離開或刪除組織。 -org_still_own_repo=該組織仍然是某些儲存庫的擁有者,您必須先轉移或刪除它們才能執行刪除組織操作! target_branch_not_exist=目標分支不存在 @@ -249,14 +191,11 @@ following=關註中 follow=關注 unfollow=取消關注 -form.name_reserved=用戶名 '%s' 是被保留的。 -form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。 [settings] profile=個人訊息 password=修改密碼 avatar=頭像 -ssh_keys=管理 SSH 金鑰 social=社交帳號綁定 applications=管理授權應用 orgs=管理組織 @@ -264,15 +203,11 @@ delete=刪除帳戶 uid=用戶 ID public_profile=公開訊息 -profile_desc=您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。 -password_username_disabled=不允許非本地類型使用者更改他們的使用者名。 full_name=自定義名稱 website=個人網站 location=所在地區 update_profile=更新訊息 -update_profile_success=您的個人訊息更新成功! change_username=用戶名將被修改 -change_username_prompt=該操作將會影響到所有與您帳戶有關的鏈接 continue=繼續操作 cancel=取消操作 @@ -283,15 +218,11 @@ choose_new_avatar=選擇新的頭像 update_avatar=更新頭像設定 delete_current_avatar=刪除當前頭像 uploaded_avatar_not_a_image=上傳的文件不是一張圖片! -update_avatar_success=您的頭像設定更新成功! change_password=修改密碼 old_password=當前密碼 new_password=新的密碼 retype_new_password=重新輸入新的密碼 -password_incorrect=當前密碼不正確! -change_password_success=密碼修改成功!您現在可以使用新的密碼登錄。 -password_change_disabled=不允許非本地類型使用者,更改其密碼。 emails=電子郵件地址 manage_emails=管理電子郵件地址 @@ -299,70 +230,50 @@ email_desc=您的主要邮箱地址将被用于通知提醒和其它操作。 primary=主要 primary_email=设为主要 delete_email=刪除 -email_deletion=刪除郵箱 -email_deletion_desc=刪除該郵箱地址將會移除所有相關的訊息。是否繼續? email_deletion_success=成功刪除郵箱! add_new_email=新增新的電子郵件地址 add_email=新增電子郵件 -add_email_confirmation_sent=一封待確認的電子郵件已發送到 '%s',請在%d 小時內檢查您的收件箱,並完成確認過程。 add_email_success=新的電子郵件新增成功。 manage_ssh_keys=管理 SSH 金鑰 add_key=增加金鑰 -ssh_desc=以下是與您帳戶所關聯的 SSH 金鑰,如果您發現有陌生的金鑰,請立即刪除它! -ssh_helper=需要幫助嗎? 請查看有關 如何生成 SSH 金鑰 的指南或 SSH 的常見問題 的疑難排解。 add_new_key=增加 SSH 金鑰 -ssh_key_been_used=公共金鑰已經被使用 -ssh_key_name_used=使用相同名稱的公共金鑰已經存在! key_name=金鑰名稱 key_content=金鑰內容 -add_key_success=新的 SSH 金鑰 '%s' 新增成功! delete_key=刪除 ssh_key_deletion=刪除 SSH 公鑰 -ssh_key_deletion_desc=刪除該 SSH 公鑰將刪除所有與您帳戶相關的訪問權限。是否繼續? -ssh_key_deletion_success=SSH 公鑰刪除成功! add_on=增加於 last_used=上次使用在 no_activity=沒有最近活動 -key_state_desc=該金鑰在 7 天內被使用過 -token_state_desc=此token在過去七天內曾經被使用過 manage_social=管理關聯社交帳戶 -social_desc=以下是與您帳戶所關聯的社交帳號,如果您發現有陌生的關聯,請立即解除綁定! unbind=解除綁定 -unbind_success=社交帳號解除綁定成功! manage_access_token=管理個人操作令牌 generate_new_token=生成新的令牌 -tokens_desc=您所產生的token將被用來存取Gitea APIs new_token_desc=目前為止,任何令牌都對您的帳戶擁有完整的操作權限。 token_name=令牌名稱 generate_token=生成令牌 -generate_token_succees=新的操作令牌生成成功!您必須立即複製到一個安全的地方,因為該令牌只會顯示一次! delete_token=删除令牌 access_token_deletion=刪除個人的連接token -access_token_deletion_desc=刪除此連接token將會刪除與相關應用程式的連結。您想要繼續嗎? -delete_token_success=您的連接token已成功刪除。請記得更新您的應用程式。 + + delete_account=刪除當前帳戶 delete_prompt=刪除操作會永久清除您的帳戶訊息,並且 不可恢復! confirm_delete_account=確認刪除帳戶 delete_account_title=帳戶刪除操作 -delete_account_desc=該帳戶將被永久性刪除,您確定要繼續操作嗎? [repo] owner=擁有者 repo_name=儲存庫名稱 -repo_name_helper=偉大的儲存庫名稱一般都較短、令人深刻並且 獨一無二 的。 visibility=可見度 visiblity_helper=該儲存庫為 私有的 -visiblity_helper_forced=網站管理員已強制要求所有新建儲存庫必須為 私有的 visiblity_fork_helper=(修改該值將會影響到所有複製儲存庫) clone_helper=不知道如何操作?訪問 帮助説明 ! fork_repo=複製儲存庫 fork_from=複製自 -fork_visiblity_helper=複製儲存庫無法修改可見性。 repo_desc=儲存庫描述 repo_lang=儲存庫語言 repo_gitignore_helper=選擇 .gitignore 主題 @@ -373,18 +284,12 @@ auto_init=使用選定的文件和模板初始化儲存庫 create_repo=建立儲存庫 default_branch=默認分支 mirror_prune=裁減 -mirror_prune_desc=當遠程追蹤的引用被刪除時本地也會同步刪除 -mirror_interval=鏡像同步周期(小時) mirror_address=鏡像地址 -mirror_address_desc=請在位址中包括必要的使用者憑據。 mirror_last_synced=上次同步 watchers=關注者 stargazers=稱讚者 forks=複製儲存庫 -form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。 -form.name_reserved=儲存庫名稱 '%s' 是被保留的。 -form.name_pattern_not_allowed=儲存庫名稱不允許 '%s' 的格式。 need_auth=需要授權驗證 migrate_type=遷移類型 @@ -411,9 +316,6 @@ fork=複製 no_desc=暫無描述 quick_guide=快速幫助 clone_this_repo=複製當前儲存庫 -create_new_repo_command=從命令行建立一個新的儲存庫 -push_exist_repo=從命令行推送已經建立的儲存庫 -repo_is_empty=這儲存庫不包含任何內容,請稍後再訪問! code=程式碼 branch=分支 @@ -437,7 +339,6 @@ editor.new_file=開新檔案 editor.upload_file=上傳檔案 editor.edit_file=編輯文件 editor.preview_changes=預覽更改 -editor.cannot_edit_non_text_files=不能編輯非文字檔 editor.edit_this_file=編輯此文件 editor.must_be_on_a_branch=你必須在一個分支或提出對此檔的更改 editor.fork_before_edit=你必須在編輯檔案之前備份此檔案 @@ -449,7 +350,7 @@ editor.filename_help=輸入名稱後按下 / 鍵即可新增資料夾,或將 editor.or=或 editor.cancel_lower=取消 editor.commit_changes=提交更改嗎? -editor.add_tmpl=新增 '%s/' +editor.add_tmpl=新增 %s/' editor.add=新增 '%s' editor.update=更新 '%s' editor.delete=刪除 '%s' @@ -463,7 +364,6 @@ editor.branch_already_exists='%s' 已存在於此存儲庫。 editor.directory_is_a_file='%s' 在此儲存庫中的路徑是檔案而不是目錄。 editor.filename_is_a_directory=檔案名 '%s' 是此資料庫中的現有目錄。 editor.file_editing_no_longer_exists=檔 '%s' 您正在編輯不再存在於資料庫。 -editor.file_changed_while_editing=從您開始編輯已更改檔的內容。 按一下此處 以查看什麼發生了更改或 按提交再 覆蓋這些更改。 editor.file_already_exists=帶有名稱 '%s' 的檔已經存在在這個資料庫中。 editor.no_changes_to_show=沒有可以顯示的變更。 editor.fail_to_update_file=上傳/建立檔案 '%s' 失敗, 錯誤訊息: %v @@ -473,13 +373,13 @@ editor.upload_files_to_dir=上傳檔案到 '%s' commits.commits=次程式碼提交 commits.search=搜尋提交歷史 -commits.find=查找 commits.author=作者 commits.message=備註 commits.date=提交日期 commits.older=更舊的提交 commits.newer=更新的提交 + issues.new=建立問題 issues.new.labels=標籤 issues.new.no_label=未選擇標籤 @@ -497,7 +397,6 @@ issues.new_label=建立標籤 issues.new_label_placeholder=標籤名稱... issues.create_label=建立標籤 issues.label_templates.title=載入一組預定義的標籤 -issues.label_templates.info=沒有任何標籤。你可以點選上面建立一個或按下面"新建標籤"按鈕來使用一組預定義。 issues.label_templates.helper=選擇一個標籤集 issues.label_templates.use=使用此標籤集 issues.label_templates.fail_to_load_file=載入標籤範本檔案 '%s' 失敗: %v @@ -554,8 +453,6 @@ issues.label_edit=編輯 issues.label_delete=刪除 issues.label_modify=修改標籤 issues.label_deletion=刪除標籤 -issues.label_deletion_desc=刪除該標籤將會移除所有問題中相關的訊息。是否繼續? -issues.label_deletion_success=標籤刪除成功! issues.label.filter_sort.alphabetically=按字母顺序排序 issues.label.filter_sort.reverse_alphabetically=按字母反向排序 issues.num_participants=%d 參與者 @@ -577,16 +474,12 @@ pulls.merged_title_desc=於 %[4]s 將 %[1]d 次代碼提交從 %[2]s"%s"
。請三思而後行。 wiki.page_already_exists=相同名稱的 Wiki 頁面已經存在。 wiki.pages=所有頁面 wiki.last_updated=最後更新於 %s @@ -641,7 +529,6 @@ settings.githooks=管理 Git Hooks settings.basic_settings=基本設定 settings.mirror_settings=鏡像設定 settings.sync_mirror=立即同步 -settings.mirror_sync_in_progress=鏡像同步正在進行中,請大約一分鐘後刷新頁面。 settings.site=官方網站 settings.update_settings=更新儲存庫設定 settings.advanced_settings=高級設定 @@ -662,29 +549,18 @@ settings.pulls_desc=啟用合併請求以接受社區貢獻 settings.danger_zone=危險操作區 settings.new_owner_has_same_repo=新的儲存庫擁有者已經存在同名儲存庫! settings.convert=轉換為正規儲存庫 -settings.convert_desc=您可以將此鏡像轉成正規儲存庫。此動做不可逆。 settings.convert_notices_1=這項操作將會把儲存庫鏡像轉換成一般的儲存庫,這項操作不能取消。 settings.convert_confirm=確認轉換 -settings.convert_succeed=儲存庫已成功轉換為一般類型。 settings.transfer=轉移儲存庫所有權 settings.transfer_desc=您可以將儲存庫轉移至您擁有管理員權限的帳戶或組織。 -settings.transfer_notices_1=- 如果您將儲存庫轉移給個人用戶,您將會丟失操作權限。 -settings.transfer_notices_2=- 如果您將儲存庫轉移給您是所有者的組織,您的操作權限將被保留。 -settings.transfer_form_title=請輸入以下訊息以確認您的操作: settings.wiki_delete=刪除 Wiki 資料 settings.wiki_delete_desc=請注意,一旦清除 wiki 資料便無法恢復。 settings.wiki_delete_notices_1=- 將刪除和停用 %s 的 wiki -settings.wiki_deletion_success=儲存庫 wiki 資料已成功清除。 settings.delete=刪除本儲存庫 settings.delete_desc=刪除儲存庫操作不可逆轉,請三思而後行。 settings.delete_notices_1=- 此操作 不可以 被回滾。 -settings.delete_notices_2=- 此操作將永久刪除該儲存庫,包括 Git 資料、 問題、 評論和協作者的操作權限。 -settings.delete_notices_fork_1=- 刪除後所有的複製儲存庫將會成為獨立儲存庫 -settings.deletion_success=儲存庫刪除成功! -settings.update_settings_success=儲存庫設定更新成功! settings.transfer_owner=新擁有者 settings.make_transfer=確認轉移儲存庫 -settings.transfer_succeed=儲存庫所有權轉移成功! settings.confirm_delete=確認刪除儲存庫 settings.add_collaborator=增加新的協作者 settings.add_collaborator_success=成功建立新的協作者! @@ -696,13 +572,10 @@ settings.search_user_placeholder=搜尋用戶... settings.org_not_allowed_to_be_collaborator=組織不允許被加為協同者。 settings.user_is_org_member=被操作的用戶是組織成員,因此無法新增為協作者! settings.add_webhook=建立 Webhook -settings.hooks_desc=Webhook 允許您設定在 Gitea 上發生指定事件時對指定 URL 發送 POST 通知。查看 Webhooks 文檔 獲取更多訊息。 settings.webhook_deletion=刪除 Webhook -settings.webhook_deletion_desc=刪除該 Webhook 將會刪除與其有關的訊息和推送歷史。是否繼續? settings.webhook_deletion_success=Webhook 刪除成功! settings.webhook.test_delivery=測試推送 settings.webhook.test_delivery_desc=生成並推送一個模擬的 Push 事件 -settings.webhook.test_delivery_success=測試推送已經加入到隊列,請耐心等待數秒再刷新推送記錄。 settings.webhook.request=請求內容 settings.webhook.response=響應內容 settings.webhook.headers=標題 @@ -713,7 +586,6 @@ settings.githook_edit_desc=如果 Hook 未啟動,則會顯示樣例文件中 settings.githook_name=Hook 名稱 settings.githook_content=Hook 內容 settings.update_githook=更新 Hook 設定 -settings.add_webhook_desc=我們會通過 POST 請求將訂閱事件訊息發送至向指定 URL 地址。您可以設定不同的資料接收方式(JSON 或 x-www-form-urlencoded)。 請查閱 Webhooks 指南. settings.payload_url=推送地址 settings.content_type=資料格式 settings.secret=金鑰文本 @@ -731,7 +603,6 @@ settings.event_pull_request_desc=請求打開,關閉,重新打開,編輯 settings.event_push=推送 settings.event_push_desc=Git 儲存庫推送 settings.active=是否啟用 -settings.active_helper=當指定事件發生時我們將會觸發此 Webhook 。 settings.add_hook_success=Webhook 新增成功! settings.update_webhook=更新 Webhook settings.update_hook_success=Webhook 更新成功! @@ -752,13 +623,10 @@ settings.key_been_used=部署金鑰已經被使用! settings.key_name_used=使用相同名稱的部署金鑰已經存在! settings.add_key_success=成功新增部署金鑰 '%s'! settings.deploy_key_deletion=刪除部署金鑰 -settings.deploy_key_deletion_desc=刪除該部署金鑰會移除本儲存庫所有相關的操作權限。是否繼續? -settings.deploy_key_deletion_success=刪除部署金鑰成功! diff.browse_source=瀏覽代碼 diff.parent=父節點 diff.commit=當前提交 -diff.data_not_available=暫無可用資料 diff.show_diff_stats=顯示文件統計 diff.show_split_view=分割檢視 diff.show_unified_view=統一視圖 @@ -776,11 +644,8 @@ release.stable=穩定 release.edit=編輯 release.ahead=在該版本發佈之後已有 %d 次程式碼提交到 %s 分支 release.source_code=程式碼 -release.new_subheader=發佈版本對產品進行迭代。 -release.edit_subheader=詳細的變更記錄可以幫助用戶更好地了解產品做了哪些改進。 release.tag_name=標籤名稱 release.target=目標分支 -release.tag_helper=選擇或建立一個已存在的標籤 release.title=標題 release.content=內容 release.write=內容編輯 @@ -794,8 +659,6 @@ release.save_draft=儲存草稿 release.edit_release=編輯發佈訊息 release.delete_release=刪除此次發佈 release.deletion=刪除版本發佈操作 -release.deletion_desc=刪除該版本發佈將會移除相應的 Git 標籤。是否繼續? -release.deletion_success=版本發佈刪除成功! release.tag_name_already_exist=已經存在使用相同標籤的發佈版本。 release.tag_name_invalid=標記名稱不是有效的。 release.downloads=下載附件 @@ -816,9 +679,6 @@ create_new_team=建立新的團隊 org_desc=組織描述 team_name=團隊名稱 team_desc=團隊描述 -team_name_helper=您可以使用該名稱來通知改組全體成員。 -team_desc_helper=一句話描述這個團隊是做什麼的。 -team_permission_desc=請選擇該團隊所具有的權限等級: form.name_reserved=組織名稱 '%s' 是被保留的。 form.name_pattern_not_allowed=組織名稱不允許 '%s' 的格式。 @@ -829,16 +689,11 @@ settings.full_name=組織全名 settings.website=官方網站 settings.location=所在地區 settings.update_settings=更新組織設定 -settings.update_setting_success=組織設定更新成功! -settings.change_orgname_prompt=該操作將會影響到所有與該組織有關的鏈接 -settings.update_avatar_success=組織頭像更新成功! settings.delete=刪除組織 settings.delete_account=刪除當前組織 settings.delete_prompt=刪除操作會永久清除該組織的訊息,並且 不可恢復! settings.confirm_delete_account=確認刪除組織 settings.delete_org_title=組織刪除操作 -settings.delete_org_desc=該組織將被永久性刪除,您確定要繼續操作嗎? -settings.hooks_desc=在此處新增的 Webhook 將會應用到該組織下的 所有儲存庫。 members.membership_visibility=成員可見性: members.public=公開成員 @@ -858,9 +713,7 @@ teams.leave=離開團隊 teams.read_access=讀取權限 teams.read_access_helper=這個團隊將擁有查看和複製所屬儲存庫的權限。 teams.write_access=寫入權限 -teams.write_access_helper=這個團隊將擁有查看、複製和推送所屬儲存庫的權限。 teams.admin_access=管理權限 -teams.admin_access_helper=這個團隊將擁有查看、複製、推送和建立其他組織成員到團隊的權限。 teams.no_desc=該團隊暫無描述 teams.settings=團隊設定 teams.owners_permission_desc=管理員團隊對 所有儲存庫 具有操作權限,且對組織具有 管理員權限。 @@ -869,8 +722,6 @@ teams.update_settings=更新團隊設定 teams.delete_team=刪除當前團隊 teams.add_team_member=新增團隊成員 teams.delete_team_title=團隊刪除操作 -teams.delete_team_desc=刪除操作會永久清除有關該團隊的訊息,您確定要繼續操作嗎?團隊成員可能會失去對某些儲存庫的操作權限。 -teams.delete_team_success=指定團隊刪除成功! teams.read_permission_desc=該團隊擁有對所屬儲存庫的 讀取 權限,團隊成員可以進行查看和複製等只讀操作。 teams.write_permission_desc=該團隊擁有對所屬儲存庫的 讀取寫入 的權限。 teams.admin_permission_desc=該團隊擁有一定的 管理 權限,團隊成員可以讀取、複製、推送以及新增其它儲存庫協作者。 @@ -900,23 +751,8 @@ dashboard.statistic_info=Gitea 資料庫統計:%d 位用戶,%d dashboard.operation_name=操作名稱 dashboard.operation_switch=開關 dashboard.operation_run=執行 -dashboard.clean_unbind_oauth=清理未綁定社交帳號 -dashboard.clean_unbind_oauth_success=所有未綁定社交資料清除成功! dashboard.delete_inactivate_accounts=刪除所有未啟用帳戶 -dashboard.delete_inactivate_accounts_success=所有未啟用帳號清除成功! dashboard.delete_repo_archives=刪除所有儲存庫存檔 -dashboard.delete_repo_archives_success=所有儲存庫存檔清除成功! -dashboard.delete_missing_repos=刪除所有丟失 Git 文件的儲存庫記錄 -dashboard.delete_missing_repos_success=成功刪除所有丟失 Git 文件的儲存庫記錄! -dashboard.git_gc_repos=對儲存庫進行垃圾回收 -dashboard.git_gc_repos_success=所有儲存庫的垃圾回收已成功完成! -dashboard.resync_all_sshkeys=重新生成 '.ssh/authorized_keys' 文件(警告:不是 Gitea 的金鑰也會被刪除) -dashboard.resync_all_sshkeys_success=所有公鑰重新生成成功! -dashboard.resync_all_update_hooks=重新生成所有儲存庫的 Update Hook(用於被修改的自定義設定文件) -dashboard.resync_all_update_hooks_success=已成功重新生成所有儲存庫的 Update Hook! -dashboard.reinit_missing_repos=重新初始化所有遺失 Git 檔案的儲存庫記錄 -dashboard.reinit_missing_repos_success=所有遺失 Git 檔案的儲存庫已成功重新初始化。 - dashboard.server_uptime=服務執行時間 dashboard.current_goroutine=當前 Goroutines 數量 dashboard.current_memory_usage=當前內存使用量 @@ -947,7 +783,6 @@ dashboard.total_gc_pause=垃圾收集暫停時間總量 dashboard.last_gc_pause=上次垃圾收集暫停時間 dashboard.gc_times=垃圾收集執行次數 -users.user_manage_panel=用戶管理面版 users.new_account=建立新的帳戶 users.name=用戶名 users.activated=已啟用 @@ -955,33 +790,23 @@ users.admin=管理員 users.repos=儲存庫數 users.created=建立時間 users.send_register_notify=向用戶發送註冊通知郵件 -users.new_success=新用戶 '%s' 建立成功! users.edit=編輯 users.auth_source=認證源 users.local=本地 users.auth_login_name=認證登錄名稱 users.password_helper=留空使其保持不變。 -users.update_profile_success=該用戶訊息更新成功! users.edit_account=編輯用戶訊息 users.max_repo_creation=最大儲存庫新增限制 users.max_repo_creation_desc=(設定 -1 使用全域預設限制) -users.is_activated=該用戶已被啟用 -users.prohibit_login=此帳戶禁止登錄 users.is_admin=該用戶具有管理員權限 -users.allow_git_hook=該帳戶具有建立 Git Hook 的權限 users.allow_import_local=該用戶具有導入本地儲存庫的權限 users.update_profile=更新用戶訊息 users.delete_account=刪除該用戶 -users.still_own_repo=該帳戶仍然是某些儲存庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作! -users.still_has_org=該帳戶仍舊是某些組織的成員,您必須先使其離開或刪除組織。 -users.deletion_success=用戶刪除成功! -orgs.org_manage_panel=組織管理面版 orgs.name=組織名稱 orgs.teams=團隊數 orgs.members=成員數 -repos.repo_manage_panel=儲存庫管理界面 repos.owner=所有者 repos.name=儲存庫名稱 repos.private=私有庫 @@ -989,7 +814,6 @@ repos.watches=關註數 repos.stars=讚好數 repos.issues=問題數 -auths.auth_manage_panel=認證管理面板 auths.new=新增認證來源 auths.name=認證名稱 auths.type=認證類型 @@ -1003,7 +827,6 @@ auths.host=主機地址 auths.port=主機端口 auths.bind_dn=綁定DN auths.bind_password=綁定密碼 -auths.bind_password_helper=警告:該密碼將會以明文的形式儲存在資料庫中。請不要使用擁有高權限的帳戶! auths.user_base=用戶搜尋基準 auths.attribute_username=用戶名屬性 auths.attribute_username_placeholder=留空表示使用用戶登錄時所使用的用戶名 @@ -1017,21 +840,12 @@ auths.smtp_auth=SMTP 驗證類型 auths.smtphost=SMTP 主機地址 auths.smtpport=SMTP 主機端口 auths.allowed_domains=域名白名單 -auths.allowed_domains_helper=留空表示不對域名做任何限制。多個域名之間需要使用逗號 ',' 分隔。 auths.enable_tls=啟用 TLS 加密 auths.skip_tls_verify=忽略 TLS 驗證 auths.pam_service_name=PAM 服務名稱 auths.enable_auto_register=允許授權用戶自動註冊 auths.tips=幫助提示 -auths.edit=編輯認證設定 auths.activated=該授權認證已經啟用 -auths.new_success=新的認證來源 "%s" 新增成功! -auths.update_success=認證設定更新成功! -auths.update=更新認證設定 -auths.delete=刪除該認證 -auths.delete_auth_title=刪除認證操作 -auths.delete_auth_desc=該認證將被刪除。是否繼續? -auths.still_in_used=一些使用者仍然使用此驗證方式,請先刪除或轉換這些使用者到其它登入類型。 auths.deletion_success=認證源刪除成功! config.server_config=伺服器設定 @@ -1052,7 +866,6 @@ config.reverse_auth_user=反向代理認證 config.ssh_config=SSH 設定 config.ssh_enabled=已啟用 -config.ssh_start_builtin_server=啟動內建伺服器 config.ssh_domain=網域 config.ssh_port=埠 config.ssh_listen_port=監聽埠 @@ -1081,12 +894,10 @@ config.mail_notify=郵件通知提醒 config.disable_key_size_check=禁用金鑰最小長度檢查 config.enable_captcha=啟用驗證碼服務 config.active_code_lives=啟用用戶連結有效期 -config.reset_password_code_lives=重置密碼連結有效期 config.webhook_config=Webhook 設定 config.queue_length=隊列長度 config.deliver_timeout=推送超時 -config.skip_tls_verify=忽略 TLS 驗證 config.mailer_config=郵件設定 config.mailer_enabled=啟用服務 @@ -1095,7 +906,6 @@ config.mailer_name=發送者名稱 config.mailer_host=郵件主機地址 config.mailer_user=發送者帳號 config.send_test_mail=發送測試郵件 -config.test_mail_failed=無法向 '%s' 發送測試郵件: %v config.test_mail_sent=測試電子郵件已發送到 '%s'。 config.oauth_config=社交帳號設定 @@ -1148,7 +958,6 @@ monitor.start=開始時間 monitor.execute_time=已執行時間 notices.system_notice_list=系統提示管理 -notices.view_detail_header=查看提示詳情 notices.actions=操作 notices.select_all=選取全部 notices.deselect_all=取消所有選取 @@ -1159,7 +968,6 @@ notices.type=提示類型 notices.type_1=儲存庫 notices.desc=描述 notices.op=操作 -notices.delete_success=系統提示刪除成功! [action] create_repo=建立了儲存庫 %s @@ -1175,39 +983,38 @@ comment_issue=`評論了問題 %s#%[2]s` merge_pull_request=`合併了合併請求 %s#%[2]s` transfer_repo=將儲存庫 %s 轉移至 %s push_tag=推送了標籤 %[2]s%[3]s -compare_commits=查看 %d 次提交的內容比對 [tool] -ago=之前 -from_now=之後 +ago=%s之前 +from_now=%s之後 now=現在 -1s=1 秒%s -1m=1 分鐘%s -1h=1 小時%s -1d=1 天%s -1w=1 周%s -1mon=1 月%s -1y=1 年%s -seconds=%d 秒%s -minutes=%d 分鐘%s -hours=%d 小時%s -days=%d 天%s -weeks=%d 周%s -months=%d 月%s -years=%d 年%s +1s=1 秒 +1m=1 分鐘 +1h=1 小時 +1d=1 天 +1w=1 周 +1mon=1 月 +1y=1 年 +seconds=%d 秒 +minutes=%d 分鐘 +hours=%d 小時 +days=%d 天 +weeks=%d 周 +months=%d 月 +years=%d 年 raw_seconds=秒 raw_minutes=分鐘 [dropzone] -default_message=拖曳文件到此處或單擊上傳 invalid_input_type=您不能上傳該類型的文件 -file_too_big=文件大小({{filesize}} MB)超過了最大允許大小({{maxFilesize}} MB) remove_file=移除文件 [notification] notifications=訊息 unread=未讀 read=已讀 -no_unread=您目前沒有未讀訊息。 -no_read=您目前沒有已讀訊息。 + +[gpg] + +[units] diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index b9a1604..9b184c8 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -5,8 +5,11 @@ dashboard=控制面版 explore=探索 help=說明 sign_in=登入 +sign_in_with=登入方式 sign_out=登出 sign_up=註冊 +link_account=連結帳戶 +link_account_signin_or_signup=使用現有的帳戶登入以連結到此帳號,或註冊新帳戶 register=註冊 website=網站 version=版本 @@ -33,7 +36,7 @@ mirror=鏡像 new_repo=新增儲存庫 new_migrate=遷移外部儲存庫 new_mirror=新鏡像 -new_fork=新增程式庫分支 +new_fork=Fork 新的儲存庫 new_org=新增組織 manage_org=管理組織 admin_panel=管理面板 @@ -43,6 +46,12 @@ your_profile=個人資料 your_starred=個人收藏 your_settings=用戶設定 +all=所有 +sources=來源 +mirrors=鏡像 +collaborative=協同者 +forks=複製列表 + activities=活動 pull_requests=合併請求 issues=問題 @@ -51,8 +60,8 @@ cancel=取消 [install] install=安裝頁面 -title=首次安裝步驟 -docker_helper=如果您正在使用 Docker 容器運行 Gitea,請務必先仔細閱讀 官方文檔 後再對本頁面進行填寫。 +title=初始設定 +docker_helper=如果您正在 Docker 中執行 Gitea,請先仔細閱讀官方文件後,再對本頁面進行填寫。 requite_db_desc=Gitea 要求安裝 MySQL、PostgreSQL、SQLite3 或 TiDB。 db_title=資料庫設定 db_type=資料庫類型 @@ -60,31 +69,32 @@ host=主機 user=帳號 password=密碼 db_name=資料庫名稱 -db_helper=如果您使用 MySQL,請使用 INNODB 引擎以及 utf8_general_ci 字元集。 +db_helper=如果您使用 MySQL,請使用 INNODB 引擎以及 utf8_general_ci 字集。 ssl_mode=SSL 模式 path=資料庫文件路徑 -sqlite_helper=SQLite3 或 TiDB 資料庫檔案路徑。
作為以服務執行時,請使用絕對路徑。 +sqlite_helper=SQLite3 或 TiDB 資料庫檔案路徑。
當啟動為服務時,請使用絕對路徑。 err_empty_db_path=SQLite3 或 TiDB 的資料庫路徑不能為空。 err_invalid_tidb_name=TiDB 資料庫名稱不允許包含字符 "." 或 "-" 。 no_admin_and_disable_registration=您不能夠在未建立管理員用戶的情況下禁止註冊。 err_empty_admin_password=管理員密碼不能為空。 -general_title=基本設定 +general_title=一般應用程式設定 app_name=應用名稱 -app_name_helper=為您的組織取個響亮而又偉大的名稱 +app_name_helper=您可以把您的組織名稱放在這裡。 repo_path=儲存庫的根目錄 -repo_path_helper=所有 Git 遠端儲存庫將會儲存在這個目錄之下。 +repo_path_helper=所有遠端 Git 儲存庫會儲存到此目錄。 lfs_path=LFS 根目錄 +lfs_path_helper=以 Git LFS 儲存檔案時會被儲存在此目錄中。請留空以停用 LFS 功能。 run_user=執行使用者 run_user_helper=該用戶必須具有對儲存庫根目錄和執行 Gitea 的操作權限。 domain=域名 domain_helper=該設定影響 SSH 複製地址。 ssh_port=SSH 連接埠 -ssh_port_helper=您的 SSH 服務正在使用此埠號,若要禁用SSH 功能請保持欄位空白。 +ssh_port_helper=SSH 伺服器使用的埠號。請留空以停用此設定。 http_port=HTTP 連接埠 http_port_helper=應用監聽的連接埠 app_url=應用程式網址 -app_url_helper=該設定影響 HTTP/HTTPS 複製地址和一些郵箱中的連結。 +app_url_helper=這會影響 HTTP/HTTPS 的 Clone URL 與一些電子郵件通知。 log_root_path=日誌路徑 log_root_path_helper=寫入日誌檔目錄 @@ -92,14 +102,14 @@ optional_title=可選設定 email_title=電子郵件服務設定 smtp_host=SMTP 主機 smtp_from=寄件者 -smtp_from_helper=郵件來自地址,遵循 RFC 5322 標准。可以是一個單純的郵箱地址或使用 "name" 的格式。 -mailer_user=寄件者 E-mail +smtp_from_helper=寄件者 Email 地址 (RFC 5322)。它可以只是一個電子郵件地址,或使用 "Name" 格式。 +mailer_user=發送使用者 mailer_password=發送郵件密碼 register_confirm=啟用註冊郵件確認 -mail_notify=啟用郵件通知提醒 +mail_notify=啟用郵件通知 server_service_title=伺服器和其他服務設定 offline_mode=啓用離線模式 -offline_mode_popup=在部署模式下也禁用從 CDN 獲取文件,所有的資源將從本地伺服器獲取。 +offline_mode_popup=停用 CDN 讓所有資源檔案都從本地伺服器提供。 disable_gravatar=禁用 Gravatar 服務 disable_gravatar_popup=禁用 Gravatar 和自定義源,僅使用由用戶上傳或默認的頭像。 federated_avatar_lookup=開啟聯合頭像查詢 @@ -110,7 +120,7 @@ enable_captcha=啟用驗證碼服務 enable_captcha_popup=要求在用戶註冊時輸入驗證碼 require_sign_in_view=啓用登錄訪問限制 require_sign_in_view_popup=只有已登錄的用戶才能夠訪問頁面,否則將只能看到登錄或註冊頁面。 -admin_setting_desc=建立管理員帳號並不是必須的,因為 ID=1 的用戶將自動獲得管理員權限。 +admin_setting_desc=你不需要現在建立一個管理員帳戶。在網站註冊的第一個使用者,就會自動取得管理員權限。 admin_title=管理員帳號設定 admin_name=管理員用戶名 admin_password=管理員密碼 @@ -118,16 +128,20 @@ confirm_password=確認密碼 admin_email=管理員郵箱 install_btn_confirm=立即安裝 test_git_failed=無法識別 'git' 命令:%v -sqlite3_not_available=您所使用的發行版本不支持 SQLite3,請從 %s 下載官方構建版,而不是 gobuild 版本。 -invalid_db_setting=資料庫設定不正確:%v +sqlite3_not_available=您目前的版本不支援 SQLite3,請從 %s 下載官方的預先編譯版本,而不是 gobuild 版本。 +invalid_db_setting=資料庫設定無效: %v invalid_repo_path=儲存庫根目錄設定不正確:%v -run_user_not_match=執行系統用戶非當前用戶:%s -> %s -save_config_failed=應用設定儲存失敗:%v +run_user_not_match=執行使用者不是目前使用者:%s -> %s +save_config_failed=儲存設定失敗:%v invalid_admin_setting=管理員帳戶設定不正確:%v -install_success=您好!我們很高興您選擇使用 Gitea,祝您使用愉快,代碼從此無 BUG! +install_success=歡迎!非常感謝您選擇 Gitea,祝你一切順利。 invalid_log_root_path=日誌根目錄無效: %v default_keep_email_private=隱藏郵件地址的預設值 +default_keep_email_private_popup=這是使用者電子郵件地址是否顯示的預設值。如果設為真則所有新使用者的電子郵件地址將被隱藏,直到使用者變更自己的設定值。 +default_allow_create_organization=新使用者建立組織的權限的預設值 +default_allow_create_organization_popup=這是分配給新使用者的預設權限。如過設為 true 則新使用者將被允許建立新的組織。 no_reply_address=不可回復的郵件地址 +no_reply_address_helper=關於git日誌中紀錄用戶電子郵件地址的域名,如果使用者留的E-mail 刻意採用非公開的,例如名字是'Joe'和域名是'noreply.example.org' ,那麼會被記為 'joe@noreply.example.org' [home] uname_holder=用戶名或郵箱 @@ -148,47 +162,57 @@ repos=儲存庫 users=用戶 organizations=組織 search=搜尋 -repo_no_results=找不到符合搜尋字詞的儲存庫。 -user_no_results=找不到符合搜尋字詞的用戶。 -org_no_results=找不到符合搜尋字詞的組織。 +repo_no_results=未發現相符儲存庫。 +user_no_results=沒有找到符合的使用者。 +org_no_results=沒有找到符合的組織。 [auth] create_new_account=建立帳戶 register_helper_msg=已經註冊?立即登錄! -social_register_helper_msg=已經註冊?立即綁定! +social_register_helper_msg=已經有帳戶了嗎?現在就加入! disable_register_prompt=對不起,註冊功能已被關閉。請聯系網站管理員。 disable_register_mail=對不起,註冊郵箱確認功能已被關閉。 remember_me=記住登錄 -forgot_password=忘記密碼 -forget_password=忘記密碼? +forgot_password_title=忘記密碼 +forgot_password=忘記密碼? sign_up_now=還沒帳戶?馬上註冊。 -confirmation_mail_sent_prompt=一封新的確認郵件已經被發送至 %s,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。 +confirmation_mail_sent_prompt=一封新的確認郵件已發送至 %s。請檢查您的收件箱並在 %s 小時內完成確認註冊操作。 +reset_password_mail_sent_prompt=一封新的確認郵件已發送至 %s。請檢查您的收件箱並在 %s 小時內完成重設密碼操作。 active_your_account=啟用您的帳戶 prohibit_login=禁止登錄 -prohibit_login_desc=您的帳戶被停用,請聯繫網站管理員。 -resent_limit_prompt=對不起,您請求發送啟用郵件過於頻繁,請等待 3 分鐘後再試! +prohibit_login_desc=您的帳號被禁止登入,請聯繫網站管理員 +resent_limit_prompt=抱歉,您最近已經請求過用來啟動的電子郵件。請等待 3 分鐘後再試一次。 has_unconfirmed_mail=%s 您好,您有一封發送至( %s) 但未被確認的郵件。如果您未收到啟用郵件,或需要重新發送,請單擊下方的按鈕。 resend_mail=單擊此處重新發送確認郵件 -email_not_associate=您輸入的郵箱地址未被關聯到任何帳號! -send_reset_mail=單擊此處(重新)發送您的密碼重置郵件 +email_not_associate=此電子郵件地址未與任何帳戶連結 +send_reset_mail=點選此處重發您的密碼重製郵件 reset_password=重置密碼 -invalid_code=對不起,您的確認代碼已過期或已失效。 +invalid_code=很抱歉,您的驗證碼已經過期或是無效 reset_password_helper=單擊此處重置密碼 password_too_short=密碼長度不能少於 %d 位! -non_local_account=非本地帳戶無法通過 Gitea 修改密碼。 +non_local_account=非本機帳號無法透過Gitea的Web介面更改密碼 verify=驗證 scratch_code=備用碼 use_scratch_code=使用備用碼 twofa_scratch_used=你已經使用了你的備用碼。你將會被轉到兩步驟驗證設定頁面以便移除你已註冊設備或重新產生新的備用碼。 -twofa_passcode_incorrect=你的驗證碼不正確確。如果您的設備已經遺失,請使用您的備用碼。 +twofa_passcode_incorrect=你的驗證碼不正確。如果您遺失設備,請使用您的備用碼登入。 twofa_scratch_token_incorrect=您的備用碼不正確 +login_userpass=帳戶 / 密碼 +login_openid=OpenID +openid_connect_submit=連接 +openid_connect_title=連接到現有帳戶 +openid_connect_desc=系統無法識別所選擇OpenID URI,您可以在此將它連結到一個即有帳戶。 +openid_register_title=建立新帳戶 +openid_register_desc=系統無法識別所選擇OpenID URI,您可以在此將它連結到一個新的帳戶。 +openid_signin_desc=範例網址: https://anne.me, bob.openid.org.cn, gnusocial.net/carry +disable_forgot_password_mail=對不起,重設密碼已被關閉。請聯系網站管理員。 [mail] activate_account=請啟用您的帳戶 activate_email=請驗證您的郵箱地址 reset_password=重置密碼 -register_success=註冊成功,歡迎使用 -register_notify=歡迎使用 +register_success=註冊成功 +register_notify=歡迎來到 Gitea [modal] yes=確認操作 @@ -216,8 +240,9 @@ TreeName=檔案路徑 Content=內容 require_error=不能為空。 -alpha_dash_error=必須為英文字母、阿拉伯數字或橫線(-_)。 -alpha_dash_dot_error=必須為英文字母、阿拉伯數字、橫線(-_)或點。 +alpha_dash_error=`必須為英文字母、阿拉伯數字或橫線(-_)。` +alpha_dash_dot_error=`必須為英文字母、阿拉伯數字、橫線(-_)或點。` +git_ref_name_error=`必須是格式良好的 git 參考名稱。` size_error=長度必須為 %s。 min_size_error=長度最小為 %s 個字符。 max_size_error=長度最大為 %s 個字符。 @@ -225,27 +250,32 @@ email_error=不是一個有效的郵箱地址。 url_error=不是一個有效的 URL。 include_error=必須包含子字符串 '%s'。 unknown_error=未知錯誤: -captcha_incorrect=驗證碼未匹配。 -password_not_match=密碼與確認密碼未匹配。 +captcha_incorrect=CAPTCHA 驗證碼不正確。 +password_not_match=您設定的密碼不匹配。 -username_been_taken=用戶名已經被佔用。 -repo_name_been_taken=儲存庫名稱已經被佔用。 -org_name_been_taken=組織名稱已經被佔用。 -team_name_been_taken=團隊名稱已經被佔用。 -email_been_used=郵箱地址已經被使用。 -username_password_incorrect=用戶名或密碼不正確。 -enterred_invalid_repo_name=請檢查您輸入的儲存庫名稱是正確。 -enterred_invalid_owner_name=請檢查您輸入的新所有者用戶名是否正確。 +username_been_taken=用戶名稱已被使用 +repo_name_been_taken=儲存庫名稱已被使用。 +org_name_been_taken=組織名稱已被使用。 +team_name_been_taken=團隊名稱已被使用。 +team_no_units_error=團隊必須啟用至少一個單元。 +email_been_used=電子郵件地址已被使用。 +openid_been_used=OpenID 位址 '%s' 已被使用。 +username_password_incorrect=帳戶名稱或密碼有誤 +enterred_invalid_repo_name=請檢查您輸入的儲存庫名稱是否正確。 +enterred_invalid_owner_name=請檢查您輸入的擁有者名稱是否正確。 enterred_invalid_password=請檢查您輸入的密碼是否正確。 -user_not_exist=被操作的用戶不存在! -last_org_owner=被移除用戶為最後一位管理員。請新增一位新的管理員再進行移除成員操作! +user_not_exist=該用戶名不存在 +last_org_owner=無法移除群組內唯一的管理員 +cannot_add_org_to_team=組織不能被新增為團隊成員。 +cannot_invite_org_to_org=組織不能被邀請為團隊成員。 invalid_ssh_key=很抱歉,我們無法驗證您輸入的 SSH 金鑰:%s -unable_verify_ssh_key=Gitea 無法驗證您輸入的 SSH 金鑰,但我們假設那是有效的金鑰,請您自行確保其有效性! +invalid_gpg_key=很抱歉,我們無法驗證您輸入的 GPG 金鑰:%s +unable_verify_ssh_key=無法驗證 SSH 金鑰,請確認 SSH 金鑰是否正確。 auth_failed=授權驗證失敗:%v still_own_repo=您的帳戶仍然是某些儲存庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作! -still_has_org=您的帳戶仍舊是某些組織的成員,您必須先離開或刪除組織。 +still_has_org=您的帳戶仍然是至少一個組織的成員,你需要先離開他們。 org_still_own_repo=該組織仍然是某些儲存庫的擁有者,您必須先轉移或刪除它們才能執行刪除組織操作! target_branch_not_exist=目標分支不存在 @@ -268,24 +298,26 @@ form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。 profile=個人訊息 password=修改密碼 avatar=頭像 -ssh_keys=管理 SSH 金鑰 +ssh_gpg_keys=SSH / GPG 金鑰 social=社交帳號綁定 applications=管理授權應用 orgs=管理組織 delete=刪除帳戶 twofa=兩步驟驗證 +account_link=外部帳戶 +organization=組織 uid=用戶 ID public_profile=公開訊息 -profile_desc=您的郵箱地址將會被公開,並被用於接收帳戶的所有提醒和通知。 -password_username_disabled=不允許非本地類型使用者更改他們的使用者名。 +profile_desc=您的郵件地址將會被公開,並被用於接收帳戶的所有提醒和通知。 +password_username_disabled=非本地使用者不允許更改他們的使用者名稱。更多詳情請聯繫您的系統管理員。 full_name=自定義名稱 website=個人網站 location=所在地區 update_profile=更新訊息 -update_profile_success=您的個人訊息更新成功! +update_profile_success=您的個人資料已被更新 change_username=用戶名將被修改 -change_username_prompt=該操作將會影響到所有與您帳戶有關的鏈接 +change_username_prompt=此更動將會更改你所連結的帳戶 continue=繼續操作 cancel=取消操作 @@ -296,68 +328,92 @@ choose_new_avatar=選擇新的頭像 update_avatar=更新頭像設定 delete_current_avatar=刪除當前頭像 uploaded_avatar_not_a_image=上傳的文件不是一張圖片! -update_avatar_success=您的頭像設定更新成功! +update_avatar_success=成功更新您的頭像設定! change_password=修改密碼 old_password=當前密碼 new_password=新的密碼 retype_new_password=重新輸入新的密碼 password_incorrect=當前密碼不正確! -change_password_success=密碼修改成功!您現在可以使用新的密碼登錄。 -password_change_disabled=不允許非本地類型使用者,更改其密碼。 +change_password_success=密碼修改成功!您現在可以使用新的密碼登入。 +password_change_disabled=非本地用戶不允許透過 Web 介面變更密碼。 emails=電子郵件地址 manage_emails=管理電子郵件地址 +manage_openid=管理 OpenID 位址 email_desc=您的主要邮箱地址将被用于通知提醒和其它操作。 primary=主要 primary_email=设为主要 delete_email=刪除 -email_deletion=刪除郵箱 -email_deletion_desc=刪除該郵箱地址將會移除所有相關的訊息。是否繼續? +email_deletion=刪除電子郵件 +email_deletion_desc=刪除此電子郵件地址將從您的帳戶刪除所有的相關的資訊。Git 提交使用此電子郵件將保持不變。你想要繼續嗎? email_deletion_success=成功刪除郵箱! +openid_deletion=OpenID 刪除 +openid_deletion_desc=從您的帳戶刪除此 OpenID 位址將會阻止你使用它進行登錄。你確定要繼續嗎? +openid_deletion_success=OpenID 已成功删除! add_new_email=新增新的電子郵件地址 +add_new_openid=新增新的 OpenID URI add_email=新增電子郵件 -add_email_confirmation_sent=一封待確認的電子郵件已發送到 '%s',請在%d 小時內檢查您的收件箱,並完成確認過程。 +add_openid=新增 OpenID URI +add_email_confirmation_sent=一封新的確認郵件已經被發送至 %s,請檢查您的收件箱並在 %s 小時內完成確認註冊操作。 add_email_success=新的電子郵件新增成功。 +add_openid_success=你的 OpenID 位址已成功新增。 keep_email_private=不公開 Email 地址 keep_email_private_popup=設定此選項會使得其他用戶看不到您的電子郵件信箱 +openid_desc=您的 OpenID 位址將讓您的身份驗證委派到選擇的供應商 manage_ssh_keys=管理 SSH 金鑰 +manage_gpg_keys=管理 GPG 金鑰 add_key=增加金鑰 -ssh_desc=以下是與您帳戶所關聯的 SSH 金鑰,如果您發現有陌生的金鑰,請立即刪除它! -ssh_helper=需要幫助嗎? 請查看有關 如何生成 SSH 金鑰 的指南或 SSH 的常見問題 的疑難排解。 +ssh_desc=這些是與您的帳戶相關聯的 SSH 金鑰。因為這些金鑰允許任何人使用它們來取得您的儲存庫權限,非常重要,請確保你識別它們。 +gpg_desc=這些是與您的帳戶相關聯的 GPG 金鑰。因為這些金鑰可以讓你的提交被驗證,它是非常重要的,請確保私密金鑰能夠被安全保存。 +ssh_helper=需要協助? 查詢GitHub的文件以 您自有SSH金鑰 or solve common problems you may encounter using SSH. +gpg_helper=需要協助嗎?建議可看看 GitHub 的 about GPG 文件。 add_new_key=增加 SSH 金鑰 -ssh_key_been_used=公共金鑰已經被使用 -ssh_key_name_used=使用相同名稱的公共金鑰已經存在! +add_new_gpg_key=新增 GPG 金鑰 +ssh_key_been_used=此公鑰已被使用。 +ssh_key_name_used=已存在具有相同名稱的公開金鑰。 +gpg_key_id_used=已存在具有相同 id 的 GPG 公開金鑰。 +gpg_key_email_not_found=附加到 GPG 金鑰的電子郵件找不到或尚未確認:%s +subkeys=次金鑰 +key_id=金鑰 ID key_name=金鑰名稱 key_content=金鑰內容 -add_key_success=新的 SSH 金鑰 '%s' 新增成功! +add_key_success=您的 SSH 金鑰 '%s' 新增成功。 +add_gpg_key_success=您的 GPG 金鑰 '%s' 已經新增成功。 delete_key=刪除 ssh_key_deletion=刪除 SSH 公鑰 -ssh_key_deletion_desc=刪除該 SSH 公鑰將刪除所有與您帳戶相關的訪問權限。是否繼續? -ssh_key_deletion_success=SSH 公鑰刪除成功! +gpg_key_deletion=GPG 金鑰刪除 +ssh_key_deletion_desc=刪除該 SSH 公鑰將撤銷所有使用此 SSH 金鑰的帳號的訪問權限。是否繼續? +gpg_key_deletion_desc=刪去此 GPG 金鑰將會使與此 GPG 金鑰簽署的所有提交失去驗證。你確定要繼續嗎? +ssh_key_deletion_success=SSH 金鑰已被刪除。 +gpg_key_deletion_success=GPG 金鑰已被刪除。 add_on=增加於 +valid_until=有效期至 +valid_forever=永遠有效 last_used=上次使用在 no_activity=沒有最近活動 key_state_desc=該金鑰在 7 天內被使用過 -token_state_desc=此token在過去七天內曾經被使用過 +token_state_desc=此 token 在過去七天內曾經被使用過 +show_openid=在設定檔顯示 +hide_openid=從設定檔隱藏 manage_social=管理關聯社交帳戶 -social_desc=以下是與您帳戶所關聯的社交帳號,如果您發現有陌生的關聯,請立即解除綁定! +social_desc=這是相關聯的社交帳戶清單。出於安全考量,請確保您識別所有項目,因為它們可用於登入到您的帳戶。 unbind=解除綁定 -unbind_success=社交帳號解除綁定成功! +unbind_success=已從你的帳戶解除綁定社交帳號。 manage_access_token=管理個人操作令牌 generate_new_token=生成新的令牌 -tokens_desc=您所產生的token將被用來存取Gitea APIs +tokens_desc=您所產生的 Token 能被用來存取 Gitea APIs。 new_token_desc=目前為止,任何令牌都對您的帳戶擁有完整的操作權限。 token_name=令牌名稱 generate_token=生成令牌 -generate_token_succees=新的操作令牌生成成功!您必須立即複製到一個安全的地方,因為該令牌只會顯示一次! +generate_token_success=成功產生 Access Token!您必須立即複製到一個安全的地方,因為該 Token 只會顯示一次! delete_token=删除令牌 access_token_deletion=刪除個人的連接token -access_token_deletion_desc=刪除此連接token將會刪除與相關應用程式的連結。您想要繼續嗎? -delete_token_success=您的連接token已成功刪除。請記得更新您的應用程式。 +access_token_deletion_desc=刪除此 Access Token 將撤銷任何使用該 Token 應用程式的操作。你想要繼續嗎? +delete_token_success=個人 Access Token 已刪除。別忘了更新使用此 Token 的任何應用程式。 twofa_desc=Gitea 支援兩步驟驗證來加強帳號的安全性 twofa_is_enrolled=您的帳號已經啟用兩步驟驗證。 @@ -367,8 +423,8 @@ twofa_scratch_token_regenerate=重新產生備用碼 twofa_scratch_token_regenerated=您的備用碼已經重新產生。現在是 %s。請儲存在安全的地方。 twofa_enroll=註冊兩步驟驗證 twofa_disable_note=您可以隨時關閉兩步驟驗證。 -twofa_disable_desc=關閉兩步驟驗證會使得您的帳號不安全,是否確定繼續執行? -regenerate_scratch_token_desc=如果您遺失了備用碼,或者你已經使用在登入系統了,你可以重新產生它。 +twofa_disable_desc=關閉兩步驟驗證將使得您的帳號不安全,你確定要繼續嗎? +regenerate_scratch_token_desc=如果您遺失了備用碼,或者已使用它登入系統了,你可在此重新產生。 twofa_disabled=兩步驟驗證已經被關閉。 scan_this_image=使用您的授權應用程式來掃瞄圖片: or_enter_secret=或者輸入密碼: %s @@ -376,24 +432,33 @@ then_enter_passcode=然後輸入應用程式提供給您的驗證碼: passcode_invalid=無效的驗證碼,請重試。 twofa_enrolled=您的帳號已經啟用了兩步驟驗證。請務必保存好您的認證碼 (%s),這只會顯示一次。 +manage_account_links=管理帳戶連結 +manage_account_links_desc=連結到此帳戶的外部帳戶 +account_links_not_available=目前沒有連結到此帳戶的外部帳戶 +remove_account_link=刪除連結的帳戶 +remove_account_link_desc=刪除此連結的帳戶將撤銷所有相關的訪問使用此帳戶。你想要繼續嗎? +remove_account_link_success=帳號的連結已經成功移除! + +orgs_none=您尚未成為任一組織的成員。 + delete_account=刪除當前帳戶 delete_prompt=刪除操作會永久清除您的帳戶訊息,並且 不可恢復! confirm_delete_account=確認刪除帳戶 delete_account_title=帳戶刪除操作 -delete_account_desc=該帳戶將被永久性刪除,您確定要繼續操作嗎? +delete_account_desc=您是否確定要永久刪除此帳號? [repo] owner=擁有者 repo_name=儲存庫名稱 -repo_name_helper=偉大的儲存庫名稱一般都較短、令人深刻並且 獨一無二 的。 +repo_name_helper=好的儲存庫名稱通常是簡短的、好記的、且獨特的。 visibility=可見度 visiblity_helper=該儲存庫為 私有的 -visiblity_helper_forced=網站管理員已強制要求所有新建儲存庫必須為 私有的 +visiblity_helper_forced=網站管理員已強制要求所有新建儲存庫必須為 私有儲存庫 visiblity_fork_helper=(修改該值將會影響到所有複製儲存庫) -clone_helper=不知道如何操作?訪問 帮助説明 ! +clone_helper=不知道如何操作?訪問 帮助説明 ! fork_repo=複製儲存庫 fork_from=複製自 -fork_visiblity_helper=複製儲存庫無法修改可見性。 +fork_visiblity_helper=您無法修改已複製儲存庫的可見度。 repo_desc=儲存庫描述 repo_lang=儲存庫語言 repo_gitignore_helper=選擇 .gitignore 主題 @@ -405,18 +470,19 @@ auto_init=使用選定的文件和模板初始化儲存庫 create_repo=建立儲存庫 default_branch=默認分支 mirror_prune=裁減 -mirror_prune_desc=當遠程追蹤的引用被刪除時本地也會同步刪除 -mirror_interval=鏡像同步周期(小時) +mirror_prune_desc=刪除任何已不存在於遠端資料庫的遠端追蹤引用 +mirror_interval=鏡像間隔 (有效時間單位為"h", "m","s") +mirror_interval_invalid=鏡像周期無效 mirror_address=鏡像地址 -mirror_address_desc=請在位址中包括必要的使用者憑據。 +mirror_address_desc=請在此位址中引入任何必要使用者憑證。 mirror_last_synced=上次同步 watchers=關注者 stargazers=稱讚者 forks=複製儲存庫 -form.reach_limit_of_creation=擁有者已達到儲存庫最大的新增上限 %d。 -form.name_reserved=儲存庫名稱 '%s' 是被保留的。 -form.name_pattern_not_allowed=儲存庫名稱不允許 '%s' 的格式。 +form.reach_limit_of_creation=您已經達到了儲存庫 %d 的上限。 +form.name_reserved=儲存庫名稱 '%s' 是預留的。 +form.name_pattern_not_allowed=儲存庫名稱格式不允許為'%s'。 need_auth=需要授權驗證 migrate_type=遷移類型 @@ -428,9 +494,11 @@ migrate.clone_local_path=或者是本地端伺服器路徑 migrate.permission_denied=您並沒有導入本地儲存庫的權限。 migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄! migrate.failed=遷移失敗:%v +migrate.lfs_mirror_unsupported=鏡像 LFS 物件不支援 - 代替使用 'git lfs fetch --all' 和 'git lfs push --all'。 mirror_from=镜像来自 forked_from=複製自 +fork_from_self=您無法複製已經擁有的儲存庫! copy_link=複製連結 copy_link_success=複製成功! copy_link_error=請按下 ⌘-C 或 Ctrl-C 複製 @@ -445,11 +513,12 @@ download_archive=下載此儲存庫 no_desc=暫無描述 quick_guide=快速幫助 clone_this_repo=複製當前儲存庫 -create_new_repo_command=從命令行建立一個新的儲存庫 -push_exist_repo=從命令行推送已經建立的儲存庫 -repo_is_empty=這儲存庫不包含任何內容,請稍後再訪問! +create_new_repo_command=從命令列建立新儲存庫。 +push_exist_repo=從命令列推送已存在的儲存庫 +bare_message=此儲存庫未包含任何內容。 code=程式碼 +code.desc=程式碼是程式碼儲存的地方 branch=分支 tree=目錄樹 filter_branch_and_tag=過濾分支或標籤 @@ -468,12 +537,13 @@ file_permalink=永久連結 file_too_large=檔案太大,無法顯示 video_not_supported_in_browser=您的瀏覽器不支援使用 HTML5 播放影片。 stored_lfs=儲存到到 Git LFS +commit_graph=提交圖 editor.new_file=開新檔案 editor.upload_file=上傳檔案 editor.edit_file=編輯文件 editor.preview_changes=預覽更改 -editor.cannot_edit_non_text_files=不能編輯非文字檔 +editor.cannot_edit_non_text_files=不能從網站介面編輯二進位檔案 editor.edit_this_file=編輯此文件 editor.must_be_on_a_branch=你必須在一個分支或提出對此檔的更改 editor.fork_before_edit=你必須在編輯檔案之前備份此檔案 @@ -485,7 +555,7 @@ editor.filename_help=輸入名稱後按下 / 鍵即可新增資料夾,或將 editor.or=或 editor.cancel_lower=取消 editor.commit_changes=提交更改嗎? -editor.add_tmpl=新增 '%s/' +editor.add_tmpl=新增 %s/' editor.add=新增 '%s' editor.update=更新 '%s' editor.delete=刪除 '%s' @@ -497,26 +567,35 @@ editor.cancel=取消 editor.filename_cannot_be_empty=檔案名不能為空。 editor.branch_already_exists='%s' 已存在於此存儲庫。 editor.directory_is_a_file='%s' 在此儲存庫中的路徑是檔案而不是目錄。 +editor.file_is_a_symlink=檔案 '%s' 是一個符號連結,不能從 web 編輯器修改。 editor.filename_is_a_directory=檔案名 '%s' 是此資料庫中的現有目錄。 editor.file_editing_no_longer_exists=檔 '%s' 您正在編輯不再存在於資料庫。 -editor.file_changed_while_editing=從您開始編輯已更改檔的內容。 按一下此處 以查看什麼發生了更改或 按提交再 覆蓋這些更改。 +editor.file_changed_while_editing=從您開始編輯後,檔案內容已被更改。按一下此處以查看什麼被更改或>按再提交 以覆蓋這些更改。 editor.file_already_exists=帶有名稱 '%s' 的檔已經存在在這個資料庫中。 editor.no_changes_to_show=沒有可以顯示的變更。 editor.fail_to_update_file=上傳/建立檔案 '%s' 失敗, 錯誤訊息: %v editor.add_subdir=新增子目錄... editor.unable_to_upload_files=上傳檔案失敗到 '%s', 錯誤訊息: %v editor.upload_files_to_dir=上傳檔案到 '%s' +editor.cannot_commit_to_protected_branch=無法提交到受保護的分支 '%s'。 +commits.desc=提交顯示代碼的更改歷史記錄 commits.commits=次程式碼提交 commits.search=搜尋提交歷史 -commits.search_all=所有 -commits.find=查找 +commits.find=搜尋 +commits.search_all=所有分支 commits.author=作者 commits.message=備註 commits.date=提交日期 commits.older=更舊的提交 commits.newer=更新的提交 +commits.signed_by=簽署人 +commits.gpg_key_id=GPG 金鑰 ID +ext_issues=外部問題 +ext_issues.desc=Ext Issue連結至一個外部的Issue管理頁面 + +issues.desc=問題是管理工作和臭蟲的地方 issues.new=建立問題 issues.new.labels=標籤 issues.new.no_label=未選擇標籤 @@ -538,7 +617,14 @@ issues.label_templates.info=沒有任何標籤。你可以點選上面建立一 issues.label_templates.helper=選擇一個標籤集 issues.label_templates.use=使用此標籤集 issues.label_templates.fail_to_load_file=載入標籤範本檔案 '%s' 失敗: %v +issues.add_label_at=`新增
%s
label %s` +issues.remove_label_at=`刪除
%s
label %s` +issues.add_milestone_at=`新增至%s 里程碑 %s` +issues.change_milestone_at=`%[3]s 修改了里程碑 %[1]s%[2]s` +issues.remove_milestone_at=`從里程碑 %[2]s 刪除 %[1]s` +issues.deleted_milestone=`(已刪除)` issues.self_assign_at=將 %s 指派給自己 +issues.add_assignee_at=`被%s %s指派` issues.remove_assignee_at=`於 %s 取消了指派` issues.change_title_at=`修改標題從 %s%s %s` issues.delete_branch_at=`刪除分支 %s %s` @@ -562,6 +648,13 @@ issues.filter_sort.recentupdate=最近更新 issues.filter_sort.leastupdate=最少更新 issues.filter_sort.mostcomment=最多評論 issues.filter_sort.leastcomment=最少評論 +issues.action_open=開啟 +issues.action_close=關閉 +issues.action_label=標籤 +issues.action_milestone=里程碑 +issues.action_milestone_no_select=無里程碑 +issues.action_assignee=負責人 +issues.action_assignee_no_select=無負責人 issues.opened_by=由 %[3]s 於 %[1]s建立 issues.opened_by_fake=由 %[2]s 於 %[1]s建立 issues.previous=上一頁 @@ -595,14 +688,19 @@ issues.label_edit=編輯 issues.label_delete=刪除 issues.label_modify=修改標籤 issues.label_deletion=刪除標籤 -issues.label_deletion_desc=刪除該標籤將會移除所有問題中相關的訊息。是否繼續? -issues.label_deletion_success=標籤刪除成功! +issues.label_deletion_desc=刪除此標籤將其從所有Issue中移除。你確定要繼續嗎? +issues.label_deletion_success=此標籤已成功刪除。 issues.label.filter_sort.alphabetically=按字母顺序排序 issues.label.filter_sort.reverse_alphabetically=按字母反向排序 +issues.label.filter_sort.by_size=大小 +issues.label.filter_sort.reverse_by_size=從大到小 issues.num_participants=%d 參與者 issues.attachment.open_tab=`在新的標籤頁中查看 '%s'` issues.attachment.download=`點擊下載 '%s'` +issues.subscribe=訂閱 +issues.unsubscribe=取消訂閱 +pulls.desc=Pulls 管理你的程式碼審核及程式碼合併要求。 pulls.new=建立合併請求 pulls.compare_changes=對比文件變化 pulls.compare_changes_desc=對比兩個分支間的文件變化及發起一個合併請求。 @@ -620,14 +718,14 @@ pulls.tab_commits=程式碼提交 pulls.tab_files=文件變動 pulls.reopen_to_merge=請重新開啟合併請求來完成合併操作。 pulls.merged=已合併 -pulls.has_merged=該合併請求已經成功合併! +pulls.has_merged=此合併請求已成功合併。 pulls.data_broken=該合併請求的資料由於複製儲存庫的相關訊息被刪除而被破壞。 pulls.is_checking=該合併請求正在進行衝突檢查,請稍後再刷新頁面。 pulls.can_auto_merge_desc=這個拉請求可以自動合併。 -pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請求。 +pulls.cannot_auto_merge_desc=此合併請求無法自動合併因發生衝突。 pulls.cannot_auto_merge_helper=請手動合併來解決衝突。 pulls.merge_pull_request=合併請求 -pulls.open_unmerged_pull_exists=`由於已經存在來自相同儲存庫和合併訊息的未合併請求(#%d),您無法執行重新開啟操作。` +pulls.open_unmerged_pull_exists=`您無法執行重新開啟的操作因為已有來自同儲存庫的未合併請求(#%d),該請求具相同資訊且等待合併中。` milestones.new=新的里程碑 milestones.open_tab=%d 開啟中 @@ -650,7 +748,7 @@ milestones.cancel=取消 milestones.modify=修改里程碑 milestones.edit_success=里程碑 '%s' 的修改內容已經生效! milestones.deletion=刪除里程碑 -milestones.deletion_desc=刪除該里程碑將會移除所有問題中相關訊息。是否繼續? +milestones.deletion_desc=刪除此里程碑將從相關 Issue 內移除,是否繼續執行? milestones.deletion_success=里程碑刪除成功! milestones.filter_sort.closest_due_date=到期日由近到遠 milestones.filter_sort.furthest_due_date=到期日由遠到近 @@ -659,25 +757,30 @@ milestones.filter_sort.most_complete=完成度由高到低 milestones.filter_sort.most_issues=問題由多到少 milestones.filter_sort.least_issues=問題由少到多 +ext_wiki=外部 Wiki +ext_wiki.desc=外部 Wiki 的連結 + wiki=Wiki -wiki.welcome=歡迎使用 Wiki! +wiki.welcome=歡迎來到專案 Wiki 頁面 wiki.welcome_desc=Wiki 是用於共同協作文檔的地方,清晰的文檔可以幫助其他人深入了解您的項目。 +wiki.desc=Wiki 是存放文件的地方 wiki.create_first_page=建立第一個頁面 wiki.page=頁面 wiki.filter_page=過濾頁面 wiki.new_page=建立新的頁面 -wiki.default_commit_message=關於此次修改的說明(可選)。 +wiki.default_commit_message=關於此次頁面修改的說明(非必要)。 wiki.save_page=儲存頁面 wiki.last_commit_info=%s 於 %s 修改了此頁面 wiki.edit_page_button=修改 wiki.new_page_button=新的頁面 wiki.delete_page_button=刪除頁面 -wiki.delete_page_notice_1=這將刪除頁面 "%s"。請三思而後行。 +wiki.delete_page_notice_1=此操作將刪除頁面 "%s"。請確認您想要刪除此頁。 wiki.page_already_exists=相同名稱的 Wiki 頁面已經存在。 wiki.pages=所有頁面 wiki.last_updated=最後更新於 %s settings=儲存庫設定 +settings.desc=設定是您可以管理儲存庫設定的地方 settings.options=基本設定 settings.collaboration=管理協作者 settings.collaboration.admin=管理權限 @@ -689,7 +792,7 @@ settings.githooks=管理 Git Hooks settings.basic_settings=基本設定 settings.mirror_settings=鏡像設定 settings.sync_mirror=立即同步 -settings.mirror_sync_in_progress=鏡像同步正在進行中,請大約一分鐘後刷新頁面。 +settings.mirror_sync_in_progress=鏡像同步進行中,請稍後重新整理此頁面確認。 settings.site=官方網站 settings.update_settings=更新儲存庫設定 settings.advanced_settings=高級設定 @@ -697,10 +800,13 @@ settings.wiki_desc=啓用 Wiki 系統 settings.use_internal_wiki=使用內建 wiki settings.use_external_wiki=使用外部 wiki settings.external_wiki_url=外部 Wiki 連結 +settings.external_wiki_url_error=外部 Wiki 網址無效 settings.external_wiki_url_desc=當分頁上按一下,訪客將會重新導到 URL。 settings.issues_desc=啟用問題追蹤 settings.use_internal_issue_tracker=使用內建輕量級問題追蹤 settings.use_external_issue_tracker=使用外部的問題管理系統 +settings.external_tracker_url=外部 Issue 追蹤網址 +settings.external_tracker_url_error=外部 Issue Tracker URL 無效 settings.external_tracker_url_desc=當按下分頁,訪客將會重新導向新的 URL。 settings.tracker_url_format=外部問題管理系統的 URL 格式 settings.tracker_issue_style=外部公單管理系統命名風格: @@ -711,29 +817,29 @@ settings.pulls_desc=啟用合併請求以接受社區貢獻 settings.danger_zone=危險操作區 settings.new_owner_has_same_repo=新的儲存庫擁有者已經存在同名儲存庫! settings.convert=轉換為正規儲存庫 -settings.convert_desc=您可以將此鏡像轉成正規儲存庫。此動做不可逆。 +settings.convert_desc=您可以將此鏡像轉成正規儲存庫。此動做不可恢復。 settings.convert_notices_1=這項操作將會把儲存庫鏡像轉換成一般的儲存庫,這項操作不能取消。 settings.convert_confirm=確認轉換 settings.convert_succeed=儲存庫已成功轉換為一般類型。 settings.transfer=轉移儲存庫所有權 settings.transfer_desc=您可以將儲存庫轉移至您擁有管理員權限的帳戶或組織。 settings.transfer_notices_1=- 如果您將儲存庫轉移給個人用戶,您將會丟失操作權限。 -settings.transfer_notices_2=- 如果您將儲存庫轉移給您是所有者的組織,您的操作權限將被保留。 +settings.transfer_notices_2=- 如果新的所有者的是組織且你是此組織的所有者之一,您的操作權限將被保留。 settings.transfer_form_title=請輸入以下訊息以確認您的操作: settings.wiki_delete=刪除 Wiki 資料 settings.wiki_delete_desc=請注意,一旦清除 wiki 資料便無法恢復。 settings.wiki_delete_notices_1=- 將刪除和停用 %s 的 wiki -settings.wiki_deletion_success=儲存庫 wiki 資料已成功清除。 +settings.wiki_deletion_success=已刪除儲存庫 wiki 資料。 settings.delete=刪除本儲存庫 settings.delete_desc=刪除儲存庫操作不可逆轉,請三思而後行。 settings.delete_notices_1=- 此操作 不可以 被回滾。 -settings.delete_notices_2=- 此操作將永久刪除該儲存庫,包括 Git 資料、 問題、 評論和協作者的操作權限。 +settings.delete_notices_2=- 此操作將永久刪除該儲存庫,包括 程式碼、 問題、評論、Wiki 頁面和協作者的操作權限。 settings.delete_notices_fork_1=- 刪除後所有的複製儲存庫將會成為獨立儲存庫 -settings.deletion_success=儲存庫刪除成功! -settings.update_settings_success=儲存庫設定更新成功! +settings.deletion_success=儲存庫已刪除。 +settings.update_settings_success=已更新儲存庫基本設定。 settings.transfer_owner=新擁有者 settings.make_transfer=確認轉移儲存庫 -settings.transfer_succeed=儲存庫所有權轉移成功! +settings.transfer_succeed=已轉移儲存庫所有權。 settings.confirm_delete=確認刪除儲存庫 settings.add_collaborator=增加新的協作者 settings.add_collaborator_success=成功建立新的協作者! @@ -762,7 +868,7 @@ settings.githook_edit_desc=如果 Hook 未啟動,則會顯示樣例文件中 settings.githook_name=Hook 名稱 settings.githook_content=Hook 內容 settings.update_githook=更新 Hook 設定 -settings.add_webhook_desc=我們會通過 POST 請求將訂閱事件訊息發送至向指定 URL 地址。您可以設定不同的資料接收方式(JSON 或 x-www-form-urlencoded)。 請查閱 Webhooks 指南. +settings.add_webhook_desc=Gitea 將傳送 POST 請求及發生事件的訊息至指定的 URL。您也能指定接收的資料格式 (JSON, x-www-form-urlencoded, XML, etc)。更多資訊在webhooks 文件中可獲得。 settings.payload_url=推送地址 settings.content_type=資料格式 settings.secret=金鑰文本 @@ -780,7 +886,7 @@ settings.event_pull_request_desc=請求打開,關閉,重新打開,編輯 settings.event_push=推送 settings.event_push_desc=Git 儲存庫推送 settings.active=是否啟用 -settings.active_helper=當指定事件發生時我們將會觸發此 Webhook 。 +settings.active_helper=觸發hook的事件資訊將同時發送。 settings.add_hook_success=Webhook 新增成功! settings.update_webhook=更新 Webhook settings.update_hook_success=Webhook 更新成功! @@ -801,13 +907,28 @@ settings.key_been_used=部署金鑰已經被使用! settings.key_name_used=使用相同名稱的部署金鑰已經存在! settings.add_key_success=成功新增部署金鑰 '%s'! settings.deploy_key_deletion=刪除部署金鑰 -settings.deploy_key_deletion_desc=刪除該部署金鑰會移除本儲存庫所有相關的操作權限。是否繼續? -settings.deploy_key_deletion_success=刪除部署金鑰成功! +settings.deploy_key_deletion_desc=刪除此管理部署金鑰將造成此儲存庫沒有權限存取。你想要繼續嗎? +settings.deploy_key_deletion_success=成功刪除管理部署金鑰! +settings.branches=分支列表 +settings.protected_branch=分支保護 +settings.protected_branch_can_push=允許推送? +settings.protected_branch_can_push_yes=你可以推送 +settings.protected_branch_can_push_no=你不能推送 +settings.add_protected_branch=啟用保護 +settings.delete_protected_branch=停用保護 +settings.add_protected_branch_success=%s 成功鎖定 +settings.add_protected_branch_failed=%s 鎖定失敗 +settings.remove_protected_branch_success=%s 解鎖成功 +settings.protected_branch_deletion=刪除一個受保護的分支 +settings.protected_branch_deletion_desc=任何具有寫入權限的使用者都可以直接推進這個分支,您確定嗎? +settings.default_branch_desc=預設分支被認為是"基準"分支,預期全部的合併請求以及程式碼提交將自動完成到此分支,除非您指定不同的分支。 +settings.choose_branch=選擇一個分支 +settings.no_protected_branch=沒有受保護的分支 diff.browse_source=瀏覽代碼 diff.parent=父節點 diff.commit=當前提交 -diff.data_not_available=暫無可用資料 +diff.data_not_available=沒有內容比較可以使用 diff.show_diff_stats=顯示文件統計 diff.show_split_view=分割檢視 diff.show_unified_view=統一視圖 @@ -817,6 +938,7 @@ diff.view_file=查看文件 diff.file_suppressed=文件差異過大導致無法顯示 diff.too_many_files=部分文件因文件數量過多而無法顯示 +releases.desc=發佈版本是管理您專案版本的地方 release.releases=版本發佈 release.new_release=發佈新版本 release.draft=草稿 @@ -825,11 +947,11 @@ release.stable=穩定 release.edit=編輯 release.ahead=在該版本發佈之後已有 %d 次程式碼提交到 %s 分支 release.source_code=程式碼 -release.new_subheader=發佈版本對產品進行迭代。 +release.new_subheader=公開發佈版本以便跟蹤專案版本。 release.edit_subheader=詳細的變更記錄可以幫助用戶更好地了解產品做了哪些改進。 release.tag_name=標籤名稱 release.target=目標分支 -release.tag_helper=選擇或建立一個已存在的標籤 +release.tag_helper=選擇已存在標籤或新建標籤。 release.title=標題 release.content=內容 release.write=內容編輯 @@ -843,19 +965,19 @@ release.save_draft=儲存草稿 release.edit_release=編輯發佈訊息 release.delete_release=刪除此次發佈 release.deletion=刪除版本發佈操作 -release.deletion_desc=刪除該版本發佈將會移除相應的 Git 標籤。是否繼續? -release.deletion_success=版本發佈刪除成功! +release.deletion_desc=刪除此版本發佈將會移除相應的 Git 標籤。你不會遺失任何程式碼,你想要繼續嗎? +release.deletion_success=已刪除此版本發佈。 release.tag_name_already_exist=已經存在使用相同標籤的發佈版本。 release.tag_name_invalid=標記名稱不是有效的。 release.downloads=下載附件 branch.delete=刪除分支 %s -branch.delete_desc=請注意,一旦刪除分支,就無法恢復了。 +branch.delete_desc=刪除分支將是永久的。沒有其它方法能復原。 branch.delete_notices_1=- 此操作不可以被還原。 -branch.delete_notices_2=- 此操作將會永久刪除 %s 分支內所有東西。 -branch.deletion_success=%s 已經成功被刪除! +branch.delete_notices_2=- 此操作將永久刪除在 %s 分支內的所有內容。 +branch.deletion_success=%s 已被刪除。 branch.deletion_failed=刪除分支 %s 失敗。 -branch.delete_branch_has_new_commits=該分支在合併完成後又推送了新的提交,無法執行刪除 %s。 +branch.delete_branch_has_new_commits=不能刪除 %s,因為合併後已新增了新的提交。 [org] org_name_holder=組織名稱 @@ -872,9 +994,10 @@ create_new_team=建立新的團隊 org_desc=組織描述 team_name=團隊名稱 team_desc=團隊描述 -team_name_helper=您可以使用該名稱來通知改組全體成員。 -team_desc_helper=一句話描述這個團隊是做什麼的。 -team_permission_desc=請選擇該團隊所具有的權限等級: +team_name_helper=您將使用此名稱在對話中通知團隊。 +team_desc_helper=一句話描述這個團隊是做什麼的? +team_permission_desc=此團隊該具有怎樣權限? +team_unit_desc=此團隊該具有何允許操作的單元? form.name_reserved=組織名稱 '%s' 是被保留的。 form.name_pattern_not_allowed=組織名稱不允許 '%s' 的格式。 @@ -886,16 +1009,16 @@ settings.full_name=組織全名 settings.website=官方網站 settings.location=所在地區 settings.update_settings=更新組織設定 -settings.update_setting_success=組織設定更新成功! -settings.change_orgname_prompt=該操作將會影響到所有與該組織有關的鏈接 -settings.update_avatar_success=組織頭像更新成功! +settings.update_setting_success=組織設定已更新。 +settings.change_orgname_prompt=此變更將改變與此組織有關的連結 +settings.update_avatar_success=組織頭像已更新。 settings.delete=刪除組織 settings.delete_account=刪除當前組織 settings.delete_prompt=刪除操作會永久清除該組織的訊息,並且 不可恢復! settings.confirm_delete_account=確認刪除組織 settings.delete_org_title=組織刪除操作 -settings.delete_org_desc=該組織將被永久性刪除,您確定要繼續操作嗎? -settings.hooks_desc=在此處新增的 Webhook 將會應用到該組織下的 所有儲存庫。 +settings.delete_org_desc=將永久刪除此組織,你確定要繼續嗎? +settings.hooks_desc=新增 webhooks 將觸發在這個組織下 全部的儲存庫 。 members.membership_visibility=成員可見性: members.public=公開成員 @@ -915,9 +1038,9 @@ teams.leave=離開團隊 teams.read_access=讀取權限 teams.read_access_helper=這個團隊將擁有查看和複製所屬儲存庫的權限。 teams.write_access=寫入權限 -teams.write_access_helper=這個團隊將擁有查看、複製和推送所屬儲存庫的權限。 +teams.write_access_helper=此團隊將能查看和推送所屬儲存庫。 teams.admin_access=管理權限 -teams.admin_access_helper=這個團隊將擁有查看、複製、推送和建立其他組織成員到團隊的權限。 +teams.admin_access_helper=此團隊將能推送和合併請求所屬儲存庫,同時也能增加其它協作者。 teams.no_desc=該團隊暫無描述 teams.settings=團隊設定 teams.owners_permission_desc=管理員團隊對 所有儲存庫 具有操作權限,且對組織具有 管理員權限。 @@ -926,8 +1049,8 @@ teams.update_settings=更新團隊設定 teams.delete_team=刪除當前團隊 teams.add_team_member=新增團隊成員 teams.delete_team_title=團隊刪除操作 -teams.delete_team_desc=刪除操作會永久清除有關該團隊的訊息,您確定要繼續操作嗎?團隊成員可能會失去對某些儲存庫的操作權限。 -teams.delete_team_success=指定團隊刪除成功! +teams.delete_team_desc=因為刪除此團隊,團隊成員可能會失去對某些儲存庫的操作權限。你想要繼續嗎? +teams.delete_team_success=該團隊已被刪除。 teams.read_permission_desc=該團隊擁有對所屬儲存庫的 讀取 權限,團隊成員可以進行查看和複製等只讀操作。 teams.write_permission_desc=該團隊擁有對所屬儲存庫的 讀取寫入 的權限。 teams.admin_permission_desc=該團隊擁有一定的 管理 權限,團隊成員可以讀取、複製、推送以及新增其它儲存庫協作者。 @@ -957,23 +1080,24 @@ dashboard.statistic_info=Gitea 資料庫統計:%d 位用戶,%d dashboard.operation_name=操作名稱 dashboard.operation_switch=開關 dashboard.operation_run=執行 -dashboard.clean_unbind_oauth=清理未綁定社交帳號 -dashboard.clean_unbind_oauth_success=所有未綁定社交資料清除成功! +dashboard.clean_unbind_oauth=清理未綁定OAuth的連結 +dashboard.clean_unbind_oauth_success=所有未綁定 OAuth 的連結已刪除。 dashboard.delete_inactivate_accounts=刪除所有未啟用帳戶 -dashboard.delete_inactivate_accounts_success=所有未啟用帳號清除成功! +dashboard.delete_inactivate_accounts_success=成功清除所有未啟用帳號! dashboard.delete_repo_archives=刪除所有儲存庫存檔 -dashboard.delete_repo_archives_success=所有儲存庫存檔清除成功! -dashboard.delete_missing_repos=刪除所有丟失 Git 文件的儲存庫記錄 -dashboard.delete_missing_repos_success=成功刪除所有丟失 Git 文件的儲存庫記錄! -dashboard.git_gc_repos=對儲存庫進行垃圾回收 -dashboard.git_gc_repos_success=所有儲存庫的垃圾回收已成功完成! -dashboard.resync_all_sshkeys=重新生成 '.ssh/authorized_keys' 文件(警告:不是 Gitea 的金鑰也會被刪除) -dashboard.resync_all_sshkeys_success=所有公鑰重新生成成功! -dashboard.resync_all_update_hooks=重新生成所有儲存庫的 Update Hook(用於被修改的自定義設定文件) -dashboard.resync_all_update_hooks_success=已成功重新生成所有儲存庫的 Update Hook! -dashboard.reinit_missing_repos=重新初始化所有遺失 Git 檔案的儲存庫記錄 -dashboard.reinit_missing_repos_success=所有遺失 Git 檔案的儲存庫已成功重新初始化。 - +dashboard.delete_repo_archives_success=所有儲存庫存檔已刪除。 +dashboard.delete_missing_repos=刪除所有遺失 Git 檔案的儲存庫記錄 +dashboard.delete_missing_repos_success=所有缺少Git 檔案的儲存庫記錄均已刪除。 +dashboard.git_gc_repos=對所有儲存庫執行垃圾回收 +dashboard.git_gc_repos_success=所有儲存庫的垃圾回收已完成執行。 +dashboard.resync_all_sshkeys=覆寫 '.ssh/authorized_keys ' 檔案 (對於 Gitea SSH 金鑰) +dashboard.resync_all_sshkeys_success=所有公開金鑰已重寫。 +dashboard.resync_all_hooks=重新同步全部儲存庫的 pre-receive, update 和 post-receive hooks +dashboard.resync_all_hooks_success=所有儲存庫的 pre-receive、update、post-receive hooks皆已重新同步。 +dashboard.reinit_missing_repos=重新初始化所有遺失具已存在記錄的Git 儲存庫 +dashboard.reinit_missing_repos_success=所有遺失具已存在記錄的Git 儲存庫已重新初始化。 +dashboard.sync_external_users=同步外部使用者資料 +dashboard.sync_external_users_started=外部使用者同步已啟動 dashboard.server_uptime=服務執行時間 dashboard.current_goroutine=當前 Goroutines 數量 dashboard.current_memory_usage=當前內存使用量 @@ -1004,7 +1128,7 @@ dashboard.total_gc_pause=垃圾收集暫停時間總量 dashboard.last_gc_pause=上次垃圾收集暫停時間 dashboard.gc_times=垃圾收集執行次數 -users.user_manage_panel=用戶管理面版 +users.user_manage_panel=使用者管理面板 users.new_account=建立新的帳戶 users.name=用戶名 users.activated=已啟用 @@ -1014,46 +1138,49 @@ users.created=建立時間 users.last_login=最後登入 users.never_login=尚未登入 users.send_register_notify=向用戶發送註冊通知郵件 -users.new_success=新用戶 '%s' 建立成功! +users.new_success=已建立新帳戶 '%s'。 users.edit=編輯 users.auth_source=認證源 users.local=本地 users.auth_login_name=認證登錄名稱 users.password_helper=留空使其保持不變。 -users.update_profile_success=該用戶訊息更新成功! +users.update_profile_success=帳戶設定檔已更新。 users.edit_account=編輯用戶訊息 users.max_repo_creation=最大儲存庫新增限制 users.max_repo_creation_desc=(設定 -1 使用全域預設限制) -users.is_activated=該用戶已被啟用 -users.prohibit_login=此帳戶禁止登錄 +users.is_activated=此帳戶已完成啟用 +users.prohibit_login=此帳戶被阻止登錄 users.is_admin=該用戶具有管理員權限 -users.allow_git_hook=該帳戶具有建立 Git Hook 的權限 +users.allow_git_hook=此帳戶具有建立 Git hook 的權限 users.allow_import_local=該用戶具有導入本地儲存庫的權限 -users.allow_create_organization=此帳號具有建立組織權限 +users.allow_create_organization=此帳戶擁有建立組織的權限 users.update_profile=更新用戶訊息 users.delete_account=刪除該用戶 -users.still_own_repo=該帳戶仍然是某些儲存庫的擁有者,您必須先轉移或刪除它們才能執行刪除帳戶操作! -users.still_has_org=該帳戶仍舊是某些組織的成員,您必須先使其離開或刪除組織。 -users.deletion_success=用戶刪除成功! +users.still_own_repo=此帳戶仍然擁有一個或多個儲存庫,您必須先刪除或轉移它們。 +users.still_has_org=此帳戶仍然是一個或多個組織的成員,你必須先離開或刪除這些組織。 +users.deletion_success=帳號已成功刪除。 -orgs.org_manage_panel=組織管理面版 +orgs.org_manage_panel=組織管理 orgs.name=組織名稱 orgs.teams=團隊數 orgs.members=成員數 +orgs.new_orga=建立組織 -repos.repo_manage_panel=儲存庫管理界面 +repos.repo_manage_panel=儲存庫管理 repos.owner=所有者 repos.name=儲存庫名稱 repos.private=私有庫 repos.watches=關註數 repos.stars=讚好數 repos.issues=問題數 +repos.size=大小 -auths.auth_manage_panel=認證管理面板 +auths.auth_manage_panel=認證管理 auths.new=新增認證來源 auths.name=認證名稱 auths.type=認證類型 auths.enabled=已啟用 +auths.syncenabled=啟用使用者同步 auths.updated=最後更新時間 auths.auth_type=認證類型 auths.auth_name=認證名稱 @@ -1063,7 +1190,7 @@ auths.host=主機地址 auths.port=主機端口 auths.bind_dn=綁定DN auths.bind_password=綁定密碼 -auths.bind_password_helper=警告:該密碼將會以明文的形式儲存在資料庫中。請不要使用擁有高權限的帳戶! +auths.bind_password_helper=警告:此密碼將以明文形式儲存。請不要使用擁有高權限的帳戶! auths.user_base=用戶搜尋基準 auths.user_dn=用戶 DN auths.attribute_username=用戶名屬性 @@ -1079,21 +1206,41 @@ auths.smtp_auth=SMTP 驗證類型 auths.smtphost=SMTP 主機地址 auths.smtpport=SMTP 主機端口 auths.allowed_domains=域名白名單 -auths.allowed_domains_helper=留空表示不對域名做任何限制。多個域名之間需要使用逗號 ',' 分隔。 +auths.allowed_domains_helper=留空表示允許全部域名。多個域名之間需要使用逗號 ',' 分隔。 auths.enable_tls=啟用 TLS 加密 auths.skip_tls_verify=忽略 TLS 驗證 auths.pam_service_name=PAM 服務名稱 +auths.oauth2_provider=OAuth2 提供者 +auths.oauth2_clientID=用戶端 ID (金鑰) +auths.oauth2_clientSecret=用戶端金鑰 +auths.openIdConnectAutoDiscoveryURL=OpenID 連接自動探索 URL +auths.oauth2_use_custom_url=使用自訂 URL 而非預設 URL +auths.oauth2_tokenURL=Token URL +auths.oauth2_authURL=授權 URL +auths.oauth2_profileURL=個人訊息 URL +auths.oauth2_emailURL=電子郵件 URL auths.enable_auto_register=允許授權用戶自動註冊 auths.tips=幫助提示 +auths.tips.oauth2.general=OAuth2 認證 +auths.tips.oauth2.general.tip=當註冊一個新的 OAuth2 認證,callback/redirect 網址應該是:/user/oauth2//callback +auths.tip.oauth2_provider=OAuth2 提供者 +auths.tip.bitbucket=在 https://bitbucket.org/account/user//oauth-consumers/new 註冊新的 OAuth consumer 並且新增權限"Account"-"Read +auths.tip.dropbox=建立新 App 在 https://www.dropbox.com/developers/apps +auths.tip.facebook=在 https://developers.facebook.com/apps 註冊一個新的應用,並且新增一個產品 "Facebook Login +auths.tip.github=在 https://github.com/settings/applications/new 註冊一個新的 OAuth 應用程式 +auths.tip.gitlab=在 https://gitlab.com/profile/applications 註冊一個新的應用程式 +auths.tip.google_plus=從 Google API 主控台獲得 OAuth2 用戶憑證 (HTTPs://console.developers.google.com/) +auths.tip.openid_connect=使用 OpenID 連接探索 URL (/.well-known/openid-configuration) 來指定節點 +auths.tip.twitter=前往https://dev.twitter.com/apps,建立應用程式並確保"允許此應用程式以Twitter登錄 "選項已啟用。 auths.edit=編輯認證設定 auths.activated=該授權認證已經啟用 -auths.new_success=新的認證來源 "%s" 新增成功! -auths.update_success=認證設定更新成功! +auths.new_success=已增加認證'%s'。 +auths.update_success=認證設定已更新。 auths.update=更新認證設定 -auths.delete=刪除該認證 -auths.delete_auth_title=刪除認證操作 -auths.delete_auth_desc=該認證將被刪除。是否繼續? -auths.still_in_used=一些使用者仍然使用此驗證方式,請先刪除或轉換這些使用者到其它登入類型。 +auths.delete=刪除此認證來源 +auths.delete_auth_title=刪除認證來源 +auths.delete_auth_desc=將刪除此認證,你確定要繼續嗎? +auths.still_in_used=部份使用者仍使用此驗證來源,請先刪除或轉換這些使用者到其它登入類型。 auths.deletion_success=認證源刪除成功! auths.login_source_exist=登入來源 '%s' 已存在 @@ -1101,6 +1248,7 @@ config.server_config=伺服器設定 config.app_name=應用名稱 config.app_ver=應用版本 config.app_url=應用網址 +config.custom_conf=設定檔案路徑 config.domain=應用域名 config.offline_mode=離線模式 config.disable_router_log=關閉路由日誌 @@ -1139,20 +1287,23 @@ config.db_path_helper=(用於 "sqlite3" 和 "tidb") config.service_config=服務設定 config.register_email_confirm=註冊電子郵件確認 config.disable_register=關閉註冊功能 +config.enable_openid_signup=啟用透過 OpenID 註冊 +config.enable_openid_signin=啟用 OpenID 登錄 config.show_registration_button=顯示註冊按鈕 config.require_sign_in_view=強制登錄瀏覽 config.mail_notify=郵件通知提醒 config.disable_key_size_check=禁用金鑰最小長度檢查 config.enable_captcha=啟用驗證碼服務 config.active_code_lives=啟用用戶連結有效期 -config.reset_password_code_lives=重置密碼連結有效期 +config.reset_password_code_lives=重設密碼代碼過期時間 config.default_keep_email_private=隱藏郵件地址的預設值 +config.default_allow_create_organization=建立組織的預設權限 config.no_reply_address=不可回復的郵件地址 config.webhook_config=Webhook 設定 config.queue_length=隊列長度 config.deliver_timeout=推送超時 -config.skip_tls_verify=忽略 TLS 驗證 +config.skip_tls_verify=略過 TLS 驗證 config.mailer_config=郵件設定 config.mailer_enabled=啟用服務 @@ -1161,7 +1312,7 @@ config.mailer_name=發送者名稱 config.mailer_host=郵件主機地址 config.mailer_user=發送者帳號 config.send_test_mail=發送測試郵件 -config.test_mail_failed=無法向 '%s' 發送測試郵件: %v +config.test_mail_failed=發送測試郵件至 '%s' 時失敗:%v config.test_mail_sent=測試電子郵件已發送到 '%s'。 config.oauth_config=社交帳號設定 @@ -1214,7 +1365,7 @@ monitor.start=開始時間 monitor.execute_time=已執行時間 notices.system_notice_list=系統提示管理 -notices.view_detail_header=查看提示詳情 +notices.view_detail_header=查看提示細節 notices.actions=操作 notices.select_all=選取全部 notices.deselect_all=取消所有選取 @@ -1225,7 +1376,7 @@ notices.type=提示類型 notices.type_1=儲存庫 notices.desc=描述 notices.op=操作 -notices.delete_success=系統提示刪除成功! +notices.delete_success=已刪除系統提示。 [action] create_repo=建立了儲存庫 %s @@ -1241,42 +1392,55 @@ comment_issue=`評論了問題 %s#%[2]s` merge_pull_request=`合併了合併請求 %s#%[2]s` transfer_repo=將儲存庫 %s 轉移至 %s push_tag=推送了標籤 %[2]s%[3]s -compare_commits=查看 %d 次提交的內容比對 +compare_commits=比較 %d 提交 [tool] -ago=之前 -from_now=之後 +ago=%s之前 +from_now=%s之後 now=現在 -1s=1 秒%s -1m=1 分鐘%s -1h=1 小時%s -1d=1 天%s -1w=1 周%s -1mon=1 月%s -1y=1 年%s -seconds=%d 秒%s -minutes=%d 分鐘%s -hours=%d 小時%s -days=%d 天%s -weeks=%d 周%s -months=%d 月%s -years=%d 年%s +future=未來 +1s=1 秒 +1m=1 分鐘 +1h=1 小時 +1d=1 天 +1w=1 周 +1mon=1 月 +1y=1 年 +seconds=%d 秒 +minutes=%d 分 +hours=%d 小時 +days=%d 天 +weeks=%d 週 +months=%d 月 +years=%d 年 raw_seconds=秒 raw_minutes=分鐘 [dropzone] -default_message=拖曳文件到此處或單擊上傳 +default_message=拖曳檔案或點選上傳。 invalid_input_type=您不能上傳該類型的文件 -file_too_big=文件大小({{filesize}} MB)超過了最大允許大小({{maxFilesize}} MB) +file_too_big=檔案大小({{filesize}} MB) 超過了最大允許大小({{maxFilesize}} MB) remove_file=移除文件 [notification] notifications=訊息 unread=未讀 read=已讀 -no_unread=您目前沒有未讀訊息。 -no_read=您目前沒有已讀訊息。 -pin=釘上 +no_unread=您沒有任何未讀訊息。 +no_read=您沒有任何已讀訊息。 +pin=固定通知 mark_as_read=標記為已讀 mark_as_unread=標記為未讀 +[gpg] +error.extract_sign=無法提取簽署 +error.generate_hash=無法產生提交的雜湊值 +error.no_committer_account=沒有帳戶連結到提交者的電子郵件 +error.no_gpg_keys_found=沒有發現已知的金鑰在資料庫的簽署中 +error.not_signed_commit=未簽名的提交 +error.failed_retrieval_gpg_keys=找不到任何與該提交者帳戶相關的金鑰 + +[units] +error.no_unit_allowed_repo=在你被允許訪問的儲存庫中找不到任何單元 +error.unit_not_allowed=您未被允許訪問此儲存庫單元 + diff --git a/public/assets/font-awesome-4.6.3/css/font-awesome.min.css b/public/assets/font-awesome-4.6.3/css/font-awesome.min.css deleted file mode 100644 index 9b27f8e..0000000 --- a/public/assets/font-awesome-4.6.3/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/public/assets/font-awesome-4.6.3/fonts/FontAwesome.otf b/public/assets/font-awesome-4.6.3/fonts/FontAwesome.otf deleted file mode 100644 index d4de13e832d567ff29c5b4e9561b8c370348cc9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124988 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ÐT?>-5aYhU|+1c>&YMpPK5x#-mbV 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'NS^o{z1ZKlHsAybrl=JE7AP369ntV%vB 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 CDx5C> diff --git a/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.eot b/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.eot deleted file mode 100644 index c7b00d2ba8896fd29de846b19f89fcf0d56ad152..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76518 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%0DyT{kunD z@IxRd5dG8cB%ivC{el@oX`~o+@gFaWStNM?ePP2;oQjxznuvt`fZ6Byzy1|qLyFz*dy29Gc>q2odt5J?m?L$TUX zDkVVyveNVoHTCp_0uu7oG8q0}SJS!|KT7esIRQPOB*tZqA>e#2Olw(hWqzND zAXED_xybmfrMW%CElQ8kQ5(saRqfyvW-qx`ty{aoUQTWf+PbI%R%KJpGJnZF20A8~ z*Fl;CsazvfsiZS;rUcHJ8uXu*?K=Box7X_C!fEEB2eGY8?D@Sx&H+iZpNEi`DOnA+ z!veHDyn89URFg6B+HWcRzy@O?NI1bdDr?wP2Z}&yU&|IF8EhA}qDQP9V@eCu=E3tk zMiC6E{BZ2-^M~3=_Y^Y4HLa36K~dajGNYDV!C)LM!nS_!+N-IG4`8FBBNC; zM!5T2FkyzpVCvONQkQ~_PM`$dUGs?-HT<%`5c)D7TpflP;xDCc4ab_^Mjn$ z?eT@RRaFivum$;@PFLsT$`}bwbB?e(g`!-yCsNXJEm%|UQ}h?PNv(-wD7g~QRwxO=Q{ zGUpj;eo~UqztIxFE0y9kDlzvI%V&6d!@kLJ+rkC9NA^&sT(sazwPlNWc1ndsVI>`t0uaDG^XK8q^@Z?AdE95Ap8 zK)H;*e66kf!!#c}lIpYjxfQrHcRC|4t+V^G9))cZ@kyp=me_<{_SQi_kjqMFpa6)j z5Td355BKY-ORhPWNI3r47Mgh$4Nl-$%5uRcs3|LPnHIwxRwmXt$ zP76lxKtOmhOU2)YB6Qu?88A#&MiBIAb}1Ou9l-=g6^;EOR^=o+QkiZ+iYC}4QB5OG zpPOfat}EF=W&?Bx3<)&9%EovMk4lCY zGV(4VKuHOpxnf-tG^`QkR@ueqBYxFt)|9+TjFu59h!#n$gpkSjlUPKRzKbPzsZQ zgH|g;h5-L-6Hhn(5XLi&32W%1i9J8LRLo%fCQqG$9@?@Dqvd^RaF2*rc{;=hTnIQf zADj!J2vp3hJv_Vx&B{`CNDx58PJtiMS`O)v;XA7sISZ=Npjy>=%}iJ@+ddQmZNu@0 zGWMhsB-~UEHQ&@-s@ARMOwpFER4Gptin;JeSi{IFSW@vUGd0+IK>bidCpPQwXTg3$BV`D~&`h6#;iu*SA6 zEKlPXR9B#OQz_}8b^lta@csQ24beamVrS>yzpU;(9E_W=Ik8;f~ANfy3Cb6Q+mQ30kCbSGbMGR5Qk!Ph-V>a_VQC^ z@LYqSHf^s^D5n!hXw1Je=0dc#bW@mI)?r|M<*v(I4$4xv?ZF0OL)xzJx8Ny1=6MGX zq#cjc*Rlih<_{zR%44+*+@GtQbcUwa6q-ZH`9`A@VxN6T$x1R!vzmk})+LS-y)lpn z5&@Nw(;$<1E)19v*0jGq2HZr<3i!0w`BTt!n~8s3{l`krCF?Mw3H-41~skM zp%}cIL6C^ZU;2VtQKFDV6BMK=X)tZoG1t|mdi(+RWeh7LaQ?rbxWAd1{rQ7Bj<s2kFTWoOqt#X>rw+HHl`m%`v&Cf zhqiZ;^W~)v4@rrbQ&<7w>^;|tRuW`@DpH{`!wG>S^T&~}9)=}bus_e-H2?#w2rN2B zfy3{C-0Wns;iu!}8!EVs=D^9E?W#dB2@Hw;l_v4u=-Sy5D+mSCg6%~*CMC6TyfJue=I|NzQI|VY_+=61Q z@UjAsPZi=&e#vmLm#uNkR{u-D=^+|aU=x)PfrBE$XB={*4SIYNS0^S3Oun;dB{*iQ z#0COAiP~!1jz>3$>LgzwEbT5lDMzYYc5QuiNx}B-qx6Erf$!@9< z$yTJ2B;A+JyW?<&QAuT8K)wP69RJ)xu%CBsgX5UTRjI7*Ypkl6_wz)1X&a6*Q(=)4 zr$E6`s%`Dbmo0~{SW-JJ%Iy%wu@MtQS8-IRvN>6bJca37bWf~`RO6Pthn!zK2KQ{R=+5|aZ zV3uxy%=Y-hu?u?_V|Z^Ai=*Bk?t%2!%p0QAc46-CDAZ$W*NQ zGjtKFeC-AQ*L3QyB)ts~%wZnI?{Cf^>hdv06iFNH5e^{=1hbNg?L!!q+_`b_e<2j^ zet^5P2QSX-GH5qU_~>I2QMPw2Y>g&J?jTrHVlbgLR)V1fslBUXMelpB^0Q}n zs7SkO%di`ts6il36`mn@6^8&28(&=XP-BW%ICU(reX0VgxxSxi9Hf9Ax_=>P27|*% zz(yPS<|?c_1EgXAvn9l$`C>jWBMxeg9UCG4g+Q=m+msb$&H<{5sGUg$L2aFgAnIJI zJz0kJu~QN@i*dW0?n45!BQWwifozOmg+zh@K0(b_#lBs%M8l}AtxMM^LGIGPvw{g@F21=$X3On4M zoSaa6JTjbhd3+rp2j=Fk$}QT$jzD--8$rkfYfWQwX6-A zQr87-##=eC)gluVaCzOkP2Xp^nh1yi#*?9xxQcRI?+;8YzTJk2MQ`zYCNfxIp=Pfn z)-BLTmhXO)$^Bxi)JB2nPHL1S5c0emi{Sn8eKvQI z0A2Q|iug{>1#IZb`8-wZ2bpuck92|jNi7SYzbpsbp(Tg}^~`en=fkd%5D@B3)eh&J z_$71}%rgl|7v2w|K^A}rch~ALV;Sh=FIgAFS=6uI zft4%}P&z2MqkmLlX$Uo%k7Bbos6h}h8d>-qm@uxkPqMMKK`o$bu)Hz!8LUIMb#*HG zS3{6`j~)w2#p2-V0Qy_b6^In-bndCa*ENSg%SF`V81VZzmjvZkEls9sW3U?_an`LJ z8O+osy|{9$m+YosffHoSm3TPRn6tY8q$>_fU^Jl7ED-nGAaX@QC#lFJ=8H@OVoU@m zC@h*X@yr=$98^3}mH^^IV=NcBqrGsbMTh(pdMay1{!Xwpfz_Y#4o)qC!ZV4T93)Tz z3c{&Bcz>bq>p3-0TDd)#Hd|JcH4p<(?f7#Z4FD)4S}GwATxBU&ued?*zm>{3naP2e z;c_#vRXTl%5<|$*eBOwRa!RPn)?R3aVo{L)hd)GRa9j+LfVgp>#}Q#grK7*jyAuNt z4{Q=O3`>P6vUOE!9SW3sPVf*a&}V?m?LzSdb1gm-coW2Ni}7FmTe^Ff^?@6E-a z@-6(Kbcs_hi7o*8EUBJeof?4}3(!7+KB~}x1z<>JY{?&JMzYw?u%1`FWO=+4wXpH~ zEFERds3%z%)+d=mz99LiQGfviKyN_|pCMQzexoDp`jPv}Q~G-_Os@NkZL)|Rg^_$y z7*XITYy1Zo6c=_NLNTn!!m~^-bG&!c@MTbHbMQ2YHCT~^vtvddDUrb3#xldK$e2XH z8gegt1>IVZpc*>LutJc4B2dU=KAL$Jmmvv--sl`_7^wkai%G|wbKg4JU-)RQ%!7k3 z{DnN`I=^qLoXKlA&u@<1hlEE2)!y3Ohv**vVbN)Tb7|Heu(Q_+F-}kD z{y3*-HJe*bIW(q)5=aAbhVLH=)sY1#6Wj)uH_CZLJlV7apM=~6-o1 zJ+93sq=29)s`pI{VUT>|{OB%fdi%^rjV#`i?G&s!^_*1bl+Wupg&A`#oo&T#WsoA|084|9)=9$fksz;?GjZdFQ%|$2Z>-zGMNX2A znGZt2l09}bdKou$8t@V@K{<2rri)l5t_(B=p~T_}%Fx7=)TYt!2oZumTfTXfhq|F|76iFSsOLA7c%}k>C#pT_-KH3h z`#ET&H&;ah3%1vc2?9^NCF9U>Q>VgZ{12}pG2`;)D}w+PCOnk{6s*AFuKS}Kk{)q$ zZF7h>NNNgT!4yUVAfb#Lwf7w#Ik)XXC)_3|3dXaj^7UvM zBwy$-?jd7`{BMDLJyKgSI2Fz~`gP&R?v|{H?N6nNi<}q~HHP26tzc(_)KvuxYfl-r z)YD;JTZ2aExw~ktuV6{*IiPtk%4UxW9&u~3;*vgjaUA?ENN6<0BV-ym)-^P13-~O%m>Lw!xbAEUU6bYqXHK=>lRRo1de`;RqsY$JUH4Nb&F`)h^D*3{sv9uaeEgif1t^@om@;a&BcB8JfdER0F6@nXmaoJ7pYd zpwP%&8+pw>Mz)~;p6Uh+iTPHN7zUm8kFZwmw=01ZDTW~QA861hHc~hvCD9xN0bU`l_8{aEv_~)@gR!@hU7-YhPG(g389Awe1`o9qVV@I0 z-XeabL6Gn09qT02ZuU$~PNjn4gCU1cd_D|Bub{xYXz;D*&`&%Z9oqMMpt)X@HclNd z?qj|#l9H}OYo{ibBh8~uJ!A!qrC%4g;E9K$`gqo4*X$85#W&pgXKe7&gh;En=j6A* z@tycbJ}6slkO5*!gvshnRQ=;H&6Ox$wi{%Z13A{jKr-md3!=mhLsk=?a-@uH7M<@U zM(NPJ1Mqt3e{$IF(>d^7J>aA`=3<#$AQ~iKMrM^{fMr1El$?no-VCCfTI_mvOdQ#z zj6NtSpZ%Apb)6l@AZo5C@DF2(%NVBf7sj`r3z0VIjA1mxP0C~Ab5!nF*=1@cjAEjw zUMoYbNBhFq=xQ$RLRxXsWwuZpfppsNhuXViX=7SPrVjwOvqS0n{SpBB1e%5!1!?a$ zCqJ7*4~vMMym8}{kQjZL4B>2*1Muw<;WA}p^}58nF&-d4uM{XRQ4A3em{f}l)bg)7 zC7Z|tu?-B89Y0xOv)Dd#@K^f@ob**-ETu2S<5aUmqKR-M^oF38mAH!Z zU=t3!69uJ(l=-v4;}`574129ybuNwJ5QR z3FhJq01*^&uIpE{oM>D4-;1=bJSJ@fh>5U8I^A^~B*Vr_eK{o^s??_o6S!DBu=QNGd;#J^Ftn4rQY0<(Qxc(E;MWaRBXsXm(s(RnQJbTY z9TGr=z?w|}U`$-3M=Xf|{<`>;IM%NdkYFZbU&x z!9ZpzRbZ1y(i$^6u!<35>KLU!WK*-M)`J2^WvEmB(QH8wkA|#WZvQimOu~!_P-_Td zdZvSNDAjOFz)oG1Bz?#7R`NeoKF8W4W^rJwa|2aHqg%#T*pmOI&;khGVqo=ahj^q@JJa0<<8x^}}`T9o`?D zOr%g)ZrTXqIXP~wpvo2(B7zr0CAgHBc#V4Y{5+0n?z1FYfKiAd@8Md5cw6*UG2;VhLza0Xek?e{}C{2_JoOy z4ljYy?jKm5=s5x?jE$2e(w(#gw^NWD7&6vsRtx>`8vz6Y7rY0|%DS1o;THTO&7gwB zBBvx_236z-Y8VBWvY+n-fN>}U|A3#5i|bNSDh{G31gZ_v_F@ANXf<$|vXDSl9fFUU zW&?yh)Ept>a^J8TPV^{Af3I%%8r$`-#=NcMO4m6A8t%Nc0Uz?L zjC`Pm8?cR7jB+H7lJP6R850Zc>;*WD#PHyQHf2PqheXT0H(%_52yW~NNEZLTb=?O88ge_p%V!rB2u-b| zXJNx+LwqZjT$W@G-e)7DCt48`p;w3fpslZ|cLbX*3 z#jpG|#|`EDs&QWoVo;6xO`ln!Eb;)Eu^ufSZ6nLur6f=ueb;@hin8)(!CLPmwY^QP za+9x?Vr!M^_MLP%xL6YS?y*T0Q+5+F{)O2#}DDAf{~{w2jD-2xcCC(nKe)#Zb@(89V@D6=5P?Ys^0wU|`@Z6r1Q9 z96uvQlD%I!kT2`Lg!m0KRos{`Q0xE|fF^J3)DiRd_=hAAOwneADXjwSHfB;fksIIF@8YN(Zq4QL@bkZtQHm zp)C7YIFTOd3ku@`XLzH)zvG5;ujM{t6p2LSU~dpg3E9Fc{2Uv$#sbTG35iKTEQz_? zQ$&h0DV;5MmH08q@5SS>?C4{f3GyH$g4&7s=W045rrnbbf~qOiY&(@jDexe&Iy)mX z#SI(`E}sp~aqdv-*~1y@KXcbNIu6IpBg0?=?kKA{+XOI)%#M;2Z{mV^V%@BMWwP&E z@iWEC57DVRO)LrE0j0VnB$fc{yIpwJ>Ooh$=9OmyUAPAcF%Ufnyk{YpIJVBv1Y@BZ?DT zbFQ%Gx@yLS76X6=%RaneMz2IQ8V=Uiy>d42`=1SJvm+qp(ppoYLkp(L*K!98&H|(% zmliwyj8#7!i3+>v{zQSYAgzo4s2d<2*%18=Pbe^P4A&J^Rm7cB+ z+RPPc1Ga(yzPLrD4VTyECL*%UyzPe#O@N9LxvAPL4FX0A;pIt$#&azo0*O` zGc10|6zA$F0@MVwR0Gcq2MgGSLO?N%3yeLib02_zbskkr{X(aq)b#L}7wU&%U(MZ5 zF%DGOK~~k{o_YbmaBwRlu@e>z7ZoqsQ;pG)p4q@Z2zle3LCCx$p~HYGvs`|ST)?55 z;4e{!+Rt?M7)LQd2^JG?XSGqus(GFXP3S}1}8Ppf(;l8e7da@`U+>Yb3PJ;07?&x z)5{WF#=-FgQ5MJyqeW<)0g8;3*{ziI=}Fs+d^RANJiWlD%6}=qvF!L z9yNJ-t(35D#hq`Li4EKZ1zTCsqT1Yav@kPcvWms)UDj9=47x+~zA>?%t%U{sci#&8c>>b8C$S^HR#+?)9m+>Cri7=D*5uHl~~x;{0$C0TRSa=I|919_oi%R zjgM474vHcf{8lhZg)ub0gCC0kV%27co%C6tQvRsGFraD%W-XK}oVMDx6wNsfiq>gh zycG⋙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 z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.ttf b/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.ttf deleted file mode 100644 index f221e50a2ef60738ba30932d834530cdfe55cb3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152796 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

=v_rA!CPE#mM^4@)}X7qf;At+v)G*FZd&; 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 ALjV8( diff --git a/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.woff b/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.woff deleted file mode 100644 index 6e7483cf61b490c08ed644d6ef802c69472eb247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90412 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%0Ded40&XED0GYFoIh+AV*?9!MR5pBW?X_8Bp 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 IH>08b4`|GD*#H0l diff --git a/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.woff2 b/public/assets/font-awesome-4.6.3/fonts/fontawesome-webfont.woff2 deleted file mode 100644 index 7eb74fd127ee5eddf3b95fee6a20dc1684b0963b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71896 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≠dR0E9ICQ{-tcR;@{R^I5P#1GUH!p=-{c zuc3w;7+BWfGaHj8JK6^F_ud{JF#?=p5IuL6%&BpqXGS{~wMRx;wzW@^P zzUW@Ot)-|dI*HP<%}AdxG=8KzXl^eew9JBUhfnZWKLoxK?HB-a*iv{+&FC9ByM80l^Gei zQ>vs1gSdu|%R^~clqW1HizMeJZ|Uw%65_aMdUAc=1!3QDeKP%EsZ28Zdzg@}Ra@o3o`d(7rU% zr%Mf`gx6r1G)j3PTIP7=RmrzHWJSTZ%8CM}L66{96Ho4D6?_e$&nwU~mxXqb zId&iY3{0N^R#wLfcb@8L^e#OJ0i2H zb1N~AI}Hhrr57~D4e+b*D>)wL^>o&)s8UwztF>$9RS7a?Sw$u3K`tZ*0x?8ZEV-%! zZ(Cu$a0TW-IWz_qLxkLbLdA#(MA#a)4oLRdKYo?%uPGj(X8nN-$ngfAplK!b+*+qu zd(^3srD(1I(q}@BoTVq%c)#*?F6u!kTXOc5e<{PlbM>3-_uc!l7m9~NcH(PIlU^P< zJm0cu@FYZB7yJZljwq`NdTWWwJf>Gmh{QwgZh61R`E)FxUO^-=N zUk_hCvNP$No2rYcET|!l$1|!COnmS_6xl=4AOcijV13+-y5FGgTB)%Z6#$vt0l5yn zc}XjHUE!zsSExQ#F7P{D*A3QC)vRlLf3}afFsGqV0M4(^NIsoho|d7?Ws1E;hZ4fa zOn=}epz9 kgw;ucYbA3cU1VJz%pjZC;Qk%~9{|M8~LQUOASDQR}Rkd4u{d`EM0 z#z42NZm2!myxQVgiOB_;c?k zlt~BrZfgQ()uk$+b4t(W8L1Dq{?-3n(@_7=jLW{gbK47%hqi3Si77PP5j3!pF~)_3 z@i8t~3S}m4z?MnVzPp{(T)K$|;@a7{d#x~^dVqSp>4E!z}v?-=tE(@Q0G6oT-hW6LGZ-|l?8KvgK-NS~Z8J62b zH`CdcT@78ZaY(vf+0yUTNMiVEdQojmS#YO~u19^5U7kkBLFVh#q#gwjQaVjk_E%%Q zW5)ucz5L9OK-D}21^p(t8Ib{#^el3ctEg~To0KMul*p-27#?x<-#cD1#}ww2eL_fD z$v>Fu*LL`g8B#SzuHPXUJLQ_!dJJZCtm=N^==#L_RbvS4CEo-a@9!%5c6iH|l(yhG z-qbeBqno#K{kLzkZTXgQcw5msN*i)Ay=hT5yl>U1tVUFFQ2QjVxnP_hY|JlBw~9K1 zZC4w{qbWrFnYF8`LSf8cLCq+6@ZXXcV}a$ zo@Yk1$idN<~Q@Ropjc;Z8}5`IO{Ii z;YhxD(#zHsPX5FB`-d(6^l6R7HVMMO?3)Hd&$oeHF9riqpq@4o3~N!4HI9g_?3}K? zj6VtI3U(<&t8#t*5(_I63BG)F-cow^%5)1EBDu3Ag?PtT1w=pBmHldGBdQn)KmcQx z!ez5{w7@~_a(Fn0OHJjEh@8Lrg)n8q4hZ)jZ!crLH+Kkg3P>$tNmuSyzuJIdtKj(> z$y{uaQ@nmoq>L`t#+iWJM=?1E&-Z|yHSAdJwNgVedZ?bq^x-0!K?^LO<2t7_iW!?i z7Rx{MS`%5HRM;a&Nh4FyeP>2|HgO+0c`WcSm}tqcnOBI2vW!gFqwTQK_HW*vIGs5khREImcAja+4D9gTh?Gl02cQHw!(s6RP@m*D7e8lI@plF5mU=x z>B&*D`$7Zh2)}t4;=IR(`B#n4U9rp{0im;xr`ucG4i;l{k6W(tLn(AS3kMrEpJD-j zDtbu|B=XcmdhNgUP63C^qV(wlO|bHO-6L!36*Fr>eQq_Ut;Mu)g01bORC}N6Ej@Ai z>Fq67E&kLUilT@ATW23t>Xkn@oa zus>fiWoscKG1089E#0l4{Gqok;irrqTV8br;D^|jhXD*r&bKIt+yLT^!(4mtd)^79 z4yv>VmJOjbe%QF(HxOi}ICFy|*f}*j#(4#h^!X#}@*jp7ru#8oNXmT_TU|36RwO@| zXIzv}x}4oeyS6R)=Z~z(WpDD_Hr8O*>U8Yh#DI8HUF@rFujw7h=+sClO5RzRw0;X} z8vIy}7Fz3yTT`65sM1|cvC$d|a~|hNgh%#6zg4Vtk>Mh*f#I-WOx%Xpy@DzVSyz6! z$!wSj@jl71lonL@{{de#=$fD1%-oV)l=Hc-j9%pMmtDZzk=yu*%BkllK@7(oky2Yu zcXZh z30OLYBbzmZ-#BjBGmL3P<59K&hqsm4*OFTgZL$%f@aQ(oa0eFt^!WQUFCw?z*IPTn zJMHpNua&$Cg9p@osIha9$U3J@3O1K;|59biD!tt(x$JnsvW(NZY3Pj@@gG;>*A zTH+ALGZ}irDadBtsZ*6W8vqk*Dv@*_94NT@%1b+VEL(GPrHv%f?#q^N!aL91_kBo$ z)NG+ZmBsUB82|Wx$I|BpqVVJs&*h_PiCyr>$;pAf<44g!G`;tQdg!9zQ~iX_bC}6A zQ^|ia>VYRu^lI6}&97gdqGGe39K_-x)@@>J6driJ9=LK4i=|SPF(*&FGiXVyCR)*~ zKX*F()X~#IMDkOrB%b=cjJ!Pz-#i``@_l@2EHpT)7o3|AH;^nUE1xWMN{So@0nuGz zQ8~&d&rQx-wW)k~r(djI^ z>#*7_iM8KW0p66fjO#5O)*C%oxTe*!d1vuR_ITN|+3sS1aH68x%;3=Bfs9p$59O|# zug9Nh1hu=rPS12!>HMe*_^s@b6XzuHKiCnJM zE>@rPxYY0Y@9F3MBh4%a(+qO?N57msjUyb=>3p;_1aAT5s^5mVN@eA!Jp z^KUwNathUCqD}hZdHjm)6UIJ&{*XJTCrd~LgHV2<*x@Ecco;(!7K)`gx)mD&Bne?7 zO#n#BYkUsr3_-XV^HPLOQudSO=jHJgI(d*0Lf==E8R{JUb;RLziB0yqyX)e7?mj*1 z%~%By0l;pDB3Q^~=6__-3-5Z3RMPPo5F{5Vn+8L`&f#XMCuI7-wacztV@JjVv350TvMt!zq2O{m*X6fy}e@@IxkM+m`uf1Sou)%DNAY zSSzDjV|tN-;$UpAvK14YVKbFYkw3y6Q` z=K6mofv8g8e9)%wXLKV$=FM0eke6sq+gb{pv=qN9Er%pFUdwOenVUz#N}d^t8(DeD zp>^29oeB&}z!x!A2+~Cy9`$5L6NERF*f!*zu|eEu?&mRQHDNlUF38;+kfL`%vGrWE zMRqubh27W_*HvN~XfXnFgDi+#UU~oaEHw+HFLK#jczPLWFteGLmh=y-+o}OsURw3o z4K6!zf5h6t@S2UTH@4}y_dk8#q1@Z@pi}A)Y(2nNGU)n~!;zg$n)vFDD%n`%`P64m z&t(orRfl)h6o4xl*T{e}8RJr_9s1?eNczsSFxmRZjnBS@HE%eyA^dsyx(|9fn+a6H zhV$8^KlUYjwe>>ICp)<<{j1yuYMc_CLNgVWyzMy+JAKW|@-q{Q2AQ=Xmo}(M!dIkk zZjV-{DRgV3b?ifrY&%k~{N&z;ueyC?anG$IpiHp&)Ysb8`Y;ZgdRx+Isd@u7Yu}ys6^?pi-Cr%Lafb=bmeY9*=7+{Qa%_v z*3fG4hor+^CBaf6n5s3`YHUp|0U#2GUj8ZvV;Gxel4=Yhq|&Uz=cMn3j@r-JzQ zF1Q3ARfhnZqK*f0Il~+`S7BNK=Z>54m5NT^ zeng|4COob$Au+NyCasZEOKLoQWl&*r5V9t3l4R62O|qZNHzC`$J=Sjaa;LxLguL;b zNs~x)XKnO9Rb5i^KPCW#OWQ-bK-shQLFEHMy#W(FLh(44Q4EIXlW{I;;0P*l<5NOvPm^Eb~1XvDpY0%Ge9&Qv(Udp zHo!uS1CDLtXL~AQ)ijtfQlCW43AfK9S77%~dFw}?&82p_#bnTqi^iw*N|(+Rjq;T@ zZns+yr*@N;SIXok9t;W0%Jpru*GocCY@5J%Wptxb*{D#&3;i_rtWEDN8I6+ZD&XHdg?~ z9*9kSZp0`vz>(_;XAc?(UD9%Ff^_LHHE zPMhH~w%0OUnVGM#&rbDcNZUViBO4o>k@^3G^E`V27Ed^#hsWQ-F`tvX!#G%yz_|nR zNxhF{9GDP4uYrE({hvNRrN`!(8l?ZW)x~pz3%bN66ByYK4Mh(3JpzNQ_z-Ov4PU6FH5U+BD^z3%j6M$!M8UPsHF zulFyfveXTAH>T?9Ry^%>tj%{81u4JC*P%bpkI~KMi2h3-lOhU`#S~=9Hq0ep{<}!$HnjI>V?b7k6O;8S~>&` zUZxkWK7F!qrPH;Z-unz7J;5Z`Hy>zjPEKhi?0*@(Ia+2tvaOP5(;M_#;XeO*MW&o2 z<4AT|lNK3+C&JAO!f+=xRa$e34i>s*mgrXJN--{%qmshXY&d4eUX(knipwka>q<`W z>yK~k(42Rvuf8BQgeB*DYsDe1oK0y*kWeIv5gm4S4@u$lDTWBj7+G=tLJP;$QS{Iz zH-!nG*65Pv$dUeO=51l7CITl@t}k@g86e4yVO+aL+bY*S=r6+SvgyZrA-2+M9lAF# zNoc@sJT|#xg~HFgz&Y>gI8lM#UandIFuC4=xTxG4zKC?ayh)&E^6j1SM(OQl;AG!8 zUK{NmnJcYpv%=>za%be&zQGWc9o>e+z7BU@iv;RGGo3yaeP)48H}TC zg%8Ai0hGCa5J(^Yik!)&vBm3*TejTuX)Ip`JCv<)T*8lc*$JKh7ZyFm86u4~DX;Cc zgwu%x5CUTF)BgT}fo=f(^u=RWuZF2G`Pu*ePfMeK4gx#&TIniERLQxGb&K|Y0tg8; zqT&Uz)}6C%DAMpO>-2Pt^96x#VZN?XV8TAw1%@*q<_e#V8G-b`-+0C;E>cAd$H=D? z2%RN%QVen8#*TWc0gN|!g|+>3QdGM9l955UHb9>K2|SPqr_--Mq%vFvt;- z3`Q`@RNqV%XL5F2BDG1&_UwVQg1?hhJV3QX^p|=VXt_OKx1>`8iwkL+Gs$B&Kp*a} zy_(~yWDD5gxtvowfATEXCguKtzcBStJ$m&8fHDBIRrg)@-#`6#J;h^L7iCBcIpeyq zf7(fXxGwR&{(?TcW^QVe!(`Y)raMsRSeZP(dP(QtgLq;dlkR)TqvDkSQP6AIC!Hmo z7q9Aw_$2;BVadV?lx@UxYnd)mOBm9v+g{N!G>_*#DmQ`>l)DAdmmPLB1dz)br0ZkW zy8dc=&fmeOld$M3DSb83u|Dhtb36PArWzgLYK&+;T1OX2r-KHw88W~+5(OwG%J*Ly zgnQDUcJRWkErZ8xi%^i|j7Rh&V^;HMN_QL9=2tnX2VY~=fFJepzk{$%9Vw&j#w>ag z;}K*-fyHs#)#^>{A52;1R=pL8^xT~vmH#;mqeEtWWnGom`eZkV0z0-we zjoZ0MRvzkgYKdwkA{!AqA1TQgI;x~s~kF(%dn(FZ0mF>qHoJm$ZTch)G4r(R-+ zC-AhDS6)_-{I(5bYx)|kczCX&AUU?Dv$y>C$e)vpXW&@*u#M!dEF8RY35bM*ju(`p z;K*~2MXsXrTO+@mDa5gH-;Pw7^H$?NUE=I=4^X%fqY6$6d+`<(`I0r!`86k>H{9F# zUXeRpfO&S_kdQ(J_0JnaN(xBreJI+eu>ZMePvOrFIL(&29w0ORNpYGBVhMtb1Mtl6{OvioEC4|H$ zo-w5*_}~jH9$*_#fpguu_>^)_EcOeB9{FE%tl8INvegmyzoU=^cpNwcqC`sDsL^P(C{c=TO7~Pdw|fPVBfR{q|BuIPOsNma7Z}|($RTYO zE?f7ajj)Vr#v5(c_&#*~Y+Gw_~6vptkceJ;6#AA4{U*G>m zv(t<}@AbfZth$BsgN{kJUQ4`I*>8>?8Nk=3zX?V%kwLG$-9i|(vVKJ6M`!jwoy^SN z=7FOwD=f^3=ZfV@actpRZtw@(j^+)HNl-gZ~_DmlAr+wcNi?V+b}qU;6q?= zcMb0Du7gVm85jueE`RRbt=+fXx38+Zy8G+XRehdL%byGMWw=ETI*Tc$XIVkYXsCVZ zb4N#6EZ-Qo#uYC<)!0ZG)(v6fHg4C8`jx{nW|IC1!LNG4AeKN2JV#qDHPM>^p6uL0 z>sDt9GR-_j@TKZ>xk9%<^4)$Z0~^cEDs)_gzV9)D&!BehM206+ zh}L?Gb?OHTpUvN2!?8v|DZ5qSjW+&#SXC&6!p~)oR}{k%ir*7xyU`bBw$B6F_y&R* zJGXM)P!sN_x?Fwvcl}Vi*TwZFCLhL}Sy(AkQ-O#tK(cQ5gCw6b$%tTc447{$X@Gt4qYl@?zZo zscT?q>xo+eXXdS%1=jkXdHT!tFWA297sM4v?KP52N58N5zWb-#2Z3ReM_Sjzg<}dnBy|GvI zhgapzrd3&*de)CZ!Oh~tL+K5NMR_+D@kp?5);fS&CFcwMo0!7w7ZNMm>>QDX7GHBZh)p-i`3Cbr6`q-0WzGf< z#>Iu=PybFT)E8et6+C+0Um{ezd0GY1nTz!3uAe@VzZLiSWS*nz{Y{by=d6LAtzeYw zwGFvS3S3>F;Z>G1mx2%JKH*NCZ@aP`q&iJcG&4~6o1Nb+L3zU|_0UwVk)0xSgkcXu^f(UaE9@~0>ztQR=w#`0O zTrZx+vX?#Jxh(CfeYELi=fpfM+DiYH6g-ONCiU95Jhw);kgSl7%Hx3zn2MfYJ5|Yw z%F^3xg*>0(y?JanEA{+m;rFeV-Nv!=!HyviDdGTZA?t?eh+u7t43pT(@|jp?PPQyB z&UIB|@1rjRjZ_2nFuxapx`I^gG<*>)xeBqb*N7X@Gbp)y4Fn=V4BpsuXeVYPhQCe2v)Dpw}5=9o9&dT&sh$KQK(W^O?86exnUfRayql~=x_>%Qb z_eEOB9rl9IlYA9e5VbCk{M;Go+sVSuW;xu(hOTUEsb+QU@N?brZ< zPP!)Lp=FXvUB#uOmpVE?c@_=>uMsh0184t<{R&1E~4kxh&46o=yQvQyO!kDegF!4ilCORdzqdzD7sf@iwmJhn9yIaIg!5Xa@)TbSDB;6 zqE4I*l$1vwtNMi@am@s{^KJg*?NEo|?a-1oX+gLm(0jsb6vuWWVf|KwQuQI$83+&M zr0QwGrj1}v{n+h(d6i)C3w^R{RyeTYaxAo!47T#IG%PLGJ2fl;b zGC<;obp}ZfmWeOoP$`xE&CT5}Qz!C8^h~*uA94@*(M7j1*OQ4Edm3;c0IhdttG>Vv zfS@Q6sPL%p)H0|Z8B9ptnr$JWFEeRvm2dr+S2mc;-%J}1f{kAD_c~cSO@ZQR3rFW0 zy*U$ALMUmoIy82fhQQO#)$NImKA)Ep_w|y*{cbw7@fP2|zL6+!3Wy6se|P65FgAE^ zi)tS>wpE^gak zJ*1)MQQ6l1LI4^O|40P$&tnN7Ha1^W?w>DbTVlPOr5;9=y^@E>BZIZDBHhZS2Imah> z@~IG#=!yi*5(}P>-#a~*gd=+QMTmGtaK!n;*q$)UtdZ|Jnao%mtQ-3+Tj&1 z8ak3WU%N*pRJYo((O|@+o1l{l0Iu$3?Q~?zVmhXT%b9{L{^~DkvORw9qukbtK*wfM z>yg{&mbJUR#+E@x8wro`mJT@$r)Xa_c$?7tM4s8v`ko*+VdZ(k9c{+7gNcsO!=GP@ zhn40Qh@a<&w+xHPXZJ(^;XQ{hJK<51R0fWe5#&qhBM#QKO#%D|-sEQCwMbue(x0H{ zJ()+CxWBQ6urBJv@ZRi+MD04)LHRvF)%p>97xuW7XqAF?R@96;@=*pjV+2Y(%{Z64 zg{$0_pl*FYX#$&WR@}z)XEL*Jm3XjJW9Z zGWc+Z{@B3W4SNt#*;VS~;9FyRv2x`1APF4JgUxSuKoWsIah$SQd-`AZso!9T{eyQ9 z?CSZ*2;W%#i>7EUTpe#<^%-Bc%$u+Iut&k#n+(D^O{HSik~y!P-#(`O02?pL2&Ix$ zlMBH_z{Jc|tO8Wu?qjW3C@tFCYvH#J-Ai_=^+W?&zWWnylWZ6P(~aX_U03R-zXasA zK9-(50i8nv9Yo&Z7Uz?^Hb(|q3Y|lfNk<^7cmjVS9yk(~I6ohN?TEe)JfVqC6(Di; zNwCmU!}ruh-@nnbWH7eDJIj(dIU}zTGSBKpg7>%&o#)yNOwq)xfT8RB2c@-zL(~Q9 zApv8k9vfO;X~M1EENU`MxFq!M(U??^>i^Kq(l5dC)bj7Rg6UAL|H|tI=rH0M*_geq z3eUu}uc74YQU*Q8d&Do0-GoFGJ6g1s95ljIR7<(O0jlI)G z4|m{~-IY+6t%u4ZR6;=AGa&=*A~{}{d51QZ6f3-)bEtgaSN~`w&v2#}ZkUdnT(OA^ z+?0)mVG6qRBslfi4`Tmep;vfbx&HG8=UN?vfTc>*mRSkAOBxTumVF^^<=J!26+%3I zmB7HYDc#=ksWY3(c5p4(%^<9*1PbB>yoL&~-a$gLQsOG6*z|eHV|EE`W!Q99)2jvW z8-ZE##B8-cno^e3DB=#5TeNgS&z0@CsvS}&3xq;+zQSZOws`$(4PIp84J(^dpn8;F zsXIlV?#VSF^qPt9=xBSCjmE0p?Xp`XzQV^CPj2e`Xzg2W}5DI?_2U@Ao;@*`?wD;V`zJxUnhZ;=LweQ`=>{G z_X8*r58bqMt=h)4u=k$woYL7nhhg<*w4$o7-x2ulhcE)6tRIqGTQ)8BLY|M{+i#%M z>p-A6s|kcjf5|f`<7mb}-1yd)lJqV`DqE)^Rlp_P5meqJ(-}-n=VXdwMT@%_R({k; zd0g^{uvjy5`&5EwTc!6|v0N-LHN0MM8_>0Xp*&%iCB`+R<)_>TUAIl-U+<#0OZ`<- zX+$S^{bWM(tnZoE9*qrY9!HKrlKk=~af{He5xc2?P!u&2Nm+B|CMh-a2fq%D)_mPr zuC=L?*w<3{RcLY-*mVX@o=0$hN#RXBq0ZGr!)+aioWlVxrGpWs%~bIGh@b(-fE|1!7HhIq~c1z+TVD*Wm=kWdW-NAF=dNcHHkFjp)qmKg7w$5P< zzHxp;+9uaPBU}a-vwu3fyGgs-A>tpO^Q_PdD=Ms;f#|R7eNzxo-g?Sw%H(m&xFYb_U1pZ(S0zwO*kP2 z3i+>%Zu?wZDqz=#!zK7+49R!XH9;=~o_tM*5qurY6}b+%Jz-Wvq|CVDA?o#$lEazq zlTT#3od;swz9mIeL|>4k!?3K36zcNr+RP1_;Gh7)Pp&_#eKmAEVO~$XUoPsL9$ZCD ze>OkB??8cF-QBeCQ#8g%mAg;pQe>i`qd@l-@h)k0V&y{qR+%z@eS>HxLvXx7%cw)` z>LGr~_|e(@BNApWX4Dp%;wsE zeK)2bp8l^hW-c>lc`;S7mDtZ+40BR8+hhtWZDGeH0=OX0K@;7sr_{*}%tz1BD+0E2 zeRg~AyF(B}7?Zo)w}lp|k~g=9%Njkob$*MIr|>ReY#X~sscLrr@>RkADh`Pd?VGf@ z3mS3wkeRCwN`hRmx~<2n#6g6MFF4qxwFnrg#j4A$Z5OLkB21}j9lc=fEn@5xzqE_N zO#VK;GTT1qq3e&O{DMb+gTwIEBYn&t=E?K?%KhS_d-F_$)y6fv<9PQe0Bz7Er10yv z9iNYA>OaV|VR*1Qnx%_S-Y5zS9W7O1m2oel>D}Qle(u7#c{}U8RE>(Rf z{QublBzjET;J)9O%-FHLfBp;2|L@=b8x%$rcDM|O<9{)y2Z5oOxXYC{Y{)hGC&>R9 zh#~<}{egpMNhc4{$Q0UFjr%n3L9$2>1t&Y8d6rGnMrUMxTCj%wC$Hb#R}SPl@0`#B zyMp^s%7_Q=Uu*h-g^%VqI2MiGjl7kV(l+VUW`@r{5p+%vmQmQu)eipI@WykhY6}Ir zt*4XkdmwEoul;g#;Z`$)>Y>ce*Ni3ea1XIC6@x7GS>=d4T39do3lv1TX{YXDKW5=} z0UpLJIc4?md|r$;kVi>N&xG5mh$fFm576b}+pE}G%u)<0@-o;_9k9nx?z?1DaEi?l zr%9Ys+$q4-oO`P|CrFJhg9`F;SRsU`qJvun*mQ_xwQW~OhL60)Eky4ur=RNnc5Q76 zbsQHUO{=KF$=lU(a`{M6Cr5A@^ErOPOa2Rr;P<2&3!J-kxde-jr7fgTSz1F+od<22 z0+(ZMFx0L3>DZ)^J8i8|XDJHxhaXxy_7d2K>@BVI+PuDklz9`vt92BZ{sq@n>bM^? zUog;cSw+uA-;C8A&=5OXxa$Tk$y->^MlBTRp-dODXWrNci*}5%*RJ8DRGzysy;i)p zv5-(*&}vkHK5u2u^U1BWo7T+?s<*F%nS|_(WF`fD1=I|1fe5Kf3UeJg*omEh@x)b? zy}#6R>^fo%pCbmRO#-^tbD=gpLXuJ-J(F2*+$f!BQTBqgA_U{?dqzZ5ft_M>%hl<6 z)Sp`6s$@f66p;imJdLrw?+o%{+O_OsIG>#i+Mx7VLXZ!+OF4BpYvej{Y-7ExN5kqY zcWIg`rJ6c2omTNCCBlLDKNTUhV~%k*ckL3isopY6&yz4Znk(zRlhQtR=7s06z)_tJ zA0(2XUTz)5BPH#Gcm1yd-TbKSt;p?C3r3y}ZOb_r?ECQrGXe4MQ6tJYQGcYq=y!H2 zvM|?b_2MX*Zj33QtrlU&C5Mi;HqNfzR7uev`BZGCl9=p+l|X-=9q~qvu}L_`5-O(A z{XQivf^2z$CPb-rnix2EBjgo;CMb8)3UY0*Ysq~5{En}mQ(SqO$85$y&~`DOQLcoB+UQ_v63sC) zewy&oo|z1(`{t0pBM8i>T(?aS+M4XIg0+$hJ&?{jQNW-@XC}DEu$lCJgUPdFu}Q9w zXT|nCH`h|I{rkb{@4KwF*na%h8tFYA@Pk}lMDO!}Glq)pPxRNaIlnns>5Fhhwh^hQ z`C=7`rD|h)AJAEiQvlOen5Hg=TkoH}|(s z88guDw8K@AA8CX(o?8;zjuV&wEv~Nt5Pzu?=K;HqIIMjh5YN$XTI7_2a@2h~e{ z*-9wY+~5pqBfwpq0?h{6kLNwNGfbCFFv&tiPo>y326>)+ZAg`4p;Uu8CTSMXQlSW^ zasQx)p^x`uT09s&B*e<%n_d_}rUqp(5`M-3U}lkI+zTFfkcbhjalk$0iww z#Ynxxs`ug>!ata-ochEaD3i)%wPxffFn#0YFt-R$V7t+hQhhj06iYHI9WALT*{wrN z_hCO58X;=1!6ah+R%Wv~>olr>R8|6V4*Lr4GA!$XMq)LwN6_&`su%J?M^8y3F_M4z z9rCH+KPk3+kBV#dV0YYA!A3ROtClEeXWbJyb??yC%c~exnn-?bBk5A1p3YE~8kWkNu@$+A4T>Q6@qkHOQ zN|dE!4Z6F{J_RTrHfn0m7u0E~0V*u8bKZ|O{@J~0 zzSO0NZ2vfh_P2c8amEX_9T6V_+7dDU?ZEe!+(BX4$rpB8T=?#I9n+Kmr4`usX3Q0* zsVYbU6rfZF=(Uout@8YFGdYIJ{Wvisr*Yj|$!FeE!w>^3>rqM>y63 zvD?d{k0g}AWC#N&y)8-t3{hId@C}LVX6h!g?PlUIgb~VoCpJ`|pVgeg`e$dkndD^G z;DD(Ab8c8Pu&+{nkv?~d2~h66>u)3{%oj#@!8-=klmW6Qn9ND83=1=2$i)BBaJXkA hYQ7@;&$HadiZ^|NpN=W$zx?7q%qNRS@!^Hye*i}iX8r&G diff --git a/public/assets/octicons-4.3.0/octicons.eot b/public/assets/octicons-4.3.0/octicons.eot deleted file mode 100755 index b4c7a989ae645fe4dcab1dea34cfffa8487b28c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44098 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 - - - -Created by FontForge 20150913 at Mon Jul 11 12:02:11 2016 - By Aaron Shekey - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/assets/octicons-4.3.0/octicons.ttf b/public/assets/octicons-4.3.0/octicons.ttf deleted file mode 100755 index ff0dda18470bed62d7090c8dd6762dba05e098c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43920 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 diff --git a/public/assets/octicons-4.3.0/octicons.woff2 b/public/assets/octicons-4.3.0/octicons.woff2 deleted file mode 100755 index 69e7b2a4044aab1229fb72eee8379df10f82e4cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20248 zcmV)4K+3;&Pew8T0RR9108bbI4*&oF0IQGy08Y060RR9100000000000000000000 z0000#Mn+Uk90p(jg$f8H3729K2nvFnJc0Zf0X7081A=A?f?xmyAO(XD2aj3|fejl1 znP*UL+c>K9W>uYmJ6u5&rJHr8GF4SoH7`NQ7@7}y2?(layLOv^MOsiTtZh-#i?lv= ziQ}}fYdbCXxWdLfGovN-%$E0qk5a~xkKr}Loy}MxEVgTC%C8d_iOnVO!keVG zNyoY&%<4`JWqFjc{4)w-UFj#Q-=wY>`9A~PQ5Ie8`}Z{{x%)RG=mGp7H~6#kd@Q3IW4!$fQ)UF$)wL+d3m*bnd~Y>wngslQbC z|94t80!5zA51O&e(w(MhN#7nRRhqH@2VgUF<#dy5l`2u=Ko2h71A;ep=p?aku6%pn zIDqU-3F`3ku%%tce`Q(!NzNuIghj=?My#dx7m(SvQA9FE5|0N4Zo4H8c>h0N)!uFI zYbTJ|fgnBr$yk}npak!svn*%&ckN6&(dI@HE1Cm`D&ppN3|XWtW7EyRD4b026*0)1*m&EI zQX8#Ojzn&NoCgWW-dTpTCdYba-&d{aSRo`pDEo&5fB^8Lwc|Dc`00rYZi16*Y~b}U z0LDzV0kRJh9s`X=KwtuRPj{GrgIh3aF`ZxC`p?-|viu+9u-wL-UkMLr9FUbSwZ<#F z7%8`3ADTM=%WMP&_0_G_8SfUUKt(F6Q(ND}!p_OVJ1Cm*Okz4SnZrC5vV`TVV+-5a z!vT(Pg7aMA8uxg_3qF06`xN&7zaSJ@jzBp|sYEquQkRBi)|R!4mw#v+6Pac)+2<}` zG0Rx__%?Pm&T;7lH+jGlUVW7OO+KzTwsmq+8L5cB_>Euqi68imulR(IAl~5>&v?Q; z?r@76T;mFtxWF-vaDZKGVI50Yz&vI#gK12mNkNZnj~?$L5_zh;krGi51Tpd7FkvB! zJHJhR^pBx4?|HDmX&%I9*c@igI?`rikiMdh7sUC9HNKx{dI zASDJ6X}?-HN;@u za~SdgO^iD#7zz9&T9LRPsiO8El@3wGi}@2f3r6lUvUBF1$mVRoK|16dpjj&sn7S9C zoFzgXiFDkA_zbxK!?sFB?VBk@#UgAaS2;SsA#|%9s_6T)i^jsK2OAE}8kTXM%9%@# zaahYTCL{9+JR*^Fb1gcWfQ}U@-NG_-q>6zItDXsUviqk|Qsxj# zB`15zaxqbsr%WAW6=$C8mylyNNcjRZvepZ3vY}`->dF#KDi!+3siE8w3Tt>^I;<}9 z-<`s(3Y7^ig1%;@J%b`@%*>{`T0cqNMLy4bpu~;x5-N2WV0kEmM7_Me73!#tnT7y! z#59-#9E;}eAli6RUgQUioD_{tH0o#pp5I)hrYp;Qhth-o5fJ#zd3tjhp}66oPHHN0 zgC@Cl<)0BsS7@^0YQQtGWj>i~1nSh<1pirT9S1j5iQ}O~Wokul;|OQTT|?>Nd4NJB zZv@$_I@$CXf==5*y#fu;rk9X_g$aq-G$VO|cdZWR%jq#X4#z&9@fB*>r0TKZMBnAXX84w^9 zK!8*M0a615!mUmNkAk+Lz&kC0r34K0#gOU=i9omvnTnIYf;Qj2ZKD7s} zi#m#d0c+3(*Pkaq>Vv?Ld%qMIr3*sY4O?W)jY6kUuMN-&VfAYKv2GiyO506Wpc{eh zEKx^$F)(4E^C>U|PX3VyWPTWrF=-elBTSP#>bFr5=!j5IxU(dd&eKm(r^>w&@u_(k zqls$Ks1e^tTNfCS!JZ<>_7xVMl)XVq-S-Q6Qe8tVrfW#__-YbCZ0o~E^vr{6Jj1wx zOD$T728i_}r3#WVm4-|KXNFosO%0%u&WvM9HK81swf{MkL>QZFkOK3lW>o7aX^l!k zjG{~3g=)_eGae_Y*I?dt2v4H$5V~8jre)ZxUYw)SHiegGil}*5Uaq`V=yJCOzuY!Y zpks8UGxY>}u=PdKko(p-mTh1)>ZQ(hLJ+ro{hrr!Ol*#cYdfZP^fhn_T+wYTCxDTj z&OESAxCFu?&Wbe+>g_>ZZ{6#=mJLkg!+(g4;Gw!B)1nM^{YYiC&u9ELZ0MNSwzC_3 z-qw5@TAIsjk~$<)ouGp6mbOs_#lYsc_$^%nYHxd*X#}@+j9J`9Fnwa`wH{Z1->4a% zvzix`=eNZcb5~Eml%|pA=V_K;K4pk301UvwMqnyg1T4W~NwqO#PYK8dzyNG)1SXM9z!Gex1Y`?fux@LM zp)MA;T`13wnY!)Fc)CNBATkrc&XvQ6;x2#z-F-rU?g8i>>|Hb>CLb8kh3lK}z)PHFuNv{+r^Ou9VzTi;NX1*Z=uIc^|WtAT@8)pG#Ab%5-G z#y&vPS$K$HBQSm61j%YZ0znX+a-fQa0)*}Q*eM7_ z_6i8L;C3{iQ;VneCg%Wm4Q;3#2mv}12HC5mD_po8HAFe#O4C)D(NTzoqN&FBMkqRb zGYu22G7bP<gv)*W*|z!s;A!)l>Y<@Buz=92x zCEQ^~lIhFT7M%YTt$Z=(Edx;&{6bQw94dHTC73ciat*O-wpF6<`o^0}zH{L`pY_q- zGeWej!1|Sr=o(XzV5>a1C>qgyKh}~KghB}Km-~_gQk(%35LNTL6op!V)tzSvMh2-8 z5~9Z(4Kb`(Uq?RAF@1;3kE0`@8(F~2K=33>t^p_(j};YMJRQSt?Cd=uZfMy=59Pei=t6s7>znc>kUJKviV$;v^ zizg^YP+^g2Au)(KM~M?JHA9?8_g!OGI^SIMvBh>1#T53g&9#dF+3X4nP1$9QdIy*@ z+bSWVq1Oi|`>J)kRn1V`?FPiInlIe4w;P#6!nO)WBBXIKc|#-y5))8XVH#0~5_CSp zTzBugYj~J9gOM*}sa6afHbMFOeJi1msR7-0XsB7`Jw3LypHHsr?@G^by-1Wu9yu_rK0EQ>u{DI$N%NC@O63=`IOl`ZAIu#4O10Y zm>wZQgM>59-n~lLt|~S=VMKhyWb8_X`$A0Y!VYdHf8~8q#>bkiX{;d6I2eZq+w|p%}xcngQClV`pa#!@zi2J3r*do-#ec&KdEefUR;a5XIo3KTeBj;a6gT|O)*bv$p2`X@6omX zhwLxW(eTJ_=z%)^yxTpjNfMX$EU zeiJ#b)hd8a2KZ7YDAKkK7utRAzS>3f`qa?9C5XJ2|0s-)DESPEo|K$cM@*Iv^tShk z3N9{ZRm>vv+S?k17E@5yVJ(V}c`7QDQ9)oJthhl)skTXuTeTFaNt43UzRNL9)zNOs zQ%9r11n;7%(5fda&t>RVkBBbb=Xl)kc5T)U2_tXZl*OQP+pVjFE zwR&6Mog6qmv6!FEhjFNn7byhaxZdSSYrXJ{LdVwBaC3~^&T1juAfdSVu$Z^5x^URb z+!BgzZD_vFUt&8t_LE=^jSlkA6%V(QscVht6qF?>ccET|P??rwM$Dz)D7Qz>T<9wA z2K)P-*MwLP(wC@R_=!o3r z5A_a)xIapaUW$aOTB~&=M#AM29hstP4qK4COC`w^$JyW(^Fuq#%-nTyd~M91N}WDN z{F3Q&34abL_H-Sp%WTW}vQM{R{VVl1&=P=*3J+>{arFhmG)67B5?lj&;qLvZpG&PC;|x zAcvcpoGQ+f5Y45iy?^EVDT+x2k}K-I3S}aPOF6(=1Vw*K(tJSF8=Zse z7||WqQH5^UGlVX8x8JbUl+T^nnwT$qzgeu~G0IogZyx$DR~I=#@N@g=uQ?LJ39;j? zDbBSwHm|#vsxe!>+tntwoo-wDg;DISZc1T$gl3azw6Gt!(T=0v;(7*^o&EW+t56wd zGH{N?TbOf@nLaB;(NQMma5EDJieUl{+!Tc3&`%H*(L47@t$G!jDw0K}_CQqTpqx+v zku*@viHC}+kPinNYLS?mP5KGiBXCWTZ1V4 zWkHoATel3VAfQw2lO~mT)YJB?L~l+NdIe{2(02)lzUBo);#r9hz9`${K+GcYAcZWE zm#_(C*xhCPy`6%xdu>Qbr&G%yEoRsZ5dl0^4&xW0^h@3gi#dqz;97J;)!dhwE&2jz z+}{4}2>NvDp1SB_>Aq~#=8T3VI#4o7oqIu0M>v5mXY=uZI+8=oc2Ctsz}l!Zip^hKkd0KkCF|RdTd4Z)7Sa zcAXg7T@}TXi@BsCz3X|X55+Z8td1k2>Z55&KyR5$+Rp|7aCFT^J1Tl=1Ub% ztPpt>Q`(N}zHJX4`rdtiM}?XbY(huAh(lCGF@E98NOCTTE-QBRT@@<&U-mKvGV99GCWRqGO4uG+mfiRGML?WZGBv*h z@pG)}x&_Kah0bvk89A*{2;aAR_daI%V)MTJI!$YOp}!6X?0VdnajMD(H17##dA#D9 z#Nd){MXykJ9=StCoo=ISn=CUTDVtvw;}$m#9=MHDYVQ6-4&B|?BYlEn%+SU(36O5C zw%~i-F6{AaDuAp5otR)u(hziX$+-y6?|p}l-e)BKhlIQt0Pwe;v-rZQ$Q$2TtLYwi2* zL3-srndRs_fKvcE0Wc7r1fdTwU3vz&LU$O0G6E+?o0~?A6Ef*M;wZm zK+794O%)xX-VQrqR1DkOO&cWukD{tsx$yQ>DV*}J5Tzr>vPXi2A|Jc{{}mi~HJZY_ zI8h?jG)yfk?dT}?0wZG0mb7V>x8eoiL5U9S(VlW^MDjSD9%(-jt?cUr;=--!@T$_$ z^(43sBw}BIV+kNe+>6HuLHh89a-o#_b9QmSZ;#mh11Ng=!xYgYWcd^azpe4wgkTEY z)?Z`dS_(OtU^-2K$%Xj7m|6kFs85c1LxDTUFN<%zDS3L+Dj)e$M(PmQ=Pd4&#Qgc* zXTc%X*&?*cLS953b&kqPe{G8@kII73lbappE3z(A4?Kx7qTcnNR;6SF#rl46$j#8w zvHz4&eYJ{^UnfU1anU#|p7+{o=ZWD{4cij!A%xl!Eh^M1T?$NEs=c?y+_QnLAj zPWl`XZCxUrp3}cwr=0x6bAGL)iJ~fsZqu!uE(OE7AKgYo&rLXLw&b@a7r#Tbv65Dt zUh}_eoz~n7D7AZW^T6<#Gs6Qfz3~PH`luCNnGVo#ikY@}HqNNr-A+UoV_TgfK$K$t z#)+iNDr`NbS-;=9wK2o$rGBZNo$>`m$Pm$4PCPjxnx-9pSweg}6n9jB|R)J#*hKHobhVseJBNO%dD4bab>Z7*Q>i z9hiT>I$8g^c2)n$^aFaPmbmncnWo&tnI|lzwZ;q?SbQomw0Wc1UuUANY3+5Uv9kC2 zy0~TARc=&t#+JUdTM%aKVr7SN06)7h*D_C$SyV-;P`O;mJZTR|qpo=l{snaWSm%Jq zUGRWWzx^PwMKCS4j5sks2TLZB!x%ZBcNxHP)2TX+mE^|R)W1^(Vlq~t^4;!rb}?VU zbXJka4MR8EMVqbXa;0~IZIZ&JWh;hR#IM)S3RVUa-p+G2_+Sqli==_!tx1F$w zg4|yntb>uyu8IVq;7q-4h71fkkXRLB(5&?%v0d*X)Ab!$zV<0(%H<%@6u;0WI)u97 zl=l-sOIuhhEEbvkB<8Em^-D>oxr+HH?vY*CwH^7(gJ0=Yl%y$&(ceWgSreJsB$8JR zD%xP)5I-^G2f(rUw~RQT(}ctvd|O}hLX3U2yj+Z*JF3OBh7o|kfc`7piw*-A{P>7) zaKrI7d)pz}Y0%+Xb}6qORUCsP><(S2#45eTy3@RsG3CmT??l6it7Pb8Uh(-}j^ zuBl(z@YQ+(?F}oSLr4u!b%|LHYDPAp7G_Pvi#op7oN@f&w<(mxvsBV2M!Mbqq`H~Ur}b+QeW)p@jQ ze~sIz6;cdC2OYqH;WBW7m3Qar@OV(7QhT;<*1|$k2y6f51>%U%o|>1_vbM|u06<&X zi(1j_KC$YqG36FHDtom~2Eh~{XqvzPY~IN=LeMvQfh}tyakF`@0-!wLeL&&oXF+v8 zioA+(iA&>ja3*R?85qpe>N@T9YuD9ol1Q@UcIfMguH(BqQV%{@N~g1USfvM5|A5}@ zrWK`cn<00!=N~Iwo(fvws{ApxBVMN8am1WQ8qs@J`XP5gc_~i53UpkSaV>p~*Q{l> znDgKIAZxN*AxUxXg?33|;t7cMaKw~URoW)VDM@k4k*Fq$f(Tg_@`}BYsN_(j<-He- z1ndHCf!D*T!|yu-UDBR}UYjC)DIm`5Cp%a9UY(Bx?*{_2;By9c7>dOHv#egKBG?4RXo7_pjx@wXSxQg;jB9{26 zN(?yE*9TJ@vbPjW~fxtT{pefXP^BwODs>fp+GRuyG9tG zQy>6@5P=8=15HzsZZ^lr)9RWt%3>l35RfdlHIechOKjd*XKJO=>;>r%kZ4z~m1)y_ z+q_7J&ipkDY}ncsK;VYXKC;^jHt)Wh!U3v@dzsGS{}p=0jLUR~2ke@y1q1s&VM^4)vM$_f{9kkDVPx?le$I>m2)A1uGZu~vP zbYcZZig&k=6eE|5@aM4ZkyH?j-Y}?`fhChp$}kq9rIwA&-5bT6W)ZM|ZcEF(QZ8F( zuYAcWS)Jg0y+fWKxlOn0(DJR$p5tF(M>^^u|M4B0wpNn6{@{z|YcrnN6Ti6UK*x=v zuEo-urJ7*gRZBiRuETf+&kT=lK7Y#qR_r_SNwMB;pUGYM91CA^`@XPv=y!RZ@9>Y! zC+9!Q8M*oPTwskT`_2vOLPp^1H z&zkbz7Uqt0nO?GVP-6O9uIaO2-KcB)udu&jskZez_mpuJYi(ThE)iq2e4?P$3l(pL z<||>?=Bdb}Jzx3Vp0+#d9^Mz`t3RR*Zm|uOu?syw(D6oNbYZth#UO#jg1o?s2??YG zt)YQoSnA>t2G6fz5)O2*Z?#S)hG&^TL$Dw!5=1P3OA8e*^nwrwiAbA@;%8#Pl?ISv zhibjhqj6_U{vK684D zK5xY1yv(?JLGBG3627ZAFDc0JNxOYAZdM<&o@iXZs`=2r9@@9+oTqPpuJN*Sht4(D zriP<&Q=Rc_JktgP(@Ez2h*?~D8wY3RJMWms(v}JQjOj>R^^<@|1EJ{{Mkmy@Xoy!;-u~mfm5K zT1XaDi3ONcBe7&E1CJYGp$Y?_x{s7I3B-5$#9xuX^3|_%(@c8+=#(TKfM*-vx>3K; zl_?^M5Q!KMIZky;EWcd01s zG_?K4kD%VAz-WQF67Y?$y7btodO}T zIm1qJ;%iI-<7kOhxl*0ysyYRp;@a*IQmY0|8NR>y|K>A3;kyKH59YQ$D|);_RL%se z8U4imp*v7hRd73}L z(779iowW=}WQ0isHXF8GalBNtJsb7Mq<>^pZ||TcR4W(%NYF0N=PwV18AWjj+ThwK zkCqn7rS-GYc$a5$+w3uRZ1z+3DO~H36lI_J>G{2PYWG?N(28t%Z47f_g8@)o2c-&O ztXr#FaFSh=41o}&3Kh|ui_~K%DUCqeb!7R^e)xjT7f1G6>^d?3Z6IevHrk)~V}4<8 zJO9QDP`@%GKFZ=Yr_wdVP*ex-3G{_Nqwhb0!s^_>`y^x~Hz&#l=h+Lg#zyuF8m>*0 zHOh4BlWw%E@$=+Rw~Kr*Y=fQOT87obhc zin7FBP6`3d8wmiM6>T@;`T&EtYZ3wDYKyXgs{%ww>C|SWjT{FE;Xp7;q(Z=%cnGd% z7@&r3?VIf1`&A$aLnchbd(3oLnZu+V3T_I4^cI%yiS9)Ah;UsXiGM>_V(~RPda7J^6U}{gzcKbDL^lXhUwN4gqe#rxpek)2V@gNq7RFBTPn=x+{}D#b&P}#VWNNgC-utChqbYqw3e1 zje2cmDMu8lkGJc^P_=b5bu5mYG*mG3-6Gt)C;NAwZ#V0{Ya2r7YY(&~efvt71=lGT zy;jiVf)KTaBZdm=krCN5Gx`8VPmMRl+s&p+;pKaB8@Z^s&a?<6E-c!o76BE7sv#`T z4fiC@GU?Fdx|tN@RPrRXG3^cLV%xQdsbwH_*MsU88x-JIFR_MO@$HQ5SNRugSG9^A zD-n#usRxbn*iF6I{j0zBQ7`hG*KkK~IV8WeT3J&GoJ+=J@gfT3%LNskUqH;o8z3O*qa zgQg7ecK%y|`W6EcU6p8+&O(FR~cVkIKPzC}KogOne2SD^t5t*Qhf>$%fM3NK`cfVnV@UET`x^5 z+ZrYepes!M#>7deL}+Y35hz3_M1(y)tOI~{?W4XhTG+fN94N&v2XoKcoNju2^W83%Ld1$_Y-%yBk{isEx9MdGPsZ_a4D(a@HC;f)nu4yL?|Jr}A_3>dvp{{-%c=H_;y`mg+dm3eWR7ka)iB>Artkyc`Mc1hF zqIb=HVUeTpj8hD~n2|o=BIHQ3O9kpk#dhL|=JD7d19{I{#=(?_-Kl1w0RR3eOD)qh zF00Lz(S~T9PsgP#=z3J^hD6G>v8RU~9fc`9KDZehw% z3S{Bs8m8OMqOL@q*ETciK~Sn<1m4EMBPv4Y^=ffoyQ(*(H%jG1KzJ7ntM}x58o(gh za>o4A2P$sLPy92BSexn>^H8*IdAsSk`aw)Nqeq4uEl&cXhd6O0csi;W>}w|LZ3a_| z7B#i?R6{^TXlhVY%bp7sJc3m`*m@VE z8}dl@!4P2KNFk&$A&`S6&g{?J`2%)->YAr^acKCMoHb3H{9Tgtf*^ek5}{k3Q}#4V zl9OCS1jI07n6ecD zri{1f0UH)K@p$*h!nECYIK01)B?Ua}IW31in@Xa4#JGacC-DyV)AFS}G}{!zpfHVw zVuA|>jB!k?lmv*-GZ0RIkj0T=TeugaYM0II=ikG3RMKmr@(mQ}mP88$$z;K|P-3At zmxx}XUwAH_FEUET1#tmi3T0uHSwf*yj=cyQ0>O;*z$`7;)1FI;s$XyJk{?IzZ#wUc zeH@x9-le-fqsU1svxFBzU6QeAf52i~*myyB#t4jyZDWT(3Yro%(`OdO8@j4jef{#$ z)VpZjbq{lA@=V{3Oy6pfRXH%-hX6z&Qv_qOJxx^Q%K}CRFxpiEpx8&x3Q%&G#)x2GF`hzq;3Yz2bEa69p<(geEU_Q7D?rqVgtv(BX^H~`$Wjp?-Q7BV zP8ynnQ|EH`P_NvD-ne7mHA0c4u8NyFShi^eOOAn=@VD;pdM&gYU3!(HtTJ4E1Xq;_ zR5mMcAHC4T`#4?1;34|V{WAitgpU$RPGyoq$a^`5gOJ1SiOK4`d1ErPYr8rjj;2TI zsvclOOZ_Ul?>1fAlo(7~JRtmSvymLeAFz$hoghhAZBQoNGbc9^G!Iw@pk}qWNiO<2I~Sgc8aYw$vGP03=KC=6=(9T2DoO%=E%I=z#g~-^E1a|d1J&j5pWcq(x@8uTp;R! zM%^8&KJ-h!DpC04+qtMSt=S^W+Gh~q3iP)|QKEdR-_vTf@-&nCBq$g6S2x0!JP<0v6Ra|vv zN3G$==N2B10{S}iA0^aHsy}Wppe;i?4QNoLDN~QC<7&@Ss`!8_-o5bdfn{kLW3**^ z9f5DT4#(C^hoLhRQJ)V*6ma`^ShCgN&2lazF}Vu9fF~P#c7)r(>B^&DMU7V)^eR}m zGBLBRPZ;1mYm9>lV}~Xqv>MgMISkhKdENbQ0~}&rN8mw3?nz2PM+FjLN)w`SrIFe8 z%vu1rs0=`XZW-u1E$R0;%HvNlRq`KSYG5kMR+ApH^Tgy7&m755h!ReWGTB+lbuRVX zqt?7n_=R%T6Rt9!G<0p>9Svwg+Z=_FQVeNoLCA&jM^&WStCbu`CA(?4kYdq)-&ghv!au*WEn(1X_*KX`4&$!7S@hj>G~ChM z-R&}&pW_+8`-W9`+d}A(2L#8AD1a`&flB3&z!DM-Qqg$*EQW<(&uI<|9|Q|eNIS@Z zHExE!A3mScX)3xthGyE*ELmkHoFyX%GQ&wJBh>(>PZbPVEl&!nSgJ`v3{%$;Y7e>& zjn~a*#}oX(gYWY4&Ss0OH_^6yvG`hy5$^jp{44;!zWH8-<$T#U=b zti7fo_QNy*h&AG*LsjaEG=2p4BEdEJKZ2$@WK5I{G9COg)AvsT0G(sJwC z)!u@xU38z7vuY29Rl7SFuG=s)4dHkA4$27*SiyzX9S%zRI8Qm=u*~v}(N>$)l{PGg z#NG7ucWpWH4T_rTHv^XC{s+kNUC*#I9!7SWWn|lm$%%cYt~PH_r>352;N>)fv5t46 zrK8mS3f6LCNcFH(4c%==M~KTAmEv#;D6y$_R-hgcc+2!9))CN!Q95;Iy_`B{u#keK*({x9yoes6UkEgaPAL!!;mC>bxfLD2Y1cFYjE-{V>{T_~^EYa6~_% zOk|)VgR<#_fi0J%1d?S6=?Q(cUMZVWWU!yc?dp;d5yujiiw`OR?yS1Hn*B#8=odLg zXow(N4D07ai6TJ56oaUEl9}&aMs4P{n@)u9;C3T$Pv5mZsdEm>*w7}ofT0O0dOd9X zi7{-C=31yeZZcvryLS~NkdrIu1QnhbzB8DLS`^Uo+c8JRYV2-?o2JAzw=M`A(nj}g zb_O>rsht7euOJysamM@^BEmBQeE`tYAXz_ozQK2HwU<|L1om(wHL(g$H6q}*QbGXQ z^q7M(=(#!Pi&Cb~a}quv!qbUb*ms`UrU-n!QERSuj7ilB;;!oT=GAiOZu(W7W1AWT z*te~H^AH6n)`vx-o3hL{B3f9#x5RE@?L)gCJVCiMjC*rCd5RcR(0mb6+P?~09BjK>WK7zh)||14R2=x>J~C0aKiDuCg6Bj!x$kE}+`_X11 z@LK#?J53UZyd*9J;8}rRaKL7Z)g7yRHacLNj=iwJ)Gc#ifUX+)LIYLS)P(}Fr^t&c zRU#LsWs1#28bP=;O9SvJkm`Y3_uNGnI!?lzYD4Qh!fL|*g|bcSQ1g0C0XmT(y``z> zbph}KA@X~Z)HIGVzfKFpaHrDy*PhgC4hwi}Z6%Joq{(_w_hp%xa{9e<-P%~aeP!F! zRaxX&n#7SwLA=9GEr1|67t{Ul`~q5}ehbB7?3*eF#U0&!M^>&shXkXP&CK0S6hSl? zKA^;ZEK!i_lCMKGDrz4dG5o3}=Cqd*A8_K`@xh2|O*NN^ZkqegNsk`buGvw}#%@(6 z6-_dy06TaR5H(<8vnJCigUNbc265B85;V7A-89EaFL@RMU<3aHMixXbBO3A#*%(>_ z%Jb1YGhq`Ta$8uzfB(8~R^w3Bm;tE~$jKmE0wqKK?g1m9sx?jf?nwE_cT#msJ-Zq_ zR6bLOD`wO>+KUcNs+*C_@_{po#VM<%hfj!JILimgrh!UvPbm$r)fMOo{;d6m7 zTI8y_tx<}~jKteDvQXm39Bq0MY0f;9;AOtbFHABSP+40|?uCX)=Lt0=4Fp$cw>qX0 z2_#?~0^9;6?4~{)9s}#|R>$Cn{ALq|Z+NWsO%(JiNa9!7A};SEL&$x52HCfeehrB{ zCV;`S&xEEDJ&Ml(if-!E#ftbdA;z#5LOh5e?gGj+q&~jr=!Cj*#hTW-2~XD8t>3+m zqD0%Zis=2;Mf9f`lnF2C*8ns2sX%#!1G-(?qYN35f?rhr3Q?l#fK<{IwXsE=rkysZQ1?|m?Lvp1yMDqhyypuF=Hb&#Sq?3PWv6MR z1Wjy1+qfWi>}`|VFI1KHhg!WNHQAm-wWq+33Mwkqai;hxNP%%`1ULtuO6n;pA=cwR zq06~`*3}kyP;(VRxTyC;)x*o|7^---pVy;%5#;q9$G}@LP>3`$Vlti)JHzKh5Tb<2 zBr}L7t_s4F^#gT%irn!&#-eLW_BWX~f@8x==FawsAhcyHY~q&e#t``SJw(hb106tV zhIl`hY=5<}xi5MJ(RMnng&xLr9F!nidT6}&q~B0on_7uJRY~}dYY6h33jP8FW=897 z`kUCMcI+Gnj8}9O7TOktX|#Y40J2Oz4~`8GZkE1-E2MJLAgjjxs3|%X5N$W0hX|Eg zx^Gd)Iph6^czxp%*=TzdIXz;7F=j*tZ>(jakf<_chyp}Us@=m>xIx(WVmTvPIKYN_ z9EQHCOuqxhCgPQdrN^>keE|GN#?It3H+H))u;GI6Sp;F0f+lazWe=t?+rs_21oXUc6e9%Tbr*t8y-M`Fg3ZXWhzD zeKuNK9K$p5waa=&Z;;~*A<*fN7*dF5$Co!RH#f6=d`ak{G?MT0ZFYy(t5>g&R;=pf z>d4??J~?Ck);dfc!UNxQAw&+(?!(K?8|QcgEg0Lyc+}7~ef!tLCNyPOjzJzf1Kq;& zWDUfV1tG}2r+@2lN~_PB;|0UMs{WmdjEjyJR~GrS38#V>JYKj8P8o;GYRBP+G=1K= zXP-5B`Zi!H9}hLhxeL?pooi#&N{leb$(%F__>Dj;t6+gELI%7hg;&@HFmDg&a}(cb zAWh%n$1i!&X7x;_zM<`ao*tFdrEubO@uQKL$Ag}XssIfdJqCM;!G zl7=kyxnQKl=tzH(S==KT58@^6oN&r2^N|@~EB1Ue_^5U_5+!j}Z>%92OE}b_AZ&gV zpc3?`xUl}fIcPb8#M~^4o15iw%hCExf1pJks>T1NsjG&Qv8lR~zN(tjNo!Tt%kwcB z>b`Ez$I-^RKb@FMJ)T53$1_*<6J^%ZK{5$q=R-o0a5^lJq?5bVi}kCs%kBEb$!Wd5 zJ)LphyxiQK&t6||UY^dmce8nYI)XB)Wv-^9Iuz99<9?rA`3DGSB{ZF~VZB+cr_sjn?zBIhbGEKwKb=gCb!iam1$Jtben-K*2n-ceG zX^|#cn1qSu25u5>;NdV^noGNFgdKCnsA03Dq3$o?Q$Nf?SryygfHEtP@j4+aY^3Q~(ZdVoAs_K1v7AAHA zy&{KfBe0S41kdb0eM=Sbv*-sGOQ6JHYtbzIQ9@Pz zN-*X-Ql$@|^rXG)`tl-APV4GfT;|&q#kp+%V3!-HMyE0g0_O_+^E=;jOam*+;d#{? zV~~mR`^Xf z>&3_nXR}3)Rl;ORZnq02pU)2iDhip2sn~_NnqN4n2j4DJHR~aUvI;cbhTz~biI9_i zSuwmzo_Ko_g>N9?M-SV%te-JD|8L6nP(khe`L$5#2P$RBMlH-|FCuf7T_TSDtY_H#9$TJY zD%vv)USiW!Dpf|OpzJv2EnRA+_L=(`L49L$u!G;&)Bw5)o5m)S@Jz~hspF;U%$$ij zZ3-u}ZPwdZ)nK<#X%lB6EykIUjBzG11>;NsG(^M)jME`u|Xqj4taj5Fav zlPwX3C+sHBTujZI712;%Y}l*?^+8MhW{tjSTyE1F&1#rNGlLjzFTRx8Wxjv*j~58a*Rn`__{Ar0z52?FFFg0`(@#DA*rSi!bN8Kh+<5(U z*MfVS;;CI_{SnKT6J9Mhzc{q-d*O0;t!6y=m( z&nnUhal#2};uB3tPYR-y$WO5Jko;qXkaO6lTZDX&L*CJoZwBD?i_MCROmKrh`d;cv zBd)~0)QG^_$e4Qs8Hlv6pBA~GLgXc>^LAXg9d!Z1;ryD!auV5@&vO7}*Gp?8tmZ8Za0Og4|S;fxCG344rhp!-8qU1>r745!dEYVQ)mx44}@fQDG(kFl7Zqh zn(lKL;NUuD4fL$G*{ic0J)cDPcp^@XoS`&yQj*Vkk%BufLhVg2HGrnI|Jb61OY2jE znz`Pm18Y9unghu8_`HIsQ~nQ7aVnR)|K_)I8SGlf7;}eit&txHsOl>EvwdAB$M`NX z4qaX4V2T^M8K>>o#ZQ>3^=f3Rc-t&YPZ<^JzJO&X&5ZMRiT?vQS$g*V;@{sP7ScudXPAt4HR(l);S~YqX&e{BuyA&I z-o9sS9NzhqBWs)mPae`N6;I_-l}&82%!p@Tci^I{Q0KW17X98A(YsK=v)PI?*HH99S*geOLXY^b-ZaE^;2P z*MggxgwI=?NSWFcV)Z}(Ax23*C6Rgi79a=`W61>osbz2P%Ei88-g?LWdf`Q>i)jLJ~gxRA++h(CPr#({s@{Z?pu zd-q3Nni7xL!2(JH*qOHhm>xL`yUZd;BOMb3f=*}$dtir{NrQ-0Yht_2_8r`)df;7F z-`Bo`%Ht&OJ(^}EY=XQ;5xhNs0zDEBE-Ot~sVaai@RS%34Ue zxA*;EwC@++X4`(BjZzjUpOA|Xr`)<@@dqsY)NGqRHhMy1V$(LVIB$J^0twZ^;}f4b46nXd>IBpioC%l?AwoUQYCtnC&fIfl}={^;-sVe%p zuGXt@v)J@)HPpkGgy1^*b3;(1Z4aeK5rjyy;O4<*CT^0_nShvzWngvQry!`4etrP< z183i@6j&{}6hf4X2?FUWrric0A&H6)un4Oah$=Sq@Ch+kR$wU?Vne zw*+9~V3tk(DpB`217|#e^0;}w3Uw1gi|Ns3isiviIa3>C?MwsWrc9zE% zZMout{+R0EYbn)9aQ476CTF?;oOHZEapxZE{4cz??Ao&(|Lh8?t{3~6A^-nVxpbOG z;i*6F9Jvl(dXy5ne?R92ShWoN+l4_mXN-1;A*7vx99k8!Nos1F_-q1qAtmg?#JO#1 zfbHf|3=lko!k4b=lU6{CNX{9gt;)Koko`ISv#Xs5JODlj+uu{S`wao$4FG|Iw`ZrW zZyNdEFJJ?J`47`fSUXtz8)sT>1Ni?y{7)KKzWg_G*ibtNz~=u>%NZIQpyUnyD!_tQ z% z4nR08emF~z!)8rkM#6!!G#uVI%OJ)VQ?_vUwtnjrmAd*{%8-ON)wtuJ%)8_)_LXH4 zthclajMf&hpoW`&1YW!Du$#rUpw0S9r>NA`-=1BDB)o~C0SS`$c}Iy3VYucQ`5Czw z(vw=7#`MM~u$~c0^2f8`HAr?bTF?&M6)uve<~{!Z9~k&Q=ukub-%2+ctxj(+nwb9c zE$V_ZAGfx#wev^#{|k;z&MvNQ?jD|A-acO-6cC1>Fq|M!Xa>vS1yPa}RnraAvK`ms z3xrXeNVB|9R&~>M0sMw>niuP~ALn&@UZ0=8>=|LRMX}E};lfHZsxz0sg^|A;Y>rOO z{z$T-Dujm4z+_=_aC!IwLJ_fqR7S3#R8ebab@T>C6SIZY#_r&BaeH`u{Jj(HkYK}E zmc*r6&MOlE)BB%E(^9P9cwTGk^;DH?l-t+P$#h}Dlj4Z7$>6fjZkHyk*_lr5`A*Tn znY$gECca*(!#2|nE2l{lW-4}ziv<&vaXKS7S~4|Q(w%k3*>+5_>pg_ZeYq(cAXEHr z%ka&+au?h(&{W3@_T!XrTup5|`1_gju$CH+pn(r=HRDuVtG7N+-Jsz6)(f_Lyn~`{ zApaOXw=$sSk^nY338hluNB9D<^eMUlF50C9cR6w&F`~302E1*gh<*Qk^t@NSc6?an z%pqNG%s~iKYZk$+p>LJh(E+X0R3(1yFN4G(;nXb;yBtNZQc54F+xh1i2#XD7rQ*e0 z8Mb{t9gSzu8EWkOL-eJOcy#=?Q4_8zwb?pM!@o9n9#r3@sv5^{tPv$1P52 z4Em^^#JZ+9C*~;&ji`(}QtDjGyVxxcRm=c-z2rBWxXbNfBdYMDSpY#+xp&tp{HNm8(;9QBql(Q9HzHsPGE?;q0ZFzjQy3O^^o)78? jmv8<&luQbF#lM^|bHwYcUGluX<^{o&IkP3ilr#VUw)Oky diff --git a/public/css/gitgraph.css b/public/css/gitgraph.css deleted file mode 100644 index 3eba675..0000000 --- a/public/css/gitgraph.css +++ /dev/null @@ -1,16 +0,0 @@ -body {font:13.34px/1.4 helvetica,arial,freesans,clean,sans-serif;} -em {font-style:normal;} - -#git-graph-container, #rel-container {float:left;} -#rel-container {max-width:30%; overflow-x:auto;} -#git-graph-container {overflow-x:auto; width:100%} -#git-graph-container li {list-style-type:none;height:20px;line-height:20px; white-space:nowrap;} -#git-graph-container li .node-relation {font-family:'Bitstream Vera Sans Mono', 'Courier', monospace;} -#git-graph-container li .author {color:#666666;} -#git-graph-container li .time {color:#999999;font-size:80%} -#git-graph-container li a {color:#000000;} -#git-graph-container li a:hover {text-decoration:underline;} -#git-graph-container li a em {color:#BB0000;border-bottom:1px dotted #BBBBBB;text-decoration:none;font-style:normal;} -#rev-container {width:100%} -#rev-list {margin:0;padding:0 5px 0 5px;min-width:95%} -#graph-raw-list {margin:0px;} \ No newline at end of file diff --git a/public/css/github.min.css b/public/css/github.min.css deleted file mode 100644 index 7b3600c..0000000 --- a/public/css/github.min.css +++ /dev/null @@ -1 +0,0 @@ -.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8}.hljs-comment,.hljs-template_comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.javascript .hljs-title,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:#099}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.coffeescript .hljs-params,.scss .hljs-preprocessor{color:#900;font-weight:bold}.javascript .hljs-title,.lisp .hljs-title,.clojure .hljs-title,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.haskell .hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rules .hljs-property,.django .hljs-tag .hljs-keyword{color:#000080;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body{color:#008080}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in,.lisp .hljs-title,.clojure .hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa} \ No newline at end of file diff --git a/public/css/index.css b/public/css/index.css index a35351e..133af26 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -120,6 +120,13 @@ code.wrap { .ui.right { float: right; } +.ui.button, +.ui.menu .item { + -moz-user-select: auto; + -ms-user-select: auto; + -webkit-user-select: auto; + user-select: auto; +} .ui.container.fluid.padded { padding: 0 10px 0 10px; } @@ -420,6 +427,61 @@ footer .ui.language .menu { background: inherit !important; padding: 0 !important; } +.ui.menu.new-menu { + justify-content: center !important; + padding-top: 15px !important; + margin-top: -15px !important; + margin-bottom: 15px !important; + background-color: #FAFAFA !important; + border-width: 1px !important; +} +@media only screen and (max-width: 1200px) { + .ui.menu.new-menu { + overflow-x: auto !important; + justify-content: left !important; + padding-bottom: 5px; + } + .ui.menu.new-menu::-webkit-scrollbar { + height: 8px; + display: none; + } + .ui.menu.new-menu:hover::-webkit-scrollbar { + display: block; + } + .ui.menu.new-menu::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.01); + } + .ui.menu.new-menu::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.2); + } + .ui.menu.new-menu:after { + position: absolute; + margin-top: -15px; + display: block; + background-image: linear-gradient(to right, rgba(255, 255, 255, 0), #ffffff 100%); + content: ' '; + right: 0; + height: 53px; + z-index: 1000; + width: 60px; + clear: none; + visibility: visible; + } + .ui.menu.new-menu a.item:last-child { + padding-right: 30px !important; + } +} +[v-cloak] { + display: none !important; +} +.repos-search { + padding-bottom: 0 !important; +} +.repos-filter { + margin-top: 0 !important; + border-bottom-width: 0 !important; + margin-bottom: 2px !important; +} .markdown:not(code) { overflow: hidden; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif; @@ -949,6 +1011,26 @@ footer .ui.language .menu { #create-page-form form textarea { width: 50%!important; } +.signin .oauth2 div { + display: inline-block; +} +.signin .oauth2 div p { + margin: 10px 5px 0 0; + float: left; +} +.signin .oauth2 a { + margin-right: 3px; +} +.signin .oauth2 a:last-child { + margin-right: 0px; +} +.signin .oauth2 img { + width: 32px; + height: 32px; +} +.signin .oauth2 img.openidConnect { + width: auto; +} .user.activate form, .user.forgot.password form, .user.reset.password form, @@ -1102,6 +1184,9 @@ footer .ui.language .menu { .new.webhook .events.fields .column { padding-left: 40px; } +.githook textarea { + font-family: monospace; +} .repository { padding-top: 15px; padding-bottom: 80px; @@ -1135,6 +1220,9 @@ footer .ui.language .menu { margin-top: -1px; font-size: 15px; } +.repository .tabs .navbar { + justify-content: initial; +} .repository .navbar { display: flex; justify-content: space-between; @@ -1213,7 +1301,6 @@ footer .ui.language .menu { margin-bottom: 20px; } .repository #clone-panel { - margin-top: -8px; margin-left: 5px; width: 350px; } @@ -1241,9 +1328,12 @@ footer .ui.language .menu { .repository.file.list .choose.reference .header .icon { font-size: 1.4em; } +.repository.file.list .repo-path .section, +.repository.file.list .repo-path .divider { + display: inline; +} .repository.file.list #file-buttons { font-weight: normal; - margin-top: -3px; } .repository.file.list #file-buttons .ui.button { padding: 8px 10px; @@ -1278,6 +1368,9 @@ footer .ui.language .menu { padding-top: 8px; padding-bottom: 8px; } +.repository.file.list #repo-files-table td.message .isSigned { + cursor: default; +} .repository.file.list #repo-files-table tr:hover { background-color: #ffffEE; } @@ -1338,6 +1431,10 @@ footer .ui.language .menu { color: #999; background: #f5f5f5; width: 1%; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; } .repository.file.list #file-content .code-view .lines-num span { line-height: 20px; @@ -1365,7 +1462,7 @@ footer .ui.language .menu { .repository.file.list #file-content .code-view .lines-code ol li, .repository.file.list #file-content .code-view .lines-num .hljs li, .repository.file.list #file-content .code-view .lines-code .hljs li { - display: inline-block; + display: block; width: 100%; } .repository.file.list #file-content .code-view .lines-num pre li.active, @@ -1899,12 +1996,37 @@ footer .ui.language .menu { padding-left: 15px; } .repository #commits-table thead .sha { - font-size: 13px; - padding: 6px 40px 4px 35px; + text-align: center; + width: 140px; +} +.repository #commits-table td.sha .sha.label { + margin: 0; } .repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n) { background-color: rgba(0, 0, 0, 0.02) !important; } +.repository #commits-table td.sha .sha.label.isSigned, +.repository #repo-files-table .sha.label.isSigned { + border: 1px solid #BBB; +} +.repository #commits-table td.sha .sha.label.isSigned .detail.icon, +.repository #repo-files-table .sha.label.isSigned .detail.icon { + background: #FAFAFA; + margin: -6px -10px -4px 0px; + padding: 5px 3px 5px 6px; + border-left: 1px solid #BBB; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.repository #commits-table td.sha .sha.label.isSigned.isVerified, +.repository #repo-files-table .sha.label.isSigned.isVerified { + border: 1px solid #21BA45; + background: #21BA4518; +} +.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon, +.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon { + border-left: 1px solid #21BA4580; +} .repository .diff-detail-box { margin: 15px 0; line-height: 30px; @@ -1968,6 +2090,10 @@ footer .ui.language .menu { color: #A7A7A7; background: #fafafa; width: 1%; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; } .repository .diff-file-box .file-body.file-code .lines-num span.fold { display: block; @@ -2178,15 +2304,15 @@ footer .ui.language .menu { .repository.wiki.view .ui.sub.header { text-transform: none; } -.repository.wiki.view .markdown { +.repository.wiki.view > .markdown { padding: 15px 30px; } -.repository.wiki.view .markdown h1:first-of-type, -.repository.wiki.view .markdown h2:first-of-type, -.repository.wiki.view .markdown h3:first-of-type, -.repository.wiki.view .markdown h4:first-of-type, -.repository.wiki.view .markdown h5:first-of-type, -.repository.wiki.view .markdown h6:first-of-type { +.repository.wiki.view > .markdown h1:first-of-type, +.repository.wiki.view > .markdown h2:first-of-type, +.repository.wiki.view > .markdown h3:first-of-type, +.repository.wiki.view > .markdown h4:first-of-type, +.repository.wiki.view > .markdown h5:first-of-type, +.repository.wiki.view > .markdown h6:first-of-type { margin-top: 0; } .repository.settings.collaboration .collaborator.list { @@ -2214,6 +2340,16 @@ footer .ui.language .menu { margin-left: 26px; padding-top: 0; } +.repository .ui.attached.isSigned.isVerified:not(.positive) { + border-left: 1px solid #A3C293; + border-right: 1px solid #A3C293; +} +.repository .ui.attached.isSigned.isVerified.top:not(.positive) { + border-top: 1px solid #A3C293; +} +.repository .ui.attached.isSigned.isVerified:not(.positive):last-child { + border-bottom: 1px solid #A3C293; +} .user-cards .list { padding: 0; } @@ -2259,6 +2395,9 @@ footer .ui.language .menu { #search-user-box .results .item img { margin-right: 8px; } +.issue-actions { + display: none; +} .issue.list { list-style: none; padding-top: 15px; @@ -2315,83 +2454,38 @@ footer .ui.language .menu { .settings .content .segment { box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15); } -.settings .key.list .item:not(:first-child) { +.settings .list > .item .green { + color: #21BA45 !important; +} +.settings .list > .item:not(:first-child) { border-top: 1px solid #eaeaea; + padding: 1rem; + margin: 15px -1rem -1rem -1rem; } -.settings .key.list .ssh-key-state-indicator { - float: left; - color: gray; - padding-left: 10px; - padding-top: 10px; +.settings .list > .item > .mega-octicon { + display: table-cell; } -.settings .key.list .ssh-key-state-indicator.active { - color: #6cc644; +.settings .list > .item > .mega-octicon + .content { + display: table-cell; + padding: 0 0 0 .5em; + vertical-align: top; } -.settings .key.list .meta { - padding-top: 5px; -} -.settings .key.list .print { - color: #767676; -} -.settings .key.list .activity { - color: #666; -} -.settings .hook.list > .item:not(:first-child) { - border-top: 1px solid #eaeaea; -} -.settings .hook.list .item { - padding: 10px 20px; -} -.settings .hook.list .item .octicon, -.settings .hook.list .item .fa { - width: 20px; - text-align: center; -} -.settings .hook.list .item a { - /* These are technically the same, but use both */ - overflow-wrap: break-word; - word-wrap: break-word; - -ms-word-break: break-all; - /* This is the dangerous one in WebKit, as it breaks things wherever */ - word-break: break-all; - /* Instead use this non-standard one: */ - word-break: break-word; - /* Adds a hyphen where the word breaks, if supported (No Blink) */ - -ms-hyphens: auto; - -moz-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} -.settings .hook.history.list .item { - padding-left: 13px; -} -.settings .hook.history.list .item .meta .ui.right { - margin-top: 5px; -} -.settings .hook.history.list .item .meta .ui.right .time { - font-size: 12px; -} -.settings .hook.history.list .item .info { +.settings .list > .item .info { margin-top: 10px; } -.settings .hook.history.list .item .info .tabular.menu .item { - font-weight: 500; -} -.settings .hook.history.list .item .info .tab.segment { +.settings .list > .item .info .tab.segment { border: none; - padding: 0; - padding-top: 10px; - box-shadow: none; + padding: 10px 0 0; } -.settings .hook.history.list .item .info .tab.segment > * { +.settings .list.key .meta { + padding-top: 5px; color: #666; } -.settings .hook.history.list .item .info .tab.segment pre { - word-wrap: break-word; +.settings .list.email > .item:not(:first-child) { + min-height: 60px; } -.settings .hook.history.list .item .info .tab.segment pre .hljs { +.settings .list.collaborator > .item { padding: 0; - background-color: inherit; } .ui.vertical.menu .header.item { font-size: 1.1em; @@ -2535,6 +2629,17 @@ footer .ui.language .menu { .CodeMirror .cm-comment { background: inherit !important; } +.repository.file.editor .tab[data-tab="write"] { + padding: 0 !important; +} +.repository.file.editor .tab[data-tab="write"] .editor-toolbar { + border: none !important; +} +.repository.file.editor .tab[data-tab="write"] .CodeMirror { + border-left: none; + border-right: none; + border-bottom: none; +} .organization { padding-top: 15px; padding-bottom: 80px; @@ -2668,16 +2773,6 @@ footer .ui.language .menu { padding-top: 15px; padding-bottom: 80px; } -.user.settings .list .item.ui.grid { - margin-top: 15px; -} -.user.settings .email.list .item:not(:first-child) { - border-top: 1px solid #eaeaea; - height: 50px; -} -.user.settings .email.list .item:not(:first-child) .button { - margin-top: -10px; -} .user.profile .ui.card .username { display: block; } @@ -2742,6 +2837,10 @@ footer .ui.language .menu { .user.notification .octicon.blue { color: #2185d0; } +.user.link-account:not(.icon) { + padding-top: 15px; + padding-bottom: 5px; +} .dashboard { padding-top: 15px; padding-bottom: 80px; @@ -2912,12 +3011,12 @@ footer .ui.language .menu { margin: 0; } .admin dl.admin-dl-horizontal dd { - margin-left: 240px; + margin-left: 275px; } .admin dl.admin-dl-horizontal dt { font-weight: bolder; float: left; - width: 250px; + width: 285px; clear: left; overflow: hidden; text-overflow: ellipsis; @@ -2930,6 +3029,14 @@ footer .ui.language .menu { padding-top: 15px; padding-bottom: 80px; } +.explore .navbar { + justify-content: center; + padding-top: 15px !important; + margin-top: -15px !important; + margin-bottom: 15px !important; + background-color: #FAFAFA !important; + border-width: 1px !important; +} .explore .navbar .octicon { width: 16px; text-align: center; @@ -2983,24 +3090,3 @@ footer .ui.language .menu { .ui.user.list .item .description a:hover { text-decoration: underline; } -.user.link-account:not(.icon) { - padding-top: 15px; - padding-bottom: 5px; -} -.signin .oauth2 div { - display: inline-block; -} -.signin .oauth2 div p { - margin: 10px 5px 0 0; - float: left; -} -.signin .oauth2 a { - margin-right: 5px; -} -.signin .oauth2 a:last-child { - margin-right: 0px; -} -.signin .oauth2 img { - width: 32px; - height: 32px; -} \ No newline at end of file diff --git a/public/css/semantic-2.2.1.min.css b/public/css/semantic-2.2.1.min.css deleted file mode 100755 index 6f913e1..0000000 --- a/public/css/semantic-2.2.1.min.css +++ /dev/null @@ -1,11 +0,0 @@ - /* - * # Semantic UI - 2.2.1 - * https://github.com/Semantic-Org/Semantic-UI - * http://www.semantic-ui.com/ - * - * Copyright 2014 Contributors - * Released under the MIT license - * http://opensource.org/licenses/MIT - * - */ -*,:after,:before{box-sizing:inherit}html{box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}input[type=text],input[type=email],input[type=search],input[type=password]{-webkit-appearance:none;-moz-appearance:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0;color:#4183C4;text-decoration:none}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,optgroup,strong{font-weight:700}dfn{font-style:italic}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}body,html{height:100%}html{font-size:14px}body{margin:0;padding:0;overflow-x:hidden;min-width:320px;background:#FFF;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:14px;line-height:1.4285em;color:rgba(0,0,0,.87);font-smoothing:antialiased}h1,h2,h3,h4,h5{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;line-height:1.2857em;margin:calc(2rem - .14285em) 0 1rem;font-weight:700;padding:0}h1{min-height:1rem;font-size:2rem}h2{font-size:1.714rem}h3{font-size:1.28rem}h4{font-size:1.071rem}h5{font-size:1rem}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,p:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,p:last-child{margin-bottom:0}p{margin:0 0 1em;line-height:1.4285em}a:hover{color:#1e70bf;text-decoration:none}::-webkit-selection{background-color:#CCE2FF;color:rgba(0,0,0,.87)}::-moz-selection{background-color:#CCE2FF;color:rgba(0,0,0,.87)}::selection{background-color:#CCE2FF;color:rgba(0,0,0,.87)}input::-webkit-selection,textarea::-webkit-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::-moz-selection,textarea::-moz-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::selection,textarea::selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}.ui.button{cursor:pointer;display:inline-block;min-height:1em;outline:0;border:none;vertical-align:baseline;background:#E0E1E2;color:rgba(0,0,0,.6);font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0 .25em 0 0;padding:.78571429em 1.5em;text-transform:none;text-shadow:none;font-weight:700;line-height:1em;font-style:normal;text-align:center;text-decoration:none;border-radius:.28571429rem;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;will-change:'';-webkit-tap-highlight-color:transparent}.ui.button:hover{background-color:#CACBCD;background-image:none;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;color:rgba(0,0,0,.8)}.ui.button:hover .icon{opacity:.85}.ui.button:focus{background-color:#CACBCD;color:rgba(0,0,0,.8);background-image:''!important;box-shadow:''!important}.ui.button:focus .icon{opacity:.85}.ui.active.button:active,.ui.button:active{background-color:#BABBBC;background-image:'';color:rgba(0,0,0,.9);box-shadow:0 0 0 1px transparent inset,none}.ui.active.button{background-color:#C0C1C2;background-image:none;box-shadow:0 0 0 1px transparent inset;color:rgba(0,0,0,.95)}.ui.active.button:hover{background-color:#C0C1C2;background-image:none;color:rgba(0,0,0,.95)}.ui.active.button:active{background-color:#C0C1C2;background-image:none}.ui.loading.loading.loading.loading.loading.loading.button{position:relative;cursor:default;text-shadow:none!important;color:transparent!important;opacity:1;pointer-events:auto;-webkit-transition:all 0s linear,opacity .1s ease;transition:all 0s linear,opacity .1s ease}.ui.loading.button:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.ui.loading.button:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#FFF transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.ui.labeled.icon.loading.button .icon{background-color:transparent;box-shadow:none}@-webkit-keyframes button-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes button-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.basic.loading.button:not(.inverted):before{border-color:rgba(0,0,0,.1)}.ui.basic.loading.button:not(.inverted):after{border-top-color:#767676}.ui.button:disabled,.ui.buttons .disabled.button,.ui.disabled.active.button,.ui.disabled.button,.ui.disabled.button:hover{cursor:default;opacity:.45!important;background-image:none!important;box-shadow:none!important;pointer-events:none!important}.ui.basic.buttons .ui.disabled.button{border-color:rgba(34,36,38,.5)}.ui.animated.button{position:relative;overflow:hidden;padding-right:0!important;vertical-align:middle;z-index:1}.ui.animated.button .content{will-change:transform,opacity}.ui.animated.button .visible.content{position:relative;margin-right:1.5em;left:auto;right:0}.ui.animated.button .hidden.content{position:absolute;width:100%;top:50%;left:auto;right:-100%;margin-top:-.5em}.ui.animated.button .hidden.content,.ui.animated.button .visible.content{-webkit-transition:right .3s ease 0s;transition:right .3s ease 0s}.ui.animated.button:focus .visible.content,.ui.animated.button:hover .visible.content{left:auto;right:200%}.ui.animated.button:focus .hidden.content,.ui.animated.button:hover .hidden.content{left:auto;right:0}.ui.vertical.animated.button .hidden.content,.ui.vertical.animated.button .visible.content{-webkit-transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,transform .3s ease;transition:top .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.vertical.animated.button .visible.content{-webkit-transform:translateY(0);transform:translateY(0);right:auto}.ui.vertical.animated.button .hidden.content{top:-50%;left:0;right:auto}.ui.vertical.animated.button:focus .visible.content,.ui.vertical.animated.button:hover .visible.content{-webkit-transform:translateY(200%);transform:translateY(200%);right:auto}.ui.vertical.animated.button:focus .hidden.content,.ui.vertical.animated.button:hover .hidden.content{top:50%;right:auto}.ui.fade.animated.button .hidden.content,.ui.fade.animated.button .visible.content{-webkit-transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,transform .3s ease;transition:opacity .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.fade.animated.button .visible.content{left:auto;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.fade.animated.button .hidden.content{opacity:0;left:0;right:auto;-webkit-transform:scale(1.5);transform:scale(1.5)}.ui.fade.animated.button:focus .visible.content,.ui.fade.animated.button:hover .visible.content{left:auto;right:auto;opacity:0;-webkit-transform:scale(.75);transform:scale(.75)}.ui.fade.animated.button:focus .hidden.content,.ui.fade.animated.button:hover .hidden.content{left:0;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.inverted.button{box-shadow:0 0 0 2px #FFF inset!important;background:0 0;color:#FFF;text-shadow:none!important}.ui.inverted.buttons .button{margin:0 0 0 -2px}.ui.inverted.buttons .button:first-child{margin-left:0}.ui.inverted.vertical.buttons .button{margin:0 0 -2px}.ui.inverted.vertical.buttons .button:first-child{margin-top:0}.ui.inverted.button.active,.ui.inverted.button:focus,.ui.inverted.button:hover{background:#FFF;box-shadow:0 0 0 2px #FFF inset!important;color:rgba(0,0,0,.8)}.ui.inverted.button.active:focus{background:#DCDDDE;box-shadow:0 0 0 2px #DCDDDE inset!important;color:rgba(0,0,0,.8)}.ui.labeled.button:not(.icon){display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;background:0 0!important;padding:0!important;border:none!important;box-shadow:none!important}.ui.labeled.button>.button{margin:0}.ui.labeled.button>.label{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin:0 0 0 -1px!important;padding:'';font-size:1em;border-color:rgba(34,36,38,.15)}.ui.labeled.button>.tag.label:before{width:1.85em;height:1.85em}.ui.labeled.button:not([class*="left labeled"])>.button{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.button:not([class*="left labeled"])>.label,.ui[class*="left labeled"].button>.button{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*="left labeled"].button>.label{border-top-right-radius:0;border-bottom-right-radius:0}.ui.facebook.button{background-color:#3B5998;color:#FFF;text-shadow:none;background-image:none;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.facebook.button:hover{background-color:#304d8a;color:#FFF;text-shadow:none}.ui.facebook.button:active{background-color:#2d4373;color:#FFF;text-shadow:none}.ui.twitter.button{background-color:#0084B4;color:#FFF;text-shadow:none;background-image:none;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.twitter.button:hover{background-color:#00719b;color:#FFF;text-shadow:none}.ui.twitter.button:active{background-color:#005f81;color:#FFF;text-shadow:none}.ui.google.plus.button{background-color:#DC4A38;color:#FFF;text-shadow:none;background-image:none;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.google.plus.button:hover{background-color:#de321d;color:#FFF;text-shadow:none}.ui.google.plus.button:active{background-color:#bf3322;color:#FFF;text-shadow:none}.ui.linkedin.button{background-color:#1F88BE;color:#FFF;text-shadow:none}.ui.linkedin.button:hover{background-color:#147baf;color:#FFF;text-shadow:none}.ui.linkedin.button:active{background-color:#186992;color:#FFF;text-shadow:none}.ui.youtube.button{background-color:#CC181E;color:#FFF;text-shadow:none;background-image:none;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.youtube.button:hover{background-color:#bd0d13;color:#FFF;text-shadow:none}.ui.youtube.button:active{background-color:#9e1317;color:#FFF;text-shadow:none}.ui.instagram.button{background-color:#49769C;color:#FFF;text-shadow:none;background-image:none;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.instagram.button:hover{background-color:#3d698e;color:#FFF;text-shadow:none}.ui.instagram.button:active{background-color:#395c79;color:#FFF;text-shadow:none}.ui.pinterest.button{background-color:#00ACED;color:#FFF;text-shadow:none;background-image:none;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pinterest.button:hover{background-color:#0099d4;color:#FFF;text-shadow:none}.ui.pinterest.button:active{background-color:#0087ba;color:#FFF;text-shadow:none}.ui.vk.button{background-color:#4D7198;color:#FFF;background-image:none;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.vk.button:hover{background-color:#41648a;color:#FFF}.ui.vk.button:active{background-color:#3c5876;color:#FFF}.ui.button>.icon:not(.button){height:.85714286em;opacity:.8;margin:0 .42857143em 0 -.21428571em;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;vertical-align:'';color:''}.ui.button:not(.icon)>.icon:not(.button){margin:0 .42857143em 0 -.21428571em}.ui.button:not(.icon)>.right.icon:not(.button){margin:0 -.21428571em 0 .42857143em}.ui[class*="left floated"].button,.ui[class*="left floated"].buttons{float:left;margin-left:0;margin-right:.25em}.ui[class*="right floated"].button,.ui[class*="right floated"].buttons{float:right;margin-right:0;margin-left:.25em}.ui.compact.button,.ui.compact.buttons .button{padding:.58928571em 1.125em}.ui.compact.icon.button,.ui.compact.icon.buttons .button{padding:.58928571em}.ui.compact.labeled.icon.button,.ui.compact.labeled.icon.buttons .button{padding:.58928571em 3.69642857em}.ui.mini.button,.ui.mini.buttons .button,.ui.mini.buttons .or{font-size:.78571429rem}.ui.tiny.button,.ui.tiny.buttons .button,.ui.tiny.buttons .or{font-size:.85714286rem}.ui.small.button,.ui.small.buttons .button,.ui.small.buttons .or{font-size:.92857143rem}.ui.button,.ui.buttons .button,.ui.buttons .or{font-size:1rem}.ui.large.button,.ui.large.buttons .button,.ui.large.buttons .or{font-size:1.14285714rem}.ui.big.button,.ui.big.buttons .button,.ui.big.buttons .or{font-size:1.28571429rem}.ui.huge.button,.ui.huge.buttons .button,.ui.huge.buttons .or{font-size:1.42857143rem}.ui.massive.button,.ui.massive.buttons .button,.ui.massive.buttons .or{font-size:1.71428571rem}.ui.icon.button,.ui.icon.buttons .button{padding:.78571429em}.ui.icon.button>.icon,.ui.icon.buttons .button>.icon{opacity:.9;margin:0;vertical-align:top}.ui.basic.button,.ui.basic.buttons .button{background:0 0!important;color:rgba(0,0,0,.6)!important;font-weight:400;border-radius:.28571429rem;text-transform:none;text-shadow:none!important;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.basic.buttons{box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem}.ui.basic.button:focus,.ui.basic.button:hover,.ui.basic.buttons .button:focus,.ui.basic.buttons .button:hover{background:#FFF!important;color:rgba(0,0,0,.8)!important;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.basic.button:active,.ui.basic.buttons .button:active{background:#F8F8F8!important;color:rgba(0,0,0,.9)!important;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset}.ui.basic.active.button,.ui.basic.buttons .active.button{background:rgba(0,0,0,.05)!important;box-shadow:''!important;color:rgba(0,0,0,.95)}.ui.basic.active.button:hover,.ui.basic.buttons .active.button:hover{background-color:rgba(0,0,0,.05)}.ui.basic.buttons .button:hover{box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .active.button{box-shadow:rgba(34,36,38,.35) inset}.ui.basic.inverted.button,.ui.basic.inverted.buttons .button{background-color:transparent!important;color:#F9FAFB!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important}.ui.basic.inverted.button:focus,.ui.basic.inverted.button:hover,.ui.basic.inverted.buttons .button:focus,.ui.basic.inverted.buttons .button:hover{color:#FFF!important;box-shadow:0 0 0 2px #fff inset!important}.ui.basic.inverted.button:active,.ui.basic.inverted.buttons .button:active{background-color:rgba(255,255,255,.08)!important;color:#FFF!important;box-shadow:0 0 0 2px rgba(255,255,255,.9) inset!important}.ui.basic.inverted.active.button,.ui.basic.inverted.buttons .active.button{background-color:rgba(255,255,255,.08);color:#FFF;text-shadow:none;box-shadow:0 0 0 2px rgba(255,255,255,.7) inset}.ui.basic.inverted.active.button:hover,.ui.basic.inverted.buttons .active.button:hover{background-color:rgba(255,255,255,.15);box-shadow:0 0 0 2px #fff inset!important}.ui.basic.buttons .button{border-radius:0;border-left:1px solid rgba(34,36,38,.15);box-shadow:none}.ui.basic.vertical.buttons .button{border-left:none;border-left-width:0;border-top:1px solid rgba(34,36,38,.15)}.ui.basic.vertical.buttons .button:first-child{border-top-width:0}.ui.labeled.icon.button,.ui.labeled.icon.buttons .button{position:relative;padding-left:4.07142857em!important;padding-right:1.5em!important}.ui.labeled.icon.button>.icon,.ui.labeled.icon.buttons>.button>.icon{position:absolute;height:100%;line-height:1;border-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit;text-align:center;margin:0;width:2.57142857em;background-color:rgba(0,0,0,.05);color:'';box-shadow:-1px 0 0 0 transparent inset;top:0;left:0}.ui[class*="right labeled"].icon.button{padding-right:4.07142857em!important;padding-left:1.5em!important}.ui[class*="right labeled"].icon.button>.icon{left:auto;right:0;border-radius:0;border-top-right-radius:inherit;border-bottom-right-radius:inherit;box-shadow:1px 0 0 0 transparent inset}.ui.labeled.icon.button>.icon:after,.ui.labeled.icon.button>.icon:before,.ui.labeled.icon.buttons>.button>.icon:after,.ui.labeled.icon.buttons>.button>.icon:before{display:block;position:absolute;width:100%;top:50%;text-align:center;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ui.labeled.icon.buttons .button>.icon{border-radius:0}.ui.labeled.icon.buttons .button:first-child>.icon{border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.labeled.icon.buttons .button:last-child>.icon{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:first-child>.icon{border-radius:.28571429rem 0 0}.ui.vertical.labeled.icon.buttons .button:last-child>.icon{border-radius:0 0 0 .28571429rem}.ui.fluid[class*="left labeled"].icon.button,.ui.fluid[class*="right labeled"].icon.button{padding-left:1.5em!important;padding-right:1.5em!important}.ui.button.toggle.active,.ui.buttons .button.toggle.active,.ui.toggle.buttons .active.button{background-color:#21BA45!important;box-shadow:none!important;text-shadow:none;color:#FFF!important}.ui.button.toggle.active:hover{background-color:#16ab39!important;text-shadow:none;color:#FFF!important}.ui.circular.button{border-radius:10em}.ui.circular.button>.icon{width:1em;vertical-align:baseline}.ui.buttons .or{position:relative;width:.3em;height:2.57142857em;z-index:3}.ui.buttons .or:before{position:absolute;text-align:center;border-radius:500rem;content:'or';top:50%;left:50%;background-color:#FFF;text-shadow:none;margin-top:-.89285714em;margin-left:-.89285714em;width:1.78571429em;height:1.78571429em;line-height:1.78571429em;color:rgba(0,0,0,.4);font-style:normal;font-weight:700;box-shadow:0 0 0 1px transparent inset}.ui.buttons .or[data-text]:before{content:attr(data-text)}.ui.fluid.buttons .or{width:0!important}.ui.fluid.buttons .or:after{display:none}.ui.attached.button{position:relative;display:block;margin:0;border-radius:0;box-shadow:0 0 0 1px rgba(34,36,38,.15)!important}.ui.attached.top.button{border-radius:.28571429rem .28571429rem 0 0}.ui.attached.bottom.button{border-radius:0 0 .28571429rem .28571429rem}.ui.left.attached.button{display:inline-block;border-left:none;text-align:right;padding-right:.75em;border-radius:.28571429rem 0 0 .28571429rem}.ui.right.attached.button{display:inline-block;text-align:left;padding-left:.75em;border-radius:0 .28571429rem .28571429rem 0}.ui.attached.buttons{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-radius:0;width:auto!important;z-index:2;margin-left:-1px;margin-right:-1px}.ui.attached.buttons .button{margin:0}.ui.attached.buttons .button:first-child,.ui.attached.buttons .button:last-child{border-radius:0}.ui[class*="top attached"].buttons{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0}.ui[class*="top attached"].buttons .button:first-child{border-radius:.28571429rem 0 0}.ui[class*="top attached"].buttons .button:last-child{border-radius:0 .28571429rem 0 0}.ui[class*="bottom attached"].buttons{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].buttons .button:first-child{border-radius:0 0 0 .28571429rem}.ui[class*="bottom attached"].buttons .button:last-child{border-radius:0 0 .28571429rem}.ui[class*="left attached"].buttons{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;margin-right:0;margin-left:-1px;border-radius:0 .28571429rem .28571429rem 0}.ui[class*="left attached"].buttons .button:first-child{margin-left:-1px;border-radius:0 .28571429rem 0 0}.ui[class*="left attached"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 .28571429rem}.ui[class*="right attached"].buttons{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;margin-left:0;margin-right:-1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="right attached"].buttons .button:first-child{margin-left:-1px;border-radius:.28571429rem 0 0}.ui[class*="right attached"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 0 .28571429rem}.ui.fluid.button,.ui.fluid.buttons{width:100%}.ui.fluid.button{display:block}.ui.two.buttons{width:100%}.ui.two.buttons>.button{width:50%}.ui.three.buttons{width:100%}.ui.three.buttons>.button{width:33.333%}.ui.four.buttons{width:100%}.ui.four.buttons>.button{width:25%}.ui.five.buttons{width:100%}.ui.five.buttons>.button{width:20%}.ui.six.buttons{width:100%}.ui.six.buttons>.button{width:16.666%}.ui.seven.buttons{width:100%}.ui.seven.buttons>.button{width:14.285%}.ui.eight.buttons{width:100%}.ui.eight.buttons>.button{width:12.5%}.ui.nine.buttons{width:100%}.ui.nine.buttons>.button{width:11.11%}.ui.ten.buttons{width:100%}.ui.ten.buttons>.button{width:10%}.ui.eleven.buttons{width:100%}.ui.eleven.buttons>.button{width:9.09%}.ui.twelve.buttons{width:100%}.ui.twelve.buttons>.button{width:8.3333%}.ui.fluid.vertical.buttons,.ui.fluid.vertical.buttons>.button{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:auto}.ui.two.vertical.buttons>.button{height:50%}.ui.three.vertical.buttons>.button{height:33.333%}.ui.four.vertical.buttons>.button{height:25%}.ui.five.vertical.buttons>.button{height:20%}.ui.six.vertical.buttons>.button{height:16.666%}.ui.seven.vertical.buttons>.button{height:14.285%}.ui.eight.vertical.buttons>.button{height:12.5%}.ui.nine.vertical.buttons>.button{height:11.11%}.ui.ten.vertical.buttons>.button{height:10%}.ui.eleven.vertical.buttons>.button{height:9.09%}.ui.twelve.vertical.buttons>.button{height:8.3333%}.ui.black.button,.ui.black.buttons .button{background-color:#1B1C1D;color:#FFF;text-shadow:none;background-image:none}.ui.black.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.black.button:hover,.ui.black.buttons .button:hover{background-color:#27292a;color:#FFF;text-shadow:none}.ui.black.button:focus,.ui.black.buttons .button:focus{background-color:#2f3032;color:#FFF;text-shadow:none}.ui.black.button:active,.ui.black.buttons .button:active{background-color:#343637;color:#FFF;text-shadow:none}.ui.black.active.button,.ui.black.button .active.button:active,.ui.black.buttons .active.button,.ui.black.buttons .active.button:active{background-color:#0f0f10;color:#FFF;text-shadow:none}.ui.basic.black.button,.ui.basic.black.buttons .button{box-shadow:0 0 0 1px #1B1C1D inset!important;color:#1B1C1D!important}.ui.basic.black.button:hover,.ui.basic.black.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #27292a inset!important;color:#27292a!important}.ui.basic.black.button:focus,.ui.basic.black.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #2f3032 inset!important;color:#27292a!important}.ui.basic.black.active.button,.ui.basic.black.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #0f0f10 inset!important;color:#343637!important}.ui.basic.black.button:active,.ui.basic.black.buttons .button:active{box-shadow:0 0 0 1px #343637 inset!important;color:#343637!important}.ui.buttons:not(.vertical)>.basic.black.button:not(:first-child){margin-left:-1px}.ui.inverted.black.button,.ui.inverted.black.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #D4D4D5 inset!important;color:#FFF}.ui.inverted.black.button.active,.ui.inverted.black.button:active,.ui.inverted.black.button:focus,.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button.active,.ui.inverted.black.buttons .button:active,.ui.inverted.black.buttons .button:focus,.ui.inverted.black.buttons .button:hover{box-shadow:none!important;color:#FFF}.ui.inverted.black.active.button,.ui.inverted.black.button:active,.ui.inverted.black.button:focus,.ui.inverted.black.button:hover,.ui.inverted.black.buttons .active.button,.ui.inverted.black.buttons .button:active,.ui.inverted.black.buttons .button:focus,.ui.inverted.black.buttons .button:hover{background-color:#000}.ui.inverted.black.basic.button,.ui.inverted.black.basic.buttons .button,.ui.inverted.black.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.black.basic.button:hover,.ui.inverted.black.basic.buttons .button:hover,.ui.inverted.black.buttons .basic.button:hover{box-shadow:0 0 0 2px #000 inset!important;color:#FFF!important}.ui.inverted.black.basic.button:focus,.ui.inverted.black.basic.buttons .button:focus{box-shadow:0 0 0 2px #000 inset!important;color:#545454!important}.ui.inverted.black.basic.active.button,.ui.inverted.black.basic.button:active,.ui.inverted.black.basic.buttons .active.button,.ui.inverted.black.basic.buttons .button:active,.ui.inverted.black.buttons .basic.active.button,.ui.inverted.black.buttons .basic.button:active{box-shadow:0 0 0 2px #000 inset!important;color:#FFF!important}.ui.grey.button,.ui.grey.buttons .button{background-color:#767676;color:#FFF;text-shadow:none;background-image:none}.ui.grey.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.grey.button:hover,.ui.grey.buttons .button:hover{background-color:#838383;color:#FFF;text-shadow:none}.ui.grey.button:focus,.ui.grey.buttons .button:focus{background-color:#8a8a8a;color:#FFF;text-shadow:none}.ui.grey.button:active,.ui.grey.buttons .button:active{background-color:#909090;color:#FFF;text-shadow:none}.ui.grey.active.button,.ui.grey.button .active.button:active,.ui.grey.buttons .active.button,.ui.grey.buttons .active.button:active{background-color:#696969;color:#FFF;text-shadow:none}.ui.basic.grey.button,.ui.basic.grey.buttons .button{box-shadow:0 0 0 1px #767676 inset!important;color:#767676!important}.ui.basic.grey.button:hover,.ui.basic.grey.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #838383 inset!important;color:#838383!important}.ui.basic.grey.button:focus,.ui.basic.grey.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #8a8a8a inset!important;color:#838383!important}.ui.basic.grey.active.button,.ui.basic.grey.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #696969 inset!important;color:#909090!important}.ui.basic.grey.button:active,.ui.basic.grey.buttons .button:active{box-shadow:0 0 0 1px #909090 inset!important;color:#909090!important}.ui.buttons:not(.vertical)>.basic.grey.button:not(:first-child){margin-left:-1px}.ui.inverted.grey.button,.ui.inverted.grey.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #D4D4D5 inset!important;color:#FFF}.ui.inverted.grey.button.active,.ui.inverted.grey.button:active,.ui.inverted.grey.button:focus,.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button.active,.ui.inverted.grey.buttons .button:active,.ui.inverted.grey.buttons .button:focus,.ui.inverted.grey.buttons .button:hover{box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button:hover{background-color:#cfd0d2}.ui.inverted.grey.button:focus,.ui.inverted.grey.buttons .button:focus{background-color:#c7c9cb}.ui.inverted.grey.active.button,.ui.inverted.grey.buttons .active.button{background-color:#cfd0d2}.ui.inverted.grey.button:active,.ui.inverted.grey.buttons .button:active{background-color:#c2c4c5}.ui.inverted.grey.basic.button,.ui.inverted.grey.basic.buttons .button,.ui.inverted.grey.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.grey.basic.button:hover,.ui.inverted.grey.basic.buttons .button:hover,.ui.inverted.grey.buttons .basic.button:hover{box-shadow:0 0 0 2px #cfd0d2 inset!important;color:#FFF!important}.ui.inverted.grey.basic.button:focus,.ui.inverted.grey.basic.buttons .button:focus{box-shadow:0 0 0 2px #c7c9cb inset!important;color:#DCDDDE!important}.ui.inverted.grey.basic.active.button,.ui.inverted.grey.basic.buttons .active.button,.ui.inverted.grey.buttons .basic.active.button{box-shadow:0 0 0 2px #cfd0d2 inset!important;color:#FFF!important}.ui.inverted.grey.basic.button:active,.ui.inverted.grey.basic.buttons .button:active,.ui.inverted.grey.buttons .basic.button:active{box-shadow:0 0 0 2px #c2c4c5 inset!important;color:#FFF!important}.ui.brown.button,.ui.brown.buttons .button{background-color:#A5673F;color:#FFF;text-shadow:none;background-image:none}.ui.brown.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.brown.button:hover,.ui.brown.buttons .button:hover{background-color:#975b33;color:#FFF;text-shadow:none}.ui.brown.button:focus,.ui.brown.buttons .button:focus{background-color:#90532b;color:#FFF;text-shadow:none}.ui.brown.button:active,.ui.brown.buttons .button:active{background-color:#805031;color:#FFF;text-shadow:none}.ui.brown.active.button,.ui.brown.button .active.button:active,.ui.brown.buttons .active.button,.ui.brown.buttons .active.button:active{background-color:#995a31;color:#FFF;text-shadow:none}.ui.basic.brown.button,.ui.basic.brown.buttons .button{box-shadow:0 0 0 1px #A5673F inset!important;color:#A5673F!important}.ui.basic.brown.button:hover,.ui.basic.brown.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #975b33 inset!important;color:#975b33!important}.ui.basic.brown.button:focus,.ui.basic.brown.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #90532b inset!important;color:#975b33!important}.ui.basic.brown.active.button,.ui.basic.brown.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #995a31 inset!important;color:#805031!important}.ui.basic.brown.button:active,.ui.basic.brown.buttons .button:active{box-shadow:0 0 0 1px #805031 inset!important;color:#805031!important}.ui.buttons:not(.vertical)>.basic.brown.button:not(:first-child){margin-left:-1px}.ui.inverted.brown.button,.ui.inverted.brown.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #D67C1C inset!important;color:#D67C1C}.ui.inverted.brown.button.active,.ui.inverted.brown.button:active,.ui.inverted.brown.button:focus,.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button.active,.ui.inverted.brown.buttons .button:active,.ui.inverted.brown.buttons .button:focus,.ui.inverted.brown.buttons .button:hover{box-shadow:none!important;color:#FFF}.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button:hover{background-color:#c86f11}.ui.inverted.brown.button:focus,.ui.inverted.brown.buttons .button:focus{background-color:#c16808}.ui.inverted.brown.active.button,.ui.inverted.brown.buttons .active.button{background-color:#cc6f0d}.ui.inverted.brown.button:active,.ui.inverted.brown.buttons .button:active{background-color:#a96216}.ui.inverted.brown.basic.button,.ui.inverted.brown.basic.buttons .button,.ui.inverted.brown.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.brown.basic.button:hover,.ui.inverted.brown.basic.buttons .button:hover,.ui.inverted.brown.buttons .basic.button:hover{box-shadow:0 0 0 2px #c86f11 inset!important;color:#D67C1C!important}.ui.inverted.brown.basic.button:focus,.ui.inverted.brown.basic.buttons .button:focus{box-shadow:0 0 0 2px #c16808 inset!important;color:#D67C1C!important}.ui.inverted.brown.basic.active.button,.ui.inverted.brown.basic.buttons .active.button,.ui.inverted.brown.buttons .basic.active.button{box-shadow:0 0 0 2px #cc6f0d inset!important;color:#D67C1C!important}.ui.inverted.brown.basic.button:active,.ui.inverted.brown.basic.buttons .button:active,.ui.inverted.brown.buttons .basic.button:active{box-shadow:0 0 0 2px #a96216 inset!important;color:#D67C1C!important}.ui.blue.button,.ui.blue.buttons .button{background-color:#2185D0;color:#FFF;text-shadow:none;background-image:none}.ui.blue.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.blue.button:hover,.ui.blue.buttons .button:hover{background-color:#1678c2;color:#FFF;text-shadow:none}.ui.blue.button:focus,.ui.blue.buttons .button:focus{background-color:#0d71bb;color:#FFF;text-shadow:none}.ui.blue.button:active,.ui.blue.buttons .button:active{background-color:#1a69a4;color:#FFF;text-shadow:none}.ui.blue.active.button,.ui.blue.button .active.button:active,.ui.blue.buttons .active.button,.ui.blue.buttons .active.button:active{background-color:#1279c6;color:#FFF;text-shadow:none}.ui.basic.blue.button,.ui.basic.blue.buttons .button{box-shadow:0 0 0 1px #2185D0 inset!important;color:#2185D0!important}.ui.basic.blue.button:hover,.ui.basic.blue.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #1678c2 inset!important;color:#1678c2!important}.ui.basic.blue.button:focus,.ui.basic.blue.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #0d71bb inset!important;color:#1678c2!important}.ui.basic.blue.active.button,.ui.basic.blue.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #1279c6 inset!important;color:#1a69a4!important}.ui.basic.blue.button:active,.ui.basic.blue.buttons .button:active{box-shadow:0 0 0 1px #1a69a4 inset!important;color:#1a69a4!important}.ui.buttons:not(.vertical)>.basic.blue.button:not(:first-child){margin-left:-1px}.ui.inverted.blue.button,.ui.inverted.blue.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #54C8FF inset!important;color:#54C8FF}.ui.inverted.blue.button.active,.ui.inverted.blue.button:active,.ui.inverted.blue.button:focus,.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button.active,.ui.inverted.blue.buttons .button:active,.ui.inverted.blue.buttons .button:focus,.ui.inverted.blue.buttons .button:hover{box-shadow:none!important;color:#FFF}.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button:hover{background-color:#3ac0ff}.ui.inverted.blue.button:focus,.ui.inverted.blue.buttons .button:focus{background-color:#2bbbff}.ui.inverted.blue.active.button,.ui.inverted.blue.buttons .active.button{background-color:#3ac0ff}.ui.inverted.blue.button:active,.ui.inverted.blue.buttons .button:active{background-color:#21b8ff}.ui.inverted.blue.basic.button,.ui.inverted.blue.basic.buttons .button,.ui.inverted.blue.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.blue.basic.button:hover,.ui.inverted.blue.basic.buttons .button:hover,.ui.inverted.blue.buttons .basic.button:hover{box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54C8FF!important}.ui.inverted.blue.basic.button:focus,.ui.inverted.blue.basic.buttons .button:focus{box-shadow:0 0 0 2px #2bbbff inset!important;color:#54C8FF!important}.ui.inverted.blue.basic.active.button,.ui.inverted.blue.basic.buttons .active.button,.ui.inverted.blue.buttons .basic.active.button{box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54C8FF!important}.ui.inverted.blue.basic.button:active,.ui.inverted.blue.basic.buttons .button:active,.ui.inverted.blue.buttons .basic.button:active{box-shadow:0 0 0 2px #21b8ff inset!important;color:#54C8FF!important}.ui.green.button,.ui.green.buttons .button{background-color:#21BA45;color:#FFF;text-shadow:none;background-image:none}.ui.green.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.green.button:hover,.ui.green.buttons .button:hover{background-color:#16ab39;color:#FFF;text-shadow:none}.ui.green.button:focus,.ui.green.buttons .button:focus{background-color:#0ea432;color:#FFF;text-shadow:none}.ui.green.button:active,.ui.green.buttons .button:active{background-color:#198f35;color:#FFF;text-shadow:none}.ui.green.active.button,.ui.green.button .active.button:active,.ui.green.buttons .active.button,.ui.green.buttons .active.button:active{background-color:#13ae38;color:#FFF;text-shadow:none}.ui.basic.green.button,.ui.basic.green.buttons .button{box-shadow:0 0 0 1px #21BA45 inset!important;color:#21BA45!important}.ui.basic.green.button:hover,.ui.basic.green.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #16ab39 inset!important;color:#16ab39!important}.ui.basic.green.button:focus,.ui.basic.green.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #0ea432 inset!important;color:#16ab39!important}.ui.basic.green.active.button,.ui.basic.green.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #13ae38 inset!important;color:#198f35!important}.ui.basic.green.button:active,.ui.basic.green.buttons .button:active{box-shadow:0 0 0 1px #198f35 inset!important;color:#198f35!important}.ui.buttons:not(.vertical)>.basic.green.button:not(:first-child){margin-left:-1px}.ui.inverted.green.button,.ui.inverted.green.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #2ECC40 inset!important;color:#2ECC40}.ui.inverted.green.button.active,.ui.inverted.green.button:active,.ui.inverted.green.button:focus,.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button.active,.ui.inverted.green.buttons .button:active,.ui.inverted.green.buttons .button:focus,.ui.inverted.green.buttons .button:hover{box-shadow:none!important;color:#FFF}.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button:hover{background-color:#22be34}.ui.inverted.green.button:focus,.ui.inverted.green.buttons .button:focus{background-color:#19b82b}.ui.inverted.green.active.button,.ui.inverted.green.buttons .active.button{background-color:#1fc231}.ui.inverted.green.button:active,.ui.inverted.green.buttons .button:active{background-color:#25a233}.ui.inverted.green.basic.button,.ui.inverted.green.basic.buttons .button,.ui.inverted.green.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.green.basic.button:hover,.ui.inverted.green.basic.buttons .button:hover,.ui.inverted.green.buttons .basic.button:hover{box-shadow:0 0 0 2px #22be34 inset!important;color:#2ECC40!important}.ui.inverted.green.basic.button:focus,.ui.inverted.green.basic.buttons .button:focus{box-shadow:0 0 0 2px #19b82b inset!important;color:#2ECC40!important}.ui.inverted.green.basic.active.button,.ui.inverted.green.basic.buttons .active.button,.ui.inverted.green.buttons .basic.active.button{box-shadow:0 0 0 2px #1fc231 inset!important;color:#2ECC40!important}.ui.inverted.green.basic.button:active,.ui.inverted.green.basic.buttons .button:active,.ui.inverted.green.buttons .basic.button:active{box-shadow:0 0 0 2px #25a233 inset!important;color:#2ECC40!important}.ui.orange.button,.ui.orange.buttons .button{background-color:#F2711C;color:#FFF;text-shadow:none;background-image:none}.ui.orange.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.orange.button:hover,.ui.orange.buttons .button:hover{background-color:#f26202;color:#FFF;text-shadow:none}.ui.orange.button:focus,.ui.orange.buttons .button:focus{background-color:#e55b00;color:#FFF;text-shadow:none}.ui.orange.button:active,.ui.orange.buttons .button:active{background-color:#cf590c;color:#FFF;text-shadow:none}.ui.orange.active.button,.ui.orange.button .active.button:active,.ui.orange.buttons .active.button,.ui.orange.buttons .active.button:active{background-color:#f56100;color:#FFF;text-shadow:none}.ui.basic.orange.button,.ui.basic.orange.buttons .button{box-shadow:0 0 0 1px #F2711C inset!important;color:#F2711C!important}.ui.basic.orange.button:hover,.ui.basic.orange.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #f26202 inset!important;color:#f26202!important}.ui.basic.orange.button:focus,.ui.basic.orange.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #e55b00 inset!important;color:#f26202!important}.ui.basic.orange.active.button,.ui.basic.orange.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #f56100 inset!important;color:#cf590c!important}.ui.basic.orange.button:active,.ui.basic.orange.buttons .button:active{box-shadow:0 0 0 1px #cf590c inset!important;color:#cf590c!important}.ui.buttons:not(.vertical)>.basic.orange.button:not(:first-child){margin-left:-1px}.ui.inverted.orange.button,.ui.inverted.orange.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #FF851B inset!important;color:#FF851B}.ui.inverted.orange.button.active,.ui.inverted.orange.button:active,.ui.inverted.orange.button:focus,.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button.active,.ui.inverted.orange.buttons .button:active,.ui.inverted.orange.buttons .button:focus,.ui.inverted.orange.buttons .button:hover{box-shadow:none!important;color:#FFF}.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button:hover{background-color:#ff7701}.ui.inverted.orange.button:focus,.ui.inverted.orange.buttons .button:focus{background-color:#f17000}.ui.inverted.orange.active.button,.ui.inverted.orange.buttons .active.button{background-color:#ff7701}.ui.inverted.orange.button:active,.ui.inverted.orange.buttons .button:active{background-color:#e76b00}.ui.inverted.orange.basic.button,.ui.inverted.orange.basic.buttons .button,.ui.inverted.orange.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.orange.basic.button:hover,.ui.inverted.orange.basic.buttons .button:hover,.ui.inverted.orange.buttons .basic.button:hover{box-shadow:0 0 0 2px #ff7701 inset!important;color:#FF851B!important}.ui.inverted.orange.basic.button:focus,.ui.inverted.orange.basic.buttons .button:focus{box-shadow:0 0 0 2px #f17000 inset!important;color:#FF851B!important}.ui.inverted.orange.basic.active.button,.ui.inverted.orange.basic.buttons .active.button,.ui.inverted.orange.buttons .basic.active.button{box-shadow:0 0 0 2px #ff7701 inset!important;color:#FF851B!important}.ui.inverted.orange.basic.button:active,.ui.inverted.orange.basic.buttons .button:active,.ui.inverted.orange.buttons .basic.button:active{box-shadow:0 0 0 2px #e76b00 inset!important;color:#FF851B!important}.ui.pink.button,.ui.pink.buttons .button{background-color:#E03997;color:#FFF;text-shadow:none;background-image:none}.ui.pink.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pink.button:hover,.ui.pink.buttons .button:hover{background-color:#e61a8d;color:#FFF;text-shadow:none}.ui.pink.button:focus,.ui.pink.buttons .button:focus{background-color:#e10f85;color:#FFF;text-shadow:none}.ui.pink.button:active,.ui.pink.buttons .button:active{background-color:#c71f7e;color:#FFF;text-shadow:none}.ui.pink.active.button,.ui.pink.button .active.button:active,.ui.pink.buttons .active.button,.ui.pink.buttons .active.button:active{background-color:#ea158d;color:#FFF;text-shadow:none}.ui.basic.pink.button,.ui.basic.pink.buttons .button{box-shadow:0 0 0 1px #E03997 inset!important;color:#E03997!important}.ui.basic.pink.button:hover,.ui.basic.pink.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #e61a8d inset!important;color:#e61a8d!important}.ui.basic.pink.button:focus,.ui.basic.pink.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #e10f85 inset!important;color:#e61a8d!important}.ui.basic.pink.active.button,.ui.basic.pink.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #ea158d inset!important;color:#c71f7e!important}.ui.basic.pink.button:active,.ui.basic.pink.buttons .button:active{box-shadow:0 0 0 1px #c71f7e inset!important;color:#c71f7e!important}.ui.buttons:not(.vertical)>.basic.pink.button:not(:first-child){margin-left:-1px}.ui.inverted.pink.button,.ui.inverted.pink.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #FF8EDF inset!important;color:#FF8EDF}.ui.inverted.pink.button.active,.ui.inverted.pink.button:active,.ui.inverted.pink.button:focus,.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button.active,.ui.inverted.pink.buttons .button:active,.ui.inverted.pink.buttons .button:focus,.ui.inverted.pink.buttons .button:hover{box-shadow:none!important;color:#FFF}.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button:hover{background-color:#ff74d8}.ui.inverted.pink.button:focus,.ui.inverted.pink.buttons .button:focus{background-color:#ff65d3}.ui.inverted.pink.active.button,.ui.inverted.pink.buttons .active.button{background-color:#ff74d8}.ui.inverted.pink.button:active,.ui.inverted.pink.buttons .button:active{background-color:#ff5bd1}.ui.inverted.pink.basic.button,.ui.inverted.pink.basic.buttons .button,.ui.inverted.pink.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.pink.basic.button:hover,.ui.inverted.pink.basic.buttons .button:hover,.ui.inverted.pink.buttons .basic.button:hover{box-shadow:0 0 0 2px #ff74d8 inset!important;color:#FF8EDF!important}.ui.inverted.pink.basic.button:focus,.ui.inverted.pink.basic.buttons .button:focus{box-shadow:0 0 0 2px #ff65d3 inset!important;color:#FF8EDF!important}.ui.inverted.pink.basic.active.button,.ui.inverted.pink.basic.buttons .active.button,.ui.inverted.pink.buttons .basic.active.button{box-shadow:0 0 0 2px #ff74d8 inset!important;color:#FF8EDF!important}.ui.inverted.pink.basic.button:active,.ui.inverted.pink.basic.buttons .button:active,.ui.inverted.pink.buttons .basic.button:active{box-shadow:0 0 0 2px #ff5bd1 inset!important;color:#FF8EDF!important}.ui.violet.button,.ui.violet.buttons .button{background-color:#6435C9;color:#FFF;text-shadow:none;background-image:none}.ui.violet.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.violet.button:hover,.ui.violet.buttons .button:hover{background-color:#5829bb;color:#FFF;text-shadow:none}.ui.violet.button:focus,.ui.violet.buttons .button:focus{background-color:#4f20b5;color:#FFF;text-shadow:none}.ui.violet.button:active,.ui.violet.buttons .button:active{background-color:#502aa1;color:#FFF;text-shadow:none}.ui.violet.active.button,.ui.violet.button .active.button:active,.ui.violet.buttons .active.button,.ui.violet.buttons .active.button:active{background-color:#5626bf;color:#FFF;text-shadow:none}.ui.basic.violet.button,.ui.basic.violet.buttons .button{box-shadow:0 0 0 1px #6435C9 inset!important;color:#6435C9!important}.ui.basic.violet.button:hover,.ui.basic.violet.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #5829bb inset!important;color:#5829bb!important}.ui.basic.violet.button:focus,.ui.basic.violet.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #4f20b5 inset!important;color:#5829bb!important}.ui.basic.violet.active.button,.ui.basic.violet.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #5626bf inset!important;color:#502aa1!important}.ui.basic.violet.button:active,.ui.basic.violet.buttons .button:active{box-shadow:0 0 0 1px #502aa1 inset!important;color:#502aa1!important}.ui.buttons:not(.vertical)>.basic.violet.button:not(:first-child){margin-left:-1px}.ui.inverted.violet.button,.ui.inverted.violet.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #A291FB inset!important;color:#A291FB}.ui.inverted.violet.button.active,.ui.inverted.violet.button:active,.ui.inverted.violet.button:focus,.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button.active,.ui.inverted.violet.buttons .button:active,.ui.inverted.violet.buttons .button:focus,.ui.inverted.violet.buttons .button:hover{box-shadow:none!important;color:#FFF}.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button:hover{background-color:#8a73ff}.ui.inverted.violet.button:focus,.ui.inverted.violet.buttons .button:focus{background-color:#7d64ff}.ui.inverted.violet.active.button,.ui.inverted.violet.buttons .active.button{background-color:#8a73ff}.ui.inverted.violet.button:active,.ui.inverted.violet.buttons .button:active{background-color:#7860f9}.ui.inverted.violet.basic.button,.ui.inverted.violet.basic.buttons .button,.ui.inverted.violet.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.violet.basic.button:hover,.ui.inverted.violet.basic.buttons .button:hover,.ui.inverted.violet.buttons .basic.button:hover{box-shadow:0 0 0 2px #8a73ff inset!important;color:#A291FB!important}.ui.inverted.violet.basic.button:focus,.ui.inverted.violet.basic.buttons .button:focus{box-shadow:0 0 0 2px #7d64ff inset!important;color:#A291FB!important}.ui.inverted.violet.basic.active.button,.ui.inverted.violet.basic.buttons .active.button,.ui.inverted.violet.buttons .basic.active.button{box-shadow:0 0 0 2px #8a73ff inset!important;color:#A291FB!important}.ui.inverted.violet.basic.button:active,.ui.inverted.violet.basic.buttons .button:active,.ui.inverted.violet.buttons .basic.button:active{box-shadow:0 0 0 2px #7860f9 inset!important;color:#A291FB!important}.ui.purple.button,.ui.purple.buttons .button{background-color:#A333C8;color:#FFF;text-shadow:none;background-image:none}.ui.purple.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.purple.button:hover,.ui.purple.buttons .button:hover{background-color:#9627ba;color:#FFF;text-shadow:none}.ui.purple.button:focus,.ui.purple.buttons .button:focus{background-color:#8f1eb4;color:#FFF;text-shadow:none}.ui.purple.button:active,.ui.purple.buttons .button:active{background-color:#82299f;color:#FFF;text-shadow:none}.ui.purple.active.button,.ui.purple.button .active.button:active,.ui.purple.buttons .active.button,.ui.purple.buttons .active.button:active{background-color:#9724be;color:#FFF;text-shadow:none}.ui.basic.purple.button,.ui.basic.purple.buttons .button{box-shadow:0 0 0 1px #A333C8 inset!important;color:#A333C8!important}.ui.basic.purple.button:hover,.ui.basic.purple.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #9627ba inset!important;color:#9627ba!important}.ui.basic.purple.button:focus,.ui.basic.purple.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #8f1eb4 inset!important;color:#9627ba!important}.ui.basic.purple.active.button,.ui.basic.purple.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #9724be inset!important;color:#82299f!important}.ui.basic.purple.button:active,.ui.basic.purple.buttons .button:active{box-shadow:0 0 0 1px #82299f inset!important;color:#82299f!important}.ui.buttons:not(.vertical)>.basic.purple.button:not(:first-child){margin-left:-1px}.ui.inverted.purple.button,.ui.inverted.purple.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #DC73FF inset!important;color:#DC73FF}.ui.inverted.purple.button.active,.ui.inverted.purple.button:active,.ui.inverted.purple.button:focus,.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button.active,.ui.inverted.purple.buttons .button:active,.ui.inverted.purple.buttons .button:focus,.ui.inverted.purple.buttons .button:hover{box-shadow:none!important;color:#FFF}.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button:hover{background-color:#d65aff}.ui.inverted.purple.button:focus,.ui.inverted.purple.buttons .button:focus{background-color:#d24aff}.ui.inverted.purple.active.button,.ui.inverted.purple.buttons .active.button{background-color:#d65aff}.ui.inverted.purple.button:active,.ui.inverted.purple.buttons .button:active{background-color:#cf40ff}.ui.inverted.purple.basic.button,.ui.inverted.purple.basic.buttons .button,.ui.inverted.purple.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.purple.basic.button:hover,.ui.inverted.purple.basic.buttons .button:hover,.ui.inverted.purple.buttons .basic.button:hover{box-shadow:0 0 0 2px #d65aff inset!important;color:#DC73FF!important}.ui.inverted.purple.basic.button:focus,.ui.inverted.purple.basic.buttons .button:focus{box-shadow:0 0 0 2px #d24aff inset!important;color:#DC73FF!important}.ui.inverted.purple.basic.active.button,.ui.inverted.purple.basic.buttons .active.button,.ui.inverted.purple.buttons .basic.active.button{box-shadow:0 0 0 2px #d65aff inset!important;color:#DC73FF!important}.ui.inverted.purple.basic.button:active,.ui.inverted.purple.basic.buttons .button:active,.ui.inverted.purple.buttons .basic.button:active{box-shadow:0 0 0 2px #cf40ff inset!important;color:#DC73FF!important}.ui.red.button,.ui.red.buttons .button{background-color:#DB2828;color:#FFF;text-shadow:none;background-image:none}.ui.red.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.red.button:hover,.ui.red.buttons .button:hover{background-color:#d01919;color:#FFF;text-shadow:none}.ui.red.button:focus,.ui.red.buttons .button:focus{background-color:#ca1010;color:#FFF;text-shadow:none}.ui.red.button:active,.ui.red.buttons .button:active{background-color:#b21e1e;color:#FFF;text-shadow:none}.ui.red.active.button,.ui.red.button .active.button:active,.ui.red.buttons .active.button,.ui.red.buttons .active.button:active{background-color:#d41515;color:#FFF;text-shadow:none}.ui.basic.red.button,.ui.basic.red.buttons .button{box-shadow:0 0 0 1px #DB2828 inset!important;color:#DB2828!important}.ui.basic.red.button:hover,.ui.basic.red.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #d01919 inset!important;color:#d01919!important}.ui.basic.red.button:focus,.ui.basic.red.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #ca1010 inset!important;color:#d01919!important}.ui.basic.red.active.button,.ui.basic.red.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #d41515 inset!important;color:#b21e1e!important}.ui.basic.red.button:active,.ui.basic.red.buttons .button:active{box-shadow:0 0 0 1px #b21e1e inset!important;color:#b21e1e!important}.ui.buttons:not(.vertical)>.basic.red.button:not(:first-child){margin-left:-1px}.ui.inverted.red.button,.ui.inverted.red.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #FF695E inset!important;color:#FF695E}.ui.inverted.red.button.active,.ui.inverted.red.button:active,.ui.inverted.red.button:focus,.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button.active,.ui.inverted.red.buttons .button:active,.ui.inverted.red.buttons .button:focus,.ui.inverted.red.buttons .button:hover{box-shadow:none!important;color:#FFF}.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button:hover{background-color:#ff5144}.ui.inverted.red.button:focus,.ui.inverted.red.buttons .button:focus{background-color:#ff4335}.ui.inverted.red.active.button,.ui.inverted.red.buttons .active.button{background-color:#ff5144}.ui.inverted.red.button:active,.ui.inverted.red.buttons .button:active{background-color:#ff392b}.ui.inverted.red.basic.button,.ui.inverted.red.basic.buttons .button,.ui.inverted.red.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.red.basic.button:hover,.ui.inverted.red.basic.buttons .button:hover,.ui.inverted.red.buttons .basic.button:hover{box-shadow:0 0 0 2px #ff5144 inset!important;color:#FF695E!important}.ui.inverted.red.basic.button:focus,.ui.inverted.red.basic.buttons .button:focus{box-shadow:0 0 0 2px #ff4335 inset!important;color:#FF695E!important}.ui.inverted.red.basic.active.button,.ui.inverted.red.basic.buttons .active.button,.ui.inverted.red.buttons .basic.active.button{box-shadow:0 0 0 2px #ff5144 inset!important;color:#FF695E!important}.ui.inverted.red.basic.button:active,.ui.inverted.red.basic.buttons .button:active,.ui.inverted.red.buttons .basic.button:active{box-shadow:0 0 0 2px #ff392b inset!important;color:#FF695E!important}.ui.teal.button,.ui.teal.buttons .button{background-color:#00B5AD;color:#FFF;text-shadow:none;background-image:none}.ui.teal.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.teal.button:hover,.ui.teal.buttons .button:hover{background-color:#009c95;color:#FFF;text-shadow:none}.ui.teal.button:focus,.ui.teal.buttons .button:focus{background-color:#008c86;color:#FFF;text-shadow:none}.ui.teal.button:active,.ui.teal.buttons .button:active{background-color:#00827c;color:#FFF;text-shadow:none}.ui.teal.active.button,.ui.teal.button .active.button:active,.ui.teal.buttons .active.button,.ui.teal.buttons .active.button:active{background-color:#009c95;color:#FFF;text-shadow:none}.ui.basic.teal.button,.ui.basic.teal.buttons .button{box-shadow:0 0 0 1px #00B5AD inset!important;color:#00B5AD!important}.ui.basic.teal.button:hover,.ui.basic.teal.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #009c95 inset!important;color:#009c95!important}.ui.basic.teal.button:focus,.ui.basic.teal.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #008c86 inset!important;color:#009c95!important}.ui.basic.teal.active.button,.ui.basic.teal.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #009c95 inset!important;color:#00827c!important}.ui.basic.teal.button:active,.ui.basic.teal.buttons .button:active{box-shadow:0 0 0 1px #00827c inset!important;color:#00827c!important}.ui.buttons:not(.vertical)>.basic.teal.button:not(:first-child){margin-left:-1px}.ui.inverted.teal.button,.ui.inverted.teal.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #6DFFFF inset!important;color:#6DFFFF}.ui.inverted.teal.button.active,.ui.inverted.teal.button:active,.ui.inverted.teal.button:focus,.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button.active,.ui.inverted.teal.buttons .button:active,.ui.inverted.teal.buttons .button:focus,.ui.inverted.teal.buttons .button:hover{box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button:hover{background-color:#54ffff}.ui.inverted.teal.button:focus,.ui.inverted.teal.buttons .button:focus{background-color:#4ff}.ui.inverted.teal.active.button,.ui.inverted.teal.buttons .active.button{background-color:#54ffff}.ui.inverted.teal.button:active,.ui.inverted.teal.buttons .button:active{background-color:#3affff}.ui.inverted.teal.basic.button,.ui.inverted.teal.basic.buttons .button,.ui.inverted.teal.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.teal.basic.button:hover,.ui.inverted.teal.basic.buttons .button:hover,.ui.inverted.teal.buttons .basic.button:hover{box-shadow:0 0 0 2px #54ffff inset!important;color:#6DFFFF!important}.ui.inverted.teal.basic.button:focus,.ui.inverted.teal.basic.buttons .button:focus{box-shadow:0 0 0 2px #4ff inset!important;color:#6DFFFF!important}.ui.inverted.teal.basic.active.button,.ui.inverted.teal.basic.buttons .active.button,.ui.inverted.teal.buttons .basic.active.button{box-shadow:0 0 0 2px #54ffff inset!important;color:#6DFFFF!important}.ui.inverted.teal.basic.button:active,.ui.inverted.teal.basic.buttons .button:active,.ui.inverted.teal.buttons .basic.button:active{box-shadow:0 0 0 2px #3affff inset!important;color:#6DFFFF!important}.ui.olive.button,.ui.olive.buttons .button{background-color:#B5CC18;color:#FFF;text-shadow:none;background-image:none}.ui.olive.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.olive.button:hover,.ui.olive.buttons .button:hover{background-color:#a7bd0d;color:#FFF;text-shadow:none}.ui.olive.button:focus,.ui.olive.buttons .button:focus{background-color:#a0b605;color:#FFF;text-shadow:none}.ui.olive.button:active,.ui.olive.buttons .button:active{background-color:#8d9e13;color:#FFF;text-shadow:none}.ui.olive.active.button,.ui.olive.button .active.button:active,.ui.olive.buttons .active.button,.ui.olive.buttons .active.button:active{background-color:#aac109;color:#FFF;text-shadow:none}.ui.basic.olive.button,.ui.basic.olive.buttons .button{box-shadow:0 0 0 1px #B5CC18 inset!important;color:#B5CC18!important}.ui.basic.olive.button:hover,.ui.basic.olive.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #a7bd0d inset!important;color:#a7bd0d!important}.ui.basic.olive.button:focus,.ui.basic.olive.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #a0b605 inset!important;color:#a7bd0d!important}.ui.basic.olive.active.button,.ui.basic.olive.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #aac109 inset!important;color:#8d9e13!important}.ui.basic.olive.button:active,.ui.basic.olive.buttons .button:active{box-shadow:0 0 0 1px #8d9e13 inset!important;color:#8d9e13!important}.ui.buttons:not(.vertical)>.basic.olive.button:not(:first-child){margin-left:-1px}.ui.inverted.olive.button,.ui.inverted.olive.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #D9E778 inset!important;color:#D9E778}.ui.inverted.olive.button.active,.ui.inverted.olive.button:active,.ui.inverted.olive.button:focus,.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button.active,.ui.inverted.olive.buttons .button:active,.ui.inverted.olive.buttons .button:focus,.ui.inverted.olive.buttons .button:hover{box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button:hover{background-color:#d8ea5c}.ui.inverted.olive.button:focus,.ui.inverted.olive.buttons .button:focus{background-color:#daef47}.ui.inverted.olive.active.button,.ui.inverted.olive.buttons .active.button{background-color:#daed59}.ui.inverted.olive.button:active,.ui.inverted.olive.buttons .button:active{background-color:#cddf4d}.ui.inverted.olive.basic.button,.ui.inverted.olive.basic.buttons .button,.ui.inverted.olive.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.olive.basic.button:hover,.ui.inverted.olive.basic.buttons .button:hover,.ui.inverted.olive.buttons .basic.button:hover{box-shadow:0 0 0 2px #d8ea5c inset!important;color:#D9E778!important}.ui.inverted.olive.basic.button:focus,.ui.inverted.olive.basic.buttons .button:focus{box-shadow:0 0 0 2px #daef47 inset!important;color:#D9E778!important}.ui.inverted.olive.basic.active.button,.ui.inverted.olive.basic.buttons .active.button,.ui.inverted.olive.buttons .basic.active.button{box-shadow:0 0 0 2px #daed59 inset!important;color:#D9E778!important}.ui.inverted.olive.basic.button:active,.ui.inverted.olive.basic.buttons .button:active,.ui.inverted.olive.buttons .basic.button:active{box-shadow:0 0 0 2px #cddf4d inset!important;color:#D9E778!important}.ui.yellow.button,.ui.yellow.buttons .button{background-color:#FBBD08;color:#FFF;text-shadow:none;background-image:none}.ui.yellow.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.yellow.button:hover,.ui.yellow.buttons .button:hover{background-color:#eaae00;color:#FFF;text-shadow:none}.ui.yellow.button:focus,.ui.yellow.buttons .button:focus{background-color:#daa300;color:#FFF;text-shadow:none}.ui.yellow.button:active,.ui.yellow.buttons .button:active{background-color:#cd9903;color:#FFF;text-shadow:none}.ui.yellow.active.button,.ui.yellow.button .active.button:active,.ui.yellow.buttons .active.button,.ui.yellow.buttons .active.button:active{background-color:#eaae00;color:#FFF;text-shadow:none}.ui.basic.yellow.button,.ui.basic.yellow.buttons .button{box-shadow:0 0 0 1px #FBBD08 inset!important;color:#FBBD08!important}.ui.basic.yellow.button:hover,.ui.basic.yellow.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #eaae00 inset!important;color:#eaae00!important}.ui.basic.yellow.button:focus,.ui.basic.yellow.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #daa300 inset!important;color:#eaae00!important}.ui.basic.yellow.active.button,.ui.basic.yellow.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #eaae00 inset!important;color:#cd9903!important}.ui.basic.yellow.button:active,.ui.basic.yellow.buttons .button:active{box-shadow:0 0 0 1px #cd9903 inset!important;color:#cd9903!important}.ui.buttons:not(.vertical)>.basic.yellow.button:not(:first-child){margin-left:-1px}.ui.inverted.yellow.button,.ui.inverted.yellow.buttons .button{background-color:transparent;box-shadow:0 0 0 2px #FFE21F inset!important;color:#FFE21F}.ui.inverted.yellow.button.active,.ui.inverted.yellow.button:active,.ui.inverted.yellow.button:focus,.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button.active,.ui.inverted.yellow.buttons .button:active,.ui.inverted.yellow.buttons .button:focus,.ui.inverted.yellow.buttons .button:hover{box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button:hover{background-color:#ffdf05}.ui.inverted.yellow.button:focus,.ui.inverted.yellow.buttons .button:focus{background-color:#f5d500}.ui.inverted.yellow.active.button,.ui.inverted.yellow.buttons .active.button{background-color:#ffdf05}.ui.inverted.yellow.button:active,.ui.inverted.yellow.buttons .button:active{background-color:#ebcd00}.ui.inverted.yellow.basic.button,.ui.inverted.yellow.basic.buttons .button,.ui.inverted.yellow.buttons .basic.button{background-color:transparent;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#FFF!important}.ui.inverted.yellow.basic.button:hover,.ui.inverted.yellow.basic.buttons .button:hover,.ui.inverted.yellow.buttons .basic.button:hover{box-shadow:0 0 0 2px #ffdf05 inset!important;color:#FFE21F!important}.ui.inverted.yellow.basic.button:focus,.ui.inverted.yellow.basic.buttons .button:focus{box-shadow:0 0 0 2px #f5d500 inset!important;color:#FFE21F!important}.ui.inverted.yellow.basic.active.button,.ui.inverted.yellow.basic.buttons .active.button,.ui.inverted.yellow.buttons .basic.active.button{box-shadow:0 0 0 2px #ffdf05 inset!important;color:#FFE21F!important}.ui.inverted.yellow.basic.button:active,.ui.inverted.yellow.basic.buttons .button:active,.ui.inverted.yellow.buttons .basic.button:active{box-shadow:0 0 0 2px #ebcd00 inset!important;color:#FFE21F!important}.ui.primary.button,.ui.primary.buttons .button{background-color:#2185D0;color:#FFF;text-shadow:none;background-image:none}.ui.primary.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.primary.button:hover,.ui.primary.buttons .button:hover{background-color:#1678c2;color:#FFF;text-shadow:none}.ui.primary.button:focus,.ui.primary.buttons .button:focus{background-color:#0d71bb;color:#FFF;text-shadow:none}.ui.primary.button:active,.ui.primary.buttons .button:active{background-color:#1a69a4;color:#FFF;text-shadow:none}.ui.primary.active.button,.ui.primary.button .active.button:active,.ui.primary.buttons .active.button,.ui.primary.buttons .active.button:active{background-color:#1279c6;color:#FFF;text-shadow:none}.ui.basic.primary.button,.ui.basic.primary.buttons .button{box-shadow:0 0 0 1px #2185D0 inset!important;color:#2185D0!important}.ui.basic.primary.button:hover,.ui.basic.primary.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #1678c2 inset!important;color:#1678c2!important}.ui.basic.primary.button:focus,.ui.basic.primary.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #0d71bb inset!important;color:#1678c2!important}.ui.basic.primary.active.button,.ui.basic.primary.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #1279c6 inset!important;color:#1a69a4!important}.ui.basic.primary.button:active,.ui.basic.primary.buttons .button:active{box-shadow:0 0 0 1px #1a69a4 inset!important;color:#1a69a4!important}.ui.secondary.button,.ui.secondary.buttons .button{background-color:#1B1C1D;color:#FFF;text-shadow:none;background-image:none}.ui.secondary.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.secondary.button:hover,.ui.secondary.buttons .button:hover{background-color:#27292a;color:#FFF;text-shadow:none}.ui.secondary.button:focus,.ui.secondary.buttons .button:focus{background-color:#2e3032;color:#FFF;text-shadow:none}.ui.secondary.button:active,.ui.secondary.buttons .button:active{background-color:#343637;color:#FFF;text-shadow:none}.ui.secondary.active.button,.ui.secondary.button .active.button:active,.ui.secondary.buttons .active.button,.ui.secondary.buttons .active.button:active{background-color:#27292a;color:#FFF;text-shadow:none}.ui.basic.secondary.button,.ui.basic.secondary.buttons .button{box-shadow:0 0 0 1px #1B1C1D inset!important;color:#1B1C1D!important}.ui.basic.secondary.button:hover,.ui.basic.secondary.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #27292a inset!important;color:#27292a!important}.ui.basic.secondary.button:focus,.ui.basic.secondary.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #2e3032 inset!important;color:#27292a!important}.ui.basic.secondary.active.button,.ui.basic.secondary.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #27292a inset!important;color:#343637!important}.ui.basic.secondary.button:active,.ui.basic.secondary.buttons .button:active{box-shadow:0 0 0 1px #343637 inset!important;color:#343637!important}.ui.positive.button,.ui.positive.buttons .button{background-color:#21BA45;color:#FFF;text-shadow:none;background-image:none}.ui.positive.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.positive.button:hover,.ui.positive.buttons .button:hover{background-color:#16ab39;color:#FFF;text-shadow:none}.ui.positive.button:focus,.ui.positive.buttons .button:focus{background-color:#0ea432;color:#FFF;text-shadow:none}.ui.positive.button:active,.ui.positive.buttons .button:active{background-color:#198f35;color:#FFF;text-shadow:none}.ui.positive.active.button,.ui.positive.button .active.button:active,.ui.positive.buttons .active.button,.ui.positive.buttons .active.button:active{background-color:#13ae38;color:#FFF;text-shadow:none}.ui.basic.positive.button,.ui.basic.positive.buttons .button{box-shadow:0 0 0 1px #21BA45 inset!important;color:#21BA45!important}.ui.basic.positive.button:hover,.ui.basic.positive.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #16ab39 inset!important;color:#16ab39!important}.ui.basic.positive.button:focus,.ui.basic.positive.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #0ea432 inset!important;color:#16ab39!important}.ui.basic.positive.active.button,.ui.basic.positive.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #13ae38 inset!important;color:#198f35!important}.ui.basic.positive.button:active,.ui.basic.positive.buttons .button:active{box-shadow:0 0 0 1px #198f35 inset!important;color:#198f35!important}.ui.negative.button,.ui.negative.buttons .button{background-color:#DB2828;color:#FFF;text-shadow:none;background-image:none}.ui.negative.button{box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.negative.button:hover,.ui.negative.buttons .button:hover{background-color:#d01919;color:#FFF;text-shadow:none}.ui.negative.button:focus,.ui.negative.buttons .button:focus{background-color:#ca1010;color:#FFF;text-shadow:none}.ui.negative.button:active,.ui.negative.buttons .button:active{background-color:#b21e1e;color:#FFF;text-shadow:none}.ui.negative.active.button,.ui.negative.button .active.button:active,.ui.negative.buttons .active.button,.ui.negative.buttons .active.button:active{background-color:#d41515;color:#FFF;text-shadow:none}.ui.basic.negative.button,.ui.basic.negative.buttons .button{box-shadow:0 0 0 1px #DB2828 inset!important;color:#DB2828!important}.ui.basic.negative.button:hover,.ui.basic.negative.buttons .button:hover{background:0 0!important;box-shadow:0 0 0 1px #d01919 inset!important;color:#d01919!important}.ui.basic.negative.button:focus,.ui.basic.negative.buttons .button:focus{background:0 0!important;box-shadow:0 0 0 1px #ca1010 inset!important;color:#d01919!important}.ui.basic.negative.active.button,.ui.basic.negative.buttons .active.button{background:0 0!important;box-shadow:0 0 0 1px #d41515 inset!important;color:#b21e1e!important}.ui.basic.negative.button:active,.ui.basic.negative.buttons .button:active{box-shadow:0 0 0 1px #b21e1e inset!important;color:#b21e1e!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.buttons{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;font-size:0;vertical-align:baseline;margin:0 .25em 0 0}.ui.buttons:not(.basic):not(.inverted){box-shadow:none}.ui.buttons:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ui.buttons .button{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;border-radius:0;margin:0}.ui.buttons:not(.basic):not(.inverted)>.button,.ui.buttons>.ui.button:not(.basic):not(.inverted){box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.buttons .button:first-child{border-left:none;margin-left:0;border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.buttons .button:last-child{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui.vertical.buttons .button{display:block;float:none;width:100%;margin:0;box-shadow:none}.ui.vertical.buttons .button:first-child,.ui.vertical.buttons .huge.button:first-child,.ui.vertical.buttons .massive.button:first-child,.ui.vertical.buttons .mini.button:first-child,.ui.vertical.buttons .small.button:first-child,.ui.vertical.buttons .tiny.button:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.buttons .button:last-child,.ui.vertical.buttons .gigantic.button:last-child,.ui.vertical.buttons .huge.button:last-child,.ui.vertical.buttons .massive.button:last-child,.ui.vertical.buttons .mini.button:last-child,.ui.vertical.buttons .small.button:last-child,.ui.vertical.buttons .tiny.button:last-child{margin-bottom:0;border-radius:0 0 .28571429rem .28571429rem}.ui.container{display:block;max-width:100%!important}@media only screen and (max-width:767px){.ui.container{width:auto!important;margin-left:1em!important;margin-right:1em!important}.ui.grid.container,.ui.relaxed.grid.container,.ui.very.relaxed.grid.container{width:auto!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.container{width:723px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(723px + 2rem)!important}.ui.relaxed.grid.container{width:calc(723px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(723px + 5rem)!important}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.container{width:933px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(933px + 2rem)!important}.ui.relaxed.grid.container{width:calc(933px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(933px + 5rem)!important}}@media only screen and (min-width:1200px){.ui.container{width:1127px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(1127px + 2rem)!important}.ui.relaxed.grid.container{width:calc(1127px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(1127px + 5rem)!important}}.ui.text.container{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;max-width:700px!important;line-height:1.5;font-size:1.14285714rem}.ui.fluid.container{width:100%}.ui[class*="left aligned"].container{text-align:left}.ui[class*="center aligned"].container{text-align:center}.ui[class*="right aligned"].container{text-align:right}.ui.justified.container{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.ui.divider{margin:1rem 0;line-height:1;height:0;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:rgba(0,0,0,.85);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;font-size:1rem}.ui.divider:not(.vertical):not(.horizontal){border-top:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(255,255,255,.1)}.ui.grid>.column+.divider,.ui.grid>.row>.column+.divider{left:auto}.ui.horizontal.divider{display:table;white-space:nowrap;height:auto;margin:'';line-height:1;text-align:center}.ui.horizontal.divider:after,.ui.horizontal.divider:before{content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}.ui.horizontal.divider:before{background-position:right 1em top 50%}.ui.horizontal.divider:after{background-position:left 1em top 50%}.ui.vertical.divider{position:absolute;z-index:2;top:50%;left:50%;margin:0;padding:0;width:auto;height:50%;line-height:0;text-align:center;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ui.vertical.divider:after,.ui.vertical.divider:before{position:absolute;left:50%;content:'';z-index:3;border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(255,255,255,.1);width:0;height:calc(100% - 1rem)}.ui.vertical.divider:before{top:-100%}.ui.vertical.divider:after{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider,.ui.stackable.grid .ui.vertical.divider{display:table;white-space:nowrap;height:auto;margin:'';overflow:hidden;line-height:1;text-align:center;position:static;top:0;left:0;-webkit-transform:none;transform:none}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{left:0;border-left:none;border-right:none;content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:before{background-position:right 1em top 50%}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:after{background-position:left 1em top 50%}}.ui.divider>.icon{margin:0;font-size:1rem;height:1em;vertical-align:middle}.ui.hidden.divider{border-color:transparent!important}.ui.hidden.divider:after,.ui.hidden.divider:before{display:none}.ui.divider.inverted,.ui.horizontal.inverted.divider,.ui.vertical.inverted.divider{color:#FFF}.ui.divider.inverted,.ui.divider.inverted:after,.ui.divider.inverted:before{border-top-color:rgba(34,36,38,.15)!important;border-left-color:rgba(34,36,38,.15)!important;border-bottom-color:rgba(255,255,255,.15)!important;border-right-color:rgba(255,255,255,.15)!important}.ui.fitted.divider{margin:0}.ui.clearing.divider{clear:both}.ui.section.divider{margin-top:2rem;margin-bottom:2rem}i.flag:not(.icon){display:inline-block;width:16px;height:11px;line-height:11px;vertical-align:baseline;margin:0 .5em 0 0;text-decoration:inherit;speak:none;font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.flag:not(.icon):before{display:inline-block;content:'';background:url(themes/default/assets/images/flags.png) -108px -1976px no-repeat;width:16px;height:11px}i.flag.ad:before,i.flag.andorra:before{background-position:0 0}i.flag.ae:before,i.flag.uae:before,i.flag.united.arab.emirates:before{background-position:0 -26px}i.flag.af:before,i.flag.afghanistan:before{background-position:0 -52px}i.flag.ag:before,i.flag.antigua:before{background-position:0 -78px}i.flag.ai:before,i.flag.anguilla:before{background-position:0 -104px}i.flag.al:before,i.flag.albania:before{background-position:0 -130px}i.flag.am:before,i.flag.armenia:before{background-position:0 -156px}i.flag.an:before,i.flag.netherlands.antilles:before{background-position:0 -182px}i.flag.angola:before,i.flag.ao:before{background-position:0 -208px}i.flag.ar:before,i.flag.argentina:before{background-position:0 -234px}i.flag.american.samoa:before,i.flag.as:before{background-position:0 -260px}i.flag.at:before,i.flag.austria:before{background-position:0 -286px}i.flag.au:before,i.flag.australia:before{background-position:0 -312px}i.flag.aruba:before,i.flag.aw:before{background-position:0 -338px}i.flag.aland.islands:before,i.flag.ax:before{background-position:0 -364px}i.flag.az:before,i.flag.azerbaijan:before{background-position:0 -390px}i.flag.ba:before,i.flag.bosnia:before{background-position:0 -416px}i.flag.barbados:before,i.flag.bb:before{background-position:0 -442px}i.flag.bangladesh:before,i.flag.bd:before{background-position:0 -468px}i.flag.be:before,i.flag.belgium:before{background-position:0 -494px}i.flag.bf:before,i.flag.burkina.faso:before{background-position:0 -520px}i.flag.bg:before,i.flag.bulgaria:before{background-position:0 -546px}i.flag.bahrain:before,i.flag.bh:before{background-position:0 -572px}i.flag.bi:before,i.flag.burundi:before{background-position:0 -598px}i.flag.benin:before,i.flag.bj:before{background-position:0 -624px}i.flag.bermuda:before,i.flag.bm:before{background-position:0 -650px}i.flag.bn:before,i.flag.brunei:before{background-position:0 -676px}i.flag.bo:before,i.flag.bolivia:before{background-position:0 -702px}i.flag.br:before,i.flag.brazil:before{background-position:0 -728px}i.flag.bahamas:before,i.flag.bs:before{background-position:0 -754px}i.flag.bhutan:before,i.flag.bt:before{background-position:0 -780px}i.flag.bouvet.island:before,i.flag.bv:before{background-position:0 -806px}i.flag.botswana:before,i.flag.bw:before{background-position:0 -832px}i.flag.belarus:before,i.flag.by:before{background-position:0 -858px}i.flag.belize:before,i.flag.bz:before{background-position:0 -884px}i.flag.ca:before,i.flag.canada:before{background-position:0 -910px}i.flag.cc:before,i.flag.cocos.islands:before{background-position:0 -962px}i.flag.cd:before,i.flag.congo:before{background-position:0 -988px}i.flag.central.african.republic:before,i.flag.cf:before{background-position:0 -1014px}i.flag.cg:before,i.flag.congo.brazzaville:before{background-position:0 -1040px}i.flag.ch:before,i.flag.switzerland:before{background-position:0 -1066px}i.flag.ci:before,i.flag.cote.divoire:before{background-position:0 -1092px}i.flag.ck:before,i.flag.cook.islands:before{background-position:0 -1118px}i.flag.chile:before,i.flag.cl:before{background-position:0 -1144px}i.flag.cameroon:before,i.flag.cm:before{background-position:0 -1170px}i.flag.china:before,i.flag.cn:before{background-position:0 -1196px}i.flag.co:before,i.flag.colombia:before{background-position:0 -1222px}i.flag.costa.rica:before,i.flag.cr:before{background-position:0 -1248px}i.flag.cs:before,i.flag.serbia:before{background-position:0 -1274px}i.flag.cu:before,i.flag.cuba:before{background-position:0 -1300px}i.flag.cape.verde:before,i.flag.cv:before{background-position:0 -1326px}i.flag.christmas.island:before,i.flag.cx:before{background-position:0 -1352px}i.flag.cy:before,i.flag.cyprus:before{background-position:0 -1378px}i.flag.cz:before,i.flag.czech.republic:before{background-position:0 -1404px}i.flag.de:before,i.flag.germany:before{background-position:0 -1430px}i.flag.dj:before,i.flag.djibouti:before{background-position:0 -1456px}i.flag.denmark:before,i.flag.dk:before{background-position:0 -1482px}i.flag.dm:before,i.flag.dominica:before{background-position:0 -1508px}i.flag.do:before,i.flag.dominican.republic:before{background-position:0 -1534px}i.flag.algeria:before,i.flag.dz:before{background-position:0 -1560px}i.flag.ec:before,i.flag.ecuador:before{background-position:0 -1586px}i.flag.ee:before,i.flag.estonia:before{background-position:0 -1612px}i.flag.eg:before,i.flag.egypt:before{background-position:0 -1638px}i.flag.eh:before,i.flag.western.sahara:before{background-position:0 -1664px}i.flag.er:before,i.flag.eritrea:before{background-position:0 -1716px}i.flag.es:before,i.flag.spain:before{background-position:0 -1742px}i.flag.et:before,i.flag.ethiopia:before{background-position:0 -1768px}i.flag.eu:before,i.flag.european.union:before{background-position:0 -1794px}i.flag.fi:before,i.flag.finland:before{background-position:0 -1846px}i.flag.fiji:before,i.flag.fj:before{background-position:0 -1872px}i.flag.falkland.islands:before,i.flag.fk:before{background-position:0 -1898px}i.flag.fm:before,i.flag.micronesia:before{background-position:0 -1924px}i.flag.faroe.islands:before,i.flag.fo:before{background-position:0 -1950px}i.flag.fr:before,i.flag.france:before{background-position:0 -1976px}i.flag.ga:before,i.flag.gabon:before{background-position:-36px 0}i.flag.gb:before,i.flag.united.kingdom:before{background-position:-36px -26px}i.flag.gd:before,i.flag.grenada:before{background-position:-36px -52px}i.flag.ge:before,i.flag.georgia:before{background-position:-36px -78px}i.flag.french.guiana:before,i.flag.gf:before{background-position:-36px -104px}i.flag.gh:before,i.flag.ghana:before{background-position:-36px -130px}i.flag.gi:before,i.flag.gibraltar:before{background-position:-36px -156px}i.flag.gl:before,i.flag.greenland:before{background-position:-36px -182px}i.flag.gambia:before,i.flag.gm:before{background-position:-36px -208px}i.flag.gn:before,i.flag.guinea:before{background-position:-36px -234px}i.flag.gp:before,i.flag.guadeloupe:before{background-position:-36px -260px}i.flag.equatorial.guinea:before,i.flag.gq:before{background-position:-36px -286px}i.flag.gr:before,i.flag.greece:before{background-position:-36px -312px}i.flag.gs:before,i.flag.sandwich.islands:before{background-position:-36px -338px}i.flag.gt:before,i.flag.guatemala:before{background-position:-36px -364px}i.flag.gu:before,i.flag.guam:before{background-position:-36px -390px}i.flag.guinea-bissau:before,i.flag.gw:before{background-position:-36px -416px}i.flag.guyana:before,i.flag.gy:before{background-position:-36px -442px}i.flag.hk:before,i.flag.hong.kong:before{background-position:-36px -468px}i.flag.heard.island:before,i.flag.hm:before{background-position:-36px -494px}i.flag.hn:before,i.flag.honduras:before{background-position:-36px -520px}i.flag.croatia:before,i.flag.hr:before{background-position:-36px -546px}i.flag.haiti:before,i.flag.ht:before{background-position:-36px -572px}i.flag.hu:before,i.flag.hungary:before{background-position:-36px -598px}i.flag.id:before,i.flag.indonesia:before{background-position:-36px -624px}i.flag.ie:before,i.flag.ireland:before{background-position:-36px -650px}i.flag.il:before,i.flag.israel:before{background-position:-36px -676px}i.flag.in:before,i.flag.india:before{background-position:-36px -702px}i.flag.indian.ocean.territory:before,i.flag.io:before{background-position:-36px -728px}i.flag.iq:before,i.flag.iraq:before{background-position:-36px -754px}i.flag.ir:before,i.flag.iran:before{background-position:-36px -780px}i.flag.iceland:before,i.flag.is:before{background-position:-36px -806px}i.flag.it:before,i.flag.italy:before{background-position:-36px -832px}i.flag.jamaica:before,i.flag.jm:before{background-position:-36px -858px}i.flag.jo:before,i.flag.jordan:before{background-position:-36px -884px}i.flag.japan:before,i.flag.jp:before{background-position:-36px -910px}i.flag.ke:before,i.flag.kenya:before{background-position:-36px -936px}i.flag.kg:before,i.flag.kyrgyzstan:before{background-position:-36px -962px}i.flag.cambodia:before,i.flag.kh:before{background-position:-36px -988px}i.flag.ki:before,i.flag.kiribati:before{background-position:-36px -1014px}i.flag.comoros:before,i.flag.km:before{background-position:-36px -1040px}i.flag.kn:before,i.flag.saint.kitts.and.nevis:before{background-position:-36px -1066px}i.flag.kp:before,i.flag.north.korea:before{background-position:-36px -1092px}i.flag.kr:before,i.flag.south.korea:before{background-position:-36px -1118px}i.flag.kuwait:before,i.flag.kw:before{background-position:-36px -1144px}i.flag.cayman.islands:before,i.flag.ky:before{background-position:-36px -1170px}i.flag.kazakhstan:before,i.flag.kz:before{background-position:-36px -1196px}i.flag.la:before,i.flag.laos:before{background-position:-36px -1222px}i.flag.lb:before,i.flag.lebanon:before{background-position:-36px -1248px}i.flag.lc:before,i.flag.saint.lucia:before{background-position:-36px -1274px}i.flag.li:before,i.flag.liechtenstein:before{background-position:-36px -1300px}i.flag.lk:before,i.flag.sri.lanka:before{background-position:-36px -1326px}i.flag.liberia:before,i.flag.lr:before{background-position:-36px -1352px}i.flag.lesotho:before,i.flag.ls:before{background-position:-36px -1378px}i.flag.lithuania:before,i.flag.lt:before{background-position:-36px -1404px}i.flag.lu:before,i.flag.luxembourg:before{background-position:-36px -1430px}i.flag.latvia:before,i.flag.lv:before{background-position:-36px -1456px}i.flag.libya:before,i.flag.ly:before{background-position:-36px -1482px}i.flag.ma:before,i.flag.morocco:before{background-position:-36px -1508px}i.flag.mc:before,i.flag.monaco:before{background-position:-36px -1534px}i.flag.md:before,i.flag.moldova:before{background-position:-36px -1560px}i.flag.me:before,i.flag.montenegro:before{background-position:-36px -1586px}i.flag.madagascar:before,i.flag.mg:before{background-position:-36px -1613px}i.flag.marshall.islands:before,i.flag.mh:before{background-position:-36px -1639px}i.flag.macedonia:before,i.flag.mk:before{background-position:-36px -1665px}i.flag.mali:before,i.flag.ml:before{background-position:-36px -1691px}i.flag.burma:before,i.flag.mm:before,i.flag.myanmar:before{background-position:-36px -1717px}i.flag.mn:before,i.flag.mongolia:before{background-position:-36px -1743px}i.flag.macau:before,i.flag.mo:before{background-position:-36px -1769px}i.flag.mp:before,i.flag.northern.mariana.islands:before{background-position:-36px -1795px}i.flag.martinique:before,i.flag.mq:before{background-position:-36px -1821px}i.flag.mauritania:before,i.flag.mr:before{background-position:-36px -1847px}i.flag.montserrat:before,i.flag.ms:before{background-position:-36px -1873px}i.flag.malta:before,i.flag.mt:before{background-position:-36px -1899px}i.flag.mauritius:before,i.flag.mu:before{background-position:-36px -1925px}i.flag.maldives:before,i.flag.mv:before{background-position:-36px -1951px}i.flag.malawi:before,i.flag.mw:before{background-position:-36px -1977px}i.flag.mexico:before,i.flag.mx:before{background-position:-72px 0}i.flag.malaysia:before,i.flag.my:before{background-position:-72px -26px}i.flag.mozambique:before,i.flag.mz:before{background-position:-72px -52px}i.flag.na:before,i.flag.namibia:before{background-position:-72px -78px}i.flag.nc:before,i.flag.new.caledonia:before{background-position:-72px -104px}i.flag.ne:before,i.flag.niger:before{background-position:-72px -130px}i.flag.nf:before,i.flag.norfolk.island:before{background-position:-72px -156px}i.flag.ng:before,i.flag.nigeria:before{background-position:-72px -182px}i.flag.ni:before,i.flag.nicaragua:before{background-position:-72px -208px}i.flag.netherlands:before,i.flag.nl:before{background-position:-72px -234px}i.flag.no:before,i.flag.norway:before{background-position:-72px -260px}i.flag.nepal:before,i.flag.np:before{background-position:-72px -286px}i.flag.nauru:before,i.flag.nr:before{background-position:-72px -312px}i.flag.niue:before,i.flag.nu:before{background-position:-72px -338px}i.flag.new.zealand:before,i.flag.nz:before{background-position:-72px -364px}i.flag.om:before,i.flag.oman:before{background-position:-72px -390px}i.flag.pa:before,i.flag.panama:before{background-position:-72px -416px}i.flag.pe:before,i.flag.peru:before{background-position:-72px -442px}i.flag.french.polynesia:before,i.flag.pf:before{background-position:-72px -468px}i.flag.new.guinea:before,i.flag.pg:before{background-position:-72px -494px}i.flag.ph:before,i.flag.philippines:before{background-position:-72px -520px}i.flag.pakistan:before,i.flag.pk:before{background-position:-72px -546px}i.flag.pl:before,i.flag.poland:before{background-position:-72px -572px}i.flag.pm:before,i.flag.saint.pierre:before{background-position:-72px -598px}i.flag.pitcairn.islands:before,i.flag.pn:before{background-position:-72px -624px}i.flag.pr:before,i.flag.puerto.rico:before{background-position:-72px -650px}i.flag.palestine:before,i.flag.ps:before{background-position:-72px -676px}i.flag.portugal:before,i.flag.pt:before{background-position:-72px -702px}i.flag.palau:before,i.flag.pw:before{background-position:-72px -728px}i.flag.paraguay:before,i.flag.py:before{background-position:-72px -754px}i.flag.qa:before,i.flag.qatar:before{background-position:-72px -780px}i.flag.re:before,i.flag.reunion:before{background-position:-72px -806px}i.flag.ro:before,i.flag.romania:before{background-position:-72px -832px}i.flag.rs:before,i.flag.serbia:before{background-position:-72px -858px}i.flag.ru:before,i.flag.russia:before{background-position:-72px -884px}i.flag.rw:before,i.flag.rwanda:before{background-position:-72px -910px}i.flag.sa:before,i.flag.saudi.arabia:before{background-position:-72px -936px}i.flag.sb:before,i.flag.solomon.islands:before{background-position:-72px -962px}i.flag.sc:before,i.flag.seychelles:before{background-position:-72px -988px}i.flag.gb.sct:before,i.flag.scotland:before{background-position:-72px -1014px}i.flag.sd:before,i.flag.sudan:before{background-position:-72px -1040px}i.flag.se:before,i.flag.sweden:before{background-position:-72px -1066px}i.flag.sg:before,i.flag.singapore:before{background-position:-72px -1092px}i.flag.saint.helena:before,i.flag.sh:before{background-position:-72px -1118px}i.flag.si:before,i.flag.slovenia:before{background-position:-72px -1144px}i.flag.jan.mayen:before,i.flag.sj:before,i.flag.svalbard:before{background-position:-72px -1170px}i.flag.sk:before,i.flag.slovakia:before{background-position:-72px -1196px}i.flag.sierra.leone:before,i.flag.sl:before{background-position:-72px -1222px}i.flag.san.marino:before,i.flag.sm:before{background-position:-72px -1248px}i.flag.senegal:before,i.flag.sn:before{background-position:-72px -1274px}i.flag.so:before,i.flag.somalia:before{background-position:-72px -1300px}i.flag.sr:before,i.flag.suriname:before{background-position:-72px -1326px}i.flag.sao.tome:before,i.flag.st:before{background-position:-72px -1352px}i.flag.el.salvador:before,i.flag.sv:before{background-position:-72px -1378px}i.flag.sy:before,i.flag.syria:before{background-position:-72px -1404px}i.flag.swaziland:before,i.flag.sz:before{background-position:-72px -1430px}i.flag.caicos.islands:before,i.flag.tc:before{background-position:-72px -1456px}i.flag.chad:before,i.flag.td:before{background-position:-72px -1482px}i.flag.french.territories:before,i.flag.tf:before{background-position:-72px -1508px}i.flag.tg:before,i.flag.togo:before{background-position:-72px -1534px}i.flag.th:before,i.flag.thailand:before{background-position:-72px -1560px}i.flag.tajikistan:before,i.flag.tj:before{background-position:-72px -1586px}i.flag.tk:before,i.flag.tokelau:before{background-position:-72px -1612px}i.flag.timorleste:before,i.flag.tl:before{background-position:-72px -1638px}i.flag.tm:before,i.flag.turkmenistan:before{background-position:-72px -1664px}i.flag.tn:before,i.flag.tunisia:before{background-position:-72px -1690px}i.flag.to:before,i.flag.tonga:before{background-position:-72px -1716px}i.flag.tr:before,i.flag.turkey:before{background-position:-72px -1742px}i.flag.trinidad:before,i.flag.tt:before{background-position:-72px -1768px}i.flag.tuvalu:before,i.flag.tv:before{background-position:-72px -1794px}i.flag.taiwan:before,i.flag.tw:before{background-position:-72px -1820px}i.flag.tanzania:before,i.flag.tz:before{background-position:-72px -1846px}i.flag.ua:before,i.flag.ukraine:before{background-position:-72px -1872px}i.flag.ug:before,i.flag.uganda:before{background-position:-72px -1898px}i.flag.um:before,i.flag.us.minor.islands:before{background-position:-72px -1924px}i.flag.america:before,i.flag.united.states:before,i.flag.us:before{background-position:-72px -1950px}i.flag.uruguay:before,i.flag.uy:before{background-position:-72px -1976px}i.flag.uz:before,i.flag.uzbekistan:before{background-position:-108px 0}i.flag.va:before,i.flag.vatican.city:before{background-position:-108px -26px}i.flag.saint.vincent:before,i.flag.vc:before{background-position:-108px -52px}i.flag.ve:before,i.flag.venezuela:before{background-position:-108px -78px}i.flag.british.virgin.islands:before,i.flag.vg:before{background-position:-108px -104px}i.flag.us.virgin.islands:before,i.flag.vi:before{background-position:-108px -130px}i.flag.vietnam:before,i.flag.vn:before{background-position:-108px -156px}i.flag.vanuatu:before,i.flag.vu:before{background-position:-108px -182px}i.flag.gb.wls:before,i.flag.wales:before{background-position:-108px -208px}i.flag.wallis.and.futuna:before,i.flag.wf:before{background-position:-108px -234px}i.flag.samoa:before,i.flag.ws:before{background-position:-108px -260px}i.flag.ye:before,i.flag.yemen:before{background-position:-108px -286px}i.flag.mayotte:before,i.flag.yt:before{background-position:-108px -312px}i.flag.south.africa:before,i.flag.za:before{background-position:-108px -338px}i.flag.zambia:before,i.flag.zm:before{background-position:-108px -364px}i.flag.zimbabwe:before,i.flag.zw:before{background-position:-108px -390px}.ui.header{border:none;margin:calc(2rem - .14285em) 0 1rem;padding:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;line-height:1.2857em;text-transform:none;color:rgba(0,0,0,.87)}.ui.header:first-child{margin-top:-.14285em}.ui.header:last-child{margin-bottom:0}.ui.header .sub.header{display:block;font-weight:400;padding:0;margin:0;line-height:1.2em;color:rgba(0,0,0,.6)}.ui.header>.icon{display:table-cell;opacity:1;font-size:1.5em;padding-top:.14285em;vertical-align:middle}.ui.header .icon:only-child{display:inline-block;padding:0;margin-right:.75rem}.ui.header>.image,.ui.header>img{display:inline-block;margin-top:.14285em;width:2.5em;height:auto;vertical-align:middle}.ui.header>.image:only-child,.ui.header>img:only-child{margin-right:.75rem}.ui.header .content{display:inline-block;vertical-align:top}.ui.header>.image+.content,.ui.header>img+.content{padding-left:.75rem;vertical-align:middle}.ui.header>.icon+.content{padding-left:.75rem;display:table-cell;vertical-align:middle}.ui.header .ui.label{font-size:'';margin-left:.5rem;vertical-align:middle}.ui.header+p{margin-top:0}h1.ui.header{font-size:2rem}h2.ui.header{font-size:1.714rem}h3.ui.header{font-size:1.28rem}h4.ui.header{font-size:1.071rem}h5.ui.header{font-size:1rem}h1.ui.header .sub.header,h2.ui.header .sub.header{font-size:1.14285714rem}h3.ui.header .sub.header,h4.ui.header .sub.header{font-size:1rem}h5.ui.header .sub.header{font-size:.92857143rem}.ui.huge.header{min-height:1em;font-size:2em}.ui.large.header{font-size:1.714em}.ui.medium.header{font-size:1.28em}.ui.small.header{font-size:1.071em}.ui.tiny.header{font-size:1em}.ui.huge.header .sub.header,.ui.large.header .sub.header{font-size:1.14285714rem}.ui.header .sub.header,.ui.small.header .sub.header{font-size:1rem}.ui.tiny.header .sub.header{font-size:.92857143rem}.ui.small.sub.header{font-size:.78571429em}.ui.sub.header{padding:0;margin-bottom:.14285714rem;font-weight:700;text-transform:uppercase;color:'';font-size:.85714286em}.ui.large.sub.header{font-size:.92857143em}.ui.huge.sub.header{font-size:1em}.ui.icon.header{display:inline-block;text-align:center;margin:2rem 0 1rem}.ui.icon.header:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.icon.header:first-child{margin-top:0}.ui.icon.header .icon{float:none;display:block;width:auto;height:auto;line-height:1;padding:0;font-size:3em;margin:0 auto .5rem;opacity:1}.ui.icon.header .content{display:block;padding:0}.ui.icon.header .circular.icon,.ui.icon.header .square.icon{font-size:2em}.ui.block.icon.header .icon{margin-bottom:0}.ui.icon.header.aligned{margin-left:auto;margin-right:auto;display:block}.ui.disabled.header{opacity:.45}.ui.inverted.header{color:#FFF}.ui.inverted.header .sub.header{color:rgba(255,255,255,.8)}.ui.inverted.attached.header{background:-webkit-linear-gradient(transparent,rgba(0,0,0,.05)) #545454;background:linear-gradient(transparent,rgba(0,0,0,.05)) #545454;box-shadow:none;border-color:transparent}.ui.inverted.block.header{background:-webkit-linear-gradient(transparent,rgba(0,0,0,.05)) #545454;background:linear-gradient(transparent,rgba(0,0,0,.05)) #545454;box-shadow:none;border-bottom:none}.ui.red.header{color:#DB2828!important}a.ui.red.header:hover{color:#d01919!important}.ui.red.dividing.header{border-bottom:2px solid #DB2828}.ui.inverted.red.header{color:#FF695E!important}a.ui.inverted.red.header:hover{color:#ff5144!important}.ui.orange.header{color:#F2711C!important}a.ui.orange.header:hover{color:#f26202!important}.ui.orange.dividing.header{border-bottom:2px solid #F2711C}.ui.inverted.orange.header{color:#FF851B!important}a.ui.inverted.orange.header:hover{color:#ff7701!important}.ui.olive.header{color:#B5CC18!important}a.ui.olive.header:hover{color:#a7bd0d!important}.ui.olive.dividing.header{border-bottom:2px solid #B5CC18}.ui.inverted.olive.header{color:#D9E778!important}a.ui.inverted.olive.header:hover{color:#d8ea5c!important}.ui.yellow.header{color:#FBBD08!important}a.ui.yellow.header:hover{color:#eaae00!important}.ui.yellow.dividing.header{border-bottom:2px solid #FBBD08}.ui.inverted.yellow.header{color:#FFE21F!important}a.ui.inverted.yellow.header:hover{color:#ffdf05!important}.ui.green.header{color:#21BA45!important}a.ui.green.header:hover{color:#16ab39!important}.ui.green.dividing.header{border-bottom:2px solid #21BA45}.ui.inverted.green.header{color:#2ECC40!important}a.ui.inverted.green.header:hover{color:#22be34!important}.ui.teal.header{color:#00B5AD!important}a.ui.teal.header:hover{color:#009c95!important}.ui.teal.dividing.header{border-bottom:2px solid #00B5AD}.ui.inverted.teal.header{color:#6DFFFF!important}a.ui.inverted.teal.header:hover{color:#54ffff!important}.ui.blue.header{color:#2185D0!important}a.ui.blue.header:hover{color:#1678c2!important}.ui.blue.dividing.header{border-bottom:2px solid #2185D0}.ui.inverted.blue.header{color:#54C8FF!important}a.ui.inverted.blue.header:hover{color:#3ac0ff!important}.ui.violet.header{color:#6435C9!important}a.ui.violet.header:hover{color:#5829bb!important}.ui.violet.dividing.header{border-bottom:2px solid #6435C9}.ui.inverted.violet.header{color:#A291FB!important}a.ui.inverted.violet.header:hover{color:#8a73ff!important}.ui.purple.header{color:#A333C8!important}a.ui.purple.header:hover{color:#9627ba!important}.ui.purple.dividing.header{border-bottom:2px solid #A333C8}.ui.inverted.purple.header{color:#DC73FF!important}a.ui.inverted.purple.header:hover{color:#d65aff!important}.ui.pink.header{color:#E03997!important}a.ui.pink.header:hover{color:#e61a8d!important}.ui.pink.dividing.header{border-bottom:2px solid #E03997}.ui.inverted.pink.header{color:#FF8EDF!important}a.ui.inverted.pink.header:hover{color:#ff74d8!important}.ui.brown.header{color:#A5673F!important}a.ui.brown.header:hover{color:#975b33!important}.ui.brown.dividing.header{border-bottom:2px solid #A5673F}.ui.inverted.brown.header{color:#D67C1C!important}a.ui.inverted.brown.header:hover{color:#c86f11!important}.ui.grey.header{color:#767676!important}a.ui.grey.header:hover{color:#838383!important}.ui.grey.dividing.header{border-bottom:2px solid #767676}.ui.inverted.grey.header{color:#DCDDDE!important}a.ui.inverted.grey.header:hover{color:#cfd0d2!important}.ui.left.aligned.header{text-align:left}.ui.right.aligned.header{text-align:right}.ui.center.aligned.header,.ui.centered.header{text-align:center}.ui.justified.header{text-align:justify}.ui.justified.header:after{display:inline-block;content:'';width:100%}.ui.floated.header,.ui[class*="left floated"].header{float:left;margin-top:0;margin-right:.5em}.ui[class*="right floated"].header{float:right;margin-top:0;margin-left:.5em}.ui.fitted.header{padding:0}.ui.dividing.header{padding-bottom:.21428571rem;border-bottom:1px solid rgba(34,36,38,.15)}.ui.dividing.header .sub.header{padding-bottom:.21428571rem}.ui.dividing.header .icon{margin-bottom:0}.ui.inverted.dividing.header{border-bottom-color:rgba(255,255,255,.1)}.ui.block.header{background:#F3F4F5;padding:.78571429rem 1rem;box-shadow:none;border:1px solid #D4D4D5;border-radius:.28571429rem}.ui.tiny.block.header{font-size:.85714286rem}.ui.small.block.header{font-size:.92857143rem}.ui.block.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1rem}.ui.large.block.header{font-size:1.14285714rem}.ui.huge.block.header{font-size:1.42857143rem}.ui.attached.header{background:#FFF;padding:.78571429rem 1rem;margin-left:-1px;margin-right:-1px;box-shadow:none;border:1px solid #D4D4D5}.ui.attached.block.header{background:#F3F4F5}.ui.attached:not(.top):not(.bottom).header{margin-top:0;margin-bottom:0;border-top:none;border-radius:0}.ui.top.attached.header{margin-bottom:0;border-radius:.28571429rem .28571429rem 0 0}.ui.bottom.attached.header{margin-top:0;border-top:none;border-radius:0 0 .28571429rem .28571429rem}.ui.tiny.attached.header{font-size:.85714286em}.ui.small.attached.header{font-size:.92857143em}.ui.attached.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1em}.ui.large.attached.header{font-size:1.14285714em}.ui.huge.attached.header{font-size:1.42857143em}.ui.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1.28em}@font-face{font-family:Icons;src:url(themes/default/assets/fonts/icons.eot);src:url(themes/default/assets/fonts/icons.eot?#iefix) format('embedded-opentype'),url(themes/default/assets/fonts/icons.woff2) format('woff2'),url(themes/default/assets/fonts/icons.woff) format('woff'),url(themes/default/assets/fonts/icons.ttf) format('truetype'),url(themes/default/assets/fonts/icons.svg#icons) format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon{display:inline-block;opacity:1;margin:0 .25rem 0 0;width:1.18em;height:1em;font-family:Icons;font-style:normal;font-weight:400;text-decoration:inherit;text-align:center;speak:none;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.icon:before{background:0 0!important}i.icon.loading{height:1em;line-height:1;-webkit-animation:icon-loading 2s linear infinite;animation:icon-loading 2s linear infinite}@-webkit-keyframes icon-loading{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-loading{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}i.emphasized.icon,i.icon.active,i.icon.hover{opacity:1!important}i.disabled.icon{opacity:.45!important}i.fitted.icon{width:auto;margin:0}i.link.icon{cursor:pointer;opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}i.link.icon:hover{opacity:1!important}i.circular.icon{border-radius:500em!important;line-height:1!important;padding:.5em!important;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;width:2em!important;height:2em!important}i.circular.inverted.icon{border:none;box-shadow:none}i.flipped.icon,i.horizontally.flipped.icon{-webkit-transform:scale(-1,1);transform:scale(-1,1)}i.vertically.flipped.icon{-webkit-transform:scale(1,-1);transform:scale(1,-1)}i.clockwise.rotated.icon,i.right.rotated.icon,i.rotated.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}i.counterclockwise.rotated.icon,i.left.rotated.icon{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}i.bordered.icon{line-height:1;vertical-align:baseline;width:2em;height:2em;padding:.5em .41em!important;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset}i.bordered.inverted.icon{border:none;box-shadow:none}i.inverted.bordered.icon,i.inverted.circular.icon{background-color:#1B1C1D!important;color:#FFF!important}i.inverted.icon{color:#FFF}i.red.icon{color:#DB2828!important}i.inverted.red.icon{color:#FF695E!important}i.inverted.bordered.red.icon,i.inverted.circular.red.icon{background-color:#DB2828!important;color:#FFF!important}i.orange.icon{color:#F2711C!important}i.inverted.orange.icon{color:#FF851B!important}i.inverted.bordered.orange.icon,i.inverted.circular.orange.icon{background-color:#F2711C!important;color:#FFF!important}i.yellow.icon{color:#FBBD08!important}i.inverted.yellow.icon{color:#FFE21F!important}i.inverted.bordered.yellow.icon,i.inverted.circular.yellow.icon{background-color:#FBBD08!important;color:#FFF!important}i.olive.icon{color:#B5CC18!important}i.inverted.olive.icon{color:#D9E778!important}i.inverted.bordered.olive.icon,i.inverted.circular.olive.icon{background-color:#B5CC18!important;color:#FFF!important}i.green.icon{color:#21BA45!important}i.inverted.green.icon{color:#2ECC40!important}i.inverted.bordered.green.icon,i.inverted.circular.green.icon{background-color:#21BA45!important;color:#FFF!important}i.teal.icon{color:#00B5AD!important}i.inverted.teal.icon{color:#6DFFFF!important}i.inverted.bordered.teal.icon,i.inverted.circular.teal.icon{background-color:#00B5AD!important;color:#FFF!important}i.blue.icon{color:#2185D0!important}i.inverted.blue.icon{color:#54C8FF!important}i.inverted.bordered.blue.icon,i.inverted.circular.blue.icon{background-color:#2185D0!important;color:#FFF!important}i.violet.icon{color:#6435C9!important}i.inverted.violet.icon{color:#A291FB!important}i.inverted.bordered.violet.icon,i.inverted.circular.violet.icon{background-color:#6435C9!important;color:#FFF!important}i.purple.icon{color:#A333C8!important}i.inverted.purple.icon{color:#DC73FF!important}i.inverted.bordered.purple.icon,i.inverted.circular.purple.icon{background-color:#A333C8!important;color:#FFF!important}i.pink.icon{color:#E03997!important}i.inverted.pink.icon{color:#FF8EDF!important}i.inverted.bordered.pink.icon,i.inverted.circular.pink.icon{background-color:#E03997!important;color:#FFF!important}i.brown.icon{color:#A5673F!important}i.inverted.brown.icon{color:#D67C1C!important}i.inverted.bordered.brown.icon,i.inverted.circular.brown.icon{background-color:#A5673F!important;color:#FFF!important}i.grey.icon{color:#767676!important}i.inverted.grey.icon{color:#DCDDDE!important}i.inverted.bordered.grey.icon,i.inverted.circular.grey.icon{background-color:#767676!important;color:#FFF!important}i.black.icon{color:#1B1C1D!important}i.inverted.black.icon{color:#545454!important}i.inverted.bordered.black.icon,i.inverted.circular.black.icon{background-color:#1B1C1D!important;color:#FFF!important}i.mini.icon,i.mini.icons{line-height:1;font-size:.4em}i.tiny.icon,i.tiny.icons{line-height:1;font-size:.5em}i.small.icon,i.small.icons{line-height:1;font-size:.75em}i.icon,i.icons{font-size:1em}i.large.icon,i.large.icons{line-height:1;vertical-align:middle;font-size:1.5em}i.big.icon,i.big.icons{line-height:1;vertical-align:middle;font-size:2em}i.huge.icon,i.huge.icons{line-height:1;vertical-align:middle;font-size:4em}i.massive.icon,i.massive.icons{line-height:1;vertical-align:middle;font-size:8em}i.icons{display:inline-block;position:relative;line-height:1}i.icons .icon{position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);margin:0}i.icons .icon:first-child{position:static;width:auto;height:auto;vertical-align:top;-webkit-transform:none;transform:none;margin-right:.25rem}i.icons .corner.icon{top:auto;left:auto;right:0;bottom:0;-webkit-transform:none;transform:none;font-size:.45em;text-shadow:-1px -1px 0 #FFF,1px -1px 0 #FFF,-1px 1px 0 #FFF,1px 1px 0 #FFF}i.icons .inverted.corner.icon{text-shadow:-1px -1px 0 #1B1C1D,1px -1px 0 #1B1C1D,-1px 1px 0 #1B1C1D,1px 1px 0 #1B1C1D}i.icon.search:before{content:"\f002"}i.icon.mail.outline:before{content:"\f003"}i.icon.signal:before{content:"\f012"}i.icon.setting:before{content:"\f013"}i.icon.home:before{content:"\f015"}i.icon.inbox:before{content:"\f01c"}i.icon.browser:before{content:"\f022"}i.icon.tag:before{content:"\f02b"}i.icon.tags:before{content:"\f02c"}i.icon.image:before{content:"\f03e"}i.icon.calendar:before{content:"\f073"}i.icon.comment:before{content:"\f075"}i.icon.shop:before{content:"\f07a"}i.icon.privacy:before{content:"\f084"}i.icon.settings:before{content:"\f085"}i.icon.comments:before{content:"\f086"}i.icon.external:before{content:"\f08e"}i.icon.trophy:before{content:"\f091"}i.icon.payment:before{content:"\f09d"}i.icon.feed:before{content:"\f09e"}i.icon.alarm.outline:before{content:"\f0a2"}i.icon.tasks:before{content:"\f0ae"}i.icon.cloud:before{content:"\f0c2"}i.icon.lab:before{content:"\f0c3"}i.icon.mail:before{content:"\f0e0"}i.icon.dashboard:before{content:"\f0e4"}i.icon.comment.outline:before{content:"\f0e5"}i.icon.comments.outline:before{content:"\f0e6"}i.icon.sitemap:before{content:"\f0e8"}i.icon.idea:before{content:"\f0eb"}i.icon.alarm:before{content:"\f0f3"}i.icon.terminal:before{content:"\f120"}i.icon.code:before{content:"\f121"}i.icon.protect:before{content:"\f132"}i.icon.calendar.outline:before{content:"\f133"}i.icon.ticket:before{content:"\f145"}i.icon.external.square:before{content:"\f14c"}i.icon.bug:before{content:"\f188"}i.icon.mail.square:before{content:"\f199"}i.icon.history:before{content:"\f1da"}i.icon.options:before{content:"\f1de"}i.icon.text.telephone:before{content:"\f1e4"}i.icon.find:before{content:"\f1e5"}i.icon.wifi:before{content:"\f1eb"}i.icon.alarm.mute:before{content:"\f1f6"}i.icon.alarm.mute.outline:before{content:"\f1f7"}i.icon.copyright:before{content:"\f1f9"}i.icon.at:before{content:"\f1fa"}i.icon.eyedropper:before{content:"\f1fb"}i.icon.paint.brush:before{content:"\f1fc"}i.icon.heartbeat:before{content:"\f21e"}i.icon.mouse.pointer:before{content:"\f245"}i.icon.hourglass.empty:before{content:"\f250"}i.icon.hourglass.start:before{content:"\f251"}i.icon.hourglass.half:before{content:"\f252"}i.icon.hourglass.end:before{content:"\f253"}i.icon.hourglass.full:before{content:"\f254"}i.icon.hand.pointer:before{content:"\f25a"}i.icon.trademark:before{content:"\f25c"}i.icon.registered:before{content:"\f25d"}i.icon.creative.commons:before{content:"\f25e"}i.icon.add.to.calendar:before{content:"\f271"}i.icon.remove.from.calendar:before{content:"\f272"}i.icon.delete.calendar:before{content:"\f273"}i.icon.checked.calendar:before{content:"\f274"}i.icon.industry:before{content:"\f275"}i.icon.shopping.bag:before{content:"\f290"}i.icon.shopping.basket:before{content:"\f291"}i.icon.hashtag:before{content:"\f292"}i.icon.percent:before{content:"\f295"}i.icon.wait:before{content:"\f017"}i.icon.download:before{content:"\f019"}i.icon.repeat:before{content:"\f01e"}i.icon.refresh:before{content:"\f021"}i.icon.lock:before{content:"\f023"}i.icon.bookmark:before{content:"\f02e"}i.icon.print:before{content:"\f02f"}i.icon.write:before{content:"\f040"}i.icon.adjust:before{content:"\f042"}i.icon.theme:before{content:"\f043"}i.icon.edit:before{content:"\f044"}i.icon.external.share:before{content:"\f045"}i.icon.ban:before{content:"\f05e"}i.icon.mail.forward:before,i.icon.share:before{content:"\f064"}i.icon.expand:before{content:"\f065"}i.icon.compress:before{content:"\f066"}i.icon.unhide:before{content:"\f06e"}i.icon.hide:before{content:"\f070"}i.icon.random:before{content:"\f074"}i.icon.retweet:before{content:"\f079"}i.icon.sign.out:before{content:"\f08b"}i.icon.pin:before{content:"\f08d"}i.icon.sign.in:before{content:"\f090"}i.icon.upload:before{content:"\f093"}i.icon.call:before{content:"\f095"}i.icon.remove.bookmark:before{content:"\f097"}i.icon.call.square:before{content:"\f098"}i.icon.unlock:before{content:"\f09c"}i.icon.configure:before{content:"\f0ad"}i.icon.filter:before{content:"\f0b0"}i.icon.wizard:before{content:"\f0d0"}i.icon.undo:before{content:"\f0e2"}i.icon.exchange:before{content:"\f0ec"}i.icon.cloud.download:before{content:"\f0ed"}i.icon.cloud.upload:before{content:"\f0ee"}i.icon.reply:before{content:"\f112"}i.icon.reply.all:before{content:"\f122"}i.icon.erase:before{content:"\f12d"}i.icon.unlock.alternate:before{content:"\f13e"}i.icon.write.square:before{content:"\f14b"}i.icon.share.square:before{content:"\f14d"}i.icon.archive:before{content:"\f187"}i.icon.translate:before{content:"\f1ab"}i.icon.recycle:before{content:"\f1b8"}i.icon.send:before{content:"\f1d8"}i.icon.send.outline:before{content:"\f1d9"}i.icon.share.alternate:before{content:"\f1e0"}i.icon.share.alternate.square:before{content:"\f1e1"}i.icon.add.to.cart:before{content:"\f217"}i.icon.in.cart:before{content:"\f218"}i.icon.add.user:before{content:"\f234"}i.icon.remove.user:before{content:"\f235"}i.icon.object.group:before{content:"\f247"}i.icon.object.ungroup:before{content:"\f248"}i.icon.clone:before{content:"\f24d"}i.icon.talk.outline:before{content:"\f27b"}i.icon.help.circle:before{content:"\f059"}i.icon.info.circle:before{content:"\f05a"}i.icon.warning.circle:before{content:"\f06a"}i.icon.warning.sign:before{content:"\f071"}i.icon.announcement:before{content:"\f0a1"}i.icon.help:before{content:"\f128"}i.icon.info:before{content:"\f129"}i.icon.warning:before{content:"\f12a"}i.icon.birthday:before{content:"\f1fd"}i.icon.help.circle.outline:before{content:"\f29c"}i.icon.user:before{content:"\f007"}i.icon.users:before{content:"\f0c0"}i.icon.doctor:before{content:"\f0f0"}i.icon.handicap:before{content:"\f193"}i.icon.student:before{content:"\f19d"}i.icon.child:before{content:"\f1ae"}i.icon.spy:before{content:"\f21b"}i.icon.female:before{content:"\f182"}i.icon.male:before{content:"\f183"}i.icon.woman:before{content:"\f221"}i.icon.man:before{content:"\f222"}i.icon.non.binary.transgender:before{content:"\f223"}i.icon.intergender:before{content:"\f224"}i.icon.transgender:before{content:"\f225"}i.icon.lesbian:before{content:"\f226"}i.icon.gay:before{content:"\f227"}i.icon.heterosexual:before{content:"\f228"}i.icon.other.gender:before{content:"\f229"}i.icon.other.gender.vertical:before{content:"\f22a"}i.icon.other.gender.horizontal:before{content:"\f22b"}i.icon.neuter:before{content:"\f22c"}i.icon.genderless:before{content:"\f22d"}i.icon.universal.access:before{content:"\f29a"}i.icon.wheelchair:before{content:"\f29b"}i.icon.blind:before{content:"\f29d"}i.icon.audio.description:before{content:"\f29e"}i.icon.volume.control.phone:before{content:"\f2a0"}i.icon.braille:before{content:"\f2a1"}i.icon.asl:before{content:"\f2a3"}i.icon.assistive.listening.systems:before{content:"\f2a2"}i.icon.deafness:before{content:"\f2a4"}i.icon.sign.language:before{content:"\f2a7"}i.icon.low.vision:before{content:"\f2a8"}i.icon.block.layout:before{content:"\f009"}i.icon.grid.layout:before{content:"\f00a"}i.icon.list.layout:before{content:"\f00b"}i.icon.zoom:before{content:"\f00e"}i.icon.zoom.out:before{content:"\f010"}i.icon.resize.vertical:before{content:"\f07d"}i.icon.resize.horizontal:before{content:"\f07e"}i.icon.maximize:before{content:"\f0b2"}i.icon.crop:before{content:"\f125"}i.icon.cocktail:before{content:"\f000"}i.icon.road:before{content:"\f018"}i.icon.flag:before{content:"\f024"}i.icon.book:before{content:"\f02d"}i.icon.gift:before{content:"\f06b"}i.icon.leaf:before{content:"\f06c"}i.icon.fire:before{content:"\f06d"}i.icon.plane:before{content:"\f072"}i.icon.magnet:before{content:"\f076"}i.icon.lemon:before{content:"\f094"}i.icon.world:before{content:"\f0ac"}i.icon.travel:before{content:"\f0b1"}i.icon.shipping:before{content:"\f0d1"}i.icon.money:before{content:"\f0d6"}i.icon.legal:before{content:"\f0e3"}i.icon.lightning:before{content:"\f0e7"}i.icon.umbrella:before{content:"\f0e9"}i.icon.treatment:before{content:"\f0f1"}i.icon.suitcase:before{content:"\f0f2"}i.icon.bar:before{content:"\f0fc"}i.icon.flag.outline:before{content:"\f11d"}i.icon.flag.checkered:before{content:"\f11e"}i.icon.puzzle:before{content:"\f12e"}i.icon.fire.extinguisher:before{content:"\f134"}i.icon.rocket:before{content:"\f135"}i.icon.anchor:before{content:"\f13d"}i.icon.bullseye:before{content:"\f140"}i.icon.sun:before{content:"\f185"}i.icon.moon:before{content:"\f186"}i.icon.fax:before{content:"\f1ac"}i.icon.life.ring:before{content:"\f1cd"}i.icon.bomb:before{content:"\f1e2"}i.icon.soccer:before{content:"\f1e3"}i.icon.calculator:before{content:"\f1ec"}i.icon.diamond:before{content:"\f219"}i.icon.sticky.note:before{content:"\f249"}i.icon.sticky.note.outline:before{content:"\f24a"}i.icon.law:before{content:"\f24e"}i.icon.hand.peace:before{content:"\f25b"}i.icon.hand.rock:before{content:"\f255"}i.icon.hand.paper:before{content:"\f256"}i.icon.hand.scissors:before{content:"\f257"}i.icon.hand.lizard:before{content:"\f258"}i.icon.hand.spock:before{content:"\f259"}i.icon.tv:before{content:"\f26c"}i.icon.crosshairs:before{content:"\f05b"}i.icon.asterisk:before{content:"\f069"}i.icon.square.outline:before{content:"\f096"}i.icon.certificate:before{content:"\f0a3"}i.icon.square:before{content:"\f0c8"}i.icon.quote.left:before{content:"\f10d"}i.icon.quote.right:before{content:"\f10e"}i.icon.spinner:before{content:"\f110"}i.icon.circle:before{content:"\f111"}i.icon.ellipsis.horizontal:before{content:"\f141"}i.icon.ellipsis.vertical:before{content:"\f142"}i.icon.cube:before{content:"\f1b2"}i.icon.cubes:before{content:"\f1b3"}i.icon.circle.notched:before{content:"\f1ce"}i.icon.circle.thin:before{content:"\f1db"}i.icon.checkmark:before{content:"\f00c"}i.icon.remove:before{content:"\f00d"}i.icon.checkmark.box:before{content:"\f046"}i.icon.move:before{content:"\f047"}i.icon.add.circle:before{content:"\f055"}i.icon.minus.circle:before{content:"\f056"}i.icon.remove.circle:before{content:"\f057"}i.icon.check.circle:before{content:"\f058"}i.icon.remove.circle.outline:before{content:"\f05c"}i.icon.check.circle.outline:before{content:"\f05d"}i.icon.plus:before{content:"\f067"}i.icon.minus:before{content:"\f068"}i.icon.add.square:before{content:"\f0fe"}i.icon.radio:before{content:"\f10c"}i.icon.minus.square:before{content:"\f146"}i.icon.minus.square.outline:before{content:"\f147"}i.icon.check.square:before{content:"\f14a"}i.icon.selected.radio:before{content:"\f192"}i.icon.plus.square.outline:before{content:"\f196"}i.icon.toggle.off:before{content:"\f204"}i.icon.toggle.on:before{content:"\f205"}i.icon.film:before{content:"\f008"}i.icon.sound:before{content:"\f025"}i.icon.photo:before{content:"\f030"}i.icon.bar.chart:before{content:"\f080"}i.icon.camera.retro:before{content:"\f083"}i.icon.newspaper:before{content:"\f1ea"}i.icon.area.chart:before{content:"\f1fe"}i.icon.pie.chart:before{content:"\f200"}i.icon.line.chart:before{content:"\f201"}i.icon.arrow.circle.outline.down:before{content:"\f01a"}i.icon.arrow.circle.outline.up:before{content:"\f01b"}i.icon.chevron.left:before{content:"\f053"}i.icon.chevron.right:before{content:"\f054"}i.icon.arrow.left:before{content:"\f060"}i.icon.arrow.right:before{content:"\f061"}i.icon.arrow.up:before{content:"\f062"}i.icon.arrow.down:before{content:"\f063"}i.icon.chevron.up:before{content:"\f077"}i.icon.chevron.down:before{content:"\f078"}i.icon.pointing.right:before{content:"\f0a4"}i.icon.pointing.left:before{content:"\f0a5"}i.icon.pointing.up:before{content:"\f0a6"}i.icon.pointing.down:before{content:"\f0a7"}i.icon.arrow.circle.left:before{content:"\f0a8"}i.icon.arrow.circle.right:before{content:"\f0a9"}i.icon.arrow.circle.up:before{content:"\f0aa"}i.icon.arrow.circle.down:before{content:"\f0ab"}i.icon.caret.down:before{content:"\f0d7"}i.icon.caret.up:before{content:"\f0d8"}i.icon.caret.left:before{content:"\f0d9"}i.icon.caret.right:before{content:"\f0da"}i.icon.angle.double.left:before{content:"\f100"}i.icon.angle.double.right:before{content:"\f101"}i.icon.angle.double.up:before{content:"\f102"}i.icon.angle.double.down:before{content:"\f103"}i.icon.angle.left:before{content:"\f104"}i.icon.angle.right:before{content:"\f105"}i.icon.angle.up:before{content:"\f106"}i.icon.angle.down:before{content:"\f107"}i.icon.chevron.circle.left:before{content:"\f137"}i.icon.chevron.circle.right:before{content:"\f138"}i.icon.chevron.circle.up:before{content:"\f139"}i.icon.chevron.circle.down:before{content:"\f13a"}i.icon.toggle.down:before{content:"\f150"}i.icon.toggle.up:before{content:"\f151"}i.icon.toggle.right:before{content:"\f152"}i.icon.long.arrow.down:before{content:"\f175"}i.icon.long.arrow.up:before{content:"\f176"}i.icon.long.arrow.left:before{content:"\f177"}i.icon.long.arrow.right:before{content:"\f178"}i.icon.arrow.circle.outline.right:before{content:"\f18e"}i.icon.arrow.circle.outline.left:before{content:"\f190"}i.icon.toggle.left:before{content:"\f191"}i.icon.tablet:before{content:"\f10a"}i.icon.mobile:before{content:"\f10b"}i.icon.battery.full:before{content:"\f240"}i.icon.battery.high:before{content:"\f241"}i.icon.battery.medium:before{content:"\f242"}i.icon.battery.low:before{content:"\f243"}i.icon.battery.empty:before{content:"\f244"}i.icon.power:before{content:"\f011"}i.icon.trash.outline:before{content:"\f014"}i.icon.disk.outline:before{content:"\f0a0"}i.icon.desktop:before{content:"\f108"}i.icon.laptop:before{content:"\f109"}i.icon.game:before{content:"\f11b"}i.icon.keyboard:before{content:"\f11c"}i.icon.plug:before{content:"\f1e6"}i.icon.trash:before{content:"\f1f8"}i.icon.file.outline:before{content:"\f016"}i.icon.folder:before{content:"\f07b"}i.icon.folder.open:before{content:"\f07c"}i.icon.file.text.outline:before{content:"\f0f6"}i.icon.folder.outline:before{content:"\f114"}i.icon.folder.open.outline:before{content:"\f115"}i.icon.level.up:before{content:"\f148"}i.icon.level.down:before{content:"\f149"}i.icon.file:before{content:"\f15b"}i.icon.file.text:before{content:"\f15c"}i.icon.file.pdf.outline:before{content:"\f1c1"}i.icon.file.word.outline:before{content:"\f1c2"}i.icon.file.excel.outline:before{content:"\f1c3"}i.icon.file.powerpoint.outline:before{content:"\f1c4"}i.icon.file.image.outline:before{content:"\f1c5"}i.icon.file.archive.outline:before{content:"\f1c6"}i.icon.file.audio.outline:before{content:"\f1c7"}i.icon.file.video.outline:before{content:"\f1c8"}i.icon.file.code.outline:before{content:"\f1c9"}i.icon.qrcode:before{content:"\f029"}i.icon.barcode:before{content:"\f02a"}i.icon.rss:before{content:"\f09e"}i.icon.fork:before{content:"\f126"}i.icon.html5:before{content:"\f13b"}i.icon.css3:before{content:"\f13c"}i.icon.rss.square:before{content:"\f143"}i.icon.openid:before{content:"\f19b"}i.icon.database:before{content:"\f1c0"}i.icon.server:before{content:"\f233"}i.icon.usb:before{content:"\f287"}i.icon.bluetooth:before{content:"\f293"}i.icon.bluetooth.alternative:before{content:"\f294"}i.icon.heart:before{content:"\f004"}i.icon.star:before{content:"\f005"}i.icon.empty.star:before{content:"\f006"}i.icon.thumbs.outline.up:before{content:"\f087"}i.icon.thumbs.outline.down:before{content:"\f088"}i.icon.star.half:before{content:"\f089"}i.icon.empty.heart:before{content:"\f08a"}i.icon.smile:before{content:"\f118"}i.icon.frown:before{content:"\f119"}i.icon.meh:before{content:"\f11a"}i.icon.star.half.empty:before{content:"\f123"}i.icon.thumbs.up:before{content:"\f164"}i.icon.thumbs.down:before{content:"\f165"}i.icon.music:before{content:"\f001"}i.icon.video.play.outline:before{content:"\f01d"}i.icon.volume.off:before{content:"\f026"}i.icon.volume.down:before{content:"\f027"}i.icon.volume.up:before{content:"\f028"}i.icon.record:before{content:"\f03d"}i.icon.step.backward:before{content:"\f048"}i.icon.fast.backward:before{content:"\f049"}i.icon.backward:before{content:"\f04a"}i.icon.play:before{content:"\f04b"}i.icon.pause:before{content:"\f04c"}i.icon.stop:before{content:"\f04d"}i.icon.forward:before{content:"\f04e"}i.icon.fast.forward:before{content:"\f050"}i.icon.step.forward:before{content:"\f051"}i.icon.eject:before{content:"\f052"}i.icon.unmute:before{content:"\f130"}i.icon.mute:before{content:"\f131"}i.icon.video.play:before{content:"\f144"}i.icon.closed.captioning:before{content:"\f20a"}i.icon.pause.circle:before{content:"\f28b"}i.icon.pause.circle.outline:before{content:"\f28c"}i.icon.stop.circle:before{content:"\f28d"}i.icon.stop.circle.outline:before{content:"\f28e"}i.icon.marker:before{content:"\f041"}i.icon.coffee:before{content:"\f0f4"}i.icon.food:before{content:"\f0f5"}i.icon.building.outline:before{content:"\f0f7"}i.icon.hospital:before{content:"\f0f8"}i.icon.emergency:before{content:"\f0f9"}i.icon.first.aid:before{content:"\f0fa"}i.icon.military:before{content:"\f0fb"}i.icon.h:before{content:"\f0fd"}i.icon.location.arrow:before{content:"\f124"}i.icon.compass:before{content:"\f14e"}i.icon.space.shuttle:before{content:"\f197"}i.icon.university:before{content:"\f19c"}i.icon.building:before{content:"\f1ad"}i.icon.paw:before{content:"\f1b0"}i.icon.spoon:before{content:"\f1b1"}i.icon.car:before{content:"\f1b9"}i.icon.taxi:before{content:"\f1ba"}i.icon.tree:before{content:"\f1bb"}i.icon.bicycle:before{content:"\f206"}i.icon.bus:before{content:"\f207"}i.icon.ship:before{content:"\f21a"}i.icon.motorcycle:before{content:"\f21c"}i.icon.street.view:before{content:"\f21d"}i.icon.hotel:before{content:"\f236"}i.icon.train:before{content:"\f238"}i.icon.subway:before{content:"\f239"}i.icon.map.pin:before{content:"\f276"}i.icon.map.signs:before{content:"\f277"}i.icon.map.outline:before{content:"\f278"}i.icon.map:before{content:"\f279"}i.icon.table:before{content:"\f0ce"}i.icon.columns:before{content:"\f0db"}i.icon.sort:before{content:"\f0dc"}i.icon.sort.descending:before{content:"\f0dd"}i.icon.sort.ascending:before{content:"\f0de"}i.icon.sort.alphabet.ascending:before{content:"\f15d"}i.icon.sort.alphabet.descending:before{content:"\f15e"}i.icon.sort.content.ascending:before{content:"\f160"}i.icon.sort.content.descending:before{content:"\f161"}i.icon.sort.numeric.ascending:before{content:"\f162"}i.icon.sort.numeric.descending:before{content:"\f163"}i.icon.font:before{content:"\f031"}i.icon.bold:before{content:"\f032"}i.icon.italic:before{content:"\f033"}i.icon.text.height:before{content:"\f034"}i.icon.text.width:before{content:"\f035"}i.icon.align.left:before{content:"\f036"}i.icon.align.center:before{content:"\f037"}i.icon.align.right:before{content:"\f038"}i.icon.align.justify:before{content:"\f039"}i.icon.list:before{content:"\f03a"}i.icon.outdent:before{content:"\f03b"}i.icon.indent:before{content:"\f03c"}i.icon.cut:before{content:"\f0c4"}i.icon.copy:before{content:"\f0c5"}i.icon.attach:before{content:"\f0c6"}i.icon.save:before{content:"\f0c7"}i.icon.content:before{content:"\f0c9"}i.icon.unordered.list:before{content:"\f0ca"}i.icon.ordered.list:before{content:"\f0cb"}i.icon.strikethrough:before{content:"\f0cc"}i.icon.underline:before{content:"\f0cd"}i.icon.paste:before{content:"\f0ea"}i.icon.unlinkify:before{content:"\f127"}i.icon.superscript:before{content:"\f12b"}i.icon.subscript:before{content:"\f12c"}i.icon.header:before{content:"\f1dc"}i.icon.paragraph:before{content:"\f1dd"}i.icon.text.cursor:before{content:"\f246"}i.icon.euro:before{content:"\f153"}i.icon.pound:before{content:"\f154"}i.icon.dollar:before{content:"\f155"}i.icon.rupee:before{content:"\f156"}i.icon.yen:before{content:"\f157"}i.icon.ruble:before{content:"\f158"}i.icon.won:before{content:"\f159"}i.icon.bitcoin:before{content:"\f15a"}i.icon.lira:before{content:"\f195"}i.icon.shekel:before{content:"\f20b"}i.icon.paypal:before{content:"\f1ed"}i.icon.google.wallet:before{content:"\f1ee"}i.icon.visa:before{content:"\f1f0"}i.icon.mastercard:before{content:"\f1f1"}i.icon.discover:before{content:"\f1f2"}i.icon.american.express:before{content:"\f1f3"}i.icon.paypal.card:before{content:"\f1f4"}i.icon.stripe:before{content:"\f1f5"}i.icon.japan.credit.bureau:before{content:"\f24b"}i.icon.diners.club:before{content:"\f24c"}i.icon.credit.card.alternative:before{content:"\f283"}i.icon.twitter.square:before{content:"\f081"}i.icon.facebook.square:before{content:"\f082"}i.icon.linkedin.square:before{content:"\f08c"}i.icon.github.square:before{content:"\f092"}i.icon.twitter:before{content:"\f099"}i.icon.facebook.f:before{content:"\f09a"}i.icon.github:before{content:"\f09b"}i.icon.pinterest.square:before{content:"\f0d3"}i.icon.google.plus.square:before{content:"\f0d4"}i.icon.google.plus:before{content:"\f0d5"}i.icon.linkedin:before{content:"\f0e1"}i.icon.github.alternate:before{content:"\f113"}i.icon.maxcdn:before{content:"\f136"}i.icon.youtube.square:before{content:"\f166"}i.icon.youtube:before{content:"\f167"}i.icon.xing:before{content:"\f168"}i.icon.xing.square:before{content:"\f169"}i.icon.youtube.play:before{content:"\f16a"}i.icon.dropbox:before{content:"\f16b"}i.icon.stack.overflow:before{content:"\f16c"}i.icon.instagram:before{content:"\f16d"}i.icon.flickr:before{content:"\f16e"}i.icon.adn:before{content:"\f170"}i.icon.bitbucket:before{content:"\f171"}i.icon.bitbucket.square:before{content:"\f172"}i.icon.tumblr:before{content:"\f173"}i.icon.tumblr.square:before{content:"\f174"}i.icon.apple:before{content:"\f179"}i.icon.windows:before{content:"\f17a"}i.icon.android:before{content:"\f17b"}i.icon.linux:before{content:"\f17c"}i.icon.dribble:before{content:"\f17d"}i.icon.skype:before{content:"\f17e"}i.icon.foursquare:before{content:"\f180"}i.icon.trello:before{content:"\f181"}i.icon.gittip:before{content:"\f184"}i.icon.vk:before{content:"\f189"}i.icon.weibo:before{content:"\f18a"}i.icon.renren:before{content:"\f18b"}i.icon.pagelines:before{content:"\f18c"}i.icon.stack.exchange:before{content:"\f18d"}i.icon.vimeo.square:before{content:"\f194"}i.icon.slack:before{content:"\f198"}i.icon.wordpress:before{content:"\f19a"}i.icon.yahoo:before{content:"\f19e"}i.icon.google:before{content:"\f1a0"}i.icon.reddit:before{content:"\f1a1"}i.icon.reddit.square:before{content:"\f1a2"}i.icon.stumbleupon.circle:before{content:"\f1a3"}i.icon.stumbleupon:before{content:"\f1a4"}i.icon.delicious:before{content:"\f1a5"}i.icon.digg:before{content:"\f1a6"}i.icon.pied.piper:before{content:"\f1a7"}i.icon.pied.piper.alternate:before{content:"\f1a8"}i.icon.drupal:before{content:"\f1a9"}i.icon.joomla:before{content:"\f1aa"}i.icon.behance:before{content:"\f1b4"}i.icon.behance.square:before{content:"\f1b5"}i.icon.steam:before{content:"\f1b6"}i.icon.steam.square:before{content:"\f1b7"}i.icon.spotify:before{content:"\f1bc"}i.icon.deviantart:before{content:"\f1bd"}i.icon.soundcloud:before{content:"\f1be"}i.icon.vine:before{content:"\f1ca"}i.icon.codepen:before{content:"\f1cb"}i.icon.jsfiddle:before{content:"\f1cc"}i.icon.rebel:before{content:"\f1d0"}i.icon.empire:before{content:"\f1d1"}i.icon.git.square:before{content:"\f1d2"}i.icon.git:before{content:"\f1d3"}i.icon.hacker.news:before{content:"\f1d4"}i.icon.tencent.weibo:before{content:"\f1d5"}i.icon.qq:before{content:"\f1d6"}i.icon.wechat:before{content:"\f1d7"}i.icon.slideshare:before{content:"\f1e7"}i.icon.twitch:before{content:"\f1e8"}i.icon.yelp:before{content:"\f1e9"}i.icon.lastfm:before{content:"\f202"}i.icon.lastfm.square:before{content:"\f203"}i.icon.ioxhost:before{content:"\f208"}i.icon.angellist:before{content:"\f209"}i.icon.meanpath:before{content:"\f20c"}i.icon.buysellads:before{content:"\f20d"}i.icon.connectdevelop:before{content:"\f20e"}i.icon.dashcube:before{content:"\f210"}i.icon.forumbee:before{content:"\f211"}i.icon.leanpub:before{content:"\f212"}i.icon.sellsy:before{content:"\f213"}i.icon.shirtsinbulk:before{content:"\f214"}i.icon.simplybuilt:before{content:"\f215"}i.icon.skyatlas:before{content:"\f216"}i.icon.facebook:before{content:"\f230"}i.icon.pinterest:before{content:"\f231"}i.icon.whatsapp:before{content:"\f232"}i.icon.viacoin:before{content:"\f237"}i.icon.medium:before{content:"\f23a"}i.icon.y.combinator:before{content:"\f23b"}i.icon.optinmonster:before{content:"\f23c"}i.icon.opencart:before{content:"\f23d"}i.icon.expeditedssl:before{content:"\f23e"}i.icon.gg:before{content:"\f260"}i.icon.gg.circle:before{content:"\f261"}i.icon.tripadvisor:before{content:"\f262"}i.icon.odnoklassniki:before{content:"\f263"}i.icon.odnoklassniki.square:before{content:"\f264"}i.icon.pocket:before{content:"\f265"}i.icon.wikipedia:before{content:"\f266"}i.icon.safari:before{content:"\f267"}i.icon.chrome:before{content:"\f268"}i.icon.firefox:before{content:"\f269"}i.icon.opera:before{content:"\f26a"}i.icon.internet.explorer:before{content:"\f26b"}i.icon.contao:before{content:"\f26d"}i.icon.\35 00px:before{content:"\f26e"}i.icon.amazon:before{content:"\f270"}i.icon.houzz:before{content:"\f27c"}i.icon.vimeo:before{content:"\f27d"}i.icon.black.tie:before{content:"\f27e"}i.icon.fonticons:before{content:"\f280"}i.icon.reddit.alien:before{content:"\f281"}i.icon.microsoft.edge:before{content:"\f282"}i.icon.codiepie:before{content:"\f284"}i.icon.modx:before{content:"\f285"}i.icon.fort.awesome:before{content:"\f286"}i.icon.product.hunt:before{content:"\f288"}i.icon.mixcloud:before{content:"\f289"}i.icon.scribd:before{content:"\f28a"}i.icon.gitlab:before{content:"\f296"}i.icon.wpbeginner:before{content:"\f297"}i.icon.wpforms:before{content:"\f298"}i.icon.envira.gallery:before{content:"\f299"}i.icon.glide:before{content:"\f2a5"}i.icon.glide.g:before{content:"\f2a6"}i.icon.viadeo:before{content:"\f2a9"}i.icon.viadeo.square:before{content:"\f2aa"}i.icon.snapchat:before{content:"\f2ab"}i.icon.snapchat.ghost:before{content:"\f2ac"}i.icon.snapchat.square:before{content:"\f2ad"}i.icon.pied.piper.hat:before{content:"\f2ae"}i.icon.first.order:before{content:"\f2b0"}i.icon.yoast:before{content:"\f2b1"}i.icon.themeisle:before{content:"\f2b2"}i.icon.google.plus.circle:before{content:"\f2b3"}i.icon.font.awesome:before{content:"\f2b4"}i.icon.like:before{content:"\f004"}i.icon.favorite:before{content:"\f005"}i.icon.video:before{content:"\f008"}i.icon.check:before{content:"\f00c"}i.icon.cancel:before,i.icon.close:before,i.icon.delete:before,i.icon.x:before{content:"\f00d"}i.icon.magnify:before,i.icon.zoom.in:before{content:"\f00e"}i.icon.shutdown:before{content:"\f011"}i.icon.clock:before,i.icon.time:before{content:"\f017"}i.icon.play.circle.outline:before{content:"\f01d"}i.icon.headphone:before{content:"\f025"}i.icon.camera:before{content:"\f030"}i.icon.video.camera:before{content:"\f03d"}i.icon.picture:before{content:"\f03e"}i.icon.compose:before,i.icon.pencil:before{content:"\f040"}i.icon.point:before{content:"\f041"}i.icon.tint:before{content:"\f043"}i.icon.signup:before{content:"\f044"}i.icon.plus.circle:before{content:"\f055"}i.icon.question.circle:before{content:"\f059"}i.icon.dont:before{content:"\f05e"}i.icon.minimize:before{content:"\f066"}i.icon.add:before{content:"\f067"}i.icon.attention:before,i.icon.exclamation.circle:before{content:"\f06a"}i.icon.eye:before{content:"\f06e"}i.icon.exclamation.triangle:before{content:"\f071"}i.icon.shuffle:before{content:"\f074"}i.icon.chat:before,i.icon.talk:before{content:"\f075"}i.icon.cart:before,i.icon.shopping.cart:before{content:"\f07a"}i.icon.bar.graph:before{content:"\f080"}i.icon.key:before{content:"\f084"}i.icon.cogs:before{content:"\f085"}i.icon.discussions:before{content:"\f086"}i.icon.like.outline:before{content:"\f087"}i.icon.dislike.outline:before{content:"\f088"}i.icon.heart.outline:before{content:"\f08a"}i.icon.log.out:before{content:"\f08b"}i.icon.thumb.tack:before{content:"\f08d"}i.icon.winner:before{content:"\f091"}i.icon.phone:before{content:"\f095"}i.icon.bookmark.outline:before{content:"\f097"}i.icon.phone.square:before{content:"\f098"}i.icon.credit.card:before{content:"\f09d"}i.icon.hdd.outline:before{content:"\f0a0"}i.icon.bullhorn:before{content:"\f0a1"}i.icon.bell.outline:before{content:"\f0a2"}i.icon.hand.outline.right:before{content:"\f0a4"}i.icon.hand.outline.left:before{content:"\f0a5"}i.icon.hand.outline.up:before{content:"\f0a6"}i.icon.hand.outline.down:before{content:"\f0a7"}i.icon.globe:before{content:"\f0ac"}i.icon.wrench:before{content:"\f0ad"}i.icon.briefcase:before{content:"\f0b1"}i.icon.group:before{content:"\f0c0"}i.icon.chain:before,i.icon.linkify:before{content:"\f0c1"}i.icon.flask:before{content:"\f0c3"}i.icon.bars:before,i.icon.sidebar:before{content:"\f0c9"}i.icon.list.ul:before{content:"\f0ca"}i.icon.list.ol:before,i.icon.numbered.list:before{content:"\f0cb"}i.icon.magic:before{content:"\f0d0"}i.icon.truck:before{content:"\f0d1"}i.icon.currency:before{content:"\f0d6"}i.icon.dropdown:before,i.icon.triangle.down:before{content:"\f0d7"}i.icon.triangle.up:before{content:"\f0d8"}i.icon.triangle.left:before{content:"\f0d9"}i.icon.triangle.right:before{content:"\f0da"}i.icon.envelope:before{content:"\f0e0"}i.icon.conversation:before{content:"\f0e6"}i.icon.rain:before{content:"\f0e9"}i.icon.clipboard:before{content:"\f0ea"}i.icon.lightbulb:before{content:"\f0eb"}i.icon.bell:before{content:"\f0f3"}i.icon.ambulance:before{content:"\f0f9"}i.icon.medkit:before{content:"\f0fa"}i.icon.fighter.jet:before{content:"\f0fb"}i.icon.beer:before{content:"\f0fc"}i.icon.plus.square:before{content:"\f0fe"}i.icon.computer:before{content:"\f108"}i.icon.gamepad:before{content:"\f11b"}i.icon.star.half.full:before{content:"\f123"}i.icon.broken.chain:before{content:"\f127"}i.icon.question:before{content:"\f128"}i.icon.exclamation:before{content:"\f12a"}i.icon.eraser:before{content:"\f12d"}i.icon.microphone:before{content:"\f130"}i.icon.microphone.slash:before{content:"\f131"}i.icon.shield:before{content:"\f132"}i.icon.target:before{content:"\f140"}i.icon.play.circle:before{content:"\f144"}i.icon.pencil.square:before{content:"\f14b"}i.icon.eur:before{content:"\f153"}i.icon.gbp:before{content:"\f154"}i.icon.usd:before{content:"\f155"}i.icon.inr:before{content:"\f156"}i.icon.cny:before,i.icon.jpy:before,i.icon.rmb:before{content:"\f157"}i.icon.rouble:before,i.icon.rub:before{content:"\f158"}i.icon.krw:before{content:"\f159"}i.icon.btc:before{content:"\f15a"}i.icon.gratipay:before{content:"\f184"}i.icon.zip:before{content:"\f187"}i.icon.dot.circle.outline:before{content:"\f192"}i.icon.try:before{content:"\f195"}i.icon.graduation:before{content:"\f19d"}i.icon.circle.outline:before{content:"\f1db"}i.icon.sliders:before{content:"\f1de"}i.icon.weixin:before{content:"\f1d7"}i.icon.teletype:before,i.icon.tty:before{content:"\f1e4"}i.icon.binoculars:before{content:"\f1e5"}i.icon.power.cord:before{content:"\f1e6"}i.icon.wi-fi:before{content:"\f1eb"}i.icon.visa.card:before{content:"\f1f0"}i.icon.mastercard.card:before{content:"\f1f1"}i.icon.discover.card:before{content:"\f1f2"}i.icon.american.express.card:before,i.icon.amex:before{content:"\f1f3"}i.icon.stripe.card:before{content:"\f1f5"}i.icon.bell.slash:before{content:"\f1f6"}i.icon.bell.slash.outline:before{content:"\f1f7"}i.icon.area.graph:before{content:"\f1fe"}i.icon.pie.graph:before{content:"\f200"}i.icon.line.graph:before{content:"\f201"}i.icon.cc:before{content:"\f20a"}i.icon.ils:before,i.icon.sheqel:before{content:"\f20b"}i.icon.plus.cart:before{content:"\f217"}i.icon.arrow.down.cart:before{content:"\f218"}i.icon.detective:before{content:"\f21b"}i.icon.venus:before{content:"\f221"}i.icon.mars:before{content:"\f222"}i.icon.mercury:before{content:"\f223"}i.icon.intersex:before{content:"\f224"}i.icon.female.homosexual:before,i.icon.venus.double:before{content:"\f226"}i.icon.male.homosexual:before,i.icon.mars.double:before{content:"\f227"}i.icon.venus.mars:before{content:"\f228"}i.icon.mars.alternate:before,i.icon.mars.stroke:before{content:"\f229"}i.icon.mars.stroke.vertical:before,i.icon.mars.vertical:before{content:"\f22a"}i.icon.mars.horizontal:before,i.icon.mars.stroke.horizontal:before{content:"\f22b"}i.icon.asexual:before{content:"\f22d"}i.icon.facebook.official:before{content:"\f230"}i.icon.user.plus:before{content:"\f234"}i.icon.user.cancel:before,i.icon.user.close:before,i.icon.user.delete:before,i.icon.user.times:before,i.icon.user.x:before{content:"\f235"}i.icon.bed:before{content:"\f236"}i.icon.yc:before,i.icon.ycombinator:before{content:"\f23b"}i.icon.battery.four:before{content:"\f240"}i.icon.battery.three.quarters:before,i.icon.battery.three:before{content:"\f241"}i.icon.battery.half:before,i.icon.battery.two:before{content:"\f242"}i.icon.battery.one:before,i.icon.battery.quarter:before{content:"\f243"}i.icon.battery.zero:before{content:"\f244"}i.icon.i.cursor:before{content:"\f246"}i.icon.japan.credit.bureau.card:before,i.icon.jcb:before{content:"\f24b"}i.icon.diners.club.card:before{content:"\f24c"}i.icon.balance:before{content:"\f24e"}i.icon.hourglass.outline:before,i.icon.hourglass.zero:before{content:"\f250"}i.icon.hourglass.one:before{content:"\f251"}i.icon.hourglass.two:before{content:"\f252"}i.icon.hourglass.three:before{content:"\f253"}i.icon.hourglass.four:before{content:"\f254"}i.icon.grab{content:"\f255"}i.icon.hand.victory:before{content:"\f25b"}i.icon.tm:before{content:"\f25c"}i.icon.r.circle:before{content:"\f25d"}i.icon.television{content:"\f26c"}i.icon.five.hundred.pixels:before{content:"\f26e"}i.icon.calendar.plus:before{content:"\f271"}i.icon.calendar.minus:before{content:"\f272"}i.icon.calendar.times:before{content:"\f273"}i.icon.calendar.check:before{content:"\f274"}i.icon.factory:before{content:"\f275"}i.icon.commenting:before{content:"\f27a"}i.icon.commenting.outline:before{content:"\f27b"}i.icon.edge:before,i.icon.ms.edge:before{content:"\f282"}i.icon.wordpress.beginner:before{content:"\f297"}i.icon.wordpress.forms:before{content:"\f298"}i.icon.envira:before{content:"\f299"}i.icon.question.circle.outline:before{content:"\f29c"}i.icon.ald:before,i.icon.als:before,i.icon.assistive.listening.devices:before{content:"\f2a2"}i.icon.asl.interpreting:before{content:"\f2a3"}i.icon.deaf:before{content:"\f2a4"}i.icon.american.sign.language.interpreting:before{content:"\f2a3"}i.icon.hard.of.hearing:before{content:"\f2a4"}i.icon.signing:before{content:"\f2a7"}i.icon.new.pied.piper:before{content:"\f2ae"}i.icon.theme.isle:before{content:"\f2b2"}i.icon.google.plus.official:before{content:"\f2b3"}i.icon.fa:before{content:"\f2b4"}.ui.image{position:relative;display:inline-block;vertical-align:middle;max-width:100%;background-color:transparent}img.ui.image{display:block}.ui.image img,.ui.image svg{display:block;max-width:100%;height:auto}.ui.hidden.image,.ui.hidden.images{display:none}.ui.hidden.transition.image,.ui.hidden.transition.images{display:block;visibility:hidden}.ui.disabled.image,.ui.disabled.images{cursor:default;opacity:.45}.ui.inline.image,.ui.inline.image img,.ui.inline.image svg{display:inline-block}.ui.top.aligned.image,.ui.top.aligned.image img,.ui.top.aligned.image svg,.ui.top.aligned.images .image{display:inline-block;vertical-align:top}.ui.middle.aligned.image,.ui.middle.aligned.image img,.ui.middle.aligned.image svg,.ui.middle.aligned.images .image{display:inline-block;vertical-align:middle}.ui.bottom.aligned.image,.ui.bottom.aligned.image img,.ui.bottom.aligned.image svg,.ui.bottom.aligned.images .image{display:inline-block;vertical-align:bottom}.ui.rounded.image,.ui.rounded.image>*,.ui.rounded.images .image,.ui.rounded.images .image>*{border-radius:.3125em}.ui.bordered.image img,.ui.bordered.image svg,.ui.bordered.images .image,.ui.bordered.images img,.ui.bordered.images svg,img.ui.bordered.image{border:1px solid rgba(0,0,0,.1)}.ui.circular.image,.ui.circular.images{overflow:hidden}.ui.circular.image,.ui.circular.image>*,.ui.circular.images .image,.ui.circular.images .image>*{border-radius:500rem}.ui.fluid.image,.ui.fluid.image img,.ui.fluid.image svg,.ui.fluid.images,.ui.fluid.images img,.ui.fluid.images svg{display:block;width:100%;height:auto}.ui.avatar.image,.ui.avatar.image img,.ui.avatar.image svg,.ui.avatar.images .image,.ui.avatar.images img,.ui.avatar.images svg{margin-right:.25em;display:inline-block;width:2em;height:2em;border-radius:500rem}.ui.spaced.image{display:inline-block!important;margin-left:.5em;margin-right:.5em}.ui[class*="left spaced"].image{margin-left:.5em;margin-right:0}.ui[class*="right spaced"].image{margin-left:0;margin-right:.5em}.ui.floated.image,.ui.floated.images{float:left;margin-right:1em;margin-bottom:1em}.ui.right.floated.image,.ui.right.floated.images{float:right;margin-right:0;margin-bottom:1em;margin-left:1em}.ui.floated.image:last-child,.ui.floated.images:last-child{margin-bottom:0}.ui.centered.image,.ui.centered.images{margin-left:auto;margin-right:auto}.ui.mini.image,.ui.mini.images .image,.ui.mini.images img,.ui.mini.images svg{width:35px;height:auto;font-size:.78571429rem}.ui.tiny.image,.ui.tiny.images .image,.ui.tiny.images img,.ui.tiny.images svg{width:80px;height:auto;font-size:.85714286rem}.ui.small.image,.ui.small.images .image,.ui.small.images img,.ui.small.images svg{width:150px;height:auto;font-size:.92857143rem}.ui.medium.image,.ui.medium.images .image,.ui.medium.images img,.ui.medium.images svg{width:300px;height:auto;font-size:1rem}.ui.large.image,.ui.large.images .image,.ui.large.images img,.ui.large.images svg{width:450px;height:auto;font-size:1.14285714rem}.ui.big.image,.ui.big.images .image,.ui.big.images img,.ui.big.images svg{width:600px;height:auto;font-size:1.28571429rem}.ui.huge.image,.ui.huge.images .image,.ui.huge.images img,.ui.huge.images svg{width:800px;height:auto;font-size:1.42857143rem}.ui.massive.image,.ui.massive.images .image,.ui.massive.images img,.ui.massive.images svg{width:960px;height:auto;font-size:1.71428571rem}.ui.images{font-size:0;margin:0 -.25rem}.ui.images .image,.ui.images img,.ui.images svg{display:inline-block;margin:0 .25rem .5rem}.ui.input{position:relative;font-weight:400;font-style:normal;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;color:rgba(0,0,0,.87)}.ui.input input{margin:0;max-width:100%;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);text-align:left;line-height:1.2142em;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;padding:.67861429em 1em;background:#FFF;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-transition:box-shadow .1s ease,border-color .1s ease;transition:box-shadow .1s ease,border-color .1s ease;box-shadow:none}.ui.input input::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.input input::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.input input:-ms-input-placeholder{color:rgba(191,191,191,.87)}.ui.disabled.input,.ui.input input[disabled]{opacity:.45}.ui.disabled.input input,.ui.input input[disabled]{pointer-events:none}.ui.input input:active,.ui.input.down input{border-color:rgba(0,0,0,.3);background:#FAFAFA;color:rgba(0,0,0,.87);box-shadow:none}.ui.loading.loading.input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.loading.input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.ui.input input:focus,.ui.input.focus input{border-color:#85B7D9;background:#FFF;color:rgba(0,0,0,.8);box-shadow:none}.ui.input input:focus::-webkit-input-placeholder,.ui.input.focus input::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.input input:focus::-moz-placeholder,.ui.input.focus input::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.input input:focus:-ms-input-placeholder,.ui.input.focus input:-ms-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.error input{background-color:#FFF6F6;border-color:#E0B4B4;color:#9F3A38;box-shadow:none}.ui.input.error input::-webkit-input-placeholder{color:#e7bdbc}.ui.input.error input::-moz-placeholder{color:#e7bdbc}.ui.input.error input:-ms-input-placeholder{color:#e7bdbc!important}.ui.input.error input:focus::-webkit-input-placeholder{color:#da9796}.ui.input.error input:focus::-moz-placeholder{color:#da9796}.ui.input.error input:focus:-ms-input-placeholder{color:#da9796!important}.ui.transparent.input input{border-color:transparent!important;background-color:transparent!important;padding:0!important;box-shadow:none!important}.ui.transparent.icon.input>i.icon{width:1.1em}.ui.transparent.icon.input>input{padding-left:0!important;padding-right:2em!important}.ui.transparent[class*="left icon"].input>input{padding-left:2em!important;padding-right:0!important}.ui.transparent.inverted.input{color:#FFF}.ui.transparent.inverted.input input{color:inherit}.ui.transparent.inverted.input input::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input input::-moz-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input input:-ms-input-placeholder{color:rgba(255,255,255,.5)}.ui.icon.input>i.icon{cursor:default;position:absolute;line-height:1;text-align:center;top:0;right:0;margin:0;height:100%;width:2.67142857em;opacity:.5;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.ui.icon.input>i.icon:not(.link){pointer-events:none}.ui.icon.input input{padding-right:2.67142857em!important}.ui.icon.input>i.icon:after,.ui.icon.input>i.icon:before{left:0;position:absolute;text-align:center;top:50%;width:100%;margin-top:-.5em}.ui.icon.input>i.link.icon{cursor:pointer}.ui.icon.input>i.circular.icon{top:.35em;right:.5em}.ui[class*="left icon"].input>i.icon{right:auto;left:1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="left icon"].input>i.circular.icon{right:auto;left:.5em}.ui[class*="left icon"].input>input{padding-left:2.67142857em!important;padding-right:1em!important}.ui.icon.input>input:focus~i.icon{opacity:1}.ui.labeled.input>.label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;font-size:1em}.ui.labeled.input>.label:not(.corner){padding-top:.78571429em;padding-bottom:.78571429em}.ui.labeled.input:not([class*="corner labeled"]) .label:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.input:not([class*="corner labeled"]) .label:first-child+input{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:transparent}.ui.labeled.input:not([class*="corner labeled"]) .label:first-child+input:focus{border-left-color:#85B7D9}.ui[class*="right labeled"].input input{border-top-right-radius:0!important;border-bottom-right-radius:0!important;border-right-color:transparent!important}.ui[class*="right labeled"].input input+.label{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*="right labeled"].input input:focus{border-right-color:#85B7D9!important}.ui.labeled.input .corner.label{top:1px;right:1px;font-size:.64285714em;border-radius:0 .28571429rem 0 0}.ui[class*="corner labeled"]:not([class*="left corner labeled"]).labeled.input input{padding-right:2.5em!important}.ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"])>input{padding-right:3.25em!important}.ui[class*="corner labeled"].icon.input:not([class*="left corner labeled"])>.icon{margin-right:1.25em}.ui[class*="left corner labeled"].labeled.input input{padding-left:2.5em!important}.ui[class*="left corner labeled"].icon.input>input{padding-left:3.25em!important}.ui[class*="left corner labeled"].icon.input>.icon{margin-left:1.25em}.ui.input>.ui.corner.label{top:1px;right:1px}.ui.input>.ui.left.corner.label{right:auto;left:1px}.ui.action.input>.button,.ui.action.input>.buttons{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ui.action.input>.button,.ui.action.input>.buttons>.button{padding-top:.78571429em;padding-bottom:.78571429em;margin:0}.ui.action.input:not([class*="left action"])>input{border-top-right-radius:0!important;border-bottom-right-radius:0!important;border-right-color:transparent!important}.ui.action.input:not([class*="left action"])>.button:not(:first-child),.ui.action.input:not([class*="left action"])>.buttons:not(:first-child)>.button,.ui.action.input:not([class*="left action"])>.dropdown:not(:first-child){border-radius:0}.ui.action.input:not([class*="left action"])>.button:last-child,.ui.action.input:not([class*="left action"])>.buttons:last-child>.button,.ui.action.input:not([class*="left action"])>.dropdown:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.action.input:not([class*="left action"]) input:focus{border-right-color:#85B7D9!important}.ui[class*="left action"].input>input{border-top-left-radius:0!important;border-bottom-left-radius:0!important;border-left-color:transparent!important}.ui[class*="left action"].input>.button,.ui[class*="left action"].input>.buttons>.button,.ui[class*="left action"].input>.dropdown{border-radius:0}.ui[class*="left action"].input>.button:first-child,.ui[class*="left action"].input>.buttons:first-child>.button,.ui[class*="left action"].input>.dropdown:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="left action"].input>input:focus{border-left-color:#85B7D9!important}.ui.inverted.input input{border:none}.ui.fluid.input{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui.fluid.input>input{width:0!important}.ui.mini.input{font-size:.78571429em}.ui.small.input{font-size:.92857143em}.ui.input{font-size:1em}.ui.large.input{font-size:1.14285714em}.ui.big.input{font-size:1.28571429em}.ui.huge.input{font-size:1.42857143em}.ui.massive.input{font-size:1.71428571em}.ui.label{display:inline-block;line-height:1;vertical-align:baseline;margin:0 .14285714em;background-color:#E8E8E8;background-image:none;padding:.5833em .833em;color:rgba(0,0,0,.6);text-transform:none;font-weight:700;border:0 solid transparent;border-radius:.28571429rem;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label:first-child{margin-left:0}.ui.label:last-child{margin-right:0}a.ui.label{cursor:pointer}.ui.label>a{cursor:pointer;color:inherit;opacity:.5;-webkit-transition:.1s opacity ease;transition:.1s opacity ease}.ui.label>a:hover{opacity:1}.ui.label>img{width:auto!important;vertical-align:middle;height:2.1666em!important}.ui.label>.icon{width:auto;margin:0 .75em 0 0}.ui.label>.detail{display:inline-block;vertical-align:top;font-weight:700;margin-left:1em;opacity:.8}.ui.label>.detail .icon{margin:0 .25em 0 0}.ui.label>.close.icon,.ui.label>.delete.icon{cursor:pointer;margin-right:0;margin-left:.5em;font-size:.92857143em;opacity:.5;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label>.delete.icon:hover{opacity:1}.ui.labels>.label{margin:0 .5em .5em 0}.ui.header>.ui.label{margin-top:-.29165em}.ui.attached.segment>.ui.top.left.attached.label,.ui.bottom.attached.segment>.ui.top.left.attached.label{border-top-left-radius:0}.ui.attached.segment>.ui.top.right.attached.label,.ui.bottom.attached.segment>.ui.top.right.attached.label{border-top-right-radius:0}.ui.top.attached.segment>.ui.bottom.left.attached.label{border-bottom-left-radius:0}.ui.top.attached.segment>.ui.bottom.right.attached.label{border-bottom-right-radius:0}.ui.top.attached.label+[class*="right floated"]+*,.ui.top.attached.label:first-child+:not(.attached){margin-top:2rem!important}.ui.bottom.attached.label:first-child~:last-child:not(.attached){margin-top:0;margin-bottom:2rem!important}.ui.image.label{width:auto!important;margin-top:0;margin-bottom:0;max-width:9999px;vertical-align:baseline;text-transform:none;background:#E8E8E8;padding:.5833em .833em .5833em .5em;border-radius:.28571429rem;box-shadow:none}.ui.image.label img{display:inline-block;vertical-align:top;height:2.1666em;margin:-.5833em .5em -.5833em -.5em;border-radius:.28571429rem 0 0 .28571429rem}.ui.image.label .detail{background:rgba(0,0,0,.1);margin:-.5833em -.833em -.5833em .5em;padding:.5833em .833em;border-radius:0 .28571429rem .28571429rem 0}.ui.tag.label,.ui.tag.labels .label{margin-left:1em;position:relative;padding-left:1.5em;padding-right:1.5em;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:none;transition:none}.ui.tag.label:before,.ui.tag.labels .label:before{position:absolute;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg);top:50%;right:100%;content:'';background-color:inherit;background-image:none;width:1.56em;height:1.56em;-webkit-transition:none;transition:none}.ui.tag.label:after,.ui.tag.labels .label:after{position:absolute;content:'';top:50%;left:-.25em;margin-top:-.25em;background-color:#FFF!important;width:.5em;height:.5em;box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);border-radius:500rem}.ui.corner.label{position:absolute;top:0;right:0;margin:0;padding:0;text-align:center;border-color:#E8E8E8;width:4em;height:4em;z-index:1;-webkit-transition:border-color .1s ease;transition:border-color .1s ease;background-color:transparent!important}.ui.corner.label:after{position:absolute;content:"";right:0;top:0;z-index:-1;width:0;height:0;background-color:transparent!important;border-top:0 solid transparent;border-right:4em solid transparent;border-bottom:4em solid transparent;border-left:0 solid transparent;border-right-color:inherit;-webkit-transition:border-color .1s ease;transition:border-color .1s ease}.ui.corner.label .icon{cursor:default;position:relative;top:.64285714em;left:.78571429em;font-size:1.14285714em;margin:0}.ui.left.corner.label,.ui.left.corner.label:after{right:auto;left:0}.ui.left.corner.label:after{border-top:4em solid transparent;border-right:4em solid transparent;border-bottom:0 solid transparent;border-left:0 solid transparent;border-top-color:inherit}.ui.left.corner.label .icon{left:-.78571429em}.ui.segment>.ui.corner.label{top:-1px;right:-1px}.ui.segment>.ui.left.corner.label{right:auto;left:-1px}.ui.ribbon.label{position:relative;margin:0;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;border-radius:0 .28571429rem .28571429rem 0;border-color:rgba(0,0,0,.15)}.ui.ribbon.label:after{position:absolute;content:'';top:100%;left:0;background-color:transparent!important;border-style:solid;border-width:0 1.2em 1.2em 0;border-color:transparent;border-right-color:inherit;width:0;height:0}.ui.ribbon.label{left:calc(-1rem - 1.2em);margin-right:-1.2em;padding-left:calc(1rem + 1.2em);padding-right:1.2em}.ui[class*="right ribbon"].label{left:calc(100% + 1rem + 1.2em);padding-left:1.2em;padding-right:calc(1rem + 1.2em);text-align:left;-webkit-transform:translateX(-100%);transform:translateX(-100%);border-radius:.28571429rem 0 0 .28571429rem}.ui[class*="right ribbon"].label:after{left:auto;right:0;border-style:solid;border-width:1.2em 1.2em 0 0;border-color:transparent;border-top-color:inherit}.ui.card .image>.ribbon.label,.ui.image>.ribbon.label{position:absolute;top:1rem}.ui.card .image>.ui.ribbon.label,.ui.image>.ui.ribbon.label{left:calc(.05rem - 1.2em)}.ui.card .image>.ui[class*="right ribbon"].label,.ui.image>.ui[class*="right ribbon"].label{left:calc(100% + -.05rem + 1.2em);padding-left:.833em}.ui.table td>.ui.ribbon.label{left:calc(-.78571429em - 1.2em)}.ui.table td>.ui[class*="right ribbon"].label{left:calc(100% + .78571429em + 1.2em);padding-left:.833em}.ui.attached.label,.ui[class*="top attached"].label{width:100%;position:absolute;margin:0;top:0;left:0;padding:.75em 1em;border-radius:.21428571rem .21428571rem 0 0}.ui[class*="bottom attached"].label{top:auto;bottom:0;border-radius:0 0 .21428571rem .21428571rem}.ui[class*="top left attached"].label{width:auto;margin-top:0!important;border-radius:.21428571rem 0 .28571429rem}.ui[class*="top right attached"].label{width:auto;left:auto;right:0;border-radius:0 .21428571rem 0 .28571429rem}.ui[class*="bottom left attached"].label{width:auto;top:auto;bottom:0;border-radius:0 .28571429rem 0 .21428571rem}.ui[class*="bottom right attached"].label{top:auto;bottom:0;left:auto;right:0;width:auto;border-radius:.28571429rem 0 .21428571rem}.ui.label.disabled{opacity:.5}a.ui.label:hover,a.ui.labels .label:hover{background-color:#E0E0E0;border-color:#E0E0E0;background-image:none;color:rgba(0,0,0,.8)}.ui.labels a.label:hover:before,a.ui.label:hover:before{color:rgba(0,0,0,.8)}.ui.active.label{background-color:#D0D0D0;border-color:#D0D0D0;background-image:none;color:rgba(0,0,0,.95)}.ui.active.label:before{background-color:#D0D0D0;background-image:none;color:rgba(0,0,0,.95)}a.ui.active.label:hover,a.ui.labels .active.label:hover{background-color:#C8C8C8;border-color:#C8C8C8;background-image:none;color:rgba(0,0,0,.95)}.ui.labels a.active.label:ActiveHover:before,a.ui.active.label:ActiveHover:before{background-color:#C8C8C8;background-image:none;color:rgba(0,0,0,.95)}.ui.label.visible,.ui.labels.visible .label{display:inline-block!important}.ui.label.hidden,.ui.labels.hidden .label{display:none!important}.ui.red.label,.ui.red.labels .label{background-color:#DB2828!important;border-color:#DB2828!important;color:#FFF!important}.ui.red.labels .label:hover,a.ui.red.label:hover{background-color:#d01919!important;border-color:#d01919!important;color:#FFF!important}.ui.red.corner.label,.ui.red.corner.label:hover{background-color:transparent!important}.ui.red.ribbon.label{border-color:#b21e1e!important}.ui.basic.red.label{background-color:#FFF!important;color:#DB2828!important;border-color:#DB2828!important}.ui.basic.red.labels a.label:hover,a.ui.basic.red.label:hover{background-color:#FFF!important;color:#d01919!important;border-color:#d01919!important}.ui.orange.label,.ui.orange.labels .label{background-color:#F2711C!important;border-color:#F2711C!important;color:#FFF!important}.ui.orange.labels .label:hover,a.ui.orange.label:hover{background-color:#f26202!important;border-color:#f26202!important;color:#FFF!important}.ui.orange.corner.label,.ui.orange.corner.label:hover{background-color:transparent!important}.ui.orange.ribbon.label{border-color:#cf590c!important}.ui.basic.orange.label{background-color:#FFF!important;color:#F2711C!important;border-color:#F2711C!important}.ui.basic.orange.labels a.label:hover,a.ui.basic.orange.label:hover{background-color:#FFF!important;color:#f26202!important;border-color:#f26202!important}.ui.yellow.label,.ui.yellow.labels .label{background-color:#FBBD08!important;border-color:#FBBD08!important;color:#FFF!important}.ui.yellow.labels .label:hover,a.ui.yellow.label:hover{background-color:#eaae00!important;border-color:#eaae00!important;color:#FFF!important}.ui.yellow.corner.label,.ui.yellow.corner.label:hover{background-color:transparent!important}.ui.yellow.ribbon.label{border-color:#cd9903!important}.ui.basic.yellow.label{background-color:#FFF!important;color:#FBBD08!important;border-color:#FBBD08!important}.ui.basic.yellow.labels a.label:hover,a.ui.basic.yellow.label:hover{background-color:#FFF!important;color:#eaae00!important;border-color:#eaae00!important}.ui.olive.label,.ui.olive.labels .label{background-color:#B5CC18!important;border-color:#B5CC18!important;color:#FFF!important}.ui.olive.labels .label:hover,a.ui.olive.label:hover{background-color:#a7bd0d!important;border-color:#a7bd0d!important;color:#FFF!important}.ui.olive.corner.label,.ui.olive.corner.label:hover{background-color:transparent!important}.ui.olive.ribbon.label{border-color:#198f35!important}.ui.basic.olive.label{background-color:#FFF!important;color:#B5CC18!important;border-color:#B5CC18!important}.ui.basic.olive.labels a.label:hover,a.ui.basic.olive.label:hover{background-color:#FFF!important;color:#a7bd0d!important;border-color:#a7bd0d!important}.ui.green.label,.ui.green.labels .label{background-color:#21BA45!important;border-color:#21BA45!important;color:#FFF!important}.ui.green.labels .label:hover,a.ui.green.label:hover{background-color:#16ab39!important;border-color:#16ab39!important;color:#FFF!important}.ui.green.corner.label,.ui.green.corner.label:hover{background-color:transparent!important}.ui.green.ribbon.label{border-color:#198f35!important}.ui.basic.green.label{background-color:#FFF!important;color:#21BA45!important;border-color:#21BA45!important}.ui.basic.green.labels a.label:hover,a.ui.basic.green.label:hover{background-color:#FFF!important;color:#16ab39!important;border-color:#16ab39!important}.ui.teal.label,.ui.teal.labels .label{background-color:#00B5AD!important;border-color:#00B5AD!important;color:#FFF!important}.ui.teal.labels .label:hover,a.ui.teal.label:hover{background-color:#009c95!important;border-color:#009c95!important;color:#FFF!important}.ui.teal.corner.label,.ui.teal.corner.label:hover{background-color:transparent!important}.ui.teal.ribbon.label{border-color:#00827c!important}.ui.basic.teal.label{background-color:#FFF!important;color:#00B5AD!important;border-color:#00B5AD!important}.ui.basic.teal.labels a.label:hover,a.ui.basic.teal.label:hover{background-color:#FFF!important;color:#009c95!important;border-color:#009c95!important}.ui.blue.label,.ui.blue.labels .label{background-color:#2185D0!important;border-color:#2185D0!important;color:#FFF!important}.ui.blue.labels .label:hover,a.ui.blue.label:hover{background-color:#1678c2!important;border-color:#1678c2!important;color:#FFF!important}.ui.blue.corner.label,.ui.blue.corner.label:hover{background-color:transparent!important}.ui.blue.ribbon.label{border-color:#1a69a4!important}.ui.basic.blue.label{background-color:#FFF!important;color:#2185D0!important;border-color:#2185D0!important}.ui.basic.blue.labels a.label:hover,a.ui.basic.blue.label:hover{background-color:#FFF!important;color:#1678c2!important;border-color:#1678c2!important}.ui.violet.label,.ui.violet.labels .label{background-color:#6435C9!important;border-color:#6435C9!important;color:#FFF!important}.ui.violet.labels .label:hover,a.ui.violet.label:hover{background-color:#5829bb!important;border-color:#5829bb!important;color:#FFF!important}.ui.violet.corner.label,.ui.violet.corner.label:hover{background-color:transparent!important}.ui.violet.ribbon.label{border-color:#502aa1!important}.ui.basic.violet.label{background-color:#FFF!important;color:#6435C9!important;border-color:#6435C9!important}.ui.basic.violet.labels a.label:hover,a.ui.basic.violet.label:hover{background-color:#FFF!important;color:#5829bb!important;border-color:#5829bb!important}.ui.purple.label,.ui.purple.labels .label{background-color:#A333C8!important;border-color:#A333C8!important;color:#FFF!important}.ui.purple.labels .label:hover,a.ui.purple.label:hover{background-color:#9627ba!important;border-color:#9627ba!important;color:#FFF!important}.ui.purple.corner.label,.ui.purple.corner.label:hover{background-color:transparent!important}.ui.purple.ribbon.label{border-color:#82299f!important}.ui.basic.purple.label{background-color:#FFF!important;color:#A333C8!important;border-color:#A333C8!important}.ui.basic.purple.labels a.label:hover,a.ui.basic.purple.label:hover{background-color:#FFF!important;color:#9627ba!important;border-color:#9627ba!important}.ui.pink.label,.ui.pink.labels .label{background-color:#E03997!important;border-color:#E03997!important;color:#FFF!important}.ui.pink.labels .label:hover,a.ui.pink.label:hover{background-color:#e61a8d!important;border-color:#e61a8d!important;color:#FFF!important}.ui.pink.corner.label,.ui.pink.corner.label:hover{background-color:transparent!important}.ui.pink.ribbon.label{border-color:#c71f7e!important}.ui.basic.pink.label{background-color:#FFF!important;color:#E03997!important;border-color:#E03997!important}.ui.basic.pink.labels a.label:hover,a.ui.basic.pink.label:hover{background-color:#FFF!important;color:#e61a8d!important;border-color:#e61a8d!important}.ui.brown.label,.ui.brown.labels .label{background-color:#A5673F!important;border-color:#A5673F!important;color:#FFF!important}.ui.brown.labels .label:hover,a.ui.brown.label:hover{background-color:#975b33!important;border-color:#975b33!important;color:#FFF!important}.ui.brown.corner.label,.ui.brown.corner.label:hover{background-color:transparent!important}.ui.brown.ribbon.label{border-color:#805031!important}.ui.basic.brown.label{background-color:#FFF!important;color:#A5673F!important;border-color:#A5673F!important}.ui.basic.brown.labels a.label:hover,a.ui.basic.brown.label:hover{background-color:#FFF!important;color:#975b33!important;border-color:#975b33!important}.ui.grey.label,.ui.grey.labels .label{background-color:#767676!important;border-color:#767676!important;color:#FFF!important}.ui.grey.labels .label:hover,a.ui.grey.label:hover{background-color:#838383!important;border-color:#838383!important;color:#FFF!important}.ui.grey.corner.label,.ui.grey.corner.label:hover{background-color:transparent!important}.ui.grey.ribbon.label{border-color:#805031!important}.ui.basic.grey.label{background-color:#FFF!important;color:#767676!important;border-color:#767676!important}.ui.basic.grey.labels a.label:hover,a.ui.basic.grey.label:hover{background-color:#FFF!important;color:#838383!important;border-color:#838383!important}.ui.black.label,.ui.black.labels .label{background-color:#1B1C1D!important;border-color:#1B1C1D!important;color:#FFF!important}.ui.black.labels .label:hover,a.ui.black.label:hover{background-color:#27292a!important;border-color:#27292a!important;color:#FFF!important}.ui.black.corner.label,.ui.black.corner.label:hover{background-color:transparent!important}.ui.black.ribbon.label{border-color:#805031!important}.ui.basic.black.label{background-color:#FFF!important;color:#1B1C1D!important;border-color:#1B1C1D!important}.ui.basic.black.labels a.label:hover,a.ui.basic.black.label:hover{background-color:#FFF!important;color:#27292a!important;border-color:#27292a!important}.ui.basic.label{background:#FFF;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);box-shadow:none}a.ui.basic.label:hover{text-decoration:none;background:#FFF;color:#1e70bf;box-shadow:1px solid rgba(34,36,38,.15);box-shadow:none}.ui.basic.pointing.label:before{border-color:inherit}.ui.fluid.labels>.label,.ui.label.fluid{width:100%;box-sizing:border-box}.ui.inverted.label,.ui.inverted.labels .label{color:rgba(255,255,255,.9)!important}.ui.horizontal.label,.ui.horizontal.labels .label{margin:0 .5em 0 0;padding:.4em .833em;min-width:3em;text-align:center}.ui.circular.label,.ui.circular.labels .label{min-width:2em;min-height:2em;padding:.5em!important;line-height:1em;text-align:center;border-radius:500rem}.ui.empty.circular.label,.ui.empty.circular.labels .label{min-width:0;min-height:0;overflow:hidden;width:.5em;height:.5em;vertical-align:baseline}.ui.pointing.label{position:relative}.ui.attached.pointing.label{position:absolute}.ui.pointing.label:before{background-color:inherit;border-style:solid;border-color:inherit;position:absolute;content:'';-webkit-transform:rotate(45deg);transform:rotate(45deg);background-image:none;z-index:2;width:.6666em;height:.6666em;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.pointing.label,.ui[class*="pointing above"].label{margin-top:1em}.ui.pointing.label:before,.ui[class*="pointing above"].label:before{border-width:1px 0 0 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:0;left:50%}.ui[class*="bottom pointing"].label,.ui[class*="pointing below"].label{margin-top:0;margin-bottom:1em}.ui[class*="bottom pointing"].label:before,.ui[class*="pointing below"].label:before{border-width:0 1px 1px 0;right:auto;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:100%;left:50%}.ui[class*="left pointing"].label{margin-top:0;margin-left:.6666em}.ui[class*="left pointing"].label:before{border-width:0 0 1px 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);bottom:auto;right:auto;top:50%;left:0}.ui[class*="right pointing"].label{margin-top:0;margin-right:.6666em}.ui[class*="right pointing"].label:before{border-width:1px 1px 0 0;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);top:50%;right:0;bottom:auto;left:auto}.ui.basic.pointing.label:before,.ui.basic[class*="pointing above"].label:before{margin-top:-1px}.ui.basic[class*="bottom pointing"].label:before,.ui.basic[class*="pointing below"].label:before{bottom:auto;top:100%;margin-top:1px}.ui.basic[class*="left pointing"].label:before{top:50%;left:-1px}.ui.basic[class*="right pointing"].label:before{top:50%;right:-1px}.ui.floating.label{position:absolute;z-index:100;top:-1em;left:100%;margin:0 0 0 -1.5em!important}.ui.mini.label,.ui.mini.labels .label{font-size:.64285714rem}.ui.tiny.label,.ui.tiny.labels .label{font-size:.71428571rem}.ui.small.label,.ui.small.labels .label{font-size:.78571429rem}.ui.label,.ui.labels .label{font-size:.85714286rem}.ui.large.label,.ui.large.labels .label{font-size:1rem}.ui.big.label,.ui.big.labels .label{font-size:1.28571429rem}.ui.huge.label,.ui.huge.labels .label{font-size:1.42857143rem}.ui.massive.label,.ui.massive.labels .label{font-size:1.71428571rem}.ui.list,ol.ui.list,ul.ui.list{list-style-type:none;margin:1em 0;padding:0}.ui.list:first-child,ol.ui.list:first-child,ul.ui.list:first-child{margin-top:0;padding-top:0}.ui.list:last-child,ol.ui.list:last-child,ul.ui.list:last-child{margin-bottom:0;padding-bottom:0}.ui.list .list>.item,.ui.list>.item,ol.ui.list li,ul.ui.list li{display:list-item;table-layout:fixed;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.list>.item:after,.ui.list>.list>.item,ol.ui.list>li:first-child:after,ul.ui.list>li:first-child:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.list .list>.item:first-child,.ui.list>.item:first-child,ol.ui.list li:first-child,ul.ui.list li:first-child{padding-top:0}.ui.list .list>.item:last-child,.ui.list>.item:last-child,ol.ui.list li:last-child,ul.ui.list li:last-child{padding-bottom:0}.ui.list .list,ol.ui.list ol,ul.ui.list ul{clear:both;margin:0;padding:.75em 0 .25em .5em}.ui.list .list>.item,ol.ui.list ol li,ul.ui.list ul li{padding:.14285714em 0;line-height:inherit}.ui.list .list>.item>i.icon,.ui.list>.item>i.icon{display:table-cell;margin:0;padding-top:.07142857em;padding-right:.28571429em;vertical-align:top;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.list .list>.item>i.icon:only-child,.ui.list>.item>i.icon:only-child{display:inline-block;vertical-align:top}.ui.list .list>.item>.image,.ui.list>.item>.image{display:table-cell;background-color:transparent;margin:0;vertical-align:top}.ui.list .list>.item>.image:not(:only-child):not(img),.ui.list>.item>.image:not(:only-child):not(img){padding-right:.5em}.ui.list .list>.item>.image img,.ui.list>.item>.image img{vertical-align:top}.ui.list .list>.item>.image:only-child,.ui.list .list>.item>img.image,.ui.list>.item>.image:only-child,.ui.list>.item>img.image{display:inline-block}.ui.list .list>.item>.content,.ui.list>.item>.content{line-height:1.14285714em}.ui.list .list>.item>.icon+.content,.ui.list .list>.item>.image+.content,.ui.list>.item>.icon+.content,.ui.list>.item>.image+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.ui.list .list>.item>img.image+.content,.ui.list>.item>img.image+.content{display:inline-block}.ui.list .list>.item>.content>.list,.ui.list>.item>.content>.list{margin-left:0;padding-left:0}.ui.list .list>.item .header,.ui.list>.item .header{display:block;margin:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.87)}.ui.list .list>.item .description,.ui.list>.item .description{display:block;color:rgba(0,0,0,.7)}.ui.list .list>.item a,.ui.list>.item a{cursor:pointer}.ui.list .list>a.item,.ui.list>a.item{cursor:pointer;color:#4183C4}.ui.list .list>a.item:hover,.ui.list>a.item:hover{color:#1e70bf}.ui.list .list>a.item i.icon,.ui.list>a.item i.icon{color:rgba(0,0,0,.4)}.ui.list .list>.item a.header,.ui.list>.item a.header{cursor:pointer;color:#4183C4!important}.ui.list .list>.item a.header:hover,.ui.list>.item a.header:hover{color:#1e70bf!important}.ui[class*="left floated"].list{float:left}.ui[class*="right floated"].list{float:right}.ui.list .list>.item [class*="left floated"],.ui.list>.item [class*="left floated"]{float:left;margin:0 1em 0 0}.ui.list .list>.item [class*="right floated"],.ui.list>.item [class*="right floated"]{float:right;margin:0 0 0 1em}.ui.menu .ui.list .list>.item,.ui.menu .ui.list>.item{display:list-item;table-layout:fixed;background-color:transparent;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.menu .ui.list .list>.item:before,.ui.menu .ui.list>.item:before{border:none;background:0 0}.ui.menu .ui.list .list>.item:first-child,.ui.menu .ui.list>.item:first-child{padding-top:0}.ui.menu .ui.list .list>.item:last-child,.ui.menu .ui.list>.item:last-child{padding-bottom:0}.ui.horizontal.list{display:inline-block;font-size:0}.ui.horizontal.list>.item{display:inline-block;margin-left:1em;font-size:1rem}.ui.horizontal.list:not(.celled)>.item:first-child{margin-left:0!important;padding-left:0!important}.ui.horizontal.list .list{padding-left:0;padding-bottom:0}.ui.horizontal.list .list>.item>.content,.ui.horizontal.list .list>.item>.icon,.ui.horizontal.list .list>.item>.image,.ui.horizontal.list>.item>.content,.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.image{vertical-align:middle}.ui.horizontal.list>.item:first-child,.ui.horizontal.list>.item:last-child{padding-top:.21428571em;padding-bottom:.21428571em}.ui.horizontal.list>.item>i.icon{margin:0;padding:0 .25em 0 0}.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.icon+.content{float:none;display:inline-block}.ui.list .list>.disabled.item,.ui.list>.disabled.item{pointer-events:none;color:rgba(40,40,40,.3)!important}.ui.inverted.list .list>.disabled.item,.ui.inverted.list>.disabled.item{color:rgba(225,225,225,.3)!important}.ui.list .list>a.item:hover .icon,.ui.list>a.item:hover .icon{color:rgba(0,0,0,.87)}.ui.inverted.list .list>a.item>.icon,.ui.inverted.list>a.item>.icon{color:rgba(255,255,255,.7)}.ui.inverted.list .list>.item .header,.ui.inverted.list>.item .header{color:rgba(255,255,255,.9)}.ui.inverted.list .list>.item .description,.ui.inverted.list>.item .description{color:rgba(255,255,255,.7)}.ui.inverted.list .list>a.item,.ui.inverted.list>a.item{cursor:pointer;color:rgba(255,255,255,.9)}.ui.inverted.list .list>a.item:hover,.ui.inverted.list>a.item:hover{color:#1e70bf}.ui.inverted.list .item a:not(.ui){color:rgba(255,255,255,.9)!important}.ui.inverted.list .item a:not(.ui):hover{color:#1e70bf!important}.ui.list [class*="top aligned"],.ui.list[class*="top aligned"] .content,.ui.list[class*="top aligned"] .image{vertical-align:top!important}.ui.list [class*="middle aligned"],.ui.list[class*="middle aligned"] .content,.ui.list[class*="middle aligned"] .image{vertical-align:middle!important}.ui.list [class*="bottom aligned"],.ui.list[class*="bottom aligned"] .content,.ui.list[class*="bottom aligned"] .image{vertical-align:bottom!important}.ui.link.list .item,.ui.link.list .item a:not(.ui),.ui.link.list a.item{color:rgba(0,0,0,.4);-webkit-transition:.1s color ease;transition:.1s color ease}.ui.link.list .item a:not(.ui):hover,.ui.link.list a.item:hover{color:rgba(0,0,0,.8)}.ui.link.list .item a:not(.ui):active,.ui.link.list a.item:active{color:rgba(0,0,0,.9)}.ui.link.list .active.item,.ui.link.list .active.item a:not(.ui){color:rgba(0,0,0,.95)}.ui.inverted.link.list .item,.ui.inverted.link.list .item a:not(.ui),.ui.inverted.link.list a.item{color:rgba(255,255,255,.5)}.ui.inverted.link.list .active.item a:not(.ui),.ui.inverted.link.list .item a:not(.ui):active,.ui.inverted.link.list .item a:not(.ui):hover,.ui.inverted.link.list a.active.item,.ui.inverted.link.list a.item:active,.ui.inverted.link.list a.item:hover{color:#fff}.ui.selection.list .list>.item,.ui.selection.list>.item{cursor:pointer;background:0 0;padding:.5em;margin:0;color:rgba(0,0,0,.4);border-radius:.5em;-webkit-transition:.1s color ease,.1s padding-left ease,.1s background-color ease;transition:.1s color ease,.1s padding-left ease,.1s background-color ease}.ui.selection.list .list>.item:last-child,.ui.selection.list>.item:last-child{margin-bottom:0}.ui.selection.list.list>.item:hover,.ui.selection.list>.item:hover{background:rgba(0,0,0,.03);color:rgba(0,0,0,.8)}.ui.selection.list .list>.item:active,.ui.selection.list>.item:active{background:rgba(0,0,0,.05);color:rgba(0,0,0,.9)}.ui.selection.list .list>.item.active,.ui.selection.list>.item.active{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.inverted.selection.list>.item{background:0 0;color:rgba(255,255,255,.5)}.ui.inverted.selection.list>.item:hover{background:rgba(255,255,255,.02);color:#fff}.ui.inverted.selection.list>.item.active,.ui.inverted.selection.list>.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.celled.selection.list .list>.item,.ui.celled.selection.list>.item,.ui.divided.selection.list .list>.item,.ui.divided.selection.list>.item{border-radius:0}.ui.animated.list>.item{-webkit-transition:.25s color ease .1s,.25s padding-left ease .1s,.25s background-color ease .1s;transition:.25s color ease .1s,.25s padding-left ease .1s,.25s background-color ease .1s}.ui.animated.list:not(.horizontal)>.item:hover{padding-left:1em}.ui.fitted.list:not(.selection) .list>.item,.ui.fitted.list:not(.selection)>.item{padding-left:0;padding-right:0}.ui.fitted.selection.list .list>.item,.ui.fitted.selection.list>.item{margin-left:-.5em;margin-right:-.5em}.ui.bulleted.list,ul.ui.list{margin-left:1.25rem}.ui.bulleted.list .list>.item,.ui.bulleted.list>.item,ul.ui.list li{position:relative}.ui.bulleted.list .list>.item:before,.ui.bulleted.list>.item:before,ul.ui.list li:before{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;position:absolute;top:auto;left:auto;font-weight:400;margin-left:-1.25rem;content:'•';opacity:1;color:inherit;vertical-align:top}.ui.bulleted.list .list>a.item:before,.ui.bulleted.list>a.item:before,ul.ui.list li:before{color:rgba(0,0,0,.87)}.ui.bulleted.list .list,ul.ui.list ul{padding-left:1.25rem}.ui.horizontal.bulleted.list,ul.ui.horizontal.bulleted.list{margin-left:0}.ui.horizontal.bulleted.list>.item,ul.ui.horizontal.bulleted.list li{margin-left:1.75rem}.ui.horizontal.bulleted.list>.item:first-child,ul.ui.horizontal.bulleted.list li:first-child{margin-left:0}.ui.horizontal.bulleted.list>.item::before,ul.ui.horizontal.bulleted.list li::before{color:rgba(0,0,0,.87)}.ui.horizontal.bulleted.list>.item:first-child::before,ul.ui.horizontal.bulleted.list li:first-child::before{display:none}.ui.ordered.list,.ui.ordered.list .list,ol.ui.list,ol.ui.list ol{counter-reset:ordered;margin-left:1.25rem;list-style-type:none}.ui.ordered.list .list>.item,.ui.ordered.list>.item,ol.ui.list li{list-style-type:none;position:relative}.ui.ordered.list .list>.item:before,.ui.ordered.list>.item:before,ol.ui.list li:before{position:absolute;top:auto;left:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;margin-left:-1.25rem;counter-increment:ordered;content:counters(ordered,".") " ";text-align:right;color:rgba(0,0,0,.87);vertical-align:middle;opacity:.8}.ui.ordered.inverted.list .list>.item:before,.ui.ordered.inverted.list>.item:before,ol.ui.inverted.list li:before{color:rgba(255,255,255,.7)}.ui.ordered.list>.item[data-value],.ui.ordered.list>.list>.item[data-value]{content:attr(data-value)}ol.ui.list li[value]:before{content:attr(value)}.ui.ordered.list .list,ol.ui.list ol{margin-left:1em}.ui.ordered.list .list>.item:before,ol.ui.list ol li:before{margin-left:-2em}.ui.ordered.horizontal.list,ol.ui.horizontal.list{margin-left:0}.ui.ordered.horizontal.list .list>.item:before,.ui.ordered.horizontal.list>.item:before,ol.ui.horizontal.list li:before{position:static;margin:0 .5em 0 0}.ui.divided.list>.item{border-top:1px solid rgba(34,36,38,.15)}.ui.divided.list .item .list>.item,.ui.divided.list .list>.item,.ui.divided.list .list>.item:first-child,.ui.divided.list>.item:first-child{border-top:none}.ui.divided.list:not(.horizontal) .list>.item:first-child{border-top-width:1px}.ui.divided.bulleted.list .list,.ui.divided.bulleted.list:not(.horizontal){margin-left:0;padding-left:0}.ui.divided.bulleted.list>.item:not(.horizontal){padding-left:1.25rem}.ui.divided.ordered.list{margin-left:0}.ui.divided.ordered.list .list>.item,.ui.divided.ordered.list>.item{padding-left:1.25rem}.ui.divided.ordered.list .item .list{margin-left:0;margin-right:0;padding-bottom:.21428571em}.ui.divided.ordered.list .item .list>.item{padding-left:1em}.ui.divided.selection.list .list>.item,.ui.divided.selection.list>.item{margin:0;border-radius:0}.ui.divided.horizontal.list{margin-left:0}.ui.divided.horizontal.list>.item:not(:first-child){padding-left:.5em}.ui.divided.horizontal.list>.item:not(:last-child){padding-right:.5em}.ui.divided.horizontal.list>.item{border-top:none;border-left:1px solid rgba(34,36,38,.15);margin:0;line-height:.6}.ui.horizontal.divided.list>.item:first-child{border-left:none}.ui.divided.inverted.horizontal.list>.item,.ui.divided.inverted.list>.item,.ui.divided.inverted.list>.list{border-color:rgba(255,255,255,.1)}.ui.celled.list>.item,.ui.celled.list>.list{border-top:1px solid rgba(34,36,38,.15);padding-left:.5em;padding-right:.5em}.ui.celled.list>.item:last-child{border-bottom:1px solid rgba(34,36,38,.15)}.ui.celled.list>.item:first-child,.ui.celled.list>.item:last-child{padding-top:.21428571em;padding-bottom:.21428571em}.ui.celled.list .item .list>.item{border-width:0}.ui.celled.list .list>.item:first-child{border-top-width:0}.ui.celled.bulleted.list{margin-left:0}.ui.celled.bulleted.list .list>.item,.ui.celled.bulleted.list>.item{padding-left:1.25rem}.ui.celled.bulleted.list .item .list{margin-left:-1.25rem;margin-right:-1.25rem;padding-bottom:.21428571em}.ui.celled.ordered.list{margin-left:0}.ui.celled.ordered.list .list>.item,.ui.celled.ordered.list>.item{padding-left:1.25rem}.ui.celled.ordered.list .item .list{margin-left:0;margin-right:0;padding-bottom:.21428571em}.ui.celled.ordered.list .list>.item{padding-left:1em}.ui.horizontal.celled.list{margin-left:0}.ui.horizontal.celled.list .list>.item,.ui.horizontal.celled.list>.item{border-top:none;border-left:1px solid rgba(34,36,38,.15);margin:0;padding-left:.5em;padding-right:.5em;line-height:.6}.ui.horizontal.celled.list .list>.item:last-child,.ui.horizontal.celled.list>.item:last-child{border-bottom:none;border-right:1px solid rgba(34,36,38,.15)}.ui.celled.inverted.horizontal.list .list>.item,.ui.celled.inverted.horizontal.list>.item,.ui.celled.inverted.list>.item,.ui.celled.inverted.list>.list{border-color:1px solid rgba(255,255,255,.1)}.ui.relaxed.list:not(.horizontal)>.item:not(:first-child){padding-top:.42857143em}.ui.relaxed.list:not(.horizontal)>.item:not(:last-child){padding-bottom:.42857143em}.ui.horizontal.relaxed.list .list>.item:not(:first-child),.ui.horizontal.relaxed.list>.item:not(:first-child){padding-left:1rem}.ui.horizontal.relaxed.list .list>.item:not(:last-child),.ui.horizontal.relaxed.list>.item:not(:last-child){padding-right:1rem}.ui[class*="very relaxed"].list:not(.horizontal)>.item:not(:first-child){padding-top:.85714286em}.ui[class*="very relaxed"].list:not(.horizontal)>.item:not(:last-child){padding-bottom:.85714286em}.ui.horizontal[class*="very relaxed"].list .list>.item:not(:first-child),.ui.horizontal[class*="very relaxed"].list>.item:not(:first-child){padding-left:1.5rem}.ui.horizontal[class*="very relaxed"].list .list>.item:not(:last-child),.ui.horizontal[class*="very relaxed"].list>.item:not(:last-child){padding-right:1.5rem}.ui.mini.list{font-size:.78571429em}.ui.tiny.list{font-size:.85714286em}.ui.small.list{font-size:.92857143em}.ui.list{font-size:1em}.ui.large.list{font-size:1.14285714em}.ui.big.list{font-size:1.28571429em}.ui.huge.list{font-size:1.42857143em}.ui.massive.list{font-size:1.71428571em}.ui.mini.horizontal.list .list>.item,.ui.mini.horizontal.list>.item{font-size:.78571429rem}.ui.tiny.horizontal.list .list>.item,.ui.tiny.horizontal.list>.item{font-size:.85714286rem}.ui.small.horizontal.list .list>.item,.ui.small.horizontal.list>.item{font-size:.92857143rem}.ui.horizontal.list .list>.item,.ui.horizontal.list>.item{font-size:1rem}.ui.large.horizontal.list .list>.item,.ui.large.horizontal.list>.item{font-size:1.14285714rem}.ui.big.horizontal.list .list>.item,.ui.big.horizontal.list>.item{font-size:1.28571429rem}.ui.huge.horizontal.list .list>.item,.ui.huge.horizontal.list>.item{font-size:1.42857143rem}.ui.massive.horizontal.list .list>.item,.ui.massive.horizontal.list>.item{font-size:1.71428571rem}.ui.loader{display:none;position:absolute;top:50%;left:50%;margin:0;text-align:center;z-index:1000;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ui.loader:before{position:absolute;content:'';top:0;left:50%;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loader:after{position:absolute;content:'';top:0;left:50%;-webkit-animation:loader .6s linear;animation:loader .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}@-webkit-keyframes loader{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loader{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.mini.loader:after,.ui.mini.loader:before{width:1rem;height:1rem;margin:0 0 0 -.5rem}.ui.tiny.loader:after,.ui.tiny.loader:before{width:1.14285714rem;height:1.14285714rem;margin:0 0 0 -.57142857rem}.ui.small.loader:after,.ui.small.loader:before{width:1.71428571rem;height:1.71428571rem;margin:0 0 0 -.85714286rem}.ui.loader:after,.ui.loader:before{width:2.28571429rem;height:2.28571429rem;margin:0 0 0 -1.14285714rem}.ui.large.loader:after,.ui.large.loader:before{width:3.42857143rem;height:3.42857143rem;margin:0 0 0 -1.71428571rem}.ui.big.loader:after,.ui.big.loader:before{width:3.71428571rem;height:3.71428571rem;margin:0 0 0 -1.85714286rem}.ui.huge.loader:after,.ui.huge.loader:before{width:4.14285714rem;height:4.14285714rem;margin:0 0 0 -2.07142857rem}.ui.massive.loader:after,.ui.massive.loader:before{width:4.57142857rem;height:4.57142857rem;margin:0 0 0 -2.28571429rem}.ui.dimmer .loader{display:block}.ui.dimmer .ui.loader{color:rgba(255,255,255,.9)}.ui.dimmer .ui.loader:before{border-color:rgba(255,255,255,.15)}.ui.dimmer .ui.loader:after{border-color:#FFF transparent transparent}.ui.inverted.dimmer .ui.loader{color:rgba(0,0,0,.87)}.ui.inverted.dimmer .ui.loader:before{border-color:rgba(0,0,0,.1)}.ui.inverted.dimmer .ui.loader:after{border-color:#767676 transparent transparent}.ui.text.loader{width:auto!important;height:auto!important;text-align:center;font-style:normal}.ui.indeterminate.loader:after{-webkit-animation-direction:reverse;animation-direction:reverse;-webkit-animation-duration:1.2s;animation-duration:1.2s}.ui.loader.active,.ui.loader.visible{display:block}.ui.loader.disabled,.ui.loader.hidden{display:none}.ui.inverted.dimmer .ui.mini.loader,.ui.mini.loader{width:1rem;height:1rem;font-size:.78571429em}.ui.inverted.dimmer .ui.tiny.loader,.ui.tiny.loader{width:1.14285714rem;height:1.14285714rem;font-size:.85714286em}.ui.inverted.dimmer .ui.small.loader,.ui.small.loader{width:1.71428571rem;height:1.71428571rem;font-size:.92857143em}.ui.inverted.dimmer .ui.loader,.ui.loader{width:2.28571429rem;height:2.28571429rem;font-size:1em}.ui.inverted.dimmer .ui.large.loader,.ui.large.loader{width:3.42857143rem;height:3.42857143rem;font-size:1.14285714em}.ui.big.loader,.ui.inverted.dimmer .ui.big.loader{width:3.71428571rem;height:3.71428571rem;font-size:1.28571429em}.ui.huge.loader,.ui.inverted.dimmer .ui.huge.loader{width:4.14285714rem;height:4.14285714rem;font-size:1.42857143em}.ui.inverted.dimmer .ui.massive.loader,.ui.massive.loader{width:4.57142857rem;height:4.57142857rem;font-size:1.71428571em}.ui.mini.text.loader{min-width:1rem;padding-top:1.78571429rem}.ui.tiny.text.loader{min-width:1.14285714rem;padding-top:1.92857143rem}.ui.small.text.loader{min-width:1.71428571rem;padding-top:2.5rem}.ui.text.loader{min-width:2.28571429rem;padding-top:3.07142857rem}.ui.large.text.loader{min-width:3.42857143rem;padding-top:4.21428571rem}.ui.big.text.loader{min-width:3.71428571rem;padding-top:4.5rem}.ui.huge.text.loader{min-width:4.14285714rem;padding-top:4.92857143rem}.ui.massive.text.loader{min-width:4.57142857rem;padding-top:5.35714286rem}.ui.inverted.loader{color:rgba(255,255,255,.9)}.ui.inverted.loader:before{border-color:rgba(255,255,255,.15)}.ui.inverted.loader:after{border-top-color:#FFF}.ui.inline.loader{position:relative;vertical-align:middle;margin:0;left:0;top:0;-webkit-transform:none;transform:none}.ui.inline.loader.active,.ui.inline.loader.visible{display:inline-block}.ui.centered.inline.loader.active,.ui.centered.inline.loader.visible{display:block;margin-left:auto;margin-right:auto}.ui.rail{position:absolute;top:0;width:300px;height:100%}.ui.left.rail{left:auto;right:100%;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.right.rail{left:100%;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.left.internal.rail{left:0;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.right.internal.rail{left:auto;right:0;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.dividing.rail{width:302.5px}.ui.left.dividing.rail{padding:0 2.5rem 0 0;margin:0 2.5rem 0 0;border-right:1px solid rgba(34,36,38,.15)}.ui.right.dividing.rail{border-left:1px solid rgba(34,36,38,.15);padding:0 0 0 2.5rem;margin:0 0 0 2.5rem}.ui.close.rail{width:calc(300px + 1em)}.ui.close.left.rail{padding:0 1em 0 0;margin:0 1em 0 0}.ui.close.right.rail{padding:0 0 0 1em;margin:0 0 0 1em}.ui.very.close.rail{width:calc(300px + .5em)}.ui.very.close.left.rail{padding:0 .5em 0 0;margin:0 .5em 0 0}.ui.very.close.right.rail{padding:0 0 0 .5em;margin:0 0 0 .5em}.ui.attached.left.rail,.ui.attached.right.rail{padding:0;margin:0}.ui.mini.rail{font-size:.78571429rem}.ui.tiny.rail{font-size:.85714286rem}.ui.small.rail{font-size:.92857143rem}.ui.rail{font-size:1rem}.ui.large.rail{font-size:1.14285714rem}.ui.big.rail{font-size:1.28571429rem}.ui.huge.rail{font-size:1.42857143rem}.ui.massive.rail{font-size:1.71428571rem}.ui.reveal{display:inherit;position:relative!important;font-size:0!important}.ui.reveal>.visible.content{position:absolute!important;top:0!important;left:0!important;z-index:3!important;-webkit-transition:all .5s ease .1s;transition:all .5s ease .1s}.ui.reveal>.hidden.content{position:relative!important;z-index:2!important}.ui.active.reveal .visible.content,.ui.reveal:hover .visible.content{z-index:4!important}.ui.slide.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.slide.reveal>.content{display:block;width:100%;float:left;margin:0;-webkit-transition:-webkit-transform .5s ease .1s;transition:-webkit-transform .5s ease .1s;transition:transform .5s ease .1s;transition:transform .5s ease .1s,-webkit-transform .5s ease .1s}.ui.slide.reveal>.visible.content{position:relative!important}.ui.slide.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important;-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.active.reveal>.visible.content,.ui.slide.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.active.reveal>.hidden.content,.ui.slide.reveal:hover>.hidden.content,.ui.slide.right.reveal>.visible.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.hidden.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.right.active.reveal>.visible.content,.ui.slide.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.right.active.reveal>.hidden.content,.ui.slide.right.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.up.reveal>.hidden.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.up.active.reveal>.visible.content,.ui.slide.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.up.active.reveal>.hidden.content,.ui.slide.up.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.slide.down.reveal>.hidden.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.down.active.reveal>.visible.content,.ui.slide.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.down.active.reveal>.hidden.content,.ui.slide.down.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.fade.reveal>.visible.content{opacity:1}.ui.fade.active.reveal>.visible.content,.ui.fade.reveal:hover>.visible.content{opacity:0}.ui.move.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.move.reveal>.content{display:block;float:left;margin:0;-webkit-transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s,-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s}.ui.move.reveal>.visible.content{position:relative!important}.ui.move.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important}.ui.move.active.reveal>.visible.content,.ui.move.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.move.right.active.reveal>.visible.content,.ui.move.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.move.up.active.reveal>.visible.content,.ui.move.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.move.down.active.reveal>.visible.content,.ui.move.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.rotate.reveal>.visible.content{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transform:rotate(0);transform:rotate(0)}.ui.rotate.reveal>.visible.content,.ui.rotate.right.reveal>.visible.content{-webkit-transform-origin:bottom right;transform-origin:bottom right}.ui.rotate.active.reveal>.visible.content,.ui.rotate.reveal:hover>.visible.content,.ui.rotate.right.active.reveal>.visible.content,.ui.rotate.right.reveal:hover>.visible.content{-webkit-transform:rotate(110deg);transform:rotate(110deg)}.ui.rotate.left.reveal>.visible.content{-webkit-transform-origin:bottom left;transform-origin:bottom left}.ui.rotate.left.active.reveal>.visible.content,.ui.rotate.left.reveal:hover>.visible.content{-webkit-transform:rotate(-110deg);transform:rotate(-110deg)}.ui.disabled.reveal:hover>.visible.visible.content{position:static!important;display:block!important;opacity:1!important;top:0!important;left:0!important;right:auto!important;bottom:auto!important;-webkit-transform:none!important;transform:none!important}.ui.disabled.reveal:hover>.hidden.hidden.content{display:none!important}.ui.visible.reveal{overflow:visible}.ui.instant.reveal>.content{-webkit-transition-delay:0s!important;transition-delay:0s!important}.ui.reveal>.content{font-size:1rem!important}.ui.segment{position:relative;background:#FFF;box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;padding:1em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segment:first-child{margin-top:0}.ui.segment:last-child{margin-bottom:0}.ui.vertical.segment{margin:0;padding-left:0;padding-right:0;background:none;border-radius:0;box-shadow:none;border:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.segment:last-child{border-bottom:none}.ui.inverted.segment>.ui.header{color:#FFF}.ui[class*="bottom attached"].segment>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui[class*="top attached"].segment>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.grid>.row>.ui.segment.column,.ui.grid>.ui.segment.column,.ui.page.grid.segment{padding-top:2em;padding-bottom:2em}.ui.grid.segment{margin:1rem 0;border-radius:.28571429rem}.ui.basic.table.segment{background:#FFF;border:1px solid rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui[class*="very basic"].table.segment{padding:1em}.ui.piled.segment,.ui.piled.segments{margin:3em 0;box-shadow:'';z-index:auto}.ui.piled.segment:first-child{margin-top:0}.ui.piled.segment:last-child{margin-bottom:0}.ui.piled.segment:after,.ui.piled.segment:before,.ui.piled.segments:after,.ui.piled.segments:before{background-color:#FFF;visibility:visible;content:'';display:block;height:100%;left:0;position:absolute;width:100%;border:1px solid rgba(34,36,38,.15);box-shadow:''}.ui.piled.segment:before,.ui.piled.segments:before{-webkit-transform:rotate(-1.2deg);transform:rotate(-1.2deg);top:0;z-index:-2}.ui.piled.segment:after,.ui.piled.segments:after{-webkit-transform:rotate(1.2deg);transform:rotate(1.2deg);top:0;z-index:-1}.ui[class*="top attached"].piled.segment{margin-top:3em;margin-bottom:0}.ui.piled.segment[class*="top attached"]:first-child{margin-top:0}.ui.piled.segment[class*="bottom attached"]{margin-top:0;margin-bottom:3em}.ui.piled.segment[class*="bottom attached"]:last-child{margin-bottom:0}.ui.stacked.segment{padding-bottom:1.4em}.ui.stacked.segment:after,.ui.stacked.segment:before,.ui.stacked.segments:after,.ui.stacked.segments:before{content:'';position:absolute;bottom:-3px;left:0;border-top:1px solid rgba(34,36,38,.15);background:rgba(0,0,0,.03);width:100%;height:6px;visibility:visible}.ui.stacked.segment:before,.ui.stacked.segments:before{display:none}.ui.tall.stacked.segment:before,.ui.tall.stacked.segments:before{display:block;bottom:0}.ui.stacked.inverted.segment:after,.ui.stacked.inverted.segment:before,.ui.stacked.inverted.segments:after,.ui.stacked.inverted.segments:before{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(34,36,38,.35)}.ui.padded.segment{padding:1.5em}.ui[class*="very padded"].segment{padding:3em}.ui.compact.segment{display:table}.ui.compact.segments{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex}.ui.compact.segments .segment,.ui.segments .compact.segment{display:block;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.ui.circular.segment{display:table-cell;padding:2em;text-align:center;vertical-align:middle;border-radius:500em}.ui.raised.segment,.ui.raised.segments{box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.segments{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;margin:1rem 0;border:1px solid rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem}.ui.segments:first-child{margin-top:0}.ui.segments:last-child{margin-bottom:0}.ui.segments>.segment{top:0;bottom:0;border-radius:0;margin:0;width:auto;box-shadow:none;border:none;border-top:1px solid rgba(34,36,38,.15)}.ui.segments:not(.horizontal)>.segment:first-child{border-top:none;margin-top:0;bottom:0;margin-bottom:0;top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.segments:not(.horizontal)>.segment:last-child{top:0;bottom:0;margin-top:0;margin-bottom:0;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segments:not(.horizontal)>.segment:only-child{border-radius:.28571429rem}.ui.segments>.ui.segments{border-top:1px solid rgba(34,36,38,.15);margin:1rem}.ui.segments>.segments:first-child{border-top:none}.ui.segments>.segment+.segments:not(.horizontal){margin-top:0}.ui.horizontal.segments{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:0;background-color:#FFF;box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments{margin:0;background-color:transparent;border-radius:0;border:none;box-shadow:none;border-top:1px solid rgba(34,36,38,.15)}.ui.horizontal.segments>.segment{-webkit-box-flex:1;-webkit-flex:1 1 auto;flex:1 1 auto;-ms-flex:1 1 0px;margin:0;min-width:0;background-color:transparent;border-radius:0;border:none;box-shadow:none;border-left:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments:first-child{border-top:none}.ui.horizontal.segments>.segment:first-child{border-left:none}.ui.disabled.segment{opacity:.45;color:rgba(40,40,40,.3)}.ui.loading.segment{position:relative;cursor:default;point-events:none;text-shadow:none!important;color:transparent!important;-webkit-transition:all 0s linear;transition:all 0s linear}.ui.loading.segment:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;border-radius:.28571429rem;z-index:100}.ui.loading.segment:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:segment-spin .6s linear;animation:segment-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 rgba(0,0,0,.1) rgba(0,0,0,.1);border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}@-webkit-keyframes segment-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes segment-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.basic.segment{background:none;box-shadow:none;border:none;border-radius:0}.ui.clearing.segment:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ui.red.segment:not(.inverted){border-top:2px solid #DB2828}.ui.inverted.red.segment{background-color:#DB2828!important;color:#FFF!important}.ui.orange.segment:not(.inverted){border-top:2px solid #F2711C}.ui.inverted.orange.segment{background-color:#F2711C!important;color:#FFF!important}.ui.yellow.segment:not(.inverted){border-top:2px solid #FBBD08}.ui.inverted.yellow.segment{background-color:#FBBD08!important;color:#FFF!important}.ui.olive.segment:not(.inverted){border-top:2px solid #B5CC18}.ui.inverted.olive.segment{background-color:#B5CC18!important;color:#FFF!important}.ui.green.segment:not(.inverted){border-top:2px solid #21BA45}.ui.inverted.green.segment{background-color:#21BA45!important;color:#FFF!important}.ui.teal.segment:not(.inverted){border-top:2px solid #00B5AD}.ui.inverted.teal.segment{background-color:#00B5AD!important;color:#FFF!important}.ui.blue.segment:not(.inverted){border-top:2px solid #2185D0}.ui.inverted.blue.segment{background-color:#2185D0!important;color:#FFF!important}.ui.violet.segment:not(.inverted){border-top:2px solid #6435C9}.ui.inverted.violet.segment{background-color:#6435C9!important;color:#FFF!important}.ui.purple.segment:not(.inverted){border-top:2px solid #A333C8}.ui.inverted.purple.segment{background-color:#A333C8!important;color:#FFF!important}.ui.pink.segment:not(.inverted){border-top:2px solid #E03997}.ui.inverted.pink.segment{background-color:#E03997!important;color:#FFF!important}.ui.brown.segment:not(.inverted){border-top:2px solid #A5673F}.ui.inverted.brown.segment{background-color:#A5673F!important;color:#FFF!important}.ui.grey.segment:not(.inverted){border-top:2px solid #767676}.ui.inverted.grey.segment{background-color:#767676!important;color:#FFF!important}.ui.black.segment:not(.inverted){border-top:2px solid #1B1C1D}.ui.inverted.black.segment{background-color:#1B1C1D!important;color:#FFF!important}.ui[class*="left aligned"].segment{text-align:left}.ui[class*="right aligned"].segment{text-align:right}.ui[class*="center aligned"].segment{text-align:center}.ui.floated.segment,.ui[class*="left floated"].segment{float:left;margin-right:1em}.ui[class*="right floated"].segment{float:right;margin-left:1em}.ui.inverted.segment{border:none;box-shadow:none}.ui.inverted.segment,.ui.primary.inverted.segment{background:#1B1C1D;color:rgba(255,255,255,.9)}.ui.inverted.segment .segment{color:rgba(0,0,0,.87)}.ui.inverted.segment .inverted.segment{color:rgba(255,255,255,.9)}.ui.inverted.attached.segment{border-color:#555}.ui.secondary.segment{background:#F3F4F5;color:rgba(0,0,0,.6)}.ui.secondary.inverted.segment{background:-webkit-linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%) #4c4f52;background:linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%) #4c4f52;color:rgba(255,255,255,.8)}.ui.tertiary.segment{background:#DCDDDE;color:rgba(0,0,0,.6)}.ui.tertiary.inverted.segment{background:-webkit-linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%) #717579;background:linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%) #717579;color:rgba(255,255,255,.8)}.ui.attached.segment{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);box-shadow:none;border:1px solid #D4D4D5}.ui.attached:not(.message)+.ui.attached.segment:not(.top){border-top:none}.ui[class*="top attached"].segment{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.segment[class*="top attached"]:first-child{margin-top:0}.ui.segment[class*="bottom attached"]{bottom:0;margin-top:0;top:0;margin-bottom:1rem;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segment[class*="bottom attached"]:last-child{margin-bottom:0}.ui.mini.segment,.ui.mini.segments .segment{font-size:.78571429rem}.ui.tiny.segment,.ui.tiny.segments .segment{font-size:.85714286rem}.ui.small.segment,.ui.small.segments .segment{font-size:.92857143rem}.ui.segment,.ui.segments .segment{font-size:1rem}.ui.large.segment,.ui.large.segments .segment{font-size:1.14285714rem}.ui.big.segment,.ui.big.segments .segment{font-size:1.28571429rem}.ui.huge.segment,.ui.huge.segments .segment{font-size:1.42857143rem}.ui.massive.segment,.ui.massive.segments .segment{font-size:1.71428571rem}.ui.steps{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;margin:1em 0;background:0 0;box-shadow:none;line-height:1.14285714em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.steps:first-child{margin-top:0}.ui.steps:last-child{margin-bottom:0}.ui.steps .step{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;vertical-align:middle;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0;padding:1.14285714em 2em;background:#FFF;color:rgba(0,0,0,.87);box-shadow:none;border-radius:0;border:none;border-right:1px solid rgba(34,36,38,.15);-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease}.ui.steps .step:after{position:absolute;z-index:2;content:'';top:50%;right:0;border:solid;background-color:#FFF;width:1.14285714em;height:1.14285714em;border-color:rgba(34,36,38,.15);border-width:0 1px 1px 0;-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg)}.ui.steps .step:first-child{padding-left:2em;border-radius:.28571429rem 0 0 .28571429rem}.ui.steps .step:last-child{border-radius:0 .28571429rem .28571429rem 0;border-right:none;margin-right:0}.ui.steps .step:only-child{border-radius:.28571429rem}.ui.steps .step .title{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;font-weight:700}.ui.steps .step>.title{width:100%}.ui.steps .step .description{font-weight:400;font-size:.92857143em;color:rgba(0,0,0,.87)}.ui.steps .step>.description{width:100%}.ui.steps .step .title~.description{margin-top:.25em}.ui.steps .step>.icon{line-height:1;font-size:2.5em;margin:0 1rem 0 0}.ui.steps .step>.icon,.ui.steps .step>.icon~.content{display:block;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-align-self:middle;-ms-flex-item-align:middle;align-self:middle}.ui.steps .step>.icon~.content{-webkit-box-flex:1 0 auto;-webkit-flex-grow:1 0 auto;-ms-flex-positive:1 0 auto;flex-grow:1 0 auto}.ui.steps:not(.vertical) .step>.icon{width:auto}.ui.steps .link.step,.ui.steps a.step{cursor:pointer}.ui.ordered.steps{counter-reset:ordered}.ui.ordered.steps .step:before{display:block;position:static;text-align:center;content:counters(ordered,".");-webkit-align-self:middle;-ms-flex-item-align:middle;align-self:middle;margin-right:1rem;font-size:2.5em;counter-increment:ordered;font-family:inherit;font-weight:700}.ui.ordered.steps .step>*{display:block;-webkit-align-self:middle;-ms-flex-item-align:middle;align-self:middle}.ui.vertical.steps{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow:visible}.ui.vertical.steps .step{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.steps .step:last-child{border-bottom:none;border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.steps .step:only-child{border-radius:.28571429rem}.ui.vertical.steps .step:after{top:50%;right:0;border-width:0 1px 1px 0;display:none}.ui.vertical.steps .active.step:after{display:block}.ui.vertical.steps .step:last-child:after{display:none}.ui.vertical.steps .active.step:last-child:after{display:block}@media only screen and (max-width:767px){.ui.steps{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui.steps .step{width:100%!important;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em}.ui.steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.steps .step:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.steps .step:after{display:none!important}.ui.steps .step .content{text-align:center}.ui.ordered.steps .step:before,.ui.steps .step>.icon{margin:0 0 1rem}}.ui.steps .link.step:hover,.ui.steps .link.step:hover::after,.ui.steps a.step:hover,.ui.steps a.step:hover::after{background:#F9FAFB;color:rgba(0,0,0,.8)}.ui.steps .link.step:active,.ui.steps .link.step:active::after,.ui.steps a.step:active,.ui.steps a.step:active::after{background:#F3F4F5;color:rgba(0,0,0,.9)}.ui.steps .step.active{cursor:auto;background:#F3F4F5}.ui.steps .step.active:after{background:#F3F4F5}.ui.steps .step.active .title{color:#4183C4}.ui.ordered.steps .step.active:before,.ui.steps .active.step .icon{color:rgba(0,0,0,.85)}.ui.steps .active.step:after,.ui.steps .step:after{display:block}.ui.steps .active.step:last-child:after,.ui.steps .step:last-child:after{display:none}.ui.steps .link.active.step:hover,.ui.steps .link.active.step:hover::after,.ui.steps a.active.step:hover,.ui.steps a.active.step:hover::after{cursor:pointer;background:#DCDDDE;color:rgba(0,0,0,.87)}.ui.ordered.steps .step.completed:before,.ui.steps .step.completed>.icon:before{color:#21BA45;font-family:Step;content:'\e800'}.ui.steps .disabled.step{cursor:auto;background:#FFF;pointer-events:none}.ui.steps .disabled.step,.ui.steps .disabled.step .description,.ui.steps .disabled.step .title{color:rgba(40,40,40,.3)}.ui.steps .disabled.step:after{background:#FFF}@media only screen and (max-width:991px){.ui[class*="tablet stackable"].steps{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui[class*="tablet stackable"].steps .step{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em}.ui[class*="tablet stackable"].steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui[class*="tablet stackable"].steps .step:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui[class*="tablet stackable"].steps .step:after{display:none!important}.ui[class*="tablet stackable"].steps .step .content{text-align:center}.ui[class*="tablet stackable"].ordered.steps .step:before,.ui[class*="tablet stackable"].steps .step>.icon{margin:0 0 1rem}}.ui.fluid.steps{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.ui.attached.steps{width:calc(100% + 2px)!important;margin:0 -1px;max-width:calc(100% + 2px);border-radius:.28571429rem .28571429rem 0 0}.ui.attached.steps .step:first-child{border-radius:.28571429rem 0 0}.ui.attached.steps .step:last-child{border-radius:0 .28571429rem 0 0}.ui.bottom.attached.steps{margin:0 -1px;border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.attached.steps .step:first-child{border-radius:0 0 0 .28571429rem}.ui.bottom.attached.steps .step:last-child{border-radius:0 0 .28571429rem}.ui.eight.steps,.ui.five.steps,.ui.four.steps,.ui.one.steps,.ui.seven.steps,.ui.six.steps,.ui.three.steps,.ui.two.steps{width:100%}.ui.eight.steps>.step,.ui.five.steps>.step,.ui.four.steps>.step,.ui.one.steps>.step,.ui.seven.steps>.step,.ui.six.steps>.step,.ui.three.steps>.step,.ui.two.steps>.step{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.ui.one.steps>.step{width:100%}.ui.two.steps>.step{width:50%}.ui.three.steps>.step{width:33.333%}.ui.four.steps>.step{width:25%}.ui.five.steps>.step{width:20%}.ui.six.steps>.step{width:16.666%}.ui.seven.steps>.step{width:14.285%}.ui.eight.steps>.step{width:12.5%}.ui.mini.step,.ui.mini.steps .step{font-size:.78571429rem}.ui.tiny.step,.ui.tiny.steps .step{font-size:.85714286rem}.ui.small.step,.ui.small.steps .step{font-size:.92857143rem}.ui.step,.ui.steps .step{font-size:1rem}.ui.large.step,.ui.large.steps .step{font-size:1.14285714rem}.ui.big.step,.ui.big.steps .step{font-size:1.28571429rem}.ui.huge.step,.ui.huge.steps .step{font-size:1.42857143rem}.ui.massive.step,.ui.massive.steps .step{font-size:1.71428571rem}@font-face{font-family:Step;src:url(data:application/x-font-ttf;charset=utf-8;;base64,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) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,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) format('woff')}.ui.breadcrumb{line-height:1;display:inline-block;margin:0;vertical-align:middle}.ui.breadcrumb:first-child{margin-top:0}.ui.breadcrumb:last-child{margin-bottom:0}.ui.breadcrumb .divider{display:inline-block;opacity:.7;margin:0 .21428571rem;font-size:.92857143em;color:rgba(0,0,0,.4);vertical-align:baseline}.ui.breadcrumb a{color:#4183C4}.ui.breadcrumb a:hover{color:#1e70bf}.ui.breadcrumb .icon.divider{font-size:.85714286em;vertical-align:baseline}.ui.breadcrumb a.section{cursor:pointer}.ui.breadcrumb .section{display:inline-block;margin:0;padding:0}.ui.breadcrumb.segment{display:inline-block;padding:.78571429em 1em}.ui.breadcrumb .active.section{font-weight:700}.ui.mini.breadcrumb{font-size:.78571429rem}.ui.tiny.breadcrumb{font-size:.85714286rem}.ui.small.breadcrumb{font-size:.92857143rem}.ui.breadcrumb{font-size:1rem}.ui.large.breadcrumb{font-size:1.14285714rem}.ui.big.breadcrumb{font-size:1.28571429rem}.ui.huge.breadcrumb{font-size:1.42857143rem}.ui.massive.breadcrumb{font-size:1.71428571rem}.ui.form{position:relative;max-width:100%}.ui.form>p{margin:1em 0}.ui.form .field{clear:both;margin:0 0 1em}.ui.form .field:last-child,.ui.form .fields:last-child .field{margin-bottom:0}.ui.form .fields .field{clear:both;margin:0}.ui.form .field>label{display:block;margin:0 0 .28571429rem;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form input:not([type]),.ui.form input[type=text],.ui.form input[type=email],.ui.form input[type=search],.ui.form input[type=password],.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=tel],.ui.form input[type=time],.ui.form input[type=url],.ui.form input[type=number],.ui.form textarea{width:100%;vertical-align:top}.ui.form ::-webkit-datetime-edit,.ui.form ::-webkit-inner-spin-button{height:1.2142em}.ui.form input:not([type]),.ui.form input[type=text],.ui.form input[type=email],.ui.form input[type=search],.ui.form input[type=password],.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=tel],.ui.form input[type=time],.ui.form input[type=url],.ui.form input[type=number]{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0;outline:0;-webkit-appearance:none;tap-highlight-color:rgba(255,255,255,0);line-height:1.2142em;padding:.67861429em 1em;font-size:1em;background:#FFF;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form textarea{margin:0;-webkit-appearance:none;tap-highlight-color:rgba(255,255,255,0);padding:.78571429em 1em;background:#FFF;border:1px solid rgba(34,36,38,.15);outline:0;color:rgba(0,0,0,.87);border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease;font-size:1em;line-height:1.2857;resize:vertical}.ui.form textarea:not([rows]){height:12em;min-height:8em;max-height:24em}.ui.form input[type=checkbox],.ui.form textarea{vertical-align:top}.ui.form input.attached{width:auto}.ui.form select{display:block;height:auto;width:100%;background:#FFF;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;box-shadow:0 0 0 0 transparent inset;padding:.62em 1em;color:rgba(0,0,0,.87);-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form .field>.selection.dropdown{width:100%}.ui.form .field>.selection.dropdown>.dropdown.icon{float:right}.ui.form .inline.field>.selection.dropdown,.ui.form .inline.fields .field>.selection.dropdown{width:auto}.ui.form .inline.field>.selection.dropdown>.dropdown.icon,.ui.form .inline.fields .field>.selection.dropdown>.dropdown.icon{float:none}.ui.form .field .ui.input,.ui.form .fields .field .ui.input,.ui.form .wide.field .ui.input{width:100%}.ui.form .inline.field:not(.wide) .ui.input,.ui.form .inline.fields .field:not(.wide) .ui.input{width:auto;vertical-align:middle}.ui.form .field .ui.input input,.ui.form .fields .field .ui.input input{width:auto}.ui.form .eight.fields .ui.input input,.ui.form .five.fields .ui.input input,.ui.form .four.fields .ui.input input,.ui.form .nine.fields .ui.input input,.ui.form .seven.fields .ui.input input,.ui.form .six.fields .ui.input input,.ui.form .ten.fields .ui.input input,.ui.form .three.fields .ui.input input,.ui.form .two.fields .ui.input input,.ui.form .wide.field .ui.input input{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;width:0}.ui.form .error.message,.ui.form .success.message,.ui.form .warning.message{display:none}.ui.form .message:first-child{margin-top:0}.ui.form .field .prompt.label{white-space:normal;background:#FFF!important;border:1px solid #E0B4B4!important;color:#9F3A38!important}.ui.form .inline.field .prompt,.ui.form .inline.fields .field .prompt{vertical-align:top;margin:-.25em 0 -.5em .5em}.ui.form .inline.field .prompt:before,.ui.form .inline.fields .field .prompt:before{border-width:0 0 1px 1px;bottom:auto;right:auto;top:50%;left:0}.ui.form .field.field input:-webkit-autofill{box-shadow:0 0 0 100px ivory inset!important;border-color:#E5DFA1!important}.ui.form .field.field input:-webkit-autofill:focus{box-shadow:0 0 0 100px ivory inset!important;border-color:#D5C315!important}.ui.form .error.error input:-webkit-autofill{box-shadow:0 0 0 100px #FFFAF0 inset!important;border-color:#E0B4B4!important}.ui.form ::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.form :-ms-input-placeholder{color:rgba(191,191,191,.87)}.ui.form ::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.form :focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.form :focus:-ms-input-placeholder{color:rgba(115,115,115,.87)}.ui.form :focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.form .error ::-webkit-input-placeholder{color:#e7bdbc}.ui.form .error :-ms-input-placeholder{color:#e7bdbc!important}.ui.form .error ::-moz-placeholder{color:#e7bdbc}.ui.form .error :focus::-webkit-input-placeholder{color:#da9796}.ui.form .error :focus:-ms-input-placeholder{color:#da9796!important}.ui.form .error :focus::-moz-placeholder{color:#da9796}.ui.form input:not([type]):focus,.ui.form input[type=text]:focus,.ui.form input[type=email]:focus,.ui.form input[type=search]:focus,.ui.form input[type=password]:focus,.ui.form input[type=date]:focus,.ui.form input[type=datetime-local]:focus,.ui.form input[type=tel]:focus,.ui.form input[type=time]:focus,.ui.form input[type=url]:focus,.ui.form input[type=number]:focus{color:rgba(0,0,0,.95);border-color:#85B7D9;border-radius:.28571429rem;background:#FFF;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset}.ui.form textarea:focus{color:rgba(0,0,0,.95);border-color:#85B7D9;border-radius:.28571429rem;background:#FFF;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;-webkit-appearance:none}.ui.form.success .success.message:not(:empty){display:block}.ui.form.success .compact.success.message:not(:empty){display:inline-block}.ui.form.success .icon.success.message:not(:empty){display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui.form.warning .warning.message:not(:empty){display:block}.ui.form.warning .compact.warning.message:not(:empty){display:inline-block}.ui.form.warning .icon.warning.message:not(:empty){display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui.form.error .error.message:not(:empty){display:block}.ui.form.error .compact.error.message:not(:empty){display:inline-block}.ui.form.error .icon.error.message:not(:empty){display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui.form .field.error .input,.ui.form .field.error label,.ui.form .fields.error .field .input,.ui.form .fields.error .field label{color:#9F3A38}.ui.form .field.error .corner.label,.ui.form .fields.error .field .corner.label{border-color:#9F3A38;color:#FFF}.ui.form .field.error input:not([type]),.ui.form .field.error input[type=text],.ui.form .field.error input[type=email],.ui.form .field.error input[type=search],.ui.form .field.error input[type=password],.ui.form .field.error input[type=date],.ui.form .field.error input[type=datetime-local],.ui.form .field.error input[type=tel],.ui.form .field.error input[type=time],.ui.form .field.error input[type=url],.ui.form .field.error input[type=number],.ui.form .field.error select,.ui.form .field.error textarea,.ui.form .fields.error .field input:not([type]),.ui.form .fields.error .field input[type=text],.ui.form .fields.error .field input[type=email],.ui.form .fields.error .field input[type=search],.ui.form .fields.error .field input[type=password],.ui.form .fields.error .field input[type=date],.ui.form .fields.error .field input[type=datetime-local],.ui.form .fields.error .field input[type=tel],.ui.form .fields.error .field input[type=time],.ui.form .fields.error .field input[type=url],.ui.form .fields.error .field input[type=number],.ui.form .fields.error .field select,.ui.form .fields.error .field textarea{background:#FFF6F6;border-color:#E0B4B4;color:#9F3A38;border-radius:'';box-shadow:none}.ui.form .field.error input:not([type]):focus,.ui.form .field.error input[type=text]:focus,.ui.form .field.error input[type=email]:focus,.ui.form .field.error input[type=search]:focus,.ui.form .field.error input[type=password]:focus,.ui.form .field.error input[type=date]:focus,.ui.form .field.error input[type=datetime-local]:focus,.ui.form .field.error input[type=tel]:focus,.ui.form .field.error input[type=time]:focus,.ui.form .field.error input[type=url]:focus,.ui.form .field.error input[type=number]:focus,.ui.form .field.error select:focus,.ui.form .field.error textarea:focus{background:#FFF6F6;border-color:#E0B4B4;color:#9F3A38;-webkit-appearance:none;box-shadow:none}.ui.form .field.error select{-webkit-appearance:menulist-button}.ui.form .field.error .ui.dropdown,.ui.form .field.error .ui.dropdown .item,.ui.form .field.error .ui.dropdown .text,.ui.form .fields.error .field .ui.dropdown,.ui.form .fields.error .field .ui.dropdown .item{background:#FFF6F6;color:#9F3A38}.ui.form .field.error .ui.dropdown,.ui.form .field.error .ui.dropdown:hover,.ui.form .fields.error .field .ui.dropdown,.ui.form .fields.error .field .ui.dropdown:hover{border-color:#E0B4B4!important}.ui.form .field.error .ui.dropdown:hover .menu,.ui.form .fields.error .field .ui.dropdown:hover .menu{border-color:#E0B4B4}.ui.form .field.error .ui.multiple.selection.dropdown>.label,.ui.form .fields.error .field .ui.multiple.selection.dropdown>.label{background-color:#EACBCB;color:#9F3A38}.ui.form .field.error .ui.dropdown .menu .item:hover,.ui.form .field.error .ui.dropdown .menu .selected.item,.ui.form .fields.error .field .ui.dropdown .menu .item:hover,.ui.form .fields.error .field .ui.dropdown .menu .selected.item{background-color:#FBE7E7}.ui.form .field.error .ui.dropdown .menu .active.item,.ui.form .fields.error .field .ui.dropdown .menu .active.item{background-color:#FDCFCF!important}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label{color:#9F3A38}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label:before{background:#FFF6F6;border-color:#E0B4B4}.ui.form .field.error .checkbox .box:after,.ui.form .field.error .checkbox label:after,.ui.form .fields.error .field .checkbox .box:after,.ui.form .fields.error .field .checkbox label:after{color:#9F3A38}.ui.form .disabled.field,.ui.form .disabled.fields .field,.ui.form .field :disabled{pointer-events:none;opacity:.45}.ui.form .field.disabled label{opacity:.45}.ui.form .field.disabled :disabled{opacity:1}.ui.loading.form{position:relative;cursor:default;point-events:none}.ui.loading.form:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;z-index:100}.ui.loading.form:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:form-spin .6s linear;animation:form-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 rgba(0,0,0,.1) rgba(0,0,0,.1);border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}@-webkit-keyframes form-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes form-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.form .required.field>.checkbox:after,.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>label:after{margin:-.2em 0 0 .2em;content:'*';color:#DB2828}.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>label:after{display:inline-block;vertical-align:top}.ui.form .required.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after{position:absolute;top:0;left:100%}.ui.form .inverted.segment .ui.checkbox .box,.ui.form .inverted.segment .ui.checkbox label,.ui.form .inverted.segment label,.ui.inverted.form .inline.field>label,.ui.inverted.form .inline.field>p,.ui.inverted.form .inline.fields .field>label,.ui.inverted.form .inline.fields .field>p,.ui.inverted.form .inline.fields>label,.ui.inverted.form .ui.checkbox .box,.ui.inverted.form .ui.checkbox label,.ui.inverted.form label{color:rgba(255,255,255,.9)}.ui.inverted.form input:not([type]),.ui.inverted.form input[type=text],.ui.inverted.form input[type=email],.ui.inverted.form input[type=search],.ui.inverted.form input[type=password],.ui.inverted.form input[type=date],.ui.inverted.form input[type=datetime-local],.ui.inverted.form input[type=tel],.ui.inverted.form input[type=time],.ui.inverted.form input[type=url],.ui.inverted.form input[type=number]{background:#FFF;border-color:rgba(255,255,255,.1);color:rgba(0,0,0,.87);box-shadow:none}.ui.form .grouped.fields{display:block;margin:0 0 1em}.ui.form .grouped.fields:last-child{margin-bottom:0}.ui.form .grouped.fields>label{margin:0 0 .28571429rem;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form .grouped.fields .field,.ui.form .grouped.inline.fields .field{display:block;margin:.5em 0;padding:0}.ui.form .fields{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin:0 -.5em 1em}.ui.form .fields>.field{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding-left:.5em;padding-right:.5em}.ui.form .fields>.field:first-child{border-left:none;box-shadow:none}.ui.form .two.fields>.field,.ui.form .two.fields>.fields{width:50%}.ui.form .three.fields>.field,.ui.form .three.fields>.fields{width:33.33333333%}.ui.form .four.fields>.field,.ui.form .four.fields>.fields{width:25%}.ui.form .five.fields>.field,.ui.form .five.fields>.fields{width:20%}.ui.form .six.fields>.field,.ui.form .six.fields>.fields{width:16.66666667%}.ui.form .seven.fields>.field,.ui.form .seven.fields>.fields{width:14.28571429%}.ui.form .eight.fields>.field,.ui.form .eight.fields>.fields{width:12.5%}.ui.form .nine.fields>.field,.ui.form .nine.fields>.fields{width:11.11111111%}.ui.form .ten.fields>.field,.ui.form .ten.fields>.fields{width:10%}@media only screen and (max-width:767px){.ui.form .fields{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.form .eight.fields>.field,.ui.form .eight.fields>.fields,.ui.form .five.fields>.field,.ui.form .five.fields>.fields,.ui.form .four.fields>.field,.ui.form .four.fields>.fields,.ui.form .nine.fields>.field,.ui.form .nine.fields>.fields,.ui.form .seven.fields>.field,.ui.form .seven.fields>.fields,.ui.form .six.fields>.field,.ui.form .six.fields>.fields,.ui.form .ten.fields>.field,.ui.form .ten.fields>.fields,.ui.form .three.fields>.field,.ui.form .three.fields>.fields,.ui.form .two.fields>.field,.ui.form .two.fields>.fields,.ui.form [class*="equal width"].fields>.field,.ui[class*="equal width"].form .fields>.field{width:100%!important;margin:0 0 1em}}.ui.form .fields .wide.field{width:6.25%;padding-left:.5em;padding-right:.5em}.ui.form .one.wide.field{width:6.25%!important}.ui.form .two.wide.field{width:12.5%!important}.ui.form .three.wide.field{width:18.75%!important}.ui.form .four.wide.field{width:25%!important}.ui.form .five.wide.field{width:31.25%!important}.ui.form .six.wide.field{width:37.5%!important}.ui.form .seven.wide.field{width:43.75%!important}.ui.form .eight.wide.field{width:50%!important}.ui.form .nine.wide.field{width:56.25%!important}.ui.form .ten.wide.field{width:62.5%!important}.ui.form .eleven.wide.field{width:68.75%!important}.ui.form .twelve.wide.field{width:75%!important}.ui.form .thirteen.wide.field{width:81.25%!important}.ui.form .fourteen.wide.field{width:87.5%!important}.ui.form .fifteen.wide.field{width:93.75%!important}.ui.form .sixteen.wide.field{width:100%!important}@media only screen and (max-width:767px){.ui.form .fields>.eight.wide.field,.ui.form .fields>.eleven.wide.field,.ui.form .fields>.fifteen.wide.field,.ui.form .fields>.five.wide.field,.ui.form .fields>.four.wide.field,.ui.form .fields>.fourteen.wide.field,.ui.form .fields>.nine.wide.field,.ui.form .fields>.seven.wide.field,.ui.form .fields>.six.wide.field,.ui.form .fields>.sixteen.wide.field,.ui.form .fields>.ten.wide.field,.ui.form .fields>.thirteen.wide.field,.ui.form .fields>.three.wide.field,.ui.form .fields>.twelve.wide.field,.ui.form .fields>.two.wide.field,.ui.form .five.fields>.field,.ui.form .five.fields>.fields,.ui.form .four.fields>.field,.ui.form .four.fields>.fields,.ui.form .three.fields>.field,.ui.form .three.fields>.fields,.ui.form .two.fields>.field,.ui.form .two.fields>.fields{width:100%!important}.ui.form .fields{margin-bottom:0}}.ui.form [class*="equal width"].fields>.field,.ui[class*="equal width"].form .fields>.field{width:100%;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.ui.form .inline.fields{margin:0 0 1em;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center}.ui.form .inline.fields .field{margin:0;padding:0 1em 0 0}.ui.form .inline.field>label,.ui.form .inline.field>p,.ui.form .inline.fields .field>label,.ui.form .inline.fields .field>p,.ui.form .inline.fields>label{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:baseline;font-size:.92857143em;font-weight:700;color:rgba(0,0,0,.87);text-transform:none}.ui.form .inline.fields>label{margin:.035714em 1em 0 0}.ui.form .inline.field>input,.ui.form .inline.field>select,.ui.form .inline.fields .field>input,.ui.form .inline.fields .field>select{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:middle;font-size:1em}.ui.form .inline.field>:first-child,.ui.form .inline.fields .field>:first-child{margin:0 .85714286em 0 0}.ui.form .inline.field>:only-child,.ui.form .inline.fields .field>:only-child{margin:0}.ui.form .inline.fields .wide.field{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui.form .inline.fields .wide.field>input,.ui.form .inline.fields .wide.field>select{width:100%}.ui.mini.form{font-size:.78571429rem}.ui.tiny.form{font-size:.85714286rem}.ui.small.form{font-size:.92857143rem}.ui.form{font-size:1rem}.ui.large.form{font-size:1.14285714rem}.ui.big.form{font-size:1.28571429rem}.ui.huge.form{font-size:1.42857143rem}.ui.massive.form{font-size:1.71428571rem}.ui.grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;padding:0;margin:-1rem}.ui.relaxed.grid{margin-left:-1.5rem;margin-right:-1.5rem}.ui[class*="very relaxed"].grid{margin-left:-2.5rem;margin-right:-2.5rem}.ui.grid+.grid{margin-top:1rem}.ui.grid>.column:not(.row),.ui.grid>.row>.column{position:relative;display:inline-block;width:6.25%;padding-left:1rem;padding-right:1rem;vertical-align:top}.ui.grid>*{padding-left:1rem;padding-right:1rem}.ui.grid>.row{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:inherit;-webkit-justify-content:inherit;-ms-flex-pack:inherit;justify-content:inherit;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%!important;padding:1rem 0}.ui.grid>.column:not(.row){padding-top:1rem;padding-bottom:1rem}.ui.grid>.row>.column{margin-top:0;margin-bottom:0}.ui.grid>.row>.column>img,.ui.grid>.row>img{max-width:100%}.ui.grid>.ui.grid:first-child{margin-top:0}.ui.grid>.ui.grid:last-child{margin-bottom:0}.ui.aligned.grid .column>.segment:not(.compact):not(.attached),.ui.grid .aligned.row>.column>.segment:not(.compact):not(.attached){width:100%}.ui.grid .row+.ui.divider{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin:1rem}.ui.grid .column+.ui.vertical.divider{height:calc(50% - 1rem)}.ui.grid>.column:last-child>.horizontal.segment,.ui.grid>.row>.column:last-child>.horizontal.segment{box-shadow:none}@media only screen and (max-width:767px){.ui.page.grid{width:auto;padding-left:0;padding-right:0;margin-left:0;margin-right:0}}@media only screen and (min-width:768px) and (max-width:991px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:2em;padding-right:2em}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:3%;padding-right:3%}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:15%;padding-right:15%}}@media only screen and (min-width:1920px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:23%;padding-right:23%}}.ui.grid>.column:only-child,.ui.grid>.row>.column:only-child,.ui[class*="one column"].grid>.column:not(.row),.ui[class*="one column"].grid>.row>.column{width:100%}.ui[class*="two column"].grid>.column:not(.row),.ui[class*="two column"].grid>.row>.column{width:50%}.ui[class*="three column"].grid>.column:not(.row),.ui[class*="three column"].grid>.row>.column{width:33.33333333%}.ui[class*="four column"].grid>.column:not(.row),.ui[class*="four column"].grid>.row>.column{width:25%}.ui[class*="five column"].grid>.column:not(.row),.ui[class*="five column"].grid>.row>.column{width:20%}.ui[class*="six column"].grid>.column:not(.row),.ui[class*="six column"].grid>.row>.column{width:16.66666667%}.ui[class*="seven column"].grid>.column:not(.row),.ui[class*="seven column"].grid>.row>.column{width:14.28571429%}.ui[class*="eight column"].grid>.column:not(.row),.ui[class*="eight column"].grid>.row>.column{width:12.5%}.ui[class*="nine column"].grid>.column:not(.row),.ui[class*="nine column"].grid>.row>.column{width:11.11111111%}.ui[class*="ten column"].grid>.column:not(.row),.ui[class*="ten column"].grid>.row>.column{width:10%}.ui[class*="eleven column"].grid>.column:not(.row),.ui[class*="eleven column"].grid>.row>.column{width:9.09090909%}.ui[class*="twelve column"].grid>.column:not(.row),.ui[class*="twelve column"].grid>.row>.column{width:8.33333333%}.ui[class*="thirteen column"].grid>.column:not(.row),.ui[class*="thirteen column"].grid>.row>.column{width:7.69230769%}.ui[class*="fourteen column"].grid>.column:not(.row),.ui[class*="fourteen column"].grid>.row>.column{width:7.14285714%}.ui[class*="fifteen column"].grid>.column:not(.row),.ui[class*="fifteen column"].grid>.row>.column{width:6.66666667%}.ui[class*="sixteen column"].grid>.column:not(.row),.ui[class*="sixteen column"].grid>.row>.column{width:6.25%}.ui.grid>[class*="one column"].row>.column{width:100%!important}.ui.grid>[class*="two column"].row>.column{width:50%!important}.ui.grid>[class*="three column"].row>.column{width:33.33333333%!important}.ui.grid>[class*="four column"].row>.column{width:25%!important}.ui.grid>[class*="five column"].row>.column{width:20%!important}.ui.grid>[class*="six column"].row>.column{width:16.66666667%!important}.ui.grid>[class*="seven column"].row>.column{width:14.28571429%!important}.ui.grid>[class*="eight column"].row>.column{width:12.5%!important}.ui.grid>[class*="nine column"].row>.column{width:11.11111111%!important}.ui.grid>[class*="ten column"].row>.column{width:10%!important}.ui.grid>[class*="eleven column"].row>.column{width:9.09090909%!important}.ui.grid>[class*="twelve column"].row>.column{width:8.33333333%!important}.ui.grid>[class*="thirteen column"].row>.column{width:7.69230769%!important}.ui.grid>[class*="fourteen column"].row>.column{width:7.14285714%!important}.ui.grid>[class*="fifteen column"].row>.column{width:6.66666667%!important}.ui.grid>[class*="sixteen column"].row>.column{width:6.25%!important}.ui.celled.page.grid{box-shadow:none}.ui.column.grid>[class*="one wide"].column,.ui.grid>.column.row>[class*="one wide"].column,.ui.grid>.row>[class*="one wide"].column,.ui.grid>[class*="one wide"].column{width:6.25%!important}.ui.column.grid>[class*="two wide"].column,.ui.grid>.column.row>[class*="two wide"].column,.ui.grid>.row>[class*="two wide"].column,.ui.grid>[class*="two wide"].column{width:12.5%!important}.ui.column.grid>[class*="three wide"].column,.ui.grid>.column.row>[class*="three wide"].column,.ui.grid>.row>[class*="three wide"].column,.ui.grid>[class*="three wide"].column{width:18.75%!important}.ui.column.grid>[class*="four wide"].column,.ui.grid>.column.row>[class*="four wide"].column,.ui.grid>.row>[class*="four wide"].column,.ui.grid>[class*="four wide"].column{width:25%!important}.ui.column.grid>[class*="five wide"].column,.ui.grid>.column.row>[class*="five wide"].column,.ui.grid>.row>[class*="five wide"].column,.ui.grid>[class*="five wide"].column{width:31.25%!important}.ui.column.grid>[class*="six wide"].column,.ui.grid>.column.row>[class*="six wide"].column,.ui.grid>.row>[class*="six wide"].column,.ui.grid>[class*="six wide"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide"].column,.ui.grid>.column.row>[class*="seven wide"].column,.ui.grid>.row>[class*="seven wide"].column,.ui.grid>[class*="seven wide"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide"].column,.ui.grid>.column.row>[class*="eight wide"].column,.ui.grid>.row>[class*="eight wide"].column,.ui.grid>[class*="eight wide"].column{width:50%!important}.ui.column.grid>[class*="nine wide"].column,.ui.grid>.column.row>[class*="nine wide"].column,.ui.grid>.row>[class*="nine wide"].column,.ui.grid>[class*="nine wide"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide"].column,.ui.grid>.column.row>[class*="ten wide"].column,.ui.grid>.row>[class*="ten wide"].column,.ui.grid>[class*="ten wide"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide"].column,.ui.grid>.column.row>[class*="eleven wide"].column,.ui.grid>.row>[class*="eleven wide"].column,.ui.grid>[class*="eleven wide"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide"].column,.ui.grid>.column.row>[class*="twelve wide"].column,.ui.grid>.row>[class*="twelve wide"].column,.ui.grid>[class*="twelve wide"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide"].column,.ui.grid>.column.row>[class*="thirteen wide"].column,.ui.grid>.row>[class*="thirteen wide"].column,.ui.grid>[class*="thirteen wide"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide"].column,.ui.grid>.column.row>[class*="fourteen wide"].column,.ui.grid>.row>[class*="fourteen wide"].column,.ui.grid>[class*="fourteen wide"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide"].column,.ui.grid>.column.row>[class*="fifteen wide"].column,.ui.grid>.row>[class*="fifteen wide"].column,.ui.grid>[class*="fifteen wide"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide"].column,.ui.grid>.column.row>[class*="sixteen wide"].column,.ui.grid>.row>[class*="sixteen wide"].column,.ui.grid>[class*="sixteen wide"].column{width:100%!important}@media only screen and (min-width:320px) and (max-width:767px){.ui.column.grid>[class*="one wide mobile"].column,.ui.grid>.column.row>[class*="one wide mobile"].column,.ui.grid>.row>[class*="one wide mobile"].column,.ui.grid>[class*="one wide mobile"].column{width:6.25%!important}.ui.column.grid>[class*="two wide mobile"].column,.ui.grid>.column.row>[class*="two wide mobile"].column,.ui.grid>.row>[class*="two wide mobile"].column,.ui.grid>[class*="two wide mobile"].column{width:12.5%!important}.ui.column.grid>[class*="three wide mobile"].column,.ui.grid>.column.row>[class*="three wide mobile"].column,.ui.grid>.row>[class*="three wide mobile"].column,.ui.grid>[class*="three wide mobile"].column{width:18.75%!important}.ui.column.grid>[class*="four wide mobile"].column,.ui.grid>.column.row>[class*="four wide mobile"].column,.ui.grid>.row>[class*="four wide mobile"].column,.ui.grid>[class*="four wide mobile"].column{width:25%!important}.ui.column.grid>[class*="five wide mobile"].column,.ui.grid>.column.row>[class*="five wide mobile"].column,.ui.grid>.row>[class*="five wide mobile"].column,.ui.grid>[class*="five wide mobile"].column{width:31.25%!important}.ui.column.grid>[class*="six wide mobile"].column,.ui.grid>.column.row>[class*="six wide mobile"].column,.ui.grid>.row>[class*="six wide mobile"].column,.ui.grid>[class*="six wide mobile"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide mobile"].column,.ui.grid>.column.row>[class*="seven wide mobile"].column,.ui.grid>.row>[class*="seven wide mobile"].column,.ui.grid>[class*="seven wide mobile"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide mobile"].column,.ui.grid>.column.row>[class*="eight wide mobile"].column,.ui.grid>.row>[class*="eight wide mobile"].column,.ui.grid>[class*="eight wide mobile"].column{width:50%!important}.ui.column.grid>[class*="nine wide mobile"].column,.ui.grid>.column.row>[class*="nine wide mobile"].column,.ui.grid>.row>[class*="nine wide mobile"].column,.ui.grid>[class*="nine wide mobile"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide mobile"].column,.ui.grid>.column.row>[class*="ten wide mobile"].column,.ui.grid>.row>[class*="ten wide mobile"].column,.ui.grid>[class*="ten wide mobile"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide mobile"].column,.ui.grid>.column.row>[class*="eleven wide mobile"].column,.ui.grid>.row>[class*="eleven wide mobile"].column,.ui.grid>[class*="eleven wide mobile"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide mobile"].column,.ui.grid>.column.row>[class*="twelve wide mobile"].column,.ui.grid>.row>[class*="twelve wide mobile"].column,.ui.grid>[class*="twelve wide mobile"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide mobile"].column,.ui.grid>.column.row>[class*="thirteen wide mobile"].column,.ui.grid>.row>[class*="thirteen wide mobile"].column,.ui.grid>[class*="thirteen wide mobile"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide mobile"].column,.ui.grid>.column.row>[class*="fourteen wide mobile"].column,.ui.grid>.row>[class*="fourteen wide mobile"].column,.ui.grid>[class*="fourteen wide mobile"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide mobile"].column,.ui.grid>.column.row>[class*="fifteen wide mobile"].column,.ui.grid>.row>[class*="fifteen wide mobile"].column,.ui.grid>[class*="fifteen wide mobile"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide mobile"].column,.ui.grid>.column.row>[class*="sixteen wide mobile"].column,.ui.grid>.row>[class*="sixteen wide mobile"].column,.ui.grid>[class*="sixteen wide mobile"].column{width:100%!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.column.grid>[class*="one wide tablet"].column,.ui.grid>.column.row>[class*="one wide tablet"].column,.ui.grid>.row>[class*="one wide tablet"].column,.ui.grid>[class*="one wide tablet"].column{width:6.25%!important}.ui.column.grid>[class*="two wide tablet"].column,.ui.grid>.column.row>[class*="two wide tablet"].column,.ui.grid>.row>[class*="two wide tablet"].column,.ui.grid>[class*="two wide tablet"].column{width:12.5%!important}.ui.column.grid>[class*="three wide tablet"].column,.ui.grid>.column.row>[class*="three wide tablet"].column,.ui.grid>.row>[class*="three wide tablet"].column,.ui.grid>[class*="three wide tablet"].column{width:18.75%!important}.ui.column.grid>[class*="four wide tablet"].column,.ui.grid>.column.row>[class*="four wide tablet"].column,.ui.grid>.row>[class*="four wide tablet"].column,.ui.grid>[class*="four wide tablet"].column{width:25%!important}.ui.column.grid>[class*="five wide tablet"].column,.ui.grid>.column.row>[class*="five wide tablet"].column,.ui.grid>.row>[class*="five wide tablet"].column,.ui.grid>[class*="five wide tablet"].column{width:31.25%!important}.ui.column.grid>[class*="six wide tablet"].column,.ui.grid>.column.row>[class*="six wide tablet"].column,.ui.grid>.row>[class*="six wide tablet"].column,.ui.grid>[class*="six wide tablet"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide tablet"].column,.ui.grid>.column.row>[class*="seven wide tablet"].column,.ui.grid>.row>[class*="seven wide tablet"].column,.ui.grid>[class*="seven wide tablet"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide tablet"].column,.ui.grid>.column.row>[class*="eight wide tablet"].column,.ui.grid>.row>[class*="eight wide tablet"].column,.ui.grid>[class*="eight wide tablet"].column{width:50%!important}.ui.column.grid>[class*="nine wide tablet"].column,.ui.grid>.column.row>[class*="nine wide tablet"].column,.ui.grid>.row>[class*="nine wide tablet"].column,.ui.grid>[class*="nine wide tablet"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide tablet"].column,.ui.grid>.column.row>[class*="ten wide tablet"].column,.ui.grid>.row>[class*="ten wide tablet"].column,.ui.grid>[class*="ten wide tablet"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide tablet"].column,.ui.grid>.column.row>[class*="eleven wide tablet"].column,.ui.grid>.row>[class*="eleven wide tablet"].column,.ui.grid>[class*="eleven wide tablet"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide tablet"].column,.ui.grid>.column.row>[class*="twelve wide tablet"].column,.ui.grid>.row>[class*="twelve wide tablet"].column,.ui.grid>[class*="twelve wide tablet"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide tablet"].column,.ui.grid>.column.row>[class*="thirteen wide tablet"].column,.ui.grid>.row>[class*="thirteen wide tablet"].column,.ui.grid>[class*="thirteen wide tablet"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide tablet"].column,.ui.grid>.column.row>[class*="fourteen wide tablet"].column,.ui.grid>.row>[class*="fourteen wide tablet"].column,.ui.grid>[class*="fourteen wide tablet"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide tablet"].column,.ui.grid>.column.row>[class*="fifteen wide tablet"].column,.ui.grid>.row>[class*="fifteen wide tablet"].column,.ui.grid>[class*="fifteen wide tablet"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide tablet"].column,.ui.grid>.column.row>[class*="sixteen wide tablet"].column,.ui.grid>.row>[class*="sixteen wide tablet"].column,.ui.grid>[class*="sixteen wide tablet"].column{width:100%!important}}@media only screen and (min-width:992px){.ui.column.grid>[class*="one wide computer"].column,.ui.grid>.column.row>[class*="one wide computer"].column,.ui.grid>.row>[class*="one wide computer"].column,.ui.grid>[class*="one wide computer"].column{width:6.25%!important}.ui.column.grid>[class*="two wide computer"].column,.ui.grid>.column.row>[class*="two wide computer"].column,.ui.grid>.row>[class*="two wide computer"].column,.ui.grid>[class*="two wide computer"].column{width:12.5%!important}.ui.column.grid>[class*="three wide computer"].column,.ui.grid>.column.row>[class*="three wide computer"].column,.ui.grid>.row>[class*="three wide computer"].column,.ui.grid>[class*="three wide computer"].column{width:18.75%!important}.ui.column.grid>[class*="four wide computer"].column,.ui.grid>.column.row>[class*="four wide computer"].column,.ui.grid>.row>[class*="four wide computer"].column,.ui.grid>[class*="four wide computer"].column{width:25%!important}.ui.column.grid>[class*="five wide computer"].column,.ui.grid>.column.row>[class*="five wide computer"].column,.ui.grid>.row>[class*="five wide computer"].column,.ui.grid>[class*="five wide computer"].column{width:31.25%!important}.ui.column.grid>[class*="six wide computer"].column,.ui.grid>.column.row>[class*="six wide computer"].column,.ui.grid>.row>[class*="six wide computer"].column,.ui.grid>[class*="six wide computer"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide computer"].column,.ui.grid>.column.row>[class*="seven wide computer"].column,.ui.grid>.row>[class*="seven wide computer"].column,.ui.grid>[class*="seven wide computer"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide computer"].column,.ui.grid>.column.row>[class*="eight wide computer"].column,.ui.grid>.row>[class*="eight wide computer"].column,.ui.grid>[class*="eight wide computer"].column{width:50%!important}.ui.column.grid>[class*="nine wide computer"].column,.ui.grid>.column.row>[class*="nine wide computer"].column,.ui.grid>.row>[class*="nine wide computer"].column,.ui.grid>[class*="nine wide computer"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide computer"].column,.ui.grid>.column.row>[class*="ten wide computer"].column,.ui.grid>.row>[class*="ten wide computer"].column,.ui.grid>[class*="ten wide computer"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide computer"].column,.ui.grid>.column.row>[class*="eleven wide computer"].column,.ui.grid>.row>[class*="eleven wide computer"].column,.ui.grid>[class*="eleven wide computer"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide computer"].column,.ui.grid>.column.row>[class*="twelve wide computer"].column,.ui.grid>.row>[class*="twelve wide computer"].column,.ui.grid>[class*="twelve wide computer"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide computer"].column,.ui.grid>.column.row>[class*="thirteen wide computer"].column,.ui.grid>.row>[class*="thirteen wide computer"].column,.ui.grid>[class*="thirteen wide computer"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide computer"].column,.ui.grid>.column.row>[class*="fourteen wide computer"].column,.ui.grid>.row>[class*="fourteen wide computer"].column,.ui.grid>[class*="fourteen wide computer"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide computer"].column,.ui.grid>.column.row>[class*="fifteen wide computer"].column,.ui.grid>.row>[class*="fifteen wide computer"].column,.ui.grid>[class*="fifteen wide computer"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide computer"].column,.ui.grid>.column.row>[class*="sixteen wide computer"].column,.ui.grid>.row>[class*="sixteen wide computer"].column,.ui.grid>[class*="sixteen wide computer"].column{width:100%!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.column.grid>[class*="one wide large screen"].column,.ui.grid>.column.row>[class*="one wide large screen"].column,.ui.grid>.row>[class*="one wide large screen"].column,.ui.grid>[class*="one wide large screen"].column{width:6.25%!important}.ui.column.grid>[class*="two wide large screen"].column,.ui.grid>.column.row>[class*="two wide large screen"].column,.ui.grid>.row>[class*="two wide large screen"].column,.ui.grid>[class*="two wide large screen"].column{width:12.5%!important}.ui.column.grid>[class*="three wide large screen"].column,.ui.grid>.column.row>[class*="three wide large screen"].column,.ui.grid>.row>[class*="three wide large screen"].column,.ui.grid>[class*="three wide large screen"].column{width:18.75%!important}.ui.column.grid>[class*="four wide large screen"].column,.ui.grid>.column.row>[class*="four wide large screen"].column,.ui.grid>.row>[class*="four wide large screen"].column,.ui.grid>[class*="four wide large screen"].column{width:25%!important}.ui.column.grid>[class*="five wide large screen"].column,.ui.grid>.column.row>[class*="five wide large screen"].column,.ui.grid>.row>[class*="five wide large screen"].column,.ui.grid>[class*="five wide large screen"].column{width:31.25%!important}.ui.column.grid>[class*="six wide large screen"].column,.ui.grid>.column.row>[class*="six wide large screen"].column,.ui.grid>.row>[class*="six wide large screen"].column,.ui.grid>[class*="six wide large screen"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide large screen"].column,.ui.grid>.column.row>[class*="seven wide large screen"].column,.ui.grid>.row>[class*="seven wide large screen"].column,.ui.grid>[class*="seven wide large screen"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide large screen"].column,.ui.grid>.column.row>[class*="eight wide large screen"].column,.ui.grid>.row>[class*="eight wide large screen"].column,.ui.grid>[class*="eight wide large screen"].column{width:50%!important}.ui.column.grid>[class*="nine wide large screen"].column,.ui.grid>.column.row>[class*="nine wide large screen"].column,.ui.grid>.row>[class*="nine wide large screen"].column,.ui.grid>[class*="nine wide large screen"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide large screen"].column,.ui.grid>.column.row>[class*="ten wide large screen"].column,.ui.grid>.row>[class*="ten wide large screen"].column,.ui.grid>[class*="ten wide large screen"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide large screen"].column,.ui.grid>.column.row>[class*="eleven wide large screen"].column,.ui.grid>.row>[class*="eleven wide large screen"].column,.ui.grid>[class*="eleven wide large screen"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide large screen"].column,.ui.grid>.column.row>[class*="twelve wide large screen"].column,.ui.grid>.row>[class*="twelve wide large screen"].column,.ui.grid>[class*="twelve wide large screen"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide large screen"].column,.ui.grid>.column.row>[class*="thirteen wide large screen"].column,.ui.grid>.row>[class*="thirteen wide large screen"].column,.ui.grid>[class*="thirteen wide large screen"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide large screen"].column,.ui.grid>.column.row>[class*="fourteen wide large screen"].column,.ui.grid>.row>[class*="fourteen wide large screen"].column,.ui.grid>[class*="fourteen wide large screen"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide large screen"].column,.ui.grid>.column.row>[class*="fifteen wide large screen"].column,.ui.grid>.row>[class*="fifteen wide large screen"].column,.ui.grid>[class*="fifteen wide large screen"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide large screen"].column,.ui.grid>.column.row>[class*="sixteen wide large screen"].column,.ui.grid>.row>[class*="sixteen wide large screen"].column,.ui.grid>[class*="sixteen wide large screen"].column{width:100%!important}}@media only screen and (min-width:1920px){.ui.column.grid>[class*="one wide widescreen"].column,.ui.grid>.column.row>[class*="one wide widescreen"].column,.ui.grid>.row>[class*="one wide widescreen"].column,.ui.grid>[class*="one wide widescreen"].column{width:6.25%!important}.ui.column.grid>[class*="two wide widescreen"].column,.ui.grid>.column.row>[class*="two wide widescreen"].column,.ui.grid>.row>[class*="two wide widescreen"].column,.ui.grid>[class*="two wide widescreen"].column{width:12.5%!important}.ui.column.grid>[class*="three wide widescreen"].column,.ui.grid>.column.row>[class*="three wide widescreen"].column,.ui.grid>.row>[class*="three wide widescreen"].column,.ui.grid>[class*="three wide widescreen"].column{width:18.75%!important}.ui.column.grid>[class*="four wide widescreen"].column,.ui.grid>.column.row>[class*="four wide widescreen"].column,.ui.grid>.row>[class*="four wide widescreen"].column,.ui.grid>[class*="four wide widescreen"].column{width:25%!important}.ui.column.grid>[class*="five wide widescreen"].column,.ui.grid>.column.row>[class*="five wide widescreen"].column,.ui.grid>.row>[class*="five wide widescreen"].column,.ui.grid>[class*="five wide widescreen"].column{width:31.25%!important}.ui.column.grid>[class*="six wide widescreen"].column,.ui.grid>.column.row>[class*="six wide widescreen"].column,.ui.grid>.row>[class*="six wide widescreen"].column,.ui.grid>[class*="six wide widescreen"].column{width:37.5%!important}.ui.column.grid>[class*="seven wide widescreen"].column,.ui.grid>.column.row>[class*="seven wide widescreen"].column,.ui.grid>.row>[class*="seven wide widescreen"].column,.ui.grid>[class*="seven wide widescreen"].column{width:43.75%!important}.ui.column.grid>[class*="eight wide widescreen"].column,.ui.grid>.column.row>[class*="eight wide widescreen"].column,.ui.grid>.row>[class*="eight wide widescreen"].column,.ui.grid>[class*="eight wide widescreen"].column{width:50%!important}.ui.column.grid>[class*="nine wide widescreen"].column,.ui.grid>.column.row>[class*="nine wide widescreen"].column,.ui.grid>.row>[class*="nine wide widescreen"].column,.ui.grid>[class*="nine wide widescreen"].column{width:56.25%!important}.ui.column.grid>[class*="ten wide widescreen"].column,.ui.grid>.column.row>[class*="ten wide widescreen"].column,.ui.grid>.row>[class*="ten wide widescreen"].column,.ui.grid>[class*="ten wide widescreen"].column{width:62.5%!important}.ui.column.grid>[class*="eleven wide widescreen"].column,.ui.grid>.column.row>[class*="eleven wide widescreen"].column,.ui.grid>.row>[class*="eleven wide widescreen"].column,.ui.grid>[class*="eleven wide widescreen"].column{width:68.75%!important}.ui.column.grid>[class*="twelve wide widescreen"].column,.ui.grid>.column.row>[class*="twelve wide widescreen"].column,.ui.grid>.row>[class*="twelve wide widescreen"].column,.ui.grid>[class*="twelve wide widescreen"].column{width:75%!important}.ui.column.grid>[class*="thirteen wide widescreen"].column,.ui.grid>.column.row>[class*="thirteen wide widescreen"].column,.ui.grid>.row>[class*="thirteen wide widescreen"].column,.ui.grid>[class*="thirteen wide widescreen"].column{width:81.25%!important}.ui.column.grid>[class*="fourteen wide widescreen"].column,.ui.grid>.column.row>[class*="fourteen wide widescreen"].column,.ui.grid>.row>[class*="fourteen wide widescreen"].column,.ui.grid>[class*="fourteen wide widescreen"].column{width:87.5%!important}.ui.column.grid>[class*="fifteen wide widescreen"].column,.ui.grid>.column.row>[class*="fifteen wide widescreen"].column,.ui.grid>.row>[class*="fifteen wide widescreen"].column,.ui.grid>[class*="fifteen wide widescreen"].column{width:93.75%!important}.ui.column.grid>[class*="sixteen wide widescreen"].column,.ui.grid>.column.row>[class*="sixteen wide widescreen"].column,.ui.grid>.row>[class*="sixteen wide widescreen"].column,.ui.grid>[class*="sixteen wide widescreen"].column{width:100%!important}}.ui.centered.grid,.ui.centered.grid>.row,.ui.grid>.centered.row{text-align:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui.centered.grid>.column:not(.aligned):not(:justified):not(.row),.ui.centered.grid>.row>.column:not(.aligned):not(:justified),.ui.grid .centered.row>.column:not(.aligned):not(:justified){text-align:left}.ui.grid>.centered.column,.ui.grid>.row>.centered.column{display:block;margin-left:auto;margin-right:auto}.ui.grid>.relaxed.row>.column,.ui.relaxed.grid>.column:not(.row),.ui.relaxed.grid>.row>.column{padding-left:1.5rem;padding-right:1.5rem}.ui.grid>[class*="very relaxed"].row>.column,.ui[class*="very relaxed"].grid>.column:not(.row),.ui[class*="very relaxed"].grid>.row>.column{padding-left:2.5rem;padding-right:2.5rem}.ui.grid .relaxed.row+.ui.divider,.ui.relaxed.grid .row+.ui.divider{margin-left:1.5rem;margin-right:1.5rem}.ui.grid [class*="very relaxed"].row+.ui.divider,.ui[class*="very relaxed"].grid .row+.ui.divider{margin-left:2.5rem;margin-right:2.5rem}.ui.padded.grid:not(.vertically):not(.horizontally){margin:0!important}[class*="horizontally padded"].ui.grid{margin-left:0!important;margin-right:0!important}[class*="vertically padded"].ui.grid{margin-top:0!important;margin-bottom:0!important}.ui.grid [class*="left floated"].column{margin-right:auto}.ui.grid [class*="right floated"].column{margin-left:auto}.ui.divided.grid:not([class*="vertically divided"])>.column:not(.row),.ui.divided.grid:not([class*="vertically divided"])>.row>.column{box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="vertically divided"].grid>.column:not(.row),.ui[class*="vertically divided"].grid>.row>.column{margin-top:1rem;margin-bottom:1rem;padding-top:0;padding-bottom:0}.ui[class*="vertically divided"].grid>.row{margin-top:0;margin-bottom:0;position:relative}.ui.divided.grid:not([class*="vertically divided"])>.column:first-child,.ui.divided.grid:not([class*="vertically divided"])>.row>.column:first-child{box-shadow:none}.ui[class*="vertically divided"].grid>.row:first-child>.column{margin-top:0}.ui.grid>.divided.row>.column{box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui.grid>.divided.row>.column:first-child{box-shadow:none}.ui[class*="vertically divided"].grid>.row:before{position:absolute;content:"";top:0;left:0;width:calc(100% - 2rem);height:1px;margin:0 1rem;box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.padded.divided.grid:not(.vertically):not(.horizontally),[class*="horizontally padded"].ui.divided.grid{width:100%}.ui[class*="vertically divided"].grid>.row:first-child:before{box-shadow:none}.ui.inverted.divided.grid:not([class*="vertically divided"])>.column:not(.row),.ui.inverted.divided.grid:not([class*="vertically divided"])>.row>.column{box-shadow:-1px 0 0 0 rgba(255,255,255,.1)}.ui.inverted.divided.grid:not([class*="vertically divided"])>.column:not(.row):first-child,.ui.inverted.divided.grid:not([class*="vertically divided"])>.row>.column:first-child{box-shadow:none}.ui.inverted[class*="vertically divided"].grid>.row:before{box-shadow:0 -1px 0 0 rgba(255,255,255,.1)}.ui.relaxed[class*="vertically divided"].grid>.row:before{margin-left:1.5rem;margin-right:1.5rem;width:calc(100% - 3rem)}.ui[class*="very relaxed"][class*="vertically divided"].grid>.row:before{margin-left:5rem;margin-right:5rem;width:calc(100% - 5rem)}.ui.celled.grid{width:100%;margin:1em 0;box-shadow:0 0 0 1px #D4D4D5}.ui.celled.grid>.row{width:100%!important;margin:0;padding:0;box-shadow:0 -1px 0 0 #D4D4D5}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{box-shadow:-1px 0 0 0 #D4D4D5;padding:1em}.ui.celled.grid>.column:first-child,.ui.celled.grid>.row>.column:first-child{box-shadow:none}.ui.relaxed.celled.grid>.column:not(.row),.ui.relaxed.celled.grid>.row>.column{padding:1.5em}.ui[class*="very relaxed"].celled.grid>.column:not(.row),.ui[class*="very relaxed"].celled.grid>.row>.column{padding:2em}.ui[class*="internally celled"].grid{box-shadow:none;margin:0}.ui[class*="internally celled"].grid>.row:first-child,.ui[class*="internally celled"].grid>.row>.column:first-child{box-shadow:none}.ui.grid>.row>[class*="top aligned"].column,.ui.grid>[class*="top aligned"].column:not(.row),.ui.grid>[class*="top aligned"].row>.column,.ui[class*="top aligned"].grid>.column:not(.row),.ui[class*="top aligned"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;vertical-align:top;-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.ui.grid>.row>[class*="middle aligned"].column,.ui.grid>[class*="middle aligned"].column:not(.row),.ui.grid>[class*="middle aligned"].row>.column,.ui[class*="middle aligned"].grid>.column:not(.row),.ui[class*="middle aligned"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;vertical-align:middle;-webkit-align-self:center!important;-ms-flex-item-align:center!important;align-self:center!important}.ui.grid>.row>[class*="bottom aligned"].column,.ui.grid>[class*="bottom aligned"].column:not(.row),.ui.grid>[class*="bottom aligned"].row>.column,.ui[class*="bottom aligned"].grid>.column:not(.row),.ui[class*="bottom aligned"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;vertical-align:bottom;-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.ui.grid>.row>.stretched.column,.ui.grid>.stretched.column:not(.row),.ui.grid>.stretched.row>.column,.ui.stretched.grid>.column,.ui.stretched.grid>.row>.column{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui.grid>.row>.stretched.column>*,.ui.grid>.stretched.column:not(.row)>*,.ui.grid>.stretched.row>.column>*,.ui.stretched.grid>.column>*,.ui.stretched.grid>.row>.column>*{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.ui.grid>.row>[class*="left aligned"].column,.ui.grid>[class*="left aligned"].column.column,.ui.grid>[class*="left aligned"].row>.column,.ui[class*="left aligned"].grid>.column,.ui[class*="left aligned"].grid>.row>.column{text-align:left;-webkit-align-self:inherit;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.row>[class*="center aligned"].column,.ui.grid>[class*="center aligned"].column.column,.ui.grid>[class*="center aligned"].row>.column,.ui[class*="center aligned"].grid>.column,.ui[class*="center aligned"].grid>.row>.column{text-align:center;-webkit-align-self:inherit;-ms-flex-item-align:inherit;align-self:inherit}.ui[class*="center aligned"].grid{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui.grid>.row>[class*="right aligned"].column,.ui.grid>[class*="right aligned"].column.column,.ui.grid>[class*="right aligned"].row>.column,.ui[class*="right aligned"].grid>.column,.ui[class*="right aligned"].grid>.row>.column{text-align:right;-webkit-align-self:inherit;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.justified.column.column,.ui.grid>.justified.row>.column,.ui.grid>.row>.justified.column,.ui.justified.grid>.column,.ui.justified.grid>.row>.column{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.ui.grid>.row>.black.column,.ui.grid>.row>.blue.column,.ui.grid>.row>.brown.column,.ui.grid>.row>.green.column,.ui.grid>.row>.grey.column,.ui.grid>.row>.olive.column,.ui.grid>.row>.orange.column,.ui.grid>.row>.pink.column,.ui.grid>.row>.purple.column,.ui.grid>.row>.red.column,.ui.grid>.row>.teal.column,.ui.grid>.row>.violet.column,.ui.grid>.row>.yellow.column{margin-top:-1rem;margin-bottom:-1rem;padding-top:1rem;padding-bottom:1rem}.ui.grid>.red.column,.ui.grid>.red.row,.ui.grid>.row>.red.column{background-color:#DB2828!important;color:#FFF}.ui.grid>.orange.column,.ui.grid>.orange.row,.ui.grid>.row>.orange.column{background-color:#F2711C!important;color:#FFF}.ui.grid>.row>.yellow.column,.ui.grid>.yellow.column,.ui.grid>.yellow.row{background-color:#FBBD08!important;color:#FFF}.ui.grid>.olive.column,.ui.grid>.olive.row,.ui.grid>.row>.olive.column{background-color:#B5CC18!important;color:#FFF}.ui.grid>.green.column,.ui.grid>.green.row,.ui.grid>.row>.green.column{background-color:#21BA45!important;color:#FFF}.ui.grid>.row>.teal.column,.ui.grid>.teal.column,.ui.grid>.teal.row{background-color:#00B5AD!important;color:#FFF}.ui.grid>.blue.column,.ui.grid>.blue.row,.ui.grid>.row>.blue.column{background-color:#2185D0!important;color:#FFF}.ui.grid>.row>.violet.column,.ui.grid>.violet.column,.ui.grid>.violet.row{background-color:#6435C9!important;color:#FFF}.ui.grid>.purple.column,.ui.grid>.purple.row,.ui.grid>.row>.purple.column{background-color:#A333C8!important;color:#FFF}.ui.grid>.pink.column,.ui.grid>.pink.row,.ui.grid>.row>.pink.column{background-color:#E03997!important;color:#FFF}.ui.grid>.brown.column,.ui.grid>.brown.row,.ui.grid>.row>.brown.column{background-color:#A5673F!important;color:#FFF}.ui.grid>.grey.column,.ui.grid>.grey.row,.ui.grid>.row>.grey.column{background-color:#767676!important;color:#FFF}.ui.grid>.black.column,.ui.grid>.black.row,.ui.grid>.row>.black.column{background-color:#1B1C1D!important;color:#FFF}.ui.grid>[class*="equal width"].row>.column,.ui[class*="equal width"].grid>.column:not(.row),.ui[class*="equal width"].grid>.row>.column{display:inline-block;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.ui.grid>[class*="equal width"].row>.wide.column,.ui[class*="equal width"].grid>.row>.wide.column,.ui[class*="equal width"].grid>.wide.column{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}@media only screen and (max-width:767px){.ui.grid>[class*="mobile reversed"].row,.ui[class*="mobile reversed"].grid,.ui[class*="mobile reversed"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui.stackable[class*="mobile reversed"],.ui[class*="mobile vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.column:first-child,.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:first-child{box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.column:last-child,.ui[class*="mobile reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:last-child{box-shadow:none}.ui.grid[class*="vertically divided"][class*="mobile vertically reversed"]>.row:first-child:before{box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="mobile vertically reversed"]>.row:last-child:before{box-shadow:none}.ui[class*="mobile reversed"].celled.grid>.row>.column:first-child{box-shadow:-1px 0 0 0 #D4D4D5}.ui[class*="mobile reversed"].celled.grid>.row>.column:last-child{box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991px){.ui.grid>[class*="tablet reversed"].row,.ui[class*="tablet reversed"].grid,.ui[class*="tablet reversed"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*="tablet vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.column:first-child,.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:first-child{box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.column:last-child,.ui[class*="tablet reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:last-child{box-shadow:none}.ui.grid[class*="vertically divided"][class*="tablet vertically reversed"]>.row:first-child:before{box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="tablet vertically reversed"]>.row:last-child:before{box-shadow:none}.ui[class*="tablet reversed"].celled.grid>.row>.column:first-child{box-shadow:-1px 0 0 0 #D4D4D5}.ui[class*="tablet reversed"].celled.grid>.row>.column:last-child{box-shadow:none}}@media only screen and (min-width:992px){.ui.grid>[class*="computer reversed"].row,.ui[class*="computer reversed"].grid,.ui[class*="computer reversed"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*="computer vertically reversed"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.column:first-child,.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:first-child{box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.column:last-child,.ui[class*="computer reversed"].divided.grid:not([class*="vertically divided"])>.row>.column:last-child{box-shadow:none}.ui.grid[class*="vertically divided"][class*="computer vertically reversed"]>.row:first-child:before{box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*="vertically divided"][class*="computer vertically reversed"]>.row:last-child:before{box-shadow:none}.ui[class*="computer reversed"].celled.grid>.row>.column:first-child{box-shadow:-1px 0 0 0 #D4D4D5}.ui[class*="computer reversed"].celled.grid>.row>.column:last-child{box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991px){.ui.doubling.grid{width:auto}.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{display:inline-block!important;padding-top:1rem!important;padding-bottom:1rem!important;box-shadow:none!important;margin:0}.ui.grid>[class*="two column"].doubling.row.row>.column,.ui[class*="two column"].doubling.grid>.column:not(.row),.ui[class*="two column"].doubling.grid>.row>.column{width:100%!important}.ui.grid>[class*="three column"].doubling.row.row>.column,.ui.grid>[class*="four column"].doubling.row.row>.column,.ui[class*="three column"].doubling.grid>.column:not(.row),.ui[class*="three column"].doubling.grid>.row>.column,.ui[class*="four column"].doubling.grid>.column:not(.row),.ui[class*="four column"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*="five column"].doubling.row.row>.column,.ui.grid>[class*="six column"].doubling.row.row>.column,.ui.grid>[class*="seven column"].doubling.row.row>.column,.ui[class*="five column"].doubling.grid>.column:not(.row),.ui[class*="five column"].doubling.grid>.row>.column,.ui[class*="six column"].doubling.grid>.column:not(.row),.ui[class*="six column"].doubling.grid>.row>.column,.ui[class*="seven column"].doubling.grid>.column:not(.row),.ui[class*="seven column"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="eight column"].doubling.row.row>.column,.ui.grid>[class*="nine column"].doubling.row.row>.column,.ui[class*="eight column"].doubling.grid>.column:not(.row),.ui[class*="eight column"].doubling.grid>.row>.column,.ui[class*="nine column"].doubling.grid>.column:not(.row),.ui[class*="nine column"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*="ten column"].doubling.row.row>.column,.ui.grid>[class*="eleven column"].doubling.row.row>.column,.ui[class*="ten column"].doubling.grid>.column:not(.row),.ui[class*="ten column"].doubling.grid>.row>.column,.ui[class*="eleven column"].doubling.grid>.column:not(.row),.ui[class*="eleven column"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*="twelve column"].doubling.row.row>.column,.ui.grid>[class*="thirteen column"].doubling.row.row>.column,.ui[class*="twelve column"].doubling.grid>.column:not(.row),.ui[class*="twelve column"].doubling.grid>.row>.column,.ui[class*="thirteen column"].doubling.grid>.column:not(.row),.ui[class*="thirteen column"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*="fourteen column"].doubling.row.row>.column,.ui.grid>[class*="fifteen column"].doubling.row.row>.column,.ui[class*="fourteen column"].doubling.grid>.column:not(.row),.ui[class*="fourteen column"].doubling.grid>.row>.column,.ui[class*="fifteen column"].doubling.grid>.column:not(.row),.ui[class*="fifteen column"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*="sixteen column"].doubling.row.row>.column,.ui[class*="sixteen column"].doubling.grid>.column:not(.row),.ui[class*="sixteen column"].doubling.grid>.row>.column{width:12.5%!important}.ui.grid.grid.grid>.row>[class*="computer only"].column:not(.tablet),.ui.grid.grid.grid>.row>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.tablet),.ui.grid.grid.grid>[class*="computer only"].column:not(.tablet),.ui.grid.grid.grid>[class*="computer only"].row:not(.tablet),.ui.grid.grid.grid>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].row:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui.grid.grid.grid>[class*="mobile only"].column:not(.tablet),.ui.grid.grid.grid>[class*="mobile only"].row:not(.tablet),.ui[class*="computer only"].grid.grid.grid:not(.tablet),.ui[class*="large screen only"].grid.grid.grid:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile),.ui[class*="mobile only"].grid.grid.grid:not(.tablet){display:none!important}}@media only screen and (max-width:767px){.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{padding-top:1rem!important;padding-bottom:1rem!important;margin:0!important;box-shadow:none!important}.ui.grid>[class*="two column"].doubling:not(.stackable).row.row>.column,.ui[class*="two column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="two column"].doubling:not(.stackable).grid>.row>.column{width:100%!important}.ui.grid>[class*="three column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="four column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="five column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="six column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="seven column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="eight column"].doubling:not(.stackable).row.row>.column,.ui[class*="three column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="three column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="four column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="four column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="five column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="five column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="six column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="six column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="seven column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="seven column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="eight column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="eight column"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*="nine column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="ten column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="eleven column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="twelve column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="thirteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="nine column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="nine column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="ten column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="ten column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="eleven column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="eleven column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="twelve column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="twelve column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="thirteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="thirteen column"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*="fourteen column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="fifteen column"].doubling:not(.stackable).row.row>.column,.ui.grid>[class*="sixteen column"].doubling:not(.stackable).row.row>.column,.ui[class*="fourteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="fourteen column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="fifteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="fifteen column"].doubling:not(.stackable).grid>.row>.column,.ui[class*="sixteen column"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*="sixteen column"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.stackable.grid{width:auto;margin-left:0!important;margin-right:0!important}.ui.grid>.stackable.stackable.row>.column,.ui.stackable.grid>.column.grid>.column,.ui.stackable.grid>.column.row>.column,.ui.stackable.grid>.column:not(.row),.ui.stackable.grid>.row>.column,.ui.stackable.grid>.row>.wide.column,.ui.stackable.grid>.wide.column{width:100%!important;margin:0!important;box-shadow:none!important;padding:1rem!important}.ui.stackable.grid:not(.vertically)>.row{margin:0;padding:0}.ui.container>.ui.stackable.grid>.column,.ui.container>.ui.stackable.grid>.row>.column{padding-left:0!important;padding-right:0!important}.ui.grid .ui.stackable.grid,.ui.segment:not(.vertical) .ui.stackable.page.grid{margin-left:-1rem!important;margin-right:-1rem!important}.ui.stackable.celled.grid>.column:not(.row):first-child,.ui.stackable.celled.grid>.row:first-child>.column:first-child,.ui.stackable.divided.grid>.column:not(.row):first-child,.ui.stackable.divided.grid>.row:first-child>.column:first-child{border-top:none!important}.ui.inverted.stackable.celled.grid>.column:not(.row),.ui.inverted.stackable.celled.grid>.row>.column,.ui.inverted.stackable.divided.grid>.column:not(.row),.ui.inverted.stackable.divided.grid>.row>.column{border-top:1px solid rgba(255,255,255,.1)}.ui.stackable.celled.grid>.column:not(.row),.ui.stackable.celled.grid>.row>.column,.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{border-top:1px solid rgba(34,36,38,.15);box-shadow:none!important;padding-top:2rem!important;padding-bottom:2rem!important}.ui.stackable.celled.grid>.row{box-shadow:none!important}.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{padding-left:0!important;padding-right:0!important}.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.mobile),.ui.grid.grid.grid>.row>[class*="computer only"].column:not(.mobile),.ui.grid.grid.grid>.row>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="tablet only"].column:not(.mobile),.ui.grid.grid.grid>[class*="tablet only"].row:not(.mobile),.ui.grid.grid.grid>[class*="computer only"].column:not(.mobile),.ui.grid.grid.grid>[class*="computer only"].row:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].row:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui[class*="tablet only"].grid.grid.grid:not(.mobile),.ui[class*="computer only"].grid.grid.grid:not(.mobile),.ui[class*="large screen only"].grid.grid.grid:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>.row>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].row:not(.computer),.ui.grid.grid.grid>[class*="large screen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="large screen only"].row:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="tablet only"].grid.grid.grid:not(.computer),.ui[class*="large screen only"].grid.grid.grid:not(.mobile),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>.row>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].row:not(.computer),.ui.grid.grid.grid>[class*="widescreen only"].column:not(.mobile),.ui.grid.grid.grid>[class*="widescreen only"].row:not(.mobile),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="tablet only"].grid.grid.grid:not(.computer),.ui[class*="widescreen only"].grid.grid.grid:not(.mobile),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}}@media only screen and (min-width:1920px){.ui.grid.grid.grid>.row>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>.row>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].column:not(.computer),.ui.grid.grid.grid>[class*="tablet only"].row:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].column:not(.computer),.ui.grid.grid.grid>[class*="mobile only"].row:not(.computer),.ui[class*="tablet only"].grid.grid.grid:not(.computer),.ui[class*="mobile only"].grid.grid.grid:not(.computer){display:none!important}}.ui.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1rem 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#FFF;font-weight:400;border:1px solid rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem;min-height:2.85714286em}.ui.menu:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.menu:first-child{margin-top:0}.ui.menu:last-child{margin-bottom:0}.ui.menu .menu{margin:0}.ui.menu:not(.vertical)>.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui.menu:not(.vertical) .item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui.menu .item{position:relative;vertical-align:middle;line-height:1;text-decoration:none;-webkit-tap-highlight-color:transparent;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;padding:.92857143em 1.14285714em;text-transform:none;color:rgba(0,0,0,.87);font-weight:400;-webkit-transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease}.ui.menu>.item:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.menu .item:before{position:absolute;content:'';top:0;right:0;height:100%;width:1px;background:rgba(34,36,38,.1)}.ui.menu .item>a:not(.ui),.ui.menu .item>p:only-child,.ui.menu .text.item>*{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;line-height:1.3}.ui.menu .item>p:first-child{margin-top:0}.ui.menu .item>p:last-child{margin-bottom:0}.ui.menu .item>i.icon{opacity:.9;float:none;margin:0 .35714286em 0 0}.ui.menu:not(.vertical) .item>.button{position:relative;top:0;margin:-.5em 0;padding-bottom:.78571429em;padding-top:.78571429em;font-size:1em}.ui.menu>.container,.ui.menu>.grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:inherit;-webkit-align-items:inherit;-ms-flex-align:inherit;align-items:inherit;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.menu .item>.input{width:100%}.ui.menu:not(.vertical) .item>.input{position:relative;top:0;margin:-.5em 0}.ui.menu .item>.input input{font-size:1em;padding-top:.57142857em;padding-bottom:.57142857em}.ui.menu .header.item,.ui.vertical.menu .header.item{margin:0;background:0 0;text-transform:normal;font-weight:700}.ui.vertical.menu .item>.header:not(.ui){margin:0 0 .5em;font-size:1em;font-weight:700}.ui.menu .ui.popup{display:none}.ui.menu .ui.visible.popup{display:block}.ui.menu .item>i.dropdown.icon{padding:0;float:right;margin:0 0 0 1em}.ui.menu .dropdown.item .menu{left:0;min-width:calc(100% - 1px);border-radius:0 0 .28571429rem .28571429rem;background:#FFF;margin:0;box-shadow:0 1px 3px 0 rgba(0,0,0,.08);-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.ui.menu .ui.dropdown .menu>.item{margin:0;text-align:left;font-size:1em!important;padding:.78571429em 1.14285714em!important;background:0 0!important;color:rgba(0,0,0,.87)!important;text-transform:none!important;font-weight:400!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important}.ui.menu .ui.dropdown .menu>.item:hover,.ui.menu .ui.dropdown .menu>.selected.item{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.active.item{background:rgba(0,0,0,.03)!important;font-weight:700!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown.item .menu .item:not(.filtered){display:block}.ui.menu .ui.dropdown .menu>.item .icon:not(.dropdown){display:inline-block;font-size:1em!important;float:none;margin:0 .75em 0 0}.ui.secondary.menu .dropdown.item>.menu,.ui.text.menu .dropdown.item>.menu{border-radius:.28571429rem;margin-top:.35714286em}.ui.menu .pointing.dropdown.item .menu{margin-top:.75em}.ui.inverted.menu .search.dropdown.item>.search,.ui.inverted.menu .search.dropdown.item>.text{color:rgba(255,255,255,.9)}.ui.vertical.menu .dropdown.item>.icon{float:right;content:"\f0da";margin-left:1em}.ui.vertical.menu .dropdown.item .menu{top:0!important;left:100%;min-width:0;margin:0;box-shadow:0 1px 3px 0 rgba(0,0,0,.08);border-radius:0 .28571429rem .28571429rem}.ui.vertical.menu .active.dropdown.item{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.menu .dropdown.active.item{box-shadow:none}.ui.item.menu .dropdown .menu .item{width:100%}.ui.menu .item>.label{background:#999;color:#FFF;margin-left:1em;padding:.3em .78571429em}.ui.vertical.menu .item>.label{background:#999;color:#FFF;margin-top:-.15em;margin-bottom:-.15em;padding:.3em .78571429em;float:right;text-align:center}.ui.menu .item>.floating.label{padding:.3em .78571429em}.ui.menu .item>img:not(.ui){display:inline-block;vertical-align:middle;margin:-.3em 0;width:2.5em}.ui.vertical.menu .item>img:not(.ui):only-child{display:block;max-width:100%;width:auto}.ui.vertical.sidebar.menu>.item:first-child:before{display:block!important}.ui.vertical.sidebar.menu>.item::before{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.menu>.ui.container{width:100%!important;margin-left:0!important;margin-right:0!important}}@media only screen and (min-width:768px){.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.item:not(.right):not(.borderless):first-child{border-left:1px solid rgba(34,36,38,.1)}}.ui.link.menu .item:hover,.ui.menu .dropdown.item:hover,.ui.menu .link.item:hover,.ui.menu a.item:hover{cursor:pointer;background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.link.menu .item:active,.ui.menu .link.item:active,.ui.menu a.item:active{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.menu .active.item{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);font-weight:400;box-shadow:none}.ui.menu .active.item>i.icon{opacity:1}.ui.menu .active.item:hover,.ui.vertical.menu .active.item:hover{background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.menu .item.disabled,.ui.menu .item.disabled:hover{cursor:default;background-color:transparent!important;color:rgba(40,40,40,.3)}.ui.menu:not(.vertical) .left.item,.ui.menu:not(.vertical) .left.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:auto!important}.ui.menu:not(.vertical) .right.item,.ui.menu:not(.vertical) .right.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-left:auto!important}.ui.menu .right.item::before,.ui.menu .right.menu>.item::before{right:auto;left:0}.ui.vertical.menu{display:block;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background:#FFF;box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui.vertical.menu .item{display:block;background:0 0;border-top:none;border-right:none}.ui.vertical.menu>.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu .item>i.icon{width:1.18em;float:right;margin:0 0 0 .5em}.ui.vertical.menu .item>.label+i.icon{float:none;margin:0 .5em 0 0}.ui.vertical.menu .item:before{position:absolute;content:'';top:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.vertical.menu .item:first-child:before{display:none!important}.ui.vertical.menu .item>.menu{margin:.5em -1.14285714em 0}.ui.vertical.menu .menu .item{background:0 0;padding:.5em 1.33333333em;font-size:.85714286em;color:rgba(0,0,0,.5)}.ui.vertical.menu .item .menu .link.item:hover,.ui.vertical.menu .item .menu a.item:hover{color:rgba(0,0,0,.85)}.ui.vertical.menu .menu .item:before{display:none}.ui.vertical.menu .active.item{background:rgba(0,0,0,.05);border-radius:0;box-shadow:none}.ui.vertical.menu>.active.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.active.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu>.active.item:only-child{border-radius:.28571429rem}.ui.vertical.menu .active.item .menu .active.item{border-left:none}.ui.vertical.menu .item .menu .active.item{background-color:transparent;font-weight:700;color:rgba(0,0,0,.95)}.ui.tabular.menu{border-radius:0;box-shadow:none!important;border:none;background:none;border-bottom:1px solid #D4D4D5}.ui.tabular.fluid.menu{width:calc(100% + 2px)!important}.ui.tabular.menu .item{background:0 0;border-bottom:none;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;padding:.92857143em 1.42857143em;color:rgba(0,0,0,.87)}.ui.tabular.menu .item:before{display:none}.ui.tabular.menu .item:hover{background-color:transparent;color:rgba(0,0,0,.8)}.ui.tabular.menu .active.item{background:#FFF;color:rgba(0,0,0,.95);border-top-width:1px;border-color:#D4D4D5;font-weight:700;margin-bottom:-1px;box-shadow:none;border-radius:.28571429rem .28571429rem 0 0!important}.ui.tabular.menu+.attached:not(.top).segment,.ui.tabular.menu+.attached:not(.top).segment+.attached:not(.top).segment{border-top:none;margin-left:0;margin-top:0;margin-right:0;width:100%}.top.attached.segment+.ui.bottom.tabular.menu{position:relative;width:calc(100% + 2px);left:-1px}.ui.bottom.tabular.menu{background:none;border-radius:0;box-shadow:none!important;border-bottom:none;border-top:1px solid #D4D4D5}.ui.bottom.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:none}.ui.bottom.tabular.menu .active.item{background:#FFF;color:rgba(0,0,0,.95);border-color:#D4D4D5;margin:-1px 0 0;border-radius:0 0 .28571429rem .28571429rem!important}.ui.vertical.tabular.menu{background:none;border-radius:0;box-shadow:none!important;border-bottom:none;border-right:1px solid #D4D4D5}.ui.vertical.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-right:none}.ui.vertical.tabular.menu .active.item{background:#FFF;color:rgba(0,0,0,.95);border-color:#D4D4D5;margin:0 -1px 0 0;border-radius:.28571429rem 0 0 .28571429rem!important}.ui.vertical.right.tabular.menu{background:none;border-radius:0;box-shadow:none!important;border-bottom:none;border-right:none;border-left:1px solid #D4D4D5}.ui.vertical.right.tabular.menu .item{background:0 0;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-left:none}.ui.vertical.right.tabular.menu .active.item{background:#FFF;color:rgba(0,0,0,.95);border-color:#D4D4D5;margin:0 0 0 -1px;border-radius:0 .28571429rem .28571429rem 0!important}.ui.tabular.menu .active.dropdown.item{margin-bottom:0;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;border-bottom:none}.ui.pagination.menu{margin:0;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.ui.pagination.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.pagination.menu .item:last-child:before{display:none}.ui.pagination.menu .item{min-width:3em;text-align:center}.ui.pagination.menu .icon.item i.icon{vertical-align:top}.ui.pagination.menu .active.item{border-top:none;padding-top:.92857143em;background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95);box-shadow:none}.ui.secondary.menu{background:0 0;margin-left:-.35714286em;margin-right:-.35714286em;border-radius:0;border:none;box-shadow:none}.ui.secondary.menu .item{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;box-shadow:none;border:none;padding:.78571429em .92857143em;margin:0 .35714286em;background:0 0;-webkit-transition:color .1s ease;transition:color .1s ease;border-radius:.28571429rem}.ui.secondary.menu .item:before{display:none!important}.ui.secondary.menu .header.item{border-radius:0;border-right:none;background:none}.ui.secondary.menu .item>img:not(.ui){margin:0}.ui.secondary.menu .dropdown.item:hover,.ui.secondary.menu .link.item:hover,.ui.secondary.menu a.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.menu .active.item{box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);border-radius:.28571429rem}.ui.secondary.menu .active.item:hover{box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.inverted.menu .link.item,.ui.secondary.inverted.menu a.item{color:rgba(255,255,255,.7)!important}.ui.secondary.inverted.menu .dropdown.item:hover,.ui.secondary.inverted.menu .link.item:hover,.ui.secondary.inverted.menu a.item:hover{background:rgba(255,255,255,.08);color:#fff!important}.ui.secondary.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.secondary.item.menu{margin-left:0;margin-right:0}.ui.secondary.item.menu .item:last-child{margin-right:0}.ui.secondary.attached.menu{box-shadow:none}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu{margin:0 -.92857143em}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 1.33333333em}.ui.secondary.vertical.menu>.item{border:none;margin:0 0 .35714286em;border-radius:.28571429rem!important}.ui.secondary.vertical.menu>.header.item{border-radius:0}.ui.secondary.inverted.menu,.ui.vertical.secondary.menu .item>.menu .item{background-color:transparent}.ui.secondary.pointing.menu{margin-left:0;margin-right:0;border-bottom:2px solid rgba(34,36,38,.15)}.ui.secondary.pointing.menu .item{border-bottom-color:transparent;border-bottom-style:solid;border-radius:0;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 0 -2px;padding:.85714286em 1.14285714em;border-bottom-width:2px;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.secondary.pointing.menu .header.item{color:rgba(0,0,0,.85)!important}.ui.secondary.pointing.menu .text.item{box-shadow:none!important}.ui.secondary.pointing.menu .item:after{display:none}.ui.secondary.pointing.menu .dropdown.item:hover,.ui.secondary.pointing.menu .link.item:hover,.ui.secondary.pointing.menu a.item:hover{background-color:transparent;color:rgba(0,0,0,.87)}.ui.secondary.pointing.menu .dropdown.item:active,.ui.secondary.pointing.menu .link.item:active,.ui.secondary.pointing.menu a.item:active{background-color:transparent;border-color:rgba(34,36,38,.15)}.ui.secondary.pointing.menu .active.item{background-color:transparent;box-shadow:none;border-color:#1B1C1D;font-weight:700;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.item:hover{border-color:#1B1C1D;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.dropdown.item{border-color:transparent}.ui.secondary.vertical.pointing.menu{border-bottom-width:0;border-right-width:2px;border-right-style:solid;border-right-color:rgba(34,36,38,.15)}.ui.secondary.vertical.pointing.menu .item{border-bottom:none;border-right-style:solid;border-right-color:transparent;border-radius:0!important;margin:0 -2px 0 0;border-right-width:2px}.ui.secondary.vertical.pointing.menu .active.item{border-color:#1B1C1D}.ui.secondary.inverted.pointing.menu{border-width:2px;border-color:rgba(34,36,38,.15)}.ui.secondary.inverted.pointing.menu .item{color:rgba(255,255,255,.9)}.ui.secondary.inverted.pointing.menu .header.item{color:#FFF!important}.ui.secondary.inverted.pointing.menu .link.item:hover,.ui.secondary.inverted.pointing.menu a.item:hover{color:rgba(0,0,0,.95)}.ui.secondary.inverted.pointing.menu .active.item{border-color:#FFF;color:#fff}.ui.text.menu{background:none;border-radius:0;box-shadow:none;border:none;margin:1em -.5em}.ui.text.menu .item{border-radius:0;box-shadow:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;margin:0;padding:.35714286em .5em;font-weight:400;color:rgba(0,0,0,.6);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.text.menu .item:before,.ui.text.menu .menu .item:before{display:none!important}.ui.text.menu .header.item{background-color:transparent;opacity:1;color:rgba(0,0,0,.85);font-size:.92857143em;text-transform:uppercase;font-weight:700}.ui.text.item.menu .item,.ui.text.menu .item>img:not(.ui){margin:0}.ui.vertical.text.menu{margin:1em 0}.ui.vertical.text.menu:first-child{margin-top:0}.ui.vertical.text.menu:last-child{margin-bottom:0}.ui.vertical.text.menu .item{margin:.57142857em 0;padding-left:0;padding-right:0}.ui.vertical.text.menu .item>i.icon{float:none;margin:0 .35714286em 0 0}.ui.vertical.text.menu .header.item{margin:.57142857em 0 .71428571em}.ui.vertical.text.menu .item:not(.dropdown)>.menu{margin:0}.ui.vertical.text.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 0}.ui.text.menu .item:hover{opacity:1;background-color:transparent}.ui.text.menu .active.item{background-color:transparent;border:none;box-shadow:none;font-weight:400;color:rgba(0,0,0,.95)}.ui.text.menu .active.item:hover{background-color:transparent}.ui.text.attached.menu,.ui.text.pointing.menu .active.item:after{box-shadow:none}.ui.inverted.text.menu,.ui.inverted.text.menu .active.item,.ui.inverted.text.menu .item,.ui.inverted.text.menu .item:hover{background-color:transparent!important}.ui.fluid.text.menu{margin-left:0;margin-right:0}.ui.vertical.icon.menu{display:inline-block;width:auto}.ui.icon.menu .item{height:auto;text-align:center;color:#1B1C1D}.ui.icon.menu .item>.icon:not(.dropdown){margin:0;opacity:1}.ui.icon.menu .icon:before{opacity:1}.ui.menu .icon.item>.icon{width:auto;margin:0 auto}.ui.vertical.icon.menu .item>.icon:not(.dropdown){display:block;opacity:1;margin:0 auto;float:none}.ui.inverted.icon.menu .item{color:#FFF}.ui.labeled.icon.menu{text-align:center}.ui.labeled.icon.menu .item{min-width:6em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui.labeled.icon.menu .item>.icon:not(.dropdown){height:1em;display:block;font-size:1.71428571em!important;margin:0 auto .5rem!important}.ui.fluid.labeled.icon.menu>.item{min-width:0}@media only screen and (max-width:767px){.ui.stackable.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui.stackable.menu .item{width:100%!important}.ui.stackable.menu .item:before{position:absolute;content:'';top:auto;bottom:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.stackable.menu .left.item,.ui.stackable.menu .left.menu{margin-right:0!important}.ui.stackable.menu .right.item,.ui.stackable.menu .right.menu{margin-left:0!important}}.ui.menu .red.active.item,.ui.red.menu .active.item{border-color:#DB2828!important;color:#DB2828!important}.ui.menu .orange.active.item,.ui.orange.menu .active.item{border-color:#F2711C!important;color:#F2711C!important}.ui.menu .yellow.active.item,.ui.yellow.menu .active.item{border-color:#FBBD08!important;color:#FBBD08!important}.ui.menu .olive.active.item,.ui.olive.menu .active.item{border-color:#B5CC18!important;color:#B5CC18!important}.ui.green.menu .active.item,.ui.menu .green.active.item{border-color:#21BA45!important;color:#21BA45!important}.ui.menu .teal.active.item,.ui.teal.menu .active.item{border-color:#00B5AD!important;color:#00B5AD!important}.ui.blue.menu .active.item,.ui.menu .blue.active.item{border-color:#2185D0!important;color:#2185D0!important}.ui.menu .violet.active.item,.ui.violet.menu .active.item{border-color:#6435C9!important;color:#6435C9!important}.ui.menu .purple.active.item,.ui.purple.menu .active.item{border-color:#A333C8!important;color:#A333C8!important}.ui.menu .pink.active.item,.ui.pink.menu .active.item{border-color:#E03997!important;color:#E03997!important}.ui.brown.menu .active.item,.ui.menu .brown.active.item{border-color:#A5673F!important;color:#A5673F!important}.ui.grey.menu .active.item,.ui.menu .grey.active.item{border-color:#767676!important;color:#767676!important}.ui.inverted.menu{border:0 solid transparent;background:#1B1C1D;box-shadow:none}.ui.inverted.menu .item,.ui.inverted.menu .item>a:not(.ui){background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.menu .item.menu{background:0 0}.ui.inverted.menu .item:before,.ui.vertical.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .menu .item,.ui.vertical.inverted.menu .menu .item a:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.menu .header.item{margin:0;background:0 0;box-shadow:none}.ui.inverted.menu .item.disabled,.ui.inverted.menu .item.disabled:hover{color:rgba(225,225,225,.3)}.ui.inverted.menu .dropdown.item:hover,.ui.inverted.menu .link.item:hover,.ui.inverted.menu a.item:hover,.ui.link.inverted.menu .item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.vertical.inverted.menu .item .menu .link.item:hover,.ui.vertical.inverted.menu .item .menu a.item:hover{background:0 0;color:#fff}.ui.inverted.menu .link.item:active,.ui.inverted.menu a.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.inverted.vertical.menu .item .menu .active.item{background:0 0;color:#FFF}.ui.inverted.pointing.menu .active.item:after{background:#3D3E3F!important;margin:0!important;box-shadow:none!important;border:none!important}.ui.inverted.menu .active.item:hover{background:rgba(255,255,255,.15);color:#FFF!important}.ui.inverted.pointing.menu .active.item:hover:after{background:#3D3E3F!important}.ui.floated.menu{float:left;margin:0 .5rem 0 0}.ui.floated.menu .item:last-child:before{display:none}.ui.right.floated.menu{float:right;margin:0 0 0 .5rem}.ui.inverted.menu .red.active.item,.ui.inverted.red.menu{background-color:#DB2828}.ui.inverted.red.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.red.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .orange.active.item,.ui.inverted.orange.menu{background-color:#F2711C}.ui.inverted.orange.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.orange.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .yellow.active.item,.ui.inverted.yellow.menu{background-color:#FBBD08}.ui.inverted.yellow.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.yellow.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .olive.active.item,.ui.inverted.olive.menu{background-color:#B5CC18}.ui.inverted.olive.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.olive.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.green.menu,.ui.inverted.menu .green.active.item{background-color:#21BA45}.ui.inverted.green.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.green.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .teal.active.item,.ui.inverted.teal.menu{background-color:#00B5AD}.ui.inverted.teal.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.teal.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.blue.menu,.ui.inverted.menu .blue.active.item{background-color:#2185D0}.ui.inverted.blue.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.blue.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .violet.active.item,.ui.inverted.violet.menu{background-color:#6435C9}.ui.inverted.violet.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.violet.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .purple.active.item,.ui.inverted.purple.menu{background-color:#A333C8}.ui.inverted.purple.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.purple.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .pink.active.item,.ui.inverted.pink.menu{background-color:#E03997}.ui.inverted.pink.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.pink.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.brown.menu,.ui.inverted.menu .brown.active.item{background-color:#A5673F}.ui.inverted.brown.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.brown.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.grey.menu,.ui.inverted.menu .grey.active.item{background-color:#767676}.ui.inverted.grey.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.grey.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.fitted.menu .item,.ui.fitted.menu .item .menu .item,.ui.menu .fitted.item{padding:0}.ui.horizontally.fitted.menu .item,.ui.horizontally.fitted.menu .item .menu .item,.ui.menu .horizontally.fitted.item{padding-top:.92857143em;padding-bottom:.92857143em}.ui.menu .vertically.fitted.item,.ui.vertically.fitted.menu .item,.ui.vertically.fitted.menu .item .menu .item{padding-left:1.14285714em;padding-right:1.14285714em}.ui.borderless.menu .item .menu .item:before,.ui.borderless.menu .item:before,.ui.menu .borderless.item:before{background:0 0!important}.ui.compact.menu{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;margin:0;vertical-align:middle}.ui.compact.vertical.menu{display:inline-block;width:auto!important}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child:before{display:none}.ui.compact.vertical.menu .item:last-child::before{display:block}.ui.menu.fluid,.ui.vertical.menu.fluid{width:100%!important}.ui.item.menu,.ui.item.menu .item{width:100%;padding-left:0!important;padding-right:0!important;margin-left:0!important;margin-right:0!important;text-align:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui.item.menu .item:last-child:before{display:none}.ui.menu.two.item .item{width:50%}.ui.menu.three.item .item{width:33.333%}.ui.menu.four.item .item{width:25%}.ui.menu.five.item .item{width:20%}.ui.menu.six.item .item{width:16.666%}.ui.menu.seven.item .item{width:14.285%}.ui.menu.eight.item .item{width:12.5%}.ui.menu.nine.item .item{width:11.11%}.ui.menu.ten.item .item{width:10%}.ui.menu.eleven.item .item{width:9.09%}.ui.menu.twelve.item .item{width:8.333%}.ui.menu.fixed{position:fixed;z-index:101;margin:0;width:100%}.ui.menu.fixed,.ui.menu.fixed .item:first-child,.ui.menu.fixed .item:last-child{border-radius:0!important}.ui.fixed.menu,.ui[class*="top fixed"].menu{top:0;left:0;right:auto;bottom:auto}.ui[class*="top fixed"].menu{border-top:none;border-left:none;border-right:none}.ui[class*="right fixed"].menu{border-top:none;border-bottom:none;border-right:none;top:0;right:0;left:auto;bottom:auto;width:auto;height:100%}.ui[class*="bottom fixed"].menu{border-bottom:none;border-left:none;border-right:none;bottom:0;left:0;top:auto;right:auto}.ui[class*="left fixed"].menu{border-top:none;border-bottom:none;border-left:none;top:0;left:0;right:auto;bottom:auto;width:auto;height:100%}.ui.fixed.menu+.ui.grid{padding-top:2.75rem}.ui.pointing.menu .item:after{visibility:hidden;position:absolute;content:'';top:100%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);background:0 0;margin:.5px 0 0;width:.57142857em;height:.57142857em;border:none;border-bottom:1px solid #D4D4D5;border-right:1px solid #D4D4D5;z-index:2;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.vertical.pointing.menu .item:after{position:absolute;top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);margin:0 -.5px 0 0;border:none;border-top:1px solid #D4D4D5;border-right:1px solid #D4D4D5}.ui.pointing.menu .active.item:after{visibility:visible}.ui.pointing.menu .active.dropdown.item:after{visibility:hidden}.ui.pointing.menu .active.item .menu .active.item:after,.ui.pointing.menu .dropdown.active.item:after{display:none}.ui.pointing.menu .active.item:after,.ui.pointing.menu .active.item:hover:after,.ui.vertical.pointing.menu .active.item:after,.ui.vertical.pointing.menu .active.item:hover:after{background-color:#F2F2F2}.ui.vertical.pointing.menu .menu .active.item:after{background-color:#FFF}.ui.attached.menu{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);box-shadow:none}.ui.attached+.ui.attached.menu:not(.top){border-top:none}.ui[class*="top attached"].menu{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.menu[class*="top attached"]:first-child{margin-top:0}.ui[class*="bottom attached"].menu{bottom:0;margin-top:0;top:0;margin-bottom:1rem;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].menu:last-child{margin-bottom:0}.ui.top.attached.menu>.item:first-child{border-radius:.28571429rem 0 0}.ui.bottom.attached.menu>.item:first-child{border-radius:0 0 0 .28571429rem}.ui.attached.menu:not(.tabular){border:1px solid #D4D4D5}.ui.attached.inverted.menu{border:none}.ui.attached.tabular.menu{margin-left:0;margin-right:0;width:100%}.ui.mini.menu{font-size:.78571429rem}.ui.mini.vertical.menu{width:9rem}.ui.tiny.menu{font-size:.85714286rem}.ui.tiny.vertical.menu{width:11rem}.ui.small.menu{font-size:.92857143rem}.ui.small.vertical.menu{width:13rem}.ui.menu{font-size:1rem}.ui.vertical.menu{width:15rem}.ui.large.menu{font-size:1.07142857rem}.ui.large.vertical.menu{width:18rem}.ui.huge.menu{font-size:1.14285714rem}.ui.huge.vertical.menu{width:20rem}.ui.big.menu{font-size:1.21428571rem}.ui.big.vertical.menu{width:22rem}.ui.massive.menu{font-size:1.28571429rem}.ui.massive.vertical.menu{width:25rem}.ui.message{position:relative;min-height:1em;margin:1em 0;background:#F8F8F9;padding:1em 1.5em;line-height:1.4285em;color:rgba(0,0,0,.87);-webkit-transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;border-radius:.28571429rem;box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent}.ui.message:first-child{margin-top:0}.ui.message:last-child{margin-bottom:0}.ui.message .header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;margin:-.14285em 0 0}.ui.message .header:not(.ui){font-size:1.14285714em}.ui.message p{opacity:.85;margin:.75em 0}.ui.message p:first-child{margin-top:0}.ui.message p:last-child{margin-bottom:0}.ui.message .header+p{margin-top:.25em}.ui.message .list:not(.ui){text-align:left;padding:0;opacity:.85;list-style-position:inside;margin:.5em 0 0}.ui.message .list:not(.ui):first-child{margin-top:0}.ui.message .list:not(.ui):last-child{margin-bottom:0}.ui.message .list:not(.ui) li{position:relative;list-style-type:none;margin:0 0 .3em 1em;padding:0}.ui.message .list:not(.ui) li:before{position:absolute;content:'•';left:-1em;height:100%;vertical-align:baseline}.ui.message .list:not(.ui) li:last-child{margin-bottom:0}.ui.message>.icon{margin-right:.6em}.ui.message>.close.icon{cursor:pointer;position:absolute;margin:0;top:.78575em;right:.5em;opacity:.7;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.message>.close.icon:hover{opacity:1}.ui.message>:first-child{margin-top:0}.ui.message>:last-child{margin-bottom:0}.ui.dropdown .menu>.message{margin:0 -1px}.ui.visible.visible.visible.visible.message{display:block}.ui.icon.visible.visible.visible.visible.message{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui.hidden.hidden.hidden.hidden.message{display:none}.ui.compact.message{display:inline-block}.ui.attached.message{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;margin-left:-1px;margin-right:-1px}.ui.attached+.ui.attached.message:not(.top):not(.bottom){margin-top:-1px;border-radius:0}.ui.bottom.attached.message{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15)}.ui.bottom.attached.message:not(:last-child){margin-bottom:1em}.ui.attached.icon.message{width:auto}.ui.icon.message{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui.icon.message>.icon:not(.close){display:block;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;line-height:1;vertical-align:middle;font-size:3em;opacity:.8}.ui.icon.message>.content{display:block;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;vertical-align:middle}.ui.icon.message .icon:not(.close)+.content{padding-left:0}.ui.icon.message .circular.icon{width:1em}.ui.floating.message{box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.positive.message{background-color:#FCFFF5;color:#2C662D}.ui.attached.positive.message,.ui.positive.message{box-shadow:0 0 0 1px #A3C293 inset,0 0 0 0 transparent}.ui.positive.message .header{color:#1A531B}.ui.negative.message{background-color:#FFF6F6;color:#9F3A38}.ui.attached.negative.message,.ui.negative.message{box-shadow:0 0 0 1px #E0B4B4 inset,0 0 0 0 transparent}.ui.negative.message .header{color:#912D2B}.ui.info.message{background-color:#F8FFFF;color:#276F86}.ui.attached.info.message,.ui.info.message{box-shadow:0 0 0 1px #A9D5DE inset,0 0 0 0 transparent}.ui.info.message .header{color:#0E566C}.ui.warning.message{background-color:#FFFAF3;color:#573A08}.ui.attached.warning.message,.ui.warning.message{box-shadow:0 0 0 1px #C9BA9B inset,0 0 0 0 transparent}.ui.warning.message .header{color:#794B02}.ui.error.message{background-color:#FFF6F6;color:#9F3A38}.ui.attached.error.message,.ui.error.message{box-shadow:0 0 0 1px #E0B4B4 inset,0 0 0 0 transparent}.ui.error.message .header{color:#912D2B}.ui.success.message{background-color:#FCFFF5;color:#2C662D}.ui.attached.success.message,.ui.success.message{box-shadow:0 0 0 1px #A3C293 inset,0 0 0 0 transparent}.ui.success.message .header{color:#1A531B}.ui.black.message,.ui.inverted.message{background-color:#1B1C1D;color:rgba(255,255,255,.9)}.ui.red.message{background-color:#FFE8E6;color:#DB2828;box-shadow:0 0 0 1px #DB2828 inset,0 0 0 0 transparent}.ui.red.message .header{color:#c82121}.ui.orange.message{background-color:#FFEDDE;color:#F2711C;box-shadow:0 0 0 1px #F2711C inset,0 0 0 0 transparent}.ui.orange.message .header{color:#e7640d}.ui.yellow.message{background-color:#FFF8DB;color:#B58105;box-shadow:0 0 0 1px #B58105 inset,0 0 0 0 transparent}.ui.yellow.message .header{color:#9c6f04}.ui.olive.message{background-color:#FBFDEF;color:#8ABC1E;box-shadow:0 0 0 1px #8ABC1E inset,0 0 0 0 transparent}.ui.olive.message .header{color:#7aa61a}.ui.green.message{background-color:#E5F9E7;color:#1EBC30;box-shadow:0 0 0 1px #1EBC30 inset,0 0 0 0 transparent}.ui.green.message .header{color:#1aa62a}.ui.teal.message{background-color:#E1F7F7;color:#10A3A3;box-shadow:0 0 0 1px #10A3A3 inset,0 0 0 0 transparent}.ui.teal.message .header{color:#0e8c8c}.ui.blue.message{background-color:#DFF0FF;color:#2185D0;box-shadow:0 0 0 1px #2185D0 inset,0 0 0 0 transparent}.ui.blue.message .header{color:#1e77ba}.ui.violet.message{background-color:#EAE7FF;color:#6435C9;box-shadow:0 0 0 1px #6435C9 inset,0 0 0 0 transparent}.ui.violet.message .header{color:#5a30b5}.ui.purple.message{background-color:#F6E7FF;color:#A333C8;box-shadow:0 0 0 1px #A333C8 inset,0 0 0 0 transparent}.ui.purple.message .header{color:#922eb4}.ui.pink.message{background-color:#FFE3FB;color:#E03997;box-shadow:0 0 0 1px #E03997 inset,0 0 0 0 transparent}.ui.pink.message .header{color:#dd238b}.ui.brown.message{background-color:#F1E2D3;color:#A5673F;box-shadow:0 0 0 1px #A5673F inset,0 0 0 0 transparent}.ui.brown.message .header{color:#935b38}.ui.mini.message{font-size:.78571429em}.ui.tiny.message{font-size:.85714286em}.ui.small.message{font-size:.92857143em}.ui.message{font-size:1em}.ui.large.message{font-size:1.14285714em}.ui.big.message{font-size:1.28571429em}.ui.huge.message{font-size:1.42857143em}.ui.massive.message{font-size:1.71428571em}.ui.table{width:100%;background:#FFF;margin:1em 0;border:1px solid rgba(34,36,38,.15);box-shadow:none;border-radius:.28571429rem;text-align:left;color:rgba(0,0,0,.87);border-collapse:separate;border-spacing:0}.ui.table:first-child{margin-top:0}.ui.table:last-child{margin-bottom:0}.ui.table td,.ui.table th{-webkit-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.table thead{box-shadow:none}.ui.table thead th{cursor:auto;background:#F9FAFB;text-align:inherit;color:rgba(0,0,0,.87);padding:.92857143em .78571429em;vertical-align:inherit;font-style:none;font-weight:700;text-transform:none;border-bottom:1px solid rgba(34,36,38,.1);border-left:none}.ui.table thead tr>th:first-child{border-left:none}.ui.table thead tr:first-child>th:first-child{border-radius:.28571429rem 0 0}.ui.table thead tr:first-child>th:last-child{border-radius:0 .28571429rem 0 0}.ui.table thead tr:first-child>th:only-child{border-radius:.28571429rem .28571429rem 0 0}.ui.table tfoot{box-shadow:none}.ui.table tfoot th{cursor:auto;border-top:1px solid rgba(34,36,38,.15);background:#F9FAFB;text-align:inherit;color:rgba(0,0,0,.87);padding:.78571429em;vertical-align:middle;font-style:normal;font-weight:400;text-transform:none}.ui.table tfoot tr>th:first-child{border-left:none}.ui.table tfoot tr:first-child>th:first-child{border-radius:0 0 0 .28571429rem}.ui.table tfoot tr:first-child>th:last-child{border-radius:0 0 .28571429rem}.ui.table tfoot tr:first-child>th:only-child{border-radius:0 0 .28571429rem .28571429rem}.ui.table tr td{border-top:1px solid rgba(34,36,38,.1)}.ui.table tr:first-child td{border-top:none}.ui.table td{padding:.78571429em;text-align:inherit}.ui.table>.icon{vertical-align:baseline}.ui.table>.icon:only-child{margin:0}.ui.table.segment{padding:0}.ui.table.segment:after{display:none}.ui.table.segment.stacked:after{display:block}@media only screen and (max-width:767px){.ui.table:not(.unstackable){width:100%;padding:0}.ui.table:not(.unstackable) tbody,.ui.table:not(.unstackable) tr,.ui.table:not(.unstackable) tr>td,.ui.table:not(.unstackable) tr>th{width:auto!important;display:block!important}.ui.table:not(.unstackable) tfoot,.ui.table:not(.unstackable) thead{display:block}.ui.table:not(.unstackable) tr{padding-top:1em;padding-bottom:1em;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important}.ui.table:not(.unstackable) tr>td,.ui.table:not(.unstackable) tr>th{background:0 0;border:none!important;padding:.25em .75em!important;box-shadow:none!important}.ui.table:not(.unstackable) td:first-child,.ui.table:not(.unstackable) th:first-child{font-weight:700}.ui.definition.table:not(.unstackable) thead th:first-child{box-shadow:none!important}}.ui.table td .image,.ui.table td .image img,.ui.table th .image,.ui.table th .image img{max-width:none}.ui.structured.table{border-collapse:collapse}.ui.structured.table thead th{border-left:none;border-right:none}.ui.structured.sortable.table thead th{border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(34,36,38,.15)}.ui.structured.basic.table th{border-left:none;border-right:none}.ui.structured.celled.table tr td,.ui.structured.celled.table tr th{border-left:1px solid rgba(34,36,38,.1);border-right:1px solid rgba(34,36,38,.1)}.ui.definition.table thead:not(.full-width) th:first-child{pointer-events:none;background:0 0;font-weight:400;color:rgba(0,0,0,.4);box-shadow:-1px -1px 0 1px #FFF}.ui.definition.table tfoot:not(.full-width) th:first-child{pointer-events:none;background:0 0;font-weight:rgba(0,0,0,.4);color:normal;box-shadow:1px 1px 0 1px #FFF}.ui.celled.definition.table thead:not(.full-width) th:first-child{box-shadow:0 -1px 0 1px #FFF}.ui.celled.definition.table tfoot:not(.full-width) th:first-child{box-shadow:0 1px 0 1px #FFF}.ui.definition.table tr td.definition,.ui.definition.table tr td:first-child:not(.ignored){background:rgba(0,0,0,.03);font-weight:700;color:rgba(0,0,0,.95);text-transform:'';box-shadow:'';text-align:'';font-size:1em;padding-left:'';padding-right:''}.ui.definition.table td:nth-child(2),.ui.definition.table tfoot:not(.full-width) th:nth-child(2),.ui.definition.table thead:not(.full-width) th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.table td.positive,.ui.table tr.positive{box-shadow:0 0 0 #A3C293 inset;background:#FCFFF5!important;color:#2C662D!important}.ui.table td.negative,.ui.table tr.negative{box-shadow:0 0 0 #E0B4B4 inset;background:#FFF6F6!important;color:#9F3A38!important}.ui.table td.error,.ui.table tr.error{box-shadow:0 0 0 #E0B4B4 inset;background:#FFF6F6!important;color:#9F3A38!important}.ui.table td.warning,.ui.table tr.warning{box-shadow:0 0 0 #C9BA9B inset;background:#FFFAF3!important;color:#573A08!important}.ui.table td.active,.ui.table tr.active{box-shadow:0 0 0 rgba(0,0,0,.87) inset;background:#E0E0E0!important;color:rgba(0,0,0,.87)!important}.ui.table tr td.disabled,.ui.table tr.disabled td,.ui.table tr.disabled:hover,.ui.table tr:hover td.disabled{pointer-events:none;color:rgba(40,40,40,.3)}@media only screen and (max-width:991px){.ui[class*="tablet stackable"].table,.ui[class*="tablet stackable"].table tbody,.ui[class*="tablet stackable"].table tr,.ui[class*="tablet stackable"].table tr>td,.ui[class*="tablet stackable"].table tr>th{width:100%!important;display:block!important}.ui[class*="tablet stackable"].table{padding:0}.ui[class*="tablet stackable"].table tfoot,.ui[class*="tablet stackable"].table thead{display:block}.ui[class*="tablet stackable"].table tr{padding-top:1em;padding-bottom:1em;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important}.ui[class*="tablet stackable"].table tr>td,.ui[class*="tablet stackable"].table tr>th{background:0 0;border:none!important;padding:.25em .75em;box-shadow:none!important}.ui.definition[class*="tablet stackable"].table thead th:first-child{box-shadow:none!important}}.ui.table [class*="left aligned"],.ui.table[class*="left aligned"]{text-align:left}.ui.table [class*="center aligned"],.ui.table[class*="center aligned"]{text-align:center}.ui.table [class*="right aligned"],.ui.table[class*="right aligned"]{text-align:right}.ui.table [class*="top aligned"],.ui.table[class*="top aligned"]{vertical-align:top}.ui.table [class*="middle aligned"],.ui.table[class*="middle aligned"]{vertical-align:middle}.ui.table [class*="bottom aligned"],.ui.table[class*="bottom aligned"]{vertical-align:bottom}.ui.table td.collapsing,.ui.table th.collapsing{width:1px;white-space:nowrap}.ui.fixed.table{table-layout:fixed}.ui.fixed.table td,.ui.fixed.table th{overflow:hidden;text-overflow:ellipsis}.ui.selectable.table tbody tr:hover,.ui.table tbody tr td.selectable:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.inverted.table tbody tr td.selectable:hover,.ui.selectable.inverted.table tbody tr:hover{background:rgba(255,255,255,.08)!important;color:#fff!important}.ui.table tbody tr td.selectable{padding:0}.ui.table tbody tr td.selectable>a:not(.ui){display:block;color:inherit;padding:.78571429em}.ui.selectable.table tr.error:hover,.ui.selectable.table tr:hover td.error,.ui.table tr td.selectable.error:hover{background:#ffe7e7!important;color:#943634!important}.ui.selectable.table tr.warning:hover,.ui.selectable.table tr:hover td.warning,.ui.table tr td.selectable.warning:hover{background:#fff4e4!important;color:#493107!important}.ui.selectable.table tr.active:hover,.ui.selectable.table tr:hover td.active,.ui.table tr td.selectable.active:hover{background:#E0E0E0!important;color:rgba(0,0,0,.87)!important}.ui.selectable.table tr.positive:hover,.ui.selectable.table tr:hover td.positive,.ui.table tr td.selectable.positive:hover{background:#f7ffe6!important;color:#275b28!important}.ui.selectable.table tr.negative:hover,.ui.selectable.table tr:hover td.negative,.ui.table tr td.selectable.negative:hover{background:#ffe7e7!important;color:#943634!important}.ui.attached.table{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);box-shadow:none;border:1px solid #D4D4D5}.ui.attached+.ui.attached.table:not(.top){border-top:none}.ui[class*="top attached"].table{bottom:0;margin-bottom:0;top:0;margin-top:1em;border-radius:.28571429rem .28571429rem 0 0}.ui.table[class*="top attached"]:first-child{margin-top:0}.ui[class*="bottom attached"].table{bottom:0;margin-top:0;top:0;margin-bottom:1em;box-shadow:none,none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].table:last-child{margin-bottom:0}.ui.striped.table tbody tr:nth-child(2n),.ui.striped.table>tr:nth-child(2n){background-color:rgba(0,0,50,.02)}.ui.inverted.striped.table tbody tr:nth-child(2n),.ui.inverted.striped.table>tr:nth-child(2n){background-color:rgba(255,255,255,.05)}.ui.striped.selectable.selectable.selectable.table tbody tr.active:hover{background:#EFEFEF!important;color:rgba(0,0,0,.95)!important}.ui.table [class*="single line"],.ui.table[class*="single line"]{white-space:nowrap}.ui.red.table{border-top:.2em solid #DB2828}.ui.inverted.red.table{background-color:#DB2828!important;color:#FFF!important}.ui.orange.table{border-top:.2em solid #F2711C}.ui.inverted.orange.table{background-color:#F2711C!important;color:#FFF!important}.ui.yellow.table{border-top:.2em solid #FBBD08}.ui.inverted.yellow.table{background-color:#FBBD08!important;color:#FFF!important}.ui.olive.table{border-top:.2em solid #B5CC18}.ui.inverted.olive.table{background-color:#B5CC18!important;color:#FFF!important}.ui.green.table{border-top:.2em solid #21BA45}.ui.inverted.green.table{background-color:#21BA45!important;color:#FFF!important}.ui.teal.table{border-top:.2em solid #00B5AD}.ui.inverted.teal.table{background-color:#00B5AD!important;color:#FFF!important}.ui.blue.table{border-top:.2em solid #2185D0}.ui.inverted.blue.table{background-color:#2185D0!important;color:#FFF!important}.ui.violet.table{border-top:.2em solid #6435C9}.ui.inverted.violet.table{background-color:#6435C9!important;color:#FFF!important}.ui.purple.table{border-top:.2em solid #A333C8}.ui.inverted.purple.table{background-color:#A333C8!important;color:#FFF!important}.ui.pink.table{border-top:.2em solid #E03997}.ui.inverted.pink.table{background-color:#E03997!important;color:#FFF!important}.ui.brown.table{border-top:.2em solid #A5673F}.ui.inverted.brown.table{background-color:#A5673F!important;color:#FFF!important}.ui.grey.table{border-top:.2em solid #767676}.ui.inverted.grey.table{background-color:#767676!important;color:#FFF!important}.ui.black.table{border-top:.2em solid #1B1C1D}.ui.inverted.black.table{background-color:#1B1C1D!important;color:#FFF!important}.ui.one.column.table td{width:100%}.ui.two.column.table td{width:50%}.ui.three.column.table td{width:33.33333333%}.ui.four.column.table td{width:25%}.ui.five.column.table td{width:20%}.ui.six.column.table td{width:16.66666667%}.ui.seven.column.table td{width:14.28571429%}.ui.eight.column.table td{width:12.5%}.ui.nine.column.table td{width:11.11111111%}.ui.ten.column.table td{width:10%}.ui.eleven.column.table td{width:9.09090909%}.ui.twelve.column.table td{width:8.33333333%}.ui.thirteen.column.table td{width:7.69230769%}.ui.fourteen.column.table td{width:7.14285714%}.ui.fifteen.column.table td{width:6.66666667%}.ui.sixteen.column.table td,.ui.table td.one.wide,.ui.table th.one.wide{width:6.25%}.ui.table td.two.wide,.ui.table th.two.wide{width:12.5%}.ui.table td.three.wide,.ui.table th.three.wide{width:18.75%}.ui.table td.four.wide,.ui.table th.four.wide{width:25%}.ui.table td.five.wide,.ui.table th.five.wide{width:31.25%}.ui.table td.six.wide,.ui.table th.six.wide{width:37.5%}.ui.table td.seven.wide,.ui.table th.seven.wide{width:43.75%}.ui.table td.eight.wide,.ui.table th.eight.wide{width:50%}.ui.table td.nine.wide,.ui.table th.nine.wide{width:56.25%}.ui.table td.ten.wide,.ui.table th.ten.wide{width:62.5%}.ui.table td.eleven.wide,.ui.table th.eleven.wide{width:68.75%}.ui.table td.twelve.wide,.ui.table th.twelve.wide{width:75%}.ui.table td.thirteen.wide,.ui.table th.thirteen.wide{width:81.25%}.ui.table td.fourteen.wide,.ui.table th.fourteen.wide{width:87.5%}.ui.table td.fifteen.wide,.ui.table th.fifteen.wide{width:93.75%}.ui.table td.sixteen.wide,.ui.table th.sixteen.wide{width:100%}.ui.sortable.table thead th{cursor:pointer;white-space:nowrap;border-left:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87)}.ui.sortable.table thead th:first-child{border-left:none}.ui.sortable.table thead th.sorted,.ui.sortable.table thead th.sorted:hover{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.sortable.table thead th:after{display:none;font-style:normal;font-weight:400;text-decoration:inherit;content:'';height:1em;width:auto;opacity:.8;margin:0 0 0 .5em;font-family:Icons}.ui.sortable.table thead th.ascending:after{content:'\f0d8'}.ui.sortable.table thead th.descending:after{content:'\f0d7'}.ui.sortable.table th.disabled:hover{cursor:auto;color:rgba(40,40,40,.3)}.ui.sortable.table thead th:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8)}.ui.sortable.table thead th.sorted{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.sortable.table thead th.sorted:after{display:inline-block}.ui.sortable.table thead th.sorted:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.inverted.sortable.table thead th.sorted{background:-webkit-linear-gradient(transparent,rgba(0,0,0,.05)) rgba(255,255,255,.15);background:linear-gradient(transparent,rgba(0,0,0,.05)) rgba(255,255,255,.15);color:#fff}.ui.inverted.sortable.table thead th:hover{background:-webkit-linear-gradient(transparent,rgba(0,0,0,.05)) rgba(255,255,255,.08);background:linear-gradient(transparent,rgba(0,0,0,.05)) rgba(255,255,255,.08);color:#fff}.ui.inverted.sortable.table thead th{border-left-color:transparent;border-right-color:transparent}.ui.inverted.table{background:#333;color:rgba(255,255,255,.9);border:none}.ui.inverted.table th{background-color:rgba(0,0,0,.15);border-color:rgba(255,255,255,.1)!important;color:rgba(255,255,255,.9)}.ui.inverted.table tr td{border-color:rgba(255,255,255,.1)!important}.ui.inverted.table tr td.disabled,.ui.inverted.table tr.disabled td,.ui.inverted.table tr.disabled:hover td,.ui.inverted.table tr:hover td.disabled{pointer-events:none;color:rgba(225,225,225,.3)}.ui.inverted.definition.table tfoot:not(.full-width) th:first-child,.ui.inverted.definition.table thead:not(.full-width) th:first-child{background:#FFF}.ui.inverted.definition.table tr td:first-child{background:rgba(255,255,255,.02);color:#fff}.ui.collapsing.table{width:auto}.ui.basic.table{background:0 0;border:1px solid rgba(34,36,38,.15);box-shadow:none}.ui.basic.table tfoot,.ui.basic.table thead{box-shadow:none}.ui.basic.table th{background:0 0;border-left:none}.ui.basic.table tbody tr{border-bottom:1px solid rgba(0,0,0,.1)}.ui.basic.table td{background:0 0}.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.05)!important}.ui[class*="very basic"].table{border:none}.ui[class*="very basic"].table:not(.sortable):not(.striped) td,.ui[class*="very basic"].table:not(.sortable):not(.striped) th{padding:''}.ui[class*="very basic"].table:not(.sortable):not(.striped) td:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped) th:first-child{padding-left:0}.ui[class*="very basic"].table:not(.sortable):not(.striped) td:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped) th:last-child{padding-right:0}.ui[class*="very basic"].table:not(.sortable):not(.striped) thead tr:first-child th{padding-top:0}.ui.celled.table tr td,.ui.celled.table tr th{border-left:1px solid rgba(34,36,38,.1)}.ui.celled.table tr td:first-child,.ui.celled.table tr th:first-child{border-left:none}.ui.padded.table th{padding-left:1em;padding-right:1em}.ui.padded.table td,.ui.padded.table th{padding:1em}.ui[class*="very padded"].table th{padding-left:1.5em;padding-right:1.5em}.ui[class*="very padded"].table td{padding:1.5em}.ui.compact.table th{padding-left:.7em;padding-right:.7em}.ui.compact.table td{padding:.5em .7em}.ui[class*="very compact"].table th{padding-left:.6em;padding-right:.6em}.ui[class*="very compact"].table td{padding:.4em .6em}.ui.small.table{font-size:.9em}.ui.table{font-size:1em}.ui.large.table{font-size:1.1em}.ui.ad{display:block;overflow:hidden;margin:1em 0}.ui.ad:first-child,.ui.ad:last-child{margin:0}.ui.ad iframe{margin:0;padding:0;border:none;overflow:hidden}.ui.leaderboard.ad{width:728px;height:90px}.ui[class*="medium rectangle"].ad{width:300px;height:250px}.ui[class*="large rectangle"].ad{width:336px;height:280px}.ui[class*="half page"].ad{width:300px;height:600px}.ui.square.ad{width:250px;height:250px}.ui[class*="small square"].ad{width:200px;height:200px}.ui[class*="small rectangle"].ad{width:180px;height:150px}.ui[class*="vertical rectangle"].ad{width:240px;height:400px}.ui.button.ad{width:120px;height:90px}.ui[class*="square button"].ad{width:125px;height:125px}.ui[class*="small button"].ad{width:120px;height:60px}.ui.skyscraper.ad{width:120px;height:600px}.ui[class*="wide skyscraper"].ad{width:160px}.ui.banner.ad{width:468px;height:60px}.ui[class*="vertical banner"].ad{width:120px;height:240px}.ui[class*="top banner"].ad{width:930px;height:180px}.ui[class*="half banner"].ad{width:234px;height:60px}.ui[class*="large leaderboard"].ad{width:970px;height:90px}.ui.billboard.ad{width:970px;height:250px}.ui.panorama.ad{width:980px;height:120px}.ui.netboard.ad{width:580px;height:400px}.ui[class*="large mobile banner"].ad{width:320px;height:100px}.ui[class*="mobile leaderboard"].ad{width:320px;height:50px}.ui.mobile.ad{display:none}@media only screen and (max-width:767px){.ui.mobile.ad{display:block}}.ui.centered.ad{margin-left:auto;margin-right:auto}.ui.test.ad{position:relative;background:#545454}.ui.test.ad:after{position:absolute;top:50%;left:50%;width:100%;text-align:center;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);content:'Ad';color:#FFF;font-size:1em;font-weight:700}.ui.mobile.test.ad:after{font-size:.85714286em}.ui.test.ad[data-text]:after{content:attr(data-text)}.ui.card,.ui.cards>.card{max-width:100%;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:290px;min-height:0;background:#FFF;padding:0;border:none;border-radius:.28571429rem;box-shadow:0 1px 3px 0 #D4D4D5,0 0 0 1px #D4D4D5;-webkit-transition:box-shadow .1s ease,-webkit-transform .1s ease;transition:box-shadow .1s ease,-webkit-transform .1s ease;transition:box-shadow .1s ease,transform .1s ease;transition:box-shadow .1s ease,transform .1s ease,-webkit-transform .1s ease;z-index:''}.ui.card{margin:1em 0}.ui.card a,.ui.cards>.card a{cursor:pointer}.ui.card:first-child{margin-top:0}.ui.card:last-child{margin-bottom:0}.ui.cards{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:-.875em -.5em;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.cards>.card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:.875em .5em;float:none}.ui.card:after,.ui.cards:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.cards~.ui.cards{margin-top:.875em}.ui.card>:first-child,.ui.cards>.card>:first-child{border-radius:.28571429rem .28571429rem 0 0!important;border-top:none!important}.ui.card>:last-child,.ui.cards>.card>:last-child{border-radius:0 0 .28571429rem .28571429rem!important}.ui.card>:only-child,.ui.cards>.card>:only-child{border-radius:.28571429rem!important}.ui.card>.image,.ui.cards>.card>.image{position:relative;display:block;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;background:rgba(0,0,0,.05)}.ui.card>.image>img,.ui.cards>.card>.image>img{display:block;width:100%;height:auto;border-radius:inherit}.ui.card>.image:not(.ui)>img,.ui.cards>.card>.image:not(.ui)>img{border:none}.ui.card>.content,.ui.cards>.card>.content{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border:none;border-top:1px solid rgba(34,36,38,.1);background:0 0;margin:0;padding:1em;box-shadow:none;font-size:1em;border-radius:0}.ui.card>.content:after,.ui.cards>.card>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.card>.content>.header,.ui.cards>.card>.content>.header{display:block;margin:'';font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;color:rgba(0,0,0,.85)}.ui.card>.content>.header:not(.ui),.ui.cards>.card>.content>.header:not(.ui){font-weight:700;font-size:1.28571429em;margin-top:-.21425em;line-height:1.2857em}.ui.card>.content>.header+.description,.ui.card>.content>.meta+.description,.ui.cards>.card>.content>.header+.description,.ui.cards>.card>.content>.meta+.description{margin-top:.5em}.ui.card [class*="left floated"],.ui.cards>.card [class*="left floated"]{float:left}.ui.card [class*="right floated"],.ui.cards>.card [class*="right floated"]{float:right}.ui.card [class*="left aligned"],.ui.cards>.card [class*="left aligned"]{text-align:left}.ui.card [class*="center aligned"],.ui.cards>.card [class*="center aligned"]{text-align:center}.ui.card [class*="right aligned"],.ui.cards>.card [class*="right aligned"]{text-align:right}.ui.card .content img,.ui.cards>.card .content img{display:inline-block;vertical-align:middle;width:''}.ui.card .avatar img,.ui.card img.avatar,.ui.cards>.card .avatar img,.ui.cards>.card img.avatar{width:2em;height:2em;border-radius:500rem}.ui.card>.content>.description,.ui.cards>.card>.content>.description{clear:both;color:rgba(0,0,0,.68)}.ui.card>.content p,.ui.cards>.card>.content p{margin:0 0 .5em}.ui.card>.content p:last-child,.ui.cards>.card>.content p:last-child{margin-bottom:0}.ui.card .meta,.ui.cards>.card .meta{font-size:1em;color:rgba(0,0,0,.4)}.ui.card .meta *,.ui.cards>.card .meta *{margin-right:.3em}.ui.card .meta :last-child,.ui.cards>.card .meta :last-child{margin-right:0}.ui.card .meta [class*="right floated"],.ui.cards>.card .meta [class*="right floated"]{margin-right:0;margin-left:.3em}.ui.card>.content a:not(.ui),.ui.cards>.card>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content a:not(.ui):hover,.ui.cards>.card>.content a:not(.ui):hover{color:''}.ui.card>.content>a.header,.ui.cards>.card>.content>a.header{color:rgba(0,0,0,.85)}.ui.card>.content>a.header:hover,.ui.cards>.card>.content>a.header:hover{color:#1e70bf}.ui.card .meta>a:not(.ui),.ui.cards>.card .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.card .meta>a:not(.ui):hover,.ui.cards>.card .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.card>.button,.ui.card>.buttons,.ui.cards>.card>.button,.ui.cards>.card>.buttons{margin:0 -1px;width:calc(100% + 2px)}.ui.card .dimmer,.ui.cards>.card .dimmer{background-color:'';z-index:10}.ui.card>.content .star.icon,.ui.cards>.card>.content .star.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content .star.icon:hover,.ui.cards>.card>.content .star.icon:hover{opacity:1;color:#FFB70A}.ui.card>.content .active.star.icon,.ui.cards>.card>.content .active.star.icon{color:#FFE623}.ui.card>.content .like.icon,.ui.cards>.card>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content .like.icon:hover,.ui.cards>.card>.content .like.icon:hover{opacity:1;color:#FF2733}.ui.card>.content .active.like.icon,.ui.cards>.card>.content .active.like.icon{color:#FF2733}.ui.card>.extra,.ui.cards>.card>.extra{max-width:100%;min-height:0!important;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;border-top:1px solid rgba(0,0,0,.05)!important;position:static;background:0 0;width:auto;margin:0;padding:.75em 1em;top:0;left:0;color:rgba(0,0,0,.4);box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.extra a:not(.ui),.ui.cards>.card>.extra a:not(.ui){color:rgba(0,0,0,.4)}.ui.card>.extra a:not(.ui):hover,.ui.cards>.card>.extra a:not(.ui):hover{color:#1e70bf}.ui.link.cards .raised.card:hover,.ui.link.raised.card:hover,.ui.raised.cards a.card:hover,a.ui.raised.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 4px 0 rgba(34,36,38,.15),0 2px 10px 0 rgba(34,36,38,.25)}.ui.raised.card,.ui.raised.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.centered.cards{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui.centered.card{margin-left:auto;margin-right:auto}.ui.fluid.card{width:100%;max-width:9999px}.ui.cards a.card,.ui.link.card,.ui.link.cards .card,a.ui.card{-webkit-transform:none;transform:none}.ui.cards a.card:hover,.ui.link.card:hover,.ui.link.cards .card:hover,a.ui.card:hover{cursor:pointer;z-index:5;background:#FFF;border:none;box-shadow:0 1px 3px 0 #BCBDBD,0 0 0 1px #D4D4D5;-webkit-transform:translateY(-3px);transform:translateY(-3px)}.ui.cards>.red.card,.ui.red.card,.ui.red.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #DB2828,0 1px 3px 0 #D4D4D5}.ui.cards>.red.card:hover,.ui.red.card:hover,.ui.red.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #d01919,0 1px 3px 0 #BCBDBD}.ui.cards>.orange.card,.ui.orange.card,.ui.orange.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #F2711C,0 1px 3px 0 #D4D4D5}.ui.cards>.orange.card:hover,.ui.orange.card:hover,.ui.orange.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #f26202,0 1px 3px 0 #BCBDBD}.ui.cards>.yellow.card,.ui.yellow.card,.ui.yellow.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #FBBD08,0 1px 3px 0 #D4D4D5}.ui.cards>.yellow.card:hover,.ui.yellow.card:hover,.ui.yellow.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #eaae00,0 1px 3px 0 #BCBDBD}.ui.cards>.olive.card,.ui.olive.card,.ui.olive.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #B5CC18,0 1px 3px 0 #D4D4D5}.ui.cards>.olive.card:hover,.ui.olive.card:hover,.ui.olive.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #a7bd0d,0 1px 3px 0 #BCBDBD}.ui.cards>.green.card,.ui.green.card,.ui.green.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #21BA45,0 1px 3px 0 #D4D4D5}.ui.cards>.green.card:hover,.ui.green.card:hover,.ui.green.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #16ab39,0 1px 3px 0 #BCBDBD}.ui.cards>.teal.card,.ui.teal.card,.ui.teal.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #00B5AD,0 1px 3px 0 #D4D4D5}.ui.cards>.teal.card:hover,.ui.teal.card:hover,.ui.teal.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #009c95,0 1px 3px 0 #BCBDBD}.ui.blue.card,.ui.blue.cards>.card,.ui.cards>.blue.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #2185D0,0 1px 3px 0 #D4D4D5}.ui.blue.card:hover,.ui.blue.cards>.card:hover,.ui.cards>.blue.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #1678c2,0 1px 3px 0 #BCBDBD}.ui.cards>.violet.card,.ui.violet.card,.ui.violet.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #6435C9,0 1px 3px 0 #D4D4D5}.ui.cards>.violet.card:hover,.ui.violet.card:hover,.ui.violet.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #5829bb,0 1px 3px 0 #BCBDBD}.ui.cards>.purple.card,.ui.purple.card,.ui.purple.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #A333C8,0 1px 3px 0 #D4D4D5}.ui.cards>.purple.card:hover,.ui.purple.card:hover,.ui.purple.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #9627ba,0 1px 3px 0 #BCBDBD}.ui.cards>.pink.card,.ui.pink.card,.ui.pink.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #E03997,0 1px 3px 0 #D4D4D5}.ui.cards>.pink.card:hover,.ui.pink.card:hover,.ui.pink.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #e61a8d,0 1px 3px 0 #BCBDBD}.ui.brown.card,.ui.brown.cards>.card,.ui.cards>.brown.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #A5673F,0 1px 3px 0 #D4D4D5}.ui.brown.card:hover,.ui.brown.cards>.card:hover,.ui.cards>.brown.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #975b33,0 1px 3px 0 #BCBDBD}.ui.cards>.grey.card,.ui.grey.card,.ui.grey.cards>.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #767676,0 1px 3px 0 #D4D4D5}.ui.cards>.grey.card:hover,.ui.grey.card:hover,.ui.grey.cards>.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #838383,0 1px 3px 0 #BCBDBD}.ui.black.card,.ui.black.cards>.card,.ui.cards>.black.card{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #1B1C1D,0 1px 3px 0 #D4D4D5}.ui.black.card:hover,.ui.black.cards>.card:hover,.ui.cards>.black.card:hover{box-shadow:0 0 0 1px #D4D4D5,0 2px 0 0 #27292a,0 1px 3px 0 #BCBDBD}.ui.one.cards{margin-left:0;margin-right:0}.ui.one.cards>.card{width:100%}.ui.two.cards{margin-left:-1em;margin-right:-1em}.ui.two.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.three.cards{margin-left:-1em;margin-right:-1em}.ui.three.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.four.cards{margin-left:-.75em;margin-right:-.75em}.ui.four.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.five.cards{margin-left:-.75em;margin-right:-.75em}.ui.five.cards>.card{width:calc(20% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.six.cards{margin-left:-.75em;margin-right:-.75em}.ui.six.cards>.card{width:calc(16.66666667% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.seven.cards{margin-left:-.5em;margin-right:-.5em}.ui.seven.cards>.card{width:calc(14.28571429% - 1em);margin-left:.5em;margin-right:.5em}.ui.eight.cards{margin-left:-.5em;margin-right:-.5em}.ui.eight.cards>.card{width:calc(12.5% - 1em);margin-left:.5em;margin-right:.5em;font-size:11px}.ui.nine.cards{margin-left:-.5em;margin-right:-.5em}.ui.nine.cards>.card{width:calc(11.11111111% - 1em);margin-left:.5em;margin-right:.5em;font-size:10px}.ui.ten.cards{margin-left:-.5em;margin-right:-.5em}.ui.ten.cards>.card{width:calc(10% - 1em);margin-left:.5em;margin-right:.5em}@media only screen and (max-width:767px){.ui.two.doubling.cards{margin-left:0;margin-right:0}.ui.two.doubling.cards .card{width:100%;margin-left:0;margin-right:0}.ui.three.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.three.doubling.cards .card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.four.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.four.doubling.cards .card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.five.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.five.doubling.cards .card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.six.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.six.doubling.cards .card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.seven.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.seven.doubling.cards .card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.eight.doubling.cards .card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.nine.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.nine.doubling.cards .card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.ten.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.ten.doubling.cards .card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}}@media only screen and (min-width:768px) and (max-width:991px){.ui.two.doubling.cards{margin-left:0;margin-right:0}.ui.two.doubling.cards .card{width:100%;margin-left:0;margin-right:0}.ui.three.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.three.doubling.cards .card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.four.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.four.doubling.cards .card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.five.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.five.doubling.cards .card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.six.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.six.doubling.cards .card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.eight.doubling.cards .card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.nine.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.nine.doubling.cards .card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.ten.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.ten.doubling.cards .card{width:calc(20% - 1.5em);margin-left:.75em;margin-right:.75em}}@media only screen and (max-width:767px){.ui.stackable.cards{display:block!important}.ui.stackable.cards .card:first-child{margin-top:0!important}.ui.stackable.cards>.card{display:block!important;height:auto!important;margin:1em;padding:0!important;width:calc(100% - 2em)!important}}.ui.cards>.card{font-size:1em}.ui.comments{margin:1.5em 0;max-width:650px}.ui.comments:first-child{margin-top:0}.ui.comments:last-child{margin-bottom:0}.ui.comments .comment{position:relative;background:0 0;margin:.5em 0 0;padding:.5em 0 0;border:none;border-top:none;line-height:1.2}.ui.comments .comment:first-child{margin-top:0;padding-top:0}.ui.comments .comment .comments{margin:0 0 .5em .5em;padding:1em 0 1em 1em}.ui.comments .comment .comments:before{position:absolute;top:0;left:0}.ui.comments .comment .comments .comment{border:none;border-top:none;background:0 0}.ui.comments .comment .avatar{display:block;width:2.5em;height:auto;float:left;margin:.2em 0 0}.ui.comments .comment .avatar img,.ui.comments .comment img.avatar{display:block;margin:0 auto;width:100%;height:100%;border-radius:.25rem}.ui.comments .comment>.content{display:block}.ui.comments .comment>.avatar~.content{margin-left:3.5em}.ui.comments .comment .author{font-size:1em;color:rgba(0,0,0,.87);font-weight:700}.ui.comments .comment a.author{cursor:pointer}.ui.comments .comment a.author:hover{color:#1e70bf}.ui.comments .comment .metadata{display:inline-block;margin-left:.5em;color:rgba(0,0,0,.4);font-size:.875em}.ui.comments .comment .metadata>*{display:inline-block;margin:0 .5em 0 0}.ui.comments .comment .metadata>:last-child{margin-right:0}.ui.comments .comment .text{margin:.25em 0 .5em;font-size:1em;word-wrap:break-word;color:rgba(0,0,0,.87);line-height:1.3}.ui.comments .comment .actions{font-size:.875em}.ui.comments .comment .actions a{cursor:pointer;display:inline-block;margin:0 .75em 0 0;color:rgba(0,0,0,.4)}.ui.comments .comment .actions a:last-child{margin-right:0}.ui.comments .comment .actions a.active,.ui.comments .comment .actions a:hover{color:rgba(0,0,0,.8)}.ui.comments>.reply.form{margin-top:1em}.ui.comments .comment .reply.form{width:100%;margin-top:1em}.ui.comments .reply.form textarea{font-size:1em;height:12em}.ui.collapsed.comments,.ui.comments .collapsed.comment,.ui.comments .collapsed.comments{display:none}.ui.threaded.comments .comment .comments{margin:-1.5em 0 -1em 1.25em;padding:3em 0 2em 2.25em;box-shadow:-1px 0 0 rgba(34,36,38,.15)}.ui.minimal.comments .comment .actions{opacity:0;position:absolute;top:0;right:0;left:auto;-webkit-transition:opacity .2s ease;transition:opacity .2s ease;-webkit-transition-delay:.1s;transition-delay:.1s}.ui.minimal.comments .comment>.content:hover>.actions{opacity:1}.ui.small.comments{font-size:.9em}.ui.comments{font-size:1em}.ui.large.comments{font-size:1.1em}.ui.huge.comments{font-size:1.2em}.ui.feed{margin:1em 0}.ui.feed:first-child{margin-top:0}.ui.feed:last-child{margin-bottom:0}.ui.feed>.event{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;width:100%;padding:.21428571rem 0;margin:0;background:0 0;border-top:none}.ui.feed>.event:first-child{border-top:0;padding-top:0}.ui.feed>.event:last-child{padding-bottom:0}.ui.feed>.event>.label{display:block;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:2.5em;height:auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;text-align:left}.ui.feed>.event>.label .icon{opacity:1;font-size:1.5em;width:100%;padding:.25em;background:0 0;border:none;border-radius:none;color:rgba(0,0,0,.6)}.ui.feed>.event>.label img{width:100%;height:auto;border-radius:500rem}.ui.feed>.event>.label+.content{margin:.5em 0 .35714286em 1.14285714em}.ui.feed>.event>.content{display:block;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;text-align:left;word-wrap:break-word}.ui.feed>.event:last-child>.content{padding-bottom:0}.ui.feed>.event>.content a{cursor:pointer}.ui.feed>.event>.content .date{margin:-.5rem 0 0;padding:0;font-weight:400;font-size:1em;font-style:normal;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .summary{margin:0;font-size:1em;font-weight:700;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .summary img{display:inline-block;width:auto;height:10em;margin:-.25em .25em 0 0;border-radius:.25em;vertical-align:middle}.ui.feed>.event>.content .user{display:inline-block;font-weight:700;margin-right:0;vertical-align:baseline}.ui.feed>.event>.content .user img{margin:-.25em .25em 0 0;width:auto;height:10em;vertical-align:middle}.ui.feed>.event>.content .summary>.date{display:inline-block;float:none;font-weight:400;font-size:.85714286em;font-style:normal;margin:0 0 0 .5em;padding:0;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .extra{margin:.5em 0 0;background:0 0;padding:0;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .extra.images img{display:inline-block;margin:0 .25em 0 0;width:6em}.ui.feed>.event>.content .extra.text{padding:0;border-left:none;font-size:1em;max-width:500px;line-height:1.4285em}.ui.feed>.event>.content .meta{display:inline-block;font-size:.85714286em;margin:.5em 0 0;background:0 0;border:none;border-radius:0;box-shadow:none;padding:0;color:rgba(0,0,0,.6)}.ui.feed>.event>.content .meta>*{position:relative;margin-left:.75em}.ui.feed>.event>.content .meta>:after{content:'';color:rgba(0,0,0,.2);top:0;left:-1em;opacity:1;position:absolute;vertical-align:top}.ui.feed>.event>.content .meta .like{color:'';-webkit-transition:.2s color ease;transition:.2s color ease}.ui.feed>.event>.content .meta .like:hover .icon{color:#FF2733}.ui.feed>.event>.content .meta .active.like .icon{color:#EF404A}.ui.feed>.event>.content .meta>:first-child{margin-left:0}.ui.feed>.event>.content .meta>:first-child::after{display:none}.ui.feed>.event>.content .meta a,.ui.feed>.event>.content .meta>.icon{cursor:pointer;opacity:1;color:rgba(0,0,0,.5);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.feed>.event>.content .meta a:hover,.ui.feed>.event>.content .meta a:hover .icon,.ui.feed>.event>.content .meta>.icon:hover{color:rgba(0,0,0,.95)}.ui.small.feed{font-size:.92857143rem}.ui.feed{font-size:1rem}.ui.large.feed{font-size:1.14285714rem}.ui.items>.item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1em 0;width:100%;min-height:0;background:0 0;padding:0;border:none;border-radius:0;box-shadow:none;-webkit-transition:box-shadow .1s ease;transition:box-shadow .1s ease;z-index:''}.ui.items>.item a{cursor:pointer}.ui.items{margin:1.5em 0}.ui.items:first-child{margin-top:0!important}.ui.items:last-child{margin-bottom:0!important}.ui.items>.item:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item:first-child{margin-top:0}.ui.items>.item:last-child{margin-bottom:0}.ui.items>.item>.image{position:relative;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;float:none;margin:0;padding:0;max-height:'';-webkit-align-self:top;-ms-flex-item-align:top;align-self:top}.ui.items>.item>.image>img{display:block;width:100%;height:auto;border-radius:.125rem;border:none}.ui.items>.item>.image:only-child>img{border-radius:0}.ui.items>.item>.content{display:block;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;background:0 0;margin:0;padding:0;box-shadow:none;font-size:1em;border:none;border-radius:0}.ui.items>.item>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image+.content{min-width:0;width:auto;display:block;margin-left:0;-webkit-align-self:top;-ms-flex-item-align:top;align-self:top;padding-left:1.5em}.ui.items>.item>.content>.header{display:inline-block;margin:-.21425em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.85)}.ui.items>.item>.content>.header:not(.ui){font-size:1.28571429em}.ui.items>.item [class*="left floated"]{float:left}.ui.items>.item [class*="right floated"]{float:right}.ui.items>.item .content img{-webkit-align-self:middle;-ms-flex-item-align:middle;align-self:middle;width:''}.ui.items>.item .avatar img,.ui.items>.item img.avatar{width:'';height:'';border-radius:500rem}.ui.items>.item>.content>.description{margin-top:.6em;max-width:auto;font-size:1em;line-height:1.4285em;color:rgba(0,0,0,.87)}.ui.items>.item>.content p{margin:0 0 .5em}.ui.items>.item>.content p:last-child{margin-bottom:0}.ui.items>.item .meta{margin:.5em 0;font-size:1em;line-height:1em;color:rgba(0,0,0,.6)}.ui.items>.item .meta *{margin-right:.3em}.ui.items>.item .meta :last-child{margin-right:0}.ui.items>.item .meta [class*="right floated"]{margin-right:0;margin-left:.3em}.ui.items>.item>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content a:not(.ui):hover{color:''}.ui.items>.item>.content>a.header{color:rgba(0,0,0,.85)}.ui.items>.item>.content>a.header:hover{color:#1e70bf}.ui.items>.item .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.items>.item .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.items>.item>.content .favorite.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .favorite.icon:hover{opacity:1;color:#FFB70A}.ui.items>.item>.content .active.favorite.icon{color:#FFE623}.ui.items>.item>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .like.icon:hover{opacity:1;color:#FF2733}.ui.items>.item>.content .active.like.icon{color:#FF2733}.ui.items>.item .extra{display:block;position:relative;background:0 0;margin:.5rem 0 0;width:100%;padding:0;top:0;left:0;color:rgba(0,0,0,.4);box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease;border-top:none}.ui.items>.item .extra>*{margin:.25rem .5rem .25rem 0}.ui.items>.item .extra>[class*="right floated"]{margin:.25rem 0 .25rem .5rem}.ui.items>.item .extra:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image:not(.ui){width:175px}@media only screen and (min-width:768px) and (max-width:991px){.ui.items>.item{margin:1em 0}.ui.items>.item>.image:not(.ui){width:150px}.ui.items>.item>.image+.content{display:block;padding:0 0 0 1em}}@media only screen and (max-width:767px){.ui.items>.item{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:2em 0}.ui.items>.item>.image{display:block;margin-left:auto;margin-right:auto}.ui.items>.item>.image,.ui.items>.item>.image>img{max-width:100%!important;width:auto!important;max-height:250px!important}.ui.items>.item>.image+.content{display:block;padding:1.5em 0 0}}.ui.items>.item>.image+[class*="top aligned"].content{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.ui.items>.item>.image+[class*="middle aligned"].content{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.ui.items>.item>.image+[class*="bottom aligned"].content{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.ui.relaxed.items>.item{margin:1.5em 0}.ui[class*="very relaxed"].items>.item{margin:2em 0}.ui.divided.items>.item{border-top:1px solid rgba(34,36,38,.15);margin:0;padding:1em 0}.ui.divided.items>.item:first-child{border-top:none;margin-top:0!important;padding-top:0!important}.ui.divided.items>.item:last-child{margin-bottom:0!important;padding-bottom:0!important}.ui.relaxed.divided.items>.item{margin:0;padding:1.5em 0}.ui[class*="very relaxed"].divided.items>.item{margin:0;padding:2em 0}.ui.items a.item:hover,.ui.link.items>.item:hover{cursor:pointer}.ui.items a.item:hover .content .header,.ui.link.items>.item:hover .content .header{color:#1e70bf}.ui.items>.item{font-size:1em}.ui.statistic{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:1em 0;max-width:auto}.ui.statistic+.ui.statistic{margin:0 0 0 1.5em}.ui.statistic:first-child{margin-top:0}.ui.statistic:last-child{margin-bottom:0}.ui.statistics{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.statistics>.statistic{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:0 1.5em 2em;max-width:auto}.ui.statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1em -1.5em -2em}.ui.statistics:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.statistics:first-child{margin-top:0}.ui.statistics:last-child{margin-bottom:0}.ui.statistic>.value,.ui.statistics .statistic>.value{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:400;line-height:1em;color:#1B1C1D;text-transform:uppercase;text-align:center}.ui.statistic>.label,.ui.statistics .statistic>.label{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;font-weight:700;color:rgba(0,0,0,.87);text-transform:uppercase;text-align:center}.ui.statistic>.label~.value,.ui.statistic>.value~.label,.ui.statistics .statistic>.label~.value,.ui.statistics .statistic>.value~.label{margin-top:0}.ui.statistic>.value .icon,.ui.statistics .statistic>.value .icon{opacity:1;width:auto;margin:0}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{line-height:1em;min-height:2em;font-weight:700;text-align:center}.ui.statistic>.text.value+.label,.ui.statistics .statistic>.text.value+.label{text-align:center}.ui.statistic>.value img,.ui.statistics .statistic>.value img{max-height:3rem;vertical-align:baseline}.ui.ten.statistics{margin:0 0 -2em}.ui.ten.statistics .statistic{min-width:10%;margin:0 0 2em}.ui.nine.statistics{margin:0 0 -2em}.ui.nine.statistics .statistic{min-width:11.11111111%;margin:0 0 2em}.ui.eight.statistics{margin:0 0 -2em}.ui.eight.statistics .statistic{min-width:12.5%;margin:0 0 2em}.ui.seven.statistics{margin:0 0 -2em}.ui.seven.statistics .statistic{min-width:14.28571429%;margin:0 0 2em}.ui.six.statistics{margin:0 0 -2em}.ui.six.statistics .statistic{min-width:16.66666667%;margin:0 0 2em}.ui.five.statistics{margin:0 0 -2em}.ui.five.statistics .statistic{min-width:20%;margin:0 0 2em}.ui.four.statistics{margin:0 0 -2em}.ui.four.statistics .statistic{min-width:25%;margin:0 0 2em}.ui.three.statistics{margin:0 0 -2em}.ui.three.statistics .statistic{min-width:33.33333333%;margin:0 0 2em}.ui.two.statistics{margin:0 0 -2em}.ui.two.statistics .statistic{min-width:50%;margin:0 0 2em}.ui.one.statistics{margin:0 0 -2em}.ui.one.statistics .statistic{min-width:100%;margin:0 0 2em}.ui.horizontal.statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center}.ui.horizontal.statistics{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:0;max-width:none}.ui.horizontal.statistics .statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;max-width:none;margin:1em 0}.ui.horizontal.statistic>.text.value,.ui.horizontal.statistics>.statistic>.text.value{min-height:0!important}.ui.horizontal.statistic>.value .icon,.ui.horizontal.statistics .statistic>.value .icon{width:1.18em}.ui.horizontal.statistic>.label,.ui.horizontal.statistics .statistic>.label{display:inline-block;vertical-align:middle;margin:0 0 0 .75em}.ui.red.statistic>.value,.ui.red.statistics .statistic>.value,.ui.statistics .red.statistic>.value{color:#DB2828}.ui.orange.statistic>.value,.ui.orange.statistics .statistic>.value,.ui.statistics .orange.statistic>.value{color:#F2711C}.ui.statistics .yellow.statistic>.value,.ui.yellow.statistic>.value,.ui.yellow.statistics .statistic>.value{color:#FBBD08}.ui.olive.statistic>.value,.ui.olive.statistics .statistic>.value,.ui.statistics .olive.statistic>.value{color:#B5CC18}.ui.green.statistic>.value,.ui.green.statistics .statistic>.value,.ui.statistics .green.statistic>.value{color:#21BA45}.ui.statistics .teal.statistic>.value,.ui.teal.statistic>.value,.ui.teal.statistics .statistic>.value{color:#00B5AD}.ui.blue.statistic>.value,.ui.blue.statistics .statistic>.value,.ui.statistics .blue.statistic>.value{color:#2185D0}.ui.statistics .violet.statistic>.value,.ui.violet.statistic>.value,.ui.violet.statistics .statistic>.value{color:#6435C9}.ui.purple.statistic>.value,.ui.purple.statistics .statistic>.value,.ui.statistics .purple.statistic>.value{color:#A333C8}.ui.pink.statistic>.value,.ui.pink.statistics .statistic>.value,.ui.statistics .pink.statistic>.value{color:#E03997}.ui.brown.statistic>.value,.ui.brown.statistics .statistic>.value,.ui.statistics .brown.statistic>.value{color:#A5673F}.ui.grey.statistic>.value,.ui.grey.statistics .statistic>.value,.ui.statistics .grey.statistic>.value{color:#767676}.ui.inverted.statistic .value,.ui.inverted.statistics .statistic>.value{color:#FFF}.ui.inverted.statistic .label,.ui.inverted.statistics .statistic>.label{color:rgba(255,255,255,.9)}.ui.inverted.red.statistic>.value,.ui.inverted.red.statistics .statistic>.value,.ui.statistics .inverted.red.statistic>.value{color:#FF695E}.ui.inverted.orange.statistic>.value,.ui.inverted.orange.statistics .statistic>.value,.ui.statistics .inverted.orange.statistic>.value{color:#FF851B}.ui.inverted.yellow.statistic>.value,.ui.inverted.yellow.statistics .statistic>.value,.ui.statistics .inverted.yellow.statistic>.value{color:#FFE21F}.ui.inverted.olive.statistic>.value,.ui.inverted.olive.statistics .statistic>.value,.ui.statistics .inverted.olive.statistic>.value{color:#D9E778}.ui.inverted.green.statistic>.value,.ui.inverted.green.statistics .statistic>.value,.ui.statistics .inverted.green.statistic>.value{color:#2ECC40}.ui.inverted.teal.statistic>.value,.ui.inverted.teal.statistics .statistic>.value,.ui.statistics .inverted.teal.statistic>.value{color:#6DFFFF}.ui.inverted.blue.statistic>.value,.ui.inverted.blue.statistics .statistic>.value,.ui.statistics .inverted.blue.statistic>.value{color:#54C8FF}.ui.inverted.violet.statistic>.value,.ui.inverted.violet.statistics .statistic>.value,.ui.statistics .inverted.violet.statistic>.value{color:#A291FB}.ui.inverted.purple.statistic>.value,.ui.inverted.purple.statistics .statistic>.value,.ui.statistics .inverted.purple.statistic>.value{color:#DC73FF}.ui.inverted.pink.statistic>.value,.ui.inverted.pink.statistics .statistic>.value,.ui.statistics .inverted.pink.statistic>.value{color:#FF8EDF}.ui.inverted.brown.statistic>.value,.ui.inverted.brown.statistics .statistic>.value,.ui.statistics .inverted.brown.statistic>.value{color:#D67C1C}.ui.inverted.grey.statistic>.value,.ui.inverted.grey.statistics .statistic>.value,.ui.statistics .inverted.grey.statistic>.value{color:#DCDDDE}.ui[class*="left floated"].statistic{float:left;margin:0 2em 1em 0}.ui[class*="right floated"].statistic{float:right;margin:0 0 1em 2em}.ui.floated.statistic:last-child{margin-bottom:0}.ui.mini.horizontal.statistic>.value,.ui.mini.horizontal.statistics .statistic>.value,.ui.mini.statistic>.value,.ui.mini.statistics .statistic>.value{font-size:1.5rem!important}.ui.mini.statistic>.text.value,.ui.mini.statistics .statistic>.text.value{font-size:1rem!important}.ui.tiny.horizontal.statistic>.value,.ui.tiny.horizontal.statistics .statistic>.value,.ui.tiny.statistic>.value,.ui.tiny.statistics .statistic>.value{font-size:2rem!important}.ui.tiny.statistic>.text.value,.ui.tiny.statistics .statistic>.text.value{font-size:1rem!important}.ui.small.statistic>.value,.ui.small.statistics .statistic>.value{font-size:3rem!important}.ui.small.horizontal.statistic>.value,.ui.small.horizontal.statistics .statistic>.value{font-size:2rem!important}.ui.small.statistic>.text.value,.ui.small.statistics .statistic>.text.value{font-size:1rem!important}.ui.statistic>.value,.ui.statistics .statistic>.value{font-size:4rem!important}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{display:inline-block;vertical-align:middle;font-size:3rem!important}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{font-size:2rem!important}.ui.large.statistic>.value,.ui.large.statistics .statistic>.value{font-size:5rem!important}.ui.large.horizontal.statistic>.value,.ui.large.horizontal.statistics .statistic>.value{font-size:4rem!important}.ui.large.statistic>.text.value,.ui.large.statistics .statistic>.text.value{font-size:2.5rem!important}.ui.huge.statistic>.value,.ui.huge.statistics .statistic>.value{font-size:6rem!important}.ui.huge.horizontal.statistic>.value,.ui.huge.horizontal.statistics .statistic>.value{font-size:5rem!important}.ui.huge.statistic>.text.value,.ui.huge.statistics .statistic>.text.value{font-size:2.5rem!important}.ui.accordion,.ui.accordion .accordion{max-width:100%}.ui.accordion .accordion{margin:1em 0 0;padding:0}.ui.accordion .accordion .title,.ui.accordion .title{cursor:pointer}.ui.accordion .title:not(.ui){padding:.5em 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;color:rgba(0,0,0,.87)}.ui.accordion .accordion .title~.content,.ui.accordion .title~.content{display:none}.ui.accordion:not(.styled) .accordion .title~.content:not(.ui),.ui.accordion:not(.styled) .title~.content:not(.ui){margin:'';padding:.5em 0 1em}.ui.accordion:not(.styled) .title~.content:not(.ui):last-child{padding-bottom:0}.ui.accordion .accordion .title .dropdown.icon,.ui.accordion .title .dropdown.icon{display:inline-block;float:none;opacity:1;width:1.25em;height:1em;margin:0 .25rem 0 0;padding:0;font-size:1em;-webkit-transition:opacity .1s ease,-webkit-transform .1s ease;transition:opacity .1s ease,-webkit-transform .1s ease;transition:transform .1s ease,opacity .1s ease;transition:transform .1s ease,opacity .1s ease,-webkit-transform .1s ease;vertical-align:baseline;-webkit-transform:none;transform:none}.ui.accordion.menu .item .title{display:block;padding:0}.ui.accordion.menu .item .title>.dropdown.icon{float:right;margin:.21425em 0 0 1em;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.ui.accordion .ui.header .dropdown.icon{font-size:1em;margin:0 .25rem 0 0}.ui.accordion .accordion .active.title .dropdown.icon,.ui.accordion .active.title .dropdown.icon,.ui.accordion.menu .item .active.title>.dropdown.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.ui.styled.accordion{width:600px}.ui.styled.accordion,.ui.styled.accordion .accordion{border-radius:.28571429rem;background:#FFF;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15)}.ui.styled.accordion .accordion .title,.ui.styled.accordion .title{margin:0;padding:.75em 1em;color:rgba(0,0,0,.4);font-weight:700;border-top:1px solid rgba(34,36,38,.15);-webkit-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.styled.accordion .accordion .title:first-child,.ui.styled.accordion>.title:first-child{border-top:none}.ui.styled.accordion .accordion .content,.ui.styled.accordion .content{margin:0;padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .content{padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .accordion .title:hover,.ui.styled.accordion .active.title,.ui.styled.accordion .title:hover{background:0 0;color:rgba(0,0,0,.87)}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .active.title{background:0 0;color:rgba(0,0,0,.95)}.ui.accordion .accordion .active.content,.ui.accordion .active.content{display:block}.ui.fluid.accordion,.ui.fluid.accordion .accordion{width:100%}.ui.inverted.accordion .title:not(.ui){color:rgba(255,255,255,.9)}@font-face{font-family:Accordion;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfOIKAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zryj6HgAAAFwAAAAyGhlYWT/0IhHAAACOAAAADZoaGVhApkB5wAAAnAAAAAkaG10eAJuABIAAAKUAAAAGGxvY2EAjABWAAACrAAAAA5tYXhwAAgAFgAAArwAAAAgbmFtZfC1n04AAALcAAABPHBvc3QAAwAAAAAEGAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQASAEkAtwFuABMAADc0PwE2FzYXFh0BFAcGJwYvASY1EgaABQgHBQYGBQcIBYAG2wcGfwcBAQcECf8IBAcBAQd/BgYAAAAAAQAAAEkApQFuABMAADcRNDc2MzIfARYVFA8BBiMiJyY1AAUGBwgFgAYGgAUIBwYFWwEACAUGBoAFCAcFgAYGBQcAAAABAAAAAQAAqWYls18PPPUACwIAAAAAAM/9o+4AAAAAz/2j7gAAAAAAtwFuAAAACAACAAAAAAAAAAEAAAHg/+AAAAIAAAAAAAC3AAEAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAQAAAAC3ABIAtwAAAAAAAAAKABQAHgBCAGQAAAABAAAABgAUAAEAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAASwAAoAAAAABGgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAS0AAAEtFpovuE9TLzIAAAIkAAAAYAAAAGAIIweQY21hcAAAAoQAAABMAAAATA984gpnYXNwAAAC0AAAAAgAAAAIAAAAEGhlYWQAAALYAAAANgAAADb/0IhHaGhlYQAAAxAAAAAkAAAAJAKZAedobXR4AAADNAAAABgAAAAYAm4AEm1heHAAAANMAAAABgAAAAYABlAAbmFtZQAAA1QAAAE8AAABPPC1n05wb3N0AAAEkAAAACAAAAAgAAMAAAEABAQAAQEBB3JhdGluZwABAgABADr4HAL4GwP4GAQeCgAZU/+Lix4KABlT/4uLDAeLa/iU+HQFHQAAAHkPHQAAAH4RHQAAAAkdAAABJBIABwEBBw0PERQZHnJhdGluZ3JhdGluZ3UwdTF1MjB1RjBEOXVGMERBAAACAYkABAAGAQEEBwoNVp38lA78lA78lA77lA773Z33bxWLkI2Qj44I9xT3FAWOj5CNkIuQi4+JjoePiI2Gi4YIi/uUBYuGiYeHiIiHh4mGi4aLho2Ijwj7FPcUBYeOiY+LkAgO+92L5hWL95QFi5CNkI6Oj4+PjZCLkIuQiY6HCPcU+xQFj4iNhouGi4aJh4eICPsU+xQFiIeGiYaLhouHjYePiI6Jj4uQCA74lBT4lBWLDAoAAAAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAEAADfYOJZfDzz1AAsCAAAAAADP/aPuAAAAAM/9o+4AAAAAALcBbgAAAAgAAgAAAAAAAAABAAAB4P/gAAACAAAAAAAAtwABAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAEAAAAAtwASALcAAAAAUAAABgAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:400;font-style:normal}.ui.accordion .accordion .title .dropdown.icon,.ui.accordion .title .dropdown.icon{font-family:Accordion;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.accordion .accordion .title .dropdown.icon:before,.ui.accordion .title .dropdown.icon:before{content:'\f0da'}.ui.checkbox{position:relative;display:inline-block;-webkit-backface-visibility:hidden;backface-visibility:hidden;outline:0;vertical-align:baseline;font-style:normal;min-height:17px;font-size:1rem;line-height:17px;min-width:17px}.ui.checkbox input[type=checkbox],.ui.checkbox input[type=radio]{cursor:pointer;position:absolute;top:0;left:0;opacity:0!important;outline:0;z-index:3;width:17px;height:17px}.ui.checkbox .box,.ui.checkbox label{cursor:auto;position:relative;display:block;padding-left:1.85714em;outline:0;font-size:1em}.ui.checkbox .box:before,.ui.checkbox label:before{position:absolute;top:0;left:0;width:17px;height:17px;content:'';background:#FFF;border-radius:.21428571rem;-webkit-transition:border .1s ease,opacity .1s ease,box-shadow .1s ease,-webkit-transform .1s ease;transition:border .1s ease,opacity .1s ease,box-shadow .1s ease,-webkit-transform .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease;border:1px solid #D4D4D5}.ui.checkbox .box:after,.ui.checkbox label:after{position:absolute;font-size:14px;top:0;left:0;width:17px;height:17px;text-align:center;opacity:0;color:rgba(0,0,0,.87);-webkit-transition:border .1s ease,opacity .1s ease,box-shadow .1s ease,-webkit-transform .1s ease;transition:border .1s ease,opacity .1s ease,box-shadow .1s ease,-webkit-transform .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease;font-family:Checkbox}.ui.checkbox label,.ui.checkbox+label{color:rgba(0,0,0,.87);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.checkbox+label{vertical-align:middle}.ui.checkbox .box:hover::before,.ui.checkbox label:hover::before{background:#FFF;border-color:rgba(34,36,38,.35)}.ui.checkbox label:hover,.ui.checkbox+label:hover{color:rgba(0,0,0,.8)}.ui.checkbox .box:active::before,.ui.checkbox label:active::before{background:#F9FAFB;border-color:rgba(34,36,38,.35)}.ui.checkbox .box:active::after,.ui.checkbox input:active~label,.ui.checkbox label:active::after{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~.box:before,.ui.checkbox input:focus~label:before{background:#FFF;border-color:#96C8DA}.ui.checkbox input:focus~.box:after,.ui.checkbox input:focus~label,.ui.checkbox input:focus~label:after{color:rgba(0,0,0,.95)}.ui.checkbox input:checked~.box:before,.ui.checkbox input:checked~label:before{background:#FFF;border-color:rgba(34,36,38,.35)}.ui.checkbox input:checked~.box:after,.ui.checkbox input:checked~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:not([type=radio]):indeterminate~.box:before,.ui.checkbox input:not([type=radio]):indeterminate~label:before{background:#FFF;border-color:rgba(34,36,38,.35)}.ui.checkbox input:not([type=radio]):indeterminate~.box:after,.ui.checkbox input:not([type=radio]):indeterminate~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:checked:focus~.box:before,.ui.checkbox input:checked:focus~label:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~.box:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:before{background:#FFF;border-color:#96C8DA}.ui.checkbox input:checked:focus~.box:after,.ui.checkbox input:checked:focus~label:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~.box:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:after{color:rgba(0,0,0,.95)}.ui.read-only.checkbox,.ui.read-only.checkbox label{cursor:default}.ui.checkbox input[disabled]~.box:after,.ui.checkbox input[disabled]~label,.ui.disabled.checkbox .box:after,.ui.disabled.checkbox label{cursor:default!important;opacity:.5;color:#000}.ui.checkbox input.hidden{z-index:-1}.ui.checkbox input.hidden+label{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.radio.checkbox{min-height:15px}.ui.radio.checkbox .box,.ui.radio.checkbox label{padding-left:1.85714em}.ui.radio.checkbox .box:before,.ui.radio.checkbox label:before{content:'';-webkit-transform:none;transform:none;width:15px;height:15px;border-radius:500rem;top:1px;left:0}.ui.radio.checkbox .box:after,.ui.radio.checkbox label:after{border:none;content:''!important;line-height:15px;top:1px;left:0;width:15px;height:15px;border-radius:500rem;-webkit-transform:scale(.46666667);transform:scale(.46666667);background-color:rgba(0,0,0,.87)}.ui.radio.checkbox input:focus~.box:before,.ui.radio.checkbox input:focus~label:before{background-color:#FFF}.ui.radio.checkbox input:focus~.box:after,.ui.radio.checkbox input:focus~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:indeterminate~.box:after,.ui.radio.checkbox input:indeterminate~label:after{opacity:0}.ui.radio.checkbox input:checked~.box:before,.ui.radio.checkbox input:checked~label:before{background-color:#FFF}.ui.radio.checkbox input:checked~.box:after,.ui.radio.checkbox input:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:focus:checked~.box:before,.ui.radio.checkbox input:focus:checked~label:before{background-color:#FFF}.ui.radio.checkbox input:focus:checked~.box:after,.ui.radio.checkbox input:focus:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.slider.checkbox{min-height:1.25rem}.ui.slider.checkbox input{width:3.5rem;height:1.25rem}.ui.slider.checkbox .box,.ui.slider.checkbox label{padding-left:4.5rem;line-height:1rem;color:rgba(0,0,0,.4)}.ui.slider.checkbox .box:before,.ui.slider.checkbox label:before{display:block;position:absolute;content:'';border:none!important;left:0;z-index:1;top:.4rem;background-color:rgba(0,0,0,.05);width:3.5rem;height:.21428571rem;-webkit-transform:none;transform:none;border-radius:500rem;-webkit-transition:background .3s ease;transition:background .3s ease}.ui.slider.checkbox .box:after,.ui.slider.checkbox label:after{background:-webkit-linear-gradient(transparent,rgba(0,0,0,.05)) #FFF;background:linear-gradient(transparent,rgba(0,0,0,.05)) #FFF;position:absolute;content:''!important;opacity:1;z-index:2;border:none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:-.25rem;left:0;-webkit-transform:none;transform:none;border-radius:500rem;-webkit-transition:left .3s ease;transition:left .3s ease}.ui.slider.checkbox input:focus~.box:before,.ui.slider.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.slider.checkbox .box:hover,.ui.slider.checkbox label:hover{color:rgba(0,0,0,.8)}.ui.slider.checkbox .box:hover::before,.ui.slider.checkbox label:hover::before{background:rgba(0,0,0,.15)}.ui.slider.checkbox input:checked~.box,.ui.slider.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:checked~.box:before,.ui.slider.checkbox input:checked~label:before{background-color:#545454!important}.ui.slider.checkbox input:checked~.box:after,.ui.slider.checkbox input:checked~label:after{left:2rem}.ui.slider.checkbox input:focus:checked~.box,.ui.slider.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:focus:checked~.box:before,.ui.slider.checkbox input:focus:checked~label:before{background-color:#000!important}.ui.toggle.checkbox{min-height:1.5rem}.ui.toggle.checkbox input{width:3.5rem;height:1.5rem}.ui.toggle.checkbox .box,.ui.toggle.checkbox label{min-height:1.5rem;padding-left:4.5rem;color:rgba(0,0,0,.87)}.ui.toggle.checkbox label{padding-top:.15em}.ui.toggle.checkbox .box:before,.ui.toggle.checkbox label:before{display:block;position:absolute;content:'';z-index:1;-webkit-transform:none;transform:none;border:none;top:0;background:rgba(0,0,0,.05);width:3.5rem;height:1.5rem;border-radius:500rem}.ui.toggle.checkbox .box:after,.ui.toggle.checkbox label:after{background:-webkit-linear-gradient(transparent,rgba(0,0,0,.05)) #FFF;background:linear-gradient(transparent,rgba(0,0,0,.05)) #FFF;position:absolute;content:''!important;opacity:1;z-index:2;border:none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:0;left:0;border-radius:500rem;-webkit-transition:background .3s ease,left .3s ease;transition:background .3s ease,left .3s ease}.ui.toggle.checkbox input~.box:after,.ui.toggle.checkbox input~label:after{left:-.05rem}.ui.toggle.checkbox .box:hover::before,.ui.toggle.checkbox input:focus~.box:before,.ui.toggle.checkbox input:focus~label:before,.ui.toggle.checkbox label:hover::before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox input:checked~.box,.ui.toggle.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:checked~.box:before,.ui.toggle.checkbox input:checked~label:before{background-color:#2185D0!important}.ui.toggle.checkbox input:checked~.box:after,.ui.toggle.checkbox input:checked~label:after{left:2.15rem}.ui.toggle.checkbox input:focus:checked~.box,.ui.toggle.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:focus:checked~.box:before,.ui.toggle.checkbox input:focus:checked~label:before{background-color:#0d71bb!important}.ui.fitted.checkbox .box,.ui.fitted.checkbox label{padding-left:0!important}.ui.fitted.slider.checkbox,.ui.fitted.toggle.checkbox{width:3.5rem}@font-face{font-family:Checkbox;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBD8AAAC8AAAAYGNtYXAYVtCJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zn4huwUAAAF4AAABYGhlYWQGPe1ZAAAC2AAAADZoaGVhB30DyAAAAxAAAAAkaG10eBBKAEUAAAM0AAAAHGxvY2EAmgESAAADUAAAABBtYXhwAAkALwAAA2AAAAAgbmFtZSC8IugAAAOAAAABknBvc3QAAwAAAAAFFAAAACAAAwMTAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADoAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6AL//f//AAAAAAAg6AD//f//AAH/4xgEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAEUAUQO7AvgAGgAAARQHAQYjIicBJjU0PwE2MzIfAQE2MzIfARYVA7sQ/hQQFhcQ/uMQEE4QFxcQqAF2EBcXEE4QAnMWEP4UEBABHRAXFhBOEBCoAXcQEE4QFwAAAAABAAABbgMlAkkAFAAAARUUBwYjISInJj0BNDc2MyEyFxYVAyUQEBf9SRcQEBAQFwK3FxAQAhJtFxAQEBAXbRcQEBAQFwAAAAABAAAASQMlA24ALAAAARUUBwYrARUUBwYrASInJj0BIyInJj0BNDc2OwE1NDc2OwEyFxYdATMyFxYVAyUQEBfuEBAXbhYQEO4XEBAQEBfuEBAWbhcQEO4XEBACEm0XEBDuFxAQEBAX7hAQF20XEBDuFxAQEBAX7hAQFwAAAQAAAAIAAHRSzT9fDzz1AAsEAAAAAADRsdR3AAAAANGx1HcAAAAAA7sDbgAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADuwABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABFAyUAAAMlAAAAAAAAAAoAFAAeAE4AcgCwAAEAAAAHAC0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhWZXJzaW9uIDIuMABWAGUAcgBzAGkAbwBuACAAMgAuADBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhDaGVja2JveABDAGgAZQBjAGsAYgBvAHhSZWd1bGFyAFIAZQBnAHUAbABhAHJDaGVja2JveABDAGgAZQBjAGsAYgBvAHhGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype')}.ui.checkbox input:checked~.box:after,.ui.checkbox input:checked~label:after{content:'\e800'}.ui.checkbox input:indeterminate~.box:after,.ui.checkbox input:indeterminate~label:after{font-size:12px;content:'\e801'}.dimmable:not(.body){position:relative}.ui.dimmer{display:none;position:absolute;top:0!important;left:0!important;width:100%;height:100%;text-align:center;vertical-align:middle;background-color:rgba(0,0,0,.85);opacity:0;line-height:1;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-transition:background-color .5s linear;transition:background-color .5s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:opacity;z-index:1000}.ui.dimmer>.content{width:100%;height:100%;display:table;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ui.dimmer>.content>*{display:table-cell;vertical-align:middle;color:#FFF}.ui.segment>.ui.dimmer{border-radius:inherit!important}.animating.dimmable:not(body),.dimmed.dimmable:not(body){overflow:hidden}.dimmed.dimmable>.ui.animating.dimmer,.dimmed.dimmable>.ui.visible.dimmer,.ui.active.dimmer{display:block;opacity:1}.ui.disabled.dimmer{width:0!important;height:0!important}.ui.page.dimmer{position:fixed;-webkit-transform-style:'';transform-style:'';-webkit-perspective:2000px;perspective:2000px;-webkit-transform-origin:center center;transform-origin:center center}body.animating.in.dimmable,body.dimmed.dimmable{overflow:hidden}body.dimmable>.dimmer{position:fixed}.blurring.dimmable>:not(.dimmer){-webkit-filter:blur(0) grayscale(0);filter:blur(0) grayscale(0);-webkit-transition:.8s filter ease;transition:.8s filter ease}.blurring.dimmed.dimmable>:not(.dimmer){-webkit-filter:blur(5px) grayscale(.7);filter:blur(5px) grayscale(.7)}.blurring.dimmable>.dimmer{background-color:rgba(0,0,0,.6)}.blurring.dimmable>.inverted.dimmer{background-color:rgba(255,255,255,.6)}.ui.dimmer>.top.aligned.content>*{vertical-align:top}.ui.dimmer>.bottom.aligned.content>*{vertical-align:bottom}.ui.inverted.dimmer{background-color:rgba(255,255,255,.85)}.ui.inverted.dimmer>.content>*{color:#FFF}.ui.simple.dimmer{display:block;overflow:hidden;opacity:1;width:0;height:0%;z-index:-100;background-color:rgba(0,0,0,0)}.dimmed.dimmable>.ui.simple.dimmer{overflow:visible;opacity:1;width:100%;height:100%;background-color:rgba(0,0,0,.85);z-index:1}.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,0)}.dimmed.dimmable>.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,.85)}.ui.dropdown{cursor:pointer;position:relative;display:inline-block;outline:0;text-align:left;-webkit-transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease;-webkit-tap-highlight-color:transparent}.ui.dropdown .menu{cursor:auto;position:absolute;display:none;outline:0;top:100%;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;margin:0;padding:0;background:#FFF;font-size:1em;text-shadow:none;text-align:left;box-shadow:0 2px 3px 0 rgba(34,36,38,.15);border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;z-index:11;will-change:transform,opacity}.ui.dropdown .menu>*{white-space:nowrap}.ui.dropdown>input:not(.search):first-child,.ui.dropdown>select{display:none!important}.ui.dropdown>.dropdown.icon{position:relative;font-size:.85714286em;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon{width:auto;float:right;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon+.text{margin-right:1em}.ui.dropdown>.text{display:inline-block;-webkit-transition:none;transition:none}.ui.dropdown .menu>.item{position:relative;cursor:pointer;display:block;border:none;height:auto;text-align:left;border-top:none;line-height:1em;color:rgba(0,0,0,.87);padding:.78571429rem 1.14285714rem!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.ui.dropdown .menu>.item:first-child{border-top-width:0}.ui.dropdown .menu .item>[class*="right floated"],.ui.dropdown>.text>[class*="right floated"]{float:right!important;margin-right:0!important;margin-left:1em!important}.ui.dropdown .menu .item>[class*="left floated"],.ui.dropdown>.text>[class*="left floated"]{float:left!important;margin-left:0!important;margin-right:1em!important}.ui.dropdown .menu .item>.flag.floated,.ui.dropdown .menu .item>.icon.floated,.ui.dropdown .menu .item>.image.floated,.ui.dropdown .menu .item>img.floated{margin-top:0}.ui.dropdown .menu>.header{margin:1rem 0 .75rem;padding:0 1.14285714rem;color:rgba(0,0,0,.85);font-size:.78571429em;font-weight:700;text-transform:uppercase}.ui.dropdown .menu>.divider{border-top:1px solid rgba(34,36,38,.1);height:0;margin:.5em 0}.ui.dropdown .menu>.input{width:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1.14285714rem .78571429rem;min-width:10rem}.ui.dropdown .menu>.header+.input{margin-top:0}.ui.dropdown .menu>.input:not(.transparent) input{padding:.5em 1em}.ui.dropdown .menu>.input:not(.transparent) .button,.ui.dropdown .menu>.input:not(.transparent) .icon,.ui.dropdown .menu>.input:not(.transparent) .label{padding-top:.5em;padding-bottom:.5em}.ui.dropdown .menu>.item>.description,.ui.dropdown>.text>.description{float:right;margin:0 0 0 1em;color:rgba(0,0,0,.4)}.ui.dropdown .menu>.message{padding:.78571429rem 1.14285714rem;font-weight:400}.ui.dropdown .menu>.message:not(.ui){color:rgba(0,0,0,.4)}.ui.dropdown .menu .menu{top:0!important;left:100%!important;right:auto!important;margin:0 0 0 -.5em!important;border-radius:.28571429rem!important;z-index:21!important}.ui.dropdown .menu .menu:after{display:none}.ui.dropdown .menu>.item>.flag,.ui.dropdown .menu>.item>.icon,.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>.label,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-top:0;margin-left:0;float:none;margin-right:.78571429rem}.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.image,.ui.dropdown>.text>img{display:inline-block;vertical-align:middle;width:auto;max-height:2em}.ui.dropdown .ui.menu>.item:before,.ui.menu .ui.dropdown .menu>.item:before{display:none}.ui.menu .ui.dropdown .menu .active.item{border-left:none}.ui.buttons>.ui.dropdown:last-child .menu,.ui.menu .right.dropdown.item .menu,.ui.menu .right.menu .dropdown:last-child .menu{left:auto;right:0}.ui.label.dropdown .menu{min-width:100%}.ui.dropdown.icon.button>.dropdown.icon{margin:0}.ui.button.dropdown .menu{min-width:100%}.ui.selection.dropdown{cursor:pointer;word-wrap:break-word;line-height:1em;white-space:normal;outline:0;-webkit-transform:rotateZ(0);transform:rotateZ(0);min-width:14em;min-height:2.7142em;background:#FFF;display:inline-block;padding:.78571429em 2.1em .78571429em 1em;color:rgba(0,0,0,.87);box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease}.ui.selection.dropdown.active,.ui.selection.dropdown.visible{z-index:10}select.ui.dropdown{height:38px;padding:.5em;border:1px solid rgba(34,36,38,.15);visibility:visible}.ui.selection.dropdown>.delete.icon,.ui.selection.dropdown>.dropdown.icon,.ui.selection.dropdown>.search.icon{cursor:pointer;position:absolute;width:auto;height:auto;line-height:1.2142em;top:.78571429em;right:1em;z-index:3;margin:-.78571429em;padding:.78571429em;opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.compact.selection.dropdown{min-width:0}.ui.selection.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch;border-top-width:0!important;outline:0;margin:0 -1px;min-width:calc(100% + 2px);width:calc(100% + 2px);border-radius:0 0 .28571429rem .28571429rem;box-shadow:0 2px 3px 0 rgba(34,36,38,.15);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.selection.dropdown .menu:after,.ui.selection.dropdown .menu:before{display:none}.ui.selection.dropdown .menu>.message{padding:.78571429rem 1.14285714rem}@media only screen and (max-width:767px){.ui.selection.dropdown .menu{max-height:8.01428571rem}}@media only screen and (min-width:768px){.ui.selection.dropdown .menu{max-height:10.68571429rem}}@media only screen and (min-width:992px){.ui.selection.dropdown .menu{max-height:16.02857143rem}}@media only screen and (min-width:1920px){.ui.selection.dropdown .menu{max-height:21.37142857rem}}.ui.selection.dropdown .menu>.item{border-top:1px solid #FAFAFA;padding:.78571429rem 1.14285714rem!important;white-space:normal;word-wrap:normal}.ui.selection.dropdown .menu>.hidden.addition.item{display:none}.ui.selection.dropdown:hover{border-color:rgba(34,36,38,.35);box-shadow:none}.ui.selection.active.dropdown,.ui.selection.active.dropdown .menu{border-color:#96C8DA;box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.dropdown:focus{border-color:#96C8DA;box-shadow:none}.ui.selection.dropdown:focus .menu{border-color:#96C8DA;box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.visible.dropdown>.text:not(.default){font-weight:400;color:rgba(0,0,0,.8)}.ui.selection.active.dropdown:hover,.ui.selection.active.dropdown:hover .menu{border-color:#96C8DA;box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.active.selection.dropdown>.dropdown.icon,.ui.visible.selection.dropdown>.dropdown.icon{opacity:1;z-index:3}.ui.active.selection.dropdown{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ui.active.empty.selection.dropdown{border-radius:.28571429rem!important;box-shadow:none!important}.ui.active.empty.selection.dropdown .menu{border:none!important;box-shadow:none!important}.ui.search.dropdown{min-width:''}.ui.search.dropdown>input.search{background:none!important;border:none!important;box-shadow:none!important;cursor:pointer;top:0;left:0;width:100%;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);padding:inherit;position:absolute;z-index:2}.ui.search.dropdown>.text{cursor:text;position:relative;left:1px;z-index:3}.ui.search.selection.dropdown>input.search{line-height:1.2142em;padding:.67861429em 2.1em .67861429em 1em}.ui.search.selection.dropdown>span.sizer{line-height:1.2142em;padding:.67861429em 2.1em .67861429em 1em;display:none;white-space:pre}.ui.search.dropdown.active>input.search,.ui.search.dropdown.visible>input.search{cursor:auto}.ui.search.dropdown.active>.text,.ui.search.dropdown.visible>.text{pointer-events:none}.ui.active.search.dropdown input.search:focus+.text .flag,.ui.active.search.dropdown input.search:focus+.text .icon{opacity:.45}.ui.active.search.dropdown input.search:focus+.text{color:rgba(115,115,115,.87)!important}.ui.search.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch}@media only screen and (max-width:767px){.ui.search.dropdown .menu{max-height:8.01428571rem}}@media only screen and (min-width:768px){.ui.search.dropdown .menu{max-height:10.68571429rem}}@media only screen and (min-width:992px){.ui.search.dropdown .menu{max-height:16.02857143rem}}@media only screen and (min-width:1920px){.ui.search.dropdown .menu{max-height:21.37142857rem}}.ui.multiple.dropdown{padding:.22620476em 2.1em .22620476em .35714286em}.ui.multiple.dropdown .menu{cursor:auto}.ui.multiple.search.dropdown,.ui.multiple.search.dropdown>input.search{cursor:text}.ui.multiple.dropdown>.label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:inline-block;vertical-align:top;white-space:normal;font-size:1em;padding:.35714286em .78571429em;margin:.14285714rem .28571429rem .14285714rem 0;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.multiple.dropdown .dropdown.icon{margin:'';padding:''}.ui.multiple.dropdown>.text{position:static;padding:0;max-width:100%;margin:.45240952em 0 .45240952em .64285714em;line-height:1.21428571em}.ui.multiple.dropdown>.label~input.search{margin-left:.14285714em!important}.ui.multiple.dropdown>.label~.text{display:none}.ui.multiple.search.dropdown>.text{display:inline-block;position:absolute;top:0;left:0;padding:inherit;margin:.45240952em 0 .45240952em .64285714em;line-height:1.21428571em}.ui.multiple.search.dropdown>.label~.text{display:none}.ui.multiple.search.dropdown>input.search{position:static;padding:0;max-width:100%;margin:.45240952em 0 .45240952em .64285714em;width:2.2em;line-height:1.21428571em}.ui.inline.dropdown{cursor:pointer;display:inline-block;color:inherit}.ui.inline.dropdown .dropdown.icon{margin:0 .5em 0 .21428571em;vertical-align:baseline}.ui.inline.dropdown>.text{font-weight:700}.ui.inline.dropdown .menu{cursor:auto;margin-top:.21428571em;border-radius:.28571429rem}.ui.dropdown .menu .active.item{background:0 0;font-weight:700;color:rgba(0,0,0,.95);box-shadow:none;z-index:12}.ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);z-index:13}.ui.loading.dropdown>i.icon{height:1em!important;padding:1.14285714em 1.07142857em!important}.ui.loading.dropdown>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.dropdown>i.icon:after{position:absolute;content:'';top:50%;left:50%;box-shadow:0 0 0 1px transparent;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:dropdown-spin .6s linear;animation:dropdown-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em}.ui.loading.dropdown.button>i.icon:after,.ui.loading.dropdown.button>i.icon:before{display:none}@-webkit-keyframes dropdown-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dropdown-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.default.dropdown:not(.button)>.text,.ui.dropdown:not(.button)>.default.text{color:rgba(191,191,191,.87)}.ui.default.dropdown:not(.button)>input:focus+.text,.ui.dropdown:not(.button)>input:focus+.default.text{color:rgba(115,115,115,.87)}.ui.loading.dropdown>.text{-webkit-transition:none;transition:none}.ui.dropdown .loading.menu{display:block;visibility:hidden;z-index:-1}.ui.dropdown .menu .selected.item,.ui.dropdown.selected{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.dropdown>.filtered.text{visibility:hidden}.ui.dropdown .filtered.item{display:none!important}.ui.dropdown.error,.ui.dropdown.error>.default.text,.ui.dropdown.error>.text{color:#9F3A38}.ui.selection.dropdown.error{background:#FFF6F6;border-color:#E0B4B4}.ui.dropdown.error>.menu,.ui.dropdown.error>.menu .menu,.ui.selection.dropdown.error:hover{border-color:#E0B4B4}.ui.dropdown.error>.menu>.item{color:#9F3A38}.ui.multiple.selection.error.dropdown>.label{border-color:#E0B4B4}.ui.dropdown.error>.menu>.item:hover{background-color:#FFF2F2}.ui.dropdown.error>.menu .active.item{background-color:#FDCFCF}.ui.disabled.dropdown,.ui.dropdown .menu>.disabled.item{cursor:default;pointer-events:none;opacity:.45}.ui.dropdown .menu{left:0}.ui.dropdown .menu .right.menu,.ui.dropdown .right.menu>.menu{left:100%!important;right:auto!important;border-radius:.28571429rem!important}.ui.dropdown .menu .left.menu,.ui.dropdown>.left.menu .menu{left:auto!important;right:100%!important;border-radius:.28571429rem!important}.ui.dropdown .item .left.dropdown.icon,.ui.dropdown .left.menu .item .dropdown.icon{width:auto;float:left;margin:0 .78571429rem 0 0}.ui.dropdown .item .left.dropdown.icon+.text,.ui.dropdown .left.menu .item .dropdown.icon+.text{margin-left:1em}.ui.upward.dropdown>.menu{top:auto;bottom:100%;box-shadow:0 0 3px 0 rgba(0,0,0,.08);border-radius:.28571429rem .28571429rem 0 0}.ui.dropdown .upward.menu{top:auto!important;bottom:0!important}.ui.simple.upward.active.dropdown,.ui.simple.upward.dropdown:hover{border-radius:.28571429rem .28571429rem 0 0!important}.ui.upward.dropdown.button:not(.pointing):not(.floating).active{border-radius:.28571429rem .28571429rem 0 0}.ui.upward.selection.dropdown .menu{border-top-width:1px!important;border-bottom-width:0!important;box-shadow:0 -2px 3px 0 rgba(0,0,0,.08)}.ui.upward.selection.dropdown:hover{box-shadow:0 0 2px 0 rgba(0,0,0,.05)}.ui.active.upward.selection.dropdown{border-radius:0 0 .28571429rem .28571429rem!important}.ui.upward.selection.dropdown.visible{box-shadow:0 0 3px 0 rgba(0,0,0,.08);border-radius:0 0 .28571429rem .28571429rem!important}.ui.upward.active.selection.dropdown:hover{box-shadow:0 0 3px 0 rgba(0,0,0,.05)}.ui.upward.active.selection.dropdown:hover .menu{box-shadow:0 -2px 3px 0 rgba(0,0,0,.08)}.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{overflow-x:hidden;overflow-y:auto}.ui.scrolling.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch;min-width:100%!important;width:auto!important}.ui.dropdown .scrolling.menu{position:static;overflow-y:auto;border:none;box-shadow:none!important;border-radius:0!important;margin:0!important;min-width:100%!important;width:auto!important;border-top:1px solid rgba(34,36,38,.15)}.ui.dropdown .scrolling.menu>.item.item.item,.ui.scrolling.dropdown .menu .item.item.item{border-top:none;padding-right:calc(1.14285714rem + 17px)!important}.ui.dropdown .scrolling.menu .item:first-child,.ui.scrolling.dropdown .menu .item:first-child{border-top:none}.ui.dropdown>.animating.menu .scrolling.menu,.ui.dropdown>.visible.menu .scrolling.menu{display:block}@media all and (-ms-high-contrast:none){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{min-width:calc(100% - 17px)}}@media only screen and (max-width:767px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:10.28571429rem}}.ui.simple.dropdown .menu:after,.ui.simple.dropdown .menu:before{display:none}.ui.simple.dropdown .menu{position:absolute;display:block;overflow:hidden;top:-9999px!important;opacity:0;width:0;height:0;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.simple.active.dropdown,.ui.simple.dropdown:hover{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ui.simple.active.dropdown>.menu,.ui.simple.dropdown:hover>.menu{overflow:visible;width:auto;height:auto;top:100%!important;opacity:1}.ui.simple.dropdown:hover>.menu>.item:hover>.menu,.ui.simple.dropdown>.menu>.item:active>.menu{overflow:visible;width:auto;height:auto;top:0!important;left:100%!important;opacity:1}.ui.simple.disabled.dropdown:hover .menu{display:none;height:0;width:0;overflow:hidden}.ui.simple.visible.dropdown>.menu{display:block}.ui.fluid.dropdown{display:block;width:100%;min-width:0}.ui.fluid.dropdown>.dropdown.icon{float:right}.ui.floating.dropdown .menu{left:0;right:auto;box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)!important;border-radius:.28571429rem!important}.ui.floating.dropdown>.menu{margin-top:.5em!important;border-radius:.28571429rem!important}.ui.pointing.dropdown>.menu{top:100%;margin-top:.78571429rem;border-radius:.28571429rem}.ui.pointing.dropdown>.menu:after{display:block;position:absolute;pointer-events:none;content:'';visibility:visible;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:.5em;height:.5em;box-shadow:-1px -1px 0 1px rgba(34,36,38,.15);background:#FFF;z-index:2;top:-.25em;left:50%;margin:0 0 0 -.25em}.ui.top.left.pointing.dropdown>.menu{top:100%;bottom:auto;left:0;right:auto;margin:1em 0 0}.ui.top.left.pointing.dropdown>.menu:after{top:-.25em;left:1em;right:auto;margin:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ui.top.right.pointing.dropdown>.menu{top:100%;bottom:auto;right:0;left:auto;margin:1em 0 0}.ui.top.right.pointing.dropdown>.menu:after{top:-.25em;left:auto;right:1em;margin:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ui.left.pointing.dropdown>.menu{top:0;left:100%;right:auto;margin:0 0 0 1em}.ui.left.pointing.dropdown>.menu:after{top:1em;left:-.25em;margin:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.ui.right.pointing.dropdown>.menu{top:0;left:auto;right:100%;margin:0 1em 0 0}.ui.right.pointing.dropdown>.menu:after{top:1em;left:auto;right:-.25em;margin:0;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.ui.bottom.pointing.dropdown>.menu{top:auto;bottom:100%;left:0;right:auto;margin:0 0 1em}.ui.bottom.pointing.dropdown>.menu:after{top:auto;bottom:-.25em;right:auto;margin:0;-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.ui.bottom.pointing.dropdown>.menu .menu{top:auto!important;bottom:0!important}.ui.bottom.left.pointing.dropdown>.menu{left:0;right:auto}.ui.bottom.left.pointing.dropdown>.menu:after{left:1em;right:auto}.ui.bottom.right.pointing.dropdown>.menu{right:0;left:auto}.ui.bottom.right.pointing.dropdown>.menu:after{left:auto;right:1em}.ui.upward.pointing.dropdown>.menu,.ui.upward.top.pointing.dropdown>.menu{top:auto;bottom:100%;margin:0 0 .78571429rem;border-radius:.28571429rem}.ui.upward.pointing.dropdown>.menu:after,.ui.upward.top.pointing.dropdown>.menu:after{top:100%;bottom:auto;box-shadow:1px 1px 0 1px rgba(34,36,38,.15);margin:-.25em 0 0}@font-face{font-family:Dropdown;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfuIIAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zjo82LgAAAFwAAABVGhlYWQAQ88bAAACxAAAADZoaGVhAwcB6QAAAvwAAAAkaG10eAS4ABIAAAMgAAAAIGxvY2EBNgDeAAADQAAAABJtYXhwAAoAFgAAA1QAAAAgbmFtZVcZpu4AAAN0AAABRXBvc3QAAwAAAAAEvAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDX//3//wAB/+MPLQADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAIABJQElABMAABM0NzY3BTYXFhUUDwEGJwYvASY1AAUGBwEACAUGBoAFCAcGgAUBEgcGBQEBAQcECQYHfwYBAQZ/BwYAAQAAAG4BJQESABMAADc0PwE2MzIfARYVFAcGIyEiJyY1AAWABgcIBYAGBgUI/wAHBgWABwaABQWABgcHBgUFBgcAAAABABIASQC3AW4AEwAANzQ/ATYXNhcWHQEUBwYnBi8BJjUSBoAFCAcFBgYFBwgFgAbbBwZ/BwEBBwQJ/wgEBwEBB38GBgAAAAABAAAASQClAW4AEwAANxE0NzYzMh8BFhUUDwEGIyInJjUABQYHCAWABgaABQgHBgVbAQAIBQYGgAUIBwWABgYFBwAAAAEAAAABAADZuaKOXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAAAAACgAUAB4AQgBkAIgAqgAAAAEAAAAIABQAAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAOAAAAAQAAAAAAAgAOAEcAAQAAAAAAAwAOACQAAQAAAAAABAAOAFUAAQAAAAAABQAWAA4AAQAAAAAABgAHADIAAQAAAAAACgA0AGMAAwABBAkAAQAOAAAAAwABBAkAAgAOAEcAAwABBAkAAwAOACQAAwABBAkABAAOAFUAAwABBAkABQAWAA4AAwABBAkABgAOADkAAwABBAkACgA0AGMAaQBjAG8AbQBvAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AbgBSAGUAZwB1AGwAYQByAGkAYwBvAG0AbwBvAG4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAAVwAAoAAAAABSgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAdkAAAHZLDXE/09TLzIAAALQAAAAYAAAAGAIIweQY21hcAAAAzAAAABMAAAATA9+4ghnYXNwAAADfAAAAAgAAAAIAAAAEGhlYWQAAAOEAAAANgAAADYAQ88baGhlYQAAA7wAAAAkAAAAJAMHAelobXR4AAAD4AAAACAAAAAgBLgAEm1heHAAAAQAAAAABgAAAAYACFAAbmFtZQAABAgAAAFFAAABRVcZpu5wb3N0AAAFUAAAACAAAAAgAAMAAAEABAQAAQEBCGljb21vb24AAQIAAQA6+BwC+BsD+BgEHgoAGVP/i4seCgAZU/+LiwwHi2v4lPh0BR0AAACIDx0AAACNER0AAAAJHQAAAdASAAkBAQgPERMWGyAlKmljb21vb25pY29tb29udTB1MXUyMHVGMEQ3dUYwRDh1RjBEOXVGMERBAAACAYkABgAIAgABAAQABwAKAA0AVgCfAOgBL/yUDvyUDvyUDvuUDvtvi/emFYuQjZCOjo+Pj42Qiwj3lIsFkIuQiY6Hj4iNhouGi4aJh4eHCPsU+xQFiIiGiYaLhouHjYeOCPsU9xQFiI+Jj4uQCA77b4v3FBWLkI2Pjo8I9xT3FAWPjo+NkIuQi5CJjogI9xT7FAWPh42Hi4aLhomHh4eIiIaJhosI+5SLBYaLh42HjoiPiY+LkAgO+92d928Vi5CNkI+OCPcU9xQFjo+QjZCLkIuPiY6Hj4iNhouGCIv7lAWLhomHh4iIh4eJhouGi4aNiI8I+xT3FAWHjomPi5AIDvvdi+YVi/eUBYuQjZCOjo+Pj42Qi5CLkImOhwj3FPsUBY+IjYaLhouGiYeHiAj7FPsUBYiHhomGi4aLh42Hj4iOiY+LkAgO+JQU+JQViwwKAAAAAAMCAAGQAAUAAAFMAWYAAABHAUwBZgAAAPUAGQCEAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA8NoB4P/g/+AB4AAgAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDw2v/9//8AAAAAACDw1//9//8AAf/jDy0AAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAABAAA5emozXw889QALAgAAAAAA0ABHWAAAAADQAEdYAAAAAAElAW4AAAAIAAIAAAAAAAAAAQAAAeD/4AAAAgAAAAAAASUAAQAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAABAAAAASUAAAElAAAAtwASALcAAAAAUAAACAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIADgBHAAEAAAAAAAMADgAkAAEAAAAAAAQADgBVAAEAAAAAAAUAFgAOAAEAAAAAAAYABwAyAAEAAAAAAAoANABjAAMAAQQJAAEADgAAAAMAAQQJAAIADgBHAAMAAQQJAAMADgAkAAMAAQQJAAQADgBVAAMAAQQJAAUAFgAOAAMAAQQJAAYADgA5AAMAAQQJAAoANABjAGkAYwBvAG0AbwBvAG4AVgBlAHIAcwBpAG8AbgAgADEALgAwAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG4AUgBlAGcAdQBsAGEAcgBpAGMAbwBtAG8AbwBuAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:400;font-style:normal}.ui.dropdown>.dropdown.icon{font-family:Dropdown;line-height:1;height:1em;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center;width:auto}.ui.dropdown>.dropdown.icon:before{content:'\f0d7'}.ui.dropdown .menu .item .dropdown.icon:before{content:'\f0da'}.ui.dropdown .item .left.dropdown.icon:before,.ui.dropdown .left.menu .item .dropdown.icon:before{content:"\f0d9"}.ui.vertical.menu .dropdown.item>.dropdown.icon:before{content:"\f0da"}.ui.embed{position:relative;max-width:100%;height:0;overflow:hidden;background:#DCDDDE;padding-bottom:56.25%}.ui.embed embed,.ui.embed iframe,.ui.embed object{position:absolute;border:none;width:100%;height:100%;top:0;left:0;margin:0;padding:0}.ui.embed>.embed{display:none}.ui.embed>.placeholder{position:absolute;cursor:pointer;top:0;left:0;display:block;width:100%;height:100%;background-color:radial-gradient(transparent 45%,rgba(0,0,0,.3))}.ui.embed>.icon{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;z-index:2}.ui.embed>.icon:after{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;content:'';background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:.5;-webkit-transition:opacity .5s ease;transition:opacity .5s ease}.ui.embed>.icon:before{position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);color:#FFF;font-size:6rem;text-shadow:0 2px 10px rgba(34,36,38,.2);-webkit-transition:opacity .5s ease,color .5s ease;transition:opacity .5s ease,color .5s ease;z-index:10}.ui.embed .icon:hover:after{background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:1}.ui.embed .icon:hover:before{color:#FFF}.ui.active.embed>.icon,.ui.active.embed>.placeholder{display:none}.ui.active.embed>.embed{display:block}.ui.square.embed{padding-bottom:100%}.ui[class*="4:3"].embed{padding-bottom:75%}.ui[class*="16:9"].embed{padding-bottom:56.25%}.ui[class*="21:9"].embed{padding-bottom:42.85714286%}.ui.modal{display:none;position:fixed;z-index:1001;top:50%;left:50%;text-align:left;background:#FFF;border:none;box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);-webkit-transform-origin:50% 25%;transform-origin:50% 25%;border-radius:.28571429rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;will-change:top,left,margin,transform,opacity}.ui.modal>.icon:first-child+*,.ui.modal>:first-child:not(.icon){border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.modal>:last-child{border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.modal>.close{cursor:pointer;position:absolute;top:-2.5rem;right:-2.5rem;z-index:1;opacity:.8;font-size:1.25em;color:#FFF;width:2.25rem;height:2.25rem;padding:.625rem 0 0}.ui.modal>.close:hover{opacity:1}.ui.modal>.header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#FFF;margin:0;padding:1.25rem 1.5rem;box-shadow:none;color:rgba(0,0,0,.85);border-bottom:1px solid rgba(34,36,38,.15)}.ui.modal>.header:not(.ui){font-size:1.42857143rem;line-height:1.2857em;font-weight:700}.ui.modal>.content{display:block;width:100%;font-size:1em;line-height:1.4;padding:1.5rem;background:#FFF}.ui.modal>.image.content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ui.modal>.content>.image{display:block;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;width:'';-webkit-align-self:top;-ms-flex-item-align:top;align-self:top}.ui.modal>[class*="top aligned"]{-webkit-align-self:top;-ms-flex-item-align:top;align-self:top}.ui.modal>[class*="middle aligned"]{-webkit-align-self:middle;-ms-flex-item-align:middle;align-self:middle}.ui.modal>[class*=stretched]{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch}.ui.modal>.content>.description{display:block;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;min-width:0;-webkit-align-self:top;-ms-flex-item-align:top;align-self:top}.ui.modal>.content>.icon+.description,.ui.modal>.content>.image+.description{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;min-width:'';width:auto;padding-left:2em}.ui.modal>.content>.image>i.icon{margin:0;opacity:1;width:auto;line-height:1;font-size:8rem}.ui.modal>.actions{background:#F9FAFB;padding:1rem;border-top:1px solid rgba(34,36,38,.15);text-align:right}.ui.modal .actions>.button{margin-left:.75em}@media only screen and (max-width:767px){.ui.modal{width:95%;margin:0 0 0 -47.5%}}@media only screen and (min-width:768px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:15.42857143rem}.ui.modal{width:88%;margin:0 0 0 -44%}}@media only screen and (min-width:992px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}.ui.modal{width:850px;margin:0 0 0 -425px}}@media only screen and (min-width:1200px){.ui.modal{width:900px;margin:0 0 0 -450px}}@media only screen and (min-width:1920px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}.ui.modal{width:950px;margin:0 0 0 -475px}}@media only screen and (max-width:991px){.ui.modal>.header{padding-right:2.25rem}.ui.modal>.close{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}}@media only screen and (max-width:767px){.ui.modal>.header{padding:.75rem 2.25rem .75rem 1rem!important}.ui.modal>.content{display:block;padding:1rem!important}.ui.modal>.close{top:.5rem!important;right:.5rem!important}.ui.modal .image.content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui.modal .content>.image{display:block;max-width:100%;margin:0 auto!important;text-align:center;padding:0 0 1rem!important}.ui.modal>.content>.image>i.icon{font-size:5rem;text-align:center}.ui.modal .content>.description{display:block;width:100%!important;margin:0!important;padding:1rem 0!important;box-shadow:none}.ui.modal>.actions{padding:1rem 1rem 0!important}.ui.modal .actions>.button,.ui.modal .actions>.buttons{margin-bottom:1rem}}.ui.inverted.dimmer>.ui.modal{box-shadow:1px 3px 10px 2px rgba(0,0,0,.2)}.ui.basic.modal{background-color:transparent;border:none;border-radius:0;box-shadow:none!important;color:#FFF}.ui.basic.modal>.actions,.ui.basic.modal>.content,.ui.basic.modal>.header{background-color:transparent}.ui.basic.modal>.header{color:#FFF}.ui.basic.modal>.close{top:1rem;right:1.5rem}.ui.inverted.dimmer>.basic.modal{color:rgba(0,0,0,.87)}.ui.inverted.dimmer>.ui.basic.modal>.header{color:rgba(0,0,0,.85)}.ui.active.modal{display:block}.scrolling.dimmable.dimmed{overflow:hidden}.scrolling.dimmable.dimmed>.dimmer{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.dimmable>.dimmer{position:fixed}.modals.dimmer .ui.scrolling.modal{position:static!important;margin:3.5rem auto!important}.scrolling.undetached.dimmable.dimmed{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.undetached.dimmable.dimmed>.dimmer{overflow:hidden}.scrolling.undetached.dimmable .ui.scrolling.modal{position:absolute;left:50%;margin-top:3.5rem!important}.undetached.dimmable.dimmed>.pusher{z-index:auto}@media only screen and (max-width:991px){.ui.basic.modal>.close{color:#FFF}.modals.dimmer .ui.scrolling.modal{margin-top:1rem!important;margin-bottom:1rem!important}}.ui.fullscreen.modal{width:95%!important;left:2.5%!important;margin:1em auto}.ui.fullscreen.scrolling.modal{left:0!important}.ui.fullscreen.modal>.header{padding-right:2.25rem}.ui.fullscreen.modal>.close{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}.ui.modal{font-size:1rem}.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.small.modal{width:95%;margin:0 0 0 -47.5%}}@media only screen and (min-width:768px){.ui.small.modal{width:70.4%;margin:0 0 0 -35.2%}}@media only screen and (min-width:992px){.ui.small.modal{width:680px;margin:0 0 0 -340px}}@media only screen and (min-width:1200px){.ui.small.modal{width:720px;margin:0 0 0 -360px}}@media only screen and (min-width:1920px){.ui.small.modal{width:760px;margin:0 0 0 -380px}}.ui.large.modal>.header{font-size:1.6em}@media only screen and (max-width:767px){.ui.large.modal{width:95%;margin:0 0 0 -47.5%}}@media only screen and (min-width:768px){.ui.large.modal{width:88%;margin:0 0 0 -44%}}@media only screen and (min-width:992px){.ui.large.modal{width:1020px;margin:0 0 0 -510px}}@media only screen and (min-width:1200px){.ui.large.modal{width:1080px;margin:0 0 0 -540px}}@media only screen and (min-width:1920px){.ui.large.modal{width:1140px;margin:0 0 0 -570px}}.ui.nag{display:none;opacity:.95;position:relative;top:0;left:0;z-index:999;min-height:0;width:100%;margin:0;padding:.75em 1em;background:#555;box-shadow:0 1px 2px 0 rgba(0,0,0,.2);font-size:1rem;text-align:center;color:rgba(0,0,0,.87);border-radius:0 0 .28571429rem .28571429rem;-webkit-transition:.2s background ease;transition:.2s background ease}a.ui.nag{cursor:pointer}.ui.nag>.title{display:inline-block;margin:0 .5em;color:#FFF}.ui.nag>.close.icon{cursor:pointer;opacity:.4;position:absolute;top:50%;right:1em;font-size:1em;margin:-.5em 0 0;color:#FFF;-webkit-transition:opacity .2s ease;transition:opacity .2s ease}.ui.nag:hover{background:#555;opacity:1}.ui.nag .close:hover{opacity:1}.ui.overlay.nag{position:absolute;display:block}.ui.fixed.nag{position:fixed}.ui.bottom.nag,.ui.bottom.nags{border-radius:.28571429rem .28571429rem 0 0;top:auto;bottom:0}.ui.inverted.nag,.ui.inverted.nags .nag{background-color:#F3F4F5;color:rgba(0,0,0,.85)}.ui.inverted.nag .close,.ui.inverted.nag .title,.ui.inverted.nags .nag .close,.ui.inverted.nags .nag .title{color:rgba(0,0,0,.4)}.ui.nags .nag{border-radius:0!important}.ui.nags .nag:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.nags .nag:last-child{border-radius:.28571429rem .28571429rem 0 0}.ui.popup{display:none;position:absolute;top:0;right:0;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;z-index:1900;border:1px solid #D4D4D5;line-height:1.4285em;max-width:250px;background:#FFF;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.popup>.header{padding:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;line-height:1.2;font-weight:700}.ui.popup>.header+.content{padding-top:.5em}.ui.popup:before{position:absolute;content:'';width:.71428571em;height:.71428571em;background:#FFF;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:2;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]{position:relative}[data-tooltip]:not([data-position]):before{top:auto;right:auto;bottom:100%;left:50%;background:#FFF;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-tooltip]:not([data-position]):after{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);bottom:100%;margin-bottom:.5em}[data-tooltip]:after,[data-tooltip]:before{pointer-events:none;visibility:hidden}[data-tooltip]:before{position:absolute;content:'';font-size:1rem;width:.71428571em;height:.71428571em;background:#FFF;z-index:2;box-shadow:1px 1px 0 0 #bababc;opacity:0;-webkit-transform:rotate(45deg) scale(0)!important;transform:rotate(45deg) scale(0)!important;-webkit-transform-origin:center top;transform-origin:center top;-webkit-transition:all .1s ease;transition:all .1s ease}[data-tooltip]:after{content:attr(data-tooltip);position:absolute;text-transform:none;text-align:left;white-space:nowrap;font-size:1rem;border:1px solid #D4D4D5;line-height:1.4285em;max-width:none;background:#FFF;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);z-index:1;opacity:1;-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-transition:all .1s ease;transition:all .1s ease}[data-tooltip]:hover:after,[data-tooltip]:hover:before{visibility:visible;pointer-events:auto}[data-tooltip]:hover:before{-webkit-transform:rotate(45deg) scale(1)!important;transform:rotate(45deg) scale(1)!important;opacity:1}[data-tooltip]:after,[data-tooltip][data-position="top center"]:after,[data-tooltip][data-position="bottom center"]:after{-webkit-transform:translateX(-50%) scale(0)!important;transform:translateX(-50%) scale(0)!important}[data-tooltip]:hover:after,[data-tooltip][data-position="bottom center"]:hover:after{-webkit-transform:translateX(-50%) scale(1)!important;transform:translateX(-50%) scale(1)!important}[data-tooltip][data-position="left center"]:after,[data-tooltip][data-position="right center"]:after{-webkit-transform:translateY(-50%) scale(0)!important;transform:translateY(-50%) scale(0)!important}[data-tooltip][data-position="left center"]:hover:after,[data-tooltip][data-position="right center"]:hover:after{-webkit-transform:translateY(-50%) scale(1)!important;transform:translateY(-50%) scale(1)!important}[data-tooltip][data-position="top left"]:after,[data-tooltip][data-position="top right"]:after,[data-tooltip][data-position="bottom left"]:after,[data-tooltip][data-position="bottom right"]:after{-webkit-transform:scale(0)!important;transform:scale(0)!important}[data-tooltip][data-position="top left"]:hover:after,[data-tooltip][data-position="top right"]:hover:after,[data-tooltip][data-position="bottom left"]:hover:after,[data-tooltip][data-position="bottom right"]:hover:after{-webkit-transform:scale(1)!important;transform:scale(1)!important}[data-tooltip][data-inverted]:before{box-shadow:none!important;background:#1B1C1D}[data-tooltip][data-inverted]:after{background:#1B1C1D;color:#FFF;border:none;box-shadow:none}[data-tooltip][data-inverted]:after .header{background-color:none;color:#FFF}[data-position="top center"][data-tooltip]:after{top:auto;right:auto;left:50%;bottom:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-bottom:.5em}[data-position="top center"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:50%;background:#FFF;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position="top left"][data-tooltip]:after{top:auto;right:auto;left:0;bottom:100%;margin-bottom:.5em}[data-position="top left"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position="top right"][data-tooltip]:after{top:auto;left:auto;right:0;bottom:100%;margin-bottom:.5em}[data-position="top right"][data-tooltip]:before{top:auto;left:auto;bottom:100%;right:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position="bottom center"][data-tooltip]:after{bottom:auto;right:auto;left:50%;top:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-top:.5em}[data-position="bottom center"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:50%;margin-left:-.07142857rem;margin-top:.14285714rem}[data-position="bottom left"][data-tooltip]:after{left:0;top:100%;margin-top:.5em}[data-position="bottom left"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:1em;margin-left:-.07142857rem;margin-top:.14285714rem}[data-position="bottom right"][data-tooltip]:after{right:0;top:100%;margin-top:.5em}[data-position="bottom right"][data-tooltip]:before{bottom:auto;left:auto;top:100%;right:1em;margin-left:-.14285714rem;margin-top:.07142857rem}[data-position="left center"][data-tooltip]:after{right:100%;top:50%;margin-right:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position="right center"][data-tooltip]:after{left:100%;top:50%;margin-left:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position~=bottom][data-tooltip]:before{background:#FFF;box-shadow:-1px -1px 0 0 #bababc;-webkit-transform-origin:center bottom;transform-origin:center bottom}[data-position="left center"][data-tooltip]:before{right:100%;top:50%;margin-top:-.14285714rem;margin-right:-.07142857rem;background:#FFF;box-shadow:1px -1px 0 0 #bababc}[data-position="right center"][data-tooltip]:before{left:100%;top:50%;margin-top:-.07142857rem;margin-left:.14285714rem;background:#FFF;box-shadow:-1px 1px 0 0 #bababc}[data-position~=top][data-tooltip]:before{background:#FFF}[data-inverted][data-position~=bottom][data-tooltip]:before{background:#1B1C1D;box-shadow:-1px -1px 0 0 #bababc}[data-inverted][data-position="left center"][data-tooltip]:before{background:#1B1C1D;box-shadow:1px -1px 0 0 #bababc}[data-inverted][data-position="right center"][data-tooltip]:before{background:#1B1C1D;box-shadow:-1px 1px 0 0 #bababc}[data-inverted][data-position~=top][data-tooltip]:before{background:#1B1C1D}[data-position~=bottom][data-tooltip]:after{-webkit-transform-origin:center top;transform-origin:center top}[data-position="left center"][data-tooltip]:before{-webkit-transform-origin:top center;transform-origin:top center}[data-position="left center"][data-tooltip]:after,[data-position="right center"][data-tooltip]:before{-webkit-transform-origin:right center;transform-origin:right center}[data-position="right center"][data-tooltip]:after{-webkit-transform-origin:left center;transform-origin:left center}.ui.popup{margin:0}.ui.top.popup{margin:0 0 .71428571em}.ui.top.left.popup{-webkit-transform-origin:left bottom;transform-origin:left bottom}.ui.top.center.popup{-webkit-transform-origin:center bottom;transform-origin:center bottom}.ui.top.right.popup{-webkit-transform-origin:right bottom;transform-origin:right bottom}.ui.left.center.popup{margin:0 .71428571em 0 0;-webkit-transform-origin:right 50%;transform-origin:right 50%}.ui.right.center.popup{margin:0 0 0 .71428571em;-webkit-transform-origin:left 50%;transform-origin:left 50%}.ui.bottom.popup{margin:.71428571em 0 0}.ui.bottom.left.popup{-webkit-transform-origin:left top;transform-origin:left top}.ui.bottom.center.popup{-webkit-transform-origin:center top;transform-origin:center top}.ui.bottom.right.popup{-webkit-transform-origin:right top;transform-origin:right top;margin-right:0}.ui.bottom.center.popup:before{margin-left:-.30714286em;top:-.30714286em;left:50%;right:auto;bottom:auto;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.left.popup{margin-left:0}.ui.bottom.left.popup:before{top:-.30714286em;left:1em;right:auto;bottom:auto;margin-left:0;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.right.popup:before{top:-.30714286em;right:1em;bottom:auto;left:auto;margin-left:0;box-shadow:-1px -1px 0 0 #bababc}.ui.top.center.popup:before{top:auto;right:auto;bottom:-.30714286em;left:50%;margin-left:-.30714286em}.ui.top.left.popup{margin-left:0}.ui.top.left.popup:before{bottom:-.30714286em;left:1em;top:auto;right:auto;margin-left:0}.ui.top.right.popup{margin-right:0}.ui.top.right.popup:before{bottom:-.30714286em;right:1em;top:auto;left:auto;margin-left:0}.ui.left.center.popup:before{top:50%;right:-.30714286em;bottom:auto;left:auto;margin-top:-.30714286em;box-shadow:1px -1px 0 0 #bababc}.ui.right.center.popup:before{top:50%;left:-.30714286em;bottom:auto;right:auto;margin-top:-.30714286em;box-shadow:-1px 1px 0 0 #bababc}.ui.bottom.popup:before,.ui.left.center.popup:before,.ui.right.center.popup:before,.ui.top.popup:before{background:#FFF}.ui.inverted.bottom.popup:before,.ui.inverted.left.center.popup:before,.ui.inverted.right.center.popup:before,.ui.inverted.top.popup:before{background:#1B1C1D}.ui.popup>.ui.grid:not(.padded){width:calc(100% + 1.75rem);margin:-.7rem -.875rem}.ui.loading.popup{display:block;visibility:hidden;z-index:-1}.ui.animating.popup,.ui.visible.popup{display:block}.ui.visible.popup{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.basic.popup:before{display:none}.ui.wide.popup{max-width:350px}.ui[class*="very wide"].popup{max-width:550px}@media only screen and (max-width:767px){.ui.wide.popup,.ui[class*="very wide"].popup{max-width:250px}}.ui.fluid.popup{width:100%;max-width:none}.ui.inverted.popup{background:#1B1C1D;color:#FFF;border:none;box-shadow:none}.ui.inverted.popup .header{background-color:none;color:#FFF}.ui.inverted.popup:before{background-color:#1B1C1D;box-shadow:none!important}.ui.flowing.popup{max-width:none}.ui.mini.popup{font-size:.78571429rem}.ui.tiny.popup{font-size:.85714286rem}.ui.small.popup{font-size:.92857143rem}.ui.popup{font-size:1rem}.ui.large.popup{font-size:1.14285714rem}.ui.huge.popup{font-size:1.42857143rem}.ui.progress{position:relative;display:block;max-width:100%;border:none;margin:1em 0 2.5em;box-shadow:none;background:rgba(0,0,0,.1);padding:0;border-radius:.28571429rem}.ui.progress:first-child{margin:0 0 2.5em}.ui.progress:last-child{margin:0 0 1.5em}.ui.progress .bar{display:block;line-height:1;position:relative;width:0;min-width:2em;background:#888;border-radius:.28571429rem;-webkit-transition:width .1s ease,background-color .1s ease;transition:width .1s ease,background-color .1s ease}.ui.progress .bar>.progress{white-space:nowrap;position:absolute;width:auto;font-size:.92857143em;top:50%;right:.5em;left:auto;bottom:auto;color:rgba(255,255,255,.7);text-shadow:none;margin-top:-.5em;font-weight:700;text-align:left}.ui.progress>.label{position:absolute;width:100%;font-size:1em;top:100%;right:auto;left:0;bottom:auto;color:rgba(0,0,0,.87);font-weight:700;text-shadow:none;margin-top:.2em;text-align:center;-webkit-transition:color .4s ease;transition:color .4s ease}.ui.indicating.progress[data-percent^="1"] .bar,.ui.indicating.progress[data-percent^="2"] .bar{background-color:#D95C5C}.ui.indicating.progress[data-percent^="3"] .bar{background-color:#EFBC72}.ui.indicating.progress[data-percent^="4"] .bar,.ui.indicating.progress[data-percent^="5"] .bar{background-color:#E6BB48}.ui.indicating.progress[data-percent^="6"] .bar{background-color:#DDC928}.ui.indicating.progress[data-percent^="7"] .bar,.ui.indicating.progress[data-percent^="8"] .bar{background-color:#B4D95C}.ui.indicating.progress[data-percent^="9"] .bar,.ui.indicating.progress[data-percent^="100"] .bar{background-color:#66DA81}.ui.indicating.progress[data-percent^="1"] .label,.ui.indicating.progress[data-percent^="2"] .label,.ui.indicating.progress[data-percent^="3"] .label,.ui.indicating.progress[data-percent^="4"] .label,.ui.indicating.progress[data-percent^="5"] .label,.ui.indicating.progress[data-percent^="6"] .label,.ui.indicating.progress[data-percent^="7"] .label,.ui.indicating.progress[data-percent^="8"] .label,.ui.indicating.progress[data-percent^="9"] .label,.ui.indicating.progress[data-percent^="100"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent="1"] .bar,.ui.indicating.progress[data-percent="2"] .bar,.ui.indicating.progress[data-percent="3"] .bar,.ui.indicating.progress[data-percent="4"] .bar,.ui.indicating.progress[data-percent="5"] .bar,.ui.indicating.progress[data-percent="6"] .bar,.ui.indicating.progress[data-percent="7"] .bar,.ui.indicating.progress[data-percent="8"] .bar,.ui.indicating.progress[data-percent="9"] .bar{background-color:#D95C5C}.ui.indicating.progress[data-percent="1"] .label,.ui.indicating.progress[data-percent="2"] .label,.ui.indicating.progress[data-percent="3"] .label,.ui.indicating.progress[data-percent="4"] .label,.ui.indicating.progress[data-percent="5"] .label,.ui.indicating.progress[data-percent="6"] .label,.ui.indicating.progress[data-percent="7"] .label,.ui.indicating.progress[data-percent="8"] .label,.ui.indicating.progress[data-percent="9"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress.success .label{color:#1A531B}.ui.progress.success .bar{background-color:#21BA45!important}.ui.progress.success .bar,.ui.progress.success .bar::after{-webkit-animation:none!important;animation:none!important}.ui.progress.success>.label{color:#1A531B}.ui.progress.warning .bar{background-color:#F2C037!important}.ui.progress.warning .bar,.ui.progress.warning .bar::after{-webkit-animation:none!important;animation:none!important}.ui.progress.warning>.label{color:#794B02}.ui.progress.error .bar{background-color:#DB2828!important}.ui.progress.error .bar,.ui.progress.error .bar::after{-webkit-animation:none!important;animation:none!important}.ui.progress.error>.label{color:#912D2B}.ui.active.progress .bar{position:relative;min-width:2em}.ui.active.progress .bar::after{content:'';opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#FFF;border-radius:.28571429rem;-webkit-animation:progress-active 2s ease infinite;animation:progress-active 2s ease infinite}@-webkit-keyframes progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}@keyframes progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}.ui.disabled.progress{opacity:.35}.ui.disabled.progress .bar,.ui.disabled.progress .bar::after{-webkit-animation:none!important;animation:none!important}.ui.inverted.progress{background:rgba(255,255,255,.08);border:none}.ui.inverted.progress .bar{background:#888}.ui.inverted.progress .bar>.progress{color:#F9FAFB}.ui.inverted.progress>.label{color:#FFF}.ui.inverted.progress.success>.label{color:#21BA45}.ui.inverted.progress.warning>.label{color:#F2C037}.ui.inverted.progress.error>.label{color:#DB2828}.ui.progress.attached{background:0 0;position:relative;border:none;margin:0}.ui.progress.attached,.ui.progress.attached .bar{display:block;height:.2rem;padding:0;overflow:hidden;border-radius:0 0 .28571429rem .28571429rem}.ui.progress.attached .bar{border-radius:0}.ui.progress.top.attached,.ui.progress.top.attached .bar{top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.progress.top.attached .bar{border-radius:0}.ui.card>.ui.attached.progress,.ui.segment>.ui.attached.progress{position:absolute;top:auto;left:0;bottom:100%;width:100%}.ui.card>.ui.bottom.attached.progress,.ui.segment>.ui.bottom.attached.progress{top:100%;bottom:auto}.ui.red.progress .bar{background-color:#DB2828}.ui.red.inverted.progress .bar{background-color:#FF695E}.ui.orange.progress .bar{background-color:#F2711C}.ui.orange.inverted.progress .bar{background-color:#FF851B}.ui.yellow.progress .bar{background-color:#FBBD08}.ui.yellow.inverted.progress .bar{background-color:#FFE21F}.ui.olive.progress .bar{background-color:#B5CC18}.ui.olive.inverted.progress .bar{background-color:#D9E778}.ui.green.progress .bar{background-color:#21BA45}.ui.green.inverted.progress .bar{background-color:#2ECC40}.ui.teal.progress .bar{background-color:#00B5AD}.ui.teal.inverted.progress .bar{background-color:#6DFFFF}.ui.blue.progress .bar{background-color:#2185D0}.ui.blue.inverted.progress .bar{background-color:#54C8FF}.ui.violet.progress .bar{background-color:#6435C9}.ui.violet.inverted.progress .bar{background-color:#A291FB}.ui.purple.progress .bar{background-color:#A333C8}.ui.purple.inverted.progress .bar{background-color:#DC73FF}.ui.pink.progress .bar{background-color:#E03997}.ui.pink.inverted.progress .bar{background-color:#FF8EDF}.ui.brown.progress .bar{background-color:#A5673F}.ui.brown.inverted.progress .bar{background-color:#D67C1C}.ui.grey.progress .bar{background-color:#767676}.ui.grey.inverted.progress .bar{background-color:#DCDDDE}.ui.black.progress .bar{background-color:#1B1C1D}.ui.black.inverted.progress .bar{background-color:#545454}.ui.tiny.progress{font-size:.85714286rem}.ui.tiny.progress .bar{height:.5em}.ui.small.progress{font-size:.92857143rem}.ui.small.progress .bar{height:1em}.ui.progress{font-size:1rem}.ui.progress .bar{height:1.75em}.ui.large.progress{font-size:1.14285714rem}.ui.large.progress .bar{height:2.5em}.ui.big.progress{font-size:1.28571429rem}.ui.big.progress .bar{height:3.5em}.ui.rating:last-child{margin-right:0}.ui.rating .icon{padding:0;margin:0;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;cursor:pointer;width:1.25em;height:auto;-webkit-transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;background:0 0;color:rgba(0,0,0,.15);font-family:Rating;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.rating .active.icon{background:0 0;color:rgba(0,0,0,.85)}.ui.rating .icon.selected,.ui.rating .icon.selected.active{background:0 0;color:rgba(0,0,0,.87)}.ui.star.rating .icon{width:1.25em;height:auto;background:0 0;color:rgba(0,0,0,.15);text-shadow:none}.ui.star.rating .active.icon{background:0 0!important;color:#FFE623!important;text-shadow:0 -1px 0 #DDC507,-1px 0 0 #DDC507,0 1px 0 #DDC507,1px 0 0 #DDC507!important}.ui.star.rating .icon.selected,.ui.star.rating .icon.selected.active{background:0 0!important;color:#FC0!important;text-shadow:0 -1px 0 #E6A200,-1px 0 0 #E6A200,0 1px 0 #E6A200,1px 0 0 #E6A200!important}.ui.heart.rating .icon{width:1.4em;height:auto;background:0 0;color:rgba(0,0,0,.15);text-shadow:none!important}.ui.heart.rating .active.icon{background:0 0!important;color:#FF6D75!important;text-shadow:0 -1px 0 #CD0707,-1px 0 0 #CD0707,0 1px 0 #CD0707,1px 0 0 #CD0707!important}.ui.heart.rating .icon.selected,.ui.heart.rating .icon.selected.active{background:0 0!important;color:#FF3000!important;text-shadow:0 -1px 0 #AA0101,-1px 0 0 #AA0101,0 1px 0 #AA0101,1px 0 0 #AA0101!important}.ui.disabled.rating .icon{cursor:default}.ui.rating .icon.selected,.ui.rating.selected .active.icon,.ui.rating.selected .icon.selected{opacity:1}.ui.mini.rating{font-size:.78571429rem}.ui.tiny.rating{font-size:.85714286rem}.ui.small.rating{font-size:.92857143rem}.ui.rating{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;white-space:nowrap;vertical-align:baseline;font-size:1rem}.ui.large.rating{font-size:1.14285714rem}.ui.huge.rating{font-size:1.42857143rem}.ui.massive.rating{font-size:2rem}@font-face{font-family:Rating;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjCBsAAAC8AAAAYGNtYXCj2pm8AAABHAAAAKRnYXNwAAAAEAAAAcAAAAAIZ2x5ZlJbXMYAAAHIAAARnGhlYWQBGAe5AAATZAAAADZoaGVhA+IB/QAAE5wAAAAkaG10eCzgAEMAABPAAAAAcGxvY2EwXCxOAAAUMAAAADptYXhwACIAnAAAFGwAAAAgbmFtZfC1n04AABSMAAABPHBvc3QAAwAAAAAVyAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADxZQHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEAJAAAAAgACAABAAAAAEAIOYF8AbwDfAj8C7wbvBw8Irwl/Cc8SPxZf/9//8AAAAAACDmAPAE8AzwI/Au8G7wcPCH8JfwnPEj8WT//f//AAH/4xoEEAYQAQ/sD+IPow+iD4wPgA98DvYOtgADAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAIAAP/tAgAB0wAKABUAAAEvAQ8BFwc3Fyc3BQc3Jz8BHwEHFycCALFPT7GAHp6eHoD/AHAWW304OH1bFnABGRqgoBp8sFNTsHyyOnxYEnFxElh8OgAAAAACAAD/7QIAAdMACgASAAABLwEPARcHNxcnNwUxER8BBxcnAgCxT0+xgB6enh6A/wA4fVsWcAEZGqCgGnywU1OwfLIBHXESWHw6AAAAAQAA/+0CAAHTAAoAAAEvAQ8BFwc3Fyc3AgCxT0+xgB6enh6AARkaoKAafLBTU7B8AAAAAAEAAAAAAgABwAArAAABFA4CBzEHDgMjIi4CLwEuAzU0PgIzMh4CFz4DMzIeAhUCAAcMEgugBgwMDAYGDAwMBqALEgwHFyg2HhAfGxkKChkbHxAeNigXAS0QHxsZCqAGCwkGBQkLBqAKGRsfEB42KBcHDBILCxIMBxcoNh4AAAAAAgAAAAACAAHAACsAWAAAATQuAiMiDgIHLgMjIg4CFRQeAhcxFx4DMzI+Aj8BPgM1DwEiFCIGMTAmIjQjJy4DNTQ+AjMyHgIfATc+AzMyHgIVFA4CBwIAFyg2HhAfGxkKChkbHxAeNigXBwwSC6AGDAwMBgYMDAwGoAsSDAdbogEBAQEBAaIGCgcEDRceEQkREA4GLy8GDhARCREeFw0EBwoGAS0eNigXBwwSCwsSDAcXKDYeEB8bGQqgBgsJBgUJCwagChkbHxA+ogEBAQGiBg4QEQkRHhcNBAcKBjQ0BgoHBA0XHhEJERAOBgABAAAAAAIAAcAAMQAAARQOAgcxBw4DIyIuAi8BLgM1ND4CMzIeAhcHFwc3Jzc+AzMyHgIVAgAHDBILoAYMDAwGBgwMDAagCxIMBxcoNh4KFRMSCC9wQLBwJwUJCgkFHjYoFwEtEB8bGQqgBgsJBgUJCwagChkbHxAeNigXAwUIBUtAoMBAOwECAQEXKDYeAAABAAAAAAIAAbcAKgAAEzQ3NjMyFxYXFhcWFzY3Njc2NzYzMhcWFRQPAQYjIi8BJicmJyYnJicmNQAkJUARExIQEAsMCgoMCxAQEhMRQCUkQbIGBwcGsgMFBQsKCQkGBwExPyMkBgYLCgkKCgoKCQoLBgYkIz8/QawFBawCBgUNDg4OFRQTAAAAAQAAAA0B2wHSACYAABM0PwI2FzYfAhYVFA8BFxQVFAcGByYvAQcGByYnJjU0PwEnJjUAEI9BBQkIBkCPEAdoGQMDBgUGgIEGBQYDAwEYaAcBIwsCFoEMAQEMgRYCCwYIZJABBQUFAwEBAkVFAgEBAwUFAwOQZAkFAAAAAAIAAAANAdsB0gAkAC4AABM0PwI2FzYfAhYVFA8BFxQVFAcmLwEHBgcmJyY1ND8BJyY1HwEHNxcnNy8BBwAQj0EFCQgGQI8QB2gZDAUGgIEGBQYDAwEYaAc/WBVsaxRXeDY2ASMLAhaBDAEBDIEWAgsGCGSQAQUNAQECRUUCAQEDBQUDA5BkCQURVXg4OHhVEW5uAAABACMAKQHdAXwAGgAANzQ/ATYXNh8BNzYXNh8BFhUUDwEGByYvASY1IwgmCAwLCFS8CAsMCCYICPUIDAsIjgjSCwkmCQEBCVS7CQEBCSYJCg0H9gcBAQePBwwAAAEAHwAfAXMBcwAsAAA3ND8BJyY1ND8BNjMyHwE3NjMyHwEWFRQPARcWFRQPAQYjIi8BBwYjIi8BJjUfCFRUCAgnCAwLCFRUCAwLCCcICFRUCAgnCAsMCFRUCAsMCCcIYgsIVFQIDAsIJwgIVFQICCcICwwIVFQICwwIJwgIVFQICCcIDAAAAAACAAAAJQFJAbcAHwArAAA3NTQ3NjsBNTQ3NjMyFxYdATMyFxYdARQHBiMhIicmNTczNTQnJiMiBwYdAQAICAsKJSY1NCYmCQsICAgIC/7tCwgIW5MWFR4fFRZApQsICDc0JiYmJjQ3CAgLpQsICAgIC8A3HhYVFRYeNwAAAQAAAAcBbgG3ACEAADcRNDc2NzYzITIXFhcWFREUBwYHBiMiLwEHBiMiJyYnJjUABgUKBgYBLAYGCgUGBgUKBQcOCn5+Cg4GBgoFBicBcAoICAMDAwMICAr+kAoICAQCCXl5CQIECAgKAAAAAwAAACUCAAFuABgAMQBKAAA3NDc2NzYzMhcWFxYVFAcGBwYjIicmJyY1MxYXFjMyNzY3JicWFRQHBiMiJyY1NDcGBzcUFxYzMjc2NTQ3NjMyNzY1NCcmIyIHBhUABihDREtLREMoBgYoQ0RLS0RDKAYlJjk5Q0M5OSYrQREmJTU1JSYRQSuEBAQGBgQEEREZBgQEBAQGJBkayQoKQSgoKChBCgoKCkEoJycoQQoKOiMjIyM6RCEeIjUmJSUmNSIeIUQlBgQEBAQGGBIRBAQGBgQEGhojAAAABQAAAAkCAAGJACwAOABRAGgAcAAANzQ3Njc2MzIXNzYzMhcWFxYXFhcWFxYVFDEGBwYPAQYjIicmNTQ3JicmJyY1MxYXNyYnJjU0NwYHNxQXFjMyNzY1NDc2MzI3NjU0JyYjIgcGFRc3Njc2NyYnNxYXFhcWFRQHBgcGBwYjPwEWFRQHBgcABitBQU0ZGhADBQEEBAUFBAUEBQEEHjw8Hg4DBQQiBQ0pIyIZBiUvSxYZDg4RQSuEBAQGBgQEEREZBgQEBAQGJBkaVxU9MzQiIDASGxkZEAYGCxQrODk/LlACFxYlyQsJQycnBRwEAgEDAwIDAwIBAwUCNmxsNhkFFAMFBBUTHh8nCQtKISgSHBsfIh4hRCUGBAQEBAYYEhEEBAYGBAQaGiPJJQUiIjYzISASGhkbCgoKChIXMRsbUZANCyghIA8AAAMAAAAAAbcB2wA5AEoAlAAANzU0NzY7ATY3Njc2NzY3Njc2MzIXFhcWFRQHMzIXFhUUBxYVFAcUFRQHFgcGKwEiJyYnJisBIicmNTcUFxYzMjc2NTQnJiMiBwYVFzMyFxYXFhcWFxYXFhcWOwEyNTQnNjc2NTQnNjU0JyYnNjc2NTQnJisBNDc2NTQnJiMGBwYHBgcGBwYHBgcGBwYHBgcGBwYrARUACwoQTgodEQ4GBAMFBgwLDxgTEwoKDjMdFhYOAgoRARkZKCUbGxsjIQZSEAoLJQUFCAcGBQUGBwgFBUkJBAUFBAQHBwMDBwcCPCUjNwIJBQUFDwMDBAkGBgsLDmUODgoJGwgDAwYFDAYQAQUGAwQGBgYFBgUGBgQJSbcPCwsGJhUPCBERExMMCgkJFBQhGxwWFR4ZFQoKFhMGBh0WKBcXBgcMDAoLDxIHBQYGBQcIBQYGBQgSAQEBAQICAQEDAgEULwgIBQoLCgsJDhQHCQkEAQ0NCg8LCxAdHREcDQ4IEBETEw0GFAEHBwUECAgFBQUFAgO3AAADAAD/2wG3AbcAPABNAJkAADc1NDc2OwEyNzY3NjsBMhcWBxUWFRQVFhUUBxYVFAcGKwEWFRQHBgcGIyInJicmJyYnJicmJyYnIyInJjU3FBcWMzI3NjU0JyYjIgcGFRczMhcWFxYXFhcWFxYXFhcWFxYXFhcWFzI3NjU0JyY1MzI3NjU0JyYjNjc2NTQnNjU0JyYnNjU0JyYrASIHIgcGBwYHBgcGIwYrARUACwoQUgYhJRsbHiAoGRkBEQoCDhYWHTMOCgoTExgPCwoFBgIBBAMFDhEdCk4QCgslBQUIBwYFBQYHCAUFSQkEBgYFBgUGBgYEAwYFARAGDAUGAwMIGwkKDg5lDgsLBgYJBAMDDwUFBQkCDg4ZJSU8AgcHAwMHBwQEBQUECbe3DwsKDAwHBhcWJwIWHQYGExYKChUZHhYVHRoiExQJCgsJDg4MDAwNBg4WJQcLCw+kBwUGBgUHCAUGBgUIpAMCBQYFBQcIBAUHBwITBwwTExERBw0OHBEdHRALCw8KDQ0FCQkHFA4JCwoLCgUICBgMCxUDAgEBAgMBAQG3AAAAAQAAAA0A7gHSABQAABM0PwI2FxEHBgcmJyY1ND8BJyY1ABCPQQUJgQYFBgMDARhoBwEjCwIWgQwB/oNFAgEBAwUFAwOQZAkFAAAAAAIAAAAAAgABtwAqAFkAABM0NzYzMhcWFxYXFhc2NzY3Njc2MzIXFhUUDwEGIyIvASYnJicmJyYnJjUzFB8BNzY1NCcmJyYnJicmIyIHBgcGBwYHBiMiJyYnJicmJyYjIgcGBwYHBgcGFQAkJUARExIQEAsMCgoMCxAQEhMRQCUkQbIGBwcGsgMFBQsKCQkGByU1pqY1BgYJCg4NDg0PDhIRDg8KCgcFCQkFBwoKDw4REg4PDQ4NDgoJBgYBMT8jJAYGCwoJCgoKCgkKCwYGJCM/P0GsBQWsAgYFDQ4ODhUUEzA1oJ82MBcSEgoLBgcCAgcHCwsKCQgHBwgJCgsLBwcCAgcGCwoSEhcAAAACAAAABwFuAbcAIQAoAAA3ETQ3Njc2MyEyFxYXFhURFAcGBwYjIi8BBwYjIicmJyY1PwEfAREhEQAGBQoGBgEsBgYKBQYGBQoFBw4Kfn4KDgYGCgUGJZIZef7cJwFwCggIAwMDAwgICv6QCggIBAIJeXkJAgQICAoIjRl0AWP+nQAAAAABAAAAJQHbAbcAMgAANzU0NzY7ATU0NzYzMhcWHQEUBwYrASInJj0BNCcmIyIHBh0BMzIXFh0BFAcGIyEiJyY1AAgIC8AmJjQ1JiUFBQgSCAUFFhUfHhUWHAsICAgIC/7tCwgIQKULCAg3NSUmJiU1SQgFBgYFCEkeFhUVFh43CAgLpQsICAgICwAAAAIAAQANAdsB0gAiAC0AABM2PwI2MzIfAhYXFg8BFxYHBiMiLwEHBiMiJyY/AScmNx8CLwE/AS8CEwEDDJBABggJBUGODgIDCmcYAgQCCAMIf4IFBgYEAgEZaQgC7hBbEgINSnkILgEBJggCFYILC4IVAggICWWPCgUFA0REAwUFCo9lCQipCTBmEw1HEhFc/u0AAAADAAAAAAHJAbcAFAAlAHkAADc1NDc2OwEyFxYdARQHBisBIicmNTcUFxYzMjc2NTQnJiMiBwYVFzU0NzYzNjc2NzY3Njc2NzY3Njc2NzY3NjMyFxYXFhcWFxYXFhUUFRQHBgcGBxQHBgcGBzMyFxYVFAcWFRYHFgcGBxYHBgcjIicmJyYnJiciJyY1AAUGB1MHBQYGBQdTBwYFJQUFCAcGBQUGBwgFBWQFBQgGDw8OFAkFBAQBAQMCAQIEBAYFBw4KCgcHBQQCAwEBAgMDAgYCAgIBAU8XEBAQBQEOBQUECwMREiYlExYXDAwWJAoHBQY3twcGBQUGB7cIBQUFBQgkBwYFBQYHCAUGBgUIJLcHBQYBEBATGQkFCQgGBQwLBgcICQUGAwMFBAcHBgYICQQEBwsLCwYGCgIDBAMCBBEQFhkSDAoVEhAREAsgFBUBBAUEBAcMAQUFCAAAAAADAAD/2wHJAZIAFAAlAHkAADcUFxYXNxY3Nj0BNCcmBycGBwYdATc0NzY3FhcWFRQHBicGJyY1FzU0NzY3Fjc2NzY3NjcXNhcWBxYXFgcWBxQHFhUUBwYHJxYXFhcWFRYXFhcWFRQVFAcGBwYHBgcGBwYnBicmJyYnJicmJyYnJicmJyYnJiciJyY1AAUGB1MHBQYGBQdTBwYFJQUFCAcGBQUGBwgFBWQGBQcKJBYMDBcWEyUmEhEDCwQFBQ4BBRAQEBdPAQECAgIGAgMDAgEBAwIEBQcHCgoOBwUGBAQCAQIDAQEEBAUJFA4PDwYIBQWlBwYFAQEBBwQJtQkEBwEBAQUGB7eTBwYEAQEEBgcJBAYBAQYECZS4BwYEAgENBwUCBgMBAQEXEyEJEhAREBcIDhAaFhEPAQEFAgQCBQELBQcKDAkIBAUHCgUGBwgDBgIEAQEHBQkIBwUMCwcECgcGCRoREQ8CBgQIAAAAAQAAAAEAAJth57dfDzz1AAsCAAAAAADP/GODAAAAAM/8Y4MAAP/bAgAB2wAAAAgAAgAAAAAAAAABAAAB4P/gAAACAAAAAAACAAABAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAEAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAdwAAAHcAAACAAAjAZMAHwFJAAABbgAAAgAAAAIAAAACAAAAAgAAAAEAAAACAAAAAW4AAAHcAAAB3AABAdwAAAHcAAAAAAAAAAoAFAAeAEoAcACKAMoBQAGIAcwCCgJUAoICxgMEAzoDpgRKBRgF7AYSBpgG2gcgB2oIGAjOAAAAAQAAABwAmgAFAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAwAAAABAAAAAAACAA4AQAABAAAAAAADAAwAIgABAAAAAAAEAAwATgABAAAAAAAFABYADAABAAAAAAAGAAYALgABAAAAAAAKADQAWgADAAEECQABAAwAAAADAAEECQACAA4AQAADAAEECQADAAwAIgADAAEECQAEAAwATgADAAEECQAFABYADAADAAEECQAGAAwANAADAAEECQAKADQAWgByAGEAdABpAG4AZwBWAGUAcgBzAGkAbwBuACAAMQAuADAAcgBhAHQAaQBuAGdyYXRpbmcAcgBhAHQAaQBuAGcAUgBlAGcAdQBsAGEAcgByAGEAdABpAG4AZwBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,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kIiRi5MI5vdUFfcni4vCBYufhJx8mn2ZepJ3i3aLeoR9fX18g3qLdwiLVAUO+yaLshWL+AQFi5GNkY+RjpCQj5KNj42PjI+LCPfAiwWPi4+Kj4mRiZCHj4aPhY2Fi4UIi/wEBYuEiYWHhoeGhoeFiIiKhoqHi4GLhI6EkQj7EvcN+xL7DQWEhYOIgouHi4eLh42EjoaPiJCHkImRi5IIDov3XRWLko2Rj5Kltq+vuKW4pbuZvYu9i7t9uHG4ca9npWCPhI2Fi4SLhYmEh4RxYGdoXnAIXnFbflmLWYtbmF6lXqZnrnG2h5KJkouRCLCLFaRkq2yxdLF0tH+4i7iLtJexorGiq6qksm64Z61goZZ3kXaLdItnfm1ycnJybX9oiwhoi22XcqRypH6pi6+LopGglp9gdWdpbl4I9xiwFYuHjIiOiI6IjoqPi4+LjoyOjo2OjY6Lj4ubkJmXl5eWmZGbi4+LjoyOjo2OjY6LjwiLj4mOiY6IjYiNh4tzi3eCenp6eoJ3i3MIDov3XRWLko2Sj5GouK+utqW3pbqYvouci5yJnIgIm6cFjY6NjI+LjIuNi42JjYqOio+JjomOiY6KjomOiY6JjoqNioyKjomMiYuHi4qLiouLCHdnbVVjQ2NDbVV3Zwh9cgWJiIiJiIuJi36SdJiIjYmOi46LjY+UlJlvl3KcdJ90oHeie6WHkYmSi5IIsIsVqlq0Z711CKGzBXqXfpqCnoKdhp6LoIuikaCWn2B1Z2luXgj3GLAVi4eMiI6IjoiOio+Lj4uOjI6OjY6NjouPi5uQmZeXl5aZkZuLj4uOjI6OjY6NjouPCIuPiY6JjoiNiI2Hi3OLd4J6enp6gneLcwji+10VoLAFtI+wmK2hrqKnqKKvdq1wp2uhCJ2rBZ1/nHycepx6mHqWeY+EjYWLhIuEiYWHhIR/gH1+fG9qaXJmeWV5Y4Jhiwi53BXb9yQFjIKMg4uEi3CDc3x1fHV3fHOBCA6L1BWL90sFi5WPlJKSkpKTj5aLCNmLBZKPmJqepJaZlZeVlY+Qj5ONl42WjpeOmI+YkZWTk5OSk46Vi5uLmYiYhZiFlIGSfgiSfo55i3WLeYd5gXgIvosFn4uchJl8mn2Seot3i3qGfIJ9jYSLhYuEi3yIfoR+i4eLh4uHi3eGen99i3CDdnt8CHt8dYNwiwhmiwV5i3mNeY95kHeRc5N1k36Ph4sIOYsFgIuDjoSShJKHlIuVCLCdFYuGjIePiI+Hj4mQi5CLj42Pj46OjY+LkIuQiZCIjoePh42Gi4aLh4mHh4eIioaLhgjUeRWUiwWNi46Lj4qOi4+KjYqOi4+Kj4mQio6KjYqNio+Kj4mQio6KjIqzfquEpIsIrosFr4uemouri5CKkYqQkY6QkI6SjpKNkouSi5KJkoiRlZWQlouYi5CKkImRiZGJj4iOCJGMkI+PlI+UjZKLkouViJODk4SSgo+CiwgmiwWLlpCalJ6UnpCbi5aLnoiYhJSFlH+QeYuGhoeDiYCJf4h/h3+IfoWBg4KHh4SCgH4Ii4qIiYiGh4aIh4mIiIiIh4eGh4aHh4eHiIiHiIeHiIiHiIeKh4mIioiLCIKLi/tLBQ6L90sVi/dLBYuVj5OSk5KSk46WiwjdiwWPi5iPoZOkk6CRnZCdj56Nn4sIq4sFpougg5x8m3yTd4txCIuJBZd8kHuLd4uHi4eLh5J+jn6LfIuEi4SJhZR9kHyLeot3hHp8fH19eoR3iwhYiwWVeI95i3mLdIh6hH6EfoKBfoV+hX2He4uBi4OPg5KFkYaTh5SHlYiTipOKk4qTiJMIiZSIkYiPgZSBl4CaeKR+moSPCD2LBYCLg4+EkoSSh5SLlQiw9zgVi4aMh4+Ij4ePiZCLkIuPjY+Pjo6Nj4uQi5CJkIiOh4+HjYaLhouHiYeHh4iKhouGCNT7OBWUiwWOi46Kj4mPio+IjoiPh4+IjoePiI+Hj4aPho6HjoiNiI6Hj4aOho6Ii4qWfpKDj4YIk4ORgY5+j36OgI1/jYCPg5CGnYuXj5GUkpSOmYuei5aGmoKfgp6GmouWCPCLBZSLlI+SkpOTjpOLlYuSiZKHlIeUho+Fi46PjY+NkY2RjJCLkIuYhpaBlY6RjZKLkgiLkomSiJKIkoaQhY6MkIyRi5CLm4aXgpOBkn6Pe4sIZosFcotrhGN9iouIioaJh4qHiomKiYqIioaKh4mHioiKiYuHioiLh4qIi4mLCIKLi/tLBQ77lIv3txWLkpCPlo0I9yOgzPcWBY6SkI+RiwiL/BL7FUcFh4mHioiLh4uIjImOiY6KjouPi4yLjYyOCKP3IyPwBYaQiZCLjwgOi/fFFYu1l6yjoqOjrZe2i5aLl4mYh5eHloWWhJaElIWShZOE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) format('woff');font-weight:400;font-style:normal}.ui.rating .active.icon:before,.ui.rating .icon:before,.ui.star.rating .active.icon:before,.ui.star.rating .icon:before{content:'\f005'}.ui.star.rating .partial.icon:before{content:'\f006'}.ui.star.rating .partial.icon{content:'\f005'}.ui.heart.rating .active.icon:before,.ui.heart.rating .icon:before{content:'\f004'}.ui.search{position:relative}.ui.search>.prompt{margin:0;outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);text-shadow:none;font-style:normal;font-weight:400;line-height:1.2142em;padding:.67861429em 1em;font-size:1em;background:#FFF;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);box-shadow:0 0 0 0 transparent inset;-webkit-transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease}.ui.search .prompt{border-radius:500rem}.ui.search .prompt~.search.icon{cursor:pointer}.ui.search>.results{display:none;position:absolute;top:100%;left:0;-webkit-transform-origin:center top;transform-origin:center top;white-space:normal;background:#FFF;margin-top:.5em;width:18em;border-radius:.28571429rem;box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);border:1px solid #D4D4D5;z-index:998}.ui.search>.results>:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.search>.results>:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.search>.results .result{cursor:pointer;display:block;overflow:hidden;font-size:1em;padding:.85714286em 1.14285714em;color:rgba(0,0,0,.87);line-height:1.33;border-bottom:1px solid rgba(34,36,38,.1)}.ui.search>.results .result:last-child{border-bottom:none!important}.ui.search>.results .result .image{float:right;overflow:hidden;background:0 0;width:5em;height:3em;border-radius:.25em}.ui.search>.results .result .image img{display:block;width:auto;height:100%}.ui.search>.results .result .image+.content{margin:0 6em 0 0}.ui.search>.results .result .title{margin:-.14285em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;font-size:1em;color:rgba(0,0,0,.85)}.ui.search>.results .result .description{margin-top:0;font-size:.92857143em;color:rgba(0,0,0,.4)}.ui.search>.results .result .price{float:right;color:#21BA45}.ui.search>.results>.message{padding:1em}.ui.search>.results>.message .header{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1rem;font-weight:700;color:rgba(0,0,0,.87)}.ui.search>.results>.message .description{margin-top:.25rem;font-size:1em;color:rgba(0,0,0,.87)}.ui.search>.results>.action{display:block;border-top:none;background:#F3F4F5;padding:.92857143em 1em;color:rgba(0,0,0,.87);font-weight:700;text-align:center}.ui.search>.prompt:focus{border-color:rgba(34,36,38,.35);background:#FFF;color:rgba(0,0,0,.95)}.ui.loading.search .input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.search .input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.ui.category.search>.results .category .result:hover,.ui.search>.results .result:hover{background:#F9FAFB}.ui.search .action:hover{background:#E0E0E0}.ui.category.search>.results .category.active{background:#F3F4F5}.ui.category.search>.results .category.active>.name{color:rgba(0,0,0,.87)}.ui.category.search>.results .category .result.active,.ui.search>.results .result.active{position:relative;border-left-color:rgba(34,36,38,.1);background:#F3F4F5;box-shadow:none}.ui.search>.results .result.active .description,.ui.search>.results .result.active .title{color:rgba(0,0,0,.85)}.ui.search.selection .prompt{border-radius:.28571429rem}.ui.search.selection>.icon.input>.remove.icon{pointer-events:none;position:absolute;left:auto;opacity:0;color:'';top:0;right:0;-webkit-transition:color .1s ease,opacity .1s ease;transition:color .1s ease,opacity .1s ease}.ui.search.selection>.icon.input>.active.remove.icon{cursor:pointer;opacity:.8;pointer-events:auto}.ui.search.selection>.icon.input:not([class*="left icon"])>.icon~.remove.icon{right:1.85714em}.ui.search.selection>.icon.input>.remove.icon:hover{opacity:1;color:#DB2828}.ui.category.search .results{width:28em}.ui.category.search>.results .category{background:#F3F4F5;box-shadow:none;border-bottom:1px solid rgba(34,36,38,.1);-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease}.ui.category.search>.results .category:last-child{border-bottom:none}.ui.category.search>.results .category:first-child .name+.result{border-radius:0 .28571429rem 0 0}.ui.category.search>.results .category .result{background:#FFF;margin-left:100px;border-left:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(34,36,38,.1);-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease;padding:.85714286em 1.14285714em}.ui.category.search>.results .category:last-child .result:last-child{border-radius:0 0 .28571429rem;border-bottom:none}.ui.category.search>.results .category>.name{width:100px;background:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;float:1em;float:left;padding:.4em 1em;font-weight:700;color:rgba(0,0,0,.4)}.ui[class*="left aligned"].search>.results{right:auto;left:0}.ui[class*="right aligned"].search>.results{right:0;left:auto}.ui.fluid.search .results{width:100%}.ui.mini.search{font-size:.78571429em}.ui.small.search{font-size:.92857143em}.ui.search{font-size:1em}.ui.large.search{font-size:1.14285714em}.ui.big.search{font-size:1.28571429em}.ui.huge.search{font-size:1.42857143em}.ui.massive.search{font-size:1.71428571em}.ui.shape{position:relative;vertical-align:top;display:inline-block;-webkit-perspective:2000px;perspective:2000px;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape .sides{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.ui.shape .side{opacity:1;width:100%;margin:0!important;-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none}.ui.shape .side *{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.ui.cube.shape .side{min-width:15em;height:15em;padding:2em;background-color:#E6E6E6;color:rgba(0,0,0,.87);box-shadow:0 0 2px rgba(0,0,0,.3)}.ui.cube.shape .side>.content{width:100%;height:100%;display:table;text-align:center;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ui.cube.shape .side>.content>div{display:table-cell;vertical-align:middle;font-size:2em}.ui.text.shape.animating .sides{position:static}.ui.text.shape .side{white-space:nowrap}.ui.text.shape .side>*{white-space:normal}.ui.loading.shape{position:absolute;top:-9999px;left:-9999px}.ui.shape .animating.side{position:absolute;top:0;left:0;display:block;z-index:100}.ui.shape .hidden.side{opacity:.6}.ui.shape.animating .sides{position:absolute;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape.animating .side{-webkit-transition:opacity .6s ease-in-out;transition:opacity .6s ease-in-out}.ui.shape .active.side{display:block}.ui.sidebar{position:fixed;top:0;left:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:none;transition:none;will-change:transform;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;-webkit-overflow-scrolling:touch;height:100%!important;max-height:100%;border-radius:0!important;margin:0!important;overflow-y:auto!important;z-index:102}.ui.sidebar>*{-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.left.sidebar{right:auto;left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.sidebar{right:0!important;left:auto!important;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.bottom.sidebar,.ui.top.sidebar{width:100%!important;height:auto!important}.ui.top.sidebar{top:0!important;bottom:auto!important;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.sidebar{top:auto!important;bottom:0!important;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.pushable{height:100%;overflow-x:hidden;padding:0!important}body.pushable{background:#545454!important}.pushable:not(body){-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.pushable:not(body)>.fixed,.pushable:not(body)>.pusher:after,.pushable:not(body)>.ui.sidebar{position:absolute}.pushable>.fixed{position:fixed;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;will-change:transform;z-index:101}body.pushable>.pusher{background:#FFF}.pushable>.pusher{position:relative;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;min-height:100%;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:2;background:inherit}.pushable>.pusher:after{position:fixed;top:0;right:0;content:'';background-color:rgba(0,0,0,.4);overflow:hidden;opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;will-change:opacity;z-index:1000}.ui.sidebar.menu .item{border-radius:0!important}.pushable>.pusher.dimmed:after{width:100%!important;height:100%!important;opacity:1!important}.ui.animating.sidebar{visibility:visible}.ui.visible.sidebar{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.bottom.visible.sidebar,.ui.left.visible.sidebar,.ui.right.visible.sidebar,.ui.top.visible.sidebar{box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.visible.left.sidebar~.fixed,.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(260px,0,0);transform:translate3d(260px,0,0)}.ui.visible.right.sidebar~.fixed,.ui.visible.right.sidebar~.pusher{-webkit-transform:translate3d(-260px,0,0);transform:translate3d(-260px,0,0)}.ui.visible.top.sidebar~.fixed,.ui.visible.top.sidebar~.pusher{-webkit-transform:translate3d(0,36px,0);transform:translate3d(0,36px,0)}.ui.visible.bottom.sidebar~.fixed,.ui.visible.bottom.sidebar~.pusher{-webkit-transform:translate3d(0,-36px,0);transform:translate3d(0,-36px,0)}.ui.visible.left.sidebar~.ui.visible.right.sidebar~.fixed,.ui.visible.left.sidebar~.ui.visible.right.sidebar~.pusher,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.fixed,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}html.ios{overflow-x:hidden;-webkit-overflow-scrolling:touch}html.ios,html.ios body{height:initial!important}.ui.thin.left.sidebar,.ui.thin.right.sidebar{width:150px}.ui[class*="very thin"].left.sidebar,.ui[class*="very thin"].right.sidebar{width:60px}.ui.left.sidebar,.ui.right.sidebar{width:260px}.ui.wide.left.sidebar,.ui.wide.right.sidebar{width:350px}.ui[class*="very wide"].left.sidebar,.ui[class*="very wide"].right.sidebar{width:475px}.ui.visible.thin.left.sidebar~.fixed,.ui.visible.thin.left.sidebar~.pusher{-webkit-transform:translate3d(150px,0,0);transform:translate3d(150px,0,0)}.ui.visible[class*="very thin"].left.sidebar~.fixed,.ui.visible[class*="very thin"].left.sidebar~.pusher{-webkit-transform:translate3d(60px,0,0);transform:translate3d(60px,0,0)}.ui.visible.wide.left.sidebar~.fixed,.ui.visible.wide.left.sidebar~.pusher{-webkit-transform:translate3d(350px,0,0);transform:translate3d(350px,0,0)}.ui.visible[class*="very wide"].left.sidebar~.fixed,.ui.visible[class*="very wide"].left.sidebar~.pusher{-webkit-transform:translate3d(475px,0,0);transform:translate3d(475px,0,0)}.ui.visible.thin.right.sidebar~.fixed,.ui.visible.thin.right.sidebar~.pusher{-webkit-transform:translate3d(-150px,0,0);transform:translate3d(-150px,0,0)}.ui.visible[class*="very thin"].right.sidebar~.fixed,.ui.visible[class*="very thin"].right.sidebar~.pusher{-webkit-transform:translate3d(-60px,0,0);transform:translate3d(-60px,0,0)}.ui.visible.wide.right.sidebar~.fixed,.ui.visible.wide.right.sidebar~.pusher{-webkit-transform:translate3d(-350px,0,0);transform:translate3d(-350px,0,0)}.ui.visible[class*="very wide"].right.sidebar~.fixed,.ui.visible[class*="very wide"].right.sidebar~.pusher{-webkit-transform:translate3d(-475px,0,0);transform:translate3d(-475px,0,0)}.ui.overlay.sidebar{z-index:102}.ui.left.overlay.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.overlay.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.overlay.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.overlay.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.animating.ui.overlay.sidebar,.ui.visible.overlay.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.bottom.overlay.sidebar,.ui.visible.left.overlay.sidebar,.ui.visible.right.overlay.sidebar,.ui.visible.top.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.overlay.sidebar~.fixed,.ui.visible.overlay.sidebar~.pusher{-webkit-transform:none!important;transform:none!important}.ui.push.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.push.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.push.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.push.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.push.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.visible.push.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:1}.ui.visible.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.slide.along.sidebar{z-index:1}.ui.left.slide.along.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.right.slide.along.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.top.slide.along.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.bottom.slide.along.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.animating.slide.along.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.along.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.slide.out.sidebar{z-index:1}.ui.left.slide.out.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.right.slide.out.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.top.slide.out.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.bottom.slide.out.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.animating.slide.out.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.out.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.scale.down.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.scale.down.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.scale.down.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.scale.down.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.scale.down.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.scale.down.left.sidebar~.pusher{-webkit-transform-origin:75% 50%;transform-origin:75% 50%}.ui.scale.down.right.sidebar~.pusher{-webkit-transform-origin:25% 50%;transform-origin:25% 50%}.ui.scale.down.top.sidebar~.pusher{-webkit-transform-origin:50% 75%;transform-origin:50% 75%}.ui.scale.down.bottom.sidebar~.pusher{-webkit-transform-origin:50% 25%;transform-origin:50% 25%}.ui.animating.scale.down>.visible.ui.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.animating.scale.down.sidebar~.pusher,.ui.visible.scale.down.sidebar~.pusher{display:block!important;width:100%;height:100%;overflow:hidden!important}.ui.visible.scale.down.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.scale.down.sidebar~.pusher{-webkit-transform:scale(.75);transform:scale(.75)}.ui.sticky{position:static;-webkit-transition:none;transition:none;z-index:800}.ui.sticky.bound{position:absolute;left:auto;right:auto}.ui.sticky.fixed{position:fixed;left:auto;right:auto}.ui.sticky.bound.top,.ui.sticky.fixed.top{top:0;bottom:auto}.ui.sticky.bound.bottom,.ui.sticky.fixed.bottom{top:auto;bottom:0}.ui.native.sticky{position:-webkit-sticky;position:-moz-sticky;position:-ms-sticky;position:-o-sticky;position:sticky}.ui.tab{display:none}.ui.tab.active,.ui.tab.open{display:block}.ui.tab.loading{position:relative;overflow:hidden;display:block;min-height:250px}.ui.tab.loading *{position:relative!important;left:-10000px!important}.ui.tab.loading.segment:before,.ui.tab.loading:before{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.tab.loading.segment:after,.ui.tab.loading:after{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.transition{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animating.transition{-webkit-backface-visibility:hidden;backface-visibility:hidden;visibility:visible!important}.loading.transition{position:absolute;top:-99999px;left:-99999px}.hidden.transition{display:none;visibility:hidden}.visible.transition{display:block!important;visibility:visible!important}.disabled.transition{-webkit-animation-play-state:paused;animation-play-state:paused}.looping.transition{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.transition.browse{-webkit-animation-duration:.5s;animation-duration:.5s}.transition.browse.in{-webkit-animation-name:browseIn;animation-name:browseIn}.transition.browse.left.out,.transition.browse.out{-webkit-animation-name:browseOutLeft;animation-name:browseOutLeft}.transition.browse.right.out{-webkit-animation-name:browseOutRight;animation-name:browseOutRight}@-webkit-keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@-webkit-keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@-webkit-keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}.drop.transition{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:cubic-bezier(.34,1.61,.7,1);animation-timing-function:cubic-bezier(.34,1.61,.7,1)}.drop.transition.in{-webkit-animation-name:dropIn;animation-name:dropIn}.drop.transition.out{-webkit-animation-name:dropOut;animation-name:dropOut}@-webkit-keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}@keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}.transition.fade.in{-webkit-animation-name:fadeIn;animation-name:fadeIn}.transition[class*="fade up"].in{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}.transition[class*="fade down"].in{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}.transition[class*="fade left"].in{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}.transition[class*="fade right"].in{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}.transition.fade.out{-webkit-animation-name:fadeOut;animation-name:fadeOut}.transition[class*="fade up"].out{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}.transition[class*="fade down"].out{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}.transition[class*="fade left"].out{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}.transition[class*="fade right"].out{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}.flip.transition.in,.flip.transition.out{-webkit-animation-duration:.6s;animation-duration:.6s}.horizontal.flip.transition.in{-webkit-animation-name:horizontalFlipIn;animation-name:horizontalFlipIn}.horizontal.flip.transition.out{-webkit-animation-name:horizontalFlipOut;animation-name:horizontalFlipOut}.vertical.flip.transition.in{-webkit-animation-name:verticalFlipIn;animation-name:verticalFlipIn}.vertical.flip.transition.out{-webkit-animation-name:verticalFlipOut;animation-name:verticalFlipOut}@-webkit-keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@-webkit-keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@-webkit-keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@-webkit-keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}@keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}.scale.transition.in{-webkit-animation-name:scaleIn;animation-name:scaleIn}.scale.transition.out{-webkit-animation-name:scaleOut;animation-name:scaleOut}@-webkit-keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}@keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}.transition.fly{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}.transition.fly.in{-webkit-animation-name:flyIn;animation-name:flyIn}.transition[class*="fly up"].in{-webkit-animation-name:flyInUp;animation-name:flyInUp}.transition[class*="fly down"].in{-webkit-animation-name:flyInDown;animation-name:flyInDown}.transition[class*="fly left"].in{-webkit-animation-name:flyInLeft;animation-name:flyInLeft}.transition[class*="fly right"].in{-webkit-animation-name:flyInRight;animation-name:flyInRight}.transition.fly.out{-webkit-animation-name:flyOut;animation-name:flyOut}.transition[class*="fly up"].out{-webkit-animation-name:flyOutUp;animation-name:flyOutUp}.transition[class*="fly down"].out{-webkit-animation-name:flyOutDown;animation-name:flyOutDown}.transition[class*="fly left"].out{-webkit-animation-name:flyOutLeft;animation-name:flyOutLeft}.transition[class*="fly right"].out{-webkit-animation-name:flyOutRight;animation-name:flyOutRight}@-webkit-keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@-webkit-keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@-webkit-keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@-webkit-keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.transition.slide.in,.transition[class*="slide down"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="slide up"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="slide left"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*="slide right"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:center left;transform-origin:center left}.transition.slide.out,.transition[class*="slide down"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="slide up"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="slide left"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*="slide right"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:center left;transform-origin:center left}@-webkit-keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@-webkit-keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}@keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}.transition.swing{-webkit-animation-duration:.8s;animation-duration:.8s}.transition[class*="swing down"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="swing up"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="swing left"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*="swing right"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:center left;transform-origin:center left}.transition.swing.out,.transition[class*="swing down"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="swing up"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="swing left"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*="swing right"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:center left;transform-origin:center left}@-webkit-keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@-webkit-keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@-webkit-keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@-webkit-keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}@keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}.flash.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:flash;animation-name:flash}.shake.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:shake;animation-name:shake}.bounce.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:bounce;animation-name:bounce}.tada.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:tada;animation-name:tada}.pulse.transition{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-name:pulse;animation-name:pulse}.jiggle.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:jiggle;animation-name:jiggle}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@-webkit-keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@-webkit-keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}@keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}@-webkit-keyframes pulse{0%,100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}}@keyframes pulse{0%,100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}}@-webkit-keyframes jiggle{0%,100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}}@keyframes jiggle{0%,100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}} \ No newline at end of file diff --git a/public/css/themes/basic/assets/fonts/icons.eot b/public/css/themes/basic/assets/fonts/icons.eot deleted file mode 100755 index 25066de069a62374b39f220581d1314fa60a5f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40166 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 - - - -Created by FontForge 20100429 at Thu Sep 20 22:09:47 2012 - By root -Copyright (C) 2012 by original authors @ fontello.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/public/css/themes/basic/assets/fonts/icons.ttf b/public/css/themes/basic/assets/fonts/icons.ttf deleted file mode 100755 index 318a2643d3af55fe51b472e7769b99caf74ff7b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39924 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 J*(!_){|Uh81M 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%0DyT{kunD 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⋙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 z -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 E0UHWiZ2$lO diff --git a/public/css/themes/default/assets/fonts/icons.svg b/public/css/themes/default/assets/fonts/icons.svg deleted file mode 100755 index 8b66187..0000000 --- a/public/css/themes/default/assets/fonts/icons.svg +++ /dev/null @@ -1,685 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/css/themes/default/assets/fonts/icons.ttf b/public/css/themes/default/assets/fonts/icons.ttf deleted file mode 100755 index f221e50a2ef60738ba30932d834530cdfe55cb3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152796 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

=v_rA!CPE#mM^4@)}X7qf;At+v)G*FZd&; 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 ALjV8( diff --git a/public/css/themes/default/assets/fonts/icons.woff b/public/css/themes/default/assets/fonts/icons.woff deleted file mode 100755 index 6e7483cf61b490c08ed644d6ef802c69472eb247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90412 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%0Ded40&XED0GYFoIh+AV*?9!MR5pBW?X_8Bp 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 IH>08b4`|GD*#H0l diff --git a/public/css/themes/default/assets/fonts/icons.woff2 b/public/css/themes/default/assets/fonts/icons.woff2 deleted file mode 100755 index 7eb74fd127ee5eddf3b95fee6a20dc1684b0963b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71896 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≠dR0E9ICQ{-tcR;@{R^I5P#1GUH!p=-{c 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 diff --git a/public/css/themes/default/assets/images/flags.png b/public/css/themes/default/assets/images/flags.png deleted file mode 100755 index cdd33c3bc609a91ff492fa352d835bc65de6eb9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28123 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 szvps9ukhz5h*B>3w`t1c9~9oX)@<@)c diff --git a/public/img/404.png b/public/img/404.png index 4b94cc6c0e7d4020eeccd59ca2f8665ff424fe0f..8b66c971f462dcc37c6b3f33d4a9c35c68a8979d 100644 GIT binary patch literal 4516 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 diff --git a/public/img/500.png b/public/img/500.png index 1de3924cf61be876949e7aa63af36157b0d6fc8b..dab69206ad010c4f530df93baba88ab72bf5d1b4 100644 GIT binary patch literal 5230 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 literal 5276 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 diff --git a/public/img/auth/bitbucket.png b/public/img/auth/bitbucket.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d022a5a7019f199eaab18992c4bb5926824abe GIT binary patch literal 2161 zcmV-%2#)uOP)hr3xp!((jX#X5=Mhs^zX=z z4w#4IcmesHJjZd&MF-@^Z&1U~K05$CPcyaf-%uHoZ~@YX1;dBwVJS=x!-oaw<2=Tp zJbn!cA|!z94Ri=N>nYF==Y3jLEzpMiMr;@n?s*n{kQBlZm$$hNp%Utbbk%z4a5~@z zPV9#J%IKP~Uu(HcE41XHjQdvF!+AQcu&*vhj> z*Bx|@@8tBgbO^xZU6E31a7I220c`bLD6IX?VJcdnI8xweh_67yZ^(!W=!6Bhu5^YP zi~;G|#Neicn7jUf2Jun+0)^|)82uy!aFzhv!j+4|vuy@SgcPeIPKB5vP7(GI`wNw^ z6f)pB4M>VV#ULki0&r^;4rcvLFr97mf^O2WiF_8>V0T<@v@2?d-)0h!m>oiaSgg~I1r&p}s40mlO7 zDgr=C0b8j6A7oIH$*{NdxSnn3h|keR_a3kb1*EPXuowmCjY3ljJ-rVFEad6|F$GKx z0e^8I#J~nMB?m&kBl(G3H6WsZHUzv+0mTpyP*A{INWN)@{3^iC1@57MdfNTf|$SB}s3P@c7QVQ5sd%z$pg4zSNa0$>Juw)O5U{2hhhcAMQQb6Jo z5L3XU5b&36AW$*VgnuEqjsrp_4}M4T6LhTsrU-T*;B5)KGLqmuoJ!9ICLpu%v-?F@ zDCw^w`IcJ%!D}$$lGr^GeBB`40n36$7ghxC*OZ{*@94fHMv#0;0jHQMS~vM8!PqiQ zZhj zgghs0`X>J)7?%Q~ZUSr(?BJp|SI}gLy~mPr&0;ls;f>rGO1ke15hR~dz|j>1l;#(nQIa_r zlnwy}*j=uf$$Y=8AmFen0ul|? zS>J%MC?N6?5K%x1UXez90(hT$^|2Aq2B*q_ieJF-ykBe>0eoEJ{x5*oPXNJdFaZs& z$@|m+4PsB}(hV~nSPiTSCN-biM`nNDj;S09Y+Np8M9UA z1plxoj;HrBj1P_h|5iy}Vtfyb2qNMqfW&6|`M0_f$hUkpcL1w^mHFRSfbX>TcwisX zU%`BmgP#DEzy{xSZ%TS@rV2IM&E$a8JQ90#0rCuu3eI2`)$>E8j|iei1VrX|%01vJS>SB* zJ9?IQI#&6;z**onE{43pWIh95lh63s8{lbv_Y7XU3fme^;{t8-i;u@q>z!aki9N_$ zV0!b5d=9o|01eV2-HK0#0geX7B%|@OPS;}0`$&7+$?=(~B=-6}fWN@|@=QJtHss%= zOA>Q-(6iPgAeFYXmu(DQkec&0r3C2#D&byJgbF#SeJGek6D4}=%?-c*KVoJDhublU zydCb8nClBLmH#9e4HhDz;4^$A$MfR^I2<`HSc+{vqxT~=reh@LpaY?eb!bZpeO;07 z81$u_nQg*kcvKD$ezr6>F%IN4&w(Et>xU8pm%tcvF9gil?L?->vA4|P`mV=lu>iA3 z0SsCLMgw1)WPOIcZZVpu-|)CFZ>N!i*8mdH>XW7$_WKDDiRBTU{)P~sh45Sz(2uBq z)AjieB0w75b^r_5vM&TI;HUxpMM>uAg#aytBZ5z5fuldk%{heOdsYMF)v}2WMEU_8 z4{V^nesBRIVSjn2_oWD34cb>?>#2aq+-Obkp}xn1%5b;+K3GkX@3{aiilcMr`k^~$ z?}bj6%n$ghk1DbBsQ|t4NMH?ch1o|429v&&zxaq6L%#^nLrsQJz#?4HxfZ+xzV}!b n|DN;wYuLuZ6s+>2y7B)9_XxB^N(C3^00000NkvXXu0mjf9sA{< literal 0 HcmV?d00001 diff --git a/public/img/auth/dropbox.png b/public/img/auth/dropbox.png new file mode 100644 index 0000000000000000000000000000000000000000..da2348872a06bd71a68b900e3ae538f613147db3 GIT binary patch literal 1427 zcmV;E1#J3>P)?rUF31=AkjtGC6BzyA4YBbU zc}+ekcOf>sFc862CnrA+LwxZ8jZGN4Hr_ydaT3K;BqkI_LYy$#!0X&_h!Z9tyj965 zi*pbcEJFmHCuRY}1y@kn%)~^&RESRJk=ljv6XOI#r@4q>baHCoCd44mQQV2~3*aHd zAa_y6h{PnoGKfjqIuJusctK3C21#8>%s*(0mk^W9LBJox@Gqu7O!fxd@Smf}NrjCN z3vESoO$-sS24bNd$lzOI0-z7xLln4&e8_Y2VgpUvt9YsMGN{`$YTqnKI+OI%z;Worzuh1ERbrh}v(9Wd#>;Vcn8c1|(hZtlL z5*gein+-9@e#CL*Y>k2Fa2=&goIn@GMTibl5kyZAHC?zaeMB#WvY`DE44v@~;)D;V zV^k11a2?`+T}Y{*iI)UhoS4n$Gdh4sSmDRVsVe?f+y*X(%Md#@B8HjEIwK$&UYLMz zZnTgP24mm>(U^$;tO%ey?qDM_yYV_*I;_GyRJVHY*{JdpEM}I(eEenAfYEF&hO-dE z4HFX?li>})Uc@nb&^)+drwVNW|89_&f6xr~?ev_Am^E-?2kN1H$e}Pf8L<=M3s1B* zx)7TNagZm*BC3UniGblw7PPYvT<^efuovQj+o)$ja;o7v#05u?NYB;(E<~sG$Y?@h z(qI)tr-!KM?BH$S12M=)3_@6giokw&2Qg4r{H=fOTc2yFqH|xsC5TB@AcDQYlUdlC zUWpV=uFEfiSl}$u+6GVx&mb21fSw5EOJV|{6W&5B^a_==*Bepj6pGr}uy6#TP}k3a zWWZ*KVvCRz2{9X@*iK~Cp0S2_2vKMx20#>gh8FnyN1yo^SOig^AO89hM^}gfD-qAp z>huQ00`E{qyY1!6-&ODmVu8D;=gRzM27DkUxryAGIo|?oMdU9(%Zw`!6U|2yJ(X)d zT!a{G7ouv`xsF16z^Hjoa16%>1J7E(FYlcd_aHW2qm-t{Gu^;F zK;sbFpGgzM!w?sFql4!C>N}A1UYg^Z!vo@?lcx938Nfe!;f)JBTgz)!M}|TiG!H>^ zRQ>NU2!X8Z-X+FPhyyMmwPrTH2I8cHh^bj5Jnh7~drDO;&cDzak0Ew!LWD2JC)c?d z{1$R*IuEP-_!rw5|EfyPzc!u6)esvK@b{NvO5>$Ly`=`4u}45`tV0~lG5@JZP*Ti8 zOq+hq9eAUm=I7l_*bF{NQ&iT32Ogq|O@C`T3aUs@5(plnmgeVCkwLSCW-i1eTM$~a z@iUf9%lHZeMO7pyF+6N~&q*}DkA=MulbuIen-eq-qET2yf|5aOyhIb^z%7VHUZOP0 z+9^7Vt4L4;T!6T_2S}pof3i^MgEtU2J}yyBr2Xow>K%Bw_z~{SSB{Q!lg%xjp~@002ovPDHLkV1gOoi|POX literal 0 HcmV?d00001 diff --git a/public/img/auth/facebook.png b/public/img/auth/facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..29273af14fb019078c13b44175efaf59fed6ea1b GIT binary patch literal 2327 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 diff --git a/public/img/emoji/100.png b/public/img/emoji/100.png deleted file mode 100644 index f67d69b8fd3719d49b560dcd5651cfe212b965b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2630 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 Ef@ua70{{R3 diff --git a/public/img/emoji/8ball.png b/public/img/emoji/8ball.png deleted file mode 100644 index c74cd9f72346e614ea20df435e3ee75a8402211c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3219 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 diff --git a/public/img/emoji/a.png b/public/img/emoji/a.png deleted file mode 100644 index 45d1f45ed26468b2aae9588ad9c89951278ac4aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2374 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 M07*qoM6N<$f-KhSfdBvi diff --git a/public/img/emoji/abcd.png b/public/img/emoji/abcd.png deleted file mode 100644 index 360208c3b45ca23108db7cfe6d6ab39b62361186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2670 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 diff --git a/public/img/emoji/accept.png b/public/img/emoji/accept.png deleted file mode 100644 index 56b4c3e820d12e1c76eb02fca586803abad55b7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2681 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 diff --git a/public/img/emoji/aerial_tramway.png b/public/img/emoji/aerial_tramway.png deleted file mode 100644 index 888a417024c141c695465ea3fc54b0c994bcdeed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2166 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 diff --git a/public/img/emoji/alarm_clock.png b/public/img/emoji/alarm_clock.png deleted file mode 100644 index d555ad5ee5df3cabc92d17d9ea5f7411dd096ab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3383 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 Ca4_`JU$yFB>(^bEj>RpMMfw(IxIXr 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 YVqo_L-_zadrF=^OV`PEG8@Sy2A6i&z(EtDd diff --git a/public/img/emoji/anchor.png b/public/img/emoji/anchor.png deleted file mode 100644 index dee403bafc3484b4f7b2aa89e47259080650fa7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2414 zcmV-!36b`RP)G>ZE=8>GgEU!U3*`0gFIAj zd5M{Df|n;bQch=uU2cRWGDul$gGEzkS!#f0cZPR{mTZ2LV|9vplBQa7j8kfgU2A}H zgqTcdh-iG4S8t1Rgq&x1jDM7+U2%#;UV2MkctBBWKvHTcJ5pzPk~d0XIZ9!UWu8hgp;OwjGJ_doQRvNEpMQKE3j8kxs zT6mK+NMu`mn?6{1T6L2lE=4FiSu8zTHc)k7g{CS#T`W0YPHvGlOl~z+dP-!4HArqo zTzqnttxIf)S9FkejGtP5qA*5eX^W^uVu(p>k~eUlXNR9PT7EiRf>L&qQ+Sv_V2DOw zeqVc)V~VFpX^vokmMTtmK2&)uQhHH!pKy_R1%pFvxKJ6U{d zlB_dRcW{fL8a7r`bBiNGX**JOHAZP2J!3m)ku++UB1Ud1SA;-UgF#+|OMazVe3p8X zs9}YkB|&0bi>fP1ZG4%mI%9{Aqq$FZmtcUKRBw!3fuciKa#(|*LTQp1G*T8aPDWmW zo3q3uNO2`tjzD&yOL?MQfSprld{AeBFg|BkgQsSJop_a|6rjQS0001ObW%=J0L7I% zPfHaFOiTX$Qq=`i`)2VEcm4BG;2`Unss+u8&iGZ|?J(MVRdV{kf&KOCl1-oZ7U?9`-1z=I0JGNchHb2`&-L7|I=f&8uZQHhO+pKN3cTz;f zBtIIYUs2h@Rb_FIRQL_j5B*871HRvu(Wl%}OQrIl3UxCQ4)n@}we*+YwGM$w$Sohm5 z0CxRWJ(!R+tpXJD@z=dMjYC7X|MvIWLvhtPyg`?*6!yur zfm>N4jg5^tw+60#0+jIO_3nXNBO}8D-PgYaN-_HRR&`ul_3+O|KuJq;>h9dB%UKGP z4;UODAI#BKJ|OVw`1sWXWg1vnS?TNRA4`aRG*h2=3=UdZDRN)jX%XMr8b9Tl6jnbo zlN_7udat2`eZkZm%+cce5tDj)g@s)uC9df+SK_-S3*oq4#C;PmH%A^=guAC%ggafN zPjz%mg@?PlyF0_rgCk&WtS?{I)fI*ag~E^)pG!`uLeYq>?q%z_Zi34{As6^2xQB+) z3A00@&t~u@pNR(#{FOpsLKGf9G}M($nH{50ysWjr3x5D|G>!i#9$Ba^vJ6en3w2H1 zCmLBS@ehA7)&jErbkkVwA*zFR&kIcp(UE&0Vye6w!uF#ooz!xZUnVBOH|O@4$oH}kB1JT(G~$_mT}@K$2vD+IFWPxG3ay!*>450=j52 zfk2@3(P(6JjO8wI1N+$qZsGtf%a~EP6paAU(3USMEFcqHT>AS7gkU&5n`a;n@Q(HI z@$b_RKk#U@;C=@O_^u!li)pGadhIYWGWxcvsuEZ3SFvu#4lQv2HPR=;{$+sKcd82< z9{O=Ss;a(Szka>y8X)1Ts!9*$!(iGX07(Q~qI$!CmlkE$R3JEy%CCSdtyOjuMsORo zX_-U-i`pC+YcCP7tf{3ffQZuD#N^gW>;sc+kNMQ>VxsRCn&1^SAYQ}(G&MQi!u&;mUPjM zV$R=lH8pu2kelo1tu3l=%5O-HAq7M+5XuMOHRdxBMwGz5&Hqw^^KSEn03{0O)By|4 zck>$}>&Hm5JCHdayw)Nn;#DE28Ffsax|D3OcXL5XQITWdmc85fkv_>Wqcy=?F9fp) zyq@8^c8DhfTVvnmc)s~jb6EatK#Xm3^Of_C?cOXb(UWQSt|52>Edx6|;>*Rd3P@vD zV>8?mi;Bk38L^Hj?e+pJmjTx|&;oDv4hMtxgb~54f`S48mQ(Tr!U^wru0druZg2RbwFnoQ9L?VMBS{cv5;Z$tE z+^D_BDZ_E>Fc>@@kKplefP*W;y{87|&Sw6HWo2bJ9L#}VWgcZ8s@ebrX|4NC#b6#} gpz_^1E%5K_Dc>fM_B&!2od5s;07*qoM6N<$g3QZ7CIA2c diff --git a/public/img/emoji/angel.png b/public/img/emoji/angel.png deleted file mode 100644 index a0824990721865ff8025efa5e50dce7292132dfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3034 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 diff --git a/public/img/emoji/anger.png b/public/img/emoji/anger.png deleted file mode 100644 index a0061cc4d7594644937363fb9823a87b20271dc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2494 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 diff --git a/public/img/emoji/anguished.png b/public/img/emoji/anguished.png deleted file mode 100644 index 350d57ae50db8a2c0480e120dbd97925d92764bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2931 zcmV-(3yk!MP)TnZ#Hwdar4ysNM>UR{|Z4#VI4%TZD zYc&cd6a>mw4%Au?(NhZKT@d795$9(T#aa)HMh(qa5V>0rv{(=0Tn^(~5aeDD>~j>} zUJ?GmFaF6O{?8%)+9UqWQvS;#{?1wc!XW;^E&jzJ{?TCm%S`^$A^yG~{^X(l#v%UG zXa44=^phF>#325@EdJdi{=YB&#wY&NA^yom{?H-+=&$~|D*o9d_nR5`rX2aFBL2H0 z_Lvv`)g<(g8TzUn_nsU6%^?20DEOft{=Ospv>*P~Z~nk7_@Ns9$s_*NA^W)>{^FVc z>bLTT7yiUE@q-qeUk~tp7XR%gmsbz|*m(Znk^aCj^Nbh&>%H}t8%iVr{<r1QvL5}jC;###^NJYmcohD{Isfg${I4ed&LsZFLH^hwaX$X!8DuGN5{K6n*GY9|e$^Z4#GB{?0J|$uMg~5neF|bTtY8^40(8y_{nZ`?Na#<1&_c z8UE2!VLc4~*Nl-<5C8P3bW#qARt;-134>q~{?a#^Zx{dhC;#Rn`?xAzDF%K&3apJ5 z|L@PBWDx)7n*7CH&#xo?*Ju2$BK`3${@O(T&|T1;CjRHIoLUn8-)jH)pa1{G$EalN z2(qxE+sf5vqL|YCR0|#2?zxA;`NP>&YLvryBq8mHyh6`@B&4t}y$^ zYVFmTx0hG`&qn|Mxw52=^3ZK02LQUICGzMltCe!>zcA9INzliK=d39I|I?g+Rotj4 z{^fG=>BEFuEdJS#$G46C#Z#1TJmSNB(Z?Xr#2>kq80Fa`$Y1Pm0000sbW%=J0MHe) z2n!~-td+_j6h zZh`(|H*Z_W5)CDnssX8-(kuzt#+!Qve+_#(r6y33NF?#MZD+6H fYW}QY# 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 diff --git a/public/img/emoji/apple.png b/public/img/emoji/apple.png deleted file mode 100644 index e71c1a8f9d8ef615cfc842bf13262fe1f9edf0aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3281 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 diff --git a/public/img/emoji/arrow_double_down.png b/public/img/emoji/arrow_double_down.png deleted file mode 100644 index ee530a658167bca2ad0377799ba88591f4192dd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2207 zcmV;Q2w?Y#P)dK20w^R1p>aVt4XMO=9wDKH-@G5`PnP-}-#Y=}{8iB)lsPHBWtYKBs6 zid1lnm$T88vd~a!g;Q>fRB(=%w$hon)K6%GOlN?cxYbs2kXLh&MO<}Qbdy?mmFe&G zow?S0nz~tdn0lDFSay_Kd6<8jyi!(e}*i>kEt(roPx$a*$bfmR)_FTzi{RY>HTOlR{W<=?a> z)ZXY;c9`1b@50dDsk_acx6rG=)qk3|X^N_Aim8~j(CqQ{-sbVf)81i!o}|6mrL)9U zaE)DgmScUGxy8}(^Y@&u!EJ_~Ylfou`TKK{vv-!ZTX>jLaEqR`%r!+;o3_u1p}FMh z@KSf4g`&Z7k+byo`7c|HgrK{Jq{4QPtRql^^7Z(Cp1qQ=%a*j#Piu@wVuHie<(;<9 zti;@_zSFA0+q=ouc#x^S%hz|1sbrD5Z zu=&pdHP+7<(9Z=D`OnYK%23oXd)_Uikt zXyWdZ^p1_{CF{)q00j?8L_t(|0o;^RU>sWjhHKmAYi)P4lN;MCW7|#^v2EM7?b=3A zx9Ro0#h#ftGdsIUUi-ae{{R27yEAiU{8G%^dgAnsIg_&E^ogxAsrCntpFDMD#oS3* zapu&?;|IC^`|?9aR|p{K%|-*4_%dMBoQ?>rIC^L~QLy>&5%=cClF(ECcsDO34A=u=I` z$Gt$XsfYe$EC}_8bCRl=PCt-qJ;#w~gFB2%^ zx|w&&h>gUTTH?EaV3oTun|XmqHOb&rO)48p5 zdZ;ryTAhe$1H5lgCB@Nf=TJH-SQ#JYl*hgoeU*SJbSs)viCOeLcAisM{7N8L6kll0 zVC4D6XcJ&!w<3y3Ok#ZV7!32m_(iBdP}9_z;p~~$4@&Oxg!IXT&i!!z(5qMm^Z-=hgFP_*zU!UVIuH9}1-I3#sjo#%s9cM>R? zhH7}vMg^`BVOpjrDQ|f1-=ttQt*{7JTp+LOp@ot$mdW!x7|XzF9=h_lAYV>1)EL9# zDKEiO54;tsDVL85mf9g|VMaIuZPfd=45$>QhS)8|1j0pyx)7Isr`rE{3GNgY2}6Pc z#Rr-&x!K(N>|8?SfnotBSnVbh5u!%m&Rs6S9bzLSLdb13E|6Cu@fZ0#_=DV##|85g zXo#W)k&qmsASZ-WP()}7^B_TlA_=8i@cxz(Igfw^E`q|r@?@?-hkO4ut~gj&&;=Jr zKSboXxQ^Y5?Cabq@=zKQ2o^{n+~nTm>~H2$gc1eNCx~>Q3rkRN`{%9jx=ob{(;Xsl zfs8KxdqtDw*e)@H=9wgpEOsp`iW7#X7sOSP{m^FCvO`~% h$i?@iH$)N#^aVKnk}`_7QS<-+002ovPDHLkV1g%WKrjFR diff --git a/public/img/emoji/arrow_double_up.png b/public/img/emoji/arrow_double_up.png deleted file mode 100644 index 4949cbd09310036e7ad5236de233198124efc58d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2339 zcmV+;3EcLHP)A1N>&Dlz~6|5I*^Qf-P*Yll&6h*4~bP-=!yYK51x z(O!O_nYh$WX@s1()swN#OlN?Vvd~?9o=<3llCaE}w$faBnvkx_jH=0xS$Xj`s zim1k1e4IsGb!mZ`V1J?4RtCV1c4z zfuLG=m4BPO)!*lUpuJUbkXCY#S96hin7Bw^d3cw$V}z(waE@SrqGE%mQgD!Af~7%M zZ*!5bNn(6MS#nNjf=y?ET6~^gf1y)#m}Q2k`~Ch#Ty=h!v;P18OJshJuFh3+lzNr2 zwZ_(Vl(S4_f@zAaO=yIHqsCr}w{(`dbCR@Wh^+AR_=KXuKw^aR_xea`j!tflPicfW zN?%WHjBSms+~w|8bd`Xhz;KYTl(EoObCO+$!cz1Y;==yjR9QG2L$l(+u= z|5 zDpi72b(S1NbBU+LL}7qHQ)-T^%734}Picta>F-{EqL{YSo43`EtHR$3?zdNvG%?C#r3ue_|Pj3BPe$ zb>h%d=->m9W}ESaqJEca0vDId9}W3tY&7EM{3-i}OmMAQs2o4A`EDW*$n49|Sj#dq6C0LSsy zF7xgm(0l)iQJLJTp%=$*!=j?0mMKmHw!>g%hl^q6l$qO0nHkT^yINb)jAZy6XMXd& zNu59QftBV%SC1;TB{|Tv@OWuy+d|WUF%05{Uw9TK<@e`$P0dK)d|tlP{~H_Pwa;1q5D}5ki_xV{UI8eP2e!F3TO4ZX`XJ#|92Rq5Wedl(g~~GdKO3-f#qRX!wt*x!kKi?11>Yw-baU<)5on-uwU7^F2k_Xjr_ zvvXrpq0$8dWp^mc|F}r217zT6~__2{tZ7f98 z*4A#Uv7KlY{s*lmY&9FXLv*uIMKt~>2DCZ&MyVRx;=iMSH~P;aSCGPUv@lSq8ByU9 zHMZmL0zedgcidJZU8qJhl|o=yrMfIfh03uVKk*149-TODlTFIhmCJ;{K8950Ae1K~ zr@Dbe_o>K9>4s$X!2m`m5hL9DDcSeju!k#*peq7H0;`B!WzfmU!w17aX86Iw$Vp_h zi&%vO#OFvwu^0md(x@#+c~*t!N| zc)$Ic(eJ_zTeDRR{8I5>>ve6|Knws-^r|o(o7o;B%yiIa43)wrpdq9=+^N$hp)EpY z#y7z4KR-J?nbGMPhx^SyR^h9Q(^*|%m2C!&-f>*Nm{C2(?}yER`2~Wj^BG+R;LB_V zHgk}Rvl$5vbDPaT!j*uD%b5rUq?>5(!oI>ZzM4TyvD)tp!)n!sIG}e^qXC9~wQIe+ znyD2=B;X~2Q@Yo5_%*K{QLO-zLYA|12ux;)#pq=w}A`Eji0X9BgfT-!7HBsMGM zl4BL}>tp2$mQyNMHWNd}HL;s4+G`Wp#pG^cb@=-xrnG7-(GSrooH+_nq}Bic002ov JPDHLkV1j9>fe`=z diff --git a/public/img/emoji/arrow_down.png b/public/img/emoji/arrow_down.png deleted file mode 100644 index 005f29649451b43e70161a72b75c85d7d3dc3990..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2236 zcmV;t2t)UYP)ltEIwf@Lu5EhZ97kKHb`eOLSj2naY9&oHArYD zHAE*hLjV8&UVffpgrj7IreJ}fUVxupfuLW1o@0fiVS=GteVk{Dt7V9&m$cBIy4Fo- zhh&GRld#O1x6+KN$XR-pl(Nr}ughkNs+qRYow(GGt;(Rg)}y}IiKxe=zu9JqsG+^r zXp60>!`q0b#c-3gror2$!rD`Cm1vEvYLBpmrNgJe+uY{x>hJVzlC^1$uWFF7Y>~8W zleTM+vU#1ngrvb)d!BBTx9aWmnYh+ke444k++&8Oa-__Lr^RQDuU>zjC1ILLV}MzE zm|T9HPi>3z_W5d&wy46}VuGS#grk0-z=NZ~OJ;<0n7Cnxs*0+~MO}Pljk2!A+_cHv zzS89W{{Cl)sbGPjgQUcfvCgi;*I0R-fuX;-&EZ>qqdik>jIGL2agVFO)mC?td!D{f zY>jA-wNh@8Rdt!c)8wST*-~$lQ*o4Njk8{Zr(S@gWs9#+ZIjdA?Azt;-skXKf}`f_ z@#pRIywKv9w$s(#=bO0Hu*TX>YKmour)iF^WQL`PsmN7xmuio)R(6|AXN4qJm5;8> zU4NZfc$Yy~a$0+%VTPz-gQazvy-jG0ow(DXyw>*k`=hvdzQN;F-11?(OwNccvy@m{fC+M`3uwvCu=+s1Is zv2D*h{O@g*vA^;?=lmZ3_updXtdC~Td2Jfz%>HQB%n9eqX0N!HS75R1nG%boAn)Fa z*~`Yw7cGq}(AaH5`y@N3M6z$lX4e!%E?tD~7cA+~n4<1x-*@|l4^6?a&wW4pZj?#W zvt$9>FI?{Ia^x22?&$mvJO`)1^T7YCRFv!JaxPy81dDHVMr987yV9b^47;bqFczKW z>L1RG>b$j>+0P%eTg|sUH;Z=}4BMx{VAxfB({tNwwGYmx_8-1d=;-#iiZ>sC7=8d4 zkZ5zU%hT;BeC0#x`w!akqum3WcR>#P^&Q}^14y`ez#W}$8>Ie+S61v0%9w$ctcT3RN*{QFjr%}9^JPUrJ@K5 ziYl$!bAjIvTFC@sVDKCV9fJ?0LQ zc%<45{0WV>QF%) zo(mI$QeI&Mp{Lhl1fqgKJU<-@1dT!6Vw}WED5y*n<8%i#0)Zk?yb0xBRPZkrixU-$ z;GM#4ij(_ypoAtvL2@V-??0*7R`?DjsAo&GCsP9h_XBcKK`zV!15;0GCG2`cpwM=Q zhN;8C!qhKOWkW%>iadT^2n+3gR)+%18o5II?Chi}G&NWCl2iXc!9S?%2y*C|1XKqi;GKpvHR z@!OZ^pg>0+UQCXnnleENBOvz4Ng8&#Kb->i&IYQvk6;7^M2$>I5)|Q|eD9A4qI$9# zqJR;w_R466Qo+rm=u(H6-d+|hcsuWN_C5yFDP(aNU;@ACs# z)f^1(2`D(>#q(-b0RMeT&=l~wU>uJ|nf<7j7?*z@&_oNuzcrsnQXInLFbG+@%eJw1K1yJgltBP(KE<$Mm)T znYr}wzWx~TL9fcc_pJl`tMmnk53F~~^04Orom1TT-$aDV@2t)T2ThGXgK}eT>lAP1 zZXiQmGus~oOqV}{{^9SbQ-5!uGu|}=tq+1#|1__lyu0!Hm;DYI@u&T2u=T-7uc(SV zlAtK7=tNYD-ig)+p}eCTA`)*HJUTISCm(8kfQ8MnD$GbNn_;Z=0Ts!IGIq(NgVc-`lEHY-ExcXro~|``qy@bxM}+JkO>f z4LV4e;ylx-mtAclw_JBjk4r%kbP+6siG%s)=HqXdCiwQ)e4am;fRH6X4}9wfCK8Ju z+q37;SbO#yi^n3&)_WZEAxJnAk^qBf3{DNB0SZo$*c3>rxBE>{rDTa!WQSY;0000< KMNUMnLSTZaHeMY7 diff --git a/public/img/emoji/arrow_down_small.png b/public/img/emoji/arrow_down_small.png deleted file mode 100644 index 1d09a004bf94adf6c2a4e2fc9709034aed31eff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2172 zcmV-?2!r>DP)^G(aXZKrcQ~E;~;nE;%15Fex`g z6d4{VHA4>%7cf3g9VRX$F*_b8GZPpb000mc9V93=L?A6S93&_wHcBWlNkgm#8Zj4lLj#qP$m9o%KYK51x(N1ZE zSag$^w$hon)SS50TX~pTc$Hm!o>+F2PiTW&dYV~ym|lLMOlN>xe4L%R*7^JVMO<~c z%-~aku%Nxz*5dACfuLZ2pHky@sR0h^E7Jl(Tr3 zwPJ&&im1kOk+4W%dSZmAi>kUsiV1S`ygs4hmeM4DtUVo)+jjmpQp-5hM zUVWW-n72)6ghE(vOJ#sfXMjIbX;5i|ageW4ZHs1yscMU@T6dOQdz)BulSW*1T6ma? zsK!`yl!2hYV1lS>j<9>0y3^h0*yHbXlCtaZ_TcF7_W1c|h^hSi{`>s=eVe&3pp!P4PZg|S9kbbp?`lCaB`v(Zm$jHJBQNMeG+)a9SL)tUk zETo!8z4oqX?vwQSviTmx000E%NklHpa|uJHP$+$9LgexrV1PU|0HrF=+T}o$@3ql+J`-y?wQ(+gIUCI+RLki-U+z z_=87o|KIJ&p0@w`-H#r?p+rz~9!sXM{VrC~R<=uKdyv@6wj#^rXH&@7#{6Y4#Npb^ zDCA*k0hHvhu;w#|M?ntZ!6ea3m;_ldsgJHID#H%$@D8}xHtPh?JS zm?s3^4YyvEIO7-B85X#{7-!=}uUo@+Ab5sU6=~Tx<5x537MQsjFT;!4qACP@L^~w6 znO$b$Q>sNifgZa#7qJ6^n#F?YQWM%#7Yn3nL2tTXv4#{h2uq6r{gwp%M6FcVKnR@t z7e@6ZfZ`4F`;B6vrXOAKcLIX37Nl=Awp z7&m($a2K%T!m|Rvem8vIy-!rmgmRX^oe<0_t1$VfumW%b7n~3U;iw#|QqBT_wfA5l z#*@`^%KOS6=!HH)cQ2mym2>K4Jgjig+ZqT&Q7DVY;>o(|C7cKPp}!E%B=ub~W0{3U ziAaG0Eo8A+RV)@}l+;Tky>W~^6j_C+f)rE_B`y}?XT+2L1ea{~4tfV&Vh&K=7LH6D5eDvGrK6Mb8CMKK$1vfh`x&D3j^z zQ1?3mdaTqSTw6lmIW!ngXT6i$cdjww!68qI;9RGPVz5mLwwb9$cTNZ#8{Jfj1O@`) z5jq9TRH1TfbR-3V(GY$E!5>%}ND8dfu1Huc6NTwCbtoWV7~-n7q6k!B5cY7v9xPK) z1+}5WK7kOz4)6DeVX(|+IJA}�?`pFxGoqTzb}_5i%S{5s1zM5Ewp3E-ptt&?w+s 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 diff --git a/public/img/emoji/arrow_heading_down.png b/public/img/emoji/arrow_heading_down.png deleted file mode 100644 index c66c1c86cd7aa8cbbf748c23e5ec61a86c477aca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2305 zcmV+c3I6tpP)dK20@6V=+NmE;~;%LthgaClwhcGC^A|J5wey zKpP<`Ej&vS7aRZp04_XC03RP6Auk;!GCosrCo@JwTX#rbeJ?&yBQ7}~DKG#G7b!PH zDK$eKCN3l~J02)A79AugHbfvTH5?=;HAQ77HcBWlN-#lKEjms;QEEk9doMmxNMU>@ zGetU0XF*kQD>+O5|Nl^Hhf-~dQEZ7(Y=~5Fj8JNZPHBWyagb1Ig;Q>fOlN>paE?}T zkbj%JS96hkn!1^|)R?x?UVflYXoH-%)nI?2fS|pCp}<;rl~{C>dYHI)m$g`Sl!l|i zMO<}VeV(1U)?0a)m$T86vCdg|n2M;zb(FJ}ve1a8!;-MfTzZ;Ze4N(e?u)9(jH=0y zuF9aj*mIGvV1c4xfuv)Bpw-{!VuGb(gs5VJr%h*qageZPhNxhGqCr=0NMCs2=Iva5 zph#hROJsghZHr%jq3ZDVPH~oTkgrN(eXPLLIZI$aQ)z9Du2^-I4mD^}aFAAXm0y9T z)ZXcBi>h0Dn|PSFT6ma~vCvw3o^X$^_xby3i>_F6lS5f@L|Su*sK!regu~O~;OOyH zbCb>6=asO^bCR?E{{Doh%2b53U3{JJ_4$08yl;%GkgUgopug<$_uAy|R(F`Kyv%8e zs#kK5`TP8PnYe=nqYgFbdj)Of~LsU z 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 FV1gfYY2N?< diff --git a/public/img/emoji/arrow_left.png b/public/img/emoji/arrow_left.png deleted file mode 100644 index 2047d0cf742e57b26784476b0f9c52ce6fe09155..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2177 zcmV-{2!8j8P)CB5 zro!54kh0w7@Lq(ck*~{Wi>;Qj&7``{jH<|Jn!;#}t!|UIkFCmTkFZ~lxonZNZIZQJ zew}HKuZgI~Zj`uLdY1uU3_GQrecDlhNs0_exhiP zv`lA(XN|8)Wr9dze^6_VV}_?jJi?7k&?4`ikQEic^!rO$U!+f5-VTP!IqQZ)*$&Iba=Iruc zgQl;=-2MIjX^yUSqQ`@y#F@3wS9hFQc$Zmwm{xX^UVomVz1UiNqgHp5RdbkLfTCJ_ znq7gVq`uka?)BT`@7?F{W{a%V-sob5rjxPGm9fiVgr!7$t!S3Md7r{$m%>how{Vxe zo43)Cu+5;m)uO!CpuE;(imt-d=6IdIu*lxk;_kT4;;g~e%Gl+q#N4UA(7?~!b(giP zz|w@HzGH}~fSk9@+vjSJuV90tR*178X;gENMqh?VV20l3 z@WIjI?(+9dXpCHYpRC5+`uqJ$WQX7B@o|!{m9506yUj3Yo`s~sTZgV)j<=k$&a}kS zTaLRqd8|5jsc?_1f~d=HjjWTa!IHMqY@NiMzS*9+(^iSLc4{?!0000rbW%=J0MF0Q z$&d|1vP7(~!Cn3(jc`n(-&&t$Ua%?|9;^W3Tt63Kvx3E$Br@M&# zF8}}p`$YZ%7yW9znVZ);7wjGbEXW>2&X*5O*Q?b>Z@tG3N!8#~R+ z&SdxN&i1yy>*xIs-gvz%n7@9}JA@XkpT7WjzIM^NXBkCX2o+^KTeoPf)%nUbsmbia zyKE~Jhhe^_BScy9%I|JfG@^7Z#8judXNQ{j<``}+I?UwnoH zmffwE)EwJe=wr9Sy~k=K)pwU6f%(ZJV+A!N>MJ0fDi|9{o{t2U>*O(`G}0@fjfTo~ z%aOoRwxqvi*b{_A@&p^M>6fsVB7wPLUN(sa;+g%s|1b@Rl+6>*#R7ptegH#3JwDmq zen3NkSl~S|Z(z{d+Te|AqfmCXH_+e!Py8Ml*vG5%rd#>9zGnjB(*5Z`-j%$4xIhKn z-vYhAt9~m4as3%C1czd-w|DgxKuDl1INZ{8cobYB zW510Cnq-R57_-or|E?W{5S*?bzO-;n^kSuuHQ@sKNV6DzXT1_aaqFWj{oNf2)8hg< z8KWUGaYkkLFMmO{X&Vv~BO4ep9UAyp7sj|*!Z#7|BU!(WLj=Mb`23Qaj4<8DXyAZX z9P6e+Bq|Z{uXYwdMB2+mikqxBuLI_Q#w(7&VCWU!m2_UMf(V6<=}q%EFAW-4tO0YTl48M*Bo;y`IWJgpO$18)|!M(;oi=c|YVBk(f1 zwdhSWkRkNC%tYj#JxLre?Jj!>Gw^}B1k^~v8G^w1T+^%$A4qXgM`KQ8oyLBp@^pli zvnSx0+9d^h183hboD;jgHvdXa+2LK50>WUv&gM7xNaadVd*M}ItU?1>0bW3AimU1) zbHL3*9WcwTuTG+Y3jsiC4>v5ZF<#(np_OuGCUC*S7fcYp5e<{4%zq#8jvPA2s|uMJj8!;;6SSfkia2HiU!`29uf*1t%*&)l2hH`2qX|5lD-8F z;0k}7tfkl!NNaH+1059n^xG9Om`h6<7BD(HfVsGm9bUrOXbvn%Zw3ZnR~%mE|4QcC z$blFDpr|tGK&zQWLv&_Wu$Wx~hAI>qlo%9lW{rw4Q$>bS4$bVB|L^wr$7Z0if#Z5l za-9KFHv?@c3cmX!zaW;{W}vUadEh@On1?HUGe8MGDFja{On3rq21ZJT9XkAc!jN`C znKCv59EmeAr$gsqLpm2M9>HJ(W%69~3)FcKE%XJ?XAsyjp`K&)LBCopJfK?b59%zZ zLlf)}n2pPJeLd-w@9Is~^|p*>Apv_z6vDJ68E-dBcQo6aNh=LuQ~?L@&mof3)OYLU z4(najl98VtgCh!oPaz68Wg_@6WP(euLC^z;fx+H4`9&8!A-6cA00000NkvXXu0mjf DYCI!O diff --git a/public/img/emoji/arrow_lower_left.png b/public/img/emoji/arrow_lower_left.png deleted file mode 100644 index 31202ec7a3bf1cc02326c144133a6b845a458917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2287 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 JPDHLkV1jLJfLs6o diff --git a/public/img/emoji/arrow_lower_right.png b/public/img/emoji/arrow_lower_right.png deleted file mode 100644 index 4feb125417a5d9ff4a33c03fbec6920cf44e3965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2293 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 diff --git a/public/img/emoji/arrow_up_small.png b/public/img/emoji/arrow_up_small.png deleted file mode 100644 index 3b797abf3cb8f2f07a2152967d8a66c1dc43b940..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2248 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 A5&!@I diff --git a/public/img/emoji/arrow_upper_right.png b/public/img/emoji/arrow_upper_right.png deleted file mode 100644 index 0ac0171838ff63aa6b4094b74224267fa2ca07e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2273 zcmV<72p;!|P)nK1Ej>^!K~ew!00000BQHAu002Hyd^AQ}GDl}ONoqJuY&lPECpAMLDK;=eR3Ixh zC^kwI7$6iJBpD+tFF#T}Qh6{&WjRiCG(~4GL0>FGWGp^mE<#~DPjNd@aWX<;LRfn> zNNE56|6+urUVffrg{EMEpkINYUVxvYzSv=cp{2jsV}+z&f1akn+gyE|S$dXbh^VK* z+hm8Qsl(e%XoqHrsFAPBkFCm}yw-4&wPuQ{ld#N;s>q3`$7hSHro!4&aFuM4w3)Wi znzz#2=J4w8^pvvCm$cBGxYVJ&*X{KAZIZQUi>+#qv1*U7Ta>|Rj<27()}XuAh^NJ9 zjjd~tvhwx#g{8xSqrqK%ol$O*Z``qi&P8XpXT=XN6#crB-&6Zj!b0_W5OtuV;_6Q*e~^`1)pwtb?S( zmbB1ghpMi{+_}ityUW^UiK%0Trf7?)hNs3#Wr1ptv|xs)d!4>LQ*2p#pHgv;P;8A= zb(v#|twmmZu*cr0!rSHT^xo(2a+kVbh^vUDzh{iCbeOu0uFH|I&WxJ>2VuYeqbC*_jn^$<9S$LO8V}OvZ%t2Uk zUVolNTzXr4pGRSSO=yf+dYEdGxBC12rNG)*dYz=c*+*Z7UWBN_)a6TLhSJ~c+vM+H zgQH`Gqj#FSLwu}chp3XW&xWGCjGDb7S&^Bw(1@wWow(EQ^Y_Wu*J!FjzS50000sbW%=J0ME|_ z$ zwnP8`1zJf&K~#7F+>&E>BU=E5*S5XC*G{jBMYeXEW}O<-G>x8yO*Tbb+cws=ZQFdF z_3rI;an8w1I#d0<@1L1D-}k*?um2UJ7EW6>V`jfDm^owFw1uOn_Dg0gy_Cn%XuLZ` zqv7OTS~_D1X+D2?A?K{*LV(ol^Wgq3*Jvu~wS-bvpi4&OI+tiyxL2S${4rw(El8;?LGar4Pkw$@#fx-?w*u z{Fl;i=gzF|CTGrlEBz9m-@7jq%s#JDCtR^Sv!dIavAmL?R-K;>1=BbMpDrg@TK53U zgv*}_IMbkDPQLWe#gCRf;^W0b()>A4Fe^vROmN;v#JNLIA%UsRnFR$?qE0=q3^v2? z=2ZX{uih9of`;XTQ&Cfp;KQl)8-s{!uq)a0J0&GP8$e~_`cof}U_?}XP0$82m_?^) zl$_r105pPX>Z3;Bg6aoMa|{UrN`Zjs0}2nSiGmC<)2AJ`s0{+2dmv|uGfaYEIT`ow zt#40_ot8>qFo5{p{fwMpCV~3CVI7I;1`2~<-7SzB?yGUZS!LRLH!`&p25pTa2;ZkE z&muwZ{d~QfBL(7yCnUikCy=@6`TKk0f?bYIWDbe{Xd(%mYC-6@iy+v?uW~2jbpNks zRnA3>ndyL+_5J?#c@j|BJAK&n^Zf}#19qAGcaIUeCRZqX@68 zMS{Jav5GRTTpo@iXWyuyQ3=BJEuoxSrik_2OAxRk6_M9>u}y??|EZ=?3fNpWd)M`r zItv$!ee22)DHI|_S=Kgg8|-Z_z@9ANZp$iDw6+e-6%@2&0k ziJ7jRCN5MoJ~e{dRQj(w2ABlD*`~U-(fTgi?TxMkRNG(E!Ck8DZ@9odLg)ZUmh8mL z_A1+Ckia~Jj-G`P_DInG`AQo)0vXVr-Vrt{pZ7vf; zUbOIMgfMD52KN#bIwm8G=8**uU})K2rQVVS=`Us1YzXAE8WOi$wdsUwvX|*dFg$(L zFMBMA9NYe|WpB|LdwyA!J{$_hA3T5rh=`}xWENcr4jdfcT*+JSTy=iUEr4^$c2+Bq1scXu$|&K6}sD66%C_CUtn#%iMOKb^Nf_16=mi1ml7h!qe8U#y z0yE{Pg>OZl2c)cLMGv48$IAJ}b99F1M!p;q>j3mCZ0MkMx>Vxz^^K|4*TpKAQ`_IS v4^mi&w6AXyaF`nxuyF($DW8K>)1Q9>)EQtHVQ>kF00000NkvXXu0mjf3WsGX diff --git a/public/img/emoji/arrows_clockwise.png b/public/img/emoji/arrows_clockwise.png deleted file mode 100644 index 5f84d7e72b79e1ada173447a15f44444dcc1b5e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1399 zcmV--1&I2IP)66eQ^|hh=GD2 z1+ifelZJvM453&Q3ED)MnSwGBM`P3L?!E7y^F+LC-akXR_q}5X{ob$VocH%W=Xst3 z=T*Y`qFHBb>ZE&v^@{EQfasi>zi^GZsACJdJM@5hTX$+e0RkAzb(t{7E}maYf%xTz ztoJo-Jc=el0F4H6%o7ovP(v4H)=Z$gHMr`uH}M!niWr0#g~Fu;_=hlxzGCR2zeW+* zl4ZQvYC=G_v$(w$T(Q!2)~_qFL@*4#R2YG_&LXI7Fl3{MRF8~xJQU!qu+g@ zH*o~EX6fd4eOC2LT>wPfeM;In5Q24m)e_@Myw8vrLL53NwFglPG~eXNI$` z*Fqja;Sy3H9Qtz@K)K?xLR-cjY09+Vt|(X-@`P_){l0F2bXre2?X46ru`4Nx_?Z67 zV^pEsC%$g#Yr#PgZeSvAS|OW z&($ojCF^I3=OVzNsjJxoMU0`q-AiFU#KyH!2l$K%q8US}07zTS0@o*)Acl>9nC+zz z2r=(0Oy6g@Ie{_(Y7?lYd_my>RDM4uX)BhB#qW<_Az%;^ML-awLZFrzKr#UXi3B8h z1PrEDfsz>}c@88ec@EU@J@FV_I{%@MfGOKi!RLPXq%hF92neM}f<}~}6ACp@p)JY# zfUI*LNGL#Ka{vUWEo*3G4hR4VW+WF70`5nEt~?LdwG5LdAqfv7dFU^xqJ(8=9{R(` zAT=IFR>ffyCXIlsLnBJiid}S>gu+fH5Z2h&9IO%ng-$9!P7oB!C~&Ew?Gu$%2nyHJ zXbdreh5ORuzsD;Ge6%oGtH5GZ;;7JAU7VwW+h5qdUdF@55S5jl;I!%;iXwUZ;b5}n zJ0dlb+V7!=(FEkj{C=uX?Myjo4-17*ib4p;!I<>dQw8UXWsOy1zuAJ7#n?u~|s9L%y)X6tXoM*~8H7!#M;hu%-EFO_Mw0>}x50+u&T;@2=HxvjFNa11Ve-h8+0x$Rs2X0M*B63I`2k5>j$k z98&zv-z|Ai7UN`7SS$hb%NQgS0QCde6b`CXD}Er>Ai$pp_euoH<185fhGZBTA<)L} zq+^BEQ9wxXNI1CM6-aYL2B9GWpf)kZ76%8->S%<3a3~lCP}@1cK8YG80BQr{?1Cor z>JlgnMZ&UOZ=e7umoM25kir5~#kn6*1ejy1EUt+Ffa>CNdWpdyCLo50Z}?bluJMmc zmEi-jbWqMT-*GH{`5Ftvs5BjP;gJVs`9B-wV}eFteoAME|Ns9?YK%&0icoNpSbU&NY>h}{f|#??PHm7) zYm7~8k4k8VSbd>ceWFrvl~#J4m9fy4v(i?0otU=LZH=&1cbimpn$_OtP;Zc3f2Dev zynUR%QE`)=y3}}>yLOhjaFDTqpuvEkz*>H#*5d7xu+Vdpw^VhQkgUvGfT&ArjBt^( zjH$|yu+NUG%u;iff}+GzbeD;!$Vg{~N@$3PsKx zxlVGJ?eX?gbeQ`5{c)4HSbLstkhEZgs_O0Xk*>{Acb?hf?p=YXUxKKJrpC_P>Qs54 z-{|p8ZTKXo#$&yVb_h;9GvA=I!)mj<;Bexn+i|8Z>K! zrOCO>;2%PK!`0=ez0*~Dqp`%;TX>jgf}e$i+2xn2zj>0bvA)l{%Gr9Exn+~Ug`>iCm9}x3!hWL1;Nt2rf=76- zP-B{uoxp8~rCWxvZIHHwh^ujRora9FI$(){leN#y+*oLw#x4E zcMoYuWg%C3uBno2Q4Nvy?0x6e#rto*y@|@s^*GjAaqz=69js_Q=8?;$ZhHGo=lyNZ z>=ES3n)B4A-VFaWW%QcVdCjt1!JcQfIbFV;Zw<64zf$KMJ#qXG>o|VmXpZ_TWy`=@ zJK?3=x=GNY?Dan}==Ooz2kQWb44&}sRkjE=ZME;evV%vKAIup{XE5A0fWb%~%sD70 z^LD&q3%vgPfcVS9F<^fgx0o2l3esZ^e<>b#{&id64H7DEDvzTt(v$8+4++0_b+$hA zqjb0Q9{M72*pO4eZ|Ga-m5ZrdwY1ujAASkt7N*v0E?20VWO-|&rD-&*#VDL9gvmP8b9lQ z*x!R4=udxcZV~yRY*!f2 zkSqO`0wsrJk)OyjD|!BlMzB3>DjB!|R*JxZ~v^!xmt*Z`nd!KnpI#RAUOh0M34kboa$^Wf~&Z#qA?d6V3o}| z0v#$a5s)IDa0C>ZLKeU-{0hNo|J}%DvKG;I-F5^dWkW1hp+*4%@3{+qWaILGMhHot zcB@j^5KDi*drXVi6r_I3X8$O3e-8%UrwRyRg~JFT?bEvZsi^|1!c^7uTQ}fUJfE)t zQ|kMUz|)DYyfCZ$QHiba`>k95Ql;Vw=Wo~D`48Mj&g6#yJlDjh9f3fS&?f&3Vpa0n zgJ0_Eez|_VyRPoef=Oz7_b0)((R?953Ums%D5!Q}_#r@SY+AvMzhAp{?H|A2HI>+_ zXQ>yElGFKAK;Z%d2~L6hwsFKxl9XmLrGbavzW;T6JoU_nQ~(boz(AyeXGe-}8$)bj zkwr{r-ATOoQ-9$R6p=9S$4GaQLwvk&Bn??X#s8YGYwT8HFbcr)Uf9gcc5CHGN0IyR z3e-xaHQ~tAyHA-F*i{;1m)fw4;5ve4o-SYc!|m_OZTfrPyTd%w53pxaWOpRtF#XcL zn0$YzmGJLxFM*^o_Fh0jvgF|ij7g{7D2{wzRBK&~@!_Z>lZjqHTp|GRC_>Xcbb iI`h^F%sP|umwW;=kO-{Y%Yg>~0000A9PC>dQ%+Is8`^*X_;*) z-nM4YrBvv^apS#h&ZAPyoJZTUW7)7_mTD)AVIgQi56qxXl4vDjJr35bT-dH&e^nal z#de2XA9zj`%9%ySmqN;(Oq+2k{}lo9(1U|o9j<^ha!C`SbS$QMFU_AyP%a1d)rgK{ zBm3Hocv2j+g*LB?NuP2m)T&vkd@;q8K`j;lLL>w1$$RC)cF>_sxQRJQDhF6J3CNsE zypKcw1@&x3626Q&@ymY2n^L!rN;)0_z>q!Gv1i=5Z;WR!xs5=@p<1AKHqx$T%%WD{ zy>bBU0lJq{%BEkPaxc!RVqG^4#g|8zbUDGCR;7G6(yCj&l})jAE7PlB10(#wmPodT zKDv7{{wNsR0Mf9BK@v3orh!CmP960W1KX$o|LqU|@J-jXYr>v7=*oEj$pF8TLwr~! z@X-LoegXXC0RQbT{~Z4F#%Wx0{^q~{qXPh{e>$}Qu=2GAwU#j7qg)6~01x#LLG(ua z&4b_&1%N6GQ~*=6emwsk^$8A<|55$`63_q|=mnDi_`Z4m+k%u{BDVzq1Orf#Dqrpc z>DQQC00VvLykib*0|%!9THOxd!Z#@OEkRuWOJ@JbrEiA-0GK!tdjbHt zZU$&aEBMtOoB)@=ei@DvcEB@}i~x<ckM02sk%Sr>C@ zARj*ef{8Eyf&e>L|EY;_YQtNhjF4?|&}MY(OcFB9P$y3{JX#t$^SnPgFK);wrs}RV z#Y~~fDGuha07X2KJXZ`OdXGugsRCod0l?8Ab+X6sq z@zmYB1gB)tkf9+J8u?6Y$uux2@NsE?D9#Y~Uy0S--QC@N>_4yDb9cFSH+3JMch=>c ztYzr(ZzejjYj}8g*U0FI_jjYh2gHa332Y9B!%h&0MhuGW8ucD_Sd576=#aTeOm-`U zj;b}G(m1v#CM^1$^sa+MoKlV2S!a_ATej&gUAn~DrnlHjG^Jw&F<}vJ)nk$!GLyw7 z$0RB1S{^?7{PWh2E6fBq6Z1g8oOSulBA@irM3LM`(i6(_wOgu zQY5fZ65>pVef?F$PKeVu^%%4P>+Y}KeeuG*dlxQV@ZMjSmX?wtX|U-^I#Nf3zvkJ+ zBzKtVBJR(Z<-w{P$E{(KS!KmxN_TxP+*S6xKE;T)M=kEy7;cI~R8E=oyT zN8h??HAn!wD_T+{DR@DG>FuG^5s@$Xk?~_SP8+6jKG+F(uxo8fO3R-sZmjlt%e~%J z-?m5y8srTPa*N9`A^b(3OZc913vtfz89||2TVo0pR@kbDl*KA>;Vg6^9S6*n0e^N}^Ip`t<2fK8A(T z=L@})D@@?a!RGClwqP1$LF1jZDit;N`bNN43@V1HR1F7$!C+D_SaqO5UI(tB*Hgb+ zesO_Q4?evuYjFK+W8;or*J2nZJTcW^Say^u#Do}zECzm3QZVU9l8~lTJMtr++(6zQ z@b&3!Hu;t{jZoilcl-Q1R7?mw>b7lEst{uP61b464P`Zqe20 zZS%J8Xl!g;vwi-}%y~eg3gx&8AcFyL38chd=FgvhYaWfzpMgr- zyP*oQc*ErYnMNa#$Yq+;VR&F@WwETpL=;$w4$d;*LrBDo)JfoKJLK}!y&1p;@YSWn zCG<}(mKERyi%!R6ogjm=fr+bd9WKZuGO~9Ghsm;r*fB6L1qNWjZg)C8 z9*>2^Bt7;zfon`&E+bKzi}0C1&H5nA$|`d?;-g`p84r}0Or{c-Mx$|AJs`nkGJym} zoW~V{4F5N^-z)jx9z?O7S0F0@Xk-<|27|#YQzPK7Fj*`@W~m zP+U=AE;giddw1^w7**;jgQr9IodA{CM%2qb0)FkxIm-}=GL8$*|1Y;0TzGROw}0oq z$7r()DJ$dikTL{8G9XaR$bg%OD==p!q-IXQiZnUm!TEira4ReG^ZIv#G9wo6d5X^C_tx7yFI6G(Zl$>r6kNvRZ4j(0h4nzuoPN!4gDp-OoL>-tj zgWxB(8dZ*qhsMyJLkS%xDn2eGrqDAGARu@FMNv8hBv24hyQ}|)(^lOXc!}N#r9L_x zK~bnfAA*X-DBe&ko8E>~J>8F@%D9&U14Ry_0;Ln@0|ONU7llg&*iE7M+|#Qe)7?IC zk)OkT#gB`>NFgp#(CN5^=H|kNLM#R=Vg*3yzBYaO^lNUTLhKvQ&U?WRi|34Q^7)L$ zCZ*C>R0MqR0Ho4fsaU~Kh;ya&^@&Bs4);X2zep-oC?_TNf8OuTWsf&1jU8t5xN+tV ze^Ze{DwTqJU@*X3!Ke>?`l*p2Re(A?^iTU`0V2Nsh3EPE@BQrJ;)j=29zLj=_RyvwiTzz?w}@Kdt+z8> z9L-}rieX9R z0TmSW_iC@d{(9}Z7d5TaWYx#})%Z5|Z(r8V&dzF=`}b>Y zeL$V`)H4~;z<6lYK;x;V%Jw1;AwbOh{m)%40B5!LUTnr+S}eL^I)MIa?C$uRp^th} zRi)M=S zfRSz37M9~Nm@8pkoT0erhrpsAuGSxZ{|I>d?f0K~(kLRG3}n)9No2|bwrtC0lB|fk z(=)`>v0XI$7Lc3t%+pUl{mjY9*B-MmB_rK~Qm$MTJ>5ktumXf#S*H~Im~9ko11Q4H z_D)VtzSzC*NyY?acd$zj^d*s~=z@e1LJT1+Nli1$E<#LA;0=5D&HHo-A(zGu*R2PJ z%N2*1o-Vr*YJzcq7z+a13YY~1aAyE=b#u2el=&_Ba#D>%lghFnxEMEsXg)E-;Dx~p zxJs^|E5w=0|NfxMK@hvKsZbqETvx(af+s-2QWHVey_h(a$v+%+^Mha!kvLX7s)L8n z1k7YWpwu(PT_@qLXa0md2Z?}(7@H=zP|t%W1u#vKL{TM~0{NdaJk(cCDqylph$zN! zEQ*AX-3U${N#DfZyXLq)!IjGixKy1c)oP`ZBxP;_7XRB^yPlgI>?^nE8{~#^*P(F# bV*ckx>l-o!Mgk~}00000NkvXXu0mjfdSa74 diff --git a/public/img/emoji/articulated_lorry.png b/public/img/emoji/articulated_lorry.png deleted file mode 100644 index fb633fdf4210f7fd66489cf9f666a81c2688384d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2178 zcmYjRdpOgJ8y|Do#_Y>9tS#GIH^y8Rb8B|N#4zO2NXnE;hg_1BOHnd~66H|JNq(m& zO2QGjmK{PZ*E6AzB#A?uI(m9e&+qd*@B4n<&-*;@`@HWTZ>Brf5e`GcKp+sDC81a@kaVKvr6MlgNUl{u92Z{|_>m92Oq_Q^BghK{E0` z(;oy3{yyRde0+TVqabN%X@M&p1XTuL@wKi6itfb*{M>w7!8!I5fP$6lvUoQL%@NQ)HNa;l^l%#cXJd91+~@&I21UY zgyP!(yS8H@IWPwj($x&kASv=p5nNLhU)r`XXY~+!ByYP)u&t_>rGkqQz^9@2Gm$~I z_!u_;08|C`*jQJ%kGWQoH)anLM%Po{ZHw}xp?&N$H8r77s0!VXKp>3t)gX~bG#WiN z@W3cKUr9-cL?Uf2G1yc6QdFg{uaCuI0dpNiMMW5P%j9sqqK)3%^bp*XK%r3d_M}ka zik+OCX8vjl2?>Ex@$-|doBQhO>YAFGnx))+_T=W4T{I-y7z!wvB$kc7XliRHHH^sH z!lf$P5TRu3=f&B@>302n8U0ty~0A+&|F&-8|DwQ z*GKH6XzxzUh}+Aur)4A`x?7QJ9ens!PHgAnn?^e5N7cXPri6uf*wZ6Z5j=CWfTiJS zg$ZWXR_1H_#F`#2Uzi&w>1!=6yjhy*yj_-EcI70R?pt;7DAUsTx8ls={A5~A>%II$ z1rAx`09z%%NcW??^-dkO<04tw} zmJRXckohr4ibGb|)|^91{$}u?<0oO<7RKi3>9IVnCrA+@t$ zd(ruijkZRTWa{s&`#aBJzcn}p+-kr#>YvY(DLXX3z<58rZpdkFh!h~&PDq^cQkE|E z$^&*Kj!x35k8Kz1F=ctSsb5k$*MV)9d3p5H-+VL~n0F!^w64yT`49&sKv`ev7fwf& z`#MRZdX10cR`Nr0W%w0l^7su>S8Yx%ZCD=4H4V7YTj*-C`|v3K zmY~{a&1vn09i+D_xi)I~r12f`d7;pS%N1AEj=POde30*3={@#wJZq0}I!jw;FrAcz zF|!2aR>X_OhkfP>2#1%!vvs2rf~4%F`L94RHs;J2yebK~yF&9hV&gWiLNQtU%wkH% z&Ivhu^wW-oD!zC^;@q`9ja2=HSEI!1OoWSORu!+`ShSvc zKa{8?5Aiq^g*lsk6z9=GrFq0_79(^ z=ln{tHRRRS{0PL0iPSX1EVH)UW%$(6qFj{3xrsod`Q<*Yz8qn0CGDTpv4vooh&`y$ zE#Z48dJj}Mdd!|tqKOmKSFm`&U$x8ZTw_>3q+Hv46Xgk@^ zx2t1@VNQXoM{{AD0i%Rw%4c& zJ?4#rHP^MSPki_w{^L?WnV>0i-HW(a!ROZCJ6ojN*SB?ntCH0trLTS$^`;*GYB!QK zZv`$n($E)_Vooy@uZ|C`2(I)IH!g@`%@7|u6wb-#Wjrr({k^4NS?#YYGIP{;cfYUK zgczY1_>4NSG9ZpS(7fahh$PvkPt|%)lmgyfoY>J)$!@ zVxq%WoS;(L#y0oq^z&Q$=RL;z4G0HjF(X)pl)zaszCYX8$>|Ggpq z*$4l~1^?3u@{b1mybJ!r3jfUm|H}mb*K_~d2JnRj|Ji!~)(QXWwExxv^p_0&yB+O$ z1@x2%@reol&;$R)1@3_c|Ik|fzX|)Z3;*e?{lNhxE=0&1^?xp|H2OHa0LIx3jXQ~RV@HoGXnq91D|FA|G+AnVFBrD z0_$`H|HB~mpa}Jw4{}c$|M9n!Spj`X1VtkN|K+89Qx5&K8vn;b`KKKJ)>Hr0DQGwX zgk2W@#t{D07fUDsPA~y@L(G*jXf?~Yn2>Qt$FvEOV-ALA2gk_C^z`(WW)Gu$E&t3| z{mpOx!4trjJO9)({o<~hZxsIi{`#@)~j`Og6;69b{4p`V?aZ)vml0000nbW%=J06!!l z3mHxU2LlgBHO>?|9n;spD=>vPVh_srRFj|HxrrTj^`dTJS@*5NS21R7OQ?%I{Qv+6 zuSrBfRCodGk_C(!X&8o2*dV7+L1L@twsq%1W?+)pq%ujWQ(utx7~!+($~YQdhd^DwzjFVBz)L+Skaaj6r+m61dWl)BGfs@|*F2HR(FvnY zZC>)UI~7K&>=@#k(r8Wsnyp($xAH%up-eO7LomDQ$p)cv3EMxcX(+00 zwr*{`0pUWc#>5(yJZTp~ahw@L42Kum3M@cMYFq1Zp4PV16gDkrTR3b$Fms$(_;^2t z#vF#b9Tp1}B#1($pyBW1UxhjTcS8YFNDx8FV(GYRaA0%{Z{Yj#SR5g5GcJnhxYK^E z=0Z))Zzi7KY9P4Qey4+>T+D3}!DHoN1K$@c(dy3I+FTv&_o`2BTk9WkVed`5Q!gLfKrAd=l>iunKsYO zZGHyuuE{j`=XnH|DaFEv7O>7}@UB>~a>a9j5wF3x?!hGp#S+yqg!JrO`GO31NaUDG zA{O!skkgpa@clqSLPFUvGg+3vk=)PzGXPnCawsXAWQMuydxH_9<@^%Ff+#I=-ecRj zbEkhe#l=kecLEhIS3mcUzu)Dm;QpCpTq(nBX7ij!v{8bvKq!((aR=#1PXsP8l+`^` zo0wQ(4Ho=b%SN@o76dI7@OQ>-rI<@>laA>0ZD;olH>f8R!!S z|MGv$;s5I(VXa7g>f4I(=FNAMb7J7pEq207G-C*KxP9VI7&K>eIyZu&hYJz zafbl}A(G0kIE#v$eK|?-JV`lSY<8ubHy$-O@Q>dX2{}Q8RBZ%7*iha_rJe3`2Hjxb z`|hB#?{pf~2ZmJ~aEfYaL`WcrkYTKVBfh-LN}RhodzzrY!1pQQ^z7AhgteW zC|x}J`>Ep0%;HnI`Q4@8W&;1wQ5M0CTX7g~$U)OG1ukVK+mbc%WRx+EG*4bhV>oru z(P#ovvmCxIlv`u*7`~JluFJf8D)YU#pPrWC7f$s3-XC6k;GGX@m4lz#zx%FqhE@dqcXKQy3tMgf&5c zGdM2M8w}&a-~w_WU;>tiA|8T4)kAw9ZE^&yp2zMFjjB1M8Ih#Z$v_~$aa=eoB#xC1 zJy-ih*bxqMTmU4~X<{277!BS3nCHs>!b*Q64*~RInhKB(Cxq(A*@e@mPySo`2L@Y_ zgdi;fCATRb@vm%yfUaRh*8rx-5JC`7Is)XM`}6+~m(G27=4?$!Bw)BEV5Cib16?by z1WHT8y%>VTU`kHh&L;{V{Q2L9OCNn?8-C$08z3MA6-XGty$y5(ptY&P9T`;>TYyGs ze1}k-KYi-lN8fz2bnetbiQloqF`x*-lAM~4xI3Dh4$wo}%2m)=iKe@1Q z;>5zj$=TxMI4BRV{(@{W&=V}2cp}r1NkQfNGV6X7>(@*oo<0H>c^;4!cma2uP1rQ8shRibd z1nTNh!1X2EyB>=mS>%!C`9ksMt*=a8W~%@D0{=AVg&<3?g7x>_Pyn4m=Rj2FJ(Oce;?r0B=WYTfNtHk9#0A3I)m94vMDX_8~qR8gSp^^48;J;Pzmd z4IS;SRo$sjURU8DY!_(ps<6RzK?6uPV%;?jPgd-OO&^M|49CLo1 zYh=!tO{@1e zlDesli}4;!yf>GrwwrqYJ1(elED$^)fjLE|U+ll65Og8L4}E_DXD#5#T@wiX00000 LNkvXXu0mjfXdM60 diff --git a/public/img/emoji/atm.png b/public/img/emoji/atm.png deleted file mode 100644 index 38674a31e06b6335891c8208299c77af04ecb31f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2337 zcmV++3EuXJP)H){?(b_pd-3ovF4L4yrDb__Xi3_5iULXid`Kny#G z4@jdBOP~uvj}Atd4@;d8OPUQoiwZr34L^z!Qlt(*% z`WbS&JXV1gV5xS$`W0)z<@5b(x%mJAE+&rQ%jWzDBvJ<^RRkhWK39PTCRaLFh6W^2 z00ub#2RsHGK?WX0I#hqk$HfLEQ~(-E01Q9?7DoUbQV1tl8HVBj8%;M-d?P?@7dB-8 z6G#9PMF0Xb10qu*J!=LfSq2+E2OvwixyKhQToYHEHBfpiI%6$IbS+AD3@Tm`Fk%^Y z)D~vG87Wt(v%{mVzdKli9y@9(MR5fhI|m;~5l@pBYO)q(trRn3Cqr*;yZIP#%Ncyt zUS))RjHdtAXYR)Z7eupk(;s^cF6Mc_EoI$O=5==TeJ7}_JzdvrPTRnxA{q??-hF5 zZ-AZE+T#^txD|oh-tYZxZhyeX)s2;{n5Db3vaIdu>fYPmSi0000AGGI<{n^Ld%XtnYQIB{mQ z@*$D!YQ6n7U5{Y0@zc%9*6jRMTzwN)sfow>9xq;bfSgNDa66pp6<)9a03Uq5@~_zU z%;x$djNmvqRy8F((3@V&jpxZ4N+0000mbW%=J0L{+` z$;~K2Ri?+&Hj?uQlzB4Glvrpn9=diu`$Ts0SPwSy$T$V8X9_1=`*F@qkK`P%RA z-{+ibSBt?Yk={B>Dlr-k&h=8$mkvyx1v_6%QvKdsEO`e>s@VlUvnTxo-6loCcM|dT zUZLxdUGVwa_aD8~NxdK6zkLQ>vZGUM-Pb}2Ff~3e^tjwfTu;dJH3m>nyZM9W&%Tl3 z+4m75eFhPE&+@6ppMqw+SC=umA#jO05soCzh=hrHf)g4vR#q?f4^$*z-mrBdav`G5 zzF`2Vdaww{$`oDYEUxgyTo$fMQ)SsA@CX8iO_)On%n6nO@Zln$BtfxeaUrqPihxuu z0@pEmQgxb@-f5Dn(zzI+k5^Z3cr=eFOJ(zTM~NC3w14Vh8c}TW*WAw17k2~ zOqQ9MF~?3ntfP6o;}J(bHrxTsN&%Xb3iCW4H6$sJ=G!T$T$G*R zltdqiu<6eA0C8!G7Dyl6H8S$;rC=a<_S=zWyZ$n&yV&{62(U-kevzMwcLFYBY6mTu z2J3NRDpW$dGsYgUuBEFxQbrxDK+ePbOE}U4klCnQ^1o| zU{5+3pP5Ni0i4ukWrDl=iu~Frn$)fG&zNp$Ya=9syVU`Ptc7^R?qTTN0>T z$GAVQox-(DFYw_IC+fPMP<{cBdjhP4gS44*3=o^^&c9gJLWw%=?ll3C8~U&lphb@Y zt8dsJ`O^%2%`kzB@p#-^XOGkC4sq&jg zz;g5=X#gH?V|}jy|E;e8%Fhh&du^S7K#0gc2X3vuefto=7h#>K7C?x#7I*%G)kC*% zinjov7l=idftO25OS=F(+}RKCCsF?!`20|%4;ZxxUK0KS?Vj=?QKzjx!Rw`q0e65A z;4I$+Mmqt4L?5Evt*F)l1i=ELN5I-09S9I|=qZ3Jr4uLio&xZj(g55o!0oC7_)~Td z0LD1MAAJd2^XycVLp1=u^F+OD0xm&_u(jw>n0!*P0GS)>0=&wv03IpZ=;N0Fyf_rI zfSoNs@jM1_XAn@>!g+TdWq*Ok<#NdaXs=`wdd;qwtEMP7033<9ne&s(Z7DQ?_X}8RviBFz4lkx#o0C(=lZ`= zx;Sni2B0vk8H1E%2$<~_l2bTY>7YqHDnU@dlFHbv#V#mhX6w7Z|Mb>Zwpo@`?}n-* zWA-A@E9ld+u_s#e7J)9yaP?%U!Wru>0v#dAy)hz1XAy8_s>Y^!T&tP02q3%2Nb+DL zAz5LgMZgV(qS`E=sS=^P2sDB*leNal#jvg=8wU-r5XIMpq(tKjX+mXj9YEc0&7+TVdx81mS1O;B@=!KVPt^~jo(7h zAB_Cr)fq#7H0TGv`v%xzA!r0yV3%i*Kpr@x;i8MU4Y2kDv@{khUIGAk00000NkvXX Hu0mjfAnGV& diff --git a/public/img/emoji/b.png b/public/img/emoji/b.png deleted file mode 100644 index 6029b7e91825bbc2c8768c206f57eb848b7f04e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2426 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 diff --git a/public/img/emoji/baby_bottle.png b/public/img/emoji/baby_bottle.png deleted file mode 100644 index bf83af1fbee534e617bd28086620a55c4d1d8778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2353 zcmbtW`9IT-AD=cy5|yJwl8=sWkvn~KP#;$cMbarU_hy!Bj%`#-m?J)}rqhu#6VgFU zQObRXna~(Bo7wf=@m)WB|AO!H@j9QsJYTQJGHC@eQaz$d2?V+w@#2xTX(!Hfbh%Zyb(B%-b?gTY{dP^hq3@k=M^Ce#lZiE{OZx?Q>2 z)6)e=Bu=;d;E^aZN4JoegfHY@`<(r2I=(ex6r0|EOfM(epLedhD;JWK1;-{+8O-gj zi0g>hw*C=gWHxPiaf8Q+$DoS{MN*0I_ylNB&;V1={k?0NGC4flpPZW3+xzvy9J9CQ zD_1NjY3sh`8!$aL)4eA8F+M5~iNJ(A+d7uQWi9VS zYx$?ueEbyiwA3gJf9|F~gSpl?vvTn85vZSk04(%gT`UcvDe=}P+8+`u=#A-DwRX}YiV(Aoy%eic->U`eC4j2 zZ-!Tyv|p>V3EE=!{9^a)9G}l#Bx=K+*G6vW-%Xs%YjrN|T4b&Aza8Rr9bmWU zUd27WQA)Z|+dEsLem1Kv6>Y<6-V@eN@hl|z)b$4DRl@5?f&V@keWnrnefexcep&dI zB(z-w>Y`&>`9q9-$1L@7XzXEJjT!;AOM2Nrgqw>y$goXQ0W2>gtF*nML3y7jwKYBI zUIgPw`S&cA!KqAsi_>op#}G6iQWr1h`uDq&ezd)-EwJa%8hCI`GoZYX?O{#z9cvD# zBL3DMDvN2HsYw*-4K#o6-`Pzwjr_^&I#qp~`}H=BD43jkc`r|7zg#o%IWvQ^($?4V zK}cheDA${(YUUX1_kut{A398o5UvSdRNNY3b&c*v(!`|Ir3y-g^9L%uj9HLheEW6Z zRP0KKsIq1Br{w>F_><*g0|*3JIA?q2GD>E601OKW(FUy*(uaFFS9+S@lT9s@3C7PR z`gpNe&_efJyN$2&;-Rn*A zRZF=Jc6R#-MulhAk!GIlm3*4Y2-DL+PEO9rt36EVv^>Vk!2%l+LZ22WDILg})zH|r zn0C0w#;9JPk#9Ibm|fG{5@7|GiDnX<%s$?YD>|?LP+!X|P_EeirHS|ch4+=!Ey0hz z>0KI!Y(~hn*pv?-RXnaIHr;Ap7%uPBzP~48Z|fe_6Z-0k5ZDf% z6PxZQCOZTjS&Ag!w#JcN@viD=NifpkOZp2kIkp|Dxz%l2nyTvp!_NY9ntf?Oqtj>a z6kea1c1FF7-t<;q2>?J{uHLz`gm?Ow;;f%FKGb+HZ zm1t9P(U^zda9wa3QQ>_Gf2N~zF{dpfRaa8)bTaMUKH`5!J(=0>Q%|8zV3i??Nd>wF z66YqX<=YxvYIlt15zy7f!|;WV@(_x$!uhIHX#YgKr2Y7T{PSg5$)ncB zKZdO)8e|}w{>B6Ocy!BXP5=EH9CUxvSY6XG*+g@5a{|FFb!ZA*dx&$3_**Bz0Tx#d zem$FO`tOGI)d9K4_S%HLL|7(v^05x{ld@=~8ih@es1y|!7e8LUjXOIsJXKKvUfqMW ztkQKSS_;>%MFn}085tQFX)}{YwrDsM=_;AodddT>ZzjT{{|7r2T=>q2E~A_uUJov4 z+`%*Yj>kPdl=s9P_OxW+BtqT888=ut^6X4L^~cgX6lWcbjx`Z^sc$iAOzl+f*k(6m zZh>EO(%{60J1rm8_teD6`$GRnXz*l> zQRi#%Wm^Na)Gw5=Xsf$7!-yg+|UW}VOwjyP0rkY<{c^4SKo+fm>2 zbO@GSe&HW<_E8nwHutjDnHdlknueiY1F8y5;YT){_Y{D(@??Z+L-Iq^TjS4m^_#WU z7JaU-$COKE-)xI&#P6rgEq?%rC|2sBQ#g5wf#RnR{@AFCiCL ztM)y?=c{FRA1{)#)>iftp0*gb*76x9U6F&)mWxv5Sgn)fnLq%4|D|4huBY=;qYI+g z52x26+I4;vTFi@F3`2Ba1OxJ;!z3k@LsE*>~^cgCC=yAIpld`1%@hd0jKBLtA_KCgZ z*6>qZ9-f{jv@=*N(^OU6n#;*u#3)u?IlL>KfJFgSKB@-@T3?YVv)jPkW@lVHD-sf^ z2ehY}W7dDujc|#Z6+nd#Ztf+!8KS;dz1zq<=t}-OhSJs;G8X=>J1j^Np+=VDuX*8ARn0q}wjTL1t6 diff --git a/public/img/emoji/baby_chick.png b/public/img/emoji/baby_chick.png deleted file mode 100644 index 324e7ace17767724696c0b7a9503d40d4430e60a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2459 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 diff --git a/public/img/emoji/back.png b/public/img/emoji/back.png deleted file mode 100644 index 3f9d3a4720f65da66fb0d03854ba4f84138f212c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2449 zcmXAq2{;sL7stn#G-0yu`##1t4A~iD5*hPJs9TB~mm)3+B|@Z$XS;(YUsT zY*{jrEz59Ic1D&MOZVJw-shQj-Z}62|IhE7*YmjLOg)6*mF7ht5Euu0vI~3@|NEf1 zVb7t(%_9)p2xp4x!9&3mWo2bCF)>X|O$-L3sHn)p!=t36^j|WOsG_1GBO?O|l9G~e z1!p*j|9@#~YwPLh!BI*|N?l#u)YKFr#>U37va)zQ9wHEjWZ329<-tcwOG{2p4hq3f z2?+^Eg9UOpb4g4idl+&R_-1-~fx`23G*U86ZS}1f1ajy#O;LLuuGS z3x;40nZN+fAOt)e9UU_>GsuUZ@JuiqV1xO<1Ho=&WCS~jM1r~y0YZI!eQ<^zAp&!N z1E>Io(<}@}NJt2(00xH{{DGW<1e`b=4r&2|h=>Rliv>AcffWeh3=xpS7-3c*hXoQ? z&;m%H9k2p(TU%Rmb8{FGkOP&IlM|3QIy%B6;W>aG8~_032DGq)Gqena00vry-T?zD zf)ymd6M#SPLpgX64hfWlIDkP#m>#qY7{CnqKnTMG6X+TkAPyaY3go~KkYEn{Q0v|S zBTe{QpT6iqJ&M@tEr`VLQ{WoM;rH({7+q*VIu5lgb8P-ZH=TcHaqTR2zDsgeiKg{~ zz0626R5Mi;w(7`Wt5Syo=YHMTHW->LZKpW<9(h(~XR$K2`E32;*0s!wyBk!UkEFhh z)h+s0x>Km3Jo}gV>MTZ-n^oKNaPCk@67T(u(^Cb`1#62HZG9s8D`WA4lR@@PAL(>< zMFwr@Q&qAX-d@74W|vY-bEX3 z=SGCbk_N}tJ8-ETX9I#hB_hjK?`Ra;*~+p4nCBV(_z!jG;9ZJWS30@YbgPH=61~GMe7n8Z% z`BK?Anb>15zfN+owygUc#1L;|KL=eFao#XzruU&-)d^d1cOPp-;jG2ux$k@*j;Upm z=(!V4%d{Wen;M~^et}!;^>$^G5}CX2PL#g(eO2>KH!Bm?jOe$f&dy6Z1VTb)sIKvE z-`u5V-miqKt7cZ~^=`fRsn)d=y>iQMz~PnJ{^ohscUi#hj)Z)P1>-6m z*)0&U@}~Uqbb4V+VPUsbv}21y_YEV&;M=vN=TjStPH}zhOc`3ma^7Bnk?!5Kt)-Z5 z>xSVTrrS<^WOmL1LF;tDBnIPLAHsUY^y__a5_yQw^D{Dfh!|vix3!eM-Zh+XbKx)UoyS?#w){LPXvxm&lwzu zO>_JHrfi_v=(eTSSET2i>Y1rwRc+qmX!NoXSNf=d(EaQ|{uDnGO8D$Wku-#ld-nS) zZxARCiRPh~$v(*5r*8My^%P|FFxIY>o1{ap?N0a(`y@?o4lJS@Oj;r<#zH(}Qz3 zG3TXo#m}a)1W!EYDJfnch0`=sCGC7ZS4jJt(7nEOz$HP1`)zf2#WYv``?d1AyING0jORV`GOCDEsF7xd!l&tk=G#eKGJ*dq{ zvsx~pNd3xR+#>e&?PD)01<+UumJjpnQ}CBUUeu^C>4Io^6!&OE(!RWtRS7-^!$f)o zct0nmq}PgQ`^xHsMYnr0em+5E>QuxuJsr13?ZaI3OnFI0{Q25JlaHO{^3yg+RE}Tg zv`0}_KIxI~?`ZyF@6zhk#_OK7MYT%)XR~Yg<$}n^(en>u6~qr3Ur!u}Xyq$yz^}if zp!0v(yxb5REt6vWq2h7nN@8%SRe^BNC;6vjVvZ3%E)QSTHY9oRZ-;hvr!l=A_z*!BYk!luK> zqx%)E&Aq*bPhh@wb9&lEdbE>%eFB5T8+^wpv8p&M2lYA5U|vu{ zNoZQ{P88vp?Z#mTi{>FaF|B@qS+ngZWcbGR-+KT1lox8sODz|Q&D%lGDuj&+S1698 zTAff)^w90@{Oy$7L>ZG$@Oi(w`56ASMOpmlq^#wd3m@gE1Z|R564U1AR9RstQDp&mn$o<$O zE61hqiWyUD)zunZVea)ugF7R0WZhXYCD=sEN=@e%#RG@CG`_Y=m#=xe&&I6}UiEKp k{u~znKr>Es>+K@<<_vo9LfnKu{9i#h9Hf#i_@% diff --git a/public/img/emoji/baggage_claim.png b/public/img/emoji/baggage_claim.png deleted file mode 100644 index 9b3da43d0bffb764d222993f53cbad881038644a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2324 zcmV+v3G4QWP)OOhX4#O0~?D37-Ikc00kJD1Q>q;6>R_vMh7-?1Q>J#FM0 zENTTWbObVF1~Y*L7?}kbnE(I(2s+&fINVd6>;^vF20+~gJl#l^>;^sEN|@|Wn(R)Q z>pqX`JB{n$;O!G*z+j~AwbSqiNZ-HO_y7iU z2TI@yRN*CF<2a1#1v=d9?ff>0=?Ylk2ua`{cIYK}=qZ2bGKT32R^bX+;R;;h2S?r! zXyh(}=^=RN5M|?1o9!rk=p1q8Fofv}Skdh6{0d#t1UK9WO1uX~-r(T!1TnV=O3(*J zyA^5W0SnXn`~Mzv<^?vm2~gVzO4$cR&jmWU2~f}&ZsrPG-3T|?30A%mO5h$-;Rg|* z1P-sn-1!I+rr_Z820+aRMA!yBxe8U>20_>lV&eup%?Cod3RBS`cj5;*)dwxcK#}VQ zCBg?T%?ee+2~f2MNUjG-re&t@-0Azv;P_ac?Iu~`0~XZ)CfNy1+eVb^w$%6M&@BE9s@pZ53aIWv-?)(T&v52(sP)piV zPRF>o=cB^#A7JDOQs4(f-z{Y1M0n@|GutVA=m$U75og~SaN#I`*DSX;1e%M{1?Z4Xf>+ATn)br2J@fvQ<0Suoabk5b|`d63RfwSfS1BuPf_77dX z)ZqHB$Mpa#+3fQE>g@Wa&-dZr_FawZmbvmdapqHn>R*oQ82Lr60000xbW%=J0MgRZ z*S7m69z4II4t9(L7jkqQtIH|-! z;@H@p_}$F_00oFiL_t(|0o>6uaC>na0Pw%f_x5S!8PU$SH(_2IQ63*a zaXcZvKLC{k_svIv`Q`%52ae49K?w@vwn@dqzCE*+Cu|x|Yu@w0cxpBPX$K01qb5-c zOwn)<+972F&=8+H!Q%;9z~d#{K7^JH0BkS2uwGtEdNJ4XHjoYQ!L#ZT_VkwMnG)+2 zsw{_W}!;crF19w)G zy*crMA4xm%Q34PWA05%83}NEUvWh#?flI?L`jND6z|RL?#~l0_e4|Mj!tkYZU|U7m z<_oV8q_=rp6nRZefC+bd6eLtFDT+G(w&ZRvY?f7Q^90^4a1b@Sd6wg5KWheHwuvwc zK=WtKC%M^XTN8=+u0JqPAYmeL`{=Q0HvCCd8vxT)gkJz?t7?Pmv7>f8;+O>k-heew zP=a||LBE|A&j;6lR`_cwZ#!nefRzr!tbvjUMo_OpmDfL@1n_!Q6&$l2wn2V&O6 zh=>u41X6iw0Idl_aLmX>EA{{h+!(Vi6rU?b2pUq8$x=$dSv3K9P`_ZsZcGPi&0+ze z)CwWfv=AgjS6Pe>ZxKwp2Y+Ec^xe9~M-YMk~jkagKi zLb0Ytt?lpg1yt3jF-=oNs-{r_WL2S5W2lNZu(hv$T~!rDSvKMdQVoL^FmOPL8_Q5t z)%E_qt!`j-?>gM%LXP83A+?7d=t1kLAjiov)Ytc}dIDXA5LxD)%0p^+g%(%|qc!iT zpe!T1%M<9t0U6>1^73eb@;oQNK@SHyy#ch!9QgzRdLTdoj_V6Vcb?=BK_~E7fELJm zgnWe{Qcv!T`U61(2|V%$Ef8=67;oVEJ*mJm{}6c02|SYu?77|(c*=nU7+L_WC_q$y zVEicpi&d5qAS>gV4g;_-@;v~5j{F3`8GJaxUK6-wt+$&YunS+z zvkku;_=9QuzU6o3^yFNKIn#1{k@@wz!!!8MHM@J)ZXtpD*EY^GE)9(h3^Ua@!?5UX zrg4fzcVx$Rg!3C~_mjZgH*X9+^1m6}xcP1pxb3gX=i<157zzXM3rai7%zHI^d<-*a zQiJ9%e9J$M!j;)e(aQXT@t zg8-hXk>7E8D6@Y^dFMweys)z3p~RsC+BQXI!7DQl3&shdg4={}R)o0;Z?K)E-HO*W z5m48B)uow@;hk#b%4{!Y>_z}%@$O8?EfqdpK=yPpPDh*n8l~gO)J8A+Z&Zws9VtR0 u8zHR17lvseVU}sYcZL}Zv4COlas3{=YGXOUg~k;C0000V`hK#oWXmE4!pwePo+yN{B4k8JFaDY$%6982J3xI4u?FT4Ev;ao|A^?H` zJl4gCJ_sNLz#o7G5WSv7WP1Pt*PMX8j{gE;ic zKuXx__rgsT^kaObVtNUu-8-TbPW!CXa6DpHvP{B;H=M_4PXW6 z3;+U%rUM)Um^E@nWP&Zb1X^Ui0iAEOTcGR6BhUmo6oDSC0wv8QPzpgzVB*ZvA@lSo zGa9xt+C;7{Ss25a(sP(K*v;1_&%1@pIe5PfO?|3mIjiq9?-|Wkv6+j?m@#lX4QK(u zNuX*s#|r0Z*iWllRf$NC>k_+^x6K|(DFKX-Eg^qcoTDx|aL7(oKN{d{YWS!M{| z(VOq$KV!0cQr&V=$9_u7c2vVk;1}B^OK4Zz)~aAw4jU%*9ER{VIUw?26QNJT;>8x5 zU&S|bnL%%&Gn?@{xn7aYIJ_`0nZI-IY{1dqa9V?^X8%_*omSc*jLRNZGUXakr!5&= zJNFr~XANp&gPdNYhS>o1z_3SfyD|Bhv+oQ$b~-d=%qOZ}eaAI1`Ew%JD?expclmHt zE#GW+<&iyaVN@oxtQ&Cn5w-2D(t6Y8&O_U%qsG)xBJ+`=@uVxeV~5jSMg2CsH8=A3 z#QxAUfM0ML69MtLDBLiCbQ`DfT+RHUq7lzCtlNa#Z@&Ba4rku}FfPrj*M>3X=vA*| z$PYWV1ucGEZfmia!c0mta{s~aFq7d9G7@`c3v0zha32Y)nY^Yf6)&@>yJvJ?jVu@> zTsqdRZ)LPn+S1YRQ}yMg0poXr3O?4vPv?TK7nRyAf2A)iQvNReBRA+aLuZtjtgSI| z|8~dbx|fl1RjWT&clSKfuk2bo^wQRHPYIwrtJDSPNuedPG+u*#n!m}FZ-HTxt)Q5UAdRXQE43{T5>i@j-i&BTyL98F!QU8G z?$vKk4}V-NX)3o(|9bS>(P6^M*^<2Q*x$^ z#d5&1c9eC7*Yxdt5N$82li0|f=Y4ujx%N~^ULJk&l$lCRZqKly%?9;s*<;rmpN(B8 zQY+Cb&enFS$&KxyN1iUZmf!x`Z@Fnc;E75{BbwA*M?76 zx{t$Yw97~At1n-s-CK|_ivPe7BRXJxFWpeM=-!zs8L646@c2fT`^5y4XM4z4^*)yV z(r=qEStPB1JCVhWD(ZPD~|HUlf%+vN$1v$4=$8Kji%!GE$pQUXeK9 zio*q9%6#)}NG65Koi|@3tA0{)L5J-tWDNw*ama=W&KNd_+;YZ9994_)8;LY0X`++x zc}kX~a|ekxlEironSNiV;&@A!tz}Ml=E+Tx=br?|S(4oJtx@qNY2M6|UQCk0dD%>o zmTZQW-My&yR<-kAYRJXs2Sk$YcpA!J-zA!Iy6=__gNzf^9fN+#E} zUii`HiMTvgwDNy#q!{VOJpUwaQ;)Wy8Jd|+s$MwF+SR2&jwQ&aYaQD7B@46BJ818` zyGelCJIR)9#C!#R)UHyOjoX7_#8>2{2(7*S7z|VN<=C{PN3**^gXjhK9Q}=wC&rTVG*8wy zv}xA1buEN!exc&)yQu~p9>^i=>mop2(X5bSi^#i_Fga2dLr# A7ytkO diff --git a/public/img/emoji/ballot_box_with_check.png b/public/img/emoji/ballot_box_with_check.png deleted file mode 100644 index f07a466c77847298d320668d6d2911377cc51139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1829 zcmV+=2io|FP)V*8X@{OLAwdNK!Gb`Gs6iWy!5HL5O;l)6@+&nVDF~<(p@P~< zAQlt|axg&=E(j0_#$zZ@DC#fqLeo%`L!r=irtO?(AJ${i%+1Qqat@uw3w`fD;PYOe z_5D82N_L3;vn2l81&VT6wXFSPacy$4CA!Rw@i<^ld@lU<#XWM!nSpax7dD2q7MmC1 zs2%YqJD-}Nz^cXVTf%xp^UagB>t5MCt-zXd!UIloT!`<+ukCy~e+aSq6en!BW`HPPRUF13qLx!#Nv@;BdvN#VY z0?DaCn5Xz5r@0Fw8WKnJ_@#}0qgMey;FOF&SZtmIM)bK410qtX0gK$_yMC@q8Gycw zfU0>Q7*p^geFmjcK;oco-?q&CnhF4wtU#ELS5PG^;qZkb}NEF$O<@i zfu;1n)LN-ki2*)fC9rhVlIc!2xmZHVBddLa{5Xcjld;BW588$46 z*)}cph^=~+guDilV-y&+!X0W3NkIgVTIM<5(5XjBB7h)~ZNRZGu40=7_G*gRW-Ru) zuL}B96rr^N@+G2iR0R3d)NOI9H`PU1x{SNrVJoKM1FbUvB&{K$BUUST-hy0()ToU< z=?yhaSt=^N>{TbKDoaH21%l8zSk818zTnjyh16k}Sm$k%8nTr2xz-Dot12sGN3(Se z2`yWFwjUZ5Y_-7w-Ly93Je#~@NL>N|5{upGG5xxEcDxD zvkr??6}1v1ISow3U+6|hj>adV345LHn{F|wA|jZ;^_JUfQkGP&cU&XtS5<=P8z7N@ zrcrBMXV8GUC`FX|ht;ljyMi{NbEPDW?X3b(s|t_hWtWwf%V=p zqAmb{qF&$kycIgNOGG*34`G{KZn0U@ge*0O1(!MKHJc1Lq9$Y_f<8a~12kxKFoqC}g;{;0zy2Q*p~4yY&^ zYmuYZ-)x&&y@CMDyn!HqM7sr|XLP&5dz!M;)wDvlK{sn!szb?iB>5*{kO*jcOpi;w z+j7CSLc3^-LssZi7EDJVZwLuWs`^Af)#XC_rSgHY4!3&Mi54hHfZ4r*AdvtF+OSCK zZk^7uKYyM@MGM{UWh?Y(M=(99!gSYhn*{H=-DW2l6m!d5=m}5hw_s}ZWo_Ru z!ahH+*%C)`;(P7#h+cgvN(iQ5=AY$3JJ@Th&8mhavZNMz&E2Y&s44?<6Cg-rA*x`x zy|%eQ)u=3;hHaNxs#BXpgt@(f7$LNJPARy)Nc3Kps6MxDyq2GKb@#sWmfSJ#fgkSV<62Ppn@u*KYQ3^4r?H>&|`L4u17_2 z*72$4{)|BL?+vMfRtQQuMNK<&y3`@jLVxhAehXEV%$BIG`S*-K`f^<}_Y?~fU5K95 z=_0AWdQ`7I9m*h>IjM$*^p)%@*jan8)?Zf4o#e7^q@K|0BoC?R*QIQ>1Pyhy!P*WW zM8F02bY9t|lCOZ8A^W7NhAr2vU6^%z)3{;7Kilz@OanCUp1izRE+|O;Z40SElTOgB zDu}a;Pt}YWZ`8JvZ2%wH-oCLT|62}0YQmVPqFr$g@e@Xk7=Pe}^<*1Bdeg+(@PUA~ zsUBJb3M$G{#aV5B5TsM`V`{Ivfz}4F=A7cM%L}Ti+7%_O6(bQrkj^+hN;QtgkDDBs z{PfE^as*g&QQ^_jf{Hd3B?XCsXzm0}QA6Ft(O-R}{>7b7lPkdLbCU;4r<9bHl&5+K z=0==)_PUyyhWZ}sp5H;f062e1*c`4Xv=tN;BocEcm1=5eYSiO{li&H%KBg6b)vJ;# z!^O$6%=6E=gZOUxOuYBST`-+Mwu$r7v%&`~2^Di=!hXBczoa`~dQT4j`}h1`sxMnw TDJv=S00000NkvXXu0mjfZi93t diff --git a/public/img/emoji/bamboo.png b/public/img/emoji/bamboo.png deleted file mode 100644 index c5e75e43214a6d34f4ea996275e49ab314e3b907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2482 zcmbW2hdUdJ0>xw2rnE+D#3)H?hlCU{VvD_MZ(>FTv58$P+AC;7jce6btG2pA&8pc{ z>(Zh$sx_X`;`RLt?|k1mzklGI?_`>r>a(-lVgUdE?1lzN%RkiopPA_XWJy;N6#$?E zn44JZ>SIh?F#5~_T=Ej^EP~vAeqPezH*bK2C4{*Y7u_h%zgPvMSx-G&3_c zP~-FU@z6m@I;iuRo1^4aK+zet9O8WCrNo{0<CuYi?8SM&*vH)qy=~`=u!$1$+^{(CI@Uv7f z3O2V#-r0WN=!}A>N#FDk*bhIjH9Blii+=T7{TqIzP}q@RJ0U_ z0<}1Mt5e>+E^t8W?|+^&tiZI8{M3m)A~wn(Csx}stbv!YRG==W90UG&2!a%#=)!N4 zD7(JUP({S9&sJ3w#ty%#OpkWyZ6=ZuEQnd*&1HB(l2Z?d7?CBX@{0O2jfixiZU3&s>c9vAsRR zdYN1*8)jme>1tW%drDoHtihfiY(zwRt}aXmMx)1H#&tV)(WvY|wc-@l#nHO;`ECK2 zq*Z`}x(@H`U{37g(8->(;3T_;PH@6=Oq7@QgS@+D(I7&zr?&sym@1R3hM1=DaG0HX zO+PlcF{`h;NyAdEHpP+{tnqE_wVaAnWPOCA16V)L%{Rb{P>|=CDVy}z)2kw;lLULhgeHfE5Pre zs^w+xK~{ccobBa0<*Fs_nc(UfMBfoVDJ`zVBPL zla!vi)vNzUm#!CDNC1Fg-w>%~jidRSNSE#DC`exJ4Epe?|5f-CIBNcj?1U0JeX|TI zynzjDBzOAaTh#;Z;mAR**|3vO7aqS8&Sq4v_9u%^t|*wJujHt;a@Mw)8NQg7*${%o zS?n(BlrV8`dW(nYci@?1cH$lQ?w(^;u$6bO0`1c0IGRMxL1A$>h08I(zxuyDvJwv0uOa16glz6nr*^{12qE%7`x`OTY)>m>mSw7jvqP#f!_+PW-x zHn}x=I%~9c5>PBBN4RC@h0_4;J-b8H@%)N^6xnv+e(W2wDxWncfCH|sZu4-2ql_W& zDDvOeC?n6JP>+UxP0t)FWad~}$rAMBodG8GIf#&J1j2p5in zPgeD~1vFVzs@c;(uMEaIzCaFXCMu%p|3iJBqk&`;D73MH)EhZq_0q<^5z?bupHw`J`PB-kY<1lOdz}t)gzta9xc<$}^_}dQ) zVj4aEjx3bPo;vSM)j*4)0HCy?k2$@oZm$3sfU#yDA4wZ%QSHOy?>?R3in(teG{!|Y z9vrsb8_5k##qA5{+XnNe)bH^g_$SjyRL9J*E1%*fp4u&zu zGvM+W8DAqCV%sdFbIrCz6H+;$AC@C!nSV99h|LW$940qwONtH9#hf2ueZsc*BDkN` zG^{6@K&V50daF6w) zMQX#{5 z(y>zXkl?a$IhDCY43T;8;9bMgn-pTm{ehLtf6$poEdSi;Bgo;Ez@&d*>H_;w3K6bM zzlpl|Nqzqu0(mU7d=m1s*Zw#>_jfs^s;E%gMsj`k^0;C*|?Fs&p!m`F)1m8SZN8uY{*-)o4yA!rVNE}=vd?T zPa9DEnw2kUGgqQDvn5S$w`Zx7QHk#pnHtsTu(%a86X4Xmt2ndgF2PmtZS`2M zgd0VT7;p`pL9qN7MRk-2GZQmDJSe0jANq*f=Ak!Vsv^&Cd9MdUM`aZ87qBb$un1p9v+ zwXyQ2je7Dj>*mAG_P)hGAG$^(cXYPgwUZ1=`v<=C4#2%4$p8c-l{wb~#UyweoRMGY zK!hM*hrEuYBLF$!lCf7vKWx-BXX9_|i2W$iODJFhc|opnHcsAO{Guo#Xk{ZV1)ZM+ s1sV2~+!v_~5S#A|N%+r2^UvQxBQt+Zlq6tKe~t%WsB4OB(sslD7yEgqrvLx| diff --git a/public/img/emoji/banana.png b/public/img/emoji/banana.png deleted file mode 100644 index 1c4487433c4acb3f00bccfe1be16630e6cec6cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2431 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 diff --git a/public/img/emoji/bangbang.png b/public/img/emoji/bangbang.png deleted file mode 100644 index 7270f0afe6e66920a0cc4059ef29d04e50dc1eb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1387 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 diff --git a/public/img/emoji/bar_chart.png b/public/img/emoji/bar_chart.png deleted file mode 100644 index 2be14d6b5fa3fbdd324798e1e6608ff1d9ada049..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2341 zcmV+=3EK9FP)0002i*4C$|rvLx|000000051WmT`E0go%)VhKYfPjsO4vC}JEJIEjxL z7=D3=d4Y$1hK|C?(Q9>l0001zmz)3q0M63W0001ojgo$dkha3kproacm!Wcdg#Z8m z0001(o~5IUiIA3>jFXvZZE<93aHy!LZHZ`QcAES9`}g+9&~=;!C>#?aflB_y^XAj2#v(bn3szs|tM&c4OW-QC^a-{02T-M`A! z;o;%p;^Nxc+U4ct+1c49Pq{8w#Uo3#G+)ghMz1wt&>=~((9qC5h%GaGBsPF2LXI&- zlQcAaCB7&nxFaIp>-I5vBC{YKy2H%c=J7IJ%Op*=CsDjAQok@-$1GOEH)GN(RKOre zusVe+H-acbkux7ft~i7#KZ`HH&)oF)`bU*Ez$quRARo-n($(ej#LUzlM61-}^4`9@ z*5ByR+UCN|*v{DC&9JWS@$}*4=+DyC%Gl<`)8WnB>g4S7yv*CX#?aEUvf1bLxyaVN z$^!c#8$;!>p z(&6vS+vv2z(a72ApSI_)zRZrL)P=fwh@a2X*xi%3jK|gR@%8!N>-FL3@sz9E)Zgii zr`yQW-reQw&ag@35>g?p_ z>fqw$-QeWb+1%FJ+^oFIx5d(<$(z5avE%Let-Q&7n$X3tw&UI1vY@MovyQF3%yo^w zfTw@GrK-K8s;arkwZY1_%k09^?Rb;MZi~Re+P!$Oc6p<@}Y zEHfBW{(KwQo3|d|&4U0N`N0H7!YTI9m_;Bqq3D3JIuigLOQ!>@K9FjUSp@X4T@Qg> zRY8ErLx3qBnxHDxek0Qsh3d0F^^D^HQ%-(DW?&`R0J61#batCSuN&y?as#~H3@{%H zIJnfUf6GFBC!ZM9m@Nv~T{_TJbp}A!0a``41*i(@?;Pc*SObE}p0EmxE@=anY>xm8 zMgVfLfbCn_W}X2cVo>pPPF&Om@T`>*U=eW3P9^zZI3E}$AD}B=a8@uZIr0sv*Cya6 z3}9_b`OZQa9bwD!bn9SudJs=*mjdI?9KgA*8{q5D0sbb(1nbV{7vk80CcGZd;z7kEPV|q zfJEC>AO{v0)UZv!A%49?p#@rCu3}8+yfB0m76EXtMpt%7+Pn$OJaagh^QiVjB(v8yX_g zQCHY~rWGLKGwlFAg9_Pw@aQ_G06YW0?exWU zT#RujazKf~O4`hq9SP4*69v}(4y-+*kUZ{Zm$W+)20=M&0;6>?pw4I1=(PuF5VdRl z5rC|^nBQR(G(ly?Y&o%}5vU38qXGae!W%RK+>8K}=QUo&h=QPEwi#r02Y~L90OtUB zJ^%!E?}v>ZHop(u0VV+m$U7+tN~-6ZVgE@unQHNc(l}9x1Io5shRpO6H*?Xp&2e4? zU~szHs9R44pcA0eYSZP%>DE!Ez*Buups)HEB6Af-xk9u?%)h3c>b~f6Vq_FDq5z{# ztH3~q2k2PtVFdt}Jv8Czc?p0X5BEAey*B~y$eXR7huW>S z&oRG43WRlG&^ZghY@HkETu;2D>&XI1PV5-~dKf@{>VUi@DDN4d5P)`AwP)JG(rG7@ zMAupJA4gp!><7XXzesw-&rSTrS4BwtRD}I^hGh{Xk18C>S(RR&dLnT^`fv}xnA7e9hiq?~ z&>_7z-~b$Q=#-fXYy$lupg%Jt%LgG|Ahdk80haX}8z=-jhMxTY1>A|vq^4Of0*JhP z4nF!IRUl_^8?bopZ<2ncmUrpg&;-Dj&8+EbTXD(=<6J+$)w@=KXuAfqU(jUoKA>?8 ztzH=GH5%_|C&aqepicuB&anGH1-Pin#D&Ur^GK_5u~0R~#nd!TENhxlDGN^PtFk6$ ziH!~mnNp|Jlqg7Mm63bJNiF@QnzNfejJ3%`IRGu`!lgT^_rbqJU@UmG_Ca$^~BSu~;m zT!Mb+6F+(nuEE8`tgivY^xP3sV6fQXe9TQW9@nf+)E;{m4$A&t%T5BwFat>=00000 LNkvXXu0mjfWaHE` diff --git a/public/img/emoji/barber.png b/public/img/emoji/barber.png deleted file mode 100644 index f36ecaab614ea33f1281a910e65e567eb6b15c80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2405 zcmV-r37YnaP)R%XlO@FX8-^H{{R30Bmd9O&!VEDHa9l_ zAOC`r|NsB)UUdIlTU%pdVu%0$W@ctrS68k808&s;9X+N7(UH}vC$pHeC000j!`;?WHiHL~a z0RsL1`IwiN02coL`QTD({`l|XiiCN1cXq!61GBQS>*dvj-LLKk&*5I0017|D@X13DJl8;?5(Mr#>V5r!o)^DIDU}- z01Au$Vqz^y`R*|>;o;!`3$KQYf+j!Q{F#+8O5Kx;divVX{`KD472Yl`#mn~04-Wi4 zJT_49j8RRFCno%EZIPPoFgk+#w5i`TvAOxjT2!qsE8ROb)PQ*6%e}F-+-@*1j-ApV88jWEwr#u5)EwKk?OA*Gf0EIo z^PIEZecL#{_xQ{AS^W94X2C-OLtrm;LLN^cSK@0v_EOo3#A(bjLGhhS} zn>`p{!Ey`+EKBH&0X^lz2vnLVxzgJjAn^9|)ai775IUWwr>D2T+gqp1 z@WKeOFajoyCJAE5Gn6_IuznvPRAxA_H%qxH3XEX#WTuNRi5sENY*q(pJ!05V46q?l zQEYaMhjz1+OcT4{a4s-{F_x2YF1{3%{aeT;xB#+>0_7K3j4P=;1CeB4n<8tqH9o%(b ziUl$zZLEl_DcOFxzP|qQi*GMp+*zFPcw4sX^*tyBdQQ$@m?*4(=QR{OoSW;qZx>?0 zD(aemE!(^EMItvM@8}s@_h5Q^uB(Id1cZX|K=AeDd_kZakx1O(?~b>{LxRkdrAP&x zqa%g2aUia1*%TaXYiklXX5O2KP%ts8y5G1ngsA+2P*!G(Hwm_#KDRp$u^>Et;8bbC z{<88iLb6%lzwJp;U-($0f;{bmbHj8(GJ#+g1iQBZS3<=C@P>vtU;DuC*27A|_ z7bKUJ6ZR+Yc$K2Kob)OKY5}2qQ;Q!F#6{g3Y|@)i3VK%4KWhP}l3SeUMw^Yz26Tdy zOvmiU2}BSN6y&Gc08k1J9)4&n4smk}3=HcAX|te}+BpuPU|e|LfH68u5SX8%Z+s)D zGF-?Si~LmXFRTq4%#k&6IA+0-n91z#P5gaS*kI$QpRM7ExYrvKb zS2+NgDc?4Dr*t5`3r#@*6-h6X$xMQ_Zc*IMQx9&XpcVj9Z8qe@i7G>)pEzbZqZTx# zrpokTqDmewq3*P+16lzmHTCL^I8j^(@6eDxJsY*)h%6`nTHv)1-qDkwB5Xq~IIa&1 zgvxRORF?5{NRWbD(DdbtXb}{5YoWV?vTPD$9z=R7FTWXowlF%3NL21G4-I}(m0b@b zJ`=}g#TOZi3l42sA8Kd!x+)LnKI}t&D(CeTF`n1if%tl}z}^3haUecx98$sE!>&E6 z{ny)>1W;8^ODHz>S9c(-2TPqZK}n+n0RY75FL}J^!jZ2~)8jER+yd|g~X*Gi(m2uNgm zsJph8NHuDf77O})0O<6CVigj53XMi1ktI?tjDRN5us|v*DvA$H2_7s6tp{YmvVzoV zFivfjl3)Z(F?ln?%MY4%{FDtoVBG<7uq6#jC3r0tVijaD4n{DK=|YR}z%+Qin{?ie zKHf?>UqklAG3QypFn^pcjU>@{FcL9d4W`Kn3`;ttj~6B}iY2uNBg^dh7Vu1;Id>YE zbhr{QIK`@2SgdJYjF5nlhcxXUGpAc1Vb1iKQ&-GgId<&WX#nuBa_)+$GpEn7_$BxO XaFwB6uV_~F00000NkvXXu0mjf|Im%d diff --git a/public/img/emoji/baseball.png b/public/img/emoji/baseball.png deleted file mode 100644 index 63832f8d3df6bd48481c527ddf5864c79d0be8b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3528 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 O2Ef_T-GO~JDDl7Nn%V>a diff --git a/public/img/emoji/bear.png b/public/img/emoji/bear.png deleted file mode 100644 index 8e3deec289c9e00cd885e0dca735eb658eea0c73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3164 zcmV-i45RajP)7B?%`Q2`L>30000$C=5j_ z3^N)4P$~*XCkj+73q>GaLpX6$Tst04W{{C>;tW8weyB2PYc|FCq*=FcC2#3?vx` zJ1P!XFAF^+08}drPb&*aCkahAA5JwEO*9shY$cFsB$aI?nQ$hneJYG*BaLVy&X_d- z003r68Jlt^(V$1Shc3{cL&lLYie)0rmo$Q3AfR<9wuUXVge}XJGHp*AJ1Y*bfh)p~ zFwdJl&Y3ucVIgx=9HMq8yo)cAYb4U5N{C}2ds!ZUT_3)TFPCp7xri>rkTIxxDy4ZT zu7E4kq)pD6JC0~0XiOS?TOM#x9F}e+opUF$gDtXxD~DquT0s_3I~2Q$FI+xP~oxSRR&ZB$QzyqTp^!kC0H*Fj#3$VLK7Jj4oOH!l4d1DF%Um34_-tTj$Tk|Nq9HTg9DQ;kk01ZZe&2F|va$VMGSF0000jbW%=J07XRD zUJxrE{()=GSFN(51GC`@<+Sd3ODYNR(Y}x4@$m3*s`(Y{)XU_WnfAnYdjJ3k-bqA3 zRCodGjC=i_#c1$|L^G^8U#E$_4iWh_iVOW%$IHz z*4(@V|DD1CN=YARZ!g>`<%`v9_V?7%->06{i})HAsAex;&Yr8}r2@~jOcG1$>o;)L z*9rKw)$evo`N}!`pDL{IbsfP^wenx7?B&UGmDPm-dvk}7A>&(H<1o%G51C0jh*r}? zpT1f-H+eam`m0>~>0SJfCpXL0Dt>;H=Y51D8h3SxnwL`5h<8l9>hh2=2XV;m9vHjC;pPK#n9fI$6JWOq@ zj!Ff$FXTYHN}H1mv%I{_FiF-XN3^TRK(yHV+|uakM(W{?@9IpvpVB31pwHf%i+Z|( z5!#ky6ia7kr^T|&ur?J`jF7QhtEqoxK$7&-{hu0Qe4y)#?Gr6TI_?s^GT;H;)6)YK z%So1|#`d~AQK93IkDp%D^#=_xe)Q;p4)yU3I-A^q zYXT?MDb#E4+qVMO*f2leIkE7nLoWz$0b>IT@sBylZ3G{Zv$YE?Tw!jDh@o1tPfjR?$Fx2YvPk+Dd zlQ>o2x{<)ScZ{M@1J(djRE#Ex5F;5A(8a#P+dYb3?pyG+=3=DB6%N7*EHGdb4LmFW z3Pub9aFO5rWh4IEsWq?w2;#7U7NPMLmKBRd!6wTTEC33kX&~tK`P-+yt;c_UetMB> zA#&*`tk5NnMN}G&k%3c!TY?PHfp|0~IEIL3lbyeK{_}V7AN+En&~I(-a0r=beB{Mr zBEvnitl13T*Tk?31i-@t1g$N;=WLZlaN|}S##7Fva4geZmLf&cc%sUZX-2X=kyc(b zTTUF1mptJ(v%L1?6lR8dxeas9%gnrcTQ2u66@s5GkG|jkdru_U>g}(t0eo3QNrEXv z*SR195Jn2O=pn3MS*_N6&RWPHfm@&lplQ^Dvqulqe7SZ5@t}-*6gq6t34F44U(#Kh z)IVu?Ta#M~y}Wsg*}KhRsiQGWL45ggFt&OV@0Ao#M+6_L&~%-}wS5P#k*!>^5D=hR z_Xx+2L|e)1oGPe~DGKT#gd6ClFFF8ZuP!t>g?j>KyToxIrTj|1b9_ z4A~uZP(OsC9upI=#adV1=y$SHB8z)aMZqvSoZ};#ez`{CPTuSV>Dza!$8Nm8+Mh_wYQ=@lie!jpR)mLze)67yv>jqY6q^013aO znmjOrq6z>81_uWRrmY-!-ClLf8)f#hEKJ7Z2om`LUbn z^v$sdmwUh%qH;oDE=5XBn*antpMVV5_PYLo3j_Vz_L!r!-+c2;x^Rr!Q)LWcE)>>) ze8f5cJO(Uof;k{47BfYXWZNS*H+JfqZ@>NK)L6v*C=NphcuX%2s|bcYvib~)wF9D@ zkNb3ZDN1j5%PoQ2BtLcr{6ILf%qMfDmVnt6LcmNwfP7gzpcVfQ__!r*lLQ9$`3T6M zgsTeo<$0saXO_~sGD~NccbK>4nOzuK3Vs5|aY3@hTRvWS68w5Ixoj<$u z;^~B;r!SVyo-d~{6fqfgMqnjdn^wH)yY@+I;(!>~ujT^+2ngys|9I-$;FBgpPX^CT zJw88<Ov1=d1ez;(NHLC|CDznwlgb&hQOSLC^=lj++sqpGSPuyUE`k835LX06d{ z_L>+KJSqibmKE5!A5Q)-IXO!9^qhu^9G#qmfjO9f>eA656|1qombF$NerDI|Q~sb> zCP@K_=murF8%aQrWMlX5dLJ(fNM&VW(4VT;?4NzO;m`J3Np?XjMfq*PU{L<8tE=nY z?_H-!(CMz~Q&W#z*zt4+(1>?$u3UNZ4yYZ- zy>KKowK|7mnoA}#69X>5#3!AZmF40xZQA3D&n{j_Iava&Lz z`LJt8BnciaWiA#LPVUqrIo<8efB!YNcjp{Q<>q8z0ZQ;lG7t^eb&f7M`{C8A4`-Jg z)n;cP2dIf_y?pWFrIt7=1KEI$hlh=UA|Svp=m7v`W#?UnB1m@t0000}%(~9Wx7*do)6>t^(!<)*#mT|1!@8&c|NsC0|J2RB#=fk&vYZG2 z0O;rB|NsA?nurq<6SSz@vctc!7#J9@s+dI|VW-A=1ym|Ng7c%)iaXyBixD_0oumhjxK{ZTa?< z*wuNnucNc7cCe|Iy0)kb3k#*8lV&pp*3!j)dvnyz!T(5otlj}Cm2vI3IF+>|NN`}_jv#HVE3&KXJJxdUsZNM3Cx8IZ#V=uA`YQq z3QZ;jV=)CJ6aWAK0165UIXO861q3xUH5C*TB_$;f4-RE81R^0H{=XRi|4TzdLoO~Z zDk&)c|3Cl#E*u;h{{AQb|5a=?1V2AN&$=D^vkCwIpQ)aM|Nk}r|7ZBA2{9i9|Nnmb zt_l6P4Sz%i?&l=#mk9s=kEdP+5)TCA+9CF#3H-?)MK={~VnfDu2b50*4G93?(;@Zr zE=xckT1zS1i3es_IJT*QoswfcDhR>3rFLmcxv!XYI|MW=4*&mJBN_$vun*VBC-(M1 z{?Q@3YzFF`34(S;(trr$mkY|Me(KOG+9N16C~riADwN z$sF^t8QIr4?y3^$-!w}}G_a#~shn+>jZl1WR;*(O{rsk|kre*@n8vLd{_P~>j0kgO zG2E65je%mEkaYk4bMC$zgJ%?$dKc-k7=CmkWMpJ^R|;W63H9~$X=@s}q8IGLH2An0 z!GQ?~1;D?7rGOcpp+Jyb1=z-IIXIG$0001fbW%=J0QCd) z_4W1j0rmCw_6!B}_4Nb^6ZV<*{totL_V)KQPNp38_Ahf3McN}H7s&Pa_lS!2_x|?% z_IlB?e@3F?AxaG{=AmKy|8%eFP?Ac{)GMZ<@WdP?84_;`bzxgPv6tU zUbkw0n3>4heBG1ydhJQrmhqWFx5@wj2SiCkK~#7F+|X5a<4O<);F3FHooib! zVG!McFf%jbYw|j4$w~~%o9YU4@;aZ{(*JjN!M~#;=zs^#WVo@m77oKV*aKY!xYZM$ zt1U>?H+tdAG_BA@dx+h|sbS$eo6s^t_};swQ=X`7q4(iXVK~|INkd;Z#HQkg+M;5X z=<*cpYV%T8k+HD(;h_fF;eazr8scRbI^&bL{1n4hqF!#s;FVyk077TVIp)l`qYF$q zc5qi>{o8^!Cz~$LwgYM#8jd*AZ!r>=6O#uD(+#8&L(JtByVQyAg`sPY%eO%m7i3v6 zj}ziA;|>-mQ}9}PmX2^elTau}6nrY2I?3JElxX;^0pb=i!T4#!70MC`S#=Zti6eGL ziVonljub$un099@PC43@R4Q!l|K&M}EB%gQ$ECYO*x zutlyXY>!xW+gie+4PIuuAqs8`t*niHIn@du5ru8V7 ztDN3oK^-?^3gTFaDChRV8wvvxWh@xaySY}(R$SMuR;&4&AI)agLJ1^h63w`apuub9 zq1n~Bxw+LpewDKMyzlq-`=X$U=drRDNgn-ez8s+3+M+O=)um^QXQdjWwr$(C-9EqE zd!z9LW80o0wQbwB?SG$Sl-%|i-x&Xwz4tj+wpB$BQ7iYZJns+^;_ts_a^1RBk!{$p zVdKV4u0%9y)W{w!K?1(5Vq0~PSl+pdT*31pB!GgVjhhk>02g~G2z%tmIg0IqE^=OB zssK!G+_Z7eCBp+1ij$X_p$g^#s<^mTtu5AoRU5gSSCYU~!qA~-!^6Wj$y6tsT)wgx zxG-$dTH8vWSdOrI00h7R24c_9WD*SFd<-xgTTDb?P3qQeIQXltDpfK!Sj~a}3J3^P z@dN^JG%(9>^5lzS#ET|PYBy;(_)BYROM`b{U;q?bwrp|W8U9aVlZg|V#aRYJ&*Q`r zgCVQwLYptY{L&glR5VmqD#-u=&&!FBcd?A81;xc#S%xLV<*edjpLVTnY-}tIQXd~B zinw=Aj(h;%pGFxeEGz~mPMql3b5qt)jY^>yR09U{F5G=!pdtb&4wYP|TcyLts=|Uo zun8ElHmQ);9PKM&Xsz*4!hkA}rmsi+jBG2&%q%D$$_J&MI-Mf0}t!;jo$Tp4)S=b>H#7ZdR zwN}dv`DvloWyJQiN7lihQ<0${Hu>z38s;TOVk!G7wRY2!PeJoKx9F%zz?x?MlpB$^@CAp`mNj67wT($;faB zOYAq_I7BnPOGsdbI8yi?IB-TVc7Xg=2!ijEKsZ9XWQxTB1+3iEF;qiRdR$moeEh+~ zt7XK>tsoBq?RFU%@`HnS@17!dUirjodQ3u23K^oIIE)5}Ge`pnRmT;$(N^T#JZhGHMZ*4<8&JgC zR2gIM#KVUV-aL5i+JTHvK2DF0j*g2918a=ZOO(Hfqd$P(bKC49 z(@y${-RxgW)5vEhC8aY394}?W>UiRgz;?C5$6;#u-K=o-cJlD-TAGhZ$=+OaAt{M0 z>6iA(h&$17Yt}3fzulC2NgVCmaa_q{oPhTCVHl@2WM^-N!3Z_L}k&w^}|0Ry2mlNC1tv{hcI?nE; zHyZX~Rha-&(f7jCKS(tn_p%?n+$C;5^cu4-hV4j>qdoNVFTL$NBp*Sl@hp4#@G_pK zYB_bT)x3H0u3hbq-0iA)dRF_O!ES(KX+vzJ5Vbb`*uu-1OqB;RkB7c+Q9%m`S_Dpxj(lV;8yX8pdIG_2S5Ub^5r>oY%P^m|J`{c+SIFP lwDYP}tFz=UffoONyayLAv*nB){j~r9002ovPDHLkV1kO#a?t<) diff --git a/public/img/emoji/beer.png b/public/img/emoji/beer.png deleted file mode 100644 index b13f72d2e94d6bc568ce73d92b8811daa9a8fa5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3345 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 diff --git a/public/img/emoji/beers.png b/public/img/emoji/beers.png deleted file mode 100644 index aaa6a94d3f14d6d4f16d94ebce9130422c30a981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3255 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 diff --git a/public/img/emoji/beetle.png b/public/img/emoji/beetle.png deleted file mode 100644 index 30497a736046d67727ebd310ac8c004e1129ce5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2744 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 diff --git a/public/img/emoji/bell.png b/public/img/emoji/bell.png deleted file mode 100644 index e73e26354b52c6f2903adb6e833fba24015c2f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2752 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 diff --git a/public/img/emoji/bicyclist.png b/public/img/emoji/bicyclist.png deleted file mode 100644 index e172842b26ec299a7b85a6fb6d99ec4b6f941e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3144 zcmb7Gi#HPt8=uRNnazgW%E)c?ddVd|xeRle%git=%zbH?60iGZi*l#QHF--Y3X!{4 zp-5JHg(ReMOH0XeU7OGMCw$L2&-0w~oZs)9-}yb~Ip@j3VeP=;3gQ3&0F1Fm;}1LP ze<>z(SgShIzX1S30GyM%ja`(J$T5Y(p^%V}^6_KJ>S}N}Oj$)4A_pUpNRAj=ps=uy zkIx~%)6?^Ws)~gJ#ue`hfj|!N6bc0*DR~l!jEj#0NlM~9Jji5nQzS$ZEFml`EFvNT z0)c=);Avf*fPesd2YXlncprxlA zQZ#(MLBw;mwzk2+!M-8El<){CA8)Xm7n{w_p$GO9QAI^XrD0I8U(gXz5l}#om7P_1 zc(|0Ci@Lfx1S09~?mkd<+0dK#GF=LT!CL*6oo(3 z5E@2C8yo|Bcpbf$DiamB-lixZARwcpR9?z}!{M^hu)J^^TfB2bWTd2q}JZ z%dSoKO(*J6o%QXl%#-}Ai9}+|rHCR5GK@l5?vj`7OqahG*PSTcMv)A#P(5_=exges zgPKl4$z1T4!C1@U2?k!oceP5NTTQjC(Vq4uUs|M&cBH}X{w1B|r#O}~zcWI(=t|{JU2fh@LXHIh9z3IK1J>k-OAQly6QHc&p-4KxuTS&iFdGWfBs^^N;H6Oo=b*P^wWvfrSY}r56PU8J5F*TA`=*?} z3a~ge+^!o3_A>t?%YCm=Q9aSjCBT+iKvU02>nw}A5)P>;h}&Sva;FrFx)JeZ3dfu^ z@76$MY8akG4d!)?$;nCPZO1R2&L>(s@dc;!$r|JcaI7Z0+iFqx&>+@jJk|{$cEW%! z!4m*7Vf#GmI-cS6{{<kE}VWz4BO^omAT9 z%kx(Q_M87~F`jb}TzgkZYTslzv-?#3gR`t(jFeZ;p&@%x~qTS9ASm7hU~nB`L+F%=fPk{=eWO z$NftH05L5L+R{Bv;Bm1~)HgrrtL$y+Y)8aw$1Cz|$8e(NygP=#_-0))@SYGc>(rXO zSXKH}V(>@hg4xlqXjisTGUpY|nSH4~E42jy?P$MR^`%aa&NgjIgWxujdJg%dv)2k!!M;0_kQSyK@i4h^eMqA!%?i5cmk#8 z9ih(bX&_**sAa~FP?H9LCS*;JERgs@uEaxtTzW2$8GFt<&mSO8^Y_fj+t39INZ8p9 zg$_q{#+=+0gUUX9ryZMfd_d(IeA2|0DKV6R0|2DLJJ}V_Re|S@00JJ@yiK2s`Kj_! z%=GIEWa;@WyXWA58#FjNmA@+`Z22`oE_3bTFOM6Zqe)+|7mx7yEs`TM=iXeRK2f%O z*M#ynUAZx)28&;wy|Y{Um*V#`4Wwmi^=}1BrH84cn(2P+Pr`SN2dWjiaC0Z93AOB**?Z%D!V(}hx!Ejn#4Qlti-uf ziZ%p(Id0}5U8avz7mhri0*Zx%4p5f{C z{kl~*V4V3XsAg-%O0GoKoV!L+7WgD2dt11NBhIf zez|Q<>9b_zZ}AM8rp5cHqd5!aJD>CJds0`>iy;DY#;wBt#u7?o92NDShhHt{R4Ips zhWdrB%n!1dk82wW4=(!15dYi=_*ho{XhSYhO%$?VrT5D~e?B6r#0Be8V&Qk7DYntO zxmmWdQt8I}3^e7uc+{f|PUV>G7*rF?l(&=KnXsN1ojDWFN_I42wp;jFS}1>Ejb^3t zIV|#YJo!?RgwEDe-;9k#!K6op?-i;cmFw4_|2eIf5FP&eq~F-=!Fl8^QgF%Xvcu)e zNgri{D(Z(v>Zs;^3rM!<2`+}VTOx+C{`j1;#AB#E=!7ZU28gDJ-S;4`A*W_$&qb}X z-b$RU$3fkyp8_6h`jfhRJ>Lh7dv}J?hhUDbkHj-di5p9LG!>g%W^oH0iQ0tk z_RxCaGgfz{Wdy&^{&QmMLgeF+@~<-;0~=$fRds*EQ}fPy6PR6HU)dVdF`6-A0fE(?7JQw#jwCXKhH=s(Kc2e9D3HWukN3p_R8hrsG7hf*mUes1KN#7x;XY~m z=!@B2if4dBKk7z)wtt%XV21>bw67vPft$JP6bI33nQtoJWUIfRK;_&zzz=Rt*1 zo*Whn8{n}zTz!a{XAC_w#P4c8zNleVJ3yL}CSPgDvKIl;_K0NlG+#5R9$^<5wK`f>=IuBElDRrv-Z`?+wJb`$EEvh~%S z8C_gD)X{r?kUy zdv5KjYwW5qC$!qWc*F_y^fmniNS>$;otys05FwY~bNB>#|M^`0mz>l;ZVbIR&O`j`a)bsP?4JD8HWc4qUale{EH0CbVmH!(dd~et+2u@s zsiO~t1Zs>xK+K16&MK>l6Nhs<{aGJa=fPfcrioWm8&Pj}OAl^;eDe5|ZsDh)FhyW; zwmtO7Pi>t8*X}Jb@nGRb}g>Y?|aet)wBcTHP%#7NK^3Lm2l5b89wg2~v<#{gUAxHmY;rEGQ0r6+} zv^b$gjpxr!>17B)foT~sWT??bBgKeWV4hKZt_c4YYA248MwxzBcN?Gp#((nf{E~(O z?L8<$uQG*H;~%Zt5VZYljUA016VkPyku@(^Ik!vh#iw3R^u@hJaR|_sFW1$fh|+q+ zmv4dJ)hwDrQK$-*8<=|ojbIe3cYB>FEwWd81NLW(hIo78%bjFlCxw>zBH1hwW9-`> z%>`eb_0YVY(waRb3a;=~CP;iu)rRiXUjd9o9c>@!rd<4yTm+pU6N~($OP3i->s`Xrp1lyuB c!+rO_-$qnGH_nFmAHG8Xj13muWaUr$FQ4$Yk^lez diff --git a/public/img/emoji/bike.png b/public/img/emoji/bike.png deleted file mode 100644 index 430a7ecf60d24f0aad862b91c563fa1c4ca78aa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2675 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 Zr5_4sXq`hruUh~B002ovPDHLkV1m{l0Q3L= diff --git a/public/img/emoji/birthday.png b/public/img/emoji/birthday.png deleted file mode 100644 index 6492afa07e0915f75adae9841f49d97910958af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3167 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 diff --git a/public/img/emoji/black_joker.png b/public/img/emoji/black_joker.png deleted file mode 100644 index 4bf751560fb87f4ed2625ccb19923c89580a8750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2528 zcmV<62_N=}P)FL_p*{-Rm0001fetwymnE(I)&d9(3 z006eFpa1{>(9qBT006tYyV=><$;ru{o}P$^h;wsuTwGj`iHNPOtvozDTU%S}>F6*p zFcK0Hn1OR>XlS6Ipa1{>xw50HtE+0&@;NbD`@#Es+=H=!5 z{QM;%A|@pz+}zwODk|vc=qMy28yg%XBqT2=Cn+W+CLkZ%+uJxUEBe~HBOe|tB_tXd z7%3C6&Cr}x`|#u^~a=jY-&F@HEm>KFeM@N&8_*=L^UcYDVz}W?o$R+Px(l8T-VW^}Lhtw~(D{OYysv z*`Rn+J}K+8jmME^V@556YEig_U1C~TdU9}9NJVr^GHg~j^248yeO_uwF`{u!HYg(A zs)NIiVoEe7jdNY`wu#%Mc>UbDAPf%v-@Dkeki(&Y%cq1G0S0$-a$Z+efpu|8J2-Z4 zZgo>VU`#%!nuDg7hdetxi*#nbh+}6^F{FcOfmb=NiEWT>SAAGME)^A&X+@W1PBaP* zS}G-ZaBgN$LVRLW;K80-PCx6(rg~#d+Ps_o%AL5Hei8rxAEuNr0000^bW%=J03-H= z{wC@FPyYV?2>$;568;|k{{H?<{sTe&{y6^r{{H^{8~*;{{wn?f{_67nZQbiw{&xO> z)EL9t)TNMma{le7$NsaJ{?_hf{`1Zm@Qwfg20=+gK~#7F%*?d`!!Q6u(J(VJGxUjh zh+E=z@~~DfEd3;Px?jkf&R|rmniNO>&Qd#H4z}U%{;lbKYrYp(JG%WPf{XiBQy3%w zSvPAE2#V^!^A7RBa>ON8>c9%9+cd=k=IX$lY`P#D>OeymIHVb6)p5En6LW0awr#F$+t!&cNuTe})P3(CC6cQetyCK zL10vy!O+&K>uIJEet!Q;urR}*HAF34^3GD-l8FQj4IKJE!SW3WhD16CSQO$Za~c{@ zg5Y2gG%TFn8I`ztAtmT+vnd*BbdftmPzHj7(E>VM{B@kwU@%zYGMBk$X0|D8s=c0h znD+if3pgCnt`@7oZnuYr+f}Vo;42eV3WYUDBoc}MAp|TA2PL4>g^5-|MJDL1D!ZL< zt`&Y2N7zh;g~Go0_rs#+@&8 ztYz@|XaVz2f*iVU9zS?gK7LcDHYRYXY`S9x6D?pc#DB2x+tjlD-eRElSo!c(F-2xk z2yCGb0aNTn?nMT6Rtfkdu9I zWOV;x`1%>m*J74{o{18`q!RP2Wry#L9L&y5=?2_}%8DB_Cd1PDgiF;zkOD5%0xW$v8Xte+*Gp&5Ub^(8 z`tn~g_@$Hq=%m70^2jcS)bM%Xi^%jI%58!dQag-)vt z4<`r}7}U{b!29j7dR#@=?e@6Bc|HV|j^?DKjEtE4rk27MnZV@&i5r)`VEW#!sHXgw zjHIL2)>3E*aYL1KQs&88B}%wQk!N9#*V zOP>3Pf;-RDlIPMNAdF{bz9Fb%c5Yw4%fz^MVadL}1N@0jkd%a|w_UGuZa+vx2+_-R zyL~oM+)|k(C20g+z?GeImSgUdXYKZbGUP`iz?ed_(W(PGXD?Ke!|be1+FCe6?r9xFVwhxcCO@?V1YaME-O;A^^?Va7>I=VZ@ q^U^;5E2vLMsR-4RmLhBCf8zrhV{$}0>$J)M0000I1poj50000000064 z0ssI23=9kp4-W|m2^<_85fKp@8X6N56BQK|7Z(>E9v&MT8xj%{9UUDO78U>i02CAy z85tQ13kx3~9~c-IM@L6QL_{emDNs;QC@3gKMn-UOa7#-|N=iydNJvRZNnl`LQ&UqQ zARt&+SWZq(OiWA+3=B_CPeVgPMMXtbRaFoW5Nm5|TwGjHQBh)IVq|1wcXxMEQc_k{ zR#a3}US3`e4GmdYSzljY1Ox@i0|O%?BMuG@At51UWo3AHcz}R_i;Ihh zh=>{+8ew5!0s;ahB_(ljaR>+qKtMn)E-o=KF?DryJUl#oeSLd-dwhI+gM)*FgoKBO zhmeqv($dlw7#Bf7K@SfPYHDgWHa0#!J|rY0LPA1S72kCT&=o}QkUmzU4a&ytdoZEbCNd3k<*eg_8!EG#T(X=yStGIDZqhK7cw zrlzj0uBWG`c6N5Rx3{>sxSgGyy1Kf(y}iT3!;X%Q!NI}A#Ke@8l$@NL$;rvf%gfBn z%+b-&+S=Nhnwrzo)6~?|*x1+?78V*B8wLgjIXO8O7Z?En0W&i*7Zw*iJv}%$I7LN9 z3JMB4J3AsGA}cE^IyyQqFfcSUG?|&1qN1XurKPEUY*4Eb7*VoX{(3qH*fg+Jc0000N zbW%=J0Ko9TKR-VY@W4O7z`(!*3_S3(@bK`N1>ySu00covL_t(|0b&?rU=)l3K_L-Q z4m7|71{~->OcH@< zCam5#abiz@f8X+q%&Lm?(%1#F%}j9^a4c0%FVH2nG(EnuD>E}FXnA$@nBellET@_FKqHFN%F5$_hE&eU?92$t$mpz^(^b(L7gt{9QXH)p zWAE=Mi`4*Di6TGe2>*a!J-z5am$caO(rM}G@vRlD@p02i%VN_2bk4Q@6fqFMaolU% zs{L#(th=4NyR6{u*8bhD$KgS6hxcM~N4c3c`F&^do#1}hOO38&Cub?ZUtLj#xlt=c zko%p^ll=7;QS>4Yi-UK3*lVXo<6Ks0$`l~^NUf%uijvJ;8@JxH+s}dF@89Rcu=hNb zS{{wA4YRdcdeCr>9E=BEW6#s|bh@l4cd|Lcw3eZ4jmG2LFndR-mD2;g;i=AP3UJZH zSS@))y_!xpL4jk2xgn&`*2;rHwNdm`HDf$HMgbDiWP&j+ln63Ynq?@440j#sX9({Ej2MltEEJ9>XASErt zq(;vA^xUbFJL7;o){(2)y~j@%5dy#kO`g7&+>&?r|zjo&$ zA(j{jM2y;qTp=F--;-@UO!^8 zD^!4UWr!wk31h{%%Ba8uw-gc{WpO8~(SZi_0B@iJs}nr4IL-ZGj0|M4lM!Nv3=GD; zM@zJ`@xlOw3S694UgmB(9O!1?m*n#*uJ8Lt+~2d#c|JcMet9HkA_9hn0RRAmy`8noQJViFLH;9WcBOv- z0Qf$UoX9rBD5s<5|9ogP8jHnBOG`^iN@6e=adB~3S=nR9j>*Z%p-?Cp85s!)2@w$y zF)=YH6e=YpMIwc=4jYzyFmhR}vEwJv=I)Ab>z%U|^u1pI>lrFc=JuiHS){O3KK{ zNJ&Y_%F4>g$;r&jyl~+H1OgEd5b*Nyiin5^3k##u>GARLxw*ON>FEgx2|_|b+1c4Q zZrm_8H$QdiRCIJS4u>-}HNAH2T5@u7K|w)DNl9U0VOd$($&)9Ijg7UmwDR)uu3o*G zpPw%)E2pTaXl7$ysob9i4!M^ii$!) zLP|?Z@87>)QBhG|UVi)b?dt04hK7cjnHekwtFNywD<>!WFLZQtG&D4fjEs&SKd!B< zZD?p%TwHwX)~&mD@3ytIRaRE^^z_u#)v;Kt2M-=JH8o96PS)1eK7RbTv9a;dqerh^ zy=rc5o|~KF@pxDaMpac6dlW}RV>C52QPR>VX%q+qGBGhxQc`;IHN33a`@DVib@=`WSnnD===0Zf%6Eqj(hD%JF zxz45d8K?ZIU)swHe+E*$W8J2h|9zAA_QL9+QN#=&aryFA#p)1bdlJy){bzPzHGAn0 z7(vIqnQ=?L-CZsy`LX&nrF78Ldu=o7#)w$nH?n$wUc&r`pNEPUN2ssQhAl^5_7O~-XG&EqFP;@8ZlK%>tJAiN!ToPZ)+?t zRBk6sdur;mtMx^F(l68EMaPYNqdRw>OMY+jiF_WW^W~s5DJm(6-ai=I(%sY5a&R!W z@x{}ot*znYg}@)1escc&<&gFOt8?wMpKDk?)Tw@AEN8uC(=$;NotUe+gUI7FvdA=#S= zETU3^Z=?V=KpT?hwp-Us zS*3n76=Y)vZ{N`|yfcKq|Kpu^#-+b^!`{E{>Orf>>WM3Or2}o6lxkK=h9hz9OCO@m zGz%>X(cd2T&fZzQ&&j0!#v|%`GHTvBiOc?|gj%|jsLzS^Y8e*NdF1N)^e_e0(6SR} z)v@$!WWQ#)x@NM2D)%GI#Q`T!NRS(*hgzuqOo_&Z)Q(n@qML%ur-Ouvif%Z*TgC?B zBJ(gDJI%^GBwNDcq09R8cY$^f(La_ujtl19eLpiiRmAKGFc%>Bm*w^th{^GzF&dUu zpfw#HMPyYg)XMJXAoiX*Ftend%z!h%BP$7Ig6*$*MKt8IJszxZdOCJqq^s?ZlxJBQ zX2`2U^Xv#7)R({#kb|ACFQuYTG;1ccD7va+>sr|ROrl4Kj`s?l4N$Ho71}!1DmJ=V zaLR>b;L|EY@0aP^(U>KY#Mo|E-fZhcmD60 z_rqVSYu+7y+}O)A!w?o9V*Sfi&GPBb`wjt6EtJ1xi78CiEHO@%mt}e6TrbotzOqV1yh4cP1cfEA9#6w=vJ&mL04D z6s!1<&e0b~cG>LVU!`i3np7DN)wblM#YH~FH8JXYgTOZC9wj#UvOkZb4BAr?TB9je zJoD@SkTd?Y?pi>a017`IDYxV?V0^F_FFyCo&k}zLh~rOww;Hh@^vN%Hr}cHnR+tX+ z?Yj=)5|bIu-(KVV%}OB#?id~hQ&06q9WGWxczUTtSX*e}+3k;lpe_sz3m3SNB*+^e zAA+*Nhaz0zEKmS|omM5X;H&s>?a&y4qM?Y_3EPr+5GOCvS9wZ~b~FN7JPPd87KBMa zW(nJf@gfl3*0+lS|0)W&o0z|xleOI)561l-gah}}Cq~P6mPcBIN~fxpzx~+9ku-iY zBIMKmQ}uPcSSDMc!cD4vzqOfvNPbF+*Q;$G(lNx(K#oG=iuWmOhDt7BUMGj}aJq$k znHQ%FN96i^K$UG(?BW1Vs*hKvffe;yv$0(5A5m%QoML{k&G6b{v>*3#dSm#ch}(Qr zLBshC762_`faLA63mW|`b4h|_!Cw{Jn8p0$T;gwC3CI+s6CFT{gE%rwOlE*`$IT_~ zw(jYg5B*fQV>?g^mTPN_m#TmIXN@+O8f$c>4y_3ormMT8-^xFqV4589f#rf+_|%OJY##}W$aAcB+3E-90(C1gp`mP8cLu+gRXcUGO^gjAy^6qob?28f5~acL@6F_?)q? z^nZNLoWDF45>6YTNdvy!XmGkLu6}H7eaUwOm^I<{8-Kld!7nzwx7Gh00LG6$c;^S} z-<`3Y-f3U%dNz250W)X&R`)cA18?yzCrC{wKlJkSGX@ai&htmEW!}W#SPrs{?Q|nt z`nF9g&j>(>SLTj?uJ-KjdnRL`6J-zE=pu#VPc5&X0l==AqaUAiVS~F?fx1s+6^BSe+Rhul7R<~pVzH*8r>y2l?14wf*Q389^f#0 zXrmVc$IeZc6%(L?5Tk2ZK6sVS+k;`FeW43awZ zr#9&eo+tvKB|i6@QJhVL<0KG(ppqd(j$lO)r;q&rWC@SA=*^GW2FUdEDXR}xI;XOe z698x?0R*KMA-4;nu!=znf?H$7|<0NYP~GBdKx&@N;f0|+8$XpA6&07Vdp901}B zun!4j32R!hN6-OA9+1CbU6KpfNz5z;BLEb^2Vj;r3FbkJ#JQ%$+5C`AKy}2sad>iS zQJVAFMM42IG%E55a0)>Z!uk7Fz3D+)04O~%<#+w(2B)QH;A4^q!T?ktzLH=lg6o0j zN^bkDEdZ1pZM^ZF9kta4DfW?o+(ASO5(F^@IDjO@Btk3KhgSU5763e5(;Bz$4(b_F zv@3!HMDD%d%_B%4Mwm|#OrepfH~l+0bD1pw1ouvE{N()%1_m7@(Fg++CYUX{hffG% zFo1jM8@+Syvju>$A4C?gNg^@mBo1H_WR4)sHKZ6OO(!10gcuF?wsti=YYPAkEy)$E zml$OD!XyYqh?oRFs3dV@lcExh-3%fajq{n7e>Hd50>IQK;~v&Z(quTO2w^ydkj96b zc1lQdf&?9CXw>6uN7w|wrR)A#E$@*4CIOQ$XcAmphL2rTs`73m5jt?7F^X2%By0kp z@!l;y?l6#wkN_1yDH2JX$z04XQt0?7$3PHckTx^~AzI#Oo@)~TSKPTpXF00iAyCOM zOgY2M;3B@@C>jAp6rfmPvq6u#y7lI!7i|F)VZ{~)O8`&=NsK5%jHQZg^b)5G4Xoq{ z8YBO@am$UzYylKu>D%s_TL2`7Nn$WW0LfkwWC)nuQJg{$26QZRB93O z{$5B=9NEfswgE7w>9x(3*G0+TWGewQj^Rh50TQWpLlz*UNd5SQKPUBD$jb z5Nm7$VE(KdSGf8vzmk zsUq+xf@T6V28od*(j#^h2>=UwS{iEJD!oKQr-K9%Lk$4(cEN#$hJlAU6WZ5bebbwX zq5z;d+|uZO(s7FeCkGe?B1p(>yXp&OByc6yvZv|I3l_}ZwAUWMBE%kCd~R20m8Ln^ zPXv%)CS&#mRBE|~ISet0;P}@+SopJ-S_}V&?o%c zNt7^^%%%)UjA45CkgZR&-fnXTtTg|9qg zpD+Kxljqpq0V}+;^~j84v@wKB74kEJKsFT|;W*21;-Lf=y6PM~e8zj6ynEv#7C-|# zS$Ju1buAO|lOj$(z4Q@QpP4%7;t5hDNN1D5iH}+)aRrqRH(y>f0NlK)dQKI!7z_|$ zkiKksvPt6R5NkQYn{*>cQI~r9#Xs{20A{xgVHD}0G>{bSy|iV zTb`aP;~4}Fd{p3~5*-k@c%3A15*VZrzS(+_0dUvDzKeFe{PE6PFYY6aM8}&=9i?P2 z5Uk=;;>1WGaEvSQ=3T?$=2!Q}9`NG=3&j%t+JPcx-Gl8t zG0cOYlIPN7ja z(wfyM^om7K8A}4V%+Hd8#4u=AEy>OGbk2Y6RRGXcaS$kgie{|=Ee~auz_4Z{DtWJX zVfnnqYCyMa?S0Vp*t$U_24`Yntv9 zUQY<845iNPACqto1__grQb_U-0S)qpf>=Dztl5NGtNiCMK?(zy`{VWK*VKAGTTM&> zFbS64q(GtXW37+~$gSjQZ-*+9_YCTw3=_a|*M+ck-c-wq^ z_@UrzAIaZ=K)7$ZxsdS$nhVeWp`f4uy5EAAmlq0!^7Hd^b92Mta3LWf5fKq^A`l2c zK|zpjTMq<{e+Bq1RIoTE@Eph6%JfRK}u)7i6U9UL6o+}vDUU6quSoSmKB-QB&t zy=gR>qoX5{NTgD!K|w)eGC3e10FTGJxVXf}$5SYj(9qC?goNbeWDgGyA0MBHhzMZA z*Vp&lxpU#+;b2N8CMMe2+E!Lpk&%(Hv9W1sX<1oW+1c4;Wo31BbtDoAhr`*~+3D%& zd3t)r#KZ&!28M)$goTA=WMo7~N9X0`UASCc=sHmx_35}M~)z!sfv0h$YT3T9Q zGGG)@QBgKFHhzA7U}9!wX4cl$U@{sS8W;>lUtd2bC#R#Mqp+|rKR>^>x3|2!ysxjX zw6wIgwzj{&e_&u>czBpjrwgtk`lFrV~s;a8u;$jO6 z3)H`RQdd{Ex5ots2O}kr{{H^<_V$K`hKY%ZU^QUTadB}vIy$MTshXOa>FMc7NlBTR znO$977cXACdi82$W#!=DU`+P=8N&NB2kZk7 z?5}ZP!C zYiE%eTx<)0yh3^14y%5;f$_2OP9QBA5YmlvWAdI34?3*EMy7J0*@%rj(;C^9mUo=_ z9UE)RyDJJYU*;D!&R`qn+z?zBYzQRKxxJh)K2z`ZV55T=C_w4 zvTRfdmxV_cs;Fm#^4$x6g#zx`q_t&Xulo}t<}kJrH*J4yAzaw`v3!O9pD_9$Q%;c^uYk3@Co0Sy2VIzbKHeFm?d{D|;s-?Ilwllk1G|Fgu>F$db`eLxR$d-SD zX1C5wP0(_rIi^`ral<;KYL=B}hj}FA+7@ZHkr=>Zv2q`IoeDo8NpWrIdmBeznM3I` zL)*k2jjtzdXtWIRyOjiz5ga2?{EUhyTnzuvjCDqHUFVLJN;4hKZ&>DA&QG{8^&q&T zGart3*I&Mlt;~bsyI;P(r^9`z#^WBAr}=HeZTIYla*>I|t;6m)+W}c9ribG6i*?7| zCLM2660DK5C3^Jd17iq7s(?t1+wS#qirIRf9Qs)F>2vwdtA};U^gHW+vl?p@`}+HL YWi;Eu$oE`POJ8qQM?48PU`H+Z2kk~_vH$=8 diff --git a/public/img/emoji/black_square.png b/public/img/emoji/black_square.png deleted file mode 100644 index 71da10de81ced24b98b721a771147c9b2e91242d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1332 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 DtwI{E diff --git a/public/img/emoji/blowfish.png b/public/img/emoji/blowfish.png deleted file mode 100644 index 1f8bde62067f520617caaf491c585b95ef1eb455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2160 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 O0000fw*WuG056;XFPsHX#s*Ku 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 diff --git a/public/img/emoji/blush.png b/public/img/emoji/blush.png deleted file mode 100644 index a94719de8ca45c0c100aacf079293c59f59359f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2986 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 diff --git a/public/img/emoji/boar.png b/public/img/emoji/boar.png deleted file mode 100644 index 7353432e0146ce789c8833183021c7824ec9d795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2974 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 U8CgVJasU7T07*qoM6N<$f*4c~lmGw# diff --git a/public/img/emoji/boat.png b/public/img/emoji/boat.png deleted file mode 100644 index 697bf5312cd392bee12be2b7ae016291ccb6bf74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2401 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 diff --git a/public/img/emoji/bomb.png b/public/img/emoji/bomb.png deleted file mode 100644 index 2e127a1c6fc8826c287ab1b1d3dc644112693cfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3002 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 diff --git a/public/img/emoji/book.png b/public/img/emoji/book.png deleted file mode 100644 index dfa6b2108db596ee3d905c0e2e566335d5efdd96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3244 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 diff --git a/public/img/emoji/books.png b/public/img/emoji/books.png deleted file mode 100644 index 00644a1d1c27a62e4bb121e101e76cfd1f89b06d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2968 zcmV;J3up9+P)12pTDLN1ioAn=?j~H%NC+3M>UEN+ujh7{3Y)g%J=31{O<}JP8RF z7am4DMWPH2844Iz7A9#-kvvbPJP$Su2LvG*Bv=z5Tu_ojOPV@No;n#w761S#cXxM5 zo;XI9H5hFaPo_LhpFBx`L{gYS5<(6kOCKOk91JlD1||at2NMGTC+5oIa*_cLIaW8NrKP?T5nx|nsj93bFLNwyA$N9mhye^S zKYTJQ52h0jd;kSj9}YBPG94{}c7V1~6*F0ASi!=p~ zod5|#PJdDk8md4*hogp)tdUn@r9ue+fS`bPv zZX!4U00-PjL_t(|0kl(visVcf{Qq;uWd$2--QCgkeSot!Na&^mBm}yXrpXf69Uq*t zF*tXe+{4_1Tz%{ATYO)A)k9aMC-UEQ;`VrIw70SQLf-pLt&P2HTyRV9o~H9&xH~mE z!njZ>ilS;1S#6DD=e@9{R27IeVTqB{{j>e!LBqJRRHVpifjEzQyN`7@_6+Iwj1CUFQt)7qBt~z7$>Z+ko!tEUH6{c{fDou1 z56-g_!38tN+|8+?H_zX{=kRg?SewM*LMj1T0Q|k2OWi&k&{y%i#WvgmhOJ~lF=#Lm z^iDIQ=MLY^iMr=`&qme|@t&a=l4y_tgYceHlQN+{)O|3Zl=F(o@Zg%3YXpO0Yvw)8 z*qC_D7$et+89J7>v#{@O-tGIG%XwasEJ7{Gp-fQ%uGB)LYK{8EPg(!RSnnJ-n4 z;3YM??Asa}2wN<57?UK02|HN(&eEQ{dA~VdD&>lZ`0JO;w$`?7hdK-~wALYdhb8?; zE4v)L+`XGmnqPm;RVZQDEhECmCYxGAkpaI@!HDTYV&MjV7Pb=Z-hDLvx>Tn#BuP*X z%4HWe+6LMNDHp>f@@esXrFr*W-fDmSxn7|=k$ekQ9jENNDA#wKO+j2H#+pR1wDM-A zeQM9=aDOAANT;X;-&e`#1VOMl9h6HF1o3_G_nUu>mIZ9vS`>y?W+p*#%q$$U;Nkc& zV=Y;#)I@wcthK27x-@QK9w+YQ{yPQt= zHmwYn0SVRTg%&K=A(`E`T5J82lDI8LK%{PtrQw8LR5dF zLjM8_|1lKlbqN=0yYh?e?HbMdPG{QpyJv-k;4r)q7K5b*p=NW9kSj~4L+9XH*R`bQ zRjNzX69TsG*u5n>=i%7_&VgG-jm2Q7sWF=Yg}*zC^!nk}1??JDnp(lKsqE)tyl+1j#Z{z!Z1pZDiE-FOGn2b#TF$| z&XC+aYifXmOeC=vrqXcUP}7;nwFd8k^gLB%sRCnDNdZ^XvF3TJh7+dSvSvt>5OAl} zTA_z!9L)X?Bsx1g^~0?TP;0fK3ZuvoI`!1;!NkP)HQrpnd~w#$45RT@|9#rj2MG{? zPFGBG^U-?nPCuqfgVq#93Q%`apniP0C~?i&_-(6wh6j1RxGYN|QQqor!dqKS$tPeV zAY!ksHs9Wkye}!(j0{04g??kux+pPz?YyPFV`tHOn$(t6K112j-z{q0PnTGGwcOKi zS~S~RC7csKN!V22o-krPRtygL;X)**%RBi(o8`x%13 z zP$&TUqCX5;0{oZx%+E#P3s7j+*ReHTSnvVHz=$>a?`F-u$a42JUU{OD0lE*>OP<_?SpFtl^E%^ut(j|MoBdP zhl~JprZ)UKxqw&qZ_SRBZgEwZ`D@d@KPFW-@9px2S#nYci}>N$k%zxdrXF@J_l76w zGSIOf*u>((s^y_UK7OtWFwo-ia^(!T>7oFgjnKx%F5v3mR@7+n zR8VlcRjI!U^Ysq!a~FpEXk9b#w6bLAN zBN_pyhi|ZF5C`*U-kI9evw1U57*J^I0d0eT1(e6~6F7y)q1hwov=l(Wc)YDE>w2cV zwr@(AIV}aXMaIGIQU0U!^#}_LM8?n-HafuH-!01D$DkljDAYD!GU#h9@}PU-bWKtK O0000Z4#8R7>M=`JJjQa0%=BHs%U@JloGTs!qy zI`>~b;Rh1n1rhUFI`UC9^Hn(PKq~1bALSSs^G`MNQ8wZS6yN|5_h3HZ2om4|5aJ9J z-vbZlBp=}i5$Pu%^dmm01)s=G4Dn&>@_FsNiy$5FY{G6@=!GABOT=w7~lgD^HewRN;2?B zG4fG1=_nxSCm-e-8unZ~?Kvpp2o&~SJ@#EZ?ma8*KP%)I816qT>@z0tN;2#@+6nCm`Yn6yy>Y;s6rm78&nHF!4z;??Nu`KrQb@ zFW>+X^H@3UIx6x_H2>&H-vAHuRXOS|BIOqu|Nr*#Pc{Gk@c;ho{iqk{A{+ny=k-}S z?mjH)FeT_E9{$BJ{@!2z|N8x{8vp{iSKIvW4~_wr>Y>^mX+ofY|?DD{6Z^ILmdC>ne}uR_?IW@KO6hDHv6L>sk~!&0001MbW%=J02_5_ z1Q8Jf1`A@bJ1|8qCW6MGpNL>TMj7xk_~)jUv(N5GJWN}f;b%=%n$E-Re^7O*uZ1{~ zZ}fuW@)o)KAB>jc)A5Vkz}8gwcDmTSsMXl@)pnuFuG+<8B=+Q?{HN{h^QG|T`O?Ei zwrWxU00qlQL_t(|0o=_cSVb`$1@KdzySv0^1$TE(6x{0Q;eA7wUdFi>?-A=CPLI%g zXT$Ygr12};{&I%@%CE=YSmJ+8=q}K`i~M0?{;BI-!H2g}P*i*RE+Ou~YdV(~%6eqE zkG0m{6xEWi5HB6sNVOdpqBP@(ORBP>&E;!EBo&4(Pv${gurl6 z8hC192@rSto=g>Wo>!40yFbs>+A*d0C!yqUVhBH1ukg-j$ z`Lufn=+ykxe}Ngah1?;ZY7mhX9v)p(jfswq_JK0PgEF-4?x#>j*&T81v2NqejjpaA zG+Dv!KH<7pVNR$}C~Rqo1{I{cx}HNBH+uguH^c{wTbD3NhP0+OHbz(1s{0rbD{QS3 zYh2xqncf8d9QFjYH6!4dbb7J}N`7}~)nan1UNMu@!j1dfycAv9!9oihn0)emN;v}*da)O*h zBof&qGC4`cNXKFyKgO;ui*QkBXlKETuAvaQ6yE?35}bJ~3Weu9d$j5D(`GvkL;+XSJH=1cFBGU4-s*;lSc)NFHk>kfMHp9@f>r z3uts+iaHnlhq2;AKz3mE#9=*KrL%%4^px&-9|xMqeg74G+sJmbnu^0M{9{SKl!-VX zDi1fk=cYNo4Tn>KnBNB$KmWV+(CHoR45}a-H?eO&@8EFncsQK>!0AI7^ZUO5dd-l2 zITwPccfVHROH_`MF989xNaN%Niz*Xkz;qyR=0q=Y!NQ8f7$8~=1XvQT0YaRx0eaXZ zn5S1)M-tJ2FlcCK;KwRsXxY%fMA!hPh6Z^YQYuOfN}NO(pu~!^%yVuKC1?P112b+( z#z;#>f(9tE<10G!Loh002ovPDHLk FV1ntZ!k+*D diff --git a/public/img/emoji/boot.png b/public/img/emoji/boot.png deleted file mode 100644 index da6a8dc890e81ef08affd028c9f1283416ea1e49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 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

3!`>Yg@ zR8S;3IKUwM`Gc;Bw-)vvotVt)YtY0buuyOr0QfqcFqTfI4=j6`sel92WgA?vqU2KY)KF7UhjbVOBve$EDre^%p8t1Gc_0t^^>^e z{kwN+OZ=pcx6`bY!!g4P7DIXjXG!lE^$gWj-)R2;19*S1Kk}_sO+7UB3eMma3xF$N z<#*kvzX~%Ssyk=^jym$qVAYD;-Q*eEVoL~b`WkTtP3FHk$ek&@d-qOK%DB<~ulWRJ z#QgqK=GgpXNvSkf1e|Q6;d2kOVN3ufA)Fn$eT_zzBdC}a%B3gge}C|wjdFl-B@YAm zGs3-Cy=cSpUHll^>Rg)1PN&*xW-;tckzA3jZ5z)#JlnQy$2oofXY8+>Pk(%{>9ODM z_L-IYE^autVZB3>LIF}5$9j0YxNqg&e&%;fZyTCE#P`S@*HO|x=cjg7{GoDI)*y-+ zjhroq{FR;K=db=w>2MU{`!D^!(`Lv+UL8ekQmrkegAibkEU$OSvSYn0?|}fpbZIRq zQIyVmh|Fle`~33J@`rG*#bRk4we^{Fa2IT0_u%5IR~HAnVFSB@X{N6|+5!VFeh6*i zlY*M}ZS^jOsa~_OoqNz{# z#@`U0$wV&-^b(Vv*8<})t|m3yZ!CHIu2%8Jf7aJpQYV`K zUBXbtyTmLG*G&K$CK^Wr+^=821&%g|FbgL2`mktT;>`@rc!vVE;3m`}3nA*F`N-oF zTBnolcE{e*?b1%C_Qc~OW)WGiqMC5)NSorLIbAMb$;yPX+fFn;vjzb5z3fE7Zq@5gn^2GIm3!3Wq z$de-kAn-bzT=wJK&$~hK%Tf$S&2;!&EFOy;FOC3bpFcl~ev8LrAUtiRf?4zDFI^(=>GSO5_^7R%z(pnrhe7FJ&@k|55Z<}9q)FS+@N{=tZy(IA zudipbgY9~{dpaDoX_Kru=SAfC50Atm6pxZ%@vtOSQxs`BN7A$?nkoV71N#kwrojKA xvB0l_Nuj)8BScDx4ig{&ie*!Un-Tb*d;#6=Q?)qgtN#E1002ovPDHLkV1ii^`F;QZ diff --git a/public/img/emoji/bowling.png b/public/img/emoji/bowling.png deleted file mode 100644 index b960f1d4c24e70a59813cc8917015a3f49b3394d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3081 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 Xi0#8F148sE00000NkvXXu0mjf!v~?E diff --git a/public/img/emoji/bowtie.png b/public/img/emoji/bowtie.png deleted file mode 100644 index 4a16f6dcece476888411ddc22ebac0383c910ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2793 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 diff --git a/public/img/emoji/boy.png b/public/img/emoji/boy.png deleted file mode 100644 index 5a29dd7d3a064b734536b0c3ae97827cbcc65728..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2976 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 diff --git a/public/img/emoji/bride_with_veil.png b/public/img/emoji/bride_with_veil.png deleted file mode 100644 index 6a8c16a8788bd56bd18cd0f0534ed144065a6649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3773 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 J)jBRw{{y`q5M%%V diff --git a/public/img/emoji/bug.png b/public/img/emoji/bug.png deleted file mode 100644 index 90703163df2125d86bb45531dbed58093ed80cd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2974 zcmcIm`8O2&7yitQS&?W^cA1R5Fj+#zzE5Kb+4r4@vF~fBtjUr!OLnr9H7a_M5F>>w zQCT8F^jf~&KjQnGbMJG`JJ}5fx~#Xd2To(kVuTK8S|-FLItLF3qiJp#0aC#GSi-8 zX5qdB)pLZE);j?xKp>FOQt*g~FwyJq*qGR$>j-Td8n;kfhyVhK0b-&IG2-YjQ4A7= z;1)nB=rNwfqDhYMjyIuU_hmF_fF%GCIAqLKgd7F}kU)Z&#>?AZXVIRMQA(po@)GVmz`_NhQW1h7az2wK1<2@vf84*@8cpKd2Ioh?1GV3#8c z81O()4}_Kh6AExk0@-cQ06I{v4TMy{z|75Fs#at^Oi`PuxCa@>0cMwt&VCBN{vJ zEN>QnTygGqg@)ZnR`!F=Np1-V=J5rJC?{fdyP^55P23}i*AreTg(_Wxfq~(gugySp zzu4VUuy@#;QH$ycg~!~x8ITLAf@QPnaf^k5zDXR`IAl$?v9*J|n~%JUhjuzAu+0Ot z{k+xgfI8g$X3Al-SZU%1X(9?5=R|+Yi?(V4-tvws!cA+iRmX;MrmrhC(-XKE;7fDk zzcyGw$P)CYm-@=jfMf_bnAlNFbWjMKUX71ekVP~|`dCMSaBQ4#Y~XcF95A!>&pxj4 zIJR`O(`lK|jy-zu)^>Wdd}3v#^7xSYbp`)&Po-e?$-+~6(IbcHKV<{f&kj}|&n2X$ z@7=jUx!XJ4@N4;7TT}27b?W5*g5&S_w~D73P1aIXG75yO8^bc~Ke2QjW&E-Fu#!3E zIPE#j!9JHXUis7@Y0yc?ak|yB#WNtq`TFg6oul+y{p;sL>V5ZmJLaVi$V6z<w9M$JX#w3uX$Xs@Ln@+`0eiwU7lxgc6Md}n(YGTl`;2N z4qn%`rlzL09yH<4VgSE+{v_1sxd`244}L^3Yj-zp=V8li`#Ff=7nW>9}=;7iD%(}IK#QMZ*f`G>onaCn@wxW#g~m)gyf!aF|%MLeiG0{C@;hA zG){eAvF(t@w6w{gS+bK?nA*veVlE;A0v_@RK&68Vkm&0FIN&E9{|m9bDtmJ5w!il7 zU3O)%k5oTAPTD_Qx$!jekit0-%Rl#4|Kle6D)pAfgn%jzM@;;jgQt^< z!6%n!^!3rVTT<4vIVjV%RpRWu-gZ;7zq?dP?^)Tx#cvRwRAyIIRdWiPoa=aB7S9$lIM_a_@2Ey8 zvZE1&;^vhlD{`uneh`8ax0^;s8`DO=Eq7GYR{t>}{mTg8kbS7buP+z#SsdyNw6KFa z9pd6+V|*%x!^Ooa_CI~ZdU~-gj6Ds*wO^BC%u~J%sYx@>EYyFOFkfY7D@o|~a4ozX zJok{M*>g1v|MsmpOm}$QXwgo}L(}Wf+bJkS*EQ&5_Mn%6;Cp|*V?MCHh0^oL&2bYa z!r18ejOl{(vFj-!TzBW^=hdfZN8udk?Qc;Td7%SF!o*KmBhJ6D7p<&vw^x>jj&^Y2BG1z>_YLs$jIl<^-Mjnvui+hSp1gb$k?&>J?whxrC35cHe>aW-PDYVwR9QhTlR*uYVjrZqkrN3~akqgY0tERmVlo1^J{q53vOcY9fV z>~o~3?~*n)N*_qdSqu;vl=LHuUT|tr%Hwnl_d~M;$nWQAb1EyDXDk0`uo)i?gDB{w zNG`^CfWA^O4mZ%!!U&Ub%P7NYVJ_pVx_v$2e>=K_*EJ=Sc^8`BbnC%t$x(cncMn1# z^cW+H_3YfF2M=7^EFJBA_v{rf#zhBw+L>t%*!=d~@D1-OIh7 zp#A&@89+OB^J!&$V|6!$OJI8r1*Yx;;J+ zas~1GwZ1-+jEQ_B@vKfS(r&-bh0{kde)n-MWsQ#R z-aQXJ-N}v+Q+75pQ_~kOOs71hO~#U99}83xtS{=FsbJ-dQjJ`}%`e&cyqO;LlIyhc zB}DptUO4%v$DoddDV>jW{`0BzzQfsoRIU#Zd49Li8_HD;bFVP8B_5J0sOS!BhMnI%XA1{Z%^0FcnEhW5kTvMpuCCK318Av{ KRO^&&qW=dmE?Rj2 diff --git a/public/img/emoji/bulb.png b/public/img/emoji/bulb.png deleted file mode 100644 index 78a62b4bc0b99c4d408a79fffabe2adb9614e0bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2631 zcmb`Ic{G#_8^#}N(-^zt{isl5OSVY%J!_1e6t6XVWXnEgNOlvc>=d$95C{Z) zT9gz6J>6v~9#$4+nTzbr1l3q8@dQUn6btg_m`#+sC>IwuF48B^Q8?z7XkNTRag@UG zoyeQw;pQUuEX0;SnoYLqNBT<~FBL9va&vQ@IKjlp$(`aVFD@dOmK0f;aV6D7#@^&? zgu}%^j3^4ldfa^ADyOQZDJdm`77-2fa)=9aZc0~a$x=!8zT|HpJXERMl%bO1DV^*n z`=8j`0$IQ=;RgBZ#vRCv|&cy(D@{ zG{fD+kVvG4hL*XxaT*q5i@65>BM^om7(Rl*LkOh65Dfx%V2A?IwxA<2c<>ztHy~;Q z4DW!4Byj5!bodOS&C&K2L24gNTY`>0LA0L`bu8II0;J3wkveGmOH^`i&eMW{A!0?< zD;V0QZsp)@#UZd82EXi+-h+D;4b88&=W6;Nn;fktfd?zicujD>;BYnuqE==3D*pN2 z0>dQeaI?36u%M*;UDx~F@z5e)`7jK6s>;45Tp2v-+Wg=fV zbi&$jF!Z}K7MBzejc zL<9{lKRpCtLe^s#F4_8#vPvw)-nGEv!&iTN9W1l$%(ntZwKlpm)|=7LxHB~20mJtk zt&L##uC>ltJvrXR!IIJD`{Ny{2bBGs4VUs`Zq|Y=Of3Os6f-@7iH@F;6UisVeBpwa ztjGLY_0xB$2X+OjSjUIkB;hM3eI?`08A5?n(F&dZPnMo5Ft|cJ3b)OsY2W?Wc)hlH zh%iEoIiy0y+$+0Kf|dJ5a}2ouAFBRec1-7g)iJjJL(t8%-CY1+W;fK;vbsmt^oSvw z-$$TNv0&X)q;Z(VXSQYbc3zf89k)Dp2jXjt9e?wz+6%wg7OHP_*6r)7>u2LBVVm$s zVmxe&z$IfbdO9=WCWgo8fWnPJYjIxTUd%Lo?4qpcd7 zpIh2;@|*))1E_ynw~RS|&v!GCuid#?DqUb5(p}sZW3X!!ej_x!*X3Ky4O}TgaKqf^Z6cY>BfBDdcVwCg?z5KY#*Y1 zYtH>?6)%UtZJboWWkvVtU-Feqp+ML6ISxj@hA$KCk7Qyq#A+nh=w&Ww1zuAvw_|=7 zsHf;&B`e;e(T(kSOkWn7TZ(vj16r&k!9B>nNpS{}ll4|}r$2RY<`B!un3kg&HQP#}_e!359 zPV;ZQOSGOHx_tREf0fM!cP14xWj;s|;CunI)N?5T1kh`8W0oaI{c@}e6L86k4(;!o zRQe{vT&`_dt#Q~CqxqNO)N9M_0MD57FXP-*&WS)bv7|K8Cb+K-^q_PFr!0yW(pcaS1NUs*2c$* zr<65xzaIKjW}0hS9zZNPlnnpql<0Hvp~ubsE^7Cc>zEiId!m7a$C?vm{??Fd1Q$}< zl|zw+g{>TxqBv2ZAElwj_t z+x^_JD!c-`3IXR6N@# zOcA$Nyr5N==`XjJu3}mpHkPEvFKnXKw7;H+?qLWZn|}`cddA}Sb+vjDqw&MBg5HQ= zodoLZpzoFHCk%al&fn>TME=YVOz+{d+HPIADfXFCU6G*?`E%l}C8e++lr}6~lzl-s z_C)3b`B)z-@+5JW{Poq|8 zin@CQnv*wU7o+T56;XJ)DdKO#v7N@=tKrDo$logr+0rh2Awch`9{GfA`Z#pm<5>r* zKBb=%L|;RVr0xBEo8fB)(xrHIliMCXs-Bg3Uu~ZWID0a6jVt!$zo=5~R*NR=$Tby@ z*O$BtX%DgfO(}mY@D@8|RV2IGQWLZ}07|YcWR=04WYLD0yTTzsn?>h-I1051ye{nu`H%~;$+A)N@ zr}tK6Mr1koSLH`?j=8Xy^;j)-;mUPUEmU$aP^Mj4IC?wsaK|IUI5`$isj(! z;?h8vr)MW}2Y3`k)czay EZ)&%9b^rhX diff --git a/public/img/emoji/bullettrain_front.png b/public/img/emoji/bullettrain_front.png deleted file mode 100644 index 1e33c38ffbb0dfdfddd89a2e98aba52f46a517d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2686 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 diff --git a/public/img/emoji/bus.png b/public/img/emoji/bus.png deleted file mode 100644 index c69e3cf35613ef9fae182b92a430f2a9666cdce7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2394 zcmV-g38nUlP)$000000000000000 z00014M>Q!B0zDW8Mm8rjA{In4BR?-9G9eX6Hxt}yB4klK-D)H7D{>HvjE?ACX`1P^|LzamM~u}55`^|uvHr~j=P^s7)yYW z07`X5a)BIcmE3V8Ha0ddFE97GJ@ewY8E22k!J_-gBt~p`nv!@fagi)*in)>iHMYUu=eM?+|R3MG7Gb@m!z?xqpzPnWpi|tl!gERJv}`$Gcz@2dCzGfxnm#g zaU)twI{At#i%AE(hiayS0KKIEuA_z%QgheQvOS&3|pHiuFjFB(f!iw_>j2hlz>%1=~qP zK~#7F?2ZMftY{oZr5m<8i0$rvA+?B&titGrqj2N(yQ$X!oTZ&2rekAzsEui2ySux) zyL_KO!_ z=eO_eRPVfI465nQz3p?bqdt7J`taLVjn3O|KU{tE!=tgIXF3lP@}*-SU-fWj=12&n z2|?Q7V;F`nieV_*CS(|bZ-QYU_(%qk&bfhVx_Oh!gXWuxAebiTR9I2MQy``(2+Eu0 zgD`!f2$#YHcB!Cz;#xCZ^#XS`YRewoXLl%| zJ+Ozo6(F4`66E}lByZ&(m!!w}TS;=5mjx7c;C!tocc7^ROOkA23hj8Z1=IQo;(J6E z5cdqwLvo=cilXHPERa$`eh3ZrfVG~K)Tsm~idDi+7GZa^LEfjr-r)Ml#8vgK4$mHIqPRP>dnPQ;FK1LYu4rb4QX7aWc&Cn^Y4 z5@n8a3b?I?_CVeb1UW9~2VhzcWT~Ks8zA1ZD2j@GjL^q15bHg{R-a9Q)q0YWj?Gil zd@QX*JxOyp(jRyjO#-oDpXagjkCFF;CS+FNQRqd%K0Zh({ zdw)aV!XK*H`4x}(xQgTUjV>}l$e!3Zu{tGjLiWs-2|Ve_pMQP#{fXEKzjqqld5>;G zC5SNY65f!_hI_0{SAF~4_orYd6#xD2tGdTmfuC*|g>P?Y-*q~6!fUVo^F_wzi|a?? z*WdoQ`xG}&ym^i5M&g&xi{JQxtHs=jqoM)AKj@_2tX~z56n)pZmh}ht_ik z()yvIPOsA!J7DPaff%v*0wu)?%y{xZ77OU>Dlqf$12Hcbu)>$-fvt1EOS@Q;f~_kB zKoDfKRyWUw7={3MKxj;e=iSgkYPEm~A~d%o`h21o?t>U;Tbi*iIv|Bf_g$a0QEdKUZxvnJHQSojl(?Q~GsCU5T$^sBP zHfG&S`Oor~fUL_l;6>YTvg0&nt>{RW=t|{V9pmvhg4;Yc#OWPuBV}tvg?eujb$lF? z$+khS6Pb(RNW9`+2PK#4%3jOKx{l(LHjncWQt3bkafcw(QMWds1VM1%gXp75#L?nu zdr}mrr2M)}cN73#S^5)CQ1p?@Gvcfqao(`>Tej41x#1kCLhgyeM*xL{a3WDWw8X z8^ktr^3#vhF^tM!qDo^*gr_telH(IvwXg96*hQ%curNF=5r&ilND1)mvSEPB3HlM- z?;(m)dzjNLiVyzz<&6hmjL`wc#xrn+a M07*qoM6N<$f;JCc@c;k- diff --git a/public/img/emoji/busstop.png b/public/img/emoji/busstop.png deleted file mode 100644 index 70eec5824da1a3fa18b9d8354c6e054e551539b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1662 zcmV-^27&pBP)+J0806TH|`ugqd?d$97 zl9G~odV0_!9kd=8L_|cl9vR9Z8;6I7TU%S3o13Plrk0kLs;a8$>+1k=*8BYY0D0t~ zpr8O|zyNgX0DI`?=jV!wiYb!sX=!P=xVZ80@c?qz0AjhHpPzGcbDo}^0Asw9lasl* zxnN*mf`WqC+1a9^qK=M^p`oGQ-`|muk+2>Z&LbSD9T)cY_M93P^Yin=AsVC`7Nn%4 z#~~XdBO@|0GL#t<%OV?XZEZ$IMrLMaKR-WCPEJZnO8EHretv$r9~l61*#KFma&mG2 zd*=Xt>;P@e07{JM>FEG>-vB;!%pw~Ac;WyzXqOojsHms_QknpL>aDG+;L`}z6o;@JQ-WED+>|Nr(Vk?R0YqX1*e07r!- zh1~#9mjH6;0AaTPZ{Z(ty0x{n0B_O&R-u@fm;iCs0A8lEi?*at0009SNklT zwr$(CZQFLzIMp$W8~fdR*!)IE-+yKvuvKo|mbGivtlhE>ZM|X3HX{Q)B2mx4Xxo+z z@cTVGP01z{eF8zBVnR0Exd(QC$ckuAc>N3TnqW?}Is~^r8RTL;IR^=Am!Oj{`%B4W z|LHv__>+?_K^(u7bjqwfC{WT<@E^$wNqL#6a|5ZFc}W*=2QKHNPcjmm zg#nI)%nvvNXA*OZ7Y2%R6VKobT+ApbUl=Ga$+(C!aHXuVrb0^U@hnnO6*Y}zS1_Ee zRaQ0Bi9MS|tgfM|@*0NM)#`dS_sf?D)4qJ+vg@m_;tp&qtreAv3jI8_{~Q`6Ct6#& z5yR~SUy&#~z~hVO=YM&A@d#jx7V(|HAROZhk@s@-<%<7{>+9+zAHsJGgYtc#x0`Zo zbDNx8TXU?kn|I*17^DM-{o-2M<&~A?+gsxN4j;gvZ9IE}ud8=pptplI`ggBShRS^PIbfu93B0Bdc z>4+c&nD>94bf1a#3+{9H0nUB2Uto6M=_BBD-wY|BdEf9IV0d2>DZsmL{2nmA&qE3* ze3g9)$bMBo3Ml#97Xa@2C?N&t5?=*@uM%{mfcDH^&_)WVbap=nx;s^n0v$c$!oYY> z2lCzc_PK`oBK&eDj<7U(etE_6>62j+*+PI_he7(AMX#-@K(brmHokcC1M@23At4VY%MaO-Rf&C6P&Q$6LfJ$|?ao7(T*lSC(dos%iA1uuwAc<6*t%oa?#=7hZwCJT+`VhZR&2HU2iqQC$9J8&v;Y7A07*qo IM6N<$f;ZI+mH+?% diff --git a/public/img/emoji/bust_in_silhouette.png b/public/img/emoji/bust_in_silhouette.png deleted file mode 100644 index ad92287029da7165a73a1ee19a5e70879c437d8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1694 zcmV;P24VS$P)mmQQf7a5iK0_yeoPGmSoTtHE1KTc&eL|02-c{xg6I!t0bNM1WkVm3usIY?YYRc1z6a5+g}LQ!iy zPh(46c28q{I!8EAhDBL)KU8j3YlBs2dw7VTVs?>LV}Lb8 zSygC&RcL@!X@Xa5gJ*e?RceB9gq>M%i%MR1P-J~_gq==cdPrP$dW)lYilI(pcuQY+ zRcL@+agBS7qg7{qQe}HpXntODkX2`UdyS=fjH7smqhxuKd5WWTg`a16lx={SbcLRH zilc0Nn>|o#K2mKvP-!GFKQcpDJW*;sQfxm{Za-9RKvZv0W`a*-e?e7nPGWsiXoOU0 zg;i>XMOk!EWr0#=gH&jRQfGrsV}4L%fkIYsR%(Y=ZHY}{d`n<^R%?e$V0=nndP!b+ zLsoJ|T6IKNb4XoyM_hM9S8`Tth)Q01M_YDRY>7u)cvWbBO<;RVUU)=Vbx~!4M_zkh zbdpG1bw*lrK2T>?X@N{+gHdUSS8j_?WPNFety5-xP-J^qZ;MA-b3s#VHb`GOPiHnq zUO`i9KT>H!R&YgFa%O>`M_qYOXNF^Zn^tUvQ)`M|d7NB$m_AZ%VSb@eY>a)Eyk>r# zS#XSWhn^`nM>wa7bKtI7wkoVSG+wfjdlMJWy&@ZHiE6g-l?1Zj7*8 zag0`Kgh5koS#gnEa*$<$q*ZT{V11u&imhjar&n>5W`(L?cawyl!+43IZ-Sd(b(L*} zrb1O~N?mn4OJG7(a6eUTLRWBUeV2rsyK#h_i>Aw(xZjqo&P-!}f0V6RbCPL+pNgo= zMqGMCTX&eU)OnP;il4loz2^44m6NT{_R0AS0001MbW%=J06Nn7 z7$F7>76YXl2|byQ`{^!#_4Adw+IU(((lhg`&+5JT*hSmea%t*XIXrc%bsj?S)t_cs z{M-Dxv`(?TuHGB!!xD$3c$wZRVB|S+nZrffidQ7G?fkv2UCfhL$(bbH;V?Pyu8<*e zt!@zj00QDkL_t(|0qxKObevfj2H-DFYI|+lwryLrf?+wfZQHDE+gRK7?)abL-Z?$a zbIcde?U;H!_2l!fzBc@Is7>?mI}UvF)la`1`0dU2-hvuD_W5UDen0=`{lEYE_o7Ab zjs`prJhbTG{#^z;gTe3^4*&7z!FS#UEO&nT#r&j)k+*Qc{J-940Sq^7Gb9;`l68j; z?|T_A+_-6hU0RN@!0_C|fUNO)&pvjgh2L$u8IWDmE@jLnIK&v#2B@x9lPN?D%Bn^{ zb-9L4u0q<-1gLr%Y169EH3I-yzmDl7qV^A(0NH6>?b8X`JG`xc>`b+ePM}kt4Cqc* z)7lAW>Qez--wqOuK-X~!AnSF8Zrx0R+3n|_1gKiPUF{tNqz+?mK-Qq?nnA=`eiV=P3ea7&(rn_g${BqhUH}-*JKHDXmf=ON zxTG0yTpE_k%B%?W0X!Fm1-vri(8YkK)f^RzidLAyX91@E;iyhe1x$AbeI{|9 zJhJ8nz}41g3ss&ch+NkbaJ4)l5()Ce;#&aM(}P@FS5x!!_OALC!1Ihdla5pK*9YK|1RiJfsfc{0E0_ zw#1x!^paVXgw~z0l;yU8O~HM23MvJ4&33`f>@?=aQo-Oe5Q zSyPYVBY|!1u5GGkhYWyfBVSOtlFqDEICaXgbn18P-L6u-^a@mHdvTO2wR^5jJ9YB$ z39T8Y$2Dq1dHH(x!rgoHonsMA{c+x0hP(c8$ZLHw2jpD)aeUGkeA==7A!p^WSk#zf`M^02?QZ$>9Pqm oS+*2%7B3lJlO>Dc1nJi8AIJ~YRE_jSWB>pF07*qoM6N<$g6DS)JOBUy diff --git a/public/img/emoji/busts_in_silhouette.png b/public/img/emoji/busts_in_silhouette.png deleted file mode 100644 index eb0505367e6aaf79ab23a9338081fd2ba9847cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2067 zcmV+u2<-QXP)1mflp$5 zRcVHJilJ9(gjHyOdyJz?UwBn!cTHh=dyS=CagBP6qd7`mdW)kkKUHLTl5~ZhZGf3c zTy{lQa6M3KK2mKmLs%p+KRZxqK2mHvQEDzeRZ?byO=5j8Kv+LhZZbk!HAG%3J5fJW zZa`FTCN)YZHcTlvPElrpB{WJcJX9|~S203bCpAkdI#5SkcSTurK~->6X@ym4hC)_x zFhN;QWPdhBUo%8oEIU(EXoOH@fh;^yRA_}WL|idKSuj9XPGf#FLtRj0fk#_*Mp|_# zIZswD*S8a(HAuT~uYdK0`H%MYXQD|6giZ4A?F+o=?JW@+vdR1wFBr!xbNMAcoXD2jA zMp}4Ta+F6}b5d%GT5pRZFhV_0YB@`0Qe}NmWPC?ga7|!)UUZR2Ty-%-T~A?rI!$Ub zMPFEOkwsK(ZHcX9fuv-9o=jhOV0M&zmb-L^o>6FqM_qYnhN?$eaa3)PO=X2(e4a~U zfKz9FVtbosf1Zh@%Xx~TlB~{FZHqNUSv*f}TycypKw4dPnNMVcUU!{@pTlT;mT-cc zox9_6khYex)@_BR8YDA7S9nBLZ-kt?N?m?`l&w~5go>ZMbK7Mp0001MbW%=J05EYP z1_KNf92g@;b21i&^S$h_U1Iq_%}zP_VAVJL)#3iv36ga@dqjl=fRu~&Gdy|fQM$^4mGb+_KG@T>Ev z+0D8D00dV_L_t(|0qxXdU>kiL!0})0cD8LBk8Rt2W^Y%;PHH!^-NvYG+iqvuTawEu z^UHqT-}nB8ZX{#AU-Hv$fBf|dJRjRHKkK~Hb@g6n=bR<;;W>PL>DJ|r>go$uFL%|{ z{QIoKm_MiH(uJ}-)dOjH*E+f`{Wl0uR#T@881P9SCwPo6E_PJ6rNtPfwO3#K$KLdL z&zzgb&n6e<-)2MZ?U<+Z7fo2jaR8XOfweFlrc3 z7(zRu+D1?n^Nk%$kY{A>!%*xRHQJUckSh=p#Rvm5f-MC}R4m`yc4b>b5OV$Sx(ej-KYW*V#wnVBOfNVho zZ9M@^lHz2e4GSgOtab#l8M)*@?lQ2`YW#^G)fC1` z0)q%>lK%nbts@1PJ*Zxi!L$=m1lwo}tYEHM%)%2h=K-00$_AQ*pjMLK9~Oy2!wAH4 zfkMCi8zP8wIgYkVS$<-?Ev$uZKsF*}=LVv^{p@U!jpB`X4;GOsFg-`Nfk2ls1E7bN zNeD32z79ZUEsNIe#5t5Nn+`AyQHSF(gL?pliE^cM&mpXQnfy$$YH40VW<)BML@|_8NDBaE1L`t*t{3VVPL*zAc?D91xmw|(gPS= z*#vmV@pT_9HgIsL3s7@cZs+braiz+);gL7k!3?tipYdQxuLlK`R5r>T9&zzTFo9t9 zYhZ~-yiCe9iWbS=2Lp$=gGhi$uy3LZSYkKXix+Jq6^(WTqoHvJgG~XB_d5OZU$De^c56u#&*;F3>~HPSxdkJrkzmo!*=?zHra*LUN%mNH z#AcR8!9)y#3z#3c1GQgux|Z!`yjo%QSMbo^nxbL`#{gj|G#>(`K{G3Bd51BisWDkU z{sJ&i9e##`LJIb2KDGlQrypkO1<40?;Yd@@w$5H`J!@StvegVJ_FLK85pb+N*Xt|l zllL4J;cY+HTz*%dwLNSrR&YVl%9FhZVn#73JFBcbl`GT;wFp#hD+VljxrsjG z3Jt`sUGsD{CAEl(F@bbbVD<8+wSA4k8%0M02~QpH%J8G3FoCsCYt3puiV^rFtbSS< x2~;D{tbBU@nxhzCkhtm@B*vOuhnJ*VxBC)6iScZmYpDPL002ovPDHLkV1n^4fZqTB diff --git a/public/img/emoji/cactus.png b/public/img/emoji/cactus.png deleted file mode 100644 index fe7cbc097b63ba6ac0df3c8b6afa8c5b87619fe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2812 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 diff --git a/public/img/emoji/calendar.png b/public/img/emoji/calendar.png deleted file mode 100644 index cc1abe202e307e4f9c0867abcc06e5babd315821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2545 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 Hu0mjfV?mFz diff --git a/public/img/emoji/calling.png b/public/img/emoji/calling.png deleted file mode 100644 index 77cd474dc3c5f5d14011b82ac0fb46487bb06205..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2591 zcmV+)3gGpLP)b%7000000007a zt^ol7YHDf#Vz>YR04^>rB_$;Q000>q8~|^z04t;bEu{c5p#XHM0CB8NPEK50TuVz! z05qfkIHdqVrT{>g06eIpqoZ|ob)1}>qN1XjnwprHm;iCC0Bf`j4GjPQ01^@s85kK0 z3knGd2@w$y4h;6g=8X6iqJ3AN{7xne^H#avRA0Gq( z0f>l*IXOAj*48{cJQo)i1_lPh!^1N(Gebi|IyyQ50|W5z@Bn%90B-XDf%E`o@c@eU z9UUF*?d@@IZ6+orD=RDI<>ewGB7S~~v6AlajSKuuzE`@`Fz`(#} zWo4Y4oM~xkKR!N|mX_Sy+$1C<0DQ&(M!^*e2S7kTFE20Y>FF#sGOw?%Uasn>sHkIM zWsi@Kg@uL=0|5b(^`WAoUtV1#w*QHUiHnMhySuxrtgHZ6>{?k_$H&LDx3^DFPYxIu z&d$zwd3#Z+=eM`FX>W3l+W#-b`W6Wm(bLrn5D;>7b_k^ZDu>wsP38bQz5qqn0ABC_ zOwN(g^bI9A5C{|;XrW6P8=>TEk9V;*_3JI5O zY#I(4n2=63Of5b(Ft?UiG@RTgruhJ0(mtH-|9}l;SyfkahIeUrfOKqkX!5aTAxc_Z~XMSs1|EVhf*^ZXL--&^VCws>h-55}P zP&$OVUNJBLgv%(O#TyY3WXtmujO73SuqQr65;sX=&q)9Ov6q;EhJmpeEV8Nf~JNRCoc*)dg_l${E1%Kxd8~GeenMX|=+&$XxQ-ju}G^rx)fNGcz+YK4xa- zS7z>&y8*=t*ty~NH|m@He#27EXSFHUO`D|Kr{`zcziQgI8+#I#j3pA`Z{9W|voK}a zw=BWgv$Et2F6_N+dPZQz*Apc@c3qZ=6ZH$faeGE!+Se+3>jJis0z+vhv2aQF`i#K! z;d*bNc%<_3@>(4JNzVdSXV2A{_Vcfv=hWF|4p&?oBZsrr7OPX6ZdT&zybM6z)k~b- zTJ@;iww)ge&9Akq(^?En&CLMhPF>>EmD`6aG?c~tgT<2uyIQ#i15+{pQ>MI>XGQAn5bkqp& zy|G=sy!N9f^`4Z#i9dPxVILxo{_a;NNYWc_tl)XBe`ddrhba$L-#Y|6@cnVUeEP2| zDUXk3R~>rjp`VN7(Wjm|N}A=4j`_Tq?YH&&9JJ3Pt3dRJV>@vAEA1t6%100c3t3U5 zSy_%CNGmdfkeTus5kkI{q5_+uY7g{n#PvlteR*noi825{#Pbk}JV`oeh)9w|G{P6= zAz;oB@MN{xrf457TK&~2Q%g$}pHUPM1cI41Ls^Dq#7j!VgoZL3eUb`j+O)23-G=Hf z=BY5*v4U?WIV8b!@3RYznC)s1SO*jBC^aM_mGY^ zUVr@!hiOY^=c6VbFY`E;abjS@HTUEU1FjHFlk?qf7wLHOt+(F9z)LUv(q!U?3c0`p zz%}cy$;}xCfGdO$ulJ;Ao~J2_cJL-i;Y_>+Xde&Ut=`fqf*__fYep=pY|aAs=f()A$syO;CR8!R@%ig>GXVM1ul_>I9Lvh0jIFfv zHs5sP|67A^0)(O%0Dx(~zTRilAcGMT=s+(Dl8HM+s8 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 Y3l8$u{q5SJTL1t607*qoM6N<$g4`srfB*mh diff --git a/public/img/emoji/camera.png b/public/img/emoji/camera.png deleted file mode 100644 index 9922a2d2270bee3641ad29c3b8c596141ef237e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2686 zcmV-^3W4>BP)E&u=k00000002fy zQ8F+ze}RK$ZFPNujF6Y2jgy~>ij8Y;b%~3Mb9Hx-nWKx0jcspohK!dC4-yOy5`lq) zCnqO;f`Wj8gm7|nD=RBFJ3cfyKccI)thB&fVQF@JgTu?$zsAtN$JENv-En${b$yGp zy~)PT+JT9d*52xWhn2j<(5SJ!*Wc`VgORwv&6As^VP+}DHj+=CPgI8W?$k5!UuDW=Bhq%AW9w8>-=ISUcFprd(=I82#h>V}3rQ6`~%wQg~7hmf7c&Dzh=)8*;!DK(BbOo^haxP*j;&(+#2ENDVct0pN` zHA8PYRmr2Rw=Fo6I5c`rV%9T6eqomHP;R(CSD1js|9!;&mCY~|0000gbW%=J0BjIX zXa~pv91gOpTy6aX3K%R$G_T0d#j2)cklUJ@%dM(WCvuC8WKuQ)Q&r&b-y0q((CRJ9%i<2^`5!JSBTd8f^HfHZyPlmU9bIv}zAMacD z`9Htp)u%rA;Di6K@BQ?Tzxe7`zVekH|MF)){rvl7Adf)!<`ervAME3XBdS(08{0_GCdAxt)1@+{#VHxj$`}2DPxSH&X)#}KLK2Hay z&%Cqno$voJz~lTpq8t$s9Oyy%`Hz0^g-`HAY8MH1_gK}DTYKMH(_NZVQ_FTAwj?;-h|QB)qV8? zOaX!wE|F-MQo@4*MTv%nhB*_|>?Uf*Y6rC`b%xk!_=c{b?oF^;7XZI2aLauWT<|lo z=Z8mSG`#*k@;ATE>1w6L(i*d-!1NTjW;EmBd$gtj?|5J6y9 z*O19nzYMsSfLS6tYB6g5u=a31YO%JHX@S9D%r!O2c?Uh)6`7e8v-fJBx)ETT530EH*KrESq^+W4$pVlO%II`x$ev* zBlR^B!AxlWWdNa}MBm7S6jV{QZ5zdM!8tiPQUE6xd>32fd?r0duIqyt#AP7JKp$@1 z$RvW=Q~9LgkcGA3^Rb?uo>(0CaCFUOY%h8tkVfnJ`UXKzpl!?u4%uqpuDTslSI76p zVsUgEGTFw4jQSSads{0tC6^Xnu4h4pTP2dpr8>lYln5r;39q&oES$gUr|yl#jE)(aFaT|MlYeb5AUmPjPA#Gh)1C8&?bvh(IY6 zAb1$SnR?`_oH|z>xi~2TOaFfHw`YGpCe!(pFh4dUYX((h_7?*K4+0dBUAKpMWF`zk zpVieLxj51lfqy)G_Rp6~ih#c#Ta>$~;%;sF$o{$v3ebv7VS+u1+S+@n>d*L&d~gkV zpFa5Se;#<+c=G+j8e>GcK}i9^KvUBq8WiA=%wPgI_CZ zD&IAU@9+ zZb(m#`lzcarqav1&p*tc5(e~9d~3pbTp8@t5LtmG$=EnA9tw;USi#(}%#+jh+!kVD z7Mieqe%;;Oz6yO#ht7Q8g48t{%aetv%4 zel<@1M^mn@VxM%Bv?Wi+(o&9w0+LugxV&px1XRfFNM{D4uDa3D$&upd_7vVaDwfF(b4qTAeLs54gruWp2(*rb|$9QZ4z_8#m$#p+Ff&OGzvU zpwML*li8uUqUg}j=tz;P^Zg^g-t^)TP8=aN7R+$U-gyUCmB`n$2yv*9!t}}M?5*e$ z*WBFP=qTUbZ-hwVIfPg(xg5;A^A03yI?D9)uC=Vm6p3%(DIq>SK6}%X)33I_I)RFj zwab$j-z>bYM3|gR;_0+VY2ZNiKDwQ8J3XX0DOI*s(CluUEL4mOo8zGXE&0mFMVOjx zB)fYB4O3~UC=@D{CLPZYAYBg(HhnXY3_XpX4M9;mRFw@6cSxx+T57xs8VwEsoumRH zRB6ZX@T=txDk|i&ZvtP-C6C1`Y#8}PqDBqsplhzFvdomr7D zRtpbUyf`*?@#4j3qOp8R%rGyou<)|r28@i1yu6GcfGW(w12ce~Q;>snAjpJh(eev$ s;ss1VfFUTr3W)@mD@XP)CHi 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 diff --git a/public/img/emoji/card_index.png b/public/img/emoji/card_index.png deleted file mode 100644 index 25453612dfe00ed8a3e0d82b469cb7877fb899fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2901 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 diff --git a/public/img/emoji/carousel_horse.png b/public/img/emoji/carousel_horse.png deleted file mode 100644 index 7ba1fb336c8c594cbb5e944a83e5899b8a50efc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2945 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 B4NL$4 diff --git a/public/img/emoji/cat2.png b/public/img/emoji/cat2.png deleted file mode 100644 index 8a422c93588f3ae142081c120e37a6f8d6fb3e83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2794 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 diff --git a/public/img/emoji/cd.png b/public/img/emoji/cd.png deleted file mode 100644 index 221d1176dae6544de4e019813ebc45cd52e5a4a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3334 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 aV=!fExGT_NrTpxf1L*4->tM8OKK~cma{z<@ diff --git a/public/img/emoji/chart.png b/public/img/emoji/chart.png deleted file mode 100644 index 851bddafb232d88b1bd6c1034d74d49a7b575cf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2712 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 diff --git a/public/img/emoji/checkered_flag.png b/public/img/emoji/checkered_flag.png deleted file mode 100644 index ead4a68dd37d2d8d817e8452f2430e85b9ab6211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1675 zcmV;626Xv}P)_q@*CALg9mgrKBF0UB_msvx!Ef)u0(kScNHLZyle;*xMe z;=msv5J(6KP$drGP{^UQh|mIU+ES4~nlvSi9S650_S*Y@cD{KTy&7rsN$VZ92YkTq zPg+Y}?Y_^v-?PsUXYZ=9(;_Q&&YoZ)?yF&O*=FTo^$05L+0B_$i_Z}gwm;*U3+(YsJe4>G8iugh>32uzt!lh%DbIg;SFxm zAtaJ`g9%K3tcU<3A2&v|<~Q~zQeudd`X%ccmOPmybBlnE5YB!-ZD#aw_7(YEFc)n{pJ1Rd#0!MO&xmbLA#ed zlprIbhahSL0YGTeMd%TO!aWpVLji&haL_+k{oFJYanS5^p6uKohCQ(uKd6ibBjvHc zRCyW;F6uM^Bz^2#5eyKJ;ZtR&H$E1RoyJE1FiMPU@Ipa|QxPt%oO}T~v^sa`Vf9SY zfr2)$u%Q4H6${|ZB3FQm5E0UKuVCQYjZ#iyASS|40z#Tt+VqA`LLDfQHAOPOg=s#^ zGo0niJkAM@^9b{t;21yWSNxE(Jjrpk|MwG!(e?@onY|q4lRV5xKEi`^d4Q~n2@%5a zvB%kJ= zd~dLT9ejmJmRVq#8V%NYfjt<6PC|pb+~7?v^Jjc|gmh?P`&vz0YpO4rM0qB()R|yE zhau${A%+Gk)SV_B>gkpd=crsnF`1Y0OsK1iE+JOY(nf-ZabpLo#Kbw*pZO=(graCU ze~ps05iAjLIs@DZs4NdX`(blH(2+V35@)U5CTV+Z-c8l=1Sjj}m2CEbs=G_y<>+ zyND1l-FNb$*)&_yC9U1^fZS6C7nX1{9%*p+z%uIsrdm8y6F<(1w(CB1$UE zM@z4`j8LFMml`kSd!Wvb5_WTh!_09H6P)G}J&hEfai-YCEOX4$>zkkI2@GId?_-8p zMoavgi;Pntg4P69D*K{|bZ)E}$F-p@1ymj6SB4h7{m52I)h;8o{dn+gJocg#aJj0YlyoWck%cK$?9n>|~bj z@DyL*aXyvsD4$`Thj@l_{DPnIO-?bFH-YS55wV-z8(h7|EcfvMM>xnuo_12AphD*; zV<_lkmiZ0e=kJ3B%rnkwTqC4~ryoDHWZKve;$f-rC_RpHh}~2$LjBqgH>*GlO=BRbxzXIcxh^b0s<}=XB~^aM=w8$ z8-z?TM-hWsE5WBt9Wt=AXy}k-;Lelx^C^hwsa8P)7D|g&(wOM6_CUvFOYA!7-aFy#UaECQ%MPUR!!LLWEW5M=d zW@O*k!EJMunbm-JfB>I$F41Ne+o|Adnu(hUDYq%H%u4Uh+iMrsF08-$&LUBQO?@e# zn5*C^J_RZdAD0=z0RjpM&vEU!T_2vF9yb+AjOd|w^qeV}`sH`tdcF2a{jYCcqf3v7 zSfsz9vMV<0ul^RW0|a=K=y2}T#J0V2)qTMS3zLeTobZx^p#SSEBE z=OaQdH;PSytR-5P_>-Q2hiQRvzJJ@$O3W}d^fnYM_W$jN$}Is~0=5Kf3D^=K$mR;@ zB|wbbECF}ybyiuY8E=w+>wkHc*I10_(6*Wi~cK{Myd^#=!4HX6na||9?cQ8&=5_t?9 zL0~98Un5U$F+xTPS70GnY%Duc9%K_8O$QTOYbtgJ8!|NuMP3~_019dgA76wzT!1%N z2^wC3K`j6XGdc}gcs^u_Nt+fckrgSP4J)<)BCr4-p#U4402-+P9bbYsH(4E~033(_ z7Nh_hlmHl8fi$fEAAtZAjsO@xV<9zH9fklGVTCn0TOW}C7h;4wfdCj>fHpf_A3tCu zy8t7&04JFM8q5GIasU!UN)p8YC3FEBo&Xw>02+M&7Cc`cUxGVDXeZZIXmAJ~(K}RF zd^KEvI=}!Wzz;H=4k}`VLB$+9djJ}}0xPcoBfSYOLS`g+02OTj5wi;}$N(qLFiXiO zLuvsSw-hm4eK}|V5zQw>Tz@jbB0f7l4zmF!xC<cDMN({BSKCY*NB$alb_H5 zG*fph$_q863n)!iBE~pT)N_S4G76pnBim+mNe2_lF-qHehs;rGt_m!sMXk>ox+Ll?BLR;+?z49vSwC~=5;A3%B1<%n~?6y>4e6&+RXaj*!bXl zpU%(GslD5TDxm-X2kc2iK~#7Fl+p!=tXv!gaKTM#ySux)ySw|#*G1#@uEU62rKD6I z4j?6sFbpX@NXJmyois}?_5N<>#F?~yo_oF6i+E>ehsS3WhKC0PV4fx{y>POYy$LmM zGR@b1mvo1&F6Viuz%y{M zX?~tEkO3D&4ZbPq#^qa@qA2X<<|fI*?HSfU91aIaB~Af9j?1DYUDrhzfT)Qigl80z zG4Ag$867Cb*<=J>;nOm0v0IOIP1{n8kcvq1JP!oV&)>9|k9RWr?cAAckyHVh3A=O* z10lt`8l=L^-?pHr3}>^z=^)UOBq5qGo2}O4Em46AMh(VzBJfx#-q|QhI8|0Hf}~0W zk`S`m?Z6x#Ya~xm#;Tx9^Y9zyM3~tZWRCu_l*yDUtR zY1txJpa?>$3Isq_f-tYZx7my;>o8|&=l;ij$+9dMf?znrO%U84g67gO=kd?91!8qS zWvC$tzyJgvLby@BjD=w?Gk5kse5VgpeuEw<-~c4h!sp7NgaFKq_hvw`*L%+12FS+=W??prK~b;epiD#fwuz1ZAI@jmKxG zp*1fO*UQV!^MDiZWOjHv6dF#%XY|ul6d8mAm9fepglX{9m zb$PM@eS9;KNX%{eMin41a`TZMXz}4>1luF?DlpDvVAt=@U<^Pg&`G7A`)sZ zXR_H$B5Bc`8dLO%85p;r5pSyhrcm&9BuZY$oI5*w_Uzen*_FjMOFLAsn^au3fG4{< z3xZ_3E^zA94hWbW(3Y&Ba)DZ2or9h$kVS{1&EM`Jd+a8omnAtU)LzQWZD|6)pW5j< z4gx-GW4-*k4;>u9`#j5|?!2Hu z!jlaWQbJWeqXzW>~Ry~yud2c8j%3;djd&gaRU$-hp1^% z<7xLexfdf=fe3l)%!4=@?WQDA-yoy$Sk!VfD7 z^9E1CVsTUqabF)n5PdYx;qqZDZ(wlzFq1(C%?}H(7H=WsGvPrtn-2zt7y=_{oGmyA zPZaG55eH*JF#5+l|8YfezQ6?%Hj9hFKoyMq7Z>4BK-&oQI9x8D4?mg_|M!Qt-Bv8P z+D2I;ISvF+v_{N^VTJ=JUxs9v53tPPa9dR}+mXts3oJ8aE;&}@qv#O(y9G=0Qq_BE z)_mfOb_b=yJ<1{U!LH{xWjcYdQ^vQQ!7lKeGM<8O_cTS3|86Y1q=`Wcc1nyL_#>xD z+>euJ@}b=(%^{^crh0IdQ&r{P#G+4{G_gAXJM>@F?*ylh2mRNt{Win@(D@dGR|G*6 z<3y$-w)mk|E|(o=XrWX{>-m;wnH@H#%;O5HfB8jMa59 z|7-K}1#4mTd=!P0=%T%_BpG^EpgNO9Q4|E}OviT<{7&a%aNJy2n4X?C!JSpxw(m?A z=2wa+ARr`xSck1~oFUyl^YbIjk3WB6tjAZ)sSGrx7Z$9-76KT-kpbP1mWo?1Pd~nQ z@#6W%t5fEm^7QnAWfkVPR_F{eAAw{BNrE+sD_dKbdcjI5fO)uV^ogGBf(%%LMNq+1 lbc861apzSG>M!Qr*c*`B-Do4MDa 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 B-&Ozs diff --git a/public/img/emoji/chestnut.png b/public/img/emoji/chestnut.png deleted file mode 100644 index 35eacf3b5bdaba0064d21b149fe8a361db32a3f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3231 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 RZV>HPfs`uh9H$;sZ{-uU?W?(XjL^78rl z`Qzi`_V)Jl^z_`^-0JG;($dla0RiCP;Pv(O*4Ea>#>S_or_9XEx3{<2+SaadCo!gN==iy1Kfw zw6v)V42BB}$PyCb;^O7y<*KTxY;0`73k$Lb2agR6^5hTi;|kal6y)UOeSLkatE-5J zi0Io2&(F`%3=D7t1gQlD+Yk`e$qdfI46m=Rk&%y@nwp)RoZk)(eFOww0s^`Q2Gj`& z?EwMZ(F-FZBXxCklarI!*w~bXk6R;2wmwp4NjRZeGKyhOMfOP`0lmmo>e5kUrbpisK3=GZ?62lJ@ zXk7!luL!}l37L)q5fKqbHUME^VU?es%K-tgUS8V)0mDT_Z%z6j~*^jlk5fO}V5R4Y?c6KO04XryGe0000ubW%=J0Owdt zW|}V!8VE3gKH8{7uJX)wa?F{8{2jE_%jsib!|LZelJ&QWXQaxcgm>Zi(~tP*+K2gS z2AUcP000K%NklDdMDvZ5DBArKxS(Z4PU<$F_aWwe@Vj zH&=JR@7C=zM~(5XF_-qtvi||Cdw%7rRjXD$zwWOwuV3}ji&t$?NVe)1x2*UJ?T>D$ zjyl+2ZE0z2Y-zDt8=`E<53T(R{0~(}HMG?2Ic%TM;XQSY)`Pa>RZI3iZfj`SV?Wd! zi)*0ykUgT#8dbez>HbE0b8KyGFs|C#)PY0xI;(bxgompSHrh28b`|2Cp9%` zcZ5}&{J>HGkJzj==VISFf3d&6|Ki#6Z{+|ZCsk9hJ3pm9Z~YS1FRwo3XZ_g~6;((T z73Ep|=QX=_X*5YSk=o?1EFr;zmt5sl`we1`$80u>#fJS=6{pWO?>bjdlfN_f!NvV+ zHAmDFE;r z!^C=#j4z>5xm+%l8d%16iv&7x#vA27NYNg6Y_a3xGKP5s?y^9KlSpK-h(w~(j~mEW zi}YrLu)M>Tw_!p1)>od(3NusK5{HUKS1K6{rBX>}5uJc=3v?DBJhb2e`Z{Ms2;<9$ z7>4=q6f}^+KY-!wOLS7p)D)ee>GkKja0x@x?F#!OM#P44S`>H%rBpum$D>WBls*{2O|E-)%DJ zL}gewr%B5B49f5V0Rckr5TVSiw=|hT*31L=PH}Iz1qyH~dO1y&J`Mo`;RGg)2UV!3 ze333AD|GWbfG_nGXQ2SzPR@yukv>i!Hc23npojpaFVRn;7I=i2C7b33yuumz=pza{ zkf-AG78e(D%CIRB{CO}9&dCVR%opKznc1>HM*z96@AmCp4g;H3gAYV-Km>8SDSYmw z{N59z_qsp*ty778#(@C0FOJv zESrv|{MfT8pSK%k6b4l{NP_0z7f!Xj-B?1_Xfgy`%4ABoYA-U`KwmhIjx3 zD4RIa9a8}tx{n`AD@v5h0#8C|$<#S`t@HTN^rFN> z6af+(J>LEMiOUGRAv=wR{ICQ7aKP257sGj+x(eU=p!?dDp_^U9U0q$ncZNP6J^2TW z#3bVaKN^3sfHKWXcK{VQL( zlHn5o0z2~iPWt&G2w)67HFuBjlI^{#@3kCm)L!~IiwFo@$d1PMLw>g)D5K33vTaWP z%Bu}^hhhipd#v?8{fVE7#AY38k|?N2((9nbNodb9#fL-w zg#enI91TivsXV(qEW=`fHqGM^dn_3V!ZxERG~^WQp!u{ax1nyg2DCdOrShv^bD2uB zvfG=4NbPOe#!Ody$>r4xwd)&_4@TA$Xiz)4vwqdGFF#unAL=q?f=nh?XnaZd=KB}2 zgC40&$=_X2up6e}z)JXe&BkZ8hlhZ|!?$nV_SE99Szb7xP06pRiHO`;pZ7)Avu4dY zeBh;Y$hq2-$jHc@mC0L{{Z(3#ms_dTYU`69fu;T{3CRa?lk=88`q#h6dtv$V2On7W cfBkdyXZD0T;aai0)c^nh07*qoM6N<$f;+AHmH+?% diff --git a/public/img/emoji/children_crossing.png b/public/img/emoji/children_crossing.png deleted file mode 100644 index e011a0b0e7917cdb6349bac9b62f9758e376d70f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2216 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 diff --git a/public/img/emoji/christmas_tree.png b/public/img/emoji/christmas_tree.png deleted file mode 100644 index b9c9b27d8dc32074404ea36b4053520b0e7200ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2495 zcmV;w2|)IVP)*HM03k2}86E&D4geh{0VXK{B`E?nAOJ8R02v|xAu0kMDFG`Y0GMP67a{>7Edd@X z0U09zB{BghHUb?c03jv-U_J>fH32U?1W8#3L{kN5I0a2H23a}?C@BCfI|42{0%SP= zCo}>p8w4yj0ystlJxm2WNd!Ac1Y&gvc8&`(Ap|`s1W{rJU~~v+GXZ%`8frEGg+&EW zWCm|cDNkeuheraOYd4Kq4rYJ}ft(C|m<(cl2vuqZVR;EaR|QgM2P!!NM`8tPg9%Pz z23&XuI!Xj4Gy;H{4KYLmL|X+%UIlN6344_cZHEduPz7at2rWMYMOFn|at3mX3phpu zd6ElHX$DDK1uGf^Qf~%ZZU-?x1XpbbU3CbBpA3<#4p(#rGe-lMwhvfv20K*+OJ)Z( zOa(wv1U^j!plc4Oa1e{73mG8+P&5a1j|+fS3rt@Im9Y$UnF)J|0qV~HXm$dexeuSb z5D2CJaD4>-=>~<62t+IeYDfq_TLg?<4NZFj|NRmF{af9}1C^i&Y@!JND>Pt22!@#g zS6~7pkPxt^0(zbdR#XE3>NGF^d;r-f{~IFxSX*^Y3oJ+lKSKehya50CEo5y1UStAZ zcK`_2GrM;H_uGyUts6{907r8Jn_3G4{YYe$2sC8_|2|aM<_46g0(4(UOodqvhvG+R z1)Z4!V}u6O#H0V`9@fi0^VtkMd1bfy)~Gmgn+~-OoBt>`uk3)2Hn0U-9pYcFX$i>GSLO^Y!h8yj1#bR+#5#%tUBY^)s(n(0hz-G)_gH#w<&wzk_-TWj04 zZQb>?jj67_#WefNQIdI{^T+$V@7TSA=(%?9$C^d&r=R=Vvp%+JoqarW1XW|ZS zm`bGNXjlJc-P(@qL>-x<6sa&b!Uj0upNt!%RcEASCnoB&Jf-N9aJ!k|8aaE8E;}37 zC+gG7=UR zZzKU4O;%P`mja$~DR~NG?mj65%3TBGbqd&$CZko#vymKtQ771%;sYcEoX0#BStp ztTG7?hhyc+GV;UE#>JHu8hm&GPLG%r>>rEC%%MWwqR>%Y3b(bdNPAd zW@xpm*PhQkSrbfD?`2BbkXcq%mRUz3kE11<&#lW{n`QDMm?J5TRF`>c^R3Lfbn+C{ zVr2n`CMA?8FDXKj6y$f_>C7)rXH0=xFk}Km`pz{tczuE*fP_NYkYAEt$D>SAUr|v} zPvJ@c1pU~{;f-1sm!L0Hs0hN7K%vBD<>gVillqE`gHM*Hr*rW%&_t-}iy#-5*SRN8r89zD7*yJ~};-}KV;S;UuLe-#zE5JEr^o6Tl{EC>MP zV~1N>DqC8Pj3J97qrUq3%ZShH-oeL41ft#*rEJ;QsiH>K8M;8EGjasZJZa8xIhp2`A^{1UbO9H6$y+cFzjG$^#RUSkZU{aIllL%IotOBU`a&YJ*5|xI!5lDhcp~>or z@5v*PNJ-VJR%=MpP~&Ju?44NK%Ef4{wDyW`v2s*^X2 zrYg5RzOwVmFN=ZLSOEV_BQL{S#NWCdz27is-5p%r0x%(;CGQ^SZEo)Et?i1RLabDZ zG6)tHg6-{6 z15*eGTYiLN35MYW{GUQYTN?-_^9@Wm$m#W$=;8X^KbVqGpTYnD002ov JPDHLkV1n^^ROtW! diff --git a/public/img/emoji/church.png b/public/img/emoji/church.png deleted file mode 100644 index c7676247540bbb3352115d7c49250657e44c6e16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2787 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 diff --git a/public/img/emoji/cinema.png b/public/img/emoji/cinema.png deleted file mode 100644 index a18439d5554f1547247be0061dd5332cf1e2eaf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 zcmV+h3HkPkP)BAS*T`FFGhTN-jQC zBQHHIK2R?|QZ+|hG)7%LQh7N}bTCF`JWzBrMQ1NTUoJvnI7@9iQE@UtVnSGZ|NsAD zgri=5o?wBXUxA=rfS+N4p{2jsUw@uleVkc(mSlydror2zzSyb5+o!?XjH<{@Xoq8k zr0VbVp}p5?kFnk7@TS7rQ*f1VleKP>x1YM!pu5(Qugi$1#gnkinYPiIx6+BJ$7hSH zm$cAkiK%UpwU4dJWQV6^h^UmZ&z-o`g{8xUpSNg@t!t37*Wl@Fk+g=U#a(`#fuq7) zf1hZJt!9dSdV}_<-f}?+- zz+r=>ow(DDtjhHE`9*b}a+tZ<;_GLPuTN`=`1$)uV}Mq6lT~$^Crp57khQ_m<7$$( zT6>>TZjtBh^R~y+x)nvu~8Qd!D?3q{RFD{p#uOXpXeu>F~G7*;|FG!Oz{y z*W!bt!Ci>1k+98IcbrOPfv3RQPi>1*agVRX+eKY_Qg4&e-|JIxlv#qOSbwBthNW$l zxn6^(TYjNmfuZvB_GO5t-Q??Yn!Hebq+x-fRdbi#=I()^z&vM_I9iEEV0`cM_toL; zrNG)*dY!Mv-A7-BP;HaQ*5!7bzha54Ws9$2hN;`+@BRJ$vc%JPma)>^=NC6_=;-dE zy3%BdudK%1a*(ZooVB~k*NmybQh%qazRz!zv2&NTro7QZT6C4N%{)?RK2&d1bC5q( zZ9i6UO=yfoU4OXE;jF>e>F)HCtHGJB!mYp2bCj{FztL`yu|#i}i>1AsvBvK4^r^VZ z-QMQg+2JKdd9ACydxWKiqrAhw&Ct!)R$hl`ag|L}euN2w%vmckx7|_u*8P5- z000GnNkl_GM}1F*4Nbit`{85nSyl4c$#bFSIsJGZI(PC} zQgzn*_`|U&@1Jl&e+#_6<+3&lBbMOEmBL z(+&0w`^t`R&#iTBJ3fjG3^{S_)Q0Qa8UF%z?S@m=P7EOf zBOR&|cQN+`Gep=wp3%o#?4GZ3j3fgiyorjn#UH2Ou3DbhYreC!d=>j#ytX3Y9YF>L zZuc0t#VKUPDs%M0;=A|Ed$=q!z%_Wb52ON0PnE1F)iP-ggt4C9DodXMS(Qgg1>W24 zSzc7jRJ`XlM6%zH6{pQW(Q?oB_o#rDDS7?wxv5G7%q_%);I_<4rqawy)P7rAEEdzXkn?$WOKByL*#_Gj zRNzBL2W)961;DFGb#>3I2Tb4H+S21B^juuB^U&@~SKGiM&|-l*93N7F{X7J==vrEm zdlQx56xSmC`m>PT-*x2^!j-NZ`|g`&9saCEXMqvker6y7N2Ezd#8am+91RH@c832C!>++I50^vqNP~)Ql|Mz7# z56f{9Mq)9#D7i z2-Q;;yxtp_Cg=osYVyb)_+p#7uK=%;Aecr6vRXBK3~>}+d=b^~`wZ|&n$|2T@MhMm z>|NE>)x^<~dQ=Yv^b&hudo^KK_N=TosepVIM*vi-cSB9z=urU%y}%my6cvy-v*dI@ zIDN|;K)?7~JvxWL=?FpTmgwh@woDhM1pqXA4h6lj#15r8bc?TL4XhOI%f@lC8FuWr zSfAqNjdm^lc%N`39hg0Z!)8Z&svZASG8Z-u!%zT*eP~O*1{G1tyg<2*@Mf{dqHGZG z9tF!&WRr3SIV`h3@q_|U=~)PNBc^s7p@BCCV;Jq6pZ$p59?DVWW~Z@ z139%sFhU>wr-X^5<{+@~fuT{CW6sEf7$3{J0WsLop;KKC$4l-#fG@|xb=847*wbtX z%kDzPzW;fL@5gfCmLaq?Z~*@ltbDQb_VV(2)62_SshGEZ{xLYB=}?KTfm0a4han6u g!KRKLpqq#9-`)WvmS&r-ApigX07*qoM6N<$g5=kSP5=M^ diff --git a/public/img/emoji/circus_tent.png b/public/img/emoji/circus_tent.png deleted file mode 100644 index 1bdff75d72dfdaa76d2ea6d791dcc658b118b2d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2553 zcmVAv$b~G)Bh=_eR zE>=-de{5=M2?hWF0GCERg)SzUX=5s&@fCf^Y!eQ64GDJ)2XGDwbP5J}AsUWBI1h5Y zX)!CCOG0=rCwMa}h+9?NqL{z{2mPRx?e6a9=;)=TrM&B;Nbn9mHnNQ zzY7eTo15a|;<*6`uK@|CsHo-T<>~3@`>v(0udkd43EbS=zXb}s3k|dZ30nsU=I7?1 z0SN*D0Hr1!r>m^43kM+cWCm+!-*#y=x0{%Ze87AQ2D8#kuN5uPej2~N9BZe z*?4Qrg?+hJONfbx^QWG{CL8XUj@y!po1&w=sK_#O&z(D`XjcaO1-g65>wi<)TRtz>+*AL) zjGw>QOJDmRT8}@jz6an7f$@L;`Z2CN1sq!SK$ zNN^_n>Y+`K|F@&4@8Oq_eQX6VM1UccN;gxkZ?uA;0R{m3F#wMTz;GEL9hC{> zAlOQ+dzXbjCO70K))Zra_csF!8GzPcim#($eG2qJsMEtC!N!E)&Xt~0Spxo46`pda zxiG=c!`pi}h#>=HYcO36ShIu%;nKL+H0(U>;=)l<(+M1O z7usoG&FfsaTMl^Rv3gNtnRV>djJ9qL$Jm%FfY1oWXd3Y6_K{R}Dm$G6AqeKmCt^!O zMUrHBK5&{zx;@(#q$r#>QT@E(=Yvbult> z4CbXK-zN{eDq-gdnRGfBF18j)QK4mJrPgvOEiJnepJZX{0&Ocg(GmfwtAKiTo;}lm zNTgd?85to3Vqsz7A8PFn|Dc~-u(B1MP9z%a3+724dqW<02>>zE00bf(=7A|+LWE_L zLiDc@>SArE8yMIF@Y$+Qh`Z}kdBS~g3kb|`baZrbauWK)PKkx^A4dp%sg3})+mABw%b zSnT67#Tps+5!>5imzYf10FF+4QPpZdRi{eipKF8`x!i|(2amSyPpn?N`e#1 z&4pcueG3lG%bS@5fZdT79P9*v>$$RLiSn~58+|f9{G4)VJRorV5I&#B3!h@KSUNX& zd_Estf;&-B@$WzV)TW=Wnh!tw%=>^uMn?Aci$tk9EXZWINYvjCm!jfBLqB}(Zk27m zBB(xm_p{GD{eiNw^7D`V?h(juo`39lW#tb(eCD~Q9#+v-+EZZc|H9k>wIPNjwp?SN P00000NkvXXu0mjfP9Dnm diff --git a/public/img/emoji/city_sunrise.png b/public/img/emoji/city_sunrise.png deleted file mode 100644 index 4585702d06cfa07673c15d957b7dc9b0faa5a1d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3103 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 Ne%gp+SZ?4%{U7M}n;ZZD diff --git a/public/img/emoji/city_sunset.png b/public/img/emoji/city_sunset.png deleted file mode 100644 index 3fd69ebf1b4b5ee63f430639331cd60f74721a57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2815 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 diff --git a/public/img/emoji/clapper.png b/public/img/emoji/clapper.png deleted file mode 100644 index 4e654f4c936cf8a653afcdb4832349e41054df93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2587 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 diff --git a/public/img/emoji/clipboard.png b/public/img/emoji/clipboard.png deleted file mode 100644 index de77ab49aa35a301bfdba75ea7b7613b4906ae37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3012 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 diff --git a/public/img/emoji/clock1130.png b/public/img/emoji/clock1130.png deleted file mode 100644 index 415999ec838cd611aa6d68a71f53684a3ffba11c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2854 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 Ef@CIS2LJ#7 diff --git a/public/img/emoji/clock12.png b/public/img/emoji/clock12.png deleted file mode 100644 index 87b132878b701dfe1bc24596fce80766f8dbda9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2504 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 S2Z{m!0000Q;rS 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 diff --git a/public/img/emoji/clock130.png b/public/img/emoji/clock130.png deleted file mode 100644 index 90ea5b91449c2974d3664227492f7bf2cc0b73af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2837 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 diff --git a/public/img/emoji/clock2.png b/public/img/emoji/clock2.png deleted file mode 100644 index 65b3b3af0e1a2833dde63772070f1f26438374c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2595 zcmV+;3f%RHP)>!6C7L zxPOiN0sp`x0s_1j#YZq?K6=+W{9|s;RV6A;zeM zL55CFJa_nYiiV3K(b3xZPU~wM+c$GN&0OOHj&PL_+jy9L?6ua6wbhO@}1NZN*`)#DWiDooDXPjo*xdnx}BgZ99a+zw@;^s1a^u&jsJbdu~ z6wqE;`@+gcBdj3AX@=Rz7D_1|(|pXQ)Ul2z7wDn;4+XGJez+1QOSi@@0)5TtP33@Y+ z=m78W0!f&GJ;uW>_R__9RlEO9arHedG;xfjbOMGTa6%@B3mKfxF_G}_ z1OCP_wxE)|r|U)bU6+8nejM4`!U|3hW*49qXcW_ipqul#j)zX(58|W5{0s_D!C%WMk&JrQc#Isxfef-S)0%ZU5kwAnfarTP| zM70YD&{5GbL1ZBb3g6=(Q6fwQrkOYy0kxUM{!{+sgb;g=yw1*3m$w=w4-@p%&le$k4z#zM`2h{-@f?3OW$# zT+$N8Ak8*%7&d*O`ht$?>;dOEQHX8)5rZ&STH>9&G`9nC=?|CCKrb8cqEb9mGz-#o zjr6jCUK&_}Z$I*!4&1T6Vq=}CY#V97bTpu|2{lxQ11@BAjJ!@r)5d8G>Zsgw$NK+# z=5zqhcNe>A7$ZUn2F1fJL0;8Mk%{9)cJxaL5yq%tu}j$nP62N3j%tET5g`l3fn=9p zhTLbNn}a;Zn<$QBCQF1Vf>h(}!0ixl+cIBEB`OL*RA>JeUIn(r3O*+IGk+n&Vm>B? zlsAh?5CxS=N>*)Zb_npSFZYH>P=iDk9SOOZ19k}{pcI3@^Ba1pBE>~E%{riDF*b`t z4GBV&mndr;O(?Go;3r8P8oC8Hij@*ZL3#-d6O{mP!lF;G7?mFC*-sleOeDaCiAD|$ z(5T`fegd$DLwN#R5g!T}LZYuFVXlHA)SH+EN&p_d;xoFa!cQM1bg~1;ia8{kJZI0L z5+Xw-KIE184#;wif=BeKZqq@A95M3V8cxeg=@sn&*lrzQ|B`Jgxt)SXcX71`~8j4W78XGBv`}*8GZVUL%`^T z@Ze}zMI(vg@Ze_ren_IBGD@m{=sb4F*r9tX*80BDK!6MtXh<^?+?4w3xEVku#%YEQ z_a8#f>j5&cqtRXcY-E_Fm^Z}(o7{%ZICY#OO6oAG!vUn}TxEwZ)C8FLF&rM;NdFti zjFH3Szw}+c@GH%^50FzQC*K|XQ7`RWp$c(|&2m6m82K!E6Nv#DImsaLL+MFy3Q$Q5 zzFob$yK*^x2C27CGXW5g7DPW|zk!EA{KV*Ha$@K;GTKF27N}qq`|gBfYd>f}<6sg_th@61_BXiEhR&U4DrK z6mS5;P|TS3PSw?nmvJi5=4`3L4BYe)K<6Va>3z?{J|$lGC6$Xh!Yh8dtaBar zF@&2X=t#J12a0=O&Jto^A~T3aJ^$o1eSbawORkVDEqGdX+|w(#623o~MmL5>VIykfBN45H630A%WD2(DT2>-w7Y>|lx^n&vzmq7Ok#o)a>46f z2GeBn%WS{iI2pV^oJN-8X3|2694250QVpFf38EGZYFUQLG5$rjWqtqe`d>9h3eXo_ z)FmvoP@ybp*jagRMW}-1tf3hn)1*i+%}kUMpo~(|T;>aUnPMtBd3fN>+z4Z$9ZXob z0Ps-BA}jr+b+z||z8R?V6J#l2>ImVZ1R2oDkS5A7{ahtRlEiTI!_oIs1H>5T8tEJP zmyLvSCf#jgcWqoGGHD^Y*BDXq>e6 z_HQ2rUi<_prwkun6l4o7dz6V`L9?KeW|{;s;-t~BZzC44(;>w@n>vryg@7Q_h@q0f zj}HYeZe%e+kO=ZD8Ky~EnMKAYWa$_JwiJgWj?G=N;hG^Auw__qqX@Wh3y}yKot%JX z)7ptXON0*>{{f{!ttQn&%7Fj?002ovPDHLk FV1m#o#Bl%s diff --git a/public/img/emoji/clock230.png b/public/img/emoji/clock230.png deleted file mode 100644 index f12c6912af7f530416329acf7e3022ff31ecf4ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2853 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 diff --git a/public/img/emoji/clock4.png b/public/img/emoji/clock4.png deleted file mode 100644 index 948ed1a380cc8523f6cdbd6ae16d5b58f9198c9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2619 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 ix^tJR#$ND;mEQmuV@zK=-E<280000w3R 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 diff --git a/public/img/emoji/clock7.png b/public/img/emoji/clock7.png deleted file mode 100644 index d48f645d8350f54f0e83dc24184599c363df32b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2615 zcmV-73dr?|P)dzmOVOxcy--ML(p#D~Y0_M5$9JFGj$R$f;@FPe!AJg& z{#N4ip7(jq^Z&njUpssg-{9JDSNpd9dmkOx{ovk*4n1_l!l4KE4(z`7(QW;AwR6oO zLFKr+$9<3g&brlsT0b>-a3cdc8Y)Q=#ADG<6K`t&IPlrmE}+k|=({yL7u~WzX`O`fp5{pRo>wsm#AYi_p_5-7Itz!o2lax2YH99 zbnz`Vu)eSRm4W^J-CxmxyLYwxJ{;_%3yn{iri(tVL!o%&IL}co(8OxoTwsLZxhsz! zc;WvP&{w_a+2ub8vy3{9bA|P6q?+=P;zK^Bg*8Mu!!SdCp7{CE)HMsZt0N0uoB^)NmV|WC$(>jwR zVMd7JcU(0Ai4c$R5+AY&8FS;YJzMU3FHxZY?{lkeUqL7DvzP(Ez@%8n&zl zT~@%R-bGI@CCng=Y{x`}lJo|;1*3!jFv*E-c$q=M%rW!yrVkFEoL_+KePcbX~4`sf5|4)P|G-AUn5N~$1!N3;ij9{{^ye- z4tTz|(ACToVX82wAnX!U76w&>nWCA6E@gYM61crvo2Vs1m@JiqWS5}Q$Py+(Elqg) zaTf@mur7?VQ-G#WXFp8)i**WrLG z>_Z_#9V&*nDM=a)30KMK4b;-h(7sb6O;SiTP^lw>f)9DQ(*ap-R`7^k)iFUJLk<}Q z4>A-SNF;K?SQC&O-T>(2#0UcyrhqQimj?y8xj=xcUKVwCVOWqrq$%1=!Xw~9w%yT2?1`AE<8lIo(`&zZCV2j zU8EosPMDBSbY$$4Wp#lAxNI_X+eDF$1BQxSU4rbzLjus4LbXlKw^hDig4|I+B&PsL z&x%Gt6S_^LdDgT^6@v`Z#wa(_NZfIiJRIbj-Qaq*P{5pq1+plDKJP*yWOUx9hA2KZ zki-NhwNrqAL=H{Bh&lzJ&L+v?5otJz;6#wajMK^(Kfq0zQsFFs%VtQT&Nu~_*)dB1 zRmAXPGG8b}_%}f&>7a)=X2k*^MioN9MW+BGGZZ7rLSnR|Bb6+Igpd71SwNirvb&*8 zZo^Fsg{#ES2b}`+$tg$OpN1<9~j+>?&twBu|v`Aqpar&i!qCO;3ml)yv)$b zCSiXi4QKj?jK4w#3QGW{ zDp&d4H@aELWrE1g3fo(4HQCDP1t7~PZ5-hgV}Ba|CkZHY05ZfbycXO#)ET0Kv#h{` zf>t!ppi=V%K;kSNoM(us^A}zu4kaAGFcdT9y+w6(;boczw4yClnmkXOx8KbO0d(Hu zygu?&>|^Fie@W${h0wBJEE!nCU5w+V4c%@=Y#%_X=r133^T~{%(aOI#&dA?R|AvcX zOE~~08p_-`Z*Ojq${J=!Qj396xUvhW9nWu|+w>|O9O49*j}1R*j1h;@4uC`hp_-K| zo^B7V<2FXoSu6-0z2H18IR)BxTtX(qK|bN~#oCzE4@R_b|+V~kIp`(@-~E|G?E0>Dcft+n0P{knDWO70-QAVHcj9S4>9 z4jvMd%(03%?{JDMqvxNBS|$*y?2F1Q6HLYiho2n%>;$he#5!siW)=Xw3;<>sriOJ4 z@hT^{cyjph=rJaktN4pbQd~hwa_Xt{L+N{Fq_b>h9hW$dk6Nn0d2F>SZjvEJnr7B< zmDd<#%A9y(i-3 z7%XB5D(~|)LzeZU&yVggCQ8tkUDQ=9v{0`sXy4XwXMJ5gOX;BtA1RW=Ns*6g0@P4V znhSi!St3NDvj;A}o||Aww1WxPE&x0%JXm@l(rULbOna&;C@TlOau% zD~xi97zyH6qVG<=mAp)hX|9s~D*v*P@Y6&CL8|3o;|=vU`BzmpDO90gy&{3Ae2$!W zO-&~TqerHX=@H^Ym?4T*hM?>f2{*Muf}a``Pax1))8!3$7Py0+YRMx>Movv>bLv!f zGTUWDz&mu0vq7tW1NCri$@-#JFm*uX(0NDIIH Z{U7=Px^;&7@j?Iq002ovPDHLkV1jf}&yWBB diff --git a/public/img/emoji/clock730.png b/public/img/emoji/clock730.png deleted file mode 100644 index f2807de2f27b1c634b90cdf0b606cb34c06cb552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2794 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 diff --git a/public/img/emoji/clock8.png b/public/img/emoji/clock8.png deleted file mode 100644 index 74c770d891c5434631f6c00f289636ad8d501fae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2603 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 diff --git a/public/img/emoji/clock930.png b/public/img/emoji/clock930.png deleted file mode 100644 index fd35221428f989a438afbf433275d118ae79cc16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2746 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 Aa{vGU diff --git a/public/img/emoji/closed_book.png b/public/img/emoji/closed_book.png deleted file mode 100644 index 78e495bdf5a33db24fe71a42bd5c0ad297c42baa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2647 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 diff --git a/public/img/emoji/cloud.png b/public/img/emoji/cloud.png deleted file mode 100644 index 0ae82298d1c2a5e960e5d20d6873cccf918ad479..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2456 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 diff --git a/public/img/emoji/cn.png b/public/img/emoji/cn.png deleted file mode 100644 index 9c9fa81e994c5a3e73015e5a4d854f4b3d5499c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2624 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 GLjD0}n0ey> diff --git a/public/img/emoji/cold_sweat.png b/public/img/emoji/cold_sweat.png deleted file mode 100644 index 232045ffece68135b71aaa8ce4aa564c8e4f9376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2722 zcmV;T3SISyP)y8lWMo4|csNIygj`6cZ*f#lmta4k zWIPQv>Q05^yMKc|L20&YnzylNr;*a)e)cieyy^PT6Su30v&Hq?xnaA@`w&9>6-)o9wbs?OX|~7szR&%rx7_)%3iiVt zvcvNK;{~X+&i~y8>%Ky;va-X{{*hG!;kZ_YFu&9&y zz!dMkGx^9B?S2Hv*8ho71Z_6~vahEeQvJ2AnubXMw&VYLMg%;Z-?Xx+@s9>5Rqyk{ zD(1mfK^6c60a*nBXmmgW^SdSRh6LKWYns>nrQH6o!SVOb9!F@_FH_u;hJaynxj|~_ zjjH;0hq(Xm3S(%Wv*Q1{ua084?}*R)yXF7$l?bkualW5rc~b-Gr6$&{SSpOxCnSG% z!t(XZCrNexiHn?)q0N(cUu$fRz_5k0zu1(RvEq**;N8|xDFFTH7GgO83tP72tUee~ zqQ>a`PG-W&o>$EYapODRiHFkTR``0X*nVZ;}J|`kttcg+4xqRoe{TXa8=K|Jj)d8F0g>t+0000zbW%=J08=z9 zBpf{i3lvPi`$f}fhR*%n=Ml^{XQKHXpZxt~wz<`Jletv>X3P41K*_=M*pAPL(ba&Y4~ar8~8gI$8;Fav=v| z+6Oh?Z=c}%wP3m+;OHryn3PHd?aEp0Kq)EN(~+J^`KR>Y=e)Nct^TB>PX~QrLg;+L zMhrs%0EG@$2g|YU&1ESttb1?HnL~YwWSOhWmX%t!y~ksJ|7}0U zHBHxM(6t)I{_RCDG_Pzq7`sq!)ASMD6m&6mwiGZh4}6Z4E{AQJ2S<1sY~!w!jt_wT z1@k-7G>Lc81R;%bcru7bDQxFFVw!Si9t=ECsL%6*CX1`3sC6*Jik4K~&hq+(LjMau z*`y{RsmnSmMRN$1t;-=+8KE3aHS;M#OuDIn-UA!UG)U~nd_G?mIb;}i^>IYiHVl*# z<$BYjO@efJ1Ay)WyCTS#{b38WG5(y&JdBY^JvUaUqTa|@Q0ywb1$%5 z z=XHPn`R8qa{qRRc6WBRNy1SP?#R=pf zFdX~nGDb&l+&*Rift(S@O+W}de^k;zaup(hB^xvP$4my;w2{X|{nG$zwf9|+hKp6?rS=bJox zJ%)Umx(PC4H=*CPH8mf$x~;qP#O@4oqAs5!GvDnV>U;h&fqUuRJ;_8WB4_JA4IpTU z=D;l+Inf3XH2kwQmBXF-e}Po|+&!y$+@47;1rWSA z>7AOQJnM8i-LJY|H;;{N9+=HDfZAw4SF3BJ=>fqDa!w$;W0h}jY|1-jO)dpN39xbF zXTWTBFZpcaM%1fgK!UDScL-Sle9n)RCib*Ub$UA|J&h#@2)Po}UBvNIZdd7JLK*i% z5#9Nri}H4Mc22b?4}Ah?G#b_Ae5TPrzZO98jk&qMJaVT<$_eCxC-zvqt<}}umdO{3 zP`E;&P^y$FOo=uXY|w!eT3S(1kekc2ox3p&wX=F=hm~?cd`i%HP)}BIkPZ6!Knez^6d?EsJpyh4Yzjy) zbLPwz5O}bZ6g+HiATkiUGia)u&R_~7pc8nGs{qTZr(&$2-JAeH%7F+8VFW=`Rly1F z^nvO4yway{=NZ01MR%<(T>hZ8f0gA;3_8-`{m}TFA{rhlu9hm|`yafIPmmwFudY_r1D6{MFlP9&G zzCrtpfI{BGhmGeNh-aqSK6+0IsDw zT747SKg+ay@n0}f`lIRT>4VeB$xgF}#1$IvxO+K&MYaLoef>p{fY;dm$zbF`LEb1T_fQq{nQwk$eN=Yr@I05vC}C#^WPh`^hGKDzF;I{{Mni zLVFhKSspu`HY$mByVHqzRu9Z;p?>vgLpTzR<*7wPVgVxL#i`{6bWWT9JI1C&&9nWm zyfIs!nySxkEQfvOYe~1{|05w%!!yqS7ReU>(_az_4X#T#Z1sQrrQwv4gi?;|aWTeN c!kAy|Cj|IOsIsuZ+yDRo07*qoM6N<$g6hsQ3;+NC diff --git a/public/img/emoji/collision.png b/public/img/emoji/collision.png deleted file mode 100644 index d7997c44b4450196a1e8967870a5e4c147fe3cb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2439 zcmV;233&F2P)Z4#8R7>M=`JJjQa0%=BHs%U@JloGTs!qy zI`>~b;Rh1n1rhUFI`UC9^Hn(PKq~1bALSSs^G`MNQ8wZS6yN|5_h3HZ2om4|5aJ9J z-vbZlBp=}i5$Pu%^dmm01)s=G4Dn&>@_FsNiy$5FY{G6@=!GABOT=w7~lgD^HewRN;2?B zG4fG1=_nxSCm-e-8unZ~?Kvpp2o&~SJ@#EZ?ma8*KP%)I816qT>@z0tN;2#@+6nCm`Yn6yy>Y;s6rm78&nHF!4z;??Nu`KrQb@ zFW>+X^H@3UIx6x_H2>&H-vAHuRXOS|BIOqu|Nr*#Pc{Gk@c;ho{iqk{A{+ny=k-}S z?mjH)FeT_E9{$BJ{@!2z|N8x{8vp{iSKIvW4~_wr>Y>^mX+ofY|?DD{6Z^ILmdC>ne}uR_?IW@KO6hDHv6L>sk~!&0001MbW%=J02_5_ z1Q8Jf1`A@bJ1|8qCW6MGpNL>TMj7xk_~)jUv(N5GJWN}f;b%=%n$E-Re^7O*uZ1{~ zZ}fuW@)o)KAB>jc)A5Vkz}8gwcDmTSsMXl@)pnuFuG+<8B=+Q?{HN{h^QG|T`O?Ei zwrWxU00qlQL_t(|0o=_cSVb`$1@KdzySv0^1$TE(6x{0Q;eA7wUdFi>?-A=CPLI%g zXT$Ygr12};{&I%@%CE=YSmJ+8=q}K`i~M0?{;BI-!H2g}P*i*RE+Ou~YdV(~%6eqE zkG0m{6xEWi5HB6sNVOdpqBP@(ORBP>&E;!EBo&4(Pv${gurl6 z8hC192@rSto=g>Wo>!40yFbs>+A*d0C!yqUVhBH1ukg-j$ z`Lufn=+ykxe}Ngah1?;ZY7mhX9v)p(jfswq_JK0PgEF-4?x#>j*&T81v2NqejjpaA zG+Dv!KH<7pVNR$}C~Rqo1{I{cx}HNBH+uguH^c{wTbD3NhP0+OHbz(1s{0rbD{QS3 zYh2xqncf8d9QFjYH6!4dbb7J}N`7}~)nan1UNMu@!j1dfycAv9!9oihn0)emN;v}*da)O*h zBof&qGC4`cNXKFyKgO;ui*QkBXlKETuAvaQ6yE?35}bJ~3Weu9d$j5D(`GvkL;+XSJH=1cFBGU4-s*;lSc)NFHk>kfMHp9@f>r z3uts+iaHnlhq2;AKz3mE#9=*KrL%%4^px&-9|xMqeg74G+sJmbnu^0M{9{SKl!-VX zDi1fk=cYNo4Tn>KnBNB$KmWV+(CHoR45}a-H?eO&@8EFncsQK>!0AI7^ZUO5dd-l2 zITwPccfVHROH_`MF989xNaN%Niz*Xkz;qyR=0q=Y!NQ8f7$8~=1XvQT0YaRx0eaXZ zn5S1)M-tJ2FlcCK;KwRsXxY%fMA!hPh6Z^YQYuOfN}NO(pu~!^%yVuKC1?P112b+( z#z;#>f(9tE<10G!Loh002ovPDHLk FV1ntZ!k+*D diff --git a/public/img/emoji/computer.png b/public/img/emoji/computer.png deleted file mode 100644 index d4d2687627e06cfbf8aaf405ccd239d397053106..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1705 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 diff --git a/public/img/emoji/confounded.png b/public/img/emoji/confounded.png deleted file mode 100644 index 00a2f2292c3a193a3ee0737ccf4084c801f62f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3140 zcmV-K47>A*P)0ODZ)pGW{hAOPNK0lZfN=yd@i4*<(w0pDu@ z)mZ?jMF4m=0L@tf)Lj9uQ37u>0J}~ApGyGTTL9r+0M1ST;$8s0Q2@?b0>4lIX)pk! zNdVqn0N`5y;9UUWUI72UBK*7y|Je!u+=c(YAphQt{l5zT9qd29g9#0{>BLX!U*qz2K1B( z?tcaHiwXbG3;)jp|J?=u&skP51L|=E|I`Zq<)#141^l=S^_vI($U^p?68^&l|J4D8 zOa}k!2aQq(|LVK#dIkRM!vDS)|G_5z#4Y@}693u(Z9N6}s0sV582hve`KJ{1nh)t~ z0{_Q5|H2dh#v^q_2mQPc{kj)WDgyVV3IEGU{_o6uLk46x1As~g_Miyvd;|Z+4O}q= zkW>e0IRyX9OZlq_`>_oBuNnQc8<}$n|K$Sy#x{CV417ojWkCyZPZ0X93jO8|;I9K= zGz4@#29s3?{?>f#b_M?Bto+Pz`@~fL*9ZUb2mj%5{NFEuR0o4x25LqG_pk~7!W^%T z2FbGqwwee3*UG&!v`qKpD(F>Ah z2>jNJ|K5}S+>rUXO#k74`om=Z%oh2;8)Qi#(7AEAh6vW92mjX`#E}@4g$Biu8QsVy z(y9ah;9~d9U+mg%;Ic-%k~ZwXQj>BffLa%=g&Vh^L*&z9VFZ=g0000wbW%=J00$BZ z1s*#A0~j{r!*~F* zU0B1n2p^+?kNMm4GsFLV9^Gp01{i<*3M9=>&)o~>r+G>QD%z}n1h((F8Kz-@ z?0849zFDBhN8Sz*u*PP%c8j0vv$0_0Nqmu2+KiLj5U|}h30md+6q700NkUx>)heN? zhsh41GMnN-(|#JwVrj*5!uVGMap-s}5}rlVpjkh9(Wh?gI6oV5oY+k-CX6M1or{-Il4Ygck;T8lh-HSHWB+c2&((LNRzgAt(P6JcDE%B-L0Ac?~TmTl{N3Z z_5RA)-o;HdYwzs(YQ6W?R_N@=Jy`C+J-%Ni8@r#sT*osT5>(k9I&5)TJ`_E7$Z%*Tw9;!u*?E>gui?W{0Li+iE-2GYcC1f z7<2D`m0GSqfoP*mPs7K#judd5T3B69gB0!~jh9y!D4 zF__XmgrA}y@uBvV!HKaz6aWO*qurGXdnjPG~zv?!@;7o{y_NiHiOEOWZlpXyVnTeq@?f50VqTc^{9fAMJGv$q8JAKGN@)_`8UYIn|v&*4*r4| zhM_2uG$o`1QP`%L9rhqOb|3RZ4@eTwf$#M);;;Is9BUeW(FCH6W=tN{e-#<87ZgB3 zlFCufvE2?^V1{GYl7VDd0yYWsASYBBdUdj;gajKRt+XbqdZQw6L69H;QaL%WWS7Gp z)1Zr18(i!A zzuzAry#SLRAA#dFAw>U&5G`n6VkBNcwg4Fkf1g_Kf+pA*=55;pMIfO_K@L@XXWEzH zc`oDN7}XPEC=v$roSdD9$+P^VH8f&aHJGm^)err~ELpRaKR z6vUcR<2VkQ84368UE`V$3I5AKY<4Fh1Mo#!6l%2gqM?rtW|{>J_&ul*+XL>9`LP`>C2vuIlB>$pB#L4!<)A;B8ata=GadB@Qff>Ufs*1n zX^jX*Tbj#%xNcD<2ow~zkv0)gj8cqS0LGLuMNl)n$2^lJLZl*uQbJS+^oA^UFHdRm e_)U^t*!d?}VKUUVZwqh$0000EXb}Ja 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 KMNUMnLSTa8H-(-6 diff --git a/public/img/emoji/congratulations.png b/public/img/emoji/congratulations.png deleted file mode 100644 index eea351727f2594e26f7e9a91fc0c94a7d1443a98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 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 YKfRa7`!2*&3IG5A07*qoM6N<$f-IFSApigX diff --git a/public/img/emoji/cool.png b/public/img/emoji/cool.png deleted file mode 100644 index 7b756f67aab95c102ef7cf587fa45e78b2f38db1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2517 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

m(GvItv%46 z4Ffownmu2*?Urqkq%fWe41B*90kmf>wNqTGr#|-eka-mkOG&nr(Z0ZTpHYeNWDGXj zpVuO;dMz2FOxk*v3weYxp}&lWsg1tvU%sqYX$UoGz}Y>XN7|+jaUmwApN%tAJgb_} zRDI>TURSLHgH5l(*?#`2%hhyklcxG>_8unW^)^iH)K%BfzCuN{&Z)+vdMLr~v1zWk zK+*)S9=&AuaNu~4l*(6pB~BSMgwkN;=~WDz>BrR)v&m$BY2o|%5ZCjh1|^~SRvxCP zG8^p|j+D_{1^vH8&32Q7P*MuL3?zU`rP5PzB_T0why8tr zvOQ*rGvzQ~QYnwe)AInS6f-!KPKkL>8SMwCEw4692&YmF5)ufjm3Bg6t}dsJ{~<+{ zPa`oBPJ0TlI|-vim1?2LcVE_OC07*qoM6N<$f)l3ibpQYW diff --git a/public/img/emoji/copyright.png b/public/img/emoji/copyright.png deleted file mode 100644 index 38493c33fcaf95787fffd6d6f1630c93513f5a71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1579 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 diff --git a/public/img/emoji/couple.png b/public/img/emoji/couple.png deleted file mode 100644 index 11a98d0f8b12c9c84f6a9560230ddf2ef91d6656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3465 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 UV{p<~fBPh0Zfb2(XXF+4Klyt|EdT%j diff --git a/public/img/emoji/couple_with_heart.png b/public/img/emoji/couple_with_heart.png deleted file mode 100644 index 61a3066bf4c833aba59c33394cc36d1a476e83bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3164 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 diff --git a/public/img/emoji/cow.png b/public/img/emoji/cow.png deleted file mode 100644 index 2ada4f0cfcba1f34ff9e823e5d707cef8d5d7ebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2933 zcmV-*3ySoKP)#7^MK=`_4QEn5H#IUvIxSaJOIB1!I5;&uJ2-M~WkNVCcyVSeBpNd*9sm0E0002~ z`Sib*eYJ^jr*~k-p@*t_WwC{Au7GL9o`k}hfX1JNy_0&HX;Zn5b&_C9!<&Kq`18Ax zck%1w>*d}5|No+KTuwhQ&&IvQys`Q8?w^u@{P*!KEGk)2N}zCBBqSn*R6k)jBdws4 z^zZ50)63=F)z;6(mSa!Dz`H~?DAUWr$fAgjTu6USI*C|CaYZtANHO>E>v&~S%*49r z;@Wm|Z9Oq1QA|XqnTWfwq@t68b!=dskbVFB_f=3xl!S80z_zWcsgR6@c1bsaQa+?~ zUpFivu!L>Cv!>$P)TEb(mxp$Vcwe)qnvjNfN<}}yxvk;Z(Am+*zqYA?cx{-Ll9q*J zv$3uk8X8?$P-tXfyt%cXoR~*CELKQ6vxjW%=;3;AW4f-PM?pBSq?U|)Y9=2UrIdN- z;Mf2E`9mliXhATZZC6q=B)5)piGOojP(%?C5QuVJs+^60YgThzN!{1Zx2>RtcV(N8 zeRyR?#F%}mr=x&`g>G1)kadQ9Z<&jEXJJ-lPd2WAVoOR#$((^rG%!6oIE;#f#>2s< zq@J>_s8&`~%*n@QS4(hZS+=U3m4axDdt_cnGLL>|UqU;!w6l?qjy@(BRy8GTJ}8fX zZ;pFkvXObszOgJN9k7FBqo0_4Y)y=MScr8~z>jp&rip-aT!@8$2M7pmP)1@rEt7m< zyP%7yiF3iEkinsfeq2#{SWU{WnVpYpvJ*KTfZ2mu*H0000pbW%=J0RH#$ zKm;xf{!)5|?HFXaA16`NcDCB4!0qa|*@xHbHu^W^_U7jMnRmjcm2vBmz`(;>v%;DH z00;3&L_t(|0b+oHQ6S4px*lFxB#u^}2s>%o*+u%akhmg!S)B$V3h0KgvhxZE@UpX_ zYgQ03=*;R9K@t);QGRjb#PUsg!rHQYLJ9)x46H2N{5&e&V4%Xo&&|Thz%HO5#3!pQ zthcFr;>L^RCjX&lARw`TEddpgU~VK(VXdNW;>s;Dw4PHdfG8@n+IV{oQcwe4`&Nc*iyvUZ#zKw0-aL3lv>#+$vm+J(ztE;P5*9z)- zd#I(ar?z&4#cdmXo3})Gyntc$Q&r6pZ{}^=wkZ;5jrx4zB@=oDt9NVr6lNJnq3Yaa zt*z^!E)n~D(bhm@)3$BA&Ei>4_ci;Xp0{ZeFA~t}y?c6VcUu%S>77Zr5hPFAm@<{t zDj1mH)$0Qh;++2C>}SR`GqkaFey~@> z2Z&Rx8$&Z+dqzKoE=F7Rdc9$wR;yq(ICVlk*Ucv6cJpaM%(IiJ+S|NmBb3-0y%_rO zwdeGMMr`m!eZ2y$*=EFOe0ROeWa5BKE*G227h>|XVsG6ZIARcMet1zfz8MO)9oW&G zQKZ4oWxF^c%7{dHQ$3p?Fjdxpl?U3wL*KkOU6Y17!acQpOgTn#*MmJCCl4zgrvQR0 zbT-sz1$)9BLz7;X&$m91c4y2sr;rPNaI;25j#ES?HecsS)2#!J58ir3#6J>PYUDaT z+XQ}A+2Uc9m6fr`l)TGL!y05q>OOjfecD$Os_8@luKcjSWLUr;2%LJp&d9XXQoow^ zvI{nSMHV_}z@Pw1e8gW2A`oTdxClyc+UV6iS$z5nukOq#Dg1;$OLS1rp^yoGF$qKv zpoBQZ#HL|8&6(~KcxuYb=l$=bDjoQW)qPBlkZWQU3X1^%_Hlx`K!zTYHQMGAxT7-l z&U5~r(<`O8#M+eh(AX?q8xJK7`$0q(#VEXDadmPS!hg7Q<>{Vh2vfg4+NjhpVtW-f zCoLXD5aa*~-f;qY0A58YLJzaATEfsM8;^ed^uOTe{;necpmv#eVs17P+=e5RCkUtr z!M6nwH`kL^9W4dGkuLw|Px{~Yuj#WVMgg1yNXLVRhyg7cuK?YMJbciB7+eG(#?U0} zeQW&hKlXonCa0p?6VfcTOV)si!U(>#9odRL(ZN=veJhTH^RUOOF@`i@r>k;jz8xQ6 zb1p}x+m+HFwNsYVQ93R$7>r9pP{AmGgboeA>HvV^YH3iawA1OiT=UoNAV% zkS%EOs7gxEEeHb-B3oRLq+ODrV@CxTv}?}(JeI(7Y5mFoA}`z)E={sAJ9AD#AJxX`%Ps|;*J)rOGLySDMd1^;Q{YQEll#=mQCW1?T$UNs>H zNoI>m3iPcEHX{>LKFALVnGo*W#U`^SyrT)v0d*wv+Vi8y9B;$7dE#-K;%) zwr#)R`)7@`Z+DFMsehf{H^#p(v#Po!yVCRDQ%gU-jC37?AB0v?4#)lD91dzF^dNk! z3%UH$7k%BH%Iucvs?5SU2UJ?!j;F444T5eb1)A>zo&(HJ5JEXY#$eZ#xBsh)btTW* z^dH?7nAJWjBG5&5Z_J8uMsjap?B?X14u_dA9q0!|r#TaLe8a2OvykcIHPpaB07W^* zjje$(6a@k>1J!u9^?ChHm6QVyVh~6eMNKnaf*|a{fJ~})S_YJIj2$5`41++%nKQ%C zG{a}kfNlu;KtbR0Qx8? z>M2$MQGwNh=tmzR2m&L!M`Qz;WXL1CK@mYd`UnkbtPoAHTn85==Fwm)YC=w*4xrP( zr%xlOsWtd0BVDv!2PL||i-uH@ zYvXyAWyxv4Po8h%L^TxMS7wVNxm?j*svvTlB(+T=NgO8%s!LbOlWp;3{I)OJ={j&g z5T2h#5Dpx0bw>C7mSMZ4jHBUKUv=yIJ3C#II`{9_-LHDW^XUf(o`kPnd-vIy-hKDA zpA*8Me?A(MeE)3O`s0t^_x?Sq_xm5;+PcN>OKP0=c;+s*e@mo&*{|=t_t|If9sG4! zd*q*V_gxDa73C(m)Bo8Ld9fXMF|q};C*>}1P?eSRs_!wsDg80ut4UdDwgt;5s|Gc!dwIZQ)8NIg4lW@Jo3KX7JbV_8&taBfsc zLSa@-hJJf3C?+&5D=a1?DJ3LnUtMivU~_6`acO0$qo6M-Cs$2LI4>=Odv|bWV|{dT zhI@EwU|f%fg(@W^DJ3H*B_b^;Cv0S3HZLwKCM0lYWH2i!hkbc0CnZ!#LSk7}W?fl; zc657jZ+C8NZDU_)R5*@?go%E9iGO{XlaYFHZk&{ob82RKac+EbaVR7qC?g>%BqApv zAt)sxEhi>HIX5*hElol@K{+`+H8Oj2aDR7nn2K&}V_#udRf2bEY+_)DfPP$2PH$E* zbZTdrk&k|La%x{(tfixFV_qmXP(LqIn#EsJ_xS4~TKaBVa#Eq7ZplZl65Q9NT%HCa(ld1FRjoVq?wM3V_aI2jEcOoujAq0gm`t5h=h!7JDZY_IWR4CZftC1V1|N# zZDC+kMMFhCHkOf(o|A)mUNmW0SC)4{e`7kBcS3DbE%NX0)BSea0001lbW%=J02u}p z2@(te1P>M<9R4JgI_@enw@+fR_Dw@}X8xCQM9O}e^STcxBu;LWkQ))ER+6*0Ml;0 z;f}|6Q=~GvKrHz+0eH8*^4yE(isr0XxNw2&SKy_*myW;u!t<+k0|!-)@P0X7BARyy zQyeFOgt}u1XNi8r2=6a#(!!AE;K91OZ8ylIzjO-HY3~nnsUeRFMOBM7?wHRL$%MZo ziunGvqjhx@;EAP>DWpe5FWR&07MXcdbl<2 z(F|6xJbUZPn|N}OOf2L}rF_1S zyEl=X$K!E(vrwA4^}rKP!9Y3a{y08BZXuUoid`+Uw8 zY}&M9;dPs7n%=T;f#}oH#A^+?N0J&^E3mS>($;W>yEWhip+K}mSzD=8R>tRrs33%( zWXwaGOgSbKt@4np7gggZxp5DFGQj1Q0i`e9*H+qQ>@Ch5I^^eu0FJn7Q!UEM%Gwrd zz^v71Fh!7o0F-4(4vFGw90w5GyJaf(J^W=^V|rV5)X-~)hQkFggfSR~Oivt4Emv0d zN2)`94nG+H#uNm?WkwKgOdvo&kT zo|f1Z&}p?=4hj+gfDj-GC>V?h!VCs8jC$KSqRA=BE?PE6E)WQKx8KrX#SwrY2yCd< zo@gH!bm#&VX0sWF2pq>zu5(bqAOwVAm_`%Ss?R!O>f{(D($5wx5zaZsgM&B-K=o~@ zskLbXX{~`kC={yj!wdo-pc(}jhTu-k%i;t^>DU!pZu%yL@MrAwa{VE}!|`^DJ#E0= zQ`Tg)1_C-tgFyrc0t^*Y({wCG;t)&)O}oxn^(_wKuUdo>00AFPR62b9g3H24izxUo=DVt*aLAqHzR-n|z7g6@3v)`bb4U#|=T3G^*jY zfN5YbMtex^P+*1El(S&7;JbghlLY|S+TydCr#GZ0w(I zk#t|DPD7~cjTTFMdHYZ#zWE49FbdpSojKM(VKEZHO`4S#ioWl=_bl=s$uM@CwJ-vY zI+S+%xZPfxs&rWu5LjPaWHY#vhm&9!HJ!P2sqp*gMYhmtFh;tFCLNxiTjGfCSJrag z9I5I)+?|$J7$UD2Z4+^Qm{tFJJwIO?<+v-3PPJxTY^Z&gM)7FOCOZXU5nkIFez5G+W0$OYS7tXb} z56(}Pm8He^wU<7>hL}C2LJ~q7ONUY$ZBWKU4_z%BO&U(+a?RPIOXjyN?k$&=8a;ZZ z$pJXY52zgt>rXA2ue9Vb_5-Ao=V(;G+FYtRhQokF5eR}5uX%w6|z1FEd~< zDsXM^ue@zVg*58ZFbU;8j}&zqv%Y|CdxUum3hVRr@2V#S=)*Jyc7JDW-!-1)P>%Km z2;u(DJhp*HzcO8cxH7m(8zK3hFZck^N%U|-N!P9bdb|MD{H*Z1fPl1f>=+R+ox*At z45;R&(G=jQBq7+5gCCDmq9cpBW%9^X1B4(gUlq^@)W6A*E26kR3~s z?Ac*^R1T>1)~j0+=fC}BbUe&~Jo(bc=8?;=%zPmDG)%du0i3kmns7QFFqrLDwxh%v zJ{ItWm#{}Z--S@8nE^`P-2ttpw;Q)bH qQXM>uLM)7sJG+S-zyD`U|E43Xs8!aaqb?@^0000BJ@^*J3)K~Y+2zkvT&FG>UcxBj{sTUQoTR~AxV^*~co zv#|>E-!r6!3_(h$Nf7X&zK(!$a)$+!kP!dE9~1qb&D_FgWlf#AF{&aR<(j=qk0|Q5U8#Ogr!s$;RAV;(Nl0S?Tb7(1S zTC$j!*tv7MoPi8lOYDac{PNN(9n3_l{i989Hqu_2QrTxJEo+h1cgG?)YR0~)wQ*?1s?(efrcpYJw&XCh=}UR z6SmgI@7l0k&C$&61Q{6_Sy@>JFnd$h7DsvX?3R8$YiiBs zF4Erz#qQ4}_RUSqZQyV?Ot|Z(#qW=6SO)rf)>ak>2b;UMUAXkDw=YAxn;s5zCIzFt zI-8<@ZtslsJ!+>fB$kf6rhfdkx&38jGb*1xFt!vL8ah3{;dsp)1~Z&x*RC&(6*X|5 zHc!lqJ)dCU``#~Ni-t$K(yK_5OKU$SN6NT^xpdAlV|;}(@FXN_0RM{To6-xnFhjc7 zt!`{(mpAqjBUwF3orH+4H{oNW#MRHk^^}?W_YhPnHMQb>?hAHua`NKhqNDxgB3v?m zlAMrVKfxyT^ffm$zj+krNqUvYVzE4s7UcSv``!-tTy$L%p_V|%?7(3K+om7lV2c1k zFO(kwol@E36)MD$_uMO@Ey?*;2V7)0iX1hxA;LdnGZ?>_hO=Ov8ReKc|J$}H`?doB zA`dK0jU6L|mg&tx-CBo$(Z~IM;qG2Z5bNzo2^;BUf~|=3=kQq0v}y-!y39scdc z{vkfnf!e3uGjv>C^prIFr6tzq5?xt4{50 ztz||S(+BMzXM1JOx>2TDT7YA>FaS;Il8Xs8v(X4UmlP@7+MfDER>njXVd<#&^Xcaw z&rOZ9NrYo?)Xjo|(1ITi&Y-;mYi#N7qSB;pOdpgR&@$3+|Md_(wC29vsU-rX zSp3>t2U$zt4b1vQ+{L5R7c*F<_By=w;?KjuW~(SWMD6NxP08Dy1wB@?T)S7~YEamq&@HM*fR5Vj z<`5L!`Sb8M8z%YW-^7z^`2i(Xt{{3sYzZ9oZ2PaqNgy5E(zMC`vglJ^q-g*YjP9?X zEjm2G6|$dr-_uAgf@~@Kt{8YIgD=C%gQiaS*OnJuhuFX}W{z4;4AM7CZ%(z2oGo&r z`cdE)?iAiTk0Mg;4ADvEyBW^WE4&I6elV&PG`8yDZiYXQhmE7R9$8X_}70 zAB8|59qn?_bKHbf&x+0g_bPN?p}uH0(CX90+ARJp!G4g{9R?yE=)QZtt@WZI5__(^ zD?)ca%TznvwrbX$ObI*XZItO{>w{np_3&N9e2pawj=+ShaY!9Va6!(z2{mXpkaxU4 zu8z}0Dqhiuczmf7Dh@tr!Bjk=bz^v@ zqF!XFRz{+>HezBSv@iD?KCdb%GmxHt7?(ol=Odm`7t*yg4D-2BJT3AQ`T3g4R~bph+;uyi3AH}h zdu65#p5BAL|?OF15ef{Nk){1IFjwqW7b%if*MOYAE+GsFMDEIbv8|viK1YkoU~p UwGwFp7o0M{(#+Ph;R-75KLZ-@CjbBd diff --git a/public/img/emoji/crescent_moon.png b/public/img/emoji/crescent_moon.png deleted file mode 100644 index e376ef14710ec5614000993118f1f1e3dea98a15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2282 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 diff --git a/public/img/emoji/crown.png b/public/img/emoji/crown.png deleted file mode 100644 index 1feebf94a9f1aa13e455a3c6fe0c25312f8fbe64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2815 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 R57+v*000000M}&!;$Q#+0RXyH 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 P00000NkvXXu0mjfW^j!V diff --git a/public/img/emoji/cupid.png b/public/img/emoji/cupid.png deleted file mode 100644 index 9fde890a3fd6a92dbbcc33a0bfc02401da65b775..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2805 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

l@F~dpH*!;z VQQ6!$`RDxrurRYRrI>gn{ugBStQ-IU diff --git a/public/img/emoji/curly_loop.png b/public/img/emoji/curly_loop.png deleted file mode 100644 index 7dd841d006af803488abd06f754f6b05ba219b8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1129 zcmV-v1eW`WP)GrBp;(O{65DsaQ%aHT0yZMny4d=$CD@Nt$Hb!EGEf2A~t#*@GI%4)!^T1Olv0uQ;(2jdtA@=mS;z?qc!|Zc!r5ccQ`nrv0ocgujK^6s zd}9_Lb?rN2?1qPxGAkbH*#vN(d6xCFWAOD9SugvPz0E#{-|Pz3Wj#UmbC!Jwj z0utufMHroB_^;5z?#q7Lnnat}2D;81y$n~(3Mc8!$pSn>+DG3aE2)Y~%z=f(tEnSWK4E`{{PNkK8u3;qIaPS%+!f!|L?8 zh4u++%~ybZb(J-q8zCml&QQwUq{Dd&aC(p~D&on3TI}Oulz!rT;j;I3~Pg8yEYTDQe^^#4y)|UeD)tM=^Bk7f&SN*)Lz-hVMj~%edHsxJ~ zx2t;8R`?dr@v$oPdn>+k`YWnX;Z?Q*JG{Su7L}(NZ*;Y0%H#c(<0QJ)V*#Z#&Qm-u z;MsbVEAsVT3v5$(lCdr~FJSr^+?)0&TyFBV1#eXbtpYn;ubZXHWy`h2TY=`xy(sOj zPtNMtMe7N??rjgWWeT`|0%n0rR)L2+6%eret~?pz)9iM=25RN;q(`2Ry`BUW3uA++ z0v9S{E(<)Da&UQEs`h#ilt|ynJV|Mt%U95CIffR6Jr|IVSkwI^M+zJ8a(T>h^rDdG zvrt^0p3a=`BNz97z^31dyaUgZPDwmXaZ`c1&t|ly`cC8r#Ep(g+fiBGvW?P+P1%R$ z_);JW;*iK~?1|izLuCj%9V(8SkY9*4;0un){}EqYU|W!tG2sn-enxz!4-3$CB-P?U zXMp&N*de|ruE#CnUi`<5F>^Eu$Y0Zx v^>0Yzx=59<1lLsD5Rp-U009C7_>cG(O9NDlw!DgR00000NkvXXu0mjfV%RIW diff --git a/public/img/emoji/currency_exchange.png b/public/img/emoji/currency_exchange.png deleted file mode 100644 index 6ebebe70afb01c3f179258d04eb9a8a22ff5b543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1959 zcmV;Y2Uz%tP)700K<-t~H)Gv1lmdG74Y?#}FbyKcDpiHVBPt&nISEt+DK)A^K_j`?{M;)V20Q<}Y zlwm*E7nptR-8Cf1l6Iso{cvy-@7laQ;V zirdlWSEpbGO1%T9ob`Eosrb^=#ykQXfbwSXMf+s>OG(Mw#?nS#n?`q2P;Jpc@(e@3R5 zr4f&9<|_6X`)TL7{NGCGd={rHV|1DGV$gF#{&)iKo2NQJHPZ`#aq}p~OCrExdfq7Q zBsXf@T6leuB1}U8%sahi;6sHRgg}~h}!HF?i zfTY+m-m9H14bgVTBN&Yrbd&H2en%O?N%E~wC>6Ig|Yt9cu@bCk?3>` zxzSsd0@_U>eyt`T*F6B^OFo;!==Y;0@O=!^=RoEk);Z$`+85;sX2`Sn62_{7^+Urgb+gLgG53kE22Jsrf_r;J~u zHyvEN0=gbYm9{_%=)!tOYubeJyn463=q*v``7xwql`rc{=AW#~HbyauAVrE&#LpSf zzQ+8YnqRQg!@p0oaGV@Ag4a^%1S_3($`ZXYwq3{W-w`;joz2dsB<6rq4QP)^k4 zYeBhFT_lnYd1Q3K9hZ-)GoJpXZ!0hBRlTaM$-f;@T9n$s%m&Fqfznsl`kOT`e zqg_@?Ew<>qe$~WL9ptx!q9=g-q=B(z@s$Gkww6crUvlW4RDt^I2KdhzXlX+lv_Ei> z#^YJLn87iuosGnFn-vg0o5V?SWamTjf|zQ~Kx%_jf`hRnzSA`NT@#(yI99(rIC93q zezF~<#kM8DhotAoB#s-&YvR3pnh9V%>|=&SQ@US&H;rQsj;a4nG#@Pi`J74fXF#H6 zqe>5xyppU+KkQhAiM;Y=iY`MI-K0RjqQ0uGsuk_8`sEb%kbVnSGV%3R*72Z}odV@Q!XsYK2H_U%1B;@| z7a|4XZi@7ENA;Vi*{?vLQYr9B5}Pep9EoNsv$R zA>~(wyEj0*y|)u#NSNmzmQE($wrJeRE6PgZd+{TJ)zNZ5TuIWbA@G_3?&jkk@AG7m zP9^D7av%YfJR^VvB8+tSb{xBzTijLrh`6Y};Q}aY{1@Vj zwWHi8dH{$nxJDzlv|j@5&pae{B!LVnW=_YKil3#LF&?TY|=S6h1Ed@mYhhzV+R~mGF9mCU{%1tFBA-N^NgsJ-i<5b_pVwF0Mu_L{=HEUq%{=kYOWF#n1xd zeTeC|2%7<-5d2ZMyC`@fMlAyO^t}y3XdXjFQIV~`AqX7n(te59gduQWp8$gh5TQ=P zF#Ma~;~{*fpRWzw)Ez*W0{i<12%@_%PBC0%@Vl+=_Tlvqy$<}H(K_1?Es?u}*8?z& z=0ONln5}(3I3B2yzG3j6ZT$;TJwOm)uL~dm0T`+>wfjCcbRvKN0T_I=Gr$&X{{VjQ z?L@!Z{P+4dhrkbmceJJ2RTF8N^at_}b{^#cJNc(6|Z#_)}L tW@oaKd&Ioow@kF})68DmYkRG2`!8X{az$TL*8>0m002ovPDHLkV1l6KvNQky diff --git a/public/img/emoji/curry.png b/public/img/emoji/curry.png deleted file mode 100644 index 1a7057500fa49525f0f6e73c1e47e11a8bf7340f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2940 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 diff --git a/public/img/emoji/cyclone.png b/public/img/emoji/cyclone.png deleted file mode 100644 index b0eb6903cd4a76aa5ea9d4bc2de182326aab9a63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2753 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 diff --git a/public/img/emoji/dango.png b/public/img/emoji/dango.png deleted file mode 100644 index daecdb25b81b4cc857e93a19b3f945310a8fc2a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2439 zcmV;233&F2P)jJi!fyXql#&ekdUD}nmTF#UveiyaR7F9c6f$XWrGih z4}6Clex$9Xdw+3RfdE{25@cg%AQ}xhX8^g5SuG$CnsGjvnVHwOi#}-pb%`mDkB@hE zcPSJUfJt{%07Y(YZitA8g8+AG09}Oud#OsHYLx`|`1thn^yla2($doW{QUp_|LW@M z*Vos1qXvt%4&2<_O^N`$zP)y+0OjT7?d|Q(&d$ch#&V{COwXMxk z&_BiGSJ~@-2LRDl4=$;ql8pT;V>rN=|M(RP)(Ez)Dj*Imx& zmg37>!}Znk)}2^knE+Xi0Kg`+iv)jZh^-;pOwgddM#9#I%iojIOvvhN z;OTSVBw+wTasbNN%)!ONogb5Pn+L#Iw~2_1vCC;Ptlfyp2>$dH{4)IKk7yrVp8MlNY6; zu+!wEd677to2bWd!1>|$%7Vn;wuKvO05dTZtcIw}IKl4q-qnfFk(qq|-u%sK#iV&e zI!zQ!E+NRIc#e2qgEDt)0A8YzpPX!$k0XQA;;EIWU}tJ%`|aKL0000{bW%=J03IV0 z1PU4f2LcWhEIc8zJT*VDEmolZbtwG8!+&O|wf&rH*Z20~ZXU7jvcr4a?CH`>*PZ6< z{qBvVP}6vR*3`14sNjR9*~2>7!`;EY>+Vr0-v9sw$?o|P)*KHD~H+qT!%l}2N+RA!fCWq3xR8ldrI*y+@Cc4_+6p^i37=tS17 z#b|)353ck&HO{kD-4`GAv|Xym$T;cAACG2&M_0mXr}KeD!{v5f%FgiCpHHv<3i*tn^vbvG-Kwk}RkkyvI&s1?84b`Kz8wAL zYG1g&BkSABOC8+vsyzL86hL}sPxK)S^gAOJN=sYz^E~en2MXYLh2j(5mORFUCQv)eoeMYm6gZU*V7I`1RI$^antO&=}3gu*7V9s zjpkBY)``3$js-Ulky#WH91I)8(XBypms=~k)Rk=|CFhSFan#>DL}A#NI2_K(#6uiA z=iR~aKQnG?MS6O6N5(C^!$E`dtyU}+%VY3(6gP_{`53_#xF;*P6{=(U{QPIN1Rj%# zCGNzMa8@D?Pj<6(^Wp*{rf@Sn`JQ9?qetrqWIU6CBkqg^5lgfkPT>@N6knLU*mKlz zEB}|DV-4W2#2A2MQb<-S50WHpMD(p}`DE*-AAV3v##`Y5h*q2xYb7ukHUdOTN=E)k z&aL|gz*!kQGLuB&@yIkcr)fEIKmw8Q@C-OCmgI)WI1)sl(Kt>2MGS1xLU@uDhqdCZ z6c&xeBc!D0k|fE)PKN&}$Kkd|gP2y$!Y z#BCv2N8pk16j~iil2p`U28x?yGHF4YnV#l12w-7iJYil^3V}d|w2~D2{Xd&a3(NtN z&nG?Y7m7eO+t6U#5ci8)sk0xZu_Rh;(e{?pr82m_&!@;t6^RUVae)xHJ~93xo04=| zt*&V1J@W-w+1>JHsZ1dSL7|W?PBj42-a&91rf=MyoIG>pz2Xc0KjiXqg2^a)05q9=g{IS)g(d@^p8z*75rbUVY-}lJn+ib@U6Bcj>2UtOy|XdHkPCyR z8I628T__fb3qUbD7tXI9gh3NCT&@JZfGwm80Fe+rfqhT*&%>aKLF-(`goGSHj)2XF z>p%Ja#!ss;=;Cdci%QK&pi+15-COJ6> zETAOj%wD&7{+!qq9(QBcSAVxgR_6)>Q5gKz_ni213b@(mu%o(FfQaD9DSQO7RMbt=e4hsNK7axe zhio!HDDD+)m^VHGrBe{b+8Da|%R$(|khwjyU*r0RSOGr$lT@pw#S8!d002ovPDHLk FV1n?zvn2ok diff --git a/public/img/emoji/dart.png b/public/img/emoji/dart.png deleted file mode 100644 index ccbb2bf98c893535327ef125fce0ae481a24161d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2996 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 diff --git a/public/img/emoji/diamond_shape_with_a_dot_inside.png b/public/img/emoji/diamond_shape_with_a_dot_inside.png deleted file mode 100644 index aaa3969d81e09130c1f3d284fac82c0461231af4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3097 zcmV+!4CeERP)GmyX%i+*PE&a>Jzx(WH#j_6EIMLlZlDSiB|=JV z0|p8N2@pq5bOR3{S7MQ2Yo8P#IZ|Ys4Hqb9Z=X6qU`|_+NLr0?cdTY?n?Fx^1Pd2M zPIoauXg5l8K2L!{RfircL?9_YY;dA$aid9Dj7eFGVBY`1^Z%*t|4`EUvhV-8^8Z!Z z|31_Iv-1D;{{N5Z|LXhxT-W{a@Mq{r~@<=l2gNSVUEcY~1?Y`TxfA|JeEexAFfn&i``a|KPu>_zogc5GGwE%lrzVgcR`^NG6XWIHLL~|4~SZ3k>R^9(eS)8Bh`wAjiQDUSoJ8m@9 z|J(Nb8mHxU;QMTKsbg%P7p>?l!}CVm{{I3F(@9#A8=cV_wd981_B6-# zMq7{-E@wQ+^e{(u1{z3DT%AtT_onLmRhzr5>i4Pb`&`%fK2w7ehr}K?WJ=TiJ<F@fM!oU%Sz4)bUlh(KA|t z6{z89#NL>`)oYKn5oo2t>-H&0eq7V@98ri9dc7Jzdp>QNxbieb0000$bW%=J04546 z0|W*E0tGK94`O*KyV-t_+Q)n@hmK|ALd`st-9JVSN;?)dflywYy*-S44(hM>Kl z*Xqqbw71{f1K)24000PxNklg9f+L7r|$0V?(X*90w+v;tY7^9?eDkmZ4!R?&eLV;$dOaJd^6s5 zl!eJC)>ncpT*VT1ebeu(>b8E7*eD?>gw7!75|jJAPY z{88cOp5g-nW_ZL|?FZBt&$)O=JQ~g!YX-DuF$&iZ9~uC7#96GdM&r>tz{jH?JUpIx z4o2fxs6YV*9N_~4c=)yhj53NDz!g}+Sw_i>1KN5FIKs#He#5s6-coyXN2wDga7UYVL6 zvP{m%NR37))Mz3jou;fE+jCa0hEg_+^&tUlfIN#^`#UE07ImjoqVPl|DZNA8%4Mor zE(;B?gO|Y94;E-^&%xx{A5o%GiOLfYh^R;QT&A?+gTxWMH^2efa&sZ`trb*CnK(_d z#2rbRxGaULu+GPp+ZIRg+5rTxLHE%k?DOZ(x9hCUYqG?qG?U3BX5Qgjan_n*$z=XI`DaH@{UbIGk_vZ_Fc{+Q;`RQF@hyM#;12*Tp zZ1=l!+s|4boY8CfVllEj2pAyzHTp9TtY^2MyR}<(p2LP6yaa4cgY4|>!xW`GtlhS4 zjZ_VEmWW9fIMl?NZQG!tsKd9<${ILqZvpZbo3-W?Q3^&)5Imkhpyo$J@YMnVj~79x z@f>Qiw)vuLJ%{~&L08Ut*~K$jvnVSIZYxj+MM#ODpa?>mnJFbA;5+!F7KoVItUZH< zuKyMEp17WVdHnFs6cG=?@R^3gCr@5&*6W+Eo;*ouGo@(2R+O^y@bQ=Q`iZ^&<=akJ zFROT^-)2q`Wbk+y0_N5s2g7e3y#Mgw{e#zn4~8&1>{}GI*=}mK+ zwL8sxSQzfl2i_2J`Wn0%%)wkc9by0jKL}es-@H@XJa-dKkN5Chchid-WA(`MVNh6r z0G>Q`Fx+JjJ~>5#fpB$vH0Wa+7t_1Dx&`Ct-LDtQ^#&<7rx$2k8|<9Tzc`Ih2>SrBuN&Mbs>;CGPxjXR=p5j)aGa+74@^C z3X(ldAzYPQRlab~Vw&sA2>f-67r)uKt6W}?n3$M9BPt*u{jb@76&DxPYv8rOB#}rO zi;9c?nw_2y5U^@SK3r8GFWkNe8Mw6rXeeGod+qf0R@jiPczhE)ZF{Ajzl*!{cgG83yNhvtvNY?1c zmQxg^s+*}ywvPGEk&+nVESL?{fo#WBL{Ip8x;H@B92n>p{?NxlVgw8{*9!b0bC=3}QV&)4&T|0D~`XyYjKe%<2Db!QfV}X%Os*#qRUX8YBBU zR-(dYv^rfK`_ggVci&sF;I{5A7{kH4ny!6n&+m^v2|WJZ;is-`GDqO;>fRQNy>*|D ze=5DN!{xLVHzHcIwBxh1BKh{-ci-LthGB$jz##G4+lsPlm!iD=8w&>42v9L#KH-y; z^k z*w{JpDa+FVbxe}RXqpzXTetQV*t#{Ffg-a;4bVLM=}70&HP{NfphyM6_KhE>XX0!) z%#y$bT-0bMQN@2RRd8_Baf_lek%%^L%u4)VF4I&ZlN;ov zuraSiA~VrNT%ChN#Q(2#3nragT>ZVhy%BxhNTm22Y~5B9_;Xi|PbG|IJp$GJt}RXy z6DP%mE5LzrE&_c-JHq|Q4${KGYYH3`=t1^J?uZrvheZ@cVavY)ODVJwh;njKO?y?> zlgVAYaI432tBLtn;CIa@b^TRMi*gi&2ncPb2(E+;HOgW%dgMs*2rCJme<4UL6ds92 zMY$2#2s5~zI=s6ZxPD;%tMO-;0WaY3c!2@tneo@>%^I%3PMj$}Al>U4I8NqXAAd#& zd5d^L0vJFs*Rak_ojSoNIAF?MzpkE>^<8{`2@OnjO~Lm-h*9}nugV-$xhYi8pE^mh zkR(jge8>hA8E3NZmXZ1}~c6hK-|l_C|oP;^)cQ>o169iRiCpH*P`Ru=W8 z4xB2{gzZ4Cu50$s>@pn&rWW*JMH8FrR+A*QloHL;r@9pt*wNT5`jr$7(*P4dhvR;+ zxzT|uD$bDVmXd9-u))b{_V15_13;(Z`~A&uerzBwCEI6A_bU+TFddBXF+ms`H$cDC z0p}0Y=kmq?5E!qi1BaK{REm8W^mS`6oFCwv-dO+w;nk+Yr+@wRsi|L$;ryQ0ixYv6 z(o?mGvX(=^g*X&|`}cyV nvY`cRRb>|nVFNi)c3Jrw6S2_9K{&;T00000NkvXXu0mjf?dujQ diff --git a/public/img/emoji/diamonds.png b/public/img/emoji/diamonds.png deleted file mode 100644 index b301035afea6b101629567f5e5742adca5d87f85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2405 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 diff --git a/public/img/emoji/disappointed_relieved.png b/public/img/emoji/disappointed_relieved.png deleted file mode 100644 index bbd80de33c9951d47311c56c9886d4f529fbed94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3160 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 diff --git a/public/img/emoji/do_not_litter.png b/public/img/emoji/do_not_litter.png deleted file mode 100644 index bcafd8588c15d182350af2538705e89deb2d0896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2994 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 diff --git a/public/img/emoji/dog.png b/public/img/emoji/dog.png deleted file mode 100644 index 8c2402cbe6575a644d6c5711f15d7affd5318e74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3050 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 diff --git a/public/img/emoji/dog2.png b/public/img/emoji/dog2.png deleted file mode 100644 index de269fa2e84661bc61afc95258d1e3a5fc585913..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3039 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 diff --git a/public/img/emoji/dollar.png b/public/img/emoji/dollar.png deleted file mode 100644 index 745f100c23dcf43e6fcf9509eac79434e1eaeb72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2687 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 WLPZ2JPX4?!e=sp58dMWpZ~hPe2zze; diff --git a/public/img/emoji/dolphin.png b/public/img/emoji/dolphin.png deleted file mode 100644 index 1fff30ee643cbc04aeae95f35761e9ce1d99e462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2457 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 diff --git a/public/img/emoji/doughnut.png b/public/img/emoji/doughnut.png deleted file mode 100644 index 0e818962a5bcc6e2cbd293a71a45c56ed006d0f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2926 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 YuV8tw3bi#mU;qFB07*qoM6N<$f|3Q|)!Pc$xG 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 R6G8w0002ovPDHLkV1nqwNiF~Y diff --git a/public/img/emoji/dragon_face.png b/public/img/emoji/dragon_face.png deleted file mode 100644 index a638a34a4e5ee2e0d96ddb5980da5afd36a7a823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3357 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 diff --git a/public/img/emoji/dress.png b/public/img/emoji/dress.png deleted file mode 100644 index 982866eb2f846f8ed49d0f0499c814cb85a8e05f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2414 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 diff --git a/public/img/emoji/dromedary_camel.png b/public/img/emoji/dromedary_camel.png deleted file mode 100644 index f22ecc118a94befb4290c7131552e87faba1fffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)Tsq;fiWMG~ufKz>RYcta7BVJV1JBbH+= zfKDBwayo!b9g0^aiB=dGlx|pn`tt8 zNgRMp9(O_)s(C?XG!m|SL7QkYct;z#i%^bRBxg4he@h>ZTP%iECWTNVvxP~5Pa%R& zA;FGK%a~QuqF%jVuUe>B+$(K~Rg+{)MOQ>@? z<->^7q+j2>d(x?8&z@P>s%6BLQr4zm(V<+|sAJo%YRQ>Z;J0+knpfYoaj|_sz>G_; zdp@ptJf3JVlU*vumsOl(FQaWW-nDbyv24ebQnh|T+P8J!xOv;LZ{D_b-m-7ms%6@+ zZpN2X)~93Cr(@*2dE>fv)v9R2k4>v}Jgs*U+N@{dxO2UbQ@xH)l3FO|$dc*H zl-{{|;J<;}uWQblR)cxfVzkb%PZM1?! zh*Tx;)1Bzdn(5A)*tBrmw|CvHX10b&VKNZGlT^HlOU|WcCd;ie0001cbW%=J07W?= z1}zv6KMEB~Xh1T!xb)=h*WLX0{F;OC!HUMv#cb}o=gWcZ z_WJSXwDNxB%5lE{00x~&L_t(|0qvFpcr;tmfIGHr^RsR1+UEbS?Xm6o zqRE(X2C;41Hm^Oq;l*h2a8VB$b?WUtrBlFvp!`o<{&iD(TZd4mV4r`<*2c{#Ecn&G zwsmxly8bKX;ZN6p*w*oyW|ctj|5tYX?y~xWY#9IRrq#U0i_ZT%z;$^dM_b!j+ur)P zQvQm)5eK7pL$9U>KE%%&8_LZY?Qx^5rEx`%yvme5#L8Sz)3N9(5i1&i!_X2dOs!c)x z5h}sM6c&XAq0{N$CZ%fTNq2+cB%!M-@TdaEZ{OHHQ;}4b1_Oa)XfT^ir)(jHkw_e( zd2`&uP#^+_TOmX=^r?L>Sw|_eTM@K2STb_-aV{ev0Yb?_V%c38t(vhV2Lpr{ym}NV zL#;*cJ)a~Zvoq5%b2v<9N{S>&BFW608y#if=F)LE)c+aqgGZfWGYbSJh@!WZR{oWh z$x_THraCEY1TjKIAgHa9jP$MqMgk=npGr7wAR|3_RB3rK8ZJKn|8JeG<1iA@7-<#- zGgL+{Sub5*FQc|1S_d(?xs-W42+lQ-)?WF{xoTzy8jRAS=D~RtkYvc0EJ*dx`ao&R zR7uM^xtU7M$VB3kDM%!mz>n7hSiC}1;;=-h425Ssemp!n*Ts;sl~M^}i!j~NQd&}? zKq!_jvu5mGI~rldrmzx(e&0b(eT4=AH5Ff zi|z434womF7xL?IjOr{99E8PSux;%*^|0Dnp$tlDOjP30Oh_{P&p_CU9biBlV$U7% z>{(nOB;gozcs>D-#A1<&u$83KogvDDXTT4eH=>3ktUY zqAX}0PpK6*ZUJt+Y3dm8r4@^D#fuG%1*rrgs1nX0)d_kQe;U=7t<6!A3O>F90Pj!O zm;fC6h$H&A;p^**3*D35-IJ5u3q7Zh~Dyk1Q`9YiJ|U^n$B^D?TY9pIO^5wc-K)oz@v!R>tGz< zpV77Bq+{5o5WN6>gAu+D*#8MhGO-6QSe3_4-UzGoKI2|bpV*@MU_C>P1LD|Gb~{7d zFSL5?`!{Ni|8_!DzG!2@i8R06o68_QK=79rx4q}K5&;;Om#f@%Zw@ha`<5+ZX{QJ+ z@*f$uxB6yZ8J2uPNB3O9ZgyKQoi+{#Tiy@etuCFCHCH}kzYAEoWIU1IT-kSUaOO!J z4>02QNL9}nuOwyE-mDb5Ja+U4qxGSb%X_zP(4Mq2Vjn)J4BP{}u1WgH?R%=rYTDhs z+tb)$3&ZvyBqsC1UYcLc7rtiooyz*vvEu!x{Fwia;dw8RR)Zw@?r!s0c&hwY-JNj))a*hoMeCe$B-UR-mYZ1Fs>Hp+! X$d2puH4mhG00000NkvXXu0mjfCj}cC diff --git a/public/img/emoji/droplet.png b/public/img/emoji/droplet.png deleted file mode 100644 index 3751938fc956e946b7efc5ee999e7d7bcf1da6d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2282 zcmVNQ<@4>rU*!o1U7XFU9qX2tz$$NjJ3|8B_rc+CBp+yBPv|H112#q0lAz5QIj{8qdBpWObG*#5rg z|6RcS)A0XUzx<)y{%FSiWW@cs=Kss>|4+L8N45MNgUf}|{iEIfs^R~<=Kqe>{}zAD zNU!lPm)ynb|8mOxp4|SC*Z)Sc_YQ5mO1S++wf#x5@+6DV4{o@%6&d(HiI%l*IU{xO{5GM?wn?f=m3 z|0R>%Baqw@b-zuz{X41h*z*4sfzm>-_e`|&JFWOJqwXo2=^uyB7>C(KtnM~Ak>W3)>k@p= z7KGOfXuLzS{3(*w8h^zKP_znJxh9+KLaFQ#aJ?Xk(@(nl4t24y00018bW%=J02VKL z5g#Q11PBK-3J!`FDn`Gpxc!&wSmxA;LiSueIFD=iwMv9>`gAs=?;B+9r}~*B-1O_A z?7Xx6?#{!%vW7&$s>I=uGb?C!-@*Nu*ix~t&d>JYrN!D$xeogsZ~y=WJV``BRCod1 zmQ#2n-2z2#*s-0AZ5#KuZFQ<0v~9$;ZQHi(v2EKY_~x~$$204FuiAC|zYiZRt(VMi z-fZ|%f`9Jc{~h%b`3(=o#~-{z1=RNObLYmlzjy_`)AbJ@)}PjYVZr(nS)-#_L*Kq| zfm!vZMn+EE`r$>V(rPGcG$Uj5dY{z`u7O#%PK~7BsjjWCd9ez1eb>`6A|f)<1`n&h z&>Y%S)Q;S7D+Lv9n!SiX{qSH~hTFAkrM)#r%wJ?Cf4f;*9g&)v>Tst&YiODBdBfXB z(vFE!C6d(e-kSPZN)IE-_C#&9yMv^#uskH9|7f3`vI1@MBQ?juQws_T3MKBnHnSyamRD|6hL^LPr*QRkuReN0shRxxYEhZHqeL`KtR(zcP5nwOB?_2T3{)QUW)o*{ z?bx4ubnjQl1^QvdW$vXCAD0kb7Ct)eVSGqT8Ur zQ;7rSIX=Oqp@%9E&!jCVP#Q0Car}~oh41-5_hmN z-|sVI0yDq-(5H?f@9C&Fc@mP3+y1iRFhfN9IIJi+rOOus1XJH9lL-J~;?vN4KQjcQ zfcgj&;6q*{l06NBq1iimlf7gzfjyLTFu6Ed9l;csU)=W;LX(|nm>2*CLn0Gof?xua z1S(v%MZp%Z+M5?DMayNhn1nq(K701WU`Rl~ltGC}`@5f5>cH;f|9kXgiseBeF?)!) zvFu#Yo*0_9S1>ae;wC;#z7(bcyNWF@?&B-y*`9ldvCe?l+&wWQF9FjR;&PKh^Y(rM zC(tmza=0Kpy%fhk8jLQq#qcb&C5j9~esAgC=) zC?jK>Cy6D-I0#D8S%gnED!`Ug}$EI?NlrdFNXM$jl-+qE*RDCJ(@GI@^(gRi*JZf7~|7G7yT01ow^e;p2J7~|p5*eTFcagc91< z8>#(y@3=pohr>7h?`9k!6^EFUNZdQ%e zYya?QY-r+3#rWy^+%f+%7ovABo{Q{_prfj0y6No6X8%k+Ukc!lRXu8~JHOii`~Wia zmaCa=jP^KrW}+c7GSa`HxiRYO&V>exR8WX-SKTFBwrxFsFY0bUW5CG^9>WWEnJzX~ zQR0Q6XEfWubla}2JEEhb&u`lJ_d<&$bJbBwz0y?X%s1F#y3NGIWZS~E7HW$$^*~-J z^fYw;U1BhA-aG@f*>g0(=amMfrLJM53eZ&12Jv^7XA^sfB8Z-7YXATM07*qoM6N<$ Ef~a6WA^-pY diff --git a/public/img/emoji/dvd.png b/public/img/emoji/dvd.png deleted file mode 100644 index 7f413559ddfe1354ec619685d8ea6dbb601d970b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3405 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 IM6N<$g2j}uGXMYp diff --git a/public/img/emoji/earth_africa.png b/public/img/emoji/earth_africa.png deleted file mode 100644 index 7262a2d2f2e90c43e5cac67c6301d7fcd07acc5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3066 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 IM6N<$f^l)pivR!s diff --git a/public/img/emoji/earth_americas.png b/public/img/emoji/earth_americas.png deleted file mode 100644 index d8c44d50965503d0f0509ac2a18ced9ad02b125f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3193 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 I+RQWYKgzgRW&i*H diff --git a/public/img/emoji/earth_asia.png b/public/img/emoji/earth_asia.png deleted file mode 100644 index 10f728a4f803c0a6ea2eb14eb67002b46c67d2f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3315 zcmd6p=Q|q;z{L|IBoezCdyg7Xql6-AubQQDjYRFujlD++MYZOwy=oLyrB<(5incbT zM#ZL~VpX)nd*A=y{rH~eIp_EFd^yi^Qq4{EVGu3|004j)8t7R5N6r5=J@tQC+#bIV z08j(WO&;j#2beHH85o&Zft<1cxFjPp2ZR~UXXp$OxDB`|*}d#W!zIJWa^rSjKCO@n zEx#HSTneh?gu++L;r;>fAh;5{sibuo)f_Fe<636CKzwpw9x2uMIz|<&7QT>)nU&i# z;HDqmDpy(%o1$1a%IsYS64j%Zw$(_gg(#XUg_jFD!>DArHDk$ zcu%toOQ@2EaPAZzuHh!;g-qm2srW{@0vx{eQPF@SwSb!MORvZVjA>~Zqj5TmL9CGT zV*y)htpsb+oLmNNJlr~2+SeN9)y)2M9OmB+u`Odw`2uxm0_)>Js)6)6@$7{QVDo%h zISj2V8tPQX9Q%(iPA!gJ zH`DVu3rN97v}1RT?9{ieIem<5T}93wYcwy3b5_joz8t#qwk5flou_e;**TB%aqTAg z>B?!;%9+pTzG&}`6i@E_(7K~YNgZ!Wp590=Ys{p4?+@;xMU%Il=+9MPqpGg0+5ut` zifsDp^|i?WAny2d=C(ix0WdX|75Q`OhcSp1+5~)C_K0-egilGMYuu zDMuJ4iDRca7#}45Jy+en5!|w4g#T8+l|3}LZ_5!`;rCKF{hM$3ggB2CDzNX~S5l+X z=Y{CmA=%m)hyHf?z8T4)48fQ%$!9U@^A(5H5;D&`{NGzp6zGKT004cpq0YSrVZi-79M+!5 zG34E|*yd}$x|9F0ZAwv(yQZkBxTlp(+}CHR&A0Gf##ymKc4zy~>rhdJ>#MJhk+FZG za37-$V?FyDa;4hGOM8R2KA{i~al!J2^27$WHcU9OwaPYM+b|@}}2^x<;j?d0y48hs$+t7n(E#%EavC2H~+ac4rGSyxXlqE3>9nxDVEcDMFd z&Ul!zvK$h%@6(#vK@}d-NeYne{OFYGO=j zEO25tyXczwxFtL|ICzmD!rCDg9?>BRurv&NL#*d!4)(OS6#Ms8YU(Pr8A$lfoR%pW zVs>v?)0P41g|oST&DQ&Ole!#%v>VUXr*prtv$TKYb9Oe{R|`V+GY#(p7w!V9PS>SU zGi-9VlnOu*P)?g+?EEjkR6I)-zmT{I^b{-5B7QJz5N^DLwo#trAU^)po4Ci z83Ki)iafmPx43UHEHiBN|B1%~J)B5t&X?DN?=rra_V<~33r51u!%-=&TyCf7B`8jC z5u$0En)0`H3D0p05f|nt{M?F4%Q}G%S3RS!d^q+9&Bf*BQgt3wBW3Z>pqqcKa)}SL z#zHl|b>SrND8#65g%Nbh?tXASKJNALpvL6{QFr$P&6fA?M)RJ=+X8@t*g@gAo@eRB z_^(Byt^Gj%!v<+%ZPAw{RaI4?d0u(J2q=dfJv(CQDOI(t{N{I#5;rXDLW-AS`FL6)Z>>W95Rva!K;@8f-14TdLHgj@Yg1&Zs5`r%4V znc#&wk5sSmDl?}=jaZDoRDH4|0|Nty8gl_8l#)?~o5n|(*%I{cjX(Jdon;`^zyj5G z@zFK=9_MEnF`PM2j;w6sk3W>v(|&An|MKUL(O~B1?;XwXTOCRNARKozH1;@|LRmm9 zDocoQQWcx{J1)0mb*$}<4;MQfW%8@bR4mmHTc|xG5$@bRwugt9hPZq{-{@wiu>M3% zewO?**6Y)-&y$lg)6+tBtfeGpAkX&SemUrC-}6l4O$+mssnqg-$%qKnG)vV|rlEG9 zMUmH6t*vJoa~gPYAYvL1xW8)g1Jy7*Jgi;SM`y2<@K0AVD@yLQ{sm%1Ca>NUZkd_X*+XuMPK z!HZj?Yj=2&zy+2N>y_}q!)-TM@tZbK25Ei$;bBe!9b>odh4RVwFIMGYG`9UPfDH1V z&hgPvFyAFskg)hr+ivezM_FM-RCFi!i}T5oQ(WI1;)a!--BSJSa_n2OZTDF#kW{F= z+Tk2!sd!k1%-5iLUEO$m`@V4^t*9@7Fy<6c-c_((KZVLKZ6#H5#TE*iqhXXeZu@(DuCA_%D4cx$rpG9UMX0_$OBnn`VOreBZFd_8_FNBp`w{;5 zFV`(ui5MX+vVm2;4-2k$jh;zp@;5V@mvi*#b4C-4@q^Zie-pN+`i2YIT+*7$_FzVj zb$ucEtyY|SB!J)Ly0O|pS^buumzQK;{5|8WZ=pF(k)J>HV=k$f@I!^M)2Fprfpn^R zm7x!Avav;4{ER!!-ZmjiXR4TdZ~0TvjOTq`##{K6%Gal%4s8*CjLSFs2#Rr>sgZth zGNXH6hUtdElUG+gOkHhRaQcMXm&xykHd89QPFxY<<$%BsG97{ zPK-alA;Ws|``Vv)aIxmzXe}kJLizNfK~8I=*|5d4VB1xNFv=HMoHQnpB)7`;b3Z9( zYQe@SuRnY*ki+HxZkT#9Pjy$w86aEKmW{pDt diff --git a/public/img/emoji/egg.png b/public/img/emoji/egg.png deleted file mode 100644 index f4d37aecf0cf4d863c93bbe0d41f78f976161e49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3063 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 diff --git a/public/img/emoji/eight_pointed_black_star.png b/public/img/emoji/eight_pointed_black_star.png deleted file mode 100644 index e15c160b0a127bf007b547f41f30699a28c1402e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2337 zcmXX|c{mhm7eCid#3yA-MA_G5Co+s=nrtm@ZkD2ut+*y@hD0H0v87wwHq#(AmRq)4 zB*jF@mHOR&4 z36Nt2>AN7;0SZWvWDQh1K)wY51_GV{WRUPzz+-^F044zX0r~@m1Ns8iyJIaGj{x@| z;M2Vr1{eY?S77jq>phXan^!}?qU~7ij5T|3ylHh|xIaw{;{mG(m5 ztEyP4hqn!|!WQ#4W3B=w14aNw0iFSj1ym5g2Ud939HRkK0Lx799AKU@7LqUt@OM*` z1w6oi*B*VKkMF_IcM5Qg%c26>k?^`Ye&?}{1B-uK{(Af)1hYi(niAer={pKosJwOx z`n;fz3`iu-@Re$s&btGz%BeFN9v_8wF@T{$m?41aV)(=j87|1<;R<5TI@3h)wu zLjleiU_}5Y1UP&Q0!|`eqdiV@`uLM%9Os+^);Zu7X)O7|e~2(bfVE$MdrN16ue8$U zQ#^c0gok_yS+eNCrva-cffWkaV1;x~+$w-NmaI6y3NkWG(22-N16Dk+5`pIr-@IYK z1_p`1^#LxQZ5XhB-?3cj!pad|VdmlRli5i7$sYFlG{{Fp3+_9U#{ zh0W1e=8ctJcxNl>i{KxQ*hs>?M67YaTHoG1z~=KOk&$kQZooPVT?9aaH?D)JgYeQ8 zIO)K-B+kiK9CwGlQ0TUUsr|sMux}57uc`3d4_bntlt0YD`@C->YhSxsPQl+fGRkaV{B1Uh@g#czlgWI|WNL2d5fGPA64HufZnby!d97qP(AHLa zY0HP)p4w5jrm+N?b#>j!ulG}|l->Xc-*I)??M?aVb2lSeaJQU@zt(ZKggHS$WBZYxg6OV8b+`A?C3Ss-N9JROXiH16(`GJ_kr5F`Ev6WeA+vqG3G&`^ zl%WYd-G`yXG7FnB&wIt57kBkfIk;~x3*IYTXOoae+P5t~B;ks9mD=I1ruhV9Xa`@s3L*YW+5 z<0ezn^T*_bErNrWG~Y_nS_I#wUkwPRP`!tA8M9KW?G*{#Mh~A24k{SfC^BzJGsGqB zQZlp*EbG|2ETiYVWD_ZKC`zDbtMuJBxvqD``I8#q(iOd#;gDDb3j=9hGdqA#9f!>X zRyI@5tyI^|$lS2$R6nJmenD8pyXj@$yXF=4Y3fS&rtz#?%Rt{#3>o^Rb`9&%ES0!$ zws33orP2}F?0d;)hCRKfLkd0)9s1t$&vKZ6sz$EB&TEE`=@XvfE83aIJmns#)V)&7 zvX2K;H)(H$cv^})UTff8CXw0{XytZCKySwvT zj=VlrhdvqTvlGn0S73e~_9a zRa%MqGy6{`5iyZ(2MgTtAEl*@9qMKa?TqjCQ&ioYe)Yi{-N`ha4zhksztC<8vCf)P zjJ^48T+aQwG!vbM5HD@HPuH#m9x6!YDt?t+45Em(C{u6m-6CY@+AS~La=_+bcA?}s z9UohfvDCn$H+(Bno&7eD_H~LSrYBY}pC?Zo)>qn5o2=<@!P)z zR$Ug+*?gn=a)zx|;lLM}#77d3GD%fciVvz9MdgJLw7x1H9)0T6vB-Vdx3EC77LwBO zQNL%@v~T!yNY!P99BZm%Wt>=9rY*T@zwM3^)vS!@qOvl7L+YMMmt{)C5$)q|7fP;t z`&VG@hRt7#-PA|A98>!5xu1M**jjBx>S?GXNVTr0iD}&VrF?ZdQsQAo_|1TrLz!i2 zlxCg6FX@GQ%Rf(-IL`Q(N6!U3Jzh37GblVsY~X29O|x$$lnh7pKN2@7c$)k=ThBL4 zB;0N=wqD25I+AFvKvYUkMYqPBT;6N5qwXJGir(yk6O8|Hxwg-LZ?Fzn&V}fN`GNGD&3Y8urM^s4xHLR3Gi>$I(aZ-q|-h< zpva?Vy8Ndq(xRx<{eiE|?w#LKFKa%3Z0q!@OL(#*Wz=`PGHuFdJ~!E~I*e60sK_C_ zV%3H%tsT7}t-s-V;iklU8&)mKUc|+`*oOW}bCYp}`Wl)IRYjIRzAdiKWT#3;f9ih$ Dn}%V| diff --git a/public/img/emoji/eight_spoked_asterisk.png b/public/img/emoji/eight_spoked_asterisk.png deleted file mode 100644 index bba52a9cb7d393e956cdee84696742999d299667..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2769 zcmW-jc{CIZ7sjt)?0S)X8_HP97TL)f2F=(RAwozZX~>%J5m88KY$HpO8QB%dzVAy} zN-7Z{%2f8x``&Zz@1A?kz2`jVIrooy#{z52#w@@L0Bjf&L#xB8`)@MR9x|scdIf+M zEX-}r8V8tzBLEiQ0)QP8*Z_DPj{Fz@ZUK1w$3yS}m?A(K0qy|i0Ga^C03rZ504*9Y zJZzDGrGs+}V9f|B0H*=mY2Z99m;pE=0nY%oOa})CkO@!WuV*pl09gP9Ak{2oGHeRDU^z3 zGebET3>acZZ5a!AwR*MA^qnyuu~O<(g6D8{(70)}^;G*Ql`a*vUUj$+PyvttKm?j9 z8X$p0lLSNpBm<%j0nPwE2#5g)10Vz31@s#<1j3)aKj4p)?v@s;7nEv~VyI<6H%YGi zT{(33VCR5ufbVECH_J=bz90SY0N^4bVk)BUN4@co`Mb?Yc*q3d%q>6K*7w$}-#S7Z z00DT4c@B*dZW2MYp=uXvv+raxW-&$tMckWB)9lv(8GvJeA3YC7fJkMet7N(`?b*59 zwX?CaGP5EwfYKf`fIBS4BUU^6I~o*?#L>k17xmum-aAV>dT;gAFlyY=+~uFj72A|? zCb-MJm(|tPEAuMB7EDLYWxM3mr`2DtH%SaiG<<1T+*~m3!}QnnmoAaBzvakJDxxvy z%kKhXmg7V#B_WEz=z}SH1(!slyh5)MSEUf{y)6W@8V#GHd*t>G_Hd0j%@$3qc5UK& zqFTM0R=t)wQQfl3@_p}n(MHjjo|w?C(3-iL$iYapFg5BIDkX=KbTbM0207U>iEG8N z>#<8sNSO_pZT#902o&J%;I0_2KtDsH<D`NRP0K<8Vp`J|$%|$*JT`N;ZqqsP*NKJj1)?VtYTP*GuHF1O& z;c7gwU(Lx+!@9~jdd+rhJFzYDV56C3fA`4AwJbYsN!jRy(80a26Ml6EyUG=g)X|nJ_LS1<4-=^x1;tNFrcwMh1=o^JT)tFDSg9nJSs4*%qil;7*6t~( zT-`hMAr~_D-M@G8qk?_y>^6>XCOxI%S1DVkZ)^tzv#_uji(7=PyUHq}q*l*FY>(rV z8_3(E?QYv!4~l($^Jb_ohv&|DMk$4;TW^3yzv}>vB$Ylwm;(iBPp+ zKjEiGAh-x8mFaVn=(`!RD0y?2+}*3Z(wFPfq<2=XkeaWaxV7;LutEm~upj(V5YJyH zxI>Q+qvPS%uX>B|a_uGSK68scal`o|Ijn(l<3ez7@ShL(KiA(>RG~OI)%M0C<$rB2 zBQL{cJLau#i9dh1ExHAnJ5-+Y-4oSXN2yo%eU49vG(d-IF6*%KGMYI3_PM1rl^W8l zvn^|Lb(o>G-7j`mXZM!P#mG$d;qVX@nU8*xe2>_#T1Q3dS0z*;0u;lDk~9k9@7YB#h=4u*kwb{JaBmx0P{f70dl+ zFJJ2WUMjWQZ&C=j*%_pl?87EXMS4hxKK4XXZ)KmJNHA5BOQJ8U%#IF8{j9?HZ6%I0 zi)Hja$rDT;=wTP>dgWC=N(Wz7h(IvwZ5BTfFXjC4sOVlYYsn-rq#&W(gQ0!W^7B#E z&%O?}9&>pvMCy*j)Bo`$znscSTC>rA(5rbitLl1kXMj)T(9q~?)K6MdVikIkFX9X; z^dt8@Kg`#O303Uv?jFI3iLaR2u9L&erTo{^{DjC{^Z_X~Q>HFtsh{bT+Yg&sW@h~L z?`F;T|MR3(d4~tlV&#}de);<#L-7cD0|0lk%wN2UyQ>YJ(0s+R3+fdb=<>d{FdQeGr5v@J}R;&+tB>< zx__N;1Oai!y_zMm$ah>!jLva-Z9mvU*PySO!!WQ@fo?n}hIIV~yFzxVIioB;nS*{* z!3q7v$FH~Ps_vjbP=1t@MjKxD)y@MIzry0yiqmeo$z!Do)2-Dm2#@ZR88aH`v+-iO zay5!P`SH)s(u&87xy2TFim$s361@2# zL8INxI$F$$7^Y^~q+D)QIKnUUMtAT zHL{Nm&zDkS9A^Wz%P}PL4P^Kf)`C99d3AuV>mzQ!^w_E7970o!nEW%2ma?raJM-iE zq49G$>9xKJiqc7M$~9(dEJ{12hSoe$(ioY%T-;AXkgMrlFnYy?iE$k)V|m>xC0{wB&p9MhAM_k6U+;b)ESR}UHg37qh} ze8!+Mu}zm1=_-5X@f0OZp&!TUyQz9*H zmiaHgep2a_kcJrwip^SmF;ynz`!;^&9Al140GHQ{=iVnn>y|c)h?fJO6P7ZVRA*&6 z`#!y(xT-m&@McZMVfVmlE0m>>@<$IrEvq}U> z>6Umv`09nGqvGK36nBNitK!V=0iXUz*B{ik;tpn+UthMh!-%;xC~o9`e<&E<{& diff --git a/public/img/emoji/electric_plug.png b/public/img/emoji/electric_plug.png deleted file mode 100644 index eea5eb8e71c5bc711229bc731c82a5ad2015a150..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2180 zcmX|>4LH+lAIInYb(q=AXl6EM8)n{>*)%k!d1^VyU)S#Y`@inr^}Rp8@9%%DAYiKxR1>WUfk2?_ zEvz80GyeUlD}l8_k~0H=C_w@^+q`^|IcPMRMn>A&{#$HlXo$f;3=9nP^z?i@(MTi` z3WeHO!1qMjS`!Qgq#{XeAUM*|(fLt>LZLQ%e~gWdO|e)60ttkzC4x#cAma3O;3zTy zp1gz7)+D&wAczjO+QGs1Ka7Tde}Dtn!KM28`oI%d{ofXtfKzY;ZU;z2BGJ;)60Dw{ zo|>AP78Vw+uC8=C9pIUmm;inZ27^E#NF)*#i?y+_0V{yQ#L!m0r1@1-0bb`!BId!0Dv(wGZTqKLZOhy;{oC1P716IJq#l;1Pm|y~k!qpnh^Tq?)bRliO&>mozn-iD}>#d%+ z*a*9w+engHeoTnfgO>28QeMn<^0S_VfzE_z9=W$;$Dj8FJ@-Pub-)v(4N?M$0RST- zBhU!w7x;tR03NW#;c!3F0||rPsZ=V+9FTyyfIP`$GC*~3a8OfI1Fv8Zc6N3I0)axI zfLVY>K(@}#&VGJ=fZW>J+TGpV-`~HbI#^pQ#3SC>oHz0O^h@jgzxJjj zOZ9kbLRfeq&8Dt?>|N1XzSf~e)^OKa#GJbS=}$8&cUPA9ZZ`CDZZRJoeVCrRv|(4_ z-NL}O)f*Ng7Pa+V?d5;UFPo=M`i=F9dgsp1^N*i+@b%P^eBmRs=Uog!{IR_z^AmCV zu7vT{gnP|?;mT!%?M+VW*| znX8*VIefCU0{Kz)#L@J^nPT~yR>vZ)-=omn+__2qhm=;&QSRQRsiBF_PBXI94A0R) zByGFt$l}ygLg>A5N&lIUgCUk>Pt+Z+kxfT)?v}B8^268>dL}vd5yNqVwEan)YNh} z`Y+1wU*7%qHsW=sNvZ->Z|^h8AO9?JJ@6?AT&-(M@jGR#z+TYIR> zNy)U zB)9c_W>;@d)aHAK1u!1(@^2++RF8L=BEL2yEqHIxfB5teBu!!g_49pxPH#)ZzC108 zu#7RN9+ZJUu*iz84nF))%@Dux4{9iJ*orl%I2U|zG$d=f27ly4o-WMnDnUwgd#FjX z)}n9&Irt^1xV-t)i{!BZtr~6tP9ha--#Evu!Ze>D#`fn@S6lKMw7qh2em1`oc?i7P#s|AZ*UL%4j9yXf& z-t*APEcWEdSQWGylVerd9a4ows}@>>CB91P8BZR{tnALr>z)-Z?DH*2_>4WA^=)sl zvc@fw`SHb347cRiD>WigBz~fLK|7vO{vjHhvi=fFH-!~l3PYABJiaB!`CUdCk?g-9 zqs_I%Fsje^mX|^XVEp!3bO67HpTtyErydwdoQ@a{rs7D?>NlC;!VfmViOw&Z;NjX ztg{xi;S75;^U-Gf#>Ldd_(F}-8AExg9Eg99R>#{cJ4|+!A9?Vs+GEO{37nvPzN}39 z#@j6F+e5kv@E%nD{O9bP-=Oz#lF&$pJiO-uGtwe$-Q#mmG2imidOG>G_*TAfhq$@h z^w-WK18wnd<4^b$;_bG4?h-e>KKKnE>Es;h>J^KD?qbtLiP2eB@(jrA-fz z0kscOu(_P~VKAS%8U}JI$JibCCB|w#JHJoF8C{ju)Vgj8a*Qq{SQklU8(>8 diff --git a/public/img/emoji/elephant.png b/public/img/emoji/elephant.png deleted file mode 100644 index e041a98cb36f62727796646782e9f6880328b8df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2994 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 diff --git a/public/img/emoji/end.png b/public/img/emoji/end.png deleted file mode 100644 index 61a4399ad83c2712569b93ce6a0fa33126151982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1134 zcmV-!1d;oRP)q{R`mXW!T`rR2ba6-76th7hgVm9dTbQ|kRBcV_Bqe!(Bj$s1CEu0zxG(CL#qft z6z*Sc)1yU`CQUZ(7jX35%d0+}>GJmqkRBcW@`82RG!hAU!Rt@VAvXXVEBo(u2x+F4 zZ_uR2`X^?4b-+>Q)rUSE8q{ww>#G6|zj^ub8SPtMer3S^PkV$ksNH(P>jAHyeDQXh z?wu^Z65!R_E!xzn-bs4b1G-N-?`i~hlk6XkuFiY9;|E?7YK$0G}-aLGs|9=5{Vo9Q8 z#cn^{W-m%rMOhu@=VSmj=;WlwrkGW9*&3$XY>Hl@DjucNWrOYEo>&T~;pU`FSIjCr z>f@!RuWnIJRK=ro*6^v)Ve2B4a{)ePPF&g|S>e(iJr8Cx+rmv$#iPYIxYXH95i$T4 zj&P!Myr>Z*0Tw>tdEy8sN|=;rirL7-zL?CnPwh7oM2!ux6yOjM#?qHf~>`HMfV?2gwQtq|zH51CP#myrhkeJq6e~fZB0dk_lxbx6DS#lz>c$yPsym8_R zYYyNADo=TeHU(&lJx0nvJN-<4IF>&E9su+C5427c35?$xt^fc407*qoM6N<$g3P%P Ad;kCd diff --git a/public/img/emoji/envelope.png b/public/img/emoji/envelope.png deleted file mode 100644 index 3631861bbfdcd90101dd9a2b3a2299c63e983af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1655 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 diff --git a/public/img/emoji/euro.png b/public/img/emoji/euro.png deleted file mode 100644 index 5e133f798cc7e176c99440984304d8a0f208c33f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2409 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 q=~v{H(<}RBcCT{o6PNTj6 diff --git a/public/img/emoji/european_castle.png b/public/img/emoji/european_castle.png deleted file mode 100644 index cf7e7f745004735a956d330a726fc653709c08b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3093 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 diff --git a/public/img/emoji/european_post_office.png b/public/img/emoji/european_post_office.png deleted file mode 100644 index a4754398d913a67fe0537913adde15f5d69e6c83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2751 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 FV1n#*>*xRg diff --git a/public/img/emoji/evergreen_tree.png b/public/img/emoji/evergreen_tree.png deleted file mode 100644 index 27c8175b6ff56a6d8362e33727f53b9540f27e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2603 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�CyI^)aW})Eqb+LV zxWQ|HK9Xg-q)zAc8pdtvmZOJ0qMW$WudtcRyt>H9NIk2R z3j~lmL?SIkBoa9s#6}>HD_J%Y7KSo&pQ8WD3CfM@qBr5cInn~kz#yyU^p3@wDKy~t+eRZX z@b{lF8nX$b8A=#{$TDN&+v5RrhamXs8->l|R?7Y3kNy_53FV`5v;f=3zHH(JW%-1f=#;y@ZDK0ZDUV4ETb3gA@e zF~RUnIsqjl;!azihsD`<(CriX%Vmgz24SrOmxVx}AMb0s6A`lV&9v)wv)UNR+;eEt zQ&gI`xOm7Vk0}y~1Z}_p7U^2i6Q;DxsBXT!Yt`#DeD~g(Ne>Hy6b;mAMBQq7g4VaF$%_U>NZ0KFgXUQie#ySjavxMU%!Q~4rj0~W-?r*)K;*%TM<;yzeK z_>POijpoREK9yJ~c?|vgMKNuHIJ`_2YkXQJ(xM)|NH3z*L+mTcYUo7^$r1?$D0xqS z4SwE34|#I3Sf%ZDo3o1ctr>tmoA>N(nru)yd~rgdP$DTQDS2PA$YY662zeazY(rMl z-aXv&c+DCvoo>qVu&=Z#u^1MQS0IF5EY_$T_w>-8zJvvAKv=+~y+37H++>qtaWXv6 z2x*4OF@ATK*OK+q-b?gJw2{M}eJyI6r}v)2r;39IObDcTBEN@QK;5!$&t`f!1VvoD z@NJf*M~MqUgA#I!oo>$Qw1 zT27ul7rccYgzx(J%&8*9q{ZXzmE+a|xPN-xp8q$qF|SKrk&z!7fA}21BdBP-Vpd+` z`Hf4D?*fA3OE;cx1a=jy6$N?lT8~H(Jd8>zHojf6mgE%zLEe&CT|PD{N{l@4*eC1? zegQ^H3l(8G6M1w@XD1dz=Ho`2n52+%nW4c z>FE{Z;XqPBK|vM<0|E&N2@_K@MMXsy7Z-VXc`Z%Npr9b%K#Z7}n7FvOu&^*(PVVvJ z$7W_`%F4=cI9yLpPaY0OAP`bgQvaXo8W~le`uqC>C?f+!Sz5}-$QTEPfH9UF(ov5P`}Xa`G#o!ae@aTq{rmTgjEp!qH~_sxMMVG;Z*Olm zH#b0db8~Y-LPAbXPH=EAfk4Q}$S5f(0XQ%*F##1=SXcm(fE&dP-HeQkbaZr)S(S+e z^)Wfs($dnv^`({&39sM9=hXuC3J3@Q=BJl5CBA4VZtNEo6$R?Z$;wu=4?&?&S2y?M zqSp8qbx+gFQ(rX#*9tfWIPY+1YUwoiA$Ib1T~l z8sFfXdW)Nf0Hr=YJ{kD-yy~78gub@P&m-imvW|(Dm5tTy!;VhQ2KxFpZ{GCu^n8k| zNGfV9CXN)=ws+2cZSJ3BV`D359O|1}EvWB%j?1s>8E+k&m6VW3DrmytTbf5cmejXn zOIq>G1JykfR@T;;*}0xR=t^RLT25hh1u?&>t+1{O6BS?8IngpS-_SFLLZNi@^dmAW zCco?^W|!b9hy|sUvCp1IMn>Wa$}?V;zO3nv$7bD{C{YDoHZH*2!~#S~%SO#`6%3(Z zreFcHQ*lAA^GgWwzM?h?rjom$x{$uSxIjECZ4|tAYmt2!i<&Sxr%8`zIk*sn?IZVX zRb4I)j(qwT4}LbCZ?<_)`7#~p{$cZuvosPkbj;2sbI`H7Acsd`)4HpiMujJ#;+o8UT^5i>}rwykB<2^9% z&IL5$$Hyj3E*ervlfOq#SH$v(=*pl9*8w&7JQI49P2aZiRq)A*Z(&{LN{d%mGcgy9y!P<}H0$T^+g&#s;!O5sc$RxpFY|k+?TmhDnr0P}eLL6i* zsFBLFd&F0uT$k=uDI6^m`A7RyG@7Eq-!C%$GQr*bb|UZy>`zRcDfju^tbkLm$2MKg`_jy8c-U(Pr+$E$lEI zbsX4ww@y6uQ;NEh-0zUkttQdJTQ1gQx6_$45qbpT(4c#K9mxrx$U=S1mA^xR2pf^U>}tw{DbLT>1SXZOA6AxpV+j_KVi z0tCEh2qCFa^-99!{4o zYwKJRvUGbMTyyW?7VM?|yB>ZEiU_Q4$uJ)SdzXh0l2X#JZ=l{=fy?m=(dE~K`w6Lf zvP;K=<`gL~@Z39~)K{^ENH&vYx9z6`Q(bk+`fg(l5B!kB-WG7oARz`-s>E_Zjj~Q- z-dyLRjsIAxwyaB+U^qdQLzu$rVtd%%LP7kakSJO>U1*}f&T%3*QdjFIWUiKfbt1F$VgPI9$K9`*^2Q&STMtlMFhsZ5_aXzW4s>~UE4@m+%PKL zO(;lD5faEKn=11n;?!>3^rH^A)VM57pFL3ghzt0#UM6Tz;UHe#f1}-PkoCOiEH+C? z3iB}gAF0+y>#Yq#V`wtX;Plv@=@;Mf+jiJx-{nZU{5?~p z1p!d_epF1lKl?VRk?!L`KO+NtarFd0qqVTj1;#pB#YNfngq^YS#v6IKcj>MrqeV}> z#B}NnXSaI&Gu>^+c#rT>16PFYoIxNSkY4C{9hbt><6be9`Bhuu&*?HRF*S>wBAwVs zhbB(nOd|XD-E*M~)1iD8jBKDbqC9e+Hr4%1WO2R4VPLom6Z6|jF219koT~p`bL^Ml ziODYNy(W)x%(h5}p1m}x_W|sHYL^Gm2 zvfpJnoC!B@rIu&dO^60Tif2MgEvOfK9|&Y?|JVbWa1dqDZ4Gg*-mj_mtRthf zKM)#%-~L=@8%00xm|=5V+CSO5?mBvH4KX}_Yi-xJ&IT4XD1n89_11U%u0Ok+G7#09 zFtI;8PouWF^BA+YKrmswd$4KCGOcjS-=Fc$!tBh<%=jDr%4)nvuk!HcMFkb@CbQ47 zQO_M2Q1E7d*}aw~uY9{naqV6VlXuvRDoi6YJ|p%<6@C57yJ_(>Ht59hsw4u}@v#u0 zCNVMQmwALqkeTxYZSA(UE9wxbnu#2I>Na%T5tsMzm_u1fNrO$@XxRgj&&MY$PC?bb z2x_GCz(Hz23Z%R^jG0@UO}@>F`YGva-}1`JN_yr4XXh9S1vce$i4t6j-yd&pC`Uvw h9kq&z{k|v&)bzq>B=hx067Y`z>1&&4)!%W7`5z1ZVU_>@ diff --git a/public/img/emoji/eyes.png b/public/img/emoji/eyes.png deleted file mode 100644 index 82a02714e53f476c319c007b00eebfc7a369e773..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2844 zcmcImi96Ka8lN%AKC(-8S!VFFjF84oV=QA#LY8Li83tLS&`cs^SM|J6of|?S+Mf0bxQy0>A;{gCIq;cz$#h4S$5 zKq8SYE-t9^)>y3LKa%L^Xm4-tix)5A@pvMU7#-qCo12f1 zPi$-~unh_d0*u((I{+|qb7MzG$I#GF8=Lcifq_o{BPOCjbECK#;z^zUu1g zmX?;m!NGuQ9WA(qh6WIcmzS5OrY4XbfFuwIhKBlp`dLHWqoX4r{r&y@gM)*^!$U4k z(C^>B_xAQSHa2#5cWY~Ff32?0&CT`n^sw3N?d|Q^+1by7gUidyjg5^3`S}y$<6B!> zKYsiuFE5*#n(FWGXD}Ev8cp;BNKy#IVzH{Ks=j^u*4Ea#xVQ)ggVWN|l9G~odwV&- zpcDL{V-N^Tkz-(BAR{AVWMrhKriMbHq@<**t*vEcWi>Uu%FWGPU! zg+lG^(4rz@mPpBgPd)C==WH!bqb($(N#_hSPuADh%SfHz_xzUFi@&O;k6XKQUFA@b#L}AaXBN0+&W)|rbTv-{FsqrpsJ;z0%NEx%$$x?YfR7FMVDX zn>|o>krNi;(186_GS{Q5+?s5AaG!O;&(wu!&n=v<#^2?3@0omLT=Uz_j~ti8#s{%; z`NEu5k+Z%bO9SbFXl%8{a3_HEx`WE(SjWq`yx)+j-Gw$W7tqaSL7}6L0A+=vwlkBhy}T(3x^7O`9*`YC{ysjPSfM z4p-76F)Mq~hMambM71Q_TA$?fFPdl=i1z1=IbRX_()NOF0M+D@^8?~O`AIQLO=saH zuH9cmSGCG2E{}pO$ji|Y7pA>jN)ETxdb)Y5z!gd6uT3u~KHGK?GN^h5AE{m-`~U`kE-uBL6>vgJ~R9YONcyYlwZS&?+?(0iLG|ObDw$a zt0Gm9x}%UWBsc+mExqy7ju*2)FHUrWRA3Wv&dpHXkfH}c!I1^8;CIhk2jhc0bc#|q z778a)_8Cae8`4G7OCQqQ-HtcLNwK%ZI99xN#8)@;!YjsztHvDCaZ-&ki7?#ESYJl< z`JbgG;nSbhL59P2so6RlXK?R3|H>;0Up%ab;7!7Yx3L1wdvK$|rWYTsO=wk(0vd6#c3F|&2KdIfxHyy^CVEf%|JdMLermu|k()E>Q|Nl-bc5~w75$>N<`f)wI|4md4{j{g@$o zlfhuej*+Iks_mCkIR_1|sFl#qW6`ZY1#-?YKC@^yEutwJNFtXgbHhJAuvNTR0cKkC z>9>FcorT|F>Jti!rD!uhI(%+mwg~Rf>x`sHhgw80`Mo1N;m^GWJm*YB} zlgN+jTb-LEYZy+LAR`_(U?3}%Kc?}0Y~3tb@V&6f2JFl@312QT{p{yxnY>oQPTRJt zsjqn1%jzU>7mNDMqBqv`GO=2Y)Et$#H}c`_W%!GbJ7f->Q@VqT)PzM`H*<+u8Mf62 zisCRCS~(EoN*kZ9FsUQ$O-_c<*_iI&UQhD8yyf(PUSZ2_$oe@N8!Pz5fd>|-`=@J$T5{j1 z3@!et3BI$AD6A6cv#pqq?LBtP=a+2Z{XUCb-fg!FUynTX?rHn@W=)vF#@?mMu=H=Q zL0v-DH~qiPUSRg@Yp35Bt{WJaGK4IC`PK5GDhPLI2>r0uDk5Sd8yHBpxIFqZc zNi}4=>6o$>`YfYSgz#~y8}umnx`gf&!v(V(B2Q*(A5-_48kU_-RvyV4@#@%%5kICS z*x8zJH7*v4ez5*qgDTNU0ZXPziwAe+z2gJEP!d!6Yc4L_{6`{;=UbuWu#7?td6>4Z zjl!EUt+iC%q1n6ZiQK4^7wh|lg9^^Mu1A~(e?uyj>W)S;{nUm$7pnd|q9sAhr!#9; TQ*O%uPdo^1jj^h=AW;4TUYKpz diff --git a/public/img/emoji/facepunch.png b/public/img/emoji/facepunch.png deleted file mode 100644 index a57c201b558d7465b56e2e300a6ef5d530737e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2908 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 IM6N<$f-IKKI{*Lx diff --git a/public/img/emoji/fallen_leaf.png b/public/img/emoji/fallen_leaf.png deleted file mode 100644 index bc884b35de610b71b11fea7c0073fbd59392951e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2618 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 c$p5GQ3$a9>zP9V%ZU6uP07*qoM6N<$g1|Hq)$ diff --git a/public/img/emoji/family.png b/public/img/emoji/family.png deleted file mode 100644 index 97fea9edfec4597814b30e09fc4ecbd1fafe9460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3220 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 diff --git a/public/img/emoji/fearful.png b/public/img/emoji/fearful.png deleted file mode 100644 index 7852e0ace85c903db3836b177c4013f7be12a45a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2918 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 nArPntSL`{|JH$+PLHj9^+J_~g-aWBo diff --git a/public/img/emoji/feelsgood.png b/public/img/emoji/feelsgood.png deleted file mode 100644 index 55867132ca7e8b41270a2e2664fb2e814f68a665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1145 zcmV-<1cv*GP)MIg0nI=*l|Sv?lwfJ?1oHYy$k zmsTx8D-Ne8C;psiO#lGYd`6=H0Kq*y$wfuxgin1O%`vEAEU~c>n}007!sTf_hW|GbjDI5@O0F#n`+{{R5{0095Af&a*-q8=V#0|Wn% zkd*)cIl+}30000NbW%=J0Lz=J&$qAByT8N7r=P>4m*JDgkH6bu%!``<00TKmL_t(o z!?o61Q`<%u0MMhGE!j8*2grp?rk!a!eQN*z&*)p*=>yXtArRu&V9?E$`hX`5#ReMi zKCQmpJ$uux6nJC`HURWBXf3{qMFNB_9|UYSh}B=k5_5!;dx2OY8I@wSR(~126iCc< z$Fz0pF2?y{)oLL_o&V1`69DQ}G7Ca~XeFQ7fW0|?BQ%^M7s z@e8361EofKRBj09TI_d}TCKjW!j`EeW0%|l+@fVPNf>KOQ-{Ock0HyP&iEU|>?Y1(0p0hI*#v$VATU;Imx| zITDqgsbZ3^I*pG8I&Tv_h0xqssAJbQCeBnEBeBxJSoCEHzYUnqtO07Fo(nB96f)#e zTz_;@we)!MZ=)N4?&whfTl=k7&XGt1)k@%a=0U*qUc4}L>>195QYS0szaEf`ZUHOizZM|)q42ZP7$Xy( zrGK@nYpwxwJ^S?w@a|ISe*xE{c)rYiTGRV|fNYt|eG~Ao^l0E8gUmr+QJQn%00000 LNkvXXu0mjfXR`ou diff --git a/public/img/emoji/feet.png b/public/img/emoji/feet.png deleted file mode 100644 index 1b0147b1d234c4043f8a07294c64888461324883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1529 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 Bh>!pP diff --git a/public/img/emoji/file_folder.png b/public/img/emoji/file_folder.png deleted file mode 100644 index 4acd60d4212b566013a34a77b732cb9fb4abf77f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2805 zcmVdqOR=h?w6vkFE2B3c75UG=aQPGq^-7#m7wqP^vlrIqpGor zk(!&LtC^#(o~5p&tFjXl6^oLY-Qnc$^YfyrwWO@J#_2Uh3}f!^qE&m!OW8oMvlpsj|9(hKY}soT{<9yTQf4#m(d6G!SVC<-{j`q;Nh16G^NyCAu(!VO@b%T$+t4vAV&^ zvbe&wzR0Puytcl_r?0xDue+S4v7V^3g^!iJ#LS+{w!w*#nNnbBjFg)=Mo~OTRX+1`-%`)HGmoXuNMR7Z)?oU?0&ybzX zs@yozR!2OKjquM-<-T&vgZ^89F`C_G;BjHZ%;6i+_woH~*2JQP-0B(l=IFz*+4O+e zYqY}p{bQ)oonsEM000LtNkldc@pZD3TO23sgkpGh>bCp z#t`*LPfSozJ9FkJ5Lx5U8)l;sE+G-|@5|An3P{3w(Qz3PAtnk(VPFjw1GH>3oFpQn z{{2}40e&z?JETddo2adUf{Ka?K%?Xw7+JnV;TU7vp0#b;`|q=jQ74=2iTPryW81ck z8x3M>7(bn=#=X6qZ#>EQ>Qw!Dc6N698-kN(Ui;Oyql^E(B;lizCm(zN&wIW+aq6$q z|DK(;_6teu{HKnN@k57Hag&FB|47rNZ*k}7vqw0h3|_XkpPsh%MmQ#BAmr3P9{=Of zU#jo)_`8=cUH&$gB>!n|?M;JA5T0JNNxSnmc_Da0CD@c?|Gi9GTU&c0jBG(gOjFR3 za3`y1r;IhE*&^9!;MtnCHx6%0(F68TGNL5N6V zVqzys)8NLC#g+eD6M`%(YylexR**#|Kc*HWYM_OYZ7WDxzV@G$rE?Y*jus@KJV6(b zt0??LM=dBJFqXrOCI7xtQ&XOnML0U*rzqe(tgr~><;OLG7^0xHt+CB}aj9lSusL@w zO9Lv1dD?>C0S+sA1m<7?(bnH|piWpavt-T@DgzWiDRCe$9;ENr2r4SDcK`ALo39BL zu!B)49Bow%*dTob2wGcFzhWs!M5$rP#fxO1OGpHuPcxk3WJ4(XGB4NfB)5v+wmHK3x1kU{6SEjfaXUQA?_6s;pyr5hK?whn3!lEVF4rV!4;?h3s66o^CUR@rYP9f(b3U9 zECd3zfa7AGF39IADvI-s@H|XBr6rgdZufBmN{Q+eni~YW+J=(=d90tq0;jhmf|;3_ zk&dN*0i{BrP?ew~T+G4=`GAOfd3hopKs+iDw70k49A6q55(RWguF!q)Vz8^LD+E*k z`z!PH^#NzK1j9G`eIRh75`hZ*RP8VYLw2@nxQ7Q_AU7_8$_Esa;h01)JUo1(tvoEu zT(gBj*`RD{it|NEph>rsyGH zKnb*nLkki-ZEPYDAm6hT4d6f#-h|hvtgOTqq{wy+<~6WKZ7mGQmBNvc?0dyQdN~Yg*C$Yl5r$(diodIg5K*ROaA`;2`os6&Zk{ca0@y`OC<^L zaX_8~wGnSW`RHanEkSQ@U%LQ-AVfv^`$r}CC-6m4!<;wa4s7Up@?b;Z=fx> z-ZzmPRbC#&_~WOL;1eC4pOQiXT!JfvKl0`u9@w%`cc;wT;Jbz`8Me~ZG; zDC|NCXBg-V*-tn$Cfn$&%<>)gHK7cTdru6n5n>XkgXy;A#_N|WIEzM8^ z1sqi2)#E>Xeao(0VtDK34f=?iYUhpjuC9&BYwGIiGVl{{3*p3vs->wn6{j$#rEy?v z@a5X*XlyA%0&x1N2gRj%^lp6`&1q?zFx5K^K^oFEWT<=f_@@uh=z9ti26~_Oj`pS1 z5C={?`MTJf!yA4u%mV%W_I*u4P3b33eY{1|d&dr1n$z0hZwq#OAsl_?(|ca}+k&lz z>vyixr7+U>9u{w~dxxRXdLX{^J%&x1)lg3Tk)G9=U zro5m^Jn+o_e?kc81w>nlTcgyDW5>7ku9pW&l+;dQAnrV#IrC{|&dg{6|FZ?lp_&W@ z^K-GH1wx~>fSoxa*|}IKMX`S^P*M=I27(J+nSxNN(atR-R|3sU!=-?MuzLki61K)N zflMqyf|9XJMS@V!pI?~6MW9)8Env~T0w_q&h9{~Zl}b>Q2nC|fY(qd<-mE!6EK!wc zVj?|TLWn@rVYU*umsks+a|uAv%=8K%us~^}K%kEhkt)XL%J?aOZIg4rKj-t)0g0*t z`e&tN{GqoXLnM-H7&!FI2)Xd=NvTNWswN@}g$sxIrU5D{rWh%ksvr@oq3X4ejRL7B zUV?ouec@-BP|1$BJ{Rc84HY*81WNZ(b4?Gtv9IbUsTuAYnrb;Rbx&JS)Jfz^Kr6I1 zAZxDx9(f`4wZ5Xhx}mPRp*qG6bnwuRB8Pt201)nONu+MeY{~3-V=gyV6&N|tG4jL@ zA|LmMPKw+^i9Zmj86j1c;*n?g z$}<6?{`kg$xHUj-*FxCIEX+0t#H|yteSdoFxzMRS9Qn+VyEsGDKDi>vW1XBB5ARN2xDKO$Zjkl z`-riQWvm%AGiKxGzRz>c_k8|1=a27sp7WgNRu)D={F3|tAY@{Uy|_~`|0N${M^h?8 zmH`l8WoBz=^GAPgW438nj>^(5pXpi2+RB>=Yz@^(Q9@;_)- zflgH@K*Cok=+=U4F6h;QW>siA3BATpAprzKsFHv-b@-_XSpbDdC=-JgEx;k5Ngi?l zaNL07g#unEcdxQzyaj*!%sBS%0s<8^qz;G zXQ3Ah<@*7z0eBVYQHM4aXi|ZEfDs$0lZEOd(5Va6NBcp(LrJ_2j@G^GMa;V}CO7LsAW4pvKnHFt(Nb$~gGW-U5W zzQGC(Xni7M_hIZd3||N4qy)Vm!Ctvb>*iuk9oifgWiNY8#$y#z{ zE!dAgf=%Lnf+bA)1NDbM7Zzq;0OwCZpE)eNfyH-FhS=%)-d$do5W@SzGje_DU&x?KQPa6t4u+kAOq1V2o?i2T{~+ zDF*2ReMpZn?Y7Y<_~R^)JYb74K<&_=br~?{-fh&&lR{u~RDn*=Vy`5z=EFBfZ?V_D zZ4w_cCPG=a`KxwL!sfw63mZU5z2y>;LG0RtxlR_h@>$Y79o+UY=Tu^<4ecj~t!OVZ z$WQaKa7Z0l7ZTDWnHuXvWX;K+z@gBgiC z{^`>jbn_Qk$w#L+r-m9Do=Lu2uwVR3#Co^j=SlNRDPB?sNJi30@vDw@#89s&e+TP6 zRsB6?6R6(eifA0)8Pu3m%I*hkzK*G1gFBy#+J78x;m7%*Oh$tVD^C8~!v*3OLe*}X z+t<^t`_+AUnDT@a(RfcDgMvahXoJZhB3({leFm-}QU`txQH+b%u9` z{)$u{jKQLdtLlys@+)H>;p0A$@EIse`u!-RWE5_(a)hBQGPF;4o@P@Gj+~7_YRfOF(H%m!TPbXzfE%Uupb3--nbv zw+$GHu`c0aSXxZ|iTPl6ISOXmHMoQs-xB&!U+bXh3%MbVmB97x~gu{yx&cg>(B}bMQ z{J)pC7n7y2y|vwOaq?a?zk}ihL@76m(eD)%;dBeH5JtK9=U$gn>S9JE8OBzA>12Xz zN@9+F#$tPXOc1%uod9~ZoOf#NV?hP72X=`Z>aM4!NJ94VgUu=YH((I_V9wGgo?#gnAMW%>U|NBc1Y_GiJ*x0?E zIZRGlzL2%ob+_~(@6dXwWt*2Lv^Sc6D)tR62syu1qh1SdJVQ8Fw8F#9^E6C~4~g_c zM((vSIu*mt)so>V^5IoAFl)Y>SZtG!;-=QtdebQtvMblj~iT6nFGKEzR4Qn>>&nX?mT8ceO?{~;fH@oT4kJ`uA z+0wBm<}phw_sCe8QKdzaV8>}mr{?rRG44`yA*OzoJA#|pNOF5xQ9_-&AAgLE)b+%> zOSu1#eyQ+j;DJs}b#;>P*K>B^e7et@_R9Wa;bjc9o5iNAOMKqeC)IQk`(oW73Rt$M1CgG6ZbCHp9 z*`(eSD2PdtATf+Rc2y&}Cc&8Uyg6%`le~vd^Gu}JH5qPCW1pU^^rzbSR#zXcNZubd zWoIymPmx`_KDI^Vy{Wf-c842t-kD+L@q9JNH=NeAw~p~8JlDfs393+M@0&3 z?G<&xV5C&H0~Jn8M;WOkt5Fm0T1h7yo+}L~)ARGCdQ=Ber*gIqibgL)U$WlJChOO5 zLK5Oq_1Ci<1oSWnTb%s%YTl4#YQUfQ8ET%$KXq%vqpG5PoV8ekrL)^{nQxr8*Rbl` z6Wpg<1m(o3b;P0VJGIFTvymBaro>CvD_`Byl}MW=l&DR#%t;@{w~SPH`LBMCv8k!6 z)sBdimf<-XdPksWVzj%?Z_4=Jnt(L}6muiAhc&}GThAw_87P6FY$BEuz4u2<8IMxD zSkxhr*t6@tfgQM1(sTqnL&n3WD95?bV%67{PN6=Wl8Xy_e(&3;{PDX_m=xOFmQG!( zzu(%6vVlzJgmPu{?^MUix$==|{fg~5qKIlk$-T$?yHtK0og~J-VZ}1gwf>jLloujF zN4X(%KnoT zFZj+VX1kc|r#|-HzB1?&wz!+~A%vrfVz~^GUMY)fbwp)_;ct|M5b@tf5A}yHI*>DM z>4|ko1JAnEC;9xFe&AB5QReM3zJ|(Lt*$1oZ>@cQi0nS9t+Os7fSpEh1moy@=4D*u ziX!`O_huV}$T#a9auq{gCh>FP<}SBT|3(Qm$s@uIy$=n!M4U$7NJCq^TsZv&Kj9_V zh4gvfS3}O^N|B>3kJq@r4e4?ezNMA+I4`khyT2SY;DSQ<<(pW$Bm^$*JZLa6w7?dg Ha|!()hRtoB diff --git a/public/img/emoji/fire_engine.png b/public/img/emoji/fire_engine.png deleted file mode 100644 index 5475d71f96a0ea92059abd416b4524bccfe40115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2781 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 diff --git a/public/img/emoji/fireworks.png b/public/img/emoji/fireworks.png deleted file mode 100644 index f3c270c727abc6189d4b88bec9995472c4302723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3197 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 Y-NgQ0HpArI|2_yy3mfxhQv&7x00Whq>;M1& diff --git a/public/img/emoji/first_quarter_moon.png b/public/img/emoji/first_quarter_moon.png deleted file mode 100644 index d2edd9e363fe8f15c70079eb86156f3555ebf975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3076 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 S3j)Ld00009G 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 diff --git a/public/img/emoji/fish.png b/public/img/emoji/fish.png deleted file mode 100644 index 10ea60b6d67c477606fdd0825c2a28034ce1189e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2508 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 diff --git a/public/img/emoji/fist.png b/public/img/emoji/fist.png deleted file mode 100644 index f72719464fdb14df3837f5ac6a38cd8d800ec285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3282 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 Q(*OVf07*qoM6N<$f=w$kCjbBd diff --git a/public/img/emoji/five.png b/public/img/emoji/five.png deleted file mode 100644 index 130b7fc24473f679aa4ab9866a5cc5a05fe8db17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2342 zcmV+>3EB3EP)8PHiwlR4hD9Fhf)zD>fuAIw&?uEqjjt)IHq zWr(Phvd@{e(QuQsXp60vw9xAB^lXu|X^yX^!rD`Cm58UsW{RrZ=J0KjwSuF;g{8x8 zleXUH@RG97WSho;p}$>zosh1}XN|9}#@ud`w|bnsa+kVnk+W`+wOV_gkgv^lnY!-t z_E2n%S$mjIY>H@)wEO)1MO}P-p1x|5x7_9JXN|FAhNfzcu7;+?OlO72*yc!Le^z#r zRdt$EagS(=sbPYn_xby{&Edk+souG zT6>!G_W9@S^rXJoVu`LtUxrI$hE8dY>F@Mhf1tI+)n0+2ag(&0w8}?;v6i#YOnakR zg{xwbxnhT^gNn0ljH-;Ly~otyhOEtAgr$wD#ZQE>#LL^b%iLs^zVh((`1JVM~ z+}Y(uV3s^ih)8A*aWaGFJPoH0g%XK5X)LC+lwroE@;^W4v1v<=Gx5lth-TSADi#@&* zjsO4!ph-kQRCod0)B|v%X&AuqvoWg1Tze*+a+O?a+sovVD&}mA%}i>$O>KK^+cwYk zT|U2W>hauf_|Ee@|GIDduYBg}yw1(-ojJI1 z{)sE}@z=C>^lJ+bsv8dVa(B*x+k2=%eXvm5-_gDX_#8f4alE$Jb|QaY0YAEP>#RDX z`33v(PuPlUkFTJJ=&q-@APQfJa26tJNc@Pqf7CCbNjQFeSD7%3*f=u*Yd3084oPB z7H1a*cq~XjVRo@~F&NGKl(D8?Dtq!8G+*&uzB2vqYbLV_R_79_y61#X$%CZ@dE2Vkx$-V-PGYhJJS!3S#G1?znYRPFdeHCTJqrz!-%~ESwH;&@agwc{5P^vpi9nQT zHh)QIL4ODh2Wg~z=S17dvDus{5=deufB;J%5Xj5e^=yoY_|QP%wicV&m&)Y!bru!) zymg0|BM@)|BB3@DCDLP8-Ko8O#IIyPF&mv}g(3m6E#A@kIT?r#lyEp47K_D6k_)w3 zq3}6+!#$g+ExUCc3pD7Ei988i<8UN_@nqnmX8+(c7A7q%jm1$h)QCZ?TqqREMR&16 z$i*aNOe_ZbH-AJ1jC64tK`a)lm#4m>IUIgOLXZ2`6A?ATgv75-i$4d7YIw1Js%K^K8 zpG{)#XF@C>;elH*?#hqJKwgY#3nljAt1EW@T%e;*daWD_yyyp(Ofh*tz&kevgclijYnM-a zZVY8dCH61*{?EVtvG>BjqdV9qlvx`C$c^{e^%fBr@%7K$0l4`c4fWv1UmpGW*H75v zdTk}Rlk4w0LItvn5g`9uJq^=+{{ao7D8+V2#w;@MZurJc@t}yC!wMQK|5`~zJY>_x z@OO#8?v3vLkoc0vebBw)T9Lm4_l>)$z?k=_C&XBE^;83SuD(-R=jmY7d(1Ha%d0Cr z`}LuGwfedK)Ns*%mCUzs>o6F=aULZRc+XbOIWORBrh_ZG^dy{sxI?J}4kgvG;tI~W zajw0AG>0Rc6Y(p*@b_1L4FsOC_LY9*-;TGo#_Lx%OW&*wFL(<$`qH=jo2#oE|NEWp zyasAi1f=K=t%*RLuw~tlq%Sj47lDNdN2V^xM0_$Y0@*1(wM*I=7W*KnyvY;*=q5r!&qo`77@boRCb|F=GRmhy zzS-_1RQ2DlR5j6QH}miRMIi~KB;WlDF$f}qG37h4ToOi*%)NiV2iWFaCg*2Bw*UYD M07*qoM6N<$f*A&R_y7O^ diff --git a/public/img/emoji/flags.png b/public/img/emoji/flags.png deleted file mode 100644 index fac6122282ecc299a801f50dfb4a4010acee23e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2648 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

@(CoYAH1Ti%gY5)KL M07*qoM6N<$f{&t{+5i9m diff --git a/public/img/emoji/flower_playing_cards.png b/public/img/emoji/flower_playing_cards.png deleted file mode 100644 index 5ab2a29684c5a3d8f0431174379466cf873deecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2354 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 LLZ@oSptOGh%PGs4 diff --git a/public/img/emoji/flushed.png b/public/img/emoji/flushed.png deleted file mode 100644 index f87c5f2bbc882d369aa58e1f9c5b1b56ed99f9a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3106 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 A@Bjb+ diff --git a/public/img/emoji/fork_and_knife.png b/public/img/emoji/fork_and_knife.png deleted file mode 100644 index 594b70c98c9d5feca073803884823fb16b586d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2296 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 Y6EaJIi+wfl|8EH!=$L8~G_mpj1NX-$Gynhq diff --git a/public/img/emoji/four.png b/public/img/emoji/four.png deleted file mode 100644 index 64706499ad29f07dff85cfc3eb6ff0d4517889e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmV;v2toIWP)Q000000000000000G)7!IQFSs$XDmQsE5NM|@qY%oJqAS*T`FFGhTN+T~l z6c`{cKT;GNBt24jFh*rLPINRyXE;l3GD2cIQE@_8dnYwSCpAL<|Nmlyqh5ZVWQC?) zfS+N4pp&`m8rwqYLBq$@AQeN$7+zV zW{Rq5j<1EK!*G+eh^NJDk+i15+T7>xXp60Dkg{lvt!Qfj7ejFS$mjTeWOKPd{J(aV}_>Mg<0_W1km^7m(rv!%e=S$dtMzuCgm&&IY+5)3CHW zJV``BRCod0(NlQjY8b%rW9xQz+upACd1~9X-DWze2CHe;JGE`wwr#sT*812!C&^5b zuSur3J-?g5`@R1sc<%p2>ZG*H>xYt&J}JexenI9^NwmQ3P=e@^OEMQ|>!+lz3uZgo zpE)GDA1Kk`S$oH<;JWlF%GJLZ9hFY`w~EPuW^ zuetN7_ko^vB8TSl%eDm7{C><6uLC@ZdH?ZF%cNsdIXn71xqt3a z$8`LZ_txCQm>By*#Kb(D+wz`@pYC{c4&Q(0`H8aPq`J8oizAwut4k^_n|S^map25@ z_QKZih#Bo8n~4Z-Eo^^qMjSXPC@XGhRZ%|%mG@hU%LFIIfwRK$`gt{#V^N#0FBhH_ z2Tn&78nmkEOCVaH{;Sq%P#ASu9C+ngX=8+%Bpb;HBii2)jiuLKAp!|{`i9I#d#X@9 z2GoJRUIGv(H5oN!G}`lHo-86fnKm&g1p`fu222{`dv3~N0dv}@Xn477qlX3Tuq?n5^u`iga01M@BV;QD9)hoKCO!8(BQiL>+Dbf#+wZ`D-RLYpj)K zB4A9L@~3B?#{(muxS3c}nZ$osCrbosXk)ieM#w-muilEP{<|%7wG(>{bv3jxFPjVq zv$@7pRtZ0$n^O(VSip^TfSWA@0--Epr+tizKfH}B=6z-?x&oFHWzGsE11}1FLSy;E z9)Mxi@1LTJSv+Ix3gUR+6q)m5Lw$rV;(-a;Y5IbpQ??j75$@5GRlbyqTfpn~417@9z(#ajWy;>h(SB0dQeBKUfst z!l?XeZW?wBf)ahTGTy`kDLT%c{vw{9o{7-6dgxLcj9d>a4#egUBD=_#IOwdCLI%Pd zIG#9;e>xZ2|EG3ybF+5+wk%?ywzhWNnZp5&IfQ`$S7%=WCp`<@`RfMe&q?epAm9E@ z=lGJGUCF>(f<8ZIK>C6#ldg1UkYAtREj)1fj;#Zrk~#2cx&z4e&Sfy*N|GFK1?>wc zrS|%fDzg{^ZEQb4Z>kazcrRL6*9VZhcq@c(D-T_E%nG@+`@IiHS2_AUao~k}nOgm} zfLu1AeHnX=x4PNvTw74TR_47Ih=8I_stYKPkn1W6R0amR?31daNCqr}!gM7F>lI%C zeG+7e2VS-`(;U!ZMg*vX0ZlW@m+?SJj+~AJeYWBNZ6cRbLIm#KzcZx3Z2N2MEqvNR z9Sq&MfA>g%{vSSAT>RjxrKJM{SCu}}lt8WmrAYh#Bc-ck;EGMA+_7caT)_kXbvhU4 z4Z{Ew#}$+=wvrfc;T+4{P7t0$N6Vj%LCsJy&0_CS?jFT3C%^mqe=kY>T>?H$4gx90 zkI&DxbbicPY7jVhw#t|1Te>V;&-;Ub^xo;7UT*2M+j*A;0hFe^e7dDFr)e|@$XTb; zB*D!V0@Ca_S$Pl;)FiXIBskt!K)M!7ssb251^v@9%Vg6%DVx@(UO-?-fs)P)Zr diff --git a/public/img/emoji/four_leaf_clover.png b/public/img/emoji/four_leaf_clover.png deleted file mode 100644 index 8fcfadebd316cfd0c4c324ed5030188eb7d25eac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3159 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 diff --git a/public/img/emoji/fr.png b/public/img/emoji/fr.png deleted file mode 100644 index 4c9cff52e5a26f48dc8e98f09e4f15782ae1aa34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2398 zcmX|Bc{tSj7ygWWnHk1DGYn>|k$tV~*+SW_WKiK2x}p-Y4c8S>l2n#bT~R7cmQa-2 zNJO?QgD`f+HW?Fx;d}M`p5J|+=bZOF=XuU~&L8KTYpzG_5keRt006?#;jsH2TmCWu z?mhpYHhBpEZs6+dX=@+hyqEa}Vc-Apf1V`#tDKknSIK{XA%g#}xqb=JG$2*9$K0rx z6j6~qQB5Wz@g)`2RdHA1QiO#%J32&Fa|CcV7zD)?1AP-?6QEcCB+Bw`=bH2KNZY+k zN=%#{9}hYcRQUKlO6^*sfnJIj>btQ~21;~XQo_zLE=LSyB548>wmRW;9H1_ZNQg(m z;TcG{G!Fv6!(f=Jni`rOZf;?rA%`N`fJC0A|J$vtACrrV^RuI`35wr^1bP5y*VCOf zF%;9Q<(CO~fkG9@Vu6r85O8>j#lj>=rD`hqe7u+8LO9|Cz_k(u1nwdcwOEYi87i~~ z03hxClhRUr~rwHLTW0I`5|b(2Be|{;bfa6#35rt$kZ4T z0bC8Dwp-Fg~%)Vo90~Dmu(C78Vw#rm znGnQTU0RZNotCki;H<9#u0j~T0fr$j&CYGg$pU0GW1bFpo&rLfcHoMJ&w`*%H;{ZX zJu(W^X}g>qz(ZE^U*<9z1%z)vb{NQZ5qy_`$ip?(2Et`=TNaDb@6`|ffv}$e;<-TV z1$4xLPpJ+dI-qS95N-yj_nUi7l&NxFi){85o4KO)`wuSDS&N%&!1E5M4x?S@070F? z;U>O+=eDAEwY8a&eqs)EK<>x(g{%Ud+2#+8SYM`yH^b@CCSzt!T<`O|n(A=Rw{^TC zP?(-a!hr@Ie{sEAO7bTft$A`uRIzZ2K=_Kq^!ANhu=Up5+uBo+?nga-}~P(crhIa_E^Ii~#-gPrY^mY(`$);2pf=?*>qFFTfw*VygfK7W~T?9nNFytP_0 zbcX)hxm)Gs{dX3oS|h(yJezn`{dDxt`lZ$Rp?>;c-Y&cSp7vbj-a(Z+9=7uIZd$(E z5sqy^eQVBsK_LwSWPx|-um#k@Q%S?P;l&i7n=mXB=eI4jU{2ksol>;7<;No zL+mp(vZ|aa$TsghepJdad_?Nf9Gg=@Tfe#D*-^#-#|IY3MTM<%(Xu=&InyZB$7ss( z>GF1~OKlEWoC9kMjmA!6RfwmPHP;{0D?CH1eNV>5>3TF!t&xRi2f=!mx z%OS0vYxC(vvYYf|k7Eg&Hl(VBip{Q|gu0>Uw8ZG2QyUqSnCBN(C}BDZX0-T(mRGx_ z;c^cQgCFZYZIFj$-b=I3xHFmbhj>+Q(wo`f_V5x$=?j_ee?DnhaMHN48<=LrTH6+` z(wiDxgVLj6C%soLh1>SpYQ$oIk(o}CNL`tVp$u11WN)8`YE<&srAdcdmAv;3%0$SY zC&qF-_*+kSOotj{ZhU@tzAtL=n+8d2NU4{QxzPUwJTmatnGni5M%ta3I5z#MFR{Qb zfHrI1cK|JbkvW7oRofEIScH$>^H$(H0K4uZcm(uX5;$;JAZ8}U&yp);Gzt6x231s2 z)8P1Bf41K>`?x26hddyPX80igc>!%gS1tfxMVaz|t?lp<#?=6A7k#bSeV<0Lhl zK4JtB5=8Y;M7MyGbm#4>vMD|DVH!lWuZIis!nMoZq3^p2CapzCB3Q0cS-19oP1jG2 zTgLD|_d9>h`Mt;6P4pc3RSGh;5$wAeD0!xnBNK0xT_=Vwd72=f-7W{(lc&ghq_9~$ zE0C6VLEA5&l*o^b{A=NiD}PO0n-s65uoKV7p-$!6i*I|U55%Ysy-y{|@(-LiTkZv0 zv6~UeT4b51WNoq;XWd-Mm7PuE5!OmgnvJ^o(Y_-M{aW@^x54=^G|Oz}40BKjZQ1qv z8sfORK*LuWfzK!__w_eE6PW(%H84vC&Q zDj9y=MQqLI2pIhi+vi@q0RhIjo2{)>*wR|~m%_VU=+=6sh zPO1VeY9(|o4%~H-DGv~fmL4|%)F1iH-oA7jvZ8ykK;sghi5TM)|0(*FPKr`8^2(}+ zLpkd*>U(|aMChBHDTS(L9pXxe2_L4$tl`EdN87ZK;94OZJPyoEMf-1Z#Y}a(jb}IH zv)5^MExT-#HhJ}u3AmY1*KpjfSMF+oV1f%0cSW3UHp7^7F`42tGAD6U>jOKLcuEj? zZ8i1biAE-gRMEo!<|A7tbMh^>cAGuPxbEO0*_@e$#$CWp7YuFGGKX)e-YbyFX0J3$ z4=^H_?*|z#2odYrfyd@Ao{xyGto9+J&pZ@}@!CvkF diff --git a/public/img/emoji/free.png b/public/img/emoji/free.png deleted file mode 100644 index 9a9201e39400ce2b2656c13c75ccad52f25d823b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304 zcmV+b3IFzqP)@G(sC8 zDF6Tf79TS{Q*jX&8z?bECo@JnPiQbfTr4|EBQ7}~DKIHFL>(qB79AunJWCuTC@wrr zHAQ77HcBWlN**XPEj&vpHA5gRH6$@RFhN)?I!;7ebwyo!FFsNyGetpFaVt4XMO=9( zI7$Ei|5b62Qf-P+Y>8KMkx^`jP-};mv(Zy-j8t%pRB(<~a*&X&%9F9qim1j|bd!v# z$&#?lSay_9YKDud$d$6th^E6(YK2Z|giL3En6}cHxYV4u)lX=How?RUTy?z9-(!KG z`TPB#z1Y^`?p=PM)!*oDh@we%rCE5Gf1J8nc$KZd)mwR(_4xYv`}|ydoN$n^c$c+H zWPV3qczc?=PH2Nyc9&Rrn`MKfL04~GeV)3?*~Zl1bCR@mm9$QAmAJ;%TzZ;AS#n^3 zqHT<=VS}i6nY&VLix)z2T6>;ef1!V#z4G<>&fDg@%iBm{dw`(8o3X{*Os|lwg9U`1$*ux6a7c<9e96w8hmq zW|K{5flz6LbC9r1WrCZz)_9Y!`~3a>{{LNorfH3_Vt=0G>+!3;(x$)JP-}>7h@)A3 zp~27HM`3~6^aEzL_)qS16l(ElZgQdgMKu*;>r)mMV7vBcC*bDEp7#!_~fN^O!=a*{=Bke05)ldj0U%-q4z z;5})WHAPlEWQ=Q&v`=e{gq*aPw$!@K;Ax7jL}!fW?eezE;6-qpQ*)MPf0;>ho@u4wL)^wWa! zTu1-_1$jwCK~#7F?2!YMTU!^$Yui{ZmZt7^YTITe-#B;L`;u8v5lq+@=V^?(!`d3P zW7{@sJ-?HyjAyd+_>1=coU?y7ci%pLG5%xnf<+^T^vK9X3nq8kK4t#Yg^R}w?U6By z7fzi&r9=CKIa9~1SmMEC1Rd#?AO_Q8$%-*k=S*n#@2%##GNnkFA6J=S-3=K^u3s4< zWxCF_YI7fhMvN(u3Pbc-qdx6;x1{NfT78I6S~6zDpjLvB^W12twNd%%erV{i?g_pB zN@=u4X>RjIwwm9>5*eyFen0y1!Cr7V`u=eZDl3^tO>(%^Lw2AtBl_vn{k`Jp)94Ik zAp4=!a6&L^qD_Ez?EZ#*y{2J*tapIT#94%3_H9{Uc<8Ezy}hPkRcLsi?DlMOgmnR` z#^c0LNLrtbT?y3t}#PeWf) zutb2S?6i;+RIr2+B(YK-{2wPztU~kf@(F4lbaK?HYEik^=O~G$b#hXE zp#-k1N`~$}dk&hHvI=O7PVi4gih{6HSRip&nc_wzRZpuK|rSf(T)YlOx8X1YzPW z0KD*Y&n&o90tGl11z`d`Q9CLh35CLhTY%(oSQzabmFh2<1qLX%*ZnOdklb7G%aZWes)3I*;AHU>iq z1u{0f{wlbN6tfsC*z&_EjH1@5_~(1XUn=yW>v>i~-&JG+;33WrwdbiLt0HCmbXqcI)+zwzYGlqwd zPe8B1N52{dkQeX*-Y0t$!>n(Bd#Y6YBF2d53|74Br@< z)Ekr&!$49IYdS+nuep@uFyI>q`8STxQ(hSOh5=Iw!7@*%3{lE74A|3(fVC$g8Wxna z9SoVgvWPY9ZEKo_McHctW0@=x^SJiDr5etQD4PKj{@kuCzsh1-e>_*B1aY{GpR0MMf=Et*)i2EhH;PCm}zWV>g8kPmkl~jpE0rhar<4 a41EHOZ+L(15*C910000`vJnE95L1_T1wUtI?T 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 H_7VRA)IdDp diff --git a/public/img/emoji/fuelpump.png b/public/img/emoji/fuelpump.png deleted file mode 100644 index 7d416eea2cbe22d895808d2e9fb14c23a29cf4e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2540 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

~O0KYV|Vbhp3~e|=}?9dk|!=}U59O{tH2a)}P- z%lGY{gy+z&#DnuY$25m$<9LmTFh*1s45;>kh|lN!zJP=?+@D$aL;!tZ@8Usr#NrvcGxK$3~!6`wMO{u@VE)vI8iJ)Z_dlxPE)%RiqJjxu|xr9 z%g>ZcwnbwX8t89JJ8kh|{?a^bQ)CB4X13R}PJ8_4X@Z@e>`uG9{VHiS@b){WMYy(z ztQJ=`hK2<`59-~>u<~GrMk)h%8Tb>}9Y-*xuB_Pfqca8X&WWl&NY5vwuzcmuc*+N?&%oqgWYvF=TFE%iO$&{H`^`>FE3 z9+Ubnu=aW~KfiV1iuqbc!3M%~6 zOaJVTS=2JzNVv4b2uD?+Y*fCDVHhMHSTRs!CEd~xD#g%c(1D}TWb@`Cws<9oY{U^|#$;I%v#iuMB$bJz&rjI28(EC#ziV@RLUN7f{39|%6 zFmc));&M)4KRwm@?vft~BU)(O=HLK{+jQp@=_2*BjHsEBQ^%D%?Y)o%;a$$IKr9!M zTFfK=&^Ge$_(+OY9tB}8PBpDMnqk-*R30GtVvwK*YQSoCK$Uy_x;hRO>T}g?@0~iQPbkbYj~f3Y^<`?U)u$q$G?Rx z2UX$ov8N-07cV#6WC}#vEZ|hF2VQgTQeP+4ga`g)XCrRy6#ZeOgs7%OoZpSD5t?238eO3Axsj~B)l|l^ qDzv}obMM&2FImYccj?A4VTYL>pf&xB{5%|-(~z+NLLUczg!&JNB!#B{ diff --git a/public/img/emoji/gb.png b/public/img/emoji/gb.png deleted file mode 100644 index 61993f988a9da9243c328b8c11b9d36ca5a740dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2832 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 diff --git a/public/img/emoji/gem.png b/public/img/emoji/gem.png deleted file mode 100644 index abbb3948def446f102cc1e170d58d6576ea784e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2708 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 RC-wjU002ovPDHLkV1j@;_%;9l diff --git a/public/img/emoji/ghost.png b/public/img/emoji/ghost.png deleted file mode 100644 index e36f8bb8867fba0c8b5a9e370fecaa1c50154a2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3315 zcmVQ8za?CnqO2H#YzP08vp4_OiWB`YimtSO-@cuC@3f>C@3v0Eiy7P zDJdy4Gcz$UF)Au5LPA18K|w1kD<>x>T3T9TV`EiSRb^#mS65d|OiX5GW^ZqALPA1m zX=!3&Vmv%NK0ZD_KR^Hf{{R30%*@Q!*Vmk!oWa4t{{H^Ax3~TM{j;;PtE;Q?^YeFi zciP(8`T6;6ZEZb0JyB6ny}iAusj1M>(cRtM zSXfw~prGmL=?@PN&(F^}IXOy7N@!?k_4W1Z>+7wptt~7p7#J8~VPTz}os*N3KR-V; zH8ovdUt3#Se}8|0fq`6HTzu>7LTLm91dx}N z(%RS9;og#ih~RdlcSToaZfnAClH-iBn>1YHgs{9}h>R*x`~Uxn89o>S2G~@HuQgH5 zMsaahSh*=eXINNiX=&YLn8{_4&U>J|PkWJ_m~ne{lAW5FpPg}NYkN6QUr$wGH%OB; zTFGvdr8#4VL}0X3d%AFu+KaNRTYlG!ueoWAT|7R^w!AJH9nVmP##DWd8!c@B24qW2 z&^c31~?~K~#7F?36`!+gKQe%iLv|wnJr_xwj6QEt#RUEt#!4#uIrI*sv&8wRS&m8+j z`O)LIYpHfNtVe{|_Ehcm@uR<@zaIBZ+nv^WodKb%w>s_9zWDW@*Wc1$_QrIDl&vHf zCb1$TE9pi%rn&XAv%eVBI=y*S(!_B*g5yj{Ro?5=1~2~HN?Z)G>x7IE_^xPGBHG0Z zjEq=kgBO2Bf4rC7Bvd9oif0FC2ZA2R;!)nDA~xCH<3HA)A9Xto9<@c09dIAFvz;{3?D^$Q7wTy zkVBMb@-BAp!Vd?KOOqxGZbaj6cn9+E58xIPna=%a2!}?e*8_!?XqEQAH+VOUu9iYz zeR}lJ7oy+)zH;jQ76ii)Dv4&`@FNEa0C;S5cFu{u3>66n-*3dJEC2j1ejmTI6=M%R z%s_{>pgQo8J_IGUWWeOneVD_8Skd)qZuYhI|%iX)~0(l>z^+$(QyZEa1IAzY8dOnAcFBOPxgJtDW}xjf!_HbpOzSOPJF@wODrH1f1ZJLDm5};P&jx`O$gN zKwhN`PVCZwL-#{t-pWS3z4NM=z6M$A21ywf zJhO||RUi$`?t9l#Q=0~g+_18P*Tub`3pEq6gsKuTvxDuM1jV#u0Roo{20$F{jIYhS z7~g|lz)(bE`ygwMR8$EW(HxpPEbXXIpC*&0BpGlmPd5@I(_)F@?@%-W4TR;LZn#qq zIEEw|rrT| zuWNyVniCkx)xVFVP4GqD> z@f=xWtpPG2R2v+$v5G6Al2MnK9Z`C0s0s-(U}bA0%G4$_fVTIS_~e2dZR#&?uPHxjU^&DVqrD6dS;93)IZ&8=`0w!W@bl;3?Z1b!puQZb30okZ=|ziK zNDgbjLG(6O`ej>@jO1R7cUZ#CxUBr__}K?TPmdfK8ai_1>Cl7O`0V_wIA_@6;IZE1 z3}ma!4_4rv__D+;XOHLSA3u9BKXmtiAueg%l7LPnBuaw4 z5F7S54Tik9J2T@83s1(!pDZkl&)kX2GZ>tnFbkPPdq8aTmwa@G zS#9jq2F(&rv1*Ug=``#am^pQCZtnj5xw(7eGXr}J0D9Cc#Y^U(w%54&<16}?U!_)a zN-%-7*yHgy_Y6#(8a;k|boBUNqo<|@_Ba77wt@+iTy^SKVE#|U&n^sgfVw~(wlf`QO>*FCLSf^ayfy+eP_<^ zzi?sy`7?bmzJyTTyV`5&;^aas@6)cqAeUjk`{tJ$rgrqaa2iQKpci zAc2qs|0jIPT33Kc-bxT#GbK@nVLBy_OQLcqLcjd~_3bdGl$7aM1KdcGzFZk5Dp1~y zAZ{L2h?p$bN0NHqC5K<4A!4GoVF9DCo}!Bp0Px z5=iKD49sZ?-#;OKXi3rL3Jn5GbM1CjkILVcM#H7ifuk!`3e#zAet_-m91VlCTy09r z5AW80zp>iR`FuW_>r2siT`reblVa9(H!wO;)G-a+TJsy+$I&2>vsZ8Y{%!ql1;#GF zIS@!|Q{|_&8Vd^xTkE~Swg8zc1CdJx+JfHtR)CGIsrjn5v_Qb@?=lwr_T~@57fmJA z8dZu)(^YS*+Eh?kxn)z8u|8kb7vN}`3-qb}Un@v_)x?QyAn_$&rIUN+2*bJ$>eJhD z7R@XyoY~V}Gf_=|g^!O#u&E8Kv@s>65o~N*lORZ3Ky6}8dk;wMqMWwr>M$n=HqDuo zlLNF{RfQia#H=X1swO9N{-Q(UHUeQa1!Fh^s&^yOn?I##49bZ$vxOi}83y|DbYeXOWjq3GMFqE% zEa=>K-_CTCObJ~!1>L!gB4j`Va1ax0J_%nw0>qO(a8C!8TpEr;5Oxt2W(^W;4-tb97-T93|Nf7j|Q-t1+OC~$+R|@7aOO92i`wH?kOp-l?KZ%F~+Vr z8~_0AO-{(TDqRN$??y(Td<3hB1(0h6xvK|71O%!H6~v}D{{FP|-gMYFI=!$6!6+<- zU<0(I25cq>Zw(DP0t0SK0#pSCa|R33D=niM8!7<;7AeG32o^Y1=B zzmYP=up-|sFwGtz|Na`+Bq;y?>UtIz`R#|9ZUv!s2;#a0mUjd2-ev#(+-U^}=E^L; zIXSx<8EF*~wviz2(`27&Bm3(N=P)t)MMmdVRx}3&;2|Q{Q&Il@z`mR-?;s(ij0JNz z46ut8aTE}RCJTZ&5bxJ6zNaDb*9L`W0=b+S`fqQLS{&yb9l8x0oP+}9yCePl%*dAm z_vU{2A|jx980^JR?8;)`sW`cWF!bIP&wUEjt`gdp6Zr6D{`+zN{xsLTC%cFUm2MNk znKA%0000)bW%=J0R3+J z{va7+X$MQCYdDD6seJo zRqxccZQJ(Pwr#Jib8lAd`1{`XeTKz(&bhxon&AGIXim`jf7O4=U~K;X)K5@^hB8Lu zK7e_1=gz^s##B0w%?{o2VWW~2Qw(s!Sxpb&vbb!9@dpUzhVpnk-%T1L>RDc1UR?Ur z56Bwfak<4g%E$7~yKto8N)CsGh3IVlKj z7jJ2qL{BfQtqo~u;nnQG=&K34);i$CU$k(&@f#-5QZ;%h6#1nl{nalul%Sx~=@cnB zxv!yN&z?OEeSH`Gy1Sd1S(#3k7ENAnJgj>1r5t8+cW_LYvK^327QsXafru2<>}d!` zI4&;4{OB9)Cyyk$ohfPF8@%w})u;D1cPE~_tq%gMSwll#ID?Zf5{dF%TF7LIi;azE zb+xCb&7~7#bInQ%3Rdb~R>i6{&}wzl`lyoy?PDKk$Mp5pB!?%5_4S1nAudEI{1S`B zHa68nZ*T8nZ|~~rNOu*(2V+;Nsp%@WnNh&r`l#*K&CTu|JNDqg3)dK_rww%T6cdTW zYN&;_XmxRMOF9a1<~QyU$H%B0K6*oU9wr$7on-OyvBwN8zNxFjN8S|MV5KfD*t|+S ziPC(Ti~z`_Vp)v;lIdzU1_vKa`g83h0Rf;ejEuzBrKQcZfo4iLQn8I#?CB}Z7kNv; z=z?m!8R7jDsoG#cd%>d(I3=_BnNGoyMW$wvB=fI4i7+XOjN?LVK?qG>KKuH`O>(IJ zt5;tDh1?zC6ppB%y}f;~1Tw@h;X5!La-0GJR!oVx#u3A?vV0EF#d}JqqHUQO2~V;x z|N6zP@EXg?`}Zp=6a+%_&8N3-7bNb53^7IrI5<)r9S0n`s-+0I1)Y{S^Y>TsqSi0X zNq8mS{QC1Rw~A_Z6j2Bah2P^7x7$x@YyG_oBu-4Kl@*n0^^z#%5D;Jbt3sA#a_cX@ z<>l4kNhA{9JufaUZs^x%ZBXuC$cs68qWz@WM%>@1F3Ld-H0Sd&3Pr>bF;aKb+`RDf z5LBh*4Y|7yrNzbN)zyug@iJNghlA}pc>BoV1*35P!l;W$1wj^tO!sA^bENsgWh!-b zLwRYa0{%`LavwKqWph&uul9MByy)b^!-p3PJ52`P24pr`31~evU@TQ3In^w@_zK9`-n>yzPv@sdE4%h!_P?eE*m$t_OK0$L;79WchY z8Tya*pb*GO{Wm0Gh|Fh3PVFhEXn65wO z>M_IP$B(-qAh=R-F}u7o`_#xAX?B+biXsdZR1^^coWBPJI!2fFm|Vk%h=}9I)R8dT zp8HARhd`i)8-Yoe1Cz;YycKR)>ElxoPLT*e065cfOiR&v!(&$i{Zc^?_G1bNCXEyr z!+v(8(scVPKoB2}G&MRqV+O&1X>LShgkkQOyQtub?Zw9+I5HwbK$7D~rP3T-(GcR3 z5n&*cCIE+05OMG7fxCmfF{xEof-W8f!N?4ORoG?}_@W`~O!gB7W@TXt5R~47_IJy43DUE%f*rj(x>nIWJW;DGLCEQFn@e!|S=SY6#%D;jOU^!oJ!cMt5ldbQV8UR5RU zKa^5FGD8$C^ck$2b+1*Rf*9fH?&juL?Y*&$Ir?`F95}lV#<+kAl8aJO4!xcsV1yoO z0Tn{1jF*#zr#re!N}BbxwNFn+%X9BVc${}-S9yhh^~MZ=@q7nZ27w~k(mo#DiisVl zqC~$;@9h3ukKGxOW^Jw^Rjg}=A%fR41T+J(&}X>SpM(i6B_@KRzTR}N-oD)385WTw zvsTxT+7Q>HZ_W^y?ZkAX3UpoNK|yk|C^*s1E-EU@t$v!`{@oUlDkQu)Dqy=7Km>2d z5W8Gs;Tf2I$t)1a&Ue^>!P?qQU8gidg#?%54sPBoVop6@lh{Op-5ZrWSb5TL}zXbTd1R<_pop}1@ z41rbf1Hw@d=*L3^!e*!+Cipsw3t1P$}*}eqfH01z)3P^a; zGPsldkpm|V9npQ;3nX}kSSpo5=J7zV7Zw5Pl>!op6!~Se!k>;5JRLkWANLlF_~;0& ze*XTxgyPeQQLqR~0g0r7wFS+Q23XateH|FyD~NpO>l z0fMHI&jD0WiV1!Y$|$m_AN1zRh(kdL(kA`S>%nkFTd#DtMMg%%o#K4a1l)(=l1~sx zh1&J?X8=@?k+It&fy4O}_kn0kvigLCgfj`+diy;xc9)(lBO2g7oY6DI-o5$> z04DI*f9Ig8#z($QoVcb;`{2QZgJpXA_V2&5L=*SXXwA6*3J~16b7s=KkFUp;6clCC xe>%9~|Nee?Vef?{FE---AB=A59fkWZ@&`7uNz*zuZYBT#002ovPDHLkV1ima`f~sP diff --git a/public/img/emoji/gift_heart.png b/public/img/emoji/gift_heart.png deleted file mode 100644 index 639709fd01905529a03dc407e7d00356476edff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2841 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 diff --git a/public/img/emoji/globe_with_meridians.png b/public/img/emoji/globe_with_meridians.png deleted file mode 100644 index 9489fc14e334b0c5287c7c806814fd602a3f2fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3431 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 JPDHLkV1nnyk23%O diff --git a/public/img/emoji/goat.png b/public/img/emoji/goat.png deleted file mode 100644 index cb22672918eb3cb5bd0ebef2aba7674046966650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2813 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 P00000NkvXXu0mjf1{3X| diff --git a/public/img/emoji/goberserk.png b/public/img/emoji/goberserk.png deleted file mode 100644 index 59a742aaaa549287a5f9efbb07767ca97788bf40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1334 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 FV1l$nBB%fW diff --git a/public/img/emoji/grapes.png b/public/img/emoji/grapes.png deleted file mode 100644 index 967316d8bcb88f29cbb3cbedf2ac349093d150d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2966 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 ydrTZMZvLcM=JCZU7Wy1QJvO7GnkzSOh1F z10sC`9BKe3jRP!)1Q%-oBZLGNUAbkTHaRMuj4-;1f6kY`|lmjAq0v&e( z6>9?$T>>D72o+@o4p9RVTm&qI1R;9_6k!DtRs|GX1{ih(Uf>9t*@|!H2wUC=Yvu@I z;RsgT26Nd-uHB=g+?T1`orBkEh}Utm-l$~b2#nWvd)Hl+*o0-?2w&I-8Gi$AdxYJagDgPuB=m)(1$z205n%FTDnG&s%uTV;zPCrr4XQ z*`2lCt2o97N6!Z;n*}Jb1sah8p4E}7+MpbP1t*6Q%jCsj+!d z;O^YE)~z+i2Sl_6e9LMZj0Azpan|b5Gm#zZ^61Fr!i3gvY~3(h+ZKt|cVgKqVA}{# z(+5k^20pI^FT?|8(MXQeemTMwe9vi!(sqc=c$d|PJE0?!(S(`OjH1?-v)rom_VljX zq&=A?kJx@rus5sJpkAm=Lz^zI(Wa8ahREN-i`aLb+mUA3Ge^=DQ`I6*))HCLGdsQp zOUoo>&_!3uI5DahG@BemrYv*2Vt=`DPM1*-t>TzyJ`K2=ly-8vUC2>N0`IIsG{2TH@zy|000Ie zNklg=Q;W+yS4>Oy}Fh?nq{xOqIScp zFEgjk(WgJ{?s9-4_gm?w z6oB5}P@1KDtj` z!kr3=`(1S~@YNbZl^%x;d;3ux)qF+MG-c35!oq`Vg>y#)*I4M)+r3!%mrPdVu+{Q$V){T`OWFH>hXRg9WmAGpU-!R*hheNHl8u8$EBJmUyM=P~F zEHnF=g77z7J$#)n*Z6ARcbqr-44q+jD!Cwc5x7!i;5fsB%(1loPkxO&bb?o5&sR;; zdbfx5&N7|BkG65;iqZa|Scf7UnxUfh;GKhWB=84x&2OUk_5e`~EoSmnlD_^Kn&I&% zRI5DuWM4pnN7H|F)dP?l0Tc${>#(*lsBIf(+qSVY+0@3M9-QsFXb^9`mns;WY7ZejJspaU-IhmU@uQ9gI)D~AdPPpm*2{Avr#b?LCV#bd z7>LolL?=A?t8%Ee1w%G{^cu02%uqx3TeP=rY7W;mc;94z{ z$qcvI^bg^is2QwjwK)FEcY*Vj;42W}b#-;|lsphkJPu?DYzwf8iv+&TSHmRVc41vD zC?IXOJ8R=;P;*!m;llO`=ReYrW$j-?B0itZW?umLq!>3;kC?&|pDz-9X&>(LrZRGX zE994hY>+^Sbz^I0gL1$ZiU(%A5<9kLiNVy31 zx*<9##enhtqo#(|h7Qbf|469kLV!|vz2wbX#p@Ih=phBXR=j;va$Tu}0CAVchr@IM zN~<~8T+-j4dLZbXtWP187P^p16@9XIK?hR%`%A7Ltf8UD#<|}Qf^UHgNQL{LqN1Y2 zQ>SFI-rhdY+bffuI+X~`AV^3pX@&sqT(3{3S%NkW1i(F9!}(ed5CIvG00A8I*fj4? zrr}%~6#)0=*RD-kv*QZDJZo*O)HN8|VQB$`#p!Jg@)W8$$ zour;i^VSl$P|KRNM*%!Q&R-sp2|OXbje$LDtqLyD@!iVlJKK&7JTYIsR9-4b7R)Cy z;B060ob|mQE|b^EeLX7!0U1z^oCx^e8}i^%C9R&JXQR&a{{hn+Qi8#UC>T_ROf&HR zv=hzh25&BcD-_pzhG0%)OC5iYfrkVG@5j}xh{J^8RW!nts`_?a5she6I1JEUi$sOH z+f)kI=)wZSf;v7vboj#1__&ID=I-{jz_t1_8)Ixyo2L_qJYZg1WMdndF1UdXEUZ&u zXo&VhNBe%biM)YKj0*Aw^q%(XxbJ|QDQrj_7NmoHEYXk$H&iruP?%TI{K3An5N@ob znFq8RR^w2Aw^Z}IxO?NL<|w{TwyaQDLZ?@f2#qn1CF hRd6r)EpVNG{sQHVgnk`WMw0*l002ovPDHLkV1jDViC+K! diff --git a/public/img/emoji/grey_exclamation.png b/public/img/emoji/grey_exclamation.png deleted file mode 100644 index cf027dda5d12952e0904b41f2a1c7ae235c2681f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 790 zcmV+x1L^#UP)v5u%_$kSHlq zSfsNOyg#{JFMl?7F}dU}o1Hh$A|ZHpb4B*pm*!^5*=2vc_kG{Yti#ybq0k5D1MKne zcJr|RJU5gvup7sTvL}X92B@7sHgX7LU30OTeg(oAeS5u20Te=m*Q+I>2Z|A$0-Jpt3*^nUdXv3=J-& zt^pt}7_ild1XB7`H`{f=(F2i2&|ZsnH%q2F4cyV5X{W ziy}fChyeh4&UD6*F9?7twidCrX@y3IC9oKMLOV%m6)@Fi{JD z)wOlF+d_1p!J#lf_4U#a;+-Pqj($iE;Pn5L_VV)7!94@`eq(03yn41?uKk$!cBLl* zPB5p&7kGtBT;N%*v(J++7)fUW5l+4td>rE!3>+}BIETORA6|PaNCW!5!VI7|t7-0GPw$@x`T%`^e_MeG Ugyjcy3;+NC07*qoM6N<$f{!dqN&o-= diff --git a/public/img/emoji/grey_question.png b/public/img/emoji/grey_question.png deleted file mode 100644 index fb97ba752fdc88e948c09be05f0358c007a80cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1057 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 diff --git a/public/img/emoji/grin.png b/public/img/emoji/grin.png deleted file mode 100644 index 6e51ba91d56a14ea4b8fbf4ed9af3be302b9ad75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2914 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 M07*qoM6N<$g3nlxa{vGU diff --git a/public/img/emoji/grinning.png b/public/img/emoji/grinning.png deleted file mode 100644 index 09b78fbbe1930c888d1edbe77a1b6e961775bc49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2890 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 diff --git a/public/img/emoji/guardsman.png b/public/img/emoji/guardsman.png deleted file mode 100644 index 10e7aa92bf13594b50bd819397f01cdc4cb284a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2753 zcmZveXH?V48ph{O5=cnsO?n7o1VO5FLyUv~3I;+|LCT6NNL!*HA_PQwQ;;H{pddw> zG*Nn&<|0U2U1v??k4uiqqa5&5Gzk(p>znlChAdEp^I3Pi8 zpoZlm;039gl0ezzZpea+}Bl9a$dz69PK2 zT&Akx#;TGW92_j0niNu13dK4Tg4kFf4-XG30gc9pii)yIG&MEFVZf>rmq(r09 zbaZr%j*g6sj0_D8zm|utR6gAPy_ifUTU%Q%zX@Bbi8&mvvb40^XiW>GKpV{|1O@T$ zUC*5LIeOAO{;r7J>dXJukhE48`>pZu(aqv|wgRTg$UZ3zG5qRFZHJ9)A@B(-fX7eW8o~Vj9)HoezBRW&~z{Tif>aU2I zeD^RLgda`dp1t9EZ*fmv=yp#I7Z+D?)Gv7tot4E|*UHH(Nho@rvRI$I((%+@9cnMn zdX|~-_GxHCc9^*;kCviBl#_PWJvRZ#8k?SLYpxdrV7j-#Q3}kB zemwZO(^mB|oCd5(GQCgl)x~-KXo#Vkp&*Pu6gTN7ZZb)3)QgG=6gfOIX(NR7!ZhfX z<}~n&wD`x>L$>{$*=avJjuSiznS!5-4|CS{suRb33@i0(s4cPk@h^Kf*Xh@E2RCYJ z*4FBHIp+c3&^IwWXB7aIq*@0~*$IYo^zROM9D5$wu_RpeG^58fBzl!8c2CHD;PX4% z+=yAV^9NYy0+8; z+Q|k94a!KgGoo^FnZk3Y+P@?vJ>;sSTsdduJL!qbuBFQ2RNx(gfK7D+h-L|2l-viKu*|v+1sk%TxCUz&nBp(XTg>2%o)$ zCh`i-c<^Ci%#jMeGe28+r3w9RlI{=+)3>(eKo+cJr(P9eAVA;zNCjxaV8(CQX16VS z>2rzZ{5jY;fQ-ba=QQGoPpwmX7{Cy#w|^eEW1Lby}z3|%0&#DJG_=OSa!Jt_Y0j*ui*26apiS?0b!L};s-qhd;w7Zew^PXMXi0w!K zTjCtix|}AVD#6W%jV=I+$U%I|h8UAbrC;q<8m_HCKHjT7Y;zP=S6Hc1trB& z-74XkAetWxR=qJv=2d695s`KE^U@>5+>#`2-nVRG2Z72t!d0f8s5X3Sa|hhq6xiqU z8Qz3p*_gh>M{XduM|8j~4p_Cim@~GYg9?+9&I%HoL{vRItPVpB%4EAtj*%_K5l%|x zl?r?eM!GcA#D;Bc?UIV(EX7Sf5@9C;XN}9GT@Z3cyo&SkRxk_|z6uoCo+MEU&HP4~ z1ppn42{mmeumdz)@ip?#Z)eYMkF&t6M0zr?-cL2{} ze_fAZh7(mkR2-aq*4O@qey&g zQ7GyVUh%td=z%Nuuk5h!jpJkKKUG8JX_0iL)pbz8uMx|a-nDXeADsn_A|?0sgj=Fh z-qyKq@wQ%O09Ey0zJYWgIV5F*U*74EU>2z*Rz%^x#Nu}4i5_GjP~m%NN|xc+hWRlZ zZGA#1N3ExlV35BHPud;@{sc(>^Ej++wCRy2N9aVdJm8qJhfOU2>F~qiKf~sq6xUA1 z8`YN<2h1&fN**mbi1Kt<$UOXPtJb$Io{d_ess+R~+uiG%xri#U``DojW zLA#qWqdkktprl+^0{z8$hnhOgU3bqpvYRoqMC$@}ZzjipU3I*nj_4aDwhFhm~o*|IZO6NbCNA z*d5`%Wb$M#g{rk;caE!X;7OP$4f9N@(v#Pw4qQcbASr(dbRpIlj}2V^{(;?JV?1?%$Q7;%lNzN zLuGf`PVLdcyxL3EvsKk6&lg8GGh?%(uH=|R_YI1qt{r=(b$kEr!S?F%Omoy?M0P*v zzEPG7Ctc6_uf0ib2XRe|Ap{zIJZf*KcUqwhg6!Lwdfy4kCR z?!$_rLv-WH&*iw^2&J0-U;VqjBk*x&J8ZJ9Um6{L(1*O%-~DyxPM=WLyV9-N=^agj tcK3JZL;PwS)_6b`Ok%rlRqMwQ0g_{Xly?JjdHmlWrU}{Hu#Dss_8*QYrcD3< diff --git a/public/img/emoji/guitar.png b/public/img/emoji/guitar.png deleted file mode 100644 index 3229aafdc12aef7e7b1126db5bb9e0dd925f91bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2349 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 B3o-xz diff --git a/public/img/emoji/gun.png b/public/img/emoji/gun.png deleted file mode 100644 index 2aac9787285e7ed9079f19d6a76ed040fd52d370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2088 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 eNx}d8op}$jH#+qUQxu*60000G{7Z5uQ1Va%9 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 P00000NkvXXu0mjfS}|Wv diff --git a/public/img/emoji/hand.png b/public/img/emoji/hand.png deleted file mode 100644 index 1eca1714901320a0ec2410b563b962a0bddd9839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2703 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 M&egX5OyJG`0ik0t0RR91 diff --git a/public/img/emoji/handbag.png b/public/img/emoji/handbag.png deleted file mode 100644 index 43cc3c1c5fabfc01b518b2cd5f69bcf5f9aa7fcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2934 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 diff --git a/public/img/emoji/headphones.png b/public/img/emoji/headphones.png deleted file mode 100644 index ad83000e687632a3da46502187b0b72a675a56d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1910 zcmV-+2Z{KJP)kFsA%E`O;fB9#9F9JO>L7>3&O%u1X;Ggwq2H;e|P8JbG$jZnaO0`VV2!) zzw~+XPEPiIc%Jt??|o0sUeSECu&4?j8+fp5!z1_pbj7~auYSI7<*TcHxVD}tg6L~W z-<8^u{Bl#>jl?)XfQ`>ply+DC=Fo?3;DPlm+uW`imXgAuj-y;6K|q!?Nlta_J^dkW z!TlXyf4%$pTe?2Ua^}*?OlC2kIvQxAg}N|W{zTP~$E=HTMCMd&;7i|_ck0$MZ5HDh+J>$->>;bTFTJTxKD+i886MJn^{Pdsbl1HA_(aKps=u07|7q;l>zbvz5lumti8W0 z)&~4uZl% zB4Y&{22tm#m$xbzusUl=Mq&kglWT!2c>+>c(Q)LGLj%efaCr}XY$6q~#~(!Y>>6we zSYYHw$uh_V`a`~p!Y9jU$P7BN=VNmj)l z$2kO_9QiQBSn!O=0ldRR&`6adS8C-b$+57?GqfI=CG3&D=x0{p&b%>#uOe004AaPI(myU27#|W)gdI3QAv5MI5EG`u@wj@C2>bW0d4{b)wEtNIk1HfOarIw& zC_=D9mO~n7r;$NU)G46|1)x=ApnS?JFu!?nqfoT)?3z~fEzKa9mo<&Y00SGT09nSa z0`p)NfQ4XZEdL+5)alV4f5FQKo44}}J zDo}pfDb(1K(f1AyQvs0x5|964HuE{k`;2gvVRE?S(FE3b28?WJr3@zuO@ws`^1MbP zmyChX0$D)8(6|N^AjSMmOjuqMU{DJM_Ok#OVK|H|%8YmpR@j2*4Jb0W4g(Qh&ST^A zCJs6})P(|t-FoPnZvjSH8%`7o1N1rB#t&i$UbLMWjo+gmg^E2;{wqufIZX-rY3cQz zi?tQECe3#JY!w$1Dcgi=LFV!x%c$dn_>p)Elv&ur9$7#aEu=ZAk77`<0)mAUFJ2Z7 zl_7iTH+ORb!}O8fYQLBw zOE2dQ`@)DOho&mX{~tsas;cJWZiftirkx?Km`OK84p7iHJ^v{k^idq)WqLUma)2vn z0#sTbX2NioIR2RRthmD^w4sW~MwpfgXszxT@iO=!gD8B|*Q&l57i5wZK))qP?@2b$ zWjCn2KE(mH>p`vwX~NT4+Y|KU41iW_4_P(jt2`mgTnUJ0lEZ?JE*h8y$f5S-_c4bY zz5FBfehTz-elL*T?&UvXHO(~A&06ZCu{}){kgdtCmH516rsgmOnz#&zHBA+8zmw!F zXBglD=jrDRgMdQkrpbU^=kQMs(QkO3vkU_Y4o#B*?~KPNZ}2)NImaMrlp)WJ=>d%f z6QG$YsBdQel0XH&7a@XcJRqK_8HHg13IGaCaEXWYzA>kvHqKP^ ztC>3J7ipHe`7CpAIK$!S$SOBLy&@>m)S;d!gzllI@?ms96HqWTM+!}pxUWc?S6=9!N(u3KXL>A1JI2MhQVTCu>b%707*qoM6N<$g0TK_=l}o! diff --git a/public/img/emoji/hear_no_evil.png b/public/img/emoji/hear_no_evil.png deleted file mode 100644 index da0a5e52305d5cfd8a53bc274598aa7e38d48537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3457 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 E0J{xnSO5S3 diff --git a/public/img/emoji/heart_decoration.png b/public/img/emoji/heart_decoration.png deleted file mode 100644 index 4e312b9e0447611b94138d7a8984db95c866e779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2277 zcmV9eiUni6>xkNYCsAzXAx9I3pPj#I!p{b zHU}(~7=Diyd4LjXei3Sh6>*Ffc6bwFlNo>i|Npopr?w@f$SAhAC8o3`r1NOwu_U3p zCaSq6sI?`f^=;+!YvlQI>9ZuG_HO39Cab?Et@m)~@@C?_CakO?oSGhqz$dP-ADzJ_ zufr&@_-NeDd5#3-`-%J%%``tD%f?_%G|DYwrlyVfhh?OomJSJ}-ex~?Lf z*(SupBd*ISxX~%T^JwDKE5PMa)sq{7pdF6WE5GAS(&kjw>s#B}DaN}csh%E;tsj~1 zWZ&>-;Mgn0=~~&gA)~1xn1mQ|m>h=ECco7r!KogW=T6r6Z0P;Z_uMtf^K9j$Ae7)j z&AK6{{`39B5U(vCS#wWDoAclg$-J!hMnYQjf-s85% zzYv1YZ>-|N$mqk+z$}N`th&TLjKDmLx)y)u&(ZT{=e{w97+(750000jbW%=J01D3n z$mjD0-XGugs zRCod0kyDskYXgOA+rF!tJj4G#r{BNJGO0Gwe9xU4)>1EBy)S-%k{1G zZhQ;=TkP7sXYUfV?A^0_m&*Cky~ju_@+Gy9S)^lok1EY~?zu|#z-8yyI-Aakvu#c` z&Vzh)&rXH6UlvS!7w-O{|KmWN#T?WPeC+?=9{!FPyiD#pb{-)cg!k2iWqH=sa?R&} zTU+Ou6;{(1Za_XF`woX$xk2pSu=f$iIYw&W9FKS(*2@mcWgUk0hnx(UY)`I99_RS+ z<0f+=C~)#jxSnjLfzu)Be#0V$ZD{RV;an4hinq0)wv0s^B!YuZxvwI)A)GTB!wKO= zyvlVtC=u+wgb01}+UVpwFnawa6me;{L~y`^iLMFxVqS#QpqU;AB!d0bz{`jiU(Smc z5if!2{Sv_%96-&~ohO-80JjDbSn|)xU?^cy#-lZ@ceFBVo!0Cbvoj)l9Y}N(3dK^7p$i zF@OGD89)(4W%vL1wOkzibT6UIO5C($Gpj*C2Ga$F7g7?Ck_v<9P6@EI3`luYE+2`i zC>LgiRIn)HT3QKO03DSt+(V>RqEMCc(U18ky0BZ4b}eI(RN!$fT^uIegvs;t*|Vn# z(aj|B!_u#LfC7J8ce<;9s{Cn%c6mibxk5CZUnT6)-EI9L0fOfsz%?`mrpV*RO3{r_ zS7Don00qk!7+Si6i;KgpCYS~^-4b@wX&A;b89`~(XiT&7#hZit6J@lAeoqGZ6hMi>+_s*&jznJanm}H zm@E~nN+z0VS&Px~y3zaZ`>(9MtffUWV)81fzzJ@s1>%)G3R6wkXRmCiX9#za3RXJ7 zeY8LlvmSzjk#Af)r6(is(?5Mtfzwf6 zw@K&YQ&H7Q=lXu2VChvqV&Q2eVlyQFGP)&J`LvMecXcT!z`{?RQzkZ6WN2%TRdIL< zj)eq{SZ)1NDv0$Ee1&IA>pzvuHDc>97{GDqy|$l9w!@ynV>pJvn|lb2@)R$oRa?Pl z=v|sal=jj|is2Z4;|Kq!ojRs$84#E`oT*Xfcm4juJaRP~noL*(ilH~rqCGu7KMkT+ z6E7?-0wtd-gJ{!*Mj%jadw-{n}UrNRxSrKFmc|Jk}(OK)LPP z)X;M=sO`7QivR}UgHy$rWM(Loe+Yol0;$Q2n~Gv&q$nn5a*d#c{}{S*XnFKX$>fT9 zRw#D?qZJWqg3m1OnHhN8V!luV5v@s8fX<;Gvfv_Bz(W7915lOF2K-%sR;hS?oa($- zYQgtEMq4BiauFr83lqqUU=#(HMUsJ7-hBT8j8n8lQ9c5p00000NkvXXu0mjf?>cv> diff --git a/public/img/emoji/heart_eyes.png b/public/img/emoji/heart_eyes.png deleted file mode 100644 index c8205791bcc80c0018ae5fec06b13894f45651b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3004 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�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 Ef>$JsXaE2J diff --git a/public/img/emoji/heartpulse.png b/public/img/emoji/heartpulse.png deleted file mode 100644 index e06fbdec6d9ddbf60cec58d4fba4ee4a772f619a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2825 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 b`v3U{vDbfi@QCF300000NkvXXu0mjfX8Y*D diff --git a/public/img/emoji/hearts.png b/public/img/emoji/hearts.png deleted file mode 100644 index 77d7d4527270db071ba096ba6b03112837a1e29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2395 zcmYjT2{hDS8y?$)7R!v^2#KsoAx%V!DQo#^P?4o5Bx=YqXu+sNWR0;#({fNoF(NSy zlPx+@z7e%321D||km$z%==4sL90tgfv=d!WW(FnBy32!el? zG#c$M7#kad0GrKTURhb^^EdeXsrmW8)ZcMwY3VPR<8T&NS6BJ`f7l5YYi4F<>Hn6M z&CLZK?;rNxV1~=(OiVEQ`ynHpP9Gf~{|U8`5msmC{Qs`wa=9@vG5`_?6o=f)I{NjWW%Y#2UJGk;YRj~o5MKR`sX-U$Kfp9 zSPDnLU?OBIQ_T4gfp>9rp~A|tCZ&R^ZD=_J-bj!bmvKfpCAE-fCRtVRHJjp5pao z;pL-<9|B|dT+U&$Tm?P#b%k8(B~e!t!rDzmB)bY&V$XIc`%A~D!`lAkI1yx^Ohw9dT* zv%oQP*$4@bTycDQV4^}r>S&mbetB<-qtB(@svbrZqRH)S%ccTUh3**{${v$#Ue3c@ zjm%tXCswCDFgR#`+wl}DvoAd01lsaS|qjqdul8J!QLes3@(M7Ti{*`Z{WXZ zO24_qhUxcRjw-giOMXqYwlT9Is4BqST~#{XxiaM2`@T^nv651s?WmLdyNf)UJe7I9 z=$)2CvCT8oTs6+RxlLW%dw*2!sq(@?{Ja+9!o`nU1%#?J9|T|UoAtbi#M~-+w0=Br zQ{`ZHwLy26w@;H`QYB}sKcQ(*t^zlB25`_OaTyD3zbRGnwzjsU>R`Hr@clI6M%eGC zr^_4~1=Z$Ld*gR!lG)9exebJZ%Pn!=?JjSSB_{@0jFBU$t>b zvl6U05&1?U(&)tS?pp82nZ;fn(YCBoHA&dBGyEi^foEt)zqb)>^y7~&-jOEKe%Vb+uqtKsOhunEqH$Sug^>dsqnIOD2~9I?YVlNle*9Zp%AdfWhdRcZUFM7wD^I!wA? zGBPqgMIIFY#;bUy-y-7AeyZQ4d(2pU@0D%2Zz`)d`DS99n~AvvMME_1l!hZrDn|4| zA?$qMY|hr)#LscaL}|iVl(1SAIP@03BDVTfN46qKRL|H{7?)_5+qI6ypO%FdsVpJe&OK@%|d3N z=FIinN1`iR5kdwhWt-f;dQ@CvIXQ+Q4Mr%kkKv{HVH-VR$qs_r-q1U;~rP;^hYUvkVF@F^aFMss3IK3ci(jS$+J& zRiGq#lTmzRXY@}LHWT?34l^nc?vH?y@NGu%Wr4^t62BJN&1(LuVL%uqIc(;)SH>$r zNks#r`77Eh0AYgUF^TsH<@4pBq_m0A{N<;x`0{C~kV(9#4ZSD>C7~0H<}W=K0wtv{ zMJkVHy7)Y zo8JovORDGh+TCs5ryI=oU0f0cMz8{&%WCZ>-ETdhK=tjzS&O*Ay%b9SI%>rUhq52Bt|LUQ+i@r(_qtXLydV}We~ z^N2}5|7onxMWA85L$g_%P{%aUBz+~P9O@sI1E`4;pP_|Qdj8M1j28oyDQqTl3%1ts zm=vURH#6_GtkEl&TQ{#41j`({ww|Oa%PkAgFfR(5UaVL;&~e2_z%VwZq8rU$u z&$NWB`E9Nt+mWf0Ucd~-b$_l+y=ci^vP~I`vnHTnoc(`!G3_$0BKzY;&vpwC{;&}e zaDxy+NRIFT-Fu#-L&9L93Vb6W!clbJR0@|L^jnaGB>`ygAA~*pEV6x#uOsP_;WQ6) z3_sEBJtU3F<3|%!KzO4|@4p{?$gpGp_2|?8_Dg?U4{FhMlT1k8r?S8}$f;T zMCk#Kat7{~Q9gQxuac(!tpC{~Co99SC8Ndt;Qz+51MzHbT2{FlZU^@Z$}?T@ZF4ph z|05sQIbn`T!Q1=#Z-jcvJK=wbgUE|q%%shZxk=<#Bv?W3dzHq~bwY;Q!4CN~c}XIN6hG%}@iYUOHGz-eVyM-o=XMoBARl_V`njxg HN@xNABZ6d@ diff --git a/public/img/emoji/heavy_dollar_sign.png b/public/img/emoji/heavy_dollar_sign.png deleted file mode 100644 index 5eddfc52b241b0acd24a80891f5fcdc72af35b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmV-^1cCdBP)ZX=cuLJ6hhHG~lIbm>#Llu$|uA>^rq z(x-37EfA-xQP-3N@DS&e?V3mZJn3y&-R)(s);RjcA z`Plu8>wvQ#lBDSt5n@yLG)F_CxsPXT$5Ht9^n)~LV*9+YUKu?hc*G>L=g!gjX&x)bSxi$&x?38rx4m{ zG4`K(U&vlK0McWFKZ6hw(;*_DKC0jGI*SI_(t*JzpgE^`rU&@4`YYnJ((E zj7NiDMon5IBsB5yo;v3i=m~XBzYF^{5J8%l0d>3wp1Uwpsz7_9h(rA~5KST?e7ybY z`31USUD7jA#Kyy?F{6McZG7Cr`77o7W$qRIB80)k!=F(=h)?y<-dga%MCWv0FGUFl zkNONmlN#pPd`0TtRk45$0Q*E$qcJn9oQa9A1U)}qmteiaVh zM0H#Wb6NAOp6Y8F6>+B!Y826>9Gg_SBy4I^03~!I*Djf!8(eCsTuSI>z5ovm?nDj+ zw39EuBYO&Bub{I#cVn5IUcgBdS|R)=y^eR^Pa5;o_vKQbeP9YT(!92;vK{?WV# zmwBdqDGb(BkT=O1?>%}VH$y|BJs}E|--=;j#%o7EzNvTcz5up%^y069A|=Wg3>Fp^ z21Du9)dOuW%9ekoyLvu7R7?@ftC4-}$bIMf`Hs_%X`t)c)-COc%B$6nw4*`J&1&_P zZbSh+Tf#e|{{%n@GtPkJ0aU0g6QD?G{0CeXz(h*{*wApI2Or)Y|BnIw1P_<69oM5! QV*mgE07*qoM6N<$f_dX1lmGw# diff --git a/public/img/emoji/heavy_exclamation_mark.png b/public/img/emoji/heavy_exclamation_mark.png deleted file mode 100644 index 4c560f5e3f46d3ec6361aebee9d689ef79525b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1315 zcmV+;1>E|HP)G|pD%s^mt43P+7CPrHbgkdn6g@WKl5tkAWBp`7miHl)eiXiA( z`~g=kTxp=0#gGIB1Q#w`nMItg?yl~x?y9ct`nmU>^S!!_RR1kB)aicU?(XJ1yx;lG z`8Xzt^Gx8Jb0OeDz`5o^z=ePr{)cqG`1$XKXK&pNSFdtbywl<8>gqdFEugp6xp%G6 z{Lbvs6>#U&2*z7&faw;nKdyFIYb{^tbOCW%1oRFM(~W5_fpK9UHOrb*?VoA!7>rXY znRWr5(neK;Br6I|i2*ebjo#FEfmjqfjvYkKh9q2UO}&8e;bA9AU7fN1BM{x&Q(pov zj7B?KmoDu^@m#Remp}xP+4Ku|4$3DfZN$P><}hTZOF)t^sWtTiB@-<+37oB z1j-QBr(OU6?rW(C2oR?iU{&=r3jqpYJqnVYVH0#Eo1brIaT%)Wx*ZXx#U&yf4(qy` zMFOlSHeFOM%^4@-CfwCq>h<=r5KvatcA9StQ_x)Ccnl*sq+p#@ID91s0fWI{|8k?T zo5VFc!GI7Eh%vPvNS;Lkz76BY=9^A<9tRmmVuFP55Y_;)5P&3KUT&uV7>HvqNDl7a z%0~d;^39rp`4a><5CP0KvJ#N6RzkRplZb*8<7QR@l+s!Z1+tSwf#Y@E2zd$c5Y`hS zVH}49wHQ{1)pk~6aZhQxMq@`{O#Xm~h_Krk4)?Q4z{tJV6#EVhb0%Vd1CDQgA4XXv zU~w?$M(DW!KodRy2NI!;q^tydT`J|;PJkaFAOTU}?wbHvl>k6A)*~=$ASM$fqFF0T z0djAp5Rid0nS}6^@)VHFT2aDf$0PuX5Z3Z60cj%{2r&r(wN#ZccJh255JJ0l`H}G# z$gGF7mt_K!(q@_|N*7H{I0Ga^gzjK4=w+FJy5HYTSU(=o1|6v7o$o=JrGS6JAbHxx z1d|frAgm=xS(d;9srtjxQa45?7$3s~HBh^60c0rvpjX#_85LpQj_3jl7T(WVzz}{n zEUP~q8OO5R=KsvaTVXyS9>4b5;=A|n-+1!stIcyIV0C5XD}Vj+{h!@xHh=rV_3OW1 zzINp|Pww4&xVrMvO4b7Yc<0XCdw1{t~7v1hRKNai;pP60w z_2U;`d?VXE;L+{dZ{1p0c)M`FxjP(C$A~1%0`qe-+*nv-AO6)D9lZJaN3B0+m4L@L zZ+><@#vj$A(ap_nm%(sIS(a2)O<9gPI2f?e-6M=gx5K!8`#=9LX4MA!W%;%1#;5yr zO_d@Bm>B?I2pHEjK@iZFx-q^Ce2`57QkeNdm7H;!JQz1Xz$hiEnC1m9WtD(Z>B`sx zvw%1n$ti(xO3PUZ7`pGz2cy6^4gq6{5#G(J4G!VSfuHz-TyZm+lXrdg|{;j3p8vAOa(awmTcCemaJqK9Gjl z9fW>tcDZrs(zgQqa503J7tAoA21f32Bz;gxKR*}_AN^7)v%C$yX|}l7Y~GnE?5igG zT#yzN*z=@+j8b|OtLnoEi_hyi{Ln1yz|w4^aoMC9523QrsQ(M8$0xwWJb-h}g@6kI Z{{|GZ{4J_TySe}X002ovPDHLkV1lD?X|VtR diff --git a/public/img/emoji/heavy_minus_sign.png b/public/img/emoji/heavy_minus_sign.png deleted file mode 100644 index 4a33f905ab5ab4928907a8e36d7b9a998ea15e67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e^#Gp`*Z=?jo0^((adGMC>1klFz@i?BG zsK5~6CfcJV5$d4L+GL?}|FFoLV+#+kEK`^pqwO|}sfn>P-^8~MBtMCX!9bT)r9sq( Q4QK#^r>mdKI;Vst0I(J;4*&oF diff --git a/public/img/emoji/heavy_multiplication_x.png b/public/img/emoji/heavy_multiplication_x.png deleted file mode 100644 index 13d666078656729c570e62e9bf287f74391b8d36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!4g~mwxc>kDUr0zuPfw4Rm)F?X zn46p1z`#ILQ-m6g@d&`?!X z<>TX1S67#ml+@PN1{%V}#RW73s6b9m&d|_MOG^uAK2Qx04-Zf;Pz%sNphZSTMnGLa zErNoAA|fKv($WwsgoTBHW{Qc4>FVn8^Ya6pp{%S7v=Qh+2?+_HEsBbYQc_Y13JO5S zEZG@+4d@r?k|4iehN65B1S1dy<^mZ&W=u**2Ll76vZsq z5f?dd_y6NXP2an?yWGA{d@0qvWyb@hASFSuC5HDND{U2jZpitA`JVSpLv!U>oxyGa zW#@d=9!;3&SjDt7Wy(F~tbX3OEo>>NA66aw=J7FdwLzp&jrgzGFq08ZZQ7#)?4nSckUMdK7;AUaZYMm5mUPhqq6|xI@HD6Wj z(tMd%w6)}buy*84K8Ly!X^b7UH~#l9$Tn~U_c2U25Lytp*|lqf5ATfojZ>7Kyx;V= z*7aiRIj^c|hB3eQurc_}Jp1TSqhLk0VBXtl-?z6(IF>5kh-W_{_2BP`>aOPZO{Rq} zA`6cj?TKmP3;FKKlFSs(ke{)SHML7X>VV=QsbxIJ`n?$#4oE#<7RmOOD~Qr^1o_a@ L)z4*}Q$iB}AJJ)2 diff --git a/public/img/emoji/helicopter.png b/public/img/emoji/helicopter.png deleted file mode 100644 index 344ad6076dcbb7399f37dbcc4369b1b2e8c06ed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2258 zcmV;@2rc)CP)(^b4-O6=2L}WM1SBOT7zhUu5D@?X z04y08H4qL+4GcgC21G?gFf=tLDl9M=7z6|aBP1j#DJeB6DK0K9EF2s!L`XRY20TPY zHU%THBJ)}PG@K?E-w5kDSs0aHa0e0!|`|1^h~+#Gcz-7&GUxa_en}hSXfx77#L>} z5uzI!BvyAhIy;sZ7elk{Wytb7uk16b>wnetO-@dg@nvOYXlQ8XBqPlrA200%J% z2~)lA7dKP29UOcY7bm6am>e5}A0a{v3;ZP{$08x5_ zC}DYgOPs)Z&g+oe@oBNjB1c+Fv*B-_sCc!;R-w3N#oNYc1 zyyJ1h;W$-ZiPPv?jGU9!HVRae zUMDUxrR6CgAleTV4QaF{G(?J^pvnmn#u5~q_Vsf*IdCs7CUGq|0000vbW%=J0OR=# zCL#y{1P0zi5fvfk9T_-9U;dl^?QnQ5vC}aAI>JtTh_9>I!&B~{hWg;@$?W0v;QspI z*in7W8~^|XNJ&INRCodG)B|v1TNuFcZ*6b5w)I$Z8rHojf(f63&P28Cu5H`4ZQI7P zeNKv-G};|J?ytu8&v#D%Z@u-_->3z%H@MM-2`)7K)CXMZ+9SY+KCC%7)q^`6NDQ%O z13sSyC(yX!0M7=*o;|^$eSl9}@`4yMVr;BlNvCtUbb8~4My&4832F@Y=?>1dYu0qc zYG%h~_Bys}YSFRx%7=a1fkQ2O_R}gRzToIQJRQZ6w?iRaA)2I+wV(gO3mN_LJqi_ivedxNchU!K9^ zNYc9iPzIbz0&A0$5PhL}2`s&D;2S4O{ z<$Ixo(u7aJJi9V$R2QhxTO82dcK*oa>C-<+P8MJ#x`{pf{`C7@*Yf?)e3(5t@Z$3Z;ul!jR*VR0pk~IiO&AYUyKmQAtwk*H6 zetlG(7srcJOJAXNl8 zXMU$sQ}*~_=g_k(Mo!zhXj`C- zP#o~ZcA!Ab0xEE3Oug=3Nxnl%AfLn3#^=@pt|xa4LL3_<{vHaR4ts1*b+{yRvwbzYRVPWMe2` zIRQ}hQxbacF%1rrK%peaDDky!yjh63F z6!_IU#EMK7A`4-gglZy>3gEtw$C~1;6qp^#@%dQZ{j4S?6sa!{IzrO>Lptq~N0 zr82snC-s*YReSfMk$S|{y?64`sPMXaj!s*>(kMby82bAC%A}!v;SF>Rj=UpDOEcC; zlN>rphd0vYT807@bAfv-}rm#*!Ys*zvwHDWv<3@v+?~P2)5fG@cj+pV?|h|iYs|3c8-la&pU1=wGyg+ zc{!htk@c7)F`(BK!!Oa2!;T>@ig1P>zD1 g!H#uNgr+~`9@KhXCR>`v<^TWy07*qoM6N<$g5{w7LI3~& diff --git a/public/img/emoji/herb.png b/public/img/emoji/herb.png deleted file mode 100644 index d58344fbf945fd9f9ec1444473e0371fb5832a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2914 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 diff --git a/public/img/emoji/horse.png b/public/img/emoji/horse.png deleted file mode 100644 index e28fc4d79864c0c7f8825b4a57902a66936f6fc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2744 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 diff --git a/public/img/emoji/hospital.png b/public/img/emoji/hospital.png deleted file mode 100644 index f1a795928a31a2fff35ec57c4a39463521047052..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2895 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 diff --git a/public/img/emoji/hotel.png b/public/img/emoji/hotel.png deleted file mode 100644 index 311a2bac39b90be78bd8e6b0fb11ecb30cfccf44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2965 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 diff --git a/public/img/emoji/house_with_garden.png b/public/img/emoji/house_with_garden.png deleted file mode 100644 index 250d5295ea9c29aec102a50dfa72bb9bd6553e37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2874 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 LNkvXXu0mjfd4*>i diff --git a/public/img/emoji/icecream.png b/public/img/emoji/icecream.png deleted file mode 100644 index 3f72f0ea7a29e517c8073ab7f984b7cb31be852d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2587 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 F{tp9DZL9zQ diff --git a/public/img/emoji/imp.png b/public/img/emoji/imp.png deleted file mode 100644 index b42a9fc6a4948b39e4872bbf94fc9ff978065c5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3399 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 KMNUMnLSTaT(1EuA diff --git a/public/img/emoji/incoming_envelope.png b/public/img/emoji/incoming_envelope.png deleted file mode 100644 index 232db49f7a44b892152c0728eb1f635e5dbfb73e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2180 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 Whf-Cb5t_sR00004Fh5l%G(sC8 zDJ?up5*HjEDKP*504_XC00jjdAuk;!G9M>2GC^BDQ*kakQ!F`5NMC&@G(aORIVm?p zDK$eRF*_b8GZPpb93&_wHcBWlN-#lLCp1VgLRc+2QAAsHJyB{!U3*Ajd^$~MCo@Gs zRdGdJc^@e-A1X2b|Nl^GhEQvVQEZ4^eV$cukcOkeOlN>zexOilg;8vYQf-P(X@rWX z#*3=Rn6}c0ro)-I)LVI&Tzs62s>zeF&Qx%WSag$up}?HD)l+Vam$T7NXoFmOnv$^0 ze44tDuF93N(14)5RB(=0bCFqin4P)ST6mRKa*$wup;&g5f1AA5_aNoAC7a)ZXU){{Q&;{CAeOv&7S^#M_Ur&0Kq%Wre6vYKUNfqCZn`(%Fx4LZEc$=)c$$^)xL~x*(w9s^tv15s_Ggy6!iS-} zSaXeYkE+hq-lVw7k+aZ@pR%90&y}yrca5gt=ihWOXzuim zjRA6M?f?J<%}GQ-RCod0)Ky#}ixUU0ZkV z*tTr3!GE8mu@a#zIF5R*~q}c4VyUKF3dBDMR#Lkj~f*md$%a@ z4AZ5XvuVRZ{ree9R&ejI^Uf7F799GHg2v)=dF(sf6-#F5J%No|WO)DMjdhZwl9Hp} zR+1#CYdr3cmu=Yyzm)5ja(VtY4G0cW~y0T@`bG?Uer@7eG4!}>k*`&gMv*MNbwouY>767PP8AJ*?(Qr#fxTnh%4 zWku&oGQ6<`W|Tg@c=6)1WaL7IBsV&185mf?XAR`J1!BrbzVtXLzo71a&yo=vZg~SN z{t_@SPC&c<-VIxF>7{~rMVvx>v@{tpcz>NH7zYMs3WRoUewdP7FXbytM#Pi`ASP~h zLcvTpVBr^lsntGEVKU0T6*2L%Km>AIU9s7hn1Jk%gVtQV09V-MYHvgmcz?kj$+b(! zg#zPlkaFyd`88%VP>mkskZz2F0szJTnxhfd5=RObs;{H}?oR=90lvD|!YIc+Nwwsc z0SmNVH6IS}60Uk+$nC1{=;`U`a&$BtUrpfY0@JgXC{?VK)Ui;&w34Kv$=OsggsQx6A^!b~{~0iFlZ-%R%V{c7rKv7p>&#=& zXf&0S&7}T~eJ3a8+}97vS74x-3S+XRD(y0Z=WGiHLPR76gTZ1kXmTl=&16cS#1!AA zGUZ}0aE3XG&6dh(BYO-6NfZJH=rX*TG>SsfR#ful3!m9i(ii9@`0!LJmCIGyTkXOq zHC{%C0^=PyfqaPqv?L|0HlT{3T2=?x+8N5}_ z-HTL3gaeaKrULE<5V+<42JhqE9;o@$@=C@%faDIOo}8o$m;pq0eMEi>^ga5s^2Xrc z?~SM3QHX#U90<3q*hka{WMx6$qbvNuPq8MS-H9msDs02yfKLUmPanVhDR{4_x^=5a z@kjPPG@!yqFJP+)2K4dEuRwvCtXM^2HeeuFqxT3R=+=Z_eHG=+CZM)9#hdJ4Lj-Gj z1Qb{qVQH=*AaG($AjP+{2^ciymJus;fhaSM7g7;)U-TQ%3k%0ADq=1eSd|uLWo?7> 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 diff --git a/public/img/emoji/it.png b/public/img/emoji/it.png deleted file mode 100644 index 7cc0279b1c70e5067cc0dc1b82bf2243cb3fe007..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2305 zcmV+c3I6tpP)})c79D*gwlOQ*H7$k|584$E+T7R^Vi~jx2#^#I1UL#; zRaF394Rv#KmmeGfXb++l5hbQFe|~#wYHCwaQK_k^sHmvZ&(gfLy87|@upu4C2?X#h zB+D@?u*1XVGc4>eDH5|E01^WLI0rc0QA^TYDFp?$8W&jz2Uf^qTfk-jZVCm7Apmp@ z0ErL)!yNzr|Nk#2|1v7Z6%hX+8vive|0p5fqSf{{R2~BOCDR?DO*T|2Q!J{r}_J+uqdGIn_hj)6?Y{6!rA<GDF)>=;Go4k{0FO-|Xk;+yDUc84>mO_B_@{ z6um0}wi^FEH3Xp>R_SKRHlLkxTSyAL()Bphd z{r>p=|NlBN?+^($(LpT8Hb>u8CCWGb9Tx(o9pe`g;x{k>tr;P|F96LN`tbGz$0+#w z{1(M90iF^7#2WyN2?2`|0Hz28z9SpdJ1NmU0EGbnh7$*?9{_?8UF>Z4?(+bk3jmt| z0I(G>*F*qy5CFXxO6XoR=TQK~3g|yI{`UMf-Am>R1wP_aDY-KV-8Ih^5z58J0OTkD ztO*FvE&$I28O${I_xS;Q5&&`!=OP^67!w@eK>*w)VDEDPyaxcZ2G{}t3D+?Lu_7qn zM*l`T0NoP`<~&h^N+b}66e$NpArhg2prXi#6oc!yc48(?oMhXz_mS*tc4j`lnc4N)eW*Qh$nVEP z5B*;dye}dd7zv|I$inkI*+&r)yeBhAxkts3+vff^`j@|EsM{1br{1_*H~TIiKqPT_ z7p6?Lj~u#_`2N-HU;nV!NiQBa{0!;tZ*mkIA?$Hjou=jDY&&_}U{NXk@ux_H<6 zsQk`Lm%z{DI*9oi>AZNBrKN8?@smmq4Deq*FBcasZ&@Bbcz{8|Xde|t^=WbAD-O@S z_W0FplzX$VlDuTRK40VYs;S`Y$~G7vKl#TW;Q#o0!Vv!g7f3R@Q9J^rr(fK^>L!0a zGqDYdC$9iLH9}cl`NK^K2Jq5XVaht^3RLU&C&ZCYPn zg%%*u#$T}Sp^fFUr>ABut4a%)=2_A|0dXp23TmOwR#NwmtMv5v6kJ*k@=7J( zF=Au9jU-gL0ywCQlS7*n<3JOxc_kdDL@ZH5Q`Fc+0`Bpd!iRwj+Mfp#Dxm5$}KEH9#wkuBwe&W6S2VuW+)SqXor9sRB)N|3s8V25lN3URYtM_3J4gI zgpQl9u?6HPas#Y2A|-mHNl!o-ZC{555t|(n@Y!VpZV5Kg3P2i3)nOnFcl1< z4jM$NX(`cMb_hT*BGIZ0tpf`TIcRk>!HBH{Ba)C=ufiP6`D0MAFp2e`4n0i8Km!np z5y_7AN(HS6YaApd>+CfKD4@ZB8&5%OoSV?TN7u5|a!x*<&2e ztP!dAO2ocM$U|#z25dm09gx5V%&ivDnjp%I^Uo3k{Q}yz=|Wa8@Hin!tOEWV;4oCa zXc5T+|86pIiXksxhr!4?jMbpfhEo^e*kvL?3Uji<>E}565&P5^F2Dr8;crh8G1yVO z!+_`3ufsn)2=dgMKVyxLJ@wZm`%(b%QxubOGJDn`VlXsYVc@?ep)Sz;*8KF!Tv3P( zwVc={R^i|yms>A4%Pl}caO&%+6MUC3C^E7&B|i7NpML4%Qy=R6{nh0Meo|&dESq(& zH2(5tV)Kyz1lXygEA!9ivulJtAf7i5r%!(3Am-yq`Y0ZH b=>7R02=DCiem`lN00000NkvXXu0mjfW4;im diff --git a/public/img/emoji/izakaya_lantern.png b/public/img/emoji/izakaya_lantern.png deleted file mode 100644 index 20f09d831b85c3bcd8a64a28f549c331fc4985e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2680 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 pn{XEeIT|T699H>Tl4RvQZjSdd{ zR7I-*3;T?H`%*)(01f-8oY)r@oER9z3=yXZ51#-Fr2q?>0Smnk5{(xYo-ic%Lpa>d zsQj0R_+e1|z_r#ZCi6ZrG!+y4W>&Tx9Oh0$&?X`_H8t=!Ewm*feIy_Kp_BHdn70-c z8w?A?ARaC*F5F8*oDUF@gi@c8Ud1;s%s@8PIWfF6D*CUZ_mYG3T1vhY6r>LkK@AM) zG%Kti9+M9ba8F9GF(|hP54mPh;zBv~@#6Y*WF-v@kT4`B8W*V#5q(T9RUsbo(^iH! zCA+PF(Zi4M>d*O}kMpsmQ3(p@t)g)a4a680-j#^oH89?#n(B{%t(|dDMmC*ECb~p7 z!H#+5+qUqvtMZzReQ-qTq?n3(NY+F=LpU(Vxq;Q3k*}OtpJqhPH!s|WdFwwk>f^;x zH#Fd#k@ALjk4rx1cxl`t9@uqf>6wkXt8KMOBEVxT%a(}9w{=-gONVtq_~D4(!A!zc zM9rRe+0C8DyN_iH3uYuCYf?3iYGm`lu;5ltX&oB*=A=3sH+8!meyhQV9YKKNk4f&~i~zGv`>3GyPNHyJluG()Z4zP+$812Q)^Uv2)I zci){iZ{BA_Q{O}AGnuYZtJM$o_4Xg?9XNdS=+vpJ$zZs?-lx7k?GxI0qxV%R^@B6J zcJ=r7Z``quWPhaH{(O~6^>h?~U5EPnw{G0H9?xr&7ZE{h{5>5o zou^gJsC;~G^sC<9Lx;9PIXUZB>hkh}e=BdEF`?N39uvovQ1f~%{RUQgLFc1fiAFZtMd8Ok` zEY`0mfkj*{E=X7?3I+%}9!#yQsfW^@^)>wLPn3Wmmxl{sk~|bII1syc>9Zq8mM&cy zLzWRU14WzuP6^ECLI8w~q!I$l4^te;ICy{QGvai_}(do|ipHWLqJF`22(WK~Q^>FjJm4Zu9tJ1mT+teReYH{}Y5)XpZ*Er2s7y9GvRB)R2H{DZh_=J04`p3XYd@g_@cFO4m5m)Z zFg7}(snsf5?^HRFDf3bv%MNtO)CM#F2wX|W)hh?;>bh`ZZ|#1mRO%#ka+2=X)O36+ ztLwT_^Ag7j%~@;A5#JEz`VV^gJ4T>$;q>4&tkUFld~sB%5WfTTXD(mAY0p@5-l~5o{le} zyaj~aCr<|AK=JMp-oNqsj%?Xh++=Hu?a}=0FALxLkJo}>E+N>5M{U737X=FrEH2(7 zCx9|uOH@?Uj-fro`=YkbO8a6+ySpQW6{W;G>z~vBqZEb6RRlit%v}>2?xJi>&1(=wc1Hrx?BTcpMgM_N z_e+!v2zbL6V1BU4ybaMs(L$JyE&{-@0sW8$n3TtSE(Ehss5II!nO{^Pgb2XjvD=6S zFpFfqQYqg*Brci1wjvs;03a^J`Xhv{nH$(_-7uS-S0oaJh;Tq68HOZ$0Q{|Jfk}3y z>}Qo$$Hj?6qBW;}xY*Wq;lhQsi@Q(7iTn*{fhn`?Hn44jAlnUY9Gkefp3@iG?p}V> z4(&P9b@8<5BNOB`OR$SG8OX$%VmfKgFAOcs fkO{{?{>S?Xh(4uAh8#7y00000NkvXXu0mjf+vL;? diff --git a/public/img/emoji/japanese_ogre.png b/public/img/emoji/japanese_ogre.png deleted file mode 100644 index 7ba2ccbc3524322a69614d03e4c093d14e0e7e76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3546 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�A4ylzMer4y;^YPp3Hy&65<(Y=>m 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 Z`5Uh;I!n7}#Ss7i002ovPDHLkV1gITAO`>d diff --git a/public/img/emoji/jp.png b/public/img/emoji/jp.png deleted file mode 100644 index 72e856af76a1ee9794526e3af16984bbc5f8db91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2606 zcmZ8jc|6ox8$UB+nCzLcWiW2@QWDA)N<{{dt%%Cf+`Oc&y5^Q$8M3A&vU-#dCuqgoM;;>QxU-ff&c&!v-5;Y z&}i^?Lm{9(y)0x200gkHuroIGvVbK22N(?YPf1){+&`BQ;o-3{F^P$Zaj|iaBO@VI zd3kweW@c(?YG-F>Nl8gyU|>x2V_{)oZEfxJ^mIc*!-Rx{jEs!`IcaKY8Xg}0{{1_& z|Jk!=IXOALzP=O+g+wAfc<>-TJ{~f0a&m%PO-xKYfBt-Vc{w>bxu~cpI5^nZ+1cFO z{6$idwYBx_+qa{lqRh<9yuG~{495KY{Os&(e}6wTulX;grlug_(9jSx866#MY;4TS z%d4uY%FWGXv)RSP#gKVaM1-rW>%oHuqobn(0sBs+S=O2#>V>kI+x4k@pzC!4u`Y4x(cynu~;iBD@#jDi;Ig8 z0Vb0PQCe77fauN5&5e(bHvtLgYL%6hT>t}do1C2d@#Du=AT>QR1Cgu;`+EVV1xU=y z%yd8i=x;!J07#7jnF1gTU4%xXRRQq{Ap7mxw}F9yG9Wh4-{02O*3;8dU0vPR*VjU) zH#axe0I@b8Q4B=ZczZ(t1qB=mX-#cyEfD|u^=nH@3zUeTKYx}2QRe2xAdu+l>Z$-@ zgM)+f%S-t{U=oP3*VdqHu5NFC2NH}G<`@v`1>#Wjpj?mcS1tvJ`Rx4pwvI79lexZu zagDPL4GmE4XiZJj)HL69ET#$+(HxL@s} zI*otfAL>-GudfOGVr$FiMI!yib^WeM{^4gPRoocl{Au8Jzy~{Z|yJHb)Ky6nNpDlYXg15APvJir}JbIijA$sSW+TgDe z3*2hhgerFTJZ&QS1_q%bUh;I|uOkjtT%KdnPktO0|IUC$bR-8a$fOzcpHQzQapt<~ ze$N^&;Pv>aDhMEIiQ*o4nv}==vG!PgE8N2}((c+eEhA)nr&ZyQe^iI%@d-a)gxx(9?aBx7?34rYyAL)Eo=nR1eq8IpokhuC zIcd1lhnK15dZ99rim2COdk3DnD@;PQ0=JuV0Z%4toMY`Lj=VshI%cULmTW#f#$7b3 zp;C*{VY|1KX%lit=w#dHvGq%MQhW1Z)eUp4Gbpwd=EU_=g>ej7zk@LN&Gqm)&sGCs zmSS^I+G!Dn3Y*7kgbE+CW0#F>X0!N1LnJ);QtmozT@jDePv05qat$gJa4)RAr}dK* z+h_=PB!pa|w!*-z_AeRtu4A#Rsne(L=;E-gisLHv;&Ah*YFilVe9Px@U9fqduCnfY zvNG6LC)$@r?hf`~5sc~$;mBjB*PMV_#YxkI2*%7cXje^_> zzc?gWXYfc5zRSP`qr-Gr{NoW1jb2x>BGK!$za0l1+HT6Cm31X&d5Rn*LE&x`$6 zpd}iG!C(^CD^NrPK(ate^2gfono5Awy#8_TgzxV@+Vh!#fzf0#1XXsr9 z$A0nRA(2;4fb2xdY*#w9e59wRP(O`r{@k@?-KUmMupn$kN>Pw((U_pe2{I$YBis-Z zZV^hNT3SKw`G5Ef7}tdyEvWxVX4?Ue&>Pt~Zqh+S%KNE2sd&76Z)S)Kod64;dH~*h zTAF1|Z3@k~=di{p8ZbF8M(1E2 z)ptcNpuY)6u(>XP;;t==2%}5Y(~EB$ZU@8BM2)%!;5bo`PX6HS=(|$kJJj3RdhLu; zY-(JbBH!j_%FK2)v{V!8{(CX@Nt+&UArW@jCm$N=XkrlORTlU zWdm}u{8tk`n7X=;Bn)=!p}W6;Nde5F$K+zG?`-FYrW;%{P1zzv(`}0@3t1KxmLP7= zN~3Llz{`$ay{d-;bh!4HuSmbEO3QjumuqAM4mP6@_l(@!pg)hB(W8`--@3dt zvEtg}RI-;_JNErnd>lTCSLWx+VOea1bB9o0J6RrQF+-f;*A5#V_Rk=v%lG1xKNt&h ib}1}V`j!yg#2^F(Ek8$V;X}1 diff --git a/public/img/emoji/key.png b/public/img/emoji/key.png deleted file mode 100644 index 69652da71de8a3d88d3863c6e37bd5dfb6b53e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2125 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 JPDHLkV1oM`>z4ok diff --git a/public/img/emoji/kimono.png b/public/img/emoji/kimono.png deleted file mode 100644 index ccc8c56c321c4a41e7e3f54745494ea354d14886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2721 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 bezN@y-q%V?mJXy)00000NkvXXu0mjfzGC`^ diff --git a/public/img/emoji/kiss.png b/public/img/emoji/kiss.png deleted file mode 100644 index 4cdaebdcd71d0b94364babb9977688c3cc5b2ab4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2969 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 P00000NkvXXu0mjf%kY-l diff --git a/public/img/emoji/kissing.png b/public/img/emoji/kissing.png deleted file mode 100644 index 48693a09a78a305d07d932c47cb44e69ef472954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2872 zcmV-83&-?{P)!k46p6 zSP$M_5#wAA<698oVG-tG66R+T=x7rD*dqSec>diZ{?>2)#v%UGXa2q|{=qK(-iiL< znf}^<{^2A3z%Ks5F#g|>{^qCtz%c&BAO6x{^_Lp{vc#$RPg9BL2l8{>dT!z993982qjt{IVVY z=&%0XBmTfD{>@PT>%I4y82-8{{<>u(!7cvFOZcZ8`?w$Qeir_` zBmU4M{JtOfq96XmBL2fG{?j4(tR4QmC;q)E{?jA=!zTX7B>(ER{j(?fsUr5A8u+6d z`>rMXs2%Qi6#wnR{kkM@Knwb@9{#^1{@^42!!`cII{Bs{{*TIw*Jpl`kWd5 z)iz@_3H`Gm@PQWbgcknCL5@-n{<<&z=db?QjsC_k|MlMcpBVn!SyL_t{k0(c!ys`> z5&!Zf{?1AL&0I{e0B{@iE&;%L8?Awwbp zNGJ!ESP{^W7nyb#eMSswISO4d2L9fV{jeqe*?|7gV*b@@{>4!AmKprF9{$jF{@yy? zu^j%;GOLId(Y`p2ViD-PQ~%~8(WEo~=_Fk^3j2{4n^_V4$sza4AoJBC+PNLTrzwM5 z6HO-q|M?~U+ll_#mi^R$`@B&4t}y-3f8d@O|K~mb??nFNKmOKC?BPSIf;0BYTzy&( zWJ43$t3LkNNj@M2z;_gcT^({Z2k6Bgh))lyW)XKs4eHGx)S~Mc0000zbW%=J05vQS z6$uUk0R?}}KE%z`A=4UH+s3x`H4Y?=Wv}>__hOF5MxEXmb%9{K*h4hm(nD+bcxI?1 zQKg{O)3F5~B>(^is!2paRCodG&$V{kKokbxu(XAy2}o+q(1grk=9m_z4kruc!qhne zk2+Ih)=9U#qLbDPFJauL$b^@n_g4w#zw_S{$I7F6dfWRu!HpZBv%kH!hpI14bM1h| z!8!PrfOA32f_9FsInH-5I0yswtu5~_TU+)33}U8(udRE>0EU4{~}3uN~q}uG;c#>>P=ks*=g*y7GsvXEKUv zk`Z%k8(nexKAaLsT+@^<1r$vqBg7Q$u-U2g>x)($a?_;`?H8?1&ZpQD_B)+*S3z_y_v0HEQ-TX6~QLunt+q%d=|mEo7%sf(Ee|3v)sRb3ootJsW-K6p@1_PfT zTh&MF0!h+QYI0~`1_9(1R17hz7r}dV?>ip0v2A*2g_$?Mu z+=12F9&{Va>uDabdyXiqKjObfqqZ;eZEYiMZEf>kY|+u*@gG(-zK2CTU0=RY-9vuq zQ0HX?m2Il8&fd_=(YXIUNm?uph&6VdR#-Osi`3dz5K;oB=)oSp+Hnh2;pJx&sby* zk0&J&_zbv;>y;`N=B{qxc&Nee@jru@oPGFi;Vx7v;O@e^hqIGvH1h|ZYgwHu51`9i z*TPX_Kr8|M-I@EK*TDUmyLwP!k}-;FS(m3@E;}rH(M64ZR24SR~T1jX2CItHL$RPQ3{HaPKhCK?Dir# zySU(L=qOT1;G>dgDhXQgcoUDAQ8?i--#wGYB)nf4-ur*=eMxLYusU>u>R~*UCN&C$ zohn~Gf%e-%VNxMGiKo*_wQk_FVvVtdZ1yWqD2%D>dJ^r|g+c-Ul+9+RVu5J0Rev&A z8iRq@lx7ei$uWju2#Tc*Sc)P56JnS#vOf~h48%aN(E_o8y=ht!r?_kc^phcmfIOTS z8SyI&ZCjgQeLyoI$%taXO=YC%CcE)aeye2*4503Z-bb)38&>2K6B9Sj95`?$ymo?u z1BFR8g)jr)ruZ!_Z`q7zV_E3{4+9c}Hu-#pTs1iNmr1AqaEVhG(8oDfuaWpFmdMS{I6G!gz-1%VE`grEFEn%Iz)!b?UHy>Kud&=!ubiD z5Aj-+^}WkCkIx@`5F#-_2qOStL6o*vB7u>ip>!ZK6(Q92aK0he9hU#h9iM*?iG+Np zf?+TPmq&sIBY~2^9YhAkXdik-xlLjHmE}8EuO2%Rk4H99Vf2et^dmvg{V)MCnBO^( zNs{P4q1C6z*Q;E){o|qBZ`byvyEukHJm zj|*XCwiHc}Q~a>!;Q)FIm2FZiGDhzh)MnS@io^YXFC4o1cP4%^uH!oG7(b zK5W2vFm(h2a)jNnV=dGV^)`2jqoQ~F*pVT9S-Rl|V9?OU_w-_P?Squbg zywBEa4yKN_6MTL(L?=>%gKL%2Su!c-^Kw!Ugk(N_qOHSZdBN?r(`Ih>1SL@xFhy#| z4rT4c;_7M=$a!80dfLsl7wCbj!sPCWN_;*kEHXD}`UbHmtU@gE>CdA*Zc_#J_hKBj z2Cw_wnE{CxF?doDLmk*MJoB#G+wj8UA3h=)Ozquoeh?klA_ahSVkP*&o89fEh9|fG zf+{M^-pUWVYpP3odfu$A>He_NYp$?8QU1%4Sj)^N9dnu0hWqo^$LX>G7fy!yf6IT* Wa!0=!uxB^`0000Nj9~)W0RYnr022@Zi5CE}5&-7}0MZixf=~ofBLkXb5YnC>s%{fPCkD|Y z1>m zdKJ!}Af{vwt$q}uXcB@|55t!vzd#6@a1^#|6v>txrFs{ueigQd7^Zm@t7Z(Hauud+ z60?LDt$G)SWfjh&Dvn|iLn#JKDF%L45B%0<(4i*!#yxXh zm>&41BfgO!=CCF9y)E3SB+{QC`MoOfxG2`8C;GuQ`Hvs>t0R_Y8OE9=vV$4uv?uYd zBI2kZW>y{W%vsBxB>A~7(U~3iwJhtfB*T&%xP=<-z&_xgANhkF`M)&sh#dIBHiBgw z_?jT=!b$mw9_)b{yowv*vNEcKANSB-u7@Dke;C)EAn?UZ&5#=z7ZmfnEu?@Sja3r# zgB#9>8gN`4Jvb@y%252$TflS|o^c+;i5u3C9re*=_J0}@5)r|cB(HuKn|dF#aTlLt z738`?q6~}-Yz<(KcVII+b8jW8RrgR*hY#G_4A?T+d z;(Zv`m>%+_AS)>&xQ`@}ZySwm8oGEF@|PXqjvd~W9xfvej&M-%zB5)w8Lf91l3x`0 zlppE8L+H9W%zqi;gBrn;EAX{1opTcNj~$0=9q5%E=e94aejODP5X*BHOF$;qi5aDh zcS|)E--sHegfa5JI)G?8f>aaRgdXmp9kGxs_rpHpsVzV<7uBdR!?LBbf+LuIG~A`ZOgKO&%2?_x0%R~B)+ViC-P{t0000_bW%=J01Za| z2nq%P0t5~f6d#rI{Z1YD{lo1j{tYARaXj;Gw!JVq@-v6jh+^UVp!V)S_xkvwt5yDW z)YI!*HQD&)WXGP88-A>EYL5KJTWQi$+^h-!00|jML_t(|0b&?dfXQ5ygBW!#9u6$n z#5olBRTQil3Fu~La^Ohx%cfNBb>HCV8?&BGu$Cody8S;Roy0jo!t6oA^nYI01l1%ie_a$Z0{KweIz z2)`&32Zj%wfR3-s2mpf0CQ&RlusbnV76E1J>H_jIic~aE{lV#=ZpNHZR96mEQIu1u zj?IY*A|M0m%2#D)uQIFCc4Xp2vffQBGoU;>JG;ERE}$r*(jHJ-S%9^Xu2J}*qy&Gc zySuKtyDx4*>LEdbhaklzf<^F4f+ZApC&k^}t?u5g%lFSrJ$ro*{xj#z`D7-F04tW$ z0N|0`ED|Io2}DT;zgqOpdQ9(p_Fj@mgbs`BFo6Abg#cw5?oTRdnVc*UWq8}6`$X_JLZRNFy^l1Eog24zvg9Us(%~w=1xjLz+*~8a`rWnA0 zDn&`Fd9BSZ{Gq{!xVY4lxZ>jCA_j-1X?pugT5<)=*}e=#0P+e)-)2$nBu}7+*}*N$ z#3ej=G8IR>&T4@W*)9qbZ1%Mi=)YQ0;kZF6D zppw-|&9ARi1bFqOqFi2y2W>h8{D*}?U2vOXGSjsX9zFtu3uV&``uJ*rheE(7`vj9E zbj*L`u+T!+4D3dS4jnQwH2{Le;Uh;(u3aeeWY7z9_r0kI@R^{bC5SfN!(T1&G4`pt zYG!H#ehgrss~d53QsN`w<$BmNg2n|~6x|DZR=3)@OlKP#8~b1~K1l$8p!>29I)?xC zN(7E}qtqR(rs0WJrN*e+%96540%>s4N z2nlcEVZ4cB_6;nagnr=J+a09(DqYz#-n-|Ti3#}AEOgNrFh7h@*CGuFCMNp&T&rWJ z{TcMFpUPb7dvcoYCn00auxDv_$}xbpc2_$MzhJQI7a>0^Y$L=BJu z_ooqleSL~mqO<+!py!^7ns2_Yd@Rw5ivWXnddo`_O3N>1qE&C_UeU0MFJyCX+s*GXk9*tk|xu#x^!hO(~$Jl=A=pf7+cC z{GiFk#;4320D%npM@mon$*WfS10d0X&2}A~pTGEH!Qfy)L7Wg~iFP0r{umnK|9EkJ ze$>IwFTgp_+kfR+)yDu;)z=OAkaU9Qf+b=&MzpE>o4Q3>3FE8)d=r>4Y zGT~QMQ~5kNI`~0fZANYFOti}wASgfx`T37qpg(>t(5GPb>%TwflQZSDwK=R{)_x^b z0O0;LTfb-aNoAd#GMV&2Et8osTE?d6oAA5OVCuffrLg_3-_Bsx_Em~youQ$f@j3GE zw~;Uc6rlOSw!KnuWnMm$+27yKl*=<(0722e$?L{+SC7l)H)mvI$n*PaYHFBFdEW!6 z^v!MC)*t``Sgf`6?V9|&ip!TTS68Oz$(fL0W|Yt67oJVIcya#5IK%4t=`lPsx4{w$rmuWS6}@e(&Bm z{g^|deeCa2aYyk4CpkGeYNR?Zzo!4-r)yq#0g6!7(pvn&cW>)dk3=Phg@r{%x`iLN zwX_VNIy)Gem(d&@8OI!)PEai^ZI6c!xJ8DcYdFOn;=Z@P+qOmv0o1gTs|4U2Re0DyJC2`48*Lvyy3m7m{<6DO>#5dis*9zB{2fQ8DpRxMeAx}dssiI#@O z=jqi?0^F@nU;x8oH(jXKme$}W0N_8B%!xWDZhJ*zvDOkTRRFA6tgi9K`*U~%0zf3N z@+_+A^_i)2x3qLe05<|Ka=9XJkGhK58UVl=0^r@fC_>b!D4jk zii_KSzybgO_xI$McipdUheJeYpC~Rq7c-o$vxf+P0dRu0PWo{5xsItTjYI|Dr%-P8 zcAcH8=Kuia(D+09RL41SMVpTHQgs4=*MN#x`if3l1-jR+czIDzI5_}-LZOV7ml}^m z6}LB9T6%dkUJ31#A^$6c9|vGvz%x9k6vsD&)_K7iI=~`wxfJfrDw`Wj0C<7wLL1`6 zl@Ey5C;S8fAvE^9)fX&{_Yd_Bq&mYB)*K`BoNp>UI|Tsr?iw!*?t2T>ucC%^@G$`p zP{%6mjXBXl{;}TnfJn5m;v)6T+az>csjCZ(^$&{9*{BT*0De_64!{Y300uym7HuhH z*#*6RTG^fo2w?D=B~4wIIzur#t8mLAO%=FOmB{}j0T3XP=BD>%g6-&zr z^0SxH7djjK>2|D~_clGUWBz9tK!GpP+MVm54nTN&m+)%x(_>;5WbyGq!8z-8t|gH% zGhtWAfFGnC`!})x;UDYoFOw}Sh{e+AU?_eE2`+igtw^e*4S*=J3yKGcrIo>~oQ?Z8 zC@D1lH9~vc3@aGKV&xRB)83$@`XAV_{Uoj0v}Ii(Xx)}gtCaAm|A!2c=7vo>cW&CC rsf6zP|3**=2;Z6iUdRppzfFGv3sR(o^(l5r00000NkvXXu0mjfUW5fB diff --git a/public/img/emoji/kissing_closed_eyes.png b/public/img/emoji/kissing_closed_eyes.png deleted file mode 100644 index 74f7bbc6b487d114900cce0d305133fefcd16dda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3056 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 yLUBazpFpyRD;9kRWAeo#|;1C0{5R2^OFhx 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 KMNUMnLSTZ*SJaaL diff --git a/public/img/emoji/kissing_smiling_eyes.png b/public/img/emoji/kissing_smiling_eyes.png deleted file mode 100644 index e86998432716da051f82e263a7b23a3235ee01e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2882 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 G$g<^Ux{No`8O@6P8nC z)3@`HI+%9G5`q8#2VhA=K~#7F+|MU)>o6Dq;1^%EZ5esf*Ue!#6X)2%;a7f_PTWnq zTMrtREsK+y_p*1=KknWw?MF2K_3sZ$Mz|F%BZ7>!!bOt5i;gd?h>C&qXb2%g5m%Pt zKMqd|qJg3*n^bV9LhMu&8KRK>VfZqN+5}tqj^C?+p5Mt^nAlOY{F4-%ic%0gnhv^s zb`)a$?qE8C94Vx7-<8*lD8YyRWXz5{&vQetIb!39e~3xc(7tR!Qgs``hm3hHT?1LL z2B_;XHiQ(mu1cTBn{!cea8heix>l`LvoFALjna1Q1leVQuoBrN#o~-aYVZ)NjqCcx-6~Tu602y9%a*(B zInAYq*jJYBzW>+%x!nO4MjOBR=9`oifYXhm3qOy5;ou7U@R!YyH@#hG92~q^*a3XB z2s~4Gb8xV6;jIY_o0mU}Etr2bI&HBG79uy7K%X46Sf)o`p<&Ci4csa#pDdZ4p6Rw& zEdN;rxYRu}JzX+cF5CK>B?BD$zO29Q^>klfUw3!xs&se5g6Y?F{bk=DTRgi)X=*}kr>u1|e@u?%tnmh{cm*Y#HiR`|m{*q!!20-vWkN1Yy4Fdd$J>DBYFaQnC5y1ti!v+m*@i-A;F~*^G z%cDpC4dBtE7C4Ctu{eUmy9Etw4(SCV*d;aE20*~#h--YeZ)v%417g<+@aK&iEiJwh zHDV461OqmsbQckvk?NnD?btxu1J(M#^+NMmmR@U)Y{Ee`b++=mp|;*xjQFR@w`wjmtx{+Y1bIi z(ijEB<%aU&RTG_V-EQV1>3ol?(x95-MbLQ^U_MZQ1{BbS2;Q8^Q0eM9|0_RhdTNr2&MN(0C=giTw9a80 zP&H+zQ*?uvV8oxN4`S#BRC;!kYQW~uoenGj{BfP$?X{|52r8Nu1Tk?04p9(I!2oKj z*R5a2JOV#^U3$LVZWW=8Hn) z;Y&vdmxqY>Y|R}tJOShWH7or5|HJwN4m89!gCQbgILJ50W8QIK{fa;R z|G42mk;iFOH)RW=#y|ltLof}z0uUdI5@a{2txiwTfeo+$D;m}xDe`!&rNeic*-?B^ zuJ4t^7cf`Ek776987{SYJw->>ubfB2n!}FUL-VC-PzY)g62=G#2{i(Ut4rsHZaWUI zSuGD6`G-U6jNg`cQPBhrfq)GkK>`7!n=tMz`PTSLb8~HcAq>X>JRJ8Uxl4tlr$I)* zMnpD1CqQ?=hJXpO0h0bNuX~^RE1IpKUl1^yBIV_oJR3)s3ElCule6S$;TS;BZwSFA zbBnEBhG(PMh307wOT85?Gco!LAz(9FOli%RauCXe*XdMHW{dm35s>td2Gh2s!nRET z4Rz_CbpeAM8BFu(!`GM*$$-&^6bv8>09Zla>ju!UmY8FAiNgQ@002ovPDHLkV1kqG BBclKS diff --git a/public/img/emoji/large_blue_diamond.png b/public/img/emoji/large_blue_diamond.png deleted file mode 100644 index fe23f839b2b795573d3dcaea5d533d1ff3a19ce4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2269 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 diff --git a/public/img/emoji/large_orange_diamond.png b/public/img/emoji/large_orange_diamond.png deleted file mode 100644 index 3d68fa12f725eb09df472318d1e608c501bb507b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2313 zcmV+k3HJ7hP){y)mR78J_glI2DTvs$zTuBheWSm9krm2x;O)_7X!>Q1-mc=)k+4-W);kC9>`}F zv}q^JcPq_%G1HY=)0bSictF)f2AKc=)lUb(DhAa*2D~8zwH^f4QwG8<2FEl7$Y2l1 zWE0GGDbbHow})WatbWLwaN5$t#<;4@!?oer&i#cQ{gNI1jvf7q9sQIZ`js60pdkF8 zAMmw&{h}c4u5kL89Q%VD?5Ab0yomJ3oc)|2 z{h=TFn;iI(81TA;@3VUHbrA5mg7e0i@3w#Zn;!a-9QckF_Inlec@pw*5ACaJ?4w-q zzl-(Lt@()>^nnijgB{!2Iyx_JI=gd=K$=3h;3W^R8|7tY-D9VCGy0>}m+~ z%Af3@Snr%q_0FdC)wA@77>g)Uoq^4d-MB_=Fh#zk%?53FlJ> z@~2sANVJ_plq9n@_Y^qWfTl0fO2P}h7c-hV9n>)YO(U+AoJ;G}E&x_a6`2k^Xy z_MA)9b|dnLFX4G3^qEEGqF~#RPS#8Z{g5!^n^)(hY2&nrl{A)7lmgOIG+>_1@gdGu+C_-z)tY=Hu}0#rfID;O*<` zAlz%#Hf!69yZhAu00ntTL_t(|0kqFGkfUG}!0~g}YOOh!{@hxI8HSk;W;G0?3s8g> zhw>%^(KcS6#glp^Y1gGccXxSQxvn(m|Mwo-w)*Jm+E{<<=AGLc>91Wc<^SGTe}D19 z+nnWpw`1M?`L~8`o9h-jFKE!OUpRLDZ6jgNwQSppyjh3Pb@fjyk!Z!^%|yab*Djpt z_^!WBG%YJ`nTbS$esg?n{r-;cTaRu>aIF(UTRhg72e1c?9Q@lt6v_$YMe^6{^16y~6xc6NpSn zqYUPU9YAoQr@BA-SU=C0K>~m%Qt7FYC)*eK|4X%Mnn=H>qy;YNmwUnT!mF99`cKcef08G8{tw4Edfbk)~y{StS)2%<2&VP@vk z;iQ*wGm7qH#$Cy@)a*HMkgIc8oV1M@Dl@w_GqX!G_L9r+duA9r%=xN?`M=?pHGg1L zaAAHfJ4R7FlBMTGMMcF_FB&E$y6WocMn^~M>bl$$FCpGL1wUW(Sej)|OpG?&_J~>K z*g*EM79&f|7K=r%*C!(0V?8eb;BC*?SRw+yph2@F$7tGQ*0~GJ8b`BQhLso;=mGC- zz<-MZMQf?N2{YJW$WDuqT(t!ScEFDc{wXM^bx9s&xbi&YH?X&IGBqXHrK-8F0AC9D zJy%t0lT%XDYR=zaHnX>;9}IbFZh+0#hl;N)AVAH-yz}83yIl|CEgV`hsEUQZh506?$ zcz8k(%L=^7Y;csEy~=FI!4ikTY~ooR7akr?9HVOu>Lz6L|(@w5Q2he z00o33a5`QrE~+m)3;7)l^+m;KAS62a$uiN=gx~;*&Gm&F*N;AiqGF!sI0E@q1L0r* z*#8;Y{!wSaf&ylNGawkp@zeXK?8Wj*!b*fAoNi_PVE;acy|9}_I0$eA1won>M3b>P z)w%utQO~3)z-AL5Y_kQJ7SA8<-{%@C;a(W=ULb0oG1-$=bLaE(i?=&p#@nr`YJm$X zNPp$|Pp{vW`Tz<*g8M&N`Q|Y5Wt<*>8s(8CN%kmOS=LRs|6gpdmT3y0m9-4qg8ln) zLxZ)Y3}~@7K>hq0j?GM4f$4^Ou>N0XXlt08YnV9)`L8uBw6(Qezs7t$cjp(bA7;LV j2lt`>Z{jxdpWmO4RXz2*g~}I~00000NkvXXu0mjf%Lc0n diff --git a/public/img/emoji/last_quarter_moon.png b/public/img/emoji/last_quarter_moon.png deleted file mode 100644 index b9c7ec115881a48cd7f822ea4adfee37e217b021..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3287 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 E1$SCp0{{R3 diff --git a/public/img/emoji/laughing.png b/public/img/emoji/laughing.png deleted file mode 100644 index f084d3c50cf03446955e160e0a5f550a14173f52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3113 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 D9j^6< diff --git a/public/img/emoji/leaves.png b/public/img/emoji/leaves.png deleted file mode 100644 index 9340ff82ac26ac658587d0193a7c3c8ce6485f03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3038 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 diff --git a/public/img/emoji/left_luggage.png b/public/img/emoji/left_luggage.png deleted file mode 100644 index 7f0ce1262d4703827b229b7896efc4558cd25a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2491 zcmV;s2}JgZP)%^Z8g>F1TLT-5 z000047>@)Pe*_zu1s}8k3`PPKTL(6C1Q?A38=3_&WCSu~2Rn`b|NjX%+y*?|20h&f zI@||F-UvJ02{YJJo$NA(={Je#P@3#cnd}Ec-Uunm20-3QnCwTE>_L+2FN5g@KHVaC z=T)EX2~go+r0zbC>$TJI6Jx+1bmt0K;R;saIE?EhR^h+e_zG0v@bLMm&i6Zw>okMu z2T0!tO5j41>;^&I2~*+V;PZEMzZ`Mq2~yz*OyLPl;3$0P214Ed2bTv);Ns%+gpce2 z3ZEr;=*Y(ODu3t@W#a`mxej6D0t}@JTjCpZ=C`%-4qW0UUE%~X+y*_l2~yDqM7jbB ztpz*W2~V?xjO+zD+ypSU2S(2dS>5>f{s%eN2}`>RUD6Lt;k4EG7i{Fr;`#_l-e{=r z0|?UwLCy(K+Xzh120+*Y5Y!4+(c$6uHHqj6R=#nq?M0L86KUiTN#7D?IX@tg{bfuZ{-9v z+@Hwt!rk}=3&s5W{{RD-2~glCe&h~1+zVae0u7*ry7IZV>ErMG2OZbi>ic`M@drrR z20hIja^na|yage)3R}_$C&mac(L9dkErj9=bL&1vc4oobDcR&W^wGhqdel z56sEk_|)L~A6eqh&-FWo>JB^I2p__$s@sH{?K6kzBO0uvqU0MGxZBzE0V~;rg5$By z@eE$wGKA>`E4m3V)&(cI2SB4%pXMoi+ADt8zuNUsOWW(~`R42U4^!V$PR#%Xi&vN1 zcXY@nAilKo^`z$caz6)ZI>LBGE&DNP~Sv3C>Bht_#LbWXe*V@V|~X_@Z-iP)cYZmPM} z;c{)Bhs)(?ZJy%(B(Oxy8A78mQg~)d7D(|GzH~`B)ep=Xg^9f#Z6HjuJq_;{gD<}C|>4DF`- zYs5rfAh@Ek-w1d6LFV`m4^TDbBa_t(+>M5e{goBLD8QH@!W4dPrRmncXV`~)oh+0g zVrF!K0m6dd7Qk67G|=06^N4Ighyh*T3f!*2gP*5Qe+Q~@2cRh67zbdRtet^Z^a0C8 zEk{{aR++l*gli~*pw>X=HbOUI(FVFIYh_%EF7v3**k*z_&Z{4UxQ<*~*@Xf4akv(~+3}O7%3+u`{%-sbmMr+`3N6brc@BQK-yZVc?iqEFClRRX8TGwrBe_ zu>*r|IQiw1*cV@u_s!z4)Y^K&F?aCB!8yl?R%6nzXePtg7mdKa4lObK%PBiO612L?xkdXnvjABW0|HuU2Uwl1<1Mh11jtBdt*YRsLRcPoo__vRg@THV!O zd}RRq0^Md-5)Pd-XQSn*DVa8BYCCyI=u)51f?p2|_?=>kHq$gMKvJf)Qa!`c37jRR+Ljh5{^&JhK*{0YAeqEQ41Z zJao>KhNadU(yxzUPI5S;r-!!u>Nwach1nVBL*Q!gip6vPK)()HU=)EZt)ZZ02O56- zz<%(Fy&3FEqtI-BaM1qX@i1y=fs#*c`1`npJb=a7Fko_pPX%DO8+5e~L*P`{WoiNH z(^9<41!4=OEUvUv0ZMk92>^JEz&(J#8C0SI+IAtP2cou8C7S|J+{XZ5H3HN4?m0&( zfX${(qd9%Gk*l*WLy5O8632Pq9NhR;0rH0)^DkyC@``I+zw zNbexcUeE(^YlGIVpSq>PjYT>vb^o-B46X4j@UC|$Zr$ig;K}b*Mf&|o;7Vo~U-G_7 zfUPS!VEW3fvZCF(GOYtvwi4i@m9-$X(XQ#Q{-J3qQ*dqNBLZyOvKDle{Lfs$wJqBS z@Xq%2rJ(757F=52{&(edjUXTl1W+{V$V?2Y=+JfFbbC0?k{kr9I0qbK-8H;AGE;se z&zOAJ;p*yUg{!NF4J0GafYZe^=T|G7H)f$6$P1B_dQ|5ts8N@RAg>tiA8Di1bZ%u* z%IKqgWaN#5$zeB`aaI=Q(G1;Tg3ib06X?pQ(!;HVL06G1+1f0DXxod@Eyyw8Ta%E!AnqWW1FR;w9kTLjh{T^jBYV_TobASK<002ovPDHLk FV1f(Gn&toi diff --git a/public/img/emoji/left_right_arrow.png b/public/img/emoji/left_right_arrow.png deleted file mode 100644 index 467f39cecf3f3cfee3aa0d92ecae8ba9634cd98f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2289 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 Eg0&f&w*UYD diff --git a/public/img/emoji/lemon.png b/public/img/emoji/lemon.png deleted file mode 100644 index 9476213e6da775d25a55cb7295faa36f7ef03798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3314 zcmd6p`8Sjg8^&iC`xt{6>nLPPmP)e5q$wr)(nw^4kR^MivSm$_CA+LimXO^bVMxgm z5u#!2yP?4_&-3>EFW%2N_jUbt|8Spk-RFumHP+|m6ybzGAl%ok;>`a!_P=3g{--$& zVQUZwGsM);^0L0SAqz9)wksPN4iV>vFtb5enIIy35HV4RFdsC=lBGMAE25mk;t4A& zCnSTwoMgxP_6}RNJ!_U7n_D)|uTrFW1oFKji?JVw!xK;NOs!O#jxcT&Ow`y;z6x^}~hBVhGslZwsFrn|7i~?pb4Rfg0M{JCpXmC{qTsH;R?{2jr zQoo^y-thfl6yvKDFe42viw?%H2fgDCDiX}>;`nwYm$rLI7Ej_EQ6-rv9Y_(AzKp4^iD&yo~L4N4?5BtC@^3#qmMk-2thwJ||#8 z^LwlDWQp?HgyZJila*mzV8MK@RTh|Yqz##u=jwhZxz+~22jWF1Qbm4do*=~Vfs2H# zdX4s6ndMd?7e5p*pg^sL*Owa>rKq>pTRd~-qm24hL}UI`h~IoFxVu82t;HVn=pM~H zU2R6Bg-Zs;3)YohSnoPB*=7AJj&Hr!Xt6|!+O87!T5jRjlSF^?Mz?5Du2^)2&~mN( z%CtdGlj87a#pzMIqfXhfX4w)Serlg6ZTKF!PlZI?RR0%=AO7aX77%%HO+1enl!cQD z(D~8mQwNtl8H}0FN?}*BlS~Uq%?oa-2MpK7l5ZxIpS?$WgGa06P|Ac=>+i1B0?(L~ zmMzD%H1PijU_5sk3W2Z>T*FGMy;zG|3S4%8kwA%9goKSq4f3~Ey~{OHW>uaP1lq~@(d{ukmZD zR(=D7EIE!wMj{$TpZ3>kY|WYW(=hF{?A^-BjpCx(3`=4c*gb0?{pOX-^{bb;I6vyF zO&;q*+!ck7Pd{s`P{Py8h@L?vu2w3!)2-F!v9spyM>0aELm0rJ4h>)gXXW0nai*(! z9B7Y?MZ0{))nvlxO!g7)x{G?9-nXc^{9ET|Q6a6K5;^GG7@;pgAlgofooprk%o~Jp zBJ&>_8cuw4)@EewY0;)yViTc~dGqX%ze9Tp`EV}xjg)Wf+t+dVyS{jyBEfOS&HSCQ z;2xb(e?c7UP&9fKnGNZYpR-Z*s&qdrOF92D$n`82Iu<8!#?9@cv+?c0XLiT`Of^T| ze1S@vgLyzZ9P31yj$N)l)stxcEB1yFvyTCpLclJJEGO4s3HMp`I8L^`y6zKcE0KGD z{;~E@6#7-c&{8QAvnetZ)^6V&_c;0Q%*wQ4gMvVpp7#OftT?V5>AR#~wd4VcfCNu+#asL%^;16O)F;io7#IQ4%&X`RESC z_6zsUaT?X$>i5<#A5AF0uOQ)ArX1s*XRw?4;umqa#>gTmK1Ds``S8lR%aaFB3iW1Q z514!+j@mlJg!K}zaA@dp!GPsE0{-l*9nyRr^8l}N_@Zd?7sU<36)7KX?wrK zvJsl2vjn_lOKY%Gl}2k3mo3ng6n@c!7`5@+;bhvLeYh_wu(K(q zBs^p}3%QtXsG47lBtrO|=<8mU?LFz8>BJbch}MTAVX0@(_x$^2drD~hen*NRZ#5?P zO>9Z;X>+WbLLRxEIPazAIGrsW@(g<*L6nW7yfyw3LY;rxnfBm9b2FQ~weW46q&GX? z*)+>ZmcYI|2N(L>+QGPA@SiOc*E^su(~0ClKBx9gpZV#xY{X-p#O5(nVxn15Kj~GK zEjsqSWd>8d!zZm|#k9jY_a|{`ReJoBuODaEC+JxWcTv#kNg>cgG5uO=y64 ztvuFAzku9CB#MKeRd#1<+HSl57i_pJv-@)SW8+J{N)C4V*1ZO2S^s^_wzzB}(S7k~ z<0Xp2IKZl|#RhZC^7`Y+=qSsc!k4MqHc8vz1Jd|v>6bw{F&`G>wsm2G7t;L~#l|LF z4xPt5QjchbL>Qb*hvWK7s$Sanh%ky3hG7c^q39t~$*jl|{Bq(eXRDp!-(2g$~fO z?zgDwv=s-It*1Jdr&C2hrp=^fhI|HvmsLG`8KL7hz+&dz8UKh_8NB=LR(C{cz$th4 zsZ7W33a`IE0~U4s{6>O&1Kl6YteT8o%HIeyswvm!9zUmWQ^l#i ztCO0|FAk9t7vR#O8=0|<80o66Bg6kTl)s{-7S!#mq-aK4kJb#-)V4+*-6; zV@~kZ>jL}9f7Q4PZ>eyT9+pjb*9~Nd+!;dYYe}fFnQk`9)CyDUg*@(6J=#@|u@+*YA_v!r+k~0#;EN`Hyr_G(;aS;O1 zxSSCoegy`@zZq_LK0clxD=TYy33J_8+=c?-`EoH(_oJt7>6vr34~T88 zhub}Xnu_cdl%7LX*ZD4m1xU0fbVeN!?9wP_be~@JDOW>Cc=~j(dfAxW%=~5ll*yX!{kb^(ED!AsACBJbppcSd1*aMcDy}CS@Yehkrso&Ce@d? zg|iN~P7-H1(`^|b!;3A}dtw{16W`U{uczC&ucD&g&b`K~|#KeR_tiNfMm6DdyKSu8FZ>Z_hqYE4_eHhv29ZoLa{<1cx7*kA?2@7CR ztdM|^)g6{@J6lmnH+Ss6_PP@p^wN#86tE=(-d0&$_o*~#StQC??ASzF+JM^SAIA}q zglwPwbb7=RK2@}zuV^(?A4)w#C~Kb|9^RRnvNMBaN^v~T;_u`Z8w~r&u8NYlTjglo y_%*hbJlFLx1yS4XRe}rU5$SbskA+Mc7!H_4opGL!qAhU%XuZJP9 zYaNkv9-40+n2RE|XdI1_ExT+UlXoGVSr~d_8->4e+jI({h90tY0;P!~vwse){`>xM zAC;_7&WtCt>(=vu6|Q#{pOYxOav+?WKER+m#(x~Clrp;F!0+hL@$TL9cMqe=o8FNj zz?Cb(gBq#A#G2Q83#y?)#r5m>t5nRTPROJ?&s!LO zrccP!uj1Rc>7hu)Qx7(;Ias1yK7y~oY^|N79R;9&rnQ~;7)8h*Qd)09EFd>W&(UDS{_wW3tR z_xJga9Jh<*S7 z6iWbxj-86CrNGk9;nk$)hA~7 z57$UGX||2FZr6&cn9ZiPZM$8Z?V`4An`>O#zRz!;{bnZT1m$PkU-{SXU}nDD_sim? zm*0HlpuZkwGsdnwsrN0Kj{otbSThfY8Kn(6%OZ}@u0CrspqV8Y8ug4e#T5tdW5-wBXRfOL~&S{KIS$d zUD^qvUTPxnRB@QL8#s}k3MaaGcx>$i!`3)!JZ5rKo+bj!)_McB>F3~tH5ZRdqH{r* z%Pk@5n5jU5S?@Q&nhA(Y1OpC5M5@RJJrU2)gGmg6M?59+{Z0h?nb&WW_4byPK|w@1 zUa+nIEfk!KGqlMio{ty=)L17jj_r-wtBsAr!;PbV0|QCR`hrts&k7XG6cK$+u~ehL zi<)r81#xC5y?^-YTc46hEqA^L1IbtP`I7oI^aMpb6vEB~s+WmCATQ+rT!sc4zayEj z6i|fnl^>%UNbTj|l*$F>0v*P|FizOW@Bqn-^f?=9Y~OWcJQQ9 zmySQ7Kwd4CN`W9&2in73)r85>e2$99&o!JhBMF@t^D4-$pkOTnNSkf`Z)K!XY-4Q$_*H&IY6dKZIK+&^^H2Ju(tV z0^{Le%*g**&<%h>K!6GgAU1Za%>ww)f9y~MD3uwJfSTXIL7R{Ni*7&}tW*Z5wiYlf zs5XGY8PIt5+bb$1Fl1!72fhy{wfeP94Fp-0O66>WL$zQS1!OABw=KfX+mkX0G$@xd z;j_2aw2#B|LZMP30rSqd!I?@n5m@r=Kqbo=c3%6(&1g53N|83z_$fTVlV}$w1!hSk zb^vD_JHDks@Gvg0OF0XBzpMMUHZARD|2NlQwD|G&@J~e`l}fck7zGa-1Rk!a*tS4| z-1%!Apbs6Zq{68m(4lIhLhKAsT|JC~eI7JEs{2=v5CeCv=}%S2dg0_<@Yf+Fi)s#^ z=CRKp@b#ec5w89PBr`tnj~6b1zke5ks%*Ua7_!g9^C_h!>qq+ygw8a z0D(=_)wkZdT4je{i|%a{h^;6zR|M!^I2%Gj6nDj^xVlnO;OF9p!tn6=(Y}v9>g$i> zqedFVN=yju7hAFDG#vV6fBw4#XD7OTRpnm=6T)*q@a5>>;ON&-`<{@m?_*hs@82vy z%%up0LjRO_eWZV=|NQ%#KK)xsp=}}1?4i)N!swU9;qqR6nzBb@DzKnz3rl#G zWaM2Tk+(1rOl!!L?TP9PG0YbT_Y!HcW||N@;}dGh+5zEja`E{J;hZ6B8S3*4E_nXD z+GEd72s;ak!Q&VFS~zD+dZ^Doj|-mogyBuzNnjBrjOy$JzxEn)WN*eNPvC;b?mr!B z`Tt7h8XMyT=m@ zo^d6Dr{!MA2cbAT%h0rSL-RdQQ?~{)c)_eYu02t7oP2%kEQ41WrmhXU%?3r;Xm&&E zQq15@f!17XhtY88|1}(r!uEx+SirknBdQs3yxpz+tJ^*nGYV1X@TCD$SxzPYnkr?A vulaX*fxQ$te3dbb#xnRx#tRmq;2-1nBMN`Yq!j$i00000NkvXXu0mjfAHX72 diff --git a/public/img/emoji/leopard.png b/public/img/emoji/leopard.png deleted file mode 100644 index 04457c7dac15fc8fce29d4742c5dc1094260c59b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2575 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 diff --git a/public/img/emoji/libra.png b/public/img/emoji/libra.png deleted file mode 100644 index dfe79dea0e3694fd49dbc0cd7400709b7a1eb31b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2499 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 diff --git a/public/img/emoji/lips.png b/public/img/emoji/lips.png deleted file mode 100644 index ce77512dc1e86ca66eeff83900cf7617d4887682..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2367 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 diff --git a/public/img/emoji/lipstick.png b/public/img/emoji/lipstick.png deleted file mode 100644 index 68d56172fef9cdd9f16ddd57e950b1a7e2a3c1a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2310 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 diff --git a/public/img/emoji/lock.png b/public/img/emoji/lock.png deleted file mode 100644 index 40fb235ca38139b229d5572466027e486bcaf2b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2476 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 diff --git a/public/img/emoji/lollipop.png b/public/img/emoji/lollipop.png deleted file mode 100644 index 1403e38f00d59dd6cfdc5d0416f359cbe01b9680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 zcmV+b3jg(qP)3d7iKOG zbS@KREE*0wbSNo|Ix`A!O-+hhP!20lFDnIjRAmYodk7nYVorE)FAgC`NiaJERRAt$ z05ju>3gwOtz8xiCjNheXC%`5tzi%wwn@HY-gMuY;#4a(A%vDdR3C1@$)Q&x+Z7yK4 z7JL<2aR*ykuMrDA$k2o{_1dQ1eGbo5AbY?$>7y}Mj?Y$t-s74i>a9VfT9QqVsMKK` zer#^bi-c&J}ytS9Z%2EU}70X zy_*?1lOarBV37RjtGP8qy?mEZn1ZOHtyiFGM~w!{M9=i_J0QV(95{NPPoW^DdOz8R5N2X+*}$T1yDYwa zfe%r$lQCqWQf5h)4dormMB4MB}r;+S&PYBD@ut}k0kw9ih_(@MugN$})*!E1PWo};d44tlH$ zzmionUo$p8n0#VSgApx7XJDPcBD>2ps*nd`I0<@c1xqptHX%I70000sbW%=J0Cg7= z3LYo{1p;SU4l+Q3PRe%v+K;hE`inV}sC3{}Y^!^x{$~ExyjhA26;(DK~#7Fw3TyUT;CRjQyb9_wQbA|2bm`0nb@{bx3O*8w(X?0ZQIs9H+jzB zY5o6wXYGA)#QqN%Gi$-@Igr^4W=;L~>9O&+HD5no==rM}LfAP$Kyz$#xZFT4*M>vD703{5zFtU&G4oCWucxVD z!;K=#%ge|^qPR9l5jJF4H&);PYjIxHiW?;_^VfiagBfas-S;~z+iE^r06$@6f+OM| z<9L_5hewZxN0$r~3ADitZh7j_%cct$VAVUeX^`S$D&X#&G<|)25~L>+=D-cTP$AfS zHUF1V;_`8}bsOTlI_Y$MmnRf$4QHkmaK| z7C0X?+%ck)W{IlPOZvZNg;aQfQymUdefK#ml{X2uRN$=)DpdS z@1E3i<>lq)JfE}%u7ef(iu1Gii`wDB=ELs5k|l(9a=F#jBkD~OmZT^f3!-^^-Co$?rif>qn4Ik zcp|ioeEoqB_+uJ>ev;VY!hKGIx3&5*%v^7!@j!9ssF9I2#0cS*45a{g1cEYFJbj;& z&jGD0M>E$iDwUNyUVi=^e-sPA5&v_M;LCX&7zT$8v1ux4X=#;~c;M%#q!e)I`{~mX zf(_%v-IE4ygCRrDwf~k1gQ0@LfYX8har(50iODE|hKb|E-Cw*yhTdE=*Z$bI=wuYe z+i!1{EHQbf&?pB6fqRhtlsNzfP-w=xy7u3UMS1YRUUJc*C4~xMRzeJr-^JZC2eh>M zTxu_~G#yiI9tRQ{q^ku14|?WoHuUzy~kI3g*X9)?4q7Wb>RN^#rZ+H(! z*1A6T*CQ($TI;ebtEy^1{>L>6pI-+;%H*@oHe_~TdVhIY|K}leT{u;u7`y|S59JI;`X{{Um4Ups8!kB=>I689@W^j|&wuW!6 WR_%LAbH2y`0000 diff --git a/public/img/emoji/loop.png b/public/img/emoji/loop.png deleted file mode 100644 index 8a06fa098f64e54ec19cc685cfb3d300644d1073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2339 zcmW+&c{CJ?7rtSVrBFhW&iCE#-gCZlzCZ3CH{QbR>S1nCZU8uJY-C{dt6$p3A@*Nf z@K5w206SQiSQ}pTH~F>MFP)cg;pzVcexG&AL91wAT*QG+5g;FdV)*{3nhR>hp!FQo z(?Km2bW1=r6V8T%VkW5Nf_e_9=D=kFoHPZEV&IkmN$(bkfWYcu*kVD_qS3C-UB}oG!y)*A6y~VAIA} zXZ_e>ZSS%GJq#9gU{(o6#o#k3ff)t2v8h!S*tEc<6fmvN&x#VaA*hf zMhKkcMkRJo7mo%}ay!@S`6Np~H=~BjNL#J1n@>f+uZb8#f4pTO8gL zuZmUhB!fYQ%ZvGGCJQXzf*}EJb@;v7%I{nU^BT~9@vyX4K7JX3=H^#6@21y1BQCHR zr$WF2-_-{u`QOc+&SkW3Dh4!!zy6-sx~ZBtZIMZPL-`4Av>1FRpi1r)d{7Ojx|q2N zCgq=|*N#UrCYJY_zwClxVeJ58Xlza=by^WiRg0r4B`=SE+pvnjX{0U0;#yJR<;ms5 zih(t0yR_<$pY0>@j%go`-=DE7W@uvj3jZ1WvbfVZzFE;Vv-*>DSU2L!!Um|vNP0J_ z`w<+jwlcd0GD2h$A4!fx7ALKjJwiC- zHTAcD_X^<+IrC^;mVEY<3N? z+|=h+Egz@Qj2#uWO~}pvUu3q@dg#&h?c)?K55GtOB~72ruNFxt{C7R9W(yA@?&(06 zq$5EQgMFZX{E&a%l&sl`K`h?2TV|wN(Dz7%m6ZR@hjTpHZ>-K`nB-aoO0{R&dk&Qr zvs;$UiTQS;MoJW9_XNzt5hJ#Ad54g-!Jk9v2hlDVYoq=rf2VuM<>%Q&EKIili$6v( z)d>3Cn=8H)Ns?u|*E`;UCrZZe(Q_iQKv+b{ArWN0PNIoAci@eWitzw0PJEV^aM5 z7Ip&a`Mn1f7Q5hT=Fxt{Q{MnSzgxTUXy+E6CuZ4VX5wMQ_Xyxi*3vM zTi1FuOjRy)xHL+Vla6xecuAR@^r|QuF4G^^-Z2{Fcpw)QJ+iEFoFiO%@pESEF^&Z@ zLGF^^e%?1d#7`pF)SDewqPL2(9^}+olv0s|X=dga^Ddc+P zT6eX;_)Z~GGiC3Ak>K?TPQwtvzcVmMKQ&LW)Z!AHN*=-)H6xIU5+9VdIHQf_)|QZ| z#v)J13LV-Bu0?Jh(v`veE`;Cyqq@uPq-?sSJSO%;$!L19DjiEibNyaWWV`aX3v1br zS~;4%C!SQxH2HpRvx_T+(`iUg(_OY()Z!sQ5Yri|rO@jfVIV)CIs2jc`90nQTrEN( z^2qQTg=jVzp9D_nj#q-nF0BUsyRyNNUfD` zvR|pz$|_R(qQs}P%o3Wmh2+2%-$!I(EJ66xjm@<%E!_(C>sLhMYf{lCkP5pq+jOE> z^uHj&`(q>mq0j!2oA+9(#A6PF>qIB9fJ{rQWTYI|yY>V6cV;+zp9Jn6WcwH}RNm-o ziY7+iPDGoI6?@&x7b#@+n0mEw6`slzmVdNqeC8mj@3HV&h3MNy)_);NyHuqKTM1ik zy{GJ@R*&hkF|TO%a8YMRIDZBtJ;|@FV+@{|OdOBp*LATsq&C#KX&yCO6t*s+7aj|~ ze}&d}bZ%B^!1;XnZ;}7B;M7DBzF%IGf~Pt7nzHOA_+7ag`OfMcSc|Gx8ksrJW+4Ja zdUOfm7%%>_V(A)xd4^4OLj7SC0tDhxDWk=ao%8Z&i=Ea=de?p86%?v6pJ7WI> D4`5x@ diff --git a/public/img/emoji/loudspeaker.png b/public/img/emoji/loudspeaker.png deleted file mode 100644 index 8c21f8cddca6240ccc4a110e474bd7cbdababb67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2871 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 diff --git a/public/img/emoji/love_letter.png b/public/img/emoji/love_letter.png deleted file mode 100644 index 3f81d271b53705a12e23e2191c73df7daf01443e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2065 zcmV+s2=4cZP)lw+=koIM?d|Q;)6@1t zG4Jp1@$vEUKrZn+9>s$H(|ZGxR|)-Y_BeL^AF@EaEgI)YR0>Bp28$9qcNzUbDjo3f@aQ-w>^m#zI4SBnD%B|*-7X-@A{Nah7}6&jr>Cdv?Ck35>f<#g?maE^ zLNW0_F3=_!<~JtEArg@uLj>*>)a8s9S`?K~^< zK`-X!=74~Jetv%UoR8)=C-uCv`k9ONWK#J~Jo(Sa$-~0GzrU%esidT&)HNpe-rLf$ zuH9l&=Qk(TO+DO?g!hVj*E}xoJ}vWGNPByGjEszwl$4T^lK5Ch_mqeA=;rdRqWW=Q z^W4|SM>z7Mn8dcU^>}Fcq?!9iH1}Og$Uiajg>~|0SjSaI__L|Sy}b6Km&apP@W;aT z=H$v(NXcwp%1%GbUs3nMy2^HH(20M}d2P#rcg<>E)0~vdkcZBmnDUc`(JUU%t*ZD^ zKhnOt)Y8-7wXWDjHr2?**l1bO%gV%dYuhy@;Yc^m$;sesUAmZ)-8ClNn~>hs)Z#%f z+g?uF%*xK2l<%^rux4DXR!a3!LEwOL?w5*sdV1=)v*_aDKl1kG0000ZbW%=J0O8@` z;o%!2Er#LY;o%A4B;n!V;o;%o;o(>-;^pCh)ZF5yBzgw`00f;$L_t(|0qxIYU?XW9 z$MLmoD-CA0VQnNSE<43_lD)|y<xzU9DwpuWhzx+qP{Rlj-v$llAWFeBMO=-?!6Y zK0ZFslx0f4D+{1Rl2*F#NFgC1LXt=%3SSw&Yzh?^v%JN4lUq{6%AkwO$54T3D=ONJ zS6{<1Z55O+Ei)D&4;Za_@+f zBvN2thGdAL3Tdkj7WVY?6j72d_qX&y8&YKegBc(&YZYJ&LR+fKk~c%QUFNTUTF@XP zyq^UEqoUo)v6c(n=Qf_(2;A;%?H?^zx#xNm48*(jma#8(t?%w$3$3PEyT0;wc3H3I z+8v1Vs1mTw%GRx358OesevK^SS3wo+7zSoX(KY`pOFOx4&E>MwWIz4lbvhda<^<7| z|B#brt38=b*}Xdx$gZ`e<$PNnL^lTnW(Irt@#`+j&Wzd(Kn|rgW2dES!zbRCGeKa2 zfUZn%T4p8)Sq4z)k|84qv+M- zXH_blTthDNHFBLwMZ8UYjo0b7akx$}fPuOEAr7`xZw~|?J~*1MGikDPx-5-Jm!JPS z_&U(8x3V4J!(0%U$aQfbjFPR}om}YM_e~~kmL@ApYch4d!G)aLx0Wyv2laj;4EVcn zwij<@@cljB>CDU1YBbusJkwjWulbCv#oIa5TNoIPAPCB~@6fXx2;G}nt(>IQzJky> zSo$4yHcGx54Ff33VQteN#t_uoYjVnq2T?Bwc38iS#X(VbfP*ouM|NN+=Ta|eNG~6} z^lKE`am32RI504eWiKf$#xVBfp3BO5;2HL1Fs!(=#Lk)r0`u#NOPeq@>q?$_{Gls- z&BmHai|gitz>@mX5{$*TDJ-m{w0;Q)EYdfy88?mHpkFi;n6}u?VBP|TeepCZFlNEh v@wa5@f-zKJ%9w@YZpp$iQ-=BY_yGR{poomK>m4)&00000NkvXXu0mjfZQM$i diff --git a/public/img/emoji/low_brightness.png b/public/img/emoji/low_brightness.png deleted file mode 100644 index 3a44e4e90a4153b33c6f989d03169cbeaab74d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1959 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 diff --git a/public/img/emoji/mag.png b/public/img/emoji/mag.png deleted file mode 100644 index 13bc0532b2a5cbc51b03153a405faa427e756bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2808 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 G=>Gu8vSva6 diff --git a/public/img/emoji/mag_right.png b/public/img/emoji/mag_right.png deleted file mode 100644 index 46dcfed35719064e57b5bae49244241eeff11f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2604 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 O@aJuuteejH-~S(u4);L- diff --git a/public/img/emoji/mahjong.png b/public/img/emoji/mahjong.png deleted file mode 100644 index 48cfa9c4792ab29d9410d3b74547cd7074f6184c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2282 zcmV8xH^(83-yR4=ExE4h;kd1_ClH z5-TDRA{`1UCJzM#05dET4+{hj4FwSo1_lNK0000oED|Xr4>K$hFDnrs9uSp~cODxK zU|B!1tdW0sV#dFu`SRG{*}u22mJSO9F)a~hU`+!90EdEVn2>p&nSiRJig9gLt)+`~ za9I!#1?u9++}6CFmwddnn@&hD4-W;-$gb_?%z=7grJsb&#;Y?fAlJ~g*Uz>zFe2X8 zyTQ7k`0>`#%dp14rNg|T#J!@#zN5vyq{qOf$ib(}#j44|sLI5t&Bm+F$E?rDuJi5E z!n>gR_S?|OuJrBG`}ErK>(TY@)YHtd`t#Yqx}W#()zrd*P|*ZK0;+S9q+ z*1Oftv*g{v;o898*}mo8!`INY;@iQS008Xf%iq|&=HSJQ008gl&FJCAlmGy#007w1 zwx0k1kpTdy004&o0Pg3^i2wkt006Q80O{$?umAv<006820H*)|p#T8s;>V)^0D1rb z>g340004~u0J>mR@9)#>?a`qP3%LLQ?CQ?g)w%NW){X!G<>twO0073Eh{1qy!;pUc z|K#%T)3yKr_4eBM`rgQugWK7?&$FG}-N2F=7XAC*;o`=jCnJ#&58b_}`1jlB=gYBJ zPT=0czW@N@;Ka|Mj<#=MuuDS9$gHaw7NJEvq*F+2007d`w#UV(zle9BJ2c+Qv%Gg{ zjtU94dTQC&yXE7@%&eEIJTrG{q@)`dwM9Lb78I;hN~S*)ztg&;j0FUaF)GQvq=z0Foq*P}0000-bW%=J0QXYq zki1D8XcYkp1QKQ#M0G(9AYnR2FsQYLO;T7hD~au=VX^1P{pS6jJKL_t(|0j$p@KtoX!08re%%~x=@jJx+RckPje zObY(;Kvvb9iJw3f zHd=(Vr|Li;Zmm-iV*|JhwM$@bX?PuZcCTa6 z)3^&5$m6g9nRx>M|2VR~zK%kk{UK`dbaYl8Tw2O%^v88Bh82m`Y8P<+$(K44joAr4SO%ZWi03V9~OY7B9J5emQX zJr~T$BVho?KOdijGV9JeA{2`d6M1# zlySKq2j2c4YM|x6vY*PqU@(vzXlZ%7sjsi;AFrr^=Kp$U^OImG~{AA0zI-;%HAQTsDUn|IWlxmdNljp{HPX<>ODx{Z`_vR!^dt6q#r%tWKH9uy4US? z%WfnZHoz4ODe)TvaY&iv+_Kl})x#X8ef~g`Wp8wT_ULG6_S7>8`jq4?hbi zsV+pO>fa9d~ zG}$KS0XJ&t#xpfwM)p2^%7L%*W=x!uIF2ogc(FN0fiy*CGd18q%#Kk>8a12oB5tt& zu;od-?EU-{uv=(`r~wO>pJJt#_sn>nTt|Uop1dftfE_|JL=9N6{5mf^eK#1uV0QOm;?`vy?k|D+*!I#@XX;z z$1Q<&V&u@Dcr_+4OajV535N0e8D=||^RG9IL$?KL>jJzW2>xHT>vaYZ-~tP^I3o!aD<1tVJb|UlHSYgRjsa19}yBA}EaOSDi zDwT_kf>7A0*$vb{Ct)|$3vX&rn&pPdJ%$TmvHa_-r8mNH}4W8wt4?FQ>zc?!t zUfapMYqH}BqXypni~U3L_e0ZJA-0rxmmm)bYQXfTci;VMcovH-@0$LP8u){axi(@L z3Vxw(5*=hTayGj7@}+Ae%=ET=)geNv->g)f(~>PW^Nto z1RY4|H#mn9K?fQ#WA|ce1RbczjK#522|7@aA0M`oLXbhPzmkEUm7R>f^G+1SZ0>W) znM7cKr_Y`}jlcqo5Mr7j zrY9&Z&4L$5OAG3W!SrLsgouQIj0_VVAR{9nA%YTs01Ovk8(T#?TL1t607*qoM6N<$ Ef*{jxkqqaalg0k!O*8 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ⅅ3itBt#dOb2mz`fl8PeYX}r)ZB)f*$d zJD}0H?in+Vk}=%x0TAjeOH*c4Zyx}v2MkMvNNq+5+8wAK$So7T2%8u70x}y4->-mt xFQC@}g4vv20QiI7_xI1&dY_-~zvzGYSqUFRBm=iOA(Q|B002ovPDHLkV1jUUQ#}9x diff --git a/public/img/emoji/mailbox_with_mail.png b/public/img/emoji/mailbox_with_mail.png deleted file mode 100644 index b74aae91391b7bdfcee2e5bce3373b697d472d2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2674 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 diff --git a/public/img/emoji/mailbox_with_no_mail.png b/public/img/emoji/mailbox_with_no_mail.png deleted file mode 100644 index b723f8c374668eb4968cb5049965ca61ede0708a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2240 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 Q-v9sr07*qoM6N<$f-SWBpa1{> diff --git a/public/img/emoji/mans_shoe.png b/public/img/emoji/mans_shoe.png deleted file mode 100644 index 42be39d21be6a6a092ae4f4953dc43266052fce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2626 zcmV-I3cdA-P)K1_b~B00RL53}PJ})N{4GTIeCnp>k5C{hs z3ke?*4-g0jH6jvgLJ}hx6GJmCGbbTTJ2FBk41-YY=o91RQr000>c z3K$Fu8x0E(2L@m>EfNU_9S#f*1_Wd^FBS<0WI8h-5DjBEFAfL>77GbmGAdaxDG37u z3IG5H000C402m7iBN7fY8y7Gb6i+TGJs}-UGb?C3G;&QwY(hDNSx#0iDP1xwNhl)= z1Oqf99+q!obV)#?esW%Wm<_~Rf}w9JtGsakbiMj zOMzTew|Y2)Q$8gc6`X%}ePdRfYFlYnP!SFdn|*Gff^t$eE_hK&d|Om^TT^*QGG9qT zkaA>qQ7o`|Ly&4i!gn0Jn~Bb=o2q|qrFUw(l7o#|ElegMj%Z_}gM3^#AT%8fHXssb zKps3RBCL>xePmx984t&zlCp_*pmSl_wWVK0JB)2#a7G_PCnAJpW4?bkbyQMmPf3HbnzOBZaj_S(0C?X$O0000)bW%=J00$N` z1vv@=4*`fN6IVVh9U66&5lvEiA+oD&Bwm}rN84zQLgInU)8zcR?4;`Z%wxNnuh;eW zdh&qX<^7lW!r|lCRcnAM000K9NklY-T;KclcAVK%@1|V$RCW10b~Q^`&JV-5wfhYGS;GWOVPH(|zHF|TKjY)!_$Sf8uW-oDrWyE)J{!7! zB28|_RfLDv9@sD8^I21e>L15qV@yT3gM)JK=?E!}&zd+i|7Qm9b0fkXl**J1m*rAE zpFjJ@A^1NMGX@GcsFa?Xy%!IJ;RMzM$_stF`cHpZv*r(j`)3K{P=N4jN;W(`jmg9; zK5NyiNn@5znl*dQzRjS&{c$k=kBh|d3Mc@6CHPA!b~f&;Wk_W*DSR?S%3@^SxU*@~ zrURn~0n9-VL0t3m0FgHC?!ukt&Rx8mUAzCfE{)op40jcNba2!crB zjiuoO{u1{JD=T{cjm9fi8XFrof^OYzb6Xo?m%Al&vB?cQ#vqm<2(39$qf%;8OKjZB zMb_4Ib6tObe-kLi)z#8(?e=3kwuD}7{^DK#FAN5aWso51Q62Ac|1Cu zZqLyLI*Xj(f}4DV zP-dcuMWC8ts345S5+f|Gab1vl7Zk7uJILM~5?JIE{0l+&nZ~)Txm&j^eHX9_1A;t^ z!7>0rbD=M)LPYrOLFPOl*xCkKx@|kQ!OvuC&7iDxYoiGaXyvi(Qf z@of)wgtoNDO`@367@U9$404(llWA%Cd z|M~ZczfuO%*VGpT3I@b2t{kfv%R-RdA|#9curE`|Xqdvi@+?HKjlny( z;meSFb@4~!2m+W0%2q|6KkUS_#XCR*DB)FCIQJ7$fS>WBN{)F%_f?j20%KfV@CYG5 z2<=+8n%sj0!wHJi=*p;FoEH(&?SPQmy7)^HfS&|7fvQT0PE+sV1r}JkRJlP3JAbdx z(8Ax3AoJ*?0s+I6HdayU6mQ#t7bX02>*_k!Eh9k~ffM9FP)Dg#-F2>b37CYxzkhLY zXZ`QKAxS_{2aP(~#v@f^YdKJ&tE;QCvv7T1{&W&A9|7Ki%2l1ws#85u%3`YFXGjkT zDO`Wbu{CHRnaAr46b~WimO5)8gu7FZ-&$W^usinF2gUtLA)&EAc!`L#DRnnp!X2p|y(2ie095iw{GtN1yyIZT(cE`rX zYK>DUWcBsSdjkzOI%j2Rot+OJG{z&-NE3dTWkv{Nv$1Alety0&E?$bf8R4t1zId)r z34Ju6&p-eCBiO(bW-yrqLcm}M(0KHJ&6d+)20;*j&sZC=%__nIg8uu+%*J~EzcW^2 zEL-yTCOwCTmph7Wx8 za%*|n#JIP&M+k{q=5+V^wGYUESeczx-x!oiE6~30Kbm7}LbkVUVS6ue_t}- z&qUk3O&_}{^T3I0cppOGuY|B6`kmFdme==>Pq)?2^!6^jdH^QCVVBV92k_vAvHG8R ke!qFUARi6NbG2x^0Bfw>c;8u7A^-pY07*qoM6N<$g6-=^8UO$Q diff --git a/public/img/emoji/maple_leaf.png b/public/img/emoji/maple_leaf.png deleted file mode 100644 index 4bbba77dd3fe0e74f5fbcb484b92146a6def56ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2471 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 diff --git a/public/img/emoji/mask.png b/public/img/emoji/mask.png deleted file mode 100644 index 08bc1f872b8e0d0128d5ca6a10bc66892219ce0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2809 zcmV|bN|p;|K5%N<)!QE?EJG9_xSjhH6HWy^zH8M z@bU5g@_W$U#{r>*ng#iD}QsLp@u&=8>bw8UOaAP_>1+b*XaIjm z2K%iS>T(0#M*#Pr6z_ou`KA=~lMCir0Qvs^+@N#ymj&ch0M*0A=4b)2MFj1d0RO%t z{>DZ9(0u>bVgJA*S1|)$I0ou@0dYbF_p1%y<>%Lc1M89j*AL>z z%K5J~`@&rQ@X!6vO8?C$_~1DI-!OSX1=_7e@}UF7PyyE1+QVlPwo(AmbO6ShiMmM{ z+MaX#wkiMMoBiUh{nd#4%WSxhH1ow&;ma;&LJPH-B8p%ZZaxH1D*}um2*6zcyr!wJ zSU|&kOw~*P*WTiqLnxD$m3Jo~ju-;vg8`SEoYvai$a+wmTUf1yhs&g#foW#JM*!;E z+wJ7&;n>;zx+eL#O#j_E>AFSVq-mmzHtW1fc~lhI#y0xKLFKM5=(8u}&@iMp8J~R@ z(7P+ss+y63f{!vDb`AiNKRLx_FV(ZH&xL8~%eLaTn(o}%3q1jK0000)bW%=J06z*G zBTg3q1_KfeM>;CMH856U^=Hqw{ns`T$)bvw{oeSB3ZQh&D$^QQOUZ$O%0SqB)NPRc z!_m>%@ZYPe+1bs_aU+s!000MMNkl#d70H7=>@$duQ4jGHGMlgkckShA{7j zDcEjT$sUu+mO;ZamK?dXHf+s`L)$RtEyDB+(_yCle75NC|C~DKpTArWC@HTt$n~YA zdby#xyae1+t<5hcX@;_xFcylT$>MzN-8~A_@}G>!XNAyw0EAYbiTNp47u-oss7qx*bB@=s4BlgYQ&f)6LA{m4oe5#XX;OZt$XOQlln zH-Z;9Kk|`U0-V?XE4Q%T@rI^5z>j-bi~Qen4uni?gI;$}!<~@aUT9Oxh_eB7Rk*-- zT_TZay_p22ZXB1W(h=Zd0Iu$ia2Fx~;<4U@{IxyJCj^7R{l_(fo?1UL=^qo|BtRvN z1FW_k5e&|bj?M<#&Tu$68Li?7bmd6|;@^CV^&2BS`?R%f&n(UhLTIMv3^O4?m|vXP zZfon=Ct~!oRQ|t520-?>*oWM;5eFtW8Vd=bB~cWXH*$_6avRHnC@$fH*yzD9QtL*( z;>R*@6rhBJUSoZPTOhB?Lk17y#am}5axmY;+%LDGwB({R%;}9K_@_vh6dy?LJj-~Ef9h3LNFq? z7H80t0-so|!{}g`&>fB=pd|5KM}!Aay~L| zzICQ|BO{ptWBqZbsGlzpTb=|BMED;-$-iO35PV`$N+taw=kfKVz#`1v=d|&JO4YUL zzR-2Bmjdu#sBik(UZtwi=Ipa$i(&$hEXG=_dBT8?cva;<73sYO$}3WC<-pM!QGs%m zcLX;~G-GQSS!oG@HHxY_;{~(R#s|Ri^v2!_3idjlS^(hNoaPJ0x+=w*q(F8?(R=l0 zsx`(~5I{W2D;H8w9vBsan0q5!BLl=y(=FO&|bqkoV1j! zB{GQTK>O@~Okz=~R24U_SS2#q_Eft};<<980vZXWeEnxMG6NVwPF{&Oz!$3a0wA8W z%C=L$_e_cb04kLv;4R6^d2Ml|Gil$9y_lJuL$7Zi^=v;#!FJE6>^eF(JM&`fYZ{aO z`s$pKw_x$&#csD-^lZ$t{Qw0AJ!8*A&zf>s!3+3i1xJ)LCFbx0yK@*F~L1HYvr2Uvq2kmzEmv*~7m`-Wym+=@%Fpaxk+ZMP2^QC3;v)%6k6FdbmR!fyBq}e=C zM{+q;iy{d#;oUA*Jitz)Y(CI-0JUoHO`>ac-*gE%7dfuB%_@`h(gZxHV7zN&Ss>00000 LNkvXXu0mjfb2Vz9 diff --git a/public/img/emoji/massage.png b/public/img/emoji/massage.png deleted file mode 100644 index 96726032790e20ce0f7782a4aecfe67639b63be7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3025 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%0AOfR1z90&p|v%)~}* z+qyR1eT-)&9ZxupZQHh0H&zw4jjdYO>hnQuEWfvdGylrk-@ko!w3YCO`Fc8YXb>=G z?rWK#wupjGbv@t-g-inMtKDf)D1N7^X}Hfl*D4WSGZBxU;@uYkRImrj z7v3|VmE+)Go>J@+hXJ>ziX`WIK6t?((9%RjXrOX00{#PBu9(^Vg}O zqVqjlo(mwTDxqRDpyCvy4Tu^voHvu z)3dX(LOVm*ktU*i&kNH5cecX(8PXtT0iNrdZe@jENKFl8ddI{h_y=Xy{FtBO=wJyM zfD*=Sgb=!EPwMpD-+qtyb~^-UQ4j!Mjhk;}1GXod6_b$QpLVRb_WR((SdO`)1AqVl zAOH!A4Dkd8+_ggh{l(}a)x&_@tJqDUo=wb{1bhGL)=Z@pu;cz%70H?~0XK88H zD9XOI`2m2qRtEw8Wbe()Zen{U*vrydGy7}5=K%l@08F7kzzI%@k8ca~$;`4EjyZL7 ztrB*qU<>S7%P@GMG3B0OOxlg>yWdL<{K9Tn+4Tf(qY7RqHJdx94 zm`o;%#Y*-MI<}R{Qk1a%A_)<_I~v0eS6m_QC_xSExNZAQ*<=diKLz7PEJncON_AL zue7)8t5C32D@YKtbIFn=Z8b(4mTi31g?$BD%qawodkVW&ez?)002ovPDHLkV1jeD@8tjh diff --git a/public/img/emoji/melon.png b/public/img/emoji/melon.png deleted file mode 100644 index 55fbe26a25d0f7c72ba80629dcfbb303ff69322f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3638 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 diff --git a/public/img/emoji/metal.png b/public/img/emoji/metal.png deleted file mode 100644 index 4e049818ae4fbac75b03f6dcf36e8e5fb8fc1d6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2200 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 diff --git a/public/img/emoji/microphone.png b/public/img/emoji/microphone.png deleted file mode 100644 index 923e750a0eeda7ade4d78085bb70016fad0e4271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2417 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 diff --git a/public/img/emoji/milky_way.png b/public/img/emoji/milky_way.png deleted file mode 100644 index 961e5ec68e0911eb5b80dbcbddfe2fb0d068c7df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3190 zcmV-+42koJP)n+a0000000000000000002HySo4Y000000000000000000000000000000 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 diff --git a/public/img/emoji/minibus.png b/public/img/emoji/minibus.png deleted file mode 100644 index ae76d4073e04f1f144d28cbf89a48820814ee582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2293 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 e#^_h=zw;-G!?=vJj%9QJ0000Z&w^?4cBu zK08e}N^~`qGM234W6n3dzu)_w<#*0`-sk!2q*z-TuNT@P1OV$zO$?55t?uu;j>vtB z>MuoNmC)0o@eR41ul*bnV|E0iat2=tjT&5P4Ag3*t1PObJq@e`j7Q zf%QgcRfB}R5WNrRCXj6i$p;}`8 zQ+#j$>#eZJ0~?Ox5x{ayOcBK0yYRt2%$LPzi_%IAA$L z=OOrJ!^JXR$=yC-1jE`eY6$q|CSKpt#}zYX6T95tD-A|z@Fo}rxQZ2R$L|cZ1iYt= z*R-%m4U5T`DuGjDnCp%0Vc3y`pP#b>V9*TE1~~4p-~tP_z&-|8YmayK@> zlWq&ewy@TpIhjJlNGjb0xHG1D7nXTqs0`;6{Hq5TxCy1D*y&=}^=Lc>rVj3t3Xn(&iJt{ zJ$;d7FYB(nO_!{D`ifpZ^1nVsCx;XO{t#0GJ-Z0P$3AkXl%9mZOx7O{#zUA3-ihNS z%4)Bf-NRcO>(!=<4l$UjLoYm>a{6;f4zm?fd4e~ltzwr)XJbp}1>&O3g!or;3hS;5 zY+$~Y*0SYE@M0f+{%fncmGlPt=#RlYxntDvI-xnjhOm}E^RP+{&1Vgv9xg|&%!T|J z{#M0}T!qp#RqXYq##gspd{XYlw{gYCleEn>wv9kNyZM<`j=Yc0UzUOX9^pRvQ7a{W zX>CORwW%8coBIdj*6Akd)b2e*q&Y>TrsfufRLnar+ucw!x&OTMJw>BNf+bGfyE)5g z!M;o`Z?J3f=a#;{K2dt4h_ga|ffJGMZF5h7^I5Vn`mPF=@Y;xbaJ==b^4sJ9>G#5v6^5l7_{u3i1Xi6t(cx)-ct=jbTld_SLh z_=>@!h1!|0zxyt>y+3l>kf_zH>b?}D>QZDPH$2$oFlD^y+K)5mB9?|}V*A8}MwWZdki!ldco-)W%=ASQ zNY9k0PgW~aYHq}=`OEnb_!{np9<{)YF9EU6O7ux*~R~sf9$l_)NxRndVjp78;0Z>rl^uiT~vJ2fso+ z1dD#!T|C-I5osoll|6SCJw%lLzW(8Xs#@8iA9PuhdwA4E{HF-vp^2_2fGx7~h z;he8rt8BWN*BryWokr5FQqZ9gI}JXuzP+0%r75I#5rD#fVR>+*V~!+vr*kK9bgRzA z6?NvW@FT4g*~v^p@{G}mQ_r`65m;sw6Fz>qpgB&n9e(>q7w{+Flp1T-;46s?R3M1+ zo%v^-=Yxl*lcgW+-Fa-M*hF4pO|DpfRKCXP)+7l@<^K2W+hbN|1>z#cYA2xP_@}yZ z)`9LkvODQCY3#zG&DH{~;smD&uT@TTq}{N{*i`#3W_a}*IYMVyjl+?D*$2oO)lIk4 z$EjvKHNukecP^K!R*o2DiEk#{@JY<3?|ENTt?aJ)xWz@VruHBGf^I6+H|M56kjT!i z7rH58ncf?9RpbkPv;-AjZ*O(pxJRT=79`JpsO#>Kkj;@J3a6U)x92Hj)g3EyPK|S~ zc2P+8k~X=1>Rr2mEmZ6zh!bTtN}d{=9q*K(xo7Z1Xp6kf%@f^2P*0K7B3*rqocW1B zMM3G(EN8N^kxW!mGw)rguVN|v0Xc`P%|`NgIx4oxW^UGXUP{nBVKTK`!CU3A-|*oU zdbbrch5Kb17U)HpEyWOS4?g@*wTG{g;8e+Xsp@3we{5zv<#>z|FG^dMd?q;;4nXrb-r3I)47xrqaIF@^B8etvLxd#EdvF8XfIxYo~e6WGZ`uO%~gkqH|;i uXqD*XCfR89Q;dYkKQEVN{(@4O(Lh~wVpDj-iG#lvD^o*DgGc)AasLMfB+bA8 diff --git a/public/img/emoji/money_with_wings.png b/public/img/emoji/money_with_wings.png deleted file mode 100644 index 8d1d31618f9239ec6ff5eddc3b9814e998272cdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3389 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 T#>e}^00000NkvXXu0mjfFvZKi diff --git a/public/img/emoji/moneybag.png b/public/img/emoji/moneybag.png deleted file mode 100644 index 7bd5435539d9bfdb1dcec3725cc8b3503b45c98d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2839 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 Hu0mjfAuEjR diff --git a/public/img/emoji/mortar_board.png b/public/img/emoji/mortar_board.png deleted file mode 100644 index d08b2fa8334d74998c4354f580bd5472428f6723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2497 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 R!~6dpDdM)VPO%me_dkOVJKq2R diff --git a/public/img/emoji/mountain_bicyclist.png b/public/img/emoji/mountain_bicyclist.png deleted file mode 100644 index 91bdc801b0178fe634558b4dce9dfa5cfe2eaadd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3733 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 diff --git a/public/img/emoji/mountain_cableway.png b/public/img/emoji/mountain_cableway.png deleted file mode 100644 index fa02f83ad2c71708138dfbdc7fc03930477e5c04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2604 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 O0000)u=;#g?AIZ$o>h1Bci(M`-HNwWsFf%#} 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 diff --git a/public/img/emoji/mouse2.png b/public/img/emoji/mouse2.png deleted file mode 100644 index 9107d392f2e83969e955b4802dc1c28179b61c47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2519 zcmcJQ`!^GeAIFE15+%yD+w(k?BA0rKQZBi!B(bC(DRLWOE^~_{d}oXeQ-~RJ8HTy% ze#zWfbHB}fw%FL_vP^hpL0Gxe9rm6&CQI(j>#PZ003e@69bC_ z*Zr?Vgbr$Ybr=%>5CWK+f((rzrusK-+`oAfsG)IBP3@qouX*eKwQJX8WDc_btCtuE z#8gMi*3vZ5*)h=WRgkAkcWcv^s7OShA1X2&`PM$u!z0GtKJ#;8w7p%SuWw-{#^2E% z8}=b5*bg1-pYQFB&q%|*d)HJ|k>KJI>I4Cg;j*fU#fb1QTL{vd)a%pe~1|44l`&5R{EscoCKqodM z;HCL_#9UmstIL4f2TtQ|!E(uv#h^r|p!MM4#!r@-_uk#Y)qeFt?{e3cg+{@yk zhdN1B@86RUai-eZoiT{6loS#omO?Bp3=JsD!}0liE|>HB_wTK(%>#J6EiQ+>G(XQ~ zF{z^?d>(IhYI5Z#eUr;wSz2PRvRF(eXKjtcV$o@|rNw#b#P~dw%3{zNbo$ir5R<`R zt}JhGxx+umV}k=+E|Q6+EY>5^(C3r-MukQ9WE~&$;+E4B#dR@HWz7IKN-{^3ay>A zG&MOlIX>IkT$!IcH#9Iq?rjK<*x<0KlM_vZ!uhhY!NjC(_S(+o=1fm}?bolXZ6s!0 z{p#FYYx3uow6rcv+V(mZtEN6zQ;ktmFVNF#0=vxAR7z)*cpV%%)z`wz5^&+bj@6A$ObVys;AtJ#M(9P4z^EQ;itCu z+au-j3m70+DcDvP`5A#RNsN;CwWR+COjX{o7txi$L=Vs%U zFE`9RXQS9TN;;!Mpl9wsb3uxrGO1%VYLD~A9zUV#oA8SFKQJUhlq^q+m@c_Bc$I-5)Uj*6Kt$*L_cow#PLhM8Mg*lJ% z3}`@%^X4-{eLQRzG|KNQ(b)f8v^~l1l+iPOS%;Lhn( zKZ#Ur`SVlX-mgu^$`?7y%RSJf41pLwCc(*vfR}}^$<(;?Q`}wqktq!8Os3)GX+j+b zcL)H6iNWz`@Fz~Q3gsjQ2OiD05somgd()Yxu%Cgf(C9PkwmagMu`AQ6Cc?TPZP+E^ zgoa!_Dt*YsSU`8M)Bt$*y2Gi4pg$+JL`>+@Z!xleDd@1GjcH{9*Q_svRbS4|O#~P| zJuaFlQ*mB{7#T9jdSHb3$4~nO@$UT{KN!67{*~ne(K^ zn-X9%V3|cC-!fSm6mt=_JYixaY&~upGE5OKSZUL!*L#|ws@pq_f~{wTvww-D+$Nj@ zoXtdBOTxq+eay zqUBtwH+f6A#ew4l7pFwqd3#_7fBvDE?H(M+5r879t)8&qAMPUufgW*+_d@qRWnL8g zLsz=1i(+UZ{IY0|`P@FFwrbLCob~}3alZQLoV{liBdlYQJITCz_CjWu2JFbSx4V9$ z&kISWNHLv$ji8tY+h~}z%GDi#{K0rdcQ!=Yh(r>^kMJKV3s*bzkO_)x$5ND^z)1>C zAqF4?rPQY=1p*~Ru~SlPi~OTYAQc4>DVxr0dB$x3O8#iPqQ}kcv!ZVWQ9r}xv0WwP zykp&hhxL#s0}U*o$522r0p>Ee^L;-?Y>XCSVcnKXY;+IPJ)Go;(y&K#*a_>h{18 zdtWSu&UReB)6kLHENbYmOoOLHiKMuE_q!&+-p`1G%fSK%VvJ8 zsPJqSJMA~6{l?Co4j4fzD>Dhrd@Eb+p>$E}8o`y|Ge);X@PyjJ)-Wyc7cZVZlol7a zGW+}VyIcOpA@a@3{f8@J!zG`1{TWEdYMvANRg;sAZW~XwCd##Twe&s@c^(ay^i(o7 z0$zNfXBv5A(FY~{CMe9}U9dK9HOa^8XjSqR#%#+m zbz5=!iAT!4@8(DBz1lgjkF&HMoGxUWOAEg0rgBC+Oa4`}rlZ5csU-BGu#omsY{|#c mM}O-YT+)((0KP*t1p#UC@zx0zt||xL2>>)SGbn!W=F`7-8j%M8 diff --git a/public/img/emoji/movie_camera.png b/public/img/emoji/movie_camera.png deleted file mode 100644 index 4717a9b3fd1a7ddf2a35967a81568df1ee2bc04d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2956 zcmX|Dc{r5o8y*bCm|<4NGWP8IAPi+qgY1kYlYNP-Q5|F}%Q?2vp{&_L!f_-a;dIKD zWX+OeuZ+mjWY6#I*LC$=*Y|$!dwdfmoT_8JmQd1LRk*u>45)6>My5Kj+NM%)dY;CMI@v_Mb~A6bhE$tC5ir z5{U#LVE6@caBu*G_5T4tu*=HI3Lp^?5dwmOU;@Bj%&cr|U@yo8Ja9N1(BkoUkOKn9 z;Nju1Xfd1Q$az&$Jf{2-ye&`{>=O-o{x`DKtSLp0!F~k z#l?j}q3rGLJv=;ITwHW?bO7$_>jy?oPEK&Bt*tEzg{Dv_uCA`q($db(&Yqs0W@cuB zLP7}%31Ar;8ygoF2f*ayT3!M{PF@}qMd0T*GcyNGS5Q<`QBe_>kkHlD1zqFeB}kk&f#>1D;_yH@nM~#v z{1L*!!m_fm`uh6r?(Q%+Tth=cSX30$XlQ6CDlU%T;!;#m27Ur7A|oS#KgMUygoTF( z1O!-ESeTlca-&e7voiAXK|w(d4%EE7yqK66aF=K_T5xcPjg3uqc6NGNT47-!=!>tP zUwnK#F!RmeU}{Rr&6_tfGc$dBe5$IdN=iy{b8^ZnDr)QM#>dBH<>c7v&qf2k(k|Or z*h0Et{7_aFCT8p;FV23A3-#&jDv=a^0z3Hyp1KudI3c#xv^MR6{+`u;(j0Sm)$jX$ z`{bVqim}U{>+AJL7U7*TjBi1cBkAu4Z*Iw6BJZxOuYci6mOCuld^$a!y6nDOb%MN? zQT^5J&17+p|55k*!@SMuk&W4cs@m|)hROe?yL=Lz*5;Z&?d`fVUwH+Au-8+J^zE)P zd2}MrbV(CfG554uCY@I5dZkNy>sFj5TeR+BpiPzD(Z3zhw`&iCZL$mIN-ZeWO6#-x zhjd0|n%d!+a>%Z9zp^(&k}ImU?Pn~mPS4DUFpFW>tv^RtkFPH@Os=oTw6-1Rw?;+( zcYr13b{ync->VKfH{ z9xpFUU6K0OYFQ`zhxYber^=w3a@&#P_Jx!^&LWDo&R^jp-x8;}5&t})Tv_3G8&j$h zK+P&)x!)#(Bqt;eo)5WkxM|tsg7+KvK3`%L*#F(#aSe8~Z9aDC*uT&Cesz1Bi^0oy z-H}JNT3<&u8LYl?BD3V%!*lWv8iFZ$1>NB-^o;XoxbX*Jm=_D7??SL1jU&GAcy%5~ zm!DW6_4P$woM&}gvG_fvoX<@XdE}~*2$Tt_CJxoTp#N2_VDm3Ro5#CzW%k{a|5fsL;q6r)T<#{ zF>k8;gkq|j}{mqV9E3XhIzk9q^%9P2T3*X_f!@^>pclnUO?)({_`_GC=t zmswDs>e|V+%rumgEI4`$S#OlJA<|})o zZY6adXjrSwEj<`c?<9Ye&&spYvst}PW2-x_11Fw_uPqiI-m<-u)_sxH3>yDpIe^*F z%f&-vY|MOEn|Gp*DEI0*4PWKoal!QSq*`OJk0WmTx2B>e0}DG*f&ZM8hUqs;;@tH!$!+tmGRnWMZ!5n0atP5i(=?!j{~;p1LWp8=V3L)C3W>B zhTx@sM`G6<3;ktNy^oiZTrX}eKGX}yl6Vl)-MP_8cSv~b*b|!QRpp_^uZDkva0s=# zYEHBu7oMuLu0r1hx8r<%<%0)FOZ4es$JajPbk08*ly{NTW1DZow-1QqNzPLH8pjz44xFTTYJpZ(l=9Z27{FSn`;wqKtT_)Yrw(}yyiy?G8ZW;RdQ zZf&t^=-2ZcP}J*d;Dx{BZ2}t*9_e!5BJuC zhYfx0h(V16jt)nOSk*hM1-1si+dv=sPP?mL)=tj#_qJ_at$%m)-PNCT&X?$G7jv$t zaRT#PgGv6aG7-W8y;h_Y*l!^1AmZipZGwGdz9hQ0;^M%c7gSWC%j0pF=irwDLNT^5 Jsxxp)_#dMq$e{oL diff --git a/public/img/emoji/moyai.png b/public/img/emoji/moyai.png deleted file mode 100644 index 61a1a9c21a4246898e00359ff05123f2ad9f0ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2166 zcmV-+2#NQJP)z0SKe=~TiF=9{z~X1ePERt42?+s9jG=?U3LPqR1apdF1?*@{e13!}rkS8bL_mO{t6hV^!zUmjcJI7> z1*f3;(c1PhhIKkvx@4pnYHXpQ{ik?j7<^ZlW~xvDCRq5$OPmMo*a*2k#WcB*d2%-J zR24>xTA@BrYF^xPg|ulr0+{ruX z(W1=;9a1iHhF_CQQV8T&u!Rb+?cUdWY~XVfCF;DF!=$PNpBhcJ6O-T(k&%(pUunTs zyz$lE3tbl34s=;%Kf9Tr$xaUN4vw;yAv_?}(?YM{F0d=Z56?Y#6IKG+lsUo*F(qo0 zXb_;>i(b!8!2*mqeq@m3RpTm|L_#!l*w6V4UZBr z86If&o-02K*L+~LFae88(~mUEBSeI(ipHl*EUHlM2R=EF$&wWXXcg3k`{pMen;V&C zjF>f9kEelyeBXD*n=AhrNI-_gTqz_1ho8h%I8_-Z@`9%DwESU*v}qv0z#|;4FQ=u8D3$W zEvzY7-L;kV0R*%^+5K3!9Qlx{tP+uqQ3Vo8qIQQe*>0pRc$^kH8A5O0Km`89-LQF( zQ^6^AsQ8#<8?%fusu2W%5)e8Oxgzu|Pw}$SRKk1qPY10X$cSD(%USb4^GN+WGviyC zrJ-gF@kwR8*P2oD55rb&<}a)$YMU)<3vfc)z4hD-;|x^o8e^(Qb39 zY~ujaDmh<-s6o+u(2OL<3Sd_X5%Aj6+*+BaFv@OrF-lqO2atpFKClj=2UHuyq+sbq^a2qFBV1!sCGGLWj?xLW^BSDi;@K*{EV4~{$P7X0jSAkA2x|Yj|ukK5Lj0QeEF7OKHX;Wbv`xqsb zF=rU1A=9Ur4I*Mj^cYlBTz&>C%*6xmfT%|^x8sltd z7gN;a1PHnVY2|M3F|H5Fg-VM1Uv*3_}VBFz6At5CrFQNwgTt!DlqVRhnR2o#0;3GLA2Lt#{07axAd!_r= z&fZPh_;4)>5`ZKmjyA<7laLOZbVx{|0t7tQJ@8QLD-q}nR3>zerzqfz$O*{xH*H$1 zu}+876w(F1``Up+-klj;>Z*j8fD8y-6d>1!>5jqOPJ@ zEY!+d$}_=msqV)?WIWG!Cd;ig)@E5R*-Y26R&uHL_s)yyW!6|_oeeho=#scIy+(u+ zVXb|A1e^%T@CbyEh*&7O6%!HZoqWk{J*6io^|+^KQ=BOvase%z0IshC1A^lG&jDHj sR?F3*06C6I;JW+^{{vrM|Gx|P2g@mU0MU|}JOBUy07*qoM6N<$f@v_}Q2+n{ diff --git a/public/img/emoji/muscle.png b/public/img/emoji/muscle.png deleted file mode 100644 index b1a70b51c84b9ae307ca73682293fced6e1fbdb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2678 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 diff --git a/public/img/emoji/musical_keyboard.png b/public/img/emoji/musical_keyboard.png deleted file mode 100644 index 93647a4a32d9f967020c63e11c80380311c825e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1944 zcmV;J2WR++P)TnkR-5= z?5k?>4m4bVgroqHLi8kv7fZ0Oir~as1tE%3DA9|sAoQgUz*dy@44@Yg2D-Ep13*N8 zw2+0i-`+GU@jM~mI!5}DtxoVf zMFY`QY9rd%XeStG!4g)Q2N9Qu4Eb&6cob4r1`rs7UKMu2Npgc+TUiDWn(TvRIT#)u zMH1H5m}?GzB*NHxlSsn)`U?=XV1nNcFg893VcCi4U$3tNpo|g#aOTVmrlzKhC%L@5 zjGH$XaQN_tXtlI4maqYmc=F^=eEG$BB;m@Hd7La9^WVtHt($FaSey%{`*oY@prtAxUbR{Ay&=!Gi}`44En6 z`vDla0^oU7jE|2S)9K~QmjD5Q?{_4K)xT}C*q9ifKnj@0vSp8v#^wJz3UAPl>j;?}3xImf zwwd@+3ic^~09cU_(P zU_G2}X&_SE_#TjtOOj%IwuLCN&B&KBI@Dr4fSq@?&H{Rm5Fbb^0+GHa-3emZyqA;9 z%O<|o%VH|IVm-jN9Ue;!#^@R)kg`U-R;R$+Y$u2ejvB0FcfA zb2N2|vVJl+z{>KRA|Zxc*`w;%tXtcikkyKmISF>_*kMv)1{hpm$*f~D7e%-x-O4s2 zpM7DUsMs7Jl1o5GK7O6E2dE6zD9mLs+Gge#=>fWyQkx)k|HN&}*#iIrH)jvf+BFxt zfhP9=yU-w{#AJjy6UlH-(JIL1rs+oRvjy@VGpTX)~(N; z;#{peX%H$p3JWHh`a@bT${J^Ph6`f`B-%_w#RH&La{$aXkmeWkzc`o7%{z&oxGzj9 zdKYBMfZ|Yt9D$OiyX;XIv}G?R*{GYaJqWzp*#2XXpi%fyw!>V)4nGDN#XE69J_~l2 z-!Fjz?*)_;8pcS^5ZfIDvj-uQ?livkXJ<2@TCH|uP>bhvRu6el>2N(ybNQP0^6B+h zS6p|6xw}{b9L5&<8?rOU@1jfYKg=`Wsw<5PM2- zq7a&!mOU0ilw8EXdugMrevbk;4#f;-TP$T;+GCLT#lOseLx&FG+_`gj_UsuH_&dV; z_wVE6$&d+P`aY;1Qljx zPO)wOeF?Ck?8MtxT3W){vu80sKac(U_ahA#FJ6qKUa#Zo)vI94&CNwkH4CRtpT@Cc z$5M3l=YXBc0CO#;+`B!_?(6Djz|IGtAAo)U`b|&>q1GaeiDkER^)sL!fPMh_0q6&y z=vQMbMaR=3oZ`IVx-y>_ajk5We$4Pv*r=RP#_y&s_Kk^&0U(e?j$=pf)uoik3*Yzo z{z9BE3}ccLN)PKS#9^P9vFA;-sK<7&BfynQ&`uvYu7M4JDV$e_#-s-Y0w+OtMx`h z{{p4{#Yq>yf$@o{@1~~S|IBsm>c&QkHKHeAS<$CQfsfkLrKfkEFFpMlz+Xh;_;Nz#0(+Isp0+BLM8_(O;e>06u`0 ea$X1E9mYRNhJc_dsMl!#0000Y diff --git a/public/img/emoji/musical_note.png b/public/img/emoji/musical_note.png deleted file mode 100644 index f0ad9c55f0ede3fb6ea4eeab5312cc119ce094af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2308 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 TG+bVt00000NkvXXu0mjfBzP4< diff --git a/public/img/emoji/nail_care.png b/public/img/emoji/nail_care.png deleted file mode 100644 index d71a368144797a251deba9292b7662005108c455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2825 zcmV+k3-3pqwXo z{)*Q9bIznWcks-koG)t3r+2)NX{0KG|ES{QQm+4?;MifVp=Cvsaa7;DisO`vR8ua9DuYD2t?W#qq| z=EIe=XLiPpcGk0ly@qeGackdzz1?K8&YOeBkAL~3+udrmg+v&{0000}bW%=J0PIGD zG5yjT5B~lGJ9F)M@BUh$?CiSD2Kwym`|Ql@>`dMIacG|1`Sa}U@a!%p?fjCmEX}B!8H|>08*Cs?N^+M;35!!D$xSMm`DV?+R+GP)qHEryOCyjHv*F97~;CX z1ddS1ffPtjI9TL(1ir>mp*v|pcwR8^uI~1PTzCOaUMQ@oM&K(s5c2ECBJh>+TNfM6 z9n_sm?)C49cf(Hx(}75wmR8=&LEIW0iVMNx@t zT+c^U3Ek~^1K`|Z6>2g`52!3vfB%{`gWY9&Bo)?F4lpN~Pu|+v+DKmHcUk3R%k+_F zBKm7?&0W^Q)c(^u;Zzc}wQ>#bL{8T~X*R*m z-q>P5F^NQ>4!*v6%j$MY0bkol2WsIkBk~%bc=^2#A;Y|C+qO@aZ3>0Le%ihH!_l*D zghL zP37gdpsE?8hi}F$tl75W+Usr`izkU)tc{5!)3)@k4C{in^Zm6_3(OPq2UqX;4H9_! z+7+|6eqCUXul~LfcovJtBlz1>1B$S&L&R21YnhN~$l%OSB(UJNq9?zrsjjYhMAlVEhlZSO0iWvXz&ZSd8RTZmN513aUzU;j@(<^7!T=!^!^aJX7ZETVt zNiN4Dnkt8XLBJuC6kyMbaF&s zUO1k`A31q4CP}Vz-CJ8yGUwh^Z@zgTcMCr=c=h}?4$uO|3h6`pV*(b&g+d;S6yPHd z9c-Skd2?5ZWzMzJuFEmv?F+s7c^r^{k0^SwBCgZWTpqv}C%6n1lWUgmZ7v1At9(*5 zekA-~nCJ5a0>)z%WztuO*%_V(;knRJMHus4pg+K%@KDRq9a;w*z#uDxmuqwl5=8QZ zJj@epj+OQ&JJxKfl9qs)+Ovkp(fwMz1EHgoNCxSIuPaOo2o{fpMRJ(TM243ysVcRUmxCc;p?&*r&dWfpa*NzD zNWa0Aq&P%|CP>%_kxZ`XamGiE4^Aj8%^GS`XejT1JJf2MOeTTl*U7CMk^lkD6&w}e zmN+#>|2@|~eZnMc2r!gk^vT=7dc55Frkx83rA- zifG(Yr!K}PvlC?>8`*C6n**WIhx48MV6V%mlTeHRGDpax6jL;Asms{`BgGRXz~V?u z18*35rof&2ku%!k7c&BkE3K4>hKZWu#^I!xgI9teV4zC3trhqMP(Z$3+}CTTaOw~o za9Ah>q;Hfcxi~rj14UwYEX#jTR6q{{j|2!=#gv=2!9-0Rx@b=fu`~Ms;g3?ZJ(a-x z`$dKHpjQQ6$V9iv{1859j0R~Y^L&DdBCFfxPbH3o7K}by_(m>PgBP;V0XKE@IHO@V z;$&vZASI=;x0)ls`#N7P$ipgYRVtOuW^YZI6CJ(A{n3P5$p;~&(&5H9q#qjcb&mB? z^nzEdw%fgcN7B8n=)R~~rFVezdX-9zqXWKRbW9!&XvCVoA+pdAI=rtlI$y2LNUipI z8|UM1_YC=-d4KHJ${(LEF23)+=RSP!qnloQ_~Dz1?|9^qNAAD>jyvG%?6)_)_{_5~ bzp-=)UFMoW?DeNR00000NkvXXu0mjf;@ypv diff --git a/public/img/emoji/name_badge.png b/public/img/emoji/name_badge.png deleted file mode 100644 index 814b92a9393d25e77dd50b5d50c2373d4610ad0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2800 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

Hrc)xa+oWvqEFjIhM$9E+Z~SCyxQs@>SuLH z=x8lNYo86vOP_M@5|8Qg$=^b1=;?9D)kaGRW<7V|u+&xLNyOB=eo~t5??m&`SJpMY z_1pVC7?g@wxPzl338a7sIsHK|_x&}05vR6f-}LDH66Dvdzrc^VTOYHYI3*PvKcjmk zrLA<~lXv$?P5Ue8Sb{=n5W72hV{|UC>6(q9b6y>0`YWv$K~g9{xd}p zS?0|UmC7%utFuY_6enJC#LSm+51o`JK>_a5w5??R9yfh?bL*%i{U$JTE znEqAC%G$ch>;6f5GgAI6HB1oPiFSvw7N0Lj`4QTxFR7LEeZQ7AvG6$ZWbU&vFVCLK z7Nx>ZK; zG)eI-im}KzK9y@|Xc&+2%V>2Muh@BdeVlwYz$K*J^&qYXw5eQ54aVW|ctUh~;J5LE zR6!+i0{eGAV%#F`{dWkAGGIcmWd*Y5gX5(!_)RC_`lEcA`BCAZxtmtF+WY}4yI39p zgXj&6(q&OVW!}LvadWiT<;_v@H5?(xFYR8TVEuKHv+qeQ>{7No{A*ePKb{}(ObH5) z*gLHkD_`kUbL;#fQpDbua?aYCW-f&cll0=vu1}QI1UGGII*9}~G!o~2h?G@QnIX!` z(ZqpxajfxCRP2O>Rx>0;) zor#>1WjY0qeP^oq!za~st*D*hu3<3RmzpNCEzA)zd@j23aY)7=85UI_DuV7?Lcyr$-}&{LfOUDLI()`v+-z0Y@0ZydmUaI`nso= zZ6f{Et12&>+qZXa2PqHl9n{z4>}-o)tEy$g&GD9SswrF=VW4oDpkF9={p^G>Gc&W5 zvKD@R$zgP!lR6AIl8m!Vz9`1O7k*&o3pliY4>J^@2zw9ZQKTst^Ii0By8w*)EmaWT zuD$w7zq-Ps4SgjnPfY*5W#BpUB8WFMm!ztdaS#w5uU)t~8Mtpm3W&_MyDOeoF3o*b zNPQMA1m_`OH9xO&UUJyFcQh2eUw`!QqMZ!>WC__AcxNj-e_bnnVhNq8O=fsv{C2Bx zLh$0O`q3amj^#pSgIYElD!0+v$@@}j{K1pyFg|Yn>iX@?*@9%PreH5UZ|Z6#%O9`fL&8KBegd0T+)$j4OE(aR(eTotjVBJ>?l1Tu>r1_y`9 zjR`h1&Qwo34n(YcD>pQLtBZ8Ld$^8pvSZA=gL&zMHF$c3_BGO4fsf`^WHfUiNwQ0!i@;*vh0=A zXCMguEp|ygHzg}xE9E|;w5gz*9;iNEd`VO|c`dlG6KNXxE{_=N;dX5;&i2`cm~a}P zFGtz$w_OemeL2`{W^sI&oW}KFa=E?5i#q^==-fTHnBj4EKC2@>w)Ycv)ThUG83g1x zvqy*&krWT@v^4$vF;30p!;W;YWSFYsy~9QA{!=!dv!56t8E3{milIEBjWi=2LRpwblvajysGMMahko22sNGgPpm zh(%SRQ*G5hiIqo2ovgZ@ixx37eGcQ!TLM!9-z-0+PEnNsJ!b)5__ky2HJ zCOJRnIr0@8wl4Pk>KREN-P0j*`HojsvLXp2&MxK@c4@VvJJO824wnd=T?4(;7&Xz! zkM#-{sYsgkhG#-SvNuuQMxg6?qzZ3)P;bc9C4^rji$QLLQL@?XzVpGbUSgb@M2VC9 z>s%O-cpmGlVbl7OSULuLwB!Yhx}y?rDzG%$`?PN_^esd$TCvQ+Qx%ecxGfe}WY})$Qr~B$3Nl6shWlz`VyG?hN-5 zijtqsCxe|vqvyzxIcY$X)Hnv(01ymi^7Kdxfu2Qk~2cy2mZs4#Qj&A&1~f@*mv>$ zH&6$Psb@=K5{12oRoBDD6-wM&QOV0~ uxZs8W|}=eTI^Jg^^@@mRNtfQFydKc(iVn#&n#| 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 diff --git a/public/img/emoji/new_moon.png b/public/img/emoji/new_moon.png deleted file mode 100644 index 4d65e09d659602f4642c6ce4b9197d779520c07c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3604 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 diff --git a/public/img/emoji/newspaper.png b/public/img/emoji/newspaper.png deleted file mode 100644 index 2ed54904b4d7953e7768294ba2ef9bba82468599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3557 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 diff --git a/public/img/emoji/ng.png b/public/img/emoji/ng.png deleted file mode 100644 index 3ff4660025d3d74620a186c6892ec5f1eafcf115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2554 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 diff --git a/public/img/emoji/nine.png b/public/img/emoji/nine.png deleted file mode 100644 index 4855dcbb8d150d637d456881a9787d17c2ba49ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2397 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 diff --git a/public/img/emoji/no_entry_sign.png b/public/img/emoji/no_entry_sign.png deleted file mode 100644 index d550d8aa55ae3cfd52f07982f029d2ff2b997332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2357 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 b{Cu_pHfh7CXHkNU00000NkvXXu0mjfYhwHl diff --git a/public/img/emoji/no_good.png b/public/img/emoji/no_good.png deleted file mode 100644 index 43665089097238159211d9c2f8d20115edea202f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3137 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 b?`-1#LQDmu8nl5n00000NkvXXu0mjfdCbW3 diff --git a/public/img/emoji/no_mobile_phones.png b/public/img/emoji/no_mobile_phones.png deleted file mode 100644 index 37431b46e5759afa8a8fd19393ea9df26cb77f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2954 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 diff --git a/public/img/emoji/no_pedestrians.png b/public/img/emoji/no_pedestrians.png deleted file mode 100644 index 8b6cdafe8d645791b9ac12cdcc36ff423f162f1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3064 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 diff --git a/public/img/emoji/notebook_with_decorative_cover.png b/public/img/emoji/notebook_with_decorative_cover.png deleted file mode 100644 index 17977e0fbbb851c9c0b2c7a81c71c8ca0b881dba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2991 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 diff --git a/public/img/emoji/notes.png b/public/img/emoji/notes.png deleted file mode 100644 index 0956d6ab2a83d1e8b30478102148dc22c5dab9e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 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 diff --git a/public/img/emoji/o.png b/public/img/emoji/o.png deleted file mode 100644 index b3095e4c5589761f6f995931ae1ca7f09eca08d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2163 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 diff --git a/public/img/emoji/o2.png b/public/img/emoji/o2.png deleted file mode 100644 index 08a38a402d9de7d6b9b62da644c38e1bd80c72c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2418 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 diff --git a/public/img/emoji/ocean.png b/public/img/emoji/ocean.png deleted file mode 100644 index 4f0d0f53d86065a172ac41f9b6e3855574beca13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2834 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 diff --git a/public/img/emoji/octocat.png b/public/img/emoji/octocat.png deleted file mode 100644 index 2353370973146da29fe087888e485178881e062a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2520 zcmbuA_cz-MAIGCsONA$z)}`oEv#7@9LB-Xy72|4*PNPaMqU~eUD6xaOR&bRniXukr zy+=jOs4G^YC^2#oTSB79_i_J(=iK)>pYhAa&}|H$Wg>kmbFHNaNS{fPWw^m-`Rs{~J9mo<*uT#hBfNcs!ofSGL!M=i}oW z9v-IC=`!Lk{Q1kE6!MMg>Jh)=;gxyZgb{I$)N_>@7VQtY+@*k;&wxrKOaVl#9>{*Hl!{ zXtbb!02nL+eCq^ONLZ;t;-QC@(sVQ7S!ra{4 z{{H@Ht7>a&g@lCsoE{(i+3=I(PZSCT4u>C&G-|6UVX;^Ofq=najwx-gtWnH?D&Y7# zz?lYiC(KZ%Gg@Fzb}@U3vu|nU<>gsfStTVUjgOBLi9{zSr=g)C0|NsiBcr&uI2a5D zEcUIn7Y4dm-$(ueuqeMGbm?{3gM)*d!D?+C?Ss)a&J1a?vb56Sp}}oLx|Sj-GqtR& ztfHbKCMG5*D2O}OoRyUYfk4z0uGp9&d>kG;fBxJvJg^KGwB1|L+S>YKtl8Vww+HLx z{ODJEH}pb#VRDE&o7#J_vy!4BRc3=C<|pQx=ubD*&31Nhw-*aghunh0wFa#@|FE`b6#LzV0uQz(QH?YpX*R@<`-NP z0PMGTyKXKn1MJ<^fvVo5*cunR_i8enxj$DZRKf$}+`HO1{Kv?QZ&kTKNZRb}acFmK2N0jq>F(WfwpZ`j;FRR+Fn$`*bu+}t?d2p>swn} zd$TTzA;>^po%W-X7g9GJ6jM?(i>DM1X4%+D12@+L#ymR4UC?0W>8fAk+M6lA4Y-@k z$M&m}{i`(tJbzFQBb8R68@wLKb0BPrs1s`=N$^5qUSpAjUwq!$bG)2RddBxR8`_ae zK{iyoI616d%O8^A|<%)<>+5UFOkLpNk*;EloJx%0KJbYpn|~IXXHp zoUZR^G$R+ix@gg^2s&@m5^e671Co%t^;?DzZf z8_788IAiL3=L=p}tNzCJNce1^;XVG5`s7{4;a~I|D)Z7v&M)iD>GMqw-+jvtINTrD ztn>OLMfN_(e%=5#EZV~P`Mu|?+!Q3Z{9JE*LN`X39mQ5ev^k8+3|6Tpffv04Iy)iM z_M5J*D=jVhVW($rp-!!r3j_HI*4qD`mQ!<1D;mJ@-#!nC24HCJw41#=v=0bz-IFAZbKn;2? z^ABXY1(thjDq7^vOlaD2 zv9s1EX&VchS=iM44BM&sS6C{ku($UE7ecd*yPwRSIvYLYb=~d^NR1#9GSMB;!KO%g zQf8i}nbtRU*j=MNb6qv=qQJu95hAX3aFXYIv#zZT?$ffIkaKLJ5;oo8Zq53Rnn+r51y_%Heu1|a?(Q#q zvulkaxb=H|)@y=Wq?4oY>(BU>ZXqv|FKcVm-}D3Q>`1|%b1ug!Kmlo|vYjBP*Yne+JnU#?#Mm8P3uvSgG}15Q_*!E; zzTI|o^-Fb;6z)n|SQ!Sd&&(#Lm5Yd95f6bHuBP=8CZ9|T-ATF8d1qKZvyc42ayygf z*0EX`DtDU~f$4s)T2;yQc&~EuV8^MIKU7|aY!RWZTN7{37YnC`PxO$-YY{BYyk3=owaa z7V%p}-9oX@J~<*%o`JpEqoV<_CI z)Xs|{&%Jbcspf6gA>)LeY7%_x|FY6S7#vo;Q;_c!1m~1)Y7)~UNm=xN|vo& aT;ZY;q3Dl^471bs1TsaM8&=+NjQAfdczR6$ diff --git a/public/img/emoji/octopus.png b/public/img/emoji/octopus.png deleted file mode 100644 index 90eef2ba6a3f11ab65250be467609dded4f65a03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 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 FV1n^4aB~0v diff --git a/public/img/emoji/oden.png b/public/img/emoji/oden.png deleted file mode 100644 index 79bae78a9ff440dcebb11f590b0e5bcc20cf39cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2661 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 TXApmX00000NkvXXu0mjfa}v?W diff --git a/public/img/emoji/office.png b/public/img/emoji/office.png deleted file mode 100644 index 7c8f4fba1d0b32e90bc8e480943a3e6fb9fb1669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3058 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 A_5c6? diff --git a/public/img/emoji/ok.png b/public/img/emoji/ok.png deleted file mode 100644 index 4e201be8ea76bad1e90d3ef6bcfa13f280ddefe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2498 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 diff --git a/public/img/emoji/oncoming_bus.png b/public/img/emoji/oncoming_bus.png deleted file mode 100644 index d45f47d9e737cee3c5b53f8569995138c29503d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2551 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 diff --git a/public/img/emoji/oncoming_taxi.png b/public/img/emoji/oncoming_taxi.png deleted file mode 100644 index 86c8ae32a3be56bab0140640c1b9734d8852b603..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2895 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 diff --git a/public/img/emoji/open_file_folder.png b/public/img/emoji/open_file_folder.png deleted file mode 100644 index d374022ba93589b33d228d03780f0770ba4471ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2840 zcmV+z3+MESP)>3Btg+D4*|)#OK0rf;kCv99uAHQ;YjAbf+urQ%@fjH# z!pP9Iyu`%G&!nujm!YlG*xZASnV+Vyj+LLFskEV~v#zzfw7bE~(bk-ztLN$L#mmu_ zo}|vx*r>6&xxdA{!N%0t+_byE-Qnb%r?T+z^Ol~dnxn4X;^o@j;^XS->hAE4mYkxh zw7kR1bb5kzfQgEdoRFEF+1=t)SYC#Xn99%9>FMn5@$vBT^l5c}frg1(X>qZ*zre-K zjFp?b!Ni%Fs+gg($j;P`mYv?==9itL($?8_e2Js0ukrKtlbfTGnxFCX^!xq&@bLA` z)6~w?+5Z0il$@vL>g{1~cVKLFr>?WJxx=lszNM|Vrmnb&l9`N@o3_2jN?2l_sIyXF zYMP|5gN&1-sM}ammltoTjm{xWTu+$hp7Cw7kWLk(YFShQY|usj<9QWo~?hjIX%Evbe&u zyu`J=#hs_LX>@#cfry8YmaVqIOj=})mYlc0$%T)Vyu-|$sI|}3+E`|9gpQP?thQrs zccrhpvAM*yzQ}8LeqU>J!^zQZd4bB%*Q~X_pQ*N|uez$Syku~Bc!P?cskKN|U|ni* zMN?jqP^z)Hx4y?hPgskBK~VXLydUTbrzv%I~<&NM(weus}lQe3OFzoV_Usj|MLuDVB6Uw?^^ znxe3^y~m-dx538DnW3kWo1)Fq+M}wmqpi5q*xR3`uBflIFwz_m0001SbW%=J03;{n z3Jwqf1O^~47#k}UF%uo<<>>1lH`MP3OVZJ-YU@`zD0eYf$5C=J29>W8CJk zytLBNYslSDA^-pfR!KxbRCod9l4E>j`4UCjwr!hZ+t#zKj%}N-DEY66j+-!|ci$BypZ_Oma>YieGfGn*}c`18AaAKChPAj9hF zYHD8>FuU!-<6wonC@Fn0P+wmiQ3L$ntHBWu2(~lUuwT3*_cU5Ew1y_OmkMbX>U}mO3 zGRw;XMcrH?0d{m`X4;GSkiqTmhyo&cC`jzeC{G2-Adqk&9-QzG@xp$6_U%VbA7=sX zB;A%-45g6-8B240;>;UwAB@z~i_|;G0&z0UMPWvnBv9K}TQQlHpZhc$rbL3Kv>xVn zK(j&nea{P%}&ZHk%R+o)oa?codu{a;DEu-paHWfC>)pPH~XYy ztEz%;VnZwb#|9+8(c=74E9}FKwFv~NsSx{5>nFp;Ogod4v$L~RVW0|;nBUskdR!3D z?%<8JO=ie8Bm?o&H~lPO%(6Wtr9L^k9=w1zVLs&)XcEK;e1Qo_P(%1{Xh{3=c;097 zY9nQ3WwZ9q6nA&U0(xxFIxGr!eazR)7|P;g8q`lZjEy-NA|xI}sI8;|R zD0zDmj{*p<(B7Wno;)MCr3aq!%#46|6d3BAm>g3=jPSoVOJ-LP_*vZ1(Q(t_89}DK zhj9UTd%2~N5C{ZCISH&f=>*Bi5H#Jgu>tMt>+9%v4y+)c2N2Mf)i}}Y!yy592!Nx2 zl~sER3hyobA*+C7kfmNq_RWkVgCL67EEnmWib@&+z z0z5#?jNV3VJDE&oDH9DWD5o2MrxTz*7GNHNx;o(-ut3`cU!d{c6=e+#4LDeV2nJq3 z5cKl_d}%)ZKQb%83kH9Gywlm)nG`;jGE43tt^nR$;L{05fjZ>atRMgjK+r66advLt z7T{Un@1IB~Abz^P6a{>>d}}cs{4Qn%0S*XWv)UQFvkN(96nq2-s;UMdzzM*UV7RXC z=~=;{AzI+}wR#s97jm$`l`E9{8z!2OAURt_wW;)0k}py_OoAf{0_Jb4O_?Gr!5Sl$ zEGYL+6ux5d;B;x}t@Ka`gbK$M1dSx;Qgv(;NlC zJ>t9N8n!UN5ftPct1-emcyk3St4qwjSMc86Uge32W&P2)R)#cq9E9C8+?hu=MYeGOihDOVMOLCgM!ZBZ`RjmhPN;nT{>Ng3Q4H&3q=7A zP|~7PZ-+pF|8jD2aLk4gOIKG{C30{HoHBWEu=LJoQfO%HF+~CKEe*|G)gjegAt52G zfg+X{F*1tr^71doDF^VJqOk_?PcBgulz{J+by-_jbaho%huDbDi{(6+>6lw8`SEYSfVHZe>ZB%&CMGBS+l1L z5^_)tXExwXLl7N3n1l_6cO8=mS|F&bm&@JU@E-+|E(GVuG0njmTmd^o4-Vo2yWaZU z!lhEd-J3VZo8@x3IsP-hVQ!9JP!|hw~ z%{6P5ubMY^naC>$4&1z1c3auO!69FWsF2eR)L>-mYkT&uSh&5f1KtMTA9q;X=uLWbuKUWo5a|MMXvIKo4$!8@zn##14jq(W{vT z{s6!DKv`Lt?qt#ABsq!_1cmiSPh;t?!Amh+f1dhf5pk_HPd zeR6lgB5d;Eb9)G0C54HW!e4K&=#dKtcYpAMm;QQ#MXT2>n}-0V(cic9*98mLu2{Kl q*$-d(YhPi(!bNM>uKwXmOYE0000B0000000IF33k3iL0ssmH0tEs9NFxvd000000000000000001f# z2owne0002Nj%jy5A8|e*0001II2w3JDo!aAU@{k2Fd1?`AU_}tBoPJx003e&8HYXXrT`LY@F%^D28klNJcSR_DMIwAlEpI|6aYH4HOelCo zDS%KhY&#!`Sv!VUI$bjxMkW$sG#Y+UG;2O1zK&{$SvtItZo->*m|QqtG#PqJER|k6 zRxK4a8Vq4H8BQn@d`KvLN-B9tELJWReMl*kW=NG-Gm~OLbV4O{LnEPfSEpe*k47Jq zXiBSvWR+-1#fM*jP%)~0UW!~jzlL6%XGd*5A#FY*KOqk|9ucmFXR3BnIv@_Dc2rCz z5PwZDv3gadYeif!7{QlxK_(P=Nh+IkSDSQJo^DKeN-v&lOXCmX@!k+5Sr{}<% z=F_R^$D-=Vqv_G7ddC(&ZybFncdK*;>e@s)~(K&8F0( ze&WTU>dU3y(W%a^i`K=Tx`SQm)2Z00gWSBC%A$be)UC|2kl@0e+s&un%%sShc-g?5 z*~+8Y$DzllhvT=Buy;_|wUgemjH_}@&Y5%M!=A>IZqc)k=FFzfx0Thpm9dX-)wYw< zu8iErq36GvzL9R>w~^AIdgjrp+pmhwoObBZtmo6L+QOc@n|rQ?X2GI^mR&iLSvBIe zkfUlwwSQUSy_wpujnKTA)2fHhqk*1vR@S|m=E_82+A(IW=pIA8(eDQzuHe_RT1^$GpAywTEgMiv2{^=x#6U!ZGF<6;_vVI(~Ho}&4As$_VMV%^vmep<3Qr@*68=$ z`iB15?!2X5L_78EN6lX0^W}8&SEcRk!_dNIRVldu00$&VL_t(|0qjyWP$WSVZQR}6 z-DBJxGDy$eeaTMqsjjI`(Pd7sL56jy+K5^`zgx+0cZXiXBJ$cd_Ug_5{T0}75jNOh zLvnS=<&8_KlP^l1O-f~*=jGfz>y*l-v$o-B;ZCl#($&S3^Cv`xnZIF?=lxR_SEaSC zPT0-ze`8UX;#t+Ml`Pgdojv#cY`O7UKKm~GjO@XXV4(q~umL zAu&{+8piKV$?p~bP;gg1wHtq`R~saRx;2@_9hT3UWrvn=jab2Y^P0gYJha-`r*Xx@ zdpJbcBdwU5W^dIW>Ldj7`VC7V){M6}m=Ac7C=;MLR(2kb7}ix;E4@EQYRm^{$hrI0 z?o{c930__{YYquyi7!kC=tE=B02C65w z8VG9qB;pI0yr`GYbFkK=e^uW2g9rJdry=bW99Ek5A)uH|vTFk{sl}u?z&wBDFrwN+ zo{IR8_oK1=mA(m!8QfKAZWeasvr~eF6k5A?6JWSKR*4N=12 z6gGrZdseP=m79UpkGO?&ZnThsz3j}=FMZ;vTgJKjrBA?#bmIXg;)kWkTT|k`FQu96 zUPuX}b7|bhj{vx~9c~kd&JF%zIw7IIM=Vdu!3Q+cP?73~NvZ-T-(fE|^TSd3Ol4#<3p?j+8n2B-#l4A>_@N8Aq zv28o0*tV0>vyF0`QXA8Ahj-lL&M02nv2Cnv-|2lw7uw&?bAa*%+LWm;l;GCvgw@}a zXw}jWYg&?2{?ciq>LP92I{*Qq=gv8EHa)0vH;>xhZmNH^_!EL`EJUn+fDeU~Pc~rAo6-+;SX3ku+`%NzoES%r$QK_#^Jai=qc$0Vz zzgA=n7%Odl>jH&hfz@xTM7KrPaE?#%f}|^lCSFymJk9eL9(dV=db>Zn;oyYXxBc$0 zZ{+g#Nx;B`7y-Ng2773`mi~8i^xx^%Y!9h7_c4J9aR!j|e)&jW*zLbPd&0qn?EOew z6B=)29h`79&*@I`{aEPbafZ-P_BXl^gq39*;^H=xRYK^{y|Ggog28!j;g7x~w=?h1 zgo9bP8c#)|DeQdV$~=AQWDjsZH5NgR#W3ow{*6fjkSU!vY}mX~1_H_SMt_&WFqVTw z#;0!3bMn;bOxKc~G5ru=z_zLk?STa+Dn;OhoS7gn%C37OKmdi7+SRLTTja|(Iy;3C zgoA@#AXc7Oa6p?;wN0MFuqla~tToDg6GuD|fdOYRg1T$h=~xJ8;!*L)k;RV)8bDU3 zv)`o%jKvK=d@^Fkqg9w!zvcfIra@p zuM4(l3jgS;?tb+?G%Ms2(MGzY%5N}!Bdeu!BT7C{X@dWm-5@~$-^+w(;puwyp{ge& zAR!tr&-;hl4#(}o`*}GIAf3?t)eo!nQ-MaN@64nM-wXNF7^Sk=7;HnbT+@zzj1cx8 zwOTm|8xYH8Q=`U7e&Hhp5Roc;-r>2>i^UocP@ZeUCjxhU%?U4t+Pn+_jaaN#I1jx( zQoxU*pbEji=)bGOd+Q~2IrWC%r!bw6ce+$db@)~NU4P*hpa2-)?-T6Lcf(I(RULmC zZruWAc>Ql!aBm6SJ+~A8?-Q(wXLp!R7h8|w`ckz8s7vu|7t`rs=TWT0|N8`vzTtZK z*!}2%623uB>bW<<%7aJl#}8dMXzurZGD&2>H>{u=*uY#2M=I%51p04TD6`pY`Go?cfc_U~j?3V-edF8{>CBx+JOGW zA^yHB{?>2)*(3hMApYKo{?TCmz%BmEA^yNH{=qK(-;w^xApXu-{>@VU!yxpN8UEp! z{^X(lz99b4BL3YY{@Nq{(;@!BE&j{@jcI>m>i^w*Kd@SUM2?*p2v}8UOX({?8%(v?2Pk9{sQ+l~E0kOAVc0 z4_!A3c0~;S-;n;)ZT`A0{@|GZ|0s4k3280}Fbn`?I}HEw)&K9$|Lw{D>AH(W41qfe zZ9xr*P!ImeJO0Wx{?KCP(n|mLUH-f={>@(h|7ZTM!3)F8{i9{$5r{^6eF%pbg{8fiHRS1<_v-)PeiFQ2Vw(`^akj(0~2Sc<}8d(ytuAv>lgz6!^*@fPrUv0000#bW%=J065Om z2m}oR0TdzDD)-IC_!`?WM7A}g#Eq{cc`#Ol-eQhEXb~87fec{OX+xPbV&8c9pjerc zL&hXg{lB?B7H?Ys00(JFL_t(|0qoI5c-vMS0PuaENjcaVnyzK;t=z91bYP(EQudUx z!iq;~Mgk|V7JMOv6PMA>$WUfxI*)lP=d`CtR>%t6_Y2tXPkw*-C4K+1%$+yUvCuYU zify4|;=H+*(RCyCi8d=uHu)IH*F@4*+eAAu;`T|Co%2ZsM={Lb1H(|9A?G_MPa09X zY4Q}>hhzS2#Dk~LyI;KMe*W|UvCWU+K6=Vz)A0TF1vG>Dch)?7R2bQ%iWEM2ShLfQ zGV}ubaLZ4yHld>TS&)rHVlh?~i$x-A@R?Uco2(O%A-8wXxVZB{FdAhG2VkSo;Dena zPCN9U1Tx-9qB|=d#$)lv?d|QK^#PBMVfbOiPLy9O;L_ApI#TuOBl1xA>4iW=3!H$a;-_v#RVn?tB zV5Gw`c!FgDje_l$gs!fxcXh#}aA`Y0=?RuW{dOx3s(<@E|HzRe`MTuf@4r<8+-e^% z0Wr?;ZL1Eqwzg&s1D1rVxB2E6`!8V{OJc+q=UbPLKbJnSS4)6&ZpjFp zlR(L<<1GCzAQJn2z7z_j4=WV9^z%MK>~{r=*~Wkx{(NZZh=k7bHGr|1Exi|*O=ARg z?)2&GglqTiUDFN&&!+iZR-6BW;MYJ{FMDx!u8Jk_dBn@rFYK$30|RTmJ!i5 zFyLD$F7U(K33m@2KYr-$+j{380vxp!H)uPUW>`gu=K}9*IuD;Xakz6e^x=o{f92ep z4{*FBT4yA7FwSi7N?h6^xm0QTuC%$i^gEBovw793&G1Dz!(pnbG*0q1%rqtjxO`wA zwylPQZK&i=F!|ek;mpTA3yBR=**OZl2L1lS)d5f;d zpLk`FMm@unQd71jOaaDiM$~7RiW5{?Zf>r}lczMCxm;R$`OG4XcJ3+i!2f9!fv2iZ z(Uf992|g`%O|ItD*$WrWo?4_)&T4Xv{F}xTs3FCq4tNzM;0g&IC@%>Qq!ooJ0)4gL z04`0{GhkH`J^g7auHOIyx^*9y21gVWq@`_Eebi4P3QIUx%5nR)_E{knuh_>IC|X)t zYGvgE$gvhkE#oDCr>X;x6n6>uVoy;~WhMNrtgT%EEnBv}k7di2$-&y%Vpvcl+w+CD z#Qk6MWdY(w8b@)Gi);iMUH8T7iZcX4AeHqAi~%zpLMk(1lLL}vWo}94{0<9DdRljP zZ*i*^tLvOAe*V75xnq4u^!@(t`~SZ&SM6YMwB%(1AP9!0Y2r7{{{DU{UMiKOHT@=0 z1wm&R1_*s@wPsV^U$zkd$8 zf9%@bjY5^MJXRqXWlf##bo_EoYBSUUjbP|dtTl(6{~fhg`uj1>3}&#f!}jYdlfV5PxyVFKvU*`g z6yrR%@#_O`?yKm=7Y{DSK>&gUA{s-0ciR2VU;HG3HKFLViTE>c^ARp}`SblZ-X_}j z{K?NYMtC4Zg6NOZJC(HcHvvc&I(=%9iSMoX<`^)00LFR!;bRWwtTqn zulyuKu-BJVcInHpA=Y4^BnOJ4`ec7JW9(9rzTV((*8hi2dV8!dt6JHhfgmxUO7$ph z?0Q{&+1lf^{f!^8`z>AFSrsV^I)+0FGEKPkqM~NIyDa|N{QoXQTd2$WPC`|*U1eQ2 z3|%kp(iAoEjvq|k|Lft?ZiDRbKFj(Ed$&cyPP+Gg00000 LNkvXXu0mjfFnoMW diff --git a/public/img/emoji/ophiuchus.png b/public/img/emoji/ophiuchus.png deleted file mode 100644 index 06e6a19101864a572e1ba3d8834b4b7ebf95d643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2567 zcmV+i3i$PjP)mimUq=&UNE2Z~5LrqTY5)KL0000)5n~hs8Zit)J`hv@000*N7d;SF83iLw6>9(h z04xhTIuB781R_EaTt^gOI}lMm5mrMIUqlmIG7UgK5K|=yHZl!LLJ(g|7Hc~UO+XV@ zNfl!M|Nna-qJJW%fg`DdB&&TQqmu3FBBEv&a> z*SBcatXIv3C9ZxBt*ceci6yd*C%1Yapn@B%U>bs^P|0f@k!~K8b03?jQp#`%oSQ(v zSr~eVBe8e{sbT<{b|0IC8nJ&9tc)hLd(y`ffuZzLCK{>%$YpDsY=dxAf1FDtbH=HrA)`eg56>o zhqGbRm@>f0cj0LqkJz#1T^WB;7IJYPmVptkgBP!f9<@% z`}Y0r-Sw?z%Z?+rzl+z@rRUM18)VW;OcNL%Bw(YoQ*5knNff}fLAEcH{xyX{D|e=WhU`okzjLso1bv&xstjy}VeHvn+}02?ABJdmA^dWe06 zBd(Mx!A1arDga}gD$I*Cv(?7p#pQ5nW+~lKI%I5Cwu&BwFAjda3OkDt#jftt;>C}!Fyi8YF zq9xAH+s9aLT)xJ*J3v)|E40?#*f=U?EH*ASI!d51&4X&Gm2(@|0000bbW%=J0MF0Q z$EHhHPVi_}?;&BiOR-4Kz#fdBvokx4{BRCod0lv8*k zdmM(>=FReEHPy2$rtUsXySvfUanq)XQEfJ-faE(}h8L*AJo(5>B5x@s06m3$yj1PJKt*53YJI2i=eK zIfd%87fz$kFPNE?V>5K1HnXJs(0eH_$*esvWRsIMa{+aJ!XkackglezzO1~__q{Zh z!=)PCP=kKa1d3p4P(z^7ufE^x0}iZyF9V>Dxxd~|8Q2gsm2&=s;jzm7jV>ObkIM(~ z0XUk>uJ}kmkHJQbUB;Lx`1KbyNX@==pbt)5I!s)r4?(9@ z0@nGOr42&-ewdwNs~L=Q^Tu)MS_hNh;)4f1E{RBz>_SxB;s!OgDYG%boDd_gx(>wg z?*08)adGj}?VWhiS@g6RW?hjtQL3xv8AIk^g8ABLx!Ge44%lS|ULnDlPxz6O%NID=Ol{T)qeEk&U8XW}@X zyZr@H|7zFcOBc4EbA%)Rjv7?Zfwk(A6Pf->QZNPcG_M5-G1c1`gV4WvLz<^3&L)VrUd&s%6{rKwVE03!z0#4EG zTf32^Kv@dW_5ji-c}06)^Z+ESy4n(ACq6^|n{VH^x$hbp1Pe3}xd$Ud>?5HYH!fY- zW~uwOBmWD|rs*E|0Tlk-w`(`{6{VGxk@g`YNkNR}hg-jF22k40R-l6XQvzL5D@E|f zo|o9FHn$Rrp$hC`G_p}Uc=hE4$|H2FyoDG(%S zbQ{Y6I&Hc6kd?rl3(1<$eUq`JQt>8Kz)ng^LUtlDY2$u?#P^geKN5l>x$dMO!`2y+ zJ%G0fWYYZTXmK-AY>}`r#3xT4$EM2*PO)=UkuWjNwi&o!M3e)I8&O;SDLX=>5>W&) znHWYUlSw{7?*oO3Esls*aaA!fF8T80VoA~5nWfmp2;iJZA8&NP7yW2rO7(xpq;$B_CxNnSig zp5!!=Y=Q-3k6}X*Eb(M5C14%BgVgU!q=6XGl6y$fyyZHj<++3uxCYph0v0Qtfz&_W zDmBJhkbZj~Nj4m1u~o?+0OIVjWC{-l0N|i))1xSX%~<}2=r^+?LA41h7zQ|ZQs`OF-uv_ z=f(Tb*MwhTETv@czE)2YP%%_lUWgYT@4X=1vh$+lHFd&3?a%~4PPTSb3XcIO+jd{P zeEITUzXB*t23pD1DTow=FLS4DGvN3B=ANEy*z!=}5o*VMS-7=;LgB%Bz?x0u4p<8& z1%*4k%BC(jjc8ORmaKkk`4Gg ziH$Z37fcm~1~@FUrjLKHspUjTc}eEsV+O;2mDj~#12GT43z@*Xf}27=_5{JkX<^dv!)6MnH6??sp;`Jl3E=7|8s6sa)O~s$4GJ=VcIr#+oby z@Mq*s{`z`*i0kY8j-2rU&|)o21b}qL&dv>$wKHh|K$EqxG#HC!u}&Vs$k1cGn2v@c d(45xkzW~7kwB+~%Bi#T1002ovPDHLkV1j6x%?|(o diff --git a/public/img/emoji/orange_book.png b/public/img/emoji/orange_book.png deleted file mode 100644 index 66e29726c0deb8daf4e9ccfffb9feba7babceb9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2757 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 T894di00000NkvXXu0mjftVWiA diff --git a/public/img/emoji/ox.png b/public/img/emoji/ox.png deleted file mode 100644 index b1d4d673c9777d6b1eefd972cf615c150224b530..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3212 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 KHG6F0oBBTl8^ZYj diff --git a/public/img/emoji/package.png b/public/img/emoji/package.png deleted file mode 100644 index 13337bf84042df38de57198ba96a9a9beb0b9f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2895 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 t diff --git a/public/img/emoji/page_facing_up.png b/public/img/emoji/page_facing_up.png deleted file mode 100644 index 804c0d739fa2696513b4aba55a462df41f185e7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2178 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 diff --git a/public/img/emoji/pager.png b/public/img/emoji/pager.png deleted file mode 100644 index f8b653342c597ce39f7aadec9a049d0696dc40d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2502 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 diff --git a/public/img/emoji/panda_face.png b/public/img/emoji/panda_face.png deleted file mode 100644 index e6a8b98f5559d14ce0d14534db0b47b6ea2bcd96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3183 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 O+2*Ej6N-^b*na@NUKk$$ diff --git a/public/img/emoji/paperclip.png b/public/img/emoji/paperclip.png deleted file mode 100644 index c78148e588548890a7721854f51c32f71f876b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1995 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 diff --git a/public/img/emoji/part_alternation_mark.png b/public/img/emoji/part_alternation_mark.png deleted file mode 100644 index 27ac9b6a1a7b3784360b08d496a9954d433de82a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1947 zcmWkuc{~(|7k_WY8po0jQz`AV#jamWEI#fGp(cK)u~g*9nTVDo$yIWUjm<2|eU))W zxpGY77{|Dh4o4)cE2*RiS^LNPzW4rk@ALhB-sk(G%uSDoiAae6fEfL#!HJDb`!9ru z8<<)d`VN2y<|Y<~N4!n^03vlDTpI%9z*Qb155Wa0c>DwrI^d-Q?g|j73O5XZsgD6# z5J7`LDx_Lq6pavLh?kWi!4$4*LCi7mQvuI|5NQZmry$MJQWfc;HL_i zmV{IWA(#e{GzdKeVOn@m5zfhjvjU`8fQK^Nv%&Dg@Yhjb8W5uOho3G(mY{9~+R;(GU%d_Q~`j%|tfG;O1md|w5b zXK{p$^|AP_0w*6}eGFD#A`G*!FOe{qiG3N!vO!K5OqOAR8`2$xo7cBE@7?$)7^2EFIwo2Gmo&wkCf$xoB$&KZ>+h3W&T*N7w${C)Itb%`$2@1`F|i>WbKS8b z9ABgeaiXz25Epr3lVzj?TYM0Tt6f`eS>R9(4&+EIwMi6R!}@EY)&7`fjdz_f-34m{ zk(Y=~k;tUOR26xoK$7i=&y#VcdecB2zRnR$w8D4QqWo|iE8Wy|Q>^=MiIF_vk36ZC z+nYO*wm2N=U)`{To$m=#1`t&(L}UMVP;mDyecCwlRTlY`3un_yljY++eP5H7xub61 znay3ZNskOpX(vz5z8@~}w`zZXJO5LkiFejre&xfrk&fd}wX@q2?<`c;%`F%&EvQLG zad-~(W$pVHCO*zqb#K^imTsVD;g55DMAq(pDbk07j=M@df0-}xv~HXmp7AIcNM)CL z4pw+7SIiausbx9a$8`@PHLq~$KU`LEy*0X)EPGEezBg_7Oh%G)f7#>MD(6|F%k0_(MQ`( z51LE!U$`~oiIuE}wYThwHnDt__7C{?Fi zYTRE|RctFmcyLtcye?n;WxJ2Gs@<&ujl_Jx-_FVZ(|3j0{HsL%?9e$(i?=zYgN27Q>k4V z#iT7$n}#m&$NhYg1z$AgnEgSLS8<5h`3qg19Mw>7D?jZtU@IXt_D{leZ<+MHfl4zX zZ>QQA?zs8Go6gvy;`XIyv$|^+sYjK)*uiH`p0u$seMY9AiLBivEp5@WB7U@zs--T> z&Yqy3G%0a;PBs{>=WKTBDg1ERX&<+x!=5}>Fs}+1VK_MLE;D;>E;&Y^wg;x*oc%F>ZjBkwI~d_)<>mYAEbAaCMz*>RrgE-3nT4 zW8G$LyWc8tiDIa;zgJF1W@vAIfJR*Q-AmlP+S)_Y12Sc)CvBxC#^1d0-aBhZab;Lt zWyNoG=ZaA1<+GOK;dx)EjE!TSYF)P8n~bfDk=jKK$s}dhq4Woz%gYNT)7CaV4A2ct K4T|;c!~O*XnQW*4 diff --git a/public/img/emoji/partly_sunny.png b/public/img/emoji/partly_sunny.png deleted file mode 100644 index 1c871dd1fb89168b505586c17e244099cf4053dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2838 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 ohO4dXcowm)?KP~8`;a|601pjKFYIC(LsG5`Po diff --git a/public/img/emoji/passport_control.png b/public/img/emoji/passport_control.png deleted file mode 100644 index f280a39333020e5f675e26889baaeeca77719dd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2426 zcmV-=35E8FP)I9qXQd@000047>@)Pe*_zu z01QS4Hgg0RjRYH-1Tk|3F@gs+asW7R1u|p@K9~eDWCk;V2uY*=|NjR(-3U0`2T0&k zo$OGW?FT;H2~gokmh1;R-3U6|2S?scnd}Kt;Yyh7Cw%A$GuQ`A;R;pZ20+~iDar;x z-3LbAC3)y7f9MEG;0Hq93RvMnlk6~r=?6pJIE?Eqg6Tn$>$TJIJB{mLr0x@Az&DBM zGKT5D+V}`g;XaS+B6#QE;PfAK=NE3|3R~h4X5$@k<|bF+3RuzM;qV1Gxd%qi20gh1 zHQWhO(F$7K3RS`2;P)n8;s-+A2sqaYT+#?iyc%-l2~o8O5~d(_=K%(Z4`So=_Wk+! z{sRfd1v9t@MA!*X+Xzh11`x0WEVu?a%?L-l6lvr%i0BASt^EA|0twD>uJFR#`3DiX z6jk8~OyAz?`&ysvOpkp=jQeT8rHVe`2PO?%i;J3LCpp~%?M1|2~FSyD6S@Z z;|M3l2r$tNQs6v}<_Jl*3trPLgyITU$_GQGk-zd|mF*O3)rGq8Dt*}p8^i}g-*~a` zqMz0R4U>eZ@C^pE?(X+SlItFE&J0H03J1Qf&hFgg`k}_~@bLW0$>y=t_nOD{6ieXF z*!W;y!7eAaOOopW3#N{<@h*Yr8(885BCP-lodqetJUPNBfaC{8u2!Gsd6n!{h3dcB z^$$PZPfNf-JhmVfxOA=Nc5>7#dFLrt;nvji&&};um)n@D@PV`DyUq0vUA+=wzOKji zENkUuVy^%QkUu)4EGUw8bg&~Fs>8tOj*QtlMcp0{&qYYmB(wb(0000nbW%=J0Q%Ae z*S69o9z46At~IYr(A-+zQ^`!(CP? zU;X{B`B&vHCw-uTJ$?WeK;dq}@VPk$jLqPLugSN*7a?*0#g=H!CxI)`&gT}o~x)=^8 zT?mJZ>C9f^1Eq8U+eWemaQwaFJ5j}WVybuo&ZgRPH=xFL5|awy^@c%?inJ~l#xH0w*r}Ve!47r6CSYNGS5ebteMc;-{}-|PCf%9#`zfYEju1qoo+;E z@cQ{7RqMGdy%9-PNsPGk)ylx|BBTPG9Q|X+*G%d8qscMhuS5JT4)hu_tPBh+N%GDhK#7CWAYXkAFAr-qvWuwz3SQLUC`XAhz+`DMc$$!=l+N#oPG8|qyOPFY~7(CEdTw-z36%`d(9O_Uo3-PXOxxNpo^ZPxW&ZN$xgG1Ty zWq6TxT1txh6amW+LuW$_I}!CPo9AUckM`z4nO3WHf1vZi=;L`_Za_0b7Ci6;A4p2F zI2kX)9zB2lK<7FyO*5?L;kX+hOP{evU%E%*8QRMX!Ml9m3oMYtiHl28_dGp#aPKdk z1Si9`+#Cmjj$wyqv>CYL<1BIT7DpNA76NKw_c;Jur+z%pIpMkRA_NfkMQ6)z+=uDW z5ri5Ay0JhZ3c$8nowf~LY|i_>vht@>%>Wz+oNY&1&bt6q6bttuK2RtJYP;hQbs*5T zjeBwq?){nH9|O?k2Q7~d0zSY7_yE*hiwA1dXkV=k5N%`dSqixh!hP4h2XO1{*}=z| zKnM`<4u7>~Qb0ryE7yH@0w8yfguzcy8g}5$_9Z8Z2ZJig!fgE60iY5hE z#rjH}P8Sgo0R!K(9C#U;F2E`SU94`h2u|W4_XNv&NO8<|VS%cGE^?Y}h};eT4?K{d z6Odg6RdQfiH5oBI@@lDQj0@PLLG?0aV0vK_mwu>3uHS@#L7O;H29{SROfS48Gf$8? z&IhDX^>QgN3kGb4Y0a4c3WM?D#0CSi#6W#RuPt$UML=PWG_dtH)Z>A9Gl&NY@$v)< ze7UNjH-08L3fQ3cugdGi81yg6oGDPL4I4JUnn6 zcrO7E)l5DVG>k}QRRP8etK7aVXh#DTx9zfJyzEckK!g4f^*8s5kAdr#Iju7p|%(f|Me07*qoM6N<$f>@ecGynhq diff --git a/public/img/emoji/paw_prints.png b/public/img/emoji/paw_prints.png deleted file mode 100644 index a40a751858c8aa99e25865e173f6979bbda31c93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2016 zcmW-h2|ScrAIE2?ON;83b!MJ@of%y%;?u4!uiUigYCb8Uw=PkZtIe&^Qdd4w zmh6fUrJ?M*Y7`ZQu}j26HSar=N$=6;^E~Hy&j0+M^Z$K+=bY!#&h7RFb9r+)9FBp* z7TaCmX)|-{>w-3+FjU3i=yG;CI@{R?I4Vi@CBeSH*i;_!0;AJS_(goQ9;1o{SSKaw zq(!etp^_F|H{~aoLCpm78fQBwA&B3ButXl*MT=h&Oe0SBGv*3X_=;d-c~B-Fi8F&h zLcAH2B0%CyXCf`6unMC=tvZ6~qD9RF+s}x57;zm+Jt5dOO4QAWpA(FN5;fy&CoO(W z3bSE6i3g<%&^!pwM~GwrlE_DrcnHvw2jdSB;y#Q&LWo{QT!;`IjJOtOicqo)!I}x6 zQ2df)WiZ~unwMjgVn(z01u1OAnLft60cU2qIQxQRTS+09ArB#v1n6xDy8~m_c~A~0 zEkH9MG@1uRn?l#kpkx9103iTW3=c}+!4Cy!8iZ!U7|3ZM*(?ZE(4r1X)XR!x2=N4C zN-?UBH3!unqZFuBiPL2$1+F55Y^8+#ta&v~1LS-dZzO~d5Ud_&UQ;4q2oMR}0QgEq zlm%fk(~?4vS&uPtg1slea$u|uqiYG~DZzq>9A}FV;wjF^Nnst%01d!uzz9BkNeY`t zp`4hB_cG?73s&)%M63>T|d2k#bz6TQ}7}d`% zO%tFUjHnnTK_(yq3jw57;Y<}qfrQ@gkvlLN&x4SV+~e+^Fe(&o+!k0KbD418RTa=^d_{^pQCWt(J}%1{z?Krp~U!Pw!UvnZT-0@d#|c!ValV zfAVw8%A@&jczw>;AF)r@}&pdA5Qh)99lD*2U zT(fm7JTBzIBF){u11tvDMus?P#=F9p7y>u>y+nuBi809iaEo zHIMjMlaTOPtBt<&d~4nEkcd8bt)Ergf22WYu2_7_TsEQn>Zu+xlcN8`1wPK8E6!OJ zjj@L!?2q{P2wH#VE!q)1IDL*Y@Rx{Y4q%#^2va#Vr7Ag ziOG-)hmP^~8Y8G*B!W}rjVe`(Ug^-|Wg(Z0c039@bZNhIN$x}CaQZ*_^F0O}1NR(1 z;uMnD&?mXwCJ}m9*sE>#wUsb|U+^Jm%%E@$n%t7U`iWO|Nqcqsj~7cnK8=9Ya1<9C z8QfYb4s^PHsxniH%~S>_)-^6&YvesN|8zNoKZW>dD413y<~A0CeIUwhwAtJGM|D&@INq#0<iE z+Y=#;R!y#om234cJ`wClDmtlA429ErWx6Z&NrQR^ysgH2YNrlZ|MEU(P4D0*u1Sw+ zz{rh6SLfqj4wuQtowsd^j3hp7yIE7cU^F}8w?gTOz`o>vFReB{16djye{+>s)f%lF z-D7uX_wL=H8+Dnsp&pmqXjLzN4@XyBfb_ zRC;g!)*y$5T8s9SY&$P&Xhc3j+%@cfaHRBn;17A;ucTUyG@$HNZ1B24XRb+u>O)Ce z<1xKO>Ko;1zrvcfdT!ZNjhbG)(j)2UJHLY4O}IAsH-hI%0aFT(V^B WSxJ0B^(6RBaUATn+vaZe`0M}9ig|tj diff --git a/public/img/emoji/peach.png b/public/img/emoji/peach.png deleted file mode 100644 index 00ced5574b9718dc6c70d9080f4d1c912bab8435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3109 zcmV+=4BGRFP)PT8y(F& zFTNrn@2!#RoOjPTET|J1-)c(mu&CvLTj-2sBufC=RzBl1$H6YQUQy&)jIEF|igbMC2_+gLyAn}hMTuP9Ig@2sUSV*u@? zit)CgwHh7knSJV;nCq5z?Vyb6k$Qv*5p@a=6-5BQBqFIG9prpk)j~2IIRNByPv?tq z%S|`okd5MojK)PY=Y?$LeP!>cot-Hn?V_I!IRK^^8NoIw@UEfci-9Ux02n|9-)U0A zJuaFN7S2>a+;?j0n2YIwSsq9Lnq5%jm6PIjT#^qIwlOBuXkEo?Mod&59#Q}yJ`SW^ zTe~J9X$ub3SwrB0dF`H*%z0kpdxF?-bBt9--f&vhUQeevD$8+pd{;cyd49!fZ`y%} z)oDuCiFUSEIIc%AId2BIXk}$jG0b2|=aY@ng>OAU9@uqEPbz&a00013bW%=J02UHN z5dJ~|1PT5rdu&^hFgax*TTf#({(>Ev$@yqCin4+GszfHm_f-Ai*{lAyqSMfIotVA; zb^Ynrugs(7@b3$q*t;1+2gqU_Ra9-&%edzxvP!J000PlNklHMoPTYi7^@o!7a83`1NMO1=q?Px3?c>PnMi4-N$TMSFW4_fg`N8b?1H_Mt! z<&13(jy3>3K5IhWIk}a>3M&)SP+t4uYW$^V1=~Y^ZRjy z01D!qI3ubIQ>fuMo=V}h0<#dsS(Pai3N^R~*Hu`9=ANtY)3P2I^zW#o3lPV#I1J$D z?uVbd8@7j>qv!Zppk#)OK_;ZzTe;HZ^UHtJ3+{cb5Rxy76cf>(M?Z3+_nNYeYRH0Cd<0W${4gT z6T?h+AOV}(f3~dZc~P93W7)a6xx8A=t`(nbpTN79kK|kRJOI$fSssX*fvd({Aa^wLcoTTyT66`90kMIfiK+@4P4Gf5tFq~xeNb%7-8o-mq-Vo`=HI=e$Y8%5a+qO{%v27eF zwiQ3%ItGenS(c_b$z*nU??<=Q`**xm9GH>-5TM5h!-5KeXV_kN!8ve%n20-Z$1ya` zaGa#;E+5S_Hsbl0_xh$tI^Jn9+n8Z%*s_L)nYw`(Ch)@nl9)h=0|PH^Hdjc!RiDF4 zneVGWco-5MwMN4p!3Rz!f@2!{O0- z!k)%>2}j8F>lKoqIgWsEB$>-C7lwAdR6j+j?`L~{AR>Xz)>IV;j48scuUCQ+Cqb8# z$Y5}4`AA`J=AIhxMyhvqYmlS^fjDeQMcP=-!)o zvj#kx>hB7{9L6J&03_nQcyEz|Ug^r2bF)EG`XSiUvo#c&_4x|D{gatDT7V8T1e%8O z_&D4l^mz4!hD9eT1Lp=pTYI3swZrG@>h13T>8G!Ez0d%@AMgZ@-~b^w0zDH%^T7eI zK}U7NN{U3mIkSGli`Hhh;az?%mo66#qh>}e)ch7~Yowk=;!7jeFaadzkPzQMf13lzfBMs_W|#9@G}XAO;ysMw_jY!c%X<@^_)!#f6Xr z|9lNA2Ik8s`Deh~xj6jYpD?y$oC~3{sv^zwPlK->m&%6&`ZI@S{hrx>d*tG1!0}6KZCO*)LGrRp(-M+A&qfdfB78b^U02(MGp@h=`)~coO1rQ?2>F1V&^!+Tf@309R2g6VS1`r6|oZmnjjDhXV$MnF3TlHrA z9>KuN%nLb7Vs0iWV^ZTF4fp-c5d;|YCWaJ4foB6uq@}cFKW17}CPd|{G zmpL6hD-3zp(fy1S1QbgKAp2h@wwb1Ly(~jnmgjk%pO?e1)HM#myK5mpfVCL31`sB+ zEYC9$o@W6Qq^J350kjc{Ov90wD6ULF-%pWW03TXK=I?v&00000NkvXXu0mjfr{}S6 diff --git a/public/img/emoji/pear.png b/public/img/emoji/pear.png deleted file mode 100644 index 255dc923dccdfbafc66ec0b2c8b8b667ced025c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3482 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 IM6N<$f^^l95dZ)H diff --git a/public/img/emoji/pencil.png b/public/img/emoji/pencil.png deleted file mode 100644 index 08f156e1bf85e0434cfc6b86b3c730187d19f40e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2859 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 LYHjiq?-BPuA|PbU diff --git a/public/img/emoji/penguin.png b/public/img/emoji/penguin.png deleted file mode 100644 index 4c24983cd417d3ec8afcd04a2a0d0e00c5fa131a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2640 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 Sd9}0v0000GJ)rd!*Xw z{hmpw;O+gRR`QcH{jPNOmOK5dZYLTK2?z%Lre2D=*!`($lf~b{E)dmx72t&*n9Ja$ z-0dADDE+Bq#&QgWwbJ^TK+bm&oY3SVEH21C8KBkYkip#OizP>8qfv6Ky=x7y>-oer z6}$TXyBi8jY^eR9Pq=9Ybe_tx?*H6@7QQ14NFe}cHw1sI&s>1CVTQP8jJ;`)z*cy% z6d4*A9wD#|2MrJr#Q*=d5C;MfQjERbE=Y-br^p^Ob&*mA{<2~xK!KTB2mPNwHc^)S zrbqs}g&hElpLoF5ktW{|~1i*k(t!_O)PE}Ag9CMhWWGM$$ zaev^9L~D$esbB?ce zzVn<`(uz~)nPQw}J1;*-b4n~-e3Y2X>tcb3fvdRqk{=ulHeig=dZVzJ%hM`0JWFxE z?vq84S|#?SYIi0ViL}5>ahkz+Hi#t?{?nLGXKvE}|D9C@c$-rX0000}bW%=J0G}@W z5IZ9g2skv5Rcr128eoy3icUp+{ens>(*AfHi@|jL`mO%(wzG8lAo{I$rn z%u#Ey-rnW(=;=t=>9y3J_tSjg+N0c+)#urHb)Xmk00;j`L_t(|0qvIqlpNa@hI?%D z#RjG@`$A7u&?5{WeUBLYtOWVxG#>@cy ztFG>E3O3Z9wM?g@qa$gIKKhE4-mgX**xUZ@Qc+7wVPQ_D&KLu93afvSU|=+B>4u`$ zo%=5Cjf#l&EzC?ZK_9VNYxoPnf4B@{Q^Ue|WL`jIxI&(jHd`C<|E9XSiIXsbE$wWV zZUDil$E8dmlPV>Xlf(AHDWvGwAOI8pHtFw+zH6kRiTS0L&WpU`OlLgal_g=q0A5#Q zG@ODtq6^~}iKo#_(Eyu{mhg*Yp|i6qo!%dp8ctAK zMeM$)hoFXz8OYOG;$7$(Y|?xqyTXzsp8+6+a%wCD5uy0bE53zkYYdTNr0r5$BLOpD zKq^^?uhnP*VE`-eCKMYR8w15&Q52?`TOv-64xT2S_#Gf(Zz_)!IPm_iFrkv*s$#~+ zuthg-vZ10Y^32)#$dRoTi&0*(87mKu3OGn+Lm=V#p zqFRjVq8XTCWI!?-iiwRSLIVkez~eEG$`4AV3EDM?1CE~>>o$bGO&DvFNSahn*+ zW{X6`7)>R?d7vCvAsN^i17J-P`;0;&A7uJQ>}ZW=x87q)j`uyT#pBC`z|K-~KvXyY zpi1~5SnPwG~!-&vpg`Dit(Ak%=-A&N^6~I0`kG zmpVDokpZb>Cd(PPkpKuP2~Wsm9t?|8WG=&f4?x|OtkfWdh^PRb6zl^luvSy6IsRmT zB@8^eFF=v`7ZgA%m==cuj9>pTg|0BN(AAZ7^wF!wM~Ci}vo!ahzPjj~zphweVmIQZ zFx7`P#TW&hI1Nr=FT9d?{L%LVM;~c48r2XHx(NV>n?o%u*3DgM`4!MGWi&b~@#NWH z5M5z+%2kBggoF$W-|He?h4SR0wAgx3wRW57zm+IcikBjG*l3oR?A%RF6N z+(;A;CnqnGpXa$CLAB#x<4l7QUi1;uv~YGhMGA7KneRZw&!NMGXy2r03f3oV~bv&In&v4>Cdwoo4d0@ zh|LwJ4%g>BS|$hn{>Fw`*P=dDkKD{=@b4-b5wcKPz;)090f=|TSK%_EFt1ppW?F50`hoBX+S*+&3ugVNFrlH2y} z&kM5X2pixQ#5Ke%_#U7?J#+*Bwt*MP&BZ1Ad`$_rDRjEQuL2C_gl542PtV+3001_i zklg%SJgeve|8y|K5hYA%h#QCdUMp$A#AHW)s8qo?O=uNMaZ zsu&=FImnl{pW50MVgT$L%lrk5^V@UzNA_R8)^qln7lq^JS;gR{hnOMXIu^FIZPCT* zVuiop{^|bwg8Y+bU%Ue)P)MK!^y<)=sFPDKw6*JDHDT~rkP_Tt3knJ#;;loa9$s(@ zN*p($-{Qx$x3y!9!7k(2=6~D*R2MHS#$naqsI2H69)5GS zAFKd$>k!AqlTkhBfIbJBaN)vF##nP0ES6>G9yzi?X!MeWi?dk^soAOPj||D*Xup($#ukv z2U@(v&~yUEBn`JZ(mesd%PB92Krr>p0x*R90;oW}i# z!iiDO*m{B%(d8~JOG}l%h4y$X875UO6}jzT|QxzHulB; Z>z}dk#_=$h2&4c2002ovPDHLkV1gW%Ry_a! diff --git a/public/img/emoji/persevere.png b/public/img/emoji/persevere.png deleted file mode 100644 index f2c7dd3f9f5e128867874f463f5e05738d3e4347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3076 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 diff --git a/public/img/emoji/person_with_blond_hair.png b/public/img/emoji/person_with_blond_hair.png deleted file mode 100644 index 6dbc7af6b323c1b39de8f6c080652306890e8446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2985 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 diff --git a/public/img/emoji/person_with_pouting_face.png b/public/img/emoji/person_with_pouting_face.png deleted file mode 100644 index c199469f3d9e3c2317ab8e9cbf5b61fe0ec44aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2839 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 diff --git a/public/img/emoji/phone.png b/public/img/emoji/phone.png deleted file mode 100644 index f504f42007dc0c01d6839c1adbcf772ebf2932ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2727 zcmV;Y3Rv}tP)NF*tRKuUB&N?`y8heuFI6d7k4 zBYsd-V>&-{Hb8n-Tr2_v9R~}BXKW=65RQ3%4Gj&Had?kDNqap-VF(dwGdgcVM?DS` zg;H8`7a>q4EKUavO$`z=0t1*yRFgbO5)u+i9wSW|AAUguKPf!2=hBrcM zKSgpwNwZ~cnkF_?2@=u)E2RJvYybW~*04s0+3cLUo zk^m#o02-G74Y>mwegF%O01vYP7rp^6#Q+|}0y1O(3DOWZi2x1G04>P?AGi%8zdB0J zE=8096RiL(w*V)Y0VSXU70d}Ig#i!MCrQBo9GC$Vxh+7(02cB98@|04}}& zDbqY#S0yIJ051Rk(|rRGeTQY5AuvWlFSr>k!X!AC03hrD7qS2gY6TFd002%C6950@ z!9rNRM_j@hFwhw_wMkgLRAQw74zxQ;c?=nzP+FY<6|ZY}|Nq|F1}LQxByj=|w;(g2 zEI)jhZ*LD9xHnj~A4Y-z9>5ABsS6#K6)BQAL$bM#&K*MK02kG0Y{V-|yE8Rat(6V|kBg|LDlX6h5qbhqn$o!c%CT0VvO4W0rb< zbv;Cb94BomGKnHCu3v3|5FoJ#AJ8>Qs{jj-NKIZ67}A=e|NrWTFgm1abpOq}%|uvX zEH9u69RIX3+#cwnP!UjOpZq9-?vVOPtLf3wM%<$!zu0RapQ3;+WI zQUC_Rl$ox@m*u;h?Ax;PrI-Ku*Q}Fv_^_kq=(*ujVdC1ZgJgRX0000wbW%=J0A}s} z|4}2<6$e25nV)_9$#?#%pDdjIC(4f9&ic8H^YP%u(3gbbz}Vut)nwJW_TkL!=+5rP zuGf+8__hE52OLR6K~#7F?2<){+gKdNooPMHcq%h9TF#Wg%Bl=;^0H*rt`Cm2p4M56 zA`fFM2h_l6oGgWgP79~e;Nob`WrkaO-@nV;-j@0^J^DWRegB93GkHf|ZdE>RDxOhP zR5X41k|oopLt{p<3D2*}&3lu!3NJ1yUA!`>CF<+bX{U4BHmh~pHm5V4uCGsMsg;XM zi;D58muqwJ8Ko=zN$zCVnRDMZ0;hrf2B-H!3kJUZ_S~7SdM@c-SvmvHeO8@aTv#zU{K{cKd`#2R;%lv%XRQ&xE^3Eu{!J9)xm-l z`499akSDI5IOQM&(sAs)M;v-513|8{`vZ~@kt7iJ*|%@s zo)_7-52i?h5F{ib@{{gPE;wLBQ5jStSG%RKTSPoh)3l5jMzo9e=Mfo(K{CBZl6WM# z!&3Lvi27S4RDIwcr?58O9c~Vb2>E=wDQfr8TJ!U4uRXfkZl`>1#EY=h&D&UoyEl*r z35?e%tR)~ZRP*+u)TNG8- zALqb;2=K`L(E@CP$k3VLKjO1Y*-xF@ylm5~_#eX=nqgLBo3>Mk4-jC$jr-SOv!`CW zW*7)OqH1Suyp146S%}m{<7-PRDk`e0;Z?de9<7TAvP{z`y1M+M-B2$Q46a?9IvZQ> z*Eq%IAoodP>b%;^(|ZhPnZF#1d4NfHVzJA-{BT0*RnMmwi69*|h12}&VGCXe(Ln}~ zcwQ5r+7B@n8$UzK@Y(b9xS*Y95S%#((F<~oY`7xvuZ-E~A(SxMG5F1G( zM=LS>N=l1_CImsgt!DJSv2EKlA>|K(VFhF_$y&DjK+aUoy}89g*^|(_CrRax-azZrJM!F{ zPIJEo;|2;a48yMR0&x#SGDf!bRUGt{8&vclj;0G)Y@tAdF(+Wq5Oy|?0kY&2ADno* zMbPy%wLU(zHS1*zBigN+PKGk#yt82q2HbBEfqJpn)05fYK`0rheGk$e_T);{^aiL{ zT#o?vd+Z+@T39b$N~|Z`vK8Tw(5fMKhd?#bM0gn+AtMPEU?j(}0C2{&*d{rox&%f5nk z{e1cbZop!&(SlZT!McaySYoM739TZ~})rQd6z!bhx diff --git a/public/img/emoji/pig.png b/public/img/emoji/pig.png deleted file mode 100644 index 6d56420d342d29be78f8cd925cc4f5695b4369fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3027 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

c@!7-f(7NWsr{un);kA;$f?LLkVBWHh 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 a#KaoU2YG&wko-FU0000hpOxi-zqi%+H*x6g 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 W!0Uw*KW#1m00004xSelYXu923J%cDK_o2# zf*c&^$%v9X8P#+twO}O1YAMf^KAtcU^UG$XNgBw2Hs`@)v?(2>IwRDnZMbVplQAjR zpF_`|Rgy9maU2fq(0SUaW8tP}a=C!yLO&l8PAVn)U12Vms#e)gVLc$ zV+slD$C0fv62e0o)pRYtb1=Vg7rap*yi*Xbawgb)DVZM`n>;b>z;$p14A`Pgs#rPZ zuvy%tSm(Ta$(d)tjbF8XP3FsJbFMq~L%c-qpjxw3d>d|9Iw*{X6biLGQOul+`%2X$|RYU{SS2J19 z1)Se5J(*hItTW-ncrspstEsH7tZruV-Uu+hV%?(-n#GJw!m;t>Fg&heth&B_^cas7 zkYMfh7oI(tO10auSR^vcf@LRFR908lUd>2jod`g%{Q1|U6PYTql}rx9hJ|4XRyNKw zRmZiCnHfJFK76>T zX~R=LKJ~COue4q02M^l&@8t6H^5^dp;qe1K zvRBvo9{8e+29pUlE|!QTNIX7_mK^)=^pQ)30|{Mu@L@QS2$$z5WgC16z}r~N6fqD^ z0@}|$Ycv{LVjmv7bVOU~&T7-Z;ZO}HT=N4z_i0~Ec#*}#N$_~2M2wtG$v81QJY4+K zp-YAyu26U{84e|eLv%XGT<+sdK00ydmK+lskHnALl8|*p#XoL&?NL+z<4Yoj&_Smk zmxqUkQ(!tYEccEt!H%MDaY=0aY(+E_j! zavuU#ZAA@EVylc!YG^Tb3@M|8ZI>@=qoS00J^jqI8iuAI(Ag6Ap%;7&;fZ7Q(a~ek zH8s4aULD{n?g=mC-{1S|&}VTOD9?1Z+U07Vrj<7NoQbQCj*eAESJb2xUzcgK?g@V( z4#Oj$yYmetZdBBM)#UVa!_6}ezMrYQI%c%eW}D(&zd0m`RGf){LV>Y^5<3U???EZs zRA=a1ew1QQ(+eTK1mM-2W8YrQIDR%2g+d8r8aYCPKyc2Tlc5+WF14TlRch!dM|JpH z3#*G+*Nz`=q7kHzz%Gm1qB8 ze+&c-0}R>O6MSvLpyBfVva&M6pmqS5iN5)C!^Or^1w$&jd*n!t3kE?TFcfv;p8Z$6 zT|KQNlBi5%X!k2v^H%T4MmpW27kvM7pBjb%rr+%b6iN}<+Lh4WS4t``E6epO04;fO z{Y;04&gdTbxhtjF<+`1HSKGr^W|bu5#Ye>N6&)z|-vofQugr9$qDXNgBaFtB2Gc2O zkCq?V+BXk{1EbpM?P}k&0_2|;Uzw4WCd73cdiF;tgj}*xDTvF92Uc?gbeP!ZJqV1# z0_^@CG6Pg}&TdD9F>m zi4phbs}39>ksN9?8kiLnwdlM4w?hLt7&AIHj}L=1#Ogmd_$eUaz!W7*kb$n&kD_Vt?}UN^;=S0IW*tlifia_6BT2iwyGqgtg!Ega+_#qmCivS+vDcb`eOP_B zL=bsvS6ufk!mozb{y+twRXaXQgHY6W6E8Ec8?)DT_=a z+X)1+*-Y4H-&gqV3Q)lO=kse9hYA>ahXZT1((G2V*c{xp@xaVxDq3>-N4J`h*5d z+9_dyDl`A3WuPZA{B`s7RDFTxm-wd^Kal{ueA$kfjv;yxJn;)3{{Vx)zrFx(fagC5 z2?_b_`L}mVKX_EAXYEe>^8c-nwOK?_5Jtb}?(Qxb5~4Lw0x3OE0NM}U1r<;TS7ANc z^IXn#MpX0AfI-;K2MJvi@+ YUuQW00r!hmeE diff --git a/public/img/emoji/plus1.png b/public/img/emoji/plus1.png deleted file mode 100644 index b8bedc99f913bae6463304cf37b6ee8939e272c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2900 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 qP_e20U3s`z6X@j>=rW}YpSA5DHZ?#0ADp7 zM<)|*M=f799$i2!gj6d&a@(WvFnr|HF@>B*$&!kz5Us_M)b`d`vEOM=H;$hjBtC+P|BMUP0HXgx$NDkYz}sdtTSHl7?tdfL}(Ob5-Qi zso}Sgf>JZuv5e==rr^1izLj)wMk~ddc;dR0=+LLEgJYO(QQ*Fs)2fHBhi1m1g3X+D zvVvf^mwBFeTCkFK#HEJKyOznbk-(mSnPfq9K_lhGq1Ud9?bEBBa8aIbPTj7EsdZAF zYfHb8ZO)&2$&hK)yqJ_}O00-$vygGu#-GfniIR3-ri*gYyO)b(NP<~Cw25Y7Hyzu#m!fr5zKmzoq=2}CU){u@yLL;ITsqL0Z^emVzJOS-Z$+SiW{zk~ zl5tkXua2~xfxxYdz^I9#hHcirn&rQn#Exi?a#^{fh0d>z3QB*)00016bW%=J0179m z2n0V30yr5T79uSP5+y4P95V+G9{#;Wsr@nD#9chIg@sp!#c8H_yvfY3!0Qk>3hj9I z)ZmE4;+(xStCE*+&sF7|>&fwn^wpzu(EYXT()PTe+2^-F*J9ED00jq0L_t(|0qxcU zbSr5X2H+&MZM!{tuFW;?+Pe*Bk|Iux6j5#4wma>$ZQHhuf10z#Oy=(KzQ_2V^M2ou z^pE*Jt}b0&4nD5|%gacwT?e_yjQ5mLQ;`)x9xc{kntmv|kHIJ2=mbAYh9E zlC+d>$V7pkyHinM4q;%i8Ys6S2xx1q`HuiS!azF;9BO_IV8wBX>QFIZU~$>Hy=fdW9{Qn{wE#WeDDF!*FM~Eq~!Kb z-!HomFPDi*MpUul(%PJg_VH#n`x)2+ExNn*{&D5rTi<;t%9G2JBQEnVNS8H4kHiku zj47f{4!?!<2so9er0o~A-2CdZd|8&91s9Cw4-Sg9E|WG?jtFvc?+(9#arupAwWoH7 z`1@{ux@90M3keQ`w{Sy4M|%gew=UaTQd8DkjnTmRi?-FO4*rd6Elhe=2tARxc0kCshW(XBZ3}&)eOg4uT8a6swz^@$2>GS<}fNbK| zRw`V!@>W4mCY1)!6B7{x3FmORp`b%S%Sde%#u9XlEgj0ll`C%+Z0n)Xs1QPj7)&ON z0zlwLFE4%v<2vY>_!Sq9tlYOVC^H>YfFL>pVTJQJ+)yw@f91ItFMW&(hNdpt1tt4- zGA95K1Yt5W&>=#T`YQ!7jyf0>>?~$S)n0nm!t9|^sWci|fr*5}94@#P*>M1{C1F-@ zQ>?mlIs6x3qQZor2DC|-Tkwd=J-c^HPdWh971RRfsR#wkumEr&>UOVMnFn@&3RJWL z5Q5pf(8##LVrNVMRCupyS4k^1i~36iR6v;Qh)Ch`swJ2JsNh$(`>Zlq9`cI-Aq-#) z+`_zxwWHIN9~HfDwk*dG6WsH8wT=~MY*RfY_S0|Bj?8JtEBPqsGzO@#$eEw zO2y+J80wI4%wYP-=1oKU|0qDvQdLdy5@QmM*jdI zvBLw{8d@4S*Nq)%iq8sBpN0Yh6Z5i1&P*}F_r13=GBt3nDpj@01`=5;27`g#NfBF1 zHcbO7z!g0pOxaN+9n6E-85wL4n3unG&!){zB%HCbwlr`ojLVLI!^6Yb88FP_B(>~0 z)Au$BZ^+h`UNu6|mcT$Lk;McJxDox)wN;L|0kDUt8e!9^KyU#O7K;_k37e7;gic35SmE5k27zL-4*s82rxPgv7(movF*61mY839;8vL-AA6yYBqtgRH zzzoP1k+87M%M3r@O!7OmYkd{ljY^NN{h;(mXPrShSkMoVxd$SiKauTY$#fO zVAw;02IfzPRqUy_+tP7002ovPDHLkV1m*e B7=8c% diff --git a/public/img/emoji/police_car.png b/public/img/emoji/police_car.png deleted file mode 100644 index 88f90b47f9f8ac53a4fdaf7ca799607933ac2f72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2571 zcmZ8iX*io%8-8OeX`(1f$G%iZh+Wg7c4Cc4i9M*TbSx8FwRSP~r8Sn(qEp6JvG2qZ z)K;p-+S)3rEyeiIR_XWlo9p{C&vl)1?(2Te{hagM=f_FLSsKHkm!SXvz_BIwC%1um6ekirewY0PV z&2nR7WAHeT0V^viDuQxTQ&TfDGjN+WniH+4ct!HEl8TC)gv8w39H`64$dHkdSzTRa zV`E!dTAG@g5*HT-+gw;!z~OK|{qz&q3uqKKH@Aw4ih_bdK|uimf!N;O-rU?A8XAH^ zp?iCKr>Ccji;I(!lSfBKyu7^Y>+4^?ewCJ%20eK`GLoB{o1dT0U@#u!PfQMoLOb&dkj4^YaS|3W|z~dU|@w%E}H74uTghEG$e>dqN1Xdl$4;LpzQ4ImgeS$h6X=BKhUeP zvNF)pl9Ez$bMxxz>Zs`G(Xp}2%uHuz=kf7z5{Zy*6A=&)O9DcO9PTzYgU_C2#KjqEXo#L?Q-(kQok}Yy0B0f1%Lcus-T^|WQAcTn8y*Ho2^*R|DMiR%4f(;?I>$?Qd^ z3|qSX?T;_!*2=d6s_SRV%PdKc$zR*vF8h`IXXr(7b1&);)%l z)9ffpD&49sC9gRRP7}}2)5ismNz31FEq5J=?2Bm5{M~nQl0KBQNvNBOtk~HymdWUD z45RJ$wexC*)G@a9-^yrH;6ujm@T*$$zac*dQui}3d>aao&Ev^uq|!WEaq=H!*| zwH>P)C*OWCb0yv#fNMBKFmlK8(2k*NWqB^YOuYYdQgPRIXROVs)_ilv!N(O9D#eq$ zZCgq3J?L&-j$R>uVU_VH5B9ZG6!1q+;=N>f)n6@jzG*eL35+xsPoHB}x>V&Vv%3}O z)9jG>m+2RuxF;=XLuWk)sF6PgS)O((~n%Vzx*d=k-g_r73c2I*n8q0NS9DnfOwRXr`ciTI@57s<^zyQ~&* zh7X6p>b+_Z7D=D8VU4wvk>i19&88Of^`R(?#oKQt3HA>*rm@8_qjV@oOd3OMn5^7fI>tM7Ge5T50n+=NT2T0IXMVSUhd*Qy0^2-;tM_e%H@qQq2iN zg;)%u>C=xmQhn{S(^K!N%7C@==)vPc>&dY-kSmDvI*Kdq>pXy)4r(X03M0urhEWE6c7xWtUwarrv<`g-M^ajVgQTK{diLH%;wY`Wv~gJ6rNwe|8tV}kMIiYml5jx8)bdu{TliJt(| z6CA!59qEv&^0^e26E1H<>Y!nwV_4;ecu8I7N<|*5Q%BenK0;G0bl`4}bCG9!c}Dio z9J&YpXmpBRRE#x_+u4@Q&SjaORyzvtO^6pm&jJiSx5CnxyZ!_0Qi4cn_VaI>xs&A)t^ba>DZl8`aPCqJGzQO8%Lq$QjSiDZq* zP=VL;B*?u`OyUjs5TRbLtq@f!M&B$XO581tfjz0RRiaA@(baifMF6R1kGSDRfXp$v!W z%rI78dXpxEE}51^pmAFSQqb$e&?RmM%+Kva9AWJ@XiHaZGsaoM8x}_r=%_srdGe9s z#;zFpysS|$D>o6@uaA#mt4PI#`Gz#&HAUu{NK?DVsl0bN*widi&G0RL@=CgI_5s}w zmi~2zRpHwU2|^Amoa02)BdaR|rCEig6}J&WmYc8M=SKi^2OjrG52rGv%TAN=xrV(7 z8O3iBgHey3xL3hn>pJU=OWIOuCn!Aeh{i6m2oUz`Er=7WPNtCicD5D8o~4K@Q!F>b z&^+h@&8|=a3x%Yt;$%0p7un%5+~rd^&CC?!M)>{LT+!X>{h# n=a*p$-vGAjpGe33=pfep=84$D1MWWXM+2~imIk$Yq`3bAn`~m| diff --git a/public/img/emoji/poodle.png b/public/img/emoji/poodle.png deleted file mode 100644 index 70d45d43446048706e7c58a6aade8694f03570bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3264 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 diff --git a/public/img/emoji/pouch.png b/public/img/emoji/pouch.png deleted file mode 100644 index 22fe144926d9373dde80d63665269b16e1d57811..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2829 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 TK+vT_00000NkvXXu0mjfQVm)^ diff --git a/public/img/emoji/pound.png b/public/img/emoji/pound.png deleted file mode 100644 index 52ded4937f96b9fe7493af0bd836e9ea78099e66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2570 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 diff --git a/public/img/emoji/pouting_cat.png b/public/img/emoji/pouting_cat.png deleted file mode 100644 index e99202d34dbaa3db9350bdc205122ff0411627c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2899 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 px4Tb}SD?4Icc2#u`Sb8ZTT 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 P00000NkvXXu0mjfGKgzH diff --git a/public/img/emoji/punch.png b/public/img/emoji/punch.png deleted file mode 100644 index a57c201b558d7465b56e2e300a6ef5d530737e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2908 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 QW&i*H07*qoM6N<$f`;DBC;$Ke diff --git a/public/img/emoji/question.png b/public/img/emoji/question.png deleted file mode 100644 index 2a24f4720c56d6a82bed1a59840a389f8bba28be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1640 zcmWktdsLHU9R84C-@bkCcOUG7;ec4cl%pu>(kUx9VYUf!(Q|+lDD9nj)!8?w|}5L&d0>ef{x1?>WEQ^S;k>en$h>`2oZMfglKI z{8d5Rt^EJM)*OCU_thi>Swn%^5VhYD*(t92y$S!7{f9Eh=t*D49f)IdkoX_`56Mi2_Eklf^fVATm*)9@OXz1gd@`1 z*zDnE(sVqZUytKiD7u};+rj5^DX!ooigJ-tDEc)F-?y_fuV0@Hz!1xtLqf_htPFtj z05o%t!7z@l3V<4xHF$a5vA5^Gc1tL{EEJ|8$S(?oS*xx0^c)WgYH@IAbZ{_z^wHRw zH8o;!m#gb7iR281jj7drj*f-}3;K1sahtF zu%~C2hex|qIvpPV#NWTq-F;H298szImCE78i(hQn!l^VB7WP=98IeeaR<9mZsm22X zhZ*J`Mb+Z?5KY%$ST9W*F>H`wIw`7&ByWdX){IR|Lo7mXPINm@Imtgp3g7}3b|Mc{n_VOA;kOvG?f#a76;#(9g1>mqi zuoporadDjc55?l^6gB1RJL=+MiI4wXEbf*{#~7x6(V}6QtP;Z>5yY%s|CD7%7^aUP zzQeG8b-G%Td}L>5B#04_h%@>Uh8-0MIA!V(fSd?c+1OVS{Di!ii>Zh4@|jdTkrxt;89JiF99)3Mn6o}qng+r_L^ zf2B=YD*7`{6df#0`}qBsbm=r}j5>I^uj~_=a7F8(Rx|s8&e+ghtNZ^R_XXALeKxYeH4Y z3ED{ee>xizZV^Y~EglKuSyhos`p?-)Ub`s2>|GT+WWOfsW^D@GlRrFcm3Y-9`)+Ae z`_!EDf@4zc+N>j2`SLh2Xs$Z{8DD;Z&i*33$s!wQxRHIvLoqln^+k&6N^|u3v#JxR zch8=RSy~X9U;YOab3GRZPJtr%=oX>9g`s;_tVJhafm$M3A>f|&1_|GQ+Dp{pB&)Oemw5VDe8A?I+i2wWhF$9(-ZL%+zr- zJu?#@%EfGtUrW1d)eYv++q``NHCmpoy`ix8dq3#`0gJYi|u&u*9EVVH#G>*1Zaq9wU)az7LA4VSd50tov@Bjb+ diff --git a/public/img/emoji/rabbit.png b/public/img/emoji/rabbit.png deleted file mode 100644 index 462ff25a431b147a05b6ced712177a57e7e55950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3238 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 diff --git a/public/img/emoji/racehorse.png b/public/img/emoji/racehorse.png deleted file mode 100644 index 517ec75703ccd29472a47c9dcc5c74696aa071f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2597 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 nDOGX>X&ZuAENEY*9}ECH_S!)7Q# diff --git a/public/img/emoji/radio_button.png b/public/img/emoji/radio_button.png deleted file mode 100644 index 63755eec258a2de526b4f1fc025646d34fe96923..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2198 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 A#{d8T diff --git a/public/img/emoji/rage2.png b/public/img/emoji/rage2.png deleted file mode 100644 index d1f7adf3456344fd4fc3c5337974dd3362677e8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1087 zcmV-F1i<@=P)lbT|DRK*cmOW;0zp}JDQ)c>9G|#IRJPlsEmAXA z*39^u!~f4{B9BUL1da5*u9YFOdel2Q02Di5G~Cz4B1HAGKx8VEol&Q-l%Y}RZ3Icx z+wA9e4EUjvI11>LAD#dr)1o)X#V-9}v^4`O#K`pZ`oSEcug8BDP<(g-xDgo*a%-_% zCDZO(gTxHu)#gONRC;-*7qn&)yX~AP-HD7M#cuUiYz_j8*oy$JjslgSlk77hGN{A` zvC^GlmrjP00ZViu6KgZA)C_lmUTl!+l`8WS0zqR?>IA(=V`An`&`5MyhrB4c@rFSX?Zgn!P*l^RoI*=5p)>N>P7^Kdu zZM}1A=2k1#$@Ml;?SUvrix&fR>k+`LXcb1e-IL~{TyW;v%7tJwSc%lqdVT0Lz6wC3 zFzi>FT4Sc&?@nw~b3!0C#YSQ&nC!38QD&<**X`SfBY?Pg5l{~f0wl%mA(L6@l{#B| z?~_W9YjhILeGa@nFj;I&ZA7+47aDNs)@PB4(Nr&7ZI1%d;#uHs<0wETPraJx!=sh)(Z9gK|T$T%}Z=d^d?`_Zv|VeQnhTJ z1dNL(fvd=q0Fy;!P*^J!Y7}afnOdxTkOQXyvN@5|s5IXnrlm@xHS*OC90Hgh1(rMu z>>_ceP`TKL@v~Cx&7%k$1B{D%sAl1E$fJP2{(9002ovPDHLk FV1kB;@9zKr diff --git a/public/img/emoji/rage3.png b/public/img/emoji/rage3.png deleted file mode 100644 index 58764cbcb3bcbfc88fab9ae50e5a47679494f79e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1119 zcmV-l1fctgP)JEl@NPcSRtzYdTpy7IQ=&flMO>0|L~1MqNG^tz$Osj98yv zF@#PecSRtVRxQVLLbYo;Sv?lid`9MkPeLmW|E+mYG!m_2HvXJxGbahYa6a~wU;qFB zXh9qQypmg6Ta8jEDjo&)e0<48MZrBi|D{`?Qd@bLfu12joQK~#8NwU&i$BS{oR(``zIi=mlJVH$?r z{r`{JcUAVtqnM&eAIX+g)$d3Ts$C~fnM`8h_3JlpqTigJVr?=xIfhBr5>ko{q{Lcw zSWuR6{K|%K&hr(V2ZenV$7OjyK#%PdU+pdF;e86= z&N7tIS|lN5D4LYU1dX*B(Wd~}qlr~zt#e2NvYq)^u=RFXhb*F}MFO?yd#;?}hg_xDovAsBM}bs)#4IX_=4k^~9WwR7P>W36d8 zhnSukzP#X6wgd+E{2XP%B|eou3^|TbXj)Kp9b?|#-ZIv82tzp9%JJluE)3)21@VvsPk;b9r$pCX zT%;*ux3`}^GlrFmi>^!4qHqoZ1oR>xaG?m9;$rcO$n&ZS$yF7?`xF>6BaA`oFj7J& zLWs*tyylByy}wHkpB*PSi?<6f3kWoZF)6iXEYBseTz>h21I?H**u@O=B^XhDNWps{ zv_>1jr%#WMS_|PlcAcAzb_+&lhXwCO5bRE3Hp2xg&#$kSOR=J=7z?W?Ap-gnjMZ$W zlyleDmzOs;)9Js&bb526H3SN~<9-E^2%`i+vjN807(u%t+AoMk`vs$DzW}o!1djE? zL(_cy3IV>67UvKkpkF~GaD*^4)9KaKcjD@5I>m6|Sc&McAc}SiqICrhb^@;z&ev@W zm!8cI9O}e&0XlFTkw6F(Gh+Q4`5!BYhP={@6~%u^002ovPDHLkV1j3^@s$7o diff --git a/public/img/emoji/rage4.png b/public/img/emoji/rage4.png deleted file mode 100644 index c726c94a295f57a22d7af38b53e68a31a15b0176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1270 zcmV*`{`sr^zq9`S{{H^{{{H^{{{H^r{{8-HAW)?M z00VkSL_t(|UbU8mj^juWhBL|BKn7uX51P&F;4m!0F}?qjT>a|gv?q`4L??feWvScs zwW_Py>Ry$doj&p6#j|JM{L9G+#&&jktKc{V;rr$*d>>0?Jm$73OfTqL-_CQg5RL16-ep(nh-=t1Oa1V2nFXh703Dif?pa0jEH zkb;y@*!Ho3s1MEpg1ZyIjSr=C9JCYXI2jN)4g^_N6bSE90Jq~HpePWI17s5r!uO#i zInkw{C~O7LQuZ+>NuWYABQYtv6xhF^)?vulG7Op^AOT?;t6PB~(8M4~5TXg!MFJS( z+;wXN!{Ni~f`{R-BG_b6gx`rzaPE0;-^Q_05P4o4=eZD4Vh$-p5!>uSfL1Xk&#_Ti z22GyFF~S+mWf`iI=f-^g?E8-h&ejv0RRr4_jf)(k==S#VGRu%qo(BQ4&N7Tek=78? zSKAfAoAm^5DguP#2uXQ+i*3T^QVNl#QbLIuU0zDb2`p3*JXufhq$1cSFUrSQQA`NW zOH-|bAda<8Q_sU#QJ|<0@coM5bUnf8BUQjLvPHA1@mML(ySPwlJVqG8QC5vFt5w+B zTSu_B*Q){na!!fycs@^4r7kW$eNqY|^Z9t3rg0nu5Fnrv0f7qzGQGaW#o}keb;I!b z8p(wr!n+g*F(ZUP=|-dbdt*3Z%+1Ycq;(uG=W7H92gj=kjt>rckF$+y3>QKv-)HQ@ zhnpLp_>sVYR!RuWq6cbtzM9~9tze7tLkgZ}3}Yig5qL9ZjOSrC2xeQgg2Th(cER_D zhrN2X^=yU1y36V17lkWZ5(|C+F1xgvu4mJ*x1-=7Hn;7Gz!oQxL_dP>GY2U(<#!@8iHOM zN6mtxR>8pF2%%}p@>gO?lqH%A$I9+N%PtJ+1%u@dv{nMY6|I+Lw3nVr1?nqt^tj*% z>#xMX;MevS@e_eJV_H|%Z`y}f`rUs8@ARw6`pvcYqW>fqfw%rrS--6o-`>4^xx2eb g>=Ji(Sickg0X5dB4wf$f0RR9107*qoM6N<$f&v~yY5)KL diff --git a/public/img/emoji/railway_car.png b/public/img/emoji/railway_car.png deleted file mode 100644 index c61fd36e5a0e168300e60b284b899da157e48175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2299 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 M&egX5OyJG`0ik0t0RR91 diff --git a/public/img/emoji/raised_hands.png b/public/img/emoji/raised_hands.png deleted file mode 100644 index deaf6ed055c96e8d04a93d0ee39dfffd4d3ce8a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3122 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 diff --git a/public/img/emoji/ram.png b/public/img/emoji/ram.png deleted file mode 100644 index ec65eaf846072891868add64ef13f84396c37e33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3315 zcmd5;*FPHy1C6S3m6i@IsyfuymZG=ZlG`|^gO6*On6tya5h*5i0jF=^2)d*?^ z6~u}eD~W{K)YtF7_|ETl&UrZx=ixk@&pKMF?5sSj004kpUG1&jAD90hSs4Fl4myks z05Ae{KnBXH9w1v=Ee9J_u&tVznWBT8x`nyIpNz4th=aMRo0FEilLn?f&eic9sx&On zM?b_*-``W;+f_5jSGTS*(jBYQiF zc1j`s27$i1McLlL{<;AkN)b>q2P?TheG;Rs%JN{a2;1ead%N<6`bu)ry~vvrt4p0LL~LA?4Q`;gr6Fm3b!2X; z9zR;q)|3U0cUzoAx1p1R{d8u2gw5gy27B_RC+ZriVLykfmgd@fJF`;a945vZs!Ahh z6atMhPT9t7u41Rg>qdtvyIM2nhoYmPCYh<;d-S<|`sC{3kFE8Q#o6w@dZ)|?>5aAV zvf__p?OuzcNjVvQD+?3E8Qj>=w}GB--QSBhN%J)F@XppKwmsu}nNeZ3??`{e{7ffx zdo3;5H9sq`ucdNqs2W|DT96Z2S{SjvOZ0UI&EPRnfuPBst?*#+$?m}EaqQP5qqU&>@ZjyD`+TEqw{(t8F+ec4JAHZ?rE-Tkx z442t?pZtFC`@N3T-yeU=t3^962-m1DRW@J57WA&C5NN~LgL4}M>NnQ2e{+tOpF>JF ztv~mj^gkZm{9PS&T6BsbADu^FHb&Rz1UH@abvpHE=ofJTN4@wz#`$X4UMK*-Qmp<~ z!2rTwbJxh~R*knuO?^srR(!Idj(iLv@{{!WJhp&g+0sWQYC{~b|LZ#TGEry$bt)yLCd%JnJqP7nq{ zpG3h9dt>X8IRN2bRMX9lgFf{4Tz^Fkh8~@e37=rs1OM{mKv}BoZS*|WNV|8jXK_k9 zQ^rwcpl2K8<+j{PEKf(puf^s5$Eu0h(q3!l@!cmE*F~WFU}6Qztq=%MW(>?Zp0+VWH)KlM$E@6Nh6h2pHa*27fXl!0ktx*Rc&U`$`v9H9QI+k&Z(Fw`@P zP2r=8xh)+}S&)go{(CcT5~-rHM_a!qPfr1MMob#lqxyw~_MWg0)zr0ppf$w7`!If9qqHf6c>Zezeb>Mon5YeKdw+XMrYKjJiSdKLB}Z*{rUbq`-9Po&^uyw+;v4QEXJ^8q zU~wak%eA^pPi|KjuKQI$4kh4h$pZFwhSW~z^UnX`TW!I0S4EjuD%}M?MZby%WEsGD zuCf9I%Dhwb)bvDWNpo(8dSFR$(51L3RH_Zq352oCKpI$$wKjpOY1|_^w&@~w- zEEbo3ea9)w**h{VO>JD_(A?D26bykheYz|x&2o6abDy}dYrR5vaV5cf)tiHlUJ}IF zr2im*U<08gc+zMJ2P{@eW_45Aaj^C*|rFr`_EJ*a(S%XXUJ}#$IGI8Mk?xA(KM_v zT|n=VQ2ies1KD2qp6&5cB=Iy!6rmtoI z2O5;(Z&u?9i!yps@GL48`59&-o7tctVy$OM(d7LcHowkZ)^Q=800^7Q>+T2c-<~;* z{%S3J8Yn}I7}ku8E(K z7{_13_THVmB@qOH;jw*Sx(FBFQWj!**Lu6{%5-=47}BJB&rjj&TM(D>lM2;*|4n&028Oq>#Wr5tUm_a?-2FwE#KJB5cyg`?i(7DRJ=TVE59r7lyQm!Y=Xs{3Fg z#^1V7FWi2ML4WM?b#^jXYLwNMF<6~8))vvRS6=bf92CyOxpcf5@qkykJXRhQlFg@m zr-e;;C2qeh@HCbgmC%ecAXX(W`b4PqU;H!ih-ie;fZo(2vw-BSqu`@RGI zp35AseRO!`^#Y3BK@g_J6ZH%k48hB-$4LZTyph}Se`N9a zHWG33eQsB`r0i#A_RfD_PG_*$56G0|_Mz>X7RtdQh{WoX!{Tq-?Y~pY(j)WbZE+pu zhZmv$G;XC(EQ1dpS z$wDy;!6Ro40gbL#8eGw14@ptx?#8o?7m>bq8eC`na2bT@O<3Off*8Z-qN!=nL*f7@v4E%SU~v<_&O5o28G^ZdVIz+*3w-O++H3>j?oPR{n0gwBm~96- zEg3pcm|EF5K_&C;9(vz}WCJGkUtU zT#=6%avW5(Wra+BGj#jPOpJe-!UtZa4QBn+xCqR9hg75)UF*3fd!To_ml5egTNm%A z!xzFp5lk8T6LNt5E0GpkpIN_1HlD0}S(Q|NU}e=@Dz>8c6sdx+TsYTDy6wT;z4fvspc?MIb+`JUPS}`D{z%78rNX sIckMjQWO&k30%+A#tgE~J|11&XeG1EYF{+}d2Rr8Wv#bWidNzO1x5fjv;Y7A diff --git a/public/img/emoji/ramen.png b/public/img/emoji/ramen.png deleted file mode 100644 index 8c89baf55ba93498976335768674ea8b64d171f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3209 zcmV;440iL0P)}2A0000600031 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 IM6N<$g0BCw3IG5A diff --git a/public/img/emoji/recycle.png b/public/img/emoji/recycle.png deleted file mode 100644 index 2e4e7ec332f1ec9ebb5c8f636afbaf84b2c89b7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2369 zcmV-H3BLA;P)SD2*|R;gud>BN=@qAwMA?Z6+gfEdvh&02=@hH4`k8 zG7KmTP_a}96$vVgGAfNR8&@A1FB=(794U-28#x^jGZ7a`8!enPDvmG~KNuM~8yGqo zHljc~T0RUV4H!xqD2*={KN=H477#QOD2^^2ULq=yFdSPTCWbC7kTeY`4l#o`5;zq^ z#8X1GODKsi7)cv6vpze$M>MWIHLXA|q&G9TJq{@lAap1vt2Hc_GcQ6hGeI*KNE$e^ zLo=&A5U zDwHuDU?V-jOhLv`b=ZTFHYbHHEuAzfk})QOEg^0uD2gyNpg$Q^ z9W${!E0Z!GW+OASJTId*9AP0FTp$=v92G|wIK4wRwLlzSAr?&+U00026bW%=J00e6i zHpu}O%kJ?A3;quj2Si9J4OCJvs5tB9h#>Fhvgv-A8Xjqm(%t-5D)Ec)_Wn(+;$LBWQ&%fb{%C^Yq>Be#C?rMv$z-Ywo z;l}QS@0*cI_rC7(KI7j#NLw87000F*NklCJaO zX@z?3=@+`fZ!mjFUU>zj?ApceP#1rG>S0K!&63i9BO*|K?eaG~m!EF}sXQRbi>g*! z`kLp`PY*&08y@i~VyX+be8u-re@Jc zNeGtX1jdmklYWcJ4K5M@Kvx08)m?+!Cw&s3C>JF*b%*v(c1|$D`$z&q67u}!TpsDd z2~RweV49EG2n;1rs6_mPpvlz*;u>%-j$o{;( zvuTh>ha(Goa*`8}*}mC}ya1_eHzd(zRsfST_rn7Lb{8QDBGJx{kkr^4tD~(TiG59| zhwT(``)Iawf)twkuaAOm1ztv<{m{ZGL8?lJ)Y5KPpp=uON@i__LpWyK2=JheAbch8{9mjz_yw5iqA0yF?u+p(tJ@Np~SN0 zK+H%j!3M~CLvj@(qxWqZ|LbtT zSm?DGxUax7bGi-L1C6C+;^=*^-*^BHc|3(0o0Sc~!@B^Q4U0F*U16Mkzm>Z02_1ri zvLa()ftE=ivB~t#69A$=y|yP~u~XE2O`)-<=peLj>6TesHbX1`uO1uk5AaIEzO2Th zr*K1o%P7;e>aX>qvY&bIxNx5a8>R=W9k@}fZRsT!fl`#c@?AS&c zA11xVB3+4ItrjyxEg`D?TW53G?`pNmN%g%zSvsCsu={J2HouGt5DIe{QYPTe^Wt2V zP^@y=Lxomf&3<-q9xlZrC8*SF0vj;<|G6AOp}s^HDWL3d6Shei6%s>X$nDg}3z!x} z3Q()^?H(7d7@7eb8_P(IB~pS|hy>6hMDOdV4*0doz((L2utH&Qh3rnfnjg?)p&5CB zUZpECddcvL0f6WmAPOupol`Fsq5)H?8a*IXXz-Qy1ytK1VY$m_&sV9@0KrW{5gMQ? zvJ?=dL)rq*Ja&{w1)W@GWQ36pS``)ZfKRZD9wl7@(!}%q`m~Wz zs>DJhAm<)w;}On}yYk9nB?!3z(AOK3ut@4NEGb=^&bei z42nL@APxa6Ew{Qnc50Gn01PvlV*&YgqgP(D6cSijZVTzuQgbj^OnHon{#Y%NQXhgr zsW@L&P`(lp>bAb;)={HIw5B}{F&W#;lis7gj2JO$YtQxFAejzn49-K}*QdvR=m392 n+V-RH=e&Cw{+teH;6LkEDFHC@7bj%V00000NkvXXu0mjf)5zb* diff --git a/public/img/emoji/red_car.png b/public/img/emoji/red_car.png deleted file mode 100644 index 331c0c59ed7921591adc5720f7d67fff675694c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2680 zcmcgt`#;nBAOCD-7h_m1LuSlnZp&C`bIB;Txx_>`kyEMMa>=EV%Zi-nLXJ|7TgW|0 zxh@XHkSue_Z0<)Vx}XsiU!DGk@AL6^UEa^v^Y!}a^?JP1T%Bzt#1zE<0Fbb^vvJ#r z`+pi-WXI<{OIiW|5x|wsIAD90zQgRWU;u#cWB?!vfc}d=9TW_}z&}gB0QpZQ3IMWT zk)0MaSY)S!0D)j25EKCYlI{mO(^uGPz4lO<--kxbzW^#}AM4gu=B63Pnjt z>6A2jTvrzcg_i7Ap48P(kd>20qY+|alVtJ%r1+GB15aOn>fk|XFqkfZ8c*(YwD*6M!2o@`^pfK&?A}c31WoZe5!+Y`gIX^$9oLsl6 zYP$+LDOC)lUO8rcyFUQ2Zr_n}9 zq*)rRmovgQFyKtjkLc-*k;yMKHA4V^Du#TlpfF%+^6m8Lc`Eg?t}YUb6*xHw$>azP zjX*HC9gnv|qyIU6TpI=(7~?Mo2gd=xza$dR!r~Sh-8sxl5f$A`PiL_Q%+1aJ($iaX zb?xAc4ej557l#vCS#8C{bdpFJzJC7d>f1Rv+x7Jg6beUHHXVW3e(}OlO({1l!V>^C zHaCl5L6zZs8x~a6h{A${ETicJs z#K+k=8CYx<9{(W!!OFL-R9Cm2hNts_$+`9KV?8~B_aE*c;N|&XzA7QzQYtuETeW^q6YE`I{$56+Ul;$X}sl?KJ>Nf9dEv1 z?fvHJRNu~G{{OHgScpHcbCap|Hdc&S&=U6qgXayjFAwnfd~y5P? zExFzA1*pL5Jn@)2EkDs0nWI#&no;ZW)#}GqnAz>~+gRcI;mXmf-%@MxVCyQwVeJpM z@_dX#wg+4~p(A-FAMaT@=^wV!3qKlm-$r$<=OF6cSjCZ7VXm*6SBUs`=qJ6^;jnq= z+vEtoqEijBu+Ho;E05|?az)sJU>l=EU@>dovXmLuc4PcO4(B-XK(TbtIN zHD;}~*L)f-ZbTRzw1ZwObg_u~GTl3-cr7toH|OTzmxAyAj3s%T1dt`dt^R3P+ZXQZ z=MzVsT;gpC7oUajo}3=4tTd@r=111he9QZ&XDzN=)<0O*utj%K|0~yxlD#^_F~9IJ zujOLhOo;~PTUl4G@R;)vWsx5z(wm&i+_Ag$x@yZkx^FgrYx6s~qf5S1?GfZD z{P3BG?{zmBm%2_(_z>w)jvcTFDS*e+i}z-%&ko!-XIdbOll|Ih9kh1HTZcv{;URag z&)T1Q&T_~Sz{-_FWo6P0m9y9L190^pD zU2fTP?J7Gxd|Vh!O?t>)EZn{k_*ed=QcF{#>CeI+2n0gu+55QI8c9iEJ+oCY>ydK5 zAhzv1m*r7--kp1K$DND{B9J?G2}D-}oIZ}pZ{6jkJ(r$JP# z>p(_G*=8e9I&(Ls#neCJWT$380{S@qZaGOV8|q!W`o%_aJQsGgF%1FhikAY z?u26Va86oib?npdmook-;ZG@PDMdZsTxBw%HPouoqyj0Jz41D?OCQ;2v74Fk`(26< zMGLhC&KvJPjrSI@L$K+yD5J;~)``YSdb2%Dd5J^+;I{vbjJb}HUhQmn=mw6pFzdlN zzwEYkce>-bez>Zsq2J|^SED|jlJyP36RR^>Yc7Giz` z*?x{sASbw#w4-hhzMR0a5>%k>ofwwNMsbV4I=TEBDZ(Jm^o!Z2m1BP!v@XSgZhFzK zE2v{?Af3*8PGg2}jG7e5w1VSx{;oGu`9s3!6~c#T>RYIB3VP2YGHGc}+$oa6psVC2 zH{Vw!&|Q0u2jniHHqElwn7bA-X!J|ffT)D?&J4vSoy7i~=(v;6M94>Svmg(-Dk^(E= z!#5XYzF9j|(PWW$RSII|cVzTTukrKlH`i7QeeZ+02O#!hE6s*^iEB42*V@HObPIBv z%lbs;t@ovky~Z641`Ef}%?m9bKShob(aCo3E_RMm;xfwm##hwRLgSKX`F@X`?-Q^;;A~Sv^H2UC;-287 diff --git a/public/img/emoji/red_circle.png b/public/img/emoji/red_circle.png deleted file mode 100644 index 16df206a7b96b49fc1e061a7d82720e78c9f2acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2905 zcmYjTc{r2{7k_8ocNQ~a8$&`_a_w8PUe})WTF0PFVpNutrHt%L89SwtvP2tEvV^jw zs7s=vBoQGLlWmyA%;aFW9kq~qe4nGJ0@et$y0F@}z zeI)X40EmI0%SdDy3grodor9nh2qJ^vVG#5OK~Ff`9u9Ya!yQ4;2LyNg?r^vf07Qde zEC@z`UMe72Ej}O!u7u*P9V6$HgNb(Sw9dA z2f=Iz+QA$MV&U;D4-Y09&Bo)I!NIJsFrJ|yS4W3UCbNWvH?deAnamaw+me%GD=099 zgt!L|u%)DUHa4t;1kUc=oV|P5;^NHIRJMu=-_w)p>dH}4+S<2|t**||)Z9{3QQ1;cV>vm|F_?E~^j9=`27@U@BDoe8Tq2QAByO3S@=Z-Sy1MLL zyLkHg%z%JRNlB)o<1z;G3y*I_qX*FFCM2>Kg<3BxPF!zqj*$^tU!S9` z&9Sy-+1fHQGUh}?CULlpf`WP^vO_>%OhBL-fp`c(nLC3yI&w**t-X7hRO&hwyMeEgB0v0=hMt7r7JG)+^(bjTuav>-X1o_t1d^0nat1HXY zl$o2$R#Y4j6kH_`)+HtTu-Gvnp>-jlO;OR!+}zcgnw?A7S>+GHL9V|)D0boE(Y;^D5j|K+syu3cUyDwH%jkvpyg@?Bj2(x*43fzq&J6CQQMRf51#1(eK z5Ew!D9<(T_^i+Uirt}KeII?ZRlh^jDahx8L=lf&&lX?gvkckVWTp06_IR9JD0Gz~~?Jqek2$Q4tayW+RIO)(x4WHyNs$syU**Hhjd)segSzxKFDXpL0(b!el*g@}4Yl<1>iq)(`*Op-- zX>uaak6VZ3>(nU857&zEslViT9mr9^#YO)-mYC^7H=>wFRyQ912hYdXf70ZWvvC=T zb^V-~TNOv(s)lN=lxwv_@c9hzO-@bC56Yf75{VjV3@{)~Qq{q?%7g~AFv?r}-uP^K z6z+ILe4F?QeKZ42zABRMX$LDx)WzV~wC)N>u>@Wg5UGuHe8G=Z0}rclzk5N)v>KSs~l z#WwGlS$gIFd+W*zu|~$y!jq6>|ANro@#QXiqc7|l%UU!2SWNjwuWIubx4ChdtX-_s zumuV5_r|!Nuz}Ro8^gqUqvZbQEJ3FNmNX7IE!%DWF@|!o;-X<`u{N^E(W!N4x~d@G zDXF03<^7ir@DO6e!g1N0AlMSNd>x~~Q=Z+jzN*?!dD!Lq9%WSf`cT)qY>pJ-nW`dICf->-6o8zp`mJn1{SsEy z<6$x|M)$2bB_WbsAx~$1sM&^}pSW7lOs+MU38G}Qt9yCulC-E#^MCB~%ZHMU?T3{| zA6JnJIoKLt1wEh=X{1Xg3^FJLh3%_n4% zTD(KpVP zHo-Q4a=f-Bzy9La>JS{-(SG7sS>}5+l0?yPILjeLIH^Z(09#ubDfR8lK#&AqDzB1! zM^qrtkA5cmprm0lhH*X3@9vuu+(*X-Hf1uP;P(%lsI(#3q^DUa0PLOoL?MxR8^lMn zE)6tj=2^#1wNDqma(s{l@@~kRn$1kieQQxF@%Kt_4 zJi2ncu=>rrgvoJzxZ+lLeBwJD>_d-tbu$8K%$b0b!HgE?Ud&RfJU%t*=?UiKv)!i` ztE*Mx7%ig-IeK!i^fODeW9{EzB9zgBy1GFP+*;zBhr=;iNpDOrR!v!InC<&4FJ7tp zYc1BAHTJ;hGcyHY3x!i(o3yXqOls;2{A9L!tY*=N8M=3RK!hfXNCozZwl*xIds=;RH>3Q y?D26{KI6q}p?ltoTaVmy^F+|Q_Jy;5zs86eZtX)FFjfA2gB@&K4nDH-KmR}2J~Gt+ diff --git a/public/img/emoji/registered.png b/public/img/emoji/registered.png deleted file mode 100644 index 31c68a80b08a5d203c922852dbed886da2dddf9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1613 zcmV-T2D15yP)RRzHkBKN_0*{r|uJ z@1B>t=PokYR@-V@t$`NYhTBr9)B*fB{x*r@sROALZVPUE5v7$wdxkz3n#J$qB^Nd(( zv638(DmI~f3`@?{T^u4g7sH;l{Jz9;0tgW=$L}TP;$J7OB(9L3bMbrevRGVVIkxXv z${$XY1f?G*zKds~-k6#bsg8Q%8IpM{uuzH}Zm|47ItI8H$j7n~U$vZwFP0^v_<89@ zrryXvX#lVhoeI@7q9H6g#myWjMMvr_@9kfS0tWrX$gz6zBgguSocxujw~q8qMdVID zU=YcL2J1+F`Ds54MsggDJDs&J%JAt3U?CR?)=~Z?yBzjHkj!N1giqI6-Vx4+0fo?N zC`mB^OZZmkXFkHWL)SuQ0xIVjXh}4PZot#e@cK zLT1e&G~o8E)4C5)>8pWjx4Vo1h((i9XuwTCmNy5`VfW(-1- zzbU0`A7{l$8?e1)2NZ0RVg_skWdF3^wEblJ9e#Ua9kUIa_0kL6HpxGCF} zb&=8~D@ZRx6WaZ-8$hg^-9p|%Ko(wzc64^Hz$4#C8?d;#*J<5{rYhT#Cd+LLpkPjm z8GsypCA7Rx#dk{HX3S|u)pA?bRAsEX#>{}mw9tT=fE;bWh?sNm*e^1U zet2&epwL<5ca{n5A|S`Q7j&JZbB>7*Y-f?BTK#t1rZO$<02EAFzSIr^ax4Qno#{7t z^nno(F_2{`E*aDt?1?(YSmF7$-i-~AIcYlQL%}Kan(~Zd$JmB@LIc`S>;M$nuk$zp zGThs-y!}^roG|j1WBYYRt%GQ<<+TNJxg9V-SljaLF8cUq+#KT@6l466J64<=;d zC<0i>8R~g7V@@Q9uav>mXps?XF@ zUZ2^%%Fb_nr1RH%2K)4-R=~ma)|y^Wv|?l=CsSY2jWjTZ+9P_vLtd9vd8*~8Ji4qt z&(G5yY49zPHmxn`02kUd?F~(aw84GEQmH(ejP{0hO%Pwwre%#c)qc&g76_p!X%;oN zG*>m3Nn9oWThx?9DB|p)8uo;)zWiR3fsV70bf?S?Z00000 LNkvXXu0mjfS@i;G diff --git a/public/img/emoji/relaxed.png b/public/img/emoji/relaxed.png deleted file mode 100644 index 2c497df0a6e62fa12a5c36c716338b8f76e27610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3002 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 diff --git a/public/img/emoji/relieved.png b/public/img/emoji/relieved.png deleted file mode 100644 index 86bc90f56c48f9b1aa6e6455ecc495915c00a695..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3078 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 Mvva0p#$NIN2S5YtqyPW_ diff --git a/public/img/emoji/repeat.png b/public/img/emoji/repeat.png deleted file mode 100644 index 3adb99ea47e06ddf3be77d7f9d748a49f1d843d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2454 zcmV;H32F9;P)S8+mJdq-r1MrMRTTX#!oibP#{NoI#kYm7!&X%*%NMwSJtIS=0rAldvn6uKDw$f2? zlhxknp1RbGsmfG!n1P_dZH=(j;_Y&iwpe|kd6~S2rN?lQv|4_paFDT8cbkc*$ocyF zRCbzNfT&r0qEBy=N@|K%e4%rhzmBWRh^WV{!PRz^xgk1pS$&}E@%LMbxl($cV~4I= zc$-9EeM)JGf}+G)fT_vT-?g>PR(hRJZjn}aomP09XNay|fu~u1qW=E>NoR&paFmLu z$bFo?SAM5zi?5Nb%~*V(;py<%{ZMtA zgw+E?eX?hc%VUAc0yfxM`M9>m$-zY!Kl5{^7Z+9 zoxqo~(tw}8-RAGH#Mqg&(^YqvX^O9Rm$=E%-lnU(c)BionC*TM{$~?yVbbO;d-IRb(gv&O@Ok<-cNFw zil@Yos>P|m+GK#BZHT2bm$T6;M1G5vxin*zMRlgl+2)tC%yN#Z zfvU{L$l8>)(piePcapG-u+X!!%-PxH8ZvFGu**MJjAV46Sy=Oc0000mbW%=J0LjY9 z`N_!{&#=h?$;b`<1wX+*nSWa;t*3I1U-Y%v=sLGc%N#nVFk0 zZ>m@YrMusA7xg=@>9ilyKSs`+{`s8YeVX(6^qC{yb$$l9K)Rx~B*x4j#(*`ld}(#U zsZG9dUvjXqVgDWH+ms50Pa^^!tIYDo)AQdiF0Q%RCXV&!bfes?`j`le(rb-2bGfWq z@%YqfU)CcVqgFqP47h3KzKgiXYonVtt@K^Zc;qYBx={hWRycPh%k|YP@><}+&mr4a zGZu4&jCW9{O$7lH3dX(WQzq*k>VpEG2~D#gH&|D{2*pK zCg#SuAENg;dI9eg8U6TND!F`MrUQcb-Ft+u?J52-F&5x(Vd;4xZqM#`0Tl>WOYo<~ zN1`JEP8l)jL_wksrvmdd)#)aaDgD|Le}LPuj&zv`lU}WvM+OG-G>GiA+sC{BE{>V$ zrs7w{G7O^O4JHEy4J<()-H0LIe{}6ymc4}lD(R%`!K-skr?7$q))=S&SO6otb9WaP z5-(J_CwCo7btd|_up?Jd^29$$bihibfzZG)03%5$Dni^*IXOOiwrnRKNQ|*aS6FeJo z$$(ld-5+k-pA0z9bCpV^W%r3|aKDUSa^^*Pji;22f8rqVHAkU;xz2N@0^4|cKR>^M zdVlP`9aVcidj9*q&ZrG6p8S$W(Ztsrh0gW7ZFIn(-0$bNKk6jG;E>Na8!X)sAlU0?>N^83@z~lsJ7<>+|FL z@cZV-<^>Qgw_{U*E|3mb&&yU}vQOOm)e+#7w;>!`&a;R8-AAZi(dZrj$;RKVUEWN^~y4*8=2kdw7NGhhj_=q!8g-0UM@NeBMD zGtk10O=s2JV`<0fuh!t&z=0SD0N_5e%#=LyM`kNKXk#nbZ9wUr)PkT4clgX?oayBL z9A2Ec2z&jnx{vz*>0#u~;6=%49(QLnX6;JwLL8C8-i%Puk$_hxE=U~C1Z8k1@J7@q zVjOm+Hbjo7Cg9z1m2#P4XG)mLoT|t0VXsuBNJ-{&3d~YPR4whnC&km6H&L$S6jUA= zUpp0Xo8@P@t3Xg9(;GPRlmMl-JWRm?z+Bp0lz7V^41i}q6ka$04*dM U(a;s7PXGV_07*qoM6N<$g7nYX4*&oF diff --git a/public/img/emoji/repeat_one.png b/public/img/emoji/repeat_one.png deleted file mode 100644 index 14377326b39141255d605224ee900657092d399b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2537 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

afnY5n2 z*@39bT8+Dfuh4m*!%>X6V3ojQg`?%~^>(Gmv&-LRmAsR;(?x%;UX{N?T68>8X;gEN zM`3=SyVk+c;!S9b)Zpz)WQU!z&svABFKM1cd#OTvtvYt972_di0000vbW%=J0MF0Q z$q5W!SXw;JSUd^ZgqS{PB)Rug_c(y z_nPlse@!$!udAifGM0o!t<}v>i>|HTjot6r@LOH6M11?sa8>G(R1M#`EtVA5{kCBb zdcSvrNIiP%S57(oZhiKW)Ze9-bAG)wsupe7iwdm2tdbl{6<)bImpGELBqND)SFZ?D zk4aRQ*CYE~GxJl1o7qFNgCiq}%P=xBI6IVm(=atZvkTh4x%1Mfwf^_n!PpftIQx6O zb@bBCH^IP;8J%%xSTh*DVg@zCLq^@q4luAzRD0v%T)wu?`jBb!1`a zJT>+a;6#|!fa4B2ct~LD^ps*E2TjLkV^;z9peql@9ZV>urniED=cfghoIDg0-+X=r z00((wFL#k+5llZ11-b>|UNTHC`Na2M0?^>xF;54t#DZ>Az{-LlbHDql6@W0=Ssu;< z@2sdmpFnB0^V}S}b^Tia!F22f*6m!^ncb`u^g)5w`zXqB1=j^j`QO(73ZaLaxb8#6 zxRTQMIuy7>pb^K#3WY`S_{6^#0W=F^ST|YB7K=h59w*WWm*Bt|M?gumiY?}UPTU1B zwBE$J$t*UT#a5!y5jcYc(wRh}ok$n~$+hH|Bzuj9}5TP@un&K!qrNbQJTO zN3l-N6@Z6?#(p?(xsi|yBh5X89tes(Tmaq?8ZX0vcLJLk2-4!i`N&|D;Nep6tU2%< zB;a2_K_S&Wpu+>H)XUuz_``wMN`lgw2`JKa53Arox|h3XP75k|4GvVqH>YFJ+3tgb z;v+cjpgFz*3B*O}+1HZ~RDDYxjSa3@kmL!?l_1Dp5GF(q<2@Z>U z5el5`@rm~&Exzyrj&q>G_jsS4vv8oORNm(2P2q=C09~!d_cnQH5jKEVupKQ=Q{y`} zFcA187>}m5_ic^%{v>b!320;deejVt1uy3QFn=1aC!∓Sf;O&?)>`qpXYD0^UG^Rm*=eQ9|lgk z9N%0jy1~4AJPhc)La}nAs8THS^kD!62*bCEFe3pp3>YC%c%~0Z=yO4YjA6iQ$0aY) zhx4sH&?1*{+Y5$JB0bKWN&ty&Flp;l|Lrp)Nj1Y;UZrUYsB z+2`{{pRC^`B9(+1nD99e#twuex%bx%-g88XgBXO44@~j?6zpI)616PXT9y@!goF0a x-V0{99%r8*XLJBHkri2O3OjidNtG5^gcMJh9bsApBBmv7YXB*rAZeBvTvY`s zatb|h1vy9q9a{)7Qw1la6<(MdUw;)&oE~I)4nvI@RDl{$cmO(+6<4DbU#=~8tSNM6 z03U1sFH8j_au!K9026izKwAbbUj{OG2|$btOgIG@SpX+v2s80Ss*@OD^JBO2QLykr zsPap#;53zy7GLyQv)fmr?LejUY`pJLt@et^@`A*a6Jz5ynd>~E)K8rCe8cEFpYmR` z??I;QdA#O1o2MCY*)5F1A$WoaM)h^T@ky)nhsWnbq3UzE^k%uqCVwvg7uGkB(MOl| zgvaegr|e6q?|#AMYqGp9e%mmRhZb023qS8(vY-`Z(m?3pi&U zM~xL+yBThJ2}4B;DY6%6%te#rUaQPEjNeI~&qI`}Eq1#(gVJeGE;58&-51PQOHp zo;7i(J9$e1AeACs_KeEzak<+|w&GsFz&w)camnvCo>Le%<;+zq0000&bW%=J0Ac=x$Fv*oH(#O? zy(!0wV>AJI-k#mSOZ{H%Q3hf^+e5?Jw7eCs93T<6V z=w8oKr@wmyzD*=3f++&>gOy{12YEnJ5Ya^9EhN3)r!!ng1DGY?IQkaZV@UC3e_XQL zM{g;|u>=@sq1hw06cr`7zlsF;1(m95(t-_2-CM^c5yR=(8z~Q}*3d8~62tn}eOU)JvSndBXmD5^SM<5NTef+VO%(~1p+dq= zr3e{E;)bLOhY0>)Eur4x?iLuI!5yaX=l;gsPIuA?4u9_t|IT+#(tXc8w`n-M=q~;# zd!a!;clsYjPM@BepVyBX61x7p@IA2b=dJ|9sD6Ha?zGu5r*BxuwzQIqwjftE`F9JG zllsvPL3!bCKLNiLmJ2#Y^^;2ss@wvti=_`w7UW9~e!2*m>OlL=O2Kcx0>23=Z?+#$ z$ri^CO7aU%T6)n#rxa6SPg(dp_Hy9$8|>PAEW}X6%^JnEU+(_^-2dg8Leng!#4IvUj1^+ELw#0Chja=Me?lNHsLMMN`2ok#}v8CMq-@O?B_AhTqEMk)uJIHjT zL}-Jr;!}KtHk6c%k~BmD$QK&FE}Y`U{Tm~WH&ys`;{`GrG23Ve|0#SO-!5i8qH#}V z-=57r$(1H0B@J~KC4Q-x3XU@oJf-+Dv8a0pLQ?R}-Uc7-5wrMhQ-SxYS<|A_vM``5 zRsQ>QcGe|sVoPUE@PAAM=XACtaxZ0NPya5*eWGbr^?P_5sAp1ZD&btRYjylzGW)l zbLEpyFc}M>eBod9U5#~!8S9$ws{Frzz!KjTA5#Ix*T(`N2?O+ifPk@awfil3tw$Nfd?9*Q4AAZqv+3uj5b4iYu7VG!iL!XHLJO8G+Hm4l*yu0?aw`LP({fA zJxs|2?F*YYy-yZ3T~^6LLqk7}QsoMEyJ&KuLg-|uOqJWzsI}iHf2X#n2{JxK^Ch{5 zXNknw!?_aU-%x>@xpVz|n=_3t9-|IoW3Q*F72fg-txY`=Oo)O(*m%Zf-2$#zN^uVq z0AhQ@McGyaf>l?MxF;3_D9|HTX1T7H|B{Z|luwC?#l~j7GHcKQR%I|tnNPu_7)pK< zSNGD|`7V9&O7SsD3<``*Zss;r-ImE^8$}A`m{=L#=d$MW&zXyt*x)sd-3u3YIH9uB zj*Ay8D*MvKGk;j4177BYUtk~2J7gTY^h^EE83WJtU!os1s(DA*7s5F&+pb!`gB4Gu zlc4~RceI-tUuXvM)_lv7p102qPPM5`H z(4^o)IKxhsxYIBPp-ZJw8iSjq)1gjQb@BU_xZ|);C`{imk>chykqK+rO{a$UK@(Vb zt}h&u<1;7R+)^fXq(j26qj?LutJUuBzT;=N+tbn44Jt5TrSK-eTLIRX0r_sej-I>i z{N8yN&A~UO^Bc}ij?i3Ke|e_#!_5e1;Z1^0@tN_gVLQSm_$ZxK!or&X#|jfaB5Vc+Z(((vo5M2Et*%<=4dQ0lt`??mTP|)( z7pgb?Z=F?5jni_?siwwiv-!3JpOKa7h!0`&5La0sXCmSMlqXZC=)PRl+Ry+1002ov JPDHLkV1n?XRrUY? diff --git a/public/img/emoji/rice.png b/public/img/emoji/rice.png deleted file mode 100644 index aec477f6fdcbe67510940c1be364cbf403386cb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3468 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 diff --git a/public/img/emoji/rice_ball.png b/public/img/emoji/rice_ball.png deleted file mode 100644 index 5e3f843e1f389e01fda4dced17fa8066426738ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3171 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 diff --git a/public/img/emoji/rice_scene.png b/public/img/emoji/rice_scene.png deleted file mode 100644 index 75f04f6e53b8f496d9dc8d362d99d093a9d84513..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3006 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 A&;S4c diff --git a/public/img/emoji/ring.png b/public/img/emoji/ring.png deleted file mode 100644 index 5c3948f8599d2956f9b0bcc8cc003131ee55c3df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2683 zcmb_di#HRF7oSIxA*8(WjlN%`zNE-1lt`x}1u-21ur+}FA1+;h)Oc7#|#g;NXC8b_Rh!R#sLP78WWhDypigHa0de7|a3c;0SYs zKp>8eP*0SXAlcQ^Q{WE{CBWfufsuAAOJG19p^-6BxNu@Pl`O~?c(9=%K_Ma7Fanl{ z51|kRg#=1iC?#A_;_BvxBN5?FPBwPdf~Ww43BeFY2S#c#F_MG{35GlUw=)z9c0;=)7jHS zjiL^`d;6X61Ph@1Ior2L1+a{v@eg5&jYk`V%!%+WWy;2%n z^y=iEezSPGpxr21<{41jkZ$F+)TMankj3yVyFfw|_FnZ%p@*ypV_saQjyv8%1v0qZl{3OyZ+s$#9A0$p;l-1-{ z-G>i{o#-2A_&7xVu&>I(x1=CN!M2WkcN-u&Xr-EvLiq;wElCRT*l*}Tv0IySG8dDA zd{|)3KU+h#65dQE_${}Cz&=KU@lt)x;4N@$(eA_Q9TBu)vzE%8UFDdwak;c+NAkXFK!6o>kJ- z18y0p$_sX7p1NCIrNP}iP%f%1rsz_uG3oPa?J7Z1RhhHJb?);&n~?__z+7lI&gq6d z{~CB|x)wLB-!bJf5IFvm#>PGP+Ec4Fc(TE@_DwX_I2;-Ujo~kcomRPVIcCMf!(Maj zh52BF!tZZ%NncF&k?pxpYfBHHK`AMf_X+#X$FO^)ijj@MieFH3cAg6B*2U7Lai-gc zP;jpm9R&$C^PGaTYfI10H!Z_+4rqEo`qW8Pmlw#Ez(=5agLo4k1D7U=LD27Ym9+_= z$>A5m7f$9~8C+_7vY@2d+ckG(iuXw6MnIW=*UDtgty4P%#;s7(Uhw!^D+7ke+(J@b z;Bl%Eo_KL%1|A!A+0o__q^zK{Ggjm5W3v;}bDyc*YJoRi7(}c0qHh<}V{M|gQM0FZ z;FY(YV7_YliUt^gUf0sGp-$pGBaf?ne>Vp9J^X0``Q;LJL^0HHKV>6(DXFch%M;l7 zJnAJpo)`UvdFR~uikD7jTk(0qkO4M~v1K@lZC$971`k-onf5#Z|E8a`;%*t zw@>KI@Lgm?jhM~RZ7Xg2zn@Q?E0B@=EN#DWNM93w!2HN=GXG+j9`-GoE!Kn0&R93Q zdjZ`~v8P20PS>P5U>sog%v0!Wc&(+nz4+qVoaT$am`X^HPWOFWNfv zTh3(i3K!ni;-0cmxjM+$z|~Bk<)#@Dq%n3m&JkhxNn1#mx}9=lTts%hLX_^VZ}B(o z-L@H-ftnZpvO~GI~veqGc0Yb zo3yy_37gQ~PsuCHmY)l_GpxuukP;QowbP~D9oH10*>ScLe%Muv)%Bnh>bSqbGmMT$ z&8FG9rvJXSe)2)bSVz7dbct=~emjMI#3C}B581GMg;dYytk0_KjQ@@?e0;WhcdK6) zRO9i*gTP5=50_Fm7f?F9#Po&Da)_1~mtUJF2EgyYr#_D7tmKXt(YC&S{QQH4YTLF2 z@5=+%rccvPuMmaWt7B%Xp2{}<1!0Wnb?Tt)oHKmC6FZKdN)TQJHAwB24`mGv zWn~S?LilD)C*kUGfmw9 diff --git a/public/img/emoji/rocket.png b/public/img/emoji/rocket.png deleted file mode 100644 index 5874a4d611262ad5a39c547dda5bf35688ef8a03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2751 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 diff --git a/public/img/emoji/rose.png b/public/img/emoji/rose.png deleted file mode 100644 index c000f0bdbca00529458c4e259e7f9cdada40cfd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2753 zcmd5-i8s{k7r)<`W*A}05}{^@K^e+6w(OdbZLHZ1Qp#A;gi4gMOF}O~iL7PpA#00> zP!Y*iDk^PA%KFax`zwCWIrq8uoab}z=X36J?z!=FODZ3a7!LsOnbM4HI9~rh<3@At z-1-Y&0nk7=znhhL6p{;pKSxKpC^X4poP=H!-@k%^C6+zMg?xNAL0QE%TeR=s>Vc}8) zVe{}507L+|0yIcVx2maCi-^>TirxUoMvw=ZnkfJo0PPwYO=NQOo;^hXchKmw00{t` zuV_(KtrQgG^f?%y-_`XJ2dSfTUskq}M5-ka7yxW6_5z0&hr0!E1fUR$WdiK8MVv38 z*!=uAxVg&-1YK{$A{2?QLwQ` zj^6vWggtsTY-6N1`8#3T}&XPJF=}nC7;ZnKUiDq z_j#~;wRkcoJH3*rIIJ4-G_^`b0C$2n&|-0wri_|&q0FBSBS2s@ac6v~|So>mPRFnzQnlo>g`y*hL zL5&K&#P@RNub23&u}3ZBCXxKD+a-A~R-SAcT5Gh!~3hISHfd^G8b&80)HqyOD(%2c(gEA6 zbd{NqdKVTZMtErI_?MOvt;p3VUV+=puo`mjOq_XyL84@>8P8Ydryuo0RgShlXlcS@ z1~Foq2aXEbXdivw!m>_!nv3{R{rvo5?LD7iI-lK4baE7pB8m=;W|!tz3BH)u@63Pj zU?`$Xd6>CbZI?)>jLeRZWk0_)OWM^jb@v+?`QrpdG3K|DwCU?Rr!tpjLS-^4D{F?{ zJZF?I8ZnzLFLfjoUP$JzMA^4?-Ypmi$Zlhi)425+TODTEF*lR@o>1rC6(Kaw!PJnl ztalBuyES5E$Y&sCHpjAU5@$B%-c%5MuW|gie0Y8q)Y3Atvo%FhXj*sL^B~de^=y1$ zQf;|@c3Vb;fVUV~q&iHcvvJ?u+^f>hi8m%jNl&`+euxf`6^wCPyu`cdNQou0E@+*(Qw#`vv;hMvA9bj4yynCjq(Yw>TL_PsZ~ zV`}Cl`v@08j4!m2w-ypna3uB>d{n2drp~A&llJ{1j8(lW z_qAV>J7jsjENbCweuu77w6_+o<}EF57Iz;}(kWAV+UA7hhZD_?_CXI@$K?kriyx3! zZW+@0%Azriu4QlJ4$Dsjg#SFe$p1ZO(c+oG8+q5YEOcH1MV$wV{xJGZergJ|Dp71$ zU+5(Wsl>!uZPxP~VO{5m{=?Xt*>l=w@<}ftH^62}{wP_ma?LlBwBO(cSKj`axv;HS zKmWdwid`bSUhT^|Vl|-oesa9_*sB%KH`H!v1JM|R&i8ZXq*d?IQ@ySfUI=n+To}LD zv{z-p#AUCH0;~2^~A1Fcy1befGbY&)q%%z zQ`I}k3SIG22Wx2R!)Jaky9lC3_w6*@HjEibryczq8oBw2%YDIdbZH&hEo!gwgooyo z0ZZkm5ZYvMfSQf*tQ3vgWw3DC89!8!d@yyiLom*KV8;jULFzxkG8(9r@k159JE(by ztr5M#wCBT<^8J#m?uyoeV>j+FXd8#wJzWv244v4N%>69ikj3^$DOViP_?meLXAgs^ LiKQ{ykP-DST?N;x diff --git a/public/img/emoji/rotating_light.png b/public/img/emoji/rotating_light.png deleted file mode 100644 index 8f3c8fd72245409dd8a3310baea2668b64460570..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3101 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 diff --git a/public/img/emoji/round_pushpin.png b/public/img/emoji/round_pushpin.png deleted file mode 100644 index 6ef6ec4621bd15794dca8c8faec87b5d01d99a7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1732 zcmX|Ac{tRI8vbU??`LK#gBc9Qu^h&prL1Xaa4jJ;wxcK&nMyjBY%v&HCLGJj7753a zD@&Q^U=$Lvgp`~}=-j%UEY&Siow?_E&V8Tfd%x#-pZ9yef4=X6hr6Q$QIQA$63$Nc zUczqszru?Mx%^i08vqgTaAi3-Mz{(UHDUb?9Kb#|Zx8Q-LV*Av`WIIsxQ#Rls5oi%aQaaC-ow2hjGtt}yEV@ZDplp(%_3 zmh*lb4rdEcK$2(u6%r1(EI^|HR|o_iNTh&B6rgE96uRRL^!Ba06-?2CnQD_HAGUbYD86a{%QZ`pXC6lJ^;ppb<;^~h{*w{MlF)+g83C?(NlbsgArTg4j zdIrWmegT%&d#xEvAI4roO|97T+>)~DU%UH@N-D?3r>_Ij07yNc?I6|xNDUxufVKeI z282!^3}Pe%fC_-v1o%oo_<#-rdLPh9K`m$g_kO(BxSAvQUSPO z5bp-@dq8dlFxP99cJACRSv zs;Z4rHP)S&pZz@N_E^wTr6{xV)NyI$1#S8hb+r*H z^|6Ld50*3{BKLrxxMFP3FCo_q5|g@Gvqt(K>=;{ij9#ET26Rwb`PFW-qT(wLzth-q zw(kPuKlV1`+B;@U42Om%-X9NKab}XNe-0|)XnuD zZ(7E@I7+9vv*N3=12*%gnTNdVcrTs&O;U!|Doa{}y7!;CKR>>F@4wuV(;FEM8>5fj zC%@;7eb5~38XAAIJbZU*?VmOCUxvOG7q3?hObZ`Q(b;}4D+co$OXMQW6P`WgE7b9` zpNs{cqRl8SpPI{zRQP#{G zVFzp{s{FWd@$7}UXh(1F)2GgR&AlOg%p1(5E;n0NesynlbxZK}RryvJqLXaH&J-*r zl_qjR*z6iX`;Og=j1cKNiT8oCULGV^<$PxBUJtJksNSMKRdQealw-PvHAfpK8#&vX z7N7anEB?%4y&ZJ*EBMQP=txjvLd&(bt*LQC72WiF^6xlYN=s9QY{!hRkGJK!*tjh> zhmV(SV^R-$ZsZ!Ic43MFvK*(h8W;An#G|xqM6rRF?#i0?#AzPmHjXCzaRlwywS=vV~!8ZvHFXEKno}*V@T|~g%xZXj^E*HO(DFcju1gAo1`)sS! zGcsYD`_$^wnXpYO&tQ*(tyqka%1io0<(t{?l)>7mQYsDo=-c{(tY(slXWMbX5T1WU zzP(;`$rhm~hg97R{5*!x?JQ!D$5EbHSy}n^-M+VPp1V4vYW6lLG+QRhf5vpMDSW|}NH0G&x9Q2EVwoP$fwG`d#Jq;Xdbd(GC_i zYL{J4YS`8V9&zW+pB8a+Q{%G+$_7#1;nMCK%)GRM?7Y0Z?1G<@F9CSvgp})5bE|}} O2+j`f_Scz*Q~m@j47Tq8 diff --git a/public/img/emoji/rowboat.png b/public/img/emoji/rowboat.png deleted file mode 100644 index 6a43aa5fcff55e72cc8ec86b9875d2bee5fd2872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2803 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 diff --git a/public/img/emoji/running.png b/public/img/emoji/running.png deleted file mode 100644 index da5f2e8511d277b7fda7e68e26428539accf9e33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2217 zcmcgsc{CIX7r%^ML>RJ{p|ND2$Dmfuq&0a300H*4P8OsPTa3Jjq@*+jtBl|h1bJ&LN>oWomRAC!DJnr!KWM8X3tanv zUlurdg}DF}C~(*rl>JPONI2+Aqmldsd8DhEraJ%@fRB?c53nB%vKAnTMJP}tkZ1#C zF%4l}9hqOl{4xX|AozvYgUAp;nyjNJ0&*l!JPz8a_yYna2Y5h@4(KR#839|20#=aI zov3<9!^TuqG~E#!3t(-aV4*2ax54-d@MHoc_*nl(^}i^B0zoMdk_RLPBy>UVnhm># z@`fV;pc3T5R?t_n#;Q_rM+pG2Rv3l-kW4X*x50RtW3&P4fAJOCpVF>sg!$EjX6iOmJ$LLdC0lZLXEno=~J0vMHmWk)}|5@Jm~29tWgRy~WS zIs<%ZOgg3^Rp^3ySL{azm?-eM1(5AQ=(*|^2(Z|m`?A2VI>Y}w1qX7L;4lVfcc~be zB;aH*he_Jf?<>y#Zj8EdmKaCT{cu0+PKsAUoWnV5;~+$+XGIq-evN^LCb|6zOoQFG=bVqOR zhIB`&KS75#LF#_y;Y*(_83%8_m`bvT$@{j9Yee+(g=@BL@OHsr63ic9V_X ztTeBg=pCf%7c8ApaNL4yo$LzZ2`P`u)n>Lv&OxnuEu^NoD6h|-{YnRyoMwj% zANv?|c;qG@SgEoqkhbZH?s3fLF&59&nmrtMXyUDJMb7+wQg)VH>dl;>#>Osf#kBAU zcX`%y4@rJ_5?_sJ8<{`vhQW?b?QmY}o=J4w@LPKxQpt*&ocNAt%$g8!F>i_rF3lOh zWW9^GfAE(1YO=B`j5RoS%=Jq7Ly*|~WU+V|g^3#dv0xzF#(dm|64dQ58ReStYEtrB zXz;10O_!-hJV{@*Sk2nHTFRG-Z0BOy7O zo};Ca%76dG8Ma03bYqlschnJ5Kf8+$iV5mm2+)Plj&j9{Z0@S%(b+KxJN|D^2UcEG zo9HMncvo8V*HwsP?d11@@gry4qVgo~=2sB3aWvwGyQM8CPNV0cML6cmktSwv{}>-R z5{Gr5FPMdKdgQ7GmHlppBnFv9epLgIsG}|$F}56)2;-m{8!rv-d}M|k5SvKgw~)6C7TL9?H$Ezp{bU$ zi8tImHas7_+N{->|5ts7rS)~1U>;+cOpv)HLyEp|e295;ce_jV>NkN%?mstU?<`%4 zNgY}0aerog;X_}hL|1z8=;>#hDd@qi*n0@Ac{5sN`|Gg5Gq!ZKB8H_=Nyt(fI(#$3 zXwCHuZ-ldh)8A3Z6D5gm=&X#d*&coVN@@{S!|JZyAN2yQUf9tL6W51+@}}klXT);Q zE7Dbt(Y9Fd$fzuBnh=F(^-I(grpI0!atpVJsT+~W!9B;lX9Rc8G$>t;_HFB_ah6T` zU|p^{nBRXqCWm8!V+=V^yMUV8p#*F2?Hq2(FeN#1UxDJ0%tsdmpM5!ad+1`48@erY h=2QtzkR{h|`t9zQCnD!I-n0KLkS!?Y4Fr#re*ot^`kw#* diff --git a/public/img/emoji/running_shirt_with_sash.png b/public/img/emoji/running_shirt_with_sash.png deleted file mode 100644 index f5ec86ffdad1ddda07f67d9fa4771c1eebb50fe4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3162 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 AoB#j- diff --git a/public/img/emoji/sa.png b/public/img/emoji/sa.png deleted file mode 100644 index aa3851463cbbe1a5c16f39aeff9af79b7b7348ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2341 zcmV+=3EK9FP)(QX8<6f03W3Q6?Om&L;wsu03w|LA)o*?jsY`> z1T}*LE^`1XYXdQR|Ns90Lg4^F;Q&kG06*Y8kL>_Z{Xuc08`{dlH%Tq z06M$X%;W%1zW`p<059GETIDf>>~gB{06@I}M!o|Cxd2+#00OiCUgiKl-UmmWGKTFg zjq^8&?Ep~J07}yUR@DGU<0g0OE`jSSf9e2U-~da%6nE?-gYp1b-%O(N065wwe&+S~ z{sdOM31sITd+I!l?c?0*ZglA%ap}q5`T$kl09)h$MbZFB+yFt*05rJ(Mcj|G^eBVu zA${xsJk1?->i{O+5N789Dz~4;_qNpdl)v);Tgm}Zx&T?l2T!b4pYRrQ>qD3C`~3gd z=K26j-2hMB08!pqh3tKS=xl!L>*n$RLD~QSuN-vc3|!^_E3aEp$PifH5Le$zobX>$ z$N)CT06f_MFT4OQ#{fCe04=}(G|z68?+Iw)&f@w=l<5Fm&<9nw3~bi{O|S-C#J0-z zpS|}TRO5lG@&E?Z0|dqc0h0hi>SUPj03X|Dr}BTG@FZO3NssOS{`T|j^hAH_UTfR^ z^Y#E#>HsLF050a(*4$fh=)KqaF-F?}E5QIY)c_LN05Z@shv+|#=mSi#HHYH_KbHkR zmMeeWFoNCe^!=;O_Xk3fBX!aPQ?zWO;-$y#4r0X+WX9j@`7~EPjx9>iyEn$lrebEGoHH z_irzqR<7E(U8d925OVB=P)(zgt!-CoHArZ1IMeR|~qg5{Nx2TbT`FgYE z3U_@wbi=Mzv(94ysVz(Qt5K3qF<+stFzMQf3=bADDL#qRi!oRcX3M@%_4W4Lv&Z@E zYc=F6vlveqx)0ApXexpC0h=_ zjj`qsao#ZIWAJ^bah;5_=;WOXBIVhwLmjR?9tMf;Tcts}hstr1GKv_Xcu#lAN4a zRhs!mm>@aV>5+%Z+r|?RV{Ne5HkLpbdkpy`&f_PGWZ9FOn;aoXOiXmT6GuGBfO;7U zm(^SXcN=F84?QD^E+<;21$7{Bx&*S|oJCo}1zslbSg@pUENkI~Ph7CuK?#bnz>Nfg#EYEP0)>_D0$hhr;K?TpTlJWj^WQ_hZbdI335df40tO3s zUc;}vILyRY5sd!)EyxTb5&?!1l*~&69x$BKH8tt3DGWv({ucT(Ce8vwi7;P63HTru zgv4{I$T4>4+b!q62EiExCZWA>K}yM-NWr3FJfj+oM!PC$7jA;!wn3zrD@maQG#tmV zEUO~;OIg1_zsYX@N5MNOC9@n23w=Pkl=YVmIHzzlvn46-1O=V5Dtj1~dkQo#BEmBMp2$s$aTr@i!f2K|x0pUC{zsA^!B>!o^=7>M(r@WBeCEPiL1s5_Wj? z;?KB_uTUSg(AC)!5_I=6kywBH0d9{x-@ruC+f4~#;v=x?&*%sXnkhbtm`Fhs2JJMi zpFXSUW1gLNK0J*oE@9IThk+tf_v5XG@m^&G zzz+Sg#{km6&#j$uKS%-a9{u6iFk(COU&PSH5v{Wq+N{A2f4_eLO9j7x8L#m-00000 LNkvXXu0mjfP^LSN diff --git a/public/img/emoji/sagittarius.png b/public/img/emoji/sagittarius.png deleted file mode 100644 index b7f248cb2b46570a4542619c36b83bca079ae96d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2556 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 diff --git a/public/img/emoji/sake.png b/public/img/emoji/sake.png deleted file mode 100644 index 88d5f190ef197555274f2f5969a50f332d73f279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2955 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 diff --git a/public/img/emoji/satisfied.png b/public/img/emoji/satisfied.png deleted file mode 100644 index f084d3c50cf03446955e160e0a5f550a14173f52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3113 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 D9j^6< diff --git a/public/img/emoji/saxophone.png b/public/img/emoji/saxophone.png deleted file mode 100644 index 1eba417169746ede7783dbdad57f22753786b0db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2415 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 V+JaB3nGY0`%#aw97e;PL{{uX^aFYN4 diff --git a/public/img/emoji/school.png b/public/img/emoji/school.png deleted file mode 100644 index 02dca33840cf7a593ad3cde330ed5394567e99f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2739 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 diff --git a/public/img/emoji/school_satchel.png b/public/img/emoji/school_satchel.png deleted file mode 100644 index 0bd149c56e8544721efee047c80b65c3c77c0dbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3273 zcmcgu`8U)JAN`s!j4{JtjG4h;?E60UeczYKAkx?djXitH2zl)LR(7GM2tAR6#3Ngw zLLp0yEs3%{^-$j4|KR=Uz31F}f4t|O^Esb$GaT(L5HK7J004xQrK$68H~cT5;NM#H zD0v3}z<{IeIWvoJTN5IZ?LyERT%J#+VqB#)!Jr4Olm<7@x0+}euA{LQkW}GU7 z-51O=C~uR=f~SE|gL2kUV001~Tg56C0Y(Rcd23;k`4FMoFsZw|DisLHbfhSijqd^s zoyR89CZK5tK(`l8F#p0+(nk7-J6Qq9cX%LF{R~5;-EOmvNGD0y58}ExN^x8@S}GU_4X~ z{$Nf)Eik(~Gk33${(!92O;*tsta>e{%pWk}2&7OHjGx5D>w_jx5V)t}rjG@5+PD;} zkTP8agJ!f+0vIF73{`-@g4r;=QfBGG%4O{0w|SMW;uS8TMU7ZFDIl(Dym|^=;Q>k| zmWxoxE8D~+UnQ>X$t_qSsC*42ZU#n_u@EwG3Rf`F{RE>>KJi>$nQS;A6^2j7O4m#1 zkpOrk51~R#OAyRLU}nXDz$6|4ilEf*vq|L;N#Pc))F?+QxB*aW5W<~gRfAS~ z<8irFOuw0+V`pg)=Ixq~QyerrABUFcRI?j5^$NgC(>0BrX*in`#8RRHIYHn6cd~(w zR8dO%nNE+ODysXNnkNPO3^`G!6de+hV@4${97(oR zKeuQb%kk|mxyhF)9*$j8vsZ$=$ckzy(ez1czi4@lfQf6uLCn~(}x zJ8mnOJ|`Hd>!~$6P=@{E^L%NR{yyzJy;=2tuD_eN`rU0h%GsU-7z8_rejv&s`QKFf zs<7-V-f5or= zE$vr^OOOQsK<`+Y8l8({TABk#3DEclzU8h1_x zB!^V@ygkhhSRT9GuYKBo=5%ZAN6vD^LE*0?kB13G_jk!IM+Q1iD@55^{$%r8Xq%O+ zQ**hv*n8fEbP_xHSye2#etY{;+4w}+%8fHxn_qZwFww(m_UchAb|NU4t!ND9my?}c z$>N<=EaP2I@*$A*<)=~@N#?d%uM)nwaPXWjj4$&|mOIz+ z@i7-islL8`X(@+y%g3DxRo9blPX$5v^IKb*mzOJDrs6~Q{vtg$ZE7MCiA_yZq&Yo; zD^io{(6J6}^yK9(wWcv|R&3rI^j6<^?1sU{`(XL`7v(HVOJ~j8-ObF*{J-7%W>MP= ze-n4fD{H|i_TAEw9d7}gq1Ui#O;1lxevdzttB)@b67r&#wS@VuFQ6x zDWPyMZl=eW*=Ul-f&)>O85HU4tj2JOf+ecnon#C&P4?8CHdy2}H8zUJB>yF(1(e|X zr_Dmc#^Fs`M&!Xjvl?8?P``?Q=(ST8TR*$qgZ%~8$BzZC!eN5l)3dMf@=^6l4Z6am zAxb~wck~k{?-m%a^y(5TR`b>&A2_b>zmd3nbJ0cL@$lq4O)+o zeAeFl^LA0=ojcEMQ~iAzJeZ-e8A8E~h0hB$`~{A{RHd>9TTvXuvrvVDP52nB3EaHoSHz#qBy{)|?_rnNj~n@>W&8}Z`hF&jYSuLT zYj=9+f}@X*YyD*@raMPTd+jCN>CudsIb=j2#{BP@#&_t*wdKD-&TNo@g|pod{A>PyO;iE4?v z159!BC$%HOJ7_ibt^1)SKSD#_EgY&UD@PzYp=CZm(AWjiwvT|6Q1#LUC#MJ?tx|7w zN2T(CjrBO3Wq>)iZ*O!*gW)A{jeX#?6Mv&NM`|qpu5Mho2Ab*jlRSQ3P>MFIxtCE^ zbGD2f7dp`v|$)I$tRU9QkydOD05+wXGjS#3>a2EV~uqtoQp7w)O@x!U1y>-&6uwC zaPecI1!rS&KV@fHPjHIUk7D~J$=r)qN2i#hp=l;sV@dMl(JWsIidx4p(f;**Vyr{3 zprH&WRbb=dR&=$={d}QAj9;PSv#`?4hShFI3sh0k(Twz_Dafti*J}2@=<&7ae_VQ;?MoBw2`0Rty81^okH3~giz*|`*PhzMa0^w9>%ET40BIl z(;ghs8w}2(_GlwR=JhNB)4OM{EWoV9H1+dt#l}}U1TuP_u2u#+Loxet2Q44!MA~YE zejOfp#R6LnU=L{~g?z}Iuk(UPbCI9I%Rq`$>y_@%xRn=*XOB0wcHKpvClA~7w^Sry zOXqXvF$`~{5u%&Pa5If#=E#qCW){(0qp#PoatFs+EB=X!9KY&6P``aN9rH13U!tw@V~9}lpx~Ap1q%V2x-hx;2I|MO zjQ29w41Mw6vx!C(V@FMnJ5F42Eh;Ax5MZNY!@r}0siULAe*^C%$ELWCU3HN@dC`~T znqY!L6^hLtzl7cIm5?B^0KxrmFUzK%pztnoEZ*@mE%0RbNn5ZJCWSPAY-LrjKTuv= zzJod!V~fhNDwqP>;F+|=u_F*z9mz4DXB@3qRSy8iLBpNp`BfJ@1SX56Hkqnk$wCc7 zq+8(Hp=q!|u#8l-vHkdMWiGl4J3Y0vIDlZdH*qpdW25*}KSZ%eimhq>-cattPRuWX z)aLZEX5W&s^iAt`UHg{NJ1K{&J6FHOfE+K1NEM7X#fwl@(+-bsoRev|rHUS}R9jzVjJ!JR`ef{VHSFt`q?bOr^-{{zen!22kOAB*k2eN5o9CqJ0I05|PXYxa0Aw>LYJ1Xs=vGzYD z{^xHSy#I)pfMiNUUR=}RSGP)f;KKiq+~Q{T??J1`PsPKF_dt(sM?P;o{=LTlD>Hl3 J`^J>({{iNb(1id1 diff --git a/public/img/emoji/scissors.png b/public/img/emoji/scissors.png deleted file mode 100644 index 7074815d117f2f0f84436cd3e0c2c69b606c3b24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2492 zcmchY_cz>GAIGPfJ|hNU8o`kD*hE;_Buex;`bZJ0v*A%AtA%J`F%g@M#cCr~TSA0H zPlh027-CE$T1Zw+5M{I|^L+Q8cojxv>LK z_5YnnD6kebB`kwLP>>yiX<`<_K!Cw8C{!AY1-4KS2oeO6L80gr3WY@aw?$tc1_onL zC=?j%gu;a2#0}vHC=`mr;f#!ojK##9(Ks9kL?V&Q#ZY82S&2?hOiZ-5w+DI&INS*c z^gMy!gvL3cuvQ3^r5Fki0tMm3HQ{15NQ@N{^D~B^si~=|s_N_OYi(`q?Ck95O{Yf@j#(g3z>ThW3vvFMsjz@oDGra|Euu&TNIg`aYw}O13brWpsScJGNrFu64nR!8y5>HC0l`9UxUy z=1lHvbu@h#U-V;K{l`e|Rn5lwJZCO)tNO1VX8HQ+*5*p9eVwp=WoYtt+5qqb{%_+b z)=1C^0>N)t7#lDn!FQSP)KWW{@V2(L{P(N)*2isM7u#30BfE)bnU{7FQq39hcQt;< z7sEMNHt+-ZF4NX-+MD@tF`1kv@);3Y$DcB_JWwN(e4)_6$uw)l7kh78hX1^zdnQn~ z{|A%derk=!(NQ`1p)N;mVe}fYGvdLWWV@M^@k4oz`}@?QpO)XG>ZTX4GUJ+12avIb zUWs1UApEY;hWY9M=i0E|GgRf_$H-k(>E^z{(rbk=GJzC^eP=JNLsfn?63o84c(uW<;QekhL_Cgt^4l*v1uj0{4Jj@!2FYdyM z(kg#RPJkc=!p`MOy=`hZxbepbm`BU^OVu#xzcs0o?L8CitoG9CTx8kAB- z?AP&OG(9~#B=G{;6xXqF&MO@M@#;8X!;RiuH-S9H^Q27*3Bq@yDi}Xz2UAn4vhI?I& zX`D|v9Cp_2Xs$O61zr5|?c?~)t3EByf5yUv0oq5(Npoto;VKU-Mrt!I6b3SD(@TTu zS3Zw5W_R)Sd-V3?4oBYX3p209iL}_kobB6oRU2LRA9fDCI689Gy}r7_O-8(D$B|zM zWlmn+_Vdyctz2H6*NkXQpJM1H#I29m<0{<`gl%$lEEdZoXQInSIWO%c(KbOfB6bsQ z;fi%}At6;X!q#7Q`4saL{$MHfc~D+gXofeHkpxxEQ*ZS>0|YDVo3MRcanaHNHl@dJ zJSQMMrZ_n;viHfIk3{0RS2|4aL`Y@dWb%C$3wLG48dupgQb0AYP{%5^u(~sfKhy*z zW}G6*Sp1ILTpcMM{eoc8hHmzCdb&V!X5B{PFK7izdEWLvFPUegmbdUK{c-$-h*@8| z#*4o{$!gU>W`u6m<{M;$8BBV8sgF4y!Cy-(G&u6+Z!1)WDwB+uBA3gH(QgVu_GGik z7&d%P$a7?b560BRnbGx~x|htnTn@W!>@35$e&p+`^@ttOVPij4^Y+a%7L!oRDeGgj z|0V{VI&4e4#XH-57FJRrrII_h?yK6=-kOM5)*)V>VOQJdy8jw@zx>g?FTYe*$G%)K zJAV2T_l98NXPx1KiT1xFF8!(C5f@wUXn$|q(S~5tmcNtlUU&nMAf5I7+bMy9LCc~o z*CXk<0hxrkGPkhaSo^3Z$v-`y#RH)nDKZ(_+_*-ec7%-z{o|`uZH?_0ayP}z+vsOZ znjJc+zruq`;bvA_JdJlNgNAD3f_Aqxl*|YW&3JKQ#881T%udxwc$xT>S gKk3~H60t9WeyX+I=SN|H9|#1pFtIVNHFQt>A1@`S00000 diff --git a/public/img/emoji/scorpius.png b/public/img/emoji/scorpius.png deleted file mode 100644 index 634345c01927e53aedcde4f0780290ef27d8bbea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2683 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 RGGPD!002ovPDHLkV1jfxF(v>2 diff --git a/public/img/emoji/seat.png b/public/img/emoji/seat.png deleted file mode 100644 index 807775720f7cb5c5af8230442aa2c79b02297f12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2951 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 x$oZ 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 diff --git a/public/img/emoji/see_no_evil.png b/public/img/emoji/see_no_evil.png deleted file mode 100644 index b86bf68317e75dc5020ff6afca1948a44037788b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3313 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 diff --git a/public/img/emoji/shaved_ice.png b/public/img/emoji/shaved_ice.png deleted file mode 100644 index 792314ba4beaa9f06aef888f95fc0fcc872e3eb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2890 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 diff --git a/public/img/emoji/sheep.png b/public/img/emoji/sheep.png deleted file mode 100644 index d20dc975ee7a8895cfa07e6a14a1b424da1c3ace..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2549 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 nbO00000NkvXXu0mjf(Ju6D diff --git a/public/img/emoji/ship.png b/public/img/emoji/ship.png deleted file mode 100644 index f96d3aad1c76ac6b4f4271f8b71fc97f3c792d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2636 zcma);`8O2&7so%wBwHzK$ri?*r6S?6n<%6S4GkmvPPRr_XOMM@Vq}a4$vR^xTVoxB znh9+lk(5Z*X)2OszMlW!d(U~_d(J)goY%Sc+#lW<4)*5`@JsRo01nt#TO#(V>3`zo z-pi!cHAaj8^;@7WVN=mTp?d^1GUt?3#NfZfF z-s^N3aZt-w?^@YucXDC-3-9~1$9oh5cz=KY^v93u>+2U{DWdwpK<_;B$5`AI5Ix&wQJXadpNjwt@`;`-?#6NJv|8o0zNOVj7oh} zU*Fc=o`A)^o}R&RaRn0E)Eu$})x3g3LUNmjC%(-7-P&papqcTOv$Jy>0_lD?_43Wz zD@bH`aoY*Uf^q=j;^S)pnELj8c4;LL00x7BLZQaT$H&IT0t!1WCsW~o#Gze z1VGdHLQQRLay`={I>pq~l-AMl`OBC5y&Fd1!R^B5A7(&&R!~xwtgIZBO1RVxYrr=gVd{J#_YgdYl40B<*N?AEFG7=&T=T~;+gSpC@MgdV-aK-|9OxD-P z=r4zpFD(;iXXg}rGe$$B9RQWX!fBp9QBu-)X_&}?`Q zVegw}qFcQtjYAeqadEt=n(vRcMSah6(R0x#ka5_zxU{sm7#f>A^7p1|DW71G_bJ6S z(-oCqz2hy|?QOv@_IFwH-*3&lp6Y4Oyd6%B9})7~=T{296EI}x;O=hhy_k&ed;LDv zTT%5i3^u0|6cohU>IprgDnm*ADuTJRkEAz(v-frzq$8@kN(h81!&jgoVx z#LRew+hSHEA){BE6*EHoUy>jGfJ#1rsorqoGiCE_Bch7qcuuyb?hPkgLNVPr;u;=X z&Gvs68MftPs#j<%DE~1(UpN*@MYVfwHPfGs`J)`CR2!HMWU|K2?DTxh@leGILUeS6 zN!nKtBms%`Cav_YTrreQXAo#Knije%dt~bPZYNYo90JKi|H)kL?d509o5)6UP3n~m zUPmz+PA;}vNQesDrd0g+l6|Jz%eX#Lr=q|7Bvi2?Dj-4)W{0maCo>q@zVm#~Cv~RQl(gTgjuJ0D;S^Nn&LMIpebx$k37`?`PpnaG0^q=q$)$I-TdYXhu*y;gyF?;5*WQFaHEH_+A z@v-PYG5o&^cNfTrFyb3Sm7%Q*G<1MNRMJ1eCz5R-TK2_0%9(`p;iCSSh@>L9G zI@2x3b~2lxs4_l&xJ>dBH)86YV%LLet3xuPRpB4joLf8tIV&gaAFjW2TdfA8Vvcctj38M=I}#(N=lB>09RrnXZ@H&n@(^q zqcfvI*17uU(QJ4fFLvl~0qRv}4{^$DfNm{S*p~Z(;^*ty+bKXm+@H7Y6AM{}tOPkZ zT@gGVFk>HUWwo@HIJNV0;z@ON_4Lioz2BJ|ZhN6Jx}=~COU4QWP$N?g1Xfpi=yn#&f)Kq1`Rh9)zR!*!LL7fVb`ZmdrIUW$$Vgc-Uu_qSbH zTX=u?RfJ`VJoa+UpUE=xoU3zt^hillQ`6V4=zC{<1lCi=FF=kouG7XlaA?=X-?cXh zsaHZN)M*80=Hz1LeJDJ_H$q~Hb}FFSPejw-G4!{?F#lR}IyX9D(+53?NgL|s*t*K6 z_BXN4v^%?aC?53QXwA9P%6dLH`QbyT{kkRm{Ze~B5%pZgX2v6Nav)1$Bq=Lo$0dIM zxCSRAI5;Arsj_m=Gb0XH;b$w1y!UR6r*&#|cegISAu%fO+bd4z%h|!MD#eBnbOE_O z>{HjCA<})>+rlxZ5A)2pCI|X{7Dpz^yf(H*4sN3dMh&#-A3f+jyj+Kb-l>2p4%N<&>xbiU zQ~!&p8KJ+ka@QaqqjPRZ5aEyOa>F>bK&fCv=NW@iiG94e o5(Y89nei!8)UL9bG+t^E2LxlSByR`#{^uKkjg`G6)!YO7KN2Y1g#Z8m diff --git a/public/img/emoji/shipit.png b/public/img/emoji/shipit.png deleted file mode 100644 index a5223bb05b417ece75cf9d0f1b79655fadd59a66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4598 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 diff --git a/public/img/emoji/shirt.png b/public/img/emoji/shirt.png deleted file mode 100644 index f01110c2af587e37e7f6663eb39a085bc05caef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2794 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 diff --git a/public/img/emoji/shit.png b/public/img/emoji/shit.png deleted file mode 100644 index e6e7c68b4f0dd6a0039732a602674f78908d5c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2711 zcmV;I3TX9-P)?VU5I!ISFBAbpClDkL0522(Ts9s>ClEaz0zn`J zL?sPXGaN=I5m_=9K_CZ3B@8GL0BuDqNhb_YFB4)pBT+35XFn!FAqPk#2QnA{Q!Ec} zMlWbSCq*I!OD`K}Js(y#A!|PvZ9p3T|Nm({7hNs>7bPbv#qG7x`DBvUO6ZbBZ9V?cpbHElf>T{8}SQZ9N+ zCd09MuB2nY!N{{CV&6?joIV>1(iQ7U0J5rdtg*CvOCztex5mfFZ#od;=j%;P zO+Fq1Q#BiiTsluL6J$dufLS?qMtfi-=qm+ky($?G8-Qj{@M1pT&0000xbW%=J022ZT zBnAWl91S247a~I)8OVeS^}(=E#x^v!f^}h+vM221mz^HSe2px@_~UKa+}`k|^zU2u zt@_@J>uYuZ00#?6L_t(|0qm3mlw{c*hu5}kI~%9!zEaoJE3<7|W!p7q+cwWM$F}WW z?`FNR?|aRY)HLJdYu5kV?{|H#`9J^GJoEBfx2`OpWuoQ9J5~^IZHvt&ti5mf0XP2C z*6Li}^5$d94Y-TaUhb5(%M+hmo`3TrM1vF(7gF-jvH~7X$~Tm0vljTUnnBVWo~!Yd>6Y6>og>_d~h@P+wf%xo=NpSbwFpsyyn0eL7eG1-hYu zyB2x}?tA&qy7BxT>ib#wx`UA?tW`E`TI`uHPc%TWp3ibmR!C|~~5L`Il zu9fFrKYIl2M1&dA7s1Kx4SPJ^ea@z4&?gOyf5{p87TDKF}C} zu-SD7y200Y>08izq)Eafll(rAH$|7wc)X@d7eTSUNS~fw51LPBv(Z@8esTk-Pfv%% zVsPms>2hkNGqG*kKY#fXgQK{!ZekWbcr3*FI)w*$Tj!G>W1LI>V6;Fhy z{RZ6lKrWk1MzT*|i3i8_?FGf3AITQRq^w@OTHA1?80_7548&hKIm#oF(S!&5o`MHu zv1~TmoV|ZzJOChm<5^)Iw5wB;n)PR=O8f09A{i->J?J;!(Hs(&%SF}M4I4HNpK0Eu z$-``mMq^`z?C(A^d}c#~eGP$tuoH7$^ZOD!{5C@_mkT4soJ$S6{`4zxUWzhL6B8LJ zHX3=mReG9l$N{+I)p-@kRu}8si|gfVq&zP>>T;>vyZlJU5m4I>qnn`IWjW1h7G$9e_m5XCwQz4&6BvMGsY5(TFUt)R)e-a*_$4j+0>=@3U zre=8WX-`FHC`A|pePa+0`b0uv^vpFHXu)(?o*`gO_O@L+hU0P0>}}wBVngY2F4lwxqNe_d7gLt#$CwGm#_ujAf|Ej{H4lOaOh;le|5!CTE0i@*FdzeU= z(kN3P6gr*Zt@G3!Kko6=sbkB^QX|Ns=}z!=?A*+m0A?;inFXOk*boMT5eq3vbYXhH z6jR;MV{`7kc{<=;SqXg_TtrbWH*}H`SDD#OCd>irgN-K2dS9Cv!Cjd$5|@F2mc%BK za&r?Pxg-d*&2EHDK@bEV90YcN#*z}EpS$b+nMJ(ziOd{Xg2UlRNRZ`3M<+9xnVC#x za`cC?<7(1h+NulV3V|R1pmXlHJ5&&FoN;VuARHT>k%W+ea+QaB9~>K5RZv_~N?TV{Vq8};DkQS0pdcI@MnXPJQdl1x z8(v;sl9G}D005?&k$;MpYinyXG%{FLS9x=7larGl92`PAGlh3(Q$;v%U{O>|L}p!8 zZCgomVNg*@MIam-JvlUEV`FlDi8U)EW@ct+bb^PKqm7xRk)W`Jb!e=knv9H$hI?*j zXJ>PBbBlp^|NsB~{{8&?{QLX+{{Q~;^z_Ti%iP@DARQdW#>Umv)yK!jx3{;xzP{Vr z+wt)5@9*#G>gv+c($3D#qobp-v9b2`_0iGM_xJd}zrVD!w8+TF<>lqMxwzTc+4=eT z&(F`p!or@Op5Wl&&CJXk7#Fawuhi7ky1KgY@$rz5kLTy-gnl=iitoxIl;lf-{0Svn3(MB z?dj;~;o;$cfPbN(pofNqnI`~@$T!qyu6i_lte*3;@{d86%=f1YJ`J=DJUjUP)>VrXUfXTzO}5F zkcV?}aXdLSf_{2qV`4BaEG#Q2I5IAIcz5UH-fw@ARZ>vQ%E)$fa#d7QA|fH)+12#& z@Yc}FVOUVKtfZ!*n{8=jXJ~53zqf;TZlsxzkAr!TqPT*Tsjk4)p0LG@m!(r>dR%31 z+11WqU0SZBo2;aqVRD4I%HBmT1Qy+Ho^z{bdZ`+D;F-%gjt?uxIjXpqj{RCeO*+^|8;pxc1!yVd&a&ZODp znCqi8000L}NklzyC=JEFIpDek&{Ee;xo7wSFSC)8x^5vZWP0>29*&??LW{btwEc)8{ zy+?oqEV3KO^K_C!+>x+NBdDEs%ms-`lZ;y6@1z6;i zP%U{e#u~18#_he;@<78+3=U?yr<8iQu->jY`zwySY=F0MVYp&S@s}WBz?R@Up*I$@! z&(2~Ix7WT>`S06?|2sT#Viv*AT(Oo=xvQbTEFZG_Guo7T6n(Dy)xV9r@!H^PZ@m8E ztIt2ykvEev)BQW{I@}$sd$j*)a0qoe2Dba%w9km9Ku`**f3BmW^7in#dG_~Iy5ExTI=F2Ea@5`LG>`ZQ%%v@L18ggm97D_F0r|Z!fb_Jgj z7?R}%N1F!*o;b%PI4iS+af`LO>(L^w1;>yKIuD)s9FVF;{7ip!ZDUmSv9tvn76dn2S-gGs$lRQEQ>)&3mXDKLHx6hu*F39c=jXgS3tShNLp zk}@n`C=XRP7n$-sIjVrtC(sLg0D(Zy_mno*w6soE*M_1Gad+ZcyU*{?C^T>|_JoU( z_&qt1wg3xF2b50!lT+f>nqHU1k9IuF<7D3-NPUKhLexaTKvkcPK>UTCj2yQ+C&yi^ zqLt|iq&N>^(f?&Bw_(?AjWa+v3?#-h#zJK#EFV#bM1GOqpXteIQ}Q9ej5A+Xxo$a+ zn@yW7#R5M=A$GVg*5oovH5i5&)OHD}$jqU;!>-cM(=DxCue^M6){(U5LcWiN9ct2` zt*WZjI&cag9nz?g%)m>}^z^qh_vs4xFYe;a%C60fN}zC1NWSC4u~$01GKTlU}mT7Zs z4$4sS!Px(Lo@s54%9W2@%}c=E^J)Q2QJH?KrpZ;NE%3^4OyN;rWQGp{bX-3#kzwCv zT<(A4F{I) z@9+|`=xQ_V8?rkyo0=QEpbjv&paCB{Bft{S;e&|{3$J!K15^fI-c=fw$(S?^S)u}y znjc?6@wGeVu!b#ZdJmkJ609jQJLLEf=%qHWiMV0r+3Qv(Htbj{(PIdt{IIdWVZx<^ zT~wiR>W%C!ApQr}&0!7u&U@&z07R@S)tPV#*06?j@Vtl{p1uC&#D=}LfQU$i%Bq4g zoJt!a)C!NA2HQY^A+`J3U5O1_;B;Y03N&8ZX`!T2U?BZq5dwA*(9C1^{V<_m<8F~# z>V)*YH7;}9faNPn*hLt@S*8}>_M?P`W7=W`fkNqxRefQTR0hW83ie z79}$5VFGGZTP^e1oOC1TSfnMy*9&Ok&{OK-iGpTxKv0GLZJ}Ug!KNHmzX^^m0m%4Qd1zsQ)4xwF0GEaXfiPja}hT``cqzF z7M|6L1d$;FSOg?}d8}%p)YSmyl+|jje=2q-Z!R3$jYpJ-RFMZ1#Q3__s-}tFP^foe zU~=G>a}q4varOeCil||~0NiD_H&it}IW^VaKRFRSJX-{?=ws%w>^pN|sG>qWBvBc` zT%(5y>ihbF1>Of%b7teI#fz6NO-^39a@B?n^I0DJ(<2O0LK1|eP^C8-eG$LGQqHk} zc$&?wTs41Z(pAfrZQZ(U+X}#%HK)$~xeU)2kp>J@afotwU3YUWKAw-q+4Qy*YZlyl z@9ER0*T>m@#{=heI3^)U2_f6Pcit?5j}1$b;tKY~*DUyq1Ltmec=Ot|TTbju=DbRu z9YHd%fc-Doxicv#>8g(b-|pPGWC=KwRmt-f@)8tb9$+yi^8kw$&7lK6<Z00000NkvXXu0mjfUp#J7 diff --git a/public/img/emoji/shower.png b/public/img/emoji/shower.png deleted file mode 100644 index 6776a84799eb7f100083f3f1d65f6aa5d18cc5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3273 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 Hu0mjf!ttib diff --git a/public/img/emoji/signal_strength.png b/public/img/emoji/signal_strength.png deleted file mode 100644 index ebfb9eb830e93312af3790f6e9bfe9a70e2c0a7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2339 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 JPDHLkV1l@yYsmlr diff --git a/public/img/emoji/six.png b/public/img/emoji/six.png deleted file mode 100644 index 5fdcf396afcdce0968c10d1c11cbe1bd19d9d869..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2395 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 N002ovPDHLkV1lOMqS62W diff --git a/public/img/emoji/six_pointed_star.png b/public/img/emoji/six_pointed_star.png deleted file mode 100644 index 0f875643b33b370ff221b4c41576924fdecaae6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2630 zcmV-M3c2-(P)7R6+~URU?9}v*7`_((PSoMe z0|6Un9E=D6CTty&a~_zgK+w&i-@k3z!F1jJ|N8Re_w3#C_3ruQ&+msGu&Zpxco?8| z1Fy4P)J*}Bw_w&l0Ds!E>5eJ1aR8>?=H9{1zx??AHUM#hm|)>Q$Vas{BGI?1_M*gF+=sko_B0FaCrwx2V~9ROIiO4lhXOqMFX ze1?L{*2ce%)3|BY7Y0Xwa@p91)wn# zXzAMT#n0QuZQ#mx;-9OzN>f#`c+6B7aK4<_BNb8SlB-KOfoKV!K0-qp9V61y)~cPpkt*@<0000ZbW%=J0MF0Q z$1lriES9ox~q{fn*-m7>0rD|#ON z`i&gzSuweubVD7$^)Rp9d&fi0dnZ)Rmsi1VvA;tUC@oH>sfZxh6PPMykj z;#eC`=de$A1`T>ELC)!RhmL296?@L)$N$a^G*zceclM`Yzk7EyebqTVrP>sj`|poi z1Z~BFiItA2Awe|k%l6$^JDR>8GSyKzQ6O&HB4{7sFHf-thtmkUb8P>;8$$=tC&Bg< zxqn3a7C{HKjelfn2%XWTKOnTnI68#R)FX*Db%z!~=e&t!m7xP@^xv|o0HNf|YwYw{ zXl2>Nyv{9x|HQJ&!h>lHSf)RSfZMCquB1=H%UH4hp#;KRp)^L-{D@ranKCMvHr*v` zCEy1~`m%DwG$^1Ok4tP?NgD_ATM5`@1AT~`z6uvOV8_-p8$m>CaYKItV85fUt5TOBYSUo9KUOvPJ+Q>t2k9Y-p2 ztgL!0Y^5$>V}XPac?4O6mW{FUVLtA+Z41`uA0bq-&9Gnuu)wgb1ffUzH46;-2@oi= zy24r_%S#YVvf}~80SMeXyhVQ;A*PjFxasWt`DZsRB&|$@j_bEf`vt}$6*$QzqgxB) zym%guM=B;Dh#p=y2B8ea!egrE=gvJ>9b2f#z?X8>uegAMbq6 z!G=sx{YfYwXImcEA)xNDg)N5?C(qA;yrltge{h}F+v^0}eB9S`~CPPkI&Y%{~SV(yW z!i-wUU;RsD+Uh(prko?_O=1E5z^>^yEZiq*7Me z>_hm@+dspgV9oU0IV^=?#(pfgsZV1`rLHiiCnd=B=eQPORI_*5eW}cmaTF97f zp0;%i0_N758B&))%JI*23*KwEz~%IFQF?d?#Gpi-YRaNT@QINvUNl7o7bF$7ug@=S zPI9;x8s4J`7*lo^AvBK#cfN@%SW0^;4GI2@DijaaDiE~ae*hB>+9=P2cg9I#um;)fxlF+TnqQon5+6( zIGvDA38GvA&c<3?py1@G9XsYi5+!+noj>R9*l}v^6MQ9hTR1L3lw0usC_xy(<@S5_ z9eO9e-_VcCCBg(z|91-_1c3pc;kEK_C^8B7;sVv|MfeJ!rI}u%avTop zsi6chefqw?3jJ;2jJ%V6{U$#}_x0`^ z9Siu~PvlE{BwwKG9}I{|`o#@*__hCE;tBZzHOlIKNfU7u$OD(+vPQlH`2w^x$k%~R z?zuFD|Ac&jK6Ui+&N3k5D*6)9kS{T>Ikf2us$zK&&_<8S4%Jov!?&WKZ{fTEAz##g~vuHv_2U0DP;VBq%| z^3H&=_t*g3BA`Ok>eOR&<(=pX#r2M5LX}zIfMnrTo|Vx_%30pRmIOFvMF6HTN?O%4 zjgLyxYAYETCJ>l49s;1>8RO)^y`vr^czj0(0P@UM0Z5vBmp$sPtVv+&JShm^EW+yi o3J1Z-Aji;fiU3a_D4WOs0kLqx%bVX$MF0Q*07*qoM6N<$f?bO5umAu6 diff --git a/public/img/emoji/ski.png b/public/img/emoji/ski.png deleted file mode 100644 index a115ca944bb671d7a6658619519de7d8f37a39ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2388 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 OHqbTId41mb_WuCk_~je` diff --git a/public/img/emoji/sleepy.png b/public/img/emoji/sleepy.png deleted file mode 100644 index 1a1995e0da0902ebc4e8a4a757eaa206b7380c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3009 zcmV;y3qJITP)-gN0?S_k)mi{3H%d25W|%$z%u)cKO8_)SUZF$)JRJbm zTmoq@0HjF(+FSrFJyYIW00aU6dpQ7XSV;fBBmcf4|I%Xr*?j-hYX8y!|J;TD*K_~X z0sp@t|KOGX9qgOQvbdl z`>h!N*9wZh{{F%T{kb0h%S!*qK>W81>T(4C+X(;90`-^<|Gy&t#~u2z3;*S%|H2^u z(+dB*Apgq)_oNE+mI(5U2!^@$|IQ7Av+w`vyZNaK?tTX8YXb3!3I6QDgHQth$OKt3 z180uD|IG&f<_7ki5$}Qr`K}6fqS$0V3H-Sd^_>S{Hv;sN3V=!n|KJ00oX}l>t5kEA zNhAUP%t-&_rHQ@#|HTph@67k06#1tV{j?fuIs$*L>0*erSa_a|P62&E1pK-g{nLQ^ z!U}q*;Qzrc|LzWtY71;b30o`xQY-;?Jp)W>jD%qd|G_5ifCK->HuIRfp0nfAvf<^_Xgb3Kj3w1~bK^p-7(ggn9j`Era{^`2@<+J&(HT%L` z{J1DcV}@nVsP42zdBS&mC> zb!T&Roa`07Iv)T42r@}TK~#7F?9nA~`a*{ zyK#++JKEUw;(?zB0q=|6zj{-C%>I7vz2yIeZv59C(3A%{k_QK6q(4wJ&}S_@kX1@B zb{yXL)!DmJZ|NQCEEt$(42W-Jq{&q1erN~g~H zS|p0@c5%B-aoa75Xl>o0`c(S~4H47lu~7`aw-6SMnENI{8ff?BWy1XQQE0Rk9;JOo z^23Hw{3zvK&Q%;i$^_CJtUU9Ol~$bYfF;h~^!>a?XMXl^m}+`Bsy z;*z82O5BXc6R)=<$8ShmuM_e3&4jDyka%e3?!6vUOLMJ(lY&P7o~3kx=2VFAGd z=NYG@Z|)Yf@J-hNg&EF`)&-`Ksf$4(yW+9pu5NG)O^&hd%mfsJX77`ue--+d%#9_3DDUW+wV+tM+C=%CdCMD z`zoDIvlf`mm1ge`w+TOZaYIX@PG_a>wh^RgG9PSb1Yp{f9ehhhiV|U^y0Nv!%2MO) zREr4ePH!mK+Ni#80e4Kvu<&cg(9 zBv|xmi}V6eD)kw{i$|kb!Sv`Oi?cHH$_p37Kt;8TH2a%}JL}IR{7+tcedjQOBQ2Cl zEG7oMDQoeOXzsBPIe(eJ1c4aH<-9W#Mb%T1goI~Vh(m%9MV;Y^0c{_6A5FMo#tD-g_^&8+}4L@Zp%#|+|7 z`F4^nVL3DS?oYL}!>t2uhll>WzZ(BxpHz` zWpKFZpZ-`mJCbRDBWh;&76EBNtx~C^NROumN9xSi+W;O2BfiE_$Kx_rHh{yfbJQM~ z8HL1gEv&#{Qi>svO5@`t@wP7Q*KODPszBfMwy(`yjiYY6D<}Kbty@qS9>Wl7fZM_j zW{*4w;(^Wob)U1Qrlttg)Hu;f^YB+X0|YXe42rVHj^Oce`M41Cm+yQK&|F|zKz?tv zxu~fyL{m+*x$zqek(12`U@+)Bo1@1Ya296F%QxxSA#6TvYfl5{0nFb*XMwNrbGO08 zv;eYQc1Lh`*m$C*%sI3Sh6|WNCH=6@d36Hj=1$+c9z?#FfmPNU8f+%tEw02g!0?Bz4|uX!LeW$583 z<%s~V6xsR=lkmZsQzzHedYDI*!xP**gFF}}5fwc@e9_wd^YEb|kddL+rvSY^BO`#1 z3iI}_1-tj)kxkcb-m`Y@e}&hDZN)GU24I;fd=8_a%oTQvWRPaBY}reh-zPHr#P_q` z@{48;h__8w<=eb2k7!xvEw8%9dJ-Y>a6e7c6#>bAk4#)RAhoqk+g%)2!%!VxbZuj8 zO~45zVhAHbq7WqgD|i?xTpE(vd;7}!nuMtn)L?}&P65(b;^a?;GvW5HB7!3PF2>Kf zdE1i`XX^j(r8(UXIyhbNrds|5W<~%N&8_(cr8-00000NkvXXu0mjf DPQcHl diff --git a/public/img/emoji/slot_machine.png b/public/img/emoji/slot_machine.png deleted file mode 100644 index 6e197e8ccc461b321a0351d2d554ede737147b21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2861 zcmV+|3)1w7P)xNLX1|LO(fe0Rd@gXcHP6-{9aM9{>*y5kN37U0hVl&B{VS05dZ)umAwC0J?hu z0xmEyB?T>>q?{ok0HCO-J3l|v1_o$nWE2$@3=9k$A0WNO#TozriWnHs0s>i9QTh)L z@$&IBGdDm$Kt324Co(b&3ISaK0g@CHUtSJFLk1B70u~VfSX^Ef6#z?4O*|43mY|?X zP)SlGB)0$n7z7@3dU3)40KEtZF%%Wo*w`ol0ILAlr~m*ZEiIKD9oiNa|AaTpjPDk^gzATSUSA|e(y3OA|~6Ppzk z9~b~IBmkSEqe({sTwW+$O(h)<4_HbqIWi4HLnc{PFPNT|LO>d#0JUlWnkx?)nEEl?uK zF8~5x$msP~I-RzWrAw>Q>DHp6qQTPA+S=Oc>gvKLsjjUJl@1OT6}2j=mX0``m43h9 zX!j0gL%|d`kDpci5=>TB7FfKL#pjWH1VF$pfIJeBXDQCg;!RN?fm=bFt?-|LAG}-B z=`=^0GoYzwS<0EsoD;POnrwx|R+3OW5-6$&(ynM5_`u`rueM28Ufe%8rSnM!Ehd_$ zv{YB`hk-?HZYf7pRUtuDfS@(Yau3~qAI$yx^ZS+y#jIdb!`A^pnP0P9DrQy78lKgx z7}JWWKmZC_0ycv7gbvUD*85?;`lYXQ?$LIaH3@h9ZoC^m2X4>qn~E&rU^Y0 zCd^py%j9~nk<%!qRXEX#2^mgo4#Ma~0hz49M_h^_DW$;t@{&_Nt09){Lo#0LarS|~7R?chA{UHj{fOBeojZE?k>y_%?A z%t~F^tN;pRTAJ2e`O}}Tu3NY6?|-~{u4`9R&#+RQXdQ$OCpH(M)gXaf z$FlM(zx&IQi>KE7e$8)w(L6b!1RdbS&Hw>MMjV7pi3CbHK`R&ic1_;AS$Ff!pUvCX zWKe<*Z~_D}oB)Ab6#)X1O3AW%$+X_OsVnR5oVz%yWNHw0fD^lzlHnxaA{wPgAl1`W zeUAFq>e#e1XP0b!`FOtw2vis;C=*j2oB)AdfCP~^ZB+@{Q|*K2mmE3LyDybef%8C* zlX8Z#3pSp~`Slz=_*sHFP6Ex6jH6a~E&ZqE;eNk=xvy`#24C1w&N! zyuKAH`e15mYC0P19Hq@&hB66etRu}@qbVdvsWbc{p|Y`2E|=?cI+@Huev~lc}*OuMw=y+{e$KA1w zLz!3!5|pH@jIHL?)vGU!U--`Wty|-l4vgP=_)hVPQkR)^H{2Tk&g};W8fs~BsBIIf zxb!f0^@UeAS~IDsNHBE<$K;>>(VZXN_`&NBragQ(?abyM-C4c*2X#~GNm@aknYQ{z z4-RZDCCJR4w+?^`0Df>|^??CvX2w&2I269Vb?Xmr4*#%s?%dwtn_XLW4BrfIbdg+P zcrHM1cZJ(n^X1K5sA9+56LW8FJd&9`qi zH}uN8wZ zjJO`01B}B}?{d|nxE$or6Txu~42oFLE}RxgwC00-cslaoCJ%)Vk||k_1nZ-f`9^QK z-6I2ItR79nXdE^f3@t4!27}3Dk_3Zb94P>vt(?{9CPk&4BVYIVYA0CTx0B2_8nvT}4e8!eW~d@%WzgC4Xx z4QN6YmkI=t0uks0MFjs_Ae5p(9?tO|Fp(SKNNx$d@c;Zj{~mc4L>OXR-nFZZ00000 LNkvXXu0mjfoiF>8 diff --git a/public/img/emoji/small_blue_diamond.png b/public/img/emoji/small_blue_diamond.png deleted file mode 100644 index c5a9f3b33dda954af26b5c4cca75e4f9df7d0b01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1555 zcmV+u2JHEXP)xBvi_04KWu4W0lUu>b&_035IY5r`Kx zixMw|03^Hs4X^+btpEknS~X|0ZDnUWxrJbNwxE{U~euBVzX=VD~F${a%LbV2JH}ZeeFlPT=hVdI&?pcQY2|LjmSMDZb`vWW3 zSAp;V9nAnJ&>B?mEMxx{Q0y5|?oojM1TfMSOzc#E@DWAn9aHocNbVU-_6$AK4?paG zpz$JD`$Kg6PkQhKC#Wl3^9wPtM|Jf|c=i%Gut|6BL~-s(bm&fa=>{pJ89}j8eClqE z*{;Fqowe^~jqZA$@i8c005Xuc>Nz%`Ux+`CtB+} zZTkQKs4iR6EnxUNXWc?<*fd?xIB5J_f!rHIwMuc(WQN>Ve&=nF>1T}QRCv;XpzKtux0vBdH(QnaH08EpVi&$;NtD?@by7ovfStSh_)2q0000nbW%=J0I%Sy zzQ*GN0fNE^$O@C3hveL>^@V?Zz|ix+v-HIlxz4S#6za0b@M>#l*O6-L-`b6WFz1u76WiR_W$eSyle+ z%T8TV-Ou)H{RY=fRb}PnWrdrHcWn8@NSgg@Yo1nGx<*ILEi9ZH5$*bM!@3Ga()2%m z;$j))S{xm*DZ1D-YU9TDuSqdMW7)cgk6bL8gQDuHtLvhInk}50UcFeYMXdemx9;3q zTjJalV$p0F6lB?K5z^$mw&eMP3Qgkl3og5vxpGxWWMn4D43O^3$jH)FEAQW4twxmo z#n(z#EMHJGt;ffwwZ68tzSYO4XIjyM`Hj}p9%V>?UZO@!zYTW`}f_7 z$WJf~;|rJ@W-ft@Joi@7TD=}p9DyLcvD8vyy#zA!Y`TOdH3R`4AP54|(mMB3kg01| zy(N@dgDa6eN+qr#X diff --git a/public/img/emoji/small_orange_diamond.png b/public/img/emoji/small_orange_diamond.png deleted file mode 100644 index 1ce136457ccadc56faf3b1ff4b6fd5158c370fb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1559 zcmV+y2I%>TP)zEBdU2$sBSv_ zl^*?@AN`LV{e~F*pdj(QhwZFw?XYwGkS_d=9Q}$T`k5X2k{t1-VDPed@U?vL!I1OB zmh7Wl^v$LGyL|nOC-Jdx_OEOGq9F8;751xT{GT8Ep&$E)8vBbI?XGe8h8g*T81QQg z?5b(>qE_+3l=H@#_SUxjg%wOE} zZU^wVf$y+%=Vk}>f)wg*3H5am&Q%BVdlB@dTkNN1@V0;HrDD~BIPRcV?VC{QomKOl zQ1HEr?yG9I)AQNC_0g>Tgcj_wcKo?_@VbQjv~B#gaPh8e?}82ViWT~n9sIIs z_m~>?sA2DY4fv87(q;$ELk8-C3)fc%_lX$%u4MR-8|7IC@pBLRgdO&$U;U|D)nW(k zcn#QK2kUkU`+^$rz>UjF2J2=A`=wR-e;D(~o$jMq`Fs`cxr6GbXx3Z@@Pa1#nM3TB zNavME@uF7fm`>rKVCSZ4%xxa@&Z*LSE9ta;@5!O(t8UA6DfijC^WVw&>)rL#vhU2P z_2=32?&i^tPw&yO`|jb|Z3p(TarUxs-f0K;l^OSx8`4V$@q-c0Vh7Dn2hLyz+E54e zc@_1367+x({G(CMSqHW`1^0Lo?Q#n1v2^IJcKo1D`I9=?c_rm>66>E@@|#QFXASm* zC)S8S({?59zmU#v9Ph@O+muuAx`W)BUi5(__l`8%pk?czUEHN_&3P~Cxro}ZhV|61 z;JJ|CwTsVzI?swq*s6Nfpls8oefsg|`S9fT`1SYR#L|^qQpEjO0000rbW%=J0LTb_ zh2#nWg2TSM#RKBA;IFKjz{bG!m66c%^s}B8&aKGf>J-l7;g+D+;Nh;YmYu1qtn(RI zpa1{@kx4{BRCodH(nDY*K@t z;XQ!+PvCF@+jansY<=@(58%L-ccUYpb^*+0zW+Y)b@cOI%=wptBi8-j27b=Q_J13n zGZ-vu>!Ate7^a2|PX-w3tf9B+tikb*y8&9$*0(YHRjt%JJJnUKevFUpM0@|~kC^I@ zOI59^s;n%jlGei?wxi77?Rlu=DXC&1k^pJfy9yrQA3MN?BwPA<2k zvc}KM+kZJ=OSFD6z|_RhP#m(c2@SOohYXEOOnm};{doZbqD6&18Ah_QVt>fW8X1|K zE4~2pNC^zg@DcdkX425Lj>+&O$*!AuHo}ae)Xxk9%IxArqv{Bpcc z@&JIfq1?>Oy9{d{T6{V?`xr04j(bUJ>RiAH{`qqNGB_L#_X|C&_Gj2_1pNR2002ov JPDHLkV1nLLA)WvL diff --git a/public/img/emoji/small_red_triangle.png b/public/img/emoji/small_red_triangle.png deleted file mode 100644 index f73367464b7e486301aec18e8ceb9f20c76b839a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1764 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 diff --git a/public/img/emoji/smile.png b/public/img/emoji/smile.png deleted file mode 100644 index 335cd775cea7d261f533328942f6f65eabe1a644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3076 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 jl7GL_O2L&Zx4}Z51n%opmh;8BL+4l z1&n47hhh%2gcqxQ6`FApqIVRhc@sS<0)So;HY5g&XAhEU5u0%m!H*iSf*8As8McTQ zm~RrQd=xb#1j3OTpLG<+mK(Z?8L)yCyowpAdK0*a7^8L)nsO31Bn5X?4x@P&$ebj` zlpL*p7P^ibrFRvldJ>Ur6p(2RoOKp{TMqfeHTk|N8X6k>)@A(GVf@>4{Mc*AmmLlc z4%(z27Z(@$#W?!WR{YjzwTK$fogVzzZZI$~`MxLNt05&NCHlrb)}kMyeIEJ1F0+Lh zEiElFGBVGgCHloW`pZZ2x+wX=F~gJ``pitOgBcPM64j$4y^kA*WEIYw9_q3qA|fK? zuqFK2alw%rtArrls37{zQIBmJ{L@|GuPXYkLCZl;5^}Q_lzbpB|GSZ?Zm~t7)nI4mG7}cgI z%bFd#kR$QDFS(2y^0*`KwFGd9v&W^cpbu)Blo{9;Nal( z!#el9DD}od;jbjxry}dNCe)xF;HxIzsw2CM8Vm~x=dmOv9}N1|X03-G@4YmDWgNbf zBkRLS;bp0GYaPp+BImR%r-C3gD-%028uZRul5!pJ!auf-B1JeA zUr!?T(P8$(HTlt6%AY3cxG&J3AyY;pn{*zpudi`&aZOE40s;cTu%l^I8c9ANrh5}X zK|#mI$9j5t85Rz~!NEvKNH;Vp&YvJaG$7~a=N=mnpoVPAx1fk}GGt_AjBZebWk;uw zc-pHi($dmsXlROJ1$SN?qJ=Wcn<(bMRLGw#bYUpLlqpa^6meW1+qP9YIy%R%gxuWR z`uh5pmzRr+i^{4?cV#fMk~Do0#XXU*@_* zX1eSA?dkLY_tgLZ2$4xdK~#7F-IoP;8e1BMiOa3KySrS!yM%T#5FzQ3KuL*E0)Y^t zgivS#5kd^D#oeuO_tc`@y1UDB-EHlk;i;sZtB>C=erCS+eE)w=MhJf?S+5`WyUw$l z@jmXj?P9l-b<1sj%l_W<)x{euaKT8?0Rd&v4D(-c+bmyFTv2qO*c!J2dQ6N|S`_-u zFCuK0FQN#fQfW-+dc4CkLSuv~u~ZscxafTw+!>b8E2L7PszfTBj(2=EO{!wCSgP0} zVeyjjZ&o;+Ur-dAp2T7$Nd@ch0MiSKv;b&rWu+Gs@-~`}O+RC4aY1@gYa|N*v4TZ- zfOQqI+9cMA$Sl1+i`B}TIPKNxXBt~saG*9a@&rpOE_w$Ku%w~@01dUhvJeKNy_z91 zd++VHFuiT{A)^`_?A12_AU$?99$*bbMExO*Mo~*kV|9bJzWy+(`g(CvR!Fi))ScNb zt8HKeYF;~gSo5gD5kEiu7jyfJ%C6b z;E1~0Wm#N&z}4E2#+sa_U9vzs7ZnRJ^86&F2@g5ZF6)7I{@4rw{72Z90)!b zp%77oEW-m#&_uCSZ6|y3^LK~2?AgA}6#$qpz&;cZo||is3b{PR0zAO9xm2$3*?dOyXlk8+gJ@jSOt(^pUdse&wBvi3=s;7jpK1HH}9sD78w8l2?kG< zpE40(8BHy?4MT${03rwq5u7W^cpg_67jeuR06(6(d`V9J9_s@5UBUl7S$^sAsUHDA zj4&K19oS&^<~BeIApi;p?6Ev)W?Xd0d{M}dtEPzi>9}HEVL<3-eP~B3CF@WV| zT-pHuKm_l*vBW##RLe0EqJ)EyyIiA`=J2eG@2WAY!fyHbA<=g**pCb6Hx+m z0^Lwwe02--)feI6(0-Ub5$qtf?*SUUY{D482Sy{6!(a?$GTQYIB2WepqHq2S)6Hg2 z@PoT8D}<4(Nsf<~aH!1LueQ*Bi-yCdl$5Ack+OD?XsE$JBzlKGxO?+H=;qxA-b6n? zu}mb2hwEXwFt#ET;UsUdf6+$EDU)Zh5hF*T(TJi%n#`dg(a@(yh~CJl_d_X|J+_?eCnX+f% zBZh&GDu4dD@-aUyPW(*9=ng;?1t%$(Iy$mx$~=2h0qD<<0w4mvA|}DXAwgZFiqzL8 zwW$*g17{yUKFg2GR>x{1BL{@O4i5ixaPX}dfB;b+5^PsYK|{>3B&^sxS293L+n?uP z5?~yBeY1Ba8pK?#I4(OO!B-7llN|E$_NUSKk}aF<36_@FwQTbWn~7!oP{DrRyxNcw zILAau*oo~cSb6|Hx93GNgueR)p?vC0%PI3P|Kus~V;L2pC=dANRhCzN)}j~YVE`bY zf?rJj16;=Gj*I0{z6X@hF*BHY-W(KwUDG9OH#9;Y8P&y(&rXX%vRLWjwz#-BVTm@f zmr>K-SLu%(t%d+@!IEj{1_HB57PF`bU75Du=!H!3SDZ(O`c zCi^>i>>9m;9_@n;&=Kmw*RCjL5+0udgwswWl2gvt56_<;{?B(8Mn>-3c{DO|;k*A0 zpMUu9>q|~fPB&80lyn_WGJ!Bw7MqxCl%VVcz@=|4T=;hQe9rY8ldfOCo^$Ej;cxy6 z^u{zLg&)kB2m!`wemoTjG=W&tVOM@P?{JGVHo7r;N>~hZdd=^pNlMLbcZ-3ipz_#A3SXCku*;~DS!Q;GKc;bJvm{Ka(P*SnIcFDIf&CB5V#3T- u@u0sgn{Q6|bFvvXf9llv<7^3kZT%m|4l2}wxmP)A~p>~9{?yE0woLs4?GP^GY&r^2`nrLHz)%$BLgiv4N4*cD;xqL z83Q080xBB=BTfKmK>$}10Tw$ENJ;=_G8a2906R7YL^A_HB?K-+7*bOJbN~PVKmb!Y z086Diz$pMXO#o*#07aTgv`7G7noqQxNVQb}aV`KmBmgg%L9v}Kx+efLmnOB3CagsQ zSy=#gF#tfRO~0>J!%+ZilQyo3AE?il-Ir3YU;uv&2o8}SuaYURqkXRj0|=Q$vSa{- zn?bdmLbtF?$+J<((wyLk6sI8oE0aI1tw+X|NUni2nluJNrbE87V8@j$u%b1+LJ(4y zV5&$MSh!rw%aGf-YRkP|&}j^an_aJ)HMN2$o|!PVZzhMSLd2>_!qA!Dmprk$V$F*f zsljj4w^hu@S2AF&knvXZAcpa2pCUR;3k&iK}eFmPjSIL7Bqn2Z* zy=Ksl8LpXXs8b?iz-ZComh{=2=;X=f6%!V30g%Lm)ms32msqWjKB#E`i;FC$a{!l* zN2g#FdR8E6Ob%dVD0-nkxtd_Ee+{6KSf+_ZolhEHojJIbU8mlo>&J}Oj#8oMr}v*n zx1vb7zk1ME40324fqO8LjXR=}P^g0+p*;&tpgg#*OvO13N6?1hB_JlkXx7(_>83Kp z&6V86VBE-c+u42WF&H$~o@N72)i<9%U-G$uDiC`}&^A{`+cu0zIkEsJ_ZiR-iVm~x~!JUN_s zr^{;LM?pxPAi&+l;-e?Tw~fMxS(9^9d((F4fliP#I5N|=+HXjFWM^c~!O*j(x8|Vt zSO;@`K#`egs-a7_cY1feS=ghWrKVrEuYkORg@lB3h*MNj^=~{40000pbW%=J01Y`K z7aRfs1_?h!WB4o)DQ+@Q>3dz{?x|POtcaZC*}KV`-M9Pt?u-8F{=e`0!~XU;6769C z017HeL_t(|0i=@!X!B?ofK%7ZYty=%OFokCdgLnv(!hKREt+%5u*3b_3oSl(4HP{; zT!zet+Z5+FY{TJyQ=>(HdFpTTJaOvfamPIEFJ`uTVs7{dzWK)M&KL2WufOqT5I%>P zwCM8~o>w<`d}5jzqA1%C!wqxE*SoD$D`uyAAQFhh0+9i?(@eEu?S4H88Z%_0>_Nm0 z^L!#1@-{8i(HRK({eHRvdu!yF3QDMJ{ghxzPmHj(Tb^mdu;6lHfs zqJCOYG7S`k_D3Tw{XcV;cd##+0D&J)qp*Q;1SF9g&dyFuOw7LX>Z^UB{=t}^21y|Q z&y>!A(#-!vfC24~4fconUVZhQ%EH-UPLu)=ND(H@@lePw{0t-r4LbWt>G6BC1Wgh@0}FZZc`nV6l!J1(1tjV_p$C?hI9ACB?3YijW%=+7C>D$GekjY=PrhV@ zjKXqDOL{=x0TBsq2smjBn@}nIyuf5Y|L6EtJ}VXq1+@lzEuP7@$NxYg!z}z<@nHin z?Q~F9OO&8$AwPjYCqG@w#e$}(>ShB~)wDuUzW#|o0!`$rJ|a_>+Xi#r z&H>xo<%0YWNl>WxNK)MTU1aEpvRE%*fnaobxLyA1uW_Akni&5U27mok-afoUmOfLCmna^XL5hQ!>i}IIZjp;}gN+QukSRd(jmdAs#Y$Fl-1U|F95R z{t%gB3#2d;sZd4ht_nK7#-W zOmXeZF}b<9I$d%ypI^8Fv=W5=7V`PY$vPc895b_4%uIj?p9T2QdxPxZJc)#N`fyM~F~e zkdY9RnL3a`_f|j;|12H?kq;5#KMSYRJQdKx z`V2(@oYiB;E*e*CFmSM2r5fRtN`)C5gQ0lbqOoJEohZW4K4EmK2jJH$RT7hv@0^9~ z6E9u4($CQN%Ta9GQcQgz&!LtgMb0Qz#QZ|s}~g;I4tGlZjvAf-ti?J+3(b``@7NG`!7hny09NHyZ5_ba9A9UVca5T zK~7BOkU$KeG60ayEPwzLIV@Gm@HovO;XlWC1bKQ-IY?T*=QK(1j{PG%q=_4zqGE9- zLWBZlIsh0{44@2=q%$k4Apna7{!(qjvkCwZq|}HAMkz@EpyFABwiE~~7DTA7WTs1o zP~HI&(;rsW6i@W|%^lsyPwYIf3Upv6fe76lW*=cpcWeuBy{Q|S%#!>9JZk;k^*|I59tk?17(Hjc0024Uun#$GblFum& z&q}29l*qON00j^=2+fMFi`a3*x(v&D1Ych4QkaDeA`}4t+hvlT6uP%3_WOAw0&r72 z0rXuS$5mTdSy_8oneD2F*QNJFNZ}&D#-ICndm=U5fAGe6bL!YE00@L;{e;dU2N=$s zDQm|nJ97>$9YviJ^k$&|04#RhoOv4u`-fA#9WAVHBLFr)f|CNFVuGcr_5KOs)@@sR z9#*^U_ATPX{njeW1cgv=5)y0xKx5x9Ur(b4L`r0452`9s^Wq8`f;!*gJ^wt}BN}4MH`rRZzmnju+%kleGzkFAw}60KiB#ShmCW$x8VGKm2 zs+kbryFvbez6$UeA-Xq;FsxoAR8(}`J^?$SdFSq{|GI(F{_@B%2MG)5;02fkQT;F! zpm#Jn8+;g{=XY|5FrpM{upGFICZ0z+jyE4Y+U#(UJh;4j@P-8{C>;R-ELvH`&nFajS%h>Gqn+qy=XyFe?f zu(X)Y+`H>|Z*P8OU*6ebsSs)x}-8-&~CS1w%ZR{n>vli zpH*0k{gLmF2Jb}+j|j#DaVE5`od2;Um|co@QhBm2we zu35WTw=yeRs-I9*Rb>Rhp9y+tcGgPW=Cy0)%KJwKsm1G(5kjgj z$I?rYJ$aq@ZJ*@{V<8NH;n1?%bl+kncy&I{hx0++Kt7Fk)p*rZ;ZwZV&*Qy%_6o_V zOW)6M-`726y}UQr^S%QDhO%na)!2R7zQ+47e4H7E`}nm@yERwUR%MVs3=BxzsMXln zO`E^3jhD;l?`GTNW@}c}UQP{j|0wzu86$;Y|KewYJv(%(AM!#T5eV+{qsra+(l;j|B4SQAQ1qRWr>jg0U!tr;emz}G)^F7j1a~kOk!FDDj!s2XL00aU6+FStQVF2H20U{3o%U=Q3TmjEl0On=^#7zL+TmaNm0O4K$ zpGyF5GXUpv0jEm?hNdS2^0N`5y|Gy*u*$DsCYX8}M|J;TD*K_~Q0{_xt{JRVP9qQ<3jgZ6|Gpyov|H=vcw+;Tu3-E^s@rnxn+X4UOrT@+c|IAAN z&I|p*2lSH(?tTXU-2?x`3Ro}%_Ma2~!Xo~`3-y}^@s0)bmI?Ea2hxL?85!C z8UNx0|G^vo*8%_M1^>k&|JefnzaRg=D)*%c{<Ty@ z{lyCZ+Xw&h33o#VWjF;=ECOUd3IE4D_Miyxg#=wT2LHq{_o)c>oDfPQ0srKs|II4e zp&Nf!2!BWh|I}COy-NSq2HCU)iev_IOb0?80c<=4hfN0m$wB|$l>Xh0{^hgzt}^(f z68+MG{J1Fjs35SK3H;1-_Tm|iQU`BO693dl|J+Oe*k$FY9J-ta^S2zBcLjV;2=tf- z|FIhT!C0}B3IF4y{?vW>wL|^FNd4;wS3M2+$5xhX3Wi+@@!e8!J_XX58n=!wg=ZfB zN?bN$R||I-or!({*A4fV@9+rTaE!V2r#3ATe0yNVUiw+HmwHs{qD z|LI`duS(aeNVua%)WccT#ue(&5bDbV-_Z%qmlMaA5aPxUr`?_`0000ybW%=J016HW z6B#}M0|rkdAvGP+*uP3EFwHqcV#?lBxrsRS4tE`*i*EOUm0?-;F_yy9q-OYmUY<*< zuWb`i);jRC000OONkl02q$RQ?2$$nn{MSh<|SqS39m2}9dG!Wg_V`;ndqsI8rvC}bqKN_Ga2bcRiq5+~8 z{KjX?DE+~(J~#Y=P68D1%Z8T(rpIj8V%jJr%e7-HLXf~BT~z3~Ua;Nw#``IZ_pV*g zBLkB|{2XX%Fa-g-L&>%G=UpAn2?Fz@nPc)#G+ENw1U%`fcZt=S1sM0h{uyIQMN zE|(9dU@u!O&GlpZ7|ogjKxOE+TQ3*VY7Y|>2&R3Bl9>4|T&YyTa~Xd8X2uAWAei)d zAsTbK)oS(iLf8*oCl(cW2*&;EC~)R@?I$bH_MEc-x;~ZwH#oYVE)E{IA1|Z*xIHMQ z_bImlM;o}ec^)&pM_-?=z}H8f89U#+2f=6qm^ILSv?5*B0v>4rz#CgX`5+4rxq&DQ zv%ZV%;k7;7YDm2eR`)goq3*89py4cJI7M$YBrA1SWc6&(br+mEQuh|`%qI2rzIgtb z_ul{G0Xnv=z{KP675_yOw{_qVrs{u;V70ZA1n$%H`5JxU^QTOW{wKA}r_UGY+IgD3 zPf}?AF@ja+*l=p718qBhp%L*pSy%PK`E7rK#j1;S`XUW1qK=_c8yq^VfW@Y_Z{Zu=<9~6%b(O`UQ}LCyNgcer)vmXx9;}Ahvkr3|y;4dofYFJ)G#O1&N2;aRf{R?Wfuy{GPWz=u~O^^cWUG#abqUm!$L z6r+J(5qgnVwU714)rYX-?y0@=by@+vW5d3o-k?&>$0SKYXtyXpk@*7=3gT{r@Pb&r ztOR?9_HA(J)dDvCqSG=D#v|_o2&rv%Q~zK$QOGQT_mOeH%cmFVZEA+bxm)FABKU_1?i)|2pS$11&hO0(H|rlRzc25-|5znifq>kOrU1w3L^K+| z9}b5jpZt8tL37CQar~3X0(^fznmacIkXw=fDj)@eD%h2LzA48~pG0$a?i;IhE$)(Sh!U^p(O=kXg z`2M#$#m_z~M*i`@Ki~JhV|YmbLj12VlE#c>4r`s-L4Xj*3&ck1c)X)Pc$=eDYlpzNY+-r>q8z=!RL;Zl^q8CFfIx-IewVH^J z(h!Q#T|^fEA;7#B4FmPC2-FaGJun0inCSSfhvTF|dN%XF!6HXc_q*dgJQx8il6jD}^Qqg~dX4AZAk?Ko5+DF4;R?+!FBnHR^Kt5ObE1I;B$k zNBOLD7fjM0Fj?f7_Z?YR1B2>-?19rfF^9@cAb`cA@`n!}-b(^+oc7GjwE9VoVPY??0$DA*eMbl5m-1lrEvC)8@u3 z+JnQ&t-)Z>=pwPN{+T&@J{OONllQY5TepJYpw@!9ZJj-I0rV8QVU9?E5*Sxku3T9^ zpH1Xu;1Ccg+z%%{`q931s}ckO946RJPk>&CdP%Fw>P4Ug5ZE)z`TU6!C!&+_Na4cW z^Jh0VLiRKWAdkQ{)GDc`mw?_D_$?xp6_pc)ty{m{T$`W2GCzNI<(I#Hycr7Jv~Nvs zRZ@AYO4P!qw*i_h0&%Yp3}hF|t*%g+n=ZRC2ud=p4Zr|Z!d|gp3mv3ka5=qD!!c@- z;3xxWDh_!$cI=``)XU*Ao_h)`E~ll{pm#$Nk1D9)!T4bV(i>V^I9%4#uT;TM*WEb* zMUaYNN;?PPmtC@e9mSNb<~NutjcFz ztuuIhNp*X(!De-rFhs5k1hm>fKnMFj>bBYp&F$3^J`Wb~*)Z7koVu2Fp)6*z&K)~e zDq&cugdUr-+G4W*DyvHbhJh#upvz2Ql#MQ*Dv_I`^p&|&Md1^ z^^#W1W||@aej^~cbmX=y*+p5}{E{Y@_1|#`5uwiL3*#t3P;&4uAtk(#^27ESfmJRy T&QWdq00000NkvXXu0mjfYmApe diff --git a/public/img/emoji/smirk_cat.png b/public/img/emoji/smirk_cat.png deleted file mode 100644 index 2d3cb61c8c61d8381d9493ec60060dc2d45003e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3127 zcmV-749N3|P)fL#xHRt}zZ7Ql`ghi4VEf)=TH z6tjUAv4a-*z9{*>EBU}J_q`|i!ZG~YcKXFQ^|>VZ#5MfcZTZ7A`M@vLq94wi9`Uy! z{Mm5!!882UW*He7{M>obq9)LuALg(m{M&Qsvn0uw9UdMY?6V=xpe4GE8|17Y*`y!( z#ya)AEAhE1@3<*nP#*fnKCXiq;j1CXnIx)z82ZXa4GaqRzb?U$8~oE>BqSu&qb0qN9OJk;->D$tuO|H0YO;kHwul<~$wIV;8pxL&SV#`@twWf`5P_l*|0s;cIiyPFR9{12$>cmg*!$RY-DyNWm*{v_2fh>Vv z6^(Hv$e}JVCk~8c24zwjN=izig)_sME>c7oP(>q3KOmrnY_pLy+_zcBuY|jpFUhr> zy{w*yXi9)$L_I4KDIEY@LMoPgCTM7Ava+&9Mn=KG!9Y7Ha>-d?0000GHLU}1r{(SS&tix=Ozl5{>HDWZ~F4q3kENviPqg0ptpIyrDyy?+UFXmt5 z*mgwtV3F(R_t)(5kd<_T?8?sMa{vGcok>JNRCod1mvulJ*%roeLZR+%>+bHpOVN;E zOG1FS2Pq{@NC+iZhzsuS?(SB1dwq59y6?VsW~kCx{d2z-yZ3&-`OcY}5vzZd=B(WC zm)1Fa^dRQA<5Q%rMELynqEc*^?z3YQS&>KsE5EKyUIVgZ)O)vZ)2)ncLc$Oj*P^WHifAAFjS-xFjJ zf?twD*@y*LO3rBwqFRJCMMX8#PU&-Zhj3Uy>!c196%`AG0FbA?hy_?omIFXo+&-3P zGUbk$nm>5$rMakHTKQJ#%wT)*kR_-!pRx!OAkRnrc{sg!VnT1U?A;wZqtV@ahw}7h zvksSQEFOY3k+A{!28*!Rn5#E8n2lhrtSBfbIDY&%e6OgC9qkG_q?^#0j73A1Ryj7H zCupc>%%p2D7aK;w-PYEYJR|rG7^5d!X*x45uf4|7g9&&_B5cpoPfQ##?2ZNdaB_0W z&Kad7Cl6PhsMrT76lPtnv8MHXOh9LGp1#4{*#(CO`>~Xaj0`_NKkvAVjFgmP!&Ox$ zD)*f1|Mo^HyO2mX$4NG*FuxnpCO_+zV�NhbP zMMEO@f=V?#ksyf@KZf~XJDniOQSUD&9?~^6sklF7pa2k>U@w=eYHGk~2Iv$yNnwix zc&Ln+ukIe ze&y$m3eMzlu4>P@3;V)%@J9Tz)pEk)>o6`i&vfRiwIe7X@o>c9L>2dVFycol_=($# z3<1EyKbs8^Fs>-pk4wlLr~m*r4*&XFe?-}ItRD*SjtekPNA&;p>){(acucQsEhnG! zy2Jh3K$)JZ1pqHRoLl|#FBhw)_YZsf1tYs4U>m2Y`r@ zWfD~2@5O@%lYxB~`vb3T3y6cg2nE1Nyc*blu`h6v$Mo>RXR}jfg|9fxz9vfvWDd*U zi-`b2w{PDbdTr~r0B_jN=q|d34oxyq04qj7qFK+bpmC7G&i4260K&D@pu66&QynP53Rmbf)Zx7@g;QVjE5Hh zd{{AX9-eW$2e9FFk|2hi?S}X8@L*Q%il~m*Q&n5CH6UOnK;4NwFtlqQ>W^fxDFWgr zcJ~0@pb-EN>E`C;1%$KbB6?%P>(B^DfV%J;(0yYrS1LC88C;y4u&Eq(nh##Nu=G`q^^KKcxk&)kJFbIvg&1U^jHz2}K z9lZV@(Dj3-m>zhy-Nt4!?of@yAm2}xDfwmZzHqyZ&Mx!b(O>@AS6^LElbGJn*}X`ucjDctJ-rtPqRh8#T|pu;v!Q(RtoG(c%PUPkw%ou=r3t zq^!>^9`)G0>HEp=zMK4hQKl}94&sh6gg+;}ZoNT<7lzIMqCP^Eaog)zngUIYp5lxXv3UPGDTUL%P zE=Y)n?5$iLen&(Sgr#MH9|)+}Q;|OS?voOUTpQ`iVzE#!sx4V*VKQRr+Yhg?a<)gW zWe>YJZKe@rVZNSQZY}x@!MM7*;gPN93S3Z95^CSF#nZPXofyBue*S!C#6NF7U{=K| z8Fb&NESSDYKmo2kV0VRI5&!-qU?6@^UphglSdLWx5CTB2=^_nD*5d1l5|VBb!0&_l zQ9#kI8GjZMfD|Q~1MPQ0&4}!5;*|t?SemCNEJ?bP;HD75t_bkM;XTvB1O#RL`dL?$ zkS_X?NGP3)cA zg_z-r+Q0p3jBi+rVBlzoRFU}@_M@=vCO)l^2qAparb7c!CkV`aegA99&4=!#6Nrs8 z(P}t8Het?sQG8Sg3F#%7T5S9;=+ceLUtQj-Wlg2|wg?!ckSImzX0(26IWJ$$r)eMr zJuGI5mF@432l;2SSZOg~^ns&=QSp2mTj>8E$a+PoLfS}T2;jAV&B{i_VuM{qAZloe z%vFE-R^zx9>X3#2f|AN%YqeT7Cnk(6V~~_mg=q7mR)0Zuwl+{lAt2}!N@^;FEJz1? z)Dh9M3o+AU$l(zj|45XQNEl3)$p#q&qEdumMU!i8%$I9mO?^?z(eWWVn` R|F{4E002ovPDHLkV1k*G<68g# diff --git a/public/img/emoji/smoking.png b/public/img/emoji/smoking.png deleted file mode 100644 index 549ed109ad716d92ba2883cf3d8dd71b7221a915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2053 zcmV+g2>SPlP))4*&oFARr(L3JL%K0463TBO@ag78WQd zC?zE&7#J8KAt5FvCM6{$B_$=Anwl&Y4Jj!p8yg#pXGJ9?B_}5*DJdx|EG#K0DI_E$ zCMG5*C@3Z-CIA2cDk>@`Cno>^04OLZ000051q1*90463TDk>@f001j1D=jT800000 z000mW5C8xGB^D4VDJdo+?6%!Bu003K8N?}?@L_#rhYE@HA zKs6f=j%!FR7!QPke|K|mou8s;WL+;UCLWH zFfb)5DH~N!JV-k!b8T9NfN!j-n^#Xbs;8TSeRE)2PL+RQ|NsBOmS??_T(pZ<$)9P@ z&(EuaQPZh*$j8TTN-oyc*4C|emvTp`si}2!b@ul5+p~V6eNE}<>Ak(Z=H})Q3<6(R zOaK4?b8ce>1p#hlSW-?#aB5y)QandNHx?2JSyDx0UQ$FoG?tHpYFR%|N7RB@lx#=Wu6g$O_}jC9v4~p8#lZ0I?TThXqkm4kxwz}> z?A+PZwXv+wqHXK%^uE8ptE{ZAu(E1JETNp1dw6n#et0S!2!VQSJS-MHI50{#AW%Ih zX<$uUPC8LSEL~YsDj^S4Og}0l7f(epKQ<_sjCXEeNFf^!Uspz~or|!Zfzi#r;^Efc z+s@e2!n>-F4-yZ9U^?XF<#JOqS2!c(<>JA?zv1BDxr$NL(9E~7ti_jHv4Tw2t8u)I zWYVT@`ThUWrE0#6TiM*=$jZu|bVI6rRi}DJp`f3VYCgZi$jZ*sSw}BrV_=Vti5?;(l1S#wd%t9c>Wt~>>FJr1le@ex>E~d%MkQmF9K=jiO~(6qQA000C~ zNkl5)83gLNd)3}2r^x-!5tBK)=hxfRzCP;v3)`Rm z*T01^{!lwA5&8fDm7MbueW0H(CT|BI&I~n-qnp3aXwlG{0l1X3c2F38V~B`QcoME) zCH_59Dt!F_tPtKm6%65D8zF@7@@fD#;9D;$hQ9+4F|?qDTs;CN^r?-DZW7>!Py?=^ z1YHj(#N7~m{aqmi3PKAoIe<#Uur2P~0wUD;yCwN#gvhB-)<#_rj7#HujLQ=xIAaT@ zzq2;9U=Wgpj^X0LqyaM42(4YaK@@}=Sb`mVEl~y_h2Xb+w+onL6RjOio2*|swe9nM z5mZt!bSHr40T|qM$I&f~IRV|Ks}qptV2|fL_Vfg-!8b`E&q0UdZMM3u#AO{*8Zr-n znAnc#ZM{o?VLw*oSRMdN7sqKDBb_Vg6U1T@Y;LFvhX%zlixl#)ooQ%QEdNGMAHnXjLxFX1Hs zK$zZM0P4E>Mrb|2$PtAB0IqE_PR*dUt<+6z8{?U^ZJurBoU^^PZQESDH`N#G@z?(~ zY}vv+3$z%y{&Rh)X_Iop<}DQ}$+}g`r!Aa6uP4ib2^0E4=8SLK;@1KlM{l*_!rHI) zk9Br?4W1_=P4c+#i!moaF$p*BY=`-eZux70mV>5aF5KxfR|_3A4t{}1SE^RVMr>n= zkKYUP8`8|PzzmnPsFk)$i1h5 z5BI=Mdrz?T-TNxWATa9q1_6o^L^hfBQk9%|5|sEP=zi33P}F$u8w?dyYV-y%heKv$ z=x8pI!+)Lj;!)CJP*QT_<3kYtv)*6mKckqEa`gg~ri~^XNzdX?`Ol9ij(`-3l$8Cj zbM8QD-m&SVm1|Z{TcPJoU$l7253m^qFHtxI85u!2oQs2l57_PC jAO>)A1Btn{rnn6bdI5 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 RarXcK002ovPDHLkV1lcR)l>ig diff --git a/public/img/emoji/snake.png b/public/img/emoji/snake.png deleted file mode 100644 index f67119dc10dc48a9ba95808162e7be673415c3c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2902 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 pYdti@*& z|H0<}!{z_R=>I1tCnq2qK|w$?F)for1VTVPgoK2Gf`VgTTEXN0!{-0Q=KnA-F(xJ^ zI5;>cC@4KKDossIZ*OmzNeOj89-5VrcXxMuMHD0>A;;|7&Y&Qzrmb zC;)qdiCI}$m_!6~H3VcX0>M=UQBhHPZ)96I7`9ObXlQ7xO$4k=1&WG_U0q$s>Ho&& z|H|qA%jy48Qc|tS*=1#AQ6~T~Arq5G4R&^Rb#--{n3ezk|K;`n=Jx;L^8erR|Ks%k z?Dzla_W$bk|NQ^|;Pn6R`TyGS|MmO-P*70a^8Z*^Snl`#-SYokU0v~g2>Jd0)b9UV zTU+yf2vt>8OG``9?f>xl|MdI+I5;?IX=z7CM?pbCJv}|x@c&_9VRUqKWMpKl*Y@%H z|IF+ErquQH^z`j}2(+}cadB~>(e-X_ZtLsosi>&e*Vmhyo8NN>$;!&c=KHWu1;tke zE-o&3cXxYxd)nICySuxuudkv_2d1T^=;-M6{r`rBhU4SovfK92YzO3b2i@M@_Wb{m zkdU{zxVPT<>39f}L)YR0Km6h{?2-@%b^_K~~;rW}+ z^{Q71(b3WLi3pNU6T#y8)p87KG6m1i&Y+;5zrVknNCviF29~?h^78WM=H!Dt2ijl< zgjFSqOB3LN6~Bu=^O6d)fH=oz3gu-7gJVL~e;cc_wWOqvu9RuJV+gOi#P9I%uaRA# znuM{2PsF&YmXU$4U>kB{RkXdZ%;NB&s-B08kGId;uipQqmvQU$`p}6kkfEc-gDjfL z>Xx&-o?aU5X$QreWzk#*o^wZuJ_T)8KnV#6pu^XkhFZVb=$Wps%d>iz#pLnv@l-Mt z#rsM|0000|bW%=J00e*) zX@>j$3Ki=L{#PO`>A;FCPN}R->Or2YYnx*sT59o#$l)W=KDRj1g#7=sc0%E{�{I z#rp90dEBh>$nMxt*u$L3((t#v=f?9zrS8&ITju}(2bf7jK~#7F&6EXr8tE2>r|$0V z?p=4g?srMC*gPzhp)kcIic?&3NsYJ=m%6*V`&zy0zSr-W838 z|Bw7XGWQvm?iX_=%oz7n>Tdm>2?b1+pn-?VM?aOr?=4y_7^pQI+03WW&vu)9rfpS~ zIu%Dg2BGNN-9CPBq6V*)Raq>dpi9aVj_rn!41RIn{eAWq6SSD4s|;4U)dmd*RZv6e z{>rg`AA6;HUnDWca#R|PN+VSXMG^#<|MtH7#~kw#?qI-zt5^T?_y1n_;qrgv&c4Xt z@s52D-xxn1Ntk!kL9bV<)#m3LAPr0@s$S;jyg*G zk4v6Z{iQ4YQXGk6V(7TT?$~$iVabli_9q74f-ZJ83Zuv0L!Z_A_Y#NQzN6URe6_N& zd}ycoDZf!NQjyjy2NzF^o%VwS|S=4I2vHbZgDVoSYoOVEdnY=|X{mi-f_mt@Xo+_BYb;G@=Wng-PWb zJf>bP2D|gTulDQP^UcZw#l?HKJonS~-@`CEq-ec`=PNdtxAlw|7#nxzYvr;zy(W)) z{iQ8i{xCas_?N@>#atZH!xG+oH!eXqX0X+0w#WrigH-dvgkFRCwUi%)LHjIR$zW%u zgFen+yC*!fXBlCz8&mhm?hxRJdhVzVh zuupHLLZs5U++}5DZngBcJzL5%a4>=Nq(06-Yrgc?2`*EG*|T-KsnVd3i#QsoPVI8J zU22V}Co+{NPm2tXl*b!PK7GZ%cY?Ia7MzU?G=@P$7?a=sB`71`Wfx3?@0e_6&yD!Qkb^L}ipG zmGZ{U7(L7B90>n$cq)|um0yRG!=}==Yk>U8?|;1Ik4{n#sd+Q|BK^jIiyRdScmkp9 z!;T z40NioeTj=V?50FSMvxb@k*8+eM%pk0Dyj@b1hf}2V0fRjKJrKeO}u{3m)CCJE=1Zg zZn})4F{pJ?;mm2vl^Bkl9VjCrpmK9^jB^iaYY*SbQX=gzMk0bS8l*yzQkg|8UZaRc zh{C*fuon21nU1u_XgNnEm8yht9OJ_1#pMGdQ!tTgKE2>jQ`6zYwY6Wu7TRIi^9od; z((q788iSQ8PUrK{$P{Gf_&8c`fNH|xAIU4~;@{e7zs8kZI*lbG4MY-2lYb2C`Lj1Rl6mS+$K}hR0?cZM-F*tY%md?O&S+B8u0nU}lOD0M1))C3#c$+$$NgEKHl7qel?%BPefbWsx*!RU?@WH8%_1Taeq?K7es`J5uB6jC0ijVOSDH7D*++3_?kJuwh&lr-C}ySwVi>=-w3Vg_8iE+d=Do(O3X Z{s-R`z>a_t$%X&`002ovPDHLkV1o1p+%W(E diff --git a/public/img/emoji/snowflake.png b/public/img/emoji/snowflake.png deleted file mode 100644 index d616e8658af5a9776247825d1b57fbf1bd7fa7e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2763 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 RYVrU8002ovPDHLkV1h_sHW>f_ diff --git a/public/img/emoji/snowman.png b/public/img/emoji/snowman.png deleted file mode 100644 index f62730fc4ccb8d262d697aee704ec2b8265f3697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2758 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 M07*qoM6N<$g1RO#yZ`_I diff --git a/public/img/emoji/sob.png b/public/img/emoji/sob.png deleted file mode 100644 index da0fcb25b038777b7892a6cb869145fdf354677e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3015 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 DFgayU diff --git a/public/img/emoji/soon.png b/public/img/emoji/soon.png deleted file mode 100644 index 2cf46df254a5ea14f892e7019962ca3b3872ee84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1551 zcmV+q2JrcbP)4r1>``(4Go4g`RrySJ1hq_);ho3i=8@ z2Ljb4Q0U3uptum|S(iYdr`PwMWZ7QZ*-heIQCJ>^(Y!Y^znS;u&5TP>DppE205<@; z?(m!6y0;1icmm>&ueAaJPT>@uym@}FFn|*{f&d=A`|8Jn0Q%5|L+Ha7@a&h;X9WQe zLJ!X1$?NCkYX`Uk2P|!L#a(#xM)(B*9Pl~>@ZjCE?>`veDLnp2xeq>gOVUAC+=r(x zwnxLp%DdR?WueL?Q#>yVFb|@aZ;^AM<4hsTku`BxU;O*0IFA3m- zyL0i-6=(41r@{aTp^F>y%a@NozYyREnpYw%bj1lge0d>27n~~+7Y<)_FJ6JeD;mBD z-iu4cz|{aW-yVE-$z5;=_RhumyX{{(4|JfhQ?bGQz55}Vu(RXgy`MkuEcg_0puQrF zcdZ|;^*C;=3~#?_2G@Ka@W9FhXaCxjul+{k!9I%x_OGQ|1>6Z!fcn49qHe`4Fv0rA zF7936LjBK1kuRfmR4Vpuc=J5}M1Zq!5C=dqh|fY_T6y=5a^3X2Zs43ocW10k?oH0b zqRm;D%EB_M5o-Xx6imB#b93nMn8;b>^rx({MN! zPDcD1jBEzeV`Hd`T0|HYbZ4BFVjWZz0}hhxs2BVAZ9-=aU{ps1HXWtk=9n7R!ACrfbV4I-Cl*>0Yii)3gKPwq5mkxUokIdh?cMVLmSnJL9lA*{9yrSYbsSy=dkMhB zAeC`VJmH1}j`Ljt*vA?Tn(-U}!+A&{O-|SffC!<&2o}aS=74A*mOI=8fV)IET+-J7 zQu`D@M_1{%icaE79ij93Yyd!`P=+curk#ubb;apQm{_Zv1JJNe2L}Pt(y9yQ_I9jb znWD#x6uhXkM-(AdT$7CeP*NQwnnM@}(M@PG?E=6a(<07XXm#N$N60?A zPiIUylnyoSDM?fIGCKz zZBWy8?2>&3sO64TW?KPpn~cgJapcnhk}j5#1!XNLGoH*RTZ&d2<=sYUr=+9UK)7id zFXsXDad|rc&Qnxyrngyeh-r1SoTAE;g|0GH#d1qIlxDXx?d_y8-pj((h|5@`158-V{Az<-S$?}U@x=#u~d002ovPDHLkV1ilL B;m800 diff --git a/public/img/emoji/sos.png b/public/img/emoji/sos.png deleted file mode 100644 index c769c8dd5aac04662706fb883224b61dd1a9daed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2549 zcmVUoB#)O00&+I1vCQz2mk;v003|R2bcf|Y5)an00vP6 z1bqMpHvj;Q00?ye2U!CJVgLhU00npe2Vw#SC;$Lt00ol(2yOreO9KQw1O!+F1w8}; zUjqj?0|R0M2O?GvPNe;4?4nNI{+e z3GYcm@JmIQ01B`G3XA{=zyJ!Y015C_Px!R3zY7oXxVX6h2*>~m@JdIu013nZ3A_La zk^l&}00q7P2(ADM_~78Z00y%F2gwBr|NZ^101D3@9=8ArvlAPY015l?@ZB#e)E*w$ zA|U?y`pN(Yi2w=GA|TTR46y(Ot_2Q(00_(*8{8@<$`cm%>gxRK>i+ll)g>d3012r8 z3Yh>2ng9ug00_00y%U802|(@XXB67a7+lCH(aC%ncISJ30E@-LC)z z>YACqD=Ntt812W#*c%+!D=6D1B-?;~!UhlCF)h&y6XmI<`0eg@00`?uKjS_)ssIMp zKt1-$%J|gO?_F5E2MyC%UE+_CunQFb{{Hd3yyI_fxHCA!5*zfwz}!?&?yjtG00+ZB zJl>6p>a?=fYiQhFTE{as)(sWYFfZhxq1lv{Pm?WCjJLPGMkv$aM^)H*k`MoIeG*x+Sj(^gii5gOn( zG1qc!=#7chcyrhl7|mK$#vCQgjE(6@L)0cJvMez1m5}9BP~*0^_pGS+rlRpyQu)Ha z_qn# z&(F`+`LNGT3>m5V&(F%w75KlyFiObQGH~^-xQ^L+=3C_iCT)JxoSN$5?vr$IT|EE* z269P6K~#7FVi;Ut6fjE28uD=x1bl|F5{%gNOUmmT$nkR!1pIOa`tp((+C_Br_$|8Q zLc

48Q{xE({Ni>$c$6(-lG0uOTL98W&r%`ee_V(}8%v=`}qkR~N;`naYW2AnWIq z;*XB)SU#_7{^u|Lc)^#?^SkCP?}&}&m*PbVK0f}q#)@0_P8>hA;FBL-@M*!R<0tOj zs%VVk=VL^KpJ;Sr<|_YF$2>qF1P=f!ICjc^Rc2$fC_E(9#mu4_PJHxpclRI)xV!s( zJkbzkCZ-NGKteP*``w3QuI@ww$73JfWhaYDKtn**Eh_Kr0!LR8fa8LI=6`4IPb0X^KPmtdkqU)ETh}vxQ$_PSy4u>h(*LvB zEj8QLRwzisqyRpxBkcvO@P-c8qvo9Vr@OMxylVz!J38i1XFKLuj^2~)jjaeQw3E6| z6~ICgxtNKjy{B8vDpaTIz`TyM_ty{B>PxKGJg)GerZ*JeceFbJLJEsCY*a4@@P)G}V zFdDvl_qG+XvrmFsCD1gxu%!wxs2fGGaj(|8`*ys3W-yb^kFMi7PP;SyK_@)Zb=qb>8d_ApYtZ=TQnm0SEHhhK( z?nXkn>_++-sMc$0fEk*F2neokRmn1MSZ4>n6W<Fj`?R~n_YDa6o@;tY#v@LhGVy!!$?k$z}Z(L_Jq14moelY={uS3~a2CdfM zO1o^(gS9FavesJmzsl3c%GV&w? z;@V%J?hs<>DF$@)zrgxpG7Dl)!ECZvPqsqC5(J)rY$MqW)#ld=D)6Gd9%xo8e>V3R z4XC@)6d2^a++bL5S=0ckBmj-JwVs<^8|@AwX#=GgO~{@0MkQxs{n$MtkuHGH!u350=00000 LNkvXXu0mjf22-4q diff --git a/public/img/emoji/sound.png b/public/img/emoji/sound.png deleted file mode 100644 index b70b48927d160dbf00b7d2f05a76cf32bba1967b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3185 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 E57FJ)UH||9 diff --git a/public/img/emoji/space_invader.png b/public/img/emoji/space_invader.png deleted file mode 100644 index c6482d88030d740160c61d0b2edf13b348a3bebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2954 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 N002ovPDHLkV1jSWAb diff --git a/public/img/emoji/spaghetti.png b/public/img/emoji/spaghetti.png deleted file mode 100644 index 08e9b5a38c6d1cb2e82ef67de89942867881417a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3259 zcmV;s3`FyZP)A09RL6G&D4DaBc+!0tg2NWMpJGI5-p& z4kIHYV`F1OLOuWh0MfZg#;iR~PEKNCVtjmjK|V9$#86RDQ9?pPIW{hReSJ$yO^J6a zuAW(2TU&T|cw$#5rjRw1e-dwY9`h=^ZbVA#4p!>BsVu}5lQI+ubbW@cuFhK8(_EjKkPMMXv2y-MM` zQ-OM0z@|5YbS$itGPay9i;IhynVG?;GMk4pwVOV&nL5s~J&}=-#>U9>(@~%f2BoB> z`q@+4zDc*Xw|RJZn3tHnyuF>Boz&Id#KXj^tE{lFvCq!WaRC633Iw#XwR!^p?#)nz z0|LgZIrr96*ttX5*x1s?o|z2>%&|AEtgXGIKf1ZP-re7ei;Jlf3g^g4$*e5XwLXgm z0;#B}iHC^K(Am}0*2>Ar&a*+ns6p?}O4HKP&#^7avsl!=UY!L1(X=zW5D1~6ptBSV z%dkDVrA*?&N4}|8&Ax%bAQsxjc)-8G-QDHZ*yaA;SAYcr-QVtngM{71XT+^e-s1SS zo;~K~?aa&0$jQ^UgDqiUW3mYYpIaWlr#0i_<;b{h%^(-L9227!4v!HCu^khc7YyOW zTg||b+R28g8WF}A4yy$MoN6Pc1OU;hIF+y(wwows0RX_1GslrL;n=mWsEO9OH_@Rvu$)Wi z>-^%$aJ|6K-O!Y;aVN>FLa$vQ%UK}3t!0`j655ta>TUy>+E84c2fhpgiQxCt$j#8TKufaW_u|bG^vifyJ2BetDbMK9m}|g}!wzm4ocdX8La!b0Z_LSvJp7T@)WXry zmm5_9x0$+wu38OF14Nsy*?rxW)0a_sU=bKZn>bqfm~jK$!oh7O>R_cdGdM0hF$t#u z1`$Pzcw6^mo$dybufFkl0!)10Oy6bcLipaF9;vaMN3PDlFFv=qv7LbD>XZ5w5?Bl$>9 z$A%Fe>N$}ajj|b$k#3>o{3N@;Fd|4sue`h=GBP7lE2D{tH0#+pI1RF`8TCWUv-I^f zJQd1A)j2uX*@@K6!NDS`WMvoH$NMq6@1vq3Z!~XtsGXIPC<_M%J7K$lx^+aNX9n*I zEic`bo%10k=HbH+k=eU~YoeKTfM&20u$@&&B)T*vF1)(5scF}N>;{bs7cQtg%E{i9 z7#swkqw%E^vLJDUM?j$e=>COl zm=TwSEmhIIpK1F9`TYa=ikdrqZB2-VzM9gu*fcG0fPg*vLdM?-`wl$tx;RG!jxb{h-%Z)!fm#-2^Az2s?Hf5dK{M7z~wFrfUC;k=FA!Sc&Dk zmHA`kh^}ZwRF_QNK3|z!E1#+gsL!@YG4L$ZUkLm5@463$;+8R*9hzHwvtqcjK3?%n z{&YEFyx34t5j8BL7vn-|=UJP%K$)3x%eW}meY^gU!~VSwi$VPstyHECFw&j8XobPB zh7feUTMz~SLj(XSbh`Mp>5i$6&!-sfQZB0K;l2BRZ{U$^Be^W4WwZ(uj=5{es38)m zZG6wNXi=_34AF|nN9Zm?G#=HFx@;|0{*(<JmsT>U3gPP3r zUCK6~ZcJG@hNwg)hmyh=deL6TBTANNmQ>F*i1g31vec?|-AY$tGh(|{_SwkQRH zOCI2$&R!P|fB5m&V~CiLDkOPg=-Z8r^$nEKn>WR6S0DfK%g4n_5tCX*zjc)s|`JTgNbn9RlH zJb41LcN4HTm6J2FuRgy?5UhVAm0xQxaGWdbNB7t&>7T0s{ch*wkP_d|$~6F}-vodtm_tLC6qb*E7SF=pQIVB6Vfl z#OIp>?ZN6osVq0|-i!k~fWu-k9E0WD(#l#GHvUN8^ra>u#UrHN7JN;il7v*!$BCba z)En=wpVNmX=N%Izg@r0OS$ufseB2M&eN2=~aF?!LPzN}2j;Yr;eDPX?N9ZBm933SR ziJSk2A6!~bm=x;n%a`W>fKJF29or4rzq1#29fy&zDwliEJhH)(n*tj7(%8k$&XpS< zHh3sNO}V>raazIQ$ko;|iL04jO;=&bu;aV7_ao>5vinI?7F=5Bb=yWpsswsa|Sl7t9{+yTfgcJs+y%<7hMJCvWp%*nDLtdU}2MRyhudG5~N#*V0-f< z-=tCSO?`cV?)mxN-nrJ`?8Jj9&^`g1h4UTX)B^*5A{@RSh0ld=BfS3h`Bnbvr1g&D zx&-5;&nglmO4gquxCH7yUK?dh%3`hzt;*5m$S&!*)*F{39qlTk_d^{#HM@ zR3rqrGm8y-=p=Mo{}%$}%ByLtc)PV5K@d(JHw&%`~8_6S{nl^k(B<@ZCPU} z5C&oJ_4xGr-{Nl3ddN+1r}aCZ_VL4*R3&=l4VvO5R}q z#BVhK)2|Pcl^ji-&Tg~W%;%fkVZT3+>$)A9j%2^BzNQh3)8Ey!H7_BWf86*S{Z1Vs z>U26pjx+uJl>N!LE<9bc&9e_))8Q_W5hZm!*{&A;oR;!?vD&uRYDr`g2)Y)XKbJ7{ zJSNf^@mk8N4;AJ?ZI&7$lTKh>H!kW?f*X)WOeB<$L;^7nY+u!*h8Hn(9U#vD=(^#_ tY{%b;mRE`JT`Qw#tx1Po*j3Rn&ifD#UI5E79U4Qdb)hZF!5 z001ul3}O!udJ+s>4ibzM3Q`RSN(==_2^5eL02crbbP^0=5D7{Q3Qr6UZx9JY3lwV* z12qN;T@DFF3!Ijj5@JCpy;euuU$ipKP_M-jop+? zTS+w1OG?F39<(Vc#Xc936W`(ALC#V>!A2#WA?NVuG08<2m=qa)5+TJiBuF49uqPdm z8*OcBh|`eS*4c#Pl{cw8Pt;>Rggb!Cg`C@;IKx4A;D~UycZZIJR=!+wlyW7KAXST0 zg?@uJfG}g*b-dEOUCw1mp-U>jJ4CWa{O|kg+vvu(!zZCI&g;>n->C5I@MFwvRn=&E z)q|(%vnFvKqnDwToRp5`noZALl8BI-tD33du&=pEX&5mDU&ES(@%w^fkk#iU&U%QZ8A-=QuX8WNiNCM0000mbW%=J0G!)0 z)-p2|^rR2kob=oC-}C|op8U!4Xe%E23Gu#`}FzO@BeSU`0(Qo;vT*G+~527 z=@)!dBkjL18ts{{z5a6iv$6e$UcNt*#xHE`+j4TizjCs#wXV=ceeL=8UnTbAKmEkW zZ|K`Ivb~^+`EOK(%KG<>X)UBZ@%nqu;etnB{)9%JwWqzPYDjy3^1so)KR3jz8ab(f z^vvt`;kVy=_tOe1_c6ZMO+caU|u5xQy`H>R$Q)h z+&GW}hK+L4z3-!fcRy@nPdY4;s?}3>4F6`FNTf!Q@|qAqNT*k0i1d}iFIGxLYH4Gy ziG1(Ns37hOhIe8UPb$?_et+fIPad@tL$@9i@UVsY=gKud{&=xdE!A_IHdnv&F)DcQ zUa@In5>Kz!?VSQm`Q;~%RF9%U1qCV{I!i}a4&ML;J0$S`NlWEV-4hXzO%wGzKvKUS z7*>0J=E3L;n82VyW#`oXfjU_hyt#Rv=%lyQaDS&nVi1m9 zcMS9wc49e$q)S5-)JudI9?7yI*Z`8Ai6J2H&z~Wbp#5CY3}FNT{=9Ru&C0a-Ku|R})id_iq5N<= zFGWcpR^U<*okWCFu@^T5V*sI*LJ9(!v=OL)J^HIRU^m>}S2%Lfi3kead=F}T2u z;6Lm#A^mZ#K{1))jF+MUKD{_K2A69gGym+bg`Q>UA$9R7(C=54-x2XrqJk&+Y^y6Z zH6?=CY))|NVQ@>F;oAvL8~OAs*F)?$~dp@IgeC@gF+6_>kQ zM+(}fjz6$y-GREMs{R?}u5wdDLm{6AQ&^l*ZY2s>GOg8GF=8mfs0$?}Bf2ZR#fGV~ zhaNn;eeLgcKhN+s*bj^-xiAWiTsQ#obOAx2&|0e(ZEt}9`CI?Ivi;zkQ6suFiZ$E7 zQ(^1rQ`+$(F5F&w_1kS*(a5$HKC9J2eugN})-8u{@}b=~=8X8^J7k!$eEO)PXVHB= zgs}4)x0Oy1kbq#;TquUpttS>Rk$=KVHf@7q$Y&17wz3HVTZYy$t2egqFX)|A0Kxc2 zF3l|pLPVHj+*%-b9v9Fp-i`i9H|Q^_DjT^pyRJ6~kD)Qyrj5r7m^I<_QZ$jCd-)Cl zg>3;BVF*g@u916|n%vFZ-F@vvet&4+`0nZ1*2`n|E$Jvj6CE4f7P>-=3lb}0Nu~E*=y3{mY^6xZT;=*>XA>(aJ4!x`vMn5(Pj&XUj3z7Oi&t znYArD7i3TWbzM%~^3t=T-jQ4BmS_S_XYilE1ovSA9Ie)PW<`sCq<8$eE2rOak0~gf zH|o4b8STqc{JZYk{vj847{}D$WQJpoj3G+wU$jlL18@cI3{?^$f3w^ zENoxNQ7F8mA=^2;2MV6>$*WIZg67>mAJDR+A%#XjiV-Lx$k?EN2=wa$nrYud5LA0A zAg><4geKfRFV-reWZ;4afj~gfpeSUT=_LoD@UFUmBCz@^AozMyv!Xfx8|IvG(lrq% zWWpt&GRPDR1qJInDU`qu8<3|$P6kB~Scw?&*pZ-slMo{iV0}UN^{b%Y+6)Hg#jhbK z-~Uw(oQDlPU!F;1XJ7(8QNSV#U?>@6q<_4%8D2Oy?FN@1_#L$x9>j=Yrcp)_An@C8 zft|!B!%)QUT)%<#VK|%Mr+@wiV*sAS;@^s(p0zWn8Ub=DBk|#=z-Qx&!Aih_`@xO{ z&0?f6ZCE}msHHiPhO-bg_$Y{-VT=)Q#9}h1d(?K&?`sAFfHQ3v1XEk#6eHwKz6RdA zkItkDz`$n_1qm!Zha7R|7J>tOMX}i;mjGXq99V=zO7uPbLFA+MJN7mbip@sCvHjr( z{qzo!0~uozHscE~#$g|I-+wXFm_WJ<*7zNBcV4>Gu`&m@;+{nNYi~pj86JB3b6;YD z?e37nwqQ%&WXIpg|C&)h&;go4u>JWuglOln{Lu8C@~a z)M#u*^n(R4Ma>Eo6{HvtfJW0IiiYU zN-Dw(C_qLmRTL1D*W?ny>^Z9FD#>#a1`6^LYV5*TyS_49?8E>rE@6hj Z1OO3IU4HzB68r!F002ovPDHLkV1nUDT$TU; diff --git a/public/img/emoji/sparkler.png b/public/img/emoji/sparkler.png deleted file mode 100644 index 5ae060e07a1c5dad3e01241da3c23e5b311c3306..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3097 zcmb7G`8O2&_kWKiLul+CG_=^VW*aeC$G%N=GWJ0|mMKfNhM{4GY&D21=|P_COQH#* zkgZZf5sxjYWJ%H3#(aJLgzr7)-q$&=*Dv>+`?}}6$Y^^DJ{}1k005trCCc##jsDkA z_M=()l&}f_J3!kyn_1v&kC^{gu?`QHmzP;A)|W3|fFuHlsR2y zEdYT+R6K!*5@6$9Sy=%}t^jrh=!CJUdjnMrkkVs!YXj$;z-e>W;EWYSKL*%8VltWg`}^D5+Z!7jySuwU z+zL1~pD?)&)d_%Hhy>>ecPaURPmM*>f>=-hpNzB?3aI(ZUW#UO?|^9dmz3NGMnoRd zL?-h<(vb*6OrDk4gyXX|H#fh1`{sC^0AL6n&juZzcsUJiVO8@Sk~@>CRbEjB_pjzg zhVh~c4;QOhp9tWXB*gN*qC+U)5X#94V7Gf<7;pm!UF0;36LKp*VNLLGL$aA=0K<&q z@+OBXR4pegk6s9C!0^MrCiklf#<5^S;IRR&g&u^3B0;mUbS z_rG*6c_!rpeF~6qe$koD>0FB?-5Yv{+8g$}nUkR$SO7QnsxPqDLLzj7$j;u58BzLJ zEEd2qtgUI*=G%j%=GOz2YgCKHr*=G2N{?y^2WTY=&4${ZIGanx-~!P*z;?LphPa}R zx(_iw#RAy3#>P0Yet(!~L|eJonRs~jHYUvt=a!YHvBs<)kWf!*vy5Sk& z$lk&WA6^g{6KQvgQ)S(5rIN5+m2OdaMXM9{XW!KhHUx%++E(OtRv)=vAj;9+38eDM zVq6-OV&Njl2+N=cc=e^BBN6)43T5mZ3mF}K0!cpl8)K={JBO`{LY0gAJ&R&4DB;?T z^iOg%BHn~gFZ;NRsA*4PljE%k|KcI#p?RDkpV8v4-bFqy4k|25)49tPH<@U9ZmE=7 z?UftJ$6+VaF;bVtr>1kG-!JVApFZQ|T6d#{>+Y$!R@TN}ZM7ijuainf7T-}WqR`S| z?rgXz;bDo=ydo|;3$i+91UI{c#;t~UkByHnx%ti(ni+vfhkJdOovobc;U1H7DjK1bKI9qs@ED_6= z>aVG$I8*60A4%0qD{uOIPx{z6DF59Um&F-mQ;L_0bCc1(^)*g;E^ z4akQs5p#04I8p;2y3yn1Epx#)7$1@oZW7B~!ESu{^0dv<(G4+s-+{0*;&qKDf;dIn zX=&M<){*JBo?GZVTK`MQ8ZGSMeyvc#boNA~SC@A6l>pK9l^+2&Z;9_Eqr}h)=frdu z(jtU5yPZb^*S1UgJQ{-$Wh{+AI<9iga*mN+*T z=7gB$;%#@>4X$F7&nNlOT*4YZ786FVEUnMZV(Nl}4P@_@7tp`kVRGa{Q}r@AR8&;n zqPP$F%0`Mej|CYpgKL#bglt+B4%Kc`ZnvY6p08?*y?sRnU2h0NkJ~(u{Flhx!a)wL z@uk8Xtc3;&`^4?sl z8ldAY+8=P)t|vPzTs2;E-|D+eB|{521t&gcHpz-v&AfgyJHxdTOVhr{yCWqD*GtFB z!y4W+d1%XAa_NFzZqZ|jzb-2Z8+l#YNx7-`{KwW;F34=Ked^6Q2P0VfNX>`uO4^i)g$k6BuonAa651n}sN*Bxnu3<3E?>byM6`juo zhch}_gt)1yGymS0)4wSW4$s^xPjOVSmTPU<4NBGBo}HZRa=!NR^|EzPa#6;I(WWWO z4FQ=Bc2%zq*xIHlzlBWG`5wn10C?v^feXC9T%g_!Y-fWL?#7yU-%Q#?NT5 z(7NZ%S(30J%scnpzakcy#|?@)+MfT(Q=xTrN9ZK=zK*F(|dIB#5W)i;gLvR)_ zom#|3yf@G!m8)jjF;AI9GM-W>bNC6=j1UkM-`%q1q zdvnbyRWMrI5_6qV{&|d4V>SIPS`%)j=(RLR4NvYl+-?NEP72P*cdexF!k+a?RX5TK zCj2rHqM~;T3ewjp4es?O@~wk+NskOTlfSzpF9{Pe{qde?m||azPrcH|N@bN8`Lj`T zP^Z6757%xDzzhsYe<((}vKOGVQ^IvgTAnb&vlz6@Va1<)N|PjaM0e3xX{GA!y7$Uf zP6`Z+kx)o$;~7YK;x94>LknCW^_>tn&@Dah*q$fYp8IoonzfQ9(Y;eOcg-x>OeR18 zt!mFEhoA|p;~|0gcs$7nJug0&%HhtVM`CIJ~_p z-abnX-apCFv{`1Re=z8E&x@#$+N<8&Qk+-v&c|iqMCL?3dES>dR}p~kPk?GOX_VZS zQ)W1)JdWraYb`!`I5ad=Tl@3tM#!6olK#$~YJ}0g&mty#UI)VLowY)Ko z$CC5)PiNUcPVlc^?;jtfW;`zSlateQvn;Fub3EKdLHO%h5xX25(3bdV)=2<6e4I1x;aOG!eJmo2t^i z+dgHosSk7+jNaYdzCQR^;l0C6TdhxY*=jY`^fdLqUEOPVJpSj#SAI|y<^9nWyhQVw zIgExTO(sp?G?K&Bwom+mPYygl#ML?FCh%MPXoBSx2So9=_s1+%i`8yYxweW~vF!rB a8%)T2tjb9Wt<3L#>E6oB9@SvtoAQ6+d67f_ diff --git a/public/img/emoji/sparkles.png b/public/img/emoji/sparkles.png deleted file mode 100644 index 515b133eb671e5c3cf37d60ba824a4d314e4e3aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 zcmXYy3pkW%8^`}qoAfzEVae8hZME%{R8rd)o7qneiR4f=ImDP5#;F|&QJB6G>7Xy$ zfwU}bZJ`63C`5{J8fRt*gB&v$reVf>@2l^+p7(j*_y64Y{r}z1^}N@6(caEdMOjxF zfQq%1xdU-GBQGUIVov=#W)x6_{Q;+amca+Asi>#ny)&whqtYD>4Al9c$^+3rn;+^J zL37B>V3eagUdjT*MiO<;~RX*vRo?OQ&CG;_@LdN z3~u!!=Vs!Si53RRy~r4%GEsrZB8rd?zNqqC5PcVvFS;)o(8MHH$?-)bjEHywfUsNe zB{8V~&uSoyzKBE&jkF`PywFTXS19-=zzbMlqkljW<%!;*a(KlE0M+zCXHx zNVaBTi@edv0?(ghAizGb&_S$*kXb}}dmscckjqF5`8?#akV`Rg8yx}o5QMo-^synA zKt2cQN63cJ830Ke`a&`N3Qc~HPh+}_^qu8FE=Er{Wc`?Yj)^CjEQD+v^Fs7RW3~&u z5s>ylCIl}KegA=&1NkHdlQ5Qn&z0yth5ifV{tPEW{2s$ekTgS7jIneG@1r{igE0{0 zK~e(=7gK*jT!pcln0$cYIE*D@UWA!q$VM?$009g0lbET1w1;evVD7&N2_L;t==~M5 zt(c!iZ!l&%FmMv%ze8M0dX1-GoTzpavX7X|#?Vy=PGaah2BR<(k0Cb3GQnqJx(EY_ z5N2R36=P`_xr2#J2p?gl6n#-2mxJ8ZUTZ!zY&zY9B8_CV#^0PoxPO^)iY%OV6% znsOvDkrRI}I2)8XaK#`u^x#$L)Q25W!|dFxiAR1|^W#H-RY`66zj~y< z7u}F$Rt(PNjp&V*3`AG*+b2HFKT2oKG?mAEDw!yZ%aev5TbfCHq))BQDNbRF`kNF( zzO&X@Dm?4YbK&I&qy_L!oo@M4Fmb@2mw!DkAoZ1nIO`?T{qDG!|9#{ex5G1QSs~}{ ztyo8)`7WbqUZT*v6)D*nW;FUzia=_nr4EW}quIcS0)?Z+uI8_f{YINz9kh9|MEmhq z+&`?=&L!kGO@AMXhM8-iQ(Y8#l}>P{^CNAJ$8g8e?K8m_xq^A3&{ zI3zbUX9T`}(PX3~eij&*|5Z-^CjAFP7j79AaqmC2yb`#iIP^EplwqXxOL|A;b>FOR zv6*0Rp{>&RrRBU1<-}6MZc+R3wQVPh@@GEp6dE}=)hLv9SLNnbm8uK#yA&4dX&g+k z;$xAapVhZY{PwFU{9Gd)=|DV1xW6k~XDqwuNJ)^0^@k#LsL$cSvETYt-L)E*DM}>g zoE}?c*(QE?r5af@w|Zp5NSWpg&1$`duSG~?kFMI)-Qh7D#{6xUEE8kvA6{1`e%z3H+1{0!)MIIu0w0mB83$;ni~r* zoo#D=uW@XbR+#^MIla6$y`G(D9D2gd;hK2}+k8Xk#=XM1oR4CxAD(P-^98>8>nkKzbPvCddH=x;49j{7WS{uxaf4( z%|s_8+3>hpd0JJ{zVy{TZ_Vs=_o!~pX}xc0VX?mAc67t@3D58=hy3!YJkH0qaEx}l zX}Bk)@by2b>_6-k=yAq zyA7DvGGDKp*I`8QCbc(q)1KJcF1dV9WSWt^%tImB*1+J7**nhce?NKnL{>!{;R_mv zhkMjLN2YF;HNEXk_&DNtoyWPX-;|K1Cy?CJ40I`^*QwiYHFg)B3bj0VBbFUwR|S**|;6{tw#^la&Af diff --git a/public/img/emoji/sparkling_heart.png b/public/img/emoji/sparkling_heart.png deleted file mode 100644 index a1b9697717bdf6992fecdfc9e334edb12f896199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2724 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 diff --git a/public/img/emoji/speaker.png b/public/img/emoji/speaker.png deleted file mode 100644 index 89fcf620fe2d16f98941d544f39937b52dc881b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3317 zcmYjU2{hDS`=7B>YGjc0he#qzb|S+FF=UysjbXAgmW+L(v1Q3tw(OE^Y}vOggF@Mp zCF`JUkq~~0=Ka3sJ?DS^_niCO=XvhuKIeHp&pr2?8~4CSmz9Nw1q1@I>g&NxfmQRr zlZh6Pc`e~PAP_C+fuXsMu8$$$0R{~X4J|D#0|UeV%>OUJU@%|;TTm#Jk&zM5>FDVG z4*;C{pALg*0SXWYkQNpefP_HUSXfxZ#l-~$1=%2M08&g$jGLRApP&Ef)29f85i2Vz z-~liR35f~{3jY29GBUD?ib_mOO!D#y^74wn5j8b6B_$R~JG-i?8r~N#C#N7JBm|_#$;rvb$7f_@ghV2Zjg8T03;@7j><~uAPR`DO zLBT#g-lC$St!-_-c)#1XZwmqob{@4b%vL5eS5*r&m~5n3N!O6+#(Ia1=9H6@5;u0XwCr_Tl#l^+P#|H)m z0>Sh0@*Nx;BqStaVq&patc#0_g@t8i=1Ub7mGJP0l#~>JE;lzfe}8{rVPSwnJRYyB ztDBgZR8UX|r0wnPt)!$3FlJ(65)~BFF6V znf$h+qqerLw6x6D))t^BA|kS_t$lQK6rgu#XqcCmcVJ*pKtSN{U+U@UX>M-O-rmp8 zpQln&GyD490rw;$Be$og_sf^L)zxn`HE$pg$i<5ncXoEq&dz`RI&N-mfkN3QCMF34 z0&w4|t83QRzkmGrp}&7%c=%Ita{9sorKP2lOddEmIPB=?TU%Qj8yl~!ZEk32qfjU> zU*@f^ub-Tpl$F&~Rn^FL>@KhNvSFl_)`bn`PcG6T_b zUcSiA1g4>rxvs&?EpScuAJ{EMGbMS7wwlV?&BykodL%>Zbi(de_gddSslP}~na8Wv z!#y<=_Xz*encP;&>bTO=*s-pkQ*SNL2Nq6FKe>93pwjF)-+ZpB77&1&N31nt7yH!_A3q~JTL#vH zoL%m0O}N^Qb)W26pY%3loC(z(ENxIj`!1X;cAi>n+l9?ZPmjuEH6PYcsdlfIALm;d z9<-lXXTidz77d=LP`X@)cMPUKz01XB6N4t#?Qj$wp5$)CH#biO6OJkI87nTT7FoS+ zI}2m=kIWR$CEk)F**UY!bK&zjF>QPPYFx8Iu40>&WQ&w6srwIC`p*^U>{F0+;`Nra z=pKr!DekPV@(GwS@qODIaqZeYGgRWhcRy83apY2J zcaDoSlkj%wJE-z$opK);V($@*;+^mvh?k>9FT*R-%dkFlGgjtbzY0@)nAi%lMLaVL ztk}K8^;pyNR?svseUY2Yo5E62#OG6PutmEuIv+M%J!zVJ)AXSSUr9+)NYx9FP?d1K z5s#|((AJU7Qp{vC$4@JG47&HhjhiAR%YqP;2~pI&Yx5V8(3J05D&F6F8wwSHhD5_L zk;tMp)XM=&mB-fX9{JdZjxnpLFGJoaxhm#l!9;YxPB0Nox+c=rmQxx2=ViK~0FkAK z7Pm(jgyP^=vb$l*wRBzrRxI9OXMT8ed7nL_ha4I%8keT|>OtJW{f3cBm$WMrOl(b^ zzds(8iT9xAc5@fzaQ3`GcM`{D%2!17AQ8PjkO`lwOG{^D5_o2EZhj);2c}MbFlQzF zF*nn1!6g6qKReqcyQ`TTSkElg)pK(DeOHP4G7vXJ%qzr<=@Q8!|!Xr2{ zZ36tYRwvneB{CcClp;K!B_6dUhI<#k5x9%kt8RjQrMv zdmH~`N=uOw6J!1m+O6;PO+aM6mlmElGW=A0WOn$f?ln>iTO7Wp{rn|{fs<9tfWPUP z(!051mglz5w*Iml237^zEh%3FIcR$fwQvmKh-JAFfl;h!{UJ`)$!54Mg^PlM46dVg|sUBFTK zzKz5_)RZ$rW%G|W&X$cdT=xfy^$LZ_v!60%e8ErJChMsUKh*h^4XyM!z$xu|v5v^_ z`n1%A>1i8C`XEoCa7q_g5T5UM)F*)l8N7jb%}=T%_3eX#n#|<6J(ca1k5j}Px4Xe~#qr}`+PF?vH(szS-?(&CB3f)7zb3{pg5)q5tap{Pdtdn+M)Y=1 zp-_XgKEZX3e5D2xxiJb0~A_CpS81D(nd z$ikrJ!@t(*NtB0iadB2WpqtX*u|>dHI%f;X!XEI@$$m-VF6VNAO;jS+$7jg_34unG zK@excI~EmI7|!4}(!{jyTl+^CEFcfZvgr`{Y!D~D*Y4kjT=31<9{)H0G;dL#Y%W!v zG!@sA9R26u0`_@(T7fV{d)`qKr5vl{V?rD$8kZWm)q611i8$1@^ITSkfhZawX??K zXs}i+K#FCyUma?eR>*Fa^3Hq>u?&v$9ayquObTRW0f{pwe8nHoUs<>Jf8m}c5)|iq zBYe-pbwKb%%SO$w?QgtZSU-N{{;l7>ObkKtJO)koD<7dV>!1evAy+<-8@EJLXg7OF z{*qpkRymxA!}_5QgEf}FekQeVku=Ii5|xa$oJIWSCHt-?FAe`P1)eZbVrEgQizlYO zJYl2T>%5pcBu&s*)SEA`DfxgDB)X)DXM|!lwX`;F<$wene4)}bRhUlqZ+6R+ z>s>ov_P@b$S*{{cMa-r3cfJ~Q`m_39H74=>iOhF$ytDyAy}@)k?;aqMu}s-Dk=o;M zB~Sy3Ho8dani*!{dg-KJ5KT{9ZG3$QNp0s%SfJS@`;qJ>-pq5VsOrb&{iN3pi@GY+ zp;sB$qdni>IT?GRV~ag}ZyW=j5c`?qzUbjt1R|NW3k*M;~6LcQWPyTTPKOLq5y2%HRmf z=Nh~^RKOPc`^b%2U}l_uR-UhNg&sOWLv8`Yc7`7432* z@ezF2hs*v9V1`r7?+Zm~fKYG48MN$IS}(5E6@PCRc^@G3v#k9?yk~Mw@KQ%(ur|aa z;r1+ux!27f)XVvPx|T!|xu=85-!oeVWb$zvykSI<-j8f67p{Vv9yQm)qHD3dBUbk*AE&s$DfQB%@0`#EG!lSk%fS=5d9&vL{?f&BB_-^#89X<1PqBt!-BE3 z!B(;2pIQRNU`%OI+!)wqt0;|zu0#_SiUBpa8nT<++`V`2*W8)$+=usYX4t)(dlS0; zP#(^iy>s@=`@HY-zGvplSTXQlg^mAp0-64&yfl&>vj!dD0SuErq7YYr5bY~VS5CCv zCjzIoWk2KW^u{tfw+=eg&Pj~Mh!lVUygCM&a(L!GbKtwf-~Zl+{#iP=WzQfwC}IGEs+CkLqQrA00sn*J zTRIrpa$w-%kN*17(?|S!jKE~EbS!ry@8^(JaFJ1PRI^lXDS(asOCKXdgf`>QRL2II zs?}~Zj(+28-vmzXD*ddmJ&!DWcyLwAz=ll%#(Y`?P=uHy0)?h(ia-Z%E*|>MLLU-5 z|MbA`2DTR&>>`na$4Gcxk!53#91049l!>A}`ruzq?&_JqbCbm%mb}i?JPPo|crHP} zWy=a&`7J~gWCrICFhh#l3cvaGL{DXS^4WoB={NE;Oy!yTHuZ-{0O`|NkO8ZKbK0=s zau$o$kIzj$a$@E#5=R$%f0chLYPAoBxHFu zyuu_NUx&a)_UA^GaVa$#mVTq~8$__ge~TovM3hCrB>_6P|EZ%to?nxMxvz4N+S_ml zTYOKOH@X`{Nm)3Dvos`CU0y%uln$<`fJ5XgVQbG*(FVd=z^K4HA4+p9&`<~nBmpuqmfp&jWQfV*1_B+D(WkEj~~Jt0mE zkct$gUbG!#$8j|!fjiDYVQl!P)bAOVZiG!xOoFwwD<#3f(aezXUE&~sG2b@@lfF_r zQra#uqbUj8osx9x-R0T(24_XmVx2!GIY(0wu(sQxy9v0RzVG!3Glyo`LdN`-=3`ob3PDb#DP&HLBsE6V%h4m`V^Y}IF=CO}+ z63rbrbFwkdNZfavvHEWI=#5^w`oUrG>YT@OfrGO!8E^u8g+ zYtBWS?YcWcD93f)gmcFIXd@ofatC#9w3w4PC zwd3)=yr=mjkyx8Y1C80#z2L&q6PIe^O*D{4gaEdFuw*ns{$dRJGEX;B2s*x_q0pQ) z5g=BlYFI^sTgp%-#sZ^a55|+`2}+^g8;JQjs?%u#D8E(-S5X%k0&Un_LSKGelLpX= z3u2n4`r`d6s;FL_zF{OFF3#_rs!UX6AIz}BqDCQkS~P8Kq2(PF`qJlrS)3?v zPpn@=051Eui~sTZl}{3;^a2Fby@oQDI|NR@eKSo!P(Gf2*!O%sn#+?h1t7Et>2R<0 z-Yhw!Am*w43hpQ@RhLe7*&Dt!x95ca9Nz~~^^AF{kxYOf>LLM~S^K5#o2V(QV2N1% z);sfE2mt3#J-XX_II%Mp0c=S_V<<%_zVr z`c;fA{yTcBZFF8Q^lYRc#sjp(`#V^~E!>*BwKopC5g^{Ff9zAa7jn<|Oh)}$hFk7r zmYZhcVbm8i(L#f%cL%qzh{fykpZ#;Wr`L2}fA_;<4`M3@kkxTWryr5_U8}E)ufgCq zu!7}I>f!d~e|_%S%^u$s*M3_cYjNqY%`zm~8W9YsP^+K3-?8p1lKaaqE*`(u0(vA6 zEYQ4aHe$9Ifq7g>6{cCRb=9|NTm_${S3&u5`S2ev_4T$q3aO&3;g&3=4IU%$9r{sQ zFS=|rPXb)`Q2l-72Y-0I@7ML#P%QqmxQS?>Nj>Y#?KrtzHSfvUGj9CP#?0zW<;_3M z-P891d&FWkx2SB3sZ>#@qj@7dgQ0l4HDrxiMIcJQs;@WZ!uOhgYt7bY-Ywt92Mc$M zubbpfR>ulcsf^l%g}rZA0fSE$y-^?l(74GJu6J}V!+paK{9`LVfCBk7QDr47y#Dvc zueCPeqg8f~2M0g^-a=@8S(%^uVt?lES%Ull7eJeZMgJ96&P;td4mahq-IsQ_;}(E` zYdDRga_U!NeiI^4IA$~R+Xz|Dm1^ZHzc{;T-wh9rXAjt{X~}`tmXA)|1U8Alp<(Y0 zTWUL43eMI~|Mc>vemS)#tjm}W>egI1zkK26A@F|V|6kAl1K#{K6_Nf_6#xJL07*qo IM6N<$f_@GPr~m)} diff --git a/public/img/emoji/speedboat.png b/public/img/emoji/speedboat.png deleted file mode 100644 index 037d0a225eab76778628ad5af78fd635d20703c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2226 zcmcJP`8yPh9>u?7UlKyzl0+nXmaGXgwloc6X>6fFg)G^NjHQJv5uq%XLZ%3lWty0Y zvX&*;nq--o$Tlc1qH()_#68b*&ga+j!+B1!9mYyXV7~wW2%WMvxBpAi|Cx{TZx%Mj zF92|Y9oo^tDj02XRKm@GR}lflM`SMBf*k*DX#qH{Z>6E2_#_rI0W=U00l$tat*Czo4yW z;h$J_RR5wbChB}9!8@`vA-`GAJmMxEg$9TN$Wl0XULCx2;kpwb07f1m-r-@s3o}0u zyxGI~?fKrB!JG#+(3=Xe+CU10r*06Y1bQ4mCm)*`c~&vIUEu}fNO&6qpR#~CkTpI~ zHBA(~YYf%CFx7o?=Cx#rGYmb1LI+@wRTgNKbDdVKsm9-Z;ygS&8|~mK0oOI)zBM!i zLy|6Z-+^(0a4HHWhnr{HPW~AXVe}@`b&t$7%l2x@v->zEd$a8wTn5Xzh=G9OfdF|p zzmKaw9WZ=AE8oQ!EHbymI*Y-FWXM24}g?++3^=QdS_oL%Z^oW<_1DIz;JsuF-_nF z9y*f1R|c3ZnlqjDf+E6egJ$=J=chV?nQhkJdQ!$HSEzFGl?cQViDS7LqA$vI#ld2$ z>NM4GOj}_>N8x8HJRDymtI2)qFa6vSHD1L}+ACeh!`DsFeUl0kHB!r;(7U;z$sd%I z6qfpNV{bfFx#0^LTQO_u18303X?|ypscxJ5WT{zTv0F&|BE}!W4dU%B7 zoJkz8yPCAKERo+nS#=xgZX*)*N)`g>95-ouD4pX8olUozvejFweEhXQ_aBgukU++y z`_y%19+obqP~#{c!#=Eyv|=m!sr8h5g8^oPxC8e^MQf4`NNGmp@j5vXYCaeaxo=~p zf2UR)W{+_ICB4vXFGH?uA@=6Wt@5l?JbT4zMS}4DGHSE`GiB~Gn_-(C1}D3fUEVCxtU`WV&M~KaHtF1o)Ww0 z`=I_Rtv!g?p!sb2sV?2@YGa5Wt)a?=He=~uM*lc?WM3>xVZ)PHQ&SVQ!mN-%#iI_j zkLTWN<_^CLEPh?7BmLibt4S>-9>vFusNQp8jgMvU{1HovnR<_8o?X(r7!;f5#Wu$O zw3__-258$Pwr1<*;!XsnRg5jt#A=Q+<_&80yUye**IU8t*~qmHQl;?hI>tJ|ld(0y zkwef^H*_DuxKw~@Lm%HiD4?lnTq+fWlnw)MEd+kE#^f`fB$Y$-OAG~%uQNn?i zbPw14wRL{3QARuI+uJeMf`291)bCTyw0;$`p2=#;O(1W+td>e6r(a_kGfHizzS-ny zvqt74#RW9%!k=M|`{^7zB$8w^!s_@lcD}OjE6PJ9%ldsuA<}yyn;7gE#K&W(Q{YhX z%FQi}o#q#x7bA_x6S4b!HP?Lqqml2kvvaN$f{x6XrxWWQ>a&++aBcW>6Es7@;f&%L z(t7%|+~9Bycg}IyEkeehup5+;*&tdDy(P@k)AJ(o0WL-wHfSfK=Ee%Qr`417#a-HJ zt>p=~TEumooS2S>{3$6ZFVfu0uEo3`G4HB4F8j$+N}Dui?H?u=^&iEoFJneFZE9?f$;_tTpE_DJ=F zW5f0`WxNsio5Stuwv)=GT^rkTe)61}VGBaN+eOXBZDrS+LSttpwP5lOG4?pNL+i@{ z?Vih8F455j#eKG@0<;l-Spj;$Xw&~nj7#~bu9Ch)^iGkXk&&T8Xz!A6Kl$RhydkpTY6*uDdE-xLw`d zzbHl5^Yhb98gV1ep-3!rYs_ zNp!IvSz44(sfE6(NzG6BC+?sK^h0aNsx*@>8@4gYoAA0Qad*_u$C1)&*Ry*n%|mJ< zhIYO9JEJ~-@X&07_hHKut47cpgTzANkG{!sUn#^F4hN%_a9xt4-z?fGfy%PQl?<-G* diff --git a/public/img/emoji/squirrel.png b/public/img/emoji/squirrel.png deleted file mode 100644 index a5223bb05b417ece75cf9d0f1b79655fadd59a66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4598 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 diff --git a/public/img/emoji/star.png b/public/img/emoji/star.png deleted file mode 100644 index fe66e1425c6455c9abfab7fa1de94491f3b3751d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2188 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 diff --git a/public/img/emoji/stars.png b/public/img/emoji/stars.png deleted file mode 100644 index d6d8070799b06daaa03e7245fc668b37d5a8a24f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2663 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 dUi7k1k?Zk002ovPDHLkV1l!-A+`Vj diff --git a/public/img/emoji/statue_of_liberty.png b/public/img/emoji/statue_of_liberty.png deleted file mode 100644 index 3b712dd183747d4978528a85b73318f9d8e96f48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3127 zcmV-749N3|P)gwwK{r&az^{eCl zo6G;F-TsE2vaRL+{QUgv?Ckpb`l;ah`1trJVQZ@3{)3ybCthePWpOKLa}Yd4DP(S) z&i@fdP$fo8Do$1*LrEx0Ql#1UpV9vmO;sLCQxQZ=4?jt#-S!y))^`>o6Y!pqqzw#Hw`K= zO>u&YyzW<#sglC$2O%d%ijG&CpI4`;Gi!YvWo=HJo=KyqG;??k8XtJZ$8^xr!RhLe zzW9&A*L#|#Rdz&le?L_ z&5*XiU8K7}TyloE+$({IJ#>d#tid;zvTMo7ZKB6vmYg=Ar$4H+QGSPB!^hbA`b@aL zf6>y;_V!hjm>(r5AS*DRiIn9lEhyVak_=#8%CPHl5`r^+#do_43yPlu{CRbpF{ zvYyfWrq$LfiI8D2=;>~+usTOhn#<3Lvd)9B$VZBwMQVpdnYAi;luDGV zMURtoxVe|;_^LVPv!`zUdg+dMvk3zS! zG#gx~1d6P(3R-XHb+^^s-Q8X0?(V+p?_Yhj-ERc_eb96M1Fl~kv;rN!%6@vpYGvTA z=~q{*)-`wyjQ+C#{QV!``rx;rO`u!X1XU+Ct?X8I>TR!|!If2a{`USV82#h#i@^5n z+pUHoH-okgos0VK=9QV%#9TO=xp`Gvf4O_#3XE0(n>KHqYs-6d(9NwYf?bQbeb#K{ zJ!Y`xyB~&*uK|uP0v3^~;EOl^Kd@l&&)+_5u~IanD z6>YW@Z208)+g=uC%b9292Y>v}S_4?j2V+6l>Pj~=i-oofg`NNPu*Gul;ql;{ z3V7yfVBfxd%YX%@A|_|F(rrP5kt)Js{`7(^?J@TRn&A5|3jl!8YJg?25X>BZF8^#L z%p4AfZH|o24vTqSj)Bh;FiZtq7+kyEeMo{W0AREV_=#n{7z_@p zM1ZotNN~2|C=AXm*=`R4d+kGa24GGwN2Z?ab$UE6`0hG}sw>#N*6_p7IAWlbHYh5ClD^z%-z3}Y$V&am8 ziQsb-PYDDE9qaSojor!e+W;V8NcMM}q0{cIbtVy4`nEO{ zRGZ*WQ-~;7av;w|ER}LNEg6@3x(hh~(~!wnO`)r8!5Q#E>wybV)eQ~R4Wk6;Gm1*Z z(g}F2GzHWPfG-?yMT!uKxY!6LJt5kDBVas#tg*4N?GvPmlTs;^xxG(vlH8{l053y6 zCnfuc1#{nmD$FT#Jz!~R$)KUBSgtTwQm3F(sc3?WI3zBvw^#lp!!zThkB(F5Bh`X; zpeaMBYaQ(EANeW4Xa!*XYj$?_g_;^^ScD0Ura}a~SjXYCzkD`XG+Q)jjBDperD746 z!d1|b)fYprUoY{pv|b5V?z(AzXy?vD&89jL8cpN#@Vb_XiK1@rq?u;}Og8r&6dw=I^DY<+&GXo`cbP zz#*s%OH=U;1OSNR@;bm*kQdjI8#|Nd5h5l+XewHS7~KszbaU4R04T^rQ$aWo4=E%8ia-a4KoH%2l3myRAr#^UNr^C*jzQ?@Q0>^xJIyl%|uU8R>JRWZj@bT8idw9r; zi+f|^JvdrC4x*vaXj9Mzz_xAM4g+B4QQw{A=WzrcAc%MuU6Q^jJUqPnk2HOrhfa$p z@X>Rpw`B0dLpH|_gVAch1^_lY&#L(6AtH|m0I5%2Q+j%MdU%uGJ65bE68N?eWf6+D z?}rZk5IAZR;NlA5z;{T*YsKP}Sh-vtZ~A^_&qhE__$0|=H?6qefG-G z;P!uj$K&zd2EY|CHWNwB$Y!B#|3CqVq0`A1XK}ah0#N!Fphh_E2EMRs%(&>y`}bju z_CM$>ku{{`4!a{E2p&;;fc18C+fFVwdh=%8pEo#8lOzcl2q8m4lGg82qfst*+s){$ zwFhi0%Ik(&Ti<2*I^^;A@pwFbZ0GuQS>CK+Xs$ Rycqxh002ovPDHLkV1feU?3w@o diff --git a/public/img/emoji/steam_locomotive.png b/public/img/emoji/steam_locomotive.png deleted file mode 100644 index ecd6d50e878b08c4edb49766434a18927ac6ff6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2703 zcmV;A3UKv_P)dB5D*Xm0009611A9iF)=YD7#JTQAU-}m78VvZHZ~L#6e1!b4Gj&392~f~xIaHX zWo2b@a&ip-0Eh(zVP9ckV`HVIrCM5AL^UQT4h}^{MQQ*7hXn@84hn1l19Lh#mzS5g z3JJz>6tO(IOd& zii$ZoI^iN3?5oOPUM` zAR8HH7Zo`qBU4*zk^7X6|Y{KFp0a~Il(9XgDzJ{lG+BMehJ8fRx`#F84cq%&(V3DKq+ zdU|_;Z$s9T!hZKPXgcQ$j{bRb-WaAlTA=<4ax>1vz3Y!(C#=#X|d&N?Onj|661H27(zzXsE4KI`OI1o#EJ8d{K>V0JIT_^ z(D#b2@stQETJ-<`2LMS#K~#7F?9~I9YH1wD@vd##w%66^OxRBCvvIfD=XAonvCDcY=5sbu6hoU&a|2bCTAhnlY*tY&n~fpsasp1HBnHoCyd33iX*(!GN`kpFpQgR_ zigE&tCVm-1dRtzOVm7@%r(gq=o@N?^JUu67d>zgHImNlJcU9N(=Q)A8+(4c=t7Orv zn$V8NQPZju=y1SWuN04?&R}s+V#Fj8yg<-7_;VgdUK_PTg#zdiaOCOkGJu3pmEP!vke)o6YEDWa{(60%GI%v3y`uoPj5{(VBhEV zrE>!4F(}MCAdtp1jTPvF14%G7;Q>%9Ex`-{EqVkI0e@0b5)L?$00f-jfwC@h0t8(6 z5pV*7vjhGfqddaijy{mmjPpeV3fI_iE5W?k+B7mC96#3Hr%xX{3XJr_bVLL|Eeixx z)k;MMBtvIw{C>ZEEDnIEfpWTA<{eb{BY=R64cP5|&Dc@K5xqy+!AJ;n=L8B@DN&?I z5tmARo32p=YyMG3JPHn$1&7Xdz<+7xvw`&*91wE?ixj2pBM2h!X7!~2ftZ#(?E4aL1q7VIL@em@Wl!JCtU&pA zD=DY=VA_jGucomB=F2r}mZhOd-DIyw5+Nc1*(>WnDq7lRWvoOR`(ImEY|ROr-jx$L znfX;TnZKey?aH**O6v%N!4QBzz<>mHp4+v|gyuf_i&!e5n_^{}c4?oh!15a_wk~G} zObFb@bF=pM0-&l@>q--J24illxG{zuFwdOcWx-Rx|ARo;G7v}+fHAM{zZPI)&P-Z( z3eS{fCuY3;F4Ef>=d)hMa@D+gfd!0twdcSXcECKfV8JQ817Z0s*9+&8yOZ za)A+6?UO|L?I7&U{U=_&B}=M*U^D28DKhB8HR`RpYWAx>LXpquqP{ItGY zPZ6*h>^wahnj1QTuid#h6@ejH7?E{J*+>z*p$f$SLS(6}=4l-umSr=T^pq5M42?dx z@qGWmgZ<~@9ojpvAe|sm3_MO}0m^U*!!0I)Mh9B5$w+xC_t7Rblj;e2Qu}^hp zW@hK++KxaVAjwO55;Z6}>`l=4L z7b!&6P(=uT{)U|hLwVN$BwYtp~-Nj=zWR#r29ZfmfSJJkMip+Wr*}k=Z zYuDIu?{E?0@INI#|J*vJP&^*%?Nu!-a6N+ueZ9Riiepo9{Diy*#6_9{UpZUBev!Pz zH2|dN@Bm*t?Aj>mA^q(vc*K!Nk6zEo@Hj_5J5Q4pF@Q8J!1eoTwmNgEVwvJ5cn&x^ zg2u*$BH&_k0vrJc7(vE4x}7&j(8|)1a!I*05r{W55P`O~@Jr#2wl=5mcZ`DsdWN4i zk7!e+r@M(5U(bL557^Jv1Aa||TZxX03GlSFnm;sOn~%IbyaGUf=2;M+P8$FK002ov JPDHLkV1gS*jkf>* diff --git a/public/img/emoji/stew.png b/public/img/emoji/stew.png deleted file mode 100644 index 8af938f3d1c168735625a95be7c5ad5027e664f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3115 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 FV1n$<$gKbX diff --git a/public/img/emoji/straight_ruler.png b/public/img/emoji/straight_ruler.png deleted file mode 100644 index af6495ee90f629f299647014371461d26dc62888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 zcmV-03D5S4P)5$X000000000rb&LQ200000bAX$3exm>Y000020000cEmb!} zX>NIxD>7LvG+h7y000000001Kbd&%900000a(kdOJ!w8jaXdtBH9Tej003rhkN^Mx zFgarY00000069ZyYW)Kn?IYMeYL~Kh@dn77JOH+6)G*gb5 zuZWebkeji9jiq;morRLAi-zFTRBf{vwVbdOwXhx{PZHAnxynT$NgpQ$QaEhI( zy^x`|qp!h`p0Rs~pM#I6ZhV!5m8^1qm@+$CXK;jzo3m+jjdOmHe~FxIc8NnvZ%0pb zf{dSRcaS|rXF^JAikYvDpSDd_e37ELPg#FeUxka7tbU52hm@<3o3M6+or;;ThLEI8 zR&+^IabsthdNeT7!d>sd|Z^gpsLugPDMgp@fyIhmxg%i=IkTc!7(Z zR9=5lTzy$%gKc}AkDs-eslQuhjhCprjFqTcW`$m8d}(uvhg_->0000+bW%=J0Gykf z0|p5J0s;gKAe$Kx51S$&oSZxqAJr`~o1NFzA|%x(oH$n2)SOM7LPupRabAIXA%N8= z)PB{}!^5MT=Y*XxBG=<;jgSBU1(``iK~#7F+>=v)99a}V1+sUl$y{}?ccjs^4|2cKuySGOCKhJv~+;C0&%^x~OUw1A1`dWyYvMN@PJ-hSa>muh%;wSo%fzK3t-_bidvWB}JC^kt`V&cET8>lm9c4#Bn2jC^n z-B?me%&7+Q>d?H6T4)HL7qTSuQf%mS1D_IL^nl^IaQP<-@{^N=bPnEt3<>-|>%3{^ z@MZzLCL=$Nl`NUW!G;>oyhEUMR(LxJd>m~;Mn3Co!zlxw+BYjFoSl68$&5_egb7@{ z0U6FVP?^)Jhe{SC8%Qe!&c8AY^W?>2;Yy3)36G7 zLSb=<@61xKj-`@v=5_QwOw<5|I5-*&Pneb_NuT0_VHV=g5Ua4czwdC2yn&#hqH+`B zae-dKo{}Urir^XcCXlJr{eoGuts}==y5YOX*ptzXblC;toKkSD~sF+m7Kz3Cp zQNt+%;^lfU*h{4=(K9q9kYkwvN)0j)H|(qC@#J#3zF3`}Zs)9oOVqDG25Mk`&8#Xj zaYMyEz>&b=V6&aO!7#iEF2QFi7>Vn0ay(ZzK!c@XpVcb2>ecCNwjB&cxP-q5X33;5 z{>tjAggDIQ_2OPE%37ic+5lo_pL`Ihg33T5bB5r82Z0L2EdzH%6RIymxFoZ6F{wgXZ z)T*=f%%1TALBri`ZR>k`dzE%1Fc?fp@o1K06%#IzXw%KC(h?Z1M+PMXXgy+s%g|t2 z373EbCR`#>_uaaAGkaemYFN;=UaQr5kigZ@Fv$paAPvSUK#*9ob!+xa^Giex3l^;R zcsw)2VpoHSK52>w{>nl8857-Ex?{7dv|$(y&X_Sn>~aBLQc_xo3aFH35D0X(V?S2S zf9dM~#hAMn96sop;hK;5DJ`Ygs)WH^OiF7A0_to7TYGY!d3?gXZyxfuikR6yRe@Qc^3 zEkS6K-PIiG za(4;pY7+96Joh*uj~eF8`33WxOfh8)KJF%J!o9NBhs>C&a!{|weHe>8F)H7wiq>-O!xZ^?^}M-9i9{|bC9#J`LFe{wn8X~f++UntS7j;dx%4w+YhbK1@4gjiN`K;EEW?0fKuA!!TZ9_ zNr?y`VodZmdy2tHc#1h|lO|Qo)O(%AV!xh_8=Zcyp3Rg~CTS%A(|7!o7ms){X-@fU zqTd*dCiB%~IvSihdWlPgl_>bn{nPnd4W4R@DOWSudLofHjaM)0PU3%#Kc!cNg4Pjr WOT|Cxtvfpa00000{{R300000003ZMUIYi5uQ*Hr19=M(vB5%N zdK^Vv5wyWaW`h~N%S<}}0vZ4SN?8qk2Ml2Y2Z9R^n5;UIs4$e++z%YI@Gm`n4inHOG4w7x z>J=i86dKqO9i6i|_k))2GDPnlE7=z!(iS3>7$2q~D)UTXZwL(L5FA2V5BGSF_>7)f z1PH1K5brBG*$ETrBs8riFv=Jpj|B^a3lPv9D76t9&OJ(F1qp}~8C`T4R&W=8n9=+4jQv7HE9M4?mJJZyg{lL9&L#oPG=Hxjv>DZ6QCF# z$}BpbA1AOGA@*y6l&mtCuQY0e9g3qYRB9KW4i)n|P1qeM@E0bQ2@ts-A;dRB*Ca8w zF*emaNras#^j2%zDmK6(EA?V{cMA~qa)@Pv8F!N+`;el0mL*1M5V!>mdHX1)=3r$`VZI~k|HwVoP7R&?>ni3ejEji>YIrCj{-Weukej$AX2%rQD z!7)C_GC;%<8q_R0*fc>%WD!6N2wHy?`z}DfG(W)`By$ZHvrs!>dl?@@1S?qvGeHVD zb`N8WAA6rJf2S$PC@kqvVOLZPZAcS!lQ!K~Y9KiUP8<|WITXTAM3QDX`&DqrJww%J zZ__zJ{a|^;V^yEGMi?an|Ad*Tu7qrPGSW*^np7~Tep>uANyAiY=YNc0AtQ+|MsPSW z!_H2z!$YtxA6_sNvusjxZ6=^MC$)@koIoIjp<%N;SCNS=YygIo0000=bW%=J023QF zTMH`z0|pKgB0R-3|3T4oo=W0$wxea698G|SnW#C{hE46>ScL7E@@8HAw$$?DyzR(i zfa~bgtGMv+%gc)6^XA>i*|$rr@P+^Y2RKPYK~#7F%#j0-7 zjo?H9!}N5E^xRF%ze7C6(17jQgd9P6s{t_2AW&xT4@VOY3yt63Gtx z|9m4RZ~^0i!34+ioLGr5trjQKf@-~}gxD<>Pg6-rQOp7e!Js_MzzQwM{@z~PZ?V}J zNkaXerk`upuPliUouBY72)_l9VE@Ti6q|z37-6@|`VO?i!j)b5)voG|`QV76N9VJUs`=2lw|6h;=yZ6sERdeDv~BX`rny|z`Q3mp z*A1z$@0re0&+qc!j;>CJ*5cLzdEwUcE?;hLTG|kyq$p(iU_`{w@>rAUY$R_MV5HOB z*&#dqP8%u9WZV9qa|?1u2q1^(>44AqFJfcgq^L-U6EPK+9lJY7*o}iI6j`?USLFK& z#tAdT5b&&_QUo#&7O2`SBr3zGpjRaUb~>GV_tk&{3I-8>r>*&a$@-F~r(N(E+M*L^ zAVG&Pu%g)9w3*<{2!^S4JKAv+8~~L5cY03q<@JrzPYBS2e(7dV5E#n9u#HrAvjo%w zar+GfA&NxT^@4)G(}$GZJYZc?zHNpSg5Jh)1%`2pLaOGT9*p35qI2KLi-xW)(8pn4 z`Uqh4g#*CDis?lJ1SITjZEfAFXm|HeJrHZa40`0$wNs~0pSD^rxrPAQ+1Z(ytJ9WD z_b?K~%dhM^PwwvNA-Zl*T2E1qZQC~Y|C}BN)!)kN{;hBC=tSoIHaz^>z6&Qqhj;IG-8@%!UV+9DP(xWbFk|EM zShAFOrmWhuW!CqRwR=sg7f)J!>0zuccQKsZ!M})FeFu^|ov~rb#3yH7Xk(pBa)s5P-V~z;a+m zf(k&=&p~03DF}2QX$jn0ML`11g*Ug&429xx1i%iJR*So0ca6Qr;Q10ume+7KeNkCLYfu-pI z>=Q!hIs`&p;M_pH9hCqALd*lOAuWJCCDbtm>X`44v3F?KsszuDO2Fq5LP7HYEJ+KL zd?jQsrwSbXzV0&zhWvUS5B8t}L7|95Xn_m>2v0eKX8v?_px?K9_q4h?M1X)oUAokJ z>iUKyooNBMgGtChgd^7F>z+0Z2u&-GilSVqKfNdT44F_fAHru9I;reb-*Bp0P8RDn@avw6<&}+GDSssd3jlo?CjFg{QUf!oSd?)`+Z002ovPDHLkV1nS6%sl`A diff --git a/public/img/emoji/stuck_out_tongue.png b/public/img/emoji/stuck_out_tongue.png deleted file mode 100644 index 2d883a8ee80b006bd291254d8d3525bfab4dade6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2824 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 diff --git a/public/img/emoji/sun_with_face.png b/public/img/emoji/sun_with_face.png deleted file mode 100644 index 25d1aad14e5e2299d72e945f51daa707287f2160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3695 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 N002ovPDHLkV1kV%RnGtb diff --git a/public/img/emoji/sunflower.png b/public/img/emoji/sunflower.png deleted file mode 100644 index 7134150a6c32545b970c3fcda22c49bc30ae8700..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3100 zcmV+%4CC{OP)j0hLt)lr#W`HvoY=0dO$@q(T5t82~&-0XaqhI6(n*F93x%0DC~FFa$;`1jK>^EJp!&wFJ0#1NO)SjZFlU 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 diff --git a/public/img/emoji/sunrise.png b/public/img/emoji/sunrise.png deleted file mode 100644 index 20878afdd94b034e0738889bf958ee9cbc5b217c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2848 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 Ef)b+|rT_o{ diff --git a/public/img/emoji/sushi.png b/public/img/emoji/sushi.png deleted file mode 100644 index 666f01a1e5d6b2b57d51dd63797a54160f79edb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2955 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 diff --git a/public/img/emoji/sweat.png b/public/img/emoji/sweat.png deleted file mode 100644 index 11ba493cb8d4db3cdf014c045ddd34e10d2faec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2963 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 JPDHLkV1hr(nxp^# diff --git a/public/img/emoji/sweat_drops.png b/public/img/emoji/sweat_drops.png deleted file mode 100644 index 09e9e367e35ef4934833fe17d22c0bda2e0d9ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2862 zcmc(h`8O2&7so%0Eo-R|34<(CjKtWoO!gwnpkypjDv>Qj*|(IXF!ZE&64{ePmMmFf zWX&3biEP8zvJA%OTj%*BzOQrc^1kQ(a?ia#+(%}n23+id>;M2RBST$_KT-Ryu_6BW zmz80Q03d+bMVy|2=fyvjzaTgOkOF|=KLvo;- zFbf^OK>J46zYIGm@J2IiTYz1Quyp};FTvg=c&!Oq*TI1mc%>fNHNcj6*g=8jwa~K- zex89vlkj#cG$^NCs-!VL7<2y$M^@nIDm45AH4E4JsL-x{-=cb#ybgg&_gfM)sfO># z(7yx5^}!E6;pXgD8szAcj6GkY8Xdya!F`~Z0d&gmG;BIl|Grhb7Suu4 ze>;zi=v8<+bfa-sIc?0Nc?ZPIu*A*8cWh|oETH20ovhI*e-3-f*TU2iNbvGA2y&f7 zAX$Vf_Sps4CT}>IxbGiUPo7)9jM>&uuy4|riMlM$W-3kDZ(!od;$iS^}4dxLt4|1Dv^vq~7uy)s+~ern<9rr*pcES<{R|F!qvRm5uGTN_0= zMLY7%%EN;3iPY-j_`aUA_GndAYxGfG`Z!9I+qQmv-y;T3>k;TXYlXHRd*Jq3?ruPU z$~&sHm*sClygcGl$R1iv_gaR>tGteq&uZQ$Pb$bQ+3V^y-|AXvzT8Bpv}Y{cs}Cj* z7ps|KEs#;lMECr(IH9J*_^8$$y^rdxc`s5I&lDQcPr3l!GW)C-evWV zBA5gp>ArT79-l~Tb3qH#>HH$il=@no_HPA)~b$%&pM z!aniAQX*75<^(6n(4=vSZprJ+i*08@O01}=rWLyw+pOf~K0beZx~8WWG)(nWp2uh! zv$Mq-b*v==QL!}~#mh=nyRo_1x6LCcBcorGOnN6W(PnIzF7tAu#vr#zJT|C%=&~EJ ze`NO3j1r3p=1v%1nzM;U$`sKOq#-rO<&zfmq)JtEImF{yhoKEk?nMv z74Y;>j387-sqe@f`dU!X{nOQAipcx#xsUxEx!hAYigA-`z$LoT+1i|6`i;!=rEb+o zudk`CeMOP|Z{GAP=D4tlb|JFL{S#fq`aP+vX)HDIThdnx7Xrh_3WHZyS95Ycgt?rd z+k|%7W`jlNw-rgo?9ifEjGYs;SICtdPi6%N)htw}c@7u~ zY#H4%CD$j&Flx9b2aQYzZMC_SrSUVw2|vG*jbSx|yDjpEKa<^a9J6ofsPZQW$pYV@ z!HjOl@1L{g?0tvBRr0dG-ap~Exj7=0#}sOCWvk4m8WyZbbA6+-sYQ%1$uKewA6uHI zlzaJjtNCsrQo_wAuZCyF7o8}#QVA!-J zY8P)eJiP1X5S`w6l9xO)cad7g!oqQ3E&iR>rPZ{$>qc7-kcHph$$%%I)IQaIVC2Qq zr(Tkn_29%4J@^zoxB9>bCq)$$L`6HhAGdXT)I?Y&owN&=!>6`e%@*!3E4fuv<)0eI zQ;#|Xr)`+uwhb4#!Y5k8M5?G7UR+wR{pb;aO2VJB=Ht;boWoQ) zL2POs`F40eS8O--x7^G)Cui#R{NiL?9GA-VGd;{c7QHDEH6=#WBFTnBhhm>r2^SW5 z8t0Vci;+aCZ>z06;vNg4RyyP#Rc!efM_*uJc+C5ff6$IcZWeR6cKfLE%dgRzGjdi!V mNrE&&i3^WcLX6!lZ~*yi^9Pu&&!_)=XN~ksbxW|0;r{~-)w<;X diff --git a/public/img/emoji/sweat_smile.png b/public/img/emoji/sweat_smile.png deleted file mode 100644 index bcee2b7cf3c140216db00a8697d2cb03cf35cfaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3129 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 TulGet00000NkvXXu0mjfZZpT7 diff --git a/public/img/emoji/sweet_potato.png b/public/img/emoji/sweet_potato.png deleted file mode 100644 index 9163dcd6a9a67f5bd9d5011e606dff50db28d72a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3175 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 MFeMY1IPWX}3)z|R_W%F@ diff --git a/public/img/emoji/swimmer.png b/public/img/emoji/swimmer.png deleted file mode 100644 index b5ce47ac55e3dd624d57113068b550bbcfb0f2f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2317 zcmV+o3G()dP)nrKF8Nh$^g1_lNO7r3=dHX#_lyBp2QG8_jMjfgH81^@s6O*SF`fvFq3 z%_GIq0CS)hxXK{G&;(l5u#F2u*|#Gm)luF<4<-LZ%_-rwcBlq|~9;uw~yw&nDfh}@yDUepLOiPm@?DWGs?^V)~*Yhn=sDOEY8(3#Kgp$ zcS@p{F3{H(v&JsL#4xzH%%pzx&8e+|U%{1af>}O_Uqdgnw6lw6yp(Y0z?Wgc^c~R`Si2!Gq0F1Bzd!-Vmy&}QR8@I9H!-1$b}#4T^|hNH8WuQ=fVOl` zBDuIPBN~fNC;!{DFf1nyZ*CxPYYd#AFqVqinP~o+b2W%~qS<#*0000*bW%=J02KbS zFdno21`R_^gJb^oYUYjK{!UyeWO(TR`s)4u*|YDX@Wsl}+D^WWs-1nU)jK}ewXfpv z@Y2-Gvy-#3xzzZErU4~X(EtDicS%G+RCodGlmn3KY8=JaS=+X8jc1MR*$%VGWYTH; zd|A6s)q2}8*S3e(wrv|By>v4K5FY;v|V8)0TwTsDFeQsdBd#;;2nG3@W5U>HN}@iA|rGwK@(y`u<nZyB1u+t8UwsSnSA~`xrtShC{Vo>&&6bcjJjE@e$ugpJylM{$=bV109y10x# ze#;8cI*bHg1gX)M1u!W0;9%jLy3TO`hei6Xbm{Pj0TiL2`3TbcROOun+omh1jmz+X zMJ1$Y0xk_iKw;N0Sb(&7zcgii!e>7bEW^ef99BB~Yac14 zGa+4~g)`GG-FUL!UWJE+ixtJB=Gw(RVys1Cozko`$Hr5ld~;{6SzQbjuP({rmnSns zD=q^=YINDbeg@+OA)l@C`6~K-NR&)g{5i1BiXQ<*P@J2auvz^Y8T?6Uif^t=2x{ad zlQrIX@Sp^HAg5P*acu(MEH}cqbG zpHBB&mxh#n1Z(cvqy7%WM)xzzgi%ZASYpo9B zrUM;2_p~u86$3n2ngA%9_dVJzUYj5w*qQTL{d)8R6jr)m7(SVnV;c$;v(jXH81?=l>6#}S$fl$M` z5d%L+oTHn7gcR=O4(Z*OL3gnBy{HhSLdFeJ9qc);WJ(Q_x(WEuJ!kC?m7$%e){RB=4SA;YuEi<;N5F3=32jX7=Xg~ zQwD`gaFu_Nb#H5JUJILFA&k4TmzFZaT%O8D;p9J`^TF=Z(`LCc_gQ{;csM>jF3)vF zj>{DUE_Q1*LP$+r(=vl&I>tMEpI+@Azy1ttQ?X^!R`!o6V72OB{U7%7FjGRC;0 z+3*U1p`T2p$Vf^l&4d(+0GBuq2JRW)2{>x*D6U5IFh(Fo0f~`ha!n&4bV>{N8y%To zpkZyin~nWZ;3`i0YsslK@Y97wX&*3Ig_4}q)0@8c_X%J;{j_U;)cvmguP*h^5y15lNa4Q#u*-{lQjvEt0E&%XM9LeP z0&pl6dZa?84gmHgkiu^POj@a&lu~*EAgqq>1)+PatpG4*5J+j8%>ay;s*+MwO~L?h zH<2V2p(GKT3t%^MHYJ3nY&JW9z00000NkvXXu0mjf&fZv^ diff --git a/public/img/emoji/symbols.png b/public/img/emoji/symbols.png deleted file mode 100644 index 2496681fb67a933ef9dd0d8189929d9d53046192..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2917 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 P00000NkvXXu0mjf$|IuG diff --git a/public/img/emoji/syringe.png b/public/img/emoji/syringe.png deleted file mode 100644 index 8b15626ca8aa55976f7abdbb941484274a7af395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1939 zcmV;E2WP)~85$cLKMf8jC@UTwB`F~zQ3VDk6c-*JASM(PItU0QB`Q8YMF0Q*IUF2M000~u z9UmVc9v~zxFf=_H98pnNH8ndbDlRN6FH`^kQUCx_003tI09610LOMMh9331S9UB}T z8XX=Q9UUDV9UdMZL`6y?BPB{oP#GB001j0EnfftUH||q7#K?f13wE6Gdn;40012w9VR9y9v&ViC@xF@ z05$*sXG}~71_wGiJ~1;mSXf+DRaHz(QDb9hcXxYRTVYySUV3_dWMpI{BPL#6Un{)004mi08da?u&}t1k(ao)z}G=R+D=Z^ zJUp(hwccZ6S6E)L006nV!oI)8+1cTS0sCuFXKkpcuw7kafq;f%V{OmQ z*TTcfs;jZvR8%V~ETyHakB*gopf}3d3u9WR9oL?XV=%= z+*@1RS688-r=z8+nwg%|Ha2i@cVAy+hK7txO;bEQL|Iy20002kMn<**0^VO=FEBH0 zZgZ&`8h3YmH#j+!mZ52BajYRBF*7!-t+k;50LseJ)70C<#LcPz0N`$JZU6w-NJy6f z0h<5-lK=p!5)w2uIwmM7d3k=aw7b(YGktx8RsaBy007tk02Lk{8zUptFE3{vALPNo z*hxv!SXj9N0)>N#wYI&^KRj0s_$o2gU#ZSrry! z007!zmR&(orzr}Y`R_cn1^Vz~v0001AbW%=J0Jak~ zw;cx{^9@TU7+&)N8@_t(L|!rQDWGq4*pk{#x~s{aXjGHk^8NE*oR`D?sk?!0q0`XA z;nd~E=RJbA(E+;q&A9T#_4Dyfa_Qk2H?K2Z9dyJ*0wRKZQC8&wr%s-*4nmxyB_x@i&OXH`{U$d{@=25LFXNv z>`-|tFDq2ueu*tA@4VOC?sNOYM4~w%VdPgI;{d$n^<+cqt7Nh{Au-qNTOj>{oO7R~rkWE-MBwva{le~w zfx{nlfrJsV**C%ZG@SCC>lX*RQi-WZ{DQI*(hJ!izW?4JxeJl!8wgTKZF~O*7e5Am ztQpp)t0)8pv!=3t;N8<_B4PYf&u)6!Zh=sz#8Em4%y`N`&bc#DRhIi8vC4pdCR@Z+ zCd+W0U>OJ{IXSOc?yU+;3@JahTg}xZ%P6=B0^vAI*PnB@#p~}_QC2I-PS@e_++-d| zsKhY|NAYeD+iypvfF-~dXBfCiAVDdZIGQ5zw}lzDWf`R`BW+xr0uqw6GM?JB+8zT_ zJFo`H@$5o9NYEIPv??Q{$9TAjE8{C;je50Om6D=MTM6eu-5YBnu(Yvh85t`4c$pit zx7~>qA7QWrG+{@Eh!5}W@1doqi;oak%tEX<9UA~W|CRiXV!lvp!b#$_G_39s2z%dy z!25To@Va6lmR6>zWmPkj4_od7X`+Yj_s>WcB;h+~ZR<8*O_kNP8lj!V0qZs>DQS9e z3^pjC-1}B|6ILbxCIA3f%}fogFI@M3gh4Kp)Dgc0 z01&{+!q&(n*n&>yF;uxU1}Y2EE(-(DbXr8Lpqe2<-k6mw9i$1yRh9BN0?2wmL7Z?wEI>*F z$kjk2#2RA$EW=aM8Q}9(<>qwi?SnYkqnMc-`{_+;8#47uRDe1xaL)#avEd`9YBFJ- zIQj+xc0)S6&=QD&uL#T0&ht;H0>c4<*tHN_I=v8i%Bbsqs)drlS9=uZlyio|o&YObG z9z2`P7N47K8tE+GLR^owDnZhYSc5inIFf&NL?#i*dbp%TNkYYg6zgvA zS?1Xq~@#P*lZm7I$ar{*7vWL|M>Xe$&rt4UEcI4-=snr{_es*WiU$1}v z&(GocwdsOKZ~OlElnhLNU(D(lzGYuTs$YL(H8r~tx=NZHUtDOJ7<>8V{Qt(8`@dE5 z06@QGW~gTy2`aV4gwEqGk-UA3l`degA6GPIDErl-sEQkJ8yH|smi4LQo0C7t`V(yI zDAaOFtcakAxqyH@Ma?gm#MKgPD|$N=AtJ|q|7WGP8xN5b;kZ}F-F;L+YY+0Z`sI7_ z%Gkw8npfVam`z1&Ew=h)??1 zeKxVTl)jn6Y%qQBd*f)0tUe$Ctx1dAA;_qfSol+>Kx9E?4&! z!Fejlx8)NXJQ1FfR-|V>tEHMf>sX^R=fpwU$U>(F2?*04fouCPP|$!^Q!2D z8qB-H5Y0xlbwz4AP-&6C<5K#jWV8y@W&Kvkh12<{bZid}S|8vke0 z4f8i@fxM4$`@8QvaABKr{X8&MK5b9tMPr9cM6$JB*eJP*>31lEG;E|?%OxMYceWFM z{T*6T-PF;>5AS9Yld1TUTJWZ|Co?Ccb?0E)w60@fLiX4^_vFQ&$>ynV%97hGQD-lN zSxV>okXQS%GsY$sHG3XkA_{+azuWNBBQx11fJeFl2YWc-k??N6{C)K>7K{JO?M8!X z#pKu+*^DW5dF+?)yP2&|hwuyunSy}2$uau1HiyG=0d&qTixd)8`Li)650}tr1?y~* zReRw2*!kSSfVVFDdlUlCv~1YID2i0Amon5I(2(WarQ}n1){Rux6BPXa$;`}j)-{Hh zKH00BU?-7ju1VlE;yU)LQ;X{`V|)(ux}DGir}G?seHW6^Z5MOLU+8@fM8s-rPsly} z`0_@Vg?1@rSx%Pi#6@idrQ0EcJJaTW4lT>HqT+@8T*>4*3q!{6U0Obu*_N}OM@9J$ z=m)X!E1cl@cQI?JH$R)_r5+SkW#gU?uwk^;>}I3abnoF|mnGzbqL=yMqsg$Got3b2 zwhcC%00mqalSA-AFj-xekdRkh595ud*SPB0vn-tWS64kVcAw4{6}I%F)zrdFR0Bj` zS{NeTF|)eNofOBas;umFVyQi5(5qgmQ-}GqBO`{Wz2vE}`bh@TeKZIefAYCE3(wBL zK)(uL28<)#eW}N^rpt>K@Ub*NF;K)i3c-48PQ#cHC~_HQ*@4g0{6P%L4b zxOYHb&Kc;wPJ32c%U1?>mkO5{n@{Qk+R;C{X2(`v3+S-Im+YgMr^3(d?tSTrGLhRX zt7ik+J|e?B17DB{l~evy{k^UxGYZRTEvA)gb*-SsDk<1WRvC__RD zXo9U%<&|YZVq$u_#rIH+q|V2T^u7KuJ@!n0v>k< zo?087mV%XuTiz0xWMuOt*e7c57E7kg6@6+|R;Vx!#=cTT7wc^|cXX&u1Jj)1%v+yhhqcpOjv^Nye@4^=I=%b6i{vf0+HRCp(3cq9i)?umgN|D9`1 zC?3Z#a4hA*hi3~TiWxS2PiMkvsw{9>pS_2YlT%Wj82>g_chC(d2+XxFBH80uxy>-H zpVoNzd3jSpOy0KtL_#qbC@xDZRxFlNcCNiEmfdr5X}UTKuHxr%-{z95kPgLDN3t!g zJ+Q0_IvSYSZh1$>fj8(`g~zo86~ER8##Q_uZmzmh@8Vnb^_VN3>og8B7xq`3zxd52 X3!F_(jpp`Wd^2EXgg0!`cTe~)0}%eQ diff --git a/public/img/emoji/tanabata_tree.png b/public/img/emoji/tanabata_tree.png deleted file mode 100644 index 6d5854925690c94ee506b128d16dcc86269107d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2487 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 diff --git a/public/img/emoji/taurus.png b/public/img/emoji/taurus.png deleted file mode 100644 index 14480dbe2e9b341565530ced4076f3d317065c70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2618 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 diff --git a/public/img/emoji/tea.png b/public/img/emoji/tea.png deleted file mode 100644 index 9c0885040eade05d38e5c5be29fe739798b78f4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3343 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 diff --git a/public/img/emoji/telephone_receiver.png b/public/img/emoji/telephone_receiver.png deleted file mode 100644 index 36e21e0123df2541043ae49139870a976769453a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2001 zcmV;?2QK)DP)8f&OxsSSo$+t?=3R1*sIQAvqnN)sbiNles_CfC{C1$Y<0hOv68HNWYNyB4@^ON;`?8W>u*rqDEiCuU`LSc^jX z=p-N^BAHuX&a+J_!KUfX?r2escK$(yqNqf$YPr=EfG#t;CA`U}Kzr&JDKe63i1N+v z`E*kNCa+GG_*5xVBhOh0KExF+Q+u!p0FQOXk9rcm$R+Zr4{(_)3^PFCvr9hE@Ggi~ zM^kFlC<}yxq92cz|ZpBp9W@>5r!G%0$GMAQkH_0@V+v?qoDxCqVR?? zMMhHk~>&|0A)_b$OPut5Nv zR5lhd$=$ckYZyS)sp9K2y*yQ*OTK^zj1NO%()2bT;stppfIctR@o ze8g=KfLBXESKN{C4mRLmQAH609;K&Gg$)9T4uFZHWl7QjBJxriMMQmH&yz|uXcWi4 zx4!0L5K9>#K}<@Lr^+O}a`FuoLxTX414*wl#~>sYsjCR&Xr&D6`_4454Nq3$KY)ET z{TLz(hnP0(pY}b`;McMGO&pszWN^u9wTLo|Y(KXS8Vqp!Xm9|z;~XvIX=9T3BwFI! z<4xHS#g7MoEg8s>6NuJSZOPP1QvgoC?7tC{U`Ru{xO$!9%v{tI02PHBecgs&h#a!G zbbf1Xz6k*E_g#Ls9?9Bc8BE5FGaqRRfKtJFKax!d36Z!DRPnz3{OwHufS$j4TLT1v zSgv(^Vy-y#=eAC70szG8YyF`hBpRWLN1gr~>}^}KO#pcFa`;V;kcf~(R*wok1faQ1iJvp#_oAt5HDP6>}e&ac?<<3=CPMWbt3Xnaiguu%9YY03*Y>vj$-+uU$~ z;nM5}*q?6)2T+25sF%#ocUSM;!no|k_Rkk41OR=+v_iO?f=Qr z<<>O{|1_~5Q7hu5v> z%3c$Iiu)g^{?R8OM2}~DO8Tq8vFynW@xep)@E^8vUGEoNOcW9FYf7Bq&$k@H89 z_|>kKaRY$zf-hC}1cIRF0-hiYGE5IgKHBqA_pa9$jCuI(oVUT^C^aC!!^b0#q5e+} z&Of-tKeBE0&dK8hfXkI&S!Iu}3n3z)$}pE0GmYM=lF1e9*h zTB<4)nGgahi%)GwocwG2)|7PadrQw*F?fc5;#ErKVXqiA(X9tK!FPN zH(>$*P#GM$zy9Uwc}cK_i1nn5B(zT;fO=~u0H!|nfy*?e5)ht7%w_^MvVGFtXr1$r zo3o@4HimvCVghPpu<-~4LBa!;AUIek0tUNlyFt%^iCXJ?=R3}FJ7Zx_iX&wy6tI4kmxIS*O)I_;7PsWcdXLo7K+&_hdF(8j`N z;CSuc(-K~1;QzJU`!n~k%wAyY9OP2DC}}}Gf^f)?O+BKrqrT?c0K5%=VIUXrRG8wa zq|8_UZRizoFmpFqcbT8E=el-A03g=y4@1{q5uEWi^=;FQAua$qthnUS#1=WYq71H< z{%DAe2GK&xbZ1y|-48jlvK_7-QcAATaC|1*S9&!XB|tZi^k}GmuJ6gzuo9M>%uNy5 zRDv)jJmO=ez{)yP?KxK7aFwqDH5B!R=b|C0NS&Ijx{IkB>T23G1U4E&e=y02-X;TM zAe6Y$6G@-$Bv6pbzv}wr6B8P0Tu*?Og$_J6{TO2aAki4Hpy-uEByecZiFbj(DwVEd jP5vgX7>5bK^|gNi?#jkhp&EvX00000NkvXXu0mjf^_!x+ diff --git a/public/img/emoji/telescope.png b/public/img/emoji/telescope.png deleted file mode 100644 index b2b1ecf0bad89863d354f1a860687782cbf54c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2419 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 diff --git a/public/img/emoji/thought_balloon.png b/public/img/emoji/thought_balloon.png deleted file mode 100644 index febe30d05901c572e6d022242f0ff908a775284e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2521 zcmV;~2`2W5P)g+=ipqx2m`4XDF;aL$Q+)PoZyg%|^-mi! zUs=L&97mK0CV6beDFxb(y_eKGipz6`qsH-^&Rpd2Z(rAH0Cn)T(v7Eb0zH6%Pl!Sp zlLL&9BczWq^C_W|$08N>y>j)r1g!#4uUvZR-X%&GOHfgWAi~9AniNG~ArYb^@G-HN z;vH0nFJJu>!BGMH_4eEoe&SI5GF+&+A--BECn482ZjBN zvM1$C-4Y(T0UVfRBbvo+!O&1ZV&f-lClZQ8elWJ`?Qbp!J=8 zEP~kqsQ0XQS1#rZI?zb~ZY|$FDn1@@s=_5jl6b@5AqwD;w7m=i90r4*pN1Y8oJhpKW3y5N%BSNQ{LgE-r$|xd$ z0No5=Meq0_`jG+jmCN%Ti|8R)CG%*mkU+vWlY(0P?PDH^HFsWeWPtbyzwE`J4G0c@ zdXZFob4lp}L|M$@j;_ZZOx=6Z;fheD=jJyP^FBu(-59h+Qi|-72HnL}7+ik+CW6Ke zsKki3Q>^x|Pb;JV&`y#8meQqIk6qr6+8975TJbfK=wff!A_oAv=*Qp_oItPo=~sz1 zb3peq8B7_pzF?FoP{70zM~>csPMMM_Z4BTnq#d;pKtM44q>Cy0%w?QI6wom+NDxEi z=%q-{gme=_SAKpg(Z&GY`o9tS1WYhaNEh8CWb(_y(aR%{n4UP{pGUkAfQOA6eK(JV zfDB}=C zXYFqY2b<6Q zQem;;T7X>PS-Fgr35z$5; zC$j%y;;1tLVg;s&%X#F(TN#vJGkg0l~qIDbo0uIOOrD;1WT_J*?%SJhPWe zAY;C)W6T6_AN@znKg1|mGE}e$(edz!%;0Y{>1Qur27rl)9}xK3@bC#47>4obuDp&*1!!h0y8GPqev}))$E+j*LH2C`w}LLNt%63lcQ%R z4)#od0E;Z8{loWO?2jJcH4X}5fFgB}p|MnyrXDCj6d#8&MI46Zd5yTcZne~6Py?uW zFiin>?bQ!lR`3t7n}UEsz&p*`t%l&&L4>&Saj_|Kh_~6tZnWTqt0 zn5JCtGh~Pm!y`hL6ebEjK6+ijLn)d{QDl@d4n;z;1mq|Y0dyj`)P#$IC!e6|j)sFP-c7KBr+J#KEZFz<=O0~7 zg`D)c2MqvfKG-|&%rc6{G?SDFDKJW!Ku+Xg3%4YsTIVh%)fp%4s}TykN<=RB3*1Mp z$EV07Bcvq%O##58^6b_`>L9~pm?Djd!9U3hjwM?{mB0=NLJkP2;ETIC%2Lg?cm^6C z#*;FI#u+1BwZA!lcvl&`*7f%ACX?)Ej5+M*U52s9k;aig1u14zX2t|ljI)h0CKW+2 z$;)?|H|TH%?;^vP*y%AtT9f%1vm^UAo&3dvkuoNegiMmdrYxoCRC5j{7HQIync!*K z38gEFn39w+hS*6a+`KA1!Gw^9vwTs>92U}rw(^GHLN`*tpd*-2lYEjS^GTwk(S}P= z@?YW*FB9b)=F^ReD&0RR3D1zeebZCYU4;*GrHM0_KH7=a5Lvlq>cTd9IhhDO=;DD* z0gn-eNTYEY0}Mzf=#-db2;G0@=FP8?V}$e(-xCgAdf(Jt?mf=>iNOnSgn5!e?S>X^ z_-*pOBD>knHg@tV``FG7Ugtk-rjqG=r4;UA4{xxGU2JCy`)D6t|AqI%7n!a#UQ-9u zKR!8h(U~j*#@ND~Kd-t96@v~sNT3q{2@(TyR{U;cUImXB33B4V@t(i#nZE;k^_tFe z{3JS|mI?N)|Fx_`tJ*xl;Q-WIzBPIO4_JzbZ9GKsvR^#`=tR*`0i7;+Rj$A_H$+b_ zcZHf-AoK3vi#rIVytKN%R6b=2WXU%V4>|zG^xAV+L{*%`ne1K9A}kr@B2;W#dT1kZ z|5|F2;5J2E5+sO78-Onbl9!?DH4jhqY;9?yjWXa>_jo7MU9`{K6jE33$w(|nW1RYQh&ffs{EPhu3i9+)TwG2-ae zkx&tzR1?Xham0K4Y=g~tqh79Xx$mSpZ48xRYBnbqyKp#OmqU_x} z)+oFmktiNpc!7Dh(p(-MEs}~XpJz5Ld;KXk@GoBG_dL(?&ChS6g2yqDPCsXH!5M2- zl+O0g^)D-&_FXREEc#Gsv6{b2?x$aRTttW|wQL=W(*szffF2TPfR9Oz6gJ0DDh7Ql jpEVuYh! zex787rkc0XUxA=tfuLT1pIm*MqrTW-f}vl3o~6Ipror2wyVhfcq@lgnr@`A-*K#ch(cf}_ESsK;)Tw}GL*WQL|t zY>a-NzImIwRdktclC(=^gJ#G<^`XN|8QYnsu7JoVe3TV}M_SrdD>7K2&Yh;q0!(+iH@x zMO}PfmBRl1|FOl{bCGI|5^QgkxTz{c}rN@P%z;>9qV1c2a zy48uP$X$P(S$mj@s>xDuk6V4B%Gu{qZhJVog{5bh!<@6qWr?YBmA8kd z#aD!?ICG@g+UKOb*wNqYfuh0OhIa&>TR3D zYml*$uF6Vffo+ek9ZHH@exz4-oLP96M__z+ox%9|`@zxTd!E0n#@<_dp+{eaq`%ot zX^viiq{DaZ3Y(RuHA-Y41x|0y7Ng5E(ICz6!%gq!?jy!VYc5?r%9TJirpxeax#*DEcZ1^?4ubgsg$#16wfP z{~$*p?(6mEO(n$Jf0g)zDV~3CpIE^;2>lEj_71ZO1w}oz_xsN$x_yyyKrQ154yiD5bdFBT=8B%*k%-M|uw$g=W_jFJG z5Et*63+Y>tz)p6+kq}+|d7Nx&(%03Mo@^SLf2SLAB!ImW2`tJD4XV+_BdwVkD+yQA z`BQq06n|Y46q>sT4crK|kzT|hJZ>8vGSIeQ1EWCskO zfpzSF3>z%T{m34#2RXFFWn-0$0QNdoe4 z25!o@-DVJiXz(B8n+w1gou>)-z)m+;b`uK7FTq6Hw5T@{e86PZ*Q*IsU?e#dpv!#y zF8OGQ?v7N`7VUE>Ha1rN%3i(iZ(ac@m;8KXbTqJo?xBp5ctS|L)y#U%zJ2qms_Fqj zO`dlJY(yzN=sS?WTDr9tF^VLSxZ{w>JKx^XEdu-eSa0of2`P%`WldkJ4KRqlL^;Vm$E#SHbJFwxl|2&0>ac>RTPOjK}#)HX+X9svt5P;@+~hIducE> zHda;2Q&VYbxb0I@El47=O6dZw5%Gd$J`^xAhOq;m84QMts+01hNK^28#(*UwD8M0` zcGkiG4J_sqn_Pgf6TZH#;zOmKW)^i50287v$TBJB zEJgzq9cv?quFA-26;CT=npsxv4+5nu*s|84XakehrZB7yupkr}fziW=j|5=JdJ+np zax{TqJp~J-_t(^uDXX#v3BZ!$DJYQk+yjQy3KptAR9-VRy=L?}1&l2zELeJ;_9?LD z@=+^m7*=xxSo!nsfByLW{ckU)!PIV221`~)FR%F&IBw|(Q&!eN0Q~jx-Me3Z>Cp^N z6d1|!xHe#sNp^rKQ#7Nmzv*f8)IM&Bk;s`AXkh7!6M9xy8e0iCrXDpqU=+O*FP5SK z<_R6LB^E_%3jwD6QKJ<`AnTl9Y6DjS$^XMZE>3Fh(5~}a$CL0z;1yf|Pf~I7|LdoC zyq=<`r4N%P@z3pwW>#plug?<`wLf9%N+&w zy$>2-P_;h1eHxHH@v&8AWF6yAi3VhYIHtwObci9-fYPovY?G1QsJ9gwKuHffHX{dn zNkju`x?OjJ3X{OCx6>*OL?P>w#-MV%vC5!9{47LiKt#F1CkdTk)BnH;$!8&lM2?Dr zQt~fw=xiv&7k){BC^sTNzSw@g7~&6itq(lBcy1T-AaG+59U#NEeed@6Y>nGn&u{Y? z06oIZ6d)x_yrylfq-ne)r(pCy5)pujF!~>fBG?#;a*IS&0c}7~C*QvT4-alxKfDB7 P00000NkvXXu0mjfMm&)p diff --git a/public/img/emoji/thumbsdown.png b/public/img/emoji/thumbsdown.png deleted file mode 100644 index a35b7b268001e85f90ae7f5f3ba986894624f31f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2974 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±{&r0APU|>RFuM+W&3{ z&G}jIA$$`6XaF-~OZ~fk#^>h$*U#@MzssSah@rl)-^~RpD_v=<^J!`H?eBiJwh*tb zdi5gu9X8hgr{Km)!bLhZh`rzo7$3!5@b5rq4Ny}NJvSs$R5u}TYb}M)in^tK?cz;u zC;FVn2C&oP5f}2jvBl|_fu7LC>F9~kDDW`%JOaTY5G(|b@<0k6JkA5bQt&i?cQXw< zD*(ZQ%rskec192^22b+cTr>}UW?({%&kk}>{ssa9?B~^f{YVAD7uB!ax7SmaW@3}$ zABF_N*B2APW4xKET=(BWzTUc??pjZM^o8Paj;VbPw?PTZhuec z*DiEMs!e{5!^BAVLkq=ljH!#$EfB2iY!3ua3&~S4Q8+UYERVpNmKHgW4PigjA-z1b z%Sv2|^PQNX46EdLkW$b^2qJz$JwqEkex$ZSj`Kt6ej%by_p`yX{N@Hfch}o9HXrW)(#p|4 z+TH*0^R)W<8vvl=hwJHB22*Wj(x6;y0qu!KPj4V%<|BUz(tu4SrL$ET5}AR z@6ecO>G4c6Fw=qVEqG_5j=c_dl2o={h0zt<-iyC!A7<>pAgRI_>D#t1$n_{hywx;I zg4F41<5~HbELar3gVrES__fRilWJkTZhrbc$2*^Q2VpzO0IW5-G(-X{n~mJ5U?8N)u)CC1GoD8w$EVO$CBHS*BHJ>A`? zNJ&%DaFs;z5P&#W6PmP5qJPoGmO84nlY~K-h;5yg!Zk{_MnhetA|^9C5Ls+jVUtMJ z6R9o3w#-OeJxje_l(t;^F?5fRM#B+$5(v!>>S_#HpWy$~f2=dnKEh-`awYx=^-O@{ z$=neIWA4M2@)yJNB7r&vhXStx7e4N5Y*vGa837NK7;hyLPGO{Dgr~lbVBLKI+ZPnm z!m#EU_6n8G=IEg}%GNSn<@rL>F(BY=Dx4 zq2(5BBA5;>v#nn{McFQ2qP-8Rg#(|>fLgv(VM8h$JM#fj(5u#%_6c{~2(2iu$OCG6 zee*+&Vm|C5z+3O6UQ6JdQHU0)Xjne)hEQZuJ zJlv)E+tdIZ^XFPBiG)~=38C9Jv{$X85LZsnYpic0OYO&NyW<0WppWXyH7eu4qz<#F zI^|BOEUHvEm7^8%2ita?-Glm&kmULbgnJsosI{>@|0yV=u{fmwADh(`sT6|TbrQGO zVU6w*7b`F^ge@C-hmSN~GJzWg{Xuv_jz z3?vg-P!FZGO4*@x2;M^u`^C?k@o{{00e^JVd@7*Mhw#Jtj2pP7lo;4Zi$o z9dmh*%bmADZ2CV=AvCSVZG9#0x%eehoP2PJ1v_n&2V4eT_qN!+Bz>GpO}Zt@ECem3 zdK+G4&TADcX^R(>s%v2jFB?!^sElJNiDHQocSWCJ&?UmXkLeC8oReSiu8paATBhsr zoj&g1<0;PAu*U*SonjIRBKh}+ud1{i46L(8Oi4s)BimVs`@jU$;9jm^WO!+Fvu1QL zUZlcJ!B1tv`5IvS-WY)}X)rdUbs%xC=w!YwE{~GFEYeXeD_uR9C|O?RQPIJwq-~(> zn4Af)XQfY&EYmp+xKYZA>~sRcM495h;gAXlgz1IU1M&zr2Q|z;()Al7HHW!~h&hL` gPV@q`0YL%)Mro(g;VXIh|9;ePeN(-fJ5IR&0@LUHWdHyG diff --git a/public/img/emoji/tiger.png b/public/img/emoji/tiger.png deleted file mode 100644 index d355ec4e145abf323e74de760f44f4e98f540db5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3088 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 edNd6G&-n)JAq(2XFL~DFAq~N6L3Qs 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 bm(%|PcCS0U8CZ1300000NkvXXu0mjfN1x-? diff --git a/public/img/emoji/tm.png b/public/img/emoji/tm.png deleted file mode 100644 index c7dec75a33adb03d4710789c4cfa0daa36e53843..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 842 zcmV-Q1GW5#P)MsZ@n@951zg!+b(DUB_ZQ4;e-HSj!GX* zQS>g3?X2IWJo+J1c#1=|A5UF?ZqU4REs;_$IPC|39Tpk{ScGON3FGf7^EMH6p5LQA z+9<%ZZzG@`$KrXq_t?xFb;3TgmxdGgNM_aGh-E1vcz=6L}9A}`~(H6pB3ID)_eHCQUwlnm_7kO??e;93A>#D|Jzq3NCUJK zO&5QcP5?TJC%Fiv6L!A~ociTXSCQ5Q_!H2=^7>Qba*o(5Tm)Mt@dY5Qn}B}}K_L3P z-~x1T-y^ry_2oEF@7Zr5B4~AhtqG_CI$N*DfKNOH;W45V)V_Sh9I zlhR8>I5xvSBT|@4k_MzquA`f6f!6|8gv;OO@ z@3o)U7@IgzVLKC8mRTHK<^iIWf?K7V!97yuW7$dUQ&Reeo#o+^%jI&pTrQXU7nY+_ U{itF41poj507*qoM6N<$f?BzKM*si- diff --git a/public/img/emoji/toilet.png b/public/img/emoji/toilet.png deleted file mode 100644 index e5cc4119a15d3346474b666ed1fd1bb8f3de7e79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1733 zcmV;$20HnPP)$DoMgSu`V#MYcV~BYXXbG9X=Q6A*V#C` zbtTYW-|Vh!&G$Rs<(&D}O2e+of^Mqs(bPB9*scL6$N8T7RO}RVE{CoX*kQzh)S0Q| zSO{C{>V@x4_YMGb#KFhz{C3iU$cPO^G^rWuU;fh656|}w0E^(BbvzUix(y(pj>qcg z(jj^Y;IPEYI4C2~az$VwLh7urqM(NW5osRe5U#jHq(Gck$a9t;>?r`a3^7ciEdfXZ zlK7-?=`ny7Yp(#%My*)%ZXale*jfsD4WQ6n+X;KG-3M@bQvsqaeg?Yt0QyYRKA;quNTgA3c@5~Gq0odPP^h;SKnHug>qLSO z0oE1~h{BV?Sg4Kw1eJ&okK*lxl^Nz(B#qsM zFU?7~eG%I4A93HwK6{u932dy6cYcdNCZFr{Q|BzNki{X{ssrf@nnnTPb^xW^71FGd zB1sGjb)$8QHb;*Jb*{69$Memkeaspsi4ACRUB@%>3EmuF@z=}8XCKVQTF%92+f2aP zC@IX%{o=mUx!}dMkNs-#EBz#8y-5OMZ7~Rmq^)HA z_%sBwOo|#8SmM15l9csVS!Cf`m!HEWa{} z1T*}LQTCG|CLMo`%TLap*}-V`>g!jYxkR2K>y(UDCB#M&ZfQGXH9S$3bsF@O=dbv@ zk3sr?2J6iKcIM0uXT$mLT>Seba;&uwDn?amR0W_e?>(`qQIi2myuj<+&+TM!(bUNM zt53rY0T#T~$6vcL%N15BQIuFzDT~wUrh5Sh$Wr2Y{>gDB=_iFH>(BlC;=gwc0Ml~| z51s$dMdm29Qc;pPlqD7-0Z}B$@f@%60LK}mUz)ecwR-WHTO7~NpIi9Ix!=ujfy)%c zy+>89=C##$8jqLw1qDts#eh))8%>?1Kh4bC@_2r6L4CURh3j8ix@!+3a`QMgAPp#O zmS=_)?&bkGbW$kk{fG*sKXhd-(3&3|_~qKkYflV*ARSNPVi8Fnl%+H^6FkP9g686E z?2|RreAfn(H%dIqvmg9v;)$|kSL0wY!eREXpCMv65_n78TSgF|!>&$7%6@oqLXMa$ zaU5)7Mi$6B%SfS(XaN|@bQNIoLwoKWlv6Gvb)bxaYPnWK00N=pw+@Ywt^y3498oE< zWaM;1oQgvbwLS@uje|>Ue-{CcWZv~~mOhfW8-dqGY7+sF&*DCYOJbsnU(=k!dBt#l4poy8@87$D>3N zO{slYX)D0jI6{s^Zj(p3WvXP3tM6-l%K-10I`rf?79Jt?HnUQUtAs|EjQMEx5q#Ev zoS)q?fOXn+eClXp_O@eMbz?wlQa7@&PIdvHvV4^_r2LHNK$?)i*gESk!HuQ#|N8$6 b{txh9{z54618siy00000NkvXXu0mjf$Gtk8 diff --git a/public/img/emoji/tokyo_tower.png b/public/img/emoji/tokyo_tower.png deleted file mode 100644 index 2f8d3040149783ab4f8706b06b11901106375f5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2856 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 EKb*Ifr2qf` diff --git a/public/img/emoji/tomato.png b/public/img/emoji/tomato.png deleted file mode 100644 index 446031b239c6b00a1cfa3660dce5374cc25c4d91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3006 zcmV;v3qkaWP){p080k|QVRf84FCWD00jU50001Nm?!`M z0Cb=3IKE&08j=1YM3Z+mo04+07eA>Q3?Q84gg}28(=#Pc%?Z&0ssI204x9i z00006000F50A7w5V3HU?0RT$|0BsWhbQJ(A0000005kvqeyKl7a1DgAN1487vC)Ke z7yxt^0E@CxjIfl{nB8UJW9z$6F%S2UU^17ZgN|B7C890JcQ4E;tb z@Ion!5CH$2ZvSaO|8+?4JRnO00RMzopD-1;A_VF-8=e*b|8GUfHWq>(0$BtAxiAuq zDGvW-GXGvK<1rT1EDrfYDgSIW|64ZyaXJ5bM1l+e-%>1OlpNeH5&u#qc_Idu5&)1S z0zd!&WE22g5CF_bDXbX*|5_`_CJ6OFCfYn4ju`;bKp+2!Q*sCZcn|=?KOu%D2k1T} z%RwBlFbKao75{-rz%dg4m1h5 z2LSYFGXIib|Gt?2^xkTnCtHpf$Sex@NFU-nAb}SE>s&4CMJv@*9sk6j|JS(x&#u2X z9cGvx+BFccBL)9!I*7AP|EYV}LL>jUk$R;&|FVv9qA#=@0{2)e=Sw8uL?PcxCe}(J zqbmq*7y!gU5PAs!xIP~Lv53k;B>t?0GXns7usl1IUiFb3Zpd%{-uBTg;j7- z8?rtO=4mm%N*9PY6loj+?Tcf>TQf^O32ba0Ms5sSRTGi6S*$Y)|H`OjttFgMAIEG+ zW_1`}gdRp)32&D%i@;Q)(scEAKJ#}>bwLf)fn8W|7Q5AxL2i8&0000)bW%=J04y01 z8EG{E1q&ih+^kMRTr}uQJAV9PCuHY}^T?h3t(Vu$!IOQ}fp5#%__L|&mGZh_^pnHU z;=bs!)zH<_@5Iig)#-FU000OnNklDie8}ribUcCq%UqU;qBRJ>YVlmi1Iv!XQ;2qcMJnk4qX^r4x`7M9B<2aMa zz~^089?VYrTD*8EQcVI2Q3;Ui1EFM}6>yR#tKky^4=HaerZ4fk9(G~u$ z$+zo&|6VdR?*Nk|s#QVE6wTq1Mu=f@R{`L89?)39eNk}^k-mSY@Fya%t3V=3<)8Gb zVx;H{7-q!VI8zbhjK(j}lkZ2!Ti(Clx9mtn3SA%xGga61CT6iP#3SFW+!K3PEQmt2 ziWRjA>I5$yN!;4`mjM1J_IBr0^~Om>;W!RLuDR%SBXesoG$W!QRH;&lIzyRYGE2$dfS-;2RuF(Z6PvlL5FR70zbi1V2v9l50N88oZG!io)UL zD$LY`(}bxpdpt5TGg~W}nMP&?F@6y)Gc%(pBsBRu6Od0n{`J?7Yoa`ZNB63R`nPTC&-w7XrJT}+ zmTMMyKO5lVKP=~cQ`0uv^b`aW;|bZ>*$D~X{`qI*#)uTpptD<5xDEN~pCwsNDTY{f zSDIRi;=bSX13$4D{N$u<%D3-)+ITk4^XQNrTo4)?mXZR4zHqFhWa+z~WH}2(Kbszu z_y=1Pn^=LfTj#+~PH)*v1^D1#KAQeiFkz$SCg9-qH}^?aIzS8`lNFpot*Koyul zPX?omDx5UkC-STA!vw$mSo4SFz!nlrPtgE9qnv`{Fhe%a1gMbQl`@DmY%7_am9aHG zAGikM1j;n)7F+^s5Cae|S1>_v1_YQvtgu&wYY78pXbs$r8%_?KpcSxdFwGWV=}{`= zaygg5qktr!3b-B4^=~^fD_baPc{{K}T!T}zg3VL&)AL)bd(vnCd33a#Q}XxUp`;Aj73ShXH25CvPNro<~as#HXWLx3#?Gr>kl5LLqr5S(1^Z}3QiD44L~ zF#wMNP#`?Kj07Sd$^=ziDW0e(GC+VWN`j&|5{#zp^WiCC15knR@MuXOPOySt7y{+^ zd8_pRcoa~`!x3sA6=3|$1urszn@gBDf0p<_fih~4K>|O2ouJ`yzu*lL9Cs`D@d?at z>A^kd7o-<3K2+p0GY1Dn!MXlfYOuk76TU_%$Aeb%AHW6{j5; zI_BQR0ahwG;-kyJhejfdr{nV~D!k64N6_H-(1`IwQ&G!Zfv3^cbizn8?BW0`cI}eO zqst%&2?c%)@9jQ%?AS4#s=q`VH<0+4h$A0BFrun~0m12rCMdaC=MB??`-FQ2z3Q<7lYgs1=))vKSjYG##Ata<6fr1r4 za0gHU!s{w4EA`zf)llKsuwllvSRBBS_i2W6x*GRk^WnoC9WbykL0B?)5l_-1^iI;w z2z~L=1jxDp%zz3}?!yQS<*dm@Bo-4uKsZYw_?-p;1#Sm;%^G1icI3#_t5?Z@baceV zVgd+=2is}4+sEuBxjQjHU;GQ#ep+A)FsPt_<8XZkQjfogh=}^kyt+!zlo$j&2Dr8W z@_G|945{`WJ&G3fQj#4gkR;K$JKHt+LiJ)XHgIj;AVbMWphv?v2k{bHfM5BTaE9hD*lA3JYQ08z~fEL^d7jm;{KLCmmti{|10Ie$BN_U7JK{pPM^k^ zsRDw%;cU>RtmbF$TN!7H^;xFk;&_CKs^KCUhhKR4*7zzht6A=Q`qgG6OBBt;<808+ zK7SYcFMfvKUkelXUn}Hs#4rp4K?R0k#<&B8-_k0o*aRBEtU?xJKJ75n9AJG3k?$V7Z9ee1poj507*qoM6N<$f}?U( A#Q*>R diff --git a/public/img/emoji/tongue.png b/public/img/emoji/tongue.png deleted file mode 100644 index f1bf0b41f9ef5d51962e786ddf227571ee611d2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2765 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 IM6N<$f;}76;Q#;t diff --git a/public/img/emoji/tophat.png b/public/img/emoji/tophat.png deleted file mode 100644 index a564a7ac2883e7ed615543d7cf4d60bab19e3b67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2563 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 diff --git a/public/img/emoji/train.png b/public/img/emoji/train.png deleted file mode 100644 index 89de97553f89b5dbfb49eec9896636588059ad3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2391 zcmV-d38?moP)OFs7YGX$2mt^92Mz@l5d;bo2mk;800{sm5d#zm0Rk8R z9S{RFArJu)04o;<00000000>Y07Wn(KOhM{90m_J5FkMqv65XIJ{8fWZQa(-*QRdH zpJCOUTHxg9-Mp9P=IGU-X4Rr+VmA^A1qIflX~K+D02Tle5D?X-ZWk^P1{(tU^Y8TO z;!!#ytA|;@m}G`(N0O0{Q>M)o6BAgj*H)_1VZrV;in7Yi&DW=I$ew8Q@a|r^=KJ;X zFMFTn;oM`x@z2S|>F4F2eN$bx;#I5ETDIU?v)%y%0uUbz@$T&4;NdWRqW}5z|M&A{ zNGTdK6T_Nij*X01vD*v>2U3EVRjJQkzwBVW>i_lb%+b<&p08?4D-RqC(x7Jt9|Aga zkLBd!4H^mQ<>9Z1Tkh=YOQp{}j^YO~f&+g~p&(qe<$H9|zO#m1G zy_I6eoMxGMQ9qKpUAg4Qm|#Pi!&0QmgJweW?dkC9<)*m7O?QkbbC)f5n)mVSGli-p zZjd&Jt}=n9!^z3JzrliFIy`)uyOUuVIuo~%U`LFw0Ic0es4h07a4uO`TC1QY4f0NhH$&{q6 zHC}Mt+u6;QS1WLl7-fp$-rTjatBHkxK5T-DbzQcbeUNBBOE&y50000kbW%=J0PO7h z?d%rrFPynB!ax*;=dz1K+}$ckCw~#quBHjRCEPC9%Z+bbp0l6CRJ+M*1(bl%ak1S( z7*WOl4Zt!B6dp}pZqXh@{~Z(-F?{F$w9`RJgwCPdN`XRP-x9b5tc$z=L8ipe7RK58wMN*f}|u!P$?-synpcEK^qdm!Grhj>*(?T)6T=P|4*8q zouTOM@lb`e9Z8^~;?Trx&4iRWXlurRPJ0y?0=%9>PQRZ#(S!XmH%_TS9N0^jUG25A5NckiABS>WEie}AO|>Koq~2ZV&BVZ%bHEtDNm;PCj)q}$6`wz|`U}=Wnl40dh)}s>sTWB|jj64* zq~lXv8+X?Xas?mv!7j3XbzR>t>8#;%uqWq(!;9tgb(<{9vi3S<*`@@Q{omu2I(>1w z^O>if@7!)&WZnfbn~|)pZ*Iaz{rhb8`#Msax}J?#>N2adpkT3j_7Xi_G_1fo`QIvL z6)*?X* z0^n|00g2-XXW!ghpOfG?$qL-!2+lx(a){$XWfU+#CC2Q)4gYYE0)mN|IX7Go3Wc0~ zt*w1d7;u4mZYBY1E82=K2!+rEt_is~;4^`01MlAB^;UQNXpmtBkLvE$ z^2IH+TmJPs%xVWk2f}8tQ~56{Qf#pCvHBsv6f1$ZRB|O z33^;VynsMU=l0J%ui22AM@w5P?(xK}kp@LxDgHGJzWLbm^LA$oT+qmQUcDBcTmxP3 z>o567FJ6mB`Coo*vH!|1UyJ5nxjXjZU!~Cl>>E)W!10&-ZQH8d#xu)ki^muCig4a8 zMs-nRr&idDS=+HSZ?U!C-Hht?DNf(_PER$QJoS)XW&*7xui_+c(ZU2vH9{%pNJ-R| z&{B~I1eBZv0z?rec$Ue?ILc(6Eun>yvyxD7lBhUK3(Q-vEH-|DG~Hc<`+{chk7mJ_753lg$#6=d29rGLvu zM~ycfFP(NeskHk%&)@G(B z0Sui%Bj*`*Fh9@!!1;gZQjMUU_m^3w?=E-o&+PpU5>EUV;TKZlA8{Jh%p?E+002ov JPDHLkV1hP0TJ`_{ diff --git a/public/img/emoji/train2.png b/public/img/emoji/train2.png deleted file mode 100644 index 70a3479f47f8dc5f7429900bccaffae8fc8051ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2643 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 B7HI$g diff --git a/public/img/emoji/tram.png b/public/img/emoji/tram.png deleted file mode 100644 index 7a92db459c0cb8117c211c5b06c2b6b67e573a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2852 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 FV1gNde+~cu diff --git a/public/img/emoji/triangular_ruler.png b/public/img/emoji/triangular_ruler.png deleted file mode 100644 index 1f6b045f290721da6c148da20f614243d3fe8873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2005 zcmV;`2P*i9P)n+ak(;t*bd+j&n^jb%700000003BGePM5oYktc#9+}I20Nwz|Y;6pR;RpjE$JE0000_SakpZ z00000T4H-(X@iH4q*7RGaCnn#c8_s;lyG^Gae0(-e3fZ)k9UHcZh4V&eV1~4mXe{p zh?1y(i==sko{^xujhwcLm$Z0;or{>XhnBH!caf8$zI1+RRl&z1QxRj&6b%2)e1sKSGeshO(9dWN8dk*t4=sD6s4 zhLo{vb&-*oubZU1r?bkAm#&wgx1_PhkD9TqyVI4Rw{3QiqO8J*k*Bi2*0jXifs3Vt zkf@88u#lLocYv3vx6F~6v8J-gm!P(emaLtrzoM?hn4-9!tHFztsjXeaqkD&=jGVb|dzGTH&7G~snyABbf0~1lu9u|0kDRxBhM=ss%%ZQv zi?{@MjkZbr9(!-vw;7dpj zt4;rH9v^^jSlIa|EBFusFI=d-@O&rl!V_xfh1$?$-Zw%kGVe7tEiE*S z=jRY+DAgfslX-kcmy_7Vx+#wWWsa3x&Uml^MsU!3>wS^p)Axd0-% z6vorPSLJu>tF88zQdjGwSbG=<3(+x|dYt7Z=CPhHgb|Mv5w0+JoBK_tldgRr&dG zv7u>Dk=dtTetumA{X9RM^vKUYg5wQMDi)B6>OSm?b-k*C7AogchJ%C8`f$3zUR4EB zD%yu(^VjvdqhIeQrUWOQ^;yr^hH!T!NVRk~27*!r`u%<)5I#$0aRSH{sY32n0Dy2; zRn^?$BoIR!ZIHWb4ru|v5Zp@}%_}Tw$cf~~vYb50b}KEY)O8ca6b`r>qCX?k$>iWO zk3pCbaDfa*0VLctKz~OLc-4^449%YLIb^vSLM3hhFom^u-OzusebW&!w0fx-vetc^cuOr41x+3BY6_7oE(){bNsi5^!ri zC}dcgK>)B3&>`F>wz4uFH+$uWfE;;9Ifn&6!ZUPK4!8D|aQksxa{$7?7Y-p20x2yzf^cd>bEMp5u8$r6P0QA##OAU0) zDon7BBCy|3a6=c$m-+}}*N?wi=IiQeG^Z9ufv}7X@Ir%8%g3MWpF6evKmYQB8eF9^ zWzh&v*`>=_ffgx7oh{1p5-iEL2X!*e(wQNtg$bUxr7RoDJfsW9?^Ddl$ zt4>X5piS8TfEZ^9YvMvuqoP*~hdi`82W6+b<9j)>=|?-y~`AA9!fIez?~zmM+N$^gFp_Sixm`tx@H n;3aI^v4DsE+OZ8@!vCQ6{5y9?Q7&{L00000NkvXXu0mjf>v{B6 diff --git a/public/img/emoji/trident.png b/public/img/emoji/trident.png deleted file mode 100644 index e9085032de9b5701ab58858bbc812f362e1aa708..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2705 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 diff --git a/public/img/emoji/trophy.png b/public/img/emoji/trophy.png deleted file mode 100644 index d1be3d6c2834368e4aa392a554e81ae52928006e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2767 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 VYp76Hl;r>b002ovPDHLkV1idc5k~+3 diff --git a/public/img/emoji/tropical_drink.png b/public/img/emoji/tropical_drink.png deleted file mode 100644 index 043b1c8ef3188fa34df0c4db11fc7ff47c425611..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2305 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 H=b!XnB0&YQ diff --git a/public/img/emoji/trumpet.png b/public/img/emoji/trumpet.png deleted file mode 100644 index ee470a9a9c4535bc38e30c153224c2bd17447aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2330 zcmV+#3FY>QP)460ButfZBq?v zP!B*S09!u?aaR#jISEoX13o7KSUv}0Mh9n335IPPT0H`ZXBAdH3x;D8IVTcSQc!?r z8E;kYwNJBqQIs{iY0xuT;MMFPPOi4{I08>gnLns4R zLJEIp6kAzW0000=Fac>(5rt?Ogk=v}KMRs~8-`~Od|D83SrSMx1vW1!S5r-aaUX_u zAwWGiV@C&lVHA&X9A8{qdRY)iG6R5S5_4S<+O{o^;8=8nH z$h}8nNeHHrEWo-+=FC3k(@EUXSE7d+;@MiSiyDP#81&;(!>~E2gc+c83bCX%p^GW5 zg%PQqJ7Px>qJb4$TwL$nOw-3sw3#Bdmm0#OC%vjSnsghkk{xqB0p;L-m}&`UF#!4a zfr3s6r;8kuU;~I#0G@#%%*9fjeiM&s6>V*7N=QVRaterWAFqulv!65m@n26M09-2s zb4LQevp`8N0k5e-v8zM6rYn$cGK5tE>F8~vkWF=MJDQU+#xE@S>7$gXZl!?p6Z8#~*PcRrpa+xO<~Wc@Y!~;3`{O-*u4vL%R;OST6`|@`J{LeoY1X3`)_<`d=0vRYi&$8Sr zNC11Yva|MmA%MeyXW3a<`xmc2y?@`cp&`q~>n*dNe{=Lpxkbu_+%1Q)kIF250(3L} z$o@e{0DaY;l;aWt=p*`TwixrT)0CUkM}LYjKg+jXSe>ptssGH*)Uj7a@M&PILcb;_ z3m_b$Kh?*D;^UG|O7dqQtF84>$4v9bn$IzrVWr_%6wW}F&*9&&g^bFqZ(wKc)b{!| zBmze_gg-ZOqTpxbxrjJUEGN)w16UEGst}qT+({DMuHy-Pb;{&C36A#wc&L$RDsZcy zOr)EL3IT{ctk~fA06TpE!af400(TbN4R-!?b-U@F`UXz?0FJPpr`ujdQ;~yPJ`smH z6lx>8fg9**){8~00Amof2tnJ4!4Zo>GcUOttY0lRa4R5pHJXfCzXot6lhGzH^vF$S zF3?x+I4+pKALQj0jm4faGOtdshEv0pMC-LsANR0hgP#VdgWUvUU{a~!_$abH00R%5 zfNPF^h$}Hr{m@t+$iZeat7R~})DhM)$VeL2p>}VsZ{Yfy>}H0Obs-1m@ZblLD0jF+ zkP#Bc;?>XFmy|&EK?3J56A0W$sGG15+7u7g&wnfUtzSko1-nDx0yQ$+KL$&)(1&G! zyuz*p>!$%g4!%qRqcWXJ-Q{$(3XRr+qc>IS{lI-XKy2qZXk21V3}&Y9LIRRzXgZv$ zq;R#SC&phZgF#6$0zlT41rJ7=n?mz&Pyxmox@Oe$mn9h?d`KY)Ng4oHzo^GtYBjH$ zfcS!XO|^*n{xTZ4ze4ISLn!Uut1nDM=9a}!aN454!q_bL?d|DdqO^pdSkxmJgiE$j zk7OwIfAEi7CZ}_%Opsy*Yu98S|KeHUefR=TS|Ld|*UD(IlXvES{8AQM#_WVE;b_Ej zdSEvXT5O$bXO4xXg}%T0_LqD2IyyQUF_^@ZwpaKyuI;1{6eG1%AF_wY_dLD%EDH2}ZZSmYAA#)^xR zA9fX$SML>r6Dh|NuPOw(OaieSC{4~HO01VXU@ojHjoMA0a-wS z%oB&EmzMUnCGwL%G0cPj<{~7tU?So|5&(Su0+D3~?z66;{r~^~07*qoM6N<$g23nU A+5i9m diff --git a/public/img/emoji/tshirt.png b/public/img/emoji/tshirt.png deleted file mode 100644 index f01110c2af587e37e7f6663eb39a085bc05caef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2794 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 diff --git a/public/img/emoji/tulip.png b/public/img/emoji/tulip.png deleted file mode 100644 index fa3ad819f921c45117c3e2dfb0b0252cbcbd70b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2955 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 Ba6bS5 diff --git a/public/img/emoji/turtle.png b/public/img/emoji/turtle.png deleted file mode 100644 index fb4d064f051e7f700e188537c6df204a1ad4cd3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2767 zcmV;=3NZDFP)MpC1@B)fi^*eG#_IUHE1P8 zeKj9G6-bRcKY%eVTp?wkQ72v=c&S$%Q57;_AsbE;EMy}+e=tLcHBpvBOLH(GW)wVb zCvB-(B3Bt}wOuT5A1Q7eYNl5=b}Kb(C}^TpSf5Krh&w`HFimJWS%g7*t6MQ?CuFTw zk;HH)P8vjdFg$fIO^QBjno&xEJXV`XCPNv6wq(HeoFPXSJ8~;5X&_FMK_XlkPjWj) zWHdEzE1Ar9bfr~JdopE|M`y5Es@;Y$Paz;e7B6fhOOZY|S0^7*7du=lozQ$~mrRMe zXkMC5Bv~9@rckZoh<~wOFH9gqcPcw)Ad9|gquPT&c`-t2DkNhVR);$;UnX*|US5ns zLU1WJXfI)_Qz}RtW0^u5Uk_7$Hz;EsQ;tJ)vSC`3OBqQKJ8m#rlR03IMzZFQTZ%q$ zx@2^|XHAJjfw5#+lSW*5NHtR=Tcl1L?u3nYNb2L>SNo_J7O&2Cq zATL)Lo6dP(kxFZzOQF+%b(LN-VJ&ZrS!97uxa^WPS|DSdQCN0EOMNYf(|Ux>b<{ee#&s5*LyB5E}7DOMMOqwh*d^cIZ{nm7*u6P00012bW%=J02dH0 z9|Q>j0zfoXx&B?3I%UWGG%O^(K8x|Pa3*l}?0EixO;!DUrm?udq@9@WpWsAl<%na# zKeUml!_UxFNqujG{l1~d^6cgG&&JyM`snnGwARDj2pv=a00$>YL_t(|0qvFpV54as zhm+bG+qUiX?iqEH)Ui_~+r~C(+qT`YZQI7-{n8GT&e`|0(Leb;FF(NkuKb_>^M7n@ zW-b2h55L}K`PT}z{zm`0LB zx_F`OU!1r3;Yh=NgYeZKo*f~zJJ&e=#e!K^Wert^8_%A-(j)do9$)YmcVV&mTtiMy z&W-ydQdUc3;draRRIpK9pI(wKla-N5MSYQlI)}elaJ9OuOn;VyC_T^@*>t>n?E9}Q z9A>(>JC3#b{Nip9Wr)S%3@D!&dFJ@fCk@pdW-R#j((cYZoj0d!Ug%=+nMrhRS0fPW zeWJ|B3m2S=C)gRQj!vzoGz0e7z$ao=RG8ZXSMqClsd&Q|_0Zt=E@Mb+Pp5JRGB>p_Lq31&fu<;uq1f@5{DvL!_R9`E4{R#Qul$V#qXuPVFL zs#I0-nb}bAAW;hmvXhuyTI~rbn~6@lG~BV`B+{oh}p2zEAr%6xnc-qP|8ZRQL zpdg~ZLfN|6{A#*8i?8I|*|(dR2WNlZ4D5gLjMWm7r$@srFibgzpzIvs}t zEt5k*98}rVeB#f{&ZCR7I-J>`_+wBI)zi}xiA181KthH@034a^g+fBrnjJQ_bNcR&j&BzMttz{ zO|Vb+vMDmM>8@P2WcKXY7)%}z1rFi;37{nR#eDVY1*R#py}hra?($>{hwo}?x-o#f zygcX$bPF)_3|{guUwprE!YBLLc4JHFSwu@@)8%O}iz&j}H*OtEEzZ?Vm^^Xf3 zud91-4Ut**rPT{|}^rWoX6|iaDg=Yk3itnD+4IcSc;|sx+>vrFPtSp4=PD80;o2kG- zlTmVKe|j~kJ$e?*QI~rjklX$J(CKeN4d}u#QC5by`ikLk{eg|PCV~|$;wr;_nHbSh zX9JfSuijkRDPs=~~ap=tWkeM~`xwxMRm^dn0ac zBS(%J^{XYAyza=X43fUV@Ulm-6-o`}LD<^b+GdgB`QE*IpP#IyOkBNv&MH^ex%1}D z9|JLe-dtDLRdeQiwQik9<~{_e{#^Cm+O^i!c6N{gY8@DCY}~^ioIH8*L9NfyEpG)N zzh=!ENH7-&wy)l@W#+PumVG@vdqaK!9}>JDf`yY$bVqdE^l@-2Xb2-my1CiE#W;r1 zqpjd@2Mw2lA( diff --git a/public/img/emoji/tv.png b/public/img/emoji/tv.png deleted file mode 100644 index 2b1045910c8198b780452f5a00f41ba41ee548cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2622 zcmV-E3c>Y>P) z9ST=AC{rsM0000_CKOgMApigXGXMY{3IbR-Eg~WxT|6#IArKJ}5hy7u0000C3=9ng z0t^NOST`y*HZ}$Z21+s}KqCFCr!?6(S`PMoc9)Jsv15 z6#xMMB`6dvG8s}-M_*x8O;18VM}K9)m9l zTOtZ6Ef#--hQq_dRz^QmGb9xn2Z(H5b98iUG#cQLWfBVrBPSBEv9dlzAuBKwPbwEx zS4k5V1xX|m;+JT;y1JjBq0dwrEfxzkE-WiA7g8)7P*qq+OFUX#Ph31ML`o$`P9<(Q zA8|Y-gG48EKPNvvL3w(5TwPo`JuNjE42?DpC@v2f9teFq9vvYIy}i9HF*Q~n2&=2C zqot-pMK(u8MUp!a*JB|pF&8Z{7cQJN=!c_D-DH*h_A1&m|sG8L@m6& zz(Xx0x=|Y_ARk<0YocdJ#8Mlrt*td77luwXv~5UFLq113HOEdCUPCzMl4VFwCp0-F z!*fX+9w60$RP>{9)Q)2m6%ngpJfWhczJFDNT}x?EM08tG??`;Z0000&bW%=J0Q2+n zH1qR+161D#-}5E@I2n&$WFn`jOWf(vE~3=; zv5@Yc&%v4S&Fc5xs$2j72CGR#K~#7FVxTs#3zrqeEz2#n*_eO}`QpQDA3dHzARPMq(TMUbI^-fLE*CjF_`1I~gkrPC7eU^;^(ILsf zp`d-iN(agH4j0U2xZzyl{E@iXRt4tz3tRO0NRCiG{mXuqf*{u?ZZQ-i&gCe8fkDBr z#!y(n<|4l&H@X})pkl4g!vzN-K%nk8arMO2tHs6Dc|>@Cay$UO>cTmVEDqp!eYB$; z@95c|a5lOWHjTS)nA`O3s4Q_$$Wr5&8G_6vNR_y|E6EJWkUCIzcX#ja?NZ}C?u+fd zx9@|)=YIL~M|}O-jt*~LUOAl0^WX$|VJB|^F48TGFF<*4D))A*#qPhud+F8wy1F{J zNY{@aZ-e%u&<2cs>D5hdNAP3#t>fm)dzx&N-|t5^aHYxCz&RUjNNL0_y?c4n`&$sO zChxK4$b+*`6{@nb5-x$NzTK=kd;dYp&20;7f`DZwUR-V6bUKq^^m+!$3=U@C40HJx zgt?-+6U#8**@J)DR^O(R3^41mFz;=mo$j(7JP}9#0}Mk0U%-IA?rP??KwI|2M1(FTW{-sy0O-9;1XRapD&k;!dwUi!m^c_g(R1|( zSQQNP08rng;}7nE!ik}ogS@VZAp^D5nFR^Dr+dO9|EKUhPjw0T0Q3a|%LBlc@N;cY z93eD*E__QUpicz$8j{=MW@l%U2*Ge%Te4v<04+GMDgfAIT4hpFGO?s2rB-H>fF9Co zzyLr|vRH~&4h;<{zY7iURIH4mL}0vUIR@+q0AaRRI8MuN`7T}ya;z}jj2^+*yc-EXU{T_F_xxBweof1GEe?n;;#kRgcXP7=UI{FP!qD98 zUSEQM-8ir^0HmiQ0t~EXad~?B1OhUOFrZchCeqRnG4FPR@@+6MkCvyUiNN1DAifLQ z30BS`qGUZ*30e-*6A76JSdBe`e@*&&<%C=k;4S0+-9B za=A{P{D;uVlhPzp)B4{C1}xoic=~GVV03hJ3Yk=OOovxhJL!bz-gqAB5zc)dve5K)%}@4oBaRL?WTi4GD%WbuB@U5mJ3kkY4+Qenc%lLpU{C{6Z*sXB?ph5`F84%D zDm1md<71Nx;F&vf0xKR#fqRmKPvm3fc4AwEO8@`> diff --git a/public/img/emoji/twisted_rightwards_arrows.png b/public/img/emoji/twisted_rightwards_arrows.png deleted file mode 100644 index f1c11dc3a2c4ac2c0771b691a9d7e345cbd5f0d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2561 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 X=-m}ur#I5|00000NkvXXu0mjf_xBGo diff --git a/public/img/emoji/two.png b/public/img/emoji/two.png deleted file mode 100644 index 9b9c1920d90cd90f1cd42fff05f3b86d66f17c6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2301 zcmVr9o z+iQ@rnzz!OxYTKmuTyZ9p}p6iy4Fo-hpEHckFCm+u*_(Ut%<0|W{Rp~g`{MMr--M; zXN#+sw9u5Y&v28qnYPhxlecVqspv!cD&Piu-^f1g}_oWs%JNn?Opexg=(lT~$^ zVu-7#!rS}&{aAXPi>%6Bfuyg--DHij{QdrRn7M~WR1g{jM9m%?qF#gMbocAC3lf}%=gftRz- za+tc#-04?$oIzM}WQ(q)z}m>z=kD_MM_-0^oWI-T?X1PzPiv80gQs1U!hNE|lB~wG z%ie~k$Dg{>imAsya-2$eqBUKWnzqoEvB{*q*u&N3+U4+JhN$ZD_+OR6!pq%fh^b6y zhh2%TS%jxDZlXVPrH7@$V}+w-h^cm#vn^$sFk_TQUwhf!=qOcQjMgn%DutWeD#kS0000pbW%=J0MF0Q z$(;2ti{TKm4S zV9FFtVtw|ZSz+son-ntUhvgeI-hOlVd$HLvUqINyn|8bottWJ=aRb?_ysyCpP<4Mq9 zFt!9t^mej>0fA$Q2ac8jxRsgOmYRqd;&Z`7i6bWXzl=roum|DhCPSS>dpVcOZIi-7 z3mEaBvSj~P3;6f#kAU2_g}>XLJ3Tp8LzAbR3qq;Y=RLm=U^35!L1#cr--U?@XmmqUP1wKx_1j^je={;nb8Sec zsRf@fogEA{VRyg&8>vV1Rq_qBaByaRf(kC{3H3E#clG>mkKb^10e2^(2y+TtoNtVOj|wgs=+RsNWa+vE zw}A{z&)^a&`1I2GBHDfoTGCCOg4Ww$sObEqPjLc(fT%ONcor~|pxAro6K9aUCv~wC zj6B)tU5p8gcIYjb9Y$)w%3F&Q+**kUR=vEl{ohLF;<|wt2mt8ZMtQRgrrCWZbd>aYcEX)^P?yo-i{uKD<)%{B$j}~;89%9CgRPFTi zV1m=rnu^>EqGv)E<9BcpskH9SP2lS3RKh{@4CrB6I1|f+e#CHUj9?gpEH(v;4Cwd) XdPrg>cHpZ>00000NkvXXu0mjfNyTw@ diff --git a/public/img/emoji/two_hearts.png b/public/img/emoji/two_hearts.png deleted file mode 100644 index b370fd796315bca3168277a85e8eb6a1282a4a5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2128 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 Gcm4|i4IFv^ diff --git a/public/img/emoji/two_women_holding_hands.png b/public/img/emoji/two_women_holding_hands.png deleted file mode 100644 index 6fd1506acfceac78b2a3f9b959bb51df16a5b9ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3464 zcmb`J=Q|q=7seA3i4j7L3N2BqMyx(+@7*AXt+v*vUDYa4H6tWi6s@Wed)9c2QZ%)S z+N-TiZK|lv+xPt&-ut@FeSi5~=fgQ)Zal_F7e`k{dU00W2`4go`e005k@wi@DlH9^nyNV5{t5)thfb5DrInzE(t$zE3GPrJ zpdi%t@3zJ`r%HR#v(LtQq(VgYtE`v7y`Ko zrJg+OM=HjMf7%4 z(pL%DCcMi=15sC!r{5sc4~-(-*PJAWW(JvO2irJniG2{3TCR@UX@2=lTic$;W2KH@ zrYL}>gH`bgmB`7b%H8_;K5nZisl)a~jG}Xkm-&#MPX9gAPTZrF@`ycC)05|;f6u<# zl02CC@K;k33<%uAU`|4ZeyeNkTUp*@f*nT;OEbZ^XrNQM!Eziddj@wl-bc+9K4qna zoCFOlm4)*`p!=UPz8B!WzV!0Aq?_IrN z&3R+4IDE^!^=znAgM;PdTT{*>b0jnDo8&(S-8o}fLCPTOx+sTv1(ltE4r}fwD^7LK z_@wUeUR7b?{Gz0M@U(wiNhL~9f#O_q?BBPlr26Yg&s`|}TzT}xVtb;nq7FAl5K`KR zowqsBvqezsa;sNZfNz`}sz%SWX=3uqOZVVw@wTpBf|Ew0tehvD<$S8PMncL)LC_cs zed1*N9Er@4meLRx(1*GC>PVe-yvfkZoiNS&`6>HnHNF`Agy{-Uc35(vofk=`;5%rwkr-b3}8~LhWPFs?u?~vWi zbmIf;i#3${$_R75A6{t5UFYVUe@*)68Ic5QG_ZVa25MAnam+=lnwXRd=w~`8a934eeEb!I>ZDCQ$i`9C>cNaDMig z(!ORSdog`3yHqjh<t#gW;~&G=<58lS#*R$zx+LXD}dg@aXOR z^`|<_DU&{G+1=>Uvc}!P-<=`U81zGBf%In~v&8aFqAwRi%Rv=veL~l+f@GJP79Qpz zPgb%G&(eXu+v=y0<%t+h{3q|%=?#?cTT&ZbBlatI8^d#-9W40Y-?82ho569$+;er| zs_n}n;^B>n?oR0tO&na)Y8eXP!5se(goiXddR(MfrLu5%stY)ZYS#gT4NjHqm^xEw zVAa*kxg2FuYh7p-cS5V02h`o(2`}HS^g*IG94ECi99hQi6AM|wFFGKR zS;>`G%%&vTOxfJq1o>-J&yEi8LRXhAPh_NmG9$1k%tmrPX)1kXf0VM9HRqAEVxfYc zP)yG=Jr}iOC_su=;_=4Z4w=k9SPW+KwT;Bsos|aOu?EY_p1(aOlw=#GKE$QnlTVM4 z{1Yhk3GdOVp7;fvQQxOya;9#;{sebh)NresW*ApilJ76-;Yi;#jE!1peMRPxCk)xK zECmm*a^xEddcR;~#O*(hhd^4-`w&6ryFK5MCEX@C8!Meoq7L~P8Hw`rHET(?2ZK`m z=E&-2CSTZ{-%s<9qrk81s*Amj32A-k5H|w@t%k{guHo6T7oRDJ=!8;@(P9@dXQwnm z8#B8Wz2*XAF7EY(Lx_e(WHhvGi`|Mkujc3X<>yW!GroMB^u6(bUiFr#*Ihp5ryH4x zHvMF&etc@Jo$r?p-~BHj>cEVuz+~41nme4-ql>-*D-{}}(~7^6hz_6n`OWAPF}|=X z`(*`r$F~OhI|7di7+C?DFW)pM8~5Ktt~aZX+(Ohv=47p-zt%5Eo;v0t2m99M@A<#( zQ(zg)Fl{>LUu)zL`Ya_n0oIR!L#nf|494;Ta`nAQcNX>Z_q0+BGJ>wH1F}2wr<7C zKdlGDmx`>El19R78IIhQZ!N~H==|JyzgzE4HfJ_kloPKV=T;l~2ZwByVlPw`zEJ7- zizO`X)V}4arYqyJ9-sc7*2qbZ^o+Y{Smg4|0!CzX9AVv#QhI{?+^*AUnIArE9M*BW zZKeG>IXGY2(bv{*6=!fTP8Rykl)8oQQ*6*UPcc69nXD>#UD}AC~>6%YUUTgFD zSpCk&Q}3Lc*OinRM*?j6=;h>4H==P(zs-CwG4BH-DqVlk{sr!eQ)BasyD{x7%@BYwEI;o# z8PSg5eKzM^vqCI^6lqFo846?s92=lGr~+03Em8GIxo)ID`Pf=dh1qT2nFmxeF^k0l zuF>CnE6gink=s^JnWY6(ac6EI#>Ks-_>Y1fE)Y=`(?_n_51i+mO(aGWoL;JDOSu9Y|ETqZ2 zYlvga?bRzyENxG^$oL<8@|>H1JtFQrGhkJLW+UJUBT$55tzN}gASN3C{g1AR1DcQiS% zv+`33tOPe1PGWDTv#H<>HdVdubX$Mq*>0B+a4wH07K{uHk<Ix(wp#5u-?yxcT$qB;W{)gOT~>ytx4Atl&RE~!NFoZS z7qK%jXE*(;_>q4+7HU+{)@6BT$7xuf&@s(3t4?a-Jfs`NUSitm;7W>cQHmzWz~Je1 z{_JPlb?kRqXiM=ZR>x?3Jl|?uYI_g~pm^u`&@IVE3%0@96AC*hTOvQTHP zUa5C`s=BV1ONw--`%a5ERux|on8G#}b_f~Cj1Ig~w(RTKG69(X6Z*YxZ0nIo_^GNc zR${eE^2PIyXXRetX}f73GxMBm6{NVFEnGb9Ta-_6Mc!-UBVhO+>|H%V7wz9V3DDOz K(yGvKeEuJXuA0&S diff --git a/public/img/emoji/u5272.png b/public/img/emoji/u5272.png deleted file mode 100644 index 7019a42b05abf00fa2d3e7fca5a0dff2af6fbb31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2685 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 U=DaNa`}d=>r#RUZTYDw`2VF7c;s5{u diff --git a/public/img/emoji/u55b6.png b/public/img/emoji/u55b6.png deleted file mode 100644 index 902bffb788ab079730546f30e1b2c2253fde5ce5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2428 zcmX9=c{COH7r*ae2t~*?mQhiW28FWZ+1Gesh=`$Kl68uNtQlJ`TcYd}Ka41A_9c7a zk%WlXPk723l(NPBy*a;o&i&qd&b{ZJ&;5MvAKy5#x#3<;QBDBZYiy)v$&93bor8t> zW5MnYF&5uUV-Ulqy518c_71R1Zpxm@Pm67*PB-`M;eIf@?AmeGDR1Ax8!p zeuge3AoD@nNeGvP+wu^s0;&2Crv*tQh|z%(1$cBEn&qHg4xY$Ep&_JbLb4vDn*lP- z1<)DL5%40Q6JQ+~9RO?1(HAfTwrl{s0H5mN4M2Bb7y|||dn_>=YFuIGGYzXv#-cbd z7;vryYs~O(P25_+!c#kyx|nkuqX4f0+5%n!6a@sp$we%b!YhEk0hVcFsv-IVRvKX- zU|$Y~0%pkI9>BYtqn^Ns0L(m!{^9tSBBn`U@o7vH#G5ec28K9)l!=B01g^9$A);VHr{;|;!_-}Q&Z3$T?YhVfd1B*4_YbbXjmhc8TZ zre3TUC}DTUM!6wAV{%@AGHj(*z@V^gQzLDA|H(eG^*SGy`tz+|t;wU5 ziEw5Wt%UHhFa{mO`xmh!63?ol2^;zepcLRfR?L^&Wh&*W*r@@V3473)`vV#17EGo3 zai9`k4d4%~SZ6!in3bxDN$a% z)tc3}6CJ89>3UIH+w#0S_}%sejyL51Kd>3=X#L-lQ9tNplIXshu06ve7Of5b) z_Sp?b~4zD3+_m4)xWb(#A-4s=-5QGI_?WhJm< zye}a=&1SG)IgV$VzUF8mVHfIk#xByJ#k8}2F1gp|xAFRr)ejdsW<6>3s}&=*ng$GXjd-0tYbGj@8nm&S%C?)rpkiP==9^o)+U&QdEP3|(f;w}UPmYf^hT zySlqSyI!MHH%mI*<0`c-H}VTPW%RSAxX^a2Jgw;RLQPFEjpg%Wh%HwhKIwD^=+?}`YRkXCU%(6%fou4_+ z8P@t_nMRPjo|od0w&s8VXNu$_HFjcn0iyxAxknF2ct{2cvkmb&6GaAg zr%t&m5MKJ{w{@IOdRV(ZiG#J1F0e0C?nGQ23VJjToUPqwpcLoD`|-?{wimFA zu}J?XFtty>A`7BDX1Tx9Hu*JlJb2GZn-lzv56KQG$~AFM=Mjlx>?ggr1GK~GI+LFi z>7Oam9^0f)|1|qDZ;yg2YSVg|bQ_K#X+;%*+`PU$Yz>@i=TudWz5e+3$B?3Moe0rB z;2%#e(sQxY36LTwe3DVtFA*oAA%RVRBa&RLQW3F}JL1(8x`%kI?_8Nc%F)YmWEuuU zc(XQPAj7Id7a)ek=TG-a#v)=T%=nCi3&Art&{p(H<96iOa~y*jVLP z(l68r<}xQ7Fg1xUYBV2Q;Of+A@4dRR_*Uu30pn;FLayY&u|6xK6lDgHXa4>|i4oMk zl>AY_{Q=LZC~?U|vaC(N9QD?aAbs_+aWZyi+RL-q*xrn-U6x11RH|E%fAZrASD{|n zWjikSw>#L{j?8}TJZNGu8P5!_9#h0zFN#l3w2J%Q(RNj|Xw-A{Q4 zUJ8O$*JK@7ckAxa`U|U05Yr|^&3da}y1$qE`M8^{8tXK-+n)MQYP`>beBQEe$yPNh z5Yr=~lX;oNZ|~buZ>8JD%{29y6lvL!FhgkKeLJu{hGo}Jcpi@Z^=P>LhGtXK zbGBhcUAz0iXN+F;I?KmU#7@dscz*vSH)k$gbudJ1`_zVMM_uO2tejPnT9qihI+ZX| zRZ#4mJ;C8J<@L+qwd38EuP18YP08{7BU};`{q?2$s*OcT5{k_xNs0Q6npej(FEoy6 zE-e_*&&3b_CzRII{qxqWZ?H*SF_n}@DEl8{Y;11qK00kYq5Ckzp_RRM>Wy*wK4JBLe@Vvr=6dBi&XNBE+kUwl diff --git a/public/img/emoji/u6307.png b/public/img/emoji/u6307.png deleted file mode 100644 index 4dd58b5cd1aa2d5089f41a033e77259a4f4d7c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2736 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 diff --git a/public/img/emoji/u6709.png b/public/img/emoji/u6709.png deleted file mode 100644 index 33b8ca816f9dfe4281c70c1b61e44515eb150b75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2312 zcmW+&c{mhY7e9u{AQhz-QAmiCElVNUNn;t2Mj1&6pQ2Ef>~CZjB1)2!WX&r@^Ci>v zj**g-qSQ#45MjieZ+z!D+dcQ(d!F+<_m7+EM79wZl@$d5aXVW}7rr%H5|SWam;Mt! z1|SGd4z5-<#~rFIq1u)oh72pHHic?~C7%Gm)CPrBOMaLNr0BwB6}Y{1Y1#RIU1k8C zIzZP2CrL=sged(b&a;9<6ZqR4>bF7m258e*%D<-p*KHuf2r|te#}W!10QuwzNCON8 z^aJz)JOy|du*C_R?2!uCOvbwo=mXebJMRV<1?USH0318OIKV)_64kr>-4pyHE{ng0 z`VvWa2JkrGmv+3e74L4xI!g=#UV{ZT*kP##t^@36V+3F#V2uqHZNh4Gj0LPV=?&uF z6N5FokpjI(0o4Gl0n4>}9RaT!pcrtX0skgql@S(N<9`5mTE7SdtkA`#!I*0KZMm=gZ;vr)S16 z$1hs1&31%e9x&?)znlRttiWJVBm-&#K0S|RHM12u?T3MrLHrmEKTB0{aSrP!^gx(? zaI7y%0E^tvOB&r3u{jZI{jq2b*4ZK59uu{(_Y;my;C2)2$;awVSg{#DJwy6)9C?dJ zjIcfiA4i~q8eY}KD;tm&G{B!Pvl$;%;QK4sYRd41QYSz&{_JkCGgi$ovlhQIaVOxz z9#n)cdD57i|NHe-?r;b8c44j)o>#&%`|!9VmRaFd8FaTtC3RF1LoIo%OvRzs7$Jor z!APNE=w1wW#l?|xQpOMYZ&dZ93z-5emgqAUOJ)5_qO43LMdPbY9ZY1^Sn?KK1qAtEjvAD2SCD-x^qx;nTFP#^I_deE|v7d?meQGjw zlysB*QK&L4yX*4f-|f?cH#rNz3q0TOC(joaWe0V7>g!%k4R&O6=Nb2MQ`cuoG1W>Q zwiTZ{-KyInqh1is-2>T;A|%p-i4QIk+7W(d#ocG~{nI2#@K)y9yOgBLa{J$eLxCJ> z@&nJvmCl4pOaE_e3M0h8sW`D}iH-I#b&i^1aUFC1ug_Jz?KK{%T1L7~UWidJ+7;XK zAc?0)cDZ^?$YzS(jyk+^js zQ*wF+yl1sX$3Y~ANvZ6byCC);$2cI(OIc!=Bi}J;5>1MyzLAz)PI%fA^1R}UL6X_x z1!;Yner@_tK#0Qebz947^lFcU9J4o(e;cYSWmzm7+-#W18Chn?J8E5Wk=blY2+0bP zAbxkrGyC3pDXdT~%TL}bfi4nS&`|NId!I46CQnqZJ$XP+Pa%Too~KN(bIWe}x#mn8 zTcSaVsM6~ZR@ady5u*C5%=;DT@_`?owU1CSo062w()hStU}~MwIl9UZp@{p%SxLhI zD};C~;hw32wZ0Pb5+>o5UnWHic~`ho%%)dTA2o3u`r-3q_xEq%YSvXwF2 zVZxia6d^?k-}^*h&tCELl5owA<$Z4Vh)o9=rVT#>1dx4~YOj|1!nW+)Xp?SgYP#Bl zzED#I&6(Mn5-HOd8n8l6Yro{`M9J0OHOch%cj#v2Yk$Ut58q~v{gEC#Um3P{>qyt9 z^Y)42%M90Ntrq@fHe#kkE06U|s3V5aG_SkL2uY^KlTW~&r@Px zDWG$a7bQ#mDQB=MNN0Hjm|XZuhPZ2LNiQmnvUO&6;9#(C>P02jUd{#T8`{#+waNwizvhb;?-ChvXLtO8ha!?gR^*KWSE9XLJuY)L zXKxdlkU7Y>?QySpz@t{=n}4YOs@sC1+(AeEU5m-Th0A%36kWxvvrFH zbA|#p^i}PVb8<0XwkD*|LkeD&iVSu@=({U4*e$z zygt+xBWu8zdLrMiUYt^4(3MxMyNTOkLwg?a+2PguMyJxw%#{?W>587|U&~!JM!ktg zQ#b``+pnwEQVyoMMUld!nyBVdDltEm8F-6vNkoP zY-L}vW#313Q`Q-#VSak|ocp=we9pc1-0hDWZ%#Dg_q7kuVSlKo9^?P+$vy1^{OOxC;X$@F(qK7)a*;!2m=;0h`V4M1WQV=s$fmzT2~3c8S>9{^TE?Fi6 zwje+e2dL%%`)u~|$>VgQ@wy>l7y{Py@IN46*U4@i0!lf+n7#d?lH9I?6-`rZ0DvtM zgK0P@If&X=?|_1D0Bl~+o8^XY9hIDIY@APiym!zZi}eM7el*X)V3!W+%*X z`1uVH&h^0o?UK>Ds`8Gb&8m{zn)1;_KCYdq=~<6!jD&}~@82?Cz1)<+F2=_0tgI|q z5?6zgn`B?LF%fft& z^8`j_`dVrVwYF|M=jre9@%a;q?46x?2w?U0WZ%2DQCQF@z&{%vJ}1ogU0!zUOT*X& z{dFW{nm}L<4bcpA)&u<(PoJ6;5?tx)YsKSNXJ(dsZWLr?4Qr^cm6x}~RH!dNZ>kZS9}pm>05gJHFT3Vq*t_gJHzX1d`AfHo;lk~8b?mh$ubVB3j@Q^7tQYBFVyI^w1{wbz;z}JB zLaqgchSmkZ9lVpJy6*dFrpR>-&SQ;y`Rl_K=W~W&p^hDI=uIm5v2z$Z`$#bk@_*)%{BKoV2XaFssdwi$VD{O$EfUS7`|CV(=g!_MWGD)5p!5eho>y6?zk`| z_zVM=Or!Dg8+OelY02LT_Yca1U-pfds@u;l5+YCX3TY+OJU&CSU(Qdt-}jfDg!^h% zMZ@b$VN6lJo&4gYQKbjlI_a0s3?*2!>{wYjJ4;TL%`b09i*f8amy|8R_`>k|D>*&b zV!yK#S9iuQ9{yy{Lz8|E=YqU05*+)Z#g0~m-m}B5t0N-|-r9GEh$LRbxQnR&W&7Ep zR1&u2bQi&-(p?kxP8S{)3o(0BIs0s&@b^O)f%vkzdo+8N)Gb!C0wQ~h?Yw0zMN<* zsEmU0+|0sjRA^~;dzAlx=(ndB^^@Dukosza10R@F?$$7JPTBgaA45WOv)Joe-MU;c zx`hqaHa4Ei_Ji)rmFh09ii@+;^788B_-i)tQIOndMX z8}s#*BZZfK`^}Kvwf`$f_<^+a&9U`K{&iL*NGjw`l(4#?m)*&?>bFNN!*yT3>+4H= zF5a%f&*h3mD3+Fr*nYK?V-4Y_J8XAm z#~w^Z<;e(`u9p*InmS;)gLh;t!W=~*G&jGO)b>Qjs~5(#_#W(UFdU=DH8fnkw-x24 z7IWtz$Gw6KUN`ks_)E+?jP;OsGiZ-Wy@E_RrA&hg3XY*Ctx9<(E*707M>xeya*sSp zLmNFg2F^XpH_Om4M<=0M2IB^;Qp*}h+2{n*)O0TXO$fSKMM<3RhDPMA&4tV7v+E8I zCOjiV?FYAxruV!l5LXe0wk{vNiuNcOS?vcZjt0A(D_sQc3Aj&ycPDqAm-y)u+1^#o z7%0yysdEME^8J`VK4rJ{y}SbP4wp~!XkMsLx1 zjE0#blf^Y}<-!A&nazorb!{F1YgTw3bt6Xi%GFz9|J+gmQzrv46~14# zuGA#LT~#%4%AAG|XH!SKzqt!=MT7D8uw@@{(pUHJ54`^a;)%`ivaEV5!Mvk`Y9{hg z@i_D|2q)H|IuXtZB^~F8Ch0@F$+iQGej>?vUK5wIvI7gr*8>lcWDb#f%%n{aQf}%N*=QiyCD?vQIFWV5WzS4RS>bc35u_FO^hy%LzFOXYvi;6y8wi0C#!iIP$R4buP8 z@LST=b#9RK-$Ol;iHdWo{*#|0_)+y_<9gTy)Ymi_i>owG9@QkYpe07vj;c<15TDUA z=V7e29|ww!KX;y4~ zL*YfYF8sU%D$F?5n)$*Zu|Y2ZlAj(QQ;+o(z4p>fUiM|h!VAUhPODpDUMt3;IwikO z;T#Kk6q`hS{R8SZFI8JWMU|ATKhF5y5Cl&RAe2tFeP@7ylE_P+h+LR6?xOJ_l=-+~ zHg^A&SAK)9B1A`#L8YM%6Nky3ap-r{g4n7|&1rV}z|kiLrv$*XG7%%$U!~k>H_vRH z%U)h&wvJX$78^MpQ)BVNV7TXY^;b{e`y^@AEe>A-MSll<)YztU8E%rmoo`huIbl)7}sm} zxb?A<@IpIQ;NUCFHDkK-Wu)1+0xkF7M?B2jm9gn(r)BfKsZYCO858qo2nE(I) diff --git a/public/img/emoji/u7121.png b/public/img/emoji/u7121.png deleted file mode 100644 index bf5db07a7ceb1ab81d3a89922d9210fc0f2fe044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2630 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 diff --git a/public/img/emoji/u7981.png b/public/img/emoji/u7981.png deleted file mode 100644 index 1bfa62e05843fe6f870ec30a496c32c946913445..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2793 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 diff --git a/public/img/emoji/u7a7a.png b/public/img/emoji/u7a7a.png deleted file mode 100644 index f0e46c3cbdadc99dfffcd03daf34514654ff1d58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2560 zcmV+b3jg(qP)pF0000N24xurYX$%s6$MuX03!|pIu-|D0000Q2W6JR47f>5 zKmY)6QZvUQBr8-k$Se%0FATFQ3#29qnk)>cC3K*DMUG zX-(8#LCquykykj%Fbuj-F~(#_(@rnNRyWEa1Fl>>&L04&Aqjn1ptxH z$nU6|<&WyUWq)WTH(;N+|WxN4(Gy!;=6pq!i-r?(XiXySux)yUTlTUGAMA(`62H z_xS!QnRD+q|0MMJR~a*T%G?nHOd2tF%H%Ob?~fWWHcH_ive<+We?`>T5u*&g`^br7 z{pD^I4V3LmjoMCWsBn|}kDWO3+raEO3VDNH-HuZ=nZ+xND9)@owWH3jL9UoH8~^_B z(f%w+cT>^UN)JSz<_m3%R%6Np|#3HHvB}BFvG&j^%t3(TzWNhuaBYJvt=pL_ zTp-^j0K=0?FXXM!%FBZRtE+4DCl{m_3bCb4{x<=E7Z38fdVb%&wK~_%!@!GcYxVZ+ z`~L-O>m|Si+?Y-QBB))OjC5XEsq+#BuDsMAT;&ANpy2{?l$y?W;sSh`TCGl?-?(%17y@|9=#jc#f&E$a_2wa^ zln!=I{B$ZR*9Hd3J*l+x1TG(7F!=NvdCHsE`&%Lz{PZ2*;a2^*mKJ9H2jt5iUn{|i zo3MmN^^_071vng9qzqiqKj(E-U)%N@0&L}~84L~#{P^kF^XJdDVO0>7bqCTo_<)Zy ziN>J?26oq}D|a5f+3`Dq`6)diA%O;e1)vk@wRuS$H87Avqmi6_^Z|Dl8bA$XDu4d< z*cZ+8HAe;l>4%YT>?ltYQ{mdh9T%XuP+@?|6lQ9NRgAzo87R~-jvzP-g(@+X3f5E? ziawA^A(N<>%I+d;7j(V8-YyBFOuF7wd+Q8vtLfdFHlY{<01}y!Y8W7ib6>-6b1_#5 zUbX9`ECK54l}cqnL0d$cm_#xRSY)}7FfM6vrw&J!mkU)Yp)d?+3xkA0aKHqg9mfUe zU1nM60{!QiIk@y9lbHoicdn~0scvjshtt?tT~gBcap%rT5?M2KFq_w37jU&CYu+cR zKD^qt&5_WjZ5@}YnJ${Cr7J#wW|1{2FC)gBRcUrv=syZH5?;ES`x69QIO$9D z&fUiX- zVyY%EQQ_wLHv;>61Fmk0iJHK)GID^Bh#y|T8{;X!9-P?UVc3jRjTRv>vF28XhJ~3u6#GVygpg4;N<#pcqeyJg3zLc z*lF|WaJE}&Hk|Ty2hm!D!~)tacU360>b7hQ`oN-uwMao9Fd0_HOvqv?601N`qWKSk WAL;vDdf-w30000s|8 diff --git a/public/img/emoji/uk.png b/public/img/emoji/uk.png deleted file mode 100644 index 61993f988a9da9243c328b8c11b9d36ca5a740dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2832 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 diff --git a/public/img/emoji/umbrella.png b/public/img/emoji/umbrella.png deleted file mode 100644 index 14885ac89c9f58f98451b71e0b39c278c0da0191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2540 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 Q{(dtclA(z~v7Q6vKe#!nJ^%m! diff --git a/public/img/emoji/underage.png b/public/img/emoji/underage.png deleted file mode 100644 index e39ca58cddf0a55ddad475c65a0ead7bfb666755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3085 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 b;@AEOe+F>V_^jhr00000NkvXXu0mjf9y4%A diff --git a/public/img/emoji/unlock.png b/public/img/emoji/unlock.png deleted file mode 100644 index 187581229a3ea3b77ac1e62f1c742adc417d9234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2424 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 q5WvmN4dk*yfTn>7bi46000000015* zFBcmkFFs8bQzI=l zBQH2YQ*bguRWCtPEIv;(MOi#dWkFPIK~-)zNnb8LNiID}|NsAIg`sAHo}j$cWrCh# zfSaPd)?|U4V}O}rewb#2pJIQRroq~yzt>@Ymz}xOoVn7az}Tq6+hBc`tHs@6e3hxh z++KQ;XojJz$KF+MhhBS^q`}+Z>GSdR_;#1FXosSkw$N*fsBe(2ZjY>PjjC#irD}+z zpSjX%*Uk+F=a#9f1>g{Q_?dYI$v z^Idq8WrCeufuZ*J`-rB&exJQsb&rp(%4v+NXNab0hon|{mTiovUwf8We4S#4sZnWx zUwV>)p}k>+r)-X^ow(9#iKc*|z@D_oy3E{Xg`kV6#)PB6u*BD5f0|>1p>K_;agnfZ zle7B#{p|7fV}P7@n731GgNUiec$&Jj$JtJ0dPQ1qm94{;vdwUlvh()&XNRS9l(MzS z-KWCbU4NZof}T`+poycqpSH_@rpKhW$AzQ5Ws0j}fuCD?nEn3#;_C6*=J3qh=vQ!v zd6chcjjnp5#$kPznXbX7z0r@W#9)W3zt7&LxyjYu=YgNPWQC*0*5poQeQlJsd!N6q z!_}d_*->eSt-#T)!PA1BwU4K~-{$SX(&C%8&z!i>WrU%Yu*Oh$nxVSS=kD~y)8Io^ zXS>SPgP^!zkGRp=;s!u+f10wi#L^T=dD`OXroh;ryw{?@+NQ+Zp}Nx4;_kQ1;;Y2n za+|`Nw99aryeL?NTZ*-#xXBqzd^Tf?pSjLRcAzU_l0a~q5t8V^0000mbW%=J0MF0Q z&(F{v(aF!x4bKFN2pUK@z~dDCHhZzf$;#2TSs>JGZOTzA9a*^5-lw&-A$U59000Iv zNklROPCUvgbYE4UX z{91p!U~PPJ%Nncdb5dfc`qj1b4Vz20U);B6{`>+wVE+6)`z~%TX*SH)R!7#ap;JAv zq~Ywm-Sg&G`Qimt^MQ)aHk3@P*3m#RK&vsRB++m8$4{S~*8AWE>zzJ-`ncOKu_UNb z3!z{0a@gFax+>3i?_E3z0+;viJge%O=7wF?gz4vFUNGmvgT0q*T!;iVm-armFlPZX zA1wYaN1tEkduhEJ(O~_hs&(h1FT>J<prBNQH2`70-%hp_7h3k0E~a%x?aLu!vZ`9NotiJoOygu%D1fJ4^JST7>OBge@>1=UQ2Q(to?vLN zygo~+bYB=LuSx>mRavM?JL+0}b#=9$hB1Ps`pTsntA+f|>(|BoNjt8RvZ&sbfE&w- zb{gf5?3*)Z<0P7>jdSMgi#R9I4`|;{4}XhX6Za_^vKN=#kb!|9N4rsx?g|v;bh{_F zqv2#HT_Jb%;Tan5k4D@O%>@S};AJh->vp32t1#ejIwqIHozA5dN{L_m9PHomJ0W*3 zqkUNh2$uuuokj;{bCiSf&jjF%6W?5(z{1Ycc>l*v2hK$(z!<@E4vL~W`{1BIL=}4h zI5Opc^})`hdj|~E6aYIqDU^fbi7^RyTSxM)(4kN$g@Il!#I*>(Az0r|aVacKpTk1K9Yg` zgI=CxUA?Y808*Qiy)F!RH~{`~CAndE54%Jlx!J|CymxTF1iX~XT6mWC@Ouve;A+|2 zGKGQRBz^_Q549YIZ{;rDzcM_IjhK1*Fn+wHWgG*6&9HX;`}aRi z7!C%0M*kl>jL&+9j0!NfgRyu~1pv11UB>eP0HzyS;NIDk{|NkCzHAGu?}ojQh3S|p z1GQ$t0*OFi8F3hZi{bH#l5Q6E9*5Tzw%`bJtpvPPlO~6PsMap{47LPF|^Og)4Oay}p3xJOyTSpb(%CYCij&%823C8C`%MGmzM3@XEfZj$D zCFSdH~`xV4P;wb0EPfahTGam zTwCJ^0C+YTd+J`5fQ9OgK@&;<;zm<8j)7YQeg$!p)Zo#lPoEftu|vI30b=H?4K;8X zF2qml>9{q5hORs*05&o5)*sKF{b?M8Ictt7!2A!=RwL@f9=NdN@vo0vFkH%;1i&aZ z&~|gllH>U-%+~Y=^Gg7O6*8~60yi%DHo%V^TL%U)u*NEu{~awy^Bs6$P=NpM?pIZr zp*5E(lrF6q$O?d2EP4PfpGO;Eu2S{y{=W=-)RV4)($UKa@%r-1`Se!dE#<4kqDSEs ztTEuDJs&B+yl>Qc15UrqaNz!OWne~A?I+rDi+xhtG(!a5TU7J8?t?NL`@H7A=HS}Affxz^@C%c^ zyA#=+xlR>kGEQQ8)~69tOAA~Xk_K__A-qVKS)Kpit-_NydtTjL50qAQHijo`tn9&7 zpaZMM44#mZX`iOMLDJKOUabwi-zm!8-{T{!+Kw^?zu$^`#d)fe#{Dp7+iST7McC=jY2bg3m~? y5a*{BbBn*qEl%a*LXp6Ck_=t=2bxJ>lH3854NY$2a}$RE0000|H6>KUn+!ik=c+Fr04RT0KG6DuK00)f&5V<8X&lfL!1{!u}XaF!~ zKM@sA0u9L)Dp~~#g9sNrV2Qg3AHo?gTM8M4jE@#GSpXkXYXlhpGjaejZ9xJDXCx|| z4~;G)O@L2mmBly&yBC94-JOQd4u4MSH z|MTk0Wxs(Ek*GRB>g~Ep^sKwr=il4gN?8Cqg#CDi==t{tS+(gZLG||g-zGYU0}u->Suk0fSAo4OXt4Dk zJD0D;=nybZbEVP}DI-&nxd#-z2%=IQYN{`MMSyYNa{ZiS(QnYgkM zA01bq!zMJS9xJ?Xcg+VNy0o><;NGam>lZ_DElzk&ZJEN%-`SFu_~z!>qNT1yP`#F# zGFgYQF+IOiUDjo9NSD~Qp`)x_Xl1J45OB+afsm1pp|`-lu=L*=0000-bW%=J020?2 zFa-i03Jz2~DN5GYC1lmtPyOQ8{QS(-epB)N!1mT>jxYJOPGGjDl;v3X`oNT$xoL=d z+3;58hU%j0knGfN!KKc=rRuN%00+KFL_t(|0b&?ZU=)l3HdYP}PDU``yrGufxs^*MncP6 zl@p?oLr(x`8XFePoQ&*xI&P655DbJs{e|8T{TaSlkr-| zv!-PuocyafnEv|di$dvn*x6RyAc}u+tUd(P{z>s zmlofq6%?=wCJZu(d|UPX#v>1ggu#f=PaZ9Q`}utUH+Q}uqiASIeF{x{^QFZ%&^VjT z&XTjHl^j(S1mr{P9;g=<78de&0zp$^QjotU#xFnaw`c$-cU`-gHh!ue${0!;x3EYn zsOU(SNY;9kN=}uZrn!)AV`FP;8;d3LeSICgy}ccrKRA(>4<7=y-{{*mEykgBZCaWE zQWvmg8BltzWG~$~ncLUu=^1NlYhz2N7Z(b*wweS2J9lpo;OS!hBQ#*dC}9tsjvLfk z!>BeRt)PuPpPqi%D^b!6rU1HdAUdAnLxK>AFeD#Jj3!8U#CQmhQq$QPMcTAc12oyT zS)hf=WfIw?ktL@pm3;z#g&*{q<_;eMRMcVZX4|ORpv^M0jc!(G=jVH6NCzB_Y6ktk z2$=yC3Lfv{hxtgsT;dc}Ph(e%LhI#iZ5@z-Edw2}B$B!}b!#RHe(_QD!s7RII@$H( zWELa_>0$_Rzq}9l)yT9`){#+eFqCU)9 zQ1Gn1{Tmt}<>s=oMCCME2Q*nR&+dh25+$prCby2trS`QtdBy^N?fYV3eREJyP*P%( zz|q_HF@;~j+#dZNu=n<6byU#iE85f3YjUZ|wM(Ux`_~Vi*y4fcMxV#i8ROHyY_2s2 zjB$5rWP9b%1Whh)hf-M*BjyK|v}r$!P`3M71EJdw#H5*0BGct2!8vQnN%fxv?F}DobbSp&AZ{ z+jF6ks^A1b!7nB%C$JXO7>jj6N(6GZOYB}XQ-Gx{#yXm@H$^|$QC7y1@4TUYDwV2c zT3{Id&RReFA2x;+LbOs&D6 z#JbexbT^WoZzuTZoUn(0Qcyw`R8uC`7p2y{pE%VbZd{0t>hI6X^VbDyh%tB&YTi(O zxtg8blU0?v)83nsQgbo=>Dk!S_Dl-_v#}8wndvbX8Z!H@0DBh~8(U9MqO-Guv$L}= zuled2rSP|wli^Hs%^`w-z>}9(W_IY{q8Nw6g@>C15C{kb`!I9}Kl&_WwFr8l>xGa- zu^S>BE+8;xB`TUpR45cgrY1Nq(T@L!!jG&Yj)cuRrlNrYgr_vb5TpC+mjiG(H#Y`@ zvD+20aQz~lq!>Iv1Kx#21khbg>)g(c$8#lv&-ixpbpSBG82 zAOIvdx>veZV-df7`2K82Xtsw3!6Py=aw$H#f2BSL?5T-~NqPRk#0Ju13ZO&+zJbUL z2D2Ku_y$F z__M>CIi$t=6+{BUpab-X`x{!~@!en!&k>RPLqI12VUF-oOAAq7)ot+uj!h`@&dy|=&ori^+hZEAw6W|t9F|lxze^LViYWwy*Dr=Mz z6E{%-YUXAU0P2ObP1)cLKsHcAj**#>70hL26ky>7`wa<*h=4TnfHdQ3)&fm|N`RWO z0zj{!03MLdoIu^gH>EilkpL&K*-3PZdK8QT0EaFARKFh>DgXcg07*qoM6N<$f?U{0 A3jhEB diff --git a/public/img/emoji/v.png b/public/img/emoji/v.png deleted file mode 100644 index a08985bd62f1c5c3ea7eb056e7229173f8416783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2722 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 diff --git a/public/img/emoji/vhs.png b/public/img/emoji/vhs.png deleted file mode 100644 index 8efacc7d6dec69c3fb6c6810671e2a014a6e7ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2234 zcmV;r2u1gaP)pL`*$ENJU0Y7Z@BOB`P{OK|4G`7Z@8jIzl)*LOVW2Ha9{4|Lia`Kp!9^K|@PA zJw^Ka+FxK}{r%kf``9BTG5`PVg@$|j``7#Y*CHb*H8@8Z85|-cC?g~(Cn_%_CMzN% zF)uMcFfleOE;BtpM=~@+Gc`mqGdVOiMKd)+A|);>EHxk@CNMHTG&e>+K}j()K{z=- zBqb_GNl!;fQ9eLNH8(ygD={`XKQc2qIXpu)H$EpQEG8&6A|fXyCMzo}Gaw=`D=#!W zKSw-1MkpvRBqb_ALQ6C?JT^8w5fT(RJ544hEe{Y9EiN}MFg_?NFfJ`L`v3ph-}4$9 zA3;M+AR#9`K}j$$G&(&*I6F)*Fg7PBE-*4T9UdboD>@1a3^O!3DlI(!|LZ+IMGXxR z9Ud$i8!EN7qYDcV8XFxjGD0IIGAJo7Eig3-3l1YCH6I}^_x%5toUPg3^8Ww-CMPT1 zx3{Gi87B1j z|I*m%?(_fe^#91s*}1>d1Ox>X6&W`=LpeG@Cn+~NJWhFhjbUVR=Is5WsJlHuQBF}^ zK|x55lcKx9)8FO!=1=Lq+t{JIR90fMxX2nA8z?C=add(-Hb<$hxqpF+pQE-K8Xulf83HQV8NHoL_ zB1TZo66i31a_FR1Ludl+LTTpUg(9W3Qn)d0h{b{sDQX2nu!g@i&y}ch-YCh1NrZh) zFpCjpVj=d9LI@d89PEW*a(OV(aZ<$uM|Q@D$%(wp#n_d%o`4g=`w&h-z$Ba9mt+9X&`+LVKO;Zh^|Dk@eO^;EIT>${cQ#YS$-nEUo>m95;#?vg56k$C! zV%t`cv9&&HduwcJw|DL<-^?#g{^#oCO`P&XWoa?2((uP0-{P4uk(2Y_-K@JSCvrq( zjxP(3Y)1I};*7~tv$C_Zpls;xH(66T8O40mm>i#-Xno&X%IT_v16XQ=1-}8wp=Hf4 zL+`xv&L`<_bEb}AQH^LF{24}vPPPG{`R0hH#sUW@t@I87{ZGWWzbva-ig6at8)Y#k ze`VD&x=A!&(1gJEKk`c90E)630Q^z6VH{1WI>GbU4z*QOH_%^KEu%?^?n_;i(`9>}!RB&OU6)R&#-mJ7Wz_Tot+faakoV9{V5~~r zhHQ|XYdfE@PZl`(48zfYY+uGNZKqQg3Y%8%a)55NH$ z=0C+SzX1*~5Ds@#p)jQt^owJ)a<~G#F%Go#!|RZgmWx*h@>ixbR6oj4-H@^}f8grH zGbtz}PHH0JAC&k#^Z?iDH_}oDbwd(t<<7AN*trsu3`tIdsz1xlp_PI zrS0?$T+v}m)qeN03~s-ADWe)Uuf-Q4z%fe*w~$x#>d)Z3Dv?UtS}ya7 z?0ngC3^Kl5^ms}Y9XWS~#UU_QtH>J}fV=d)uRwc>bo^fgWa$SpM>{s7loYI`i}D@- z`p(qiygYaYLN1py=YIUr8=DZ*rZ;eI#*8s!RN`-#Oe2lg@u{!#iwZf$6|z}(tu9U$ z=PiHr!{vW@d}VqvSx~Tk{d)BD@0;YG?MyX#^FS2b{|_^RX{(T+Qy<#h3-|`1YRycI zp*OdN&IgbW<{M-bvt0#B&A#^rzL5q!R;qk;LS{Q^^g4s0SR<>YLZT3fM1=79nBoI{ zMCy_!ILAhCB$tUqM9KuO7lcq0p#TpeQh${^Qd%Xe^j)xLfqhmmjQM=eI95&g7!G4h zSP>G25?a8+GpvujXYhlolEW|@Ua!NE8*^jJR~QO8#{#Zb~zhQumNE zZd!r19EJ`>W{%Mq`bzg7Ig0l6tE(&Q-Q9?-1#}&OJ{D63Jq=m!M~}&VGa3qoE`Ss4 zkcV_K6;R6!d=_mUlAU(*^v7tn4+z;d&wdPZcaQuHY}l~z3CwPf@!?^vV*mgE07*qo IM6N<$f_S&&Z2$lO diff --git a/public/img/emoji/vibration_mode.png b/public/img/emoji/vibration_mode.png deleted file mode 100644 index 64097636fb46e2d42f171f8a1a42eacf952497eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2620 zcmWkw2{;s95Fc!Ae+pSbBv+1`Y_1j=mw9r*w{*MN%DKmCXXBpL!s1IqPzx8RXJ)aw9c z2_)!2zAeNU{Ts>VkYNK!R#2o18Ox#35Sk2uX$`5yz;Fb*DIib00QUg;0tNtv0v-f( z2RsUMRKO#EelXzxSVzGKz!QMSc)An!w)MjIAq)Zx1dIjz&{(qXKje0_`u zj0CJDV>IA(6Rcxlr41IY!At6R!xCcv)8(<+0c#vFR|}K*@!Cf0U|}5K6(c;S*c%M^ zn2xvYvDgsLt6;1)zF;DQhyPpB_(y0Vfb9cwqBX|MO7B4HvJxG^vh0Gva>IRc#HfDcJyJ7C@m7Tn<*4?=?r z=Z4LESNccZb3J9^Bewxwsz1lD_5$WBppz5YSYs<0A5!u42#&tO$#=*o!1+HIn}n+X zpHR66flG&%TL2{i6NKlo6tOjVoCLEwp?@>{;^n-~5NlZ2e+|FRqOSUE@mh5C?cx!) z8Cv`RhpOJjz$8=i@52Ll?dHQE_?RJ6;0!p$?mh5eS9>VWj zEDXVnbPPU<$qeqdXGm1Ss(38P#FiWkmcTSCEZK^ebhtdm>mAThw$mC~O#ttBan6Wf z?cL|RTJlpt)s+)G>dW;}Z8bLRZSaE0R6%YX_1oD+3w18o*oMy;n5;BaxBu6x0?ug5 z-*0_=ae~;;gxSWJVT7M2u%#Uj@Lv_9Qh6n=7VboLhHiWd~!!*USC4 zCz8Zt9YtVyy!BhgC8fM9S4}>ZJl!~H_8WtFWFHORY{n)tMdDwL7fbVN(?oqlewBD^ z@Xr3yL8W#djrb?C_a|p7{-$~0^Cl}c>x*&2;Q0+p^QZbmW|UIXP1Oanwq*Sh9olQ1 zJQlWBh`6bqG-hu9=H&E?8UfZ4S=FEygrLbhu2qcVxl(xGFgekbajS?oWSB6y5WBbdI7=z5KTHW}3sZPhU)qL;(1 z+UcqpXSJ5fhzmK@W`3{q%{^=-Le81omV0Z1_KL`=;Pz@KY07tj^~?E`I2`t2DT9+r zQUf_hMhH7}4Y(9qRbrrX`@mU|H&-(|&qbN9@V?h6@AzOHkRu>QKdiORf^M zAJpd~rb(>PJa%&p`7w5=4bvvN#1dwN^^U&TxbWxoPmfM!?b9=Vf%~x}n&~$;8rB^=XPMdVy`4L(Z#5D0r zUbOwx8)CDw?zIn50c+lQ2>)oPD+rLh8y7$KVf5N2jQ918)DX*Caxl%qIkyC7f<@?=j2iD8A%*6D|76+Otcfaft zez9KZ-5v2m;ko?>{GRuzixR4OgMSadZPYO&%EvJc`lfS4?#T^lb_OI?c9SY?Lw9wi z&3&A1_K1ja@T#ZEv|c50v&Mdfo2ujCq~MBZjm7gCH(oi(!2 zZ+Lh%Bt>kll|Uld8hLQoO9;CE*_VC}3{<<&^Zt?W>tRx*26{=K}l0GwGi_Gs>uCO;Y4E<$e-HM(|UwTdlYL3f=Q-&tEA!U3uT)M(^!9 z{$XR<8pp+DZFH-I><(I~+PP|RZU^nis#gAMQX(3nwyDl`J~g7J6vPe{>pfD^ALX13 zk)rXN`4%;W6^+mbirNB4wX_y3mAPlTZiQ9apvUP&qABMdwWWU1lhgXJKW3Qb85P)C zxz3~ijBxb@lM5&$}!J$i(i5bs3yKm0!AipA?DHW_A~`1oL!TeWj&5{>TEFB`wt+OD*C+BAvM zI3Tfy{Zy&TOX!1{Qsq~%xf46?JY_mJu3jzhvCATNUk>BL!j(WL9o8Vv(zAEGU*_5U zO#_ENy8TR)Gu!ekZd&HKTJ)j5^x9Y3qLn*aG=1dbtt_i|t@czZpWv5X!lEw^u3P)7izO&Dzw}pROP?P7BvX_Fw>uOh!w(uY z<);!#h}->h{)_aFkB6PFK}Cx^52^wxKPTg7&VRt|Gs$+B(hC~l{fu=rH}ji diff --git a/public/img/emoji/video_camera.png b/public/img/emoji/video_camera.png deleted file mode 100644 index 963f10613b1e313c7d7517965b2df419ef2356e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2876 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 diff --git a/public/img/emoji/violin.png b/public/img/emoji/violin.png deleted file mode 100644 index a9781602723e1d7a0255b7687d7d700d870faa45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2571 zcmb_d=Tp-O6aJ-<&`dA{f+-X!QUlU85Q4NIBmqMakd6o_y(APNfkQzM5ou9S1P??Z zqZAbZ@qk05Nx4%FX=4deL_su4d$}+77rZ<3>^>iMcIJ6zXE%pQx0jYUAOQe?G|j=r zb+20e3j|~@S3Ke_0{{eII-KUS^J^>?s{wAR5S{pbZGW@Sp%dy{~o}24)8U zo?svWB_;;|*%&BC7WOF4`!Of*Zh-xs^qa?2t;C^4`uhy92+u>9-&wk}gGfA)Xho2| z>!{-9WFsq%$hnkHQddHu_F*uxdU`rks#SP+xHbSd13&-@R7R1rl94FHOK_wh9w%IH z9>?FbSB;m4usy8Pt#EWlTBwDFH`UnuC^^X0!P1g^=#cuJlRO@eyB|_)AX`q8tqstR zm4x2uqZxhokla@B*k;wC|Pcl7&(ZUiJ_!8+}zyQ&d$!)*Y`Eg zcq~@`xfyy5n3E4Gj$=LqooSoFb9fXO6!cXwlD7X^eO5Fvbl9 zsP|gq`|K3|IEsJnt~$Ur98M*Nk`;PQaWB19BO@bQg7xC!;>xdAxVw8)`0KYHIWQci zHE2zE8ftc4TUJ>`r7en-$55~JI&%NqvASR*2L}fxgYnWFSE+*RwIyU>5e+2y-gA0I zEY-wNuSS}hoILhTiur?NhTybGoxe`47Mh|?>^V++cuMo~VGQ3>EyGc@Gfd}7Q3*=} zU3u2#juEy@NxD1U@`)XxKV0{=1@@0Hi&%4&Cg#C2B!zA&zTVTYBrmhY)v(u3JC~}S zYDV@phPw&ND3T@gr~`hKQ>nQE8D7BUygzkw=>bth!4HOqC879 z4m^U3venE+ARGxH3OGG4rI=>(bMCf!0Nd-bJ?w?R)FK6z@tu0Z17W zWsYG%P{fv+CIh{rw9nw;&JOCNiz+83wmC9dR{rKzG$TpL`<@aQ2v|{f5Ow?@dj&IVKa3kZ@ z`s&ZkioEF$3zhF%o5n|G0%m7tS7QYu?!FMZ+6YmiyF_3z%>^HZb}swu8EyTeXnvVQpIQ1 z7{2}aM8g>oEM{g+lew)l<&YCVZ=Vc5> zG-kR+?Yu7F<}_VLFJ3r({qH}qtfqqGe>#&EHVQ(<_-V{jl`m^d(x2+q>YJAU5`rZA zdv99LO|_<-^JbKV`jsSN)>CBIEMJ2C*Rt= zc;z_Po@9 zMIOJlm68^Hc)?Fn)RuoYl)J9oKGjZ9w>YBZcIr&0*8t&%tH1jfwyFGNy?=#Ah`ez@ z^cPK;ewOVJzVA)V_kfv3QCP|~1%=)NWd-?d9Qc>`@Q5Mt;IlVEt{t~z+v`F{SBB&P zzgUL!dVGE03w4`04?LF&?Ngg^8Q?8E8mLrCl|M`=_S&f`IF`Zd$iOVkmGlqlI48!0 z{C?}cc5BU(I#ju0z2l8sMDtKjJNSHDS)9g5`4+XPW5Bhhzd2_)WJEDytq6pq<|}nXT;jzx+YEWkxUxUe?KKvD0>xF4;ub14PiPfSHC?25ef z3bUe#m2SQKuF0d5Y<`s+!;M?Zk~+zAQok2oK<{W#_=vlAVC?G7SL+S|BPj(0$^&OJOO%QoaZgMG zZ&RN3HYb`a=EDlKn34#7$2fXPT13we&48&o;0BIb3Q;M%DqFE z)ai(UPvW14rI*V<>}4m1iN%fBNIlUuZF$bOaQ&wdf4T7f*4SZz2hNPR`piWzib>Wq zEj@SmK|ZZ2#>gyryQRl%So%iG5LyQyU3c$`i*qLXen!QdxzUs%w_7b(2O1f0^7+

nGziHHwf52v rntT|vDRza1fSCa*s(jmpU4}1UNUNWOWlH_p`)B~omTuE%?a%ukGHaC^ diff --git a/public/img/emoji/virgo.png b/public/img/emoji/virgo.png deleted file mode 100644 index 1e9967db825dca571bb36c1d45312ec65464b2a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2764 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 R|J|Peb7O0x218HSe*mQ*QR)By diff --git a/public/img/emoji/warning.png b/public/img/emoji/warning.png deleted file mode 100644 index 92c755706c6ec561ca3b8e4542102424e409a16e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2155 zcmZ{lcTkhd8pgkbo=83P-fL*;1t}t6fKWv`S1F2u2qK7-BPbD+OBD|YDj+CD<k=pfPwB?*B*Ab|Am;yvfjb9Z*1-T6JwJM+%$&TPD`jTt*k7zO|UyEzJJce)$? zTC5DG`mW~b8UQc=wpI=%W`S0x#_&?(R3nBk=SegG0JhW$i?Z+Z52)Sj(l;q2K zN=?r(_P%5!V))wDo}8wXJS`>$hh=wIM(9nWT( zE)n|iNhHb{n&iRIln8UwhYsh7oZ8h9fCx9RQpGd;h6U{ot9}OG?pE!6Co-AC*!EhO z-lblKhHJ|+kQy}JhVbWw!WL^a>r#ZYm6!6~d^ zkeMotAZM<}H+cp=tLQ4R;?iZktl6c68QXIdy7QFDEtlL-?2-0Bl;f}Vh*$<<4a0IJ zlw1cV)v}Q4*vL3`B9>{Tfpevii_*+P?Gj&W7hY`>Tq|?oOE=le}ns%7>&IKWDA?7oF*2I)_WH`vk|mdAnos?VmFi+atPrbG9dI{vb7o z`c3MX;&ZYdyw$-0(o7B)T(^eKQK~t~Us#VOt-x{7W6IsF0o9!zUT_Ho5}m+J7x1SW zxM~Xyacy?;QE>1pm*Mnp%ES^VtwZ*ha_3;eeD4R6SjEW8&3G^(yV}IT#0VL0G0I9% zTW#Z4k%wt%a)LA3F4p`9KhCukDTLn<1n1R3vgXm8>0v+LA>r!xa&Av+=DjJSB|H)& zJ8m?=sa=xbnjyK7KkawUlLQRgNu6et(v6nvv4-(3{I-ISd!2rl@lvc zkSr=9z)YRiYdgI^|A%%q_CN}h`Ky2zM3)ZZf`*=(4W!uOT!1`Mo-I^x2ys-y^ss3 zavY0}Q#%)YrgqZ@uvC@$frNWg*n3l2?l?ZuM9SkfJND1Sf#y&_F6V5C(D1>jqzuI@fS&KP_H2vDbKL`6z!TjM+t*22>)AQG_m zC|=XR;3jr!YpbD>0GG6F#@*(Gw>Kh`eB*epC&0zkvJ|YKE+IdIUP@Rx-!%ydF}W)c z5G_9E#`J6=d?nwwNfPNtxl(bab#l}ROIL}ka(G$VGOenouetJ$%RZ-nM-PijLxYteXa`&l&CC3^EnN1@|l zQ7cOex;s2bd{0{EEYG7SF>wjvEA2~57N!MSX8oi$sQm_UX-ZVO&~mo(YXsW$vFxOa zMPDx0rdcvx@gVLxW>6>9%U`*$tW2=Ai9-3In^~U}JSq!!i6mA${o{;G@)+6CUsN-7 znfA8BFg;njeBj*6e71%c6V~w$zTkGU9DfK$R?>6o84~O3^}@hLNJD~kWQ-aPS7ZM> zCXT3DpZ-ba$|A^hGX7ZuUtg&2+WhD0lxS&bshF5p>E=^PQPg1Zg$`>M+Dy>Yj-#RP zi|Zo8PVbjISV6U`*&J^9_mYEeWj#?e_K+(*pt+n1wo%?9&+n1gVDLbtI$POUROZ`mwv zzxMfTM@d?Bb)0L%&Z0s>fmWQaWnP#>&4bfWTQ6#V!>riuMm0bRfacGajrvLMndrPb#gQ~899Z8W&Anw zf!za0m8rb%V}!^>cy9Lh-k)uJ9Al_$N4TuBl(?<7(N5TAf_WChXb*Am_F33;U|6A~Kt_tT~Y)O{|m zr!CW6m@Fl-`>9d?@;V5=Df8OT*B_hX2?p$O!8dv~(oWsAmiyH7&i41uMAV-r=g z{rRx-{aKllT`)`$s^eJ&5Iy9uZP6*}8v1WFlkrNx%?)w;?lpY;x-z>`1lxOc^Zc*6 v!Gt%VypLdL0aNUXzB}eaqGTQ95@lf5<>@#c+pVho>&r7Yu|bv@dq)2kn@9pF diff --git a/public/img/emoji/watch.png b/public/img/emoji/watch.png deleted file mode 100644 index 3cc063b5227b2451120da790bffaee3b91b3816b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2889 zcmV-P3%2x$P)C$jHIM!#X-SMMXgk4GjTj5RZ`pD+et@7Nkv80*49W!NKH#ja&&dh&d$};)RB^u)X~&(baKzl z%c7m2($LP(&d!gMlWA#b&Cbo6o1bQ8W`l={LPA2Fot+I253jDW8X6eq=jZF|>+taK z?Ck9+DJSUY=<4d~@$vE$6cgs==JWFM8X6kx@9pK~<@opa7#J7i72@LJ;^E@< z_V$K`hB-MkB_<^A@9!=yEG#T4+uPeGCnn+G;3_I95fTxEgoWSV;6p<{gM))_Z*TPU z^`)kzkB*O=ot}Gqd>|kn4-XGhm9b9s1qpPrxM<>GdCcgo1fySutxUtb;`9f5&@i;Rtvla!Q}m5-5;mX?^))YC99 zFr}xce1Lt)$;zv%t2H(@(b3U}i;B0py28T3H#alx?eLBJu($Un=(9mpcZNkLEQc+Uj z;o)OqWaQ@NYHDh~zrM1uvzV8cyt}>G+S<6cx68`PU}9s?*40~GUEto|Q&m-3T3Yh* z_2=p6<>Tc`OH1eH=SD_F+~3=Fn&Eo14_y*Oro# z&(qMLprlMrPx15d>@x#l&q{nK4}6m=2_eEtcs5&2l(mW z>)h_{Tkv5JybZ&*VUPytZu%^wzm(ia{P9mjAPB=SeHcaoj|V#kcGEP>rt*66SCX)Q z2%K$j2?`k#pw>?9`7wyf5G@rXcS; z5xu-A3>7II<`(^>OY1FWhq5SS-^_`w1cM&;zI}KiE|`f1O(!UAxHq#z&R=#P46oEP#JiU_<*L?_p<$9FSp-;FQev;m&RWGY$>B&zYec>&^Spa` z?v-5uzqLdO?1WiqboKhDw*4fD7FFaa0!MTE36h-hPa2F$^WESIQ~%dp0e^bi!xJ~( z)3t#lD||Z#RGnTimX{Zx_~iCSWL|e~V8+AL|Kr1)fBo=>e@_5>D<0&<0KbC;{T6(7^PM&$+)f?yHrkp=Qv*%s7bY(63yA`S9U!=O(l zo?qNhyJQt=Ie|- zY^|+J1n7P4_bP=j?tW*>zd2v<8xsM4w)vVD4TJSO zl!g%$L_k#5Qhp?NNmUGk2#mra8s)c*Z~6Ux!_YrD-!Cu!egfe45rbjfMU|Pj2!gS96vPmI zJT4{>06-8FMfi}cjOti-tvg=j?53Bis1~YEr?V(?%_IRJ0Ez$zD*(e#7J>I1ohYVS z1{?b#6EE)yc*a@Xqf!m33>gv!4gvrQY*R1*A$U9t1aOrk!@&Nm8mcXNX7?rik3xrc zgNjg*MTm!B1djkP9>G2#1cRa&4>m@0Lya|#I_YorSlV9<*LtgK8kL=dNyY}}iTMPN z!7u>hZ}S+&(^=J0Q(ZR^dy%udo_(pQy0*&kpx^Hn^LcFm!)LR{_PW$=`0i zQ&p>Mdg)ot9(ryeUs=`uz$Mx96T)_>;`x0xx2InS$))ms%B$9mj-n<$4@gbN z#Ecl&Q0mlPY9c@1s(s;U&OZ8Txwg_;nXejZQrha{@i>v1&WKI%xlN_BM`f2+7HLm@ zm9wutb5h}S7FE_#)nTW~;IB7Fe5D3QQ}`Y=DrNl(CqJ{lpCx>HRb461@2?rEYtm|2 znnD{Ys_Ch*%cYg?tbY0+KdYag?wywAOQrVO8gJcbReNoX!>bgsl1@*4`WKue^s8SV z4_WQ~cB!?pGT$zgS6Z!7p}pU#J$~t{NgneWPEW?HLScT81w7RHLXt%~DPd8+I zJxPEhwRLG(5mPrcsnzOfb(1=#SYB#Pm1KN0NkBn{B;`n8>CExv-rnBjrB zjFi-50Vyfzha~Kdl>6q`TW__#nVa{hoAEYa5Qw3uOKAZQVy~jo;o=`gQ}fBtiI#U! z=`s8^yC85&22e8d1*biwu)q`7c-cZS=Z*{Zx#@PE`5P6Wp>cz>iRr@~6uj}p_XL(J nD0qpAi0X9DADw>keB6=&pu`N7ONj@500000NkvXXu0mjfoDjmF diff --git a/public/img/emoji/water_buffalo.png b/public/img/emoji/water_buffalo.png deleted file mode 100644 index a85a02c365815a42a6090576a8ea59c8266b4694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2836 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 ezGt)6-RfHY@ diff --git a/public/img/emoji/watermelon.png b/public/img/emoji/watermelon.png deleted file mode 100644 index 0c095da58189d5d2bbd315398e6c8c0ee59125fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2798 zcmV~Q) z`Skdis`j6&^nQ%?w7>P9szO^FV1zIBf06Z*pZATN^@x}(K@L1t7)fXz??G1g$ISPs zwEh48Y=cVr`}*{7gYsi^h?sZP+|}|#SoepOGDQ>r|NrwpR`D!F@-a#CJyi2VTkkK4A_2TXXkkfBBoJ|50dXnj-%)oFr9bh93Csv-K7ruSZV0RjR4WP8%s(zU>>d$cJ*Xb$!J^-*vo`2YX# z8Z=&v9qa4s{ceHaiG`LMYB_WJ(( z{_6Vo`|0dpn-0Xw!Ec`^{8(=O-s1j9U;EG0c#vAGxu5toP0iEIy~erZ^zD@*FObDX zXpS?0mty}iO_HU3_;ZTn>*eqA^Hzxt&(_bAxnc0$-kiB~`@Y2WsIl+7z~Xp^u+)Ic z;;DL{L*MMqS9UIPjZ(KmQuZxGx_E$_tc&SXW|}oZ(qeI4csTxch}chJVRCTWQDtHuCtOZX zhqFqq!;y3oAlOJ-hG}dZ(la(&WUweXXH>9^O8bE&blk;uBvtx>j)*#4`{`&cq@eK4| zi68?ZJ@?gz&%^)r8@?=>QG+0TxTM9Nf9u>k@KAbj(JEMgEO4}<8y}y00_`ISgmBL3 z_38oRqdU&E165TpfpG%IIh~x`0mdmfIWN6K3Hg5a?l}OSOdpY8 zoYTd5z1-$KUv1qUP4&Hb_If@9D}XbQstTNwOIu&|-HIlqWLe;YhtGP5Mq1b};jjQ< z?AGr#ZqJpJP)IpjJ#R{HFNPINz+D0-IB7PTqxbeIaV_NY{q(A{0o?e*5TpXeC3wBL z2CHcX8_3DYDM^iK{-|$ zOD>0m=N~>D;QM}Lf)z{qw(P4WLuVz)XxhB*uiumhxkw}>R=#7;H%&ga^zBp5K}*Y* zjmS6@8^85WN6V#LnUkgR^<{tVbp#!BgdUsx_b>jDENk)J*H3jA8yZ>)5QL<#vD?SW zv=;yu7cn*-O|#pBbkIKDS+;LQTCW`Nm7YS+2O3%yR1P4LMa4x10yq_C1V?h3opD4W zkdXG5l4ORKgS|c$KdGJ%b~Y?n(vL*5F^t4GS*AHSQW#Ki7l+$vJMKzOwnqd!2qFOq z|K*APS6%U3!-CbY3H1~v;_y7m0)wk05Cl5_3=ly?mV*wC!R#Q|#^SGDeIntJ&W48k zIt1rcSiRtKGAc%q7!W`NVUb-7}l(`gs#jRoDknBuyj*A(#i=aDd?$ zx#It?&(FEt;mYRLegZVHE5_O^ zD9@v)#R54Qhc>36JW9aE=6ws<{IGw)rrN@7?;SG>VYm7H{N~mn8}OA|vn|lsVnR`# zr1nY0&2CQ79Jw4 zXy$k;xwN&pqAP56Uvk`9dBx+9FmeCh)`3{I5vNU73p5*QvyS8fdGMV`*5?il?p?U) z5_94uH=eMjJT*+nFPPT4tcTJynXp>3A;oI3@w~|b-7#QAQ){LbLjB|F=ST2TUXxq5hQ@!+ogQ`c3S6W#a2LwQm{_1dl}6Ubj@nt1@)uTQO`ErP`SN844<1~$d~xHn ztb!@|m9uL731;^z51wXYyz#EY1bFvegIv@jvtKC*OY};!8 z)%sYYDG-D~^xL-4m2raA>|@zm7kVr?#JBdu(fOx z7RO%g`&kwQLEatw|EFn^r0IXZ-SZf+spGmrSjbUH8tCT$YBLsl$Am(WgCO($y7uCj zF+@055$E>0gN{)xY@&MX!L4mmWoi{J*iU~2JLURPk?2=jUH||907*qoM6N<$g5L>d A>Hq)$ diff --git a/public/img/emoji/wave.png b/public/img/emoji/wave.png deleted file mode 100644 index e479134544ed87ef02cf0f541f4bfab4fc084955..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2974 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 RJO2Ox002ovPDHLkV1kQcLnZ(K diff --git a/public/img/emoji/wc.png b/public/img/emoji/wc.png deleted file mode 100644 index 8e515ed0385265c3b9779300f0b03c1ccb7c9bbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2471 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 diff --git a/public/img/emoji/weary.png b/public/img/emoji/weary.png deleted file mode 100644 index 7f61fa43566c52e377ccab45186cf2deb87821f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3222 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 IM6N<$f+WKjkpKVy diff --git a/public/img/emoji/wedding.png b/public/img/emoji/wedding.png deleted file mode 100644 index e14a62a425f0ec152ffaeeeeff011420ba068631..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2904 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 Eg7Ik9DgXcg diff --git a/public/img/emoji/whale2.png b/public/img/emoji/whale2.png deleted file mode 100644 index 6e2e688879face429094767f4df2c60bfedbe8cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3249 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 diff --git a/public/img/emoji/white_check_mark.png b/public/img/emoji/white_check_mark.png deleted file mode 100644 index ba1c0c5c7f6c2ab4fb67656ec4715587f01ad8d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2278 zcmV-1po_M1O+ez03!qiI0XbX z2ntdT4{-(%dI}0p01I0H3tIpH1po;}2L(0<3tJ5iaSsYg4G(q{2t)t{IRFV!00uY! z1ttIrNB|5~00uz-3{n6FG5`%{3JX~c3sn#fX%PxS4-8}x4{j0xy{}r4B6qy7S zq6HSD1sAgg7qA5vt_2mJ1QeSD7N!Liodpw>1QnnK5{U#Bs09|O1wGS7FUl!5&p0c{ zAs4L$7pnz0&^$8CFfhw5Ey*Sprv)_4HagKjJJLfb#UDo4R6x{8LDft{)lehA7)01m zN7q&uv;`NS9#Gm}uJ5?G=)ESx8z{sb7`6o=zZDad1Q@sn>-p;yqXinf3K4?@7ODjk zj|3E#1{}By6OjZGj06yT0~xai6q*bdtql)x03W&$`1$zj@9PnO1QU}47pw^tp%N6B z5)+gbN!V5U{`(lN2K4vz{{Q|K5D|zL zv+%pG>8>orA_5`+OW0Z#of2Z+Z`AkM9HtEtiv(lKUuD%{9+T+hTs!hn(J|tmU#5oEgmQ z%RI|9IK~#7F+|VVU)NmXJaNK?6{QC2~Ok2Taf>W^ka3<(hCfIYA^LXwZcR1IcAz@RT z|HypO-L~(~7X4RNZs~DB%S=J8o-Hf?l(#SI?Q_HMauYD@?(1D<|1G}B)eVcj0M$NX zqD=*SBHZoT^mBeoms_Oo`)iG6D|8$n)M_?r{`<7(?%MKWeywAj94}Y%LqSP81|Uhn zp?tM0mssam`@{L5bu{S>4Y8F$u6`7#&J9-Bp^%rP*FoP;x!Eb_gVNwV6g^}LMehwt zLAio+vyr!Uie!mp?|D4vKk<0(v22MHJFWTx8=aI;%rV44u-BPeihY^a2MH!u6e#CL zeFEDXvXJC(0xUB%K9kL6XU?9vg%dcJERb((dI88M%qI{W44K+`Q}t;!hRJ^u^MVi3 z3pfJ80*7EgNbJnhi<(D>@}FA}0uH^vQtIqN8UcG4nThr*ZVYLkrWejqOZ5UB)Y(~V zAJD_8lkX?h0#^sMC)n&+s>7II;OxuzUZ6b__doQja{8C?muCl-elIY;cRR?Q$XCM2 zLCbXo3d7fWfO(MHv`ITvGRoMVslutoHd0*U*vrSZZQ}{fI<}3rJ1R2gTg+bBU-R#O zm47~w*r!LtQTd7_!IHwf*;vfpABPKUmqvw4)PjK}d1bRuywG$U0<1kI&GMEEs0C-% z7im+xsr_sZTyRDnu0Nv^cn3BV6>F2vdZEH!r`OBFq74IHML-I<+LSCLA47%oG1XWg zWx>~8-kn>biNp2m1bo0Y)il@5d%u-EJb()K#a4Y(qXKFSD}pvd0h*w3 z9SwiFa~o|~V|)7;avCb6H^f$wDKNAt0*1t3+Af8-#Dy_*%+_@to)5O8DPSa%Nr1^A zc6dmPXnO@8u&NuKP4G*=#v3saDa5s_*?9KVcW}XFSQg68vD-nR!y-uowdNM^}@X;LSSw53&F;;Dm}b5CXV6Kx6_pAc`P_FlJl@ zF%Nd(f_O&E3=&Ebl&VRD01n}$8A%dwh(2siLJqO&usJhfJ;EshtBo-v5f(#?t~O}E z*sN-S2?Ppr4!{NHXbMa!L7&HB)2DDV9)iBD*TQD;^htuOzJ6VrfQg4V#Apk2{e4-Y z;B)JBZP-8%1W?qGNzBX~?;8GHNR|fm)f-q&wiqnhS<+kImH>@_}d63fZ0nwrI%K z0NKlqnjw;FaRjy#K;Ftl#<>vGWCGN;24Ip7+9tga3-<_N2S~keY%0ARm9SP4P1uTw zQt5ETG1FY0a_df!yu^(zC8@hs+4H}D#NjH1TKcZfH|pQ%R;c6}?;nZS^3g&ubh=Tf zScv9rktN|8aofDEvyEI{n>%u{ynQ2E8f~}47Z0EBC?U4VqW}N^07*qoM6N<$f?7N3 A&j0`b diff --git a/public/img/emoji/white_circle.png b/public/img/emoji/white_circle.png deleted file mode 100644 index 3f648d1bd1f79f8ed62f11a1b5885ea5c098e1a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2477 zcmV;e2~zfnP)A7%6~}+~zIktEJa0VXv7I=k4ajL6+I-a{{zyFb%p1?l`?_7soj32zjANTn zRcd|Z8O!h8d;a&FbIjtp@&KrKdY3Hz&A;(rGNE2$|V#VMQ>gNWMCKowRjRsfU z%aflx{`%o{0ocE9%P%%>D;X9;e321C0{z6$D(??K#@>@$;WTAj7J^G>FFf}8pVkcE zzB{-5@`i20!eRqAVdJ5+jaLtyq4p1jz{KGcbGTeppPW7Wy*Cf93BcEP-1yrqH@C#^ zB!>$qBw`KGJJjEb5CK@!nA8w1e01*Hf1X-37wj&KKfh^bQKT7W2Lm)v`ZW~^S$VX@ zw`VjMU z@7w%X$;x3f#t3d~PwO9TeYuPp|Cmp$^#aKR=`kzpiZq{{Wv78MyH zL^48=G&aM9k!N<rSEQT0l0AKq(vF~-H+1R&FmO+NFC^B-#)`wRBu)8pN zV92zv$&<#=2P(WS6NEZs8>Go&V=-io9*DbQ48Vp5i#O#lDPm&k1w>!3U-=OBzA5wu zOucfR;!PVK>;pigh8`U>Qsl8Qbi$#__EL|P`Caex_Bs*+n>;B7jiESO!f zz4dcakr)6TVB%qu#=_2~A7}%RZK_$^mq9W}8UqOgczXEw_)!|}EG%OqDNYgSS?x6f zKw^+)5J`sOJ|PksxO+TvO9qpi7N1J&u(R}PM^Z&kRqR^p=D>Szc2MVJ!ZWfFg8eHBcBai4g!LS^`qqRYcdGMWh$i zH$y5-M3sIoOav|&MTfS8w!{vAdMC|@o@6Pa(xbDl?%1bdmL~!c=ZWn(ElH}L0N^i% z1eyVKyr69c(c_9q&j`C>Ma$|&l#0Wc2Pk|3Lj1)90B_C*+{EG{5}$NCqX&wN%n&5> zKqOej^xy(M-dqyEd7n@-U=g{Yh>0hP4J(}j5$#_^##CApAwp9;MS~C@?|cG)JK4mi zfrlAo_P971%Lk(GNeC0CUuY2VW86we4I20~aVHaIbf;X$XPM=glXXNIv216oKuUV^ zqS3PsNS0Z~$93GP1c1Zms#8r|7WJ-WY+)m26d5hrFB8OdCpFllPYD)rX;Pg!d@cb% zdG$jLeCF{r46jRZI0P9nO2sq{8dN_# z{eBOCncC993O<)9N1T{gN!~4>pM%8#5{sVgh*0J-J{6V@&eZy3*Yd%o={gQ)6Ktk? zA(;?F;&0i-qGTdh2+rbAXKA{8uy0{uRN)H6=?9muKD!V$ zm}4@=XTxihok`t@727p1$s7$9!mH1IaCyb*SSjb_`GaMeoZ}3FATmU}C{bM$TqGzs ziT4#D0fIA}qe+?hgU-vzc6OIekJJ~Rp8u#qjgx$g)UCPT8a;rOdk3wVA(D?dNsS8g zA1yw8q`pdv=Isj$kI&6I)HuPEuI?3K^xIpqCN&er-fr=WDNazsVQzNe@wYFm+9Oh7 z`Q4c(=Bia3j&n+Pf;(M;FyWd>@u8+-Eg(LiIK^=ss?1eqo+!Vo!ZqBO9QT4(XAaC( zDma|rD0Nc!y1r9UwpTqC@9@9?51$luj&cHr3bU1&1Hr4uy)}1A_hfSqZT#tmjW!v^ zxRr4oj*Om)p}Q1mH*`a$ImrwS9Oh5&*}{#CVkKIUA{Hxz zW_^Ob+gRU z`N~V~OU`tE%dhLsNQm3=g$d)q{6qGavqlDs6ow{h9qR`K__#Ev2hQKBuLQqex_GR* z`X$~PZ_R}KYR)W}U&-8)*^}L2j3aSc6t48SKvMLJ7=e}00000NkvXXu0mjfUQ32y diff --git a/public/img/emoji/white_flower.png b/public/img/emoji/white_flower.png deleted file mode 100644 index 76c514d5641bf200d9f853cc377661d8512c8232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2638 zcmW+%2{e>@8-JMhosnf`MD~5;iexEEgt3ezyF{T%|k%X ztY;BR00eNfbzxXuv@HZIAK)2aBg%5EN-}H zYzM0WAoUZ8T{zwVkOYKOfbo4lRRcB*JY9f~s;h9!^~dC;Vo_a92~8fxc+v1-65ouo zbvqgbqzUc4(^kgg+NxOyluF41yc7t-1fB_1#W6X_CcrxZW64Wb0ybrMU{Yt_01#PH z;s_!dpb_wyBi0WAI3{`=E2CNBFeWF}3;6gRg&Ak7 zM}SSJ&{#$~BLu#G0G~9_Vu|fSqWXYX57?x><|Dune^l=VXaZ~yaON&yq@@6`Q3{16 zBT)u~$%7h50#kTrCSZMlvo-dlAd+;QVpJ3pK_o}Xlw<^?rGl7@DM&y0e_J-<>}Xj5 zcoN`4eEg+=-v&Y}V1FS9Nl`?PB`w|rgc({U=>+^wz>w{8?#=^%-36=}uvu4!F`D!+keD*!s9{`5 zt{Vj*B0Q<1jtp!7tma1|gfhU`nkr*^XeB>v$EL06Q>J=T*7RZ6aToAhRACs*`<_Df zj_sD^*qF|H96{Mn!Ho(~S^!6N zB)J2bEFwHklR@aCI|L@R)sR4zxM(9_98*2CS4=@cL;%@~)V)R!T>KNt3eN%O80#Rb z(S|%g`RZ%UxjW_pjv_;=qR&MqqfcV;inIL@FjI-(=cQp>q;1hN669#fX+b45Cn1xN z4R_(QXC?P4Jk(9ixV@wmr+i3$!nU(_y#KA0QHaOF_G6W?1nI%Ndv+G=kRp@V0*&RB z(C;amp!ncm&Qe$3hk)$CxzFdW zcRr20o9~*^I#*Tu<-eBJtN%vbTKKebF(C6xnn9mCt1V|Efl-=JxD=mwexRlQ{5Akl z*4o^}C77#vn2wQaY@5D+~lfR)}@k!Bh4tg$!nR~OZn);kRZPPSDUND=z_NhG}?sF|!a6w%i z`$xoSI#!aZQ#+%3Ei3*5G!6GsXyFo7*C5WP$-+W_etG|6>5^L^QZ_0rC8Q1Bwe6oO6G-ba-4_)cxD1$^=rQmLHmx!~37@&3v4tHiT5 z?J*TK?aP(QCKNiKD0Fqn#>?@ZT~a?4&Z zMrcWghLn0Q%GZ4_mr`te?<6T0T`SI_B|nvo>UrB1UyFrTS`HpItmh(c3obkiR>Awv+Y#x=4T2IMk^QMM4hbvQu4w%Z@l*U;`)r{`EL7NQdR+fxcBzBJ%WyU6LXrH zMCT)HXD@E0B`LDu=zkEepAfXLTWGs7^e$f`Wmb2LJN#d!&Cx--l4G%z3Uw}lZHA=e z?t!a!sEU$qU{0QVX*kTl8U$|^?W!u;t)Wj!UQ}!v`y=iaJ9@_Rajf5%7`JW7R$ic- zo!HF4h6h8tDlkh!J@WdIGX%qLw5@F8)uC^E6KlCe%{n%@L=}C>)~MrsQ@gUC$z>ng9JBxBBsVp5c|LBO1)FC5J;I`< z7ufFMWCE-o4+3}XFN>4~eXc?Vm6!f<{=mwAcHHojMsQ^>bYtwv}CIpNfQ<$6a4fWrD+kTHZ4}2 zBY5Qe(&D^oGF#O+qf;W0g(W-Tra(=x#vi=PvH zs?^yLyZ`>{H1o?O==-X0c{lg1=RLmZhjX?Ug?t0zI(}tXyJ>Ydk*TSRW3SB<_RKvq zQT=&m#S(U6-JW~rn?`{%Q5uO#uH`4Hf>hj#^$o_dBe|z{Mvc)y;a_m@>5o&Y~|F+ zw*%d%W;`=3NAsmCPQAaCUnF3p^84+&YV2tav(ZTNVWyW>CSCOWK=M|`bo;mQm!yH3 z&e)C(nU>~WY(70mZ#C!OmRo$_QAaSPrKb2zc2nUwqWhUd`-u5r42 zJ~>xgB@n(6VLgrbunkDVq@Ki1O-7rY9uS9`s*j*Px-)STxLz?>E(^gon=K n?%iw0uZK2eoNO%QJ2k!E-h1<6V>^?Beu`ktus1I^^@{u-l52Oi diff --git a/public/img/emoji/white_large_square.png b/public/img/emoji/white_large_square.png deleted file mode 100644 index 60cb19a1371a7de1d486d120f9b050970237a3b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1411 zcmV-}1$_F6P)?e;2cV)icXxN+tE##!%W}J3uRj%`yWOs6)cyYb{r%?p`udLuz{SPI z@6~GcqZtK^28ee2&j;8z7(mBaNs@y0OzS2m~u>I01%A;^!FQ8 z1scM4$oB*_i%oGeirv40stxiM&sq>WtgKjffJqr!XqUXCoSTo zdkO&10yN=$5&&v78;dy*)fz|epQ#{nAZeC;EQVPucmx)}$g zz63ai52Dx7+#KG*D*@i?FaQ)ejd)ZIF6!3bX~r?N`4r(En~)6vZk%%+Y`|RHwfHNlLF<_4v2xUtE7b)}vEV?@K7TkX17)kmpO1Q*X z8UuL6-z@=>OS2-sl&))lXja@S8B$<`Bijo|5bVS48BmmTZO6V?CDar*Pl?P;b0muX)BW!Afp$%&iu_Op7djoX9$WnpV*Vj>5 zY-;Em`MVqtxO4*HKtq-a-~->@-r6%rf)o;;%0X2UL>@UGvH@Dj3seCf3RM*xsT^Qx zfzum4OLhzP+LyqSG==H`xG6*x3#W9?Mmt=cG|ZYcmMNwo_AWHJ@u?n^p-P1OcuKn~AL zmc@Gj_Cl9Ojq`ik!P9kGwQ@*bLlKU9B_J07o?7Q-pW$2}Y6LAkpJD`4#w{0sa4s zsW&)>7dUkrFq;v~1z@fmU=bteL2d~Nn9|;!k_RlR0!!BYPc{@@G7`+`NrppVskEHS zsgH~VryP})xO@gLkg^Ar#l0^#I9ok{L}~*7?bW!>*G*;j2WN4EkylL83fos~OQ_`H zruujINz>%0>|K-Z?wbYJ9+N(=b&s;&5TU&{=(Ku7*(L5}-&aUBM*P1O(9ZOl(jt}A zM*!dt3$PPx7c)z-(Q&vwtW)Au0EqY>=6gA)>!LOQlemt*d(hq-lu6BoNq>Z|N8OtnIC5lz+Y$dr42j$ RFNgpD002ovPDHLkV1i%be~|zH diff --git a/public/img/emoji/white_medium_small_square.png b/public/img/emoji/white_medium_small_square.png deleted file mode 100644 index 6f91c308ab4472e33adb3d2ddd2c9a1877164afd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1800 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 P00000NkvXXu0mjf5j$I= diff --git a/public/img/emoji/white_small_square.png b/public/img/emoji/white_small_square.png deleted file mode 100644 index 902e267d787dfc86180d6b36599af52179501239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1391 zcmV-#1(5oQP)27p+}zyi>gwa;*NqN1Yk@bJ~u)xW>Ly}iBi^78fd^_G^Fm6esy(9r4W z>4JiS^Yioe_V$#Nl+)AGzP`S^yu6{Iq14pWl9H0Sxw+EP(u0G8&(F`!&d$2Jx`l;> zz`(%5!ou|Q^mB7_c6N4*jEtwJr_0OBnwpxasj2t(_i=G?w6wIixVXW=!M3)xtgNhm ze}9*kmyL~$qobpbkB`a8$(@~@ySuxkrKO6Bium~W@$vC*Z*S4j(XgwX zetCI$goK2dnVHPY%(u6oSvSZ&CSin$H&;&+27yb+1c3H*x1+D*!lVS z($vz}*Vok4)4jdCa&mHTaB#A+vb(#wbaZsDudi)wZPeA&n3$N6k&%#)khQh7eSLkV zrlzs6v8t-7tE;Pge0+L(dV70&fq{Xfq@1-7}T3ZQGu;ZQHxCZTnN^R&}hJ*ZK8X4(_Rc=}r|74-d~T*u8h(#@}#g zKTWV_CYm%8l1V$z*Vl*tB$MRXm63xq!KRnP#Z0l7NF>~DcRcRG#N%;zFf>%mESvtK z3c6PldV`WxipAn!FsKm-1RD4&W?7|Di<2L6gfSY&Hnsz9)k z(6X#pqrroVFanH5EN11XxtA`OY06lYN;$xS2g73IfHpQKgX9Ry>m)fVX)I0S%2p*YJRXZBqaU9h>XziWbla{%Qk zIEiov^`KBIgfhnYrV_!;`?pdy7#>a`9Avl@N;u0Tgbl3^=8jPXwf80w8Q!Wj$mRGd z$svRahmZ{n=C;xV|JA0i%WyrUhsy|eT0<1rAZ&acszlHxv_O2g($Ex0BjG}TVZofM zNT49`#bN<8CFn;)q10NX#{V_HUEqV3hT}uICtTz8hOt5f)4(mQL>2ts>Pu+x@Dix6sqsc4 zU~q6DQkv%NiY<4U|-E_YM|9c7ox4WDa^i=ADi160B7IaAtXGDQKu--q%0{ZSJk x-9Jm8!p`YazhQb8O|X5#@7Yns!^88Z@&OW%?bR2{z-|Bl002ovPDHLkV1muo=xG1| diff --git a/public/img/emoji/white_square_button.png b/public/img/emoji/white_square_button.png deleted file mode 100644 index ad54d55c0cd727b947f81277073462c71faf31d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1725 zcmV;u215CXP)M~e6^qB2AG4Q*Vc0+9kJy8ryvQIZh$yJ2;{$wk*Hlz@ zlwov4WTduLqMKOOyE5a8cVu>!=Xv=Sy@^6b75iO@6SccvMjXQ?RPR|0x16KR^FtX=&-NnVFdm0Pvm~0B~}0(k;OFqd5I40#Gpi z%k1pzr@6Vg0001T-d49UZM9nNXF-wy0C?y8{QQfm0uvJxd9j7Dv9YkYxEQ9Vr-ul` zj;VU!H99EinrHC5KRl<`rDJ54G~UzG)3Cq45A>BZssO-8;04$hY7mx}mrLY;SlHkm zZuoI}j?cV=dof9Z`;=G;5Z}7pZYjyz+uLDpZ?B@w^aAiAJP3r}+}u>>6aeHt?kOPr zT1-MLu5ti7?(grz?d@$vC2%xx zNL<&LWC0grkZ1$Az9Gj^4e%MssBoa@G3cVE0-S4_H;`0?b6&C){QF4~z(Ig>+~Yk& znhwy4Bsn1(!Iq7X#9tb_C2g6<-B8QUJ3_*-6H2rf3@^cSTvQUhlHf9e^koVF=Qc_M zjUQkGi%Z?1r7AIksScwdqkvPw(9%nQQ1|FEf*e8gqud3;{ngdgk%z7+;q}_u+7OVE z1Zdw|jr(|N8|Znm z8FLIsdu*znj>CvaDUcny$uj-p0u z08&kGR0LDw2gGs%$Hz%aVXlf0H!LLpkVbIU^~t1U$g1*i0GdpOELF57Xk98Gi9MG9Ey<`=1%hveDmfGe5u)`!yv8NK z8+N{CC`=2rDQ;Lyhv`RnH278}fHO@>kdo42KIP3-fTqYzN&qF88$S)Cq+CF<0aB5) zDI>_aZiT|pT!6n!LrJb{Zz&z7iI6lMm+S>JHIV#k)7+<1b(RfyQ7CNr*0Ach|05z!L{}+>^9) z)|d4oS2|2}UWx=c*ClU(howcXzMuE&%ygk;w^tT9d2FFcfFupbEXgh; zc>!AY*VgsXWh(SKmaF?yOF+=m`@L#Vxwz7!+V@We2Kw=NBnoGxv}N^H(bS9taRnH3 zAaRxZT2U=pp_)s`5sb*{@w{K;e@t@1d!n0&sD0ad~!jHe~o-GnpB6*sS#h!~<!k0-!GuiQi1=judlxq`qBySuobky4=2x505&!@V7bLn_(1K$|9JX0Cv$>N TNNp8n00000NkvXXu0mjfFDN5? diff --git a/public/img/emoji/wind_chime.png b/public/img/emoji/wind_chime.png deleted file mode 100644 index 172d13a5987b7069b2462d9714445091da47a97f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2130 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 go%Mv)fL-~2`!+oMi)hjph&gwNp%Gj79*lG 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 diff --git a/public/img/emoji/wolf.png b/public/img/emoji/wolf.png deleted file mode 100644 index 864023594f7c7ea24f79fd311585c0422399fab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2792 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 diff --git a/public/img/emoji/womans_clothes.png b/public/img/emoji/womans_clothes.png deleted file mode 100644 index e8f25730592318b26e2181f1ffed647d5a57f58a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2833 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 diff --git a/public/img/emoji/x.png b/public/img/emoji/x.png deleted file mode 100644 index b2b5eaa3c9a4c82f270fefe72e71c5bfd25b511b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1994 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 Z=QHfbdtUl(@8SRe002ovPDHLkV1o7i`?vrA diff --git a/public/img/emoji/yen.png b/public/img/emoji/yen.png deleted file mode 100644 index 8e74c5b349b9959bc4542a6a671fdd9876ddc1f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2741 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 diff --git a/public/img/emoji/yum.png b/public/img/emoji/yum.png deleted file mode 100644 index e047241e8807f63ec6abb778dd39fdb8e1013740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3044 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 I@3~p=f8Ud?DgXcg diff --git a/public/img/favicon.ico b/public/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fd35f5357fddbbc8b2895ac157975223858f2f89 GIT binary patch literal 90022 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 literal 26945 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 z7-_E0&2soTonc004wR_D^k(4_E;J0000000000000000000000*bV1u`LS R=|%tm002ovPDHLkV1g;Mj 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 Z9+&4SM@nbE!bUOzl;qXrYGlmA{tx4U{&@fZ literal 0 HcmV?d00001 diff --git a/public/img/openid-16x16.png b/public/img/openid-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..b3184808423b66f9de8852133609697d34c798ce GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUoilItkI9lNRxRJNZ`ZXO zSN~jI_~^;QzyJRTYF{-5s$op>c6VXuV3qX%aySb-B8wRqxP?KOkzv*x37{Z*iKnkC z`$J{{A#L$DB@Pupp%70O#}JO|$r|iU1qx{lkAey{77K_kKC>bq#!~i#L4ux$d4gZM zMv|Alh<=z^vOxg*DoyXO 0) { @@ -1016,6 +1068,56 @@ function initAdmin() { } } + function onOAuth2Change() { + $('.open_id_connect_auto_discovery_url, .oauth2_use_custom_url').hide(); + $('.open_id_connect_auto_discovery_url input[required]').removeAttr('required'); + + var provider = $('#oauth2_provider').val(); + switch (provider) { + case 'github': + case 'gitlab': + $('.oauth2_use_custom_url').show(); + break; + case 'openidConnect': + $('.open_id_connect_auto_discovery_url input').attr('required', 'required'); + $('.open_id_connect_auto_discovery_url').show(); + break; + } + onOAuth2UseCustomURLChange(); + } + + function onOAuth2UseCustomURLChange() { + var provider = $('#oauth2_provider').val(); + $('.oauth2_use_custom_url_field').hide(); + $('.oauth2_use_custom_url_field input[required]').removeAttr('required'); + + if ($('#oauth2_use_custom_url').is(':checked')) { + if (!$('#oauth2_token_url').val()) { + $('#oauth2_token_url').val($('#' + provider + '_token_url').val()); + } + if (!$('#oauth2_auth_url').val()) { + $('#oauth2_auth_url').val($('#' + provider + '_auth_url').val()); + } + if (!$('#oauth2_profile_url').val()) { + $('#oauth2_profile_url').val($('#' + provider + '_profile_url').val()); + } + if (!$('#oauth2_email_url').val()) { + $('#oauth2_email_url').val($('#' + provider + '_email_url').val()); + } + switch (provider) { + case 'github': + $('.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input, .oauth2_email_url input').attr('required', 'required'); + $('.oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url, .oauth2_email_url').show(); + break; + case 'gitlab': + $('.oauth2_token_url input, .oauth2_auth_url input, .oauth2_profile_url input').attr('required', 'required'); + $('.oauth2_token_url, .oauth2_auth_url, .oauth2_profile_url').show(); + $('#oauth2_email_url').val(''); + break; + } + } + } + // New authentication if ($('.admin.new.authentication').length > 0) { $('#auth_type').change(function () { @@ -1044,22 +1146,28 @@ function initAdmin() { break; case '6': // OAuth2 $('.oauth2').show(); - $('.oauth2 input').attr('required', 'required'); + $('.oauth2 div.required:not(.oauth2_use_custom_url,.oauth2_use_custom_url_field,.open_id_connect_auto_discovery_url) input').attr('required', 'required'); + onOAuth2Change(); break; } - if (authType == '2' || authType == '5') { onSecurityProtocolChange() } }); $('#auth_type').change(); - $('#security_protocol').change(onSecurityProtocolChange) + $('#security_protocol').change(onSecurityProtocolChange); + $('#oauth2_provider').change(onOAuth2Change); + $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange); } // Edit authentication if ($('.admin.edit.authentication').length > 0) { var authType = $('#auth_type').val(); if (authType == '2' || authType == '5') { $('#security_protocol').change(onSecurityProtocolChange); + } else if (authType == '6') { + $('#oauth2_provider').change(onOAuth2Change); + $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange); + onOAuth2Change(); } } @@ -1348,7 +1456,7 @@ $(document).ready(function () { // Emojify emojify.setConfig({ - img_dir: suburl + '/img/emoji', + img_dir: suburl + '/plugins/emojify/images', ignore_emoticons: true }); var hasEmoji = document.getElementsByClassName('has-emoji'); @@ -1377,7 +1485,11 @@ $(document).ready(function () { // Helpers. $('.delete-button').click(function () { var $this = $(this); - $('.delete.modal').modal({ + var filter = ""; + if ($this.attr("id")) { + filter += "#"+$this.attr("id") + } + $('.delete.modal'+filter).modal({ closable: false, onApprove: function () { if ($this.data('type') == "form") { @@ -1431,6 +1543,29 @@ $(document).ready(function () { }); $('.markdown').autolink(); + $('.issue-checkbox').click(function() { + var numChecked = $('.issue-checkbox').children('input:checked').length; + if (numChecked > 0) { + $('.issue-filters').hide(); + $('.issue-actions').show(); + } else { + $('.issue-filters').show(); + $('.issue-actions').hide(); + } + }); + + $('.issue-action').click(function () { + var action = this.dataset.action + var elementId = this.dataset.elementId + var issueIDs = $('.issue-checkbox').children('input:checked').map(function() { + return this.dataset.issueId; + }).get().join(); + var url = this.dataset.url + updateIssuesMeta(url, action, issueIDs, elementId, function() { + location.reload(); + }); + }); + buttonsClickOnEnter(); searchUsers(); searchRepositories(); @@ -1446,6 +1581,8 @@ $(document).ready(function () { initWebhook(); initAdmin(); initCodeView(); + initVueApp(); + initTeamSettings(); // Repo clone url. if ($('#repo-clone-url').length > 0) { @@ -1521,15 +1658,6 @@ $(function () { if ($('.user.signin').length > 0) return; $('form').areYouSure(); - $("#search_repo").on('change paste keyup',function(){ - var value = $(this).val(); - if(!value){ - $('.list-search-style').html(''); - } else{ - $('.list-search-style').html('.search-list li:not([data-title*="' + value + '"]) {display: none;}'); - } - }); - // Parse SSH Key $("#ssh-key-content").on('change paste keyup',function(){ var arrays = $(this).val().split(" "); @@ -1539,3 +1667,145 @@ $(function () { } }); }); + +function initVueComponents(){ + var vueDelimeters = ['${', '}']; + + Vue.component('repo-search', { + delimiters: vueDelimeters, + + props: { + searchLimit: { + type: Number, + default: 10 + }, + suburl: { + type: String, + required: true + }, + uid: { + type: Number, + required: true + }, + organizations: { + type: Array, + default: [] + }, + isOrganization: { + type: Boolean, + default: true + }, + canCreateOrganization: { + type: Boolean, + default: false + }, + organizationsTotalCount: { + type: Number, + default: 0 + }, + moreReposLink: { + type: String, + default: '' + } + }, + + data: function() { + return { + tab: 'repos', + repos: [], + reposTotalCount: 0, + reposFilter: 'all', + searchQuery: '', + isLoading: false + } + }, + + mounted: function() { + this.searchRepos(); + + var self = this; + Vue.nextTick(function() { + self.$refs.search.focus(); + }); + }, + + methods: { + changeTab: function(t) { + this.tab = t; + }, + + changeReposFilter: function(filter) { + this.reposFilter = filter; + }, + + showRepo: function(repo, filter) { + switch (filter) { + case 'sources': + return repo.owner.id == this.uid && !repo.mirror && !repo.fork; + case 'forks': + return repo.owner.id == this.uid && !repo.mirror && repo.fork; + case 'mirrors': + return repo.mirror; + case 'collaborative': + return repo.owner.id != this.uid; + default: + return true; + } + }, + + searchRepos: function() { + var self = this; + this.isLoading = true; + var searchedQuery = this.searchQuery; + $.getJSON(this.searchURL(), function(result, textStatus, request) { + if (searchedQuery == self.searchQuery) { + self.repos = result.data; + if (searchedQuery == "") { + self.reposTotalCount = request.getResponseHeader('X-Total-Count'); + } + } + }).always(function() { + if (searchedQuery == self.searchQuery) { + self.isLoading = false; + } + }); + }, + + searchURL: function() { + return this.suburl + '/api/v1/repos/search?uid=' + this.uid + '&q=' + this.searchQuery + '&limit=' + this.searchLimit; + }, + + repoClass: function(repo) { + if (repo.fork) { + return 'octicon octicon-repo-forked'; + } else if (repo.mirror) { + return 'octicon octicon-repo-clone'; + } else if (repo.private) { + return 'octicon octicon-lock'; + } else { + return 'octicon octicon-repo'; + } + } + } + }) +} + +function initVueApp() { + var el = document.getElementById('app'); + if (!el) { + return; + } + + initVueComponents(); + + new Vue({ + delimiters: ['${', '}'], + el: el, + + data: { + searchLimit: document.querySelector('meta[name=_search_limit]').content, + suburl: document.querySelector('meta[name=_suburl]').content, + uid: document.querySelector('meta[name=_context_uid]').content, + }, + }); +} diff --git a/public/js/jquery-1.11.3.min.js b/public/js/jquery-1.11.3.min.js deleted file mode 100644 index 0f60b7b..0000000 --- a/public/js/jquery-1.11.3.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; - -return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"

","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("'},placeholder:function(e,t){var n="";return t&&(n+=''),e&&(n+=''),n}},api:!1,onPause:function(){},onPlay:function(){},onStop:function(){}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.modal=function(o){var a,r=e(this),s=e(t),l=e(n),c=e("body"),u=r.selector||"",d=(new Date).getTime(),f=[],m=arguments[0],g="string"==typeof m,p=[].slice.call(arguments,1),h=t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame||function(e){setTimeout(e,0)};return r.each(function(){var r,v,b,y,x,C,w,k,S,T=e.isPlainObject(o)?e.extend(!0,{},e.fn.modal.settings,o):e.extend({},e.fn.modal.settings),A=T.selector,R=T.className,P=T.namespace,E=T.error,F="."+P,O="module-"+P,D=e(this),q=e(T.context),j=D.find(A.close),z=this,M=D.data(O);S={initialize:function(){S.verbose("Initializing dimmer",q),S.create.id(),S.create.dimmer(),S.refreshModals(),S.bind.events(),T.observeChanges&&S.observeChanges(),S.instantiate()},instantiate:function(){S.verbose("Storing instance of modal"),M=S,D.data(O,M)},create:{dimmer:function(){var t={debug:T.debug,dimmerName:"modals",duration:{show:T.duration,hide:T.duration}},n=e.extend(!0,t,T.dimmerSettings);return T.inverted&&(n.variation=n.variation!==i?n.variation+" inverted":"inverted"),e.fn.dimmer===i?void S.error(E.dimmer):(S.debug("Creating dimmer with settings",n),y=q.dimmer(n),T.detachable?(S.verbose("Modal is detachable, moving content into dimmer"),y.dimmer("add content",D)):S.set.undetached(),T.blurring&&y.addClass(R.blurring),void(x=y.dimmer("get dimmer")))},id:function(){w=(Math.random().toString(16)+"000000000").substr(2,8),C="."+w,S.verbose("Creating unique id for element",w)}},destroy:function(){S.verbose("Destroying previous modal"),D.removeData(O).off(F),s.off(C),x.off(C),j.off(F),q.dimmer("destroy")},observeChanges:function(){"MutationObserver"in t&&(k=new MutationObserver(function(e){S.debug("DOM tree modified, refreshing"),S.refresh()}),k.observe(z,{childList:!0,subtree:!0}),S.debug("Setting up mutation observer",k))},refresh:function(){S.remove.scrolling(),S.cacheSizes(),S.set.screenHeight(),S.set.type(),S.set.position()},refreshModals:function(){v=D.siblings(A.modal),r=v.add(D)},attachEvents:function(t,n){var i=e(t);n=e.isFunction(S[n])?S[n]:S.toggle,i.length>0?(S.debug("Attaching modal events to element",t,n),i.off(F).on("click"+F,n)):S.error(E.notFound,t)},bind:{events:function(){S.verbose("Attaching events"),D.on("click"+F,A.close,S.event.close).on("click"+F,A.approve,S.event.approve).on("click"+F,A.deny,S.event.deny),s.on("resize"+C,S.event.resize)}},get:{id:function(){return(Math.random().toString(16)+"000000000").substr(2,8)}},event:{approve:function(){return T.onApprove.call(z,e(this))===!1?void S.verbose("Approve callback returned false cancelling hide"):void S.hide()},deny:function(){return T.onDeny.call(z,e(this))===!1?void S.verbose("Deny callback returned false cancelling hide"):void S.hide()},close:function(){S.hide()},click:function(t){var i=e(t.target),o=i.closest(A.modal).length>0,a=e.contains(n.documentElement,t.target);!o&&a&&(S.debug("Dimmer clicked, hiding all modals"),S.is.active()&&(S.remove.clickaway(),T.allowMultiple?S.hide():S.hideAll()))},debounce:function(e,t){clearTimeout(S.timer),S.timer=setTimeout(e,t)},keyboard:function(e){var t=e.which,n=27;t==n&&(T.closable?(S.debug("Escape key pressed hiding modal"),S.hide()):S.debug("Escape key pressed, but closable is set to false"),e.preventDefault())},resize:function(){y.dimmer("is active")&&h(S.refresh)}},toggle:function(){S.is.active()||S.is.animating()?S.hide():S.show()},show:function(t){t=e.isFunction(t)?t:function(){},S.refreshModals(),S.showModal(t)},hide:function(t){t=e.isFunction(t)?t:function(){},S.refreshModals(),S.hideModal(t)},showModal:function(t){t=e.isFunction(t)?t:function(){},S.is.animating()||!S.is.active()?(S.showDimmer(),S.cacheSizes(),S.set.position(),S.set.screenHeight(),S.set.type(),S.set.clickaway(),!T.allowMultiple&&S.others.active()?S.hideOthers(S.showModal):(T.onShow.call(z),T.transition&&e.fn.transition!==i&&D.transition("is supported")?(S.debug("Showing modal with css animations"),D.transition({debug:T.debug,animation:T.transition+" in",queue:T.queue,duration:T.duration,useFailSafe:!0,onComplete:function(){T.onVisible.apply(z),S.add.keyboardShortcuts(),S.save.focus(),S.set.active(),T.autofocus&&S.set.autofocus(),t()}})):S.error(E.noTransition))):S.debug("Modal is already visible")},hideModal:function(t,n){return t=e.isFunction(t)?t:function(){},S.debug("Hiding modal"),T.onHide.call(z,e(this))===!1?void S.verbose("Hide callback returned false cancelling hide"):void((S.is.animating()||S.is.active())&&(T.transition&&e.fn.transition!==i&&D.transition("is supported")?(S.remove.active(),D.transition({debug:T.debug,animation:T.transition+" out",queue:T.queue,duration:T.duration,useFailSafe:!0,onStart:function(){S.others.active()||n||S.hideDimmer(),S.remove.keyboardShortcuts()},onComplete:function(){T.onHidden.call(z),S.restore.focus(),t()}})):S.error(E.noTransition)))},showDimmer:function(){y.dimmer("is animating")||!y.dimmer("is active")?(S.debug("Showing dimmer"),y.dimmer("show")):S.debug("Dimmer already visible")},hideDimmer:function(){return y.dimmer("is animating")||y.dimmer("is active")?void y.dimmer("hide",function(){S.remove.clickaway(),S.remove.screenHeight()}):void S.debug("Dimmer is not visible cannot hide")},hideAll:function(t){var n=r.filter("."+R.active+", ."+R.animating);t=e.isFunction(t)?t:function(){},n.length>0&&(S.debug("Hiding all visible modals"),S.hideDimmer(),n.modal("hide modal",t))},hideOthers:function(t){var n=v.filter("."+R.active+", ."+R.animating);t=e.isFunction(t)?t:function(){},n.length>0&&(S.debug("Hiding other modals",v),n.modal("hide modal",t,!0))},others:{active:function(){return v.filter("."+R.active).length>0},animating:function(){return v.filter("."+R.animating).length>0}},add:{keyboardShortcuts:function(){S.verbose("Adding keyboard shortcuts"),l.on("keyup"+F,S.event.keyboard)}},save:{focus:function(){b=e(n.activeElement).blur()}},restore:{focus:function(){b&&b.length>0&&b.focus()}},remove:{active:function(){D.removeClass(R.active)},clickaway:function(){T.closable&&x.off("click"+C)},bodyStyle:function(){""===c.attr("style")&&(S.verbose("Removing style attribute"),c.removeAttr("style"))},screenHeight:function(){S.debug("Removing page height"),c.css("height","")},keyboardShortcuts:function(){S.verbose("Removing keyboard shortcuts"),l.off("keyup"+F)},scrolling:function(){y.removeClass(R.scrolling),D.removeClass(R.scrolling)}},cacheSizes:function(){var o=D.outerHeight();(S.cache===i||0!==o)&&(S.cache={pageHeight:e(n).outerHeight(),height:o+T.offset,contextHeight:"body"==T.context?e(t).height():y.height()}),S.debug("Caching modal and container sizes",S.cache)},can:{fit:function(){return S.cache.height+2*T.padding0?t.first():e.first();n.length>0&&n.focus()},clickaway:function(){T.closable&&x.on("click"+C,S.event.click)},screenHeight:function(){S.can.fit()?c.css("height",""):(S.debug("Modal is taller than page content, resizing page height"),c.css("height",S.cache.height+2*T.padding))},active:function(){D.addClass(R.active)},scrolling:function(){y.addClass(R.scrolling),D.addClass(R.scrolling)},type:function(){S.can.fit()?(S.verbose("Modal fits on screen"),S.others.active()||S.others.animating()||S.remove.scrolling()):(S.verbose("Modal cannot fit on screen setting to scrolling"),S.set.scrolling())},position:function(){S.verbose("Centering modal on page",S.cache),S.can.fit()?D.css({top:"",marginTop:-(S.cache.height/2)}):D.css({marginTop:"",top:l.scrollTop()})},undetached:function(){y.addClass(R.undetached)}},setting:function(t,n){if(S.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,T,t);else{if(n===i)return T[t];e.isPlainObject(T[t])?e.extend(!0,T[t],n):T[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,S,t);else{if(n===i)return S[t];S[t]=n}},debug:function(){!T.silent&&T.debug&&(T.performance?S.performance.log(arguments):(S.debug=Function.prototype.bind.call(console.info,console,T.name+":"),S.debug.apply(console,arguments)))},verbose:function(){!T.silent&&T.verbose&&T.debug&&(T.performance?S.performance.log(arguments):(S.verbose=Function.prototype.bind.call(console.info,console,T.name+":"),S.verbose.apply(console,arguments)))},error:function(){T.silent||(S.error=Function.prototype.bind.call(console.error,console,T.name+":"),S.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;T.performance&&(t=(new Date).getTime(),i=d||t,n=t-i,d=t,f.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:z,"Execution Time":n})),clearTimeout(S.performance.timer),S.performance.timer=setTimeout(S.performance.display,500)},display:function(){var t=T.name+":",n=0;d=!1,clearTimeout(S.performance.timer),e.each(f,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",u&&(t+=" '"+u+"'"),(console.group!==i||console.table!==i)&&f.length>0&&(console.groupCollapsed(t),console.table?console.table(f):e.each(f,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),f=[]}},invoke:function(t,n,o){var r,s,l,c=M;return n=n||p,o=z||o,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):!1;c=c[o]}})),e.isFunction(s)?l=s.apply(o,n):s!==i&&(l=s),e.isArray(a)?a.push(l):a!==i?a=[a,l]:l!==i&&(a=l),s}},g?(M===i&&S.initialize(),S.invoke(m)):(M!==i&&M.invoke("destroy"),S.initialize())}),a!==i?a:this},e.fn.modal.settings={name:"Modal",namespace:"modal",silent:!1,debug:!1,verbose:!1,performance:!0,observeChanges:!1,allowMultiple:!1,detachable:!0,closable:!0,autofocus:!0,inverted:!1,blurring:!1,dimmerSettings:{closable:!1,useCSS:!0},context:"body",queue:!1,duration:500,offset:0,transition:"scale",padding:50,onShow:function(){},onVisible:function(){},onHide:function(){return!0},onHidden:function(){},onApprove:function(){return!0},onDeny:function(){return!0},selector:{close:"> .close",approve:".actions .positive, .actions .approve, .actions .ok",deny:".actions .negative, .actions .deny, .actions .cancel",modal:".ui.modal"},error:{dimmer:"UI Dimmer, a required component is not included in this page",method:"The method you called is not defined.",notFound:"The element you specified could not be found"},className:{active:"active",animating:"animating",blurring:"blurring",scrolling:"scrolling",undetached:"undetached"}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.nag=function(n){var o,a=e(this),r=a.selector||"",s=(new Date).getTime(),l=[],c=arguments[0],u="string"==typeof c,d=[].slice.call(arguments,1);return a.each(function(){var a,f=e.isPlainObject(n)?e.extend(!0,{},e.fn.nag.settings,n):e.extend({},e.fn.nag.settings),m=(f.className,f.selector),g=f.error,p=f.namespace,h="."+p,v=p+"-module",b=e(this),y=(b.find(m.close),e(f.context?f.context:"body")),x=this,C=b.data(v);t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame||function(e){setTimeout(e,0)};a={initialize:function(){a.verbose("Initializing element"),b.on("click"+h,m.close,a.dismiss).data(v,a),f.detachable&&b.parent()[0]!==y[0]&&b.detach().prependTo(y),f.displayTime>0&&setTimeout(a.hide,f.displayTime),a.show()},destroy:function(){a.verbose("Destroying instance"),b.removeData(v).off(h)},show:function(){a.should.show()&&!b.is(":visible")&&(a.debug("Showing nag",f.animation.show),"fade"==f.animation.show?b.fadeIn(f.duration,f.easing):b.slideDown(f.duration,f.easing))},hide:function(){a.debug("Showing nag",f.animation.hide),"fade"==f.animation.show?b.fadeIn(f.duration,f.easing):b.slideUp(f.duration,f.easing)},onHide:function(){a.debug("Removing nag",f.animation.hide),b.remove(),f.onHide&&f.onHide()},dismiss:function(e){f.storageMethod&&a.storage.set(f.key,f.value),a.hide(),e.stopImmediatePropagation(),e.preventDefault()},should:{show:function(){return f.persist?(a.debug("Persistent nag is set, can show nag"),!0):a.storage.get(f.key)!=f.value.toString()?(a.debug("Stored value is not set, can show nag",a.storage.get(f.key)),!0):(a.debug("Stored value is set, cannot show nag",a.storage.get(f.key)),!1)}},get:{storageOptions:function(){var e={};return f.expires&&(e.expires=f.expires),f.domain&&(e.domain=f.domain),f.path&&(e.path=f.path),e}},clear:function(){a.storage.remove(f.key)},storage:{set:function(n,o){var r=a.get.storageOptions();if("localstorage"==f.storageMethod&&t.localStorage!==i)t.localStorage.setItem(n,o),a.debug("Value stored using local storage",n,o);else if("sessionstorage"==f.storageMethod&&t.sessionStorage!==i)t.sessionStorage.setItem(n,o),a.debug("Value stored using session storage",n,o);else{if(e.cookie===i)return void a.error(g.noCookieStorage);e.cookie(n,o,r),a.debug("Value stored using cookie",n,o,r)}},get:function(n,o){var r;return"localstorage"==f.storageMethod&&t.localStorage!==i?r=t.localStorage.getItem(n):"sessionstorage"==f.storageMethod&&t.sessionStorage!==i?r=t.sessionStorage.getItem(n):e.cookie!==i?r=e.cookie(n):a.error(g.noCookieStorage),("undefined"==r||"null"==r||r===i||null===r)&&(r=i),r},remove:function(n){var o=a.get.storageOptions();"localstorage"==f.storageMethod&&t.localStorage!==i?t.localStorage.removeItem(n):"sessionstorage"==f.storageMethod&&t.sessionStorage!==i?t.sessionStorage.removeItem(n):e.cookie!==i?e.removeCookie(n,o):a.error(g.noStorage)}},setting:function(t,n){if(a.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,f,t);else{if(n===i)return f[t];e.isPlainObject(f[t])?e.extend(!0,f[t],n):f[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,a,t);else{if(n===i)return a[t];a[t]=n}},debug:function(){!f.silent&&f.debug&&(f.performance?a.performance.log(arguments):(a.debug=Function.prototype.bind.call(console.info,console,f.name+":"),a.debug.apply(console,arguments)))},verbose:function(){!f.silent&&f.verbose&&f.debug&&(f.performance?a.performance.log(arguments):(a.verbose=Function.prototype.bind.call(console.info,console,f.name+":"),a.verbose.apply(console,arguments)))},error:function(){f.silent||(a.error=Function.prototype.bind.call(console.error,console,f.name+":"),a.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;f.performance&&(t=(new Date).getTime(),i=s||t,n=t-i,s=t,l.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:x,"Execution Time":n})),clearTimeout(a.performance.timer),a.performance.timer=setTimeout(a.performance.display,500)},display:function(){var t=f.name+":",n=0;s=!1,clearTimeout(a.performance.timer),e.each(l,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",r&&(t+=" '"+r+"'"),(console.group!==i||console.table!==i)&&l.length>0&&(console.groupCollapsed(t),console.table?console.table(l):e.each(l,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),l=[]}},invoke:function(t,n,r){var s,l,c,u=C;return n=n||d,r=x||r,"string"==typeof t&&u!==i&&(t=t.split(/[\. ]/),s=t.length-1,e.each(t,function(n,o){var r=n!=s?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(u[r])&&n!=s)u=u[r];else{if(u[r]!==i)return l=u[r],!1;if(!e.isPlainObject(u[o])||n==s)return u[o]!==i?(l=u[o],!1):(a.error(g.method,t),!1);u=u[o]}})),e.isFunction(l)?c=l.apply(r,n):l!==i&&(c=l),e.isArray(o)?o.push(c):o!==i?o=[o,c]:c!==i&&(o=c),l}},u?(C===i&&a.initialize(),a.invoke(c)):(C!==i&&C.invoke("destroy"),a.initialize())}),o!==i?o:this},e.fn.nag.settings={name:"Nag",silent:!1,debug:!1,verbose:!1,performance:!0,namespace:"Nag",persist:!1,displayTime:0,animation:{show:"slide",hide:"slide"},context:!1,detachable:!1,expires:30,domain:!1,path:"/",storageMethod:"cookie",key:"nag",value:"dismiss",error:{noCookieStorage:"$.cookie is not included. A storage solution is required.",noStorage:"Neither $.cookie or store is defined. A storage solution is required for storing state",method:"The method you called is not defined."},className:{bottom:"bottom",fixed:"fixed"},selector:{close:".close.icon"},speed:500,easing:"easeOutQuad",onHide:function(){}},e.extend(e.easing,{easeOutQuad:function(e,t,n,i,o){return-i*(t/=o)*(t-2)+n}})}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.popup=function(o){var a,r=e(this),s=e(n),l=e(t),c=e("body"),u=r.selector||"",d=!0,f=(new Date).getTime(),m=[],g=arguments[0],p="string"==typeof g,h=[].slice.call(arguments,1);return r.each(function(){var r,v,b,y,x,C,w=e.isPlainObject(o)?e.extend(!0,{},e.fn.popup.settings,o):e.extend({},e.fn.popup.settings),k=w.selector,S=w.className,T=w.error,A=w.metadata,R=w.namespace,P="."+w.namespace,E="module-"+R,F=e(this),O=e(w.context),D=e(w.scrollContext),q=e(w.boundary),j=w.target?e(w.target):F,z=0,M=!1,I=!1,L=this,N=F.data(E);C={initialize:function(){C.debug("Initializing",F),C.createID(),C.bind.events(),!C.exists()&&w.preserve&&C.create(),C.observeChanges(),C.instantiate()},instantiate:function(){C.verbose("Storing instance",C),N=C,F.data(E,N)},observeChanges:function(){"MutationObserver"in t&&(b=new MutationObserver(C.event.documentChanged),b.observe(n,{childList:!0,subtree:!0}),C.debug("Setting up mutation observer",b))},refresh:function(){w.popup?r=e(w.popup).eq(0):w.inline&&(r=j.nextAll(k.popup).eq(0),w.popup=r),w.popup?(r.addClass(S.loading),v=C.get.offsetParent(),r.removeClass(S.loading),w.movePopup&&C.has.popup()&&C.get.offsetParent(r)[0]!==v[0]&&(C.debug("Moving popup to the same offset parent as activating element"),r.detach().appendTo(v))):v=w.inline?C.get.offsetParent(j):C.has.popup()?C.get.offsetParent(r):c,v.is("html")&&v[0]!==c[0]&&(C.debug("Setting page as offset parent"),v=c),C.get.variation()&&C.set.variation()},reposition:function(){C.refresh(),C.set.position()},destroy:function(){C.debug("Destroying previous module"),b&&b.disconnect(),r&&!w.preserve&&C.removePopup(),clearTimeout(C.hideTimer),clearTimeout(C.showTimer),C.unbind.close(),C.unbind.events(),F.removeData(E)},event:{start:function(t){var n=e.isPlainObject(w.delay)?w.delay.show:w.delay;clearTimeout(C.hideTimer),I||(C.showTimer=setTimeout(C.show,n))},end:function(){var t=e.isPlainObject(w.delay)?w.delay.hide:w.delay;clearTimeout(C.showTimer),C.hideTimer=setTimeout(C.hide,t)},touchstart:function(e){I=!0,C.show()},resize:function(){C.is.visible()&&C.set.position()},documentChanged:function(t){[].forEach.call(t,function(t){t.removedNodes&&[].forEach.call(t.removedNodes,function(t){(t==L||e(t).find(L).length>0)&&(C.debug("Element removed from DOM, tearing down events"),C.destroy())})})},hideGracefully:function(t){var i=e(t.target),o=e.contains(n.documentElement,t.target),a=i.closest(k.popup).length>0;t&&!a&&o?(C.debug("Click occurred outside popup hiding popup"),C.hide()):C.debug("Click was inside popup, keeping popup open")}},create:function(){var t=C.get.html(),n=C.get.title(),i=C.get.content();t||i||n?(C.debug("Creating pop-up html"),t||(t=w.templates.popup({title:n,content:i})),r=e("
").addClass(S.popup).data(A.activator,F).html(t),w.inline?(C.verbose("Inserting popup element inline",r),r.insertAfter(F)):(C.verbose("Appending popup element to body",r),r.appendTo(O)),C.refresh(),C.set.variation(),w.hoverable&&C.bind.popup(),w.onCreate.call(r,L)):0!==j.next(k.popup).length?(C.verbose("Pre-existing popup found"),w.inline=!0,w.popup=j.next(k.popup).data(A.activator,F),C.refresh(),w.hoverable&&C.bind.popup()):w.popup?(e(w.popup).data(A.activator,F),C.verbose("Used popup specified in settings"),C.refresh(),w.hoverable&&C.bind.popup()):C.debug("No content specified skipping display",L)},createID:function(){x=(Math.random().toString(16)+"000000000").substr(2,8),y="."+x,C.verbose("Creating unique id for element",x)},toggle:function(){C.debug("Toggling pop-up"),C.is.hidden()?(C.debug("Popup is hidden, showing pop-up"),C.unbind.close(),C.show()):(C.debug("Popup is visible, hiding pop-up"),C.hide())},show:function(e){if(e=e||function(){},C.debug("Showing pop-up",w.transition),C.is.hidden()&&(!C.is.active()||!C.is.dropdown())){if(C.exists()||C.create(),w.onShow.call(r,L)===!1)return void C.debug("onShow callback returned false, cancelling popup animation"); -w.preserve||w.popup||C.refresh(),r&&C.set.position()&&(C.save.conditions(),w.exclusive&&C.hideAll(),C.animate.show(e))}},hide:function(e){if(e=e||function(){},C.is.visible()||C.is.animating()){if(w.onHide.call(r,L)===!1)return void C.debug("onHide callback returned false, cancelling popup animation");C.remove.visible(),C.unbind.close(),C.restore.conditions(),C.animate.hide(e)}},hideAll:function(){e(k.popup).filter("."+S.visible).each(function(){e(this).data(A.activator).popup("hide")})},exists:function(){return r?w.inline||w.popup?C.has.popup():r.closest(O).length>=1?!0:!1:!1},removePopup:function(){C.has.popup()&&!w.popup&&(C.debug("Removing popup",r),r.remove(),r=i,w.onRemove.call(r,L))},save:{conditions:function(){C.cache={title:F.attr("title")},C.cache.title&&F.removeAttr("title"),C.verbose("Saving original attributes",C.cache.title)}},restore:{conditions:function(){return C.cache&&C.cache.title&&(F.attr("title",C.cache.title),C.verbose("Restoring original attributes",C.cache.title)),!0}},supports:{svg:function(){return typeof SVGGraphicsElement===i}},animate:{show:function(t){t=e.isFunction(t)?t:function(){},w.transition&&e.fn.transition!==i&&F.transition("is supported")?(C.set.visible(),r.transition({animation:w.transition+" in",queue:!1,debug:w.debug,verbose:w.verbose,duration:w.duration,onComplete:function(){C.bind.close(),t.call(r,L),w.onVisible.call(r,L)}})):C.error(T.noTransition)},hide:function(t){return t=e.isFunction(t)?t:function(){},C.debug("Hiding pop-up"),w.onHide.call(r,L)===!1?void C.debug("onHide callback returned false, cancelling popup animation"):void(w.transition&&e.fn.transition!==i&&F.transition("is supported")?r.transition({animation:w.transition+" out",queue:!1,duration:w.duration,debug:w.debug,verbose:w.verbose,onComplete:function(){C.reset(),t.call(r,L),w.onHidden.call(r,L)}}):C.error(T.noTransition))}},change:{content:function(e){r.html(e)}},get:{html:function(){return F.removeData(A.html),F.data(A.html)||w.html},title:function(){return F.removeData(A.title),F.data(A.title)||w.title},content:function(){return F.removeData(A.content),F.data(A.content)||F.attr("title")||w.content},variation:function(){return F.removeData(A.variation),F.data(A.variation)||w.variation},popup:function(){return r},popupOffset:function(){return r.offset()},calculations:function(){var e,n=j[0],i=q[0]==t,o=w.inline||w.popup&&w.movePopup?j.position():j.offset(),a=i?{top:0,left:0}:q.offset(),s={},c=i?{top:l.scrollTop(),left:l.scrollLeft()}:{top:0,left:0};return s={target:{element:j[0],width:j.outerWidth(),height:j.outerHeight(),top:o.top,left:o.left,margin:{}},popup:{width:r.outerWidth(),height:r.outerHeight()},parent:{width:v.outerWidth(),height:v.outerHeight()},screen:{top:a.top,left:a.left,scroll:{top:c.top,left:c.left},width:q.width(),height:q.height()}},w.setFluidWidth&&C.is.fluid()&&(s.container={width:r.parent().outerWidth()},s.popup.width=s.container.width),s.target.margin.top=w.inline?parseInt(t.getComputedStyle(n).getPropertyValue("margin-top"),10):0,s.target.margin.left=w.inline?C.is.rtl()?parseInt(t.getComputedStyle(n).getPropertyValue("margin-right"),10):parseInt(t.getComputedStyle(n).getPropertyValue("margin-left"),10):0,e=s.screen,s.boundary={top:e.top+e.scroll.top,bottom:e.top+e.scroll.top+e.height,left:e.left+e.scroll.left,right:e.left+e.scroll.left+e.width},s},id:function(){return x},startEvent:function(){return"hover"==w.on?"mouseenter":"focus"==w.on?"focus":!1},scrollEvent:function(){return"scroll"},endEvent:function(){return"hover"==w.on?"mouseleave":"focus"==w.on?"blur":!1},distanceFromBoundary:function(e,t){var n,i,o={};return t=t||C.get.calculations(),n=t.popup,i=t.boundary,e&&(o={top:e.top-i.top,left:e.left-i.left,right:i.right-(e.left+n.width),bottom:i.bottom-(e.top+n.height)},C.verbose("Distance from boundaries determined",e,o)),o},offsetParent:function(t){var n=t!==i?t[0]:F[0],o=n.parentNode,a=e(o);if(o)for(var r="none"===a.css("transform"),s="static"===a.css("position"),l=a.is("html");o&&!l&&s&&r;)o=o.parentNode,a=e(o),r="none"===a.css("transform"),s="static"===a.css("position"),l=a.is("html");return a&&a.length>0?a:e()},positions:function(){return{"top left":!1,"top center":!1,"top right":!1,"bottom left":!1,"bottom center":!1,"bottom right":!1,"left center":!1,"right center":!1}},nextPosition:function(e){var t=e.split(" "),n=t[0],i=t[1],o={top:"bottom",bottom:"top",left:"right",right:"left"},a={left:"center",center:"right",right:"left"},r={"top left":"top center","top center":"top right","top right":"right center","right center":"bottom right","bottom right":"bottom center","bottom center":"bottom left","bottom left":"left center","left center":"top left"},s="top"==n||"bottom"==n,l=!1,c=!1,u=!1;return M||(C.verbose("All available positions available"),M=C.get.positions()),C.debug("Recording last position tried",e),M[e]=!0,"opposite"===w.prefer&&(u=[o[n],i],u=u.join(" "),l=M[u]===!0,C.debug("Trying opposite strategy",u)),"adjacent"===w.prefer&&s&&(u=[n,a[i]],u=u.join(" "),c=M[u]===!0,C.debug("Trying adjacent strategy",u)),(c||l)&&(C.debug("Using backup position",u),u=r[e]),u}},set:{position:function(e,t){if(0===j.length||0===r.length)return void C.error(T.notFound);var n,o,a,s,l,c,u,d;if(t=t||C.get.calculations(),e=e||F.data(A.position)||w.position,n=F.data(A.offset)||w.offset,o=w.distanceAway,a=t.target,s=t.popup,l=t.parent,0===a.width&&0===a.height&&!C.is.svg(a.element))return C.debug("Popup target is hidden, no action taken"),!1;switch(w.inline&&(C.debug("Adding margin to calculation",a.margin),"left center"==e||"right center"==e?(n+=a.margin.top,o+=-a.margin.left):"top left"==e||"top center"==e||"top right"==e?(n+=a.margin.left,o-=a.margin.top):(n+=a.margin.left,o+=a.margin.top)),C.debug("Determining popup position from calculations",e,t),C.is.rtl()&&(e=e.replace(/left|right/g,function(e){return"left"==e?"right":"left"}),C.debug("RTL: Popup position updated",e)),z==w.maxSearchDepth&&"string"==typeof w.lastResort&&(e=w.lastResort),e){case"top left":c={top:"auto",bottom:l.height-a.top+o,left:a.left+n,right:"auto"};break;case"top center":c={bottom:l.height-a.top+o,left:a.left+a.width/2-s.width/2+n,top:"auto",right:"auto"};break;case"top right":c={bottom:l.height-a.top+o,right:l.width-a.left-a.width-n,top:"auto",left:"auto"};break;case"left center":c={top:a.top+a.height/2-s.height/2+n,right:l.width-a.left+o,left:"auto",bottom:"auto"};break;case"right center":c={top:a.top+a.height/2-s.height/2+n,left:a.left+a.width+o,bottom:"auto",right:"auto"};break;case"bottom left":c={top:a.top+a.height+o,left:a.left+n,bottom:"auto",right:"auto"};break;case"bottom center":c={top:a.top+a.height+o,left:a.left+a.width/2-s.width/2+n,bottom:"auto",right:"auto"};break;case"bottom right":c={top:a.top+a.height+o,right:l.width-a.left-a.width-n,left:"auto",bottom:"auto"}}if(c===i&&C.error(T.invalidPosition,e),C.debug("Calculated popup positioning values",c),r.css(c).removeClass(S.position).addClass(e).addClass(S.loading),u=C.get.popupOffset(),d=C.get.distanceFromBoundary(u,t),C.is.offstage(d,e)){if(C.debug("Position is outside viewport",e),z0}},is:{offstage:function(t,n){var i=[];return e.each(t,function(e,t){t<-w.jitter&&(C.debug("Position exceeds allowable distance from edge",e,t,n),i.push(e))}),i.length>0?!0:!1},svg:function(e){return C.supports.svg()&&e instanceof SVGGraphicsElement},active:function(){return F.hasClass(S.active)},animating:function(){return r!==i&&r.hasClass(S.animating)},fluid:function(){return r!==i&&r.hasClass(S.fluid)},visible:function(){return r!==i&&r.hasClass(S.visible)},dropdown:function(){return F.hasClass(S.dropdown)},hidden:function(){return!C.is.visible()},rtl:function(){return"rtl"==F.css("direction")}},reset:function(){C.remove.visible(),w.preserve?e.fn.transition!==i&&r.transition("remove transition"):C.removePopup()},setting:function(t,n){if(e.isPlainObject(t))e.extend(!0,w,t);else{if(n===i)return w[t];w[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,C,t);else{if(n===i)return C[t];C[t]=n}},debug:function(){!w.silent&&w.debug&&(w.performance?C.performance.log(arguments):(C.debug=Function.prototype.bind.call(console.info,console,w.name+":"),C.debug.apply(console,arguments)))},verbose:function(){!w.silent&&w.verbose&&w.debug&&(w.performance?C.performance.log(arguments):(C.verbose=Function.prototype.bind.call(console.info,console,w.name+":"),C.verbose.apply(console,arguments)))},error:function(){w.silent||(C.error=Function.prototype.bind.call(console.error,console,w.name+":"),C.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;w.performance&&(t=(new Date).getTime(),i=f||t,n=t-i,f=t,m.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:L,"Execution Time":n})),clearTimeout(C.performance.timer),C.performance.timer=setTimeout(C.performance.display,500)},display:function(){var t=w.name+":",n=0;f=!1,clearTimeout(C.performance.timer),e.each(m,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",u&&(t+=" '"+u+"'"),(console.group!==i||console.table!==i)&&m.length>0&&(console.groupCollapsed(t),console.table?console.table(m):e.each(m,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),m=[]}},invoke:function(t,n,o){var r,s,l,c=N;return n=n||h,o=L||o,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):!1;c=c[o]}})),e.isFunction(s)?l=s.apply(o,n):s!==i&&(l=s),e.isArray(a)?a.push(l):a!==i?a=[a,l]:l!==i&&(a=l),s}},p?(N===i&&C.initialize(),C.invoke(g)):(N!==i&&N.invoke("destroy"),C.initialize())}),a!==i?a:this},e.fn.popup.settings={name:"Popup",silent:!1,debug:!1,verbose:!1,performance:!0,namespace:"popup",observeChanges:!0,onCreate:function(){},onRemove:function(){},onShow:function(){},onVisible:function(){},onHide:function(){},onUnplaceable:function(){},onHidden:function(){},on:"hover",boundary:t,addTouchEvents:!0,position:"top left",variation:"",movePopup:!0,target:!1,popup:!1,inline:!1,preserve:!1,hoverable:!1,content:!1,html:!1,title:!1,closable:!0,hideOnScroll:"auto",exclusive:!1,context:"body",scrollContext:t,prefer:"opposite",lastResort:!1,delay:{show:50,hide:70},setFluidWidth:!0,duration:200,transition:"scale",distanceAway:0,jitter:2,offset:0,maxSearchDepth:15,error:{invalidPosition:"The position you specified is not a valid position",cannotPlace:"Popup does not fit within the boundaries of the viewport",method:"The method you called is not defined.",noTransition:"This module requires ui transitions ",notFound:"The target or popup you specified does not exist on the page"},metadata:{activator:"activator",content:"content",html:"html",offset:"offset",position:"position",title:"title",variation:"variation"},className:{active:"active",animating:"animating",dropdown:"dropdown",fluid:"fluid",loading:"loading",popup:"ui popup",position:"top left center bottom right",visible:"visible"},selector:{popup:".ui.popup"},templates:{escape:function(e){var t=/[&<>"'`]/g,n=/[&<>"'`]/,i={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},o=function(e){return i[e]};return n.test(e)?e.replace(t,o):e},popup:function(t){var n="",o=e.fn.popup.settings.templates.escape;return typeof t!==i&&(typeof t.title!==i&&t.title&&(t.title=o(t.title),n+='
'+t.title+"
"),typeof t.content!==i&&t.content&&(t.content=o(t.content),n+='
'+t.content+"
")),n}}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();e.fn.progress=function(t){var o,a=e(this),r=a.selector||"",s=(new Date).getTime(),l=[],c=arguments[0],u="string"==typeof c,d=[].slice.call(arguments,1);return a.each(function(){var a,f,m=e.isPlainObject(t)?e.extend(!0,{},e.fn.progress.settings,t):e.extend({},e.fn.progress.settings),g=m.className,p=m.metadata,h=m.namespace,v=m.selector,b=m.error,y="."+h,x="module-"+h,C=e(this),w=e(this).find(v.bar),k=e(this).find(v.progress),S=e(this).find(v.label),T=this,A=C.data(x),R=!1;f={initialize:function(){f.debug("Initializing progress bar",m),f.set.duration(),f.set.transitionEvent(),f.read.metadata(),f.read.settings(),f.instantiate()},instantiate:function(){f.verbose("Storing instance of progress",f),A=f,C.data(x,f)},destroy:function(){f.verbose("Destroying previous progress for",C),clearInterval(A.interval),f.remove.state(),C.removeData(x),A=i},reset:function(){f.remove.nextValue(),f.update.progress(0)},complete:function(){(f.percent===i||f.percent<100)&&(f.remove.progressPoll(),f.set.percent(100))},read:{metadata:function(){var e={percent:C.data(p.percent),total:C.data(p.total),value:C.data(p.value)};e.percent&&(f.debug("Current percent value set from metadata",e.percent),f.set.percent(e.percent)),e.total&&(f.debug("Total value set from metadata",e.total),f.set.total(e.total)),e.value&&(f.debug("Current value set from metadata",e.value),f.set.value(e.value),f.set.progress(e.value))},settings:function(){m.total!==!1&&(f.debug("Current total set in settings",m.total),f.set.total(m.total)),m.value!==!1&&(f.debug("Current value set in settings",m.value),f.set.value(m.value),f.set.progress(f.value)),m.percent!==!1&&(f.debug("Current percent set in settings",m.percent),f.set.percent(m.percent))}},increment:function(e){var t,n,i;f.has.total()?(n=f.get.value(),e=e||1,i=n+e):(n=f.get.percent(),e=e||f.get.randomValue(),i=n+e,t=100,f.debug("Incrementing percentage by",n,i)),i=f.get.normalizedValue(i),f.set.progress(i)},decrement:function(e){var t,n,i=f.get.total();i?(t=f.get.value(),e=e||1,n=t-e,f.debug("Decrementing value by",e,t)):(t=f.get.percent(),e=e||f.get.randomValue(),n=t-e,f.debug("Decrementing percentage by",e,t)),n=f.get.normalizedValue(n),f.set.progress(n)},has:{progressPoll:function(){return f.progressPoll},total:function(){return f.get.total()!==!1}},get:{text:function(e){var t=f.value||0,n=f.total||0,i=R?f.get.displayPercent():f.percent||0,o=f.total>0?n-t:100-i;return e=e||"",e=e.replace("{value}",t).replace("{total}",n).replace("{left}",o).replace("{percent}",i),f.verbose("Adding variables to progress bar text",e),e},normalizedValue:function(e){if(0>e)return f.debug("Value cannot decrement below 0"),0;if(f.has.total()){if(e>f.total)return f.debug("Value cannot increment above total",f.total),f.total}else if(e>100)return f.debug("Value cannot increment above 100 percent"),100;return e},updateInterval:function(){return"auto"==m.updateInterval?m.duration:m.updateInterval},randomValue:function(){return f.debug("Generating random increment percentage"),Math.floor(Math.random()*m.random.max+m.random.min)},numericValue:function(e){return"string"==typeof e?""!==e.replace(/[^\d.]/g,"")?+e.replace(/[^\d.]/g,""):!1:e},transitionEnd:function(){var e,t=n.createElement("element"),o={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(e in o)if(t.style[e]!==i)return o[e]},displayPercent:function(){var e=w.width(),t=C.width(),n=parseInt(w.css("min-width"),10),i=e>n?e/t*100:f.percent;return m.precision>0?Math.round(i*(10*m.precision))/(10*m.precision):Math.round(i)},percent:function(){return f.percent||0},value:function(){return f.nextValue||f.value||0},total:function(){return f.total||!1}},create:{progressPoll:function(){f.progressPoll=setTimeout(function(){f.update.toNextValue(),f.remove.progressPoll()},f.get.updateInterval())}},is:{complete:function(){return f.is.success()||f.is.warning()||f.is.error()},success:function(){return C.hasClass(g.success)},warning:function(){return C.hasClass(g.warning)},error:function(){return C.hasClass(g.error)},active:function(){return C.hasClass(g.active)},visible:function(){return C.is(":visible")}},remove:{progressPoll:function(){f.verbose("Removing progress poll timer"),f.progressPoll&&(clearTimeout(f.progressPoll),delete f.progressPoll)},nextValue:function(){f.verbose("Removing progress value stored for next update"),delete f.nextValue},state:function(){f.verbose("Removing stored state"),delete f.total,delete f.percent,delete f.value},active:function(){f.verbose("Removing active state"),C.removeClass(g.active)},success:function(){f.verbose("Removing success state"),C.removeClass(g.success)},warning:function(){f.verbose("Removing warning state"),C.removeClass(g.warning)},error:function(){f.verbose("Removing error state"),C.removeClass(g.error)}},set:{barWidth:function(e){e>100?f.error(b.tooHigh,e):0>e?f.error(b.tooLow,e):(w.css("width",e+"%"),C.attr("data-percent",parseInt(e,10)))},duration:function(e){e=e||m.duration,e="number"==typeof e?e+"ms":e,f.verbose("Setting progress bar transition duration",e),w.css({"transition-duration":e})},percent:function(e){e="string"==typeof e?+e.replace("%",""):e,e=m.precision>0?Math.round(e*(10*m.precision))/(10*m.precision):Math.round(e),f.percent=e,f.has.total()||(f.value=m.precision>0?Math.round(e/100*f.total*(10*m.precision))/(10*m.precision):Math.round(e/100*f.total*10)/10,m.limitValues&&(f.value=f.value>100?100:f.value<0?0:f.value)),f.set.barWidth(e),f.set.labelInterval(),f.set.labels(),m.onChange.call(T,e,f.value,f.total)},labelInterval:function(){var t=function(){f.verbose("Bar finished animating, removing continuous label updates"),clearInterval(f.interval),R=!1,f.set.labels()};clearInterval(f.interval),w.one(a+y,t),R=!0,f.interval=setInterval(function(){var t=e.contains(n.documentElement,T);t||(clearInterval(f.interval),R=!1),f.set.labels()},m.framerate)},labels:function(){f.verbose("Setting both bar progress and outer label text"),f.set.barLabel(),f.set.state()},label:function(e){e=e||"",e&&(e=f.get.text(e),f.verbose("Setting label to text",e),S.text(e))},state:function(e){e=e!==i?e:f.percent,100===e?m.autoSuccess&&!(f.is.warning()||f.is.error()||f.is.success())?(f.set.success(),f.debug("Automatically triggering success at 100%")):(f.verbose("Reached 100% removing active state"),f.remove.active(),f.remove.progressPoll()):e>0?(f.verbose("Adjusting active progress bar label",e),f.set.active()):(f.remove.active(),f.set.label(m.text.active))},barLabel:function(e){e!==i?k.text(f.get.text(e)):"ratio"==m.label&&f.total?(f.verbose("Adding ratio to bar label"),k.text(f.get.text(m.text.ratio))):"percent"==m.label&&(f.verbose("Adding percentage to bar label"),k.text(f.get.text(m.text.percent)))},active:function(e){e=e||m.text.active,f.debug("Setting active state"),m.showActivity&&!f.is.active()&&C.addClass(g.active),f.remove.warning(),f.remove.error(),f.remove.success(),e=m.onLabelUpdate("active",e,f.value,f.total),e&&f.set.label(e),w.one(a+y,function(){m.onActive.call(T,f.value,f.total)})},success:function(e){e=e||m.text.success||m.text.active,f.debug("Setting success state"),C.addClass(g.success),f.remove.active(),f.remove.warning(),f.remove.error(),f.complete(),m.text.success?(e=m.onLabelUpdate("success",e,f.value,f.total),f.set.label(e)):(e=m.onLabelUpdate("active",e,f.value,f.total),f.set.label(e)),w.one(a+y,function(){m.onSuccess.call(T,f.total)})},warning:function(e){e=e||m.text.warning,f.debug("Setting warning state"),C.addClass(g.warning),f.remove.active(),f.remove.success(),f.remove.error(),f.complete(),e=m.onLabelUpdate("warning",e,f.value,f.total),e&&f.set.label(e),w.one(a+y,function(){m.onWarning.call(T,f.value,f.total)})},error:function(e){e=e||m.text.error,f.debug("Setting error state"),C.addClass(g.error),f.remove.active(),f.remove.success(),f.remove.warning(),f.complete(),e=m.onLabelUpdate("error",e,f.value,f.total),e&&f.set.label(e),w.one(a+y,function(){m.onError.call(T,f.value,f.total)})},transitionEvent:function(){a=f.get.transitionEnd()},total:function(e){f.total=e},value:function(e){f.value=e},progress:function(e){f.has.progressPoll()?(f.debug("Updated within interval, setting next update to use new value",e),f.set.nextValue(e)):(f.debug("First update in progress update interval, immediately updating",e),f.update.progress(e),f.create.progressPoll())},nextValue:function(e){f.nextValue=e}},update:{toNextValue:function(){var e=f.nextValue;e&&(f.debug("Update interval complete using last updated value",e),f.update.progress(e),f.remove.nextValue())},progress:function(e){var t;e=f.get.numericValue(e),e===!1&&f.error(b.nonNumeric,e),e=f.get.normalizedValue(e),f.has.total()?(f.set.value(e),t=e/f.total*100,f.debug("Calculating percent complete from total",t),f.set.percent(t)):(t=e,f.debug("Setting value to exact percentage value",t),f.set.percent(t))}},setting:function(t,n){if(f.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,m,t);else{if(n===i)return m[t];e.isPlainObject(m[t])?e.extend(!0,m[t],n):m[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,f,t);else{if(n===i)return f[t];f[t]=n}},debug:function(){!m.silent&&m.debug&&(m.performance?f.performance.log(arguments):(f.debug=Function.prototype.bind.call(console.info,console,m.name+":"),f.debug.apply(console,arguments)))},verbose:function(){!m.silent&&m.verbose&&m.debug&&(m.performance?f.performance.log(arguments):(f.verbose=Function.prototype.bind.call(console.info,console,m.name+":"),f.verbose.apply(console,arguments)))},error:function(){m.silent||(f.error=Function.prototype.bind.call(console.error,console,m.name+":"),f.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;m.performance&&(t=(new Date).getTime(),i=s||t,n=t-i,s=t,l.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:T,"Execution Time":n})),clearTimeout(f.performance.timer),f.performance.timer=setTimeout(f.performance.display,500)},display:function(){var t=m.name+":",n=0;s=!1,clearTimeout(f.performance.timer),e.each(l,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",r&&(t+=" '"+r+"'"),(console.group!==i||console.table!==i)&&l.length>0&&(console.groupCollapsed(t),console.table?console.table(l):e.each(l,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),l=[]}},invoke:function(t,n,a){var r,s,l,c=A;return n=n||d,a=T||a,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):(f.error(b.method,t),!1);c=c[o]}})),e.isFunction(s)?l=s.apply(a,n):s!==i&&(l=s),e.isArray(o)?o.push(l):o!==i?o=[o,l]:l!==i&&(o=l),s}},u?(A===i&&f.initialize(),f.invoke(c)):(A!==i&&A.invoke("destroy"),f.initialize())}),o!==i?o:this},e.fn.progress.settings={name:"Progress",namespace:"progress",silent:!1,debug:!1,verbose:!1,performance:!0,random:{min:2,max:5},duration:300,updateInterval:"auto",autoSuccess:!0,showActivity:!0,limitValues:!0,label:"percent",precision:0,framerate:1e3/30,percent:!1,total:!1,value:!1,onLabelUpdate:function(e,t,n,i){return t},onChange:function(e,t,n){},onSuccess:function(e){},onActive:function(e,t){},onError:function(e,t){},onWarning:function(e,t){},error:{method:"The method you called is not defined.",nonNumeric:"Progress value is non numeric",tooHigh:"Value specified is above 100%",tooLow:"Value specified is below 0%"},regExp:{variable:/\{\$*[A-z0-9]+\}/g},metadata:{percent:"percent",total:"total",value:"value"},selector:{bar:"> .bar",label:"> .label",progress:".bar > .progress"},text:{active:!1,error:!1,success:!1,warning:!1,percent:"{percent}%",ratio:"{value} of {total}"},className:{active:"active",error:"error",success:"success",warning:"warning"}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.rating=function(t){var n,o=e(this),a=o.selector||"",r=(new Date).getTime(),s=[],l=arguments[0],c="string"==typeof l,u=[].slice.call(arguments,1);return o.each(function(){var d,f,m=e.isPlainObject(t)?e.extend(!0,{},e.fn.rating.settings,t):e.extend({},e.fn.rating.settings),g=m.namespace,p=m.className,h=m.metadata,v=m.selector,b=(m.error,"."+g),y="module-"+g,x=this,C=e(this).data(y),w=e(this),k=w.find(v.icon);f={initialize:function(){f.verbose("Initializing rating module",m),0===k.length&&f.setup.layout(),m.interactive?f.enable():f.disable(),f.set.initialLoad(),f.set.rating(f.get.initialRating()),f.remove.initialLoad(),f.instantiate()},instantiate:function(){f.verbose("Instantiating module",m),C=f,w.data(y,f)},destroy:function(){f.verbose("Destroying previous instance",C),f.remove.events(),w.removeData(y)},refresh:function(){k=w.find(v.icon)},setup:{layout:function(){var t=f.get.maxRating(),n=e.fn.rating.settings.templates.icon(t);f.debug("Generating icon html dynamically"),w.html(n),f.refresh()}},event:{mouseenter:function(){var t=e(this);t.nextAll().removeClass(p.selected),w.addClass(p.selected),t.addClass(p.selected).prevAll().addClass(p.selected)},mouseleave:function(){w.removeClass(p.selected),k.removeClass(p.selected)},click:function(){var t=e(this),n=f.get.rating(),i=k.index(t)+1,o="auto"==m.clearable?1===k.length:m.clearable;o&&n==i?f.clearRating():f.set.rating(i)}},clearRating:function(){f.debug("Clearing current rating"),f.set.rating(0)},bind:{events:function(){f.verbose("Binding events"),w.on("mouseenter"+b,v.icon,f.event.mouseenter).on("mouseleave"+b,v.icon,f.event.mouseleave).on("click"+b,v.icon,f.event.click)}},remove:{events:function(){f.verbose("Removing events"),w.off(b)},initialLoad:function(){d=!1}},enable:function(){f.debug("Setting rating to interactive mode"),f.bind.events(),w.removeClass(p.disabled)},disable:function(){f.debug("Setting rating to read-only mode"),f.remove.events(),w.addClass(p.disabled)},is:{initialLoad:function(){return d}},get:{initialRating:function(){return w.data(h.rating)!==i?(w.removeData(h.rating),w.data(h.rating)):m.initialRating},maxRating:function(){return w.data(h.maxRating)!==i?(w.removeData(h.maxRating),w.data(h.maxRating)):m.maxRating},rating:function(){var e=k.filter("."+p.active).length;return f.verbose("Current rating retrieved",e),e}},set:{rating:function(e){var t=e-1>=0?e-1:0,n=k.eq(t);w.removeClass(p.selected),k.removeClass(p.selected).removeClass(p.active),e>0&&(f.verbose("Setting current rating to",e),n.prevAll().addBack().addClass(p.active)),f.is.initialLoad()||m.onRate.call(x,e)},initialLoad:function(){d=!0}},setting:function(t,n){if(f.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,m,t);else{if(n===i)return m[t];e.isPlainObject(m[t])?e.extend(!0,m[t],n):m[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,f,t);else{if(n===i)return f[t];f[t]=n}},debug:function(){!m.silent&&m.debug&&(m.performance?f.performance.log(arguments):(f.debug=Function.prototype.bind.call(console.info,console,m.name+":"),f.debug.apply(console,arguments)))},verbose:function(){!m.silent&&m.verbose&&m.debug&&(m.performance?f.performance.log(arguments):(f.verbose=Function.prototype.bind.call(console.info,console,m.name+":"),f.verbose.apply(console,arguments)))},error:function(){m.silent||(f.error=Function.prototype.bind.call(console.error,console,m.name+":"),f.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;m.performance&&(t=(new Date).getTime(),i=r||t,n=t-i,r=t,s.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:x,"Execution Time":n})),clearTimeout(f.performance.timer),f.performance.timer=setTimeout(f.performance.display,500)},display:function(){var t=m.name+":",n=0;r=!1,clearTimeout(f.performance.timer),e.each(s,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",a&&(t+=" '"+a+"'"),o.length>1&&(t+=" ("+o.length+")"),(console.group!==i||console.table!==i)&&s.length>0&&(console.groupCollapsed(t),console.table?console.table(s):e.each(s,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),s=[]}},invoke:function(t,o,a){var r,s,l,c=C;return o=o||u,a=x||a,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):!1;c=c[o]}})),e.isFunction(s)?l=s.apply(a,o):s!==i&&(l=s),e.isArray(n)?n.push(l):n!==i?n=[n,l]:l!==i&&(n=l),s}},c?(C===i&&f.initialize(),f.invoke(l)):(C!==i&&C.invoke("destroy"),f.initialize())}),n!==i?n:this},e.fn.rating.settings={name:"Rating",namespace:"rating",slent:!1,debug:!1,verbose:!1,performance:!0,initialRating:0,interactive:!0,maxRating:4,clearable:"auto",fireOnInit:!1,onRate:function(e){},error:{method:"The method you called is not defined",noMaximum:"No maximum rating specified. Cannot generate HTML automatically"},metadata:{rating:"rating",maxRating:"maxRating"},className:{active:"active",disabled:"disabled",selected:"selected",loading:"loading"},selector:{icon:".icon"},templates:{icon:function(e){for(var t=1,n="";e>=t;)n+='',t++;return n}}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.search=function(o){var a,r=e(this),s=r.selector||"",l=(new Date).getTime(),c=[],u=arguments[0],d="string"==typeof u,f=[].slice.call(arguments,1);return e(this).each(function(){var m,g=e.isPlainObject(o)?e.extend(!0,{},e.fn.search.settings,o):e.extend({},e.fn.search.settings),p=g.className,h=g.metadata,v=g.regExp,b=g.fields,y=g.selector,x=g.error,C=g.namespace,w="."+C,k=C+"-module",S=e(this),T=S.find(y.prompt),A=S.find(y.searchButton),R=S.find(y.results),P=S.find(y.result),E=S.find(y.category),F=this,O=S.data(k),D=!1;m={initialize:function(){ -m.verbose("Initializing module"),m.determine.searchFields(),m.bind.events(),m.set.type(),m.create.results(),m.instantiate()},instantiate:function(){m.verbose("Storing instance of module",m),O=m,S.data(k,m)},destroy:function(){m.verbose("Destroying instance"),S.off(w).removeData(k)},refresh:function(){m.debug("Refreshing selector cache"),T=S.find(y.prompt),A=S.find(y.searchButton),E=S.find(y.category),R=S.find(y.results),P=S.find(y.result)},refreshResults:function(){R=S.find(y.results),P=S.find(y.result)},bind:{events:function(){m.verbose("Binding events to search"),g.automatic&&(S.on(m.get.inputEvent()+w,y.prompt,m.event.input),T.attr("autocomplete","off")),S.on("focus"+w,y.prompt,m.event.focus).on("blur"+w,y.prompt,m.event.blur).on("keydown"+w,y.prompt,m.handleKeyboard).on("click"+w,y.searchButton,m.query).on("mousedown"+w,y.results,m.event.result.mousedown).on("mouseup"+w,y.results,m.event.result.mouseup).on("click"+w,y.result,m.event.result.click)}},determine:{searchFields:function(){o&&o.searchFields!==i&&(g.searchFields=o.searchFields)}},event:{input:function(){clearTimeout(m.timer),m.timer=setTimeout(m.query,g.searchDelay)},focus:function(){m.set.focus(),m.has.minimumCharacters()&&(m.query(),m.can.show()&&m.showResults())},blur:function(e){var t=n.activeElement===this,i=function(){m.cancel.query(),m.remove.focus(),m.timer=setTimeout(m.hideResults,g.hideDelay)};t||(m.resultsClicked?(m.debug("Determining if user action caused search to close"),S.one("click.close"+w,y.results,function(e){return m.is.inMessage(e)||D?void T.focus():(D=!1,void(m.is.animating()||m.is.hidden()||i()))})):(m.debug("Input blurred without user action, closing results"),i()))},result:{mousedown:function(){m.resultsClicked=!0},mouseup:function(){m.resultsClicked=!1},click:function(n){m.debug("Search result selected");var i=e(this),o=i.find(y.title).eq(0),a=i.is("a[href]")?i:i.find("a[href]").eq(0),r=a.attr("href")||!1,s=a.attr("target")||!1,l=(o.html(),o.length>0?o.text():!1),c=m.get.results(),u=i.data(h.result)||m.get.result(l,c);return e.isFunction(g.onSelect)&&g.onSelect.call(F,u,c)===!1?(m.debug("Custom onSelect callback cancelled default select action"),void(D=!0)):(m.hideResults(),l&&m.set.value(l),void(r&&(m.verbose("Opening search link found in result",a),"_blank"==s||n.ctrlKey?t.open(r):t.location.href=r)))}}},handleKeyboard:function(e){var t,n=S.find(y.result),i=S.find(y.category),o=n.index(n.filter("."+p.active)),a=n.length,r=e.which,s={backspace:8,enter:13,escape:27,upArrow:38,downArrow:40};if(r==s.escape&&(m.verbose("Escape key pressed, blurring search field"),m.trigger.blur()),m.is.visible())if(r==s.enter){if(m.verbose("Enter key pressed, selecting active result"),n.filter("."+p.active).length>0)return m.event.result.click.call(n.filter("."+p.active),e),e.preventDefault(),!1}else r==s.upArrow?(m.verbose("Up key pressed, changing active result"),t=0>o-1?o:o-1,i.removeClass(p.active),n.removeClass(p.active).eq(t).addClass(p.active).closest(i).addClass(p.active),e.preventDefault()):r==s.downArrow&&(m.verbose("Down key pressed, changing active result"),t=o+1>=a?o:o+1,i.removeClass(p.active),n.removeClass(p.active).eq(t).addClass(p.active).closest(i).addClass(p.active),e.preventDefault());else r==s.enter&&(m.verbose("Enter key pressed, executing query"),m.query(),m.set.buttonPressed(),T.one("keyup",m.remove.buttonFocus))},setup:{api:function(t){var n={debug:g.debug,on:!1,cache:!0,action:"search",urlData:{query:t},onSuccess:function(e){m.parse.response.call(F,e,t)},onAbort:function(e){},onFailure:function(){m.displayMessage(x.serverError)},onError:m.error};e.extend(!0,n,g.apiSettings),m.verbose("Setting up API request",n),S.api(n)}},can:{useAPI:function(){return e.fn.api!==i},show:function(){return m.is.focused()&&!m.is.visible()&&!m.is.empty()},transition:function(){return g.transition&&e.fn.transition!==i&&S.transition("is supported")}},is:{animating:function(){return R.hasClass(p.animating)},hidden:function(){return R.hasClass(p.hidden)},inMessage:function(t){return t.target&&e(t.target).closest(y.message).length>0},empty:function(){return""===R.html()},visible:function(){return R.filter(":visible").length>0},focused:function(){return T.filter(":focus").length>0}},trigger:{blur:function(){var e=n.createEvent("HTMLEvents"),t=T[0];t&&(m.verbose("Triggering native blur event"),e.initEvent("blur",!1,!1),t.dispatchEvent(e))}},get:{inputEvent:function(){var e=T[0],t=e!==i&&e.oninput!==i?"input":e!==i&&e.onpropertychange!==i?"propertychange":"keyup";return t},value:function(){return T.val()},results:function(){var e=S.data(h.results);return e},result:function(t,n){var o=["title","id"],a=!1;return t=t!==i?t:m.get.value(),n=n!==i?n:m.get.results(),"category"===g.type?(m.debug("Finding result that matches",t),e.each(n,function(n,i){return e.isArray(i.results)&&(a=m.search.object(t,i.results,o)[0])?!1:void 0})):(m.debug("Finding result in results object",t),a=m.search.object(t,n,o)[0]),a||!1}},select:{firstResult:function(){m.verbose("Selecting first result"),P.first().addClass(p.active)}},set:{focus:function(){S.addClass(p.focus)},loading:function(){S.addClass(p.loading)},value:function(e){m.verbose("Setting search input value",e),T.val(e)},type:function(e){e=e||g.type,"category"==g.type&&S.addClass(g.type)},buttonPressed:function(){A.addClass(p.pressed)}},remove:{loading:function(){S.removeClass(p.loading)},focus:function(){S.removeClass(p.focus)},buttonPressed:function(){A.removeClass(p.pressed)}},query:function(){var t=m.get.value(),n=m.read.cache(t);m.has.minimumCharacters()?(n?(m.debug("Reading result from cache",t),m.save.results(n.results),m.addResults(n.html),m.inject.id(n.results)):(m.debug("Querying for",t),e.isPlainObject(g.source)||e.isArray(g.source)?m.search.local(t):m.can.useAPI()?m.search.remote(t):m.error(x.source)),g.onSearchQuery.call(F,t)):m.hideResults()},search:{local:function(e){var t,n=m.search.object(e,g.content);m.set.loading(),m.save.results(n),m.debug("Returned local search results",n),t=m.generateResults({results:n}),m.remove.loading(),m.addResults(t),m.inject.id(n),m.write.cache(e,{html:t,results:n})},remote:function(e){S.api("is loading")&&S.api("abort"),m.setup.api(e),S.api("query")},object:function(t,n,o){var a=[],r=[],s=t.toString().replace(v.escape,"\\$&"),l=new RegExp(v.beginsWith+s,"i"),c=function(t,n){var i=-1==e.inArray(n,a),o=-1==e.inArray(n,r);i&&o&&t.push(n)};return n=n||g.source,o=o!==i?o:g.searchFields,e.isArray(o)||(o=[o]),n===i||n===!1?(m.error(x.source),[]):(e.each(o,function(i,o){e.each(n,function(e,n){var i="string"==typeof n[o];i&&(-1!==n[o].search(l)?c(a,n):g.searchFullText&&m.fuzzySearch(t,n[o])&&c(r,n))})}),e.merge(a,r))}},fuzzySearch:function(e,t){var n=t.length,i=e.length;if("string"!=typeof e)return!1;if(e=e.toLowerCase(),t=t.toLowerCase(),i>n)return!1;if(i===n)return e===t;e:for(var o=0,a=0;i>o;o++){for(var r=e.charCodeAt(o);n>a;)if(t.charCodeAt(a++)===r)continue e;return!1}return!0},parse:{response:function(e,t){var n=m.generateResults(e);m.verbose("Parsing server response",e),e!==i&&t!==i&&e[b.results]!==i&&(m.addResults(n),m.inject.id(e[b.results]),m.write.cache(t,{html:n,results:e[b.results]}),m.save.results(e[b.results]))}},cancel:{query:function(){m.can.useAPI()&&S.api("abort")}},has:{minimumCharacters:function(){var e=m.get.value(),t=e.length;return t>=g.minCharacters}},clear:{cache:function(e){var t=S.data(h.cache);e?e&&t&&t[e]&&(m.debug("Removing value from cache",e),delete t[e],S.data(h.cache,t)):(m.debug("Clearing cache",e),S.removeData(h.cache))}},read:{cache:function(e){var t=S.data(h.cache);return g.cache?(m.verbose("Checking cache for generated html for query",e),"object"==typeof t&&t[e]!==i?t[e]:!1):!1}},create:{id:function(e,t){var n,o,a=e+1;return t!==i?(n=String.fromCharCode(97+t),o=n+a,m.verbose("Creating category result id",o)):(o=a,m.verbose("Creating result id",o)),o},results:function(){0===R.length&&(R=e("
").addClass(p.results).appendTo(S))}},inject:{result:function(e,t,n){m.verbose("Injecting result into results");var o=n!==i?R.children().eq(n).children(y.result).eq(t):R.children(y.result).eq(t);m.verbose("Injecting results metadata",o),o.data(h.result,e)},id:function(t){m.debug("Injecting unique ids into results");var n=0,o=0;return"category"===g.type?e.each(t,function(t,a){o=0,e.each(a.results,function(e,t){var r=a.results[e];r.id===i&&(r.id=m.create.id(o,n)),m.inject.result(r,o,n),o++}),n++}):e.each(t,function(e,n){var a=t[e];a.id===i&&(a.id=m.create.id(o)),m.inject.result(a,o),o++}),t}},save:{results:function(e){m.verbose("Saving current search results to metadata",e),S.data(h.results,e)}},write:{cache:function(e,t){var n=S.data(h.cache)!==i?S.data(h.cache):{};g.cache&&(m.verbose("Writing generated html to cache",e,t),n[e]=t,S.data(h.cache,n))}},addResults:function(t){return e.isFunction(g.onResultsAdd)&&g.onResultsAdd.call(R,t)===!1?(m.debug("onResultsAdd callback cancelled default action"),!1):void(t?(R.html(t),m.refreshResults(),g.selectFirstResult&&m.select.firstResult(),m.showResults()):m.hideResults())},showResults:function(){m.is.visible()||(m.can.transition()?(m.debug("Showing results with css animations"),R.transition({animation:g.transition+" in",debug:g.debug,verbose:g.verbose,duration:g.duration,queue:!0})):(m.debug("Showing results with javascript"),R.stop().fadeIn(g.duration,g.easing)),g.onResultsOpen.call(R))},hideResults:function(){m.is.visible()&&(m.can.transition()?(m.debug("Hiding results with css animations"),R.transition({animation:g.transition+" out",debug:g.debug,verbose:g.verbose,duration:g.duration,queue:!0})):(m.debug("Hiding results with javascript"),R.stop().fadeOut(g.duration,g.easing)),g.onResultsClose.call(R))},generateResults:function(t){m.debug("Generating html from response",t);var n=g.templates[g.type],i=e.isPlainObject(t[b.results])&&!e.isEmptyObject(t[b.results]),o=e.isArray(t[b.results])&&t[b.results].length>0,a="";return i||o?(g.maxResults>0&&(i?"standard"==g.type&&m.error(x.maxResults):t[b.results]=t[b.results].slice(0,g.maxResults)),e.isFunction(n)?a=n(t,b):m.error(x.noTemplate,!1)):g.showNoResults&&(a=m.displayMessage(x.noResults,"empty")),g.onResults.call(F,t),a},displayMessage:function(e,t){return t=t||"standard",m.debug("Displaying message",e,t),m.addResults(g.templates.message(e,t)),g.templates.message(e,t)},setting:function(t,n){if(e.isPlainObject(t))e.extend(!0,g,t);else{if(n===i)return g[t];g[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,m,t);else{if(n===i)return m[t];m[t]=n}},debug:function(){!g.silent&&g.debug&&(g.performance?m.performance.log(arguments):(m.debug=Function.prototype.bind.call(console.info,console,g.name+":"),m.debug.apply(console,arguments)))},verbose:function(){!g.silent&&g.verbose&&g.debug&&(g.performance?m.performance.log(arguments):(m.verbose=Function.prototype.bind.call(console.info,console,g.name+":"),m.verbose.apply(console,arguments)))},error:function(){g.silent||(m.error=Function.prototype.bind.call(console.error,console,g.name+":"),m.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;g.performance&&(t=(new Date).getTime(),i=l||t,n=t-i,l=t,c.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:F,"Execution Time":n})),clearTimeout(m.performance.timer),m.performance.timer=setTimeout(m.performance.display,500)},display:function(){var t=g.name+":",n=0;l=!1,clearTimeout(m.performance.timer),e.each(c,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",s&&(t+=" '"+s+"'"),r.length>1&&(t+=" ("+r.length+")"),(console.group!==i||console.table!==i)&&c.length>0&&(console.groupCollapsed(t),console.table?console.table(c):e.each(c,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),c=[]}},invoke:function(t,n,o){var r,s,l,c=O;return n=n||f,o=F||o,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):!1;c=c[o]}})),e.isFunction(s)?l=s.apply(o,n):s!==i&&(l=s),e.isArray(a)?a.push(l):a!==i?a=[a,l]:l!==i&&(a=l),s}},d?(O===i&&m.initialize(),m.invoke(u)):(O!==i&&O.invoke("destroy"),m.initialize())}),a!==i?a:this},e.fn.search.settings={name:"Search",namespace:"search",silent:!1,debug:!1,verbose:!1,performance:!0,type:"standard",minCharacters:1,selectFirstResult:!1,apiSettings:!1,source:!1,searchFields:["title","description"],displayField:"",searchFullText:!0,automatic:!0,hideDelay:0,searchDelay:200,maxResults:7,cache:!0,showNoResults:!0,transition:"scale",duration:200,easing:"easeOutExpo",onSelect:!1,onResultsAdd:!1,onSearchQuery:function(e){},onResults:function(e){},onResultsOpen:function(){},onResultsClose:function(){},className:{animating:"animating",active:"active",empty:"empty",focus:"focus",hidden:"hidden",loading:"loading",results:"results",pressed:"down"},error:{source:"Cannot search. No source used, and Semantic API module was not included",noResults:"Your search returned no results",logging:"Error in debug logging, exiting.",noEndpoint:"No search endpoint was specified",noTemplate:"A valid template name was not specified.",serverError:"There was an issue querying the server.",maxResults:"Results must be an array to use maxResults setting",method:"The method you called is not defined."},metadata:{cache:"cache",results:"results",result:"result"},regExp:{escape:/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,beginsWith:"(?:s|^)"},fields:{categories:"results",categoryName:"name",categoryResults:"results",description:"description",image:"image",price:"price",results:"results",title:"title",url:"url",action:"action",actionText:"text",actionURL:"url"},selector:{prompt:".prompt",searchButton:".search.button",results:".results",message:".results > .message",category:".category",result:".result",title:".title, .name"},templates:{escape:function(e){var t=/[&<>"'`]/g,n=/[&<>"'`]/,i={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},o=function(e){return i[e]};return n.test(e)?e.replace(t,o):e},message:function(e,t){var n="";return e!==i&&t!==i&&(n+='
',n+="empty"==t?'
No Results
'+e+'
':'
'+e+"
",n+="
"),n},category:function(t,n){var o="";e.fn.search.settings.templates.escape;return t[n.categoryResults]!==i?(e.each(t[n.categoryResults],function(t,a){a[n.results]!==i&&a.results.length>0&&(o+='")}),t[n.action]&&(o+=''+t[n.action][n.actionText]+""),o):!1},standard:function(t,n){var o="";return t[n.results]!==i?(e.each(t[n.results],function(e,t){o+=t[n.url]?'':'',t[n.image]!==i&&(o+='
'),o+='
',t[n.price]!==i&&(o+='
'+t[n.price]+"
"),t[n.title]!==i&&(o+='
'+t[n.title]+"
"),t[n.description]!==i&&(o+='
'+t[n.description]+"
"),o+="
",o+="
"}),t[n.action]&&(o+=''+t[n.action][n.actionText]+""),o):!1}}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.shape=function(o){var a,r=e(this),s=(e("body"),(new Date).getTime()),l=[],c=arguments[0],u="string"==typeof c,d=[].slice.call(arguments,1),f=t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame||function(e){setTimeout(e,0)};return r.each(function(){var t,m,g,p=r.selector||"",h=e.isPlainObject(o)?e.extend(!0,{},e.fn.shape.settings,o):e.extend({},e.fn.shape.settings),v=h.namespace,b=h.selector,y=h.error,x=h.className,C="."+v,w="module-"+v,k=e(this),S=k.find(b.sides),T=k.find(b.side),A=!1,R=this,P=k.data(w);g={initialize:function(){g.verbose("Initializing module for",R),g.set.defaultSide(),g.instantiate()},instantiate:function(){g.verbose("Storing instance of module",g),P=g,k.data(w,P)},destroy:function(){g.verbose("Destroying previous module for",R),k.removeData(w).off(C)},refresh:function(){g.verbose("Refreshing selector cache for",R),k=e(R),S=e(this).find(b.shape),T=e(this).find(b.side)},repaint:function(){g.verbose("Forcing repaint event");var e=S[0]||n.createElement("div");e.offsetWidth},animate:function(e,n){g.verbose("Animating box with properties",e),n=n||function(e){g.verbose("Executing animation callback"),e!==i&&e.stopPropagation(),g.reset(),g.set.active()},h.beforeChange.call(m[0]),g.get.transitionEvent()?(g.verbose("Starting CSS animation"),k.addClass(x.animating),S.css(e).one(g.get.transitionEvent(),n),g.set.duration(h.duration),f(function(){k.addClass(x.animating),t.addClass(x.hidden)})):n()},queue:function(e){g.debug("Queueing animation of",e),S.one(g.get.transitionEvent(),function(){g.debug("Executing queued animation"),setTimeout(function(){k.shape(e)},0)})},reset:function(){g.verbose("Animating states reset"),k.removeClass(x.animating).attr("style","").removeAttr("style"),S.attr("style","").removeAttr("style"),T.attr("style","").removeAttr("style").removeClass(x.hidden),m.removeClass(x.animating).attr("style","").removeAttr("style")},is:{complete:function(){return T.filter("."+x.active)[0]==m[0]},animating:function(){return k.hasClass(x.animating)}},set:{defaultSide:function(){t=k.find("."+h.className.active),m=t.next(b.side).length>0?t.next(b.side):k.find(b.side).first(),A=!1,g.verbose("Active side set to",t),g.verbose("Next side set to",m)},duration:function(e){e=e||h.duration,e="number"==typeof e?e+"ms":e,g.verbose("Setting animation duration",e),(h.duration||0===h.duration)&&S.add(T).css({"-webkit-transition-duration":e,"-moz-transition-duration":e,"-ms-transition-duration":e,"-o-transition-duration":e,"transition-duration":e})},currentStageSize:function(){var e=k.find("."+h.className.active),t=e.outerWidth(!0),n=e.outerHeight(!0);k.css({width:t,height:n})},stageSize:function(){var e=k.clone().addClass(x.loading),t=e.find("."+h.className.active),n="next"==h.width?o.outerWidth(!0):"initial"==h.width?k.width():h.width,i="next"==h.height?o.outerHeight(!0):"initial"==h.height?k.height():h.height,o=A?e.find(b.side).eq(A):t.next(b.side).length>0?t.next(b.side):e.find(b.side).first();t.removeClass(x.active),o.addClass(x.active),e.insertAfter(k),e.remove(),"auto"!=h.width&&(k.css("width",n+h.jitter),g.verbose("Specifying width during animation",n)),"auto"!=h.height&&(k.css("height",i+h.jitter),g.verbose("Specifying height during animation",i))},nextSide:function(e){A=e,m=T.filter(e),A=T.index(m),0===m.length&&(g.set.defaultSide(),g.error(y.side)),g.verbose("Next side manually set to",m)},active:function(){g.verbose("Setting new side to active",m),T.removeClass(x.active),m.addClass(x.active),h.onChange.call(m[0]),g.set.defaultSide()}},flip:{up:function(){return!g.is.complete()||g.is.animating()||h.allowRepeats?void(g.is.animating()?g.queue("flip up"):(g.debug("Flipping up",m),g.set.stageSize(),g.stage.above(),g.animate(g.get.transform.up()))):void g.debug("Side already visible",m)},down:function(){return!g.is.complete()||g.is.animating()||h.allowRepeats?void(g.is.animating()?g.queue("flip down"):(g.debug("Flipping down",m),g.set.stageSize(),g.stage.below(),g.animate(g.get.transform.down()))):void g.debug("Side already visible",m)},left:function(){return!g.is.complete()||g.is.animating()||h.allowRepeats?void(g.is.animating()?g.queue("flip left"):(g.debug("Flipping left",m),g.set.stageSize(),g.stage.left(),g.animate(g.get.transform.left()))):void g.debug("Side already visible",m)},right:function(){return!g.is.complete()||g.is.animating()||h.allowRepeats?void(g.is.animating()?g.queue("flip right"):(g.debug("Flipping right",m),g.set.stageSize(),g.stage.right(),g.animate(g.get.transform.right()))):void g.debug("Side already visible",m)},over:function(){return!g.is.complete()||g.is.animating()||h.allowRepeats?void(g.is.animating()?g.queue("flip over"):(g.debug("Flipping over",m),g.set.stageSize(),g.stage.behind(),g.animate(g.get.transform.over()))):void g.debug("Side already visible",m)},back:function(){return!g.is.complete()||g.is.animating()||h.allowRepeats?void(g.is.animating()?g.queue("flip back"):(g.debug("Flipping back",m),g.set.stageSize(),g.stage.behind(),g.animate(g.get.transform.back()))):void g.debug("Side already visible",m)}},get:{transform:{up:function(){var e={y:-((t.outerHeight(!0)-m.outerHeight(!0))/2),z:-(t.outerHeight(!0)/2)};return{transform:"translateY("+e.y+"px) translateZ("+e.z+"px) rotateX(-90deg)"}},down:function(){var e={y:-((t.outerHeight(!0)-m.outerHeight(!0))/2),z:-(t.outerHeight(!0)/2)};return{transform:"translateY("+e.y+"px) translateZ("+e.z+"px) rotateX(90deg)"}},left:function(){var e={x:-((t.outerWidth(!0)-m.outerWidth(!0))/2),z:-(t.outerWidth(!0)/2)};return{transform:"translateX("+e.x+"px) translateZ("+e.z+"px) rotateY(90deg)"}},right:function(){var e={x:-((t.outerWidth(!0)-m.outerWidth(!0))/2),z:-(t.outerWidth(!0)/2)};return{transform:"translateX("+e.x+"px) translateZ("+e.z+"px) rotateY(-90deg)"}},over:function(){var e={x:-((t.outerWidth(!0)-m.outerWidth(!0))/2)};return{transform:"translateX("+e.x+"px) rotateY(180deg)"}},back:function(){var e={x:-((t.outerWidth(!0)-m.outerWidth(!0))/2)};return{transform:"translateX("+e.x+"px) rotateY(-180deg)"}}},transitionEvent:function(){var e,t=n.createElement("element"),o={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(e in o)if(t.style[e]!==i)return o[e]},nextSide:function(){return t.next(b.side).length>0?t.next(b.side):k.find(b.side).first()}},stage:{above:function(){var e={origin:(t.outerHeight(!0)-m.outerHeight(!0))/2,depth:{active:m.outerHeight(!0)/2,next:t.outerHeight(!0)/2}};g.verbose("Setting the initial animation position as above",m,e),S.css({transform:"translateZ(-"+e.depth.active+"px)"}),t.css({transform:"rotateY(0deg) translateZ("+e.depth.active+"px)"}),m.addClass(x.animating).css({top:e.origin+"px",transform:"rotateX(90deg) translateZ("+e.depth.next+"px)"})},below:function(){var e={origin:(t.outerHeight(!0)-m.outerHeight(!0))/2,depth:{active:m.outerHeight(!0)/2,next:t.outerHeight(!0)/2}};g.verbose("Setting the initial animation position as below",m,e),S.css({transform:"translateZ(-"+e.depth.active+"px)"}),t.css({transform:"rotateY(0deg) translateZ("+e.depth.active+"px)"}),m.addClass(x.animating).css({top:e.origin+"px",transform:"rotateX(-90deg) translateZ("+e.depth.next+"px)"})},left:function(){var e={active:t.outerWidth(!0),next:m.outerWidth(!0)},n={origin:(e.active-e.next)/2,depth:{active:e.next/2,next:e.active/2}};g.verbose("Setting the initial animation position as left",m,n),S.css({transform:"translateZ(-"+n.depth.active+"px)"}),t.css({transform:"rotateY(0deg) translateZ("+n.depth.active+"px)"}),m.addClass(x.animating).css({left:n.origin+"px",transform:"rotateY(-90deg) translateZ("+n.depth.next+"px)"})},right:function(){var e={active:t.outerWidth(!0),next:m.outerWidth(!0)},n={origin:(e.active-e.next)/2,depth:{active:e.next/2,next:e.active/2}};g.verbose("Setting the initial animation position as left",m,n),S.css({transform:"translateZ(-"+n.depth.active+"px)"}),t.css({transform:"rotateY(0deg) translateZ("+n.depth.active+"px)"}),m.addClass(x.animating).css({left:n.origin+"px",transform:"rotateY(90deg) translateZ("+n.depth.next+"px)"})},behind:function(){var e={active:t.outerWidth(!0),next:m.outerWidth(!0)},n={origin:(e.active-e.next)/2,depth:{active:e.next/2,next:e.active/2}};g.verbose("Setting the initial animation position as behind",m,n),t.css({transform:"rotateY(0deg)"}),m.addClass(x.animating).css({left:n.origin+"px",transform:"rotateY(-180deg)"})}},setting:function(t,n){if(g.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,h,t);else{if(n===i)return h[t];e.isPlainObject(h[t])?e.extend(!0,h[t],n):h[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,g,t);else{if(n===i)return g[t];g[t]=n}},debug:function(){!h.silent&&h.debug&&(h.performance?g.performance.log(arguments):(g.debug=Function.prototype.bind.call(console.info,console,h.name+":"),g.debug.apply(console,arguments)))},verbose:function(){!h.silent&&h.verbose&&h.debug&&(h.performance?g.performance.log(arguments):(g.verbose=Function.prototype.bind.call(console.info,console,h.name+":"),g.verbose.apply(console,arguments)))},error:function(){h.silent||(g.error=Function.prototype.bind.call(console.error,console,h.name+":"),g.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;h.performance&&(t=(new Date).getTime(),i=s||t,n=t-i,s=t,l.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:R,"Execution Time":n})),clearTimeout(g.performance.timer),g.performance.timer=setTimeout(g.performance.display,500)},display:function(){var t=h.name+":",n=0;s=!1,clearTimeout(g.performance.timer),e.each(l,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",p&&(t+=" '"+p+"'"),r.length>1&&(t+=" ("+r.length+")"),(console.group!==i||console.table!==i)&&l.length>0&&(console.groupCollapsed(t),console.table?console.table(l):e.each(l,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),l=[]}},invoke:function(t,n,o){var r,s,l,c=P;return n=n||d,o=R||o,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):!1;c=c[o]}})),e.isFunction(s)?l=s.apply(o,n):s!==i&&(l=s),e.isArray(a)?a.push(l):a!==i?a=[a,l]:l!==i&&(a=l),s}},u?(P===i&&g.initialize(),g.invoke(c)):(P!==i&&P.invoke("destroy"),g.initialize())}),a!==i?a:this},e.fn.shape.settings={name:"Shape",silent:!1,debug:!1,verbose:!1,jitter:0,performance:!0,namespace:"shape",width:"initial",height:"initial",beforeChange:function(){},onChange:function(){},allowRepeats:!1,duration:!1,error:{side:"You tried to switch to a side that does not exist.",method:"The method you called is not defined"},className:{animating:"animating",hidden:"hidden",loading:"loading",active:"active"},selector:{sides:".sides",side:".side"}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.sidebar=function(o){var a,r=e(this),s=e(t),l=e(n),c=e("html"),u=e("head"),d=r.selector||"",f=(new Date).getTime(),m=[],g=arguments[0],p="string"==typeof g,h=[].slice.call(arguments,1),v=t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame||function(e){setTimeout(e,0)};return r.each(function(){var r,b,y,x,C,w,k=e.isPlainObject(o)?e.extend(!0,{},e.fn.sidebar.settings,o):e.extend({},e.fn.sidebar.settings),S=k.selector,T=k.className,A=k.namespace,R=k.regExp,P=k.error,E="."+A,F="module-"+A,O=e(this),D=e(k.context),q=O.children(S.sidebar),j=D.children(S.fixed),z=D.children(S.pusher),M=this,I=O.data(F);w={initialize:function(){w.debug("Initializing sidebar",o),w.create.id(),C=w.get.transitionEvent(),w.is.ios()&&w.set.ios(),k.delaySetup?v(w.setup.layout):w.setup.layout(),v(function(){w.setup.cache()}),w.instantiate()},instantiate:function(){w.verbose("Storing instance of module",w),I=w,O.data(F,w)},create:{id:function(){y=(Math.random().toString(16)+"000000000").substr(2,8),b="."+y,w.verbose("Creating unique id for element",y)}},destroy:function(){w.verbose("Destroying previous module for",O),O.off(E).removeData(F),w.is.ios()&&w.remove.ios(),D.off(b),s.off(b),l.off(b)},event:{clickaway:function(e){var t=z.find(e.target).length>0||z.is(e.target),n=D.is(e.target);t&&(w.verbose("User clicked on dimmed page"),w.hide()),n&&(w.verbose("User clicked on dimmable context (scaled out page)"),w.hide())},touch:function(e){},containScroll:function(e){M.scrollTop<=0&&(M.scrollTop=1),M.scrollTop+M.offsetHeight>=M.scrollHeight&&(M.scrollTop=M.scrollHeight-M.offsetHeight-1)},scroll:function(t){0===e(t.target).closest(S.sidebar).length&&t.preventDefault()}},bind:{clickaway:function(){w.verbose("Adding clickaway events to context",D),k.closable&&D.on("click"+b,w.event.clickaway).on("touchend"+b,w.event.clickaway)},scrollLock:function(){k.scrollLock&&(w.debug("Disabling page scroll"),s.on("DOMMouseScroll"+b,w.event.scroll)),w.verbose("Adding events to contain sidebar scroll"),l.on("touchmove"+b,w.event.touch),O.on("scroll"+E,w.event.containScroll)}},unbind:{clickaway:function(){w.verbose("Removing clickaway events from context",D),D.off(b)},scrollLock:function(){w.verbose("Removing scroll lock from page"),l.off(b),s.off(b),O.off("scroll"+E)}},add:{inlineCSS:function(){var t,n=w.cache.width||O.outerWidth(),i=w.cache.height||O.outerHeight(),o=w.is.rtl(),a=w.get.direction(),s={left:n,right:-n,top:i,bottom:-i};o&&(w.verbose("RTL detected, flipping widths"),s.left=-n,s.right=n),t="",r=e(t).appendTo(u),w.debug("Adding sizing css to head",r)}},refresh:function(){w.verbose("Refreshing selector cache"),D=e(k.context),q=D.children(S.sidebar),z=D.children(S.pusher),j=D.children(S.fixed),w.clear.cache()},refreshSidebars:function(){w.verbose("Refreshing other sidebars"),q=D.children(S.sidebar)},repaint:function(){w.verbose("Forcing repaint event"),M.style.display="none";M.offsetHeight;M.scrollTop=M.scrollTop,M.style.display=""},setup:{cache:function(){w.cache={width:O.outerWidth(),height:O.outerHeight(),rtl:"rtl"==O.css("direction")}},layout:function(){0===D.children(S.pusher).length&&(w.debug("Adding wrapper element for sidebar"),w.error(P.pusher),z=e('
'),D.children().not(S.omitted).not(q).wrapAll(z),w.refresh()),(0===O.nextAll(S.pusher).length||O.nextAll(S.pusher)[0]!==z[0])&&(w.debug("Moved sidebar to correct parent element"),w.error(P.movedSidebar,M),O.detach().prependTo(D),w.refresh()),w.clear.cache(),w.set.pushable(),w.set.direction()}},attachEvents:function(t,n){var i=e(t);n=e.isFunction(w[n])?w[n]:w.toggle,i.length>0?(w.debug("Attaching sidebar events to element",t,n), -i.on("click"+E,n)):w.error(P.notFound,t)},show:function(t){if(t=e.isFunction(t)?t:function(){},w.is.hidden()){if(w.refreshSidebars(),k.overlay&&(w.error(P.overlay),k.transition="overlay"),w.refresh(),w.othersActive())if(w.debug("Other sidebars currently visible"),k.exclusive){if("overlay"!=k.transition)return void w.hideOthers(w.show);w.hideOthers()}else k.transition="overlay";w.pushPage(function(){t.call(M),k.onShow.call(M)}),k.onChange.call(M),k.onVisible.call(M)}else w.debug("Sidebar is already visible")},hide:function(t){t=e.isFunction(t)?t:function(){},(w.is.visible()||w.is.animating())&&(w.debug("Hiding sidebar",t),w.refreshSidebars(),w.pullPage(function(){t.call(M),k.onHidden.call(M)}),k.onChange.call(M),k.onHide.call(M))},othersAnimating:function(){return q.not(O).filter("."+T.animating).length>0},othersVisible:function(){return q.not(O).filter("."+T.visible).length>0},othersActive:function(){return w.othersVisible()||w.othersAnimating()},hideOthers:function(e){var t=q.not(O).filter("."+T.visible),n=t.length,i=0;e=e||function(){},t.sidebar("hide",function(){i++,i==n&&e()})},toggle:function(){w.verbose("Determining toggled direction"),w.is.hidden()?w.show():w.hide()},pushPage:function(t){var n,i,o,a=w.get.transition(),r="overlay"===a||w.othersActive()?O:z;t=e.isFunction(t)?t:function(){},"scale down"==k.transition&&w.scrollToTop(),w.set.transition(a),w.repaint(),n=function(){w.bind.clickaway(),w.add.inlineCSS(),w.set.animating(),w.set.visible()},i=function(){w.set.dimmed()},o=function(e){e.target==r[0]&&(r.off(C+b,o),w.remove.animating(),w.bind.scrollLock(),t.call(M))},r.off(C+b),r.on(C+b,o),v(n),k.dimPage&&!w.othersVisible()&&v(i)},pullPage:function(t){var n,i,o=w.get.transition(),a="overlay"==o||w.othersActive()?O:z;t=e.isFunction(t)?t:function(){},w.verbose("Removing context push state",w.get.direction()),w.unbind.clickaway(),w.unbind.scrollLock(),n=function(){w.set.transition(o),w.set.animating(),w.remove.visible(),k.dimPage&&!w.othersVisible()&&z.removeClass(T.dimmed)},i=function(e){e.target==a[0]&&(a.off(C+b,i),w.remove.animating(),w.remove.transition(),w.remove.inlineCSS(),("scale down"==o||k.returnScroll&&w.is.mobile())&&w.scrollBack(),t.call(M))},a.off(C+b),a.on(C+b,i),v(n)},scrollToTop:function(){w.verbose("Scrolling to top of page to avoid animation issues"),x=e(t).scrollTop(),O.scrollTop(0),t.scrollTo(0,0)},scrollBack:function(){w.verbose("Scrolling back to original page position"),t.scrollTo(0,x)},clear:{cache:function(){w.verbose("Clearing cached dimensions"),w.cache={}}},set:{ios:function(){c.addClass(T.ios)},pushed:function(){D.addClass(T.pushed)},pushable:function(){D.addClass(T.pushable)},dimmed:function(){z.addClass(T.dimmed)},active:function(){O.addClass(T.active)},animating:function(){O.addClass(T.animating)},transition:function(e){e=e||w.get.transition(),O.addClass(e)},direction:function(e){e=e||w.get.direction(),O.addClass(T[e])},visible:function(){O.addClass(T.visible)},overlay:function(){O.addClass(T.overlay)}},remove:{inlineCSS:function(){w.debug("Removing inline css styles",r),r&&r.length>0&&r.remove()},ios:function(){c.removeClass(T.ios)},pushed:function(){D.removeClass(T.pushed)},pushable:function(){D.removeClass(T.pushable)},active:function(){O.removeClass(T.active)},animating:function(){O.removeClass(T.animating)},transition:function(e){e=e||w.get.transition(),O.removeClass(e)},direction:function(e){e=e||w.get.direction(),O.removeClass(T[e])},visible:function(){O.removeClass(T.visible)},overlay:function(){O.removeClass(T.overlay)}},get:{direction:function(){return O.hasClass(T.top)?T.top:O.hasClass(T.right)?T.right:O.hasClass(T.bottom)?T.bottom:T.left},transition:function(){var e,t=w.get.direction();return e=w.is.mobile()?"auto"==k.mobileTransition?k.defaultTransition.mobile[t]:k.mobileTransition:"auto"==k.transition?k.defaultTransition.computer[t]:k.transition,w.verbose("Determined transition",e),e},transitionEvent:function(){var e,t=n.createElement("element"),o={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(e in o)if(t.style[e]!==i)return o[e]}},is:{ie:function(){var e=!t.ActiveXObject&&"ActiveXObject"in t,n="ActiveXObject"in t;return e||n},ios:function(){var e=navigator.userAgent,t=e.match(R.ios),n=e.match(R.mobileChrome);return t&&!n?(w.verbose("Browser was found to be iOS",e),!0):!1},mobile:function(){var e=navigator.userAgent,t=e.match(R.mobile);return t?(w.verbose("Browser was found to be mobile",e),!0):(w.verbose("Browser is not mobile, using regular transition",e),!1)},hidden:function(){return!w.is.visible()},visible:function(){return O.hasClass(T.visible)},open:function(){return w.is.visible()},closed:function(){return w.is.hidden()},vertical:function(){return O.hasClass(T.top)},animating:function(){return D.hasClass(T.animating)},rtl:function(){return w.cache.rtl===i&&(w.cache.rtl="rtl"==O.css("direction")),w.cache.rtl}},setting:function(t,n){if(w.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,k,t);else{if(n===i)return k[t];e.isPlainObject(k[t])?e.extend(!0,k[t],n):k[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,w,t);else{if(n===i)return w[t];w[t]=n}},debug:function(){!k.silent&&k.debug&&(k.performance?w.performance.log(arguments):(w.debug=Function.prototype.bind.call(console.info,console,k.name+":"),w.debug.apply(console,arguments)))},verbose:function(){!k.silent&&k.verbose&&k.debug&&(k.performance?w.performance.log(arguments):(w.verbose=Function.prototype.bind.call(console.info,console,k.name+":"),w.verbose.apply(console,arguments)))},error:function(){k.silent||(w.error=Function.prototype.bind.call(console.error,console,k.name+":"),w.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;k.performance&&(t=(new Date).getTime(),i=f||t,n=t-i,f=t,m.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:M,"Execution Time":n})),clearTimeout(w.performance.timer),w.performance.timer=setTimeout(w.performance.display,500)},display:function(){var t=k.name+":",n=0;f=!1,clearTimeout(w.performance.timer),e.each(m,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",d&&(t+=" '"+d+"'"),(console.group!==i||console.table!==i)&&m.length>0&&(console.groupCollapsed(t),console.table?console.table(m):e.each(m,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),m=[]}},invoke:function(t,n,o){var r,s,l,c=I;return n=n||h,o=M||o,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):(w.error(P.method,t),!1);c=c[o]}})),e.isFunction(s)?l=s.apply(o,n):s!==i&&(l=s),e.isArray(a)?a.push(l):a!==i?a=[a,l]:l!==i&&(a=l),s}},p?(I===i&&w.initialize(),w.invoke(g)):(I!==i&&w.invoke("destroy"),w.initialize())}),a!==i?a:this},e.fn.sidebar.settings={name:"Sidebar",namespace:"sidebar",silent:!1,debug:!1,verbose:!1,performance:!0,transition:"auto",mobileTransition:"auto",defaultTransition:{computer:{left:"uncover",right:"uncover",top:"overlay",bottom:"overlay"},mobile:{left:"uncover",right:"uncover",top:"overlay",bottom:"overlay"}},context:"body",exclusive:!1,closable:!0,dimPage:!0,scrollLock:!1,returnScroll:!1,delaySetup:!1,duration:500,onChange:function(){},onShow:function(){},onHide:function(){},onHidden:function(){},onVisible:function(){},className:{active:"active",animating:"animating",dimmed:"dimmed",ios:"ios",pushable:"pushable",pushed:"pushed",right:"right",top:"top",left:"left",bottom:"bottom",visible:"visible"},selector:{fixed:".fixed",omitted:"script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed",pusher:".pusher",sidebar:".ui.sidebar"},regExp:{ios:/(iPad|iPhone|iPod)/g,mobileChrome:/(CriOS)/g,mobile:/Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/g},error:{method:"The method you called is not defined.",pusher:"Had to add pusher element. For optimal performance make sure body content is inside a pusher element",movedSidebar:"Had to move sidebar. For optimal performance make sure sidebar and pusher are direct children of your body tag",overlay:"The overlay setting is no longer supported, use animation: overlay",notFound:"There were no elements that matched the specified selector"}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.sticky=function(o){var a,r=e(this),s=r.selector||"",l=(new Date).getTime(),c=[],u=arguments[0],d="string"==typeof u,f=[].slice.call(arguments,1);return r.each(function(){var r,m,g,p,h,v=e.isPlainObject(o)?e.extend(!0,{},e.fn.sticky.settings,o):e.extend({},e.fn.sticky.settings),b=v.className,y=v.namespace,x=v.error,C="."+y,w="module-"+y,k=e(this),S=e(t),T=e(v.scrollContext),A=(k.selector||"",k.data(w)),R=t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame||function(e){setTimeout(e,0)},P=this;h={initialize:function(){h.determineContainer(),h.determineContext(),h.verbose("Initializing sticky",v,r),h.save.positions(),h.checkErrors(),h.bind.events(),v.observeChanges&&h.observeChanges(),h.instantiate()},instantiate:function(){h.verbose("Storing instance of module",h),A=h,k.data(w,h)},destroy:function(){h.verbose("Destroying previous instance"),h.reset(),g&&g.disconnect(),p&&p.disconnect(),S.off("load"+C,h.event.load).off("resize"+C,h.event.resize),T.off("scrollchange"+C,h.event.scrollchange),k.removeData(w)},observeChanges:function(){"MutationObserver"in t&&(g=new MutationObserver(h.event.documentChanged),p=new MutationObserver(h.event.changed),g.observe(n,{childList:!0,subtree:!0}),p.observe(P,{childList:!0,subtree:!0}),p.observe(m[0],{childList:!0,subtree:!0}),h.debug("Setting up mutation observer",p))},determineContainer:function(){r=k.offsetParent()},determineContext:function(){return m=v.context?e(v.context):r,0===m.length?void h.error(x.invalidContext,v.context,k):void 0},checkErrors:function(){return h.is.hidden()&&h.error(x.visible,k),h.cache.element.height>h.cache.context.height?(h.reset(),void h.error(x.elementSize,k)):void 0},bind:{events:function(){S.on("load"+C,h.event.load).on("resize"+C,h.event.resize),T.off("scroll"+C).on("scroll"+C,h.event.scroll).on("scrollchange"+C,h.event.scrollchange)}},event:{changed:function(e){clearTimeout(h.timer),h.timer=setTimeout(function(){h.verbose("DOM tree modified, updating sticky menu",e),h.refresh()},100)},documentChanged:function(t){[].forEach.call(t,function(t){t.removedNodes&&[].forEach.call(t.removedNodes,function(t){(t==P||e(t).find(P).length>0)&&(h.debug("Element removed from DOM, tearing down events"),h.destroy())})})},load:function(){h.verbose("Page contents finished loading"),R(h.refresh)},resize:function(){h.verbose("Window resized"),R(h.refresh)},scroll:function(){R(function(){T.triggerHandler("scrollchange"+C,T.scrollTop())})},scrollchange:function(e,t){h.stick(t),v.onScroll.call(P)}},refresh:function(e){h.reset(),v.context||h.determineContext(),e&&h.determineContainer(),h.save.positions(),h.stick(),v.onReposition.call(P)},supports:{sticky:function(){var t=e("
");t[0];return t.addClass(b.supported),t.css("position").match("sticky")}},save:{lastScroll:function(e){h.lastScroll=e},elementScroll:function(e){h.elementScroll=e},positions:function(){var e={height:T.height()},t={margin:{top:parseInt(k.css("margin-top"),10),bottom:parseInt(k.css("margin-bottom"),10)},offset:k.offset(),width:k.outerWidth(),height:k.outerHeight()},n={offset:m.offset(),height:m.outerHeight()};({height:r.outerHeight()});h.is.standardScroll()||(h.debug("Non-standard scroll. Removing scroll offset from element offset"),e.top=T.scrollTop(),e.left=T.scrollLeft(),t.offset.top+=e.top,n.offset.top+=e.top,t.offset.left+=e.left,n.offset.left+=e.left),h.cache={fits:t.heighte&&(t="up")),t},scrollChange:function(e){return e=e||T.scrollTop(),h.lastScroll?e-h.lastScroll:0},currentElementScroll:function(){return h.elementScroll?h.elementScroll:h.is.top()?Math.abs(parseInt(k.css("top"),10))||0:Math.abs(parseInt(k.css("bottom"),10))||0},elementScroll:function(e){e=e||T.scrollTop();var t=h.cache.element,n=h.cache.scrollContext,i=h.get.scrollChange(e),o=t.height-n.height+v.offset,a=h.get.currentElementScroll(),r=a+i;return a=h.cache.fits||0>r?0:r>o?o:r}},remove:{lastScroll:function(){delete h.lastScroll},elementScroll:function(e){delete h.elementScroll},offset:function(){k.css("margin-top","")}},set:{offset:function(){h.verbose("Setting offset on element",v.offset),k.css("margin-top",v.offset)},containerSize:function(){var e=r.get(0).tagName;"HTML"===e||"body"==e?h.determineContainer():Math.abs(r.outerHeight()-h.cache.context.height)>v.jitter&&(h.debug("Context has padding, specifying exact height for container",h.cache.context.height),r.css({height:h.cache.context.height}))},minimumSize:function(){var e=h.cache.element;r.css("min-height",e.height)},scroll:function(e){h.debug("Setting scroll on element",e),h.elementScroll!=e&&(h.is.top()&&k.css("bottom","").css("top",-e),h.is.bottom()&&k.css("top","").css("bottom",e))},size:function(){0!==h.cache.element.height&&0!==h.cache.element.width&&(P.style.setProperty("width",h.cache.element.width+"px","important"),P.style.setProperty("height",h.cache.element.height+"px","important"))}},is:{standardScroll:function(){return T[0]==t},top:function(){return k.hasClass(b.top)},bottom:function(){return k.hasClass(b.bottom)},initialPosition:function(){return!h.is.fixed()&&!h.is.bound()},hidden:function(){return!k.is(":visible")},bound:function(){return k.hasClass(b.bound)},fixed:function(){return k.hasClass(b.fixed)}},stick:function(e){var t=e||T.scrollTop(),n=h.cache,i=n.fits,o=n.element,a=n.scrollContext,r=n.context,s=h.is.bottom()&&v.pushing?v.bottomOffset:v.offset,e={top:t+s,bottom:t+s+a.height},l=(h.get.direction(e.top),i?0:h.get.elementScroll(e.top)),c=!i,u=0!==o.height;u&&(h.is.initialPosition()?e.top>=r.bottom?(h.debug("Initial element position is bottom of container"),h.bindBottom()):e.top>o.top&&(o.height+e.top-l>=r.bottom?(h.debug("Initial element position is bottom of container"),h.bindBottom()):(h.debug("Initial element position is fixed"),h.fixTop())):h.is.fixed()?h.is.top()?e.top<=o.top?(h.debug("Fixed element reached top of container"),h.setInitialPosition()):o.height+e.top-l>=r.bottom?(h.debug("Fixed element reached bottom of container"),h.bindBottom()):c&&(h.set.scroll(l),h.save.lastScroll(e.top),h.save.elementScroll(l)):h.is.bottom()&&(e.bottom-o.height<=o.top?(h.debug("Bottom fixed rail has reached top of container"),h.setInitialPosition()):e.bottom>=r.bottom?(h.debug("Bottom fixed rail has reached bottom of container"),h.bindBottom()):c&&(h.set.scroll(l),h.save.lastScroll(e.top),h.save.elementScroll(l))):h.is.bottom()&&(e.top<=o.top?(h.debug("Jumped from bottom fixed to top fixed, most likely used home/end button"),h.setInitialPosition()):v.pushing?h.is.bound()&&e.bottom<=r.bottom&&(h.debug("Fixing bottom attached element to bottom of browser."),h.fixBottom()):h.is.bound()&&e.top<=r.bottom-o.height&&(h.debug("Fixing bottom attached element to top of browser."),h.fixTop())))},bindTop:function(){h.debug("Binding element to top of parent container"),h.remove.offset(),k.css({left:"",top:"",marginBottom:""}).removeClass(b.fixed).removeClass(b.bottom).addClass(b.bound).addClass(b.top),v.onTop.call(P),v.onUnstick.call(P)},bindBottom:function(){h.debug("Binding element to bottom of parent container"),h.remove.offset(),k.css({left:"",top:""}).removeClass(b.fixed).removeClass(b.top).addClass(b.bound).addClass(b.bottom),v.onBottom.call(P),v.onUnstick.call(P)},setInitialPosition:function(){h.debug("Returning to initial position"),h.unfix(),h.unbind()},fixTop:function(){h.debug("Fixing element to top of page"),h.set.minimumSize(),h.set.offset(),k.css({left:h.cache.element.left,bottom:"",marginBottom:""}).removeClass(b.bound).removeClass(b.bottom).addClass(b.fixed).addClass(b.top),v.onStick.call(P)},fixBottom:function(){h.debug("Sticking element to bottom of page"),h.set.minimumSize(),h.set.offset(),k.css({left:h.cache.element.left,bottom:"",marginBottom:""}).removeClass(b.bound).removeClass(b.top).addClass(b.fixed).addClass(b.bottom),v.onStick.call(P)},unbind:function(){h.is.bound()&&(h.debug("Removing container bound position on element"),h.remove.offset(),k.removeClass(b.bound).removeClass(b.top).removeClass(b.bottom))},unfix:function(){h.is.fixed()&&(h.debug("Removing fixed position on element"),h.remove.offset(),k.removeClass(b.fixed).removeClass(b.top).removeClass(b.bottom),v.onUnstick.call(P))},reset:function(){h.debug("Resetting elements position"),h.unbind(),h.unfix(),h.resetCSS(),h.remove.offset(),h.remove.lastScroll()},resetCSS:function(){k.css({width:"",height:""}),r.css({height:""})},setting:function(t,n){if(e.isPlainObject(t))e.extend(!0,v,t);else{if(n===i)return v[t];v[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,h,t);else{if(n===i)return h[t];h[t]=n}},debug:function(){!v.silent&&v.debug&&(v.performance?h.performance.log(arguments):(h.debug=Function.prototype.bind.call(console.info,console,v.name+":"),h.debug.apply(console,arguments)))},verbose:function(){!v.silent&&v.verbose&&v.debug&&(v.performance?h.performance.log(arguments):(h.verbose=Function.prototype.bind.call(console.info,console,v.name+":"),h.verbose.apply(console,arguments)))},error:function(){v.silent||(h.error=Function.prototype.bind.call(console.error,console,v.name+":"),h.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;v.performance&&(t=(new Date).getTime(),i=l||t,n=t-i,l=t,c.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:P,"Execution Time":n})),clearTimeout(h.performance.timer),h.performance.timer=setTimeout(h.performance.display,0)},display:function(){var t=v.name+":",n=0;l=!1,clearTimeout(h.performance.timer),e.each(c,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",s&&(t+=" '"+s+"'"),(console.group!==i||console.table!==i)&&c.length>0&&(console.groupCollapsed(t),console.table?console.table(c):e.each(c,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),c=[]}},invoke:function(t,n,o){var r,s,l,c=A;return n=n||f,o=P||o,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):!1;c=c[o]}})),e.isFunction(s)?l=s.apply(o,n):s!==i&&(l=s),e.isArray(a)?a.push(l):a!==i?a=[a,l]:l!==i&&(a=l),s}},d?(A===i&&h.initialize(),h.invoke(u)):(A!==i&&A.invoke("destroy"),h.initialize())}),a!==i?a:this},e.fn.sticky.settings={name:"Sticky",namespace:"sticky",silent:!1,debug:!1,verbose:!0,performance:!0,pushing:!1,context:!1,scrollContext:t,offset:0,bottomOffset:0,jitter:5,observeChanges:!1,onReposition:function(){},onScroll:function(){},onStick:function(){},onUnstick:function(){},onTop:function(){},onBottom:function(){},error:{container:"Sticky element must be inside a relative container",visible:"Element is hidden, you must call refresh after element becomes visible. Use silent setting to surpress this warning in production.",method:"The method you called is not defined.",invalidContext:"Context specified does not exist",elementSize:"Sticky element is larger than its container, cannot create sticky."},className:{bound:"bound",fixed:"fixed",supported:"native",top:"top",bottom:"bottom"}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.tab=function(o){var a,r=e(e.isFunction(this)?t:this),s=r.selector||"",l=(new Date).getTime(),c=[],u=arguments[0],d="string"==typeof u,f=[].slice.call(arguments,1),m=!1;return r.each(function(){var g,p,h,v,b,y,x=e.isPlainObject(o)?e.extend(!0,{},e.fn.tab.settings,o):e.extend({},e.fn.tab.settings),C=x.className,w=x.metadata,k=x.selector,S=x.error,T="."+x.namespace,A="module-"+x.namespace,R=e(this),P={},E=!0,F=0,O=this,D=R.data(A);b={initialize:function(){b.debug("Initializing tab menu item",R),b.fix.callbacks(),b.determineTabs(),b.debug("Determining tabs",x.context,p),x.auto&&b.set.auto(),b.bind.events(),x.history&&!m&&(b.initializeHistory(),m=!0),b.instantiate()},instantiate:function(){b.verbose("Storing instance of module",b),D=b,R.data(A,b)},destroy:function(){b.debug("Destroying tabs",R),R.removeData(A).off(T)},bind:{events:function(){e.isWindow(O)||(b.debug("Attaching tab activation events to element",R),R.on("click"+T,b.event.click))}},determineTabs:function(){var t;"parent"===x.context?(R.closest(k.ui).length>0?(t=R.closest(k.ui),b.verbose("Using closest UI element as parent",t)):t=R,g=t.parent(),b.verbose("Determined parent element for creating context",g)):x.context?(g=e(x.context),b.verbose("Using selector for tab context",x.context,g)):g=e("body"),x.childrenOnly?(p=g.children(k.tabs),b.debug("Searching tab context children for tabs",g,p)):(p=g.find(k.tabs),b.debug("Searching tab context for tabs",g,p))},fix:{callbacks:function(){e.isPlainObject(o)&&(o.onTabLoad||o.onTabInit)&&(o.onTabLoad&&(o.onLoad=o.onTabLoad,delete o.onTabLoad,b.error(S.legacyLoad,o.onLoad)),o.onTabInit&&(o.onFirstLoad=o.onTabInit,delete o.onTabInit,b.error(S.legacyInit,o.onFirstLoad)),x=e.extend(!0,{},e.fn.tab.settings,o))}},initializeHistory:function(){if(b.debug("Initializing page state"),e.address===i)return b.error(S.state),!1;if("state"==x.historyType){if(b.debug("Using HTML5 to manage state"),x.path===!1)return b.error(S.path),!1;e.address.history(!0).state(x.path)}e.address.bind("change",b.event.history.change)},event:{click:function(t){var n=e(this).data(w.tab);n!==i?(x.history?(b.verbose("Updating page state",t),e.address.value(n)):(b.verbose("Changing tab",t),b.changeTab(n)),t.preventDefault()):b.debug("No tab specified")},history:{change:function(t){var n=t.pathNames.join("/")||b.get.initialPath(),o=x.templates.determineTitle(n)||!1;b.performance.display(),b.debug("History change event",n,t),y=t,n!==i&&b.changeTab(n),o&&e.address.title(o)}}},refresh:function(){h&&(b.debug("Refreshing tab",h),b.changeTab(h))},cache:{read:function(e){return e!==i?P[e]:!1},add:function(e,t){e=e||h,b.debug("Adding cached content for",e),P[e]=t},remove:function(e){e=e||h,b.debug("Removing cached content for",e),delete P[e]}},set:{auto:function(){var t="string"==typeof x.path?x.path.replace(/\/$/,"")+"/{$tab}":"/{$tab}";b.verbose("Setting up automatic tab retrieval from server",t),e.isPlainObject(x.apiSettings)?x.apiSettings.url=t:x.apiSettings={url:t}},loading:function(e){var t=b.get.tabElement(e),n=t.hasClass(C.loading);n||(b.verbose("Setting loading state for",t),t.addClass(C.loading).siblings(p).removeClass(C.active+" "+C.loading),t.length>0&&x.onRequest.call(t[0],e))},state:function(t){e.address.value(t)}},changeTab:function(n){var i=t.history&&t.history.pushState,o=i&&x.ignoreFirstLoad&&E,a=x.auto||e.isPlainObject(x.apiSettings),r=a&&!o?b.utilities.pathToArray(n):b.get.defaultPathArray(n);n=b.utilities.arrayToPath(r),e.each(r,function(t,i){var s,l,c,u,d=r.slice(0,t+1),f=b.utilities.arrayToPath(d),m=b.is.tab(f),p=t+1==r.length,k=b.get.tabElement(f);if(b.verbose("Looking for tab",i),m){if(b.verbose("Tab was found",i),h=f,v=b.utilities.filterArray(r,d),p?u=!0:(l=r.slice(0,t+2),c=b.utilities.arrayToPath(l),u=!b.is.tab(c),u&&b.verbose("Tab parameters found",l)),u&&a)return o?(b.debug("Ignoring remote content on first tab load",f),E=!1,b.cache.add(n,k.html()),b.activate.all(f),x.onFirstLoad.call(k[0],f,v,y),x.onLoad.call(k[0],f,v,y)):(b.activate.navigation(f),b.fetch.content(f,n)),!1;b.debug("Opened local tab",f),b.activate.all(f),b.cache.read(f)||(b.cache.add(f,!0),b.debug("First time tab loaded calling tab init"),x.onFirstLoad.call(k[0],f,v,y)),x.onLoad.call(k[0],f,v,y)}else{if(-1!=n.search("/")||""===n)return b.error(S.missingTab,R,g,f),!1;if(s=e("#"+n+', a[name="'+n+'"]'),f=s.closest("[data-tab]").data(w.tab),k=b.get.tabElement(f),s&&s.length>0&&f)return b.debug("Anchor link used, opening parent tab",k,s),k.hasClass(C.active)||setTimeout(function(){b.scrollTo(s)},0),b.activate.all(f),b.cache.read(f)||(b.cache.add(f,!0),b.debug("First time tab loaded calling tab init"),x.onFirstLoad.call(k[0],f,v,y)),x.onLoad.call(k[0],f,v,y),!1}})},scrollTo:function(t){var i=t&&t.length>0?t.offset().top:!1;i!==!1&&(b.debug("Forcing scroll to an in-page link in a hidden tab",i,t),e(n).scrollTop(i))},update:{content:function(e,t,n){var o=b.get.tabElement(e),a=o[0];n=n!==i?n:x.evaluateScripts,n?(b.debug("Updating HTML and evaluating inline scripts",e,t),o.html(t)):(b.debug("Updating HTML",e,t),a.innerHTML=t)}},fetch:{content:function(t,n){var o,a,r=b.get.tabElement(t),s={dataType:"html",encodeParameters:!1,on:"now",cache:x.alwaysRefresh,headers:{"X-Remote":!0},onSuccess:function(e){"response"==x.cacheType&&b.cache.add(n,e),b.update.content(t,e),t==h?(b.debug("Content loaded",t),b.activate.tab(t)):b.debug("Content loaded in background",t),x.onFirstLoad.call(r[0],t,v,y),x.onLoad.call(r[0],t,v,y),"response"!=x.cacheType&&b.cache.add(n,r.html())},urlData:{tab:n}},l=r.api("get request")||!1,c=l&&"pending"===l.state();n=n||t,a=b.cache.read(n),x.cache&&a?(b.activate.tab(t),b.debug("Adding cached content",n),"once"==x.evaluateScripts?b.update.content(t,a,!1):b.update.content(t,a),x.onLoad.call(r[0],t,v,y)):c?(b.set.loading(t),b.debug("Content is already loading",n)):e.api!==i?(o=e.extend(!0,{},x.apiSettings,s),b.debug("Retrieving remote content",n,o),b.set.loading(t),r.api(o)):b.error(S.api)}},activate:{all:function(e){b.activate.tab(e),b.activate.navigation(e)},tab:function(e){var t=b.get.tabElement(e),n="siblings"==x.deactivate?t.siblings(p):p.not(t),i=t.hasClass(C.active);b.verbose("Showing tab content for",t),i||(t.addClass(C.active),n.removeClass(C.active+" "+C.loading),t.length>0&&x.onVisible.call(t[0],e))},navigation:function(e){var t=b.get.navElement(e),n="siblings"==x.deactivate?t.siblings(r):r.not(t),i=t.hasClass(C.active);b.verbose("Activating tab navigation for",t,e),i||(t.addClass(C.active),n.removeClass(C.active+" "+C.loading))}},deactivate:{all:function(){b.deactivate.navigation(),b.deactivate.tabs()},navigation:function(){r.removeClass(C.active)},tabs:function(){p.removeClass(C.active+" "+C.loading)}},is:{tab:function(e){return e!==i?b.get.tabElement(e).length>0:!1}},get:{initialPath:function(){return r.eq(0).data(w.tab)||p.eq(0).data(w.tab)},path:function(){return e.address.value()},defaultPathArray:function(e){return b.utilities.pathToArray(b.get.defaultPath(e))},defaultPath:function(e){var t=r.filter("[data-"+w.tab+'^="'+e+'/"]').eq(0),n=t.data(w.tab)||!1;if(n){if(b.debug("Found default tab",n),F0?t:n},tab:function(){return h}},utilities:{filterArray:function(t,n){return e.grep(t,function(t){return-1==e.inArray(t,n)})},last:function(t){return e.isArray(t)?t[t.length-1]:!1},pathToArray:function(e){return e===i&&(e=h),"string"==typeof e?e.split("/"):[e]},arrayToPath:function(t){return e.isArray(t)?t.join("/"):!1}},setting:function(t,n){if(b.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,x,t);else{if(n===i)return x[t];e.isPlainObject(x[t])?e.extend(!0,x[t],n):x[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,b,t);else{if(n===i)return b[t];b[t]=n}},debug:function(){!x.silent&&x.debug&&(x.performance?b.performance.log(arguments):(b.debug=Function.prototype.bind.call(console.info,console,x.name+":"),b.debug.apply(console,arguments)))},verbose:function(){!x.silent&&x.verbose&&x.debug&&(x.performance?b.performance.log(arguments):(b.verbose=Function.prototype.bind.call(console.info,console,x.name+":"),b.verbose.apply(console,arguments)))},error:function(){x.silent||(b.error=Function.prototype.bind.call(console.error,console,x.name+":"),b.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;x.performance&&(t=(new Date).getTime(),i=l||t,n=t-i,l=t,c.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:O,"Execution Time":n})),clearTimeout(b.performance.timer),b.performance.timer=setTimeout(b.performance.display,500)},display:function(){var t=x.name+":",n=0;l=!1,clearTimeout(b.performance.timer),e.each(c,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",s&&(t+=" '"+s+"'"),(console.group!==i||console.table!==i)&&c.length>0&&(console.groupCollapsed(t),console.table?console.table(c):e.each(c,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),c=[]}},invoke:function(t,n,o){var r,s,l,c=D;return n=n||f,o=O||o,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):(b.error(S.method,t),!1);c=c[o]}})),e.isFunction(s)?l=s.apply(o,n):s!==i&&(l=s),e.isArray(a)?a.push(l):a!==i?a=[a,l]:l!==i&&(a=l),s}},d?(D===i&&b.initialize(),b.invoke(u)):(D!==i&&D.invoke("destroy"),b.initialize())}),a!==i?a:this},e.tab=function(){e(t).tab.apply(this,arguments)},e.fn.tab.settings={name:"Tab",namespace:"tab",silent:!1,debug:!1,verbose:!1,performance:!0,auto:!1,history:!1,historyType:"hash",path:!1,context:!1,childrenOnly:!1,maxDepth:25,deactivate:"siblings",alwaysRefresh:!1,cache:!0,cacheType:"response",ignoreFirstLoad:!1,apiSettings:!1,evaluateScripts:"once",onFirstLoad:function(e,t,n){},onLoad:function(e,t,n){},onVisible:function(e,t,n){},onRequest:function(e,t,n){},templates:{determineTitle:function(e){}},error:{api:"You attempted to load content without API module",method:"The method you called is not defined",missingTab:"Activated tab cannot be found. Tabs are case-sensitive.",noContent:"The tab you specified is missing a content url.",path:"History enabled, but no path was specified",recursion:"Max recursive depth reached",legacyInit:"onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.",legacyLoad:"onTabLoad has been renamed to onLoad in 2.0. Please adjust your code",state:"History requires Asual's Address library "},metadata:{tab:"tab",loaded:"loaded",promise:"promise"},className:{loading:"loading",active:"active"},selector:{tabs:".ui.tab",ui:".ui"}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.transition=function(){var o,a=e(this),r=a.selector||"",s=(new Date).getTime(),l=[],c=arguments,u=c[0],d=[].slice.call(arguments,1),f="string"==typeof u;t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame||function(e){setTimeout(e,0)};return a.each(function(t){var m,g,p,h,v,b,y,x,C,w=e(this),k=this;C={initialize:function(){m=C.get.settings.apply(k,c),h=m.className,p=m.error,v=m.metadata, -x="."+m.namespace,y="module-"+m.namespace,g=w.data(y)||C,b=C.get.animationEndEvent(),f&&(f=C.invoke(u)),f===!1&&(C.verbose("Converted arguments into settings object",m),m.interval?C.delay(m.animate):C.animate(),C.instantiate())},instantiate:function(){C.verbose("Storing instance of module",C),g=C,w.data(y,g)},destroy:function(){C.verbose("Destroying previous module for",k),w.removeData(y)},refresh:function(){C.verbose("Refreshing display type on next animation"),delete C.displayType},forceRepaint:function(){C.verbose("Forcing element repaint");var e=w.parent(),t=w.next();0===t.length?w.detach().appendTo(e):w.detach().insertBefore(t)},repaint:function(){C.verbose("Repainting element");k.offsetWidth},delay:function(e){var n,o,r=C.get.animationDirection();r||(r=C.can.transition()?C.get.direction():"static"),e=e!==i?e:m.interval,n="auto"==m.reverse&&r==h.outward,o=n||1==m.reverse?(a.length-t)*m.interval:t*m.interval,C.debug("Delaying animation by",o),setTimeout(C.animate,o)},animate:function(e){if(m=e||m,!C.is.supported())return C.error(p.support),!1;if(C.debug("Preparing animation",m.animation),C.is.animating()){if(m.queue)return!m.allowRepeats&&C.has.direction()&&C.is.occurring()&&C.queuing!==!0?C.debug("Animation is currently occurring, preventing queueing same animation",m.animation):C.queue(m.animation),!1;if(!m.allowRepeats&&C.is.occurring())return C.debug("Animation is already occurring, will not execute repeated animation",m.animation),!1;C.debug("New animation started, completing previous early",m.animation),g.complete()}C.can.animate()?C.set.animating(m.animation):C.error(p.noAnimation,m.animation,k)},reset:function(){C.debug("Resetting animation to beginning conditions"),C.remove.animationCallbacks(),C.restore.conditions(),C.remove.animating()},queue:function(e){C.debug("Queueing animation of",e),C.queuing=!0,w.one(b+".queue"+x,function(){C.queuing=!1,C.repaint(),C.animate.apply(this,m)})},complete:function(e){C.debug("Animation complete",m.animation),C.remove.completeCallback(),C.remove.failSafe(),C.is.looping()||(C.is.outward()?(C.verbose("Animation is outward, hiding element"),C.restore.conditions(),C.hide()):C.is.inward()?(C.verbose("Animation is outward, showing element"),C.restore.conditions(),C.show()):(C.verbose("Static animation completed"),C.restore.conditions(),m.onComplete.call(k)))},force:{visible:function(){var e=w.attr("style"),t=C.get.userStyle(),n=C.get.displayType(),o=t+"display: "+n+" !important;",a=w.css("display"),r=e===i||""===e;a!==n?(C.verbose("Overriding default display to show element",n),w.attr("style",o)):r&&w.removeAttr("style")},hidden:function(){var e=w.attr("style"),t=w.css("display"),n=e===i||""===e;"none"===t||C.is.hidden()?n&&w.removeAttr("style"):(C.verbose("Overriding default display to hide element"),w.css("display","none"))}},has:{direction:function(t){var n=!1;return t=t||m.animation,"string"==typeof t&&(t=t.split(" "),e.each(t,function(e,t){(t===h.inward||t===h.outward)&&(n=!0)})),n},inlineDisplay:function(){var t=w.attr("style")||"";return e.isArray(t.match(/display.*?;/,""))}},set:{animating:function(e){var t;C.remove.completeCallback(),e=e||m.animation,t=C.get.animationClass(e),C.save.animation(t),C.force.visible(),C.remove.hidden(),C.remove.direction(),C.start.animation(t)},duration:function(e,t){t=t||m.duration,t="number"==typeof t?t+"ms":t,(t||0===t)&&(C.verbose("Setting animation duration",t),w.css({"animation-duration":t}))},direction:function(e){e=e||C.get.direction(),e==h.inward?C.set.inward():C.set.outward()},looping:function(){C.debug("Transition set to loop"),w.addClass(h.looping)},hidden:function(){w.addClass(h.transition).addClass(h.hidden)},inward:function(){C.debug("Setting direction to inward"),w.removeClass(h.outward).addClass(h.inward)},outward:function(){C.debug("Setting direction to outward"),w.removeClass(h.inward).addClass(h.outward)},visible:function(){w.addClass(h.transition).addClass(h.visible)}},start:{animation:function(e){e=e||C.get.animationClass(),C.debug("Starting tween",e),w.addClass(e).one(b+".complete"+x,C.complete),m.useFailSafe&&C.add.failSafe(),C.set.duration(m.duration),m.onStart.call(k)}},save:{animation:function(e){C.cache||(C.cache={}),C.cache.animation=e},displayType:function(e){"none"!==e&&w.data(v.displayType,e)},transitionExists:function(t,n){e.fn.transition.exists[t]=n,C.verbose("Saving existence of transition",t,n)}},restore:{conditions:function(){var e=C.get.currentAnimation();e&&(w.removeClass(e),C.verbose("Removing animation class",C.cache)),C.remove.duration()}},add:{failSafe:function(){var e=C.get.duration();C.timer=setTimeout(function(){w.triggerHandler(b)},e+m.failSafeDelay),C.verbose("Adding fail safe timer",C.timer)}},remove:{animating:function(){w.removeClass(h.animating)},animationCallbacks:function(){C.remove.queueCallback(),C.remove.completeCallback()},queueCallback:function(){w.off(".queue"+x)},completeCallback:function(){w.off(".complete"+x)},display:function(){w.css("display","")},direction:function(){w.removeClass(h.inward).removeClass(h.outward)},duration:function(){w.css("animation-duration","")},failSafe:function(){C.verbose("Removing fail safe timer",C.timer),C.timer&&clearTimeout(C.timer)},hidden:function(){w.removeClass(h.hidden)},visible:function(){w.removeClass(h.visible)},looping:function(){C.debug("Transitions are no longer looping"),C.is.looping()&&(C.reset(),w.removeClass(h.looping))},transition:function(){w.removeClass(h.visible).removeClass(h.hidden)}},get:{settings:function(t,n,i){return"object"==typeof t?e.extend(!0,{},e.fn.transition.settings,t):"function"==typeof i?e.extend({},e.fn.transition.settings,{animation:t,onComplete:i,duration:n}):"string"==typeof n||"number"==typeof n?e.extend({},e.fn.transition.settings,{animation:t,duration:n}):"object"==typeof n?e.extend({},e.fn.transition.settings,n,{animation:t}):"function"==typeof n?e.extend({},e.fn.transition.settings,{animation:t,onComplete:n}):e.extend({},e.fn.transition.settings,{animation:t})},animationClass:function(e){var t=e||m.animation,n=C.can.transition()&&!C.has.direction()?C.get.direction()+" ":"";return h.animating+" "+h.transition+" "+n+t},currentAnimation:function(){return C.cache&&C.cache.animation!==i?C.cache.animation:!1},currentDirection:function(){return C.is.inward()?h.inward:h.outward},direction:function(){return C.is.hidden()||!C.is.visible()?h.inward:h.outward},animationDirection:function(t){var n;return t=t||m.animation,"string"==typeof t&&(t=t.split(" "),e.each(t,function(e,t){t===h.inward?n=h.inward:t===h.outward&&(n=h.outward)})),n?n:!1},duration:function(e){return e=e||m.duration,e===!1&&(e=w.css("animation-duration")||0),"string"==typeof e?e.indexOf("ms")>-1?parseFloat(e):1e3*parseFloat(e):e},displayType:function(){return m.displayType?m.displayType:(w.data(v.displayType)===i&&C.can.transition(!0),w.data(v.displayType))},userStyle:function(e){return e=e||w.attr("style")||"",e.replace(/display.*?;/,"")},transitionExists:function(t){return e.fn.transition.exists[t]},animationStartEvent:function(){var e,t=n.createElement("div"),o={animation:"animationstart",OAnimation:"oAnimationStart",MozAnimation:"mozAnimationStart",WebkitAnimation:"webkitAnimationStart"};for(e in o)if(t.style[e]!==i)return o[e];return!1},animationEndEvent:function(){var e,t=n.createElement("div"),o={animation:"animationend",OAnimation:"oAnimationEnd",MozAnimation:"mozAnimationEnd",WebkitAnimation:"webkitAnimationEnd"};for(e in o)if(t.style[e]!==i)return o[e];return!1}},can:{transition:function(t){var n,o,a,r,s,l,c,u=m.animation,d=C.get.transitionExists(u);if(d===i||t){if(C.verbose("Determining whether animation exists"),n=w.attr("class"),o=w.prop("tagName"),a=e("<"+o+" />").addClass(n).insertAfter(w),r=a.addClass(u).removeClass(h.inward).removeClass(h.outward).addClass(h.animating).addClass(h.transition).css("animationName"),s=a.addClass(h.inward).css("animationName"),c=a.attr("class",n).removeAttr("style").removeClass(h.hidden).removeClass(h.visible).show().css("display"),C.verbose("Determining final display state",c),C.save.displayType(c),a.remove(),r!=s)C.debug("Direction exists for animation",u),l=!0;else{if("none"==r||!r)return void C.debug("No animation defined in css",u);C.debug("Static animation found",u,c),l=!1}C.save.transitionExists(u,l)}return d!==i?d:l},animate:function(){return C.can.transition()!==i}},is:{animating:function(){return w.hasClass(h.animating)},inward:function(){return w.hasClass(h.inward)},outward:function(){return w.hasClass(h.outward)},looping:function(){return w.hasClass(h.looping)},occurring:function(e){return e=e||m.animation,e="."+e.replace(" ","."),w.filter(e).length>0},visible:function(){return w.is(":visible")},hidden:function(){return"hidden"===w.css("visibility")},supported:function(){return b!==!1}},hide:function(){C.verbose("Hiding element"),C.is.animating()&&C.reset(),k.blur(),C.remove.display(),C.remove.visible(),C.set.hidden(),C.force.hidden(),m.onHide.call(k),m.onComplete.call(k)},show:function(e){C.verbose("Showing element",e),C.remove.hidden(),C.set.visible(),C.force.visible(),m.onShow.call(k),m.onComplete.call(k)},toggle:function(){C.is.visible()?C.hide():C.show()},stop:function(){C.debug("Stopping current animation"),w.triggerHandler(b)},stopAll:function(){C.debug("Stopping all animation"),C.remove.queueCallback(),w.triggerHandler(b)},clear:{queue:function(){C.debug("Clearing animation queue"),C.remove.queueCallback()}},enable:function(){C.verbose("Starting animation"),w.removeClass(h.disabled)},disable:function(){C.debug("Stopping animation"),w.addClass(h.disabled)},setting:function(t,n){if(C.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,m,t);else{if(n===i)return m[t];e.isPlainObject(m[t])?e.extend(!0,m[t],n):m[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,C,t);else{if(n===i)return C[t];C[t]=n}},debug:function(){!m.silent&&m.debug&&(m.performance?C.performance.log(arguments):(C.debug=Function.prototype.bind.call(console.info,console,m.name+":"),C.debug.apply(console,arguments)))},verbose:function(){!m.silent&&m.verbose&&m.debug&&(m.performance?C.performance.log(arguments):(C.verbose=Function.prototype.bind.call(console.info,console,m.name+":"),C.verbose.apply(console,arguments)))},error:function(){m.silent||(C.error=Function.prototype.bind.call(console.error,console,m.name+":"),C.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;m.performance&&(t=(new Date).getTime(),i=s||t,n=t-i,s=t,l.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:k,"Execution Time":n})),clearTimeout(C.performance.timer),C.performance.timer=setTimeout(C.performance.display,500)},display:function(){var t=m.name+":",n=0;s=!1,clearTimeout(C.performance.timer),e.each(l,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",r&&(t+=" '"+r+"'"),a.length>1&&(t+=" ("+a.length+")"),(console.group!==i||console.table!==i)&&l.length>0&&(console.groupCollapsed(t),console.table?console.table(l):e.each(l,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),l=[]}},invoke:function(t,n,a){var r,s,l,c=g;return n=n||d,a=k||a,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):!1;c=c[o]}})),e.isFunction(s)?l=s.apply(a,n):s!==i&&(l=s),e.isArray(o)?o.push(l):o!==i?o=[o,l]:l!==i&&(o=l),s!==i?s:!1}},C.initialize()}),o!==i?o:this},e.fn.transition.exists={},e.fn.transition.settings={name:"Transition",silent:!1,debug:!1,verbose:!1,performance:!0,namespace:"transition",interval:0,reverse:"auto",onStart:function(){},onComplete:function(){},onShow:function(){},onHide:function(){},useFailSafe:!0,failSafeDelay:100,allowRepeats:!1,displayType:!1,animation:"fade",duration:!1,queue:!0,metadata:{displayType:"display"},className:{animating:"animating",disabled:"disabled",hidden:"hidden",inward:"in",loading:"loading",looping:"looping",outward:"out",transition:"transition",visible:"visible"},error:{noAnimation:"Element is no longer attached to DOM. Unable to animate. Use silent setting to surpress this warning in production.",repeated:"That animation is already occurring, cancelling repeated animation",method:"The method you called is not defined",support:"This browser does not support CSS animations"}}}(jQuery,window,document),function(e,t,n,i){"use strict";var t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();e.api=e.fn.api=function(n){var o,a=e(e.isFunction(this)?t:this),r=a.selector||"",s=(new Date).getTime(),l=[],c=arguments[0],u="string"==typeof c,d=[].slice.call(arguments,1);return a.each(function(){var a,f,m,g,p,h,v=e.isPlainObject(n)?e.extend(!0,{},e.fn.api.settings,n):e.extend({},e.fn.api.settings),b=v.namespace,y=v.metadata,x=v.selector,C=v.error,w=v.className,k="."+b,S="module-"+b,T=e(this),A=T.closest(x.form),R=v.stateContext?e(v.stateContext):T,P=this,E=R[0],F=T.data(S);h={initialize:function(){u||h.bind.events(),h.instantiate()},instantiate:function(){h.verbose("Storing instance of module",h),F=h,T.data(S,F)},destroy:function(){h.verbose("Destroying previous module for",P),T.removeData(S).off(k)},bind:{events:function(){var e=h.get.event();e?(h.verbose("Attaching API events to element",e),T.on(e+k,h.event.trigger)):"now"==v.on&&(h.debug("Querying API endpoint immediately"),h.query())}},decode:{json:function(e){if(e!==i&&"string"==typeof e)try{e=JSON.parse(e)}catch(t){}return e}},read:{cachedResponse:function(e){var n;return t.Storage===i?void h.error(C.noStorage):(n=sessionStorage.getItem(e),h.debug("Using cached response",e,n),n=h.decode.json(n))}},write:{cachedResponse:function(n,o){return o&&""===o?void h.debug("Response empty, not caching",o):t.Storage===i?void h.error(C.noStorage):(e.isPlainObject(o)&&(o=JSON.stringify(o)),sessionStorage.setItem(n,o),void h.verbose("Storing cached response for url",n,o))}},query:function(){if(h.is.disabled())return void h.debug("Element is disabled API request aborted");if(h.is.loading()){if(!v.interruptRequests)return void h.debug("Cancelling request, previous request is still pending");h.debug("Interrupting previous request"),h.abort()}return v.defaultData&&e.extend(!0,v.urlData,h.get.defaultData()),v.serializeForm&&(v.data=h.add.formData(v.data)),f=h.get.settings(),f===!1?(h.cancelled=!0,void h.error(C.beforeSend)):(h.cancelled=!1,m=h.get.templatedURL(),m||h.is.mocked()?(m=h.add.urlData(m),m||h.is.mocked()?(f.url=v.base+m,a=e.extend(!0,{},v,{type:v.method||v.type,data:g,url:v.base+m,beforeSend:v.beforeXHR,success:function(){},failure:function(){},complete:function(){}}),h.debug("Querying URL",a.url),h.verbose("Using AJAX settings",a),"local"===v.cache&&h.read.cachedResponse(m)?(h.debug("Response returned from local cache"),h.request=h.create.request(),void h.request.resolveWith(E,[h.read.cachedResponse(m)])):void(v.throttle?v.throttleFirstRequest||h.timer?(h.debug("Throttling request",v.throttle),clearTimeout(h.timer),h.timer=setTimeout(function(){h.timer&&delete h.timer,h.debug("Sending throttled request",g,a.method),h.send.request()},v.throttle)):(h.debug("Sending request",g,a.method),h.send.request(),h.timer=setTimeout(function(){},v.throttle)):(h.debug("Sending request",g,a.method),h.send.request()))):void 0):void h.error(C.missingURL))},should:{removeError:function(){return v.hideError===!0||"auto"===v.hideError&&!h.is.form()}},is:{disabled:function(){return T.filter(x.disabled).length>0},expectingJSON:function(){return"json"===v.dataType||"jsonp"===v.dataType},form:function(){return T.is("form")||R.is("form")},mocked:function(){return v.mockResponse||v.mockResponseAsync||v.response||v.responseAsync},input:function(){return T.is("input")},loading:function(){return h.request?"pending"==h.request.state():!1},abortedRequest:function(e){return e&&e.readyState!==i&&0===e.readyState?(h.verbose("XHR request determined to be aborted"),!0):(h.verbose("XHR request was not aborted"),!1)},validResponse:function(t){return h.is.expectingJSON()&&e.isFunction(v.successTest)?(h.debug("Checking JSON returned success",v.successTest,t),v.successTest(t)?(h.debug("Response passed success test",t),!0):(h.debug("Response failed success test",t),!1)):(h.verbose("Response is not JSON, skipping validation",v.successTest,t),!0)}},was:{cancelled:function(){return h.cancelled||!1},succesful:function(){return h.request&&"resolved"==h.request.state()},failure:function(){return h.request&&"rejected"==h.request.state()},complete:function(){return h.request&&("resolved"==h.request.state()||"rejected"==h.request.state())}},add:{urlData:function(t,n){var o,a;return t&&(o=t.match(v.regExp.required),a=t.match(v.regExp.optional),n=n||v.urlData,o&&(h.debug("Looking for required URL variables",o),e.each(o,function(o,a){var r=-1!==a.indexOf("$")?a.substr(2,a.length-3):a.substr(1,a.length-2),s=e.isPlainObject(n)&&n[r]!==i?n[r]:T.data(r)!==i?T.data(r):R.data(r)!==i?R.data(r):n[r];return s===i?(h.error(C.requiredParameter,r,t),t=!1,!1):(h.verbose("Found required variable",r,s),s=v.encodeParameters?h.get.urlEncodedValue(s):s,t=t.replace(a,s),void 0)})),a&&(h.debug("Looking for optional URL variables",o),e.each(a,function(o,a){var r=-1!==a.indexOf("$")?a.substr(3,a.length-4):a.substr(2,a.length-3),s=e.isPlainObject(n)&&n[r]!==i?n[r]:T.data(r)!==i?T.data(r):R.data(r)!==i?R.data(r):n[r];s!==i?(h.verbose("Optional variable Found",r,s),t=t.replace(a,s)):(h.verbose("Optional variable not found",r),t=-1!==t.indexOf("/"+a)?t.replace("/"+a,""):t.replace(a,""))}))),t},formData:function(t){var n,o=e.fn.serializeObject!==i,a=o?A.serializeObject():A.serialize();return t=t||v.data,n=e.isPlainObject(t),n?o?(h.debug("Extending existing data with form data",t,a),t=e.extend(!0,{},t,a)):(h.error(C.missingSerialize),h.debug("Cant extend data. Replacing data with form data",t,a),t=a):(h.debug("Adding form data",a),t=a),t}},send:{request:function(){h.set.loading(),h.request=h.create.request(),h.is.mocked()?h.mockedXHR=h.create.mockedXHR():h.xhr=h.create.xhr(),v.onRequest.call(E,h.request,h.xhr)}},event:{trigger:function(e){h.query(),("submit"==e.type||"click"==e.type)&&e.preventDefault()},xhr:{always:function(){},done:function(t,n,i){var o=this,a=(new Date).getTime()-p,r=v.loadingDuration-a,s=e.isFunction(v.onResponse)?h.is.expectingJSON()?v.onResponse.call(o,e.extend(!0,{},t)):v.onResponse.call(o,t):!1;r=r>0?r:0,s&&(h.debug("Modified API response in onResponse callback",v.onResponse,s,t),t=s),r>0&&h.debug("Response completed early delaying state change by",r),setTimeout(function(){h.is.validResponse(t)?h.request.resolveWith(o,[t,i]):h.request.rejectWith(o,[i,"invalid"])},r)},fail:function(e,t,n){var i=this,o=(new Date).getTime()-p,a=v.loadingDuration-o;a=a>0?a:0,a>0&&h.debug("Response completed early delaying state change by",a),setTimeout(function(){h.is.abortedRequest(e)?h.request.rejectWith(i,[e,"aborted",n]):h.request.rejectWith(i,[e,"error",t,n])},a)}},request:{done:function(e,t){h.debug("Successful API Response",e),"local"===v.cache&&m&&(h.write.cachedResponse(m,e),h.debug("Saving server response locally",h.cache)),v.onSuccess.call(E,e,T,t)},complete:function(e,t){var n,i;h.was.succesful()?(i=e,n=t):(n=e,i=h.get.responseFromXHR(n)),h.remove.loading(),v.onComplete.call(E,i,T,n)},fail:function(e,t,n){var o=h.get.responseFromXHR(e),r=h.get.errorFromRequest(o,t,n);return"aborted"==t?(h.debug("XHR Aborted (Most likely caused by page navigation or CORS Policy)",t,n),v.onAbort.call(E,t,T,e),!0):("invalid"==t?h.debug("JSON did not pass success test. A server-side error has most likely occurred",o):"error"==t&&e!==i&&(h.debug("XHR produced a server error",t,n),200!=e.status&&n!==i&&""!==n&&h.error(C.statusMessage+n,a.url),v.onError.call(E,r,T,e)),v.errorDuration&&"aborted"!==t&&(h.debug("Adding error state"),h.set.error(),h.should.removeError()&&setTimeout(h.remove.error,v.errorDuration)),h.debug("API Request failed",r,e),void v.onFailure.call(E,o,T,e))}}},create:{request:function(){return e.Deferred().always(h.event.request.complete).done(h.event.request.done).fail(h.event.request.fail)},mockedXHR:function(){var t,n,i,o=!1,a=!1,r=!1,s=v.mockResponse||v.response,l=v.mockResponseAsync||v.responseAsync;return i=e.Deferred().always(h.event.xhr.complete).done(h.event.xhr.done).fail(h.event.xhr.fail),s?(e.isFunction(s)?(h.debug("Using specified synchronous callback",s),n=s.call(E,f)):(h.debug("Using settings specified response",s),n=s),i.resolveWith(E,[n,o,{responseText:n}])):e.isFunction(l)&&(t=function(e){h.debug("Async callback returned response",e),e?i.resolveWith(E,[e,o,{responseText:e}]):i.rejectWith(E,[{responseText:e},a,r])},h.debug("Using specified async response callback",l),l.call(E,f,t)),i},xhr:function(){var t;return t=e.ajax(a).always(h.event.xhr.always).done(h.event.xhr.done).fail(h.event.xhr.fail),h.verbose("Created server request",t,a),t}},set:{error:function(){h.verbose("Adding error state to element",R),R.addClass(w.error)},loading:function(){h.verbose("Adding loading state to element",R),R.addClass(w.loading),p=(new Date).getTime()}},remove:{error:function(){h.verbose("Removing error state from element",R),R.removeClass(w.error)},loading:function(){h.verbose("Removing loading state from element",R),R.removeClass(w.loading)}},get:{responseFromXHR:function(t){return e.isPlainObject(t)?h.is.expectingJSON()?h.decode.json(t.responseText):t.responseText:!1},errorFromRequest:function(t,n,o){return e.isPlainObject(t)&&t.error!==i?t.error:v.error[n]!==i?v.error[n]:o},request:function(){return h.request||!1},xhr:function(){return h.xhr||!1},settings:function(){var t;return t=v.beforeSend.call(E,v),t&&(t.success!==i&&(h.debug("Legacy success callback detected",t),h.error(C.legacyParameters,t.success),t.onSuccess=t.success),t.failure!==i&&(h.debug("Legacy failure callback detected",t),h.error(C.legacyParameters,t.failure),t.onFailure=t.failure),t.complete!==i&&(h.debug("Legacy complete callback detected",t),h.error(C.legacyParameters,t.complete),t.onComplete=t.complete)),t===i&&h.error(C.noReturnedValue),t===!1?t:t!==i?e.extend(!0,{},t):e.extend(!0,{},v)},urlEncodedValue:function(e){var n=t.decodeURIComponent(e),i=t.encodeURIComponent(e),o=n!==e;return o?(h.debug("URL value is already encoded, avoiding double encoding",e),e):(h.verbose("Encoding value using encodeURIComponent",e,i),i)},defaultData:function(){var t={};return e.isWindow(P)||(h.is.input()?t.value=T.val():h.is.form()||(t.text=T.text())),t},event:function(){return e.isWindow(P)||"now"==v.on?(h.debug("API called without element, no events attached"),!1):"auto"==v.on?T.is("input")?P.oninput!==i?"input":P.onpropertychange!==i?"propertychange":"keyup":T.is("form")?"submit":"click":v.on},templatedURL:function(e){if(e=e||T.data(y.action)||v.action||!1,m=T.data(y.url)||v.url||!1)return h.debug("Using specified url",m),m;if(e){if(h.debug("Looking up url for action",e,v.api),v.api[e]===i&&!h.is.mocked())return void h.error(C.missingAction,v.action,v.api);m=v.api[e]}else h.is.form()&&(m=T.attr("action")||R.attr("action")||!1,h.debug("No url or action specified, defaulting to form action",m));return m}},abort:function(){var e=h.get.xhr();e&&"resolved"!==e.state()&&(h.debug("Cancelling API request"),e.abort())},reset:function(){h.remove.error(),h.remove.loading()},setting:function(t,n){if(h.debug("Changing setting",t,n),e.isPlainObject(t))e.extend(!0,v,t);else{if(n===i)return v[t];e.isPlainObject(v[t])?e.extend(!0,v[t],n):v[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,h,t);else{if(n===i)return h[t];h[t]=n}},debug:function(){!v.silent&&v.debug&&(v.performance?h.performance.log(arguments):(h.debug=Function.prototype.bind.call(console.info,console,v.name+":"),h.debug.apply(console,arguments)))},verbose:function(){!v.silent&&v.verbose&&v.debug&&(v.performance?h.performance.log(arguments):(h.verbose=Function.prototype.bind.call(console.info,console,v.name+":"),h.verbose.apply(console,arguments)))},error:function(){v.silent||(h.error=Function.prototype.bind.call(console.error,console,v.name+":"),h.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;v.performance&&(t=(new Date).getTime(),i=s||t,n=t-i,s=t,l.push({Name:e[0],Arguments:[].slice.call(e,1)||"","Execution Time":n})),clearTimeout(h.performance.timer),h.performance.timer=setTimeout(h.performance.display,500)},display:function(){var t=v.name+":",n=0;s=!1,clearTimeout(h.performance.timer),e.each(l,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",r&&(t+=" '"+r+"'"),(console.group!==i||console.table!==i)&&l.length>0&&(console.groupCollapsed(t),console.table?console.table(l):e.each(l,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),l=[]}},invoke:function(t,n,a){var r,s,l,c=F;return n=n||d,a=P||a,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):(h.error(C.method,t),!1);c=c[o]}})),e.isFunction(s)?l=s.apply(a,n):s!==i&&(l=s),e.isArray(o)?o.push(l):o!==i?o=[o,l]:l!==i&&(o=l),s}},u?(F===i&&h.initialize(),h.invoke(c)):(F!==i&&F.invoke("destroy"),h.initialize())}),o!==i?o:this},e.api.settings={name:"API",namespace:"api",debug:!1,verbose:!1,performance:!0,api:{},cache:!0,interruptRequests:!0,on:"auto",stateContext:!1,loadingDuration:0,hideError:"auto",errorDuration:2e3,encodeParameters:!0,action:!1,url:!1,base:"",urlData:{},defaultData:!0,serializeForm:!1,throttle:0,throttleFirstRequest:!0,method:"get",data:{},dataType:"json",mockResponse:!1,mockResponseAsync:!1,response:!1,responseAsync:!1,beforeSend:function(e){return e},beforeXHR:function(e){},onRequest:function(e,t){},onResponse:!1,onSuccess:function(e,t){},onComplete:function(e,t){},onFailure:function(e,t){},onError:function(e,t){},onAbort:function(e,t){},successTest:!1,error:{beforeSend:"The before send function has aborted the request",error:"There was an error with your request",exitConditions:"API Request Aborted. Exit conditions met",JSONParse:"JSON could not be parsed during error handling",legacyParameters:"You are using legacy API success callback names",method:"The method you called is not defined",missingAction:"API action used but no url was defined",missingSerialize:"jquery-serialize-object is required to add form data to an existing data object",missingURL:"No URL specified for api event",noReturnedValue:"The beforeSend callback must return a settings object, beforeSend ignored.",noStorage:"Caching responses locally requires session storage",parseError:"There was an error parsing your request",requiredParameter:"Missing a required URL parameter: ",statusMessage:"Server gave an error: ",timeout:"Your request timed out"},regExp:{required:/\{\$*[A-z0-9]+\}/g,optional:/\{\/\$*[A-z0-9]+\}/g},className:{loading:"loading",error:"error"},selector:{disabled:".disabled",form:"form"},metadata:{action:"action",url:"url"}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.state=function(t){var o,a=e(this),r=a.selector||"",s=("ontouchstart"in n.documentElement,(new Date).getTime()),l=[],c=arguments[0],u="string"==typeof c,d=[].slice.call(arguments,1);return a.each(function(){var n,f=e.isPlainObject(t)?e.extend(!0,{},e.fn.state.settings,t):e.extend({},e.fn.state.settings),m=f.error,g=f.metadata,p=f.className,h=f.namespace,v=f.states,b=f.text,y="."+h,x=h+"-module",C=e(this),w=this,k=C.data(x);n={initialize:function(){n.verbose("Initializing module"),f.automatic&&n.add.defaults(),f.context&&""!==r?e(f.context).on(r,"mouseenter"+y,n.change.text).on(r,"mouseleave"+y,n.reset.text).on(r,"click"+y,n.toggle.state):C.on("mouseenter"+y,n.change.text).on("mouseleave"+y,n.reset.text).on("click"+y,n.toggle.state),n.instantiate()},instantiate:function(){n.verbose("Storing instance of module",n),k=n,C.data(x,n)},destroy:function(){n.verbose("Destroying previous module",k),C.off(y).removeData(x)},refresh:function(){n.verbose("Refreshing selector cache"),C=e(w)},add:{defaults:function(){var o=t&&e.isPlainObject(t.states)?t.states:{};e.each(f.defaults,function(t,a){n.is[t]!==i&&n.is[t]()&&(n.verbose("Adding default states",t,w),e.extend(f.states,a,o))})}},is:{active:function(){return C.hasClass(p.active)},loading:function(){return C.hasClass(p.loading)},inactive:function(){return!C.hasClass(p.active)},state:function(e){return p[e]===i?!1:C.hasClass(p[e])},enabled:function(){return!C.is(f.filter.active)},disabled:function(){return C.is(f.filter.active)},textEnabled:function(){return!C.is(f.filter.text)},button:function(){return C.is(".button:not(a, .submit)")},input:function(){return C.is("input")},progress:function(){return C.is(".ui.progress")}},allow:function(e){n.debug("Now allowing state",e),v[e]=!0},disallow:function(e){n.debug("No longer allowing",e),v[e]=!1},allows:function(e){return v[e]||!1},enable:function(){C.removeClass(p.disabled)},disable:function(){C.addClass(p.disabled)},setState:function(e){n.allows(e)&&C.addClass(p[e])},removeState:function(e){n.allows(e)&&C.removeClass(p[e])},toggle:{state:function(){var t,o;if(n.allows("active")&&n.is.enabled()){if(n.refresh(),e.fn.api!==i)if(t=C.api("get request"),o=C.api("was cancelled"))n.debug("API Request cancelled by beforesend"),f.activateTest=function(){return!1},f.deactivateTest=function(){return!1};else if(t)return void n.listenTo(t);n.change.state()}}},listenTo:function(t){n.debug("API request detected, waiting for state signal",t),t&&(b.loading&&n.update.text(b.loading),e.when(t).then(function(){"resolved"==t.state()?(n.debug("API request succeeded"),f.activateTest=function(){return!0},f.deactivateTest=function(){return!0}):(n.debug("API request failed"),f.activateTest=function(){return!1},f.deactivateTest=function(){return!1}),n.change.state()}))},change:{state:function(){n.debug("Determining state change direction"),n.is.inactive()?n.activate():n.deactivate(),f.sync&&n.sync(),f.onChange.call(w)},text:function(){n.is.textEnabled()&&(n.is.disabled()?(n.verbose("Changing text to disabled text",b.hover),n.update.text(b.disabled)):n.is.active()?b.hover?(n.verbose("Changing text to hover text",b.hover),n.update.text(b.hover)):b.deactivate&&(n.verbose("Changing text to deactivating text",b.deactivate),n.update.text(b.deactivate)):b.hover?(n.verbose("Changing text to hover text",b.hover),n.update.text(b.hover)):b.activate&&(n.verbose("Changing text to activating text",b.activate),n.update.text(b.activate)))}},activate:function(){f.activateTest.call(w)&&(n.debug("Setting state to active"),C.addClass(p.active),n.update.text(b.active),f.onActivate.call(w))},deactivate:function(){f.deactivateTest.call(w)&&(n.debug("Setting state to inactive"),C.removeClass(p.active),n.update.text(b.inactive),f.onDeactivate.call(w))},sync:function(){n.verbose("Syncing other buttons to current state"),n.is.active()?a.not(C).state("activate"):a.not(C).state("deactivate")},get:{text:function(){return f.selector.text?C.find(f.selector.text).text():C.html()},textFor:function(e){return b[e]||!1}},flash:{text:function(e,t,i){var o=n.get.text();n.debug("Flashing text message",e,t),e=e||f.text.flash,t=t||f.flashDuration,i=i||function(){},n.update.text(e),setTimeout(function(){n.update.text(o),i.call(w)},t)}},reset:{text:function(){var e=b.active||C.data(g.storedText),t=b.inactive||C.data(g.storedText);n.is.textEnabled()&&(n.is.active()&&e?(n.verbose("Resetting active text",e),n.update.text(e)):t&&(n.verbose("Resetting inactive text",e),n.update.text(t)))}},update:{text:function(e){var t=n.get.text();e&&e!==t?(n.debug("Updating text",e),f.selector.text?C.data(g.storedText,e).find(f.selector.text).text(e):C.data(g.storedText,e).html(e)):n.debug("Text is already set, ignoring update",e); -}},setting:function(t,o){if(n.debug("Changing setting",t,o),e.isPlainObject(t))e.extend(!0,f,t);else{if(o===i)return f[t];e.isPlainObject(f[t])?e.extend(!0,f[t],o):f[t]=o}},internal:function(t,o){if(e.isPlainObject(t))e.extend(!0,n,t);else{if(o===i)return n[t];n[t]=o}},debug:function(){!f.silent&&f.debug&&(f.performance?n.performance.log(arguments):(n.debug=Function.prototype.bind.call(console.info,console,f.name+":"),n.debug.apply(console,arguments)))},verbose:function(){!f.silent&&f.verbose&&f.debug&&(f.performance?n.performance.log(arguments):(n.verbose=Function.prototype.bind.call(console.info,console,f.name+":"),n.verbose.apply(console,arguments)))},error:function(){f.silent||(n.error=Function.prototype.bind.call(console.error,console,f.name+":"),n.error.apply(console,arguments))},performance:{log:function(e){var t,i,o;f.performance&&(t=(new Date).getTime(),o=s||t,i=t-o,s=t,l.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:w,"Execution Time":i})),clearTimeout(n.performance.timer),n.performance.timer=setTimeout(n.performance.display,500)},display:function(){var t=f.name+":",o=0;s=!1,clearTimeout(n.performance.timer),e.each(l,function(e,t){o+=t["Execution Time"]}),t+=" "+o+"ms",r&&(t+=" '"+r+"'"),(console.group!==i||console.table!==i)&&l.length>0&&(console.groupCollapsed(t),console.table?console.table(l):e.each(l,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),l=[]}},invoke:function(t,a,r){var s,l,c,u=k;return a=a||d,r=w||r,"string"==typeof t&&u!==i&&(t=t.split(/[\. ]/),s=t.length-1,e.each(t,function(o,a){var r=o!=s?a+t[o+1].charAt(0).toUpperCase()+t[o+1].slice(1):t;if(e.isPlainObject(u[r])&&o!=s)u=u[r];else{if(u[r]!==i)return l=u[r],!1;if(!e.isPlainObject(u[a])||o==s)return u[a]!==i?(l=u[a],!1):(n.error(m.method,t),!1);u=u[a]}})),e.isFunction(l)?c=l.apply(r,a):l!==i&&(c=l),e.isArray(o)?o.push(c):o!==i?o=[o,c]:c!==i&&(o=c),l}},u?(k===i&&n.initialize(),n.invoke(c)):(k!==i&&k.invoke("destroy"),n.initialize())}),o!==i?o:this},e.fn.state.settings={name:"State",debug:!1,verbose:!1,namespace:"state",performance:!0,onActivate:function(){},onDeactivate:function(){},onChange:function(){},activateTest:function(){return!0},deactivateTest:function(){return!0},automatic:!0,sync:!1,flashDuration:1e3,filter:{text:".loading, .disabled",active:".disabled"},context:!1,error:{beforeSend:"The before send function has cancelled state change",method:"The method you called is not defined."},metadata:{promise:"promise",storedText:"stored-text"},className:{active:"active",disabled:"disabled",error:"error",loading:"loading",success:"success",warning:"warning"},selector:{text:!1},defaults:{input:{disabled:!0,loading:!0,active:!0},button:{disabled:!0,loading:!0,active:!0},progress:{active:!0,success:!0,warning:!0,error:!0}},states:{active:!0,disabled:!0,error:!0,loading:!0,success:!0,warning:!0},text:{disabled:!1,flash:!1,hover:!1,active:!1,inactive:!1,activate:!1,deactivate:!1}}}(jQuery,window,document),function(e,t,n,i){"use strict";t="undefined"!=typeof t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),e.fn.visibility=function(o){var a,r=e(this),s=r.selector||"",l=(new Date).getTime(),c=[],u=arguments[0],d="string"==typeof u,f=[].slice.call(arguments,1),m=r.length,g=0;return r.each(function(){var r,p,h,v,b=e.isPlainObject(o)?e.extend(!0,{},e.fn.visibility.settings,o):e.extend({},e.fn.visibility.settings),y=b.className,x=b.namespace,C=b.error,w=b.metadata,k="."+x,S="module-"+x,T=e(t),A=e(this),R=e(b.context),P=(A.selector||"",A.data(S)),E=t.requestAnimationFrame||t.mozRequestAnimationFrame||t.webkitRequestAnimationFrame||t.msRequestAnimationFrame||function(e){setTimeout(e,0)},F=this,O=!1;v={initialize:function(){v.debug("Initializing",b),v.setup.cache(),v.should.trackChanges()&&("image"==b.type&&v.setup.image(),"fixed"==b.type&&v.setup.fixed(),b.observeChanges&&v.observeChanges(),v.bind.events()),v.save.position(),v.is.visible()||v.error(C.visible,A),b.initialCheck&&v.checkVisibility(),v.instantiate()},instantiate:function(){v.debug("Storing instance",v),A.data(S,v),P=v},destroy:function(){v.verbose("Destroying previous module"),h&&h.disconnect(),p&&p.disconnect(),T.off("load"+k,v.event.load).off("resize"+k,v.event.resize),R.off("scroll"+k,v.event.scroll).off("scrollchange"+k,v.event.scrollchange),"fixed"==b.type&&(v.resetFixed(),v.remove.placeholder()),A.off(k).removeData(S)},observeChanges:function(){"MutationObserver"in t&&(p=new MutationObserver(v.event.contextChanged),h=new MutationObserver(v.event.changed),p.observe(n,{childList:!0,subtree:!0}),h.observe(F,{childList:!0,subtree:!0}),v.debug("Setting up mutation observer",h))},bind:{events:function(){v.verbose("Binding visibility events to scroll and resize"),b.refreshOnLoad&&T.on("load"+k,v.event.load),T.on("resize"+k,v.event.resize),R.off("scroll"+k).on("scroll"+k,v.event.scroll).on("scrollchange"+k,v.event.scrollchange)}},event:{changed:function(e){v.verbose("DOM tree modified, updating visibility calculations"),v.timer=setTimeout(function(){v.verbose("DOM tree modified, updating sticky menu"),v.refresh()},100)},contextChanged:function(t){[].forEach.call(t,function(t){t.removedNodes&&[].forEach.call(t.removedNodes,function(t){(t==F||e(t).find(F).length>0)&&(v.debug("Element removed from DOM, tearing down events"),v.destroy())})})},resize:function(){v.debug("Window resized"),b.refreshOnResize&&E(v.refresh)},load:function(){v.debug("Page finished loading"),E(v.refresh)},scroll:function(){b.throttle?(clearTimeout(v.timer),v.timer=setTimeout(function(){R.triggerHandler("scrollchange"+k,[R.scrollTop()])},b.throttle)):E(function(){R.triggerHandler("scrollchange"+k,[R.scrollTop()])})},scrollchange:function(e,t){v.checkVisibility(t)}},precache:function(t,i){t instanceof Array||(t=[t]);for(var o=t.length,a=0,r=[],s=n.createElement("img"),l=function(){a++,a>=t.length&&e.isFunction(i)&&i()};o--;)s=n.createElement("img"),s.onload=l,s.onerror=l,s.src=t[o],r.push(s)},enableCallbacks:function(){v.debug("Allowing callbacks to occur"),O=!1},disableCallbacks:function(){v.debug("Disabling all callbacks temporarily"),O=!0},should:{trackChanges:function(){return d?(v.debug("One time query, no need to bind events"),!1):(v.debug("Callbacks being attached"),!0)}},setup:{cache:function(){v.cache={occurred:{},screen:{},element:{}}},image:function(){var e=A.data(w.src);e&&(v.verbose("Lazy loading image",e),b.once=!0,b.observeChanges=!1,b.onOnScreen=function(){v.debug("Image on screen",F),v.precache(e,function(){v.set.image(e,function(){g++,g==m&&b.onAllLoaded.call(this),b.onLoad.call(this)})})})},fixed:function(){v.debug("Setting up fixed"),b.once=!1,b.observeChanges=!1,b.initialCheck=!0,b.refreshOnLoad=!0,o.transition||(b.transition=!1),v.create.placeholder(),v.debug("Added placeholder",r),b.onTopPassed=function(){v.debug("Element passed, adding fixed position",A),v.show.placeholder(),v.set.fixed(),b.transition&&e.fn.transition!==i&&A.transition(b.transition,b.duration)},b.onTopPassedReverse=function(){v.debug("Element returned to position, removing fixed",A),v.hide.placeholder(),v.remove.fixed()}}},create:{placeholder:function(){v.verbose("Creating fixed position placeholder"),r=A.clone(!1).css("display","none").addClass(y.placeholder).insertAfter(A)}},show:{placeholder:function(){v.verbose("Showing placeholder"),r.css("display","block").css("visibility","hidden")}},hide:{placeholder:function(){v.verbose("Hiding placeholder"),r.css("display","none").css("visibility","")}},set:{fixed:function(){v.verbose("Setting element to fixed position"),A.addClass(y.fixed).css({position:"fixed",top:b.offset+"px",left:"auto",zIndex:b.zIndex}),b.onFixed.call(F)},image:function(t,n){A.attr("src",t),b.transition?e.fn.transition!==i?A.transition(b.transition,b.duration,n):A.fadeIn(b.duration,n):A.show()}},is:{onScreen:function(){var e=v.get.elementCalculations();return e.onScreen},offScreen:function(){var e=v.get.elementCalculations();return e.offScreen},visible:function(){return v.cache&&v.cache.element?!(0===v.cache.element.width&&0===v.cache.element.offset.top):!1}},refresh:function(){v.debug("Refreshing constants (width/height)"),"fixed"==b.type&&v.resetFixed(),v.reset(),v.save.position(),b.checkOnRefresh&&v.checkVisibility(),b.onRefresh.call(F)},resetFixed:function(){v.remove.fixed(),v.remove.occurred()},reset:function(){v.verbose("Resetting all cached values"),e.isPlainObject(v.cache)&&(v.cache.screen={},v.cache.element={})},checkVisibility:function(e){v.verbose("Checking visibility of element",v.cache.element),!O&&v.is.visible()&&(v.save.scroll(e),v.save.calculations(),v.passed(),v.passingReverse(),v.topVisibleReverse(),v.bottomVisibleReverse(),v.topPassedReverse(),v.bottomPassedReverse(),v.onScreen(),v.offScreen(),v.passing(),v.topVisible(),v.bottomVisible(),v.topPassed(),v.bottomPassed(),b.onUpdate&&b.onUpdate.call(F,v.get.elementCalculations()))},passed:function(t,n){var o=v.get.elementCalculations();if(t&&n)b.onPassed[t]=n;else{if(t!==i)return v.get.pixelsPassed(t)>o.pixelsPassed;o.passing&&e.each(b.onPassed,function(e,t){o.bottomVisible||o.pixelsPassed>v.get.pixelsPassed(e)?v.execute(t,e):b.once||v.remove.occurred(t)})}},onScreen:function(e){var t=v.get.elementCalculations(),n=e||b.onOnScreen,o="onScreen";return e&&(v.debug("Adding callback for onScreen",e),b.onOnScreen=e),t.onScreen?v.execute(n,o):b.once||v.remove.occurred(o),e!==i?t.onOnScreen:void 0},offScreen:function(e){var t=v.get.elementCalculations(),n=e||b.onOffScreen,o="offScreen";return e&&(v.debug("Adding callback for offScreen",e),b.onOffScreen=e),t.offScreen?v.execute(n,o):b.once||v.remove.occurred(o),e!==i?t.onOffScreen:void 0},passing:function(e){var t=v.get.elementCalculations(),n=e||b.onPassing,o="passing";return e&&(v.debug("Adding callback for passing",e),b.onPassing=e),t.passing?v.execute(n,o):b.once||v.remove.occurred(o),e!==i?t.passing:void 0},topVisible:function(e){var t=v.get.elementCalculations(),n=e||b.onTopVisible,o="topVisible";return e&&(v.debug("Adding callback for top visible",e),b.onTopVisible=e),t.topVisible?v.execute(n,o):b.once||v.remove.occurred(o),e===i?t.topVisible:void 0},bottomVisible:function(e){var t=v.get.elementCalculations(),n=e||b.onBottomVisible,o="bottomVisible";return e&&(v.debug("Adding callback for bottom visible",e),b.onBottomVisible=e),t.bottomVisible?v.execute(n,o):b.once||v.remove.occurred(o),e===i?t.bottomVisible:void 0},topPassed:function(e){var t=v.get.elementCalculations(),n=e||b.onTopPassed,o="topPassed";return e&&(v.debug("Adding callback for top passed",e),b.onTopPassed=e),t.topPassed?v.execute(n,o):b.once||v.remove.occurred(o),e===i?t.topPassed:void 0},bottomPassed:function(e){var t=v.get.elementCalculations(),n=e||b.onBottomPassed,o="bottomPassed";return e&&(v.debug("Adding callback for bottom passed",e),b.onBottomPassed=e),t.bottomPassed?v.execute(n,o):b.once||v.remove.occurred(o),e===i?t.bottomPassed:void 0},passingReverse:function(e){var t=v.get.elementCalculations(),n=e||b.onPassingReverse,o="passingReverse";return e&&(v.debug("Adding callback for passing reverse",e),b.onPassingReverse=e),t.passing?b.once||v.remove.occurred(o):v.get.occurred("passing")&&v.execute(n,o),e!==i?!t.passing:void 0},topVisibleReverse:function(e){var t=v.get.elementCalculations(),n=e||b.onTopVisibleReverse,o="topVisibleReverse";return e&&(v.debug("Adding callback for top visible reverse",e),b.onTopVisibleReverse=e),t.topVisible?b.once||v.remove.occurred(o):v.get.occurred("topVisible")&&v.execute(n,o),e===i?!t.topVisible:void 0},bottomVisibleReverse:function(e){var t=v.get.elementCalculations(),n=e||b.onBottomVisibleReverse,o="bottomVisibleReverse";return e&&(v.debug("Adding callback for bottom visible reverse",e),b.onBottomVisibleReverse=e),t.bottomVisible?b.once||v.remove.occurred(o):v.get.occurred("bottomVisible")&&v.execute(n,o),e===i?!t.bottomVisible:void 0},topPassedReverse:function(e){var t=v.get.elementCalculations(),n=e||b.onTopPassedReverse,o="topPassedReverse";return e&&(v.debug("Adding callback for top passed reverse",e),b.onTopPassedReverse=e),t.topPassed?b.once||v.remove.occurred(o):v.get.occurred("topPassed")&&v.execute(n,o),e===i?!t.onTopPassed:void 0},bottomPassedReverse:function(e){var t=v.get.elementCalculations(),n=e||b.onBottomPassedReverse,o="bottomPassedReverse";return e&&(v.debug("Adding callback for bottom passed reverse",e),b.onBottomPassedReverse=e),t.bottomPassed?b.once||v.remove.occurred(o):v.get.occurred("bottomPassed")&&v.execute(n,o),e===i?!t.bottomPassed:void 0},execute:function(e,t){var n=v.get.elementCalculations(),i=v.get.screenCalculations();e=e||!1,e&&(b.continuous?(v.debug("Callback being called continuously",t,n),e.call(F,n,i)):v.get.occurred(t)||(v.debug("Conditions met",t,n),e.call(F,n,i))),v.save.occurred(t)},remove:{fixed:function(){v.debug("Removing fixed position"),A.removeClass(y.fixed).css({position:"",top:"",left:"",zIndex:""}),b.onUnfixed.call(F)},placeholder:function(){v.debug("Removing placeholder content"),r&&r.remove()},occurred:function(e){if(e){var t=v.cache.occurred;t[e]!==i&&t[e]===!0&&(v.debug("Callback can now be called again",e),v.cache.occurred[e]=!1)}else v.cache.occurred={}}},save:{calculations:function(){v.verbose("Saving all calculations necessary to determine positioning"),v.save.direction(),v.save.screenCalculations(),v.save.elementCalculations()},occurred:function(e){e&&(v.cache.occurred[e]===i||v.cache.occurred[e]!==!0)&&(v.verbose("Saving callback occurred",e),v.cache.occurred[e]=!0)},scroll:function(e){e=e+b.offset||R.scrollTop()+b.offset,v.cache.scroll=e},direction:function(){var e,t=v.get.scroll(),n=v.get.lastScroll();return e=t>n&&n?"down":n>t&&n?"up":"static",v.cache.direction=e,v.cache.direction},elementPosition:function(){var e=v.cache.element,t=v.get.screenSize();return v.verbose("Saving element position"),e.fits=e.height=t.top,t.topPassed=e.top>=t.top,t.bottomVisible=e.bottom>=t.bottom,t.bottomPassed=e.top>=t.bottom,t.pixelsPassed=0,t.percentagePassed=0,t.onScreen=t.topVisible&&!t.bottomPassed,t.passing=t.topPassed&&!t.bottomPassed,t.offScreen=!t.onScreen,t.passing&&(t.pixelsPassed=e.top-t.top,t.percentagePassed=(e.top-t.top)/t.height),v.cache.element=t,v.verbose("Updated element calculations",t),t},screenCalculations:function(){var e=v.get.scroll();return v.save.direction(),v.cache.screen.top=e,v.cache.screen.bottom=e+v.cache.screen.height,v.cache.screen},screenSize:function(){v.verbose("Saving window position"),v.cache.screen={height:R.height()}},position:function(){v.save.screenSize(),v.save.elementPosition()}},get:{pixelsPassed:function(e){var t=v.get.elementCalculations();return e.search("%")>-1?t.height*(parseInt(e,10)/100):parseInt(e,10)},occurred:function(e){return v.cache.occurred!==i?v.cache.occurred[e]||!1:!1},direction:function(){return v.cache.direction===i&&v.save.direction(),v.cache.direction},elementPosition:function(){return v.cache.element===i&&v.save.elementPosition(),v.cache.element},elementCalculations:function(){return v.cache.element===i&&v.save.elementCalculations(),v.cache.element},screenCalculations:function(){return v.cache.screen===i&&v.save.screenCalculations(),v.cache.screen},screenSize:function(){return v.cache.screen===i&&v.save.screenSize(),v.cache.screen},scroll:function(){return v.cache.scroll===i&&v.save.scroll(),v.cache.scroll},lastScroll:function(){return v.cache.screen===i?(v.debug("First scroll event, no last scroll could be found"),!1):v.cache.screen.top}},setting:function(t,n){if(e.isPlainObject(t))e.extend(!0,b,t);else{if(n===i)return b[t];b[t]=n}},internal:function(t,n){if(e.isPlainObject(t))e.extend(!0,v,t);else{if(n===i)return v[t];v[t]=n}},debug:function(){!b.silent&&b.debug&&(b.performance?v.performance.log(arguments):(v.debug=Function.prototype.bind.call(console.info,console,b.name+":"),v.debug.apply(console,arguments)))},verbose:function(){!b.silent&&b.verbose&&b.debug&&(b.performance?v.performance.log(arguments):(v.verbose=Function.prototype.bind.call(console.info,console,b.name+":"),v.verbose.apply(console,arguments)))},error:function(){b.silent||(v.error=Function.prototype.bind.call(console.error,console,b.name+":"),v.error.apply(console,arguments))},performance:{log:function(e){var t,n,i;b.performance&&(t=(new Date).getTime(),i=l||t,n=t-i,l=t,c.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:F,"Execution Time":n})),clearTimeout(v.performance.timer),v.performance.timer=setTimeout(v.performance.display,500)},display:function(){var t=b.name+":",n=0;l=!1,clearTimeout(v.performance.timer),e.each(c,function(e,t){n+=t["Execution Time"]}),t+=" "+n+"ms",s&&(t+=" '"+s+"'"),(console.group!==i||console.table!==i)&&c.length>0&&(console.groupCollapsed(t),console.table?console.table(c):e.each(c,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),c=[]}},invoke:function(t,n,o){var r,s,l,c=P;return n=n||f,o=F||o,"string"==typeof t&&c!==i&&(t=t.split(/[\. ]/),r=t.length-1,e.each(t,function(n,o){var a=n!=r?o+t[n+1].charAt(0).toUpperCase()+t[n+1].slice(1):t;if(e.isPlainObject(c[a])&&n!=r)c=c[a];else{if(c[a]!==i)return s=c[a],!1;if(!e.isPlainObject(c[o])||n==r)return c[o]!==i?(s=c[o],!1):(v.error(C.method,t),!1);c=c[o]}})),e.isFunction(s)?l=s.apply(o,n):s!==i&&(l=s),e.isArray(a)?a.push(l):a!==i?a=[a,l]:l!==i&&(a=l),s}},d?(P===i&&v.initialize(),P.save.scroll(),P.save.calculations(),v.invoke(u)):(P!==i&&P.invoke("destroy"),v.initialize())}),a!==i?a:this},e.fn.visibility.settings={name:"Visibility",namespace:"visibility",debug:!1,verbose:!1,performance:!0,observeChanges:!0,initialCheck:!0,refreshOnLoad:!0,refreshOnResize:!0,checkOnRefresh:!0,once:!0,continuous:!1,offset:0,includeMargin:!1,context:t,throttle:!1,type:!1,zIndex:"10",transition:"fade in",duration:1e3,onPassed:{},onOnScreen:!1,onOffScreen:!1,onPassing:!1,onTopVisible:!1,onBottomVisible:!1,onTopPassed:!1,onBottomPassed:!1,onPassingReverse:!1,onTopVisibleReverse:!1,onBottomVisibleReverse:!1,onTopPassedReverse:!1,onBottomPassedReverse:!1,onLoad:function(){},onAllLoaded:function(){},onFixed:function(){},onUnfixed:function(){},onUpdate:!1,onRefresh:function(){},metadata:{src:"src"},className:{fixed:"fixed",placeholder:"placeholder"},error:{method:"The method you called is not defined.",visible:"Element is hidden, you must call refresh after element becomes visible"}}}(jQuery,window,document); \ No newline at end of file diff --git a/public/less/_admin.less b/public/less/_admin.less index eab7b15..92efc38 100644 --- a/public/less/_admin.less +++ b/public/less/_admin.less @@ -45,12 +45,12 @@ margin: 0; dd { - margin-left: 240px; + margin-left: 275px; } dt { font-weight: bolder; float: left; - width: 250px; + width: 285px; clear: left; overflow: hidden; text-overflow: ellipsis; diff --git a/public/less/_base.less b/public/less/_base.less index e938f42..572cec8 100644 --- a/public/less/_base.less +++ b/public/less/_base.less @@ -122,6 +122,13 @@ pre, code { float: right; } + &.button, &.menu .item { + -moz-user-select: auto; + -ms-user-select: auto; + -webkit-user-select: auto; + user-select: auto; + } + &.container { &.fluid { &.padded { @@ -411,3 +418,63 @@ footer { background: inherit !important; padding: 0 !important; } + +.ui.menu.new-menu { + justify-content: center !important; + padding-top: 15px !important; + margin-top: -15px !important; + margin-bottom: 15px !important; + background-color: #FAFAFA !important; + border-width: 1px !important; +} + +@media only screen and (max-width: 1200px) { + .ui.menu.new-menu { + overflow-x: auto !important; + justify-content: left !important; + padding-bottom: 5px; + } + .ui.menu.new-menu::-webkit-scrollbar { + height: 8px; + display: none; + } + .ui.menu.new-menu:hover::-webkit-scrollbar { + display: block; + } + .ui.menu.new-menu::-webkit-scrollbar-track { + background: rgba(0,0,0,0.01); + } + .ui.menu.new-menu::-webkit-scrollbar-thumb { + background:rgba(0,0,0,0.2); + } + .ui.menu.new-menu:after { + position: absolute; + margin-top: -15px; + display: block; + background-image: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1) 100%); + content: ' '; + right: 0; + height: 53px; + z-index: 1000; + width: 60px; + clear: none; + visibility: visible; + } + .ui.menu.new-menu a.item:last-child { + padding-right: 30px !important; + } +} + +[v-cloak] { + display: none !important; +} + +.repos-search { + padding-bottom: 0 !important; +} + +.repos-filter { + margin-top: 0 !important; + border-bottom-width: 0 !important; + margin-bottom: 2px !important; +} \ No newline at end of file diff --git a/public/less/_editor.less b/public/less/_editor.less index 25347bd..10d6c35 100644 --- a/public/less/_editor.less +++ b/public/less/_editor.less @@ -7,4 +7,15 @@ .cm-comment { background: inherit !important; } -} \ No newline at end of file +} +.repository.file.editor .tab[data-tab="write"] { + padding: 0 !important; +} +.repository.file.editor .tab[data-tab="write"] .editor-toolbar { + border: none !important; +} +.repository.file.editor .tab[data-tab="write"] .CodeMirror { + border-left: none; + border-right: none; + border-bottom: none; +} diff --git a/public/less/_explore.less b/public/less/_explore.less index 41426e4..d44d637 100644 --- a/public/less/_explore.less +++ b/public/less/_explore.less @@ -3,6 +3,13 @@ padding-bottom: @footer-margin * 2; .navbar { + justify-content: center; + padding-top: 15px !important; + margin-top: -15px !important; + margin-bottom: 15px !important; + background-color: #FAFAFA !important; + border-width: 1px !important; + .octicon { width: 16px; text-align: center; @@ -72,4 +79,4 @@ } } } -} \ No newline at end of file +} diff --git a/public/less/_form.less b/public/less/_form.less index 1fe48d9..5a6810e 100644 --- a/public/less/_form.less +++ b/public/less/_form.less @@ -46,6 +46,30 @@ } } +.signin { + .oauth2{ + div { + display: inline-block; + p { + margin: 10px 5px 0 0; + float: left; + } + } + a { + margin-right: 3px; + &:last-child { + margin-right: 0px; + } + } + img { + width: 32px; + height: 32px; + &.openidConnect { + width: auto; + } + } + } +} .user.activate, .user.forgot.password, .user.reset.password, @@ -85,7 +109,7 @@ .header { padding-left: 0 !important; text-align: center; - } + } } } @@ -116,3 +140,9 @@ } } } + +.githook { + textarea { + font-family: monospace; + } +} diff --git a/public/less/_repository.less b/public/less/_repository.less index fcf6efd..170eb4f 100644 --- a/public/less/_repository.less +++ b/public/less/_repository.less @@ -36,6 +36,12 @@ } } + .tabs { + .navbar { + justify-content: initial; + } + } + .navbar { display: flex; justify-content: space-between; @@ -127,7 +133,6 @@ } #clone-panel { - margin-top: -8px; margin-left: 5px; width: 350px; @@ -161,9 +166,15 @@ font-size: 1.4em; } } + + .repo-path { + .section, .divider { + display: inline; + } + } + #file-buttons { font-weight: normal; - margin-top: -3px; .ui.button { padding: 8px 10px; font-weight: normal; @@ -204,6 +215,9 @@ padding-top: 8px; padding-bottom: 8px; } + td.message .isSigned { + cursor: default; + } tr:hover { background-color: #ffffEE; } @@ -272,6 +286,10 @@ color: #999; background: #f5f5f5; width: 1%; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; span { line-height: 20px; @@ -290,7 +308,7 @@ margin: 0; padding: 0 !important; li { - display: inline-block; + display: block; width: 100%; &.active { background: #ffffdd; @@ -800,15 +818,39 @@ padding-left: 15px; } .sha { - font-size: 13px; - padding: 6px 40px 4px 35px; + text-align: center; + width: 140px; } } + td.sha .sha.label { + margin: 0; + } &.ui.basic.striped.table tbody tr:nth-child(2n) { background-color: rgba(0, 0, 0, .02)!important; } } + #commits-table td.sha .sha.label, #repo-files-table .sha.label{ + &.isSigned{ + border: 1px solid #BBB; + .detail.icon{ + background: #FAFAFA; + margin: -6px -10px -4px 0px; + padding: 5px 3px 5px 6px; + border-left: 1px solid #BBB; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + &.isSigned.isVerified{ + border: 1px solid #21BA45; + background: #21BA4518; + .detail.icon{ + border-left: 1px solid #21BA4580; + } + } + } + .diff-detail-box { margin: 15px 0; line-height: 30px; @@ -877,6 +919,10 @@ color: #A7A7A7; background: #fafafa; width: 1%; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; span.fold { display: block; @@ -1153,7 +1199,7 @@ .ui.sub.header { text-transform: none; } - .markdown { + >.markdown { padding: 15px 30px; h1, h2, h3, h4, h5, h6 { @@ -1206,6 +1252,18 @@ } } } + .ui.attached.isSigned.isVerified{ + &:not(.positive){ + border-left: 1px solid #A3C293; + border-right: 1px solid #A3C293; + } + &.top:not(.positive){ + border-top: 1px solid #A3C293; + } + &:not(.positive):last-child { + border-bottom: 1px solid #A3C293; + } + } } // End of .repository @@ -1261,6 +1319,10 @@ } } +.issue-actions { + display: none; +} + .issue.list { list-style: none; padding-top: 15px; @@ -1323,81 +1385,48 @@ box-shadow: 0 1px 2px 0 rgba(34,36,38,.15); } } - .key.list { - .item:not(:first-child) { - border-top: 1px solid #eaeaea; - } - .ssh-key-state-indicator { - float: left; - color: gray; - padding-left: 10px; - padding-top: 10px; - &.active { - color: #6cc644; + .list { + > .item { + .green { + color: #21BA45 !important; } - } - .meta { - padding-top: 5px; - } - .print { - color: #767676; - } - .activity { - color: #666; - } - } - .hook.list { - > .item:not(:first-child) { - border-top: 1px solid #eaeaea; - } - .item { - padding: 10px 20px; - .octicon, - .fa { - width: 20px; - text-align: center; + &:not(:first-child) { + border-top: 1px solid #eaeaea; + padding:1rem; + margin: 15px -1rem -1rem -1rem; } - a { - .dont-break-out; + > .mega-octicon { + display: table-cell; } - } - } - .hook.history.list { - .item { - padding-left: 13px; - .meta { - .ui.right { - margin-top: 5px; - .time { - font-size: 12px; - } - } + > .mega-octicon + .content { + display: table-cell; + padding: 0 0 0 .5em; + vertical-align: top; } .info { margin-top: 10px; - .tabular.menu { - .item { - font-weight: 500; - } - } .tab.segment { border: none; - padding: 0; - padding-top: 10px; - box-shadow: none; - > * { - color: #666; - } - pre { - word-wrap: break-word; - .hljs { - padding: 0; - background-color: inherit; - } - } + padding: 10px 0 0; } } } + &.key{ + .meta { + padding-top: 5px; + color: #666; + } + } + &.email { + > .item:not(:first-child) { + min-height: 60px; + } + } + &.collaborator { + > .item { + padding: 0; + } + } } } diff --git a/public/less/_user.less b/public/less/_user.less index 5411c1d..a3e6852 100644 --- a/public/less/_user.less +++ b/public/less/_user.less @@ -4,23 +4,6 @@ padding-bottom: @footer-margin * 2; } - &.settings { - .list { - .item.ui.grid { - margin-top: 15px; - } - } - .email.list { - .item:not(:first-child) { - border-top: 1px solid #eaeaea; - height: 50px; - .button { - margin-top: -10px; - } - } - } - } - &.profile { .ui.card { .username { @@ -114,4 +97,8 @@ } } } + &.link-account:not(.icon) { + padding-top: 15px; + padding-bottom: 5px; + } } diff --git a/public/plugins/codemirror-5.17.0/.gitattributes b/public/plugins/codemirror-5.17.0/.gitattributes deleted file mode 100644 index f8bdd60..0000000 --- a/public/plugins/codemirror-5.17.0/.gitattributes +++ /dev/null @@ -1,8 +0,0 @@ -*.txt text -*.js text -*.html text -*.md text -*.json text -*.yml text -*.css text -*.svg text diff --git a/public/plugins/codemirror-5.17.0/.gitignore b/public/plugins/codemirror-5.17.0/.gitignore deleted file mode 100644 index f91c241..0000000 --- a/public/plugins/codemirror-5.17.0/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/node_modules -/npm-debug.log -/test*.html -.tern-* -*~ -*.swp -.idea -*.iml diff --git a/public/plugins/codemirror-5.17.0/.npmignore b/public/plugins/codemirror-5.17.0/.npmignore deleted file mode 100644 index 5ed053f..0000000 --- a/public/plugins/codemirror-5.17.0/.npmignore +++ /dev/null @@ -1,10 +0,0 @@ -/node_modules -/demo -/doc -/test -/test*.html -/index.html -/mode/*/*test.js -/mode/*/*.html -/mode/index.html -.* diff --git a/public/plugins/codemirror-5.17.0/.travis.yml b/public/plugins/codemirror-5.17.0/.travis.yml deleted file mode 100644 index 52b8b81..0000000 --- a/public/plugins/codemirror-5.17.0/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - stable -sudo: false diff --git a/public/plugins/codemirror-5.17.0/addon/mode/loadmode.js b/public/plugins/codemirror-5.17.0/addon/mode/loadmode.js deleted file mode 100644 index 10117ec..0000000 --- a/public/plugins/codemirror-5.17.0/addon/mode/loadmode.js +++ /dev/null @@ -1,64 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), "cjs"); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], function(CM) { mod(CM, "amd"); }); - else // Plain browser env - mod(CodeMirror, "plain"); -})(function(CodeMirror, env) { - if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js"; - - var loading = {}; - function splitCallback(cont, n) { - var countDown = n; - return function() { if (--countDown == 0) cont(); }; - } - function ensureDeps(mode, cont) { - var deps = CodeMirror.modes[mode].dependencies; - if (!deps) return cont(); - var missing = []; - for (var i = 0; i < deps.length; ++i) { - if (!CodeMirror.modes.hasOwnProperty(deps[i])) - missing.push(deps[i]); - } - if (!missing.length) return cont(); - var split = splitCallback(cont, missing.length); - for (var i = 0; i < missing.length; ++i) - CodeMirror.requireMode(missing[i], split); - } - - CodeMirror.requireMode = function(mode, cont) { - if (typeof mode != "string") mode = mode.name; - if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); - if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); - - var file = CodeMirror.modeURL.replace(/%N/g, mode); - if (env == "plain") { - var script = document.createElement("script"); - script.src = file; - var others = document.getElementsByTagName("script")[0]; - var list = loading[mode] = [cont]; - CodeMirror.on(script, "load", function() { - ensureDeps(mode, function() { - for (var i = 0; i < list.length; ++i) list[i](); - }); - }); - others.parentNode.insertBefore(script, others); - } else if (env == "cjs") { - require(file); - cont(); - } else if (env == "amd") { - requirejs([file], cont); - } - }; - - CodeMirror.autoLoadMode = function(instance, mode) { - if (!CodeMirror.modes.hasOwnProperty(mode)) - CodeMirror.requireMode(mode, function() { - instance.setOption("mode", instance.getOption("mode")); - }); - }; -}); diff --git a/public/plugins/codemirror-5.17.0/addon/mode/multiplex.js b/public/plugins/codemirror-5.17.0/addon/mode/multiplex.js deleted file mode 100644 index 3d8b34c..0000000 --- a/public/plugins/codemirror-5.17.0/addon/mode/multiplex.js +++ /dev/null @@ -1,123 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.multiplexingMode = function(outer /*, others */) { - // Others should be {open, close, mode [, delimStyle] [, innerStyle]} objects - var others = Array.prototype.slice.call(arguments, 1); - - function indexOf(string, pattern, from, returnEnd) { - if (typeof pattern == "string") { - var found = string.indexOf(pattern, from); - return returnEnd && found > -1 ? found + pattern.length : found; - } - var m = pattern.exec(from ? string.slice(from) : string); - return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1; - } - - return { - startState: function() { - return { - outer: CodeMirror.startState(outer), - innerActive: null, - inner: null - }; - }, - - copyState: function(state) { - return { - outer: CodeMirror.copyState(outer, state.outer), - innerActive: state.innerActive, - inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner) - }; - }, - - token: function(stream, state) { - if (!state.innerActive) { - var cutOff = Infinity, oldContent = stream.string; - for (var i = 0; i < others.length; ++i) { - var other = others[i]; - var found = indexOf(oldContent, other.open, stream.pos); - if (found == stream.pos) { - if (!other.parseDelimiters) stream.match(other.open); - state.innerActive = other; - state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0); - return other.delimStyle && (other.delimStyle + " " + other.delimStyle + "-open"); - } else if (found != -1 && found < cutOff) { - cutOff = found; - } - } - if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff); - var outerToken = outer.token(stream, state.outer); - if (cutOff != Infinity) stream.string = oldContent; - return outerToken; - } else { - var curInner = state.innerActive, oldContent = stream.string; - if (!curInner.close && stream.sol()) { - state.innerActive = state.inner = null; - return this.token(stream, state); - } - var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1; - if (found == stream.pos && !curInner.parseDelimiters) { - stream.match(curInner.close); - state.innerActive = state.inner = null; - return curInner.delimStyle && (curInner.delimStyle + " " + curInner.delimStyle + "-close"); - } - if (found > -1) stream.string = oldContent.slice(0, found); - var innerToken = curInner.mode.token(stream, state.inner); - if (found > -1) stream.string = oldContent; - - if (found == stream.pos && curInner.parseDelimiters) - state.innerActive = state.inner = null; - - if (curInner.innerStyle) { - if (innerToken) innerToken = innerToken + " " + curInner.innerStyle; - else innerToken = curInner.innerStyle; - } - - return innerToken; - } - }, - - indent: function(state, textAfter) { - var mode = state.innerActive ? state.innerActive.mode : outer; - if (!mode.indent) return CodeMirror.Pass; - return mode.indent(state.innerActive ? state.inner : state.outer, textAfter); - }, - - blankLine: function(state) { - var mode = state.innerActive ? state.innerActive.mode : outer; - if (mode.blankLine) { - mode.blankLine(state.innerActive ? state.inner : state.outer); - } - if (!state.innerActive) { - for (var i = 0; i < others.length; ++i) { - var other = others[i]; - if (other.open === "\n") { - state.innerActive = other; - state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0); - } - } - } else if (state.innerActive.close === "\n") { - state.innerActive = state.inner = null; - } - }, - - electricChars: outer.electricChars, - - innerMode: function(state) { - return state.inner ? {state: state.inner, mode: state.innerActive.mode} : {state: state.outer, mode: outer}; - } - }; -}; - -}); diff --git a/public/plugins/codemirror-5.17.0/addon/mode/multiplex_test.js b/public/plugins/codemirror-5.17.0/addon/mode/multiplex_test.js deleted file mode 100644 index 24e5e67..0000000 --- a/public/plugins/codemirror-5.17.0/addon/mode/multiplex_test.js +++ /dev/null @@ -1,33 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - CodeMirror.defineMode("markdown_with_stex", function(){ - var inner = CodeMirror.getMode({}, "stex"); - var outer = CodeMirror.getMode({}, "markdown"); - - var innerOptions = { - open: '$', - close: '$', - mode: inner, - delimStyle: 'delim', - innerStyle: 'inner' - }; - - return CodeMirror.multiplexingMode(outer, innerOptions); - }); - - var mode = CodeMirror.getMode({}, "markdown_with_stex"); - - function MT(name) { - test.mode( - name, - mode, - Array.prototype.slice.call(arguments, 1), - 'multiplexing'); - } - - MT( - "stexInsideMarkdown", - "[strong **Equation:**] [delim&delim-open $][inner&tag \\pi][delim&delim-close $]"); -})(); diff --git a/public/plugins/codemirror-5.17.0/addon/mode/overlay.js b/public/plugins/codemirror-5.17.0/addon/mode/overlay.js deleted file mode 100644 index e1b9ed3..0000000 --- a/public/plugins/codemirror-5.17.0/addon/mode/overlay.js +++ /dev/null @@ -1,85 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Utility function that allows modes to be combined. The mode given -// as the base argument takes care of most of the normal mode -// functionality, but a second (typically simple) mode is used, which -// can override the style of text. Both modes get to parse all of the -// text, but when both assign a non-null style to a piece of code, the -// overlay wins, unless the combine argument was true and not overridden, -// or state.overlay.combineTokens was true, in which case the styles are -// combined. - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.overlayMode = function(base, overlay, combine) { - return { - startState: function() { - return { - base: CodeMirror.startState(base), - overlay: CodeMirror.startState(overlay), - basePos: 0, baseCur: null, - overlayPos: 0, overlayCur: null, - streamSeen: null - }; - }, - copyState: function(state) { - return { - base: CodeMirror.copyState(base, state.base), - overlay: CodeMirror.copyState(overlay, state.overlay), - basePos: state.basePos, baseCur: null, - overlayPos: state.overlayPos, overlayCur: null - }; - }, - - token: function(stream, state) { - if (stream != state.streamSeen || - Math.min(state.basePos, state.overlayPos) < stream.start) { - state.streamSeen = stream; - state.basePos = state.overlayPos = stream.start; - } - - if (stream.start == state.basePos) { - state.baseCur = base.token(stream, state.base); - state.basePos = stream.pos; - } - if (stream.start == state.overlayPos) { - stream.pos = stream.start; - state.overlayCur = overlay.token(stream, state.overlay); - state.overlayPos = stream.pos; - } - stream.pos = Math.min(state.basePos, state.overlayPos); - - // state.overlay.combineTokens always takes precedence over combine, - // unless set to null - if (state.overlayCur == null) return state.baseCur; - else if (state.baseCur != null && - state.overlay.combineTokens || - combine && state.overlay.combineTokens == null) - return state.baseCur + " " + state.overlayCur; - else return state.overlayCur; - }, - - indent: base.indent && function(state, textAfter) { - return base.indent(state.base, textAfter); - }, - electricChars: base.electricChars, - - innerMode: function(state) { return {state: state.base, mode: base}; }, - - blankLine: function(state) { - if (base.blankLine) base.blankLine(state.base); - if (overlay.blankLine) overlay.blankLine(state.overlay); - } - }; -}; - -}); diff --git a/public/plugins/codemirror-5.17.0/addon/mode/simple.js b/public/plugins/codemirror-5.17.0/addon/mode/simple.js deleted file mode 100644 index df66336..0000000 --- a/public/plugins/codemirror-5.17.0/addon/mode/simple.js +++ /dev/null @@ -1,213 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineSimpleMode = function(name, states) { - CodeMirror.defineMode(name, function(config) { - return CodeMirror.simpleMode(config, states); - }); - }; - - CodeMirror.simpleMode = function(config, states) { - ensureState(states, "start"); - var states_ = {}, meta = states.meta || {}, hasIndentation = false; - for (var state in states) if (state != meta && states.hasOwnProperty(state)) { - var list = states_[state] = [], orig = states[state]; - for (var i = 0; i < orig.length; i++) { - var data = orig[i]; - list.push(new Rule(data, states)); - if (data.indent || data.dedent) hasIndentation = true; - } - } - var mode = { - startState: function() { - return {state: "start", pending: null, - local: null, localState: null, - indent: hasIndentation ? [] : null}; - }, - copyState: function(state) { - var s = {state: state.state, pending: state.pending, - local: state.local, localState: null, - indent: state.indent && state.indent.slice(0)}; - if (state.localState) - s.localState = CodeMirror.copyState(state.local.mode, state.localState); - if (state.stack) - s.stack = state.stack.slice(0); - for (var pers = state.persistentStates; pers; pers = pers.next) - s.persistentStates = {mode: pers.mode, - spec: pers.spec, - state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state), - next: s.persistentStates}; - return s; - }, - token: tokenFunction(states_, config), - innerMode: function(state) { return state.local && {mode: state.local.mode, state: state.localState}; }, - indent: indentFunction(states_, meta) - }; - if (meta) for (var prop in meta) if (meta.hasOwnProperty(prop)) - mode[prop] = meta[prop]; - return mode; - }; - - function ensureState(states, name) { - if (!states.hasOwnProperty(name)) - throw new Error("Undefined state " + name + " in simple mode"); - } - - function toRegex(val, caret) { - if (!val) return /(?:)/; - var flags = ""; - if (val instanceof RegExp) { - if (val.ignoreCase) flags = "i"; - val = val.source; - } else { - val = String(val); - } - return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags); - } - - function asToken(val) { - if (!val) return null; - if (typeof val == "string") return val.replace(/\./g, " "); - var result = []; - for (var i = 0; i < val.length; i++) - result.push(val[i] && val[i].replace(/\./g, " ")); - return result; - } - - function Rule(data, states) { - if (data.next || data.push) ensureState(states, data.next || data.push); - this.regex = toRegex(data.regex); - this.token = asToken(data.token); - this.data = data; - } - - function tokenFunction(states, config) { - return function(stream, state) { - if (state.pending) { - var pend = state.pending.shift(); - if (state.pending.length == 0) state.pending = null; - stream.pos += pend.text.length; - return pend.token; - } - - if (state.local) { - if (state.local.end && stream.match(state.local.end)) { - var tok = state.local.endToken || null; - state.local = state.localState = null; - return tok; - } else { - var tok = state.local.mode.token(stream, state.localState), m; - if (state.local.endScan && (m = state.local.endScan.exec(stream.current()))) - stream.pos = stream.start + m.index; - return tok; - } - } - - var curState = states[state.state]; - for (var i = 0; i < curState.length; i++) { - var rule = curState[i]; - var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex); - if (matches) { - if (rule.data.next) { - state.state = rule.data.next; - } else if (rule.data.push) { - (state.stack || (state.stack = [])).push(state.state); - state.state = rule.data.push; - } else if (rule.data.pop && state.stack && state.stack.length) { - state.state = state.stack.pop(); - } - - if (rule.data.mode) - enterLocalMode(config, state, rule.data.mode, rule.token); - if (rule.data.indent) - state.indent.push(stream.indentation() + config.indentUnit); - if (rule.data.dedent) - state.indent.pop(); - if (matches.length > 2) { - state.pending = []; - for (var j = 2; j < matches.length; j++) - if (matches[j]) - state.pending.push({text: matches[j], token: rule.token[j - 1]}); - stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0)); - return rule.token[0]; - } else if (rule.token && rule.token.join) { - return rule.token[0]; - } else { - return rule.token; - } - } - } - stream.next(); - return null; - }; - } - - function cmp(a, b) { - if (a === b) return true; - if (!a || typeof a != "object" || !b || typeof b != "object") return false; - var props = 0; - for (var prop in a) if (a.hasOwnProperty(prop)) { - if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false; - props++; - } - for (var prop in b) if (b.hasOwnProperty(prop)) props--; - return props == 0; - } - - function enterLocalMode(config, state, spec, token) { - var pers; - if (spec.persistent) for (var p = state.persistentStates; p && !pers; p = p.next) - if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p; - var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec); - var lState = pers ? pers.state : CodeMirror.startState(mode); - if (spec.persistent && !pers) - state.persistentStates = {mode: mode, spec: spec.spec, state: lState, next: state.persistentStates}; - - state.localState = lState; - state.local = {mode: mode, - end: spec.end && toRegex(spec.end), - endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false), - endToken: token && token.join ? token[token.length - 1] : token}; - } - - function indexOf(val, arr) { - for (var i = 0; i < arr.length; i++) if (arr[i] === val) return true; - } - - function indentFunction(states, meta) { - return function(state, textAfter, line) { - if (state.local && state.local.mode.indent) - return state.local.mode.indent(state.localState, textAfter, line); - if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1) - return CodeMirror.Pass; - - var pos = state.indent.length - 1, rules = states[state.state]; - scan: for (;;) { - for (var i = 0; i < rules.length; i++) { - var rule = rules[i]; - if (rule.data.dedent && rule.data.dedentIfLineStart !== false) { - var m = rule.regex.exec(textAfter); - if (m && m[0]) { - pos--; - if (rule.next || rule.push) rules = states[rule.next || rule.push]; - textAfter = textAfter.slice(m[0].length); - continue scan; - } - } - } - break; - } - return pos < 0 ? 0 : state.indent[pos]; - }; - } -}); diff --git a/public/plugins/codemirror-5.17.0/mode/apl/apl.js b/public/plugins/codemirror-5.17.0/mode/apl/apl.js deleted file mode 100644 index caafe4e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/apl/apl.js +++ /dev/null @@ -1,174 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("apl", function() { - var builtInOps = { - ".": "innerProduct", - "\\": "scan", - "/": "reduce", - "⌿": "reduce1Axis", - "⍀": "scan1Axis", - "¨": "each", - "⍣": "power" - }; - var builtInFuncs = { - "+": ["conjugate", "add"], - "−": ["negate", "subtract"], - "×": ["signOf", "multiply"], - "÷": ["reciprocal", "divide"], - "⌈": ["ceiling", "greaterOf"], - "⌊": ["floor", "lesserOf"], - "∣": ["absolute", "residue"], - "⍳": ["indexGenerate", "indexOf"], - "?": ["roll", "deal"], - "⋆": ["exponentiate", "toThePowerOf"], - "⍟": ["naturalLog", "logToTheBase"], - "○": ["piTimes", "circularFuncs"], - "!": ["factorial", "binomial"], - "⌹": ["matrixInverse", "matrixDivide"], - "<": [null, "lessThan"], - "≤": [null, "lessThanOrEqual"], - "=": [null, "equals"], - ">": [null, "greaterThan"], - "≥": [null, "greaterThanOrEqual"], - "≠": [null, "notEqual"], - "≡": ["depth", "match"], - "≢": [null, "notMatch"], - "∈": ["enlist", "membership"], - "⍷": [null, "find"], - "∪": ["unique", "union"], - "∩": [null, "intersection"], - "∼": ["not", "without"], - "∨": [null, "or"], - "∧": [null, "and"], - "⍱": [null, "nor"], - "⍲": [null, "nand"], - "⍴": ["shapeOf", "reshape"], - ",": ["ravel", "catenate"], - "⍪": [null, "firstAxisCatenate"], - "⌽": ["reverse", "rotate"], - "⊖": ["axis1Reverse", "axis1Rotate"], - "⍉": ["transpose", null], - "↑": ["first", "take"], - "↓": [null, "drop"], - "⊂": ["enclose", "partitionWithAxis"], - "⊃": ["diclose", "pick"], - "⌷": [null, "index"], - "⍋": ["gradeUp", null], - "⍒": ["gradeDown", null], - "⊤": ["encode", null], - "⊥": ["decode", null], - "⍕": ["format", "formatByExample"], - "⍎": ["execute", null], - "⊣": ["stop", "left"], - "⊢": ["pass", "right"] - }; - - var isOperator = /[\.\/⌿⍀¨⍣]/; - var isNiladic = /⍬/; - var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/; - var isArrow = /←/; - var isComment = /[⍝#].*$/; - - var stringEater = function(type) { - var prev; - prev = false; - return function(c) { - prev = c; - if (c === type) { - return prev === "\\"; - } - return true; - }; - }; - return { - startState: function() { - return { - prev: false, - func: false, - op: false, - string: false, - escape: false - }; - }, - token: function(stream, state) { - var ch, funcName; - if (stream.eatSpace()) { - return null; - } - ch = stream.next(); - if (ch === '"' || ch === "'") { - stream.eatWhile(stringEater(ch)); - stream.next(); - state.prev = true; - return "string"; - } - if (/[\[{\(]/.test(ch)) { - state.prev = false; - return null; - } - if (/[\]}\)]/.test(ch)) { - state.prev = true; - return null; - } - if (isNiladic.test(ch)) { - state.prev = false; - return "niladic"; - } - if (/[¯\d]/.test(ch)) { - if (state.func) { - state.func = false; - state.prev = false; - } else { - state.prev = true; - } - stream.eatWhile(/[\w\.]/); - return "number"; - } - if (isOperator.test(ch)) { - return "operator apl-" + builtInOps[ch]; - } - if (isArrow.test(ch)) { - return "apl-arrow"; - } - if (isFunction.test(ch)) { - funcName = "apl-"; - if (builtInFuncs[ch] != null) { - if (state.prev) { - funcName += builtInFuncs[ch][1]; - } else { - funcName += builtInFuncs[ch][0]; - } - } - state.func = true; - state.prev = false; - return "function " + funcName; - } - if (isComment.test(ch)) { - stream.skipToEnd(); - return "comment"; - } - if (ch === "∘" && stream.peek() === ".") { - stream.next(); - return "function jot-dot"; - } - stream.eatWhile(/[\w\$_]/); - state.prev = true; - return "keyword"; - } - }; -}); - -CodeMirror.defineMIME("text/apl", "apl"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/apl/index.html b/public/plugins/codemirror-5.17.0/mode/apl/index.html deleted file mode 100644 index 53dda6b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/apl/index.html +++ /dev/null @@ -1,72 +0,0 @@ - - -CodeMirror: APL mode - - - - - - - - - - -
-

APL mode

-
- - - -

Simple mode that tries to handle APL as well as it can.

-

It attempts to label functions/operators based upon - monadic/dyadic usage (but this is far from fully fleshed out). - This means there are meaningful classnames so hover states can - have popups etc.

- -

MIME types defined: text/apl (APL code)

-
diff --git a/public/plugins/codemirror-5.17.0/mode/asciiarmor/asciiarmor.js b/public/plugins/codemirror-5.17.0/mode/asciiarmor/asciiarmor.js deleted file mode 100644 index d830903..0000000 --- a/public/plugins/codemirror-5.17.0/mode/asciiarmor/asciiarmor.js +++ /dev/null @@ -1,73 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - function errorIfNotEmpty(stream) { - var nonWS = stream.match(/^\s*\S/); - stream.skipToEnd(); - return nonWS ? "error" : null; - } - - CodeMirror.defineMode("asciiarmor", function() { - return { - token: function(stream, state) { - var m; - if (state.state == "top") { - if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\s*$/))) { - state.state = "headers"; - state.type = m[1]; - return "tag"; - } - return errorIfNotEmpty(stream); - } else if (state.state == "headers") { - if (stream.sol() && stream.match(/^\w+:/)) { - state.state = "header"; - return "atom"; - } else { - var result = errorIfNotEmpty(stream); - if (result) state.state = "body"; - return result; - } - } else if (state.state == "header") { - stream.skipToEnd(); - state.state = "headers"; - return "string"; - } else if (state.state == "body") { - if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\s*$/))) { - if (m[1] != state.type) return "error"; - state.state = "end"; - return "tag"; - } else { - if (stream.eatWhile(/[A-Za-z0-9+\/=]/)) { - return null; - } else { - stream.next(); - return "error"; - } - } - } else if (state.state == "end") { - return errorIfNotEmpty(stream); - } - }, - blankLine: function(state) { - if (state.state == "headers") state.state = "body"; - }, - startState: function() { - return {state: "top", type: null}; - } - }; - }); - - CodeMirror.defineMIME("application/pgp", "asciiarmor"); - CodeMirror.defineMIME("application/pgp-keys", "asciiarmor"); - CodeMirror.defineMIME("application/pgp-signature", "asciiarmor"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/asciiarmor/index.html b/public/plugins/codemirror-5.17.0/mode/asciiarmor/index.html deleted file mode 100644 index 8ba1b5c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/asciiarmor/index.html +++ /dev/null @@ -1,46 +0,0 @@ - - -CodeMirror: ASCII Armor (PGP) mode - - - - - - - - - -
-

ASCII Armor (PGP) mode

-
- - - -

MIME types -defined: application/pgp, application/pgp-keys, application/pgp-signature

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/asn.1/asn.1.js b/public/plugins/codemirror-5.17.0/mode/asn.1/asn.1.js deleted file mode 100644 index 9600247..0000000 --- a/public/plugins/codemirror-5.17.0/mode/asn.1/asn.1.js +++ /dev/null @@ -1,204 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("asn.1", function(config, parserConfig) { - var indentUnit = config.indentUnit, - keywords = parserConfig.keywords || {}, - cmipVerbs = parserConfig.cmipVerbs || {}, - compareTypes = parserConfig.compareTypes || {}, - status = parserConfig.status || {}, - tags = parserConfig.tags || {}, - storage = parserConfig.storage || {}, - modifier = parserConfig.modifier || {}, - accessTypes = parserConfig.accessTypes|| {}, - multiLineStrings = parserConfig.multiLineStrings, - indentStatements = parserConfig.indentStatements !== false; - var isOperatorChar = /[\|\^]/; - var curPunc; - - function tokenBase(stream, state) { - var ch = stream.next(); - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - if (/[\[\]\(\){}:=,;]/.test(ch)) { - curPunc = ch; - return "punctuation"; - } - if (ch == "-"){ - if (stream.eat("-")) { - stream.skipToEnd(); - return "comment"; - } - } - if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } - if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - - stream.eatWhile(/[\w\-]/); - var cur = stream.current(); - if (keywords.propertyIsEnumerable(cur)) return "keyword"; - if (cmipVerbs.propertyIsEnumerable(cur)) return "variable cmipVerbs"; - if (compareTypes.propertyIsEnumerable(cur)) return "atom compareTypes"; - if (status.propertyIsEnumerable(cur)) return "comment status"; - if (tags.propertyIsEnumerable(cur)) return "variable-3 tags"; - if (storage.propertyIsEnumerable(cur)) return "builtin storage"; - if (modifier.propertyIsEnumerable(cur)) return "string-2 modifier"; - if (accessTypes.propertyIsEnumerable(cur)) return "atom accessTypes"; - - return "variable"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped){ - var afterNext = stream.peek(); - //look if the character if the quote is like the B in '10100010'B - if (afterNext){ - afterNext = afterNext.toLowerCase(); - if(afterNext == "b" || afterNext == "h" || afterNext == "o") - stream.next(); - } - end = true; break; - } - escaped = !escaped && next == "\\"; - } - if (end || !(escaped || multiLineStrings)) - state.tokenize = null; - return "string"; - }; - } - - function Context(indented, column, type, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.align = align; - this.prev = prev; - } - function pushContext(state, col, type) { - var indent = state.indented; - if (state.context && state.context.type == "statement") - indent = state.context.indented; - return state.context = new Context(indent, col, type, null, state.context); - } - function popContext(state) { - var t = state.context.type; - if (t == ")" || t == "]" || t == "}") - state.indented = state.context.indented; - return state.context = state.context.prev; - } - - //Interface - return { - startState: function(basecolumn) { - return { - tokenize: null, - context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), - indented: 0, - startOfLine: true - }; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - } - if (stream.eatSpace()) return null; - curPunc = null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment") return style; - if (ctx.align == null) ctx.align = true; - - if ((curPunc == ";" || curPunc == ":" || curPunc == ",") - && ctx.type == "statement"){ - popContext(state); - } - else if (curPunc == "{") pushContext(state, stream.column(), "}"); - else if (curPunc == "[") pushContext(state, stream.column(), "]"); - else if (curPunc == "(") pushContext(state, stream.column(), ")"); - else if (curPunc == "}") { - while (ctx.type == "statement") ctx = popContext(state); - if (ctx.type == "}") ctx = popContext(state); - while (ctx.type == "statement") ctx = popContext(state); - } - else if (curPunc == ctx.type) popContext(state); - else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") - && curPunc != ';') || (ctx.type == "statement" - && curPunc == "newstatement"))) - pushContext(state, stream.column(), "statement"); - - state.startOfLine = false; - return style; - }, - - electricChars: "{}", - lineComment: "--", - fold: "brace" - }; - }); - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - CodeMirror.defineMIME("text/x-ttcn-asn", { - name: "asn.1", - keywords: words("DEFINITIONS OBJECTS IF DERIVED INFORMATION ACTION" + - " REPLY ANY NAMED CHARACTERIZED BEHAVIOUR REGISTERED" + - " WITH AS IDENTIFIED CONSTRAINED BY PRESENT BEGIN" + - " IMPORTS FROM UNITS SYNTAX MIN-ACCESS MAX-ACCESS" + - " MINACCESS MAXACCESS REVISION STATUS DESCRIPTION" + - " SEQUENCE SET COMPONENTS OF CHOICE DistinguishedName" + - " ENUMERATED SIZE MODULE END INDEX AUGMENTS EXTENSIBILITY" + - " IMPLIED EXPORTS"), - cmipVerbs: words("ACTIONS ADD GET NOTIFICATIONS REPLACE REMOVE"), - compareTypes: words("OPTIONAL DEFAULT MANAGED MODULE-TYPE MODULE_IDENTITY" + - " MODULE-COMPLIANCE OBJECT-TYPE OBJECT-IDENTITY" + - " OBJECT-COMPLIANCE MODE CONFIRMED CONDITIONAL" + - " SUBORDINATE SUPERIOR CLASS TRUE FALSE NULL" + - " TEXTUAL-CONVENTION"), - status: words("current deprecated mandatory obsolete"), - tags: words("APPLICATION AUTOMATIC EXPLICIT IMPLICIT PRIVATE TAGS" + - " UNIVERSAL"), - storage: words("BOOLEAN INTEGER OBJECT IDENTIFIER BIT OCTET STRING" + - " UTCTime InterfaceIndex IANAifType CMIP-Attribute" + - " REAL PACKAGE PACKAGES IpAddress PhysAddress" + - " NetworkAddress BITS BMPString TimeStamp TimeTicks" + - " TruthValue RowStatus DisplayString GeneralString" + - " GraphicString IA5String NumericString" + - " PrintableString SnmpAdminAtring TeletexString" + - " UTF8String VideotexString VisibleString StringStore" + - " ISO646String T61String UniversalString Unsigned32" + - " Integer32 Gauge Gauge32 Counter Counter32 Counter64"), - modifier: words("ATTRIBUTE ATTRIBUTES MANDATORY-GROUP MANDATORY-GROUPS" + - " GROUP GROUPS ELEMENTS EQUALITY ORDERING SUBSTRINGS" + - " DEFINED"), - accessTypes: words("not-accessible accessible-for-notify read-only" + - " read-create read-write"), - multiLineStrings: true - }); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/asn.1/index.html b/public/plugins/codemirror-5.17.0/mode/asn.1/index.html deleted file mode 100644 index 699fd44..0000000 --- a/public/plugins/codemirror-5.17.0/mode/asn.1/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - -CodeMirror: ASN.1 mode - - - - - - - - -
-

ASN.1 example

-
- -
- - -
-

Language: Abstract Syntax Notation One - (ASN.1) -

-

MIME types defined: text/x-ttcn-asn

- -
-

The development of this mode has been sponsored by Ericsson - .

-

Coded by Asmelash Tsegay Gebretsadkan

-
- diff --git a/public/plugins/codemirror-5.17.0/mode/asterisk/asterisk.js b/public/plugins/codemirror-5.17.0/mode/asterisk/asterisk.js deleted file mode 100644 index b7ebfc5..0000000 --- a/public/plugins/codemirror-5.17.0/mode/asterisk/asterisk.js +++ /dev/null @@ -1,196 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/* - * ===================================================================================== - * - * Filename: mode/asterisk/asterisk.js - * - * Description: CodeMirror mode for Asterisk dialplan - * - * Created: 05/17/2012 09:20:25 PM - * Revision: none - * - * Author: Stas Kobzar (stas@modulis.ca), - * Company: Modulis.ca Inc. - * - * ===================================================================================== - */ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("asterisk", function() { - var atoms = ["exten", "same", "include","ignorepat","switch"], - dpcmd = ["#include","#exec"], - apps = [ - "addqueuemember","adsiprog","aelsub","agentlogin","agentmonitoroutgoing","agi", - "alarmreceiver","amd","answer","authenticate","background","backgrounddetect", - "bridge","busy","callcompletioncancel","callcompletionrequest","celgenuserevent", - "changemonitor","chanisavail","channelredirect","chanspy","clearhash","confbridge", - "congestion","continuewhile","controlplayback","dahdiacceptr2call","dahdibarge", - "dahdiras","dahdiscan","dahdisendcallreroutingfacility","dahdisendkeypadfacility", - "datetime","dbdel","dbdeltree","deadagi","dial","dictate","directory","disa", - "dumpchan","eagi","echo","endwhile","exec","execif","execiftime","exitwhile","extenspy", - "externalivr","festival","flash","followme","forkcdr","getcpeid","gosub","gosubif", - "goto","gotoif","gotoiftime","hangup","iax2provision","ices","importvar","incomplete", - "ivrdemo","jabberjoin","jabberleave","jabbersend","jabbersendgroup","jabberstatus", - "jack","log","macro","macroexclusive","macroexit","macroif","mailboxexists","meetme", - "meetmeadmin","meetmechanneladmin","meetmecount","milliwatt","minivmaccmess","minivmdelete", - "minivmgreet","minivmmwi","minivmnotify","minivmrecord","mixmonitor","monitor","morsecode", - "mp3player","mset","musiconhold","nbscat","nocdr","noop","odbc","odbc","odbcfinish", - "originate","ospauth","ospfinish","osplookup","ospnext","page","park","parkandannounce", - "parkedcall","pausemonitor","pausequeuemember","pickup","pickupchan","playback","playtones", - "privacymanager","proceeding","progress","queue","queuelog","raiseexception","read","readexten", - "readfile","receivefax","receivefax","receivefax","record","removequeuemember", - "resetcdr","retrydial","return","ringing","sayalpha","saycountedadj","saycountednoun", - "saycountpl","saydigits","saynumber","sayphonetic","sayunixtime","senddtmf","sendfax", - "sendfax","sendfax","sendimage","sendtext","sendurl","set","setamaflags", - "setcallerpres","setmusiconhold","sipaddheader","sipdtmfmode","sipremoveheader","skel", - "slastation","slatrunk","sms","softhangup","speechactivategrammar","speechbackground", - "speechcreate","speechdeactivategrammar","speechdestroy","speechloadgrammar","speechprocessingsound", - "speechstart","speechunloadgrammar","stackpop","startmusiconhold","stopmixmonitor","stopmonitor", - "stopmusiconhold","stopplaytones","system","testclient","testserver","transfer","tryexec", - "trysystem","unpausemonitor","unpausequeuemember","userevent","verbose","vmauthenticate", - "vmsayname","voicemail","voicemailmain","wait","waitexten","waitfornoise","waitforring", - "waitforsilence","waitmusiconhold","waituntil","while","zapateller" - ]; - - function basicToken(stream,state){ - var cur = ''; - var ch = stream.next(); - // comment - if(ch == ";") { - stream.skipToEnd(); - return "comment"; - } - // context - if(ch == '[') { - stream.skipTo(']'); - stream.eat(']'); - return "header"; - } - // string - if(ch == '"') { - stream.skipTo('"'); - return "string"; - } - if(ch == "'") { - stream.skipTo("'"); - return "string-2"; - } - // dialplan commands - if(ch == '#') { - stream.eatWhile(/\w/); - cur = stream.current(); - if(dpcmd.indexOf(cur) !== -1) { - stream.skipToEnd(); - return "strong"; - } - } - // application args - if(ch == '$'){ - var ch1 = stream.peek(); - if(ch1 == '{'){ - stream.skipTo('}'); - stream.eat('}'); - return "variable-3"; - } - } - // extension - stream.eatWhile(/\w/); - cur = stream.current(); - if(atoms.indexOf(cur) !== -1) { - state.extenStart = true; - switch(cur) { - case 'same': state.extenSame = true; break; - case 'include': - case 'switch': - case 'ignorepat': - state.extenInclude = true;break; - default:break; - } - return "atom"; - } - } - - return { - startState: function() { - return { - extenStart: false, - extenSame: false, - extenInclude: false, - extenExten: false, - extenPriority: false, - extenApplication: false - }; - }, - token: function(stream, state) { - - var cur = ''; - if(stream.eatSpace()) return null; - // extension started - if(state.extenStart){ - stream.eatWhile(/[^\s]/); - cur = stream.current(); - if(/^=>?$/.test(cur)){ - state.extenExten = true; - state.extenStart = false; - return "strong"; - } else { - state.extenStart = false; - stream.skipToEnd(); - return "error"; - } - } else if(state.extenExten) { - // set exten and priority - state.extenExten = false; - state.extenPriority = true; - stream.eatWhile(/[^,]/); - if(state.extenInclude) { - stream.skipToEnd(); - state.extenPriority = false; - state.extenInclude = false; - } - if(state.extenSame) { - state.extenPriority = false; - state.extenSame = false; - state.extenApplication = true; - } - return "tag"; - } else if(state.extenPriority) { - state.extenPriority = false; - state.extenApplication = true; - stream.next(); // get comma - if(state.extenSame) return null; - stream.eatWhile(/[^,]/); - return "number"; - } else if(state.extenApplication) { - stream.eatWhile(/,/); - cur = stream.current(); - if(cur === ',') return null; - stream.eatWhile(/\w/); - cur = stream.current().toLowerCase(); - state.extenApplication = false; - if(apps.indexOf(cur) !== -1){ - return "def strong"; - } - } else{ - return basicToken(stream,state); - } - - return null; - } - }; -}); - -CodeMirror.defineMIME("text/x-asterisk", "asterisk"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/asterisk/index.html b/public/plugins/codemirror-5.17.0/mode/asterisk/index.html deleted file mode 100644 index 257bd39..0000000 --- a/public/plugins/codemirror-5.17.0/mode/asterisk/index.html +++ /dev/null @@ -1,154 +0,0 @@ - - -CodeMirror: Asterisk dialplan mode - - - - - - - - - -
-

Asterisk dialplan mode

-
- - -

MIME types defined: text/x-asterisk.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/brainfuck/brainfuck.js b/public/plugins/codemirror-5.17.0/mode/brainfuck/brainfuck.js deleted file mode 100644 index 3becf2a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/brainfuck/brainfuck.js +++ /dev/null @@ -1,85 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Brainfuck mode created by Michael Kaminsky https://github.com/mkaminsky11 - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") - mod(require("../../lib/codemirror")) - else if (typeof define == "function" && define.amd) - define(["../../lib/codemirror"], mod) - else - mod(CodeMirror) -})(function(CodeMirror) { - "use strict" - var reserve = "><+-.,[]".split(""); - /* - comments can be either: - placed behind lines - - +++ this is a comment - - where reserved characters cannot be used - or in a loop - [ - this is ok to use [ ] and stuff - ] - or preceded by # - */ - CodeMirror.defineMode("brainfuck", function() { - return { - startState: function() { - return { - commentLine: false, - left: 0, - right: 0, - commentLoop: false - } - }, - token: function(stream, state) { - if (stream.eatSpace()) return null - if(stream.sol()){ - state.commentLine = false; - } - var ch = stream.next().toString(); - if(reserve.indexOf(ch) !== -1){ - if(state.commentLine === true){ - if(stream.eol()){ - state.commentLine = false; - } - return "comment"; - } - if(ch === "]" || ch === "["){ - if(ch === "["){ - state.left++; - } - else{ - state.right++; - } - return "bracket"; - } - else if(ch === "+" || ch === "-"){ - return "keyword"; - } - else if(ch === "<" || ch === ">"){ - return "atom"; - } - else if(ch === "." || ch === ","){ - return "def"; - } - } - else{ - state.commentLine = true; - if(stream.eol()){ - state.commentLine = false; - } - return "comment"; - } - if(stream.eol()){ - state.commentLine = false; - } - } - }; - }); -CodeMirror.defineMIME("text/x-brainfuck","brainfuck") -}); diff --git a/public/plugins/codemirror-5.17.0/mode/brainfuck/index.html b/public/plugins/codemirror-5.17.0/mode/brainfuck/index.html deleted file mode 100644 index 6048fc2..0000000 --- a/public/plugins/codemirror-5.17.0/mode/brainfuck/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - -CodeMirror: Brainfuck mode - - - - - - - - - - -
-

Brainfuck mode

-
- - - -

A mode for Brainfuck

- -

MIME types defined: text/x-brainfuck

-
diff --git a/public/plugins/codemirror-5.17.0/mode/clike/clike.js b/public/plugins/codemirror-5.17.0/mode/clike/clike.js deleted file mode 100644 index a37921f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/clike/clike.js +++ /dev/null @@ -1,786 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -function Context(indented, column, type, info, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.info = info; - this.align = align; - this.prev = prev; -} -function pushContext(state, col, type, info) { - var indent = state.indented; - if (state.context && state.context.type != "statement" && type != "statement") - indent = state.context.indented; - return state.context = new Context(indent, col, type, info, null, state.context); -} -function popContext(state) { - var t = state.context.type; - if (t == ")" || t == "]" || t == "}") - state.indented = state.context.indented; - return state.context = state.context.prev; -} - -function typeBefore(stream, state, pos) { - if (state.prevToken == "variable" || state.prevToken == "variable-3") return true; - if (/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(stream.string.slice(0, pos))) return true; - if (state.typeAtEndOfLine && stream.column() == stream.indentation()) return true; -} - -function isTopScope(context) { - for (;;) { - if (!context || context.type == "top") return true; - if (context.type == "}" && context.prev.info != "namespace") return false; - context = context.prev; - } -} - -CodeMirror.defineMode("clike", function(config, parserConfig) { - var indentUnit = config.indentUnit, - statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, - dontAlignCalls = parserConfig.dontAlignCalls, - keywords = parserConfig.keywords || {}, - types = parserConfig.types || {}, - builtin = parserConfig.builtin || {}, - blockKeywords = parserConfig.blockKeywords || {}, - defKeywords = parserConfig.defKeywords || {}, - atoms = parserConfig.atoms || {}, - hooks = parserConfig.hooks || {}, - multiLineStrings = parserConfig.multiLineStrings, - indentStatements = parserConfig.indentStatements !== false, - indentSwitch = parserConfig.indentSwitch !== false, - namespaceSeparator = parserConfig.namespaceSeparator, - isPunctuationChar = parserConfig.isPunctuationChar || /[\[\]{}\(\),;\:\.]/, - numberStart = parserConfig.numberStart || /[\d\.]/, - number = parserConfig.number || /^(?:0x[a-f\d]+|0b[01]+|(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?)(u|ll?|l|f)?/i, - isOperatorChar = parserConfig.isOperatorChar || /[+\-*&%=<>!?|\/]/, - endStatement = parserConfig.endStatement || /^[;:,]$/; - - var curPunc, isDefKeyword; - - function tokenBase(stream, state) { - var ch = stream.next(); - if (hooks[ch]) { - var result = hooks[ch](stream, state); - if (result !== false) return result; - } - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - if (isPunctuationChar.test(ch)) { - curPunc = ch; - return null; - } - if (numberStart.test(ch)) { - stream.backUp(1) - if (stream.match(number)) return "number" - stream.next() - } - if (ch == "/") { - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - } - if (isOperatorChar.test(ch)) { - while (!stream.match(/^\/[\/*]/, false) && stream.eat(isOperatorChar)) {} - return "operator"; - } - stream.eatWhile(/[\w\$_\xa1-\uffff]/); - if (namespaceSeparator) while (stream.match(namespaceSeparator)) - stream.eatWhile(/[\w\$_\xa1-\uffff]/); - - var cur = stream.current(); - if (contains(keywords, cur)) { - if (contains(blockKeywords, cur)) curPunc = "newstatement"; - if (contains(defKeywords, cur)) isDefKeyword = true; - return "keyword"; - } - if (contains(types, cur)) return "variable-3"; - if (contains(builtin, cur)) { - if (contains(blockKeywords, cur)) curPunc = "newstatement"; - return "builtin"; - } - if (contains(atoms, cur)) return "atom"; - return "variable"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) {end = true; break;} - escaped = !escaped && next == "\\"; - } - if (end || !(escaped || multiLineStrings)) - state.tokenize = null; - return "string"; - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = null; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function maybeEOL(stream, state) { - if (parserConfig.typeFirstDefinitions && stream.eol() && isTopScope(state.context)) - state.typeAtEndOfLine = typeBefore(stream, state, stream.pos) - } - - // Interface - - return { - startState: function(basecolumn) { - return { - tokenize: null, - context: new Context((basecolumn || 0) - indentUnit, 0, "top", null, false), - indented: 0, - startOfLine: true, - prevToken: null - }; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - } - if (stream.eatSpace()) { maybeEOL(stream, state); return null; } - curPunc = isDefKeyword = null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment" || style == "meta") return style; - if (ctx.align == null) ctx.align = true; - - if (endStatement.test(curPunc)) while (state.context.type == "statement") popContext(state); - else if (curPunc == "{") pushContext(state, stream.column(), "}"); - else if (curPunc == "[") pushContext(state, stream.column(), "]"); - else if (curPunc == "(") pushContext(state, stream.column(), ")"); - else if (curPunc == "}") { - while (ctx.type == "statement") ctx = popContext(state); - if (ctx.type == "}") ctx = popContext(state); - while (ctx.type == "statement") ctx = popContext(state); - } - else if (curPunc == ctx.type) popContext(state); - else if (indentStatements && - (((ctx.type == "}" || ctx.type == "top") && curPunc != ";") || - (ctx.type == "statement" && curPunc == "newstatement"))) { - pushContext(state, stream.column(), "statement", stream.current()); - } - - if (style == "variable" && - ((state.prevToken == "def" || - (parserConfig.typeFirstDefinitions && typeBefore(stream, state, stream.start) && - isTopScope(state.context) && stream.match(/^\s*\(/, false))))) - style = "def"; - - if (hooks.token) { - var result = hooks.token(stream, state, style); - if (result !== undefined) style = result; - } - - if (style == "def" && parserConfig.styleDefs === false) style = "variable"; - - state.startOfLine = false; - state.prevToken = isDefKeyword ? "def" : style || curPunc; - maybeEOL(stream, state); - return style; - }, - - indent: function(state, textAfter) { - if (state.tokenize != tokenBase && state.tokenize != null || state.typeAtEndOfLine) return CodeMirror.Pass; - var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); - if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; - if (parserConfig.dontIndentStatements) - while (ctx.type == "statement" && parserConfig.dontIndentStatements.test(ctx.info)) - ctx = ctx.prev - if (hooks.indent) { - var hook = hooks.indent(state, ctx, textAfter); - if (typeof hook == "number") return hook - } - var closing = firstChar == ctx.type; - var switchBlock = ctx.prev && ctx.prev.info == "switch"; - if (parserConfig.allmanIndentation && /[{(]/.test(firstChar)) { - while (ctx.type != "top" && ctx.type != "}") ctx = ctx.prev - return ctx.indented - } - if (ctx.type == "statement") - return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); - if (ctx.align && (!dontAlignCalls || ctx.type != ")")) - return ctx.column + (closing ? 0 : 1); - if (ctx.type == ")" && !closing) - return ctx.indented + statementIndentUnit; - - return ctx.indented + (closing ? 0 : indentUnit) + - (!closing && switchBlock && !/^(?:case|default)\b/.test(textAfter) ? indentUnit : 0); - }, - - electricInput: indentSwitch ? /^\s*(?:case .*?:|default:|\{\}?|\})$/ : /^\s*[{}]$/, - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: "//", - fold: "brace" - }; -}); - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - function contains(words, word) { - if (typeof words === "function") { - return words(word); - } else { - return words.propertyIsEnumerable(word); - } - } - var cKeywords = "auto if break case register continue return default do sizeof " + - "static else struct switch extern typedef union for goto while enum const volatile"; - var cTypes = "int long char short double float unsigned signed void size_t ptrdiff_t"; - - function cppHook(stream, state) { - if (!state.startOfLine) return false - for (var ch, next = null; ch = stream.peek();) { - if (ch == "\\" && stream.match(/^.$/)) { - next = cppHook - break - } else if (ch == "/" && stream.match(/^\/[\/\*]/, false)) { - break - } - stream.next() - } - state.tokenize = next - return "meta" - } - - function pointerHook(_stream, state) { - if (state.prevToken == "variable-3") return "variable-3"; - return false; - } - - function cpp14Literal(stream) { - stream.eatWhile(/[\w\.']/); - return "number"; - } - - function cpp11StringHook(stream, state) { - stream.backUp(1); - // Raw strings. - if (stream.match(/(R|u8R|uR|UR|LR)/)) { - var match = stream.match(/"([^\s\\()]{0,16})\(/); - if (!match) { - return false; - } - state.cpp11RawStringDelim = match[1]; - state.tokenize = tokenRawString; - return tokenRawString(stream, state); - } - // Unicode strings/chars. - if (stream.match(/(u8|u|U|L)/)) { - if (stream.match(/["']/, /* eat */ false)) { - return "string"; - } - return false; - } - // Ignore this hook. - stream.next(); - return false; - } - - function cppLooksLikeConstructor(word) { - var lastTwo = /(\w+)::(\w+)$/.exec(word); - return lastTwo && lastTwo[1] == lastTwo[2]; - } - - // C#-style strings where "" escapes a quote. - function tokenAtString(stream, state) { - var next; - while ((next = stream.next()) != null) { - if (next == '"' && !stream.eat('"')) { - state.tokenize = null; - break; - } - } - return "string"; - } - - // C++11 raw string literal is "( anything )", where - // can be a string up to 16 characters long. - function tokenRawString(stream, state) { - // Escape characters that have special regex meanings. - var delim = state.cpp11RawStringDelim.replace(/[^\w\s]/g, '\\$&'); - var match = stream.match(new RegExp(".*?\\)" + delim + '"')); - if (match) - state.tokenize = null; - else - stream.skipToEnd(); - return "string"; - } - - function def(mimes, mode) { - if (typeof mimes == "string") mimes = [mimes]; - var words = []; - function add(obj) { - if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) - words.push(prop); - } - add(mode.keywords); - add(mode.types); - add(mode.builtin); - add(mode.atoms); - if (words.length) { - mode.helperType = mimes[0]; - CodeMirror.registerHelper("hintWords", mimes[0], words); - } - - for (var i = 0; i < mimes.length; ++i) - CodeMirror.defineMIME(mimes[i], mode); - } - - def(["text/x-csrc", "text/x-c", "text/x-chdr"], { - name: "clike", - keywords: words(cKeywords), - types: words(cTypes + " bool _Complex _Bool float_t double_t intptr_t intmax_t " + - "int8_t int16_t int32_t int64_t uintptr_t uintmax_t uint8_t uint16_t " + - "uint32_t uint64_t"), - blockKeywords: words("case do else for if switch while struct"), - defKeywords: words("struct"), - typeFirstDefinitions: true, - atoms: words("null true false"), - hooks: {"#": cppHook, "*": pointerHook}, - modeProps: {fold: ["brace", "include"]} - }); - - def(["text/x-c++src", "text/x-c++hdr"], { - name: "clike", - keywords: words(cKeywords + " asm dynamic_cast namespace reinterpret_cast try explicit new " + - "static_cast typeid catch operator template typename class friend private " + - "this using const_cast inline public throw virtual delete mutable protected " + - "alignas alignof constexpr decltype nullptr noexcept thread_local final " + - "static_assert override"), - types: words(cTypes + " bool wchar_t"), - blockKeywords: words("catch class do else finally for if struct switch try while"), - defKeywords: words("class namespace struct enum union"), - typeFirstDefinitions: true, - atoms: words("true false null"), - dontIndentStatements: /^template$/, - hooks: { - "#": cppHook, - "*": pointerHook, - "u": cpp11StringHook, - "U": cpp11StringHook, - "L": cpp11StringHook, - "R": cpp11StringHook, - "0": cpp14Literal, - "1": cpp14Literal, - "2": cpp14Literal, - "3": cpp14Literal, - "4": cpp14Literal, - "5": cpp14Literal, - "6": cpp14Literal, - "7": cpp14Literal, - "8": cpp14Literal, - "9": cpp14Literal, - token: function(stream, state, style) { - if (style == "variable" && stream.peek() == "(" && - (state.prevToken == ";" || state.prevToken == null || - state.prevToken == "}") && - cppLooksLikeConstructor(stream.current())) - return "def"; - } - }, - namespaceSeparator: "::", - modeProps: {fold: ["brace", "include"]} - }); - - def("text/x-java", { - name: "clike", - keywords: words("abstract assert break case catch class const continue default " + - "do else enum extends final finally float for goto if implements import " + - "instanceof interface native new package private protected public " + - "return static strictfp super switch synchronized this throw throws transient " + - "try volatile while"), - types: words("byte short int long float double boolean char void Boolean Byte Character Double Float " + - "Integer Long Number Object Short String StringBuffer StringBuilder Void"), - blockKeywords: words("catch class do else finally for if switch try while"), - defKeywords: words("class interface package enum"), - typeFirstDefinitions: true, - atoms: words("true false null"), - endStatement: /^[;:]$/, - number: /^(?:0x[a-f\d_]+|0b[01_]+|(?:[\d_]+\.?\d*|\.\d+)(?:e[-+]?[\d_]+)?)(u|ll?|l|f)?/i, - hooks: { - "@": function(stream) { - stream.eatWhile(/[\w\$_]/); - return "meta"; - } - }, - modeProps: {fold: ["brace", "import"]} - }); - - def("text/x-csharp", { - name: "clike", - keywords: words("abstract as async await base break case catch checked class const continue" + - " default delegate do else enum event explicit extern finally fixed for" + - " foreach goto if implicit in interface internal is lock namespace new" + - " operator out override params private protected public readonly ref return sealed" + - " sizeof stackalloc static struct switch this throw try typeof unchecked" + - " unsafe using virtual void volatile while add alias ascending descending dynamic from get" + - " global group into join let orderby partial remove select set value var yield"), - types: words("Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func" + - " Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32" + - " UInt64 bool byte char decimal double short int long object" + - " sbyte float string ushort uint ulong"), - blockKeywords: words("catch class do else finally for foreach if struct switch try while"), - defKeywords: words("class interface namespace struct var"), - typeFirstDefinitions: true, - atoms: words("true false null"), - hooks: { - "@": function(stream, state) { - if (stream.eat('"')) { - state.tokenize = tokenAtString; - return tokenAtString(stream, state); - } - stream.eatWhile(/[\w\$_]/); - return "meta"; - } - } - }); - - function tokenTripleString(stream, state) { - var escaped = false; - while (!stream.eol()) { - if (!escaped && stream.match('"""')) { - state.tokenize = null; - break; - } - escaped = stream.next() == "\\" && !escaped; - } - return "string"; - } - - def("text/x-scala", { - name: "clike", - keywords: words( - - /* scala */ - "abstract case catch class def do else extends final finally for forSome if " + - "implicit import lazy match new null object override package private protected return " + - "sealed super this throw trait try type val var while with yield _ : = => <- <: " + - "<% >: # @ " + - - /* package scala */ - "assert assume require print println printf readLine readBoolean readByte readShort " + - "readChar readInt readLong readFloat readDouble " + - - ":: #:: " - ), - types: words( - "AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either " + - "Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable " + - "Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering " + - "Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder " + - "StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector " + - - /* package java.lang */ - "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + - "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + - "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + - "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" - ), - multiLineStrings: true, - blockKeywords: words("catch class do else finally for forSome if match switch try while"), - defKeywords: words("class def object package trait type val var"), - atoms: words("true false null"), - indentStatements: false, - indentSwitch: false, - hooks: { - "@": function(stream) { - stream.eatWhile(/[\w\$_]/); - return "meta"; - }, - '"': function(stream, state) { - if (!stream.match('""')) return false; - state.tokenize = tokenTripleString; - return state.tokenize(stream, state); - }, - "'": function(stream) { - stream.eatWhile(/[\w\$_\xa1-\uffff]/); - return "atom"; - }, - "=": function(stream, state) { - var cx = state.context - if (cx.type == "}" && cx.align && stream.eat(">")) { - state.context = new Context(cx.indented, cx.column, cx.type, cx.info, null, cx.prev) - return "operator" - } else { - return false - } - } - }, - modeProps: {closeBrackets: {triples: '"'}} - }); - - function tokenKotlinString(tripleString){ - return function (stream, state) { - var escaped = false, next, end = false; - while (!stream.eol()) { - if (!tripleString && !escaped && stream.match('"') ) {end = true; break;} - if (tripleString && stream.match('"""')) {end = true; break;} - next = stream.next(); - if(!escaped && next == "$" && stream.match('{')) - stream.skipTo("}"); - escaped = !escaped && next == "\\" && !tripleString; - } - if (end || !tripleString) - state.tokenize = null; - return "string"; - } - } - - def("text/x-kotlin", { - name: "clike", - keywords: words( - /*keywords*/ - "package as typealias class interface this super val " + - "var fun for is in This throw return " + - "break continue object if else while do try when !in !is as? " + - - /*soft keywords*/ - "file import where by get set abstract enum open inner override private public internal " + - "protected catch finally out final vararg reified dynamic companion constructor init " + - "sealed field property receiver param sparam lateinit data inline noinline tailrec " + - "external annotation crossinline const operator infix" - ), - types: words( - /* package java.lang */ - "Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable " + - "Compiler Double Exception Float Integer Long Math Number Object Package Pair Process " + - "Runtime Runnable SecurityManager Short StackTraceElement StrictMath String " + - "StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void" - ), - intendSwitch: false, - indentStatements: false, - multiLineStrings: true, - blockKeywords: words("catch class do else finally for if where try while enum"), - defKeywords: words("class val var object package interface fun"), - atoms: words("true false null this"), - hooks: { - '"': function(stream, state) { - state.tokenize = tokenKotlinString(stream.match('""')); - return state.tokenize(stream, state); - } - }, - modeProps: {closeBrackets: {triples: '"'}} - }); - - def(["x-shader/x-vertex", "x-shader/x-fragment"], { - name: "clike", - keywords: words("sampler1D sampler2D sampler3D samplerCube " + - "sampler1DShadow sampler2DShadow " + - "const attribute uniform varying " + - "break continue discard return " + - "for while do if else struct " + - "in out inout"), - types: words("float int bool void " + - "vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 " + - "mat2 mat3 mat4"), - blockKeywords: words("for while do if else struct"), - builtin: words("radians degrees sin cos tan asin acos atan " + - "pow exp log exp2 sqrt inversesqrt " + - "abs sign floor ceil fract mod min max clamp mix step smoothstep " + - "length distance dot cross normalize ftransform faceforward " + - "reflect refract matrixCompMult " + - "lessThan lessThanEqual greaterThan greaterThanEqual " + - "equal notEqual any all not " + - "texture1D texture1DProj texture1DLod texture1DProjLod " + - "texture2D texture2DProj texture2DLod texture2DProjLod " + - "texture3D texture3DProj texture3DLod texture3DProjLod " + - "textureCube textureCubeLod " + - "shadow1D shadow2D shadow1DProj shadow2DProj " + - "shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod " + - "dFdx dFdy fwidth " + - "noise1 noise2 noise3 noise4"), - atoms: words("true false " + - "gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex " + - "gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 " + - "gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 " + - "gl_FogCoord gl_PointCoord " + - "gl_Position gl_PointSize gl_ClipVertex " + - "gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor " + - "gl_TexCoord gl_FogFragCoord " + - "gl_FragCoord gl_FrontFacing " + - "gl_FragData gl_FragDepth " + - "gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix " + - "gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse " + - "gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse " + - "gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose " + - "gl_ProjectionMatrixInverseTranspose " + - "gl_ModelViewProjectionMatrixInverseTranspose " + - "gl_TextureMatrixInverseTranspose " + - "gl_NormalScale gl_DepthRange gl_ClipPlane " + - "gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel " + - "gl_FrontLightModelProduct gl_BackLightModelProduct " + - "gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ " + - "gl_FogParameters " + - "gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords " + - "gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats " + - "gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits " + - "gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits " + - "gl_MaxDrawBuffers"), - indentSwitch: false, - hooks: {"#": cppHook}, - modeProps: {fold: ["brace", "include"]} - }); - - def("text/x-nesc", { - name: "clike", - keywords: words(cKeywords + "as atomic async call command component components configuration event generic " + - "implementation includes interface module new norace nx_struct nx_union post provides " + - "signal task uses abstract extends"), - types: words(cTypes), - blockKeywords: words("case do else for if switch while struct"), - atoms: words("null true false"), - hooks: {"#": cppHook}, - modeProps: {fold: ["brace", "include"]} - }); - - def("text/x-objectivec", { - name: "clike", - keywords: words(cKeywords + "inline restrict _Bool _Complex _Imaginary BOOL Class bycopy byref id IMP in " + - "inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly"), - types: words(cTypes), - atoms: words("YES NO NULL NILL ON OFF true false"), - hooks: { - "@": function(stream) { - stream.eatWhile(/[\w\$]/); - return "keyword"; - }, - "#": cppHook, - indent: function(_state, ctx, textAfter) { - if (ctx.type == "statement" && /^@\w/.test(textAfter)) return ctx.indented - } - }, - modeProps: {fold: "brace"} - }); - - def("text/x-squirrel", { - name: "clike", - keywords: words("base break clone continue const default delete enum extends function in class" + - " foreach local resume return this throw typeof yield constructor instanceof static"), - types: words(cTypes), - blockKeywords: words("case catch class else for foreach if switch try while"), - defKeywords: words("function local class"), - typeFirstDefinitions: true, - atoms: words("true false null"), - hooks: {"#": cppHook}, - modeProps: {fold: ["brace", "include"]} - }); - - // Ceylon Strings need to deal with interpolation - var stringTokenizer = null; - function tokenCeylonString(type) { - return function(stream, state) { - var escaped = false, next, end = false; - while (!stream.eol()) { - if (!escaped && stream.match('"') && - (type == "single" || stream.match('""'))) { - end = true; - break; - } - if (!escaped && stream.match('``')) { - stringTokenizer = tokenCeylonString(type); - end = true; - break; - } - next = stream.next(); - escaped = type == "single" && !escaped && next == "\\"; - } - if (end) - state.tokenize = null; - return "string"; - } - } - - def("text/x-ceylon", { - name: "clike", - keywords: words("abstracts alias assembly assert assign break case catch class continue dynamic else" + - " exists extends finally for function given if import in interface is let module new" + - " nonempty object of out outer package return satisfies super switch then this throw" + - " try value void while"), - types: function(word) { - // In Ceylon all identifiers that start with an uppercase are types - var first = word.charAt(0); - return (first === first.toUpperCase() && first !== first.toLowerCase()); - }, - blockKeywords: words("case catch class dynamic else finally for function if interface module new object switch try while"), - defKeywords: words("class dynamic function interface module object package value"), - builtin: words("abstract actual aliased annotation by default deprecated doc final formal late license" + - " native optional sealed see serializable shared suppressWarnings tagged throws variable"), - isPunctuationChar: /[\[\]{}\(\),;\:\.`]/, - isOperatorChar: /[+\-*&%=<>!?|^~:\/]/, - numberStart: /[\d#$]/, - number: /^(?:#[\da-fA-F_]+|\$[01_]+|[\d_]+[kMGTPmunpf]?|[\d_]+\.[\d_]+(?:[eE][-+]?\d+|[kMGTPmunpf]|)|)/i, - multiLineStrings: true, - typeFirstDefinitions: true, - atoms: words("true false null larger smaller equal empty finished"), - indentSwitch: false, - styleDefs: false, - hooks: { - "@": function(stream) { - stream.eatWhile(/[\w\$_]/); - return "meta"; - }, - '"': function(stream, state) { - state.tokenize = tokenCeylonString(stream.match('""') ? "triple" : "single"); - return state.tokenize(stream, state); - }, - '`': function(stream, state) { - if (!stringTokenizer || !stream.match('`')) return false; - state.tokenize = stringTokenizer; - stringTokenizer = null; - return state.tokenize(stream, state); - }, - "'": function(stream) { - stream.eatWhile(/[\w\$_\xa1-\uffff]/); - return "atom"; - }, - token: function(_stream, state, style) { - if ((style == "variable" || style == "variable-3") && - state.prevToken == ".") { - return "variable-2"; - } - } - }, - modeProps: { - fold: ["brace", "import"], - closeBrackets: {triples: '"'} - } - }); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/clike/index.html b/public/plugins/codemirror-5.17.0/mode/clike/index.html deleted file mode 100644 index 45c670a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/clike/index.html +++ /dev/null @@ -1,360 +0,0 @@ - - -CodeMirror: C-like mode - - - - - - - - - - - - -
-

C-like mode

- -
- -

C++ example

- -
- -

Objective-C example

- -
- -

Java example

- -
- -

Scala example

- -
- -

Kotlin mode

- -
- -

Ceylon mode

- -
- - - -

Simple mode that tries to handle C-like languages as well as it - can. Takes two configuration parameters: keywords, an - object whose property names are the keywords in the language, - and useCPP, which determines whether C preprocessor - directives are recognized.

- -

MIME types defined: text/x-csrc - (C), text/x-c++src (C++), text/x-java - (Java), text/x-csharp (C#), - text/x-objectivec (Objective-C), - text/x-scala (Scala), text/x-vertex - x-shader/x-fragment (shader programs), - text/x-squirrel (Squirrel) and - text/x-ceylon (Ceylon)

-
diff --git a/public/plugins/codemirror-5.17.0/mode/clike/scala.html b/public/plugins/codemirror-5.17.0/mode/clike/scala.html deleted file mode 100644 index aa04cf0..0000000 --- a/public/plugins/codemirror-5.17.0/mode/clike/scala.html +++ /dev/null @@ -1,767 +0,0 @@ - - -CodeMirror: Scala mode - - - - - - - - - - -
-

Scala mode

-
- - - - -
diff --git a/public/plugins/codemirror-5.17.0/mode/clike/test.js b/public/plugins/codemirror-5.17.0/mode/clike/test.js deleted file mode 100644 index bea85b8..0000000 --- a/public/plugins/codemirror-5.17.0/mode/clike/test.js +++ /dev/null @@ -1,55 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-c"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT("indent", - "[variable-3 void] [def foo]([variable-3 void*] [variable a], [variable-3 int] [variable b]) {", - " [variable-3 int] [variable c] [operator =] [variable b] [operator +]", - " [number 1];", - " [keyword return] [operator *][variable a];", - "}"); - - MT("indent_switch", - "[keyword switch] ([variable x]) {", - " [keyword case] [number 10]:", - " [keyword return] [number 20];", - " [keyword default]:", - " [variable printf]([string \"foo %c\"], [variable x]);", - "}"); - - MT("def", - "[variable-3 void] [def foo]() {}", - "[keyword struct] [def bar]{}", - "[variable-3 int] [variable-3 *][def baz]() {}"); - - MT("def_new_line", - "::[variable std]::[variable SomeTerribleType][operator <][variable T][operator >]", - "[def SomeLongMethodNameThatDoesntFitIntoOneLine]([keyword const] [variable MyType][operator &] [variable param]) {}") - - MT("double_block", - "[keyword for] (;;)", - " [keyword for] (;;)", - " [variable x][operator ++];", - "[keyword return];"); - - MT("preprocessor", - "[meta #define FOO 3]", - "[variable-3 int] [variable foo];", - "[meta #define BAR\\]", - "[meta 4]", - "[variable-3 unsigned] [variable-3 int] [variable bar] [operator =] [number 8];", - "[meta #include ][comment // comment]") - - - var mode_cpp = CodeMirror.getMode({indentUnit: 2}, "text/x-c++src"); - function MTCPP(name) { test.mode(name, mode_cpp, Array.prototype.slice.call(arguments, 1)); } - - MTCPP("cpp14_literal", - "[number 10'000];", - "[number 0b10'000];", - "[number 0x10'000];", - "[string '100000'];"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/clojure/clojure.js b/public/plugins/codemirror-5.17.0/mode/clojure/clojure.js deleted file mode 100644 index ed6af2c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/clojure/clojure.js +++ /dev/null @@ -1,306 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/** - * Author: Hans Engel - * Branched from CodeMirror's Scheme mode (by Koh Zi Han, based on implementation by Koh Zi Chun) - */ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("clojure", function (options) { - var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", CHARACTER = "string-2", - ATOM = "atom", NUMBER = "number", BRACKET = "bracket", KEYWORD = "keyword", VAR = "variable"; - var INDENT_WORD_SKIP = options.indentUnit || 2; - var NORMAL_INDENT_UNIT = options.indentUnit || 2; - - function makeKeywords(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - var atoms = makeKeywords("true false nil"); - - var keywords = makeKeywords( - "defn defn- def def- defonce defmulti defmethod defmacro defstruct deftype defprotocol defrecord defproject deftest " + - "slice defalias defhinted defmacro- defn-memo defnk defnk defonce- defunbound defunbound- defvar defvar- let letfn " + - "do case cond condp for loop recur when when-not when-let when-first if if-let if-not . .. -> ->> doto and or dosync " + - "doseq dotimes dorun doall load import unimport ns in-ns refer try catch finally throw with-open with-local-vars " + - "binding gen-class gen-and-load-class gen-and-save-class handler-case handle"); - - var builtins = makeKeywords( - "* *' *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* " + - "*compile-path* *compiler-options* *data-readers* *e *err* *file* *flush-on-newline* *fn-loader* *in* " + - "*math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* " + - "*source-path* *unchecked-math* *use-context-classloader* *verbose-defrecords* *warn-on-reflection* + +' - -' -> " + - "->> ->ArrayChunk ->Vec ->VecNode ->VecSeq -cache-protocol-fn -reset-methods .. / < <= = == > >= EMPTY-NODE accessor " + - "aclone add-classpath add-watch agent agent-error agent-errors aget alength alias all-ns alter alter-meta! " + - "alter-var-root amap ancestors and apply areduce array-map aset aset-boolean aset-byte aset-char aset-double " + - "aset-float aset-int aset-long aset-short assert assoc assoc! assoc-in associative? atom await await-for await1 " + - "bases bean bigdec bigint biginteger binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set " + - "bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn bound-fn* bound? butlast " + - "byte byte-array bytes case cat cast char char-array char-escape-string char-name-string char? chars chunk chunk-append " + - "chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors " + - "clojure-version coll? comment commute comp comparator compare compare-and-set! compile complement completing concat cond condp " + - "conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec dec' decimal? " + - "declare dedupe default-data-readers definline definterface defmacro defmethod defmulti defn defn- defonce defprotocol " + - "defrecord defstruct deftype delay delay? deliver denominator deref derive descendants destructure disj disj! dissoc " + - "dissoc! distinct distinct? doall dorun doseq dosync dotimes doto double double-array doubles drop drop-last " + - "drop-while eduction empty empty? ensure enumeration-seq error-handler error-mode eval even? every-pred every? ex-data ex-info " + - "extend extend-protocol extend-type extenders extends? false? ffirst file-seq filter filterv find find-keyword " + - "find-ns find-protocol-impl find-protocol-method find-var first flatten float float-array float? floats flush fn fn? " + - "fnext fnil for force format frequencies future future-call future-cancel future-cancelled? future-done? future? " + - "gen-class gen-interface gensym get get-in get-method get-proxy-class get-thread-bindings get-validator group-by hash " + - "hash-combine hash-map hash-set identical? identity if-let if-not ifn? import in-ns inc inc' init-proxy instance? " + - "int int-array integer? interleave intern interpose into into-array ints io! isa? iterate iterator-seq juxt keep " + - "keep-indexed key keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list* list? load load-file " + - "load-reader load-string loaded-libs locking long long-array longs loop macroexpand macroexpand-1 make-array " + - "make-hierarchy map map-indexed map? mapcat mapv max max-key memfn memoize merge merge-with meta method-sig methods " + - "min min-key mod munge name namespace namespace-munge neg? newline next nfirst nil? nnext not not-any? not-empty " + - "not-every? not= ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias " + - "ns-unmap nth nthnext nthrest num number? numerator object-array odd? or parents partial partition partition-all " + - "partition-by pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers " + - "primitives-classnames print print-ctor print-dup print-method print-simple print-str printf println println-str " + - "prn prn-str promise proxy proxy-call-with-super proxy-mappings proxy-name proxy-super push-thread-bindings pvalues " + - "quot rand rand-int rand-nth random-sample range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern " + - "re-seq read read-line read-string realized? reduce reduce-kv reductions ref ref-history-count ref-max-history " + - "ref-min-history ref-set refer refer-clojure reify release-pending-sends rem remove remove-all-methods " + - "remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest " + - "restart-agent resultset-seq reverse reversible? rseq rsubseq satisfies? second select-keys send send-off seq seq? " + - "seque sequence sequential? set set-error-handler! set-error-mode! set-validator! set? short short-array shorts " + - "shuffle shutdown-agents slurp some some-fn sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? " + - "special-symbol? spit split-at split-with str string? struct struct-map subs subseq subvec supers swap! symbol " + - "symbol? sync take take-last take-nth take-while test the-ns thread-bound? time to-array to-array-2d trampoline transduce " + - "transient tree-seq true? type unchecked-add unchecked-add-int unchecked-byte unchecked-char unchecked-dec " + - "unchecked-dec-int unchecked-divide-int unchecked-double unchecked-float unchecked-inc unchecked-inc-int " + - "unchecked-int unchecked-long unchecked-multiply unchecked-multiply-int unchecked-negate unchecked-negate-int "+ - "unchecked-remainder-int unchecked-short unchecked-subtract unchecked-subtract-int underive unquote " + - "unquote-splicing update update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector-of " + - "vector? volatile! volatile? vreset! vswap! when when-first when-let when-not while with-bindings with-bindings* with-in-str with-loading-context " + - "with-local-vars with-meta with-open with-out-str with-precision with-redefs with-redefs-fn xml-seq zero? zipmap " + - "*default-data-reader-fn* as-> cond-> cond->> reduced reduced? send-via set-agent-send-executor! " + - "set-agent-send-off-executor! some-> some->>"); - - var indentKeys = makeKeywords( - // Built-ins - "ns fn def defn defmethod bound-fn if if-not case condp when while when-not when-first do future comment doto " + - "locking proxy with-open with-precision reify deftype defrecord defprotocol extend extend-protocol extend-type " + - "try catch " + - - // Binding forms - "let letfn binding loop for doseq dotimes when-let if-let " + - - // Data structures - "defstruct struct-map assoc " + - - // clojure.test - "testing deftest " + - - // contrib - "handler-case handle dotrace deftrace"); - - var tests = { - digit: /\d/, - digit_or_colon: /[\d:]/, - hex: /[0-9a-f]/i, - sign: /[+-]/, - exponent: /e/i, - keyword_char: /[^\s\(\[\;\)\]]/, - symbol: /[\w*+!\-\._?:<>\/\xa1-\uffff]/, - block_indent: /^(?:def|with)[^\/]+$|\/(?:def|with)/ - }; - - function stateStack(indent, type, prev) { // represents a state stack object - this.indent = indent; - this.type = type; - this.prev = prev; - } - - function pushStack(state, indent, type) { - state.indentStack = new stateStack(indent, type, state.indentStack); - } - - function popStack(state) { - state.indentStack = state.indentStack.prev; - } - - function isNumber(ch, stream){ - // hex - if ( ch === '0' && stream.eat(/x/i) ) { - stream.eatWhile(tests.hex); - return true; - } - - // leading sign - if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) { - stream.eat(tests.sign); - ch = stream.next(); - } - - if ( tests.digit.test(ch) ) { - stream.eat(ch); - stream.eatWhile(tests.digit); - - if ( '.' == stream.peek() ) { - stream.eat('.'); - stream.eatWhile(tests.digit); - } else if ('/' == stream.peek() ) { - stream.eat('/'); - stream.eatWhile(tests.digit); - } - - if ( stream.eat(tests.exponent) ) { - stream.eat(tests.sign); - stream.eatWhile(tests.digit); - } - - return true; - } - - return false; - } - - // Eat character that starts after backslash \ - function eatCharacter(stream) { - var first = stream.next(); - // Read special literals: backspace, newline, space, return. - // Just read all lowercase letters. - if (first && first.match(/[a-z]/) && stream.match(/[a-z]+/, true)) { - return; - } - // Read unicode character: \u1000 \uA0a1 - if (first === "u") { - stream.match(/[0-9a-z]{4}/i, true); - } - } - - return { - startState: function () { - return { - indentStack: null, - indentation: 0, - mode: false - }; - }, - - token: function (stream, state) { - if (state.indentStack == null && stream.sol()) { - // update indentation, but only if indentStack is empty - state.indentation = stream.indentation(); - } - - // skip spaces - if (state.mode != "string" && stream.eatSpace()) { - return null; - } - var returnType = null; - - switch(state.mode){ - case "string": // multi-line string parsing mode - var next, escaped = false; - while ((next = stream.next()) != null) { - if (next == "\"" && !escaped) { - - state.mode = false; - break; - } - escaped = !escaped && next == "\\"; - } - returnType = STRING; // continue on in string mode - break; - default: // default parsing mode - var ch = stream.next(); - - if (ch == "\"") { - state.mode = "string"; - returnType = STRING; - } else if (ch == "\\") { - eatCharacter(stream); - returnType = CHARACTER; - } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) { - returnType = ATOM; - } else if (ch == ";") { // comment - stream.skipToEnd(); // rest of the line is a comment - returnType = COMMENT; - } else if (isNumber(ch,stream)){ - returnType = NUMBER; - } else if (ch == "(" || ch == "[" || ch == "{" ) { - var keyWord = '', indentTemp = stream.column(), letter; - /** - Either - (indent-word .. - (non-indent-word .. - (;something else, bracket, etc. - */ - - if (ch == "(") while ((letter = stream.eat(tests.keyword_char)) != null) { - keyWord += letter; - } - - if (keyWord.length > 0 && (indentKeys.propertyIsEnumerable(keyWord) || - tests.block_indent.test(keyWord))) { // indent-word - pushStack(state, indentTemp + INDENT_WORD_SKIP, ch); - } else { // non-indent word - // we continue eating the spaces - stream.eatSpace(); - if (stream.eol() || stream.peek() == ";") { - // nothing significant after - // we restart indentation the user defined spaces after - pushStack(state, indentTemp + NORMAL_INDENT_UNIT, ch); - } else { - pushStack(state, indentTemp + stream.current().length, ch); // else we match - } - } - stream.backUp(stream.current().length - 1); // undo all the eating - - returnType = BRACKET; - } else if (ch == ")" || ch == "]" || ch == "}") { - returnType = BRACKET; - if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : (ch == "]" ? "[" :"{"))) { - popStack(state); - } - } else if ( ch == ":" ) { - stream.eatWhile(tests.symbol); - return ATOM; - } else { - stream.eatWhile(tests.symbol); - - if (keywords && keywords.propertyIsEnumerable(stream.current())) { - returnType = KEYWORD; - } else if (builtins && builtins.propertyIsEnumerable(stream.current())) { - returnType = BUILTIN; - } else if (atoms && atoms.propertyIsEnumerable(stream.current())) { - returnType = ATOM; - } else { - returnType = VAR; - } - } - } - - return returnType; - }, - - indent: function (state) { - if (state.indentStack == null) return state.indentation; - return state.indentStack.indent; - }, - - closeBrackets: {pairs: "()[]{}\"\""}, - lineComment: ";;" - }; -}); - -CodeMirror.defineMIME("text/x-clojure", "clojure"); -CodeMirror.defineMIME("text/x-clojurescript", "clojure"); -CodeMirror.defineMIME("application/edn", "clojure"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/clojure/index.html b/public/plugins/codemirror-5.17.0/mode/clojure/index.html deleted file mode 100644 index 81294bc..0000000 --- a/public/plugins/codemirror-5.17.0/mode/clojure/index.html +++ /dev/null @@ -1,91 +0,0 @@ - - -CodeMirror: Clojure mode - - - - - - - - - -
-

Clojure mode

-
- - -

MIME types defined: text/x-clojure.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/cmake/cmake.js b/public/plugins/codemirror-5.17.0/mode/cmake/cmake.js deleted file mode 100644 index 9f9eda5..0000000 --- a/public/plugins/codemirror-5.17.0/mode/cmake/cmake.js +++ /dev/null @@ -1,97 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) - define(["../../lib/codemirror"], mod); - else - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("cmake", function () { - var variable_regex = /({)?[a-zA-Z0-9_]+(})?/; - - function tokenString(stream, state) { - var current, prev, found_var = false; - while (!stream.eol() && (current = stream.next()) != state.pending) { - if (current === '$' && prev != '\\' && state.pending == '"') { - found_var = true; - break; - } - prev = current; - } - if (found_var) { - stream.backUp(1); - } - if (current == state.pending) { - state.continueString = false; - } else { - state.continueString = true; - } - return "string"; - } - - function tokenize(stream, state) { - var ch = stream.next(); - - // Have we found a variable? - if (ch === '$') { - if (stream.match(variable_regex)) { - return 'variable-2'; - } - return 'variable'; - } - // Should we still be looking for the end of a string? - if (state.continueString) { - // If so, go through the loop again - stream.backUp(1); - return tokenString(stream, state); - } - // Do we just have a function on our hands? - // In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched - if (stream.match(/(\s+)?\w+\(/) || stream.match(/(\s+)?\w+\ \(/)) { - stream.backUp(1); - return 'def'; - } - if (ch == "#") { - stream.skipToEnd(); - return "comment"; - } - // Have we found a string? - if (ch == "'" || ch == '"') { - // Store the type (single or double) - state.pending = ch; - // Perform the looping function to find the end - return tokenString(stream, state); - } - if (ch == '(' || ch == ')') { - return 'bracket'; - } - if (ch.match(/[0-9]/)) { - return 'number'; - } - stream.eatWhile(/[\w-]/); - return null; - } - return { - startState: function () { - var state = {}; - state.inDefinition = false; - state.inInclude = false; - state.continueString = false; - state.pending = false; - return state; - }, - token: function (stream, state) { - if (stream.eatSpace()) return null; - return tokenize(stream, state); - } - }; -}); - -CodeMirror.defineMIME("text/x-cmake", "cmake"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/cmake/index.html b/public/plugins/codemirror-5.17.0/mode/cmake/index.html deleted file mode 100644 index ed114fe..0000000 --- a/public/plugins/codemirror-5.17.0/mode/cmake/index.html +++ /dev/null @@ -1,129 +0,0 @@ - - -CodeMirror: CMake mode - - - - - - - - - - -
-

CMake mode

-
- - -

MIME types defined: text/x-cmake.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/cobol/cobol.js b/public/plugins/codemirror-5.17.0/mode/cobol/cobol.js deleted file mode 100644 index 897022b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/cobol/cobol.js +++ /dev/null @@ -1,255 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/** - * Author: Gautam Mehta - * Branched from CodeMirror's Scheme mode - */ -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("cobol", function () { - var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", - ATOM = "atom", NUMBER = "number", KEYWORD = "keyword", MODTAG = "header", - COBOLLINENUM = "def", PERIOD = "link"; - function makeKeywords(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - var atoms = makeKeywords("TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES "); - var keywords = makeKeywords( - "ACCEPT ACCESS ACQUIRE ADD ADDRESS " + - "ADVANCING AFTER ALIAS ALL ALPHABET " + - "ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED " + - "ALSO ALTER ALTERNATE AND ANY " + - "ARE AREA AREAS ARITHMETIC ASCENDING " + - "ASSIGN AT ATTRIBUTE AUTHOR AUTO " + - "AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS " + - "B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP " + - "BEFORE BELL BINARY BIT BITS " + - "BLANK BLINK BLOCK BOOLEAN BOTTOM " + - "BY CALL CANCEL CD CF " + - "CH CHARACTER CHARACTERS CLASS CLOCK-UNITS " + - "CLOSE COBOL CODE CODE-SET COL " + - "COLLATING COLUMN COMMA COMMIT COMMITMENT " + - "COMMON COMMUNICATION COMP COMP-0 COMP-1 " + - "COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 " + - "COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 " + - "COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 " + - "COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE " + - "CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS " + - "CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS " + - "CONVERTING COPY CORR CORRESPONDING COUNT " + - "CRT CRT-UNDER CURRENCY CURRENT CURSOR " + - "DATA DATE DATE-COMPILED DATE-WRITTEN DAY " + - "DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION " + - "DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS " + - "DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE " + - "DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING " + - "DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED " + - "DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION " + - "DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 " + - "DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 " + - "DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION " + - "DOWN DROP DUPLICATE DUPLICATES DYNAMIC " + - "EBCDIC EGI EJECT ELSE EMI " + - "EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. " + - "END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY " + - "END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY " + - "END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN " + - "END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT " + - "END-UNSTRING END-WRITE END-XML ENTER ENTRY " + - "ENVIRONMENT EOP EQUAL EQUALS ERASE " + - "ERROR ESI EVALUATE EVERY EXCEEDS " + - "EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL " + - "EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL " + - "FILE-STREAM FILES FILLER FINAL FIND " + - "FINISH FIRST FOOTING FOR FOREGROUND-COLOR " + - "FOREGROUND-COLOUR FORMAT FREE FROM FULL " + - "FUNCTION GENERATE GET GIVING GLOBAL " + - "GO GOBACK GREATER GROUP HEADING " + - "HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL " + - "ID IDENTIFICATION IF IN INDEX " + - "INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 " + - "INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED " + - "INDIC INDICATE INDICATOR INDICATORS INITIAL " + - "INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT " + - "INSTALLATION INTO INVALID INVOKE IS " + - "JUST JUSTIFIED KANJI KEEP KEY " + - "LABEL LAST LD LEADING LEFT " + - "LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY " + - "LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER " + - "LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE " + - "LOCALE LOCALLY LOCK " + - "MEMBER MEMORY MERGE MESSAGE METACLASS " + - "MODE MODIFIED MODIFY MODULES MOVE " + - "MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE " + - "NEXT NO NO-ECHO NONE NOT " + - "NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER " + - "NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS " + - "OF OFF OMITTED ON ONLY " + - "OPEN OPTIONAL OR ORDER ORGANIZATION " + - "OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL " + - "PADDING PAGE PAGE-COUNTER PARSE PERFORM " + - "PF PH PIC PICTURE PLUS " + - "POINTER POSITION POSITIVE PREFIX PRESENT " + - "PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES " + - "PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID " + - "PROMPT PROTECTED PURGE QUEUE QUOTE " + - "QUOTES RANDOM RD READ READY " + - "REALM RECEIVE RECONNECT RECORD RECORD-NAME " + - "RECORDS RECURSIVE REDEFINES REEL REFERENCE " + - "REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE " + - "REMAINDER REMOVAL RENAMES REPEATED REPLACE " + - "REPLACING REPORT REPORTING REPORTS REPOSITORY " + - "REQUIRED RERUN RESERVE RESET RETAINING " + - "RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO " + - "REVERSED REWIND REWRITE RF RH " + - "RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED " + - "RUN SAME SCREEN SD SEARCH " + - "SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT " + - "SELECT SEND SENTENCE SEPARATE SEQUENCE " + - "SEQUENTIAL SET SHARED SIGN SIZE " + - "SKIP1 SKIP2 SKIP3 SORT SORT-MERGE " + - "SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL " + - "SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 " + - "START STARTING STATUS STOP STORE " + - "STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA " + - "SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS " + - "SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT " + - "TABLE TALLYING TAPE TENANT TERMINAL " + - "TERMINATE TEST TEXT THAN THEN " + - "THROUGH THRU TIME TIMES TITLE " + - "TO TOP TRAILING TRAILING-SIGN TRANSACTION " + - "TYPE TYPEDEF UNDERLINE UNEQUAL UNIT " + - "UNSTRING UNTIL UP UPDATE UPON " + - "USAGE USAGE-MODE USE USING VALID " + - "VALIDATE VALUE VALUES VARYING VLR " + - "WAIT WHEN WHEN-COMPILED WITH WITHIN " + - "WORDS WORKING-STORAGE WRITE XML XML-CODE " + - "XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL " ); - - var builtins = makeKeywords("- * ** / + < <= = > >= "); - var tests = { - digit: /\d/, - digit_or_colon: /[\d:]/, - hex: /[0-9a-f]/i, - sign: /[+-]/, - exponent: /e/i, - keyword_char: /[^\s\(\[\;\)\]]/, - symbol: /[\w*+\-]/ - }; - function isNumber(ch, stream){ - // hex - if ( ch === '0' && stream.eat(/x/i) ) { - stream.eatWhile(tests.hex); - return true; - } - // leading sign - if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) { - stream.eat(tests.sign); - ch = stream.next(); - } - if ( tests.digit.test(ch) ) { - stream.eat(ch); - stream.eatWhile(tests.digit); - if ( '.' == stream.peek()) { - stream.eat('.'); - stream.eatWhile(tests.digit); - } - if ( stream.eat(tests.exponent) ) { - stream.eat(tests.sign); - stream.eatWhile(tests.digit); - } - return true; - } - return false; - } - return { - startState: function () { - return { - indentStack: null, - indentation: 0, - mode: false - }; - }, - token: function (stream, state) { - if (state.indentStack == null && stream.sol()) { - // update indentation, but only if indentStack is empty - state.indentation = 6 ; //stream.indentation(); - } - // skip spaces - if (stream.eatSpace()) { - return null; - } - var returnType = null; - switch(state.mode){ - case "string": // multi-line string parsing mode - var next = false; - while ((next = stream.next()) != null) { - if (next == "\"" || next == "\'") { - state.mode = false; - break; - } - } - returnType = STRING; // continue on in string mode - break; - default: // default parsing mode - var ch = stream.next(); - var col = stream.column(); - if (col >= 0 && col <= 5) { - returnType = COBOLLINENUM; - } else if (col >= 72 && col <= 79) { - stream.skipToEnd(); - returnType = MODTAG; - } else if (ch == "*" && col == 6) { // comment - stream.skipToEnd(); // rest of the line is a comment - returnType = COMMENT; - } else if (ch == "\"" || ch == "\'") { - state.mode = "string"; - returnType = STRING; - } else if (ch == "'" && !( tests.digit_or_colon.test(stream.peek()) )) { - returnType = ATOM; - } else if (ch == ".") { - returnType = PERIOD; - } else if (isNumber(ch,stream)){ - returnType = NUMBER; - } else { - if (stream.current().match(tests.symbol)) { - while (col < 71) { - if (stream.eat(tests.symbol) === undefined) { - break; - } else { - col++; - } - } - } - if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { - returnType = KEYWORD; - } else if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) { - returnType = BUILTIN; - } else if (atoms && atoms.propertyIsEnumerable(stream.current().toUpperCase())) { - returnType = ATOM; - } else returnType = null; - } - } - return returnType; - }, - indent: function (state) { - if (state.indentStack == null) return state.indentation; - return state.indentStack.indent; - } - }; -}); - -CodeMirror.defineMIME("text/x-cobol", "cobol"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/cobol/index.html b/public/plugins/codemirror-5.17.0/mode/cobol/index.html deleted file mode 100644 index 4352419..0000000 --- a/public/plugins/codemirror-5.17.0/mode/cobol/index.html +++ /dev/null @@ -1,210 +0,0 @@ - - -CodeMirror: COBOL mode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

COBOL mode

- -

Select Theme Select Font Size - - - - -

- - -
diff --git a/public/plugins/codemirror-5.17.0/mode/coffeescript/coffeescript.js b/public/plugins/codemirror-5.17.0/mode/coffeescript/coffeescript.js deleted file mode 100644 index adf2184..0000000 --- a/public/plugins/codemirror-5.17.0/mode/coffeescript/coffeescript.js +++ /dev/null @@ -1,355 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/** - * Link to the project's GitHub page: - * https://github.com/pickhardt/coffeescript-codemirror-mode - */ -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("coffeescript", function(conf, parserConf) { - var ERRORCLASS = "error"; - - function wordRegexp(words) { - return new RegExp("^((" + words.join(")|(") + "))\\b"); - } - - var operators = /^(?:->|=>|\+[+=]?|-[\-=]?|\*[\*=]?|\/[\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\|=?|\^=?|\~|!|\?|(or|and|\|\||&&|\?)=)/; - var delimiters = /^(?:[()\[\]{},:`=;]|\.\.?\.?)/; - var identifiers = /^[_A-Za-z$][_A-Za-z$0-9]*/; - var atProp = /^@[_A-Za-z$][_A-Za-z$0-9]*/; - - var wordOperators = wordRegexp(["and", "or", "not", - "is", "isnt", "in", - "instanceof", "typeof"]); - var indentKeywords = ["for", "while", "loop", "if", "unless", "else", - "switch", "try", "catch", "finally", "class"]; - var commonKeywords = ["break", "by", "continue", "debugger", "delete", - "do", "in", "of", "new", "return", "then", - "this", "@", "throw", "when", "until", "extends"]; - - var keywords = wordRegexp(indentKeywords.concat(commonKeywords)); - - indentKeywords = wordRegexp(indentKeywords); - - - var stringPrefixes = /^('{3}|\"{3}|['\"])/; - var regexPrefixes = /^(\/{3}|\/)/; - var commonConstants = ["Infinity", "NaN", "undefined", "null", "true", "false", "on", "off", "yes", "no"]; - var constants = wordRegexp(commonConstants); - - // Tokenizers - function tokenBase(stream, state) { - // Handle scope changes - if (stream.sol()) { - if (state.scope.align === null) state.scope.align = false; - var scopeOffset = state.scope.offset; - if (stream.eatSpace()) { - var lineOffset = stream.indentation(); - if (lineOffset > scopeOffset && state.scope.type == "coffee") { - return "indent"; - } else if (lineOffset < scopeOffset) { - return "dedent"; - } - return null; - } else { - if (scopeOffset > 0) { - dedent(stream, state); - } - } - } - if (stream.eatSpace()) { - return null; - } - - var ch = stream.peek(); - - // Handle docco title comment (single line) - if (stream.match("####")) { - stream.skipToEnd(); - return "comment"; - } - - // Handle multi line comments - if (stream.match("###")) { - state.tokenize = longComment; - return state.tokenize(stream, state); - } - - // Single line comment - if (ch === "#") { - stream.skipToEnd(); - return "comment"; - } - - // Handle number literals - if (stream.match(/^-?[0-9\.]/, false)) { - var floatLiteral = false; - // Floats - if (stream.match(/^-?\d*\.\d+(e[\+\-]?\d+)?/i)) { - floatLiteral = true; - } - if (stream.match(/^-?\d+\.\d*/)) { - floatLiteral = true; - } - if (stream.match(/^-?\.\d+/)) { - floatLiteral = true; - } - - if (floatLiteral) { - // prevent from getting extra . on 1.. - if (stream.peek() == "."){ - stream.backUp(1); - } - return "number"; - } - // Integers - var intLiteral = false; - // Hex - if (stream.match(/^-?0x[0-9a-f]+/i)) { - intLiteral = true; - } - // Decimal - if (stream.match(/^-?[1-9]\d*(e[\+\-]?\d+)?/)) { - intLiteral = true; - } - // Zero by itself with no other piece of number. - if (stream.match(/^-?0(?![\dx])/i)) { - intLiteral = true; - } - if (intLiteral) { - return "number"; - } - } - - // Handle strings - if (stream.match(stringPrefixes)) { - state.tokenize = tokenFactory(stream.current(), false, "string"); - return state.tokenize(stream, state); - } - // Handle regex literals - if (stream.match(regexPrefixes)) { - if (stream.current() != "/" || stream.match(/^.*\//, false)) { // prevent highlight of division - state.tokenize = tokenFactory(stream.current(), true, "string-2"); - return state.tokenize(stream, state); - } else { - stream.backUp(1); - } - } - - - - // Handle operators and delimiters - if (stream.match(operators) || stream.match(wordOperators)) { - return "operator"; - } - if (stream.match(delimiters)) { - return "punctuation"; - } - - if (stream.match(constants)) { - return "atom"; - } - - if (stream.match(atProp) || state.prop && stream.match(identifiers)) { - return "property"; - } - - if (stream.match(keywords)) { - return "keyword"; - } - - if (stream.match(identifiers)) { - return "variable"; - } - - // Handle non-detected items - stream.next(); - return ERRORCLASS; - } - - function tokenFactory(delimiter, singleline, outclass) { - return function(stream, state) { - while (!stream.eol()) { - stream.eatWhile(/[^'"\/\\]/); - if (stream.eat("\\")) { - stream.next(); - if (singleline && stream.eol()) { - return outclass; - } - } else if (stream.match(delimiter)) { - state.tokenize = tokenBase; - return outclass; - } else { - stream.eat(/['"\/]/); - } - } - if (singleline) { - if (parserConf.singleLineStringErrors) { - outclass = ERRORCLASS; - } else { - state.tokenize = tokenBase; - } - } - return outclass; - }; - } - - function longComment(stream, state) { - while (!stream.eol()) { - stream.eatWhile(/[^#]/); - if (stream.match("###")) { - state.tokenize = tokenBase; - break; - } - stream.eatWhile("#"); - } - return "comment"; - } - - function indent(stream, state, type) { - type = type || "coffee"; - var offset = 0, align = false, alignOffset = null; - for (var scope = state.scope; scope; scope = scope.prev) { - if (scope.type === "coffee" || scope.type == "}") { - offset = scope.offset + conf.indentUnit; - break; - } - } - if (type !== "coffee") { - align = null; - alignOffset = stream.column() + stream.current().length; - } else if (state.scope.align) { - state.scope.align = false; - } - state.scope = { - offset: offset, - type: type, - prev: state.scope, - align: align, - alignOffset: alignOffset - }; - } - - function dedent(stream, state) { - if (!state.scope.prev) return; - if (state.scope.type === "coffee") { - var _indent = stream.indentation(); - var matched = false; - for (var scope = state.scope; scope; scope = scope.prev) { - if (_indent === scope.offset) { - matched = true; - break; - } - } - if (!matched) { - return true; - } - while (state.scope.prev && state.scope.offset !== _indent) { - state.scope = state.scope.prev; - } - return false; - } else { - state.scope = state.scope.prev; - return false; - } - } - - function tokenLexer(stream, state) { - var style = state.tokenize(stream, state); - var current = stream.current(); - - // Handle scope changes. - if (current === "return") { - state.dedent = true; - } - if (((current === "->" || current === "=>") && stream.eol()) - || style === "indent") { - indent(stream, state); - } - var delimiter_index = "[({".indexOf(current); - if (delimiter_index !== -1) { - indent(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); - } - if (indentKeywords.exec(current)){ - indent(stream, state); - } - if (current == "then"){ - dedent(stream, state); - } - - - if (style === "dedent") { - if (dedent(stream, state)) { - return ERRORCLASS; - } - } - delimiter_index = "])}".indexOf(current); - if (delimiter_index !== -1) { - while (state.scope.type == "coffee" && state.scope.prev) - state.scope = state.scope.prev; - if (state.scope.type == current) - state.scope = state.scope.prev; - } - if (state.dedent && stream.eol()) { - if (state.scope.type == "coffee" && state.scope.prev) - state.scope = state.scope.prev; - state.dedent = false; - } - - return style; - } - - var external = { - startState: function(basecolumn) { - return { - tokenize: tokenBase, - scope: {offset:basecolumn || 0, type:"coffee", prev: null, align: false}, - prop: false, - dedent: 0 - }; - }, - - token: function(stream, state) { - var fillAlign = state.scope.align === null && state.scope; - if (fillAlign && stream.sol()) fillAlign.align = false; - - var style = tokenLexer(stream, state); - if (style && style != "comment") { - if (fillAlign) fillAlign.align = true; - state.prop = style == "punctuation" && stream.current() == "." - } - - return style; - }, - - indent: function(state, text) { - if (state.tokenize != tokenBase) return 0; - var scope = state.scope; - var closer = text && "])}".indexOf(text.charAt(0)) > -1; - if (closer) while (scope.type == "coffee" && scope.prev) scope = scope.prev; - var closes = closer && scope.type === text.charAt(0); - if (scope.align) - return scope.alignOffset - (closes ? 1 : 0); - else - return (closes ? scope.prev : scope).offset; - }, - - lineComment: "#", - fold: "indent" - }; - return external; -}); - -CodeMirror.defineMIME("text/x-coffeescript", "coffeescript"); -CodeMirror.defineMIME("text/coffeescript", "coffeescript"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/coffeescript/index.html b/public/plugins/codemirror-5.17.0/mode/coffeescript/index.html deleted file mode 100644 index 93a5f4f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/coffeescript/index.html +++ /dev/null @@ -1,740 +0,0 @@ - - -CodeMirror: CoffeeScript mode - - - - - - - - - -
-

CoffeeScript mode

-
- - -

MIME types defined: text/x-coffeescript.

- -

The CoffeeScript mode was written by Jeff Pickhardt.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/commonlisp/commonlisp.js b/public/plugins/codemirror-5.17.0/mode/commonlisp/commonlisp.js deleted file mode 100644 index fb1f99c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/commonlisp/commonlisp.js +++ /dev/null @@ -1,123 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("commonlisp", function (config) { - var specialForm = /^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/; - var assumeBody = /^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/; - var numLiteral = /^(?:[+\-]?(?:\d+|\d*\.\d+)(?:[efd][+\-]?\d+)?|[+\-]?\d+(?:\/[+\-]?\d+)?|#b[+\-]?[01]+|#o[+\-]?[0-7]+|#x[+\-]?[\da-f]+)/; - var symbol = /[^\s'`,@()\[\]";]/; - var type; - - function readSym(stream) { - var ch; - while (ch = stream.next()) { - if (ch == "\\") stream.next(); - else if (!symbol.test(ch)) { stream.backUp(1); break; } - } - return stream.current(); - } - - function base(stream, state) { - if (stream.eatSpace()) {type = "ws"; return null;} - if (stream.match(numLiteral)) return "number"; - var ch = stream.next(); - if (ch == "\\") ch = stream.next(); - - if (ch == '"') return (state.tokenize = inString)(stream, state); - else if (ch == "(") { type = "open"; return "bracket"; } - else if (ch == ")" || ch == "]") { type = "close"; return "bracket"; } - else if (ch == ";") { stream.skipToEnd(); type = "ws"; return "comment"; } - else if (/['`,@]/.test(ch)) return null; - else if (ch == "|") { - if (stream.skipTo("|")) { stream.next(); return "symbol"; } - else { stream.skipToEnd(); return "error"; } - } else if (ch == "#") { - var ch = stream.next(); - if (ch == "[") { type = "open"; return "bracket"; } - else if (/[+\-=\.']/.test(ch)) return null; - else if (/\d/.test(ch) && stream.match(/^\d*#/)) return null; - else if (ch == "|") return (state.tokenize = inComment)(stream, state); - else if (ch == ":") { readSym(stream); return "meta"; } - else return "error"; - } else { - var name = readSym(stream); - if (name == ".") return null; - type = "symbol"; - if (name == "nil" || name == "t" || name.charAt(0) == ":") return "atom"; - if (state.lastType == "open" && (specialForm.test(name) || assumeBody.test(name))) return "keyword"; - if (name.charAt(0) == "&") return "variable-2"; - return "variable"; - } - } - - function inString(stream, state) { - var escaped = false, next; - while (next = stream.next()) { - if (next == '"' && !escaped) { state.tokenize = base; break; } - escaped = !escaped && next == "\\"; - } - return "string"; - } - - function inComment(stream, state) { - var next, last; - while (next = stream.next()) { - if (next == "#" && last == "|") { state.tokenize = base; break; } - last = next; - } - type = "ws"; - return "comment"; - } - - return { - startState: function () { - return {ctx: {prev: null, start: 0, indentTo: 0}, lastType: null, tokenize: base}; - }, - - token: function (stream, state) { - if (stream.sol() && typeof state.ctx.indentTo != "number") - state.ctx.indentTo = state.ctx.start + 1; - - type = null; - var style = state.tokenize(stream, state); - if (type != "ws") { - if (state.ctx.indentTo == null) { - if (type == "symbol" && assumeBody.test(stream.current())) - state.ctx.indentTo = state.ctx.start + config.indentUnit; - else - state.ctx.indentTo = "next"; - } else if (state.ctx.indentTo == "next") { - state.ctx.indentTo = stream.column(); - } - state.lastType = type; - } - if (type == "open") state.ctx = {prev: state.ctx, start: stream.column(), indentTo: null}; - else if (type == "close") state.ctx = state.ctx.prev || state.ctx; - return style; - }, - - indent: function (state, _textAfter) { - var i = state.ctx.indentTo; - return typeof i == "number" ? i : state.ctx.start + 1; - }, - - closeBrackets: {pairs: "()[]{}\"\""}, - lineComment: ";;", - blockCommentStart: "#|", - blockCommentEnd: "|#" - }; -}); - -CodeMirror.defineMIME("text/x-common-lisp", "commonlisp"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/commonlisp/index.html b/public/plugins/codemirror-5.17.0/mode/commonlisp/index.html deleted file mode 100644 index f2bf452..0000000 --- a/public/plugins/codemirror-5.17.0/mode/commonlisp/index.html +++ /dev/null @@ -1,177 +0,0 @@ - - -CodeMirror: Common Lisp mode - - - - - - - - - -
-

Common Lisp mode

-
- - -

MIME types defined: text/x-common-lisp.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/crystal/crystal.js b/public/plugins/codemirror-5.17.0/mode/crystal/crystal.js deleted file mode 100644 index e63627c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/crystal/crystal.js +++ /dev/null @@ -1,391 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("crystal", function(config) { - function wordRegExp(words, end) { - return new RegExp((end ? "" : "^") + "(?:" + words.join("|") + ")" + (end ? "$" : "\\b")); - } - - function chain(tokenize, stream, state) { - state.tokenize.push(tokenize); - return tokenize(stream, state); - } - - var operators = /^(?:[-+/%|&^]|\*\*?|[<>]{2})/; - var conditionalOperators = /^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/; - var indexingOperators = /^(?:\[\][?=]?)/; - var anotherOperators = /^(?:\.(?:\.{2})?|->|[?:])/; - var idents = /^[a-z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/; - var types = /^[A-Z_\u009F-\uFFFF][a-zA-Z0-9_\u009F-\uFFFF]*/; - var keywords = wordRegExp([ - "abstract", "alias", "as", "asm", "begin", "break", "case", "class", "def", "do", - "else", "elsif", "end", "ensure", "enum", "extend", "for", "fun", "if", "ifdef", - "include", "instance_sizeof", "lib", "macro", "module", "next", "of", "out", "pointerof", - "private", "protected", "rescue", "return", "require", "sizeof", "struct", - "super", "then", "type", "typeof", "union", "unless", "until", "when", "while", "with", - "yield", "__DIR__", "__FILE__", "__LINE__" - ]); - var atomWords = wordRegExp(["true", "false", "nil", "self"]); - var indentKeywordsArray = [ - "def", "fun", "macro", - "class", "module", "struct", "lib", "enum", "union", - "if", "unless", "case", "while", "until", "begin", "then", - "do", - "for", "ifdef" - ]; - var indentKeywords = wordRegExp(indentKeywordsArray); - var dedentKeywordsArray = [ - "end", - "else", "elsif", - "rescue", "ensure" - ]; - var dedentKeywords = wordRegExp(dedentKeywordsArray); - var dedentPunctualsArray = ["\\)", "\\}", "\\]"]; - var dedentPunctuals = new RegExp("^(?:" + dedentPunctualsArray.join("|") + ")$"); - var nextTokenizer = { - "def": tokenFollowIdent, "fun": tokenFollowIdent, "macro": tokenMacroDef, - "class": tokenFollowType, "module": tokenFollowType, "struct": tokenFollowType, - "lib": tokenFollowType, "enum": tokenFollowType, "union": tokenFollowType - }; - var matching = {"[": "]", "{": "}", "(": ")", "<": ">"}; - - function tokenBase(stream, state) { - if (stream.eatSpace()) { - return null; - } - - // Macros - if (state.lastToken != "\\" && stream.match("{%", false)) { - return chain(tokenMacro("%", "%"), stream, state); - } - - if (state.lastToken != "\\" && stream.match("{{", false)) { - return chain(tokenMacro("{", "}"), stream, state); - } - - // Comments - if (stream.peek() == "#") { - stream.skipToEnd(); - return "comment"; - } - - // Variables and keywords - var matched; - if (stream.match(idents)) { - stream.eat(/[?!]/); - - matched = stream.current(); - if (stream.eat(":")) { - return "atom"; - } else if (state.lastToken == ".") { - return "property"; - } else if (keywords.test(matched)) { - if (state.lastToken != "abstract" && indentKeywords.test(matched)) { - if (!(matched == "fun" && state.blocks.indexOf("lib") >= 0)) { - state.blocks.push(matched); - state.currentIndent += 1; - } - } else if (dedentKeywords.test(matched)) { - state.blocks.pop(); - state.currentIndent -= 1; - } - - if (nextTokenizer.hasOwnProperty(matched)) { - state.tokenize.push(nextTokenizer[matched]); - } - - return "keyword"; - } else if (atomWords.test(matched)) { - return "atom"; - } - - return "variable"; - } - - // Class variables and instance variables - // or attributes - if (stream.eat("@")) { - if (stream.peek() == "[") { - return chain(tokenNest("[", "]", "meta"), stream, state); - } - - stream.eat("@"); - stream.match(idents) || stream.match(types); - return "variable-2"; - } - - // Global variables - if (stream.eat("$")) { - stream.eat(/[0-9]+|\?/) || stream.match(idents) || stream.match(types); - return "variable-3"; - } - - // Constants and types - if (stream.match(types)) { - return "tag"; - } - - // Symbols or ':' operator - if (stream.eat(":")) { - if (stream.eat("\"")) { - return chain(tokenQuote("\"", "atom", false), stream, state); - } else if (stream.match(idents) || stream.match(types) || - stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators)) { - return "atom"; - } - stream.eat(":"); - return "operator"; - } - - // Strings - if (stream.eat("\"")) { - return chain(tokenQuote("\"", "string", true), stream, state); - } - - // Strings or regexps or macro variables or '%' operator - if (stream.peek() == "%") { - var style = "string"; - var embed = true; - var delim; - - if (stream.match("%r")) { - // Regexps - style = "string-2"; - delim = stream.next(); - } else if (stream.match("%w")) { - embed = false; - delim = stream.next(); - } else { - if(delim = stream.match(/^%([^\w\s=])/)) { - delim = delim[1]; - } else if (stream.match(/^%[a-zA-Z0-9_\u009F-\uFFFF]*/)) { - // Macro variables - return "meta"; - } else { - // '%' operator - return "operator"; - } - } - - if (matching.hasOwnProperty(delim)) { - delim = matching[delim]; - } - return chain(tokenQuote(delim, style, embed), stream, state); - } - - // Characters - if (stream.eat("'")) { - stream.match(/^(?:[^']|\\(?:[befnrtv0'"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\{[0-9a-fA-F]{1,6}\})))/); - stream.eat("'"); - return "atom"; - } - - // Numbers - if (stream.eat("0")) { - if (stream.eat("x")) { - stream.match(/^[0-9a-fA-F]+/); - } else if (stream.eat("o")) { - stream.match(/^[0-7]+/); - } else if (stream.eat("b")) { - stream.match(/^[01]+/); - } - return "number"; - } - - if (stream.eat(/\d/)) { - stream.match(/^\d*(?:\.\d+)?(?:[eE][+-]?\d+)?/); - return "number"; - } - - // Operators - if (stream.match(operators)) { - stream.eat("="); // Operators can follow assign symbol. - return "operator"; - } - - if (stream.match(conditionalOperators) || stream.match(anotherOperators)) { - return "operator"; - } - - // Parens and braces - if (matched = stream.match(/[({[]/, false)) { - matched = matched[0]; - return chain(tokenNest(matched, matching[matched], null), stream, state); - } - - // Escapes - if (stream.eat("\\")) { - stream.next(); - return "meta"; - } - - stream.next(); - return null; - } - - function tokenNest(begin, end, style, started) { - return function (stream, state) { - if (!started && stream.match(begin)) { - state.tokenize[state.tokenize.length - 1] = tokenNest(begin, end, style, true); - state.currentIndent += 1; - return style; - } - - var nextStyle = tokenBase(stream, state); - if (stream.current() === end) { - state.tokenize.pop(); - state.currentIndent -= 1; - nextStyle = style; - } - - return nextStyle; - }; - } - - function tokenMacro(begin, end, started) { - return function (stream, state) { - if (!started && stream.match("{" + begin)) { - state.currentIndent += 1; - state.tokenize[state.tokenize.length - 1] = tokenMacro(begin, end, true); - return "meta"; - } - - if (stream.match(end + "}")) { - state.currentIndent -= 1; - state.tokenize.pop(); - return "meta"; - } - - return tokenBase(stream, state); - }; - } - - function tokenMacroDef(stream, state) { - if (stream.eatSpace()) { - return null; - } - - var matched; - if (matched = stream.match(idents)) { - if (matched == "def") { - return "keyword"; - } - stream.eat(/[?!]/); - } - - state.tokenize.pop(); - return "def"; - } - - function tokenFollowIdent(stream, state) { - if (stream.eatSpace()) { - return null; - } - - if (stream.match(idents)) { - stream.eat(/[!?]/); - } else { - stream.match(operators) || stream.match(conditionalOperators) || stream.match(indexingOperators); - } - state.tokenize.pop(); - return "def"; - } - - function tokenFollowType(stream, state) { - if (stream.eatSpace()) { - return null; - } - - stream.match(types); - state.tokenize.pop(); - return "def"; - } - - function tokenQuote(end, style, embed) { - return function (stream, state) { - var escaped = false; - - while (stream.peek()) { - if (!escaped) { - if (stream.match("{%", false)) { - state.tokenize.push(tokenMacro("%", "%")); - return style; - } - - if (stream.match("{{", false)) { - state.tokenize.push(tokenMacro("{", "}")); - return style; - } - - if (embed && stream.match("#{", false)) { - state.tokenize.push(tokenNest("#{", "}", "meta")); - return style; - } - - var ch = stream.next(); - - if (ch == end) { - state.tokenize.pop(); - return style; - } - - escaped = ch == "\\"; - } else { - stream.next(); - escaped = false; - } - } - - return style; - }; - } - - return { - startState: function () { - return { - tokenize: [tokenBase], - currentIndent: 0, - lastToken: null, - blocks: [] - }; - }, - - token: function (stream, state) { - var style = state.tokenize[state.tokenize.length - 1](stream, state); - var token = stream.current(); - - if (style && style != "comment") { - state.lastToken = token; - } - - return style; - }, - - indent: function (state, textAfter) { - textAfter = textAfter.replace(/^\s*(?:\{%)?\s*|\s*(?:%\})?\s*$/g, ""); - - if (dedentKeywords.test(textAfter) || dedentPunctuals.test(textAfter)) { - return config.indentUnit * (state.currentIndent - 1); - } - - return config.indentUnit * state.currentIndent; - }, - - fold: "indent", - electricInput: wordRegExp(dedentPunctualsArray.concat(dedentKeywordsArray), true), - lineComment: '#' - }; - }); - - CodeMirror.defineMIME("text/x-crystal", "crystal"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/crystal/index.html b/public/plugins/codemirror-5.17.0/mode/crystal/index.html deleted file mode 100644 index ec03e25..0000000 --- a/public/plugins/codemirror-5.17.0/mode/crystal/index.html +++ /dev/null @@ -1,119 +0,0 @@ - - -CodeMirror: Crystal mode - - - - - - - - - - - -
-

Crystal mode

-
- - -

MIME types defined: text/x-crystal.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/css/css.js b/public/plugins/codemirror-5.17.0/mode/css/css.js deleted file mode 100644 index ea7bd01..0000000 --- a/public/plugins/codemirror-5.17.0/mode/css/css.js +++ /dev/null @@ -1,825 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("css", function(config, parserConfig) { - var inline = parserConfig.inline - if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); - - var indentUnit = config.indentUnit, - tokenHooks = parserConfig.tokenHooks, - documentTypes = parserConfig.documentTypes || {}, - mediaTypes = parserConfig.mediaTypes || {}, - mediaFeatures = parserConfig.mediaFeatures || {}, - mediaValueKeywords = parserConfig.mediaValueKeywords || {}, - propertyKeywords = parserConfig.propertyKeywords || {}, - nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {}, - fontProperties = parserConfig.fontProperties || {}, - counterDescriptors = parserConfig.counterDescriptors || {}, - colorKeywords = parserConfig.colorKeywords || {}, - valueKeywords = parserConfig.valueKeywords || {}, - allowNested = parserConfig.allowNested, - supportsAtComponent = parserConfig.supportsAtComponent === true; - - var type, override; - function ret(style, tp) { type = tp; return style; } - - // Tokenizers - - function tokenBase(stream, state) { - var ch = stream.next(); - if (tokenHooks[ch]) { - var result = tokenHooks[ch](stream, state); - if (result !== false) return result; - } - if (ch == "@") { - stream.eatWhile(/[\w\\\-]/); - return ret("def", stream.current()); - } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) { - return ret(null, "compare"); - } else if (ch == "\"" || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } else if (ch == "#") { - stream.eatWhile(/[\w\\\-]/); - return ret("atom", "hash"); - } else if (ch == "!") { - stream.match(/^\s*\w*/); - return ret("keyword", "important"); - } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) { - stream.eatWhile(/[\w.%]/); - return ret("number", "unit"); - } else if (ch === "-") { - if (/[\d.]/.test(stream.peek())) { - stream.eatWhile(/[\w.%]/); - return ret("number", "unit"); - } else if (stream.match(/^-[\w\\\-]+/)) { - stream.eatWhile(/[\w\\\-]/); - if (stream.match(/^\s*:/, false)) - return ret("variable-2", "variable-definition"); - return ret("variable-2", "variable"); - } else if (stream.match(/^\w+-/)) { - return ret("meta", "meta"); - } - } else if (/[,+>*\/]/.test(ch)) { - return ret(null, "select-op"); - } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { - return ret("qualifier", "qualifier"); - } else if (/[:;{}\[\]\(\)]/.test(ch)) { - return ret(null, ch); - } else if ((ch == "u" && stream.match(/rl(-prefix)?\(/)) || - (ch == "d" && stream.match("omain(")) || - (ch == "r" && stream.match("egexp("))) { - stream.backUp(1); - state.tokenize = tokenParenthesized; - return ret("property", "word"); - } else if (/[\w\\\-]/.test(ch)) { - stream.eatWhile(/[\w\\\-]/); - return ret("property", "word"); - } else { - return ret(null, null); - } - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) { - if (quote == ")") stream.backUp(1); - break; - } - escaped = !escaped && ch == "\\"; - } - if (ch == quote || !escaped && quote != ")") state.tokenize = null; - return ret("string", "string"); - }; - } - - function tokenParenthesized(stream, state) { - stream.next(); // Must be '(' - if (!stream.match(/\s*[\"\')]/, false)) - state.tokenize = tokenString(")"); - else - state.tokenize = null; - return ret(null, "("); - } - - // Context management - - function Context(type, indent, prev) { - this.type = type; - this.indent = indent; - this.prev = prev; - } - - function pushContext(state, stream, type, indent) { - state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context); - return type; - } - - function popContext(state) { - if (state.context.prev) - state.context = state.context.prev; - return state.context.type; - } - - function pass(type, stream, state) { - return states[state.context.type](type, stream, state); - } - function popAndPass(type, stream, state, n) { - for (var i = n || 1; i > 0; i--) - state.context = state.context.prev; - return pass(type, stream, state); - } - - // Parser - - function wordAsValue(stream) { - var word = stream.current().toLowerCase(); - if (valueKeywords.hasOwnProperty(word)) - override = "atom"; - else if (colorKeywords.hasOwnProperty(word)) - override = "keyword"; - else - override = "variable"; - } - - var states = {}; - - states.top = function(type, stream, state) { - if (type == "{") { - return pushContext(state, stream, "block"); - } else if (type == "}" && state.context.prev) { - return popContext(state); - } else if (supportsAtComponent && /@component/.test(type)) { - return pushContext(state, stream, "atComponentBlock"); - } else if (/^@(-moz-)?document$/.test(type)) { - return pushContext(state, stream, "documentTypes"); - } else if (/^@(media|supports|(-moz-)?document|import)$/.test(type)) { - return pushContext(state, stream, "atBlock"); - } else if (/^@(font-face|counter-style)/.test(type)) { - state.stateArg = type; - return "restricted_atBlock_before"; - } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) { - return "keyframes"; - } else if (type && type.charAt(0) == "@") { - return pushContext(state, stream, "at"); - } else if (type == "hash") { - override = "builtin"; - } else if (type == "word") { - override = "tag"; - } else if (type == "variable-definition") { - return "maybeprop"; - } else if (type == "interpolation") { - return pushContext(state, stream, "interpolation"); - } else if (type == ":") { - return "pseudo"; - } else if (allowNested && type == "(") { - return pushContext(state, stream, "parens"); - } - return state.context.type; - }; - - states.block = function(type, stream, state) { - if (type == "word") { - var word = stream.current().toLowerCase(); - if (propertyKeywords.hasOwnProperty(word)) { - override = "property"; - return "maybeprop"; - } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) { - override = "string-2"; - return "maybeprop"; - } else if (allowNested) { - override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag"; - return "block"; - } else { - override += " error"; - return "maybeprop"; - } - } else if (type == "meta") { - return "block"; - } else if (!allowNested && (type == "hash" || type == "qualifier")) { - override = "error"; - return "block"; - } else { - return states.top(type, stream, state); - } - }; - - states.maybeprop = function(type, stream, state) { - if (type == ":") return pushContext(state, stream, "prop"); - return pass(type, stream, state); - }; - - states.prop = function(type, stream, state) { - if (type == ";") return popContext(state); - if (type == "{" && allowNested) return pushContext(state, stream, "propBlock"); - if (type == "}" || type == "{") return popAndPass(type, stream, state); - if (type == "(") return pushContext(state, stream, "parens"); - - if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) { - override += " error"; - } else if (type == "word") { - wordAsValue(stream); - } else if (type == "interpolation") { - return pushContext(state, stream, "interpolation"); - } - return "prop"; - }; - - states.propBlock = function(type, _stream, state) { - if (type == "}") return popContext(state); - if (type == "word") { override = "property"; return "maybeprop"; } - return state.context.type; - }; - - states.parens = function(type, stream, state) { - if (type == "{" || type == "}") return popAndPass(type, stream, state); - if (type == ")") return popContext(state); - if (type == "(") return pushContext(state, stream, "parens"); - if (type == "interpolation") return pushContext(state, stream, "interpolation"); - if (type == "word") wordAsValue(stream); - return "parens"; - }; - - states.pseudo = function(type, stream, state) { - if (type == "word") { - override = "variable-3"; - return state.context.type; - } - return pass(type, stream, state); - }; - - states.documentTypes = function(type, stream, state) { - if (type == "word" && documentTypes.hasOwnProperty(stream.current())) { - override = "tag"; - return state.context.type; - } else { - return states.atBlock(type, stream, state); - } - }; - - states.atBlock = function(type, stream, state) { - if (type == "(") return pushContext(state, stream, "atBlock_parens"); - if (type == "}" || type == ";") return popAndPass(type, stream, state); - if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top"); - - if (type == "interpolation") return pushContext(state, stream, "interpolation"); - - if (type == "word") { - var word = stream.current().toLowerCase(); - if (word == "only" || word == "not" || word == "and" || word == "or") - override = "keyword"; - else if (mediaTypes.hasOwnProperty(word)) - override = "attribute"; - else if (mediaFeatures.hasOwnProperty(word)) - override = "property"; - else if (mediaValueKeywords.hasOwnProperty(word)) - override = "keyword"; - else if (propertyKeywords.hasOwnProperty(word)) - override = "property"; - else if (nonStandardPropertyKeywords.hasOwnProperty(word)) - override = "string-2"; - else if (valueKeywords.hasOwnProperty(word)) - override = "atom"; - else if (colorKeywords.hasOwnProperty(word)) - override = "keyword"; - else - override = "error"; - } - return state.context.type; - }; - - states.atComponentBlock = function(type, stream, state) { - if (type == "}") - return popAndPass(type, stream, state); - if (type == "{") - return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false); - if (type == "word") - override = "error"; - return state.context.type; - }; - - states.atBlock_parens = function(type, stream, state) { - if (type == ")") return popContext(state); - if (type == "{" || type == "}") return popAndPass(type, stream, state, 2); - return states.atBlock(type, stream, state); - }; - - states.restricted_atBlock_before = function(type, stream, state) { - if (type == "{") - return pushContext(state, stream, "restricted_atBlock"); - if (type == "word" && state.stateArg == "@counter-style") { - override = "variable"; - return "restricted_atBlock_before"; - } - return pass(type, stream, state); - }; - - states.restricted_atBlock = function(type, stream, state) { - if (type == "}") { - state.stateArg = null; - return popContext(state); - } - if (type == "word") { - if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) || - (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase()))) - override = "error"; - else - override = "property"; - return "maybeprop"; - } - return "restricted_atBlock"; - }; - - states.keyframes = function(type, stream, state) { - if (type == "word") { override = "variable"; return "keyframes"; } - if (type == "{") return pushContext(state, stream, "top"); - return pass(type, stream, state); - }; - - states.at = function(type, stream, state) { - if (type == ";") return popContext(state); - if (type == "{" || type == "}") return popAndPass(type, stream, state); - if (type == "word") override = "tag"; - else if (type == "hash") override = "builtin"; - return "at"; - }; - - states.interpolation = function(type, stream, state) { - if (type == "}") return popContext(state); - if (type == "{" || type == ";") return popAndPass(type, stream, state); - if (type == "word") override = "variable"; - else if (type != "variable" && type != "(" && type != ")") override = "error"; - return "interpolation"; - }; - - return { - startState: function(base) { - return {tokenize: null, - state: inline ? "block" : "top", - stateArg: null, - context: new Context(inline ? "block" : "top", base || 0, null)}; - }, - - token: function(stream, state) { - if (!state.tokenize && stream.eatSpace()) return null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style && typeof style == "object") { - type = style[1]; - style = style[0]; - } - override = style; - state.state = states[state.state](type, stream, state); - return override; - }, - - indent: function(state, textAfter) { - var cx = state.context, ch = textAfter && textAfter.charAt(0); - var indent = cx.indent; - if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev; - if (cx.prev) { - if (ch == "}" && (cx.type == "block" || cx.type == "top" || - cx.type == "interpolation" || cx.type == "restricted_atBlock")) { - // Resume indentation from parent context. - cx = cx.prev; - indent = cx.indent; - } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || - ch == "{" && (cx.type == "at" || cx.type == "atBlock")) { - // Dedent relative to current context. - indent = Math.max(0, cx.indent - indentUnit); - cx = cx.prev; - } - } - return indent; - }, - - electricChars: "}", - blockCommentStart: "/*", - blockCommentEnd: "*/", - fold: "brace" - }; -}); - - function keySet(array) { - var keys = {}; - for (var i = 0; i < array.length; ++i) { - keys[array[i]] = true; - } - return keys; - } - - var documentTypes_ = [ - "domain", "regexp", "url", "url-prefix" - ], documentTypes = keySet(documentTypes_); - - var mediaTypes_ = [ - "all", "aural", "braille", "handheld", "print", "projection", "screen", - "tty", "tv", "embossed" - ], mediaTypes = keySet(mediaTypes_); - - var mediaFeatures_ = [ - "width", "min-width", "max-width", "height", "min-height", "max-height", - "device-width", "min-device-width", "max-device-width", "device-height", - "min-device-height", "max-device-height", "aspect-ratio", - "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", - "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", - "max-color", "color-index", "min-color-index", "max-color-index", - "monochrome", "min-monochrome", "max-monochrome", "resolution", - "min-resolution", "max-resolution", "scan", "grid", "orientation", - "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", - "pointer", "any-pointer", "hover", "any-hover" - ], mediaFeatures = keySet(mediaFeatures_); - - var mediaValueKeywords_ = [ - "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", - "interlace", "progressive" - ], mediaValueKeywords = keySet(mediaValueKeywords_); - - var propertyKeywords_ = [ - "align-content", "align-items", "align-self", "alignment-adjust", - "alignment-baseline", "anchor-point", "animation", "animation-delay", - "animation-direction", "animation-duration", "animation-fill-mode", - "animation-iteration-count", "animation-name", "animation-play-state", - "animation-timing-function", "appearance", "azimuth", "backface-visibility", - "background", "background-attachment", "background-blend-mode", "background-clip", - "background-color", "background-image", "background-origin", "background-position", - "background-repeat", "background-size", "baseline-shift", "binding", - "bleed", "bookmark-label", "bookmark-level", "bookmark-state", - "bookmark-target", "border", "border-bottom", "border-bottom-color", - "border-bottom-left-radius", "border-bottom-right-radius", - "border-bottom-style", "border-bottom-width", "border-collapse", - "border-color", "border-image", "border-image-outset", - "border-image-repeat", "border-image-slice", "border-image-source", - "border-image-width", "border-left", "border-left-color", - "border-left-style", "border-left-width", "border-radius", "border-right", - "border-right-color", "border-right-style", "border-right-width", - "border-spacing", "border-style", "border-top", "border-top-color", - "border-top-left-radius", "border-top-right-radius", "border-top-style", - "border-top-width", "border-width", "bottom", "box-decoration-break", - "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", - "caption-side", "clear", "clip", "color", "color-profile", "column-count", - "column-fill", "column-gap", "column-rule", "column-rule-color", - "column-rule-style", "column-rule-width", "column-span", "column-width", - "columns", "content", "counter-increment", "counter-reset", "crop", "cue", - "cue-after", "cue-before", "cursor", "direction", "display", - "dominant-baseline", "drop-initial-after-adjust", - "drop-initial-after-align", "drop-initial-before-adjust", - "drop-initial-before-align", "drop-initial-size", "drop-initial-value", - "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", - "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", - "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", - "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", - "font-stretch", "font-style", "font-synthesis", "font-variant", - "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", - "font-variant-ligatures", "font-variant-numeric", "font-variant-position", - "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", - "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-gap", - "grid-column-start", "grid-gap", "grid-row", "grid-row-end", "grid-row-gap", - "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns", - "grid-template-rows", "hanging-punctuation", "height", "hyphens", - "icon", "image-orientation", "image-rendering", "image-resolution", - "inline-box-align", "justify-content", "left", "letter-spacing", - "line-break", "line-height", "line-stacking", "line-stacking-ruby", - "line-stacking-shift", "line-stacking-strategy", "list-style", - "list-style-image", "list-style-position", "list-style-type", "margin", - "margin-bottom", "margin-left", "margin-right", "margin-top", - "marker-offset", "marks", "marquee-direction", "marquee-loop", - "marquee-play-count", "marquee-speed", "marquee-style", "max-height", - "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", - "nav-left", "nav-right", "nav-up", "object-fit", "object-position", - "opacity", "order", "orphans", "outline", - "outline-color", "outline-offset", "outline-style", "outline-width", - "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", - "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", - "page", "page-break-after", "page-break-before", "page-break-inside", - "page-policy", "pause", "pause-after", "pause-before", "perspective", - "perspective-origin", "pitch", "pitch-range", "play-during", "position", - "presentation-level", "punctuation-trim", "quotes", "region-break-after", - "region-break-before", "region-break-inside", "region-fragment", - "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", - "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", - "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin", - "shape-outside", "size", "speak", "speak-as", "speak-header", - "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", - "tab-size", "table-layout", "target", "target-name", "target-new", - "target-position", "text-align", "text-align-last", "text-decoration", - "text-decoration-color", "text-decoration-line", "text-decoration-skip", - "text-decoration-style", "text-emphasis", "text-emphasis-color", - "text-emphasis-position", "text-emphasis-style", "text-height", - "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", - "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", - "text-wrap", "top", "transform", "transform-origin", "transform-style", - "transition", "transition-delay", "transition-duration", - "transition-property", "transition-timing-function", "unicode-bidi", - "vertical-align", "visibility", "voice-balance", "voice-duration", - "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", - "voice-volume", "volume", "white-space", "widows", "width", "word-break", - "word-spacing", "word-wrap", "z-index", - // SVG-specific - "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", - "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", - "color-interpolation", "color-interpolation-filters", - "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", - "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", - "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", - "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", - "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", - "glyph-orientation-vertical", "text-anchor", "writing-mode" - ], propertyKeywords = keySet(propertyKeywords_); - - var nonStandardPropertyKeywords_ = [ - "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", - "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", - "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", - "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", - "searchfield-results-decoration", "zoom" - ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_); - - var fontProperties_ = [ - "font-family", "src", "unicode-range", "font-variant", "font-feature-settings", - "font-stretch", "font-weight", "font-style" - ], fontProperties = keySet(fontProperties_); - - var counterDescriptors_ = [ - "additive-symbols", "fallback", "negative", "pad", "prefix", "range", - "speak-as", "suffix", "symbols", "system" - ], counterDescriptors = keySet(counterDescriptors_); - - var colorKeywords_ = [ - "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", - "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", - "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", - "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", - "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", - "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", - "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", - "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", - "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", - "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", - "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", - "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", - "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", - "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", - "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", - "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", - "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", - "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", - "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", - "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", - "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", - "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", - "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", - "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", - "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", - "whitesmoke", "yellow", "yellowgreen" - ], colorKeywords = keySet(colorKeywords_); - - var valueKeywords_ = [ - "above", "absolute", "activeborder", "additive", "activecaption", "afar", - "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", - "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", - "arabic-indic", "armenian", "asterisks", "attr", "auto", "avoid", "avoid-column", "avoid-page", - "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", - "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", - "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", - "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", - "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", - "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", - "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", - "col-resize", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", - "compact", "condensed", "contain", "content", - "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop", - "cross", "crosshair", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal", - "decimal-leading-zero", "default", "default-button", "dense", "destination-atop", - "destination-in", "destination-out", "destination-over", "devanagari", "difference", - "disc", "discard", "disclosure-closed", "disclosure-open", "document", - "dot-dash", "dot-dot-dash", - "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", - "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", - "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", - "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", - "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", - "ethiopic-halehame-gez", "ethiopic-halehame-om-et", - "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", - "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", - "ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed", - "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", - "forwards", "from", "geometricPrecision", "georgian", "graytext", "grid", "groove", - "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew", - "help", "hidden", "hide", "higher", "highlight", "highlighttext", - "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "hue", "icon", "ignore", - "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", - "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", - "inline-block", "inline-flex", "inline-grid", "inline-table", "inset", "inside", "intrinsic", "invert", - "italic", "japanese-formal", "japanese-informal", "justify", "kannada", - "katakana", "katakana-iroha", "keep-all", "khmer", - "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", - "landscape", "lao", "large", "larger", "left", "level", "lighter", "lighten", - "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", - "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", - "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", - "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "match", "matrix", "matrix3d", - "media-controls-background", "media-current-time-display", - "media-fullscreen-button", "media-mute-button", "media-play-button", - "media-return-to-realtime-button", "media-rewind-button", - "media-seek-back-button", "media-seek-forward-button", "media-slider", - "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", - "media-volume-slider-container", "media-volume-sliderthumb", "medium", - "menu", "menulist", "menulist-button", "menulist-text", - "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", - "mix", "mongolian", "monospace", "move", "multiple", "multiply", "myanmar", "n-resize", - "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", - "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", - "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote", - "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", - "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", - "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter", - "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", - "progress", "push-button", "radial-gradient", "radio", "read-only", - "read-write", "read-write-plaintext-only", "rectangle", "region", - "relative", "repeat", "repeating-linear-gradient", - "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", - "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", - "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", - "s-resize", "sans-serif", "saturation", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen", - "scroll", "scrollbar", "se-resize", "searchfield", - "searchfield-cancel-button", "searchfield-decoration", - "searchfield-results-button", "searchfield-results-decoration", - "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", - "simp-chinese-formal", "simp-chinese-informal", "single", - "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", - "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", - "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali", - "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "spell-out", "square", - "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", - "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "table", - "table-caption", "table-cell", "table-column", "table-column-group", - "table-footer-group", "table-header-group", "table-row", "table-row-group", - "tamil", - "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", - "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", - "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", - "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", - "trad-chinese-formal", "trad-chinese-informal", - "translate", "translate3d", "translateX", "translateY", "translateZ", - "transparent", "ultra-condensed", "ultra-expanded", "underline", "up", - "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", - "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", - "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", - "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", - "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", - "xx-large", "xx-small" - ], valueKeywords = keySet(valueKeywords_); - - var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_) - .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_) - .concat(valueKeywords_); - CodeMirror.registerHelper("hintWords", "css", allWords); - - function tokenCComment(stream, state) { - var maybeEnd = false, ch; - while ((ch = stream.next()) != null) { - if (maybeEnd && ch == "/") { - state.tokenize = null; - break; - } - maybeEnd = (ch == "*"); - } - return ["comment", "comment"]; - } - - CodeMirror.defineMIME("text/css", { - documentTypes: documentTypes, - mediaTypes: mediaTypes, - mediaFeatures: mediaFeatures, - mediaValueKeywords: mediaValueKeywords, - propertyKeywords: propertyKeywords, - nonStandardPropertyKeywords: nonStandardPropertyKeywords, - fontProperties: fontProperties, - counterDescriptors: counterDescriptors, - colorKeywords: colorKeywords, - valueKeywords: valueKeywords, - tokenHooks: { - "/": function(stream, state) { - if (!stream.eat("*")) return false; - state.tokenize = tokenCComment; - return tokenCComment(stream, state); - } - }, - name: "css" - }); - - CodeMirror.defineMIME("text/x-scss", { - mediaTypes: mediaTypes, - mediaFeatures: mediaFeatures, - mediaValueKeywords: mediaValueKeywords, - propertyKeywords: propertyKeywords, - nonStandardPropertyKeywords: nonStandardPropertyKeywords, - colorKeywords: colorKeywords, - valueKeywords: valueKeywords, - fontProperties: fontProperties, - allowNested: true, - tokenHooks: { - "/": function(stream, state) { - if (stream.eat("/")) { - stream.skipToEnd(); - return ["comment", "comment"]; - } else if (stream.eat("*")) { - state.tokenize = tokenCComment; - return tokenCComment(stream, state); - } else { - return ["operator", "operator"]; - } - }, - ":": function(stream) { - if (stream.match(/\s*\{/)) - return [null, "{"]; - return false; - }, - "$": function(stream) { - stream.match(/^[\w-]+/); - if (stream.match(/^\s*:/, false)) - return ["variable-2", "variable-definition"]; - return ["variable-2", "variable"]; - }, - "#": function(stream) { - if (!stream.eat("{")) return false; - return [null, "interpolation"]; - } - }, - name: "css", - helperType: "scss" - }); - - CodeMirror.defineMIME("text/x-less", { - mediaTypes: mediaTypes, - mediaFeatures: mediaFeatures, - mediaValueKeywords: mediaValueKeywords, - propertyKeywords: propertyKeywords, - nonStandardPropertyKeywords: nonStandardPropertyKeywords, - colorKeywords: colorKeywords, - valueKeywords: valueKeywords, - fontProperties: fontProperties, - allowNested: true, - tokenHooks: { - "/": function(stream, state) { - if (stream.eat("/")) { - stream.skipToEnd(); - return ["comment", "comment"]; - } else if (stream.eat("*")) { - state.tokenize = tokenCComment; - return tokenCComment(stream, state); - } else { - return ["operator", "operator"]; - } - }, - "@": function(stream) { - if (stream.eat("{")) return [null, "interpolation"]; - if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, false)) return false; - stream.eatWhile(/[\w\\\-]/); - if (stream.match(/^\s*:/, false)) - return ["variable-2", "variable-definition"]; - return ["variable-2", "variable"]; - }, - "&": function() { - return ["atom", "atom"]; - } - }, - name: "css", - helperType: "less" - }); - - CodeMirror.defineMIME("text/x-gss", { - documentTypes: documentTypes, - mediaTypes: mediaTypes, - mediaFeatures: mediaFeatures, - propertyKeywords: propertyKeywords, - nonStandardPropertyKeywords: nonStandardPropertyKeywords, - fontProperties: fontProperties, - counterDescriptors: counterDescriptors, - colorKeywords: colorKeywords, - valueKeywords: valueKeywords, - supportsAtComponent: true, - tokenHooks: { - "/": function(stream, state) { - if (!stream.eat("*")) return false; - state.tokenize = tokenCComment; - return tokenCComment(stream, state); - } - }, - name: "css", - helperType: "gss" - }); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/css/gss.html b/public/plugins/codemirror-5.17.0/mode/css/gss.html deleted file mode 100644 index 232fe8c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/css/gss.html +++ /dev/null @@ -1,103 +0,0 @@ - - -CodeMirror: Closure Stylesheets (GSS) mode - - - - - - - - - - - - -
-

Closure Stylesheets (GSS) mode

-
- - -

A mode for Closure Stylesheets (GSS).

-

MIME type defined: text/x-gss.

- -

Parsing/Highlighting Tests: normal, verbose.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/css/gss_test.js b/public/plugins/codemirror-5.17.0/mode/css/gss_test.js deleted file mode 100644 index d56e592..0000000 --- a/public/plugins/codemirror-5.17.0/mode/css/gss_test.js +++ /dev/null @@ -1,17 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - "use strict"; - - var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-gss"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "gss"); } - - MT("atComponent", - "[def @component] {", - "[tag foo] {", - " [property color]: [keyword black];", - "}", - "}"); - -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/css/index.html b/public/plugins/codemirror-5.17.0/mode/css/index.html deleted file mode 100644 index 2d2b9b0..0000000 --- a/public/plugins/codemirror-5.17.0/mode/css/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - -CodeMirror: CSS mode - - - - - - - - - - - - -
-

CSS mode

-
- - -

MIME types defined: text/css, text/x-scss (demo), text/x-less (demo).

- -

Parsing/Highlighting Tests: normal, verbose.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/css/less.html b/public/plugins/codemirror-5.17.0/mode/css/less.html deleted file mode 100644 index adf7427..0000000 --- a/public/plugins/codemirror-5.17.0/mode/css/less.html +++ /dev/null @@ -1,152 +0,0 @@ - - -CodeMirror: LESS mode - - - - - - - - - - -
-

LESS mode

-
- - -

The LESS mode is a sub-mode of the CSS mode (defined in css.js).

- -

Parsing/Highlighting Tests: normal, verbose.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/css/less_test.js b/public/plugins/codemirror-5.17.0/mode/css/less_test.js deleted file mode 100644 index dd82155..0000000 --- a/public/plugins/codemirror-5.17.0/mode/css/less_test.js +++ /dev/null @@ -1,54 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - "use strict"; - - var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-less"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "less"); } - - MT("variable", - "[variable-2 @base]: [atom #f04615];", - "[qualifier .class] {", - " [property width]: [variable percentage]([number 0.5]); [comment // returns `50%`]", - " [property color]: [variable saturate]([variable-2 @base], [number 5%]);", - "}"); - - MT("amp", - "[qualifier .child], [qualifier .sibling] {", - " [qualifier .parent] [atom &] {", - " [property color]: [keyword black];", - " }", - " [atom &] + [atom &] {", - " [property color]: [keyword red];", - " }", - "}"); - - MT("mixin", - "[qualifier .mixin] ([variable dark]; [variable-2 @color]) {", - " [property color]: [atom darken]([variable-2 @color], [number 10%]);", - "}", - "[qualifier .mixin] ([variable light]; [variable-2 @color]) {", - " [property color]: [atom lighten]([variable-2 @color], [number 10%]);", - "}", - "[qualifier .mixin] ([variable-2 @_]; [variable-2 @color]) {", - " [property display]: [atom block];", - "}", - "[variable-2 @switch]: [variable light];", - "[qualifier .class] {", - " [qualifier .mixin]([variable-2 @switch]; [atom #888]);", - "}"); - - MT("nest", - "[qualifier .one] {", - " [def @media] ([property width]: [number 400px]) {", - " [property font-size]: [number 1.2em];", - " [def @media] [attribute print] [keyword and] [property color] {", - " [property color]: [keyword blue];", - " }", - " }", - "}"); - - - MT("interpolation", ".@{[variable foo]} { [property font-weight]: [atom bold]; }"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/css/scss.html b/public/plugins/codemirror-5.17.0/mode/css/scss.html deleted file mode 100644 index f8e4d37..0000000 --- a/public/plugins/codemirror-5.17.0/mode/css/scss.html +++ /dev/null @@ -1,157 +0,0 @@ - - -CodeMirror: SCSS mode - - - - - - - - - -
-

SCSS mode

-
- - -

The SCSS mode is a sub-mode of the CSS mode (defined in css.js).

- -

Parsing/Highlighting Tests: normal, verbose.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/css/scss_test.js b/public/plugins/codemirror-5.17.0/mode/css/scss_test.js deleted file mode 100644 index 785921b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/css/scss_test.js +++ /dev/null @@ -1,110 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-scss"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "scss"); } - - MT('url_with_quotation', - "[tag foo] { [property background]:[atom url]([string test.jpg]) }"); - - MT('url_with_double_quotes', - "[tag foo] { [property background]:[atom url]([string \"test.jpg\"]) }"); - - MT('url_with_single_quotes', - "[tag foo] { [property background]:[atom url]([string \'test.jpg\']) }"); - - MT('string', - "[def @import] [string \"compass/css3\"]"); - - MT('important_keyword', - "[tag foo] { [property background]:[atom url]([string \'test.jpg\']) [keyword !important] }"); - - MT('variable', - "[variable-2 $blue]:[atom #333]"); - - MT('variable_as_attribute', - "[tag foo] { [property color]:[variable-2 $blue] }"); - - MT('numbers', - "[tag foo] { [property padding]:[number 10px] [number 10] [number 10em] [number 8in] }"); - - MT('number_percentage', - "[tag foo] { [property width]:[number 80%] }"); - - MT('selector', - "[builtin #hello][qualifier .world]{}"); - - MT('singleline_comment', - "[comment // this is a comment]"); - - MT('multiline_comment', - "[comment /*foobar*/]"); - - MT('attribute_with_hyphen', - "[tag foo] { [property font-size]:[number 10px] }"); - - MT('string_after_attribute', - "[tag foo] { [property content]:[string \"::\"] }"); - - MT('directives', - "[def @include] [qualifier .mixin]"); - - MT('basic_structure', - "[tag p] { [property background]:[keyword red]; }"); - - MT('nested_structure', - "[tag p] { [tag a] { [property color]:[keyword red]; } }"); - - MT('mixin', - "[def @mixin] [tag table-base] {}"); - - MT('number_without_semicolon', - "[tag p] {[property width]:[number 12]}", - "[tag a] {[property color]:[keyword red];}"); - - MT('atom_in_nested_block', - "[tag p] { [tag a] { [property color]:[atom #000]; } }"); - - MT('interpolation_in_property', - "[tag foo] { #{[variable-2 $hello]}:[number 2]; }"); - - MT('interpolation_in_selector', - "[tag foo]#{[variable-2 $hello]} { [property color]:[atom #000]; }"); - - MT('interpolation_error', - "[tag foo]#{[variable foo]} { [property color]:[atom #000]; }"); - - MT("divide_operator", - "[tag foo] { [property width]:[number 4] [operator /] [number 2] }"); - - MT('nested_structure_with_id_selector', - "[tag p] { [builtin #hello] { [property color]:[keyword red]; } }"); - - MT('indent_mixin', - "[def @mixin] [tag container] (", - " [variable-2 $a]: [number 10],", - " [variable-2 $b]: [number 10])", - "{}"); - - MT('indent_nested', - "[tag foo] {", - " [tag bar] {", - " }", - "}"); - - MT('indent_parentheses', - "[tag foo] {", - " [property color]: [atom darken]([variable-2 $blue],", - " [number 9%]);", - "}"); - - MT('indent_vardef', - "[variable-2 $name]:", - " [string 'val'];", - "[tag tag] {", - " [tag inner] {", - " [property margin]: [number 3px];", - " }", - "}"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/css/test.js b/public/plugins/codemirror-5.17.0/mode/css/test.js deleted file mode 100644 index 7a496fb..0000000 --- a/public/plugins/codemirror-5.17.0/mode/css/test.js +++ /dev/null @@ -1,200 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "css"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - // Error, because "foobarhello" is neither a known type or property, but - // property was expected (after "and"), and it should be in parentheses. - MT("atMediaUnknownType", - "[def @media] [attribute screen] [keyword and] [error foobarhello] { }"); - - // Soft error, because "foobarhello" is not a known property or type. - MT("atMediaUnknownProperty", - "[def @media] [attribute screen] [keyword and] ([error foobarhello]) { }"); - - // Make sure nesting works with media queries - MT("atMediaMaxWidthNested", - "[def @media] [attribute screen] [keyword and] ([property max-width]: [number 25px]) { [tag foo] { } }"); - - MT("atMediaFeatureValueKeyword", - "[def @media] ([property orientation]: [keyword landscape]) { }"); - - MT("atMediaUnknownFeatureValueKeyword", - "[def @media] ([property orientation]: [error upsidedown]) { }"); - - MT("tagSelector", - "[tag foo] { }"); - - MT("classSelector", - "[qualifier .foo-bar_hello] { }"); - - MT("idSelector", - "[builtin #foo] { [error #foo] }"); - - MT("tagSelectorUnclosed", - "[tag foo] { [property margin]: [number 0] } [tag bar] { }"); - - MT("tagStringNoQuotes", - "[tag foo] { [property font-family]: [variable hello] [variable world]; }"); - - MT("tagStringDouble", - "[tag foo] { [property font-family]: [string \"hello world\"]; }"); - - MT("tagStringSingle", - "[tag foo] { [property font-family]: [string 'hello world']; }"); - - MT("tagColorKeyword", - "[tag foo] {", - " [property color]: [keyword black];", - " [property color]: [keyword navy];", - " [property color]: [keyword yellow];", - "}"); - - MT("tagColorHex3", - "[tag foo] { [property background]: [atom #fff]; }"); - - MT("tagColorHex4", - "[tag foo] { [property background]: [atom #ffff]; }"); - - MT("tagColorHex6", - "[tag foo] { [property background]: [atom #ffffff]; }"); - - MT("tagColorHex8", - "[tag foo] { [property background]: [atom #ffffffff]; }"); - - MT("tagColorHex5Invalid", - "[tag foo] { [property background]: [atom&error #fffff]; }"); - - MT("tagColorHexInvalid", - "[tag foo] { [property background]: [atom&error #ffg]; }"); - - MT("tagNegativeNumber", - "[tag foo] { [property margin]: [number -5px]; }"); - - MT("tagPositiveNumber", - "[tag foo] { [property padding]: [number 5px]; }"); - - MT("tagVendor", - "[tag foo] { [meta -foo-][property box-sizing]: [meta -foo-][atom border-box]; }"); - - MT("tagBogusProperty", - "[tag foo] { [property&error barhelloworld]: [number 0]; }"); - - MT("tagTwoProperties", - "[tag foo] { [property margin]: [number 0]; [property padding]: [number 0]; }"); - - MT("tagTwoPropertiesURL", - "[tag foo] { [property background]: [atom url]([string //example.com/foo.png]); [property padding]: [number 0]; }"); - - MT("indent_tagSelector", - "[tag strong], [tag em] {", - " [property background]: [atom rgba](", - " [number 255], [number 255], [number 0], [number .2]", - " );", - "}"); - - MT("indent_atMedia", - "[def @media] {", - " [tag foo] {", - " [property color]:", - " [keyword yellow];", - " }", - "}"); - - MT("indent_comma", - "[tag foo] {", - " [property font-family]: [variable verdana],", - " [atom sans-serif];", - "}"); - - MT("indent_parentheses", - "[tag foo]:[variable-3 before] {", - " [property background]: [atom url](", - "[string blahblah]", - "[string etc]", - "[string ]) [keyword !important];", - "}"); - - MT("font_face", - "[def @font-face] {", - " [property font-family]: [string 'myfont'];", - " [error nonsense]: [string 'abc'];", - " [property src]: [atom url]([string http://blah]),", - " [atom url]([string http://foo]);", - "}"); - - MT("empty_url", - "[def @import] [atom url]() [attribute screen];"); - - MT("parens", - "[qualifier .foo] {", - " [property background-image]: [variable fade]([atom #000], [number 20%]);", - " [property border-image]: [atom linear-gradient](", - " [atom to] [atom bottom],", - " [variable fade]([atom #000], [number 20%]) [number 0%],", - " [variable fade]([atom #000], [number 20%]) [number 100%]", - " );", - "}"); - - MT("css_variable", - ":[variable-3 root] {", - " [variable-2 --main-color]: [atom #06c];", - "}", - "[tag h1][builtin #foo] {", - " [property color]: [atom var]([variable-2 --main-color]);", - "}"); - - MT("supports", - "[def @supports] ([keyword not] (([property text-align-last]: [atom justify]) [keyword or] ([meta -moz-][property text-align-last]: [atom justify])) {", - " [property text-align-last]: [atom justify];", - "}"); - - MT("document", - "[def @document] [tag url]([string http://blah]),", - " [tag url-prefix]([string https://]),", - " [tag domain]([string blah.com]),", - " [tag regexp]([string \".*blah.+\"]) {", - " [builtin #id] {", - " [property background-color]: [keyword white];", - " }", - " [tag foo] {", - " [property font-family]: [variable Verdana], [atom sans-serif];", - " }", - "}"); - - MT("document_url", - "[def @document] [tag url]([string http://blah]) { [qualifier .class] { } }"); - - MT("document_urlPrefix", - "[def @document] [tag url-prefix]([string https://]) { [builtin #id] { } }"); - - MT("document_domain", - "[def @document] [tag domain]([string blah.com]) { [tag foo] { } }"); - - MT("document_regexp", - "[def @document] [tag regexp]([string \".*blah.+\"]) { [builtin #id] { } }"); - - MT("counter-style", - "[def @counter-style] [variable binary] {", - " [property system]: [atom numeric];", - " [property symbols]: [number 0] [number 1];", - " [property suffix]: [string \".\"];", - " [property range]: [atom infinite];", - " [property speak-as]: [atom numeric];", - "}"); - - MT("counter-style-additive-symbols", - "[def @counter-style] [variable simple-roman] {", - " [property system]: [atom additive];", - " [property additive-symbols]: [number 10] [variable X], [number 5] [variable V], [number 1] [variable I];", - " [property range]: [number 1] [number 49];", - "}"); - - MT("counter-style-use", - "[tag ol][qualifier .roman] { [property list-style]: [variable simple-roman]; }"); - - MT("counter-style-symbols", - "[tag ol] { [property list-style]: [atom symbols]([atom cyclic] [string \"*\"] [string \"\\2020\"] [string \"\\2021\"] [string \"\\A7\"]); }"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/cypher/cypher.js b/public/plugins/codemirror-5.17.0/mode/cypher/cypher.js deleted file mode 100644 index 107e4f6..0000000 --- a/public/plugins/codemirror-5.17.0/mode/cypher/cypher.js +++ /dev/null @@ -1,146 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// By the Neo4j Team and contributors. -// https://github.com/neo4j-contrib/CodeMirror - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - var wordRegexp = function(words) { - return new RegExp("^(?:" + words.join("|") + ")$", "i"); - }; - - CodeMirror.defineMode("cypher", function(config) { - var tokenBase = function(stream/*, state*/) { - var ch = stream.next(); - if (ch === "\"" || ch === "'") { - stream.match(/.+?["']/); - return "string"; - } - if (/[{}\(\),\.;\[\]]/.test(ch)) { - curPunc = ch; - return "node"; - } else if (ch === "/" && stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } else if (operatorChars.test(ch)) { - stream.eatWhile(operatorChars); - return null; - } else { - stream.eatWhile(/[_\w\d]/); - if (stream.eat(":")) { - stream.eatWhile(/[\w\d_\-]/); - return "atom"; - } - var word = stream.current(); - if (funcs.test(word)) return "builtin"; - if (preds.test(word)) return "def"; - if (keywords.test(word)) return "keyword"; - return "variable"; - } - }; - var pushContext = function(state, type, col) { - return state.context = { - prev: state.context, - indent: state.indent, - col: col, - type: type - }; - }; - var popContext = function(state) { - state.indent = state.context.indent; - return state.context = state.context.prev; - }; - var indentUnit = config.indentUnit; - var curPunc; - var funcs = wordRegexp(["abs", "acos", "allShortestPaths", "asin", "atan", "atan2", "avg", "ceil", "coalesce", "collect", "cos", "cot", "count", "degrees", "e", "endnode", "exp", "extract", "filter", "floor", "haversin", "head", "id", "keys", "labels", "last", "left", "length", "log", "log10", "lower", "ltrim", "max", "min", "node", "nodes", "percentileCont", "percentileDisc", "pi", "radians", "rand", "range", "reduce", "rel", "relationship", "relationships", "replace", "reverse", "right", "round", "rtrim", "shortestPath", "sign", "sin", "size", "split", "sqrt", "startnode", "stdev", "stdevp", "str", "substring", "sum", "tail", "tan", "timestamp", "toFloat", "toInt", "toString", "trim", "type", "upper"]); - var preds = wordRegexp(["all", "and", "any", "contains", "exists", "has", "in", "none", "not", "or", "single", "xor"]); - var keywords = wordRegexp(["as", "asc", "ascending", "assert", "by", "case", "commit", "constraint", "create", "csv", "cypher", "delete", "desc", "descending", "detach", "distinct", "drop", "else", "end", "ends", "explain", "false", "fieldterminator", "foreach", "from", "headers", "in", "index", "is", "join", "limit", "load", "match", "merge", "null", "on", "optional", "order", "periodic", "profile", "remove", "return", "scan", "set", "skip", "start", "starts", "then", "true", "union", "unique", "unwind", "using", "when", "where", "with"]); - var operatorChars = /[*+\-<>=&|~%^]/; - - return { - startState: function(/*base*/) { - return { - tokenize: tokenBase, - context: null, - indent: 0, - col: 0 - }; - }, - token: function(stream, state) { - if (stream.sol()) { - if (state.context && (state.context.align == null)) { - state.context.align = false; - } - state.indent = stream.indentation(); - } - if (stream.eatSpace()) { - return null; - } - var style = state.tokenize(stream, state); - if (style !== "comment" && state.context && (state.context.align == null) && state.context.type !== "pattern") { - state.context.align = true; - } - if (curPunc === "(") { - pushContext(state, ")", stream.column()); - } else if (curPunc === "[") { - pushContext(state, "]", stream.column()); - } else if (curPunc === "{") { - pushContext(state, "}", stream.column()); - } else if (/[\]\}\)]/.test(curPunc)) { - while (state.context && state.context.type === "pattern") { - popContext(state); - } - if (state.context && curPunc === state.context.type) { - popContext(state); - } - } else if (curPunc === "." && state.context && state.context.type === "pattern") { - popContext(state); - } else if (/atom|string|variable/.test(style) && state.context) { - if (/[\}\]]/.test(state.context.type)) { - pushContext(state, "pattern", stream.column()); - } else if (state.context.type === "pattern" && !state.context.align) { - state.context.align = true; - state.context.col = stream.column(); - } - } - return style; - }, - indent: function(state, textAfter) { - var firstChar = textAfter && textAfter.charAt(0); - var context = state.context; - if (/[\]\}]/.test(firstChar)) { - while (context && context.type === "pattern") { - context = context.prev; - } - } - var closing = context && firstChar === context.type; - if (!context) return 0; - if (context.type === "keywords") return CodeMirror.commands.newlineAndIndent; - if (context.align) return context.col + (closing ? 0 : 1); - return context.indent + (closing ? 0 : indentUnit); - } - }; - }); - - CodeMirror.modeExtensions["cypher"] = { - autoFormatLineBreaks: function(text) { - var i, lines, reProcessedPortion; - var lines = text.split("\n"); - var reProcessedPortion = /\s+\b(return|where|order by|match|with|skip|limit|create|delete|set)\b\s/g; - for (var i = 0; i < lines.length; i++) - lines[i] = lines[i].replace(reProcessedPortion, " \n$1 ").trim(); - return lines.join("\n"); - } - }; - - CodeMirror.defineMIME("application/x-cypher-query", "cypher"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/cypher/index.html b/public/plugins/codemirror-5.17.0/mode/cypher/index.html deleted file mode 100644 index b8bd75c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/cypher/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - -CodeMirror: Cypher Mode for CodeMirror - - - - - - - - - - -
-

Cypher Mode for CodeMirror

-
- - -

MIME types defined: - application/x-cypher-query -

- - -
diff --git a/public/plugins/codemirror-5.17.0/mode/d/d.js b/public/plugins/codemirror-5.17.0/mode/d/d.js deleted file mode 100644 index c927a7e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/d/d.js +++ /dev/null @@ -1,218 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("d", function(config, parserConfig) { - var indentUnit = config.indentUnit, - statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, - keywords = parserConfig.keywords || {}, - builtin = parserConfig.builtin || {}, - blockKeywords = parserConfig.blockKeywords || {}, - atoms = parserConfig.atoms || {}, - hooks = parserConfig.hooks || {}, - multiLineStrings = parserConfig.multiLineStrings; - var isOperatorChar = /[+\-*&%=<>!?|\/]/; - - var curPunc; - - function tokenBase(stream, state) { - var ch = stream.next(); - if (hooks[ch]) { - var result = hooks[ch](stream, state); - if (result !== false) return result; - } - if (ch == '"' || ch == "'" || ch == "`") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - if (/[\[\]{}\(\),;\:\.]/.test(ch)) { - curPunc = ch; - return null; - } - if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } - if (ch == "/") { - if (stream.eat("+")) { - state.tokenize = tokenComment; - return tokenNestedComment(stream, state); - } - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - } - if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - stream.eatWhile(/[\w\$_\xa1-\uffff]/); - var cur = stream.current(); - if (keywords.propertyIsEnumerable(cur)) { - if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; - return "keyword"; - } - if (builtin.propertyIsEnumerable(cur)) { - if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; - return "builtin"; - } - if (atoms.propertyIsEnumerable(cur)) return "atom"; - return "variable"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) {end = true; break;} - escaped = !escaped && next == "\\"; - } - if (end || !(escaped || multiLineStrings)) - state.tokenize = null; - return "string"; - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = null; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function tokenNestedComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = null; - break; - } - maybeEnd = (ch == "+"); - } - return "comment"; - } - - function Context(indented, column, type, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.align = align; - this.prev = prev; - } - function pushContext(state, col, type) { - var indent = state.indented; - if (state.context && state.context.type == "statement") - indent = state.context.indented; - return state.context = new Context(indent, col, type, null, state.context); - } - function popContext(state) { - var t = state.context.type; - if (t == ")" || t == "]" || t == "}") - state.indented = state.context.indented; - return state.context = state.context.prev; - } - - // Interface - - return { - startState: function(basecolumn) { - return { - tokenize: null, - context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), - indented: 0, - startOfLine: true - }; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - } - if (stream.eatSpace()) return null; - curPunc = null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment" || style == "meta") return style; - if (ctx.align == null) ctx.align = true; - - if ((curPunc == ";" || curPunc == ":" || curPunc == ",") && ctx.type == "statement") popContext(state); - else if (curPunc == "{") pushContext(state, stream.column(), "}"); - else if (curPunc == "[") pushContext(state, stream.column(), "]"); - else if (curPunc == "(") pushContext(state, stream.column(), ")"); - else if (curPunc == "}") { - while (ctx.type == "statement") ctx = popContext(state); - if (ctx.type == "}") ctx = popContext(state); - while (ctx.type == "statement") ctx = popContext(state); - } - else if (curPunc == ctx.type) popContext(state); - else if (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || (ctx.type == "statement" && curPunc == "newstatement")) - pushContext(state, stream.column(), "statement"); - state.startOfLine = false; - return style; - }, - - indent: function(state, textAfter) { - if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; - var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); - if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; - var closing = firstChar == ctx.type; - if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); - else if (ctx.align) return ctx.column + (closing ? 0 : 1); - else return ctx.indented + (closing ? 0 : indentUnit); - }, - - electricChars: "{}" - }; -}); - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - var blockKeywords = "body catch class do else enum for foreach foreach_reverse if in interface mixin " + - "out scope struct switch try union unittest version while with"; - - CodeMirror.defineMIME("text/x-d", { - name: "d", - keywords: words("abstract alias align asm assert auto break case cast cdouble cent cfloat const continue " + - "debug default delegate delete deprecated export extern final finally function goto immutable " + - "import inout invariant is lazy macro module new nothrow override package pragma private " + - "protected public pure ref return shared short static super synchronized template this " + - "throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters " + - blockKeywords), - blockKeywords: words(blockKeywords), - builtin: words("bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte " + - "ucent uint ulong ushort wchar wstring void size_t sizediff_t"), - atoms: words("exit failure success true false null"), - hooks: { - "@": function(stream, _state) { - stream.eatWhile(/[\w\$_]/); - return "meta"; - } - } - }); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/d/index.html b/public/plugins/codemirror-5.17.0/mode/d/index.html deleted file mode 100644 index 08cabd8..0000000 --- a/public/plugins/codemirror-5.17.0/mode/d/index.html +++ /dev/null @@ -1,273 +0,0 @@ - - -CodeMirror: D mode - - - - - - - - - - -
-

D mode

-
- - - -

Simple mode that handle D-Syntax (DLang Homepage).

- -

MIME types defined: text/x-d - .

-
diff --git a/public/plugins/codemirror-5.17.0/mode/dart/dart.js b/public/plugins/codemirror-5.17.0/mode/dart/dart.js deleted file mode 100644 index 8d383a9..0000000 --- a/public/plugins/codemirror-5.17.0/mode/dart/dart.js +++ /dev/null @@ -1,157 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../clike/clike")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../clike/clike"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - var keywords = ("this super static final const abstract class extends external factory " + - "implements get native operator set typedef with enum throw rethrow " + - "assert break case continue default in return new deferred async await " + - "try catch finally do else for if switch while import library export " + - "part of show hide is as").split(" "); - var blockKeywords = "try catch finally do else for if switch while".split(" "); - var atoms = "true false null".split(" "); - var builtins = "void bool num int double dynamic var String".split(" "); - - function set(words) { - var obj = {}; - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - function pushInterpolationStack(state) { - (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize); - } - - function popInterpolationStack(state) { - return (state.interpolationStack || (state.interpolationStack = [])).pop(); - } - - function sizeInterpolationStack(state) { - return state.interpolationStack ? state.interpolationStack.length : 0; - } - - CodeMirror.defineMIME("application/dart", { - name: "clike", - keywords: set(keywords), - blockKeywords: set(blockKeywords), - builtin: set(builtins), - atoms: set(atoms), - hooks: { - "@": function(stream) { - stream.eatWhile(/[\w\$_\.]/); - return "meta"; - }, - - // custom string handling to deal with triple-quoted strings and string interpolation - "'": function(stream, state) { - return tokenString("'", stream, state, false); - }, - "\"": function(stream, state) { - return tokenString("\"", stream, state, false); - }, - "r": function(stream, state) { - var peek = stream.peek(); - if (peek == "'" || peek == "\"") { - return tokenString(stream.next(), stream, state, true); - } - return false; - }, - - "}": function(_stream, state) { - // "}" is end of interpolation, if interpolation stack is non-empty - if (sizeInterpolationStack(state) > 0) { - state.tokenize = popInterpolationStack(state); - return null; - } - return false; - }, - - "/": function(stream, state) { - if (!stream.eat("*")) return false - state.tokenize = tokenNestedComment(1) - return state.tokenize(stream, state) - } - } - }); - - function tokenString(quote, stream, state, raw) { - var tripleQuoted = false; - if (stream.eat(quote)) { - if (stream.eat(quote)) tripleQuoted = true; - else return "string"; //empty string - } - function tokenStringHelper(stream, state) { - var escaped = false; - while (!stream.eol()) { - if (!raw && !escaped && stream.peek() == "$") { - pushInterpolationStack(state); - state.tokenize = tokenInterpolation; - return "string"; - } - var next = stream.next(); - if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) { - state.tokenize = null; - break; - } - escaped = !raw && !escaped && next == "\\"; - } - return "string"; - } - state.tokenize = tokenStringHelper; - return tokenStringHelper(stream, state); - } - - function tokenInterpolation(stream, state) { - stream.eat("$"); - if (stream.eat("{")) { - // let clike handle the content of ${...}, - // we take over again when "}" appears (see hooks). - state.tokenize = null; - } else { - state.tokenize = tokenInterpolationIdentifier; - } - return null; - } - - function tokenInterpolationIdentifier(stream, state) { - stream.eatWhile(/[\w_]/); - state.tokenize = popInterpolationStack(state); - return "variable"; - } - - function tokenNestedComment(depth) { - return function (stream, state) { - var ch - while (ch = stream.next()) { - if (ch == "*" && stream.eat("/")) { - if (depth == 1) { - state.tokenize = null - break - } else { - state.tokenize = tokenNestedComment(depth - 1) - return state.tokenize(stream, state) - } - } else if (ch == "/" && stream.eat("*")) { - state.tokenize = tokenNestedComment(depth + 1) - return state.tokenize(stream, state) - } - } - return "comment" - } - } - - CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins)); - - // This is needed to make loading through meta.js work. - CodeMirror.defineMode("dart", function(conf) { - return CodeMirror.getMode(conf, "application/dart"); - }, "clike"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/dart/index.html b/public/plugins/codemirror-5.17.0/mode/dart/index.html deleted file mode 100644 index e79da5a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/dart/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - -CodeMirror: Dart mode - - - - - - - - - -
-

Dart mode

-
- - - - - -
diff --git a/public/plugins/codemirror-5.17.0/mode/diff/diff.js b/public/plugins/codemirror-5.17.0/mode/diff/diff.js deleted file mode 100644 index fe0305e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/diff/diff.js +++ /dev/null @@ -1,47 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("diff", function() { - - var TOKEN_NAMES = { - '+': 'positive', - '-': 'negative', - '@': 'meta' - }; - - return { - token: function(stream) { - var tw_pos = stream.string.search(/[\t ]+?$/); - - if (!stream.sol() || tw_pos === 0) { - stream.skipToEnd(); - return ("error " + ( - TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, ''); - } - - var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd(); - - if (tw_pos === -1) { - stream.skipToEnd(); - } else { - stream.pos = tw_pos; - } - - return token_name; - } - }; -}); - -CodeMirror.defineMIME("text/x-diff", "diff"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/diff/index.html b/public/plugins/codemirror-5.17.0/mode/diff/index.html deleted file mode 100644 index 0af611f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/diff/index.html +++ /dev/null @@ -1,117 +0,0 @@ - - -CodeMirror: Diff mode - - - - - - - - - -
-

Diff mode

-
- - -

MIME types defined: text/x-diff.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/django/django.js b/public/plugins/codemirror-5.17.0/mode/django/django.js deleted file mode 100644 index 7b4ef3b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/django/django.js +++ /dev/null @@ -1,356 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), - require("../../addon/mode/overlay")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../htmlmixed/htmlmixed", - "../../addon/mode/overlay"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("django:inner", function() { - var keywords = ["block", "endblock", "for", "endfor", "true", "false", "filter", "endfilter", - "loop", "none", "self", "super", "if", "elif", "endif", "as", "else", "import", - "with", "endwith", "without", "context", "ifequal", "endifequal", "ifnotequal", - "endifnotequal", "extends", "include", "load", "comment", "endcomment", - "empty", "url", "static", "trans", "blocktrans", "endblocktrans", "now", - "regroup", "lorem", "ifchanged", "endifchanged", "firstof", "debug", "cycle", - "csrf_token", "autoescape", "endautoescape", "spaceless", "endspaceless", - "ssi", "templatetag", "verbatim", "endverbatim", "widthratio"], - filters = ["add", "addslashes", "capfirst", "center", "cut", "date", - "default", "default_if_none", "dictsort", - "dictsortreversed", "divisibleby", "escape", "escapejs", - "filesizeformat", "first", "floatformat", "force_escape", - "get_digit", "iriencode", "join", "last", "length", - "length_is", "linebreaks", "linebreaksbr", "linenumbers", - "ljust", "lower", "make_list", "phone2numeric", "pluralize", - "pprint", "random", "removetags", "rjust", "safe", - "safeseq", "slice", "slugify", "stringformat", "striptags", - "time", "timesince", "timeuntil", "title", "truncatechars", - "truncatechars_html", "truncatewords", "truncatewords_html", - "unordered_list", "upper", "urlencode", "urlize", - "urlizetrunc", "wordcount", "wordwrap", "yesno"], - operators = ["==", "!=", "<", ">", "<=", ">="], - wordOperators = ["in", "not", "or", "and"]; - - keywords = new RegExp("^\\b(" + keywords.join("|") + ")\\b"); - filters = new RegExp("^\\b(" + filters.join("|") + ")\\b"); - operators = new RegExp("^\\b(" + operators.join("|") + ")\\b"); - wordOperators = new RegExp("^\\b(" + wordOperators.join("|") + ")\\b"); - - // We have to return "null" instead of null, in order to avoid string - // styling as the default, when using Django templates inside HTML - // element attributes - function tokenBase (stream, state) { - // Attempt to identify a variable, template or comment tag respectively - if (stream.match("{{")) { - state.tokenize = inVariable; - return "tag"; - } else if (stream.match("{%")) { - state.tokenize = inTag; - return "tag"; - } else if (stream.match("{#")) { - state.tokenize = inComment; - return "comment"; - } - - // Ignore completely any stream series that do not match the - // Django template opening tags. - while (stream.next() != null && !stream.match(/\{[{%#]/, false)) {} - return null; - } - - // A string can be included in either single or double quotes (this is - // the delimiter). Mark everything as a string until the start delimiter - // occurs again. - function inString (delimiter, previousTokenizer) { - return function (stream, state) { - if (!state.escapeNext && stream.eat(delimiter)) { - state.tokenize = previousTokenizer; - } else { - if (state.escapeNext) { - state.escapeNext = false; - } - - var ch = stream.next(); - - // Take into account the backslash for escaping characters, such as - // the string delimiter. - if (ch == "\\") { - state.escapeNext = true; - } - } - - return "string"; - }; - } - - // Apply Django template variable syntax highlighting - function inVariable (stream, state) { - // Attempt to match a dot that precedes a property - if (state.waitDot) { - state.waitDot = false; - - if (stream.peek() != ".") { - return "null"; - } - - // Dot followed by a non-word character should be considered an error. - if (stream.match(/\.\W+/)) { - return "error"; - } else if (stream.eat(".")) { - state.waitProperty = true; - return "null"; - } else { - throw Error ("Unexpected error while waiting for property."); - } - } - - // Attempt to match a pipe that precedes a filter - if (state.waitPipe) { - state.waitPipe = false; - - if (stream.peek() != "|") { - return "null"; - } - - // Pipe followed by a non-word character should be considered an error. - if (stream.match(/\.\W+/)) { - return "error"; - } else if (stream.eat("|")) { - state.waitFilter = true; - return "null"; - } else { - throw Error ("Unexpected error while waiting for filter."); - } - } - - // Highlight properties - if (state.waitProperty) { - state.waitProperty = false; - if (stream.match(/\b(\w+)\b/)) { - state.waitDot = true; // A property can be followed by another property - state.waitPipe = true; // A property can be followed by a filter - return "property"; - } - } - - // Highlight filters - if (state.waitFilter) { - state.waitFilter = false; - if (stream.match(filters)) { - return "variable-2"; - } - } - - // Ignore all white spaces - if (stream.eatSpace()) { - state.waitProperty = false; - return "null"; - } - - // Identify numbers - if (stream.match(/\b\d+(\.\d+)?\b/)) { - return "number"; - } - - // Identify strings - if (stream.match("'")) { - state.tokenize = inString("'", state.tokenize); - return "string"; - } else if (stream.match('"')) { - state.tokenize = inString('"', state.tokenize); - return "string"; - } - - // Attempt to find the variable - if (stream.match(/\b(\w+)\b/) && !state.foundVariable) { - state.waitDot = true; - state.waitPipe = true; // A property can be followed by a filter - return "variable"; - } - - // If found closing tag reset - if (stream.match("}}")) { - state.waitProperty = null; - state.waitFilter = null; - state.waitDot = null; - state.waitPipe = null; - state.tokenize = tokenBase; - return "tag"; - } - - // If nothing was found, advance to the next character - stream.next(); - return "null"; - } - - function inTag (stream, state) { - // Attempt to match a dot that precedes a property - if (state.waitDot) { - state.waitDot = false; - - if (stream.peek() != ".") { - return "null"; - } - - // Dot followed by a non-word character should be considered an error. - if (stream.match(/\.\W+/)) { - return "error"; - } else if (stream.eat(".")) { - state.waitProperty = true; - return "null"; - } else { - throw Error ("Unexpected error while waiting for property."); - } - } - - // Attempt to match a pipe that precedes a filter - if (state.waitPipe) { - state.waitPipe = false; - - if (stream.peek() != "|") { - return "null"; - } - - // Pipe followed by a non-word character should be considered an error. - if (stream.match(/\.\W+/)) { - return "error"; - } else if (stream.eat("|")) { - state.waitFilter = true; - return "null"; - } else { - throw Error ("Unexpected error while waiting for filter."); - } - } - - // Highlight properties - if (state.waitProperty) { - state.waitProperty = false; - if (stream.match(/\b(\w+)\b/)) { - state.waitDot = true; // A property can be followed by another property - state.waitPipe = true; // A property can be followed by a filter - return "property"; - } - } - - // Highlight filters - if (state.waitFilter) { - state.waitFilter = false; - if (stream.match(filters)) { - return "variable-2"; - } - } - - // Ignore all white spaces - if (stream.eatSpace()) { - state.waitProperty = false; - return "null"; - } - - // Identify numbers - if (stream.match(/\b\d+(\.\d+)?\b/)) { - return "number"; - } - - // Identify strings - if (stream.match("'")) { - state.tokenize = inString("'", state.tokenize); - return "string"; - } else if (stream.match('"')) { - state.tokenize = inString('"', state.tokenize); - return "string"; - } - - // Attempt to match an operator - if (stream.match(operators)) { - return "operator"; - } - - // Attempt to match a word operator - if (stream.match(wordOperators)) { - return "keyword"; - } - - // Attempt to match a keyword - var keywordMatch = stream.match(keywords); - if (keywordMatch) { - if (keywordMatch[0] == "comment") { - state.blockCommentTag = true; - } - return "keyword"; - } - - // Attempt to match a variable - if (stream.match(/\b(\w+)\b/)) { - state.waitDot = true; - state.waitPipe = true; // A property can be followed by a filter - return "variable"; - } - - // If found closing tag reset - if (stream.match("%}")) { - state.waitProperty = null; - state.waitFilter = null; - state.waitDot = null; - state.waitPipe = null; - // If the tag that closes is a block comment tag, we want to mark the - // following code as comment, until the tag closes. - if (state.blockCommentTag) { - state.blockCommentTag = false; // Release the "lock" - state.tokenize = inBlockComment; - } else { - state.tokenize = tokenBase; - } - return "tag"; - } - - // If nothing was found, advance to the next character - stream.next(); - return "null"; - } - - // Mark everything as comment inside the tag and the tag itself. - function inComment (stream, state) { - if (stream.match(/^.*?#\}/)) state.tokenize = tokenBase - else stream.skipToEnd() - return "comment"; - } - - // Mark everything as a comment until the `blockcomment` tag closes. - function inBlockComment (stream, state) { - if (stream.match(/\{%\s*endcomment\s*%\}/, false)) { - state.tokenize = inTag; - stream.match("{%"); - return "tag"; - } else { - stream.next(); - return "comment"; - } - } - - return { - startState: function () { - return {tokenize: tokenBase}; - }, - token: function (stream, state) { - return state.tokenize(stream, state); - }, - blockCommentStart: "{% comment %}", - blockCommentEnd: "{% endcomment %}" - }; - }); - - CodeMirror.defineMode("django", function(config) { - var htmlBase = CodeMirror.getMode(config, "text/html"); - var djangoInner = CodeMirror.getMode(config, "django:inner"); - return CodeMirror.overlayMode(htmlBase, djangoInner); - }); - - CodeMirror.defineMIME("text/x-django", "django"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/django/index.html b/public/plugins/codemirror-5.17.0/mode/django/index.html deleted file mode 100644 index 41ea07c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/django/index.html +++ /dev/null @@ -1,73 +0,0 @@ - - -CodeMirror: Django template mode - - - - - - - - - - - - - -
-

Django template mode

-
- - - -

Mode for HTML with embedded Django template markup.

- -

MIME types defined: text/x-django

-
diff --git a/public/plugins/codemirror-5.17.0/mode/dockerfile/dockerfile.js b/public/plugins/codemirror-5.17.0/mode/dockerfile/dockerfile.js deleted file mode 100644 index 4419009..0000000 --- a/public/plugins/codemirror-5.17.0/mode/dockerfile/dockerfile.js +++ /dev/null @@ -1,79 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../../addon/mode/simple"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - // Collect all Dockerfile directives - var instructions = ["from", "maintainer", "run", "cmd", "expose", "env", - "add", "copy", "entrypoint", "volume", "user", - "workdir", "onbuild"], - instructionRegex = "(" + instructions.join('|') + ")", - instructionOnlyLine = new RegExp(instructionRegex + "\\s*$", "i"), - instructionWithArguments = new RegExp(instructionRegex + "(\\s+)", "i"); - - CodeMirror.defineSimpleMode("dockerfile", { - start: [ - // Block comment: This is a line starting with a comment - { - regex: /#.*$/, - token: "comment" - }, - // Highlight an instruction without any arguments (for convenience) - { - regex: instructionOnlyLine, - token: "variable-2" - }, - // Highlight an instruction followed by arguments - { - regex: instructionWithArguments, - token: ["variable-2", null], - next: "arguments" - }, - { - regex: /./, - token: null - } - ], - arguments: [ - { - // Line comment without instruction arguments is an error - regex: /#.*$/, - token: "error", - next: "start" - }, - { - regex: /[^#]+\\$/, - token: null - }, - { - // Match everything except for the inline comment - regex: /[^#]+/, - token: null, - next: "start" - }, - { - regex: /$/, - token: null, - next: "start" - }, - // Fail safe return to start - { - token: null, - next: "start" - } - ], - meta: { - lineComment: "#" - } - }); - - CodeMirror.defineMIME("text/x-dockerfile", "dockerfile"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/dockerfile/index.html b/public/plugins/codemirror-5.17.0/mode/dockerfile/index.html deleted file mode 100644 index a31759b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/dockerfile/index.html +++ /dev/null @@ -1,73 +0,0 @@ - - -CodeMirror: Dockerfile mode - - - - - - - - - - -
-

Dockerfile mode

-
- - - -

Dockerfile syntax highlighting for CodeMirror. Depends on - the simplemode addon.

- -

MIME types defined: text/x-dockerfile

-
diff --git a/public/plugins/codemirror-5.17.0/mode/dtd/dtd.js b/public/plugins/codemirror-5.17.0/mode/dtd/dtd.js deleted file mode 100644 index 52d76ee..0000000 --- a/public/plugins/codemirror-5.17.0/mode/dtd/dtd.js +++ /dev/null @@ -1,142 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/* - DTD mode - Ported to CodeMirror by Peter Kroon - Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues - GitHub: @peterkroon -*/ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("dtd", function(config) { - var indentUnit = config.indentUnit, type; - function ret(style, tp) {type = tp; return style;} - - function tokenBase(stream, state) { - var ch = stream.next(); - - if (ch == "<" && stream.eat("!") ) { - if (stream.eatWhile(/[\-]/)) { - state.tokenize = tokenSGMLComment; - return tokenSGMLComment(stream, state); - } else if (stream.eatWhile(/[\w]/)) return ret("keyword", "doindent"); - } else if (ch == "<" && stream.eat("?")) { //xml declaration - state.tokenize = inBlock("meta", "?>"); - return ret("meta", ch); - } else if (ch == "#" && stream.eatWhile(/[\w]/)) return ret("atom", "tag"); - else if (ch == "|") return ret("keyword", "seperator"); - else if (ch.match(/[\(\)\[\]\-\.,\+\?>]/)) return ret(null, ch);//if(ch === ">") return ret(null, "endtag"); else - else if (ch.match(/[\[\]]/)) return ret("rule", ch); - else if (ch == "\"" || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } else if (stream.eatWhile(/[a-zA-Z\?\+\d]/)) { - var sc = stream.current(); - if( sc.substr(sc.length-1,sc.length).match(/\?|\+/) !== null )stream.backUp(1); - return ret("tag", "tag"); - } else if (ch == "%" || ch == "*" ) return ret("number", "number"); - else { - stream.eatWhile(/[\w\\\-_%.{,]/); - return ret(null, null); - } - } - - function tokenSGMLComment(stream, state) { - var dashes = 0, ch; - while ((ch = stream.next()) != null) { - if (dashes >= 2 && ch == ">") { - state.tokenize = tokenBase; - break; - } - dashes = (ch == "-") ? dashes + 1 : 0; - } - return ret("comment", "comment"); - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) { - state.tokenize = tokenBase; - break; - } - escaped = !escaped && ch == "\\"; - } - return ret("string", "tag"); - }; - } - - function inBlock(style, terminator) { - return function(stream, state) { - while (!stream.eol()) { - if (stream.match(terminator)) { - state.tokenize = tokenBase; - break; - } - stream.next(); - } - return style; - }; - } - - return { - startState: function(base) { - return {tokenize: tokenBase, - baseIndent: base || 0, - stack: []}; - }, - - token: function(stream, state) { - if (stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - - var context = state.stack[state.stack.length-1]; - if (stream.current() == "[" || type === "doindent" || type == "[") state.stack.push("rule"); - else if (type === "endtag") state.stack[state.stack.length-1] = "endtag"; - else if (stream.current() == "]" || type == "]" || (type == ">" && context == "rule")) state.stack.pop(); - else if (type == "[") state.stack.push("["); - return style; - }, - - indent: function(state, textAfter) { - var n = state.stack.length; - - if( textAfter.match(/\]\s+|\]/) )n=n-1; - else if(textAfter.substr(textAfter.length-1, textAfter.length) === ">"){ - if(textAfter.substr(0,1) === "<") {} - else if( type == "doindent" && textAfter.length > 1 ) {} - else if( type == "doindent")n--; - else if( type == ">" && textAfter.length > 1) {} - else if( type == "tag" && textAfter !== ">") {} - else if( type == "tag" && state.stack[state.stack.length-1] == "rule")n--; - else if( type == "tag")n++; - else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule" && type === ">")n--; - else if( textAfter === ">" && state.stack[state.stack.length-1] == "rule") {} - else if( textAfter.substr(0,1) !== "<" && textAfter.substr(0,1) === ">" )n=n-1; - else if( textAfter === ">") {} - else n=n-1; - //over rule them all - if(type == null || type == "]")n--; - } - - return state.baseIndent + n * indentUnit; - }, - - electricChars: "]>" - }; -}); - -CodeMirror.defineMIME("application/xml-dtd", "dtd"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/dtd/index.html b/public/plugins/codemirror-5.17.0/mode/dtd/index.html deleted file mode 100644 index e6798a7..0000000 --- a/public/plugins/codemirror-5.17.0/mode/dtd/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - -CodeMirror: DTD mode - - - - - - - - - -
-

DTD mode

-
- - -

MIME types defined: application/xml-dtd.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/dylan/dylan.js b/public/plugins/codemirror-5.17.0/mode/dylan/dylan.js deleted file mode 100644 index 1b46bc8..0000000 --- a/public/plugins/codemirror-5.17.0/mode/dylan/dylan.js +++ /dev/null @@ -1,344 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("dylan", function(_config) { - // Words - var words = { - // Words that introduce unnamed definitions like "define interface" - unnamedDefinition: ["interface"], - - // Words that introduce simple named definitions like "define library" - namedDefinition: ["module", "library", "macro", - "C-struct", "C-union", - "C-function", "C-callable-wrapper" - ], - - // Words that introduce type definitions like "define class". - // These are also parameterized like "define method" and are - // appended to otherParameterizedDefinitionWords - typeParameterizedDefinition: ["class", "C-subtype", "C-mapped-subtype"], - - // Words that introduce trickier definitions like "define method". - // These require special definitions to be added to startExpressions - otherParameterizedDefinition: ["method", "function", - "C-variable", "C-address" - ], - - // Words that introduce module constant definitions. - // These must also be simple definitions and are - // appended to otherSimpleDefinitionWords - constantSimpleDefinition: ["constant"], - - // Words that introduce module variable definitions. - // These must also be simple definitions and are - // appended to otherSimpleDefinitionWords - variableSimpleDefinition: ["variable"], - - // Other words that introduce simple definitions - // (without implicit bodies). - otherSimpleDefinition: ["generic", "domain", - "C-pointer-type", - "table" - ], - - // Words that begin statements with implicit bodies. - statement: ["if", "block", "begin", "method", "case", - "for", "select", "when", "unless", "until", - "while", "iterate", "profiling", "dynamic-bind" - ], - - // Patterns that act as separators in compound statements. - // This may include any general pattern that must be indented - // specially. - separator: ["finally", "exception", "cleanup", "else", - "elseif", "afterwards" - ], - - // Keywords that do not require special indentation handling, - // but which should be highlighted - other: ["above", "below", "by", "from", "handler", "in", - "instance", "let", "local", "otherwise", "slot", - "subclass", "then", "to", "keyed-by", "virtual" - ], - - // Condition signaling function calls - signalingCalls: ["signal", "error", "cerror", - "break", "check-type", "abort" - ] - }; - - words["otherDefinition"] = - words["unnamedDefinition"] - .concat(words["namedDefinition"]) - .concat(words["otherParameterizedDefinition"]); - - words["definition"] = - words["typeParameterizedDefinition"] - .concat(words["otherDefinition"]); - - words["parameterizedDefinition"] = - words["typeParameterizedDefinition"] - .concat(words["otherParameterizedDefinition"]); - - words["simpleDefinition"] = - words["constantSimpleDefinition"] - .concat(words["variableSimpleDefinition"]) - .concat(words["otherSimpleDefinition"]); - - words["keyword"] = - words["statement"] - .concat(words["separator"]) - .concat(words["other"]); - - // Patterns - var symbolPattern = "[-_a-zA-Z?!*@<>$%]+"; - var symbol = new RegExp("^" + symbolPattern); - var patterns = { - // Symbols with special syntax - symbolKeyword: symbolPattern + ":", - symbolClass: "<" + symbolPattern + ">", - symbolGlobal: "\\*" + symbolPattern + "\\*", - symbolConstant: "\\$" + symbolPattern - }; - var patternStyles = { - symbolKeyword: "atom", - symbolClass: "tag", - symbolGlobal: "variable-2", - symbolConstant: "variable-3" - }; - - // Compile all patterns to regular expressions - for (var patternName in patterns) - if (patterns.hasOwnProperty(patternName)) - patterns[patternName] = new RegExp("^" + patterns[patternName]); - - // Names beginning "with-" and "without-" are commonly - // used as statement macro - patterns["keyword"] = [/^with(?:out)?-[-_a-zA-Z?!*@<>$%]+/]; - - var styles = {}; - styles["keyword"] = "keyword"; - styles["definition"] = "def"; - styles["simpleDefinition"] = "def"; - styles["signalingCalls"] = "builtin"; - - // protected words lookup table - var wordLookup = {}; - var styleLookup = {}; - - [ - "keyword", - "definition", - "simpleDefinition", - "signalingCalls" - ].forEach(function(type) { - words[type].forEach(function(word) { - wordLookup[word] = type; - styleLookup[word] = styles[type]; - }); - }); - - - function chain(stream, state, f) { - state.tokenize = f; - return f(stream, state); - } - - function tokenBase(stream, state) { - // String - var ch = stream.peek(); - if (ch == "'" || ch == '"') { - stream.next(); - return chain(stream, state, tokenString(ch, "string")); - } - // Comment - else if (ch == "/") { - stream.next(); - if (stream.eat("*")) { - return chain(stream, state, tokenComment); - } else if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - stream.backUp(1); - } - // Decimal - else if (/[+\-\d\.]/.test(ch)) { - if (stream.match(/^[+-]?[0-9]*\.[0-9]*([esdx][+-]?[0-9]+)?/i) || - stream.match(/^[+-]?[0-9]+([esdx][+-]?[0-9]+)/i) || - stream.match(/^[+-]?\d+/)) { - return "number"; - } - } - // Hash - else if (ch == "#") { - stream.next(); - // Symbol with string syntax - ch = stream.peek(); - if (ch == '"') { - stream.next(); - return chain(stream, state, tokenString('"', "string")); - } - // Binary number - else if (ch == "b") { - stream.next(); - stream.eatWhile(/[01]/); - return "number"; - } - // Hex number - else if (ch == "x") { - stream.next(); - stream.eatWhile(/[\da-f]/i); - return "number"; - } - // Octal number - else if (ch == "o") { - stream.next(); - stream.eatWhile(/[0-7]/); - return "number"; - } - // Token concatenation in macros - else if (ch == '#') { - stream.next(); - return "punctuation"; - } - // Sequence literals - else if ((ch == '[') || (ch == '(')) { - stream.next(); - return "bracket"; - // Hash symbol - } else if (stream.match(/f|t|all-keys|include|key|next|rest/i)) { - return "atom"; - } else { - stream.eatWhile(/[-a-zA-Z]/); - return "error"; - } - } else if (ch == "~") { - stream.next(); - ch = stream.peek(); - if (ch == "=") { - stream.next(); - ch = stream.peek(); - if (ch == "=") { - stream.next(); - return "operator"; - } - return "operator"; - } - return "operator"; - } else if (ch == ":") { - stream.next(); - ch = stream.peek(); - if (ch == "=") { - stream.next(); - return "operator"; - } else if (ch == ":") { - stream.next(); - return "punctuation"; - } - } else if ("[](){}".indexOf(ch) != -1) { - stream.next(); - return "bracket"; - } else if (".,".indexOf(ch) != -1) { - stream.next(); - return "punctuation"; - } else if (stream.match("end")) { - return "keyword"; - } - for (var name in patterns) { - if (patterns.hasOwnProperty(name)) { - var pattern = patterns[name]; - if ((pattern instanceof Array && pattern.some(function(p) { - return stream.match(p); - })) || stream.match(pattern)) - return patternStyles[name]; - } - } - if (/[+\-*\/^=<>&|]/.test(ch)) { - stream.next(); - return "operator"; - } - if (stream.match("define")) { - return "def"; - } else { - stream.eatWhile(/[\w\-]/); - // Keyword - if (wordLookup[stream.current()]) { - return styleLookup[stream.current()]; - } else if (stream.current().match(symbol)) { - return "variable"; - } else { - stream.next(); - return "variable-2"; - } - } - } - - function tokenComment(stream, state) { - var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; - while ((ch = stream.next())) { - if (ch == "/" && maybeEnd) { - if (nestedCount > 0) { - nestedCount--; - } else { - state.tokenize = tokenBase; - break; - } - } else if (ch == "*" && maybeNested) { - nestedCount++; - } - maybeEnd = (ch == "*"); - maybeNested = (ch == "/"); - } - return "comment"; - } - - function tokenString(quote, style) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) { - end = true; - break; - } - escaped = !escaped && next == "\\"; - } - if (end || !escaped) { - state.tokenize = tokenBase; - } - return style; - }; - } - - // Interface - return { - startState: function() { - return { - tokenize: tokenBase, - currentIndent: 0 - }; - }, - token: function(stream, state) { - if (stream.eatSpace()) - return null; - var style = state.tokenize(stream, state); - return style; - }, - blockCommentStart: "/*", - blockCommentEnd: "*/" - }; -}); - -CodeMirror.defineMIME("text/x-dylan", "dylan"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/dylan/index.html b/public/plugins/codemirror-5.17.0/mode/dylan/index.html deleted file mode 100644 index ddf5ad0..0000000 --- a/public/plugins/codemirror-5.17.0/mode/dylan/index.html +++ /dev/null @@ -1,407 +0,0 @@ - - -CodeMirror: Dylan mode - - - - - - - - - - - - -
-

Dylan mode

- - -
- - - -

MIME types defined: text/x-dylan.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/dylan/test.js b/public/plugins/codemirror-5.17.0/mode/dylan/test.js deleted file mode 100644 index bf25be2..0000000 --- a/public/plugins/codemirror-5.17.0/mode/dylan/test.js +++ /dev/null @@ -1,88 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "dylan"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT('comments', - '[comment // This is a line comment]', - '[comment /* This is a block comment */]', - '[comment /* This is a multi]', - '[comment line comment]', - '[comment */]', - '[comment /* And this is a /*]', - '[comment /* nested */ comment */]'); - - MT('unary_operators', - '[operator -][variable a]', - '[operator -] [variable a]', - '[operator ~][variable a]', - '[operator ~] [variable a]'); - - MT('binary_operators', - '[variable a] [operator +] [variable b]', - '[variable a] [operator -] [variable b]', - '[variable a] [operator *] [variable b]', - '[variable a] [operator /] [variable b]', - '[variable a] [operator ^] [variable b]', - '[variable a] [operator =] [variable b]', - '[variable a] [operator ==] [variable b]', - '[variable a] [operator ~=] [variable b]', - '[variable a] [operator ~==] [variable b]', - '[variable a] [operator <] [variable b]', - '[variable a] [operator <=] [variable b]', - '[variable a] [operator >] [variable b]', - '[variable a] [operator >=] [variable b]', - '[variable a] [operator &] [variable b]', - '[variable a] [operator |] [variable b]', - '[variable a] [operator :=] [variable b]'); - - MT('integers', - '[number 1]', - '[number 123]', - '[number -123]', - '[number +456]', - '[number #b010]', - '[number #o073]', - '[number #xabcDEF123]'); - - MT('floats', - '[number .3]', - '[number -1.]', - '[number -2.335]', - '[number +3.78d1]', - '[number 3.78s-1]', - '[number -3.32e+5]'); - - MT('characters_and_strings', - "[string 'a']", - "[string '\\\\'']", - '[string ""]', - '[string "a"]', - '[string "abc def"]', - '[string "More escaped characters: \\\\\\\\ \\\\a \\\\b \\\\e \\\\f \\\\n \\\\r \\\\t \\\\0 ..."]'); - - MT('brackets', - '[bracket #[[]]]', - '[bracket #()]', - '[bracket #(][number 1][bracket )]', - '[bracket [[][number 1][punctuation ,] [number 3][bracket ]]]', - '[bracket ()]', - '[bracket {}]', - '[keyword if] [bracket (][variable foo][bracket )]', - '[bracket (][number 1][bracket )]', - '[bracket [[][number 1][bracket ]]]'); - - MT('hash_words', - '[punctuation ##]', - '[atom #f]', '[atom #F]', - '[atom #t]', '[atom #T]', - '[atom #all-keys]', - '[atom #include]', - '[atom #key]', - '[atom #next]', - '[atom #rest]', - '[string #"foo"]', - '[error #invalid]'); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/ebnf/ebnf.js b/public/plugins/codemirror-5.17.0/mode/ebnf/ebnf.js deleted file mode 100644 index 9618f8e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ebnf/ebnf.js +++ /dev/null @@ -1,195 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("ebnf", function (config) { - var commentType = {slash: 0, parenthesis: 1}; - var stateType = {comment: 0, _string: 1, characterClass: 2}; - var bracesMode = null; - - if (config.bracesMode) - bracesMode = CodeMirror.getMode(config, config.bracesMode); - - return { - startState: function () { - return { - stringType: null, - commentType: null, - braced: 0, - lhs: true, - localState: null, - stack: [], - inDefinition: false - }; - }, - token: function (stream, state) { - if (!stream) return; - - //check for state changes - if (state.stack.length === 0) { - //strings - if ((stream.peek() == '"') || (stream.peek() == "'")) { - state.stringType = stream.peek(); - stream.next(); // Skip quote - state.stack.unshift(stateType._string); - } else if (stream.match(/^\/\*/)) { //comments starting with /* - state.stack.unshift(stateType.comment); - state.commentType = commentType.slash; - } else if (stream.match(/^\(\*/)) { //comments starting with (* - state.stack.unshift(stateType.comment); - state.commentType = commentType.parenthesis; - } - } - - //return state - //stack has - switch (state.stack[0]) { - case stateType._string: - while (state.stack[0] === stateType._string && !stream.eol()) { - if (stream.peek() === state.stringType) { - stream.next(); // Skip quote - state.stack.shift(); // Clear flag - } else if (stream.peek() === "\\") { - stream.next(); - stream.next(); - } else { - stream.match(/^.[^\\\"\']*/); - } - } - return state.lhs ? "property string" : "string"; // Token style - - case stateType.comment: - while (state.stack[0] === stateType.comment && !stream.eol()) { - if (state.commentType === commentType.slash && stream.match(/\*\//)) { - state.stack.shift(); // Clear flag - state.commentType = null; - } else if (state.commentType === commentType.parenthesis && stream.match(/\*\)/)) { - state.stack.shift(); // Clear flag - state.commentType = null; - } else { - stream.match(/^.[^\*]*/); - } - } - return "comment"; - - case stateType.characterClass: - while (state.stack[0] === stateType.characterClass && !stream.eol()) { - if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { - state.stack.shift(); - } - } - return "operator"; - } - - var peek = stream.peek(); - - if (bracesMode !== null && (state.braced || peek === "{")) { - if (state.localState === null) - state.localState = CodeMirror.startState(bracesMode); - - var token = bracesMode.token(stream, state.localState), - text = stream.current(); - - if (!token) { - for (var i = 0; i < text.length; i++) { - if (text[i] === "{") { - if (state.braced === 0) { - token = "matchingbracket"; - } - state.braced++; - } else if (text[i] === "}") { - state.braced--; - if (state.braced === 0) { - token = "matchingbracket"; - } - } - } - } - return token; - } - - //no stack - switch (peek) { - case "[": - stream.next(); - state.stack.unshift(stateType.characterClass); - return "bracket"; - case ":": - case "|": - case ";": - stream.next(); - return "operator"; - case "%": - if (stream.match("%%")) { - return "header"; - } else if (stream.match(/[%][A-Za-z]+/)) { - return "keyword"; - } else if (stream.match(/[%][}]/)) { - return "matchingbracket"; - } - break; - case "/": - if (stream.match(/[\/][A-Za-z]+/)) { - return "keyword"; - } - case "\\": - if (stream.match(/[\][a-z]+/)) { - return "string-2"; - } - case ".": - if (stream.match(".")) { - return "atom"; - } - case "*": - case "-": - case "+": - case "^": - if (stream.match(peek)) { - return "atom"; - } - case "$": - if (stream.match("$$")) { - return "builtin"; - } else if (stream.match(/[$][0-9]+/)) { - return "variable-3"; - } - case "<": - if (stream.match(/<<[a-zA-Z_]+>>/)) { - return "builtin"; - } - } - - if (stream.match(/^\/\//)) { - stream.skipToEnd(); - return "comment"; - } else if (stream.match(/return/)) { - return "operator"; - } else if (stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)) { - if (stream.match(/(?=[\(.])/)) { - return "variable"; - } else if (stream.match(/(?=[\s\n]*[:=])/)) { - return "def"; - } - return "variable-2"; - } else if (["[", "]", "(", ")"].indexOf(stream.peek()) != -1) { - stream.next(); - return "bracket"; - } else if (!stream.eatSpace()) { - stream.next(); - } - return null; - } - }; - }); - - CodeMirror.defineMIME("text/x-ebnf", "ebnf"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/ebnf/index.html b/public/plugins/codemirror-5.17.0/mode/ebnf/index.html deleted file mode 100644 index 1384562..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ebnf/index.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - CodeMirror: EBNF Mode - - - - - - - - - - - - -
-

EBNF Mode (bracesMode setting = "javascript")

-
- -

The EBNF Mode

-

Created by Robert Plummer

-
- - diff --git a/public/plugins/codemirror-5.17.0/mode/ecl/ecl.js b/public/plugins/codemirror-5.17.0/mode/ecl/ecl.js deleted file mode 100644 index 8df7ebe..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ecl/ecl.js +++ /dev/null @@ -1,206 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("ecl", function(config) { - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - function metaHook(stream, state) { - if (!state.startOfLine) return false; - stream.skipToEnd(); - return "meta"; - } - - var indentUnit = config.indentUnit; - var keyword = words("abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode"); - var variable = words("apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait"); - var variable_2 = words("__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath"); - var variable_3 = words("ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode"); - var builtin = words("checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when"); - var blockKeywords = words("catch class do else finally for if switch try while"); - var atoms = words("true false null"); - var hooks = {"#": metaHook}; - var isOperatorChar = /[+\-*&%=<>!?|\/]/; - - var curPunc; - - function tokenBase(stream, state) { - var ch = stream.next(); - if (hooks[ch]) { - var result = hooks[ch](stream, state); - if (result !== false) return result; - } - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - if (/[\[\]{}\(\),;\:\.]/.test(ch)) { - curPunc = ch; - return null; - } - if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } - if (ch == "/") { - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - } - if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - stream.eatWhile(/[\w\$_]/); - var cur = stream.current().toLowerCase(); - if (keyword.propertyIsEnumerable(cur)) { - if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; - return "keyword"; - } else if (variable.propertyIsEnumerable(cur)) { - if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; - return "variable"; - } else if (variable_2.propertyIsEnumerable(cur)) { - if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; - return "variable-2"; - } else if (variable_3.propertyIsEnumerable(cur)) { - if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; - return "variable-3"; - } else if (builtin.propertyIsEnumerable(cur)) { - if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; - return "builtin"; - } else { //Data types are of from KEYWORD## - var i = cur.length - 1; - while(i >= 0 && (!isNaN(cur[i]) || cur[i] == '_')) - --i; - - if (i > 0) { - var cur2 = cur.substr(0, i + 1); - if (variable_3.propertyIsEnumerable(cur2)) { - if (blockKeywords.propertyIsEnumerable(cur2)) curPunc = "newstatement"; - return "variable-3"; - } - } - } - if (atoms.propertyIsEnumerable(cur)) return "atom"; - return null; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) {end = true; break;} - escaped = !escaped && next == "\\"; - } - if (end || !escaped) - state.tokenize = tokenBase; - return "string"; - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function Context(indented, column, type, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.align = align; - this.prev = prev; - } - function pushContext(state, col, type) { - return state.context = new Context(state.indented, col, type, null, state.context); - } - function popContext(state) { - var t = state.context.type; - if (t == ")" || t == "]" || t == "}") - state.indented = state.context.indented; - return state.context = state.context.prev; - } - - // Interface - - return { - startState: function(basecolumn) { - return { - tokenize: null, - context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), - indented: 0, - startOfLine: true - }; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - } - if (stream.eatSpace()) return null; - curPunc = null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment" || style == "meta") return style; - if (ctx.align == null) ctx.align = true; - - if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); - else if (curPunc == "{") pushContext(state, stream.column(), "}"); - else if (curPunc == "[") pushContext(state, stream.column(), "]"); - else if (curPunc == "(") pushContext(state, stream.column(), ")"); - else if (curPunc == "}") { - while (ctx.type == "statement") ctx = popContext(state); - if (ctx.type == "}") ctx = popContext(state); - while (ctx.type == "statement") ctx = popContext(state); - } - else if (curPunc == ctx.type) popContext(state); - else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) - pushContext(state, stream.column(), "statement"); - state.startOfLine = false; - return style; - }, - - indent: function(state, textAfter) { - if (state.tokenize != tokenBase && state.tokenize != null) return 0; - var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); - if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; - var closing = firstChar == ctx.type; - if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit); - else if (ctx.align) return ctx.column + (closing ? 0 : 1); - else return ctx.indented + (closing ? 0 : indentUnit); - }, - - electricChars: "{}" - }; -}); - -CodeMirror.defineMIME("text/x-ecl", "ecl"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/ecl/index.html b/public/plugins/codemirror-5.17.0/mode/ecl/index.html deleted file mode 100644 index 2306860..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ecl/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - -CodeMirror: ECL mode - - - - - - - - - -
-

ECL mode

-
- - -

Based on CodeMirror's clike mode. For more information see HPCC Systems web site.

-

MIME types defined: text/x-ecl.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/eiffel/eiffel.js b/public/plugins/codemirror-5.17.0/mode/eiffel/eiffel.js deleted file mode 100644 index b8b70e3..0000000 --- a/public/plugins/codemirror-5.17.0/mode/eiffel/eiffel.js +++ /dev/null @@ -1,160 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("eiffel", function() { - function wordObj(words) { - var o = {}; - for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; - return o; - } - var keywords = wordObj([ - 'note', - 'across', - 'when', - 'variant', - 'until', - 'unique', - 'undefine', - 'then', - 'strip', - 'select', - 'retry', - 'rescue', - 'require', - 'rename', - 'reference', - 'redefine', - 'prefix', - 'once', - 'old', - 'obsolete', - 'loop', - 'local', - 'like', - 'is', - 'inspect', - 'infix', - 'include', - 'if', - 'frozen', - 'from', - 'external', - 'export', - 'ensure', - 'end', - 'elseif', - 'else', - 'do', - 'creation', - 'create', - 'check', - 'alias', - 'agent', - 'separate', - 'invariant', - 'inherit', - 'indexing', - 'feature', - 'expanded', - 'deferred', - 'class', - 'Void', - 'True', - 'Result', - 'Precursor', - 'False', - 'Current', - 'create', - 'attached', - 'detachable', - 'as', - 'and', - 'implies', - 'not', - 'or' - ]); - var operators = wordObj([":=", "and then","and", "or","<<",">>"]); - - function chain(newtok, stream, state) { - state.tokenize.push(newtok); - return newtok(stream, state); - } - - function tokenBase(stream, state) { - if (stream.eatSpace()) return null; - var ch = stream.next(); - if (ch == '"'||ch == "'") { - return chain(readQuoted(ch, "string"), stream, state); - } else if (ch == "-"&&stream.eat("-")) { - stream.skipToEnd(); - return "comment"; - } else if (ch == ":"&&stream.eat("=")) { - return "operator"; - } else if (/[0-9]/.test(ch)) { - stream.eatWhile(/[xXbBCc0-9\.]/); - stream.eat(/[\?\!]/); - return "ident"; - } else if (/[a-zA-Z_0-9]/.test(ch)) { - stream.eatWhile(/[a-zA-Z_0-9]/); - stream.eat(/[\?\!]/); - return "ident"; - } else if (/[=+\-\/*^%<>~]/.test(ch)) { - stream.eatWhile(/[=+\-\/*^%<>~]/); - return "operator"; - } else { - return null; - } - } - - function readQuoted(quote, style, unescaped) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && (unescaped || !escaped)) { - state.tokenize.pop(); - break; - } - escaped = !escaped && ch == "%"; - } - return style; - }; - } - - return { - startState: function() { - return {tokenize: [tokenBase]}; - }, - - token: function(stream, state) { - var style = state.tokenize[state.tokenize.length-1](stream, state); - if (style == "ident") { - var word = stream.current(); - style = keywords.propertyIsEnumerable(stream.current()) ? "keyword" - : operators.propertyIsEnumerable(stream.current()) ? "operator" - : /^[A-Z][A-Z_0-9]*$/g.test(word) ? "tag" - : /^0[bB][0-1]+$/g.test(word) ? "number" - : /^0[cC][0-7]+$/g.test(word) ? "number" - : /^0[xX][a-fA-F0-9]+$/g.test(word) ? "number" - : /^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(word) ? "number" - : /^[0-9]+$/g.test(word) ? "number" - : "variable"; - } - return style; - }, - lineComment: "--" - }; -}); - -CodeMirror.defineMIME("text/x-eiffel", "eiffel"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/eiffel/index.html b/public/plugins/codemirror-5.17.0/mode/eiffel/index.html deleted file mode 100644 index 108a71b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/eiffel/index.html +++ /dev/null @@ -1,429 +0,0 @@ - - -CodeMirror: Eiffel mode - - - - - - - - - - -
-

Eiffel mode

-
- - -

MIME types defined: text/x-eiffel.

- -

Created by YNH.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/elm/elm.js b/public/plugins/codemirror-5.17.0/mode/elm/elm.js deleted file mode 100644 index b31e663..0000000 --- a/public/plugins/codemirror-5.17.0/mode/elm/elm.js +++ /dev/null @@ -1,205 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("elm", function() { - - function switchState(source, setState, f) { - setState(f); - return f(source, setState); - } - - // These should all be Unicode extended, as per the Haskell 2010 report - var smallRE = /[a-z_]/; - var largeRE = /[A-Z]/; - var digitRE = /[0-9]/; - var hexitRE = /[0-9A-Fa-f]/; - var octitRE = /[0-7]/; - var idRE = /[a-z_A-Z0-9\']/; - var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:\u03BB\u2192]/; - var specialRE = /[(),;[\]`{}]/; - var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer - - function normal() { - return function (source, setState) { - if (source.eatWhile(whiteCharRE)) { - return null; - } - - var ch = source.next(); - if (specialRE.test(ch)) { - if (ch == '{' && source.eat('-')) { - var t = "comment"; - if (source.eat('#')) t = "meta"; - return switchState(source, setState, ncomment(t, 1)); - } - return null; - } - - if (ch == '\'') { - if (source.eat('\\')) - source.next(); // should handle other escapes here - else - source.next(); - - if (source.eat('\'')) - return "string"; - return "error"; - } - - if (ch == '"') { - return switchState(source, setState, stringLiteral); - } - - if (largeRE.test(ch)) { - source.eatWhile(idRE); - if (source.eat('.')) - return "qualifier"; - return "variable-2"; - } - - if (smallRE.test(ch)) { - var isDef = source.pos === 1; - source.eatWhile(idRE); - return isDef ? "variable-3" : "variable"; - } - - if (digitRE.test(ch)) { - if (ch == '0') { - if (source.eat(/[xX]/)) { - source.eatWhile(hexitRE); // should require at least 1 - return "integer"; - } - if (source.eat(/[oO]/)) { - source.eatWhile(octitRE); // should require at least 1 - return "number"; - } - } - source.eatWhile(digitRE); - var t = "number"; - if (source.eat('.')) { - t = "number"; - source.eatWhile(digitRE); // should require at least 1 - } - if (source.eat(/[eE]/)) { - t = "number"; - source.eat(/[-+]/); - source.eatWhile(digitRE); // should require at least 1 - } - return t; - } - - if (symbolRE.test(ch)) { - if (ch == '-' && source.eat(/-/)) { - source.eatWhile(/-/); - if (!source.eat(symbolRE)) { - source.skipToEnd(); - return "comment"; - } - } - source.eatWhile(symbolRE); - return "builtin"; - } - - return "error"; - } - } - - function ncomment(type, nest) { - if (nest == 0) { - return normal(); - } - return function(source, setState) { - var currNest = nest; - while (!source.eol()) { - var ch = source.next(); - if (ch == '{' && source.eat('-')) { - ++currNest; - } else if (ch == '-' && source.eat('}')) { - --currNest; - if (currNest == 0) { - setState(normal()); - return type; - } - } - } - setState(ncomment(type, currNest)); - return type; - } - } - - function stringLiteral(source, setState) { - while (!source.eol()) { - var ch = source.next(); - if (ch == '"') { - setState(normal()); - return "string"; - } - if (ch == '\\') { - if (source.eol() || source.eat(whiteCharRE)) { - setState(stringGap); - return "string"; - } - if (!source.eat('&')) source.next(); // should handle other escapes here - } - } - setState(normal()); - return "error"; - } - - function stringGap(source, setState) { - if (source.eat('\\')) { - return switchState(source, setState, stringLiteral); - } - source.next(); - setState(normal()); - return "error"; - } - - - var wellKnownWords = (function() { - var wkw = {}; - - var keywords = [ - "case", "of", "as", - "if", "then", "else", - "let", "in", - "infix", "infixl", "infixr", - "type", "alias", - "input", "output", "foreign", "loopback", - "module", "where", "import", "exposing", - "_", "..", "|", ":", "=", "\\", "\"", "->", "<-" - ]; - - for (var i = keywords.length; i--;) - wkw[keywords[i]] = "keyword"; - - return wkw; - })(); - - - - return { - startState: function () { return { f: normal() }; }, - copyState: function (s) { return { f: s.f }; }, - - token: function(stream, state) { - var t = state.f(stream, function(s) { state.f = s; }); - var w = stream.current(); - return (wellKnownWords.hasOwnProperty(w)) ? wellKnownWords[w] : t; - } - }; - - }); - - CodeMirror.defineMIME("text/x-elm", "elm"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/elm/index.html b/public/plugins/codemirror-5.17.0/mode/elm/index.html deleted file mode 100644 index d5cb16a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/elm/index.html +++ /dev/null @@ -1,61 +0,0 @@ - - -CodeMirror: Elm mode - - - - - - - - - -
-

Elm mode

- -
- - - -

MIME types defined: text/x-elm.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/erlang/erlang.js b/public/plugins/codemirror-5.17.0/mode/erlang/erlang.js deleted file mode 100644 index 5aed76a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/erlang/erlang.js +++ /dev/null @@ -1,618 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/*jshint unused:true, eqnull:true, curly:true, bitwise:true */ -/*jshint undef:true, latedef:true, trailing:true */ -/*global CodeMirror:true */ - -// erlang mode. -// tokenizer -> token types -> CodeMirror styles -// tokenizer maintains a parse stack -// indenter uses the parse stack - -// TODO indenter: -// bit syntax -// old guard/bif/conversion clashes (e.g. "float/1") -// type/spec/opaque - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMIME("text/x-erlang", "erlang"); - -CodeMirror.defineMode("erlang", function(cmCfg) { - "use strict"; - -///////////////////////////////////////////////////////////////////////////// -// constants - - var typeWords = [ - "-type", "-spec", "-export_type", "-opaque"]; - - var keywordWords = [ - "after","begin","catch","case","cond","end","fun","if", - "let","of","query","receive","try","when"]; - - var separatorRE = /[\->,;]/; - var separatorWords = [ - "->",";",","]; - - var operatorAtomWords = [ - "and","andalso","band","bnot","bor","bsl","bsr","bxor", - "div","not","or","orelse","rem","xor"]; - - var operatorSymbolRE = /[\+\-\*\/<>=\|:!]/; - var operatorSymbolWords = [ - "=","+","-","*","/",">",">=","<","=<","=:=","==","=/=","/=","||","<-","!"]; - - var openParenRE = /[<\(\[\{]/; - var openParenWords = [ - "<<","(","[","{"]; - - var closeParenRE = /[>\)\]\}]/; - var closeParenWords = [ - "}","]",")",">>"]; - - var guardWords = [ - "is_atom","is_binary","is_bitstring","is_boolean","is_float", - "is_function","is_integer","is_list","is_number","is_pid", - "is_port","is_record","is_reference","is_tuple", - "atom","binary","bitstring","boolean","function","integer","list", - "number","pid","port","record","reference","tuple"]; - - var bifWords = [ - "abs","adler32","adler32_combine","alive","apply","atom_to_binary", - "atom_to_list","binary_to_atom","binary_to_existing_atom", - "binary_to_list","binary_to_term","bit_size","bitstring_to_list", - "byte_size","check_process_code","contact_binary","crc32", - "crc32_combine","date","decode_packet","delete_module", - "disconnect_node","element","erase","exit","float","float_to_list", - "garbage_collect","get","get_keys","group_leader","halt","hd", - "integer_to_list","internal_bif","iolist_size","iolist_to_binary", - "is_alive","is_atom","is_binary","is_bitstring","is_boolean", - "is_float","is_function","is_integer","is_list","is_number","is_pid", - "is_port","is_process_alive","is_record","is_reference","is_tuple", - "length","link","list_to_atom","list_to_binary","list_to_bitstring", - "list_to_existing_atom","list_to_float","list_to_integer", - "list_to_pid","list_to_tuple","load_module","make_ref","module_loaded", - "monitor_node","node","node_link","node_unlink","nodes","notalive", - "now","open_port","pid_to_list","port_close","port_command", - "port_connect","port_control","pre_loaded","process_flag", - "process_info","processes","purge_module","put","register", - "registered","round","self","setelement","size","spawn","spawn_link", - "spawn_monitor","spawn_opt","split_binary","statistics", - "term_to_binary","time","throw","tl","trunc","tuple_size", - "tuple_to_list","unlink","unregister","whereis"]; - -// upper case: [A-Z] [Ø-Þ] [À-Ö] -// lower case: [a-z] [ß-ö] [ø-ÿ] - var anumRE = /[\w@Ø-ÞÀ-Öß-öø-ÿ]/; - var escapesRE = - /[0-7]{1,3}|[bdefnrstv\\"']|\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/; - -///////////////////////////////////////////////////////////////////////////// -// tokenizer - - function tokenizer(stream,state) { - // in multi-line string - if (state.in_string) { - state.in_string = (!doubleQuote(stream)); - return rval(state,stream,"string"); - } - - // in multi-line atom - if (state.in_atom) { - state.in_atom = (!singleQuote(stream)); - return rval(state,stream,"atom"); - } - - // whitespace - if (stream.eatSpace()) { - return rval(state,stream,"whitespace"); - } - - // attributes and type specs - if (!peekToken(state) && - stream.match(/-\s*[a-zß-öø-ÿ][\wØ-ÞÀ-Öß-öø-ÿ]*/)) { - if (is_member(stream.current(),typeWords)) { - return rval(state,stream,"type"); - }else{ - return rval(state,stream,"attribute"); - } - } - - var ch = stream.next(); - - // comment - if (ch == '%') { - stream.skipToEnd(); - return rval(state,stream,"comment"); - } - - // colon - if (ch == ":") { - return rval(state,stream,"colon"); - } - - // macro - if (ch == '?') { - stream.eatSpace(); - stream.eatWhile(anumRE); - return rval(state,stream,"macro"); - } - - // record - if (ch == "#") { - stream.eatSpace(); - stream.eatWhile(anumRE); - return rval(state,stream,"record"); - } - - // dollar escape - if (ch == "$") { - if (stream.next() == "\\" && !stream.match(escapesRE)) { - return rval(state,stream,"error"); - } - return rval(state,stream,"number"); - } - - // dot - if (ch == ".") { - return rval(state,stream,"dot"); - } - - // quoted atom - if (ch == '\'') { - if (!(state.in_atom = (!singleQuote(stream)))) { - if (stream.match(/\s*\/\s*[0-9]/,false)) { - stream.match(/\s*\/\s*[0-9]/,true); - return rval(state,stream,"fun"); // 'f'/0 style fun - } - if (stream.match(/\s*\(/,false) || stream.match(/\s*:/,false)) { - return rval(state,stream,"function"); - } - } - return rval(state,stream,"atom"); - } - - // string - if (ch == '"') { - state.in_string = (!doubleQuote(stream)); - return rval(state,stream,"string"); - } - - // variable - if (/[A-Z_Ø-ÞÀ-Ö]/.test(ch)) { - stream.eatWhile(anumRE); - return rval(state,stream,"variable"); - } - - // atom/keyword/BIF/function - if (/[a-z_ß-öø-ÿ]/.test(ch)) { - stream.eatWhile(anumRE); - - if (stream.match(/\s*\/\s*[0-9]/,false)) { - stream.match(/\s*\/\s*[0-9]/,true); - return rval(state,stream,"fun"); // f/0 style fun - } - - var w = stream.current(); - - if (is_member(w,keywordWords)) { - return rval(state,stream,"keyword"); - }else if (is_member(w,operatorAtomWords)) { - return rval(state,stream,"operator"); - }else if (stream.match(/\s*\(/,false)) { - // 'put' and 'erlang:put' are bifs, 'foo:put' is not - if (is_member(w,bifWords) && - ((peekToken(state).token != ":") || - (peekToken(state,2).token == "erlang"))) { - return rval(state,stream,"builtin"); - }else if (is_member(w,guardWords)) { - return rval(state,stream,"guard"); - }else{ - return rval(state,stream,"function"); - } - }else if (lookahead(stream) == ":") { - if (w == "erlang") { - return rval(state,stream,"builtin"); - } else { - return rval(state,stream,"function"); - } - }else if (is_member(w,["true","false"])) { - return rval(state,stream,"boolean"); - }else{ - return rval(state,stream,"atom"); - } - } - - // number - var digitRE = /[0-9]/; - var radixRE = /[0-9a-zA-Z]/; // 36#zZ style int - if (digitRE.test(ch)) { - stream.eatWhile(digitRE); - if (stream.eat('#')) { // 36#aZ style integer - if (!stream.eatWhile(radixRE)) { - stream.backUp(1); //"36#" - syntax error - } - } else if (stream.eat('.')) { // float - if (!stream.eatWhile(digitRE)) { - stream.backUp(1); // "3." - probably end of function - } else { - if (stream.eat(/[eE]/)) { // float with exponent - if (stream.eat(/[-+]/)) { - if (!stream.eatWhile(digitRE)) { - stream.backUp(2); // "2e-" - syntax error - } - } else { - if (!stream.eatWhile(digitRE)) { - stream.backUp(1); // "2e" - syntax error - } - } - } - } - } - return rval(state,stream,"number"); // normal integer - } - - // open parens - if (nongreedy(stream,openParenRE,openParenWords)) { - return rval(state,stream,"open_paren"); - } - - // close parens - if (nongreedy(stream,closeParenRE,closeParenWords)) { - return rval(state,stream,"close_paren"); - } - - // separators - if (greedy(stream,separatorRE,separatorWords)) { - return rval(state,stream,"separator"); - } - - // operators - if (greedy(stream,operatorSymbolRE,operatorSymbolWords)) { - return rval(state,stream,"operator"); - } - - return rval(state,stream,null); - } - -///////////////////////////////////////////////////////////////////////////// -// utilities - function nongreedy(stream,re,words) { - if (stream.current().length == 1 && re.test(stream.current())) { - stream.backUp(1); - while (re.test(stream.peek())) { - stream.next(); - if (is_member(stream.current(),words)) { - return true; - } - } - stream.backUp(stream.current().length-1); - } - return false; - } - - function greedy(stream,re,words) { - if (stream.current().length == 1 && re.test(stream.current())) { - while (re.test(stream.peek())) { - stream.next(); - } - while (0 < stream.current().length) { - if (is_member(stream.current(),words)) { - return true; - }else{ - stream.backUp(1); - } - } - stream.next(); - } - return false; - } - - function doubleQuote(stream) { - return quote(stream, '"', '\\'); - } - - function singleQuote(stream) { - return quote(stream,'\'','\\'); - } - - function quote(stream,quoteChar,escapeChar) { - while (!stream.eol()) { - var ch = stream.next(); - if (ch == quoteChar) { - return true; - }else if (ch == escapeChar) { - stream.next(); - } - } - return false; - } - - function lookahead(stream) { - var m = stream.match(/([\n\s]+|%[^\n]*\n)*(.)/,false); - return m ? m.pop() : ""; - } - - function is_member(element,list) { - return (-1 < list.indexOf(element)); - } - - function rval(state,stream,type) { - - // parse stack - pushToken(state,realToken(type,stream)); - - // map erlang token type to CodeMirror style class - // erlang -> CodeMirror tag - switch (type) { - case "atom": return "atom"; - case "attribute": return "attribute"; - case "boolean": return "atom"; - case "builtin": return "builtin"; - case "close_paren": return null; - case "colon": return null; - case "comment": return "comment"; - case "dot": return null; - case "error": return "error"; - case "fun": return "meta"; - case "function": return "tag"; - case "guard": return "property"; - case "keyword": return "keyword"; - case "macro": return "variable-2"; - case "number": return "number"; - case "open_paren": return null; - case "operator": return "operator"; - case "record": return "bracket"; - case "separator": return null; - case "string": return "string"; - case "type": return "def"; - case "variable": return "variable"; - default: return null; - } - } - - function aToken(tok,col,ind,typ) { - return {token: tok, - column: col, - indent: ind, - type: typ}; - } - - function realToken(type,stream) { - return aToken(stream.current(), - stream.column(), - stream.indentation(), - type); - } - - function fakeToken(type) { - return aToken(type,0,0,type); - } - - function peekToken(state,depth) { - var len = state.tokenStack.length; - var dep = (depth ? depth : 1); - - if (len < dep) { - return false; - }else{ - return state.tokenStack[len-dep]; - } - } - - function pushToken(state,token) { - - if (!(token.type == "comment" || token.type == "whitespace")) { - state.tokenStack = maybe_drop_pre(state.tokenStack,token); - state.tokenStack = maybe_drop_post(state.tokenStack); - } - } - - function maybe_drop_pre(s,token) { - var last = s.length-1; - - if (0 < last && s[last].type === "record" && token.type === "dot") { - s.pop(); - }else if (0 < last && s[last].type === "group") { - s.pop(); - s.push(token); - }else{ - s.push(token); - } - return s; - } - - function maybe_drop_post(s) { - var last = s.length-1; - - if (s[last].type === "dot") { - return []; - } - if (s[last].type === "fun" && s[last-1].token === "fun") { - return s.slice(0,last-1); - } - switch (s[s.length-1].token) { - case "}": return d(s,{g:["{"]}); - case "]": return d(s,{i:["["]}); - case ")": return d(s,{i:["("]}); - case ">>": return d(s,{i:["<<"]}); - case "end": return d(s,{i:["begin","case","fun","if","receive","try"]}); - case ",": return d(s,{e:["begin","try","when","->", - ",","(","[","{","<<"]}); - case "->": return d(s,{r:["when"], - m:["try","if","case","receive"]}); - case ";": return d(s,{E:["case","fun","if","receive","try","when"]}); - case "catch":return d(s,{e:["try"]}); - case "of": return d(s,{e:["case"]}); - case "after":return d(s,{e:["receive","try"]}); - default: return s; - } - } - - function d(stack,tt) { - // stack is a stack of Token objects. - // tt is an object; {type:tokens} - // type is a char, tokens is a list of token strings. - // The function returns (possibly truncated) stack. - // It will descend the stack, looking for a Token such that Token.token - // is a member of tokens. If it does not find that, it will normally (but - // see "E" below) return stack. If it does find a match, it will remove - // all the Tokens between the top and the matched Token. - // If type is "m", that is all it does. - // If type is "i", it will also remove the matched Token and the top Token. - // If type is "g", like "i", but add a fake "group" token at the top. - // If type is "r", it will remove the matched Token, but not the top Token. - // If type is "e", it will keep the matched Token but not the top Token. - // If type is "E", it behaves as for type "e", except if there is no match, - // in which case it will return an empty stack. - - for (var type in tt) { - var len = stack.length-1; - var tokens = tt[type]; - for (var i = len-1; -1 < i ; i--) { - if (is_member(stack[i].token,tokens)) { - var ss = stack.slice(0,i); - switch (type) { - case "m": return ss.concat(stack[i]).concat(stack[len]); - case "r": return ss.concat(stack[len]); - case "i": return ss; - case "g": return ss.concat(fakeToken("group")); - case "E": return ss.concat(stack[i]); - case "e": return ss.concat(stack[i]); - } - } - } - } - return (type == "E" ? [] : stack); - } - -///////////////////////////////////////////////////////////////////////////// -// indenter - - function indenter(state,textAfter) { - var t; - var unit = cmCfg.indentUnit; - var wordAfter = wordafter(textAfter); - var currT = peekToken(state,1); - var prevT = peekToken(state,2); - - if (state.in_string || state.in_atom) { - return CodeMirror.Pass; - }else if (!prevT) { - return 0; - }else if (currT.token == "when") { - return currT.column+unit; - }else if (wordAfter === "when" && prevT.type === "function") { - return prevT.indent+unit; - }else if (wordAfter === "(" && currT.token === "fun") { - return currT.column+3; - }else if (wordAfter === "catch" && (t = getToken(state,["try"]))) { - return t.column; - }else if (is_member(wordAfter,["end","after","of"])) { - t = getToken(state,["begin","case","fun","if","receive","try"]); - return t ? t.column : CodeMirror.Pass; - }else if (is_member(wordAfter,closeParenWords)) { - t = getToken(state,openParenWords); - return t ? t.column : CodeMirror.Pass; - }else if (is_member(currT.token,[",","|","||"]) || - is_member(wordAfter,[",","|","||"])) { - t = postcommaToken(state); - return t ? t.column+t.token.length : unit; - }else if (currT.token == "->") { - if (is_member(prevT.token, ["receive","case","if","try"])) { - return prevT.column+unit+unit; - }else{ - return prevT.column+unit; - } - }else if (is_member(currT.token,openParenWords)) { - return currT.column+currT.token.length; - }else{ - t = defaultToken(state); - return truthy(t) ? t.column+unit : 0; - } - } - - function wordafter(str) { - var m = str.match(/,|[a-z]+|\}|\]|\)|>>|\|+|\(/); - - return truthy(m) && (m.index === 0) ? m[0] : ""; - } - - function postcommaToken(state) { - var objs = state.tokenStack.slice(0,-1); - var i = getTokenIndex(objs,"type",["open_paren"]); - - return truthy(objs[i]) ? objs[i] : false; - } - - function defaultToken(state) { - var objs = state.tokenStack; - var stop = getTokenIndex(objs,"type",["open_paren","separator","keyword"]); - var oper = getTokenIndex(objs,"type",["operator"]); - - if (truthy(stop) && truthy(oper) && stop < oper) { - return objs[stop+1]; - } else if (truthy(stop)) { - return objs[stop]; - } else { - return false; - } - } - - function getToken(state,tokens) { - var objs = state.tokenStack; - var i = getTokenIndex(objs,"token",tokens); - - return truthy(objs[i]) ? objs[i] : false; - } - - function getTokenIndex(objs,propname,propvals) { - - for (var i = objs.length-1; -1 < i ; i--) { - if (is_member(objs[i][propname],propvals)) { - return i; - } - } - return false; - } - - function truthy(x) { - return (x !== false) && (x != null); - } - -///////////////////////////////////////////////////////////////////////////// -// this object defines the mode - - return { - startState: - function() { - return {tokenStack: [], - in_string: false, - in_atom: false}; - }, - - token: - function(stream, state) { - return tokenizer(stream, state); - }, - - indent: - function(state, textAfter) { - return indenter(state,textAfter); - }, - - lineComment: "%" - }; -}); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/erlang/index.html b/public/plugins/codemirror-5.17.0/mode/erlang/index.html deleted file mode 100644 index 6d06a89..0000000 --- a/public/plugins/codemirror-5.17.0/mode/erlang/index.html +++ /dev/null @@ -1,76 +0,0 @@ - - -CodeMirror: Erlang mode - - - - - - - - - - - -
-

Erlang mode

-
- - - -

MIME types defined: text/x-erlang.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/factor/factor.js b/public/plugins/codemirror-5.17.0/mode/factor/factor.js deleted file mode 100644 index 86d7adf..0000000 --- a/public/plugins/codemirror-5.17.0/mode/factor/factor.js +++ /dev/null @@ -1,83 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Factor syntax highlight - simple mode -// -// by Dimage Sapelkin (https://github.com/kerabromsmu) - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../../addon/mode/simple"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineSimpleMode("factor", { - // The start state contains the rules that are intially used - start: [ - // comments - {regex: /#?!.*/, token: "comment"}, - // strings """, multiline --> state - {regex: /"""/, token: "string", next: "string3"}, - {regex: /"/, token: "string", next: "string"}, - // numbers: dec, hex, unicode, bin, fractional, complex - {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"}, - //{regex: /[+-]?/} //fractional - // definition: defining word, defined word, etc - {regex: /(\:)(\s+)(\S+)(\s+)(\()/, token: ["keyword", null, "def", null, "keyword"], next: "stack"}, - // vocabulary using --> state - {regex: /USING\:/, token: "keyword", next: "vocabulary"}, - // vocabulary definition/use - {regex: /(USE\:|IN\:)(\s+)(\S+)/, token: ["keyword", null, "variable-2"]}, - // - {regex: /<\S+>/, token: "builtin"}, - // "keywords", incl. ; t f . [ ] { } defining words - {regex: /;|t|f|if|\.|\[|\]|\{|\}|MAIN:/, token: "keyword"}, - // any id (?) - {regex: /\S+/, token: "variable"}, - - { - regex: /./, - token: null - } - ], - vocabulary: [ - {regex: /;/, token: "keyword", next: "start"}, - {regex: /\S+/, token: "variable-2"}, - { - regex: /./, - token: null - } - ], - string: [ - {regex: /(?:[^\\]|\\.)*?"/, token: "string", next: "start"}, - {regex: /.*/, token: "string"} - ], - string3: [ - {regex: /(?:[^\\]|\\.)*?"""/, token: "string", next: "start"}, - {regex: /.*/, token: "string"} - ], - stack: [ - {regex: /\)/, token: "meta", next: "start"}, - {regex: /--/, token: "meta"}, - {regex: /\S+/, token: "variable-3"}, - { - regex: /./, - token: null - } - ], - // The meta property contains global information about the mode. It - // can contain properties like lineComment, which are supported by - // all modes, and also directives like dontIndentStates, which are - // specific to simple modes. - meta: { - dontIndentStates: ["start", "vocabulary", "string", "string3", "stack"], - lineComment: [ "!", "#!" ] - } - }); - - CodeMirror.defineMIME("text/x-factor", "factor"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/factor/index.html b/public/plugins/codemirror-5.17.0/mode/factor/index.html deleted file mode 100644 index 9f15489..0000000 --- a/public/plugins/codemirror-5.17.0/mode/factor/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - -CodeMirror: Factor mode - - - - - - - - - - - -
- -

Factor mode

- -
- - - -

-

Simple mode that handles Factor Syntax (Factor on WikiPedia).

- -

MIME types defined: text/x-factor.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/fcl/fcl.js b/public/plugins/codemirror-5.17.0/mode/fcl/fcl.js deleted file mode 100644 index 5181169..0000000 --- a/public/plugins/codemirror-5.17.0/mode/fcl/fcl.js +++ /dev/null @@ -1,173 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("fcl", function(config) { - var indentUnit = config.indentUnit; - - var keywords = { - "term": true, - "method": true, "accu": true, - "rule": true, "then": true, "is": true, "and": true, "or": true, - "if": true, "default": true - }; - - var start_blocks = { - "var_input": true, - "var_output": true, - "fuzzify": true, - "defuzzify": true, - "function_block": true, - "ruleblock": true - }; - - var end_blocks = { - "end_ruleblock": true, - "end_defuzzify": true, - "end_function_block": true, - "end_fuzzify": true, - "end_var": true - }; - - var atoms = { - "true": true, "false": true, "nan": true, - "real": true, "min": true, "max": true, "cog": true, "cogs": true - }; - - var isOperatorChar = /[+\-*&^%:=<>!|\/]/; - - function tokenBase(stream, state) { - var ch = stream.next(); - - if (/[\d\.]/.test(ch)) { - if (ch == ".") { - stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); - } else if (ch == "0") { - stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); - } else { - stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); - } - return "number"; - } - - if (ch == "/" || ch == "(") { - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - } - if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - stream.eatWhile(/[\w\$_\xa1-\uffff]/); - - var cur = stream.current().toLowerCase(); - if (keywords.propertyIsEnumerable(cur) || - start_blocks.propertyIsEnumerable(cur) || - end_blocks.propertyIsEnumerable(cur)) { - return "keyword"; - } - if (atoms.propertyIsEnumerable(cur)) return "atom"; - return "variable"; - } - - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if ((ch == "/" || ch == ")") && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function Context(indented, column, type, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.align = align; - this.prev = prev; - } - - function pushContext(state, col, type) { - return state.context = new Context(state.indented, col, type, null, state.context); - } - - function popContext(state) { - if (!state.context.prev) return; - var t = state.context.type; - if (t == "end_block") - state.indented = state.context.indented; - return state.context = state.context.prev; - } - - // Interface - - return { - startState: function(basecolumn) { - return { - tokenize: null, - context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), - indented: 0, - startOfLine: true - }; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - } - if (stream.eatSpace()) return null; - - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment") return style; - if (ctx.align == null) ctx.align = true; - - var cur = stream.current().toLowerCase(); - - if (start_blocks.propertyIsEnumerable(cur)) pushContext(state, stream.column(), "end_block"); - else if (end_blocks.propertyIsEnumerable(cur)) popContext(state); - - state.startOfLine = false; - return style; - }, - - indent: function(state, textAfter) { - if (state.tokenize != tokenBase && state.tokenize != null) return 0; - var ctx = state.context; - - var closing = end_blocks.propertyIsEnumerable(textAfter); - if (ctx.align) return ctx.column + (closing ? 0 : 1); - else return ctx.indented + (closing ? 0 : indentUnit); - }, - - electricChars: "ryk", - fold: "brace", - blockCommentStart: "(*", - blockCommentEnd: "*)", - lineComment: "//" - }; -}); - -CodeMirror.defineMIME("text/x-fcl", "fcl"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/fcl/index.html b/public/plugins/codemirror-5.17.0/mode/fcl/index.html deleted file mode 100644 index 3c18d0b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/fcl/index.html +++ /dev/null @@ -1,108 +0,0 @@ - - -CodeMirror: FCL mode - - - - - - - - - - - -
-

FCL mode

-
- - - -

MIME type: text/x-fcl

-
diff --git a/public/plugins/codemirror-5.17.0/mode/forth/forth.js b/public/plugins/codemirror-5.17.0/mode/forth/forth.js deleted file mode 100644 index 1f519d8..0000000 --- a/public/plugins/codemirror-5.17.0/mode/forth/forth.js +++ /dev/null @@ -1,180 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Author: Aliaksei Chapyzhenka - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - function toWordList(words) { - var ret = []; - words.split(' ').forEach(function(e){ - ret.push({name: e}); - }); - return ret; - } - - var coreWordList = toWordList( -'INVERT AND OR XOR\ - 2* 2/ LSHIFT RSHIFT\ - 0= = 0< < > U< MIN MAX\ - 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP\ - >R R> R@\ - + - 1+ 1- ABS NEGATE\ - S>D * M* UM*\ - FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD\ - HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2!\ - ALIGN ALIGNED +! ALLOT\ - CHAR [CHAR] [ ] BL\ - FIND EXECUTE IMMEDIATE COUNT LITERAL STATE\ - ; DOES> >BODY\ - EVALUATE\ - SOURCE >IN\ - <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL\ - FILL MOVE\ - . CR EMIT SPACE SPACES TYPE U. .R U.R\ - ACCEPT\ - TRUE FALSE\ - <> U> 0<> 0>\ - NIP TUCK ROLL PICK\ - 2>R 2R@ 2R>\ - WITHIN UNUSED MARKER\ - I J\ - TO\ - COMPILE, [COMPILE]\ - SAVE-INPUT RESTORE-INPUT\ - PAD ERASE\ - 2LITERAL DNEGATE\ - D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS\ - M+ M*/ D. D.R 2ROT DU<\ - CATCH THROW\ - FREE RESIZE ALLOCATE\ - CS-PICK CS-ROLL\ - GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER\ - PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER\ - -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL'); - - var immediateWordList = toWordList('IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE'); - - CodeMirror.defineMode('forth', function() { - function searchWordList (wordList, word) { - var i; - for (i = wordList.length - 1; i >= 0; i--) { - if (wordList[i].name === word.toUpperCase()) { - return wordList[i]; - } - } - return undefined; - } - return { - startState: function() { - return { - state: '', - base: 10, - coreWordList: coreWordList, - immediateWordList: immediateWordList, - wordList: [] - }; - }, - token: function (stream, stt) { - var mat; - if (stream.eatSpace()) { - return null; - } - if (stt.state === '') { // interpretation - if (stream.match(/^(\]|:NONAME)(\s|$)/i)) { - stt.state = ' compilation'; - return 'builtin compilation'; - } - mat = stream.match(/^(\:)\s+(\S+)(\s|$)+/); - if (mat) { - stt.wordList.push({name: mat[2].toUpperCase()}); - stt.state = ' compilation'; - return 'def' + stt.state; - } - mat = stream.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\s+(\S+)(\s|$)+/i); - if (mat) { - stt.wordList.push({name: mat[2].toUpperCase()}); - return 'def' + stt.state; - } - mat = stream.match(/^(\'|\[\'\])\s+(\S+)(\s|$)+/); - if (mat) { - return 'builtin' + stt.state; - } - } else { // compilation - // ; [ - if (stream.match(/^(\;|\[)(\s)/)) { - stt.state = ''; - stream.backUp(1); - return 'builtin compilation'; - } - if (stream.match(/^(\;|\[)($)/)) { - stt.state = ''; - return 'builtin compilation'; - } - if (stream.match(/^(POSTPONE)\s+\S+(\s|$)+/)) { - return 'builtin'; - } - } - - // dynamic wordlist - mat = stream.match(/^(\S+)(\s+|$)/); - if (mat) { - if (searchWordList(stt.wordList, mat[1]) !== undefined) { - return 'variable' + stt.state; - } - - // comments - if (mat[1] === '\\') { - stream.skipToEnd(); - return 'comment' + stt.state; - } - - // core words - if (searchWordList(stt.coreWordList, mat[1]) !== undefined) { - return 'builtin' + stt.state; - } - if (searchWordList(stt.immediateWordList, mat[1]) !== undefined) { - return 'keyword' + stt.state; - } - - if (mat[1] === '(') { - stream.eatWhile(function (s) { return s !== ')'; }); - stream.eat(')'); - return 'comment' + stt.state; - } - - // // strings - if (mat[1] === '.(') { - stream.eatWhile(function (s) { return s !== ')'; }); - stream.eat(')'); - return 'string' + stt.state; - } - if (mat[1] === 'S"' || mat[1] === '."' || mat[1] === 'C"') { - stream.eatWhile(function (s) { return s !== '"'; }); - stream.eat('"'); - return 'string' + stt.state; - } - - // numbers - if (mat[1] - 0xfffffffff) { - return 'number' + stt.state; - } - // if (mat[1].match(/^[-+]?[0-9]+\.[0-9]*/)) { - // return 'number' + stt.state; - // } - - return 'atom' + stt.state; - } - } - }; - }); - CodeMirror.defineMIME("text/x-forth", "forth"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/forth/index.html b/public/plugins/codemirror-5.17.0/mode/forth/index.html deleted file mode 100644 index ae8cd34..0000000 --- a/public/plugins/codemirror-5.17.0/mode/forth/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - -CodeMirror: Forth mode - - - - - - - - - - - -
- -

Forth mode

- -
- - - - -

Simple mode that handle Forth-Syntax (Forth on WikiPedia).

- -

MIME types defined: text/x-forth.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/fortran/fortran.js b/public/plugins/codemirror-5.17.0/mode/fortran/fortran.js deleted file mode 100644 index 4d88f00..0000000 --- a/public/plugins/codemirror-5.17.0/mode/fortran/fortran.js +++ /dev/null @@ -1,188 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("fortran", function() { - function words(array) { - var keys = {}; - for (var i = 0; i < array.length; ++i) { - keys[array[i]] = true; - } - return keys; - } - - var keywords = words([ - "abstract", "accept", "allocatable", "allocate", - "array", "assign", "asynchronous", "backspace", - "bind", "block", "byte", "call", "case", - "class", "close", "common", "contains", - "continue", "cycle", "data", "deallocate", - "decode", "deferred", "dimension", "do", - "elemental", "else", "encode", "end", - "endif", "entry", "enumerator", "equivalence", - "exit", "external", "extrinsic", "final", - "forall", "format", "function", "generic", - "go", "goto", "if", "implicit", "import", "include", - "inquire", "intent", "interface", "intrinsic", - "module", "namelist", "non_intrinsic", - "non_overridable", "none", "nopass", - "nullify", "open", "optional", "options", - "parameter", "pass", "pause", "pointer", - "print", "private", "program", "protected", - "public", "pure", "read", "recursive", "result", - "return", "rewind", "save", "select", "sequence", - "stop", "subroutine", "target", "then", "to", "type", - "use", "value", "volatile", "where", "while", - "write"]); - var builtins = words(["abort", "abs", "access", "achar", "acos", - "adjustl", "adjustr", "aimag", "aint", "alarm", - "all", "allocated", "alog", "amax", "amin", - "amod", "and", "anint", "any", "asin", - "associated", "atan", "besj", "besjn", "besy", - "besyn", "bit_size", "btest", "cabs", "ccos", - "ceiling", "cexp", "char", "chdir", "chmod", - "clog", "cmplx", "command_argument_count", - "complex", "conjg", "cos", "cosh", "count", - "cpu_time", "cshift", "csin", "csqrt", "ctime", - "c_funloc", "c_loc", "c_associated", "c_null_ptr", - "c_null_funptr", "c_f_pointer", "c_null_char", - "c_alert", "c_backspace", "c_form_feed", - "c_new_line", "c_carriage_return", - "c_horizontal_tab", "c_vertical_tab", "dabs", - "dacos", "dasin", "datan", "date_and_time", - "dbesj", "dbesj", "dbesjn", "dbesy", "dbesy", - "dbesyn", "dble", "dcos", "dcosh", "ddim", "derf", - "derfc", "dexp", "digits", "dim", "dint", "dlog", - "dlog", "dmax", "dmin", "dmod", "dnint", - "dot_product", "dprod", "dsign", "dsinh", - "dsin", "dsqrt", "dtanh", "dtan", "dtime", - "eoshift", "epsilon", "erf", "erfc", "etime", - "exit", "exp", "exponent", "extends_type_of", - "fdate", "fget", "fgetc", "float", "floor", - "flush", "fnum", "fputc", "fput", "fraction", - "fseek", "fstat", "ftell", "gerror", "getarg", - "get_command", "get_command_argument", - "get_environment_variable", "getcwd", - "getenv", "getgid", "getlog", "getpid", - "getuid", "gmtime", "hostnm", "huge", "iabs", - "iachar", "iand", "iargc", "ibclr", "ibits", - "ibset", "ichar", "idate", "idim", "idint", - "idnint", "ieor", "ierrno", "ifix", "imag", - "imagpart", "index", "int", "ior", "irand", - "isatty", "ishft", "ishftc", "isign", - "iso_c_binding", "is_iostat_end", "is_iostat_eor", - "itime", "kill", "kind", "lbound", "len", "len_trim", - "lge", "lgt", "link", "lle", "llt", "lnblnk", "loc", - "log", "logical", "long", "lshift", "lstat", "ltime", - "matmul", "max", "maxexponent", "maxloc", "maxval", - "mclock", "merge", "move_alloc", "min", "minexponent", - "minloc", "minval", "mod", "modulo", "mvbits", - "nearest", "new_line", "nint", "not", "or", "pack", - "perror", "precision", "present", "product", "radix", - "rand", "random_number", "random_seed", "range", - "real", "realpart", "rename", "repeat", "reshape", - "rrspacing", "rshift", "same_type_as", "scale", - "scan", "second", "selected_int_kind", - "selected_real_kind", "set_exponent", "shape", - "short", "sign", "signal", "sinh", "sin", "sleep", - "sngl", "spacing", "spread", "sqrt", "srand", "stat", - "sum", "symlnk", "system", "system_clock", "tan", - "tanh", "time", "tiny", "transfer", "transpose", - "trim", "ttynam", "ubound", "umask", "unlink", - "unpack", "verify", "xor", "zabs", "zcos", "zexp", - "zlog", "zsin", "zsqrt"]); - - var dataTypes = words(["c_bool", "c_char", "c_double", "c_double_complex", - "c_float", "c_float_complex", "c_funptr", "c_int", - "c_int16_t", "c_int32_t", "c_int64_t", "c_int8_t", - "c_int_fast16_t", "c_int_fast32_t", "c_int_fast64_t", - "c_int_fast8_t", "c_int_least16_t", "c_int_least32_t", - "c_int_least64_t", "c_int_least8_t", "c_intmax_t", - "c_intptr_t", "c_long", "c_long_double", - "c_long_double_complex", "c_long_long", "c_ptr", - "c_short", "c_signed_char", "c_size_t", "character", - "complex", "double", "integer", "logical", "real"]); - var isOperatorChar = /[+\-*&=<>\/\:]/; - var litOperator = new RegExp("(\.and\.|\.or\.|\.eq\.|\.lt\.|\.le\.|\.gt\.|\.ge\.|\.ne\.|\.not\.|\.eqv\.|\.neqv\.)", "i"); - - function tokenBase(stream, state) { - - if (stream.match(litOperator)){ - return 'operator'; - } - - var ch = stream.next(); - if (ch == "!") { - stream.skipToEnd(); - return "comment"; - } - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - if (/[\[\]\(\),]/.test(ch)) { - return null; - } - if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } - if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - stream.eatWhile(/[\w\$_]/); - var word = stream.current().toLowerCase(); - - if (keywords.hasOwnProperty(word)){ - return 'keyword'; - } - if (builtins.hasOwnProperty(word) || dataTypes.hasOwnProperty(word)) { - return 'builtin'; - } - return "variable"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) { - end = true; - break; - } - escaped = !escaped && next == "\\"; - } - if (end || !escaped) state.tokenize = null; - return "string"; - }; - } - - // Interface - - return { - startState: function() { - return {tokenize: null}; - }, - - token: function(stream, state) { - if (stream.eatSpace()) return null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment" || style == "meta") return style; - return style; - } - }; -}); - -CodeMirror.defineMIME("text/x-fortran", "fortran"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/fortran/index.html b/public/plugins/codemirror-5.17.0/mode/fortran/index.html deleted file mode 100644 index 9aed0ef..0000000 --- a/public/plugins/codemirror-5.17.0/mode/fortran/index.html +++ /dev/null @@ -1,81 +0,0 @@ - - -CodeMirror: Fortran mode - - - - - - - - - -
-

Fortran mode

- - -
- - - -

MIME types defined: text/x-fortran.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/gas/gas.js b/public/plugins/codemirror-5.17.0/mode/gas/gas.js deleted file mode 100644 index 0c74bed..0000000 --- a/public/plugins/codemirror-5.17.0/mode/gas/gas.js +++ /dev/null @@ -1,345 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("gas", function(_config, parserConfig) { - 'use strict'; - - // If an architecture is specified, its initialization function may - // populate this array with custom parsing functions which will be - // tried in the event that the standard functions do not find a match. - var custom = []; - - // The symbol used to start a line comment changes based on the target - // architecture. - // If no architecture is pased in "parserConfig" then only multiline - // comments will have syntax support. - var lineCommentStartSymbol = ""; - - // These directives are architecture independent. - // Machine specific directives should go in their respective - // architecture initialization function. - // Reference: - // http://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops - var directives = { - ".abort" : "builtin", - ".align" : "builtin", - ".altmacro" : "builtin", - ".ascii" : "builtin", - ".asciz" : "builtin", - ".balign" : "builtin", - ".balignw" : "builtin", - ".balignl" : "builtin", - ".bundle_align_mode" : "builtin", - ".bundle_lock" : "builtin", - ".bundle_unlock" : "builtin", - ".byte" : "builtin", - ".cfi_startproc" : "builtin", - ".comm" : "builtin", - ".data" : "builtin", - ".def" : "builtin", - ".desc" : "builtin", - ".dim" : "builtin", - ".double" : "builtin", - ".eject" : "builtin", - ".else" : "builtin", - ".elseif" : "builtin", - ".end" : "builtin", - ".endef" : "builtin", - ".endfunc" : "builtin", - ".endif" : "builtin", - ".equ" : "builtin", - ".equiv" : "builtin", - ".eqv" : "builtin", - ".err" : "builtin", - ".error" : "builtin", - ".exitm" : "builtin", - ".extern" : "builtin", - ".fail" : "builtin", - ".file" : "builtin", - ".fill" : "builtin", - ".float" : "builtin", - ".func" : "builtin", - ".global" : "builtin", - ".gnu_attribute" : "builtin", - ".hidden" : "builtin", - ".hword" : "builtin", - ".ident" : "builtin", - ".if" : "builtin", - ".incbin" : "builtin", - ".include" : "builtin", - ".int" : "builtin", - ".internal" : "builtin", - ".irp" : "builtin", - ".irpc" : "builtin", - ".lcomm" : "builtin", - ".lflags" : "builtin", - ".line" : "builtin", - ".linkonce" : "builtin", - ".list" : "builtin", - ".ln" : "builtin", - ".loc" : "builtin", - ".loc_mark_labels" : "builtin", - ".local" : "builtin", - ".long" : "builtin", - ".macro" : "builtin", - ".mri" : "builtin", - ".noaltmacro" : "builtin", - ".nolist" : "builtin", - ".octa" : "builtin", - ".offset" : "builtin", - ".org" : "builtin", - ".p2align" : "builtin", - ".popsection" : "builtin", - ".previous" : "builtin", - ".print" : "builtin", - ".protected" : "builtin", - ".psize" : "builtin", - ".purgem" : "builtin", - ".pushsection" : "builtin", - ".quad" : "builtin", - ".reloc" : "builtin", - ".rept" : "builtin", - ".sbttl" : "builtin", - ".scl" : "builtin", - ".section" : "builtin", - ".set" : "builtin", - ".short" : "builtin", - ".single" : "builtin", - ".size" : "builtin", - ".skip" : "builtin", - ".sleb128" : "builtin", - ".space" : "builtin", - ".stab" : "builtin", - ".string" : "builtin", - ".struct" : "builtin", - ".subsection" : "builtin", - ".symver" : "builtin", - ".tag" : "builtin", - ".text" : "builtin", - ".title" : "builtin", - ".type" : "builtin", - ".uleb128" : "builtin", - ".val" : "builtin", - ".version" : "builtin", - ".vtable_entry" : "builtin", - ".vtable_inherit" : "builtin", - ".warning" : "builtin", - ".weak" : "builtin", - ".weakref" : "builtin", - ".word" : "builtin" - }; - - var registers = {}; - - function x86(_parserConfig) { - lineCommentStartSymbol = "#"; - - registers.ax = "variable"; - registers.eax = "variable-2"; - registers.rax = "variable-3"; - - registers.bx = "variable"; - registers.ebx = "variable-2"; - registers.rbx = "variable-3"; - - registers.cx = "variable"; - registers.ecx = "variable-2"; - registers.rcx = "variable-3"; - - registers.dx = "variable"; - registers.edx = "variable-2"; - registers.rdx = "variable-3"; - - registers.si = "variable"; - registers.esi = "variable-2"; - registers.rsi = "variable-3"; - - registers.di = "variable"; - registers.edi = "variable-2"; - registers.rdi = "variable-3"; - - registers.sp = "variable"; - registers.esp = "variable-2"; - registers.rsp = "variable-3"; - - registers.bp = "variable"; - registers.ebp = "variable-2"; - registers.rbp = "variable-3"; - - registers.ip = "variable"; - registers.eip = "variable-2"; - registers.rip = "variable-3"; - - registers.cs = "keyword"; - registers.ds = "keyword"; - registers.ss = "keyword"; - registers.es = "keyword"; - registers.fs = "keyword"; - registers.gs = "keyword"; - } - - function armv6(_parserConfig) { - // Reference: - // http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf - // http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf - lineCommentStartSymbol = "@"; - directives.syntax = "builtin"; - - registers.r0 = "variable"; - registers.r1 = "variable"; - registers.r2 = "variable"; - registers.r3 = "variable"; - registers.r4 = "variable"; - registers.r5 = "variable"; - registers.r6 = "variable"; - registers.r7 = "variable"; - registers.r8 = "variable"; - registers.r9 = "variable"; - registers.r10 = "variable"; - registers.r11 = "variable"; - registers.r12 = "variable"; - - registers.sp = "variable-2"; - registers.lr = "variable-2"; - registers.pc = "variable-2"; - registers.r13 = registers.sp; - registers.r14 = registers.lr; - registers.r15 = registers.pc; - - custom.push(function(ch, stream) { - if (ch === '#') { - stream.eatWhile(/\w/); - return "number"; - } - }); - } - - var arch = (parserConfig.architecture || "x86").toLowerCase(); - if (arch === "x86") { - x86(parserConfig); - } else if (arch === "arm" || arch === "armv6") { - armv6(parserConfig); - } - - function nextUntilUnescaped(stream, end) { - var escaped = false, next; - while ((next = stream.next()) != null) { - if (next === end && !escaped) { - return false; - } - escaped = !escaped && next === "\\"; - } - return escaped; - } - - function clikeComment(stream, state) { - var maybeEnd = false, ch; - while ((ch = stream.next()) != null) { - if (ch === "/" && maybeEnd) { - state.tokenize = null; - break; - } - maybeEnd = (ch === "*"); - } - return "comment"; - } - - return { - startState: function() { - return { - tokenize: null - }; - }, - - token: function(stream, state) { - if (state.tokenize) { - return state.tokenize(stream, state); - } - - if (stream.eatSpace()) { - return null; - } - - var style, cur, ch = stream.next(); - - if (ch === "/") { - if (stream.eat("*")) { - state.tokenize = clikeComment; - return clikeComment(stream, state); - } - } - - if (ch === lineCommentStartSymbol) { - stream.skipToEnd(); - return "comment"; - } - - if (ch === '"') { - nextUntilUnescaped(stream, '"'); - return "string"; - } - - if (ch === '.') { - stream.eatWhile(/\w/); - cur = stream.current().toLowerCase(); - style = directives[cur]; - return style || null; - } - - if (ch === '=') { - stream.eatWhile(/\w/); - return "tag"; - } - - if (ch === '{') { - return "braket"; - } - - if (ch === '}') { - return "braket"; - } - - if (/\d/.test(ch)) { - if (ch === "0" && stream.eat("x")) { - stream.eatWhile(/[0-9a-fA-F]/); - return "number"; - } - stream.eatWhile(/\d/); - return "number"; - } - - if (/\w/.test(ch)) { - stream.eatWhile(/\w/); - if (stream.eat(":")) { - return 'tag'; - } - cur = stream.current().toLowerCase(); - style = registers[cur]; - return style || null; - } - - for (var i = 0; i < custom.length; i++) { - style = custom[i](ch, stream, state); - if (style) { - return style; - } - } - }, - - lineComment: lineCommentStartSymbol, - blockCommentStart: "/*", - blockCommentEnd: "*/" - }; -}); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/gas/index.html b/public/plugins/codemirror-5.17.0/mode/gas/index.html deleted file mode 100644 index df75ca2..0000000 --- a/public/plugins/codemirror-5.17.0/mode/gas/index.html +++ /dev/null @@ -1,68 +0,0 @@ - - -CodeMirror: Gas mode - - - - - - - - - -
-

Gas mode

-
- - - - - -

Handles AT&T assembler syntax (more specifically this handles - the GNU Assembler (gas) syntax.) - It takes a single optional configuration parameter: - architecture, which can be one of "ARM", - "ARMv6" or "x86". - Including the parameter adds syntax for the registers and special - directives for the supplied architecture. - -

MIME types defined: text/x-gas

-
diff --git a/public/plugins/codemirror-5.17.0/mode/gfm/gfm.js b/public/plugins/codemirror-5.17.0/mode/gfm/gfm.js deleted file mode 100644 index 6e74ad4..0000000 --- a/public/plugins/codemirror-5.17.0/mode/gfm/gfm.js +++ /dev/null @@ -1,130 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../markdown/markdown"), require("../../addon/mode/overlay")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../markdown/markdown", "../../addon/mode/overlay"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -var urlRE = /^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i - -CodeMirror.defineMode("gfm", function(config, modeConfig) { - var codeDepth = 0; - function blankLine(state) { - state.code = false; - return null; - } - var gfmOverlay = { - startState: function() { - return { - code: false, - codeBlock: false, - ateSpace: false - }; - }, - copyState: function(s) { - return { - code: s.code, - codeBlock: s.codeBlock, - ateSpace: s.ateSpace - }; - }, - token: function(stream, state) { - state.combineTokens = null; - - // Hack to prevent formatting override inside code blocks (block and inline) - if (state.codeBlock) { - if (stream.match(/^```+/)) { - state.codeBlock = false; - return null; - } - stream.skipToEnd(); - return null; - } - if (stream.sol()) { - state.code = false; - } - if (stream.sol() && stream.match(/^```+/)) { - stream.skipToEnd(); - state.codeBlock = true; - return null; - } - // If this block is changed, it may need to be updated in Markdown mode - if (stream.peek() === '`') { - stream.next(); - var before = stream.pos; - stream.eatWhile('`'); - var difference = 1 + stream.pos - before; - if (!state.code) { - codeDepth = difference; - state.code = true; - } else { - if (difference === codeDepth) { // Must be exact - state.code = false; - } - } - return null; - } else if (state.code) { - stream.next(); - return null; - } - // Check if space. If so, links can be formatted later on - if (stream.eatSpace()) { - state.ateSpace = true; - return null; - } - if (stream.sol() || state.ateSpace) { - state.ateSpace = false; - if (modeConfig.gitHubSpice !== false) { - if(stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/)) { - // User/Project@SHA - // User@SHA - // SHA - state.combineTokens = true; - return "link"; - } else if (stream.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/)) { - // User/Project#Num - // User#Num - // #Num - state.combineTokens = true; - return "link"; - } - } - } - if (stream.match(urlRE) && - stream.string.slice(stream.start - 2, stream.start) != "](" && - (stream.start == 0 || /\W/.test(stream.string.charAt(stream.start - 1)))) { - // URLs - // Taken from http://daringfireball.net/2010/07/improved_regex_for_matching_urls - // And then (issue #1160) simplified to make it not crash the Chrome Regexp engine - // And then limited url schemes to the CommonMark list, so foo:bar isn't matched as a URL - state.combineTokens = true; - return "link"; - } - stream.next(); - return null; - }, - blankLine: blankLine - }; - - var markdownConfig = { - underscoresBreakWords: false, - taskLists: true, - fencedCodeBlocks: '```', - strikethrough: true - }; - for (var attr in modeConfig) { - markdownConfig[attr] = modeConfig[attr]; - } - markdownConfig.name = "markdown"; - return CodeMirror.overlayMode(CodeMirror.getMode(config, markdownConfig), gfmOverlay); - -}, "markdown"); - - CodeMirror.defineMIME("text/x-gfm", "gfm"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/gfm/index.html b/public/plugins/codemirror-5.17.0/mode/gfm/index.html deleted file mode 100644 index 24c90c0..0000000 --- a/public/plugins/codemirror-5.17.0/mode/gfm/index.html +++ /dev/null @@ -1,93 +0,0 @@ - - -CodeMirror: GFM mode - - - - - - - - - - - - - - - - - -
-

GFM mode

-
- - - -

Optionally depends on other modes for properly highlighted code blocks.

- -

Parsing/Highlighting Tests: normal, verbose.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/gfm/test.js b/public/plugins/codemirror-5.17.0/mode/gfm/test.js deleted file mode 100644 index 7a1a4cc..0000000 --- a/public/plugins/codemirror-5.17.0/mode/gfm/test.js +++ /dev/null @@ -1,236 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({tabSize: 4}, "gfm"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - var modeHighlightFormatting = CodeMirror.getMode({tabSize: 4}, {name: "gfm", highlightFormatting: true}); - function FT(name) { test.mode(name, modeHighlightFormatting, Array.prototype.slice.call(arguments, 1)); } - - FT("codeBackticks", - "[comment&formatting&formatting-code `][comment foo][comment&formatting&formatting-code `]"); - - FT("doubleBackticks", - "[comment&formatting&formatting-code ``][comment foo ` bar][comment&formatting&formatting-code ``]"); - - FT("codeBlock", - "[comment&formatting&formatting-code-block ```css]", - "[tag foo]", - "[comment&formatting&formatting-code-block ```]"); - - FT("taskList", - "[variable-2&formatting&formatting-list&formatting-list-ul - ][meta&formatting&formatting-task [ ]]][variable-2 foo]", - "[variable-2&formatting&formatting-list&formatting-list-ul - ][property&formatting&formatting-task [x]]][variable-2 foo]"); - - FT("formatting_strikethrough", - "[strikethrough&formatting&formatting-strikethrough ~~][strikethrough foo][strikethrough&formatting&formatting-strikethrough ~~]"); - - FT("formatting_strikethrough", - "foo [strikethrough&formatting&formatting-strikethrough ~~][strikethrough bar][strikethrough&formatting&formatting-strikethrough ~~]"); - - MT("emInWordAsterisk", - "foo[em *bar*]hello"); - - MT("emInWordUnderscore", - "foo_bar_hello"); - - MT("emStrongUnderscore", - "[strong __][em&strong _foo__][em _] bar"); - - MT("fencedCodeBlocks", - "[comment ```]", - "[comment foo]", - "", - "[comment ```]", - "bar"); - - MT("fencedCodeBlockModeSwitching", - "[comment ```javascript]", - "[variable foo]", - "", - "[comment ```]", - "bar"); - - MT("fencedCodeBlockModeSwitchingObjc", - "[comment ```objective-c]", - "[keyword @property] [variable NSString] [operator *] [variable foo];", - "[comment ```]", - "bar"); - - MT("fencedCodeBlocksNoTildes", - "~~~", - "foo", - "~~~"); - - MT("taskListAsterisk", - "[variable-2 * []] foo]", // Invalid; must have space or x between [] - "[variable-2 * [ ]]bar]", // Invalid; must have space after ] - "[variable-2 * [x]]hello]", // Invalid; must have space after ] - "[variable-2 * ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links - " [variable-3 * ][property [x]]][variable-3 foo]"); // Valid; can be nested - - MT("taskListPlus", - "[variable-2 + []] foo]", // Invalid; must have space or x between [] - "[variable-2 + [ ]]bar]", // Invalid; must have space after ] - "[variable-2 + [x]]hello]", // Invalid; must have space after ] - "[variable-2 + ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links - " [variable-3 + ][property [x]]][variable-3 foo]"); // Valid; can be nested - - MT("taskListDash", - "[variable-2 - []] foo]", // Invalid; must have space or x between [] - "[variable-2 - [ ]]bar]", // Invalid; must have space after ] - "[variable-2 - [x]]hello]", // Invalid; must have space after ] - "[variable-2 - ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links - " [variable-3 - ][property [x]]][variable-3 foo]"); // Valid; can be nested - - MT("taskListNumber", - "[variable-2 1. []] foo]", // Invalid; must have space or x between [] - "[variable-2 2. [ ]]bar]", // Invalid; must have space after ] - "[variable-2 3. [x]]hello]", // Invalid; must have space after ] - "[variable-2 4. ][meta [ ]]][variable-2 [world]]]", // Valid; tests reference style links - " [variable-3 1. ][property [x]]][variable-3 foo]"); // Valid; can be nested - - MT("SHA", - "foo [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] bar"); - - MT("SHAEmphasis", - "[em *foo ][em&link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]"); - - MT("shortSHA", - "foo [link be6a8cc] bar"); - - MT("tooShortSHA", - "foo be6a8c bar"); - - MT("longSHA", - "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd22 bar"); - - MT("badSHA", - "foo be6a8cc1c1ecfe9489fb51e4869af15a13fc2cg2 bar"); - - MT("userSHA", - "foo [link bar@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] hello"); - - MT("userSHAEmphasis", - "[em *foo ][em&link bar@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]"); - - MT("userProjectSHA", - "foo [link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2] world"); - - MT("userProjectSHAEmphasis", - "[em *foo ][em&link bar/hello@be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2][em *]"); - - MT("num", - "foo [link #1] bar"); - - MT("numEmphasis", - "[em *foo ][em&link #1][em *]"); - - MT("badNum", - "foo #1bar hello"); - - MT("userNum", - "foo [link bar#1] hello"); - - MT("userNumEmphasis", - "[em *foo ][em&link bar#1][em *]"); - - MT("userProjectNum", - "foo [link bar/hello#1] world"); - - MT("userProjectNumEmphasis", - "[em *foo ][em&link bar/hello#1][em *]"); - - MT("vanillaLink", - "foo [link http://www.example.com/] bar"); - - MT("vanillaLinkNoScheme", - "foo [link www.example.com] bar"); - - MT("vanillaLinkHttps", - "foo [link https://www.example.com/] bar"); - - MT("vanillaLinkDataSchema", - "foo [link data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==] bar"); - - MT("vanillaLinkPunctuation", - "foo [link http://www.example.com/]. bar"); - - MT("vanillaLinkExtension", - "foo [link http://www.example.com/index.html] bar"); - - MT("vanillaLinkEmphasis", - "foo [em *][em&link http://www.example.com/index.html][em *] bar"); - - MT("notALink", - "foo asfd:asdf bar"); - - MT("notALink", - "[comment ```css]", - "[tag foo] {[property color]:[keyword black];}", - "[comment ```][link http://www.example.com/]"); - - MT("notALink", - "[comment ``foo `bar` http://www.example.com/``] hello"); - - MT("notALink", - "[comment `foo]", - "[comment&link http://www.example.com/]", - "[comment `] foo", - "", - "[link http://www.example.com/]"); - - MT("headerCodeBlockGithub", - "[header&header-1 # heading]", - "", - "[comment ```]", - "[comment code]", - "[comment ```]", - "", - "Commit: [link be6a8cc1c1ecfe9489fb51e4869af15a13fc2cd2]", - "Issue: [link #1]", - "Link: [link http://www.example.com/]"); - - MT("strikethrough", - "[strikethrough ~~foo~~]"); - - MT("strikethroughWithStartingSpace", - "~~ foo~~"); - - MT("strikethroughUnclosedStrayTildes", - "[strikethrough ~~foo~~~]"); - - MT("strikethroughUnclosedStrayTildes", - "[strikethrough ~~foo ~~]"); - - MT("strikethroughUnclosedStrayTildes", - "[strikethrough ~~foo ~~ bar]"); - - MT("strikethroughUnclosedStrayTildes", - "[strikethrough ~~foo ~~ bar~~]hello"); - - MT("strikethroughOneLetter", - "[strikethrough ~~a~~]"); - - MT("strikethroughWrapped", - "[strikethrough ~~foo]", - "[strikethrough foo~~]"); - - MT("strikethroughParagraph", - "[strikethrough ~~foo]", - "", - "foo[strikethrough ~~bar]"); - - MT("strikethroughEm", - "[strikethrough ~~foo][em&strikethrough *bar*][strikethrough ~~]"); - - MT("strikethroughEm", - "[em *][em&strikethrough ~~foo~~][em *]"); - - MT("strikethroughStrong", - "[strikethrough ~~][strong&strikethrough **foo**][strikethrough ~~]"); - - MT("strikethroughStrong", - "[strong **][strong&strikethrough ~~foo~~][strong **]"); - -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/gherkin/gherkin.js b/public/plugins/codemirror-5.17.0/mode/gherkin/gherkin.js deleted file mode 100644 index fc2ebee..0000000 --- a/public/plugins/codemirror-5.17.0/mode/gherkin/gherkin.js +++ /dev/null @@ -1,178 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/* -Gherkin mode - http://www.cukes.info/ -Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues -*/ - -// Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js -//var Quotes = { -// SINGLE: 1, -// DOUBLE: 2 -//}; - -//var regex = { -// keywords: /(Feature| {2}(Scenario|In order to|As|I)| {4}(Given|When|Then|And))/ -//}; - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("gherkin", function () { - return { - startState: function () { - return { - lineNumber: 0, - tableHeaderLine: false, - allowFeature: true, - allowBackground: false, - allowScenario: false, - allowSteps: false, - allowPlaceholders: false, - allowMultilineArgument: false, - inMultilineString: false, - inMultilineTable: false, - inKeywordLine: false - }; - }, - token: function (stream, state) { - if (stream.sol()) { - state.lineNumber++; - state.inKeywordLine = false; - if (state.inMultilineTable) { - state.tableHeaderLine = false; - if (!stream.match(/\s*\|/, false)) { - state.allowMultilineArgument = false; - state.inMultilineTable = false; - } - } - } - - stream.eatSpace(); - - if (state.allowMultilineArgument) { - - // STRING - if (state.inMultilineString) { - if (stream.match('"""')) { - state.inMultilineString = false; - state.allowMultilineArgument = false; - } else { - stream.match(/.*/); - } - return "string"; - } - - // TABLE - if (state.inMultilineTable) { - if (stream.match(/\|\s*/)) { - return "bracket"; - } else { - stream.match(/[^\|]*/); - return state.tableHeaderLine ? "header" : "string"; - } - } - - // DETECT START - if (stream.match('"""')) { - // String - state.inMultilineString = true; - return "string"; - } else if (stream.match("|")) { - // Table - state.inMultilineTable = true; - state.tableHeaderLine = true; - return "bracket"; - } - - } - - // LINE COMMENT - if (stream.match(/#.*/)) { - return "comment"; - - // TAG - } else if (!state.inKeywordLine && stream.match(/@\S+/)) { - return "tag"; - - // FEATURE - } else if (!state.inKeywordLine && state.allowFeature && stream.match(/(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/)) { - state.allowScenario = true; - state.allowBackground = true; - state.allowPlaceholders = false; - state.allowSteps = false; - state.allowMultilineArgument = false; - state.inKeywordLine = true; - return "keyword"; - - // BACKGROUND - } else if (!state.inKeywordLine && state.allowBackground && stream.match(/(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\-ho\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/)) { - state.allowPlaceholders = false; - state.allowSteps = true; - state.allowBackground = false; - state.allowMultilineArgument = false; - state.inKeywordLine = true; - return "keyword"; - - // SCENARIO OUTLINE - } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/)) { - state.allowPlaceholders = true; - state.allowSteps = true; - state.allowMultilineArgument = false; - state.inKeywordLine = true; - return "keyword"; - - // EXAMPLES - } else if (state.allowScenario && stream.match(/(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/)) { - state.allowPlaceholders = false; - state.allowSteps = true; - state.allowBackground = false; - state.allowMultilineArgument = true; - return "keyword"; - - // SCENARIO - } else if (!state.inKeywordLine && state.allowScenario && stream.match(/(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/)) { - state.allowPlaceholders = false; - state.allowSteps = true; - state.allowBackground = false; - state.allowMultilineArgument = false; - state.inKeywordLine = true; - return "keyword"; - - // STEPS - } else if (!state.inKeywordLine && state.allowSteps && stream.match(/(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\* )/)) { - state.inStep = true; - state.allowPlaceholders = true; - state.allowMultilineArgument = true; - state.inKeywordLine = true; - return "keyword"; - - // INLINE STRING - } else if (stream.match(/"[^"]*"?/)) { - return "string"; - - // PLACEHOLDER - } else if (state.allowPlaceholders && stream.match(/<[^>]*>?/)) { - return "variable"; - - // Fall through - } else { - stream.next(); - stream.eatWhile(/[^@"<#]/); - return null; - } - } - }; -}); - -CodeMirror.defineMIME("text/x-feature", "gherkin"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/gherkin/index.html b/public/plugins/codemirror-5.17.0/mode/gherkin/index.html deleted file mode 100644 index af8184c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/gherkin/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - -CodeMirror: Gherkin mode - - - - - - - - - -
-

Gherkin mode

-
- - -

MIME types defined: text/x-feature.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/go/go.js b/public/plugins/codemirror-5.17.0/mode/go/go.js deleted file mode 100644 index 3c9ef6b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/go/go.js +++ /dev/null @@ -1,185 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("go", function(config) { - var indentUnit = config.indentUnit; - - var keywords = { - "break":true, "case":true, "chan":true, "const":true, "continue":true, - "default":true, "defer":true, "else":true, "fallthrough":true, "for":true, - "func":true, "go":true, "goto":true, "if":true, "import":true, - "interface":true, "map":true, "package":true, "range":true, "return":true, - "select":true, "struct":true, "switch":true, "type":true, "var":true, - "bool":true, "byte":true, "complex64":true, "complex128":true, - "float32":true, "float64":true, "int8":true, "int16":true, "int32":true, - "int64":true, "string":true, "uint8":true, "uint16":true, "uint32":true, - "uint64":true, "int":true, "uint":true, "uintptr":true, "error": true - }; - - var atoms = { - "true":true, "false":true, "iota":true, "nil":true, "append":true, - "cap":true, "close":true, "complex":true, "copy":true, "imag":true, - "len":true, "make":true, "new":true, "panic":true, "print":true, - "println":true, "real":true, "recover":true - }; - - var isOperatorChar = /[+\-*&^%:=<>!|\/]/; - - var curPunc; - - function tokenBase(stream, state) { - var ch = stream.next(); - if (ch == '"' || ch == "'" || ch == "`") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - if (/[\d\.]/.test(ch)) { - if (ch == ".") { - stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); - } else if (ch == "0") { - stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); - } else { - stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); - } - return "number"; - } - if (/[\[\]{}\(\),;\:\.]/.test(ch)) { - curPunc = ch; - return null; - } - if (ch == "/") { - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - } - if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - stream.eatWhile(/[\w\$_\xa1-\uffff]/); - var cur = stream.current(); - if (keywords.propertyIsEnumerable(cur)) { - if (cur == "case" || cur == "default") curPunc = "case"; - return "keyword"; - } - if (atoms.propertyIsEnumerable(cur)) return "atom"; - return "variable"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) {end = true; break;} - escaped = !escaped && quote != "`" && next == "\\"; - } - if (end || !(escaped || quote == "`")) - state.tokenize = tokenBase; - return "string"; - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function Context(indented, column, type, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.align = align; - this.prev = prev; - } - function pushContext(state, col, type) { - return state.context = new Context(state.indented, col, type, null, state.context); - } - function popContext(state) { - if (!state.context.prev) return; - var t = state.context.type; - if (t == ")" || t == "]" || t == "}") - state.indented = state.context.indented; - return state.context = state.context.prev; - } - - // Interface - - return { - startState: function(basecolumn) { - return { - tokenize: null, - context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), - indented: 0, - startOfLine: true - }; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - if (ctx.type == "case") ctx.type = "}"; - } - if (stream.eatSpace()) return null; - curPunc = null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment") return style; - if (ctx.align == null) ctx.align = true; - - if (curPunc == "{") pushContext(state, stream.column(), "}"); - else if (curPunc == "[") pushContext(state, stream.column(), "]"); - else if (curPunc == "(") pushContext(state, stream.column(), ")"); - else if (curPunc == "case") ctx.type = "case"; - else if (curPunc == "}" && ctx.type == "}") ctx = popContext(state); - else if (curPunc == ctx.type) popContext(state); - state.startOfLine = false; - return style; - }, - - indent: function(state, textAfter) { - if (state.tokenize != tokenBase && state.tokenize != null) return 0; - var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); - if (ctx.type == "case" && /^(?:case|default)\b/.test(textAfter)) { - state.context.type = "}"; - return ctx.indented; - } - var closing = firstChar == ctx.type; - if (ctx.align) return ctx.column + (closing ? 0 : 1); - else return ctx.indented + (closing ? 0 : indentUnit); - }, - - electricChars: "{}):", - fold: "brace", - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: "//" - }; -}); - -CodeMirror.defineMIME("text/x-go", "go"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/go/index.html b/public/plugins/codemirror-5.17.0/mode/go/index.html deleted file mode 100644 index 72e3b36..0000000 --- a/public/plugins/codemirror-5.17.0/mode/go/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - -CodeMirror: Go mode - - - - - - - - - - - -
-

Go mode

-
- - - -

MIME type: text/x-go

-
diff --git a/public/plugins/codemirror-5.17.0/mode/groovy/groovy.js b/public/plugins/codemirror-5.17.0/mode/groovy/groovy.js deleted file mode 100644 index 721933b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/groovy/groovy.js +++ /dev/null @@ -1,230 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("groovy", function(config) { - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - var keywords = words( - "abstract as assert boolean break byte case catch char class const continue def default " + - "do double else enum extends final finally float for goto if implements import in " + - "instanceof int interface long native new package private protected public return " + - "short static strictfp super switch synchronized threadsafe throw throws transient " + - "try void volatile while"); - var blockKeywords = words("catch class do else finally for if switch try while enum interface def"); - var standaloneKeywords = words("return break continue"); - var atoms = words("null true false this"); - - var curPunc; - function tokenBase(stream, state) { - var ch = stream.next(); - if (ch == '"' || ch == "'") { - return startString(ch, stream, state); - } - if (/[\[\]{}\(\),;\:\.]/.test(ch)) { - curPunc = ch; - return null; - } - if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - if (stream.eat(/eE/)) { stream.eat(/\+\-/); stream.eatWhile(/\d/); } - return "number"; - } - if (ch == "/") { - if (stream.eat("*")) { - state.tokenize.push(tokenComment); - return tokenComment(stream, state); - } - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - if (expectExpression(state.lastToken, false)) { - return startString(ch, stream, state); - } - } - if (ch == "-" && stream.eat(">")) { - curPunc = "->"; - return null; - } - if (/[+\-*&%=<>!?|\/~]/.test(ch)) { - stream.eatWhile(/[+\-*&%=<>|~]/); - return "operator"; - } - stream.eatWhile(/[\w\$_]/); - if (ch == "@") { stream.eatWhile(/[\w\$_\.]/); return "meta"; } - if (state.lastToken == ".") return "property"; - if (stream.eat(":")) { curPunc = "proplabel"; return "property"; } - var cur = stream.current(); - if (atoms.propertyIsEnumerable(cur)) { return "atom"; } - if (keywords.propertyIsEnumerable(cur)) { - if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; - else if (standaloneKeywords.propertyIsEnumerable(cur)) curPunc = "standalone"; - return "keyword"; - } - return "variable"; - } - tokenBase.isBase = true; - - function startString(quote, stream, state) { - var tripleQuoted = false; - if (quote != "/" && stream.eat(quote)) { - if (stream.eat(quote)) tripleQuoted = true; - else return "string"; - } - function t(stream, state) { - var escaped = false, next, end = !tripleQuoted; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) { - if (!tripleQuoted) { break; } - if (stream.match(quote + quote)) { end = true; break; } - } - if (quote == '"' && next == "$" && !escaped && stream.eat("{")) { - state.tokenize.push(tokenBaseUntilBrace()); - return "string"; - } - escaped = !escaped && next == "\\"; - } - if (end) state.tokenize.pop(); - return "string"; - } - state.tokenize.push(t); - return t(stream, state); - } - - function tokenBaseUntilBrace() { - var depth = 1; - function t(stream, state) { - if (stream.peek() == "}") { - depth--; - if (depth == 0) { - state.tokenize.pop(); - return state.tokenize[state.tokenize.length-1](stream, state); - } - } else if (stream.peek() == "{") { - depth++; - } - return tokenBase(stream, state); - } - t.isBase = true; - return t; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize.pop(); - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function expectExpression(last, newline) { - return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) || - last == "newstatement" || last == "keyword" || last == "proplabel" || - (last == "standalone" && !newline); - } - - function Context(indented, column, type, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.align = align; - this.prev = prev; - } - function pushContext(state, col, type) { - return state.context = new Context(state.indented, col, type, null, state.context); - } - function popContext(state) { - var t = state.context.type; - if (t == ")" || t == "]" || t == "}") - state.indented = state.context.indented; - return state.context = state.context.prev; - } - - // Interface - - return { - startState: function(basecolumn) { - return { - tokenize: [tokenBase], - context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false), - indented: 0, - startOfLine: true, - lastToken: null - }; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - // Automatic semicolon insertion - if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) { - popContext(state); ctx = state.context; - } - } - if (stream.eatSpace()) return null; - curPunc = null; - var style = state.tokenize[state.tokenize.length-1](stream, state); - if (style == "comment") return style; - if (ctx.align == null) ctx.align = true; - - if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); - // Handle indentation for {x -> \n ... } - else if (curPunc == "->" && ctx.type == "statement" && ctx.prev.type == "}") { - popContext(state); - state.context.align = false; - } - else if (curPunc == "{") pushContext(state, stream.column(), "}"); - else if (curPunc == "[") pushContext(state, stream.column(), "]"); - else if (curPunc == "(") pushContext(state, stream.column(), ")"); - else if (curPunc == "}") { - while (ctx.type == "statement") ctx = popContext(state); - if (ctx.type == "}") ctx = popContext(state); - while (ctx.type == "statement") ctx = popContext(state); - } - else if (curPunc == ctx.type) popContext(state); - else if (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) - pushContext(state, stream.column(), "statement"); - state.startOfLine = false; - state.lastToken = curPunc || style; - return style; - }, - - indent: function(state, textAfter) { - if (!state.tokenize[state.tokenize.length-1].isBase) return 0; - var firstChar = textAfter && textAfter.charAt(0), ctx = state.context; - if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) ctx = ctx.prev; - var closing = firstChar == ctx.type; - if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit); - else if (ctx.align) return ctx.column + (closing ? 0 : 1); - else return ctx.indented + (closing ? 0 : config.indentUnit); - }, - - electricChars: "{}", - closeBrackets: {triples: "'\""}, - fold: "brace" - }; -}); - -CodeMirror.defineMIME("text/x-groovy", "groovy"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/groovy/index.html b/public/plugins/codemirror-5.17.0/mode/groovy/index.html deleted file mode 100644 index bb0df07..0000000 --- a/public/plugins/codemirror-5.17.0/mode/groovy/index.html +++ /dev/null @@ -1,84 +0,0 @@ - - -CodeMirror: Groovy mode - - - - - - - - - - -
-

Groovy mode

-
- - - -

MIME types defined: text/x-groovy

-
diff --git a/public/plugins/codemirror-5.17.0/mode/haml/haml.js b/public/plugins/codemirror-5.17.0/mode/haml/haml.js deleted file mode 100644 index 20ae1e1..0000000 --- a/public/plugins/codemirror-5.17.0/mode/haml/haml.js +++ /dev/null @@ -1,161 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - - // full haml mode. This handled embedded ruby and html fragments too - CodeMirror.defineMode("haml", function(config) { - var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); - var rubyMode = CodeMirror.getMode(config, "ruby"); - - function rubyInQuote(endQuote) { - return function(stream, state) { - var ch = stream.peek(); - if (ch == endQuote && state.rubyState.tokenize.length == 1) { - // step out of ruby context as it seems to complete processing all the braces - stream.next(); - state.tokenize = html; - return "closeAttributeTag"; - } else { - return ruby(stream, state); - } - }; - } - - function ruby(stream, state) { - if (stream.match("-#")) { - stream.skipToEnd(); - return "comment"; - } - return rubyMode.token(stream, state.rubyState); - } - - function html(stream, state) { - var ch = stream.peek(); - - // handle haml declarations. All declarations that cant be handled here - // will be passed to html mode - if (state.previousToken.style == "comment" ) { - if (state.indented > state.previousToken.indented) { - stream.skipToEnd(); - return "commentLine"; - } - } - - if (state.startOfLine) { - if (ch == "!" && stream.match("!!")) { - stream.skipToEnd(); - return "tag"; - } else if (stream.match(/^%[\w:#\.]+=/)) { - state.tokenize = ruby; - return "hamlTag"; - } else if (stream.match(/^%[\w:]+/)) { - return "hamlTag"; - } else if (ch == "/" ) { - stream.skipToEnd(); - return "comment"; - } - } - - if (state.startOfLine || state.previousToken.style == "hamlTag") { - if ( ch == "#" || ch == ".") { - stream.match(/[\w-#\.]*/); - return "hamlAttribute"; - } - } - - // donot handle --> as valid ruby, make it HTML close comment instead - if (state.startOfLine && !stream.match("-->", false) && (ch == "=" || ch == "-" )) { - state.tokenize = ruby; - return state.tokenize(stream, state); - } - - if (state.previousToken.style == "hamlTag" || - state.previousToken.style == "closeAttributeTag" || - state.previousToken.style == "hamlAttribute") { - if (ch == "(") { - state.tokenize = rubyInQuote(")"); - return state.tokenize(stream, state); - } else if (ch == "{") { - if (!stream.match(/^\{%.*/)) { - state.tokenize = rubyInQuote("}"); - return state.tokenize(stream, state); - } - } - } - - return htmlMode.token(stream, state.htmlState); - } - - return { - // default to html mode - startState: function() { - var htmlState = CodeMirror.startState(htmlMode); - var rubyState = CodeMirror.startState(rubyMode); - return { - htmlState: htmlState, - rubyState: rubyState, - indented: 0, - previousToken: { style: null, indented: 0}, - tokenize: html - }; - }, - - copyState: function(state) { - return { - htmlState : CodeMirror.copyState(htmlMode, state.htmlState), - rubyState: CodeMirror.copyState(rubyMode, state.rubyState), - indented: state.indented, - previousToken: state.previousToken, - tokenize: state.tokenize - }; - }, - - token: function(stream, state) { - if (stream.sol()) { - state.indented = stream.indentation(); - state.startOfLine = true; - } - if (stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - state.startOfLine = false; - // dont record comment line as we only want to measure comment line with - // the opening comment block - if (style && style != "commentLine") { - state.previousToken = { style: style, indented: state.indented }; - } - // if current state is ruby and the previous token is not `,` reset the - // tokenize to html - if (stream.eol() && state.tokenize == ruby) { - stream.backUp(1); - var ch = stream.peek(); - stream.next(); - if (ch && ch != ",") { - state.tokenize = html; - } - } - // reprocess some of the specific style tag when finish setting previousToken - if (style == "hamlTag") { - style = "tag"; - } else if (style == "commentLine") { - style = "comment"; - } else if (style == "hamlAttribute") { - style = "attribute"; - } else if (style == "closeAttributeTag") { - style = null; - } - return style; - } - }; - }, "htmlmixed", "ruby"); - - CodeMirror.defineMIME("text/x-haml", "haml"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/haml/index.html b/public/plugins/codemirror-5.17.0/mode/haml/index.html deleted file mode 100644 index 2894a93..0000000 --- a/public/plugins/codemirror-5.17.0/mode/haml/index.html +++ /dev/null @@ -1,79 +0,0 @@ - - -CodeMirror: HAML mode - - - - - - - - - - - - - -
-

HAML mode

-
- - -

MIME types defined: text/x-haml.

- -

Parsing/Highlighting Tests: normal, verbose.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/haml/test.js b/public/plugins/codemirror-5.17.0/mode/haml/test.js deleted file mode 100644 index 508458a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/haml/test.js +++ /dev/null @@ -1,97 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "haml"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - // Requires at least one media query - MT("elementName", - "[tag %h1] Hey There"); - - MT("oneElementPerLine", - "[tag %h1] Hey There %h2"); - - MT("idSelector", - "[tag %h1][attribute #test] Hey There"); - - MT("classSelector", - "[tag %h1][attribute .hello] Hey There"); - - MT("docType", - "[tag !!! XML]"); - - MT("comment", - "[comment / Hello WORLD]"); - - MT("notComment", - "[tag %h1] This is not a / comment "); - - MT("attributes", - "[tag %a]([variable title][operator =][string \"test\"]){[atom :title] [operator =>] [string \"test\"]}"); - - MT("htmlCode", - "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket ]"); - - MT("rubyBlock", - "[operator =][variable-2 @item]"); - - MT("selectorRubyBlock", - "[tag %a.selector=] [variable-2 @item]"); - - MT("nestedRubyBlock", - "[tag %a]", - " [operator =][variable puts] [string \"test\"]"); - - MT("multilinePlaintext", - "[tag %p]", - " Hello,", - " World"); - - MT("multilineRuby", - "[tag %p]", - " [comment -# this is a comment]", - " [comment and this is a comment too]", - " Date/Time", - " [operator -] [variable now] [operator =] [tag DateTime][operator .][property now]", - " [tag %strong=] [variable now]", - " [operator -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])", - " [operator =][string \"Happy\"]", - " [operator =][string \"Belated\"]", - " [operator =][string \"Birthday\"]"); - - MT("multilineComment", - "[comment /]", - " [comment Multiline]", - " [comment Comment]"); - - MT("hamlComment", - "[comment -# this is a comment]"); - - MT("multilineHamlComment", - "[comment -# this is a comment]", - " [comment and this is a comment too]"); - - MT("multilineHTMLComment", - "[comment ]"); - - MT("hamlAfterRubyTag", - "[attribute .block]", - " [tag %strong=] [variable now]", - " [attribute .test]", - " [operator =][variable now]", - " [attribute .right]"); - - MT("stretchedRuby", - "[operator =] [variable puts] [string \"Hello\"],", - " [string \"World\"]"); - - MT("interpolationInHashAttribute", - //"[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test"); - "[tag %div]{[atom :id] [operator =>] [string \"#{][variable test][string }_#{][variable ting][string }\"]} test"); - - MT("interpolationInHTMLAttribute", - "[tag %div]([variable title][operator =][string \"#{][variable test][string }_#{][variable ting]()[string }\"]) Test"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/handlebars/handlebars.js b/public/plugins/codemirror-5.17.0/mode/handlebars/handlebars.js deleted file mode 100644 index 2174e53..0000000 --- a/public/plugins/codemirror-5.17.0/mode/handlebars/handlebars.js +++ /dev/null @@ -1,62 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../../addon/mode/simple"), require("../../addon/mode/multiplex")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../../addon/mode/simple", "../../addon/mode/multiplex"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineSimpleMode("handlebars-tags", { - start: [ - { regex: /\{\{!--/, push: "dash_comment", token: "comment" }, - { regex: /\{\{!/, push: "comment", token: "comment" }, - { regex: /\{\{/, push: "handlebars", token: "tag" } - ], - handlebars: [ - { regex: /\}\}/, pop: true, token: "tag" }, - - // Double and single quotes - { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" }, - { regex: /'(?:[^\\']|\\.)*'?/, token: "string" }, - - // Handlebars keywords - { regex: />|[#\/]([A-Za-z_]\w*)/, token: "keyword" }, - { regex: /(?:else|this)\b/, token: "keyword" }, - - // Numeral - { regex: /\d+/i, token: "number" }, - - // Atoms like = and . - { regex: /=|~|@|true|false/, token: "atom" }, - - // Paths - { regex: /(?:\.\.\/)*(?:[A-Za-z_][\w\.]*)+/, token: "variable-2" } - ], - dash_comment: [ - { regex: /--\}\}/, pop: true, token: "comment" }, - - // Commented code - { regex: /./, token: "comment"} - ], - comment: [ - { regex: /\}\}/, pop: true, token: "comment" }, - { regex: /./, token: "comment" } - ] - }); - - CodeMirror.defineMode("handlebars", function(config, parserConfig) { - var handlebars = CodeMirror.getMode(config, "handlebars-tags"); - if (!parserConfig || !parserConfig.base) return handlebars; - return CodeMirror.multiplexingMode( - CodeMirror.getMode(config, parserConfig.base), - {open: "{{", close: "}}", mode: handlebars, parseDelimiters: true} - ); - }); - - CodeMirror.defineMIME("text/x-handlebars-template", "handlebars"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/handlebars/index.html b/public/plugins/codemirror-5.17.0/mode/handlebars/index.html deleted file mode 100644 index b1bfad1..0000000 --- a/public/plugins/codemirror-5.17.0/mode/handlebars/index.html +++ /dev/null @@ -1,79 +0,0 @@ - - -CodeMirror: Handlebars mode - - - - - - - - - - - - -
-

Handlebars

-
- - -

Handlebars syntax highlighting for CodeMirror.

- -

MIME types defined: text/x-handlebars-template

- -

Supported options: base to set the mode to - wrap. For example, use

-
mode: {name: "handlebars", base: "text/html"}
-

to highlight an HTML template.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/haskell-literate/haskell-literate.js b/public/plugins/codemirror-5.17.0/mode/haskell-literate/haskell-literate.js deleted file mode 100644 index 906415b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/haskell-literate/haskell-literate.js +++ /dev/null @@ -1,43 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function (mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../haskell/haskell")) - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../haskell/haskell"], mod) - else // Plain browser env - mod(CodeMirror) -})(function (CodeMirror) { - "use strict" - - CodeMirror.defineMode("haskell-literate", function (config, parserConfig) { - var baseMode = CodeMirror.getMode(config, (parserConfig && parserConfig.base) || "haskell") - - return { - startState: function () { - return { - inCode: false, - baseState: CodeMirror.startState(baseMode) - } - }, - token: function (stream, state) { - if (stream.sol()) { - if (state.inCode = stream.eat(">")) - return "meta" - } - if (state.inCode) { - return baseMode.token(stream, state.baseState) - } else { - stream.skipToEnd() - return "comment" - } - }, - innerMode: function (state) { - return state.inCode ? {state: state.baseState, mode: baseMode} : null - } - } - }, "haskell") - - CodeMirror.defineMIME("text/x-literate-haskell", "haskell-literate") -}); diff --git a/public/plugins/codemirror-5.17.0/mode/haskell-literate/index.html b/public/plugins/codemirror-5.17.0/mode/haskell-literate/index.html deleted file mode 100644 index 8c9bc60..0000000 --- a/public/plugins/codemirror-5.17.0/mode/haskell-literate/index.html +++ /dev/null @@ -1,282 +0,0 @@ - - -CodeMirror: Haskell-literate mode - - - - - - - - - - -
-

Haskell literate mode

-
- - - -

MIME types - defined: text/x-literate-haskell.

- -

Parser configuration parameters recognized: base to - set the base mode (defaults to "haskell").

- - - -
diff --git a/public/plugins/codemirror-5.17.0/mode/haskell/haskell.js b/public/plugins/codemirror-5.17.0/mode/haskell/haskell.js deleted file mode 100644 index fe0bab6..0000000 --- a/public/plugins/codemirror-5.17.0/mode/haskell/haskell.js +++ /dev/null @@ -1,267 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("haskell", function(_config, modeConfig) { - - function switchState(source, setState, f) { - setState(f); - return f(source, setState); - } - - // These should all be Unicode extended, as per the Haskell 2010 report - var smallRE = /[a-z_]/; - var largeRE = /[A-Z]/; - var digitRE = /\d/; - var hexitRE = /[0-9A-Fa-f]/; - var octitRE = /[0-7]/; - var idRE = /[a-z_A-Z0-9'\xa1-\uffff]/; - var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/; - var specialRE = /[(),;[\]`{}]/; - var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer - - function normal(source, setState) { - if (source.eatWhile(whiteCharRE)) { - return null; - } - - var ch = source.next(); - if (specialRE.test(ch)) { - if (ch == '{' && source.eat('-')) { - var t = "comment"; - if (source.eat('#')) { - t = "meta"; - } - return switchState(source, setState, ncomment(t, 1)); - } - return null; - } - - if (ch == '\'') { - if (source.eat('\\')) { - source.next(); // should handle other escapes here - } - else { - source.next(); - } - if (source.eat('\'')) { - return "string"; - } - return "error"; - } - - if (ch == '"') { - return switchState(source, setState, stringLiteral); - } - - if (largeRE.test(ch)) { - source.eatWhile(idRE); - if (source.eat('.')) { - return "qualifier"; - } - return "variable-2"; - } - - if (smallRE.test(ch)) { - source.eatWhile(idRE); - return "variable"; - } - - if (digitRE.test(ch)) { - if (ch == '0') { - if (source.eat(/[xX]/)) { - source.eatWhile(hexitRE); // should require at least 1 - return "integer"; - } - if (source.eat(/[oO]/)) { - source.eatWhile(octitRE); // should require at least 1 - return "number"; - } - } - source.eatWhile(digitRE); - var t = "number"; - if (source.match(/^\.\d+/)) { - t = "number"; - } - if (source.eat(/[eE]/)) { - t = "number"; - source.eat(/[-+]/); - source.eatWhile(digitRE); // should require at least 1 - } - return t; - } - - if (ch == "." && source.eat(".")) - return "keyword"; - - if (symbolRE.test(ch)) { - if (ch == '-' && source.eat(/-/)) { - source.eatWhile(/-/); - if (!source.eat(symbolRE)) { - source.skipToEnd(); - return "comment"; - } - } - var t = "variable"; - if (ch == ':') { - t = "variable-2"; - } - source.eatWhile(symbolRE); - return t; - } - - return "error"; - } - - function ncomment(type, nest) { - if (nest == 0) { - return normal; - } - return function(source, setState) { - var currNest = nest; - while (!source.eol()) { - var ch = source.next(); - if (ch == '{' && source.eat('-')) { - ++currNest; - } - else if (ch == '-' && source.eat('}')) { - --currNest; - if (currNest == 0) { - setState(normal); - return type; - } - } - } - setState(ncomment(type, currNest)); - return type; - }; - } - - function stringLiteral(source, setState) { - while (!source.eol()) { - var ch = source.next(); - if (ch == '"') { - setState(normal); - return "string"; - } - if (ch == '\\') { - if (source.eol() || source.eat(whiteCharRE)) { - setState(stringGap); - return "string"; - } - if (source.eat('&')) { - } - else { - source.next(); // should handle other escapes here - } - } - } - setState(normal); - return "error"; - } - - function stringGap(source, setState) { - if (source.eat('\\')) { - return switchState(source, setState, stringLiteral); - } - source.next(); - setState(normal); - return "error"; - } - - - var wellKnownWords = (function() { - var wkw = {}; - function setType(t) { - return function () { - for (var i = 0; i < arguments.length; i++) - wkw[arguments[i]] = t; - }; - } - - setType("keyword")( - "case", "class", "data", "default", "deriving", "do", "else", "foreign", - "if", "import", "in", "infix", "infixl", "infixr", "instance", "let", - "module", "newtype", "of", "then", "type", "where", "_"); - - setType("keyword")( - "\.\.", ":", "::", "=", "\\", "\"", "<-", "->", "@", "~", "=>"); - - setType("builtin")( - "!!", "$!", "$", "&&", "+", "++", "-", ".", "/", "/=", "<", "<=", "=<<", - "==", ">", ">=", ">>", ">>=", "^", "^^", "||", "*", "**"); - - setType("builtin")( - "Bool", "Bounded", "Char", "Double", "EQ", "Either", "Enum", "Eq", - "False", "FilePath", "Float", "Floating", "Fractional", "Functor", "GT", - "IO", "IOError", "Int", "Integer", "Integral", "Just", "LT", "Left", - "Maybe", "Monad", "Nothing", "Num", "Ord", "Ordering", "Rational", "Read", - "ReadS", "Real", "RealFloat", "RealFrac", "Right", "Show", "ShowS", - "String", "True"); - - setType("builtin")( - "abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf", - "asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling", - "compare", "concat", "concatMap", "const", "cos", "cosh", "curry", - "cycle", "decodeFloat", "div", "divMod", "drop", "dropWhile", "either", - "elem", "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo", - "enumFromTo", "error", "even", "exp", "exponent", "fail", "filter", - "flip", "floatDigits", "floatRadix", "floatRange", "floor", "fmap", - "foldl", "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger", - "fromIntegral", "fromRational", "fst", "gcd", "getChar", "getContents", - "getLine", "head", "id", "init", "interact", "ioError", "isDenormalized", - "isIEEE", "isInfinite", "isNaN", "isNegativeZero", "iterate", "last", - "lcm", "length", "lex", "lines", "log", "logBase", "lookup", "map", - "mapM", "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound", - "minimum", "mod", "negate", "not", "notElem", "null", "odd", "or", - "otherwise", "pi", "pred", "print", "product", "properFraction", - "putChar", "putStr", "putStrLn", "quot", "quotRem", "read", "readFile", - "readIO", "readList", "readLn", "readParen", "reads", "readsPrec", - "realToFrac", "recip", "rem", "repeat", "replicate", "return", "reverse", - "round", "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq", - "sequence", "sequence_", "show", "showChar", "showList", "showParen", - "showString", "shows", "showsPrec", "significand", "signum", "sin", - "sinh", "snd", "span", "splitAt", "sqrt", "subtract", "succ", "sum", - "tail", "take", "takeWhile", "tan", "tanh", "toEnum", "toInteger", - "toRational", "truncate", "uncurry", "undefined", "unlines", "until", - "unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip", - "zip3", "zipWith", "zipWith3"); - - var override = modeConfig.overrideKeywords; - if (override) for (var word in override) if (override.hasOwnProperty(word)) - wkw[word] = override[word]; - - return wkw; - })(); - - - - return { - startState: function () { return { f: normal }; }, - copyState: function (s) { return { f: s.f }; }, - - token: function(stream, state) { - var t = state.f(stream, function(s) { state.f = s; }); - var w = stream.current(); - return wellKnownWords.hasOwnProperty(w) ? wellKnownWords[w] : t; - }, - - blockCommentStart: "{-", - blockCommentEnd: "-}", - lineComment: "--" - }; - -}); - -CodeMirror.defineMIME("text/x-haskell", "haskell"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/haskell/index.html b/public/plugins/codemirror-5.17.0/mode/haskell/index.html deleted file mode 100644 index 42240b0..0000000 --- a/public/plugins/codemirror-5.17.0/mode/haskell/index.html +++ /dev/null @@ -1,73 +0,0 @@ - - -CodeMirror: Haskell mode - - - - - - - - - - - -
-

Haskell mode

-
- - - -

MIME types defined: text/x-haskell.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/haxe/haxe.js b/public/plugins/codemirror-5.17.0/mode/haxe/haxe.js deleted file mode 100644 index a9573dd..0000000 --- a/public/plugins/codemirror-5.17.0/mode/haxe/haxe.js +++ /dev/null @@ -1,515 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("haxe", function(config, parserConfig) { - var indentUnit = config.indentUnit; - - // Tokenizer - - function kw(type) {return {type: type, style: "keyword"};} - var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); - var operator = kw("operator"), atom = {type: "atom", style: "atom"}, attribute = {type:"attribute", style: "attribute"}; - var type = kw("typedef"); - var keywords = { - "if": A, "while": A, "else": B, "do": B, "try": B, - "return": C, "break": C, "continue": C, "new": C, "throw": C, - "var": kw("var"), "inline":attribute, "static": attribute, "using":kw("import"), - "public": attribute, "private": attribute, "cast": kw("cast"), "import": kw("import"), "macro": kw("macro"), - "function": kw("function"), "catch": kw("catch"), "untyped": kw("untyped"), "callback": kw("cb"), - "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), - "in": operator, "never": kw("property_access"), "trace":kw("trace"), - "class": type, "abstract":type, "enum":type, "interface":type, "typedef":type, "extends":type, "implements":type, "dynamic":type, - "true": atom, "false": atom, "null": atom - }; - - var isOperatorChar = /[+\-*&%=<>!?|]/; - - function chain(stream, state, f) { - state.tokenize = f; - return f(stream, state); - } - - function toUnescaped(stream, end) { - var escaped = false, next; - while ((next = stream.next()) != null) { - if (next == end && !escaped) - return true; - escaped = !escaped && next == "\\"; - } - } - - // Used as scratch variables to communicate multiple values without - // consing up tons of objects. - var type, content; - function ret(tp, style, cont) { - type = tp; content = cont; - return style; - } - - function haxeTokenBase(stream, state) { - var ch = stream.next(); - if (ch == '"' || ch == "'") { - return chain(stream, state, haxeTokenString(ch)); - } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { - return ret(ch); - } else if (ch == "0" && stream.eat(/x/i)) { - stream.eatWhile(/[\da-f]/i); - return ret("number", "number"); - } else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) { - stream.match(/^\d*(?:\.\d*(?!\.))?(?:[eE][+\-]?\d+)?/); - return ret("number", "number"); - } else if (state.reAllowed && (ch == "~" && stream.eat(/\//))) { - toUnescaped(stream, "/"); - stream.eatWhile(/[gimsu]/); - return ret("regexp", "string-2"); - } else if (ch == "/") { - if (stream.eat("*")) { - return chain(stream, state, haxeTokenComment); - } else if (stream.eat("/")) { - stream.skipToEnd(); - return ret("comment", "comment"); - } else { - stream.eatWhile(isOperatorChar); - return ret("operator", null, stream.current()); - } - } else if (ch == "#") { - stream.skipToEnd(); - return ret("conditional", "meta"); - } else if (ch == "@") { - stream.eat(/:/); - stream.eatWhile(/[\w_]/); - return ret ("metadata", "meta"); - } else if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return ret("operator", null, stream.current()); - } else { - var word; - if(/[A-Z]/.test(ch)) { - stream.eatWhile(/[\w_<>]/); - word = stream.current(); - return ret("type", "variable-3", word); - } else { - stream.eatWhile(/[\w_]/); - var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; - return (known && state.kwAllowed) ? ret(known.type, known.style, word) : - ret("variable", "variable", word); - } - } - } - - function haxeTokenString(quote) { - return function(stream, state) { - if (toUnescaped(stream, quote)) - state.tokenize = haxeTokenBase; - return ret("string", "string"); - }; - } - - function haxeTokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = haxeTokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return ret("comment", "comment"); - } - - // Parser - - var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true}; - - function HaxeLexical(indented, column, type, align, prev, info) { - this.indented = indented; - this.column = column; - this.type = type; - this.prev = prev; - this.info = info; - if (align != null) this.align = align; - } - - function inScope(state, varname) { - for (var v = state.localVars; v; v = v.next) - if (v.name == varname) return true; - } - - function parseHaxe(state, style, type, content, stream) { - var cc = state.cc; - // Communicate our context to the combinators. - // (Less wasteful than consing up a hundred closures on every call.) - cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; - - if (!state.lexical.hasOwnProperty("align")) - state.lexical.align = true; - - while(true) { - var combinator = cc.length ? cc.pop() : statement; - if (combinator(type, content)) { - while(cc.length && cc[cc.length - 1].lex) - cc.pop()(); - if (cx.marked) return cx.marked; - if (type == "variable" && inScope(state, content)) return "variable-2"; - if (type == "variable" && imported(state, content)) return "variable-3"; - return style; - } - } - } - - function imported(state, typename) { - if (/[a-z]/.test(typename.charAt(0))) - return false; - var len = state.importedtypes.length; - for (var i = 0; i= 0; i--) cx.cc.push(arguments[i]); - } - function cont() { - pass.apply(null, arguments); - return true; - } - function inList(name, list) { - for (var v = list; v; v = v.next) - if (v.name == name) return true; - return false; - } - function register(varname) { - var state = cx.state; - if (state.context) { - cx.marked = "def"; - if (inList(varname, state.localVars)) return; - state.localVars = {name: varname, next: state.localVars}; - } else if (state.globalVars) { - if (inList(varname, state.globalVars)) return; - state.globalVars = {name: varname, next: state.globalVars}; - } - } - - // Combinators - - var defaultVars = {name: "this", next: null}; - function pushcontext() { - if (!cx.state.context) cx.state.localVars = defaultVars; - cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; - } - function popcontext() { - cx.state.localVars = cx.state.context.vars; - cx.state.context = cx.state.context.prev; - } - popcontext.lex = true; - function pushlex(type, info) { - var result = function() { - var state = cx.state; - state.lexical = new HaxeLexical(state.indented, cx.stream.column(), type, null, state.lexical, info); - }; - result.lex = true; - return result; - } - function poplex() { - var state = cx.state; - if (state.lexical.prev) { - if (state.lexical.type == ")") - state.indented = state.lexical.indented; - state.lexical = state.lexical.prev; - } - } - poplex.lex = true; - - function expect(wanted) { - function f(type) { - if (type == wanted) return cont(); - else if (wanted == ";") return pass(); - else return cont(f); - } - return f; - } - - function statement(type) { - if (type == "@") return cont(metadef); - if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex); - if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); - if (type == "keyword b") return cont(pushlex("form"), statement, poplex); - if (type == "{") return cont(pushlex("}"), pushcontext, block, poplex, popcontext); - if (type == ";") return cont(); - if (type == "attribute") return cont(maybeattribute); - if (type == "function") return cont(functiondef); - if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"), - poplex, statement, poplex); - if (type == "variable") return cont(pushlex("stat"), maybelabel); - if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), - block, poplex, poplex); - if (type == "case") return cont(expression, expect(":")); - if (type == "default") return cont(expect(":")); - if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), - statement, poplex, popcontext); - if (type == "import") return cont(importdef, expect(";")); - if (type == "typedef") return cont(typedef); - return pass(pushlex("stat"), expression, expect(";"), poplex); - } - function expression(type) { - if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator); - if (type == "type" ) return cont(maybeoperator); - if (type == "function") return cont(functiondef); - if (type == "keyword c") return cont(maybeexpression); - if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeoperator); - if (type == "operator") return cont(expression); - if (type == "[") return cont(pushlex("]"), commasep(maybeexpression, "]"), poplex, maybeoperator); - if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator); - return cont(); - } - function maybeexpression(type) { - if (type.match(/[;\}\)\],]/)) return pass(); - return pass(expression); - } - - function maybeoperator(type, value) { - if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator); - if (type == "operator" || type == ":") return cont(expression); - if (type == ";") return; - if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator); - if (type == ".") return cont(property, maybeoperator); - if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator); - } - - function maybeattribute(type) { - if (type == "attribute") return cont(maybeattribute); - if (type == "function") return cont(functiondef); - if (type == "var") return cont(vardef1); - } - - function metadef(type) { - if(type == ":") return cont(metadef); - if(type == "variable") return cont(metadef); - if(type == "(") return cont(pushlex(")"), commasep(metaargs, ")"), poplex, statement); - } - function metaargs(type) { - if(type == "variable") return cont(); - } - - function importdef (type, value) { - if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } - else if(type == "variable" || type == "property" || type == "." || value == "*") return cont(importdef); - } - - function typedef (type, value) - { - if(type == "variable" && /[A-Z]/.test(value.charAt(0))) { registerimport(value); return cont(); } - else if (type == "type" && /[A-Z]/.test(value.charAt(0))) { return cont(); } - } - - function maybelabel(type) { - if (type == ":") return cont(poplex, statement); - return pass(maybeoperator, expect(";"), poplex); - } - function property(type) { - if (type == "variable") {cx.marked = "property"; return cont();} - } - function objprop(type) { - if (type == "variable") cx.marked = "property"; - if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression); - } - function commasep(what, end) { - function proceed(type) { - if (type == ",") return cont(what, proceed); - if (type == end) return cont(); - return cont(expect(end)); - } - return function(type) { - if (type == end) return cont(); - else return pass(what, proceed); - }; - } - function block(type) { - if (type == "}") return cont(); - return pass(statement, block); - } - function vardef1(type, value) { - if (type == "variable"){register(value); return cont(typeuse, vardef2);} - return cont(); - } - function vardef2(type, value) { - if (value == "=") return cont(expression, vardef2); - if (type == ",") return cont(vardef1); - } - function forspec1(type, value) { - if (type == "variable") { - register(value); - return cont(forin, expression) - } else { - return pass() - } - } - function forin(_type, value) { - if (value == "in") return cont(); - } - function functiondef(type, value) { - //function names starting with upper-case letters are recognised as types, so cludging them together here. - if (type == "variable" || type == "type") {register(value); return cont(functiondef);} - if (value == "new") return cont(functiondef); - if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, typeuse, statement, popcontext); - } - function typeuse(type) { - if(type == ":") return cont(typestring); - } - function typestring(type) { - if(type == "type") return cont(); - if(type == "variable") return cont(); - if(type == "{") return cont(pushlex("}"), commasep(typeprop, "}"), poplex); - } - function typeprop(type) { - if(type == "variable") return cont(typeuse); - } - function funarg(type, value) { - if (type == "variable") {register(value); return cont(typeuse);} - } - - // Interface - return { - startState: function(basecolumn) { - var defaulttypes = ["Int", "Float", "String", "Void", "Std", "Bool", "Dynamic", "Array"]; - var state = { - tokenize: haxeTokenBase, - reAllowed: true, - kwAllowed: true, - cc: [], - lexical: new HaxeLexical((basecolumn || 0) - indentUnit, 0, "block", false), - localVars: parserConfig.localVars, - importedtypes: defaulttypes, - context: parserConfig.localVars && {vars: parserConfig.localVars}, - indented: 0 - }; - if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") - state.globalVars = parserConfig.globalVars; - return state; - }, - - token: function(stream, state) { - if (stream.sol()) { - if (!state.lexical.hasOwnProperty("align")) - state.lexical.align = false; - state.indented = stream.indentation(); - } - if (stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - if (type == "comment") return style; - state.reAllowed = !!(type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/)); - state.kwAllowed = type != '.'; - return parseHaxe(state, style, type, content, stream); - }, - - indent: function(state, textAfter) { - if (state.tokenize != haxeTokenBase) return 0; - var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; - if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; - var type = lexical.type, closing = firstChar == type; - if (type == "vardef") return lexical.indented + 4; - else if (type == "form" && firstChar == "{") return lexical.indented; - else if (type == "stat" || type == "form") return lexical.indented + indentUnit; - else if (lexical.info == "switch" && !closing) - return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); - else if (lexical.align) return lexical.column + (closing ? 0 : 1); - else return lexical.indented + (closing ? 0 : indentUnit); - }, - - electricChars: "{}", - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: "//" - }; -}); - -CodeMirror.defineMIME("text/x-haxe", "haxe"); - -CodeMirror.defineMode("hxml", function () { - - return { - startState: function () { - return { - define: false, - inString: false - }; - }, - token: function (stream, state) { - var ch = stream.peek(); - var sol = stream.sol(); - - ///* comments */ - if (ch == "#") { - stream.skipToEnd(); - return "comment"; - } - if (sol && ch == "-") { - var style = "variable-2"; - - stream.eat(/-/); - - if (stream.peek() == "-") { - stream.eat(/-/); - style = "keyword a"; - } - - if (stream.peek() == "D") { - stream.eat(/[D]/); - style = "keyword c"; - state.define = true; - } - - stream.eatWhile(/[A-Z]/i); - return style; - } - - var ch = stream.peek(); - - if (state.inString == false && ch == "'") { - state.inString = true; - ch = stream.next(); - } - - if (state.inString == true) { - if (stream.skipTo("'")) { - - } else { - stream.skipToEnd(); - } - - if (stream.peek() == "'") { - stream.next(); - state.inString = false; - } - - return "string"; - } - - stream.next(); - return null; - }, - lineComment: "#" - }; -}); - -CodeMirror.defineMIME("text/x-hxml", "hxml"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/haxe/index.html b/public/plugins/codemirror-5.17.0/mode/haxe/index.html deleted file mode 100644 index d415b5e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/haxe/index.html +++ /dev/null @@ -1,124 +0,0 @@ - - -CodeMirror: Haxe mode - - - - - - - - - -
-

Haxe mode

- - -

- -

Hxml mode:

- -

-
- - - -

MIME types defined: text/x-haxe, text/x-hxml.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/htmlembedded/htmlembedded.js b/public/plugins/codemirror-5.17.0/mode/htmlembedded/htmlembedded.js deleted file mode 100644 index 464dc57..0000000 --- a/public/plugins/codemirror-5.17.0/mode/htmlembedded/htmlembedded.js +++ /dev/null @@ -1,28 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), - require("../../addon/mode/multiplex")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../htmlmixed/htmlmixed", - "../../addon/mode/multiplex"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("htmlembedded", function(config, parserConfig) { - return CodeMirror.multiplexingMode(CodeMirror.getMode(config, "htmlmixed"), { - open: parserConfig.open || parserConfig.scriptStartRegex || "<%", - close: parserConfig.close || parserConfig.scriptEndRegex || "%>", - mode: CodeMirror.getMode(config, parserConfig.scriptingModeSpec) - }); - }, "htmlmixed"); - - CodeMirror.defineMIME("application/x-ejs", {name: "htmlembedded", scriptingModeSpec:"javascript"}); - CodeMirror.defineMIME("application/x-aspx", {name: "htmlembedded", scriptingModeSpec:"text/x-csharp"}); - CodeMirror.defineMIME("application/x-jsp", {name: "htmlembedded", scriptingModeSpec:"text/x-java"}); - CodeMirror.defineMIME("application/x-erb", {name: "htmlembedded", scriptingModeSpec:"ruby"}); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/htmlembedded/index.html b/public/plugins/codemirror-5.17.0/mode/htmlembedded/index.html deleted file mode 100644 index 9ed33cf..0000000 --- a/public/plugins/codemirror-5.17.0/mode/htmlembedded/index.html +++ /dev/null @@ -1,60 +0,0 @@ - - -CodeMirror: Html Embedded Scripts mode - - - - - - - - - - - - - - -
-

Html Embedded Scripts mode

-
- - - -

Mode for html embedded scripts like JSP and ASP.NET. Depends on multiplex and HtmlMixed which in turn depends on - JavaScript, CSS and XML.
Other dependencies include those of the scripting language chosen.

- -

MIME types defined: application/x-aspx (ASP.NET), - application/x-ejs (Embedded Javascript), application/x-jsp (JavaServer Pages) - and application/x-erb

-
diff --git a/public/plugins/codemirror-5.17.0/mode/htmlmixed/htmlmixed.js b/public/plugins/codemirror-5.17.0/mode/htmlmixed/htmlmixed.js deleted file mode 100644 index d74083e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/htmlmixed/htmlmixed.js +++ /dev/null @@ -1,152 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript"), require("../css/css")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript", "../css/css"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - var defaultTags = { - script: [ - ["lang", /(javascript|babel)/i, "javascript"], - ["type", /^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^$/i, "javascript"], - ["type", /./, "text/plain"], - [null, null, "javascript"] - ], - style: [ - ["lang", /^css$/i, "css"], - ["type", /^(text\/)?(x-)?(stylesheet|css)$/i, "css"], - ["type", /./, "text/plain"], - [null, null, "css"] - ] - }; - - function maybeBackup(stream, pat, style) { - var cur = stream.current(), close = cur.search(pat); - if (close > -1) { - stream.backUp(cur.length - close); - } else if (cur.match(/<\/?$/)) { - stream.backUp(cur.length); - if (!stream.match(pat, false)) stream.match(cur); - } - return style; - } - - var attrRegexpCache = {}; - function getAttrRegexp(attr) { - var regexp = attrRegexpCache[attr]; - if (regexp) return regexp; - return attrRegexpCache[attr] = new RegExp("\\s+" + attr + "\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*"); - } - - function getAttrValue(text, attr) { - var match = text.match(getAttrRegexp(attr)) - return match ? match[2] : "" - } - - function getTagRegexp(tagName, anchored) { - return new RegExp((anchored ? "^" : "") + "<\/\s*" + tagName + "\s*>", "i"); - } - - function addTags(from, to) { - for (var tag in from) { - var dest = to[tag] || (to[tag] = []); - var source = from[tag]; - for (var i = source.length - 1; i >= 0; i--) - dest.unshift(source[i]) - } - } - - function findMatchingMode(tagInfo, tagText) { - for (var i = 0; i < tagInfo.length; i++) { - var spec = tagInfo[i]; - if (!spec[0] || spec[1].test(getAttrValue(tagText, spec[0]))) return spec[2]; - } - } - - CodeMirror.defineMode("htmlmixed", function (config, parserConfig) { - var htmlMode = CodeMirror.getMode(config, { - name: "xml", - htmlMode: true, - multilineTagIndentFactor: parserConfig.multilineTagIndentFactor, - multilineTagIndentPastTag: parserConfig.multilineTagIndentPastTag - }); - - var tags = {}; - var configTags = parserConfig && parserConfig.tags, configScript = parserConfig && parserConfig.scriptTypes; - addTags(defaultTags, tags); - if (configTags) addTags(configTags, tags); - if (configScript) for (var i = configScript.length - 1; i >= 0; i--) - tags.script.unshift(["type", configScript[i].matches, configScript[i].mode]) - - function html(stream, state) { - var style = htmlMode.token(stream, state.htmlState), tag = /\btag\b/.test(style), tagName - if (tag && !/[<>\s\/]/.test(stream.current()) && - (tagName = state.htmlState.tagName && state.htmlState.tagName.toLowerCase()) && - tags.hasOwnProperty(tagName)) { - state.inTag = tagName + " " - } else if (state.inTag && tag && />$/.test(stream.current())) { - var inTag = /^([\S]+) (.*)/.exec(state.inTag) - state.inTag = null - var modeSpec = stream.current() == ">" && findMatchingMode(tags[inTag[1]], inTag[2]) - var mode = CodeMirror.getMode(config, modeSpec) - var endTagA = getTagRegexp(inTag[1], true), endTag = getTagRegexp(inTag[1], false); - state.token = function (stream, state) { - if (stream.match(endTagA, false)) { - state.token = html; - state.localState = state.localMode = null; - return null; - } - return maybeBackup(stream, endTag, state.localMode.token(stream, state.localState)); - }; - state.localMode = mode; - state.localState = CodeMirror.startState(mode, htmlMode.indent(state.htmlState, "")); - } else if (state.inTag) { - state.inTag += stream.current() - if (stream.eol()) state.inTag += " " - } - return style; - }; - - return { - startState: function () { - var state = CodeMirror.startState(htmlMode); - return {token: html, inTag: null, localMode: null, localState: null, htmlState: state}; - }, - - copyState: function (state) { - var local; - if (state.localState) { - local = CodeMirror.copyState(state.localMode, state.localState); - } - return {token: state.token, inTag: state.inTag, - localMode: state.localMode, localState: local, - htmlState: CodeMirror.copyState(htmlMode, state.htmlState)}; - }, - - token: function (stream, state) { - return state.token(stream, state); - }, - - indent: function (state, textAfter) { - if (!state.localMode || /^\s*<\//.test(textAfter)) - return htmlMode.indent(state.htmlState, textAfter); - else if (state.localMode.indent) - return state.localMode.indent(state.localState, textAfter); - else - return CodeMirror.Pass; - }, - - innerMode: function (state) { - return {state: state.localState || state.htmlState, mode: state.localMode || htmlMode}; - } - }; - }, "xml", "javascript", "css"); - - CodeMirror.defineMIME("text/html", "htmlmixed"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/htmlmixed/index.html b/public/plugins/codemirror-5.17.0/mode/htmlmixed/index.html deleted file mode 100644 index f94df9e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/htmlmixed/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - -CodeMirror: HTML mixed mode - - - - - - - - - - - - - - -
-

HTML mixed mode

-
- - -

The HTML mixed mode depends on the XML, JavaScript, and CSS modes.

- -

It takes an optional mode configuration - option, scriptTypes, which can be used to add custom - behavior for specific <script type="..."> tags. If - given, it should hold an array of {matches, mode} - objects, where matches is a string or regexp that - matches the script type, and mode is - either null, for script types that should stay in - HTML mode, or a mode - spec corresponding to the mode that should be used for the - script.

- -

MIME types defined: text/html - (redefined, only takes effect if you load this parser after the - XML parser).

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/http/http.js b/public/plugins/codemirror-5.17.0/mode/http/http.js deleted file mode 100644 index 9a3c5f9..0000000 --- a/public/plugins/codemirror-5.17.0/mode/http/http.js +++ /dev/null @@ -1,113 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("http", function() { - function failFirstLine(stream, state) { - stream.skipToEnd(); - state.cur = header; - return "error"; - } - - function start(stream, state) { - if (stream.match(/^HTTP\/\d\.\d/)) { - state.cur = responseStatusCode; - return "keyword"; - } else if (stream.match(/^[A-Z]+/) && /[ \t]/.test(stream.peek())) { - state.cur = requestPath; - return "keyword"; - } else { - return failFirstLine(stream, state); - } - } - - function responseStatusCode(stream, state) { - var code = stream.match(/^\d+/); - if (!code) return failFirstLine(stream, state); - - state.cur = responseStatusText; - var status = Number(code[0]); - if (status >= 100 && status < 200) { - return "positive informational"; - } else if (status >= 200 && status < 300) { - return "positive success"; - } else if (status >= 300 && status < 400) { - return "positive redirect"; - } else if (status >= 400 && status < 500) { - return "negative client-error"; - } else if (status >= 500 && status < 600) { - return "negative server-error"; - } else { - return "error"; - } - } - - function responseStatusText(stream, state) { - stream.skipToEnd(); - state.cur = header; - return null; - } - - function requestPath(stream, state) { - stream.eatWhile(/\S/); - state.cur = requestProtocol; - return "string-2"; - } - - function requestProtocol(stream, state) { - if (stream.match(/^HTTP\/\d\.\d$/)) { - state.cur = header; - return "keyword"; - } else { - return failFirstLine(stream, state); - } - } - - function header(stream) { - if (stream.sol() && !stream.eat(/[ \t]/)) { - if (stream.match(/^.*?:/)) { - return "atom"; - } else { - stream.skipToEnd(); - return "error"; - } - } else { - stream.skipToEnd(); - return "string"; - } - } - - function body(stream) { - stream.skipToEnd(); - return null; - } - - return { - token: function(stream, state) { - var cur = state.cur; - if (cur != header && cur != body && stream.eatSpace()) return null; - return cur(stream, state); - }, - - blankLine: function(state) { - state.cur = body; - }, - - startState: function() { - return {cur: start}; - } - }; -}); - -CodeMirror.defineMIME("message/http", "http"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/http/index.html b/public/plugins/codemirror-5.17.0/mode/http/index.html deleted file mode 100644 index 0b8d531..0000000 --- a/public/plugins/codemirror-5.17.0/mode/http/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - -CodeMirror: HTTP mode - - - - - - - - - -
-

HTTP mode

- - -
- - - -

MIME types defined: message/http.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/idl/idl.js b/public/plugins/codemirror-5.17.0/mode/idl/idl.js deleted file mode 100644 index 07308d7..0000000 --- a/public/plugins/codemirror-5.17.0/mode/idl/idl.js +++ /dev/null @@ -1,290 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - function wordRegexp(words) { - return new RegExp('^((' + words.join(')|(') + '))\\b', 'i'); - }; - - var builtinArray = [ - 'a_correlate', 'abs', 'acos', 'adapt_hist_equal', 'alog', - 'alog2', 'alog10', 'amoeba', 'annotate', 'app_user_dir', - 'app_user_dir_query', 'arg_present', 'array_equal', 'array_indices', - 'arrow', 'ascii_template', 'asin', 'assoc', 'atan', - 'axis', 'axis', 'bandpass_filter', 'bandreject_filter', 'barplot', - 'bar_plot', 'beseli', 'beselj', 'beselk', 'besely', - 'beta', 'biginteger', 'bilinear', 'bin_date', 'binary_template', - 'bindgen', 'binomial', 'bit_ffs', 'bit_population', 'blas_axpy', - 'blk_con', 'boolarr', 'boolean', 'boxplot', 'box_cursor', - 'breakpoint', 'broyden', 'bubbleplot', 'butterworth', 'bytarr', - 'byte', 'byteorder', 'bytscl', 'c_correlate', 'calendar', - 'caldat', 'call_external', 'call_function', 'call_method', - 'call_procedure', 'canny', 'catch', 'cd', 'cdf', 'ceil', - 'chebyshev', 'check_math', 'chisqr_cvf', 'chisqr_pdf', 'choldc', - 'cholsol', 'cindgen', 'cir_3pnt', 'clipboard', 'close', - 'clust_wts', 'cluster', 'cluster_tree', 'cmyk_convert', 'code_coverage', - 'color_convert', 'color_exchange', 'color_quan', 'color_range_map', - 'colorbar', 'colorize_sample', 'colormap_applicable', - 'colormap_gradient', 'colormap_rotation', 'colortable', - 'comfit', 'command_line_args', 'common', 'compile_opt', 'complex', - 'complexarr', 'complexround', 'compute_mesh_normals', 'cond', 'congrid', - 'conj', 'constrained_min', 'contour', 'contour', 'convert_coord', - 'convol', 'convol_fft', 'coord2to3', 'copy_lun', 'correlate', - 'cos', 'cosh', 'cpu', 'cramer', 'createboxplotdata', - 'create_cursor', 'create_struct', 'create_view', 'crossp', 'crvlength', - 'ct_luminance', 'cti_test', 'cursor', 'curvefit', 'cv_coord', - 'cvttobm', 'cw_animate', 'cw_animate_getp', 'cw_animate_load', - 'cw_animate_run', 'cw_arcball', 'cw_bgroup', 'cw_clr_index', - 'cw_colorsel', 'cw_defroi', 'cw_field', 'cw_filesel', 'cw_form', - 'cw_fslider', 'cw_light_editor', 'cw_light_editor_get', - 'cw_light_editor_set', 'cw_orient', 'cw_palette_editor', - 'cw_palette_editor_get', 'cw_palette_editor_set', 'cw_pdmenu', - 'cw_rgbslider', 'cw_tmpl', 'cw_zoom', 'db_exists', - 'dblarr', 'dcindgen', 'dcomplex', 'dcomplexarr', 'define_key', - 'define_msgblk', 'define_msgblk_from_file', 'defroi', 'defsysv', - 'delvar', 'dendro_plot', 'dendrogram', 'deriv', 'derivsig', - 'determ', 'device', 'dfpmin', 'diag_matrix', 'dialog_dbconnect', - 'dialog_message', 'dialog_pickfile', 'dialog_printersetup', - 'dialog_printjob', 'dialog_read_image', - 'dialog_write_image', 'dictionary', 'digital_filter', 'dilate', 'dindgen', - 'dissolve', 'dist', 'distance_measure', 'dlm_load', 'dlm_register', - 'doc_library', 'double', 'draw_roi', 'edge_dog', 'efont', - 'eigenql', 'eigenvec', 'ellipse', 'elmhes', 'emboss', - 'empty', 'enable_sysrtn', 'eof', 'eos', 'erase', - 'erf', 'erfc', 'erfcx', 'erode', 'errorplot', - 'errplot', 'estimator_filter', 'execute', 'exit', 'exp', - 'expand', 'expand_path', 'expint', 'extrac', 'extract_slice', - 'f_cvf', 'f_pdf', 'factorial', 'fft', 'file_basename', - 'file_chmod', 'file_copy', 'file_delete', 'file_dirname', - 'file_expand_path', 'file_gunzip', 'file_gzip', 'file_info', - 'file_lines', 'file_link', 'file_mkdir', 'file_move', - 'file_poll_input', 'file_readlink', 'file_same', - 'file_search', 'file_tar', 'file_test', 'file_untar', 'file_unzip', - 'file_which', 'file_zip', 'filepath', 'findgen', 'finite', - 'fix', 'flick', 'float', 'floor', 'flow3', - 'fltarr', 'flush', 'format_axis_values', 'forward_function', 'free_lun', - 'fstat', 'fulstr', 'funct', 'function', 'fv_test', - 'fx_root', 'fz_roots', 'gamma', 'gamma_ct', 'gauss_cvf', - 'gauss_pdf', 'gauss_smooth', 'gauss2dfit', 'gaussfit', - 'gaussian_function', 'gaussint', 'get_drive_list', 'get_dxf_objects', - 'get_kbrd', 'get_login_info', - 'get_lun', 'get_screen_size', 'getenv', 'getwindows', 'greg2jul', - 'grib', 'grid_input', 'grid_tps', 'grid3', 'griddata', - 'gs_iter', 'h_eq_ct', 'h_eq_int', 'hanning', 'hash', - 'hdf', 'hdf5', 'heap_free', 'heap_gc', 'heap_nosave', - 'heap_refcount', 'heap_save', 'help', 'hilbert', 'hist_2d', - 'hist_equal', 'histogram', 'hls', 'hough', 'hqr', - 'hsv', 'i18n_multibytetoutf8', - 'i18n_multibytetowidechar', 'i18n_utf8tomultibyte', - 'i18n_widechartomultibyte', - 'ibeta', 'icontour', 'iconvertcoord', 'idelete', 'identity', - 'idl_base64', 'idl_container', 'idl_validname', - 'idlexbr_assistant', 'idlitsys_createtool', - 'idlunit', 'iellipse', 'igamma', 'igetcurrent', 'igetdata', - 'igetid', 'igetproperty', 'iimage', 'image', 'image_cont', - 'image_statistics', 'image_threshold', 'imaginary', 'imap', 'indgen', - 'int_2d', 'int_3d', 'int_tabulated', 'intarr', 'interpol', - 'interpolate', 'interval_volume', 'invert', 'ioctl', 'iopen', - 'ir_filter', 'iplot', 'ipolygon', 'ipolyline', 'iputdata', - 'iregister', 'ireset', 'iresolve', 'irotate', 'isa', - 'isave', 'iscale', 'isetcurrent', 'isetproperty', 'ishft', - 'isocontour', 'isosurface', 'isurface', 'itext', 'itranslate', - 'ivector', 'ivolume', 'izoom', 'journal', 'json_parse', - 'json_serialize', 'jul2greg', 'julday', 'keyword_set', 'krig2d', - 'kurtosis', 'kw_test', 'l64indgen', 'la_choldc', 'la_cholmprove', - 'la_cholsol', 'la_determ', 'la_eigenproblem', 'la_eigenql', 'la_eigenvec', - 'la_elmhes', 'la_gm_linear_model', 'la_hqr', 'la_invert', - 'la_least_square_equality', 'la_least_squares', 'la_linear_equation', - 'la_ludc', 'la_lumprove', 'la_lusol', - 'la_svd', 'la_tridc', 'la_trimprove', 'la_triql', 'la_trired', - 'la_trisol', 'label_date', 'label_region', 'ladfit', 'laguerre', - 'lambda', 'lambdap', 'lambertw', 'laplacian', 'least_squares_filter', - 'leefilt', 'legend', 'legendre', 'linbcg', 'lindgen', - 'linfit', 'linkimage', 'list', 'll_arc_distance', 'lmfit', - 'lmgr', 'lngamma', 'lnp_test', 'loadct', 'locale_get', - 'logical_and', 'logical_or', 'logical_true', 'lon64arr', 'lonarr', - 'long', 'long64', 'lsode', 'lu_complex', 'ludc', - 'lumprove', 'lusol', 'm_correlate', 'machar', 'make_array', - 'make_dll', 'make_rt', 'map', 'mapcontinents', 'mapgrid', - 'map_2points', 'map_continents', 'map_grid', 'map_image', 'map_patch', - 'map_proj_forward', 'map_proj_image', 'map_proj_info', - 'map_proj_init', 'map_proj_inverse', - 'map_set', 'matrix_multiply', 'matrix_power', 'max', 'md_test', - 'mean', 'meanabsdev', 'mean_filter', 'median', 'memory', - 'mesh_clip', 'mesh_decimate', 'mesh_issolid', - 'mesh_merge', 'mesh_numtriangles', - 'mesh_obj', 'mesh_smooth', 'mesh_surfacearea', - 'mesh_validate', 'mesh_volume', - 'message', 'min', 'min_curve_surf', 'mk_html_help', 'modifyct', - 'moment', 'morph_close', 'morph_distance', - 'morph_gradient', 'morph_hitormiss', - 'morph_open', 'morph_thin', 'morph_tophat', 'multi', 'n_elements', - 'n_params', 'n_tags', 'ncdf', 'newton', 'noise_hurl', - 'noise_pick', 'noise_scatter', 'noise_slur', 'norm', 'obj_class', - 'obj_destroy', 'obj_hasmethod', 'obj_isa', 'obj_new', 'obj_valid', - 'objarr', 'on_error', 'on_ioerror', 'online_help', 'openr', - 'openu', 'openw', 'oplot', 'oploterr', 'orderedhash', - 'p_correlate', 'parse_url', 'particle_trace', 'path_cache', 'path_sep', - 'pcomp', 'plot', 'plot3d', 'plot', 'plot_3dbox', - 'plot_field', 'ploterr', 'plots', 'polar_contour', 'polar_surface', - 'polyfill', 'polyshade', 'pnt_line', 'point_lun', 'polarplot', - 'poly', 'poly_2d', 'poly_area', 'poly_fit', 'polyfillv', - 'polygon', 'polyline', 'polywarp', 'popd', 'powell', - 'pref_commit', 'pref_get', 'pref_set', 'prewitt', 'primes', - 'print', 'printf', 'printd', 'pro', 'product', - 'profile', 'profiler', 'profiles', 'project_vol', 'ps_show_fonts', - 'psafm', 'pseudo', 'ptr_free', 'ptr_new', 'ptr_valid', - 'ptrarr', 'pushd', 'qgrid3', 'qhull', 'qromb', - 'qromo', 'qsimp', 'query_*', 'query_ascii', 'query_bmp', - 'query_csv', 'query_dicom', 'query_gif', 'query_image', 'query_jpeg', - 'query_jpeg2000', 'query_mrsid', 'query_pict', 'query_png', 'query_ppm', - 'query_srf', 'query_tiff', 'query_video', 'query_wav', 'r_correlate', - 'r_test', 'radon', 'randomn', 'randomu', 'ranks', - 'rdpix', 'read', 'readf', 'read_ascii', 'read_binary', - 'read_bmp', 'read_csv', 'read_dicom', 'read_gif', 'read_image', - 'read_interfile', 'read_jpeg', 'read_jpeg2000', 'read_mrsid', 'read_pict', - 'read_png', 'read_ppm', 'read_spr', 'read_srf', 'read_sylk', - 'read_tiff', 'read_video', 'read_wav', 'read_wave', 'read_x11_bitmap', - 'read_xwd', 'reads', 'readu', 'real_part', 'rebin', - 'recall_commands', 'recon3', 'reduce_colors', 'reform', 'region_grow', - 'register_cursor', 'regress', 'replicate', - 'replicate_inplace', 'resolve_all', - 'resolve_routine', 'restore', 'retall', 'return', 'reverse', - 'rk4', 'roberts', 'rot', 'rotate', 'round', - 'routine_filepath', 'routine_info', 'rs_test', 's_test', 'save', - 'savgol', 'scale3', 'scale3d', 'scatterplot', 'scatterplot3d', - 'scope_level', 'scope_traceback', 'scope_varfetch', - 'scope_varname', 'search2d', - 'search3d', 'sem_create', 'sem_delete', 'sem_lock', 'sem_release', - 'set_plot', 'set_shading', 'setenv', 'sfit', 'shade_surf', - 'shade_surf_irr', 'shade_volume', 'shift', 'shift_diff', 'shmdebug', - 'shmmap', 'shmunmap', 'shmvar', 'show3', 'showfont', - 'signum', 'simplex', 'sin', 'sindgen', 'sinh', - 'size', 'skewness', 'skip_lun', 'slicer3', 'slide_image', - 'smooth', 'sobel', 'socket', 'sort', 'spawn', - 'sph_4pnt', 'sph_scat', 'spher_harm', 'spl_init', 'spl_interp', - 'spline', 'spline_p', 'sprsab', 'sprsax', 'sprsin', - 'sprstp', 'sqrt', 'standardize', 'stddev', 'stop', - 'strarr', 'strcmp', 'strcompress', 'streamline', 'streamline', - 'stregex', 'stretch', 'string', 'strjoin', 'strlen', - 'strlowcase', 'strmatch', 'strmessage', 'strmid', 'strpos', - 'strput', 'strsplit', 'strtrim', 'struct_assign', 'struct_hide', - 'strupcase', 'surface', 'surface', 'surfr', 'svdc', - 'svdfit', 'svsol', 'swap_endian', 'swap_endian_inplace', 'symbol', - 'systime', 't_cvf', 't_pdf', 't3d', 'tag_names', - 'tan', 'tanh', 'tek_color', 'temporary', 'terminal_size', - 'tetra_clip', 'tetra_surface', 'tetra_volume', 'text', 'thin', - 'thread', 'threed', 'tic', 'time_test2', 'timegen', - 'timer', 'timestamp', 'timestamptovalues', 'tm_test', 'toc', - 'total', 'trace', 'transpose', 'tri_surf', 'triangulate', - 'trigrid', 'triql', 'trired', 'trisol', 'truncate_lun', - 'ts_coef', 'ts_diff', 'ts_fcast', 'ts_smooth', 'tv', - 'tvcrs', 'tvlct', 'tvrd', 'tvscl', 'typename', - 'uindgen', 'uint', 'uintarr', 'ul64indgen', 'ulindgen', - 'ulon64arr', 'ulonarr', 'ulong', 'ulong64', 'uniq', - 'unsharp_mask', 'usersym', 'value_locate', 'variance', 'vector', - 'vector_field', 'vel', 'velovect', 'vert_t3d', 'voigt', - 'volume', 'voronoi', 'voxel_proj', 'wait', 'warp_tri', - 'watershed', 'wdelete', 'wf_draw', 'where', 'widget_base', - 'widget_button', 'widget_combobox', 'widget_control', - 'widget_displaycontextmenu', 'widget_draw', - 'widget_droplist', 'widget_event', 'widget_info', - 'widget_label', 'widget_list', - 'widget_propertysheet', 'widget_slider', 'widget_tab', - 'widget_table', 'widget_text', - 'widget_tree', 'widget_tree_move', 'widget_window', - 'wiener_filter', 'window', - 'window', 'write_bmp', 'write_csv', 'write_gif', 'write_image', - 'write_jpeg', 'write_jpeg2000', 'write_nrif', 'write_pict', 'write_png', - 'write_ppm', 'write_spr', 'write_srf', 'write_sylk', 'write_tiff', - 'write_video', 'write_wav', 'write_wave', 'writeu', 'wset', - 'wshow', 'wtn', 'wv_applet', 'wv_cwt', 'wv_cw_wavelet', - 'wv_denoise', 'wv_dwt', 'wv_fn_coiflet', - 'wv_fn_daubechies', 'wv_fn_gaussian', - 'wv_fn_haar', 'wv_fn_morlet', 'wv_fn_paul', - 'wv_fn_symlet', 'wv_import_data', - 'wv_import_wavelet', 'wv_plot3d_wps', 'wv_plot_multires', - 'wv_pwt', 'wv_tool_denoise', - 'xbm_edit', 'xdisplayfile', 'xdxf', 'xfont', 'xinteranimate', - 'xloadct', 'xmanager', 'xmng_tmpl', 'xmtool', 'xobjview', - 'xobjview_rotate', 'xobjview_write_image', - 'xpalette', 'xpcolor', 'xplot3d', - 'xregistered', 'xroi', 'xsq_test', 'xsurface', 'xvaredit', - 'xvolume', 'xvolume_rotate', 'xvolume_write_image', - 'xyouts', 'zlib_compress', 'zlib_uncompress', 'zoom', 'zoom_24' - ]; - var builtins = wordRegexp(builtinArray); - - var keywordArray = [ - 'begin', 'end', 'endcase', 'endfor', - 'endwhile', 'endif', 'endrep', 'endforeach', - 'break', 'case', 'continue', 'for', - 'foreach', 'goto', 'if', 'then', 'else', - 'repeat', 'until', 'switch', 'while', - 'do', 'pro', 'function' - ]; - var keywords = wordRegexp(keywordArray); - - CodeMirror.registerHelper("hintWords", "idl", builtinArray.concat(keywordArray)); - - var identifiers = new RegExp('^[_a-z\xa1-\uffff][_a-z0-9\xa1-\uffff]*', 'i'); - - var singleOperators = /[+\-*&=<>\/@#~$]/; - var boolOperators = new RegExp('(and|or|eq|lt|le|gt|ge|ne|not)', 'i'); - - function tokenBase(stream) { - // whitespaces - if (stream.eatSpace()) return null; - - // Handle one line Comments - if (stream.match(';')) { - stream.skipToEnd(); - return 'comment'; - } - - // Handle Number Literals - if (stream.match(/^[0-9\.+-]/, false)) { - if (stream.match(/^[+-]?0x[0-9a-fA-F]+/)) - return 'number'; - if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)) - return 'number'; - if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/)) - return 'number'; - } - - // Handle Strings - if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } - if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } - - // Handle words - if (stream.match(keywords)) { return 'keyword'; } - if (stream.match(builtins)) { return 'builtin'; } - if (stream.match(identifiers)) { return 'variable'; } - - if (stream.match(singleOperators) || stream.match(boolOperators)) { - return 'operator'; } - - // Handle non-detected items - stream.next(); - return null; - }; - - CodeMirror.defineMode('idl', function() { - return { - token: function(stream) { - return tokenBase(stream); - } - }; - }); - - CodeMirror.defineMIME('text/x-idl', 'idl'); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/idl/index.html b/public/plugins/codemirror-5.17.0/mode/idl/index.html deleted file mode 100644 index 4c169e2..0000000 --- a/public/plugins/codemirror-5.17.0/mode/idl/index.html +++ /dev/null @@ -1,64 +0,0 @@ - - -CodeMirror: IDL mode - - - - - - - - - -
-

IDL mode

- -
- - -

MIME types defined: text/x-idl.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/index.html b/public/plugins/codemirror-5.17.0/mode/index.html deleted file mode 100644 index 732e0e5..0000000 --- a/public/plugins/codemirror-5.17.0/mode/index.html +++ /dev/null @@ -1,164 +0,0 @@ - - -CodeMirror: Language Modes - - - - - -
- -

Language modes

- -

This is a list of every mode in the distribution. Each mode lives -in a subdirectory of the mode/ directory, and typically -defines a single JavaScript file that implements the mode. Loading -such file will make the language available to CodeMirror, through -the mode -option.

- -
- -
- -
diff --git a/public/plugins/codemirror-5.17.0/mode/jade/index.html b/public/plugins/codemirror-5.17.0/mode/jade/index.html deleted file mode 100644 index e534981..0000000 --- a/public/plugins/codemirror-5.17.0/mode/jade/index.html +++ /dev/null @@ -1,70 +0,0 @@ - - -CodeMirror: Jade Templating Mode - - - - - - - - - - - - - -
-

Jade Templating Mode

-
- -

The Jade Templating Mode

-

Created by Forbes Lindesay. Managed as part of a Brackets extension at https://github.com/ForbesLindesay/jade-brackets.

-

MIME type defined: text/x-jade.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/jade/jade.js b/public/plugins/codemirror-5.17.0/mode/jade/jade.js deleted file mode 100644 index 51ed105..0000000 --- a/public/plugins/codemirror-5.17.0/mode/jade/jade.js +++ /dev/null @@ -1,590 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../javascript/javascript"), require("../css/css"), require("../htmlmixed/htmlmixed")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../javascript/javascript", "../css/css", "../htmlmixed/htmlmixed"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('jade', function (config) { - // token types - var KEYWORD = 'keyword'; - var DOCTYPE = 'meta'; - var ID = 'builtin'; - var CLASS = 'qualifier'; - - var ATTRS_NEST = { - '{': '}', - '(': ')', - '[': ']' - }; - - var jsMode = CodeMirror.getMode(config, 'javascript'); - - function State() { - this.javaScriptLine = false; - this.javaScriptLineExcludesColon = false; - - this.javaScriptArguments = false; - this.javaScriptArgumentsDepth = 0; - - this.isInterpolating = false; - this.interpolationNesting = 0; - - this.jsState = CodeMirror.startState(jsMode); - - this.restOfLine = ''; - - this.isIncludeFiltered = false; - this.isEach = false; - - this.lastTag = ''; - this.scriptType = ''; - - // Attributes Mode - this.isAttrs = false; - this.attrsNest = []; - this.inAttributeName = true; - this.attributeIsType = false; - this.attrValue = ''; - - // Indented Mode - this.indentOf = Infinity; - this.indentToken = ''; - - this.innerMode = null; - this.innerState = null; - - this.innerModeForLine = false; - } - /** - * Safely copy a state - * - * @return {State} - */ - State.prototype.copy = function () { - var res = new State(); - res.javaScriptLine = this.javaScriptLine; - res.javaScriptLineExcludesColon = this.javaScriptLineExcludesColon; - res.javaScriptArguments = this.javaScriptArguments; - res.javaScriptArgumentsDepth = this.javaScriptArgumentsDepth; - res.isInterpolating = this.isInterpolating; - res.interpolationNesting = this.interpolationNesting; - - res.jsState = CodeMirror.copyState(jsMode, this.jsState); - - res.innerMode = this.innerMode; - if (this.innerMode && this.innerState) { - res.innerState = CodeMirror.copyState(this.innerMode, this.innerState); - } - - res.restOfLine = this.restOfLine; - - res.isIncludeFiltered = this.isIncludeFiltered; - res.isEach = this.isEach; - res.lastTag = this.lastTag; - res.scriptType = this.scriptType; - res.isAttrs = this.isAttrs; - res.attrsNest = this.attrsNest.slice(); - res.inAttributeName = this.inAttributeName; - res.attributeIsType = this.attributeIsType; - res.attrValue = this.attrValue; - res.indentOf = this.indentOf; - res.indentToken = this.indentToken; - - res.innerModeForLine = this.innerModeForLine; - - return res; - }; - - function javaScript(stream, state) { - if (stream.sol()) { - // if javaScriptLine was set at end of line, ignore it - state.javaScriptLine = false; - state.javaScriptLineExcludesColon = false; - } - if (state.javaScriptLine) { - if (state.javaScriptLineExcludesColon && stream.peek() === ':') { - state.javaScriptLine = false; - state.javaScriptLineExcludesColon = false; - return; - } - var tok = jsMode.token(stream, state.jsState); - if (stream.eol()) state.javaScriptLine = false; - return tok || true; - } - } - function javaScriptArguments(stream, state) { - if (state.javaScriptArguments) { - if (state.javaScriptArgumentsDepth === 0 && stream.peek() !== '(') { - state.javaScriptArguments = false; - return; - } - if (stream.peek() === '(') { - state.javaScriptArgumentsDepth++; - } else if (stream.peek() === ')') { - state.javaScriptArgumentsDepth--; - } - if (state.javaScriptArgumentsDepth === 0) { - state.javaScriptArguments = false; - return; - } - - var tok = jsMode.token(stream, state.jsState); - return tok || true; - } - } - - function yieldStatement(stream) { - if (stream.match(/^yield\b/)) { - return 'keyword'; - } - } - - function doctype(stream) { - if (stream.match(/^(?:doctype) *([^\n]+)?/)) { - return DOCTYPE; - } - } - - function interpolation(stream, state) { - if (stream.match('#{')) { - state.isInterpolating = true; - state.interpolationNesting = 0; - return 'punctuation'; - } - } - - function interpolationContinued(stream, state) { - if (state.isInterpolating) { - if (stream.peek() === '}') { - state.interpolationNesting--; - if (state.interpolationNesting < 0) { - stream.next(); - state.isInterpolating = false; - return 'punctuation'; - } - } else if (stream.peek() === '{') { - state.interpolationNesting++; - } - return jsMode.token(stream, state.jsState) || true; - } - } - - function caseStatement(stream, state) { - if (stream.match(/^case\b/)) { - state.javaScriptLine = true; - return KEYWORD; - } - } - - function when(stream, state) { - if (stream.match(/^when\b/)) { - state.javaScriptLine = true; - state.javaScriptLineExcludesColon = true; - return KEYWORD; - } - } - - function defaultStatement(stream) { - if (stream.match(/^default\b/)) { - return KEYWORD; - } - } - - function extendsStatement(stream, state) { - if (stream.match(/^extends?\b/)) { - state.restOfLine = 'string'; - return KEYWORD; - } - } - - function append(stream, state) { - if (stream.match(/^append\b/)) { - state.restOfLine = 'variable'; - return KEYWORD; - } - } - function prepend(stream, state) { - if (stream.match(/^prepend\b/)) { - state.restOfLine = 'variable'; - return KEYWORD; - } - } - function block(stream, state) { - if (stream.match(/^block\b *(?:(prepend|append)\b)?/)) { - state.restOfLine = 'variable'; - return KEYWORD; - } - } - - function include(stream, state) { - if (stream.match(/^include\b/)) { - state.restOfLine = 'string'; - return KEYWORD; - } - } - - function includeFiltered(stream, state) { - if (stream.match(/^include:([a-zA-Z0-9\-]+)/, false) && stream.match('include')) { - state.isIncludeFiltered = true; - return KEYWORD; - } - } - - function includeFilteredContinued(stream, state) { - if (state.isIncludeFiltered) { - var tok = filter(stream, state); - state.isIncludeFiltered = false; - state.restOfLine = 'string'; - return tok; - } - } - - function mixin(stream, state) { - if (stream.match(/^mixin\b/)) { - state.javaScriptLine = true; - return KEYWORD; - } - } - - function call(stream, state) { - if (stream.match(/^\+([-\w]+)/)) { - if (!stream.match(/^\( *[-\w]+ *=/, false)) { - state.javaScriptArguments = true; - state.javaScriptArgumentsDepth = 0; - } - return 'variable'; - } - if (stream.match(/^\+#{/, false)) { - stream.next(); - state.mixinCallAfter = true; - return interpolation(stream, state); - } - } - function callArguments(stream, state) { - if (state.mixinCallAfter) { - state.mixinCallAfter = false; - if (!stream.match(/^\( *[-\w]+ *=/, false)) { - state.javaScriptArguments = true; - state.javaScriptArgumentsDepth = 0; - } - return true; - } - } - - function conditional(stream, state) { - if (stream.match(/^(if|unless|else if|else)\b/)) { - state.javaScriptLine = true; - return KEYWORD; - } - } - - function each(stream, state) { - if (stream.match(/^(- *)?(each|for)\b/)) { - state.isEach = true; - return KEYWORD; - } - } - function eachContinued(stream, state) { - if (state.isEach) { - if (stream.match(/^ in\b/)) { - state.javaScriptLine = true; - state.isEach = false; - return KEYWORD; - } else if (stream.sol() || stream.eol()) { - state.isEach = false; - } else if (stream.next()) { - while (!stream.match(/^ in\b/, false) && stream.next()); - return 'variable'; - } - } - } - - function whileStatement(stream, state) { - if (stream.match(/^while\b/)) { - state.javaScriptLine = true; - return KEYWORD; - } - } - - function tag(stream, state) { - var captures; - if (captures = stream.match(/^(\w(?:[-:\w]*\w)?)\/?/)) { - state.lastTag = captures[1].toLowerCase(); - if (state.lastTag === 'script') { - state.scriptType = 'application/javascript'; - } - return 'tag'; - } - } - - function filter(stream, state) { - if (stream.match(/^:([\w\-]+)/)) { - var innerMode; - if (config && config.innerModes) { - innerMode = config.innerModes(stream.current().substring(1)); - } - if (!innerMode) { - innerMode = stream.current().substring(1); - } - if (typeof innerMode === 'string') { - innerMode = CodeMirror.getMode(config, innerMode); - } - setInnerMode(stream, state, innerMode); - return 'atom'; - } - } - - function code(stream, state) { - if (stream.match(/^(!?=|-)/)) { - state.javaScriptLine = true; - return 'punctuation'; - } - } - - function id(stream) { - if (stream.match(/^#([\w-]+)/)) { - return ID; - } - } - - function className(stream) { - if (stream.match(/^\.([\w-]+)/)) { - return CLASS; - } - } - - function attrs(stream, state) { - if (stream.peek() == '(') { - stream.next(); - state.isAttrs = true; - state.attrsNest = []; - state.inAttributeName = true; - state.attrValue = ''; - state.attributeIsType = false; - return 'punctuation'; - } - } - - function attrsContinued(stream, state) { - if (state.isAttrs) { - if (ATTRS_NEST[stream.peek()]) { - state.attrsNest.push(ATTRS_NEST[stream.peek()]); - } - if (state.attrsNest[state.attrsNest.length - 1] === stream.peek()) { - state.attrsNest.pop(); - } else if (stream.eat(')')) { - state.isAttrs = false; - return 'punctuation'; - } - if (state.inAttributeName && stream.match(/^[^=,\)!]+/)) { - if (stream.peek() === '=' || stream.peek() === '!') { - state.inAttributeName = false; - state.jsState = CodeMirror.startState(jsMode); - if (state.lastTag === 'script' && stream.current().trim().toLowerCase() === 'type') { - state.attributeIsType = true; - } else { - state.attributeIsType = false; - } - } - return 'attribute'; - } - - var tok = jsMode.token(stream, state.jsState); - if (state.attributeIsType && tok === 'string') { - state.scriptType = stream.current().toString(); - } - if (state.attrsNest.length === 0 && (tok === 'string' || tok === 'variable' || tok === 'keyword')) { - try { - Function('', 'var x ' + state.attrValue.replace(/,\s*$/, '').replace(/^!/, '')); - state.inAttributeName = true; - state.attrValue = ''; - stream.backUp(stream.current().length); - return attrsContinued(stream, state); - } catch (ex) { - //not the end of an attribute - } - } - state.attrValue += stream.current(); - return tok || true; - } - } - - function attributesBlock(stream, state) { - if (stream.match(/^&attributes\b/)) { - state.javaScriptArguments = true; - state.javaScriptArgumentsDepth = 0; - return 'keyword'; - } - } - - function indent(stream) { - if (stream.sol() && stream.eatSpace()) { - return 'indent'; - } - } - - function comment(stream, state) { - if (stream.match(/^ *\/\/(-)?([^\n]*)/)) { - state.indentOf = stream.indentation(); - state.indentToken = 'comment'; - return 'comment'; - } - } - - function colon(stream) { - if (stream.match(/^: */)) { - return 'colon'; - } - } - - function text(stream, state) { - if (stream.match(/^(?:\| ?| )([^\n]+)/)) { - return 'string'; - } - if (stream.match(/^(<[^\n]*)/, false)) { - // html string - setInnerMode(stream, state, 'htmlmixed'); - state.innerModeForLine = true; - return innerMode(stream, state, true); - } - } - - function dot(stream, state) { - if (stream.eat('.')) { - var innerMode = null; - if (state.lastTag === 'script' && state.scriptType.toLowerCase().indexOf('javascript') != -1) { - innerMode = state.scriptType.toLowerCase().replace(/"|'/g, ''); - } else if (state.lastTag === 'style') { - innerMode = 'css'; - } - setInnerMode(stream, state, innerMode); - return 'dot'; - } - } - - function fail(stream) { - stream.next(); - return null; - } - - - function setInnerMode(stream, state, mode) { - mode = CodeMirror.mimeModes[mode] || mode; - mode = config.innerModes ? config.innerModes(mode) || mode : mode; - mode = CodeMirror.mimeModes[mode] || mode; - mode = CodeMirror.getMode(config, mode); - state.indentOf = stream.indentation(); - - if (mode && mode.name !== 'null') { - state.innerMode = mode; - } else { - state.indentToken = 'string'; - } - } - function innerMode(stream, state, force) { - if (stream.indentation() > state.indentOf || (state.innerModeForLine && !stream.sol()) || force) { - if (state.innerMode) { - if (!state.innerState) { - state.innerState = state.innerMode.startState ? CodeMirror.startState(state.innerMode, stream.indentation()) : {}; - } - return stream.hideFirstChars(state.indentOf + 2, function () { - return state.innerMode.token(stream, state.innerState) || true; - }); - } else { - stream.skipToEnd(); - return state.indentToken; - } - } else if (stream.sol()) { - state.indentOf = Infinity; - state.indentToken = null; - state.innerMode = null; - state.innerState = null; - } - } - function restOfLine(stream, state) { - if (stream.sol()) { - // if restOfLine was set at end of line, ignore it - state.restOfLine = ''; - } - if (state.restOfLine) { - stream.skipToEnd(); - var tok = state.restOfLine; - state.restOfLine = ''; - return tok; - } - } - - - function startState() { - return new State(); - } - function copyState(state) { - return state.copy(); - } - /** - * Get the next token in the stream - * - * @param {Stream} stream - * @param {State} state - */ - function nextToken(stream, state) { - var tok = innerMode(stream, state) - || restOfLine(stream, state) - || interpolationContinued(stream, state) - || includeFilteredContinued(stream, state) - || eachContinued(stream, state) - || attrsContinued(stream, state) - || javaScript(stream, state) - || javaScriptArguments(stream, state) - || callArguments(stream, state) - - || yieldStatement(stream, state) - || doctype(stream, state) - || interpolation(stream, state) - || caseStatement(stream, state) - || when(stream, state) - || defaultStatement(stream, state) - || extendsStatement(stream, state) - || append(stream, state) - || prepend(stream, state) - || block(stream, state) - || include(stream, state) - || includeFiltered(stream, state) - || mixin(stream, state) - || call(stream, state) - || conditional(stream, state) - || each(stream, state) - || whileStatement(stream, state) - || tag(stream, state) - || filter(stream, state) - || code(stream, state) - || id(stream, state) - || className(stream, state) - || attrs(stream, state) - || attributesBlock(stream, state) - || indent(stream, state) - || text(stream, state) - || comment(stream, state) - || colon(stream, state) - || dot(stream, state) - || fail(stream, state); - - return tok === true ? null : tok; - } - return { - startState: startState, - copyState: copyState, - token: nextToken - }; -}, 'javascript', 'css', 'htmlmixed'); - -CodeMirror.defineMIME('text/x-jade', 'jade'); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/javascript/index.html b/public/plugins/codemirror-5.17.0/mode/javascript/index.html deleted file mode 100644 index 592a133..0000000 --- a/public/plugins/codemirror-5.17.0/mode/javascript/index.html +++ /dev/null @@ -1,114 +0,0 @@ - - -CodeMirror: JavaScript mode - - - - - - - - - - - - -
-

JavaScript mode

- - -
- - - -

- JavaScript mode supports several configuration options: -

    -
  • json which will set the mode to expect JSON - data rather than a JavaScript program.
  • -
  • jsonld which will set the mode to expect - JSON-LD linked data rather - than a JavaScript program (demo).
  • -
  • typescript which will activate additional - syntax highlighting and some other things for TypeScript code - (demo).
  • -
  • statementIndent which (given a number) will - determine the amount of indentation to use for statements - continued on a new line.
  • -
  • wordCharacters, a regexp that indicates which - characters should be considered part of an identifier. - Defaults to /[\w$]/, which does not handle - non-ASCII identifiers. Can be set to something more elaborate - to improve Unicode support.
  • -
-

- -

MIME types defined: text/javascript, application/json, application/ld+json, text/typescript, application/typescript.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/javascript/javascript.js b/public/plugins/codemirror-5.17.0/mode/javascript/javascript.js deleted file mode 100644 index 3909c85..0000000 --- a/public/plugins/codemirror-5.17.0/mode/javascript/javascript.js +++ /dev/null @@ -1,743 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// TODO actually recognize syntax of TypeScript constructs - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -function expressionAllowed(stream, state, backUp) { - return /^(?:operator|sof|keyword c|case|new|[\[{}\(,;:]|=>)$/.test(state.lastType) || - (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) -} - -CodeMirror.defineMode("javascript", function(config, parserConfig) { - var indentUnit = config.indentUnit; - var statementIndent = parserConfig.statementIndent; - var jsonldMode = parserConfig.jsonld; - var jsonMode = parserConfig.json || jsonldMode; - var isTS = parserConfig.typescript; - var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; - - // Tokenizer - - var keywords = function(){ - function kw(type) {return {type: type, style: "keyword"};} - var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"); - var operator = kw("operator"), atom = {type: "atom", style: "atom"}; - - var jsKeywords = { - "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, - "return": C, "break": C, "continue": C, "new": kw("new"), "delete": C, "throw": C, "debugger": C, - "var": kw("var"), "const": kw("var"), "let": kw("var"), - "function": kw("function"), "catch": kw("catch"), - "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), - "in": operator, "typeof": operator, "instanceof": operator, - "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, - "this": kw("this"), "class": kw("class"), "super": kw("atom"), - "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, - "await": C, "async": kw("async") - }; - - // Extend the 'normal' keywords with the TypeScript language extensions - if (isTS) { - var type = {type: "variable", style: "variable-3"}; - var tsKeywords = { - // object-like things - "interface": kw("class"), - "implements": C, - "namespace": C, - "module": kw("module"), - "enum": kw("module"), - - // scope modifiers - "public": kw("modifier"), - "private": kw("modifier"), - "protected": kw("modifier"), - "abstract": kw("modifier"), - - // operators - "as": operator, - - // types - "string": type, "number": type, "boolean": type, "any": type - }; - - for (var attr in tsKeywords) { - jsKeywords[attr] = tsKeywords[attr]; - } - } - - return jsKeywords; - }(); - - var isOperatorChar = /[+\-*&%=<>!?|~^]/; - var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; - - function readRegexp(stream) { - var escaped = false, next, inSet = false; - while ((next = stream.next()) != null) { - if (!escaped) { - if (next == "/" && !inSet) return; - if (next == "[") inSet = true; - else if (inSet && next == "]") inSet = false; - } - escaped = !escaped && next == "\\"; - } - } - - // Used as scratch variables to communicate multiple values without - // consing up tons of objects. - var type, content; - function ret(tp, style, cont) { - type = tp; content = cont; - return style; - } - function tokenBase(stream, state) { - var ch = stream.next(); - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } else if (ch == "." && stream.match(/^\d+(?:[eE][+\-]?\d+)?/)) { - return ret("number", "number"); - } else if (ch == "." && stream.match("..")) { - return ret("spread", "meta"); - } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { - return ret(ch); - } else if (ch == "=" && stream.eat(">")) { - return ret("=>", "operator"); - } else if (ch == "0" && stream.eat(/x/i)) { - stream.eatWhile(/[\da-f]/i); - return ret("number", "number"); - } else if (ch == "0" && stream.eat(/o/i)) { - stream.eatWhile(/[0-7]/i); - return ret("number", "number"); - } else if (ch == "0" && stream.eat(/b/i)) { - stream.eatWhile(/[01]/i); - return ret("number", "number"); - } else if (/\d/.test(ch)) { - stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/); - return ret("number", "number"); - } else if (ch == "/") { - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } else if (stream.eat("/")) { - stream.skipToEnd(); - return ret("comment", "comment"); - } else if (expressionAllowed(stream, state, 1)) { - readRegexp(stream); - stream.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/); - return ret("regexp", "string-2"); - } else { - stream.eatWhile(isOperatorChar); - return ret("operator", "operator", stream.current()); - } - } else if (ch == "`") { - state.tokenize = tokenQuasi; - return tokenQuasi(stream, state); - } else if (ch == "#") { - stream.skipToEnd(); - return ret("error", "error"); - } else if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return ret("operator", "operator", stream.current()); - } else if (wordRE.test(ch)) { - stream.eatWhile(wordRE); - var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word]; - return (known && state.lastType != ".") ? ret(known.type, known.style, word) : - ret("variable", "variable", word); - } - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next; - if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ - state.tokenize = tokenBase; - return ret("jsonld-keyword", "meta"); - } - while ((next = stream.next()) != null) { - if (next == quote && !escaped) break; - escaped = !escaped && next == "\\"; - } - if (!escaped) state.tokenize = tokenBase; - return ret("string", "string"); - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return ret("comment", "comment"); - } - - function tokenQuasi(stream, state) { - var escaped = false, next; - while ((next = stream.next()) != null) { - if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { - state.tokenize = tokenBase; - break; - } - escaped = !escaped && next == "\\"; - } - return ret("quasi", "string-2", stream.current()); - } - - var brackets = "([{}])"; - // This is a crude lookahead trick to try and notice that we're - // parsing the argument patterns for a fat-arrow function before we - // actually hit the arrow token. It only works if the arrow is on - // the same line as the arguments and there's no strange noise - // (comments) in between. Fallback is to only notice when we hit the - // arrow, and not declare the arguments as locals for the arrow - // body. - function findFatArrow(stream, state) { - if (state.fatArrowAt) state.fatArrowAt = null; - var arrow = stream.string.indexOf("=>", stream.start); - if (arrow < 0) return; - - var depth = 0, sawSomething = false; - for (var pos = arrow - 1; pos >= 0; --pos) { - var ch = stream.string.charAt(pos); - var bracket = brackets.indexOf(ch); - if (bracket >= 0 && bracket < 3) { - if (!depth) { ++pos; break; } - if (--depth == 0) break; - } else if (bracket >= 3 && bracket < 6) { - ++depth; - } else if (wordRE.test(ch)) { - sawSomething = true; - } else if (/["'\/]/.test(ch)) { - return; - } else if (sawSomething && !depth) { - ++pos; - break; - } - } - if (sawSomething && !depth) state.fatArrowAt = pos; - } - - // Parser - - var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true, "jsonld-keyword": true}; - - function JSLexical(indented, column, type, align, prev, info) { - this.indented = indented; - this.column = column; - this.type = type; - this.prev = prev; - this.info = info; - if (align != null) this.align = align; - } - - function inScope(state, varname) { - for (var v = state.localVars; v; v = v.next) - if (v.name == varname) return true; - for (var cx = state.context; cx; cx = cx.prev) { - for (var v = cx.vars; v; v = v.next) - if (v.name == varname) return true; - } - } - - function parseJS(state, style, type, content, stream) { - var cc = state.cc; - // Communicate our context to the combinators. - // (Less wasteful than consing up a hundred closures on every call.) - cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; - - if (!state.lexical.hasOwnProperty("align")) - state.lexical.align = true; - - while(true) { - var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; - if (combinator(type, content)) { - while(cc.length && cc[cc.length - 1].lex) - cc.pop()(); - if (cx.marked) return cx.marked; - if (type == "variable" && inScope(state, content)) return "variable-2"; - return style; - } - } - } - - // Combinator utils - - var cx = {state: null, column: null, marked: null, cc: null}; - function pass() { - for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); - } - function cont() { - pass.apply(null, arguments); - return true; - } - function register(varname) { - function inList(list) { - for (var v = list; v; v = v.next) - if (v.name == varname) return true; - return false; - } - var state = cx.state; - cx.marked = "def"; - if (state.context) { - if (inList(state.localVars)) return; - state.localVars = {name: varname, next: state.localVars}; - } else { - if (inList(state.globalVars)) return; - if (parserConfig.globalVars) - state.globalVars = {name: varname, next: state.globalVars}; - } - } - - // Combinators - - var defaultVars = {name: "this", next: {name: "arguments"}}; - function pushcontext() { - cx.state.context = {prev: cx.state.context, vars: cx.state.localVars}; - cx.state.localVars = defaultVars; - } - function popcontext() { - cx.state.localVars = cx.state.context.vars; - cx.state.context = cx.state.context.prev; - } - function pushlex(type, info) { - var result = function() { - var state = cx.state, indent = state.indented; - if (state.lexical.type == "stat") indent = state.lexical.indented; - else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) - indent = outer.indented; - state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); - }; - result.lex = true; - return result; - } - function poplex() { - var state = cx.state; - if (state.lexical.prev) { - if (state.lexical.type == ")") - state.indented = state.lexical.indented; - state.lexical = state.lexical.prev; - } - } - poplex.lex = true; - - function expect(wanted) { - function exp(type) { - if (type == wanted) return cont(); - else if (wanted == ";") return pass(); - else return cont(exp); - }; - return exp; - } - - function statement(type, value) { - if (type == "var") return cont(pushlex("vardef", value.length), vardef, expect(";"), poplex); - if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex); - if (type == "keyword b") return cont(pushlex("form"), statement, poplex); - if (type == "{") return cont(pushlex("}"), block, poplex); - if (type == ";") return cont(); - if (type == "if") { - if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) - cx.state.cc.pop()(); - return cont(pushlex("form"), expression, statement, poplex, maybeelse); - } - if (type == "function") return cont(functiondef); - if (type == "for") return cont(pushlex("form"), forspec, statement, poplex); - if (type == "variable") return cont(pushlex("stat"), maybelabel); - if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"), - block, poplex, poplex); - if (type == "case") return cont(expression, expect(":")); - if (type == "default") return cont(expect(":")); - if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"), - statement, poplex, popcontext); - if (type == "class") return cont(pushlex("form"), className, poplex); - if (type == "export") return cont(pushlex("stat"), afterExport, poplex); - if (type == "import") return cont(pushlex("stat"), afterImport, poplex); - if (type == "module") return cont(pushlex("form"), pattern, pushlex("}"), expect("{"), block, poplex, poplex) - if (type == "async") return cont(statement) - return pass(pushlex("stat"), expression, expect(";"), poplex); - } - function expression(type) { - return expressionInner(type, false); - } - function expressionNoComma(type) { - return expressionInner(type, true); - } - function expressionInner(type, noComma) { - if (cx.state.fatArrowAt == cx.stream.start) { - var body = noComma ? arrowBodyNoComma : arrowBody; - if (type == "(") return cont(pushcontext, pushlex(")"), commasep(pattern, ")"), poplex, expect("=>"), body, popcontext); - else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); - } - - var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; - if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); - if (type == "function") return cont(functiondef, maybeop); - if (type == "keyword c" || type == "async") return cont(noComma ? maybeexpressionNoComma : maybeexpression); - if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); - if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); - if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); - if (type == "{") return contCommasep(objprop, "}", null, maybeop); - if (type == "quasi") return pass(quasi, maybeop); - if (type == "new") return cont(maybeTarget(noComma)); - return cont(); - } - function maybeexpression(type) { - if (type.match(/[;\}\)\],]/)) return pass(); - return pass(expression); - } - function maybeexpressionNoComma(type) { - if (type.match(/[;\}\)\],]/)) return pass(); - return pass(expressionNoComma); - } - - function maybeoperatorComma(type, value) { - if (type == ",") return cont(expression); - return maybeoperatorNoComma(type, value, false); - } - function maybeoperatorNoComma(type, value, noComma) { - var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; - var expr = noComma == false ? expression : expressionNoComma; - if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); - if (type == "operator") { - if (/\+\+|--/.test(value)) return cont(me); - if (value == "?") return cont(expression, expect(":"), expr); - return cont(expr); - } - if (type == "quasi") { return pass(quasi, me); } - if (type == ";") return; - if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); - if (type == ".") return cont(property, me); - if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); - } - function quasi(type, value) { - if (type != "quasi") return pass(); - if (value.slice(value.length - 2) != "${") return cont(quasi); - return cont(expression, continueQuasi); - } - function continueQuasi(type) { - if (type == "}") { - cx.marked = "string-2"; - cx.state.tokenize = tokenQuasi; - return cont(quasi); - } - } - function arrowBody(type) { - findFatArrow(cx.stream, cx.state); - return pass(type == "{" ? statement : expression); - } - function arrowBodyNoComma(type) { - findFatArrow(cx.stream, cx.state); - return pass(type == "{" ? statement : expressionNoComma); - } - function maybeTarget(noComma) { - return function(type) { - if (type == ".") return cont(noComma ? targetNoComma : target); - else return pass(noComma ? expressionNoComma : expression); - }; - } - function target(_, value) { - if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); } - } - function targetNoComma(_, value) { - if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); } - } - function maybelabel(type) { - if (type == ":") return cont(poplex, statement); - return pass(maybeoperatorComma, expect(";"), poplex); - } - function property(type) { - if (type == "variable") {cx.marked = "property"; return cont();} - } - function objprop(type, value) { - if (type == "async") return cont(objprop); - if (type == "variable" || cx.style == "keyword") { - cx.marked = "property"; - if (value == "get" || value == "set") return cont(getterSetter); - return cont(afterprop); - } else if (type == "number" || type == "string") { - cx.marked = jsonldMode ? "property" : (cx.style + " property"); - return cont(afterprop); - } else if (type == "jsonld-keyword") { - return cont(afterprop); - } else if (type == "modifier") { - return cont(objprop) - } else if (type == "[") { - return cont(expression, expect("]"), afterprop); - } else if (type == "spread") { - return cont(expression); - } - } - function getterSetter(type) { - if (type != "variable") return pass(afterprop); - cx.marked = "property"; - return cont(functiondef); - } - function afterprop(type) { - if (type == ":") return cont(expressionNoComma); - if (type == "(") return pass(functiondef); - } - function commasep(what, end) { - function proceed(type, value) { - if (type == ",") { - var lex = cx.state.lexical; - if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; - return cont(function(type, value) { - if (type == end || value == end) return pass() - return pass(what) - }, proceed); - } - if (type == end || value == end) return cont(); - return cont(expect(end)); - } - return function(type, value) { - if (type == end || value == end) return cont(); - return pass(what, proceed); - }; - } - function contCommasep(what, end, info) { - for (var i = 3; i < arguments.length; i++) - cx.cc.push(arguments[i]); - return cont(pushlex(end, info), commasep(what, end), poplex); - } - function block(type) { - if (type == "}") return cont(); - return pass(statement, block); - } - function maybetype(type) { - if (isTS && type == ":") return cont(typeexpr); - } - function maybedefault(_, value) { - if (value == "=") return cont(expressionNoComma); - } - function typeexpr(type) { - if (type == "variable") {cx.marked = "variable-3"; return cont(afterType);} - } - function afterType(type, value) { - if (value == "<") return cont(commasep(typeexpr, ">"), afterType) - if (type == "[") return cont(expect("]"), afterType) - } - function vardef() { - return pass(pattern, maybetype, maybeAssign, vardefCont); - } - function pattern(type, value) { - if (type == "modifier") return cont(pattern) - if (type == "variable") { register(value); return cont(); } - if (type == "spread") return cont(pattern); - if (type == "[") return contCommasep(pattern, "]"); - if (type == "{") return contCommasep(proppattern, "}"); - } - function proppattern(type, value) { - if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { - register(value); - return cont(maybeAssign); - } - if (type == "variable") cx.marked = "property"; - if (type == "spread") return cont(pattern); - if (type == "}") return pass(); - return cont(expect(":"), pattern, maybeAssign); - } - function maybeAssign(_type, value) { - if (value == "=") return cont(expressionNoComma); - } - function vardefCont(type) { - if (type == ",") return cont(vardef); - } - function maybeelse(type, value) { - if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); - } - function forspec(type) { - if (type == "(") return cont(pushlex(")"), forspec1, expect(")"), poplex); - } - function forspec1(type) { - if (type == "var") return cont(vardef, expect(";"), forspec2); - if (type == ";") return cont(forspec2); - if (type == "variable") return cont(formaybeinof); - return pass(expression, expect(";"), forspec2); - } - function formaybeinof(_type, value) { - if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } - return cont(maybeoperatorComma, forspec2); - } - function forspec2(type, value) { - if (type == ";") return cont(forspec3); - if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression); } - return pass(expression, expect(";"), forspec3); - } - function forspec3(type) { - if (type != ")") cont(expression); - } - function functiondef(type, value) { - if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} - if (type == "variable") {register(value); return cont(functiondef);} - if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, maybetype, statement, popcontext); - } - function funarg(type) { - if (type == "spread") return cont(funarg); - return pass(pattern, maybetype, maybedefault); - } - function className(type, value) { - if (type == "variable") {register(value); return cont(classNameAfter);} - } - function classNameAfter(type, value) { - if (value == "extends") return cont(expression, classNameAfter); - if (type == "{") return cont(pushlex("}"), classBody, poplex); - } - function classBody(type, value) { - if (type == "variable" || cx.style == "keyword") { - if (value == "static") { - cx.marked = "keyword"; - return cont(classBody); - } - cx.marked = "property"; - if (value == "get" || value == "set") return cont(classGetterSetter, functiondef, classBody); - return cont(functiondef, classBody); - } - if (value == "*") { - cx.marked = "keyword"; - return cont(classBody); - } - if (type == ";") return cont(classBody); - if (type == "}") return cont(); - } - function classGetterSetter(type) { - if (type != "variable") return pass(); - cx.marked = "property"; - return cont(); - } - function afterExport(_type, value) { - if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } - if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } - return pass(statement); - } - function afterImport(type) { - if (type == "string") return cont(); - return pass(importSpec, maybeFrom); - } - function importSpec(type, value) { - if (type == "{") return contCommasep(importSpec, "}"); - if (type == "variable") register(value); - if (value == "*") cx.marked = "keyword"; - return cont(maybeAs); - } - function maybeAs(_type, value) { - if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } - } - function maybeFrom(_type, value) { - if (value == "from") { cx.marked = "keyword"; return cont(expression); } - } - function arrayLiteral(type) { - if (type == "]") return cont(); - return pass(expressionNoComma, commasep(expressionNoComma, "]")); - } - - function isContinuedStatement(state, textAfter) { - return state.lastType == "operator" || state.lastType == "," || - isOperatorChar.test(textAfter.charAt(0)) || - /[,.]/.test(textAfter.charAt(0)); - } - - // Interface - - return { - startState: function(basecolumn) { - var state = { - tokenize: tokenBase, - lastType: "sof", - cc: [], - lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), - localVars: parserConfig.localVars, - context: parserConfig.localVars && {vars: parserConfig.localVars}, - indented: basecolumn || 0 - }; - if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") - state.globalVars = parserConfig.globalVars; - return state; - }, - - token: function(stream, state) { - if (stream.sol()) { - if (!state.lexical.hasOwnProperty("align")) - state.lexical.align = false; - state.indented = stream.indentation(); - findFatArrow(stream, state); - } - if (state.tokenize != tokenComment && stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - if (type == "comment") return style; - state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; - return parseJS(state, style, type, content, stream); - }, - - indent: function(state, textAfter) { - if (state.tokenize == tokenComment) return CodeMirror.Pass; - if (state.tokenize != tokenBase) return 0; - var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical; - // Kludge to prevent 'maybelse' from blocking lexical scope pops - if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { - var c = state.cc[i]; - if (c == poplex) lexical = lexical.prev; - else if (c != maybeelse) break; - } - if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev; - if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") - lexical = lexical.prev; - var type = lexical.type, closing = firstChar == type; - - if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info + 1 : 0); - else if (type == "form" && firstChar == "{") return lexical.indented; - else if (type == "form") return lexical.indented + indentUnit; - else if (type == "stat") - return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); - else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) - return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); - else if (lexical.align) return lexical.column + (closing ? 0 : 1); - else return lexical.indented + (closing ? 0 : indentUnit); - }, - - electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, - blockCommentStart: jsonMode ? null : "/*", - blockCommentEnd: jsonMode ? null : "*/", - lineComment: jsonMode ? null : "//", - fold: "brace", - closeBrackets: "()[]{}''\"\"``", - - helperType: jsonMode ? "json" : "javascript", - jsonldMode: jsonldMode, - jsonMode: jsonMode, - - expressionAllowed: expressionAllowed, - skipExpression: function(state) { - var top = state.cc[state.cc.length - 1] - if (top == expression || top == expressionNoComma) state.cc.pop() - } - }; -}); - -CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); - -CodeMirror.defineMIME("text/javascript", "javascript"); -CodeMirror.defineMIME("text/ecmascript", "javascript"); -CodeMirror.defineMIME("application/javascript", "javascript"); -CodeMirror.defineMIME("application/x-javascript", "javascript"); -CodeMirror.defineMIME("application/ecmascript", "javascript"); -CodeMirror.defineMIME("application/json", {name: "javascript", json: true}); -CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true}); -CodeMirror.defineMIME("application/ld+json", {name: "javascript", jsonld: true}); -CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); -CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/javascript/json-ld.html b/public/plugins/codemirror-5.17.0/mode/javascript/json-ld.html deleted file mode 100644 index 3a37f0b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/javascript/json-ld.html +++ /dev/null @@ -1,72 +0,0 @@ - - -CodeMirror: JSON-LD mode - - - - - - - - - - - - -
-

JSON-LD mode

- - -
- - - -

This is a specialization of the JavaScript mode.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/javascript/test.js b/public/plugins/codemirror-5.17.0/mode/javascript/test.js deleted file mode 100644 index 8916b75..0000000 --- a/public/plugins/codemirror-5.17.0/mode/javascript/test.js +++ /dev/null @@ -1,207 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "javascript"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT("locals", - "[keyword function] [def foo]([def a], [def b]) { [keyword var] [def c] [operator =] [number 10]; [keyword return] [variable-2 a] [operator +] [variable-2 c] [operator +] [variable d]; }"); - - MT("comma-and-binop", - "[keyword function](){ [keyword var] [def x] [operator =] [number 1] [operator +] [number 2], [def y]; }"); - - MT("destructuring", - "([keyword function]([def a], [[[def b], [def c] ]]) {", - " [keyword let] {[def d], [property foo]: [def c][operator =][number 10], [def x]} [operator =] [variable foo]([variable-2 a]);", - " [[[variable-2 c], [variable y] ]] [operator =] [variable-2 c];", - "})();"); - - MT("destructure_trailing_comma", - "[keyword let] {[def a], [def b],} [operator =] [variable foo];", - "[keyword let] [def c];"); // Parser still in good state? - - MT("class_body", - "[keyword class] [def Foo] {", - " [property constructor]() {}", - " [property sayName]() {", - " [keyword return] [string-2 `foo${][variable foo][string-2 }oo`];", - " }", - "}"); - - MT("class", - "[keyword class] [def Point] [keyword extends] [variable SuperThing] {", - " [property get] [property prop]() { [keyword return] [number 24]; }", - " [property constructor]([def x], [def y]) {", - " [keyword super]([string 'something']);", - " [keyword this].[property x] [operator =] [variable-2 x];", - " }", - "}"); - - MT("import", - "[keyword function] [def foo]() {", - " [keyword import] [def $] [keyword from] [string 'jquery'];", - " [keyword import] { [def encrypt], [def decrypt] } [keyword from] [string 'crypto'];", - "}"); - - MT("import_trailing_comma", - "[keyword import] {[def foo], [def bar],} [keyword from] [string 'baz']") - - MT("const", - "[keyword function] [def f]() {", - " [keyword const] [[ [def a], [def b] ]] [operator =] [[ [number 1], [number 2] ]];", - "}"); - - MT("for/of", - "[keyword for]([keyword let] [def of] [keyword of] [variable something]) {}"); - - MT("generator", - "[keyword function*] [def repeat]([def n]) {", - " [keyword for]([keyword var] [def i] [operator =] [number 0]; [variable-2 i] [operator <] [variable-2 n]; [operator ++][variable-2 i])", - " [keyword yield] [variable-2 i];", - "}"); - - MT("quotedStringAddition", - "[keyword let] [def f] [operator =] [variable a] [operator +] [string 'fatarrow'] [operator +] [variable c];"); - - MT("quotedFatArrow", - "[keyword let] [def f] [operator =] [variable a] [operator +] [string '=>'] [operator +] [variable c];"); - - MT("fatArrow", - "[variable array].[property filter]([def a] [operator =>] [variable-2 a] [operator +] [number 1]);", - "[variable a];", // No longer in scope - "[keyword let] [def f] [operator =] ([[ [def a], [def b] ]], [def c]) [operator =>] [variable-2 a] [operator +] [variable-2 c];", - "[variable c];"); - - MT("spread", - "[keyword function] [def f]([def a], [meta ...][def b]) {", - " [variable something]([variable-2 a], [meta ...][variable-2 b]);", - "}"); - - MT("quasi", - "[variable re][string-2 `fofdlakj${][variable x] [operator +] ([variable re][string-2 `foo`]) [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); - - MT("quasi_no_function", - "[variable x] [operator =] [string-2 `fofdlakj${][variable x] [operator +] [string-2 `foo`] [operator +] [number 1][string-2 }fdsa`] [operator +] [number 2]"); - - MT("indent_statement", - "[keyword var] [def x] [operator =] [number 10]", - "[variable x] [operator +=] [variable y] [operator +]", - " [atom Infinity]", - "[keyword debugger];"); - - MT("indent_if", - "[keyword if] ([number 1])", - " [keyword break];", - "[keyword else] [keyword if] ([number 2])", - " [keyword continue];", - "[keyword else]", - " [number 10];", - "[keyword if] ([number 1]) {", - " [keyword break];", - "} [keyword else] [keyword if] ([number 2]) {", - " [keyword continue];", - "} [keyword else] {", - " [number 10];", - "}"); - - MT("indent_for", - "[keyword for] ([keyword var] [def i] [operator =] [number 0];", - " [variable i] [operator <] [number 100];", - " [variable i][operator ++])", - " [variable doSomething]([variable i]);", - "[keyword debugger];"); - - MT("indent_c_style", - "[keyword function] [def foo]()", - "{", - " [keyword debugger];", - "}"); - - MT("indent_else", - "[keyword for] (;;)", - " [keyword if] ([variable foo])", - " [keyword if] ([variable bar])", - " [number 1];", - " [keyword else]", - " [number 2];", - " [keyword else]", - " [number 3];"); - - MT("indent_funarg", - "[variable foo]([number 10000],", - " [keyword function]([def a]) {", - " [keyword debugger];", - "};"); - - MT("indent_below_if", - "[keyword for] (;;)", - " [keyword if] ([variable foo])", - " [number 1];", - "[number 2];"); - - MT("multilinestring", - "[keyword var] [def x] [operator =] [string 'foo\\]", - "[string bar'];"); - - MT("scary_regexp", - "[string-2 /foo[[/]]bar/];"); - - MT("indent_strange_array", - "[keyword var] [def x] [operator =] [[", - " [number 1],,", - " [number 2],", - "]];", - "[number 10];"); - - MT("param_default", - "[keyword function] [def foo]([def x] [operator =] [string-2 `foo${][number 10][string-2 }bar`]) {", - " [keyword return] [variable-2 x];", - "}"); - - MT("new_target", - "[keyword function] [def F]([def target]) {", - " [keyword if] ([variable-2 target] [operator &&] [keyword new].[keyword target].[property name]) {", - " [keyword return] [keyword new]", - " .[keyword target];", - " }", - "}"); - - var jsonld_mode = CodeMirror.getMode( - {indentUnit: 2}, - {name: "javascript", jsonld: true} - ); - function LD(name) { - test.mode(name, jsonld_mode, Array.prototype.slice.call(arguments, 1)); - } - - LD("json_ld_keywords", - '{', - ' [meta "@context"]: {', - ' [meta "@base"]: [string "http://example.com"],', - ' [meta "@vocab"]: [string "http://xmlns.com/foaf/0.1/"],', - ' [property "likesFlavor"]: {', - ' [meta "@container"]: [meta "@list"]', - ' [meta "@reverse"]: [string "@beFavoriteOf"]', - ' },', - ' [property "nick"]: { [meta "@container"]: [meta "@set"] },', - ' [property "nick"]: { [meta "@container"]: [meta "@index"] }', - ' },', - ' [meta "@graph"]: [[ {', - ' [meta "@id"]: [string "http://dbpedia.org/resource/John_Lennon"],', - ' [property "name"]: [string "John Lennon"],', - ' [property "modified"]: {', - ' [meta "@value"]: [string "2010-05-29T14:17:39+02:00"],', - ' [meta "@type"]: [string "http://www.w3.org/2001/XMLSchema#dateTime"]', - ' }', - ' } ]]', - '}'); - - LD("json_ld_fake", - '{', - ' [property "@fake"]: [string "@fake"],', - ' [property "@contextual"]: [string "@identifier"],', - ' [property "user@domain.com"]: [string "@graphical"],', - ' [property "@ID"]: [string "@@ID"]', - '}'); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/javascript/typescript.html b/public/plugins/codemirror-5.17.0/mode/javascript/typescript.html deleted file mode 100644 index 2cfc538..0000000 --- a/public/plugins/codemirror-5.17.0/mode/javascript/typescript.html +++ /dev/null @@ -1,61 +0,0 @@ - - -CodeMirror: TypeScript mode - - - - - - - - - -
-

TypeScript mode

- - -
- - - -

This is a specialization of the JavaScript mode.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/jinja2/index.html b/public/plugins/codemirror-5.17.0/mode/jinja2/index.html deleted file mode 100644 index 5a70e91..0000000 --- a/public/plugins/codemirror-5.17.0/mode/jinja2/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - -CodeMirror: Jinja2 mode - - - - - - - - - -
-

Jinja2 mode

-
- -
diff --git a/public/plugins/codemirror-5.17.0/mode/jinja2/jinja2.js b/public/plugins/codemirror-5.17.0/mode/jinja2/jinja2.js deleted file mode 100644 index ed19558..0000000 --- a/public/plugins/codemirror-5.17.0/mode/jinja2/jinja2.js +++ /dev/null @@ -1,142 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("jinja2", function() { - var keywords = ["and", "as", "block", "endblock", "by", "cycle", "debug", "else", "elif", - "extends", "filter", "endfilter", "firstof", "for", - "endfor", "if", "endif", "ifchanged", "endifchanged", - "ifequal", "endifequal", "ifnotequal", - "endifnotequal", "in", "include", "load", "not", "now", "or", - "parsed", "regroup", "reversed", "spaceless", - "endspaceless", "ssi", "templatetag", "openblock", - "closeblock", "openvariable", "closevariable", - "openbrace", "closebrace", "opencomment", - "closecomment", "widthratio", "url", "with", "endwith", - "get_current_language", "trans", "endtrans", "noop", "blocktrans", - "endblocktrans", "get_available_languages", - "get_current_language_bidi", "plural"], - operator = /^[+\-*&%=<>!?|~^]/, - sign = /^[:\[\(\{]/, - atom = ["true", "false"], - number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; - - keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); - atom = new RegExp("((" + atom.join(")|(") + "))\\b"); - - function tokenBase (stream, state) { - var ch = stream.peek(); - - //Comment - if (state.incomment) { - if(!stream.skipTo("#}")) { - stream.skipToEnd(); - } else { - stream.eatWhile(/\#|}/); - state.incomment = false; - } - return "comment"; - //Tag - } else if (state.intag) { - //After operator - if(state.operator) { - state.operator = false; - if(stream.match(atom)) { - return "atom"; - } - if(stream.match(number)) { - return "number"; - } - } - //After sign - if(state.sign) { - state.sign = false; - if(stream.match(atom)) { - return "atom"; - } - if(stream.match(number)) { - return "number"; - } - } - - if(state.instring) { - if(ch == state.instring) { - state.instring = false; - } - stream.next(); - return "string"; - } else if(ch == "'" || ch == '"') { - state.instring = ch; - stream.next(); - return "string"; - } else if(stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { - state.intag = false; - return "tag"; - } else if(stream.match(operator)) { - state.operator = true; - return "operator"; - } else if(stream.match(sign)) { - state.sign = true; - } else { - if(stream.eat(" ") || stream.sol()) { - if(stream.match(keywords)) { - return "keyword"; - } - if(stream.match(atom)) { - return "atom"; - } - if(stream.match(number)) { - return "number"; - } - if(stream.sol()) { - stream.next(); - } - } else { - stream.next(); - } - - } - return "variable"; - } else if (stream.eat("{")) { - if (ch = stream.eat("#")) { - state.incomment = true; - if(!stream.skipTo("#}")) { - stream.skipToEnd(); - } else { - stream.eatWhile(/\#|}/); - state.incomment = false; - } - return "comment"; - //Open tag - } else if (ch = stream.eat(/\{|%/)) { - //Cache close tag - state.intag = ch; - if(ch == "{") { - state.intag = "}"; - } - stream.eat("-"); - return "tag"; - } - } - stream.next(); - }; - - return { - startState: function () { - return {tokenize: tokenBase}; - }, - token: function (stream, state) { - return state.tokenize(stream, state); - } - }; - }); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/jsx/index.html b/public/plugins/codemirror-5.17.0/mode/jsx/index.html deleted file mode 100644 index cb51edb..0000000 --- a/public/plugins/codemirror-5.17.0/mode/jsx/index.html +++ /dev/null @@ -1,89 +0,0 @@ - - -CodeMirror: JSX mode - - - - - - - - - - - -
-

JSX mode

- -
- - - -

JSX Mode for React's -JavaScript syntax extension.

- -

MIME types defined: text/jsx.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/jsx/jsx.js b/public/plugins/codemirror-5.17.0/mode/jsx/jsx.js deleted file mode 100644 index aff01b8..0000000 --- a/public/plugins/codemirror-5.17.0/mode/jsx/jsx.js +++ /dev/null @@ -1,147 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../xml/xml"), require("../javascript/javascript")) - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../xml/xml", "../javascript/javascript"], mod) - else // Plain browser env - mod(CodeMirror) -})(function(CodeMirror) { - "use strict" - - // Depth means the amount of open braces in JS context, in XML - // context 0 means not in tag, 1 means in tag, and 2 means in tag - // and js block comment. - function Context(state, mode, depth, prev) { - this.state = state; this.mode = mode; this.depth = depth; this.prev = prev - } - - function copyContext(context) { - return new Context(CodeMirror.copyState(context.mode, context.state), - context.mode, - context.depth, - context.prev && copyContext(context.prev)) - } - - CodeMirror.defineMode("jsx", function(config, modeConfig) { - var xmlMode = CodeMirror.getMode(config, {name: "xml", allowMissing: true, multilineTagIndentPastTag: false}) - var jsMode = CodeMirror.getMode(config, modeConfig && modeConfig.base || "javascript") - - function flatXMLIndent(state) { - var tagName = state.tagName - state.tagName = null - var result = xmlMode.indent(state, "") - state.tagName = tagName - return result - } - - function token(stream, state) { - if (state.context.mode == xmlMode) - return xmlToken(stream, state, state.context) - else - return jsToken(stream, state, state.context) - } - - function xmlToken(stream, state, cx) { - if (cx.depth == 2) { // Inside a JS /* */ comment - if (stream.match(/^.*?\*\//)) cx.depth = 1 - else stream.skipToEnd() - return "comment" - } - - if (stream.peek() == "{") { - xmlMode.skipAttribute(cx.state) - - var indent = flatXMLIndent(cx.state), xmlContext = cx.state.context - // If JS starts on same line as tag - if (xmlContext && stream.match(/^[^>]*>\s*$/, false)) { - while (xmlContext.prev && !xmlContext.startOfLine) - xmlContext = xmlContext.prev - // If tag starts the line, use XML indentation level - if (xmlContext.startOfLine) indent -= config.indentUnit - // Else use JS indentation level - else if (cx.prev.state.lexical) indent = cx.prev.state.lexical.indented - // Else if inside of tag - } else if (cx.depth == 1) { - indent += config.indentUnit - } - - state.context = new Context(CodeMirror.startState(jsMode, indent), - jsMode, 0, state.context) - return null - } - - if (cx.depth == 1) { // Inside of tag - if (stream.peek() == "<") { // Tag inside of tag - xmlMode.skipAttribute(cx.state) - state.context = new Context(CodeMirror.startState(xmlMode, flatXMLIndent(cx.state)), - xmlMode, 0, state.context) - return null - } else if (stream.match("//")) { - stream.skipToEnd() - return "comment" - } else if (stream.match("/*")) { - cx.depth = 2 - return token(stream, state) - } - } - - var style = xmlMode.token(stream, cx.state), cur = stream.current(), stop - if (/\btag\b/.test(style)) { - if (/>$/.test(cur)) { - if (cx.state.context) cx.depth = 0 - else state.context = state.context.prev - } else if (/^ -1) { - stream.backUp(cur.length - stop) - } - return style - } - - function jsToken(stream, state, cx) { - if (stream.peek() == "<" && jsMode.expressionAllowed(stream, cx.state)) { - jsMode.skipExpression(cx.state) - state.context = new Context(CodeMirror.startState(xmlMode, jsMode.indent(cx.state, "")), - xmlMode, 0, state.context) - return null - } - - var style = jsMode.token(stream, cx.state) - if (!style && cx.depth != null) { - var cur = stream.current() - if (cur == "{") { - cx.depth++ - } else if (cur == "}") { - if (--cx.depth == 0) state.context = state.context.prev - } - } - return style - } - - return { - startState: function() { - return {context: new Context(CodeMirror.startState(jsMode), jsMode)} - }, - - copyState: function(state) { - return {context: copyContext(state.context)} - }, - - token: token, - - indent: function(state, textAfter, fullLine) { - return state.context.mode.indent(state.context.state, textAfter, fullLine) - }, - - innerMode: function(state) { - return state.context - } - } - }, "xml", "javascript") - - CodeMirror.defineMIME("text/jsx", "jsx") -}); diff --git a/public/plugins/codemirror-5.17.0/mode/jsx/test.js b/public/plugins/codemirror-5.17.0/mode/jsx/test.js deleted file mode 100644 index c54a8b2..0000000 --- a/public/plugins/codemirror-5.17.0/mode/jsx/test.js +++ /dev/null @@ -1,69 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "jsx") - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)) } - - MT("selfclose", - "[keyword var] [def x] [operator =] [bracket&tag <] [tag foo] [bracket&tag />] [operator +] [number 1];") - - MT("openclose", - "([bracket&tag <][tag foo][bracket&tag >]hello [atom &][bracket&tag ][operator ++])") - - MT("attr", - "([bracket&tag <][tag foo] [attribute abc]=[string 'value'][bracket&tag >]hello [atom &][bracket&tag ][operator ++])") - - MT("braced_attr", - "([bracket&tag <][tag foo] [attribute abc]={[number 10]}[bracket&tag >]hello [atom &][bracket&tag ][operator ++])") - - MT("braced_text", - "([bracket&tag <][tag foo][bracket&tag >]hello {[number 10]} [atom &][bracket&tag ][operator ++])") - - MT("nested_tag", - "([bracket&tag <][tag foo][bracket&tag ><][tag bar][bracket&tag >][operator ++])") - - MT("nested_jsx", - "[keyword return] (", - " [bracket&tag <][tag foo][bracket&tag >]", - " say {[number 1] [operator +] [bracket&tag <][tag bar] [attribute attr]={[number 10]}[bracket&tag />]}!", - " [bracket&tag ][operator ++]", - ")") - - MT("preserve_js_context", - "[variable x] [operator =] [string-2 `quasi${][bracket&tag <][tag foo][bracket&tag />][string-2 }quoted`]") - - MT("line_comment", - "([bracket&tag <][tag foo] [comment // hello]", - " [bracket&tag >][operator ++])") - - MT("line_comment_not_in_tag", - "([bracket&tag <][tag foo][bracket&tag >] // hello", - " [bracket&tag ][operator ++])") - - MT("block_comment", - "([bracket&tag <][tag foo] [comment /* hello]", - "[comment line 2]", - "[comment line 3 */] [bracket&tag >][operator ++])") - - MT("block_comment_not_in_tag", - "([bracket&tag <][tag foo][bracket&tag >]/* hello", - " line 2", - " line 3 */ [bracket&tag ][operator ++])") - - MT("missing_attr", - "([bracket&tag <][tag foo] [attribute selected][bracket&tag />][operator ++])") - - MT("indent_js", - "([bracket&tag <][tag foo][bracket&tag >]", - " [bracket&tag <][tag bar] [attribute baz]={[keyword function]() {", - " [keyword return] [number 10]", - " }}[bracket&tag />]", - " [bracket&tag ])") - - MT("spread", - "([bracket&tag <][tag foo] [attribute bar]={[meta ...][variable baz] [operator /][number 2]}[bracket&tag />])") - - MT("tag_attribute", - "([bracket&tag <][tag foo] [attribute bar]=[bracket&tag <][tag foo][bracket&tag />/>][operator ++])") -})() diff --git a/public/plugins/codemirror-5.17.0/mode/julia/index.html b/public/plugins/codemirror-5.17.0/mode/julia/index.html deleted file mode 100644 index e1492c2..0000000 --- a/public/plugins/codemirror-5.17.0/mode/julia/index.html +++ /dev/null @@ -1,195 +0,0 @@ - - -CodeMirror: Julia mode - - - - - - - - - -
-

Julia mode

- -
- - -

MIME types defined: text/x-julia.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/julia/julia.js b/public/plugins/codemirror-5.17.0/mode/julia/julia.js deleted file mode 100644 index 004de44..0000000 --- a/public/plugins/codemirror-5.17.0/mode/julia/julia.js +++ /dev/null @@ -1,392 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("julia", function(_conf, parserConf) { - var ERRORCLASS = 'error'; - - function wordRegexp(words, end) { - if (typeof end === 'undefined') { end = "\\b"; } - return new RegExp("^((" + words.join(")|(") + "))" + end); - } - - var octChar = "\\\\[0-7]{1,3}"; - var hexChar = "\\\\x[A-Fa-f0-9]{1,2}"; - var specialChar = "\\\\[abfnrtv0%?'\"\\\\]"; - var singleChar = "([^\\u0027\\u005C\\uD800-\\uDFFF]|[\\uD800-\\uDFFF][\\uDC00-\\uDFFF])"; - var operators = parserConf.operators || /^\.?[|&^\\%*+\-<>!=\/]=?|\?|~|:|\$|\.[<>]|<<=?|>>>?=?|\.[<>=]=|->?|\/\/|\bin\b(?!\()|[\u2208\u2209](?!\()/; - var delimiters = parserConf.delimiters || /^[;,()[\]{}]/; - var identifiers = parserConf.identifiers || /^[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/; - var charsList = [octChar, hexChar, specialChar, singleChar]; - var blockOpeners = ["begin", "function", "type", "immutable", "let", "macro", "for", "while", "quote", "if", "else", "elseif", "try", "finally", "catch", "do"]; - var blockClosers = ["end", "else", "elseif", "catch", "finally"]; - var keywordList = ['if', 'else', 'elseif', 'while', 'for', 'begin', 'let', 'end', 'do', 'try', 'catch', 'finally', 'return', 'break', 'continue', 'global', 'local', 'const', 'export', 'import', 'importall', 'using', 'function', 'macro', 'module', 'baremodule', 'type', 'immutable', 'quote', 'typealias', 'abstract', 'bitstype']; - var builtinList = ['true', 'false', 'nothing', 'NaN', 'Inf']; - - //var stringPrefixes = new RegExp("^[br]?('|\")") - var stringPrefixes = /^(`|"{3}|([brv]?"))/; - var chars = wordRegexp(charsList, "'"); - var keywords = wordRegexp(keywordList); - var builtins = wordRegexp(builtinList); - var openers = wordRegexp(blockOpeners); - var closers = wordRegexp(blockClosers); - var macro = /^@[_A-Za-z][\w]*/; - var symbol = /^:[_A-Za-z\u00A1-\uFFFF][\w\u00A1-\uFFFF]*!*/; - var typeAnnotation = /^::[^,;"{()=$\s]+({[^}]*}+)*/; - - function inArray(state) { - var ch = currentScope(state); - if (ch == '[') { - return true; - } - return false; - } - - function currentScope(state) { - if (state.scopes.length == 0) { - return null; - } - return state.scopes[state.scopes.length - 1]; - } - - // tokenizers - function tokenBase(stream, state) { - // Handle multiline comments - if (stream.match(/^#=/, false)) { - state.tokenize = tokenComment; - return state.tokenize(stream, state); - } - - // Handle scope changes - var leavingExpr = state.leavingExpr; - if (stream.sol()) { - leavingExpr = false; - } - state.leavingExpr = false; - if (leavingExpr) { - if (stream.match(/^'+/)) { - return 'operator'; - } - } - - if (stream.match(/^\.{2,3}/)) { - return 'operator'; - } - - if (stream.eatSpace()) { - return null; - } - - var ch = stream.peek(); - - // Handle single line comments - if (ch === '#') { - stream.skipToEnd(); - return 'comment'; - } - - if (ch === '[') { - state.scopes.push('['); - } - - if (ch === '(') { - state.scopes.push('('); - } - - var scope = currentScope(state); - - if (scope == '[' && ch === ']') { - state.scopes.pop(); - state.leavingExpr = true; - } - - if (scope == '(' && ch === ')') { - state.scopes.pop(); - state.leavingExpr = true; - } - - var match; - if (!inArray(state) && (match=stream.match(openers, false))) { - state.scopes.push(match); - } - - if (!inArray(state) && stream.match(closers, false)) { - state.scopes.pop(); - } - - if (inArray(state)) { - if (state.lastToken == 'end' && stream.match(/^:/)) { - return 'operator'; - } - if (stream.match(/^end/)) { - return 'number'; - } - } - - if (stream.match(/^=>/)) { - return 'operator'; - } - - // Handle Number Literals - if (stream.match(/^[0-9\.]/, false)) { - var imMatcher = RegExp(/^im\b/); - var numberLiteral = false; - // Floats - if (stream.match(/^\d*\.(?!\.)\d*([Eef][\+\-]?\d+)?/i)) { numberLiteral = true; } - if (stream.match(/^\d+\.(?!\.)\d*/)) { numberLiteral = true; } - if (stream.match(/^\.\d+/)) { numberLiteral = true; } - if (stream.match(/^0x\.[0-9a-f]+p[\+\-]?\d+/i)) { numberLiteral = true; } - // Integers - if (stream.match(/^0x[0-9a-f]+/i)) { numberLiteral = true; } // Hex - if (stream.match(/^0b[01]+/i)) { numberLiteral = true; } // Binary - if (stream.match(/^0o[0-7]+/i)) { numberLiteral = true; } // Octal - if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { numberLiteral = true; } // Decimal - // Zero by itself with no other piece of number. - if (stream.match(/^0(?![\dx])/i)) { numberLiteral = true; } - if (numberLiteral) { - // Integer literals may be "long" - stream.match(imMatcher); - state.leavingExpr = true; - return 'number'; - } - } - - if (stream.match(/^<:/)) { - return 'operator'; - } - - if (stream.match(typeAnnotation)) { - return 'builtin'; - } - - // Handle symbols - if (!leavingExpr && stream.match(symbol) || stream.match(/:\./)) { - return 'builtin'; - } - - // Handle parametric types - if (stream.match(/^{[^}]*}(?=\()/)) { - return 'builtin'; - } - - // Handle operators and Delimiters - if (stream.match(operators)) { - return 'operator'; - } - - // Handle Chars - if (stream.match(/^'/)) { - state.tokenize = tokenChar; - return state.tokenize(stream, state); - } - - // Handle Strings - if (stream.match(stringPrefixes)) { - state.tokenize = tokenStringFactory(stream.current()); - return state.tokenize(stream, state); - } - - if (stream.match(macro)) { - return 'meta'; - } - - if (stream.match(delimiters)) { - return null; - } - - if (stream.match(keywords)) { - return 'keyword'; - } - - if (stream.match(builtins)) { - return 'builtin'; - } - - var isDefinition = state.isDefinition || - state.lastToken == 'function' || - state.lastToken == 'macro' || - state.lastToken == 'type' || - state.lastToken == 'immutable'; - - if (stream.match(identifiers)) { - if (isDefinition) { - if (stream.peek() === '.') { - state.isDefinition = true; - return 'variable'; - } - state.isDefinition = false; - return 'def'; - } - if (stream.match(/^({[^}]*})*\(/, false)) { - return callOrDef(stream, state); - } - state.leavingExpr = true; - return 'variable'; - } - - // Handle non-detected items - stream.next(); - return ERRORCLASS; - } - - function callOrDef(stream, state) { - var match = stream.match(/^(\(\s*)/); - if (match) { - if (state.firstParenPos < 0) - state.firstParenPos = state.scopes.length; - state.scopes.push('('); - state.charsAdvanced += match[1].length; - } - if (currentScope(state) == '(' && stream.match(/^\)/)) { - state.scopes.pop(); - state.charsAdvanced += 1; - if (state.scopes.length <= state.firstParenPos) { - var isDefinition = stream.match(/^\s*?=(?!=)/, false); - stream.backUp(state.charsAdvanced); - state.firstParenPos = -1; - state.charsAdvanced = 0; - if (isDefinition) - return 'def'; - return 'builtin'; - } - } - // Unfortunately javascript does not support multiline strings, so we have - // to undo anything done upto here if a function call or definition splits - // over two or more lines. - if (stream.match(/^$/g, false)) { - stream.backUp(state.charsAdvanced); - while (state.scopes.length > state.firstParenPos) - state.scopes.pop(); - state.firstParenPos = -1; - state.charsAdvanced = 0; - return 'builtin'; - } - state.charsAdvanced += stream.match(/^([^()]*)/)[1].length; - return callOrDef(stream, state); - } - - function tokenComment(stream, state) { - if (stream.match(/^#=/)) { - state.weakScopes++; - } - if (!stream.match(/.*?(?=(#=|=#))/)) { - stream.skipToEnd(); - } - if (stream.match(/^=#/)) { - state.weakScopes--; - if (state.weakScopes == 0) - state.tokenize = tokenBase; - } - return 'comment'; - } - - function tokenChar(stream, state) { - var isChar = false, match; - if (stream.match(chars)) { - isChar = true; - } else if (match = stream.match(/\\u([a-f0-9]{1,4})(?=')/i)) { - var value = parseInt(match[1], 16); - if (value <= 55295 || value >= 57344) { // (U+0,U+D7FF), (U+E000,U+FFFF) - isChar = true; - stream.next(); - } - } else if (match = stream.match(/\\U([A-Fa-f0-9]{5,8})(?=')/)) { - var value = parseInt(match[1], 16); - if (value <= 1114111) { // U+10FFFF - isChar = true; - stream.next(); - } - } - if (isChar) { - state.leavingExpr = true; - state.tokenize = tokenBase; - return 'string'; - } - if (!stream.match(/^[^']+(?=')/)) { stream.skipToEnd(); } - if (stream.match(/^'/)) { state.tokenize = tokenBase; } - return ERRORCLASS; - } - - function tokenStringFactory(delimiter) { - while ('bruv'.indexOf(delimiter.charAt(0).toLowerCase()) >= 0) { - delimiter = delimiter.substr(1); - } - var OUTCLASS = 'string'; - - function tokenString(stream, state) { - while (!stream.eol()) { - stream.eatWhile(/[^"\\]/); - if (stream.eat('\\')) { - stream.next(); - } else if (stream.match(delimiter)) { - state.tokenize = tokenBase; - state.leavingExpr = true; - return OUTCLASS; - } else { - stream.eat(/["]/); - } - } - return OUTCLASS; - } - tokenString.isString = true; - return tokenString; - } - - var external = { - startState: function() { - return { - tokenize: tokenBase, - scopes: [], - weakScopes: 0, - lastToken: null, - leavingExpr: false, - isDefinition: false, - charsAdvanced: 0, - firstParenPos: -1 - }; - }, - - token: function(stream, state) { - var style = state.tokenize(stream, state); - var current = stream.current(); - - if (current && style) { - state.lastToken = current; - } - - // Handle '.' connected identifiers - if (current === '.') { - style = stream.match(identifiers, false) || stream.match(macro, false) || - stream.match(/\(/, false) ? 'operator' : ERRORCLASS; - } - return style; - }, - - indent: function(state, textAfter) { - var delta = 0; - if (textAfter == "]" || textAfter == ")" || textAfter == "end" || textAfter == "else" || textAfter == "elseif" || textAfter == "catch" || textAfter == "finally") { - delta = -1; - } - return (state.scopes.length + delta) * _conf.indentUnit; - }, - - electricInput: /(end|else(if)?|catch|finally)$/, - lineComment: "#", - fold: "indent" - }; - return external; -}); - - -CodeMirror.defineMIME("text/x-julia", "julia"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/livescript/index.html b/public/plugins/codemirror-5.17.0/mode/livescript/index.html deleted file mode 100644 index f415479..0000000 --- a/public/plugins/codemirror-5.17.0/mode/livescript/index.html +++ /dev/null @@ -1,459 +0,0 @@ - - -CodeMirror: LiveScript mode - - - - - - - - - - -
-

LiveScript mode

-
- - -

MIME types defined: text/x-livescript.

- -

The LiveScript mode was written by Kenneth Bentley.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/livescript/livescript.js b/public/plugins/codemirror-5.17.0/mode/livescript/livescript.js deleted file mode 100644 index 4b26e04..0000000 --- a/public/plugins/codemirror-5.17.0/mode/livescript/livescript.js +++ /dev/null @@ -1,280 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/** - * Link to the project's GitHub page: - * https://github.com/duralog/CodeMirror - */ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode('livescript', function(){ - var tokenBase = function(stream, state) { - var next_rule = state.next || "start"; - if (next_rule) { - state.next = state.next; - var nr = Rules[next_rule]; - if (nr.splice) { - for (var i$ = 0; i$ < nr.length; ++i$) { - var r = nr[i$]; - if (r.regex && stream.match(r.regex)) { - state.next = r.next || state.next; - return r.token; - } - } - stream.next(); - return 'error'; - } - if (stream.match(r = Rules[next_rule])) { - if (r.regex && stream.match(r.regex)) { - state.next = r.next; - return r.token; - } else { - stream.next(); - return 'error'; - } - } - } - stream.next(); - return 'error'; - }; - var external = { - startState: function(){ - return { - next: 'start', - lastToken: null - }; - }, - token: function(stream, state){ - while (stream.pos == stream.start) - var style = tokenBase(stream, state); - state.lastToken = { - style: style, - indent: stream.indentation(), - content: stream.current() - }; - return style.replace(/\./g, ' '); - }, - indent: function(state){ - var indentation = state.lastToken.indent; - if (state.lastToken.content.match(indenter)) { - indentation += 2; - } - return indentation; - } - }; - return external; - }); - - var identifier = '(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*'; - var indenter = RegExp('(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*' + identifier + ')?))\\s*$'); - var keywordend = '(?![$\\w]|-[A-Za-z]|\\s*:(?![:=]))'; - var stringfill = { - token: 'string', - regex: '.+' - }; - var Rules = { - start: [ - { - token: 'comment.doc', - regex: '/\\*', - next: 'comment' - }, { - token: 'comment', - regex: '#.*' - }, { - token: 'keyword', - regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend - }, { - token: 'constant.language', - regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend - }, { - token: 'invalid.illegal', - regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend - }, { - token: 'language.support.class', - regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend - }, { - token: 'language.support.function', - regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend - }, { - token: 'variable.language', - regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend - }, { - token: 'identifier', - regex: identifier + '\\s*:(?![:=])' - }, { - token: 'variable', - regex: identifier - }, { - token: 'keyword.operator', - regex: '(?:\\.{3}|\\s+\\?)' - }, { - token: 'keyword.variable', - regex: '(?:@+|::|\\.\\.)', - next: 'key' - }, { - token: 'keyword.operator', - regex: '\\.\\s*', - next: 'key' - }, { - token: 'string', - regex: '\\\\\\S[^\\s,;)}\\]]*' - }, { - token: 'string.doc', - regex: '\'\'\'', - next: 'qdoc' - }, { - token: 'string.doc', - regex: '"""', - next: 'qqdoc' - }, { - token: 'string', - regex: '\'', - next: 'qstring' - }, { - token: 'string', - regex: '"', - next: 'qqstring' - }, { - token: 'string', - regex: '`', - next: 'js' - }, { - token: 'string', - regex: '<\\[', - next: 'words' - }, { - token: 'string.regex', - regex: '//', - next: 'heregex' - }, { - token: 'string.regex', - regex: '\\/(?:[^[\\/\\n\\\\]*(?:(?:\\\\.|\\[[^\\]\\n\\\\]*(?:\\\\.[^\\]\\n\\\\]*)*\\])[^[\\/\\n\\\\]*)*)\\/[gimy$]{0,4}', - next: 'key' - }, { - token: 'constant.numeric', - regex: '(?:0x[\\da-fA-F][\\da-fA-F_]*|(?:[2-9]|[12]\\d|3[0-6])r[\\da-zA-Z][\\da-zA-Z_]*|(?:\\d[\\d_]*(?:\\.\\d[\\d_]*)?|\\.\\d[\\d_]*)(?:e[+-]?\\d[\\d_]*)?[\\w$]*)' - }, { - token: 'lparen', - regex: '[({[]' - }, { - token: 'rparen', - regex: '[)}\\]]', - next: 'key' - }, { - token: 'keyword.operator', - regex: '\\S+' - }, { - token: 'text', - regex: '\\s+' - } - ], - heregex: [ - { - token: 'string.regex', - regex: '.*?//[gimy$?]{0,4}', - next: 'start' - }, { - token: 'string.regex', - regex: '\\s*#{' - }, { - token: 'comment.regex', - regex: '\\s+(?:#.*)?' - }, { - token: 'string.regex', - regex: '\\S+' - } - ], - key: [ - { - token: 'keyword.operator', - regex: '[.?@!]+' - }, { - token: 'identifier', - regex: identifier, - next: 'start' - }, { - token: 'text', - regex: '', - next: 'start' - } - ], - comment: [ - { - token: 'comment.doc', - regex: '.*?\\*/', - next: 'start' - }, { - token: 'comment.doc', - regex: '.+' - } - ], - qdoc: [ - { - token: 'string', - regex: ".*?'''", - next: 'key' - }, stringfill - ], - qqdoc: [ - { - token: 'string', - regex: '.*?"""', - next: 'key' - }, stringfill - ], - qstring: [ - { - token: 'string', - regex: '[^\\\\\']*(?:\\\\.[^\\\\\']*)*\'', - next: 'key' - }, stringfill - ], - qqstring: [ - { - token: 'string', - regex: '[^\\\\"]*(?:\\\\.[^\\\\"]*)*"', - next: 'key' - }, stringfill - ], - js: [ - { - token: 'string', - regex: '[^\\\\`]*(?:\\\\.[^\\\\`]*)*`', - next: 'key' - }, stringfill - ], - words: [ - { - token: 'string', - regex: '.*?\\]>', - next: 'key' - }, stringfill - ] - }; - for (var idx in Rules) { - var r = Rules[idx]; - if (r.splice) { - for (var i = 0, len = r.length; i < len; ++i) { - var rr = r[i]; - if (typeof rr.regex === 'string') { - Rules[idx][i].regex = new RegExp('^' + rr.regex); - } - } - } else if (typeof rr.regex === 'string') { - Rules[idx].regex = new RegExp('^' + r.regex); - } - } - - CodeMirror.defineMIME('text/x-livescript', 'livescript'); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/lua/index.html b/public/plugins/codemirror-5.17.0/mode/lua/index.html deleted file mode 100644 index fc98b94..0000000 --- a/public/plugins/codemirror-5.17.0/mode/lua/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - -CodeMirror: Lua mode - - - - - - - - - - - -
-

Lua mode

-
- - -

Loosely based on Franciszek - Wawrzak's CodeMirror - 1 mode. One configuration parameter is - supported, specials, to which you can provide an - array of strings to have those identifiers highlighted with - the lua-special style.

-

MIME types defined: text/x-lua.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/lua/lua.js b/public/plugins/codemirror-5.17.0/mode/lua/lua.js deleted file mode 100644 index 0b19abd..0000000 --- a/public/plugins/codemirror-5.17.0/mode/lua/lua.js +++ /dev/null @@ -1,159 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// LUA mode. Ported to CodeMirror 2 from Franciszek Wawrzak's -// CodeMirror 1 mode. -// highlights keywords, strings, comments (no leveling supported! ("[==[")), tokens, basic indenting - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("lua", function(config, parserConfig) { - var indentUnit = config.indentUnit; - - function prefixRE(words) { - return new RegExp("^(?:" + words.join("|") + ")", "i"); - } - function wordRE(words) { - return new RegExp("^(?:" + words.join("|") + ")$", "i"); - } - var specials = wordRE(parserConfig.specials || []); - - // long list of standard functions from lua manual - var builtins = wordRE([ - "_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load", - "loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require", - "select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall", - - "coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield", - - "debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable", - "debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable", - "debug.setupvalue","debug.traceback", - - "close","flush","lines","read","seek","setvbuf","write", - - "io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin", - "io.stdout","io.tmpfile","io.type","io.write", - - "math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg", - "math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max", - "math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh", - "math.sqrt","math.tan","math.tanh", - - "os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale", - "os.time","os.tmpname", - - "package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload", - "package.seeall", - - "string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub", - "string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper", - - "table.concat","table.insert","table.maxn","table.remove","table.sort" - ]); - var keywords = wordRE(["and","break","elseif","false","nil","not","or","return", - "true","function", "end", "if", "then", "else", "do", - "while", "repeat", "until", "for", "in", "local" ]); - - var indentTokens = wordRE(["function", "if","repeat","do", "\\(", "{"]); - var dedentTokens = wordRE(["end", "until", "\\)", "}"]); - var dedentPartial = prefixRE(["end", "until", "\\)", "}", "else", "elseif"]); - - function readBracket(stream) { - var level = 0; - while (stream.eat("=")) ++level; - stream.eat("["); - return level; - } - - function normal(stream, state) { - var ch = stream.next(); - if (ch == "-" && stream.eat("-")) { - if (stream.eat("[") && stream.eat("[")) - return (state.cur = bracketed(readBracket(stream), "comment"))(stream, state); - stream.skipToEnd(); - return "comment"; - } - if (ch == "\"" || ch == "'") - return (state.cur = string(ch))(stream, state); - if (ch == "[" && /[\[=]/.test(stream.peek())) - return (state.cur = bracketed(readBracket(stream), "string"))(stream, state); - if (/\d/.test(ch)) { - stream.eatWhile(/[\w.%]/); - return "number"; - } - if (/[\w_]/.test(ch)) { - stream.eatWhile(/[\w\\\-_.]/); - return "variable"; - } - return null; - } - - function bracketed(level, style) { - return function(stream, state) { - var curlev = null, ch; - while ((ch = stream.next()) != null) { - if (curlev == null) {if (ch == "]") curlev = 0;} - else if (ch == "=") ++curlev; - else if (ch == "]" && curlev == level) { state.cur = normal; break; } - else curlev = null; - } - return style; - }; - } - - function string(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) break; - escaped = !escaped && ch == "\\"; - } - if (!escaped) state.cur = normal; - return "string"; - }; - } - - return { - startState: function(basecol) { - return {basecol: basecol || 0, indentDepth: 0, cur: normal}; - }, - - token: function(stream, state) { - if (stream.eatSpace()) return null; - var style = state.cur(stream, state); - var word = stream.current(); - if (style == "variable") { - if (keywords.test(word)) style = "keyword"; - else if (builtins.test(word)) style = "builtin"; - else if (specials.test(word)) style = "variable-2"; - } - if ((style != "comment") && (style != "string")){ - if (indentTokens.test(word)) ++state.indentDepth; - else if (dedentTokens.test(word)) --state.indentDepth; - } - return style; - }, - - indent: function(state, textAfter) { - var closing = dedentPartial.test(textAfter); - return state.basecol + indentUnit * (state.indentDepth - (closing ? 1 : 0)); - }, - - lineComment: "--", - blockCommentStart: "--[[", - blockCommentEnd: "]]" - }; -}); - -CodeMirror.defineMIME("text/x-lua", "lua"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/markdown/index.html b/public/plugins/codemirror-5.17.0/mode/markdown/index.html deleted file mode 100644 index 15660c2..0000000 --- a/public/plugins/codemirror-5.17.0/mode/markdown/index.html +++ /dev/null @@ -1,361 +0,0 @@ - - -CodeMirror: Markdown mode - - - - - - - - - - - -
-

Markdown mode

-
- - - -

You might want to use the Github-Flavored Markdown mode instead, which adds support for fenced code blocks and a few other things.

- -

Optionally depends on the XML mode for properly highlighted inline XML blocks.

- -

MIME types defined: text/x-markdown.

- -

Parsing/Highlighting Tests: normal, verbose.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/markdown/markdown.js b/public/plugins/codemirror-5.17.0/mode/markdown/markdown.js deleted file mode 100644 index 9dd4457..0000000 --- a/public/plugins/codemirror-5.17.0/mode/markdown/markdown.js +++ /dev/null @@ -1,819 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../xml/xml"), require("../meta")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../xml/xml", "../meta"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("markdown", function(cmCfg, modeCfg) { - - var htmlMode = CodeMirror.getMode(cmCfg, "text/html"); - var htmlModeMissing = htmlMode.name == "null" - - function getMode(name) { - if (CodeMirror.findModeByName) { - var found = CodeMirror.findModeByName(name); - if (found) name = found.mime || found.mimes[0]; - } - var mode = CodeMirror.getMode(cmCfg, name); - return mode.name == "null" ? null : mode; - } - - // Should characters that affect highlighting be highlighted separate? - // Does not include characters that will be output (such as `1.` and `-` for lists) - if (modeCfg.highlightFormatting === undefined) - modeCfg.highlightFormatting = false; - - // Maximum number of nested blockquotes. Set to 0 for infinite nesting. - // Excess `>` will emit `error` token. - if (modeCfg.maxBlockquoteDepth === undefined) - modeCfg.maxBlockquoteDepth = 0; - - // Should underscores in words open/close em/strong? - if (modeCfg.underscoresBreakWords === undefined) - modeCfg.underscoresBreakWords = true; - - // Use `fencedCodeBlocks` to configure fenced code blocks. false to - // disable, string to specify a precise regexp that the fence should - // match, and true to allow three or more backticks or tildes (as - // per CommonMark). - - // Turn on task lists? ("- [ ] " and "- [x] ") - if (modeCfg.taskLists === undefined) modeCfg.taskLists = false; - - // Turn on strikethrough syntax - if (modeCfg.strikethrough === undefined) - modeCfg.strikethrough = false; - - // Allow token types to be overridden by user-provided token types. - if (modeCfg.tokenTypeOverrides === undefined) - modeCfg.tokenTypeOverrides = {}; - - var tokenTypes = { - header: "header", - code: "comment", - quote: "quote", - list1: "variable-2", - list2: "variable-3", - list3: "keyword", - hr: "hr", - image: "image", - imageAltText: "image-alt-text", - imageMarker: "image-marker", - formatting: "formatting", - linkInline: "link", - linkEmail: "link", - linkText: "link", - linkHref: "string", - em: "em", - strong: "strong", - strikethrough: "strikethrough" - }; - - for (var tokenType in tokenTypes) { - if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) { - tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType]; - } - } - - var hrRE = /^([*\-_])(?:\s*\1){2,}\s*$/ - , ulRE = /^[*\-+]\s+/ - , olRE = /^[0-9]+([.)])\s+/ - , taskListRE = /^\[(x| )\](?=\s)/ // Must follow ulRE or olRE - , atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/ - , setextHeaderRE = /^ *(?:\={1,}|-{1,})\s*$/ - , textRE = /^[^#!\[\]*_\\<>` "'(~]+/ - , fencedCodeRE = new RegExp("^(" + (modeCfg.fencedCodeBlocks === true ? "~~~+|```+" : modeCfg.fencedCodeBlocks) + - ")[ \\t]*([\\w+#\-]*)"); - - function switchInline(stream, state, f) { - state.f = state.inline = f; - return f(stream, state); - } - - function switchBlock(stream, state, f) { - state.f = state.block = f; - return f(stream, state); - } - - function lineIsEmpty(line) { - return !line || !/\S/.test(line.string) - } - - // Blocks - - function blankLine(state) { - // Reset linkTitle state - state.linkTitle = false; - // Reset EM state - state.em = false; - // Reset STRONG state - state.strong = false; - // Reset strikethrough state - state.strikethrough = false; - // Reset state.quote - state.quote = 0; - // Reset state.indentedCode - state.indentedCode = false; - if (htmlModeMissing && state.f == htmlBlock) { - state.f = inlineNormal; - state.block = blockNormal; - } - // Reset state.trailingSpace - state.trailingSpace = 0; - state.trailingSpaceNewLine = false; - // Mark this line as blank - state.prevLine = state.thisLine - state.thisLine = null - return null; - } - - function blockNormal(stream, state) { - - var sol = stream.sol(); - - var prevLineIsList = state.list !== false, - prevLineIsIndentedCode = state.indentedCode; - - state.indentedCode = false; - - if (prevLineIsList) { - if (state.indentationDiff >= 0) { // Continued list - if (state.indentationDiff < 4) { // Only adjust indentation if *not* a code block - state.indentation -= state.indentationDiff; - } - state.list = null; - } else if (state.indentation > 0) { - state.list = null; - } else { // No longer a list - state.list = false; - } - } - - var match = null; - if (state.indentationDiff >= 4) { - stream.skipToEnd(); - if (prevLineIsIndentedCode || lineIsEmpty(state.prevLine)) { - state.indentation -= 4; - state.indentedCode = true; - return tokenTypes.code; - } else { - return null; - } - } else if (stream.eatSpace()) { - return null; - } else if ((match = stream.match(atxHeaderRE)) && match[1].length <= 6) { - state.header = match[1].length; - if (modeCfg.highlightFormatting) state.formatting = "header"; - state.f = state.inline; - return getType(state); - } else if (!lineIsEmpty(state.prevLine) && !state.quote && !prevLineIsList && - !prevLineIsIndentedCode && (match = stream.match(setextHeaderRE))) { - state.header = match[0].charAt(0) == '=' ? 1 : 2; - if (modeCfg.highlightFormatting) state.formatting = "header"; - state.f = state.inline; - return getType(state); - } else if (stream.eat('>')) { - state.quote = sol ? 1 : state.quote + 1; - if (modeCfg.highlightFormatting) state.formatting = "quote"; - stream.eatSpace(); - return getType(state); - } else if (stream.peek() === '[') { - return switchInline(stream, state, footnoteLink); - } else if (stream.match(hrRE, true)) { - state.hr = true; - return tokenTypes.hr; - } else if ((lineIsEmpty(state.prevLine) || prevLineIsList) && (stream.match(ulRE, false) || stream.match(olRE, false))) { - var listType = null; - if (stream.match(ulRE, true)) { - listType = 'ul'; - } else { - stream.match(olRE, true); - listType = 'ol'; - } - state.indentation = stream.column() + stream.current().length; - state.list = true; - - // While this list item's marker's indentation - // is less than the deepest list item's content's indentation, - // pop the deepest list item indentation off the stack. - while (state.listStack && stream.column() < state.listStack[state.listStack.length - 1]) { - state.listStack.pop(); - } - - // Add this list item's content's indentation to the stack - state.listStack.push(state.indentation); - - if (modeCfg.taskLists && stream.match(taskListRE, false)) { - state.taskList = true; - } - state.f = state.inline; - if (modeCfg.highlightFormatting) state.formatting = ["list", "list-" + listType]; - return getType(state); - } else if (modeCfg.fencedCodeBlocks && (match = stream.match(fencedCodeRE, true))) { - state.fencedChars = match[1] - // try switching mode - state.localMode = getMode(match[2]); - if (state.localMode) state.localState = CodeMirror.startState(state.localMode); - state.f = state.block = local; - if (modeCfg.highlightFormatting) state.formatting = "code-block"; - state.code = -1 - return getType(state); - } - - return switchInline(stream, state, state.inline); - } - - function htmlBlock(stream, state) { - var style = htmlMode.token(stream, state.htmlState); - if (!htmlModeMissing) { - var inner = CodeMirror.innerMode(htmlMode, state.htmlState) - if ((inner.mode.name == "xml" && inner.state.tagStart === null && - (!inner.state.context && inner.state.tokenize.isInText)) || - (state.md_inside && stream.current().indexOf(">") > -1)) { - state.f = inlineNormal; - state.block = blockNormal; - state.htmlState = null; - } - } - return style; - } - - function local(stream, state) { - if (state.fencedChars && stream.match(state.fencedChars, false)) { - state.localMode = state.localState = null; - state.f = state.block = leavingLocal; - return null; - } else if (state.localMode) { - return state.localMode.token(stream, state.localState); - } else { - stream.skipToEnd(); - return tokenTypes.code; - } - } - - function leavingLocal(stream, state) { - stream.match(state.fencedChars); - state.block = blockNormal; - state.f = inlineNormal; - state.fencedChars = null; - if (modeCfg.highlightFormatting) state.formatting = "code-block"; - state.code = 1 - var returnType = getType(state); - state.code = 0 - return returnType; - } - - // Inline - function getType(state) { - var styles = []; - - if (state.formatting) { - styles.push(tokenTypes.formatting); - - if (typeof state.formatting === "string") state.formatting = [state.formatting]; - - for (var i = 0; i < state.formatting.length; i++) { - styles.push(tokenTypes.formatting + "-" + state.formatting[i]); - - if (state.formatting[i] === "header") { - styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.header); - } - - // Add `formatting-quote` and `formatting-quote-#` for blockquotes - // Add `error` instead if the maximum blockquote nesting depth is passed - if (state.formatting[i] === "quote") { - if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { - styles.push(tokenTypes.formatting + "-" + state.formatting[i] + "-" + state.quote); - } else { - styles.push("error"); - } - } - } - } - - if (state.taskOpen) { - styles.push("meta"); - return styles.length ? styles.join(' ') : null; - } - if (state.taskClosed) { - styles.push("property"); - return styles.length ? styles.join(' ') : null; - } - - if (state.linkHref) { - styles.push(tokenTypes.linkHref, "url"); - } else { // Only apply inline styles to non-url text - if (state.strong) { styles.push(tokenTypes.strong); } - if (state.em) { styles.push(tokenTypes.em); } - if (state.strikethrough) { styles.push(tokenTypes.strikethrough); } - if (state.linkText) { styles.push(tokenTypes.linkText); } - if (state.code) { styles.push(tokenTypes.code); } - if (state.image) { styles.push(tokenTypes.image); } - if (state.imageAltText) { styles.push(tokenTypes.imageAltText, "link"); } - if (state.imageMarker) { styles.push(tokenTypes.imageMarker); } - } - - if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + "-" + state.header); } - - if (state.quote) { - styles.push(tokenTypes.quote); - - // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth - if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) { - styles.push(tokenTypes.quote + "-" + state.quote); - } else { - styles.push(tokenTypes.quote + "-" + modeCfg.maxBlockquoteDepth); - } - } - - if (state.list !== false) { - var listMod = (state.listStack.length - 1) % 3; - if (!listMod) { - styles.push(tokenTypes.list1); - } else if (listMod === 1) { - styles.push(tokenTypes.list2); - } else { - styles.push(tokenTypes.list3); - } - } - - if (state.trailingSpaceNewLine) { - styles.push("trailing-space-new-line"); - } else if (state.trailingSpace) { - styles.push("trailing-space-" + (state.trailingSpace % 2 ? "a" : "b")); - } - - return styles.length ? styles.join(' ') : null; - } - - function handleText(stream, state) { - if (stream.match(textRE, true)) { - return getType(state); - } - return undefined; - } - - function inlineNormal(stream, state) { - var style = state.text(stream, state); - if (typeof style !== 'undefined') - return style; - - if (state.list) { // List marker (*, +, -, 1., etc) - state.list = null; - return getType(state); - } - - if (state.taskList) { - var taskOpen = stream.match(taskListRE, true)[1] !== "x"; - if (taskOpen) state.taskOpen = true; - else state.taskClosed = true; - if (modeCfg.highlightFormatting) state.formatting = "task"; - state.taskList = false; - return getType(state); - } - - state.taskOpen = false; - state.taskClosed = false; - - if (state.header && stream.match(/^#+$/, true)) { - if (modeCfg.highlightFormatting) state.formatting = "header"; - return getType(state); - } - - // Get sol() value now, before character is consumed - var sol = stream.sol(); - - var ch = stream.next(); - - // Matches link titles present on next line - if (state.linkTitle) { - state.linkTitle = false; - var matchCh = ch; - if (ch === '(') { - matchCh = ')'; - } - matchCh = (matchCh+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); - var regex = '^\\s*(?:[^' + matchCh + '\\\\]+|\\\\\\\\|\\\\.)' + matchCh; - if (stream.match(new RegExp(regex), true)) { - return tokenTypes.linkHref; - } - } - - // If this block is changed, it may need to be updated in GFM mode - if (ch === '`') { - var previousFormatting = state.formatting; - if (modeCfg.highlightFormatting) state.formatting = "code"; - stream.eatWhile('`'); - var count = stream.current().length - if (state.code == 0) { - state.code = count - return getType(state) - } else if (count == state.code) { // Must be exact - var t = getType(state) - state.code = 0 - return t - } else { - state.formatting = previousFormatting - return getType(state) - } - } else if (state.code) { - return getType(state); - } - - if (ch === '\\') { - stream.next(); - if (modeCfg.highlightFormatting) { - var type = getType(state); - var formattingEscape = tokenTypes.formatting + "-escape"; - return type ? type + " " + formattingEscape : formattingEscape; - } - } - - if (ch === '!' && stream.match(/\[[^\]]*\] ?(?:\(|\[)/, false)) { - state.imageMarker = true; - state.image = true; - if (modeCfg.highlightFormatting) state.formatting = "image"; - return getType(state); - } - - if (ch === '[' && state.imageMarker) { - state.imageMarker = false; - state.imageAltText = true - if (modeCfg.highlightFormatting) state.formatting = "image"; - return getType(state); - } - - if (ch === ']' && state.imageAltText) { - if (modeCfg.highlightFormatting) state.formatting = "image"; - var type = getType(state); - state.imageAltText = false; - state.image = false; - state.inline = state.f = linkHref; - return type; - } - - if (ch === '[' && stream.match(/[^\]]*\](\(.*\)| ?\[.*?\])/, false) && !state.image) { - state.linkText = true; - if (modeCfg.highlightFormatting) state.formatting = "link"; - return getType(state); - } - - if (ch === ']' && state.linkText && stream.match(/\(.*?\)| ?\[.*?\]/, false)) { - if (modeCfg.highlightFormatting) state.formatting = "link"; - var type = getType(state); - state.linkText = false; - state.inline = state.f = linkHref; - return type; - } - - if (ch === '<' && stream.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/, false)) { - state.f = state.inline = linkInline; - if (modeCfg.highlightFormatting) state.formatting = "link"; - var type = getType(state); - if (type){ - type += " "; - } else { - type = ""; - } - return type + tokenTypes.linkInline; - } - - if (ch === '<' && stream.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/, false)) { - state.f = state.inline = linkInline; - if (modeCfg.highlightFormatting) state.formatting = "link"; - var type = getType(state); - if (type){ - type += " "; - } else { - type = ""; - } - return type + tokenTypes.linkEmail; - } - - if (ch === '<' && stream.match(/^(!--|\w)/, false)) { - var end = stream.string.indexOf(">", stream.pos); - if (end != -1) { - var atts = stream.string.substring(stream.start, end); - if (/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(atts)) state.md_inside = true; - } - stream.backUp(1); - state.htmlState = CodeMirror.startState(htmlMode); - return switchBlock(stream, state, htmlBlock); - } - - if (ch === '<' && stream.match(/^\/\w*?>/)) { - state.md_inside = false; - return "tag"; - } - - var ignoreUnderscore = false; - if (!modeCfg.underscoresBreakWords) { - if (ch === '_' && stream.peek() !== '_' && stream.match(/(\w)/, false)) { - var prevPos = stream.pos - 2; - if (prevPos >= 0) { - var prevCh = stream.string.charAt(prevPos); - if (prevCh !== '_' && prevCh.match(/(\w)/, false)) { - ignoreUnderscore = true; - } - } - } - } - if (ch === '*' || (ch === '_' && !ignoreUnderscore)) { - if (sol && stream.peek() === ' ') { - // Do nothing, surrounded by newline and space - } else if (state.strong === ch && stream.eat(ch)) { // Remove STRONG - if (modeCfg.highlightFormatting) state.formatting = "strong"; - var t = getType(state); - state.strong = false; - return t; - } else if (!state.strong && stream.eat(ch)) { // Add STRONG - state.strong = ch; - if (modeCfg.highlightFormatting) state.formatting = "strong"; - return getType(state); - } else if (state.em === ch) { // Remove EM - if (modeCfg.highlightFormatting) state.formatting = "em"; - var t = getType(state); - state.em = false; - return t; - } else if (!state.em) { // Add EM - state.em = ch; - if (modeCfg.highlightFormatting) state.formatting = "em"; - return getType(state); - } - } else if (ch === ' ') { - if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces - if (stream.peek() === ' ') { // Surrounded by spaces, ignore - return getType(state); - } else { // Not surrounded by spaces, back up pointer - stream.backUp(1); - } - } - } - - if (modeCfg.strikethrough) { - if (ch === '~' && stream.eatWhile(ch)) { - if (state.strikethrough) {// Remove strikethrough - if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; - var t = getType(state); - state.strikethrough = false; - return t; - } else if (stream.match(/^[^\s]/, false)) {// Add strikethrough - state.strikethrough = true; - if (modeCfg.highlightFormatting) state.formatting = "strikethrough"; - return getType(state); - } - } else if (ch === ' ') { - if (stream.match(/^~~/, true)) { // Probably surrounded by space - if (stream.peek() === ' ') { // Surrounded by spaces, ignore - return getType(state); - } else { // Not surrounded by spaces, back up pointer - stream.backUp(2); - } - } - } - } - - if (ch === ' ') { - if (stream.match(/ +$/, false)) { - state.trailingSpace++; - } else if (state.trailingSpace) { - state.trailingSpaceNewLine = true; - } - } - - return getType(state); - } - - function linkInline(stream, state) { - var ch = stream.next(); - - if (ch === ">") { - state.f = state.inline = inlineNormal; - if (modeCfg.highlightFormatting) state.formatting = "link"; - var type = getType(state); - if (type){ - type += " "; - } else { - type = ""; - } - return type + tokenTypes.linkInline; - } - - stream.match(/^[^>]+/, true); - - return tokenTypes.linkInline; - } - - function linkHref(stream, state) { - // Check if space, and return NULL if so (to avoid marking the space) - if(stream.eatSpace()){ - return null; - } - var ch = stream.next(); - if (ch === '(' || ch === '[') { - state.f = state.inline = getLinkHrefInside(ch === "(" ? ")" : "]", 0); - if (modeCfg.highlightFormatting) state.formatting = "link-string"; - state.linkHref = true; - return getType(state); - } - return 'error'; - } - - var linkRE = { - ")": /^(?:[^\\\(\)]|\\.|\((?:[^\\\(\)]|\\.)*\))*?(?=\))/, - "]": /^(?:[^\\\[\]]|\\.|\[(?:[^\\\[\\]]|\\.)*\])*?(?=\])/ - } - - function getLinkHrefInside(endChar) { - return function(stream, state) { - var ch = stream.next(); - - if (ch === endChar) { - state.f = state.inline = inlineNormal; - if (modeCfg.highlightFormatting) state.formatting = "link-string"; - var returnState = getType(state); - state.linkHref = false; - return returnState; - } - - stream.match(linkRE[endChar]) - state.linkHref = true; - return getType(state); - }; - } - - function footnoteLink(stream, state) { - if (stream.match(/^([^\]\\]|\\.)*\]:/, false)) { - state.f = footnoteLinkInside; - stream.next(); // Consume [ - if (modeCfg.highlightFormatting) state.formatting = "link"; - state.linkText = true; - return getType(state); - } - return switchInline(stream, state, inlineNormal); - } - - function footnoteLinkInside(stream, state) { - if (stream.match(/^\]:/, true)) { - state.f = state.inline = footnoteUrl; - if (modeCfg.highlightFormatting) state.formatting = "link"; - var returnType = getType(state); - state.linkText = false; - return returnType; - } - - stream.match(/^([^\]\\]|\\.)+/, true); - - return tokenTypes.linkText; - } - - function footnoteUrl(stream, state) { - // Check if space, and return NULL if so (to avoid marking the space) - if(stream.eatSpace()){ - return null; - } - // Match URL - stream.match(/^[^\s]+/, true); - // Check for link title - if (stream.peek() === undefined) { // End of line, set flag to check next line - state.linkTitle = true; - } else { // More content on line, check if link title - stream.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/, true); - } - state.f = state.inline = inlineNormal; - return tokenTypes.linkHref + " url"; - } - - var mode = { - startState: function() { - return { - f: blockNormal, - - prevLine: null, - thisLine: null, - - block: blockNormal, - htmlState: null, - indentation: 0, - - inline: inlineNormal, - text: handleText, - - formatting: false, - linkText: false, - linkHref: false, - linkTitle: false, - code: 0, - em: false, - strong: false, - header: 0, - hr: false, - taskList: false, - list: false, - listStack: [], - quote: 0, - trailingSpace: 0, - trailingSpaceNewLine: false, - strikethrough: false, - fencedChars: null - }; - }, - - copyState: function(s) { - return { - f: s.f, - - prevLine: s.prevLine, - thisLine: s.thisLine, - - block: s.block, - htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState), - indentation: s.indentation, - - localMode: s.localMode, - localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null, - - inline: s.inline, - text: s.text, - formatting: false, - linkTitle: s.linkTitle, - code: s.code, - em: s.em, - strong: s.strong, - strikethrough: s.strikethrough, - header: s.header, - hr: s.hr, - taskList: s.taskList, - list: s.list, - listStack: s.listStack.slice(0), - quote: s.quote, - indentedCode: s.indentedCode, - trailingSpace: s.trailingSpace, - trailingSpaceNewLine: s.trailingSpaceNewLine, - md_inside: s.md_inside, - fencedChars: s.fencedChars - }; - }, - - token: function(stream, state) { - - // Reset state.formatting - state.formatting = false; - - if (stream != state.thisLine) { - var forceBlankLine = state.header || state.hr; - - // Reset state.header and state.hr - state.header = 0; - state.hr = false; - - if (stream.match(/^\s*$/, true) || forceBlankLine) { - blankLine(state); - if (!forceBlankLine) return null - state.prevLine = null - } - - state.prevLine = state.thisLine - state.thisLine = stream - - // Reset state.taskList - state.taskList = false; - - // Reset state.trailingSpace - state.trailingSpace = 0; - state.trailingSpaceNewLine = false; - - state.f = state.block; - var indentation = stream.match(/^\s*/, true)[0].replace(/\t/g, ' ').length; - state.indentationDiff = Math.min(indentation - state.indentation, 4); - state.indentation = state.indentation + state.indentationDiff; - if (indentation > 0) return null; - } - return state.f(stream, state); - }, - - innerMode: function(state) { - if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode}; - if (state.localState) return {state: state.localState, mode: state.localMode}; - return {state: state, mode: mode}; - }, - - blankLine: blankLine, - - getType: getType, - - fold: "markdown" - }; - return mode; -}, "xml"); - -CodeMirror.defineMIME("text/x-markdown", "markdown"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/markdown/test.js b/public/plugins/codemirror-5.17.0/mode/markdown/test.js deleted file mode 100644 index 2f43a17..0000000 --- a/public/plugins/codemirror-5.17.0/mode/markdown/test.js +++ /dev/null @@ -1,990 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({tabSize: 4}, "markdown"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - var modeHighlightFormatting = CodeMirror.getMode({tabSize: 4}, {name: "markdown", highlightFormatting: true}); - function FT(name) { test.mode(name, modeHighlightFormatting, Array.prototype.slice.call(arguments, 1)); } - var modeAtxNoSpace = CodeMirror.getMode({tabSize: 4}, {name: "markdown", allowAtxHeaderWithoutSpace: true}); - function AtxNoSpaceTest(name) { test.mode(name, modeAtxNoSpace, Array.prototype.slice.call(arguments, 1)); } - var modeFenced = CodeMirror.getMode({tabSize: 4}, {name: "markdown", fencedCodeBlocks: true}); - function FencedTest(name) { test.mode(name, modeFenced, Array.prototype.slice.call(arguments, 1)); } - var modeOverrideClasses = CodeMirror.getMode({tabsize: 4}, { - name: "markdown", - strikethrough: true, - tokenTypeOverrides: { - "header" : "override-header", - "code" : "override-code", - "quote" : "override-quote", - "list1" : "override-list1", - "list2" : "override-list2", - "list3" : "override-list3", - "hr" : "override-hr", - "image" : "override-image", - "imageAltText": "override-image-alt-text", - "imageMarker": "override-image-marker", - "linkInline" : "override-link-inline", - "linkEmail" : "override-link-email", - "linkText" : "override-link-text", - "linkHref" : "override-link-href", - "em" : "override-em", - "strong" : "override-strong", - "strikethrough" : "override-strikethrough" - }}); - function TokenTypeOverrideTest(name) { test.mode(name, modeOverrideClasses, Array.prototype.slice.call(arguments, 1)); } - var modeFormattingOverride = CodeMirror.getMode({tabsize: 4}, { - name: "markdown", - highlightFormatting: true, - tokenTypeOverrides: { - "formatting" : "override-formatting" - }}); - function FormatTokenTypeOverrideTest(name) { test.mode(name, modeFormattingOverride, Array.prototype.slice.call(arguments, 1)); } - - - FT("formatting_emAsterisk", - "[em&formatting&formatting-em *][em foo][em&formatting&formatting-em *]"); - - FT("formatting_emUnderscore", - "[em&formatting&formatting-em _][em foo][em&formatting&formatting-em _]"); - - FT("formatting_strongAsterisk", - "[strong&formatting&formatting-strong **][strong foo][strong&formatting&formatting-strong **]"); - - FT("formatting_strongUnderscore", - "[strong&formatting&formatting-strong __][strong foo][strong&formatting&formatting-strong __]"); - - FT("formatting_codeBackticks", - "[comment&formatting&formatting-code `][comment foo][comment&formatting&formatting-code `]"); - - FT("formatting_doubleBackticks", - "[comment&formatting&formatting-code ``][comment foo ` bar][comment&formatting&formatting-code ``]"); - - FT("formatting_atxHeader", - "[header&header-1&formatting&formatting-header&formatting-header-1 # ][header&header-1 foo # bar ][header&header-1&formatting&formatting-header&formatting-header-1 #]"); - - FT("formatting_setextHeader", - "foo", - "[header&header-1&formatting&formatting-header&formatting-header-1 =]"); - - FT("formatting_blockquote", - "[quote"e-1&formatting&formatting-quote&formatting-quote-1 > ][quote"e-1 foo]"); - - FT("formatting_list", - "[variable-2&formatting&formatting-list&formatting-list-ul - ][variable-2 foo]"); - FT("formatting_list", - "[variable-2&formatting&formatting-list&formatting-list-ol 1. ][variable-2 foo]"); - - FT("formatting_link", - "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string&url (][string&url http://example.com/][string&formatting&formatting-link-string&url )]"); - - FT("formatting_linkReference", - "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string&url [][string&url bar][string&formatting&formatting-link-string&url ]]]", - "[link&formatting&formatting-link [][link bar][link&formatting&formatting-link ]]:] [string&url http://example.com/]"); - - FT("formatting_linkWeb", - "[link&formatting&formatting-link <][link http://example.com/][link&formatting&formatting-link >]"); - - FT("formatting_linkEmail", - "[link&formatting&formatting-link <][link user@example.com][link&formatting&formatting-link >]"); - - FT("formatting_escape", - "[formatting-escape \\*]"); - - FT("formatting_image", - "[formatting&formatting-image&image&image-marker !][formatting&formatting-image&image&image-alt-text&link [[][image&image-alt-text&link alt text][formatting&formatting-image&image&image-alt-text&link ]]][formatting&formatting-link-string&string&url (][url&string http://link.to/image.jpg][formatting&formatting-link-string&string&url )]"); - - MT("plainText", - "foo"); - - // Don't style single trailing space - MT("trailingSpace1", - "foo "); - - // Two or more trailing spaces should be styled with line break character - MT("trailingSpace2", - "foo[trailing-space-a ][trailing-space-new-line ]"); - - MT("trailingSpace3", - "foo[trailing-space-a ][trailing-space-b ][trailing-space-new-line ]"); - - MT("trailingSpace4", - "foo[trailing-space-a ][trailing-space-b ][trailing-space-a ][trailing-space-new-line ]"); - - // Code blocks using 4 spaces (regardless of CodeMirror.tabSize value) - MT("codeBlocksUsing4Spaces", - " [comment foo]"); - - // Code blocks using 4 spaces with internal indentation - MT("codeBlocksUsing4SpacesIndentation", - " [comment bar]", - " [comment hello]", - " [comment world]", - " [comment foo]", - "bar"); - - // Code blocks should end even after extra indented lines - MT("codeBlocksWithTrailingIndentedLine", - " [comment foo]", - " [comment bar]", - " [comment baz]", - " ", - "hello"); - - // Code blocks using 1 tab (regardless of CodeMirror.indentWithTabs value) - MT("codeBlocksUsing1Tab", - "\t[comment foo]"); - - // No code blocks directly after paragraph - // http://spec.commonmark.org/0.19/#example-65 - MT("noCodeBlocksAfterParagraph", - "Foo", - " Bar"); - - // Inline code using backticks - MT("inlineCodeUsingBackticks", - "foo [comment `bar`]"); - - // Block code using single backtick (shouldn't work) - MT("blockCodeSingleBacktick", - "[comment `]", - "[comment foo]", - "[comment `]"); - - // Unclosed backticks - // Instead of simply marking as CODE, it would be nice to have an - // incomplete flag for CODE, that is styled slightly different. - MT("unclosedBackticks", - "foo [comment `bar]"); - - // Per documentation: "To include a literal backtick character within a - // code span, you can use multiple backticks as the opening and closing - // delimiters" - MT("doubleBackticks", - "[comment ``foo ` bar``]"); - - // Tests based on Dingus - // http://daringfireball.net/projects/markdown/dingus - // - // Multiple backticks within an inline code block - MT("consecutiveBackticks", - "[comment `foo```bar`]"); - - // Multiple backticks within an inline code block with a second code block - MT("consecutiveBackticks", - "[comment `foo```bar`] hello [comment `world`]"); - - // Unclosed with several different groups of backticks - MT("unclosedBackticks", - "[comment ``foo ``` bar` hello]"); - - // Closed with several different groups of backticks - MT("closedBackticks", - "[comment ``foo ``` bar` hello``] world"); - - // atx headers - // http://daringfireball.net/projects/markdown/syntax#header - - MT("atxH1", - "[header&header-1 # foo]"); - - MT("atxH2", - "[header&header-2 ## foo]"); - - MT("atxH3", - "[header&header-3 ### foo]"); - - MT("atxH4", - "[header&header-4 #### foo]"); - - MT("atxH5", - "[header&header-5 ##### foo]"); - - MT("atxH6", - "[header&header-6 ###### foo]"); - - // http://spec.commonmark.org/0.19/#example-24 - MT("noAtxH7", - "####### foo"); - - // http://spec.commonmark.org/0.19/#example-25 - MT("noAtxH1WithoutSpace", - "#5 bolt"); - - // CommonMark requires a space after # but most parsers don't - AtxNoSpaceTest("atxNoSpaceAllowed_H1NoSpace", - "[header&header-1 #foo]"); - - AtxNoSpaceTest("atxNoSpaceAllowed_H4NoSpace", - "[header&header-4 ####foo]"); - - AtxNoSpaceTest("atxNoSpaceAllowed_H1Space", - "[header&header-1 # foo]"); - - // Inline styles should be parsed inside headers - MT("atxH1inline", - "[header&header-1 # foo ][header&header-1&em *bar*]"); - - // Setext headers - H1, H2 - // Per documentation, "Any number of underlining =’s or -’s will work." - // http://daringfireball.net/projects/markdown/syntax#header - // Ideally, the text would be marked as `header` as well, but this is - // not really feasible at the moment. So, instead, we're testing against - // what works today, to avoid any regressions. - // - // Check if single underlining = works - MT("setextH1", - "foo", - "[header&header-1 =]"); - - // Check if 3+ ='s work - MT("setextH1", - "foo", - "[header&header-1 ===]"); - - // Check if single underlining - works - MT("setextH2", - "foo", - "[header&header-2 -]"); - - // Check if 3+ -'s work - MT("setextH2", - "foo", - "[header&header-2 ---]"); - - // http://spec.commonmark.org/0.19/#example-45 - MT("setextH2AllowSpaces", - "foo", - " [header&header-2 ---- ]"); - - // http://spec.commonmark.org/0.19/#example-44 - MT("noSetextAfterIndentedCodeBlock", - " [comment foo]", - "[hr ---]"); - - // http://spec.commonmark.org/0.19/#example-51 - MT("noSetextAfterQuote", - "[quote"e-1 > foo]", - "[hr ---]"); - - MT("noSetextAfterList", - "[variable-2 - foo]", - "[hr ---]"); - - // Single-line blockquote with trailing space - MT("blockquoteSpace", - "[quote"e-1 > foo]"); - - // Single-line blockquote - MT("blockquoteNoSpace", - "[quote"e-1 >foo]"); - - // No blank line before blockquote - MT("blockquoteNoBlankLine", - "foo", - "[quote"e-1 > bar]"); - - // Nested blockquote - MT("blockquoteSpace", - "[quote"e-1 > foo]", - "[quote"e-1 >][quote"e-2 > foo]", - "[quote"e-1 >][quote"e-2 >][quote"e-3 > foo]"); - - // Single-line blockquote followed by normal paragraph - MT("blockquoteThenParagraph", - "[quote"e-1 >foo]", - "", - "bar"); - - // Multi-line blockquote (lazy mode) - MT("multiBlockquoteLazy", - "[quote"e-1 >foo]", - "[quote"e-1 bar]"); - - // Multi-line blockquote followed by normal paragraph (lazy mode) - MT("multiBlockquoteLazyThenParagraph", - "[quote"e-1 >foo]", - "[quote"e-1 bar]", - "", - "hello"); - - // Multi-line blockquote (non-lazy mode) - MT("multiBlockquote", - "[quote"e-1 >foo]", - "[quote"e-1 >bar]"); - - // Multi-line blockquote followed by normal paragraph (non-lazy mode) - MT("multiBlockquoteThenParagraph", - "[quote"e-1 >foo]", - "[quote"e-1 >bar]", - "", - "hello"); - - // Header with leading space after continued blockquote (#3287, negative indentation) - MT("headerAfterContinuedBlockquote", - "[quote"e-1 > foo]", - "[quote"e-1 bar]", - "", - " [header&header-1 # hello]"); - - // Check list types - - MT("listAsterisk", - "foo", - "bar", - "", - "[variable-2 * foo]", - "[variable-2 * bar]"); - - MT("listPlus", - "foo", - "bar", - "", - "[variable-2 + foo]", - "[variable-2 + bar]"); - - MT("listDash", - "foo", - "bar", - "", - "[variable-2 - foo]", - "[variable-2 - bar]"); - - MT("listNumber", - "foo", - "bar", - "", - "[variable-2 1. foo]", - "[variable-2 2. bar]"); - - // Lists require a preceding blank line (per Dingus) - MT("listBogus", - "foo", - "1. bar", - "2. hello"); - - // List after hr - MT("listAfterHr", - "[hr ---]", - "[variable-2 - bar]"); - - // List after header - MT("listAfterHeader", - "[header&header-1 # foo]", - "[variable-2 - bar]"); - - // hr after list - MT("hrAfterList", - "[variable-2 - foo]", - "[hr -----]"); - - // Formatting in lists (*) - MT("listAsteriskFormatting", - "[variable-2 * ][variable-2&em *foo*][variable-2 bar]", - "[variable-2 * ][variable-2&strong **foo**][variable-2 bar]", - "[variable-2 * ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", - "[variable-2 * ][variable-2&comment `foo`][variable-2 bar]"); - - // Formatting in lists (+) - MT("listPlusFormatting", - "[variable-2 + ][variable-2&em *foo*][variable-2 bar]", - "[variable-2 + ][variable-2&strong **foo**][variable-2 bar]", - "[variable-2 + ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", - "[variable-2 + ][variable-2&comment `foo`][variable-2 bar]"); - - // Formatting in lists (-) - MT("listDashFormatting", - "[variable-2 - ][variable-2&em *foo*][variable-2 bar]", - "[variable-2 - ][variable-2&strong **foo**][variable-2 bar]", - "[variable-2 - ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", - "[variable-2 - ][variable-2&comment `foo`][variable-2 bar]"); - - // Formatting in lists (1.) - MT("listNumberFormatting", - "[variable-2 1. ][variable-2&em *foo*][variable-2 bar]", - "[variable-2 2. ][variable-2&strong **foo**][variable-2 bar]", - "[variable-2 3. ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2 bar]", - "[variable-2 4. ][variable-2&comment `foo`][variable-2 bar]"); - - // Paragraph lists - MT("listParagraph", - "[variable-2 * foo]", - "", - "[variable-2 * bar]"); - - // Multi-paragraph lists - // - // 4 spaces - MT("listMultiParagraph", - "[variable-2 * foo]", - "", - "[variable-2 * bar]", - "", - " [variable-2 hello]"); - - // 4 spaces, extra blank lines (should still be list, per Dingus) - MT("listMultiParagraphExtra", - "[variable-2 * foo]", - "", - "[variable-2 * bar]", - "", - "", - " [variable-2 hello]"); - - // 4 spaces, plus 1 space (should still be list, per Dingus) - MT("listMultiParagraphExtraSpace", - "[variable-2 * foo]", - "", - "[variable-2 * bar]", - "", - " [variable-2 hello]", - "", - " [variable-2 world]"); - - // 1 tab - MT("listTab", - "[variable-2 * foo]", - "", - "[variable-2 * bar]", - "", - "\t[variable-2 hello]"); - - // No indent - MT("listNoIndent", - "[variable-2 * foo]", - "", - "[variable-2 * bar]", - "", - "hello"); - - MT("listCommonMarkIndentationCode", - "[variable-2 * Code blocks also affect]", - " [variable-3 * The next level starts where the contents start.]", - " [variable-3 * Anything less than that will keep the item on the same level.]", - " [variable-3 * Each list item can indent the first level further and further.]", - " [variable-3 * For the most part, this makes sense while writing a list.]", - " [keyword * This means two items with same indentation can be different levels.]", - " [keyword * Each level has an indent requirement that can change between items.]", - " [keyword * A list item that meets this will be part of the next level.]", - " [variable-3 * Otherwise, it will be part of the level where it does meet this.]", - " [variable-2 * World]"); - - // Blockquote - MT("blockquote", - "[variable-2 * foo]", - "", - "[variable-2 * bar]", - "", - " [variable-2"e"e-1 > hello]"); - - // Code block - MT("blockquoteCode", - "[variable-2 * foo]", - "", - "[variable-2 * bar]", - "", - " [comment > hello]", - "", - " [variable-2 world]"); - - // Code block followed by text - MT("blockquoteCodeText", - "[variable-2 * foo]", - "", - " [variable-2 bar]", - "", - " [comment hello]", - "", - " [variable-2 world]"); - - // Nested list - - MT("listAsteriskNested", - "[variable-2 * foo]", - "", - " [variable-3 * bar]"); - - MT("listPlusNested", - "[variable-2 + foo]", - "", - " [variable-3 + bar]"); - - MT("listDashNested", - "[variable-2 - foo]", - "", - " [variable-3 - bar]"); - - MT("listNumberNested", - "[variable-2 1. foo]", - "", - " [variable-3 2. bar]"); - - MT("listMixed", - "[variable-2 * foo]", - "", - " [variable-3 + bar]", - "", - " [keyword - hello]", - "", - " [variable-2 1. world]"); - - MT("listBlockquote", - "[variable-2 * foo]", - "", - " [variable-3 + bar]", - "", - " [quote"e-1&variable-3 > hello]"); - - MT("listCode", - "[variable-2 * foo]", - "", - " [variable-3 + bar]", - "", - " [comment hello]"); - - // Code with internal indentation - MT("listCodeIndentation", - "[variable-2 * foo]", - "", - " [comment bar]", - " [comment hello]", - " [comment world]", - " [comment foo]", - " [variable-2 bar]"); - - // List nesting edge cases - MT("listNested", - "[variable-2 * foo]", - "", - " [variable-3 * bar]", - "", - " [variable-3 hello]" - ); - MT("listNested", - "[variable-2 * foo]", - "", - " [variable-3 * bar]", - "", - " [keyword * foo]" - ); - - // Code followed by text - MT("listCodeText", - "[variable-2 * foo]", - "", - " [comment bar]", - "", - "hello"); - - // Following tests directly from official Markdown documentation - // http://daringfireball.net/projects/markdown/syntax#hr - - MT("hrSpace", - "[hr * * *]"); - - MT("hr", - "[hr ***]"); - - MT("hrLong", - "[hr *****]"); - - MT("hrSpaceDash", - "[hr - - -]"); - - MT("hrDashLong", - "[hr ---------------------------------------]"); - - //Images - MT("Images", - "[image&image-marker !][image&image-alt-text&link [[alt text]]][string&url (http://link.to/image.jpg)]") - - //Images with highlight alt text - MT("imageEm", - "[image&image-marker !][image&image-alt-text&link [[][image-alt-text&em&image&link *alt text*][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)]"); - - MT("imageStrong", - "[image&image-marker !][image&image-alt-text&link [[][image-alt-text&strong&image&link **alt text**][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)]"); - - MT("imageEmStrong", - "[image&image-marker !][image&image-alt-text&link [[][image-alt-text&image&strong&link **][image&image-alt-text&em&strong&link *alt text**][image&image-alt-text&em&link *][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)]"); - - // Inline link with title - MT("linkTitle", - "[link [[foo]]][string&url (http://example.com/ \"bar\")] hello"); - - // Inline link without title - MT("linkNoTitle", - "[link [[foo]]][string&url (http://example.com/)] bar"); - - // Inline link with image - MT("linkImage", - "[link [[][link&image&image-marker !][link&image&image-alt-text&link [[alt text]]][string&url (http://link.to/image.jpg)][link ]]][string&url (http://example.com/)] bar"); - - // Inline link with Em - MT("linkEm", - "[link [[][link&em *foo*][link ]]][string&url (http://example.com/)] bar"); - - // Inline link with Strong - MT("linkStrong", - "[link [[][link&strong **foo**][link ]]][string&url (http://example.com/)] bar"); - - // Inline link with EmStrong - MT("linkEmStrong", - "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string&url (http://example.com/)] bar"); - - // Image with title - MT("imageTitle", - "[image&image-marker !][image&image-alt-text&link [[alt text]]][string&url (http://example.com/ \"bar\")] hello"); - - // Image without title - MT("imageNoTitle", - "[image&image-marker !][image&image-alt-text&link [[alt text]]][string&url (http://example.com/)] bar"); - - // Image with asterisks - MT("imageAsterisks", - "[image&image-marker !][image&image-alt-text&link [[ ][image&image-alt-text&em&link *alt text*][image&image-alt-text&link ]]][string&url (http://link.to/image.jpg)] bar"); - - // Not a link. Should be normal text due to square brackets being used - // regularly in text, especially in quoted material, and no space is allowed - // between square brackets and parentheses (per Dingus). - MT("notALink", - "[[foo]] (bar)"); - - // Reference-style links - MT("linkReference", - "[link [[foo]]][string&url [[bar]]] hello"); - - // Reference-style links with Em - MT("linkReferenceEm", - "[link [[][link&em *foo*][link ]]][string&url [[bar]]] hello"); - - // Reference-style links with Strong - MT("linkReferenceStrong", - "[link [[][link&strong **foo**][link ]]][string&url [[bar]]] hello"); - - // Reference-style links with EmStrong - MT("linkReferenceEmStrong", - "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string&url [[bar]]] hello"); - - // Reference-style links with optional space separator (per documentation) - // "You can optionally use a space to separate the sets of brackets" - MT("linkReferenceSpace", - "[link [[foo]]] [string&url [[bar]]] hello"); - - // Should only allow a single space ("...use *a* space...") - MT("linkReferenceDoubleSpace", - "[[foo]] [[bar]] hello"); - - // Reference-style links with implicit link name - MT("linkImplicit", - "[link [[foo]]][string&url [[]]] hello"); - - // @todo It would be nice if, at some point, the document was actually - // checked to see if the referenced link exists - - // Link label, for reference-style links (taken from documentation) - - MT("labelNoTitle", - "[link [[foo]]:] [string&url http://example.com/]"); - - MT("labelIndented", - " [link [[foo]]:] [string&url http://example.com/]"); - - MT("labelSpaceTitle", - "[link [[foo bar]]:] [string&url http://example.com/ \"hello\"]"); - - MT("labelDoubleTitle", - "[link [[foo bar]]:] [string&url http://example.com/ \"hello\"] \"world\""); - - MT("labelTitleDoubleQuotes", - "[link [[foo]]:] [string&url http://example.com/ \"bar\"]"); - - MT("labelTitleSingleQuotes", - "[link [[foo]]:] [string&url http://example.com/ 'bar']"); - - MT("labelTitleParentheses", - "[link [[foo]]:] [string&url http://example.com/ (bar)]"); - - MT("labelTitleInvalid", - "[link [[foo]]:] [string&url http://example.com/] bar"); - - MT("labelLinkAngleBrackets", - "[link [[foo]]:] [string&url \"bar\"]"); - - MT("labelTitleNextDoubleQuotes", - "[link [[foo]]:] [string&url http://example.com/]", - "[string \"bar\"] hello"); - - MT("labelTitleNextSingleQuotes", - "[link [[foo]]:] [string&url http://example.com/]", - "[string 'bar'] hello"); - - MT("labelTitleNextParentheses", - "[link [[foo]]:] [string&url http://example.com/]", - "[string (bar)] hello"); - - MT("labelTitleNextMixed", - "[link [[foo]]:] [string&url http://example.com/]", - "(bar\" hello"); - - MT("labelEscape", - "[link [[foo \\]] ]]:] [string&url http://example.com/]"); - - MT("labelEscapeColon", - "[link [[foo \\]]: bar]]:] [string&url http://example.com/]"); - - MT("labelEscapeEnd", - "[[foo\\]]: http://example.com/"); - - MT("linkWeb", - "[link ] foo"); - - MT("linkWebDouble", - "[link ] foo [link ]"); - - MT("linkEmail", - "[link ] foo"); - - MT("linkEmailDouble", - "[link ] foo [link ]"); - - MT("emAsterisk", - "[em *foo*] bar"); - - MT("emUnderscore", - "[em _foo_] bar"); - - MT("emInWordAsterisk", - "foo[em *bar*]hello"); - - MT("emInWordUnderscore", - "foo[em _bar_]hello"); - - // Per documentation: "...surround an * or _ with spaces, it’ll be - // treated as a literal asterisk or underscore." - - MT("emEscapedBySpaceIn", - "foo [em _bar _ hello_] world"); - - MT("emEscapedBySpaceOut", - "foo _ bar[em _hello_]world"); - - MT("emEscapedByNewline", - "foo", - "_ bar[em _hello_]world"); - - // Unclosed emphasis characters - // Instead of simply marking as EM / STRONG, it would be nice to have an - // incomplete flag for EM and STRONG, that is styled slightly different. - MT("emIncompleteAsterisk", - "foo [em *bar]"); - - MT("emIncompleteUnderscore", - "foo [em _bar]"); - - MT("strongAsterisk", - "[strong **foo**] bar"); - - MT("strongUnderscore", - "[strong __foo__] bar"); - - MT("emStrongAsterisk", - "[em *foo][em&strong **bar*][strong hello**] world"); - - MT("emStrongUnderscore", - "[em _foo][em&strong __bar_][strong hello__] world"); - - // "...same character must be used to open and close an emphasis span."" - MT("emStrongMixed", - "[em _foo][em&strong **bar*hello__ world]"); - - MT("emStrongMixed", - "[em *foo][em&strong __bar_hello** world]"); - - MT("linkWithNestedParens", - "[link [[foo]]][string&url (bar(baz))]") - - // These characters should be escaped: - // \ backslash - // ` backtick - // * asterisk - // _ underscore - // {} curly braces - // [] square brackets - // () parentheses - // # hash mark - // + plus sign - // - minus sign (hyphen) - // . dot - // ! exclamation mark - - MT("escapeBacktick", - "foo \\`bar\\`"); - - MT("doubleEscapeBacktick", - "foo \\\\[comment `bar\\\\`]"); - - MT("escapeAsterisk", - "foo \\*bar\\*"); - - MT("doubleEscapeAsterisk", - "foo \\\\[em *bar\\\\*]"); - - MT("escapeUnderscore", - "foo \\_bar\\_"); - - MT("doubleEscapeUnderscore", - "foo \\\\[em _bar\\\\_]"); - - MT("escapeHash", - "\\# foo"); - - MT("doubleEscapeHash", - "\\\\# foo"); - - MT("escapeNewline", - "\\", - "[em *foo*]"); - - // Class override tests - TokenTypeOverrideTest("overrideHeader1", - "[override-header&override-header-1 # Foo]"); - - TokenTypeOverrideTest("overrideHeader2", - "[override-header&override-header-2 ## Foo]"); - - TokenTypeOverrideTest("overrideHeader3", - "[override-header&override-header-3 ### Foo]"); - - TokenTypeOverrideTest("overrideHeader4", - "[override-header&override-header-4 #### Foo]"); - - TokenTypeOverrideTest("overrideHeader5", - "[override-header&override-header-5 ##### Foo]"); - - TokenTypeOverrideTest("overrideHeader6", - "[override-header&override-header-6 ###### Foo]"); - - TokenTypeOverrideTest("overrideCode", - "[override-code `foo`]"); - - TokenTypeOverrideTest("overrideCodeBlock", - "[override-code ```]", - "[override-code foo]", - "[override-code ```]"); - - TokenTypeOverrideTest("overrideQuote", - "[override-quote&override-quote-1 > foo]", - "[override-quote&override-quote-1 > bar]"); - - TokenTypeOverrideTest("overrideQuoteNested", - "[override-quote&override-quote-1 > foo]", - "[override-quote&override-quote-1 >][override-quote&override-quote-2 > bar]", - "[override-quote&override-quote-1 >][override-quote&override-quote-2 >][override-quote&override-quote-3 > baz]"); - - TokenTypeOverrideTest("overrideLists", - "[override-list1 - foo]", - "", - " [override-list2 + bar]", - "", - " [override-list3 * baz]", - "", - " [override-list1 1. qux]", - "", - " [override-list2 - quux]"); - - TokenTypeOverrideTest("overrideHr", - "[override-hr * * *]"); - - TokenTypeOverrideTest("overrideImage", - "[override-image&override-image-marker !][override-image&override-image-alt-text&link [[alt text]]][override-link-href&url (http://link.to/image.jpg)]"); - - TokenTypeOverrideTest("overrideLinkText", - "[override-link-text [[foo]]][override-link-href&url (http://example.com)]"); - - TokenTypeOverrideTest("overrideLinkEmailAndInline", - "[override-link-email <][override-link-inline foo@example.com>]"); - - TokenTypeOverrideTest("overrideEm", - "[override-em *foo*]"); - - TokenTypeOverrideTest("overrideStrong", - "[override-strong **foo**]"); - - TokenTypeOverrideTest("overrideStrikethrough", - "[override-strikethrough ~~foo~~]"); - - FormatTokenTypeOverrideTest("overrideFormatting", - "[override-formatting-escape \\*]"); - - // Tests to make sure GFM-specific things aren't getting through - - MT("taskList", - "[variable-2 * [ ]] bar]"); - - MT("noFencedCodeBlocks", - "~~~", - "foo", - "~~~"); - - FencedTest("fencedCodeBlocks", - "[comment ```]", - "[comment foo]", - "[comment ```]", - "bar"); - - FencedTest("fencedCodeBlocksMultipleChars", - "[comment `````]", - "[comment foo]", - "[comment ```]", - "[comment foo]", - "[comment `````]", - "bar"); - - FencedTest("fencedCodeBlocksTildes", - "[comment ~~~]", - "[comment foo]", - "[comment ~~~]", - "bar"); - - FencedTest("fencedCodeBlocksTildesMultipleChars", - "[comment ~~~~~]", - "[comment ~~~]", - "[comment foo]", - "[comment ~~~~~]", - "bar"); - - FencedTest("fencedCodeBlocksMultipleChars", - "[comment `````]", - "[comment foo]", - "[comment ```]", - "[comment foo]", - "[comment `````]", - "bar"); - - FencedTest("fencedCodeBlocksMixed", - "[comment ~~~]", - "[comment ```]", - "[comment foo]", - "[comment ~~~]", - "bar"); - - // Tests that require XML mode - - MT("xmlMode", - "[tag&bracket <][tag div][tag&bracket >]", - "*foo*", - "[tag&bracket <][tag http://github.com][tag&bracket />]", - "[tag&bracket ]", - "[link ]"); - - MT("xmlModeWithMarkdownInside", - "[tag&bracket <][tag div] [attribute markdown]=[string 1][tag&bracket >]", - "[em *foo*]", - "[link ]", - "[tag
]", - "[link ]", - "[tag&bracket <][tag div][tag&bracket >]", - "[tag&bracket ]"); - -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/mathematica/index.html b/public/plugins/codemirror-5.17.0/mode/mathematica/index.html deleted file mode 100644 index 57c4298..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mathematica/index.html +++ /dev/null @@ -1,72 +0,0 @@ - - -CodeMirror: Mathematica mode - - - - - - - - - - -
-

Mathematica mode

- - - - - - -

MIME types defined: text/x-mathematica (Mathematica).

-
diff --git a/public/plugins/codemirror-5.17.0/mode/mathematica/mathematica.js b/public/plugins/codemirror-5.17.0/mode/mathematica/mathematica.js deleted file mode 100644 index d697708..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mathematica/mathematica.js +++ /dev/null @@ -1,176 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Mathematica mode copyright (c) 2015 by Calin Barbat -// Based on code by Patrick Scheibe (halirutan) -// See: https://github.com/halirutan/Mathematica-Source-Highlighting/tree/master/src/lang-mma.js - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('mathematica', function(_config, _parserConfig) { - - // used pattern building blocks - var Identifier = '[a-zA-Z\\$][a-zA-Z0-9\\$]*'; - var pBase = "(?:\\d+)"; - var pFloat = "(?:\\.\\d+|\\d+\\.\\d*|\\d+)"; - var pFloatBase = "(?:\\.\\w+|\\w+\\.\\w*|\\w+)"; - var pPrecision = "(?:`(?:`?"+pFloat+")?)"; - - // regular expressions - var reBaseForm = new RegExp('(?:'+pBase+'(?:\\^\\^'+pFloatBase+pPrecision+'?(?:\\*\\^[+-]?\\d+)?))'); - var reFloatForm = new RegExp('(?:' + pFloat + pPrecision + '?(?:\\*\\^[+-]?\\d+)?)'); - var reIdInContext = new RegExp('(?:`?)(?:' + Identifier + ')(?:`(?:' + Identifier + '))*(?:`?)'); - - function tokenBase(stream, state) { - var ch; - - // get next character - ch = stream.next(); - - // string - if (ch === '"') { - state.tokenize = tokenString; - return state.tokenize(stream, state); - } - - // comment - if (ch === '(') { - if (stream.eat('*')) { - state.commentLevel++; - state.tokenize = tokenComment; - return state.tokenize(stream, state); - } - } - - // go back one character - stream.backUp(1); - - // look for numbers - // Numbers in a baseform - if (stream.match(reBaseForm, true, false)) { - return 'number'; - } - - // Mathematica numbers. Floats (1.2, .2, 1.) can have optionally a precision (`float) or an accuracy definition - // (``float). Note: while 1.2` is possible 1.2`` is not. At the end an exponent (float*^+12) can follow. - if (stream.match(reFloatForm, true, false)) { - return 'number'; - } - - /* In[23] and Out[34] */ - if (stream.match(/(?:In|Out)\[[0-9]*\]/, true, false)) { - return 'atom'; - } - - // usage - if (stream.match(/([a-zA-Z\$]+(?:`?[a-zA-Z0-9\$])*::usage)/, true, false)) { - return 'meta'; - } - - // message - if (stream.match(/([a-zA-Z\$]+(?:`?[a-zA-Z0-9\$])*::[a-zA-Z\$][a-zA-Z0-9\$]*):?/, true, false)) { - return 'string-2'; - } - - // this makes a look-ahead match for something like variable:{_Integer} - // the match is then forwarded to the mma-patterns tokenizer. - if (stream.match(/([a-zA-Z\$][a-zA-Z0-9\$]*\s*:)(?:(?:[a-zA-Z\$][a-zA-Z0-9\$]*)|(?:[^:=>~@\^\&\*\)\[\]'\?,\|])).*/, true, false)) { - return 'variable-2'; - } - - // catch variables which are used together with Blank (_), BlankSequence (__) or BlankNullSequence (___) - // Cannot start with a number, but can have numbers at any other position. Examples - // blub__Integer, a1_, b34_Integer32 - if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) { - return 'variable-2'; - } - if (stream.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+/, true, false)) { - return 'variable-2'; - } - if (stream.match(/_+[a-zA-Z\$][a-zA-Z0-9\$]*/, true, false)) { - return 'variable-2'; - } - - // Named characters in Mathematica, like \[Gamma]. - if (stream.match(/\\\[[a-zA-Z\$][a-zA-Z0-9\$]*\]/, true, false)) { - return 'variable-3'; - } - - // Match all braces separately - if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) { - return 'bracket'; - } - - // Catch Slots (#, ##, #3, ##9 and the V10 named slots #name). I have never seen someone using more than one digit after #, so we match - // only one. - if (stream.match(/(?:#[a-zA-Z\$][a-zA-Z0-9\$]*|#+[0-9]?)/, true, false)) { - return 'variable-2'; - } - - // Literals like variables, keywords, functions - if (stream.match(reIdInContext, true, false)) { - return 'keyword'; - } - - // operators. Note that operators like @@ or /; are matched separately for each symbol. - if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/, true, false)) { - return 'operator'; - } - - // everything else is an error - stream.next(); // advance the stream. - return 'error'; - } - - function tokenString(stream, state) { - var next, end = false, escaped = false; - while ((next = stream.next()) != null) { - if (next === '"' && !escaped) { - end = true; - break; - } - escaped = !escaped && next === '\\'; - } - if (end && !escaped) { - state.tokenize = tokenBase; - } - return 'string'; - }; - - function tokenComment(stream, state) { - var prev, next; - while(state.commentLevel > 0 && (next = stream.next()) != null) { - if (prev === '(' && next === '*') state.commentLevel++; - if (prev === '*' && next === ')') state.commentLevel--; - prev = next; - } - if (state.commentLevel <= 0) { - state.tokenize = tokenBase; - } - return 'comment'; - } - - return { - startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, - token: function(stream, state) { - if (stream.eatSpace()) return null; - return state.tokenize(stream, state); - }, - blockCommentStart: "(*", - blockCommentEnd: "*)" - }; -}); - -CodeMirror.defineMIME('text/x-mathematica', { - name: 'mathematica' -}); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/mbox/index.html b/public/plugins/codemirror-5.17.0/mode/mbox/index.html deleted file mode 100644 index 248ea98..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mbox/index.html +++ /dev/null @@ -1,44 +0,0 @@ - - -CodeMirror: mbox mode - - - - - - - - - -
-

mbox mode

-
- - -

MIME types defined: application/mbox.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/mbox/mbox.js b/public/plugins/codemirror-5.17.0/mode/mbox/mbox.js deleted file mode 100644 index ba2416a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mbox/mbox.js +++ /dev/null @@ -1,129 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -var rfc2822 = [ - "From", "Sender", "Reply-To", "To", "Cc", "Bcc", "Message-ID", - "In-Reply-To", "References", "Resent-From", "Resent-Sender", "Resent-To", - "Resent-Cc", "Resent-Bcc", "Resent-Message-ID", "Return-Path", "Received" -]; -var rfc2822NoEmail = [ - "Date", "Subject", "Comments", "Keywords", "Resent-Date" -]; - -CodeMirror.registerHelper("hintWords", "mbox", rfc2822.concat(rfc2822NoEmail)); - -var whitespace = /^[ \t]/; -var separator = /^From /; // See RFC 4155 -var rfc2822Header = new RegExp("^(" + rfc2822.join("|") + "): "); -var rfc2822HeaderNoEmail = new RegExp("^(" + rfc2822NoEmail.join("|") + "): "); -var header = /^[^:]+:/; // Optional fields defined in RFC 2822 -var email = /^[^ ]+@[^ ]+/; -var untilEmail = /^.*?(?=[^ ]+?@[^ ]+)/; -var bracketedEmail = /^<.*?>/; -var untilBracketedEmail = /^.*?(?=<.*>)/; - -function styleForHeader(header) { - if (header === "Subject") return "header"; - return "string"; -} - -function readToken(stream, state) { - if (stream.sol()) { - // From last line - state.inSeparator = false; - if (state.inHeader && stream.match(whitespace)) { - // Header folding - return null; - } else { - state.inHeader = false; - state.header = null; - } - - if (stream.match(separator)) { - state.inHeaders = true; - state.inSeparator = true; - return "atom"; - } - - var match; - var emailPermitted = false; - if ((match = stream.match(rfc2822HeaderNoEmail)) || - (emailPermitted = true) && (match = stream.match(rfc2822Header))) { - state.inHeaders = true; - state.inHeader = true; - state.emailPermitted = emailPermitted; - state.header = match[1]; - return "atom"; - } - - // Use vim's heuristics: recognize custom headers only if the line is in a - // block of legitimate headers. - if (state.inHeaders && (match = stream.match(header))) { - state.inHeader = true; - state.emailPermitted = true; - state.header = match[1]; - return "atom"; - } - - state.inHeaders = false; - stream.skipToEnd(); - return null; - } - - if (state.inSeparator) { - if (stream.match(email)) return "link"; - if (stream.match(untilEmail)) return "atom"; - stream.skipToEnd(); - return "atom"; - } - - if (state.inHeader) { - var style = styleForHeader(state.header); - - if (state.emailPermitted) { - if (stream.match(bracketedEmail)) return style + " link"; - if (stream.match(untilBracketedEmail)) return style; - } - stream.skipToEnd(); - return style; - } - - stream.skipToEnd(); - return null; -}; - -CodeMirror.defineMode("mbox", function() { - return { - startState: function() { - return { - // Is in a mbox separator - inSeparator: false, - // Is in a mail header - inHeader: false, - // If bracketed email is permitted. Only applicable when inHeader - emailPermitted: false, - // Name of current header - header: null, - // Is in a region of mail headers - inHeaders: false - }; - }, - token: readToken, - blankLine: function(state) { - state.inHeaders = state.inSeparator = state.inHeader = false; - } - }; -}); - -CodeMirror.defineMIME("application/mbox", "mbox"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/meta.js b/public/plugins/codemirror-5.17.0/mode/meta.js deleted file mode 100644 index eb25e24..0000000 --- a/public/plugins/codemirror-5.17.0/mode/meta.js +++ /dev/null @@ -1,208 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.modeInfo = [ - {name: "APL", mime: "text/apl", mode: "apl", ext: ["dyalog", "apl"]}, - {name: "PGP", mimes: ["application/pgp", "application/pgp-keys", "application/pgp-signature"], mode: "asciiarmor", ext: ["pgp"]}, - {name: "ASN.1", mime: "text/x-ttcn-asn", mode: "asn.1", ext: ["asn", "asn1"]}, - {name: "Asterisk", mime: "text/x-asterisk", mode: "asterisk", file: /^extensions\.conf$/i}, - {name: "Brainfuck", mime: "text/x-brainfuck", mode: "brainfuck", ext: ["b", "bf"]}, - {name: "C", mime: "text/x-csrc", mode: "clike", ext: ["c", "h"]}, - {name: "C++", mime: "text/x-c++src", mode: "clike", ext: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"], alias: ["cpp"]}, - {name: "Cobol", mime: "text/x-cobol", mode: "cobol", ext: ["cob", "cpy"]}, - {name: "C#", mime: "text/x-csharp", mode: "clike", ext: ["cs"], alias: ["csharp"]}, - {name: "Clojure", mime: "text/x-clojure", mode: "clojure", ext: ["clj", "cljc", "cljx"]}, - {name: "ClojureScript", mime: "text/x-clojurescript", mode: "clojure", ext: ["cljs"]}, - {name: "Closure Stylesheets (GSS)", mime: "text/x-gss", mode: "css", ext: ["gss"]}, - {name: "CMake", mime: "text/x-cmake", mode: "cmake", ext: ["cmake", "cmake.in"], file: /^CMakeLists.txt$/}, - {name: "CoffeeScript", mime: "text/x-coffeescript", mode: "coffeescript", ext: ["coffee"], alias: ["coffee", "coffee-script"]}, - {name: "Common Lisp", mime: "text/x-common-lisp", mode: "commonlisp", ext: ["cl", "lisp", "el"], alias: ["lisp"]}, - {name: "Cypher", mime: "application/x-cypher-query", mode: "cypher", ext: ["cyp", "cypher"]}, - {name: "Cython", mime: "text/x-cython", mode: "python", ext: ["pyx", "pxd", "pxi"]}, - {name: "Crystal", mime: "text/x-crystal", mode: "crystal", ext: ["cr"]}, - {name: "CSS", mime: "text/css", mode: "css", ext: ["css"]}, - {name: "CQL", mime: "text/x-cassandra", mode: "sql", ext: ["cql"]}, - {name: "D", mime: "text/x-d", mode: "d", ext: ["d"]}, - {name: "Dart", mimes: ["application/dart", "text/x-dart"], mode: "dart", ext: ["dart"]}, - {name: "diff", mime: "text/x-diff", mode: "diff", ext: ["diff", "patch"]}, - {name: "Django", mime: "text/x-django", mode: "django"}, - {name: "Dockerfile", mime: "text/x-dockerfile", mode: "dockerfile", file: /^Dockerfile$/}, - {name: "DTD", mime: "application/xml-dtd", mode: "dtd", ext: ["dtd"]}, - {name: "Dylan", mime: "text/x-dylan", mode: "dylan", ext: ["dylan", "dyl", "intr"]}, - {name: "EBNF", mime: "text/x-ebnf", mode: "ebnf"}, - {name: "ECL", mime: "text/x-ecl", mode: "ecl", ext: ["ecl"]}, - {name: "edn", mime: "application/edn", mode: "clojure", ext: ["edn"]}, - {name: "Eiffel", mime: "text/x-eiffel", mode: "eiffel", ext: ["e"]}, - {name: "Elm", mime: "text/x-elm", mode: "elm", ext: ["elm"]}, - {name: "Embedded Javascript", mime: "application/x-ejs", mode: "htmlembedded", ext: ["ejs"]}, - {name: "Embedded Ruby", mime: "application/x-erb", mode: "htmlembedded", ext: ["erb"]}, - {name: "Erlang", mime: "text/x-erlang", mode: "erlang", ext: ["erl"]}, - {name: "Factor", mime: "text/x-factor", mode: "factor", ext: ["factor"]}, - {name: "FCL", mime: "text/x-fcl", mode: "fcl"}, - {name: "Forth", mime: "text/x-forth", mode: "forth", ext: ["forth", "fth", "4th"]}, - {name: "Fortran", mime: "text/x-fortran", mode: "fortran", ext: ["f", "for", "f77", "f90"]}, - {name: "F#", mime: "text/x-fsharp", mode: "mllike", ext: ["fs"], alias: ["fsharp"]}, - {name: "Gas", mime: "text/x-gas", mode: "gas", ext: ["s"]}, - {name: "Gherkin", mime: "text/x-feature", mode: "gherkin", ext: ["feature"]}, - {name: "GitHub Flavored Markdown", mime: "text/x-gfm", mode: "gfm", file: /^(readme|contributing|history).md$/i}, - {name: "Go", mime: "text/x-go", mode: "go", ext: ["go"]}, - {name: "Groovy", mime: "text/x-groovy", mode: "groovy", ext: ["groovy", "gradle"]}, - {name: "HAML", mime: "text/x-haml", mode: "haml", ext: ["haml"]}, - {name: "Haskell", mime: "text/x-haskell", mode: "haskell", ext: ["hs"]}, - {name: "Haskell (Literate)", mime: "text/x-literate-haskell", mode: "haskell-literate", ext: ["lhs"]}, - {name: "Haxe", mime: "text/x-haxe", mode: "haxe", ext: ["hx"]}, - {name: "HXML", mime: "text/x-hxml", mode: "haxe", ext: ["hxml"]}, - {name: "ASP.NET", mime: "application/x-aspx", mode: "htmlembedded", ext: ["aspx"], alias: ["asp", "aspx"]}, - {name: "HTML", mime: "text/html", mode: "htmlmixed", ext: ["html", "htm"], alias: ["xhtml"]}, - {name: "HTTP", mime: "message/http", mode: "http"}, - {name: "IDL", mime: "text/x-idl", mode: "idl", ext: ["pro"]}, - {name: "Jade", mime: "text/x-jade", mode: "jade", ext: ["jade"]}, - {name: "Java", mime: "text/x-java", mode: "clike", ext: ["java"]}, - {name: "Java Server Pages", mime: "application/x-jsp", mode: "htmlembedded", ext: ["jsp"], alias: ["jsp"]}, - {name: "JavaScript", mimes: ["text/javascript", "text/ecmascript", "application/javascript", "application/x-javascript", "application/ecmascript"], - mode: "javascript", ext: ["js"], alias: ["ecmascript", "js", "node"]}, - {name: "JSON", mimes: ["application/json", "application/x-json"], mode: "javascript", ext: ["json", "map"], alias: ["json5"]}, - {name: "JSON-LD", mime: "application/ld+json", mode: "javascript", ext: ["jsonld"], alias: ["jsonld"]}, - {name: "JSX", mime: "text/jsx", mode: "jsx", ext: ["jsx"]}, - {name: "Jinja2", mime: "null", mode: "jinja2"}, - {name: "Julia", mime: "text/x-julia", mode: "julia", ext: ["jl"]}, - {name: "Kotlin", mime: "text/x-kotlin", mode: "clike", ext: ["kt"]}, - {name: "LESS", mime: "text/x-less", mode: "css", ext: ["less"]}, - {name: "LiveScript", mime: "text/x-livescript", mode: "livescript", ext: ["ls"], alias: ["ls"]}, - {name: "Lua", mime: "text/x-lua", mode: "lua", ext: ["lua"]}, - {name: "Markdown", mime: "text/x-markdown", mode: "markdown", ext: ["markdown", "md", "mkd"]}, - {name: "mIRC", mime: "text/mirc", mode: "mirc"}, - {name: "MariaDB SQL", mime: "text/x-mariadb", mode: "sql"}, - {name: "Mathematica", mime: "text/x-mathematica", mode: "mathematica", ext: ["m", "nb"]}, - {name: "Modelica", mime: "text/x-modelica", mode: "modelica", ext: ["mo"]}, - {name: "MUMPS", mime: "text/x-mumps", mode: "mumps", ext: ["mps"]}, - {name: "MS SQL", mime: "text/x-mssql", mode: "sql"}, - {name: "mbox", mime: "application/mbox", mode: "mbox", ext: ["mbox"]}, - {name: "MySQL", mime: "text/x-mysql", mode: "sql"}, - {name: "Nginx", mime: "text/x-nginx-conf", mode: "nginx", file: /nginx.*\.conf$/i}, - {name: "NSIS", mime: "text/x-nsis", mode: "nsis", ext: ["nsh", "nsi"]}, - {name: "NTriples", mime: "text/n-triples", mode: "ntriples", ext: ["nt"]}, - {name: "Objective C", mime: "text/x-objectivec", mode: "clike", ext: ["m", "mm"], alias: ["objective-c", "objc"]}, - {name: "OCaml", mime: "text/x-ocaml", mode: "mllike", ext: ["ml", "mli", "mll", "mly"]}, - {name: "Octave", mime: "text/x-octave", mode: "octave", ext: ["m"]}, - {name: "Oz", mime: "text/x-oz", mode: "oz", ext: ["oz"]}, - {name: "Pascal", mime: "text/x-pascal", mode: "pascal", ext: ["p", "pas"]}, - {name: "PEG.js", mime: "null", mode: "pegjs", ext: ["jsonld"]}, - {name: "Perl", mime: "text/x-perl", mode: "perl", ext: ["pl", "pm"]}, - {name: "PHP", mime: "application/x-httpd-php", mode: "php", ext: ["php", "php3", "php4", "php5", "phtml"]}, - {name: "Pig", mime: "text/x-pig", mode: "pig", ext: ["pig"]}, - {name: "Plain Text", mime: "text/plain", mode: "null", ext: ["txt", "text", "conf", "def", "list", "log"]}, - {name: "PLSQL", mime: "text/x-plsql", mode: "sql", ext: ["pls"]}, - {name: "PowerShell", mime: "application/x-powershell", mode: "powershell", ext: ["ps1", "psd1", "psm1"]}, - {name: "Properties files", mime: "text/x-properties", mode: "properties", ext: ["properties", "ini", "in"], alias: ["ini", "properties"]}, - {name: "ProtoBuf", mime: "text/x-protobuf", mode: "protobuf", ext: ["proto"]}, - {name: "Python", mime: "text/x-python", mode: "python", ext: ["BUILD", "bzl", "py", "pyw"], file: /^(BUCK|BUILD)$/}, - {name: "Puppet", mime: "text/x-puppet", mode: "puppet", ext: ["pp"]}, - {name: "Q", mime: "text/x-q", mode: "q", ext: ["q"]}, - {name: "R", mime: "text/x-rsrc", mode: "r", ext: ["r"], alias: ["rscript"]}, - {name: "reStructuredText", mime: "text/x-rst", mode: "rst", ext: ["rst"], alias: ["rst"]}, - {name: "RPM Changes", mime: "text/x-rpm-changes", mode: "rpm"}, - {name: "RPM Spec", mime: "text/x-rpm-spec", mode: "rpm", ext: ["spec"]}, - {name: "Ruby", mime: "text/x-ruby", mode: "ruby", ext: ["rb"], alias: ["jruby", "macruby", "rake", "rb", "rbx"]}, - {name: "Rust", mime: "text/x-rustsrc", mode: "rust", ext: ["rs"]}, - {name: "SAS", mime: "text/x-sas", mode: "sas", ext: ["sas"]}, - {name: "Sass", mime: "text/x-sass", mode: "sass", ext: ["sass"]}, - {name: "Scala", mime: "text/x-scala", mode: "clike", ext: ["scala"]}, - {name: "Scheme", mime: "text/x-scheme", mode: "scheme", ext: ["scm", "ss"]}, - {name: "SCSS", mime: "text/x-scss", mode: "css", ext: ["scss"]}, - {name: "Shell", mime: "text/x-sh", mode: "shell", ext: ["sh", "ksh", "bash"], alias: ["bash", "sh", "zsh"], file: /^PKGBUILD$/}, - {name: "Sieve", mime: "application/sieve", mode: "sieve", ext: ["siv", "sieve"]}, - {name: "Slim", mimes: ["text/x-slim", "application/x-slim"], mode: "slim", ext: ["slim"]}, - {name: "Smalltalk", mime: "text/x-stsrc", mode: "smalltalk", ext: ["st"]}, - {name: "Smarty", mime: "text/x-smarty", mode: "smarty", ext: ["tpl"]}, - {name: "Solr", mime: "text/x-solr", mode: "solr"}, - {name: "Soy", mime: "text/x-soy", mode: "soy", ext: ["soy"], alias: ["closure template"]}, - {name: "SPARQL", mime: "application/sparql-query", mode: "sparql", ext: ["rq", "sparql"], alias: ["sparul"]}, - {name: "Spreadsheet", mime: "text/x-spreadsheet", mode: "spreadsheet", alias: ["excel", "formula"]}, - {name: "SQL", mime: "text/x-sql", mode: "sql", ext: ["sql"]}, - {name: "Squirrel", mime: "text/x-squirrel", mode: "clike", ext: ["nut"]}, - {name: "Swift", mime: "text/x-swift", mode: "swift", ext: ["swift"]}, - {name: "sTeX", mime: "text/x-stex", mode: "stex"}, - {name: "LaTeX", mime: "text/x-latex", mode: "stex", ext: ["text", "ltx"], alias: ["tex"]}, - {name: "SystemVerilog", mime: "text/x-systemverilog", mode: "verilog", ext: ["v"]}, - {name: "Tcl", mime: "text/x-tcl", mode: "tcl", ext: ["tcl"]}, - {name: "Textile", mime: "text/x-textile", mode: "textile", ext: ["textile"]}, - {name: "TiddlyWiki ", mime: "text/x-tiddlywiki", mode: "tiddlywiki"}, - {name: "Tiki wiki", mime: "text/tiki", mode: "tiki"}, - {name: "TOML", mime: "text/x-toml", mode: "toml", ext: ["toml"]}, - {name: "Tornado", mime: "text/x-tornado", mode: "tornado"}, - {name: "troff", mime: "text/troff", mode: "troff", ext: ["1", "2", "3", "4", "5", "6", "7", "8", "9"]}, - {name: "TTCN", mime: "text/x-ttcn", mode: "ttcn", ext: ["ttcn", "ttcn3", "ttcnpp"]}, - {name: "TTCN_CFG", mime: "text/x-ttcn-cfg", mode: "ttcn-cfg", ext: ["cfg"]}, - {name: "Turtle", mime: "text/turtle", mode: "turtle", ext: ["ttl"]}, - {name: "TypeScript", mime: "application/typescript", mode: "javascript", ext: ["ts"], alias: ["ts"]}, - {name: "Twig", mime: "text/x-twig", mode: "twig"}, - {name: "Web IDL", mime: "text/x-webidl", mode: "webidl", ext: ["webidl"]}, - {name: "VB.NET", mime: "text/x-vb", mode: "vb", ext: ["vb"]}, - {name: "VBScript", mime: "text/vbscript", mode: "vbscript", ext: ["vbs"]}, - {name: "Velocity", mime: "text/velocity", mode: "velocity", ext: ["vtl"]}, - {name: "Verilog", mime: "text/x-verilog", mode: "verilog", ext: ["v"]}, - {name: "VHDL", mime: "text/x-vhdl", mode: "vhdl", ext: ["vhd", "vhdl"]}, - {name: "XML", mimes: ["application/xml", "text/xml"], mode: "xml", ext: ["xml", "xsl", "xsd"], alias: ["rss", "wsdl", "xsd"]}, - {name: "XQuery", mime: "application/xquery", mode: "xquery", ext: ["xy", "xquery"]}, - {name: "Yacas", mime: "text/x-yacas", mode: "yacas", ext: ["ys"]}, - {name: "YAML", mime: "text/x-yaml", mode: "yaml", ext: ["yaml", "yml"], alias: ["yml"]}, - {name: "Z80", mime: "text/x-z80", mode: "z80", ext: ["z80"]}, - {name: "mscgen", mime: "text/x-mscgen", mode: "mscgen", ext: ["mscgen", "mscin", "msc"]}, - {name: "xu", mime: "text/x-xu", mode: "mscgen", ext: ["xu"]}, - {name: "msgenny", mime: "text/x-msgenny", mode: "mscgen", ext: ["msgenny"]} - ]; - // Ensure all modes have a mime property for backwards compatibility - for (var i = 0; i < CodeMirror.modeInfo.length; i++) { - var info = CodeMirror.modeInfo[i]; - if (info.mimes) info.mime = info.mimes[0]; - } - - CodeMirror.findModeByMIME = function(mime) { - mime = mime.toLowerCase(); - for (var i = 0; i < CodeMirror.modeInfo.length; i++) { - var info = CodeMirror.modeInfo[i]; - if (info.mime == mime) return info; - if (info.mimes) for (var j = 0; j < info.mimes.length; j++) - if (info.mimes[j] == mime) return info; - } - }; - - CodeMirror.findModeByExtension = function(ext) { - for (var i = 0; i < CodeMirror.modeInfo.length; i++) { - var info = CodeMirror.modeInfo[i]; - if (info.ext) for (var j = 0; j < info.ext.length; j++) - if (info.ext[j] == ext) return info; - } - }; - - CodeMirror.findModeByFileName = function(filename) { - for (var i = 0; i < CodeMirror.modeInfo.length; i++) { - var info = CodeMirror.modeInfo[i]; - if (info.file && info.file.test(filename)) return info; - } - var dot = filename.lastIndexOf("."); - var ext = dot > -1 && filename.substring(dot + 1, filename.length); - if (ext) return CodeMirror.findModeByExtension(ext); - }; - - CodeMirror.findModeByName = function(name) { - name = name.toLowerCase(); - for (var i = 0; i < CodeMirror.modeInfo.length; i++) { - var info = CodeMirror.modeInfo[i]; - if (info.name.toLowerCase() == name) return info; - if (info.alias) for (var j = 0; j < info.alias.length; j++) - if (info.alias[j].toLowerCase() == name) return info; - } - }; -}); diff --git a/public/plugins/codemirror-5.17.0/mode/mirc/index.html b/public/plugins/codemirror-5.17.0/mode/mirc/index.html deleted file mode 100644 index fd2f34e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mirc/index.html +++ /dev/null @@ -1,160 +0,0 @@ - - -CodeMirror: mIRC mode - - - - - - - - - - -
-

mIRC mode

-
- - -

MIME types defined: text/mirc.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/mirc/mirc.js b/public/plugins/codemirror-5.17.0/mode/mirc/mirc.js deleted file mode 100644 index f0d5c6a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mirc/mirc.js +++ /dev/null @@ -1,193 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -//mIRC mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMIME("text/mirc", "mirc"); -CodeMirror.defineMode("mirc", function() { - function parseWords(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - var specials = parseWords("$! $$ $& $? $+ $abook $abs $active $activecid " + - "$activewid $address $addtok $agent $agentname $agentstat $agentver " + - "$alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime " + - "$asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind " + - "$binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes " + - "$chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color " + - "$com $comcall $comchan $comerr $compact $compress $comval $cos $count " + - "$cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight " + - "$dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress " + - "$deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll " + - "$dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error " + - "$eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir " + - "$finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve " + - "$fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt " + - "$group $halted $hash $height $hfind $hget $highlight $hnick $hotline " + - "$hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil " + - "$inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect " + - "$insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile " + - "$isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive " + - "$lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock " + - "$lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer " + - "$maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext " + - "$menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode " + - "$modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile " + - "$nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly " + - "$opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree " + - "$pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo " + - "$readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex " + - "$reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline " + - "$sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin " + - "$site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname " + - "$sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped " + - "$syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp " + - "$timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel " + - "$ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver " + - "$version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor"); - var keywords = parseWords("abook ajinvite alias aline ame amsg anick aop auser autojoin avoice " + - "away background ban bcopy beep bread break breplace bset btrunc bunset bwrite " + - "channel clear clearall cline clipboard close cnick color comclose comopen " + - "comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver " + - "debug dec describe dialog did didtok disable disconnect dlevel dline dll " + - "dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace " + - "drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable " + - "events exit fclose filter findtext finger firewall flash flist flood flush " + - "flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove " + - "gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd " + - "halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear " + - "ialmark identd if ignore iline inc invite iuser join kick linesep links list " + - "load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice " + - "notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice " + - "qme qmsg query queryn quit raw reload remini remote remove rename renwin " + - "reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini " + - "say scid scon server set showmirc signam sline sockaccept sockclose socklist " + - "socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite " + - "sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize " + - "toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho " + - "var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum " + - "isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower " + - "isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs " + - "elseif else goto menu nicklist status title icon size option text edit " + - "button check radio box scroll list combo link tab item"); - var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); - var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; - function chain(stream, state, f) { - state.tokenize = f; - return f(stream, state); - } - function tokenBase(stream, state) { - var beforeParams = state.beforeParams; - state.beforeParams = false; - var ch = stream.next(); - if (/[\[\]{}\(\),\.]/.test(ch)) { - if (ch == "(" && beforeParams) state.inParams = true; - else if (ch == ")") state.inParams = false; - return null; - } - else if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } - else if (ch == "\\") { - stream.eat("\\"); - stream.eat(/./); - return "number"; - } - else if (ch == "/" && stream.eat("*")) { - return chain(stream, state, tokenComment); - } - else if (ch == ";" && stream.match(/ *\( *\(/)) { - return chain(stream, state, tokenUnparsed); - } - else if (ch == ";" && !state.inParams) { - stream.skipToEnd(); - return "comment"; - } - else if (ch == '"') { - stream.eat(/"/); - return "keyword"; - } - else if (ch == "$") { - stream.eatWhile(/[$_a-z0-9A-Z\.:]/); - if (specials && specials.propertyIsEnumerable(stream.current().toLowerCase())) { - return "keyword"; - } - else { - state.beforeParams = true; - return "builtin"; - } - } - else if (ch == "%") { - stream.eatWhile(/[^,^\s^\(^\)]/); - state.beforeParams = true; - return "string"; - } - else if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - else { - stream.eatWhile(/[\w\$_{}]/); - var word = stream.current().toLowerCase(); - if (keywords && keywords.propertyIsEnumerable(word)) - return "keyword"; - if (functions && functions.propertyIsEnumerable(word)) { - state.beforeParams = true; - return "keyword"; - } - return null; - } - } - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - function tokenUnparsed(stream, state) { - var maybeEnd = 0, ch; - while (ch = stream.next()) { - if (ch == ";" && maybeEnd == 2) { - state.tokenize = tokenBase; - break; - } - if (ch == ")") - maybeEnd++; - else if (ch != " ") - maybeEnd = 0; - } - return "meta"; - } - return { - startState: function() { - return { - tokenize: tokenBase, - beforeParams: false, - inParams: false - }; - }, - token: function(stream, state) { - if (stream.eatSpace()) return null; - return state.tokenize(stream, state); - } - }; -}); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/mllike/index.html b/public/plugins/codemirror-5.17.0/mode/mllike/index.html deleted file mode 100644 index 5923af8..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mllike/index.html +++ /dev/null @@ -1,179 +0,0 @@ - - -CodeMirror: ML-like mode - - - - - - - - - - -
-

OCaml mode

- - - - -

F# mode

- - - - - -

MIME types defined: text/x-ocaml (OCaml) and text/x-fsharp (F#).

-
diff --git a/public/plugins/codemirror-5.17.0/mode/mllike/mllike.js b/public/plugins/codemirror-5.17.0/mode/mllike/mllike.js deleted file mode 100644 index bf0b8a6..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mllike/mllike.js +++ /dev/null @@ -1,205 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('mllike', function(_config, parserConfig) { - var words = { - 'let': 'keyword', - 'rec': 'keyword', - 'in': 'keyword', - 'of': 'keyword', - 'and': 'keyword', - 'if': 'keyword', - 'then': 'keyword', - 'else': 'keyword', - 'for': 'keyword', - 'to': 'keyword', - 'while': 'keyword', - 'do': 'keyword', - 'done': 'keyword', - 'fun': 'keyword', - 'function': 'keyword', - 'val': 'keyword', - 'type': 'keyword', - 'mutable': 'keyword', - 'match': 'keyword', - 'with': 'keyword', - 'try': 'keyword', - 'open': 'builtin', - 'ignore': 'builtin', - 'begin': 'keyword', - 'end': 'keyword' - }; - - var extraWords = parserConfig.extraWords || {}; - for (var prop in extraWords) { - if (extraWords.hasOwnProperty(prop)) { - words[prop] = parserConfig.extraWords[prop]; - } - } - - function tokenBase(stream, state) { - var ch = stream.next(); - - if (ch === '"') { - state.tokenize = tokenString; - return state.tokenize(stream, state); - } - if (ch === '(') { - if (stream.eat('*')) { - state.commentLevel++; - state.tokenize = tokenComment; - return state.tokenize(stream, state); - } - } - if (ch === '~') { - stream.eatWhile(/\w/); - return 'variable-2'; - } - if (ch === '`') { - stream.eatWhile(/\w/); - return 'quote'; - } - if (ch === '/' && parserConfig.slashComments && stream.eat('/')) { - stream.skipToEnd(); - return 'comment'; - } - if (/\d/.test(ch)) { - stream.eatWhile(/[\d]/); - if (stream.eat('.')) { - stream.eatWhile(/[\d]/); - } - return 'number'; - } - if ( /[+\-*&%=<>!?|]/.test(ch)) { - return 'operator'; - } - stream.eatWhile(/\w/); - var cur = stream.current(); - return words.hasOwnProperty(cur) ? words[cur] : 'variable'; - } - - function tokenString(stream, state) { - var next, end = false, escaped = false; - while ((next = stream.next()) != null) { - if (next === '"' && !escaped) { - end = true; - break; - } - escaped = !escaped && next === '\\'; - } - if (end && !escaped) { - state.tokenize = tokenBase; - } - return 'string'; - }; - - function tokenComment(stream, state) { - var prev, next; - while(state.commentLevel > 0 && (next = stream.next()) != null) { - if (prev === '(' && next === '*') state.commentLevel++; - if (prev === '*' && next === ')') state.commentLevel--; - prev = next; - } - if (state.commentLevel <= 0) { - state.tokenize = tokenBase; - } - return 'comment'; - } - - return { - startState: function() {return {tokenize: tokenBase, commentLevel: 0};}, - token: function(stream, state) { - if (stream.eatSpace()) return null; - return state.tokenize(stream, state); - }, - - blockCommentStart: "(*", - blockCommentEnd: "*)", - lineComment: parserConfig.slashComments ? "//" : null - }; -}); - -CodeMirror.defineMIME('text/x-ocaml', { - name: 'mllike', - extraWords: { - 'succ': 'keyword', - 'trace': 'builtin', - 'exit': 'builtin', - 'print_string': 'builtin', - 'print_endline': 'builtin', - 'true': 'atom', - 'false': 'atom', - 'raise': 'keyword' - } -}); - -CodeMirror.defineMIME('text/x-fsharp', { - name: 'mllike', - extraWords: { - 'abstract': 'keyword', - 'as': 'keyword', - 'assert': 'keyword', - 'base': 'keyword', - 'class': 'keyword', - 'default': 'keyword', - 'delegate': 'keyword', - 'downcast': 'keyword', - 'downto': 'keyword', - 'elif': 'keyword', - 'exception': 'keyword', - 'extern': 'keyword', - 'finally': 'keyword', - 'global': 'keyword', - 'inherit': 'keyword', - 'inline': 'keyword', - 'interface': 'keyword', - 'internal': 'keyword', - 'lazy': 'keyword', - 'let!': 'keyword', - 'member' : 'keyword', - 'module': 'keyword', - 'namespace': 'keyword', - 'new': 'keyword', - 'null': 'keyword', - 'override': 'keyword', - 'private': 'keyword', - 'public': 'keyword', - 'return': 'keyword', - 'return!': 'keyword', - 'select': 'keyword', - 'static': 'keyword', - 'struct': 'keyword', - 'upcast': 'keyword', - 'use': 'keyword', - 'use!': 'keyword', - 'val': 'keyword', - 'when': 'keyword', - 'yield': 'keyword', - 'yield!': 'keyword', - - 'List': 'builtin', - 'Seq': 'builtin', - 'Map': 'builtin', - 'Set': 'builtin', - 'int': 'builtin', - 'string': 'builtin', - 'raise': 'builtin', - 'failwith': 'builtin', - 'not': 'builtin', - 'true': 'builtin', - 'false': 'builtin' - }, - slashComments: true -}); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/modelica/index.html b/public/plugins/codemirror-5.17.0/mode/modelica/index.html deleted file mode 100644 index 408c3b1..0000000 --- a/public/plugins/codemirror-5.17.0/mode/modelica/index.html +++ /dev/null @@ -1,67 +0,0 @@ - - -CodeMirror: Modelica mode - - - - - - - - - - - - -
-

Modelica mode

- -
- - - -

Simple mode that tries to handle Modelica as well as it can.

- -

MIME types defined: text/x-modelica - (Modlica code).

-
diff --git a/public/plugins/codemirror-5.17.0/mode/modelica/modelica.js b/public/plugins/codemirror-5.17.0/mode/modelica/modelica.js deleted file mode 100644 index 77ec7a3..0000000 --- a/public/plugins/codemirror-5.17.0/mode/modelica/modelica.js +++ /dev/null @@ -1,245 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Modelica support for CodeMirror, copyright (c) by Lennart Ochel - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -}) - -(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("modelica", function(config, parserConfig) { - - var indentUnit = config.indentUnit; - var keywords = parserConfig.keywords || {}; - var builtin = parserConfig.builtin || {}; - var atoms = parserConfig.atoms || {}; - - var isSingleOperatorChar = /[;=\(:\),{}.*<>+\-\/^\[\]]/; - var isDoubleOperatorChar = /(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/; - var isDigit = /[0-9]/; - var isNonDigit = /[_a-zA-Z]/; - - function tokenLineComment(stream, state) { - stream.skipToEnd(); - state.tokenize = null; - return "comment"; - } - - function tokenBlockComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (maybeEnd && ch == "/") { - state.tokenize = null; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function tokenString(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == '"' && !escaped) { - state.tokenize = null; - state.sol = false; - break; - } - escaped = !escaped && ch == "\\"; - } - - return "string"; - } - - function tokenIdent(stream, state) { - stream.eatWhile(isDigit); - while (stream.eat(isDigit) || stream.eat(isNonDigit)) { } - - - var cur = stream.current(); - - if(state.sol && (cur == "package" || cur == "model" || cur == "when" || cur == "connector")) state.level++; - else if(state.sol && cur == "end" && state.level > 0) state.level--; - - state.tokenize = null; - state.sol = false; - - if (keywords.propertyIsEnumerable(cur)) return "keyword"; - else if (builtin.propertyIsEnumerable(cur)) return "builtin"; - else if (atoms.propertyIsEnumerable(cur)) return "atom"; - else return "variable"; - } - - function tokenQIdent(stream, state) { - while (stream.eat(/[^']/)) { } - - state.tokenize = null; - state.sol = false; - - if(stream.eat("'")) - return "variable"; - else - return "error"; - } - - function tokenUnsignedNuber(stream, state) { - stream.eatWhile(isDigit); - if (stream.eat('.')) { - stream.eatWhile(isDigit); - } - if (stream.eat('e') || stream.eat('E')) { - if (!stream.eat('-')) - stream.eat('+'); - stream.eatWhile(isDigit); - } - - state.tokenize = null; - state.sol = false; - return "number"; - } - - // Interface - return { - startState: function() { - return { - tokenize: null, - level: 0, - sol: true - }; - }, - - token: function(stream, state) { - if(state.tokenize != null) { - return state.tokenize(stream, state); - } - - if(stream.sol()) { - state.sol = true; - } - - // WHITESPACE - if(stream.eatSpace()) { - state.tokenize = null; - return null; - } - - var ch = stream.next(); - - // LINECOMMENT - if(ch == '/' && stream.eat('/')) { - state.tokenize = tokenLineComment; - } - // BLOCKCOMMENT - else if(ch == '/' && stream.eat('*')) { - state.tokenize = tokenBlockComment; - } - // TWO SYMBOL TOKENS - else if(isDoubleOperatorChar.test(ch+stream.peek())) { - stream.next(); - state.tokenize = null; - return "operator"; - } - // SINGLE SYMBOL TOKENS - else if(isSingleOperatorChar.test(ch)) { - state.tokenize = null; - return "operator"; - } - // IDENT - else if(isNonDigit.test(ch)) { - state.tokenize = tokenIdent; - } - // Q-IDENT - else if(ch == "'" && stream.peek() && stream.peek() != "'") { - state.tokenize = tokenQIdent; - } - // STRING - else if(ch == '"') { - state.tokenize = tokenString; - } - // UNSIGNED_NUBER - else if(isDigit.test(ch)) { - state.tokenize = tokenUnsignedNuber; - } - // ERROR - else { - state.tokenize = null; - return "error"; - } - - return state.tokenize(stream, state); - }, - - indent: function(state, textAfter) { - if (state.tokenize != null) return CodeMirror.Pass; - - var level = state.level; - if(/(algorithm)/.test(textAfter)) level--; - if(/(equation)/.test(textAfter)) level--; - if(/(initial algorithm)/.test(textAfter)) level--; - if(/(initial equation)/.test(textAfter)) level--; - if(/(end)/.test(textAfter)) level--; - - if(level > 0) - return indentUnit*level; - else - return 0; - }, - - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: "//" - }; - }); - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i=0; i - -CodeMirror: MscGen mode - - - - - - - - - -
-

MscGen mode

- -
- -

Xù mode

- -
- -

MsGenny mode

-
- -

- Simple mode for highlighting MscGen and two derived sequence - chart languages. -

- - - -

MIME types defined: - text/x-mscgen - text/x-xu - text/x-msgenny -

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/mscgen/mscgen.js b/public/plugins/codemirror-5.17.0/mode/mscgen/mscgen.js deleted file mode 100644 index d61b470..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mscgen/mscgen.js +++ /dev/null @@ -1,169 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// mode(s) for the sequence chart dsl's mscgen, xù and msgenny -// For more information on mscgen, see the site of the original author: -// http://www.mcternan.me.uk/mscgen -// -// This mode for mscgen and the two derivative languages were -// originally made for use in the mscgen_js interpreter -// (https://sverweij.github.io/mscgen_js) - -(function(mod) { - if ( typeof exports == "object" && typeof module == "object")// CommonJS - mod(require("../../lib/codemirror")); - else if ( typeof define == "function" && define.amd)// AMD - define(["../../lib/codemirror"], mod); - else// Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - var languages = { - mscgen: { - "keywords" : ["msc"], - "options" : ["hscale", "width", "arcgradient", "wordwraparcs"], - "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip"], - "brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists - "arcsWords" : ["note", "abox", "rbox", "box"], - "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], - "singlecomment" : ["//", "#"], - "operators" : ["="] - }, - xu: { - "keywords" : ["msc"], - "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "watermark"], - "attributes" : ["label", "idurl", "id", "url", "linecolor", "linecolour", "textcolor", "textcolour", "textbgcolor", "textbgcolour", "arclinecolor", "arclinecolour", "arctextcolor", "arctextcolour", "arctextbgcolor", "arctextbgcolour", "arcskip"], - "brackets" : ["\\{", "\\}"], // [ and ] are brackets too, but these get handled in with lists - "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"], - "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], - "singlecomment" : ["//", "#"], - "operators" : ["="] - }, - msgenny: { - "keywords" : null, - "options" : ["hscale", "width", "arcgradient", "wordwraparcs", "watermark"], - "attributes" : null, - "brackets" : ["\\{", "\\}"], - "arcsWords" : ["note", "abox", "rbox", "box", "alt", "else", "opt", "break", "par", "seq", "strict", "neg", "critical", "ignore", "consider", "assert", "loop", "ref", "exc"], - "arcsOthers" : ["\\|\\|\\|", "\\.\\.\\.", "---", "--", "<->", "==", "<<=>>", "<=>", "\\.\\.", "<<>>", "::", "<:>", "->", "=>>", "=>", ">>", ":>", "<-", "<<=", "<=", "<<", "<:", "x-", "-x"], - "singlecomment" : ["//", "#"], - "operators" : ["="] - } - } - - CodeMirror.defineMode("mscgen", function(_, modeConfig) { - var language = languages[modeConfig && modeConfig.language || "mscgen"] - return { - startState: startStateFn, - copyState: copyStateFn, - token: produceTokenFunction(language), - lineComment : "#", - blockCommentStart : "/*", - blockCommentEnd : "*/" - }; - }); - - CodeMirror.defineMIME("text/x-mscgen", "mscgen"); - CodeMirror.defineMIME("text/x-xu", {name: "mscgen", language: "xu"}); - CodeMirror.defineMIME("text/x-msgenny", {name: "mscgen", language: "msgenny"}); - - function wordRegexpBoundary(pWords) { - return new RegExp("\\b(" + pWords.join("|") + ")\\b", "i"); - } - - function wordRegexp(pWords) { - return new RegExp("(" + pWords.join("|") + ")", "i"); - } - - function startStateFn() { - return { - inComment : false, - inString : false, - inAttributeList : false, - inScript : false - }; - } - - function copyStateFn(pState) { - return { - inComment : pState.inComment, - inString : pState.inString, - inAttributeList : pState.inAttributeList, - inScript : pState.inScript - }; - } - - function produceTokenFunction(pConfig) { - - return function(pStream, pState) { - if (pStream.match(wordRegexp(pConfig.brackets), true, true)) { - return "bracket"; - } - /* comments */ - if (!pState.inComment) { - if (pStream.match(/\/\*[^\*\/]*/, true, true)) { - pState.inComment = true; - return "comment"; - } - if (pStream.match(wordRegexp(pConfig.singlecomment), true, true)) { - pStream.skipToEnd(); - return "comment"; - } - } - if (pState.inComment) { - if (pStream.match(/[^\*\/]*\*\//, true, true)) - pState.inComment = false; - else - pStream.skipToEnd(); - return "comment"; - } - /* strings */ - if (!pState.inString && pStream.match(/\"(\\\"|[^\"])*/, true, true)) { - pState.inString = true; - return "string"; - } - if (pState.inString) { - if (pStream.match(/[^\"]*\"/, true, true)) - pState.inString = false; - else - pStream.skipToEnd(); - return "string"; - } - /* keywords & operators */ - if (!!pConfig.keywords && pStream.match(wordRegexpBoundary(pConfig.keywords), true, true)) - return "keyword"; - - if (pStream.match(wordRegexpBoundary(pConfig.options), true, true)) - return "keyword"; - - if (pStream.match(wordRegexpBoundary(pConfig.arcsWords), true, true)) - return "keyword"; - - if (pStream.match(wordRegexp(pConfig.arcsOthers), true, true)) - return "keyword"; - - if (!!pConfig.operators && pStream.match(wordRegexp(pConfig.operators), true, true)) - return "operator"; - - /* attribute lists */ - if (!pConfig.inAttributeList && !!pConfig.attributes && pStream.match(/\[/, true, true)) { - pConfig.inAttributeList = true; - return "bracket"; - } - if (pConfig.inAttributeList) { - if (pConfig.attributes !== null && pStream.match(wordRegexpBoundary(pConfig.attributes), true, true)) { - return "attribute"; - } - if (pStream.match(/]/, true, true)) { - pConfig.inAttributeList = false; - return "bracket"; - } - } - - pStream.next(); - return "base"; - }; - } - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/mscgen/mscgen_test.js b/public/plugins/codemirror-5.17.0/mode/mscgen/mscgen_test.js deleted file mode 100644 index e319a39..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mscgen/mscgen_test.js +++ /dev/null @@ -1,75 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "mscgen"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT("empty chart", - "[keyword msc][bracket {]", - "[base ]", - "[bracket }]" - ); - - MT("comments", - "[comment // a single line comment]", - "[comment # another single line comment /* and */ ignored here]", - "[comment /* A multi-line comment even though it contains]", - "[comment msc keywords and \"quoted text\"*/]"); - - MT("strings", - "[string \"// a string\"]", - "[string \"a string running over]", - "[string two lines\"]", - "[string \"with \\\"escaped quote\"]" - ); - - MT("xù/ msgenny keywords classify as 'base'", - "[base watermark]", - "[base alt loop opt ref else break par seq assert]" - ); - - MT("mscgen options classify as keyword", - "[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]" - ); - - MT("mscgen arcs classify as keyword", - "[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]", - "[keyword |||...---]", "[keyword ..--==::]", - "[keyword ->]", "[keyword <-]", "[keyword <->]", - "[keyword =>]", "[keyword <=]", "[keyword <=>]", - "[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]", - "[keyword >>]", "[keyword <<]", "[keyword <<>>]", - "[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]", - "[keyword :>]", "[keyword <:]", "[keyword <:>]" - ); - - MT("within an attribute list, attributes classify as attribute", - "[bracket [[][attribute label]", - "[attribute id]","[attribute url]","[attribute idurl]", - "[attribute linecolor]","[attribute linecolour]","[attribute textcolor]","[attribute textcolour]","[attribute textbgcolor]","[attribute textbgcolour]", - "[attribute arclinecolor]","[attribute arclinecolour]","[attribute arctextcolor]","[attribute arctextcolour]","[attribute arctextbgcolor]","[attribute arctextbgcolour]", - "[attribute arcskip][bracket ]]]" - ); - - MT("outside an attribute list, attributes classify as base", - "[base label]", - "[base id]","[base url]","[base idurl]", - "[base linecolor]","[base linecolour]","[base textcolor]","[base textcolour]","[base textbgcolor]","[base textbgcolour]", - "[base arclinecolor]","[base arclinecolour]","[base arctextcolor]","[base arctextcolour]","[base arctextbgcolor]","[base arctextbgcolour]", - "[base arcskip]" - ); - - MT("a typical program", - "[comment # typical mscgen program]", - "[keyword msc][base ][bracket {]", - "[keyword wordwraparcs][operator =][string \"true\"][base , ][keyword hscale][operator =][string \"0.8\"][keyword arcgradient][operator =][base 30;]", - "[base a][bracket [[][attribute label][operator =][string \"Entity A\"][bracket ]]][base ,]", - "[base b][bracket [[][attribute label][operator =][string \"Entity B\"][bracket ]]][base ,]", - "[base c][bracket [[][attribute label][operator =][string \"Entity C\"][bracket ]]][base ;]", - "[base a ][keyword =>>][base b][bracket [[][attribute label][operator =][string \"Hello entity B\"][bracket ]]][base ;]", - "[base a ][keyword <<][base b][bracket [[][attribute label][operator =][string \"Here's an answer dude!\"][bracket ]]][base ;]", - "[base c ][keyword :>][base *][bracket [[][attribute label][operator =][string \"What about me?\"][base , ][attribute textcolor][operator =][base red][bracket ]]][base ;]", - "[bracket }]" - ); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/mscgen/msgenny_test.js b/public/plugins/codemirror-5.17.0/mode/mscgen/msgenny_test.js deleted file mode 100644 index 80173de..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mscgen/msgenny_test.js +++ /dev/null @@ -1,71 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-msgenny"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "msgenny"); } - - MT("comments", - "[comment // a single line comment]", - "[comment # another single line comment /* and */ ignored here]", - "[comment /* A multi-line comment even though it contains]", - "[comment msc keywords and \"quoted text\"*/]"); - - MT("strings", - "[string \"// a string\"]", - "[string \"a string running over]", - "[string two lines\"]", - "[string \"with \\\"escaped quote\"]" - ); - - MT("xù/ msgenny keywords classify as 'keyword'", - "[keyword watermark]", - "[keyword alt]","[keyword loop]","[keyword opt]","[keyword ref]","[keyword else]","[keyword break]","[keyword par]","[keyword seq]","[keyword assert]" - ); - - MT("mscgen options classify as keyword", - "[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]" - ); - - MT("mscgen arcs classify as keyword", - "[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]", - "[keyword |||...---]", "[keyword ..--==::]", - "[keyword ->]", "[keyword <-]", "[keyword <->]", - "[keyword =>]", "[keyword <=]", "[keyword <=>]", - "[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]", - "[keyword >>]", "[keyword <<]", "[keyword <<>>]", - "[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]", - "[keyword :>]", "[keyword <:]", "[keyword <:>]" - ); - - MT("within an attribute list, mscgen/ xù attributes classify as base", - "[base [[label]", - "[base idurl id url]", - "[base linecolor linecolour textcolor textcolour textbgcolor textbgcolour]", - "[base arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour]", - "[base arcskip]]]" - ); - - MT("outside an attribute list, mscgen/ xù attributes classify as base", - "[base label]", - "[base idurl id url]", - "[base linecolor linecolour textcolor textcolour textbgcolor textbgcolour]", - "[base arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour]", - "[base arcskip]" - ); - - MT("a typical program", - "[comment # typical msgenny program]", - "[keyword wordwraparcs][operator =][string \"true\"][base , ][keyword hscale][operator =][string \"0.8\"][base , ][keyword arcgradient][operator =][base 30;]", - "[base a : ][string \"Entity A\"][base ,]", - "[base b : Entity B,]", - "[base c : Entity C;]", - "[base a ][keyword =>>][base b: ][string \"Hello entity B\"][base ;]", - "[base a ][keyword alt][base c][bracket {]", - "[base a ][keyword <<][base b: ][string \"Here's an answer dude!\"][base ;]", - "[keyword ---][base : ][string \"sorry, won't march - comm glitch\"]", - "[base a ][keyword x-][base b: ][string \"Here's an answer dude! (won't arrive...)\"][base ;]", - "[bracket }]", - "[base c ][keyword :>][base *: What about me?;]" - ); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/mscgen/xu_test.js b/public/plugins/codemirror-5.17.0/mode/mscgen/xu_test.js deleted file mode 100644 index f9a50f0..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mscgen/xu_test.js +++ /dev/null @@ -1,75 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "text/x-xu"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), "xu"); } - - MT("empty chart", - "[keyword msc][bracket {]", - "[base ]", - "[bracket }]" - ); - - MT("comments", - "[comment // a single line comment]", - "[comment # another single line comment /* and */ ignored here]", - "[comment /* A multi-line comment even though it contains]", - "[comment msc keywords and \"quoted text\"*/]"); - - MT("strings", - "[string \"// a string\"]", - "[string \"a string running over]", - "[string two lines\"]", - "[string \"with \\\"escaped quote\"]" - ); - - MT("xù/ msgenny keywords classify as 'keyword'", - "[keyword watermark]", - "[keyword alt]","[keyword loop]","[keyword opt]","[keyword ref]","[keyword else]","[keyword break]","[keyword par]","[keyword seq]","[keyword assert]" - ); - - MT("mscgen options classify as keyword", - "[keyword hscale]", "[keyword width]", "[keyword arcgradient]", "[keyword wordwraparcs]" - ); - - MT("mscgen arcs classify as keyword", - "[keyword note]","[keyword abox]","[keyword rbox]","[keyword box]", - "[keyword |||...---]", "[keyword ..--==::]", - "[keyword ->]", "[keyword <-]", "[keyword <->]", - "[keyword =>]", "[keyword <=]", "[keyword <=>]", - "[keyword =>>]", "[keyword <<=]", "[keyword <<=>>]", - "[keyword >>]", "[keyword <<]", "[keyword <<>>]", - "[keyword -x]", "[keyword x-]", "[keyword -X]", "[keyword X-]", - "[keyword :>]", "[keyword <:]", "[keyword <:>]" - ); - - MT("within an attribute list, attributes classify as attribute", - "[bracket [[][attribute label]", - "[attribute id]","[attribute url]","[attribute idurl]", - "[attribute linecolor]","[attribute linecolour]","[attribute textcolor]","[attribute textcolour]","[attribute textbgcolor]","[attribute textbgcolour]", - "[attribute arclinecolor]","[attribute arclinecolour]","[attribute arctextcolor]","[attribute arctextcolour]","[attribute arctextbgcolor]","[attribute arctextbgcolour]", - "[attribute arcskip][bracket ]]]" - ); - - MT("outside an attribute list, attributes classify as base", - "[base label]", - "[base id]","[base url]","[base idurl]", - "[base linecolor]","[base linecolour]","[base textcolor]","[base textcolour]","[base textbgcolor]","[base textbgcolour]", - "[base arclinecolor]","[base arclinecolour]","[base arctextcolor]","[base arctextcolour]","[base arctextbgcolor]","[base arctextbgcolour]", - "[base arcskip]" - ); - - MT("a typical program", - "[comment # typical mscgen program]", - "[keyword msc][base ][bracket {]", - "[keyword wordwraparcs][operator =][string \"true\"][keyword hscale][operator =][string \"0.8\"][keyword arcgradient][operator =][base 30;]", - "[base a][bracket [[][attribute label][operator =][string \"Entity A\"][bracket ]]][base ,]", - "[base b][bracket [[][attribute label][operator =][string \"Entity B\"][bracket ]]][base ,]", - "[base c][bracket [[][attribute label][operator =][string \"Entity C\"][bracket ]]][base ;]", - "[base a ][keyword =>>][base b][bracket [[][attribute label][operator =][string \"Hello entity B\"][bracket ]]][base ;]", - "[base a ][keyword <<][base b][bracket [[][attribute label][operator =][string \"Here's an answer dude!\"][bracket ]]][base ;]", - "[base c ][keyword :>][base *][bracket [[][attribute label][operator =][string \"What about me?\"][base , ][attribute textcolor][operator =][base red][bracket ]]][base ;]", - "[bracket }]" - ); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/mumps/index.html b/public/plugins/codemirror-5.17.0/mode/mumps/index.html deleted file mode 100644 index b1f92c2..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mumps/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - -CodeMirror: MUMPS mode - - - - - - - - - -
-

MUMPS mode

- - -
- - -
diff --git a/public/plugins/codemirror-5.17.0/mode/mumps/mumps.js b/public/plugins/codemirror-5.17.0/mode/mumps/mumps.js deleted file mode 100644 index 469f8c3..0000000 --- a/public/plugins/codemirror-5.17.0/mode/mumps/mumps.js +++ /dev/null @@ -1,148 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/* - This MUMPS Language script was constructed using vbscript.js as a template. -*/ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("mumps", function() { - function wordRegexp(words) { - return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); - } - - var singleOperators = new RegExp("^[\\+\\-\\*/&#!_?\\\\<>=\\'\\[\\]]"); - var doubleOperators = new RegExp("^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))"); - var singleDelimiters = new RegExp("^[\\.,:]"); - var brackets = new RegExp("[()]"); - var identifiers = new RegExp("^[%A-Za-z][A-Za-z0-9]*"); - var commandKeywords = ["break","close","do","else","for","goto", "halt", "hang", "if", "job","kill","lock","merge","new","open", "quit", "read", "set", "tcommit", "trollback", "tstart", "use", "view", "write", "xecute", "b","c","d","e","f","g", "h", "i", "j","k","l","m","n","o", "q", "r", "s", "tc", "tro", "ts", "u", "v", "w", "x"]; - // The following list includes instrinsic functions _and_ special variables - var intrinsicFuncsWords = ["\\$ascii", "\\$char", "\\$data", "\\$ecode", "\\$estack", "\\$etrap", "\\$extract", "\\$find", "\\$fnumber", "\\$get", "\\$horolog", "\\$io", "\\$increment", "\\$job", "\\$justify", "\\$length", "\\$name", "\\$next", "\\$order", "\\$piece", "\\$qlength", "\\$qsubscript", "\\$query", "\\$quit", "\\$random", "\\$reverse", "\\$select", "\\$stack", "\\$test", "\\$text", "\\$translate", "\\$view", "\\$x", "\\$y", "\\$a", "\\$c", "\\$d", "\\$e", "\\$ec", "\\$es", "\\$et", "\\$f", "\\$fn", "\\$g", "\\$h", "\\$i", "\\$j", "\\$l", "\\$n", "\\$na", "\\$o", "\\$p", "\\$q", "\\$ql", "\\$qs", "\\$r", "\\$re", "\\$s", "\\$st", "\\$t", "\\$tr", "\\$v", "\\$z"]; - var intrinsicFuncs = wordRegexp(intrinsicFuncsWords); - var command = wordRegexp(commandKeywords); - - function tokenBase(stream, state) { - if (stream.sol()) { - state.label = true; - state.commandMode = 0; - } - - // The character has meaning in MUMPS. Ignoring consecutive - // spaces would interfere with interpreting whether the next non-space - // character belongs to the command or argument context. - - // Examine each character and update a mode variable whose interpretation is: - // >0 => command 0 => argument <0 => command post-conditional - var ch = stream.peek(); - - if (ch == " " || ch == "\t") { // Pre-process - state.label = false; - if (state.commandMode == 0) - state.commandMode = 1; - else if ((state.commandMode < 0) || (state.commandMode == 2)) - state.commandMode = 0; - } else if ((ch != ".") && (state.commandMode > 0)) { - if (ch == ":") - state.commandMode = -1; // SIS - Command post-conditional - else - state.commandMode = 2; - } - - // Do not color parameter list as line tag - if ((ch === "(") || (ch === "\u0009")) - state.label = false; - - // MUMPS comment starts with ";" - if (ch === ";") { - stream.skipToEnd(); - return "comment"; - } - - // Number Literals // SIS/RLM - MUMPS permits canonic number followed by concatenate operator - if (stream.match(/^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?/)) - return "number"; - - // Handle Strings - if (ch == '"') { - if (stream.skipTo('"')) { - stream.next(); - return "string"; - } else { - stream.skipToEnd(); - return "error"; - } - } - - // Handle operators and Delimiters - if (stream.match(doubleOperators) || stream.match(singleOperators)) - return "operator"; - - // Prevents leading "." in DO block from falling through to error - if (stream.match(singleDelimiters)) - return null; - - if (brackets.test(ch)) { - stream.next(); - return "bracket"; - } - - if (state.commandMode > 0 && stream.match(command)) - return "variable-2"; - - if (stream.match(intrinsicFuncs)) - return "builtin"; - - if (stream.match(identifiers)) - return "variable"; - - // Detect dollar-sign when not a documented intrinsic function - // "^" may introduce a GVN or SSVN - Color same as function - if (ch === "$" || ch === "^") { - stream.next(); - return "builtin"; - } - - // MUMPS Indirection - if (ch === "@") { - stream.next(); - return "string-2"; - } - - if (/[\w%]/.test(ch)) { - stream.eatWhile(/[\w%]/); - return "variable"; - } - - // Handle non-detected items - stream.next(); - return "error"; - } - - return { - startState: function() { - return { - label: false, - commandMode: 0 - }; - }, - - token: function(stream, state) { - var style = tokenBase(stream, state); - if (state.label) return "tag"; - return style; - } - }; - }); - - CodeMirror.defineMIME("text/x-mumps", "mumps"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/nginx/index.html b/public/plugins/codemirror-5.17.0/mode/nginx/index.html deleted file mode 100644 index 03cf671..0000000 --- a/public/plugins/codemirror-5.17.0/mode/nginx/index.html +++ /dev/null @@ -1,181 +0,0 @@ - - -CodeMirror: NGINX mode - - - - - - - - - - - - - -
-

NGINX mode

-
- - -

MIME types defined: text/nginx.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/nginx/nginx.js b/public/plugins/codemirror-5.17.0/mode/nginx/nginx.js deleted file mode 100644 index 00a3224..0000000 --- a/public/plugins/codemirror-5.17.0/mode/nginx/nginx.js +++ /dev/null @@ -1,178 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("nginx", function(config) { - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - var keywords = words( - /* ngxDirectiveControl */ "break return rewrite set" + - /* ngxDirective */ " accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23" - ); - - var keywords_block = words( - /* ngxDirectiveBlock */ "http mail events server types location upstream charset_map limit_except if geo map" - ); - - var keywords_important = words( - /* ngxDirectiveImportant */ "include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files" - ); - - var indentUnit = config.indentUnit, type; - function ret(style, tp) {type = tp; return style;} - - function tokenBase(stream, state) { - - - stream.eatWhile(/[\w\$_]/); - - var cur = stream.current(); - - - if (keywords.propertyIsEnumerable(cur)) { - return "keyword"; - } - else if (keywords_block.propertyIsEnumerable(cur)) { - return "variable-2"; - } - else if (keywords_important.propertyIsEnumerable(cur)) { - return "string-2"; - } - /**/ - - var ch = stream.next(); - if (ch == "@") {stream.eatWhile(/[\w\\\-]/); return ret("meta", stream.current());} - else if (ch == "/" && stream.eat("*")) { - state.tokenize = tokenCComment; - return tokenCComment(stream, state); - } - else if (ch == "<" && stream.eat("!")) { - state.tokenize = tokenSGMLComment; - return tokenSGMLComment(stream, state); - } - else if (ch == "=") ret(null, "compare"); - else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare"); - else if (ch == "\"" || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - else if (ch == "#") { - stream.skipToEnd(); - return ret("comment", "comment"); - } - else if (ch == "!") { - stream.match(/^\s*\w*/); - return ret("keyword", "important"); - } - else if (/\d/.test(ch)) { - stream.eatWhile(/[\w.%]/); - return ret("number", "unit"); - } - else if (/[,.+>*\/]/.test(ch)) { - return ret(null, "select-op"); - } - else if (/[;{}:\[\]]/.test(ch)) { - return ret(null, ch); - } - else { - stream.eatWhile(/[\w\\\-]/); - return ret("variable", "variable"); - } - } - - function tokenCComment(stream, state) { - var maybeEnd = false, ch; - while ((ch = stream.next()) != null) { - if (maybeEnd && ch == "/") { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return ret("comment", "comment"); - } - - function tokenSGMLComment(stream, state) { - var dashes = 0, ch; - while ((ch = stream.next()) != null) { - if (dashes >= 2 && ch == ">") { - state.tokenize = tokenBase; - break; - } - dashes = (ch == "-") ? dashes + 1 : 0; - } - return ret("comment", "comment"); - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) - break; - escaped = !escaped && ch == "\\"; - } - if (!escaped) state.tokenize = tokenBase; - return ret("string", "string"); - }; - } - - return { - startState: function(base) { - return {tokenize: tokenBase, - baseIndent: base || 0, - stack: []}; - }, - - token: function(stream, state) { - if (stream.eatSpace()) return null; - type = null; - var style = state.tokenize(stream, state); - - var context = state.stack[state.stack.length-1]; - if (type == "hash" && context == "rule") style = "atom"; - else if (style == "variable") { - if (context == "rule") style = "number"; - else if (!context || context == "@media{") style = "tag"; - } - - if (context == "rule" && /^[\{\};]$/.test(type)) - state.stack.pop(); - if (type == "{") { - if (context == "@media") state.stack[state.stack.length-1] = "@media{"; - else state.stack.push("{"); - } - else if (type == "}") state.stack.pop(); - else if (type == "@media") state.stack.push("@media"); - else if (context == "{" && type != "comment") state.stack.push("rule"); - return style; - }, - - indent: function(state, textAfter) { - var n = state.stack.length; - if (/^\}/.test(textAfter)) - n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1; - return state.baseIndent + n * indentUnit; - }, - - electricChars: "}" - }; -}); - -CodeMirror.defineMIME("text/x-nginx-conf", "nginx"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/nsis/index.html b/public/plugins/codemirror-5.17.0/mode/nsis/index.html deleted file mode 100644 index 2afae87..0000000 --- a/public/plugins/codemirror-5.17.0/mode/nsis/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - -CodeMirror: NSIS mode - - - - - - - - - - - -
-

NSIS mode

- - - - - - -

MIME types defined: text/x-nsis.

-
\ No newline at end of file diff --git a/public/plugins/codemirror-5.17.0/mode/nsis/nsis.js b/public/plugins/codemirror-5.17.0/mode/nsis/nsis.js deleted file mode 100644 index 172207c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/nsis/nsis.js +++ /dev/null @@ -1,95 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Author: Jan T. Sott (http://github.com/idleberg) - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../../addon/mode/simple"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineSimpleMode("nsis",{ - start:[ - // Numbers - {regex: /(?:[+-]?)(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\d+.?\d*)/, token: "number"}, - - // Strings - { regex: /"(?:[^\\"]|\\.)*"?/, token: "string" }, - { regex: /'(?:[^\\']|\\.)*'?/, token: "string" }, - { regex: /`(?:[^\\`]|\\.)*`?/, token: "string" }, - - // Compile Time Commands - {regex: /(?:\!(include|addincludedir|addplugindir|appendfile|cd|delfile|echo|error|execute|packhdr|finalize|getdllversion|system|tempfile|warning|verbose|define|undef|insertmacro|makensis|searchparse|searchreplace))\b/, token: "keyword"}, - - // Conditional Compilation - {regex: /(?:\!(if(?:n?def)?|ifmacron?def|macro))\b/, token: "keyword", indent: true}, - {regex: /(?:\!(else|endif|macroend))\b/, token: "keyword", dedent: true}, - - // Runtime Commands - {regex: /\b(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetLabelAddress|GetTempFileName|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|IntCmp|IntCmpU|IntFmt|IntOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetPluginUnload|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegStr|WriteUninstaller|XPStyle)\b/, token: "keyword"}, - {regex: /\b(?:Function|PageEx|Section(?:Group)?)\b/, token: "keyword", indent: true}, - {regex: /\b(?:(Function|PageEx|Section(?:Group)?)End)\b/, token: "keyword", dedent: true}, - - // Command Options - {regex: /\b(?:ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HIDDEN|HKCC|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDD_DIR|IDD_INST|IDD_INSTFILES|IDD_LICENSE|IDD_SELCOM|IDD_UNINST|IDD_VERIFY|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|MB_YESNOCANCEL|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SW_HIDE|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWNORMAL|SYSTEM|TEMPORARY)\b/, token: "atom"}, - {regex: /\b(?:admin|all|auto|both|bottom|bzip2|components|current|custom|directory|force|hide|highest|ifdiff|ifnewer|instfiles|lastused|leave|left|license|listonly|lzma|nevershow|none|normal|notset|right|show|silent|silentlog|textonly|top|try|un\.components|un\.custom|un\.directory|un\.instfiles|un\.license|uninstConfirm|user|Win10|Win7|Win8|WinVista|zlib)\b/, token: "builtin"}, - - // LogicLib.nsh - {regex: /\$\{(?:And(?:If(?:Not)?|Unless)|Break|Case(?:Else)?|Continue|Default|Do(?:Until|While)?|Else(?:If(?:Not)?|Unless)?|End(?:If|Select|Switch)|Exit(?:Do|For|While)|For(?:Each)?|If(?:Cmd|Not(?:Then)?|Then)?|Loop(?:Until|While)?|Or(?:If(?:Not)?|Unless)|Select|Switch|Unless|While)\}/, token: "variable-2", indent: true}, - - // FileFunc.nsh - {regex: /\$\{(?:BannerTrimPath|DirState|DriveSpace|Get(BaseName|Drives|ExeName|ExePath|FileAttributes|FileExt|FileName|FileVersion|Options|OptionsS|Parameters|Parent|Root|Size|Time)|Locate|RefreshShellIcons)\}/, token: "variable-2", dedent: true}, - - // Memento.nsh - {regex: /\$\{(?:Memento(?:Section(?:Done|End|Restore|Save)?|UnselectedSection))\}/, token: "variable-2", dedent: true}, - - // TextFunc.nsh - {regex: /\$\{(?:Config(?:Read|ReadS|Write|WriteS)|File(?:Join|ReadFromEnd|Recode)|Line(?:Find|Read|Sum)|Text(?:Compare|CompareS)|TrimNewLines)\}/, token: "variable-2", dedent: true}, - - // WinVer.nsh - {regex: /\$\{(?:(?:At(?:Least|Most)|Is)(?:ServicePack|Win(?:7|8|10|95|98|200(?:0|3|8(?:R2)?)|ME|NT4|Vista|XP))|Is(?:NT|Server))\}/, token: "variable", dedent: true}, - - // WordFunc.nsh - {regex: /\$\{(?:StrFilterS?|Version(?:Compare|Convert)|Word(?:AddS?|Find(?:(?:2|3)X)?S?|InsertS?|ReplaceS?))\}/, token: "variable-2", dedent: true}, - - // x64.nsh - {regex: /\$\{(?:RunningX64)\}/, token: "variable", dedent: true}, - {regex: /\$\{(?:Disable|Enable)X64FSRedirection\}/, token: "variable-2", dedent: true}, - - // Line Comment - {regex: /(#|;).*/, token: "comment"}, - - // Block Comment - {regex: /\/\*/, token: "comment", next: "comment"}, - - // Operator - {regex: /[-+\/*=<>!]+/, token: "operator"}, - - // Variable - {regex: /\$[\w]+/, token: "variable"}, - - // Constant - {regex: /\${[\w]+}/,token: "variable-2"}, - - // Language String - {regex: /\$\([\w]+\)/,token: "variable-3"} - ], - comment: [ - {regex: /.*?\*\//, token: "comment", next: "start"}, - {regex: /.*/, token: "comment"} - ], - meta: { - electricInput: /^\s*((Function|PageEx|Section|Section(Group)?)End|(\!(endif|macroend))|\$\{(End(If|Unless|While)|Loop(Until)|Next)\})$/, - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: ["#", ";"] - } -}); - -CodeMirror.defineMIME("text/x-nsis", "nsis"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/ntriples/index.html b/public/plugins/codemirror-5.17.0/mode/ntriples/index.html deleted file mode 100644 index 1355e71..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ntriples/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - -CodeMirror: NTriples mode - - - - - - - - - -
-

NTriples mode

-
- - - - -

MIME types defined: text/n-triples.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/ntriples/ntriples.js b/public/plugins/codemirror-5.17.0/mode/ntriples/ntriples.js deleted file mode 100644 index 0524b1e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ntriples/ntriples.js +++ /dev/null @@ -1,186 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/********************************************************** -* This script provides syntax highlighting support for -* the Ntriples format. -* Ntriples format specification: -* http://www.w3.org/TR/rdf-testcases/#ntriples -***********************************************************/ - -/* - The following expression defines the defined ASF grammar transitions. - - pre_subject -> - { - ( writing_subject_uri | writing_bnode_uri ) - -> pre_predicate - -> writing_predicate_uri - -> pre_object - -> writing_object_uri | writing_object_bnode | - ( - writing_object_literal - -> writing_literal_lang | writing_literal_type - ) - -> post_object - -> BEGIN - } otherwise { - -> ERROR - } -*/ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("ntriples", function() { - - var Location = { - PRE_SUBJECT : 0, - WRITING_SUB_URI : 1, - WRITING_BNODE_URI : 2, - PRE_PRED : 3, - WRITING_PRED_URI : 4, - PRE_OBJ : 5, - WRITING_OBJ_URI : 6, - WRITING_OBJ_BNODE : 7, - WRITING_OBJ_LITERAL : 8, - WRITING_LIT_LANG : 9, - WRITING_LIT_TYPE : 10, - POST_OBJ : 11, - ERROR : 12 - }; - function transitState(currState, c) { - var currLocation = currState.location; - var ret; - - // Opening. - if (currLocation == Location.PRE_SUBJECT && c == '<') ret = Location.WRITING_SUB_URI; - else if(currLocation == Location.PRE_SUBJECT && c == '_') ret = Location.WRITING_BNODE_URI; - else if(currLocation == Location.PRE_PRED && c == '<') ret = Location.WRITING_PRED_URI; - else if(currLocation == Location.PRE_OBJ && c == '<') ret = Location.WRITING_OBJ_URI; - else if(currLocation == Location.PRE_OBJ && c == '_') ret = Location.WRITING_OBJ_BNODE; - else if(currLocation == Location.PRE_OBJ && c == '"') ret = Location.WRITING_OBJ_LITERAL; - - // Closing. - else if(currLocation == Location.WRITING_SUB_URI && c == '>') ret = Location.PRE_PRED; - else if(currLocation == Location.WRITING_BNODE_URI && c == ' ') ret = Location.PRE_PRED; - else if(currLocation == Location.WRITING_PRED_URI && c == '>') ret = Location.PRE_OBJ; - else if(currLocation == Location.WRITING_OBJ_URI && c == '>') ret = Location.POST_OBJ; - else if(currLocation == Location.WRITING_OBJ_BNODE && c == ' ') ret = Location.POST_OBJ; - else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '"') ret = Location.POST_OBJ; - else if(currLocation == Location.WRITING_LIT_LANG && c == ' ') ret = Location.POST_OBJ; - else if(currLocation == Location.WRITING_LIT_TYPE && c == '>') ret = Location.POST_OBJ; - - // Closing typed and language literal. - else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '@') ret = Location.WRITING_LIT_LANG; - else if(currLocation == Location.WRITING_OBJ_LITERAL && c == '^') ret = Location.WRITING_LIT_TYPE; - - // Spaces. - else if( c == ' ' && - ( - currLocation == Location.PRE_SUBJECT || - currLocation == Location.PRE_PRED || - currLocation == Location.PRE_OBJ || - currLocation == Location.POST_OBJ - ) - ) ret = currLocation; - - // Reset. - else if(currLocation == Location.POST_OBJ && c == '.') ret = Location.PRE_SUBJECT; - - // Error - else ret = Location.ERROR; - - currState.location=ret; - } - - return { - startState: function() { - return { - location : Location.PRE_SUBJECT, - uris : [], - anchors : [], - bnodes : [], - langs : [], - types : [] - }; - }, - token: function(stream, state) { - var ch = stream.next(); - if(ch == '<') { - transitState(state, ch); - var parsedURI = ''; - stream.eatWhile( function(c) { if( c != '#' && c != '>' ) { parsedURI += c; return true; } return false;} ); - state.uris.push(parsedURI); - if( stream.match('#', false) ) return 'variable'; - stream.next(); - transitState(state, '>'); - return 'variable'; - } - if(ch == '#') { - var parsedAnchor = ''; - stream.eatWhile(function(c) { if(c != '>' && c != ' ') { parsedAnchor+= c; return true; } return false;}); - state.anchors.push(parsedAnchor); - return 'variable-2'; - } - if(ch == '>') { - transitState(state, '>'); - return 'variable'; - } - if(ch == '_') { - transitState(state, ch); - var parsedBNode = ''; - stream.eatWhile(function(c) { if( c != ' ' ) { parsedBNode += c; return true; } return false;}); - state.bnodes.push(parsedBNode); - stream.next(); - transitState(state, ' '); - return 'builtin'; - } - if(ch == '"') { - transitState(state, ch); - stream.eatWhile( function(c) { return c != '"'; } ); - stream.next(); - if( stream.peek() != '@' && stream.peek() != '^' ) { - transitState(state, '"'); - } - return 'string'; - } - if( ch == '@' ) { - transitState(state, '@'); - var parsedLang = ''; - stream.eatWhile(function(c) { if( c != ' ' ) { parsedLang += c; return true; } return false;}); - state.langs.push(parsedLang); - stream.next(); - transitState(state, ' '); - return 'string-2'; - } - if( ch == '^' ) { - stream.next(); - transitState(state, '^'); - var parsedType = ''; - stream.eatWhile(function(c) { if( c != '>' ) { parsedType += c; return true; } return false;} ); - state.types.push(parsedType); - stream.next(); - transitState(state, '>'); - return 'variable'; - } - if( ch == ' ' ) { - transitState(state, ch); - } - if( ch == '.' ) { - transitState(state, ch); - } - } - }; -}); - -CodeMirror.defineMIME("text/n-triples", "ntriples"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/octave/index.html b/public/plugins/codemirror-5.17.0/mode/octave/index.html deleted file mode 100644 index 3490ee6..0000000 --- a/public/plugins/codemirror-5.17.0/mode/octave/index.html +++ /dev/null @@ -1,83 +0,0 @@ - - -CodeMirror: Octave mode - - - - - - - - - -
-

Octave mode

- -
- - -

MIME types defined: text/x-octave.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/octave/octave.js b/public/plugins/codemirror-5.17.0/mode/octave/octave.js deleted file mode 100644 index a7bec03..0000000 --- a/public/plugins/codemirror-5.17.0/mode/octave/octave.js +++ /dev/null @@ -1,135 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("octave", function() { - function wordRegexp(words) { - return new RegExp("^((" + words.join(")|(") + "))\\b"); - } - - var singleOperators = new RegExp("^[\\+\\-\\*/&|\\^~<>!@'\\\\]"); - var singleDelimiters = new RegExp('^[\\(\\[\\{\\},:=;]'); - var doubleOperators = new RegExp("^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\.[\\+\\-\\*/\\^\\\\]))"); - var doubleDelimiters = new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))"); - var tripleDelimiters = new RegExp("^((>>=)|(<<=))"); - var expressionEnd = new RegExp("^[\\]\\)]"); - var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); - - var builtins = wordRegexp([ - 'error', 'eval', 'function', 'abs', 'acos', 'atan', 'asin', 'cos', - 'cosh', 'exp', 'log', 'prod', 'sum', 'log10', 'max', 'min', 'sign', 'sin', 'sinh', - 'sqrt', 'tan', 'reshape', 'break', 'zeros', 'default', 'margin', 'round', 'ones', - 'rand', 'syn', 'ceil', 'floor', 'size', 'clear', 'zeros', 'eye', 'mean', 'std', 'cov', - 'det', 'eig', 'inv', 'norm', 'rank', 'trace', 'expm', 'logm', 'sqrtm', 'linspace', 'plot', - 'title', 'xlabel', 'ylabel', 'legend', 'text', 'grid', 'meshgrid', 'mesh', 'num2str', - 'fft', 'ifft', 'arrayfun', 'cellfun', 'input', 'fliplr', 'flipud', 'ismember' - ]); - - var keywords = wordRegexp([ - 'return', 'case', 'switch', 'else', 'elseif', 'end', 'endif', 'endfunction', - 'if', 'otherwise', 'do', 'for', 'while', 'try', 'catch', 'classdef', 'properties', 'events', - 'methods', 'global', 'persistent', 'endfor', 'endwhile', 'printf', 'sprintf', 'disp', 'until', - 'continue', 'pkg' - ]); - - - // tokenizers - function tokenTranspose(stream, state) { - if (!stream.sol() && stream.peek() === '\'') { - stream.next(); - state.tokenize = tokenBase; - return 'operator'; - } - state.tokenize = tokenBase; - return tokenBase(stream, state); - } - - - function tokenComment(stream, state) { - if (stream.match(/^.*%}/)) { - state.tokenize = tokenBase; - return 'comment'; - }; - stream.skipToEnd(); - return 'comment'; - } - - function tokenBase(stream, state) { - // whitespaces - if (stream.eatSpace()) return null; - - // Handle one line Comments - if (stream.match('%{')){ - state.tokenize = tokenComment; - stream.skipToEnd(); - return 'comment'; - } - - if (stream.match(/^[%#]/)){ - stream.skipToEnd(); - return 'comment'; - } - - // Handle Number Literals - if (stream.match(/^[0-9\.+-]/, false)) { - if (stream.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/)) { - stream.tokenize = tokenBase; - return 'number'; }; - if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; - if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?[ij]?/)) { return 'number'; }; - } - if (stream.match(wordRegexp(['nan','NaN','inf','Inf']))) { return 'number'; }; - - // Handle Strings - if (stream.match(/^"([^"]|(""))*"/)) { return 'string'; } ; - if (stream.match(/^'([^']|(''))*'/)) { return 'string'; } ; - - // Handle words - if (stream.match(keywords)) { return 'keyword'; } ; - if (stream.match(builtins)) { return 'builtin'; } ; - if (stream.match(identifiers)) { return 'variable'; } ; - - if (stream.match(singleOperators) || stream.match(doubleOperators)) { return 'operator'; }; - if (stream.match(singleDelimiters) || stream.match(doubleDelimiters) || stream.match(tripleDelimiters)) { return null; }; - - if (stream.match(expressionEnd)) { - state.tokenize = tokenTranspose; - return null; - }; - - - // Handle non-detected items - stream.next(); - return 'error'; - }; - - - return { - startState: function() { - return { - tokenize: tokenBase - }; - }, - - token: function(stream, state) { - var style = state.tokenize(stream, state); - if (style === 'number' || style === 'variable'){ - state.tokenize = tokenTranspose; - } - return style; - } - }; -}); - -CodeMirror.defineMIME("text/x-octave", "octave"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/oz/index.html b/public/plugins/codemirror-5.17.0/mode/oz/index.html deleted file mode 100644 index febd82a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/oz/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - -CodeMirror: Oz mode - - - - - - - - - - -
-

Oz mode

- -

MIME type defined: text/x-oz.

- - -
diff --git a/public/plugins/codemirror-5.17.0/mode/oz/oz.js b/public/plugins/codemirror-5.17.0/mode/oz/oz.js deleted file mode 100644 index ee8cb0a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/oz/oz.js +++ /dev/null @@ -1,252 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("oz", function (conf) { - - function wordRegexp(words) { - return new RegExp("^((" + words.join(")|(") + "))\\b"); - } - - var singleOperators = /[\^@!\|<>#~\.\*\-\+\\/,=]/; - var doubleOperators = /(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\=)|(\\=:)|(!!)|(==)|(::)/; - var tripleOperators = /(:::)|(\.\.\.)|(=<:)|(>=:)/; - - var middle = ["in", "then", "else", "of", "elseof", "elsecase", "elseif", "catch", - "finally", "with", "require", "prepare", "import", "export", "define", "do"]; - var end = ["end"]; - - var atoms = wordRegexp(["true", "false", "nil", "unit"]); - var commonKeywords = wordRegexp(["andthen", "at", "attr", "declare", "feat", "from", "lex", - "mod", "mode", "orelse", "parser", "prod", "prop", "scanner", "self", "syn", "token"]); - var openingKeywords = wordRegexp(["local", "proc", "fun", "case", "class", "if", "cond", "or", "dis", - "choice", "not", "thread", "try", "raise", "lock", "for", "suchthat", "meth", "functor"]); - var middleKeywords = wordRegexp(middle); - var endKeywords = wordRegexp(end); - - // Tokenizers - function tokenBase(stream, state) { - if (stream.eatSpace()) { - return null; - } - - // Brackets - if(stream.match(/[{}]/)) { - return "bracket"; - } - - // Special [] keyword - if (stream.match(/(\[])/)) { - return "keyword" - } - - // Operators - if (stream.match(tripleOperators) || stream.match(doubleOperators)) { - return "operator"; - } - - // Atoms - if(stream.match(atoms)) { - return 'atom'; - } - - // Opening keywords - var matched = stream.match(openingKeywords); - if (matched) { - if (!state.doInCurrentLine) - state.currentIndent++; - else - state.doInCurrentLine = false; - - // Special matching for signatures - if(matched[0] == "proc" || matched[0] == "fun") - state.tokenize = tokenFunProc; - else if(matched[0] == "class") - state.tokenize = tokenClass; - else if(matched[0] == "meth") - state.tokenize = tokenMeth; - - return 'keyword'; - } - - // Middle and other keywords - if (stream.match(middleKeywords) || stream.match(commonKeywords)) { - return "keyword" - } - - // End keywords - if (stream.match(endKeywords)) { - state.currentIndent--; - return 'keyword'; - } - - // Eat the next char for next comparisons - var ch = stream.next(); - - // Strings - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - - // Numbers - if (/[~\d]/.test(ch)) { - if (ch == "~") { - if(! /^[0-9]/.test(stream.peek())) - return null; - else if (( stream.next() == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/)) - return "number"; - } - - if ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/)) - return "number"; - - return null; - } - - // Comments - if (ch == "%") { - stream.skipToEnd(); - return 'comment'; - } - else if (ch == "/") { - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - } - - // Single operators - if(singleOperators.test(ch)) { - return "operator"; - } - - // If nothing match, we skip the entire alphanumerical block - stream.eatWhile(/\w/); - - return "variable"; - } - - function tokenClass(stream, state) { - if (stream.eatSpace()) { - return null; - } - stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/); - state.tokenize = tokenBase; - return "variable-3" - } - - function tokenMeth(stream, state) { - if (stream.eatSpace()) { - return null; - } - stream.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/); - state.tokenize = tokenBase; - return "def" - } - - function tokenFunProc(stream, state) { - if (stream.eatSpace()) { - return null; - } - - if(!state.hasPassedFirstStage && stream.eat("{")) { - state.hasPassedFirstStage = true; - return "bracket"; - } - else if(state.hasPassedFirstStage) { - stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\$/); - state.hasPassedFirstStage = false; - state.tokenize = tokenBase; - return "def" - } - else { - state.tokenize = tokenBase; - return null; - } - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function tokenString(quote) { - return function (stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) { - end = true; - break; - } - escaped = !escaped && next == "\\"; - } - if (end || !escaped) - state.tokenize = tokenBase; - return "string"; - }; - } - - function buildElectricInputRegEx() { - // Reindentation should occur on [] or on a match of any of - // the block closing keywords, at the end of a line. - var allClosings = middle.concat(end); - return new RegExp("[\\[\\]]|(" + allClosings.join("|") + ")$"); - } - - return { - - startState: function () { - return { - tokenize: tokenBase, - currentIndent: 0, - doInCurrentLine: false, - hasPassedFirstStage: false - }; - }, - - token: function (stream, state) { - if (stream.sol()) - state.doInCurrentLine = 0; - - return state.tokenize(stream, state); - }, - - indent: function (state, textAfter) { - var trueText = textAfter.replace(/^\s+|\s+$/g, ''); - - if (trueText.match(endKeywords) || trueText.match(middleKeywords) || trueText.match(/(\[])/)) - return conf.indentUnit * (state.currentIndent - 1); - - if (state.currentIndent < 0) - return 0; - - return state.currentIndent * conf.indentUnit; - }, - fold: "indent", - electricInput: buildElectricInputRegEx(), - lineComment: "%", - blockCommentStart: "/*", - blockCommentEnd: "*/" - }; -}); - -CodeMirror.defineMIME("text/x-oz", "oz"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/pascal/index.html b/public/plugins/codemirror-5.17.0/mode/pascal/index.html deleted file mode 100644 index f8a99ad..0000000 --- a/public/plugins/codemirror-5.17.0/mode/pascal/index.html +++ /dev/null @@ -1,61 +0,0 @@ - - -CodeMirror: Pascal mode - - - - - - - - - -
-

Pascal mode

- - -
- - - -

MIME types defined: text/x-pascal.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/pascal/pascal.js b/public/plugins/codemirror-5.17.0/mode/pascal/pascal.js deleted file mode 100644 index 2d0c3d4..0000000 --- a/public/plugins/codemirror-5.17.0/mode/pascal/pascal.js +++ /dev/null @@ -1,109 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("pascal", function() { - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - var keywords = words("and array begin case const div do downto else end file for forward integer " + - "boolean char function goto if in label mod nil not of or packed procedure " + - "program record repeat set string then to type until var while with"); - var atoms = {"null": true}; - - var isOperatorChar = /[+\-*&%=<>!?|\/]/; - - function tokenBase(stream, state) { - var ch = stream.next(); - if (ch == "#" && state.startOfLine) { - stream.skipToEnd(); - return "meta"; - } - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - if (ch == "(" && stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - if (/[\[\]{}\(\),;\:\.]/.test(ch)) { - return null; - } - if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } - if (ch == "/") { - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - } - if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - stream.eatWhile(/[\w\$_]/); - var cur = stream.current(); - if (keywords.propertyIsEnumerable(cur)) return "keyword"; - if (atoms.propertyIsEnumerable(cur)) return "atom"; - return "variable"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) {end = true; break;} - escaped = !escaped && next == "\\"; - } - if (end || !escaped) state.tokenize = null; - return "string"; - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == ")" && maybeEnd) { - state.tokenize = null; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - // Interface - - return { - startState: function() { - return {tokenize: null}; - }, - - token: function(stream, state) { - if (stream.eatSpace()) return null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment" || style == "meta") return style; - return style; - }, - - electricChars: "{}" - }; -}); - -CodeMirror.defineMIME("text/x-pascal", "pascal"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/pegjs/index.html b/public/plugins/codemirror-5.17.0/mode/pegjs/index.html deleted file mode 100644 index 0c74604..0000000 --- a/public/plugins/codemirror-5.17.0/mode/pegjs/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - CodeMirror: PEG.js Mode - - - - - - - - - - - - -
-

PEG.js Mode

-
- -

The PEG.js Mode

-

Created by Forbes Lindesay.

-
- - diff --git a/public/plugins/codemirror-5.17.0/mode/pegjs/pegjs.js b/public/plugins/codemirror-5.17.0/mode/pegjs/pegjs.js deleted file mode 100644 index 6c72074..0000000 --- a/public/plugins/codemirror-5.17.0/mode/pegjs/pegjs.js +++ /dev/null @@ -1,114 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../javascript/javascript")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../javascript/javascript"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("pegjs", function (config) { - var jsMode = CodeMirror.getMode(config, "javascript"); - - function identifier(stream) { - return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/); - } - - return { - startState: function () { - return { - inString: false, - stringType: null, - inComment: false, - inCharacterClass: false, - braced: 0, - lhs: true, - localState: null - }; - }, - token: function (stream, state) { - if (stream) - - //check for state changes - if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) { - state.stringType = stream.peek(); - stream.next(); // Skip quote - state.inString = true; // Update state - } - if (!state.inString && !state.inComment && stream.match(/^\/\*/)) { - state.inComment = true; - } - - //return state - if (state.inString) { - while (state.inString && !stream.eol()) { - if (stream.peek() === state.stringType) { - stream.next(); // Skip quote - state.inString = false; // Clear flag - } else if (stream.peek() === '\\') { - stream.next(); - stream.next(); - } else { - stream.match(/^.[^\\\"\']*/); - } - } - return state.lhs ? "property string" : "string"; // Token style - } else if (state.inComment) { - while (state.inComment && !stream.eol()) { - if (stream.match(/\*\//)) { - state.inComment = false; // Clear flag - } else { - stream.match(/^.[^\*]*/); - } - } - return "comment"; - } else if (state.inCharacterClass) { - while (state.inCharacterClass && !stream.eol()) { - if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { - state.inCharacterClass = false; - } - } - } else if (stream.peek() === '[') { - stream.next(); - state.inCharacterClass = true; - return 'bracket'; - } else if (stream.match(/^\/\//)) { - stream.skipToEnd(); - return "comment"; - } else if (state.braced || stream.peek() === '{') { - if (state.localState === null) { - state.localState = CodeMirror.startState(jsMode); - } - var token = jsMode.token(stream, state.localState); - var text = stream.current(); - if (!token) { - for (var i = 0; i < text.length; i++) { - if (text[i] === '{') { - state.braced++; - } else if (text[i] === '}') { - state.braced--; - } - }; - } - return token; - } else if (identifier(stream)) { - if (stream.peek() === ':') { - return 'variable'; - } - return 'variable-2'; - } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) { - stream.next(); - return 'bracket'; - } else if (!stream.eatSpace()) { - stream.next(); - } - return null; - } - }; -}, "javascript"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/perl/index.html b/public/plugins/codemirror-5.17.0/mode/perl/index.html deleted file mode 100644 index 8c1021c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/perl/index.html +++ /dev/null @@ -1,75 +0,0 @@ - - -CodeMirror: Perl mode - - - - - - - - - -
-

Perl mode

- - -
- - - -

MIME types defined: text/x-perl.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/perl/perl.js b/public/plugins/codemirror-5.17.0/mode/perl/perl.js deleted file mode 100644 index 66e4ed0..0000000 --- a/public/plugins/codemirror-5.17.0/mode/perl/perl.js +++ /dev/null @@ -1,837 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08) -// This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com) - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("perl",function(){ - // http://perldoc.perl.org - var PERL={ // null - magic touch - // 1 - keyword - // 2 - def - // 3 - atom - // 4 - operator - // 5 - variable-2 (predefined) - // [x,y] - x=1,2,3; y=must be defined if x{...} - // PERL operators - '->' : 4, - '++' : 4, - '--' : 4, - '**' : 4, - // ! ~ \ and unary + and - - '=~' : 4, - '!~' : 4, - '*' : 4, - '/' : 4, - '%' : 4, - 'x' : 4, - '+' : 4, - '-' : 4, - '.' : 4, - '<<' : 4, - '>>' : 4, - // named unary operators - '<' : 4, - '>' : 4, - '<=' : 4, - '>=' : 4, - 'lt' : 4, - 'gt' : 4, - 'le' : 4, - 'ge' : 4, - '==' : 4, - '!=' : 4, - '<=>' : 4, - 'eq' : 4, - 'ne' : 4, - 'cmp' : 4, - '~~' : 4, - '&' : 4, - '|' : 4, - '^' : 4, - '&&' : 4, - '||' : 4, - '//' : 4, - '..' : 4, - '...' : 4, - '?' : 4, - ':' : 4, - '=' : 4, - '+=' : 4, - '-=' : 4, - '*=' : 4, // etc. ??? - ',' : 4, - '=>' : 4, - '::' : 4, - // list operators (rightward) - 'not' : 4, - 'and' : 4, - 'or' : 4, - 'xor' : 4, - // PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;) - 'BEGIN' : [5,1], - 'END' : [5,1], - 'PRINT' : [5,1], - 'PRINTF' : [5,1], - 'GETC' : [5,1], - 'READ' : [5,1], - 'READLINE' : [5,1], - 'DESTROY' : [5,1], - 'TIE' : [5,1], - 'TIEHANDLE' : [5,1], - 'UNTIE' : [5,1], - 'STDIN' : 5, - 'STDIN_TOP' : 5, - 'STDOUT' : 5, - 'STDOUT_TOP' : 5, - 'STDERR' : 5, - 'STDERR_TOP' : 5, - '$ARG' : 5, - '$_' : 5, - '@ARG' : 5, - '@_' : 5, - '$LIST_SEPARATOR' : 5, - '$"' : 5, - '$PROCESS_ID' : 5, - '$PID' : 5, - '$$' : 5, - '$REAL_GROUP_ID' : 5, - '$GID' : 5, - '$(' : 5, - '$EFFECTIVE_GROUP_ID' : 5, - '$EGID' : 5, - '$)' : 5, - '$PROGRAM_NAME' : 5, - '$0' : 5, - '$SUBSCRIPT_SEPARATOR' : 5, - '$SUBSEP' : 5, - '$;' : 5, - '$REAL_USER_ID' : 5, - '$UID' : 5, - '$<' : 5, - '$EFFECTIVE_USER_ID' : 5, - '$EUID' : 5, - '$>' : 5, - '$a' : 5, - '$b' : 5, - '$COMPILING' : 5, - '$^C' : 5, - '$DEBUGGING' : 5, - '$^D' : 5, - '${^ENCODING}' : 5, - '$ENV' : 5, - '%ENV' : 5, - '$SYSTEM_FD_MAX' : 5, - '$^F' : 5, - '@F' : 5, - '${^GLOBAL_PHASE}' : 5, - '$^H' : 5, - '%^H' : 5, - '@INC' : 5, - '%INC' : 5, - '$INPLACE_EDIT' : 5, - '$^I' : 5, - '$^M' : 5, - '$OSNAME' : 5, - '$^O' : 5, - '${^OPEN}' : 5, - '$PERLDB' : 5, - '$^P' : 5, - '$SIG' : 5, - '%SIG' : 5, - '$BASETIME' : 5, - '$^T' : 5, - '${^TAINT}' : 5, - '${^UNICODE}' : 5, - '${^UTF8CACHE}' : 5, - '${^UTF8LOCALE}' : 5, - '$PERL_VERSION' : 5, - '$^V' : 5, - '${^WIN32_SLOPPY_STAT}' : 5, - '$EXECUTABLE_NAME' : 5, - '$^X' : 5, - '$1' : 5, // - regexp $1, $2... - '$MATCH' : 5, - '$&' : 5, - '${^MATCH}' : 5, - '$PREMATCH' : 5, - '$`' : 5, - '${^PREMATCH}' : 5, - '$POSTMATCH' : 5, - "$'" : 5, - '${^POSTMATCH}' : 5, - '$LAST_PAREN_MATCH' : 5, - '$+' : 5, - '$LAST_SUBMATCH_RESULT' : 5, - '$^N' : 5, - '@LAST_MATCH_END' : 5, - '@+' : 5, - '%LAST_PAREN_MATCH' : 5, - '%+' : 5, - '@LAST_MATCH_START' : 5, - '@-' : 5, - '%LAST_MATCH_START' : 5, - '%-' : 5, - '$LAST_REGEXP_CODE_RESULT' : 5, - '$^R' : 5, - '${^RE_DEBUG_FLAGS}' : 5, - '${^RE_TRIE_MAXBUF}' : 5, - '$ARGV' : 5, - '@ARGV' : 5, - 'ARGV' : 5, - 'ARGVOUT' : 5, - '$OUTPUT_FIELD_SEPARATOR' : 5, - '$OFS' : 5, - '$,' : 5, - '$INPUT_LINE_NUMBER' : 5, - '$NR' : 5, - '$.' : 5, - '$INPUT_RECORD_SEPARATOR' : 5, - '$RS' : 5, - '$/' : 5, - '$OUTPUT_RECORD_SEPARATOR' : 5, - '$ORS' : 5, - '$\\' : 5, - '$OUTPUT_AUTOFLUSH' : 5, - '$|' : 5, - '$ACCUMULATOR' : 5, - '$^A' : 5, - '$FORMAT_FORMFEED' : 5, - '$^L' : 5, - '$FORMAT_PAGE_NUMBER' : 5, - '$%' : 5, - '$FORMAT_LINES_LEFT' : 5, - '$-' : 5, - '$FORMAT_LINE_BREAK_CHARACTERS' : 5, - '$:' : 5, - '$FORMAT_LINES_PER_PAGE' : 5, - '$=' : 5, - '$FORMAT_TOP_NAME' : 5, - '$^' : 5, - '$FORMAT_NAME' : 5, - '$~' : 5, - '${^CHILD_ERROR_NATIVE}' : 5, - '$EXTENDED_OS_ERROR' : 5, - '$^E' : 5, - '$EXCEPTIONS_BEING_CAUGHT' : 5, - '$^S' : 5, - '$WARNING' : 5, - '$^W' : 5, - '${^WARNING_BITS}' : 5, - '$OS_ERROR' : 5, - '$ERRNO' : 5, - '$!' : 5, - '%OS_ERROR' : 5, - '%ERRNO' : 5, - '%!' : 5, - '$CHILD_ERROR' : 5, - '$?' : 5, - '$EVAL_ERROR' : 5, - '$@' : 5, - '$OFMT' : 5, - '$#' : 5, - '$*' : 5, - '$ARRAY_BASE' : 5, - '$[' : 5, - '$OLD_PERL_VERSION' : 5, - '$]' : 5, - // PERL blocks - 'if' :[1,1], - elsif :[1,1], - 'else' :[1,1], - 'while' :[1,1], - unless :[1,1], - 'for' :[1,1], - foreach :[1,1], - // PERL functions - 'abs' :1, // - absolute value function - accept :1, // - accept an incoming socket connect - alarm :1, // - schedule a SIGALRM - 'atan2' :1, // - arctangent of Y/X in the range -PI to PI - bind :1, // - binds an address to a socket - binmode :1, // - prepare binary files for I/O - bless :1, // - create an object - bootstrap :1, // - 'break' :1, // - break out of a "given" block - caller :1, // - get context of the current subroutine call - chdir :1, // - change your current working directory - chmod :1, // - changes the permissions on a list of files - chomp :1, // - remove a trailing record separator from a string - chop :1, // - remove the last character from a string - chown :1, // - change the ownership on a list of files - chr :1, // - get character this number represents - chroot :1, // - make directory new root for path lookups - close :1, // - close file (or pipe or socket) handle - closedir :1, // - close directory handle - connect :1, // - connect to a remote socket - 'continue' :[1,1], // - optional trailing block in a while or foreach - 'cos' :1, // - cosine function - crypt :1, // - one-way passwd-style encryption - dbmclose :1, // - breaks binding on a tied dbm file - dbmopen :1, // - create binding on a tied dbm file - 'default' :1, // - defined :1, // - test whether a value, variable, or function is defined - 'delete' :1, // - deletes a value from a hash - die :1, // - raise an exception or bail out - 'do' :1, // - turn a BLOCK into a TERM - dump :1, // - create an immediate core dump - each :1, // - retrieve the next key/value pair from a hash - endgrent :1, // - be done using group file - endhostent :1, // - be done using hosts file - endnetent :1, // - be done using networks file - endprotoent :1, // - be done using protocols file - endpwent :1, // - be done using passwd file - endservent :1, // - be done using services file - eof :1, // - test a filehandle for its end - 'eval' :1, // - catch exceptions or compile and run code - 'exec' :1, // - abandon this program to run another - exists :1, // - test whether a hash key is present - exit :1, // - terminate this program - 'exp' :1, // - raise I to a power - fcntl :1, // - file control system call - fileno :1, // - return file descriptor from filehandle - flock :1, // - lock an entire file with an advisory lock - fork :1, // - create a new process just like this one - format :1, // - declare a picture format with use by the write() function - formline :1, // - internal function used for formats - getc :1, // - get the next character from the filehandle - getgrent :1, // - get next group record - getgrgid :1, // - get group record given group user ID - getgrnam :1, // - get group record given group name - gethostbyaddr :1, // - get host record given its address - gethostbyname :1, // - get host record given name - gethostent :1, // - get next hosts record - getlogin :1, // - return who logged in at this tty - getnetbyaddr :1, // - get network record given its address - getnetbyname :1, // - get networks record given name - getnetent :1, // - get next networks record - getpeername :1, // - find the other end of a socket connection - getpgrp :1, // - get process group - getppid :1, // - get parent process ID - getpriority :1, // - get current nice value - getprotobyname :1, // - get protocol record given name - getprotobynumber :1, // - get protocol record numeric protocol - getprotoent :1, // - get next protocols record - getpwent :1, // - get next passwd record - getpwnam :1, // - get passwd record given user login name - getpwuid :1, // - get passwd record given user ID - getservbyname :1, // - get services record given its name - getservbyport :1, // - get services record given numeric port - getservent :1, // - get next services record - getsockname :1, // - retrieve the sockaddr for a given socket - getsockopt :1, // - get socket options on a given socket - given :1, // - glob :1, // - expand filenames using wildcards - gmtime :1, // - convert UNIX time into record or string using Greenwich time - 'goto' :1, // - create spaghetti code - grep :1, // - locate elements in a list test true against a given criterion - hex :1, // - convert a string to a hexadecimal number - 'import' :1, // - patch a module's namespace into your own - index :1, // - find a substring within a string - 'int' :1, // - get the integer portion of a number - ioctl :1, // - system-dependent device control system call - 'join' :1, // - join a list into a string using a separator - keys :1, // - retrieve list of indices from a hash - kill :1, // - send a signal to a process or process group - last :1, // - exit a block prematurely - lc :1, // - return lower-case version of a string - lcfirst :1, // - return a string with just the next letter in lower case - length :1, // - return the number of bytes in a string - 'link' :1, // - create a hard link in the filesytem - listen :1, // - register your socket as a server - local : 2, // - create a temporary value for a global variable (dynamic scoping) - localtime :1, // - convert UNIX time into record or string using local time - lock :1, // - get a thread lock on a variable, subroutine, or method - 'log' :1, // - retrieve the natural logarithm for a number - lstat :1, // - stat a symbolic link - m :null, // - match a string with a regular expression pattern - map :1, // - apply a change to a list to get back a new list with the changes - mkdir :1, // - create a directory - msgctl :1, // - SysV IPC message control operations - msgget :1, // - get SysV IPC message queue - msgrcv :1, // - receive a SysV IPC message from a message queue - msgsnd :1, // - send a SysV IPC message to a message queue - my : 2, // - declare and assign a local variable (lexical scoping) - 'new' :1, // - next :1, // - iterate a block prematurely - no :1, // - unimport some module symbols or semantics at compile time - oct :1, // - convert a string to an octal number - open :1, // - open a file, pipe, or descriptor - opendir :1, // - open a directory - ord :1, // - find a character's numeric representation - our : 2, // - declare and assign a package variable (lexical scoping) - pack :1, // - convert a list into a binary representation - 'package' :1, // - declare a separate global namespace - pipe :1, // - open a pair of connected filehandles - pop :1, // - remove the last element from an array and return it - pos :1, // - find or set the offset for the last/next m//g search - print :1, // - output a list to a filehandle - printf :1, // - output a formatted list to a filehandle - prototype :1, // - get the prototype (if any) of a subroutine - push :1, // - append one or more elements to an array - q :null, // - singly quote a string - qq :null, // - doubly quote a string - qr :null, // - Compile pattern - quotemeta :null, // - quote regular expression magic characters - qw :null, // - quote a list of words - qx :null, // - backquote quote a string - rand :1, // - retrieve the next pseudorandom number - read :1, // - fixed-length buffered input from a filehandle - readdir :1, // - get a directory from a directory handle - readline :1, // - fetch a record from a file - readlink :1, // - determine where a symbolic link is pointing - readpipe :1, // - execute a system command and collect standard output - recv :1, // - receive a message over a Socket - redo :1, // - start this loop iteration over again - ref :1, // - find out the type of thing being referenced - rename :1, // - change a filename - require :1, // - load in external functions from a library at runtime - reset :1, // - clear all variables of a given name - 'return' :1, // - get out of a function early - reverse :1, // - flip a string or a list - rewinddir :1, // - reset directory handle - rindex :1, // - right-to-left substring search - rmdir :1, // - remove a directory - s :null, // - replace a pattern with a string - say :1, // - print with newline - scalar :1, // - force a scalar context - seek :1, // - reposition file pointer for random-access I/O - seekdir :1, // - reposition directory pointer - select :1, // - reset default output or do I/O multiplexing - semctl :1, // - SysV semaphore control operations - semget :1, // - get set of SysV semaphores - semop :1, // - SysV semaphore operations - send :1, // - send a message over a socket - setgrent :1, // - prepare group file for use - sethostent :1, // - prepare hosts file for use - setnetent :1, // - prepare networks file for use - setpgrp :1, // - set the process group of a process - setpriority :1, // - set a process's nice value - setprotoent :1, // - prepare protocols file for use - setpwent :1, // - prepare passwd file for use - setservent :1, // - prepare services file for use - setsockopt :1, // - set some socket options - shift :1, // - remove the first element of an array, and return it - shmctl :1, // - SysV shared memory operations - shmget :1, // - get SysV shared memory segment identifier - shmread :1, // - read SysV shared memory - shmwrite :1, // - write SysV shared memory - shutdown :1, // - close down just half of a socket connection - 'sin' :1, // - return the sine of a number - sleep :1, // - block for some number of seconds - socket :1, // - create a socket - socketpair :1, // - create a pair of sockets - 'sort' :1, // - sort a list of values - splice :1, // - add or remove elements anywhere in an array - 'split' :1, // - split up a string using a regexp delimiter - sprintf :1, // - formatted print into a string - 'sqrt' :1, // - square root function - srand :1, // - seed the random number generator - stat :1, // - get a file's status information - state :1, // - declare and assign a state variable (persistent lexical scoping) - study :1, // - optimize input data for repeated searches - 'sub' :1, // - declare a subroutine, possibly anonymously - 'substr' :1, // - get or alter a portion of a stirng - symlink :1, // - create a symbolic link to a file - syscall :1, // - execute an arbitrary system call - sysopen :1, // - open a file, pipe, or descriptor - sysread :1, // - fixed-length unbuffered input from a filehandle - sysseek :1, // - position I/O pointer on handle used with sysread and syswrite - system :1, // - run a separate program - syswrite :1, // - fixed-length unbuffered output to a filehandle - tell :1, // - get current seekpointer on a filehandle - telldir :1, // - get current seekpointer on a directory handle - tie :1, // - bind a variable to an object class - tied :1, // - get a reference to the object underlying a tied variable - time :1, // - return number of seconds since 1970 - times :1, // - return elapsed time for self and child processes - tr :null, // - transliterate a string - truncate :1, // - shorten a file - uc :1, // - return upper-case version of a string - ucfirst :1, // - return a string with just the next letter in upper case - umask :1, // - set file creation mode mask - undef :1, // - remove a variable or function definition - unlink :1, // - remove one link to a file - unpack :1, // - convert binary structure into normal perl variables - unshift :1, // - prepend more elements to the beginning of a list - untie :1, // - break a tie binding to a variable - use :1, // - load in a module at compile time - utime :1, // - set a file's last access and modify times - values :1, // - return a list of the values in a hash - vec :1, // - test or set particular bits in a string - wait :1, // - wait for any child process to die - waitpid :1, // - wait for a particular child process to die - wantarray :1, // - get void vs scalar vs list context of current subroutine call - warn :1, // - print debugging info - when :1, // - write :1, // - print a picture record - y :null}; // - transliterate a string - - var RXstyle="string-2"; - var RXmodifiers=/[goseximacplud]/; // NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type - - function tokenChain(stream,state,chain,style,tail){ // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;) - state.chain=null; // 12 3tail - state.style=null; - state.tail=null; - state.tokenize=function(stream,state){ - var e=false,c,i=0; - while(c=stream.next()){ - if(c===chain[i]&&!e){ - if(chain[++i]!==undefined){ - state.chain=chain[i]; - state.style=style; - state.tail=tail;} - else if(tail) - stream.eatWhile(tail); - state.tokenize=tokenPerl; - return style;} - e=!e&&c=="\\";} - return style;}; - return state.tokenize(stream,state);} - - function tokenSOMETHING(stream,state,string){ - state.tokenize=function(stream,state){ - if(stream.string==string) - state.tokenize=tokenPerl; - stream.skipToEnd(); - return "string";}; - return state.tokenize(stream,state);} - - function tokenPerl(stream,state){ - if(stream.eatSpace()) - return null; - if(state.chain) - return tokenChain(stream,state,state.chain,state.style,state.tail); - if(stream.match(/^\-?[\d\.]/,false)) - if(stream.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/)) - return 'number'; - if(stream.match(/^<<(?=\w)/)){ // NOTE: <"],RXstyle,RXmodifiers);} - if(/[\^'"!~\/]/.test(c)){ - eatSuffix(stream, 1); - return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} - else if(c=="q"){ - c=look(stream, 1); - if(c=="("){ - eatSuffix(stream, 2); - return tokenChain(stream,state,[")"],"string");} - if(c=="["){ - eatSuffix(stream, 2); - return tokenChain(stream,state,["]"],"string");} - if(c=="{"){ - eatSuffix(stream, 2); - return tokenChain(stream,state,["}"],"string");} - if(c=="<"){ - eatSuffix(stream, 2); - return tokenChain(stream,state,[">"],"string");} - if(/[\^'"!~\/]/.test(c)){ - eatSuffix(stream, 1); - return tokenChain(stream,state,[stream.eat(c)],"string");}} - else if(c=="w"){ - c=look(stream, 1); - if(c=="("){ - eatSuffix(stream, 2); - return tokenChain(stream,state,[")"],"bracket");} - if(c=="["){ - eatSuffix(stream, 2); - return tokenChain(stream,state,["]"],"bracket");} - if(c=="{"){ - eatSuffix(stream, 2); - return tokenChain(stream,state,["}"],"bracket");} - if(c=="<"){ - eatSuffix(stream, 2); - return tokenChain(stream,state,[">"],"bracket");} - if(/[\^'"!~\/]/.test(c)){ - eatSuffix(stream, 1); - return tokenChain(stream,state,[stream.eat(c)],"bracket");}} - else if(c=="r"){ - c=look(stream, 1); - if(c=="("){ - eatSuffix(stream, 2); - return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} - if(c=="["){ - eatSuffix(stream, 2); - return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} - if(c=="{"){ - eatSuffix(stream, 2); - return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} - if(c=="<"){ - eatSuffix(stream, 2); - return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);} - if(/[\^'"!~\/]/.test(c)){ - eatSuffix(stream, 1); - return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} - else if(/[\^'"!~\/(\[{<]/.test(c)){ - if(c=="("){ - eatSuffix(stream, 1); - return tokenChain(stream,state,[")"],"string");} - if(c=="["){ - eatSuffix(stream, 1); - return tokenChain(stream,state,["]"],"string");} - if(c=="{"){ - eatSuffix(stream, 1); - return tokenChain(stream,state,["}"],"string");} - if(c=="<"){ - eatSuffix(stream, 1); - return tokenChain(stream,state,[">"],"string");} - if(/[\^'"!~\/]/.test(c)){ - return tokenChain(stream,state,[stream.eat(c)],"string");}}}} - if(ch=="m"){ - var c=look(stream, -2); - if(!(c&&/\w/.test(c))){ - c=stream.eat(/[(\[{<\^'"!~\/]/); - if(c){ - if(/[\^'"!~\/]/.test(c)){ - return tokenChain(stream,state,[c],RXstyle,RXmodifiers);} - if(c=="("){ - return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} - if(c=="["){ - return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} - if(c=="{"){ - return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} - if(c=="<"){ - return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}} - if(ch=="s"){ - var c=/[\/>\]})\w]/.test(look(stream, -2)); - if(!c){ - c=stream.eat(/[(\[{<\^'"!~\/]/); - if(c){ - if(c=="[") - return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); - if(c=="{") - return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); - if(c=="<") - return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); - if(c=="(") - return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); - return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} - if(ch=="y"){ - var c=/[\/>\]})\w]/.test(look(stream, -2)); - if(!c){ - c=stream.eat(/[(\[{<\^'"!~\/]/); - if(c){ - if(c=="[") - return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); - if(c=="{") - return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); - if(c=="<") - return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); - if(c=="(") - return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); - return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} - if(ch=="t"){ - var c=/[\/>\]})\w]/.test(look(stream, -2)); - if(!c){ - c=stream.eat("r");if(c){ - c=stream.eat(/[(\[{<\^'"!~\/]/); - if(c){ - if(c=="[") - return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); - if(c=="{") - return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); - if(c=="<") - return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); - if(c=="(") - return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); - return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}} - if(ch=="`"){ - return tokenChain(stream,state,[ch],"variable-2");} - if(ch=="/"){ - if(!/~\s*$/.test(prefix(stream))) - return "operator"; - else - return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);} - if(ch=="$"){ - var p=stream.pos; - if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}")) - return "variable-2"; - else - stream.pos=p;} - if(/[$@%]/.test(ch)){ - var p=stream.pos; - if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){ - var c=stream.current(); - if(PERL[c]) - return "variable-2";} - stream.pos=p;} - if(/[$@%&]/.test(ch)){ - if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){ - var c=stream.current(); - if(PERL[c]) - return "variable-2"; - else - return "variable";}} - if(ch=="#"){ - if(look(stream, -2)!="$"){ - stream.skipToEnd(); - return "comment";}} - if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){ - var p=stream.pos; - stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/); - if(PERL[stream.current()]) - return "operator"; - else - stream.pos=p;} - if(ch=="_"){ - if(stream.pos==1){ - if(suffix(stream, 6)=="_END__"){ - return tokenChain(stream,state,['\0'],"comment");} - else if(suffix(stream, 7)=="_DATA__"){ - return tokenChain(stream,state,['\0'],"variable-2");} - else if(suffix(stream, 7)=="_C__"){ - return tokenChain(stream,state,['\0'],"string");}}} - if(/\w/.test(ch)){ - var p=stream.pos; - if(look(stream, -2)=="{"&&(look(stream, 0)=="}"||stream.eatWhile(/\w/)&&look(stream, 0)=="}")) - return "string"; - else - stream.pos=p;} - if(/[A-Z]/.test(ch)){ - var l=look(stream, -2); - var p=stream.pos; - stream.eatWhile(/[A-Z_]/); - if(/[\da-z]/.test(look(stream, 0))){ - stream.pos=p;} - else{ - var c=PERL[stream.current()]; - if(!c) - return "meta"; - if(c[1]) - c=c[0]; - if(l!=":"){ - if(c==1) - return "keyword"; - else if(c==2) - return "def"; - else if(c==3) - return "atom"; - else if(c==4) - return "operator"; - else if(c==5) - return "variable-2"; - else - return "meta";} - else - return "meta";}} - if(/[a-zA-Z_]/.test(ch)){ - var l=look(stream, -2); - stream.eatWhile(/\w/); - var c=PERL[stream.current()]; - if(!c) - return "meta"; - if(c[1]) - c=c[0]; - if(l!=":"){ - if(c==1) - return "keyword"; - else if(c==2) - return "def"; - else if(c==3) - return "atom"; - else if(c==4) - return "operator"; - else if(c==5) - return "variable-2"; - else - return "meta";} - else - return "meta";} - return null;} - - return { - startState: function() { - return { - tokenize: tokenPerl, - chain: null, - style: null, - tail: null - }; - }, - token: function(stream, state) { - return (state.tokenize || tokenPerl)(stream, state); - }, - lineComment: '#' - }; -}); - -CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); - -CodeMirror.defineMIME("text/x-perl", "perl"); - -// it's like "peek", but need for look-ahead or look-behind if index < 0 -function look(stream, c){ - return stream.string.charAt(stream.pos+(c||0)); -} - -// return a part of prefix of current stream from current position -function prefix(stream, c){ - if(c){ - var x=stream.pos-c; - return stream.string.substr((x>=0?x:0),c);} - else{ - return stream.string.substr(0,stream.pos-1); - } -} - -// return a part of suffix of current stream from current position -function suffix(stream, c){ - var y=stream.string.length; - var x=y-stream.pos+1; - return stream.string.substr(stream.pos,(c&&c=(y=stream.string.length-1)) - stream.pos=y; - else - stream.pos=x; -} - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/php/index.html b/public/plugins/codemirror-5.17.0/mode/php/index.html deleted file mode 100644 index adf6b1b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/php/index.html +++ /dev/null @@ -1,64 +0,0 @@ - - -CodeMirror: PHP mode - - - - - - - - - - - - - - - -
-

PHP mode

-
- - - -

Simple HTML/PHP mode based on - the C-like mode. Depends on XML, - JavaScript, CSS, HTMLMixed, and C-like modes.

- -

MIME types defined: application/x-httpd-php (HTML with PHP code), text/x-php (plain, non-wrapped PHP code).

-
diff --git a/public/plugins/codemirror-5.17.0/mode/php/php.js b/public/plugins/codemirror-5.17.0/mode/php/php.js deleted file mode 100644 index 57ba812..0000000 --- a/public/plugins/codemirror-5.17.0/mode/php/php.js +++ /dev/null @@ -1,234 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../clike/clike")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../clike/clike"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - function keywords(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - // Helper for phpString - function matchSequence(list, end, escapes) { - if (list.length == 0) return phpString(end); - return function (stream, state) { - var patterns = list[0]; - for (var i = 0; i < patterns.length; i++) if (stream.match(patterns[i][0])) { - state.tokenize = matchSequence(list.slice(1), end); - return patterns[i][1]; - } - state.tokenize = phpString(end, escapes); - return "string"; - }; - } - function phpString(closing, escapes) { - return function(stream, state) { return phpString_(stream, state, closing, escapes); }; - } - function phpString_(stream, state, closing, escapes) { - // "Complex" syntax - if (escapes !== false && stream.match("${", false) || stream.match("{$", false)) { - state.tokenize = null; - return "string"; - } - - // Simple syntax - if (escapes !== false && stream.match(/^\$[a-zA-Z_][a-zA-Z0-9_]*/)) { - // After the variable name there may appear array or object operator. - if (stream.match("[", false)) { - // Match array operator - state.tokenize = matchSequence([ - [["[", null]], - [[/\d[\w\.]*/, "number"], - [/\$[a-zA-Z_][a-zA-Z0-9_]*/, "variable-2"], - [/[\w\$]+/, "variable"]], - [["]", null]] - ], closing, escapes); - } - if (stream.match(/\-\>\w/, false)) { - // Match object operator - state.tokenize = matchSequence([ - [["->", null]], - [[/[\w]+/, "variable"]] - ], closing, escapes); - } - return "variable-2"; - } - - var escaped = false; - // Normal string - while (!stream.eol() && - (escaped || escapes === false || - (!stream.match("{$", false) && - !stream.match(/^(\$[a-zA-Z_][a-zA-Z0-9_]*|\$\{)/, false)))) { - if (!escaped && stream.match(closing)) { - state.tokenize = null; - state.tokStack.pop(); state.tokStack.pop(); - break; - } - escaped = stream.next() == "\\" && !escaped; - } - return "string"; - } - - var phpKeywords = "abstract and array as break case catch class clone const continue declare default " + - "do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final " + - "for foreach function global goto if implements interface instanceof namespace " + - "new or private protected public static switch throw trait try use var while xor " + - "die echo empty exit eval include include_once isset list require require_once return " + - "print unset __halt_compiler self static parent yield insteadof finally"; - var phpAtoms = "true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__"; - var phpBuiltin = "func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count"; - CodeMirror.registerHelper("hintWords", "php", [phpKeywords, phpAtoms, phpBuiltin].join(" ").split(" ")); - CodeMirror.registerHelper("wordChars", "php", /[\w$]/); - - var phpConfig = { - name: "clike", - helperType: "php", - keywords: keywords(phpKeywords), - blockKeywords: keywords("catch do else elseif for foreach if switch try while finally"), - defKeywords: keywords("class function interface namespace trait"), - atoms: keywords(phpAtoms), - builtin: keywords(phpBuiltin), - multiLineStrings: true, - hooks: { - "$": function(stream) { - stream.eatWhile(/[\w\$_]/); - return "variable-2"; - }, - "<": function(stream, state) { - var before; - if (before = stream.match(/<<\s*/)) { - var quoted = stream.eat(/['"]/); - stream.eatWhile(/[\w\.]/); - var delim = stream.current().slice(before[0].length + (quoted ? 2 : 1)); - if (quoted) stream.eat(quoted); - if (delim) { - (state.tokStack || (state.tokStack = [])).push(delim, 0); - state.tokenize = phpString(delim, quoted != "'"); - return "string"; - } - } - return false; - }, - "#": function(stream) { - while (!stream.eol() && !stream.match("?>", false)) stream.next(); - return "comment"; - }, - "/": function(stream) { - if (stream.eat("/")) { - while (!stream.eol() && !stream.match("?>", false)) stream.next(); - return "comment"; - } - return false; - }, - '"': function(_stream, state) { - (state.tokStack || (state.tokStack = [])).push('"', 0); - state.tokenize = phpString('"'); - return "string"; - }, - "{": function(_stream, state) { - if (state.tokStack && state.tokStack.length) - state.tokStack[state.tokStack.length - 1]++; - return false; - }, - "}": function(_stream, state) { - if (state.tokStack && state.tokStack.length > 0 && - !--state.tokStack[state.tokStack.length - 1]) { - state.tokenize = phpString(state.tokStack[state.tokStack.length - 2]); - } - return false; - } - } - }; - - CodeMirror.defineMode("php", function(config, parserConfig) { - var htmlMode = CodeMirror.getMode(config, "text/html"); - var phpMode = CodeMirror.getMode(config, phpConfig); - - function dispatch(stream, state) { - var isPHP = state.curMode == phpMode; - if (stream.sol() && state.pending && state.pending != '"' && state.pending != "'") state.pending = null; - if (!isPHP) { - if (stream.match(/^<\?\w*/)) { - state.curMode = phpMode; - if (!state.php) state.php = CodeMirror.startState(phpMode, htmlMode.indent(state.html, "")) - state.curState = state.php; - return "meta"; - } - if (state.pending == '"' || state.pending == "'") { - while (!stream.eol() && stream.next() != state.pending) {} - var style = "string"; - } else if (state.pending && stream.pos < state.pending.end) { - stream.pos = state.pending.end; - var style = state.pending.style; - } else { - var style = htmlMode.token(stream, state.curState); - } - if (state.pending) state.pending = null; - var cur = stream.current(), openPHP = cur.search(/<\?/), m; - if (openPHP != -1) { - if (style == "string" && (m = cur.match(/[\'\"]$/)) && !/\?>/.test(cur)) state.pending = m[0]; - else state.pending = {end: stream.pos, style: style}; - stream.backUp(cur.length - openPHP); - } - return style; - } else if (isPHP && state.php.tokenize == null && stream.match("?>")) { - state.curMode = htmlMode; - state.curState = state.html; - if (!state.php.context.prev) state.php = null; - return "meta"; - } else { - return phpMode.token(stream, state.curState); - } - } - - return { - startState: function() { - var html = CodeMirror.startState(htmlMode) - var php = parserConfig.startOpen ? CodeMirror.startState(phpMode) : null - return {html: html, - php: php, - curMode: parserConfig.startOpen ? phpMode : htmlMode, - curState: parserConfig.startOpen ? php : html, - pending: null}; - }, - - copyState: function(state) { - var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html), - php = state.php, phpNew = php && CodeMirror.copyState(phpMode, php), cur; - if (state.curMode == htmlMode) cur = htmlNew; - else cur = phpNew; - return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, - pending: state.pending}; - }, - - token: dispatch, - - indent: function(state, textAfter) { - if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) || - (state.curMode == phpMode && /^\?>/.test(textAfter))) - return htmlMode.indent(state.html, textAfter); - return state.curMode.indent(state.curState, textAfter); - }, - - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: "//", - - innerMode: function(state) { return {state: state.curState, mode: state.curMode}; } - }; - }, "htmlmixed", "clike"); - - CodeMirror.defineMIME("application/x-httpd-php", "php"); - CodeMirror.defineMIME("application/x-httpd-php-open", {name: "php", startOpen: true}); - CodeMirror.defineMIME("text/x-php", phpConfig); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/php/test.js b/public/plugins/codemirror-5.17.0/mode/php/test.js deleted file mode 100644 index e2ecefc..0000000 --- a/public/plugins/codemirror-5.17.0/mode/php/test.js +++ /dev/null @@ -1,154 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "php"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT('simple_test', - '[meta ]'); - - MT('variable_interpolation_non_alphanumeric', - '[meta $/$\\$}$\\\"$:$;$?$|$[[$]]$+$=aaa"]', - '[meta ?>]'); - - MT('variable_interpolation_digits', - '[meta ]'); - - MT('variable_interpolation_simple_syntax_1', - '[meta ]'); - - MT('variable_interpolation_simple_syntax_2', - '[meta ]'); - - MT('variable_interpolation_simple_syntax_3', - '[meta [variable aaaaa][string .aaaaaa"];', - '[keyword echo] [string "aaa][variable-2 $aaaa][string ->][variable-2 $aaaaa][string .aaaaaa"];', - '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string [[2]].aaaaaa"];', - '[keyword echo] [string "aaa][variable-2 $aaaa]->[variable aaaaa][string ->aaaa2.aaaaaa"];', - '[meta ?>]'); - - MT('variable_interpolation_escaping', - '[meta aaa.aaa"];', - '[keyword echo] [string "aaa\\$aaaa[[2]]aaa.aaa"];', - '[keyword echo] [string "aaa\\$aaaa[[asd]]aaa.aaa"];', - '[keyword echo] [string "aaa{\\$aaaa->aaa.aaa"];', - '[keyword echo] [string "aaa{\\$aaaa[[2]]aaa.aaa"];', - '[keyword echo] [string "aaa{\\aaaaa[[asd]]aaa.aaa"];', - '[keyword echo] [string "aaa\\${aaaa->aaa.aaa"];', - '[keyword echo] [string "aaa\\${aaaa[[2]]aaa.aaa"];', - '[keyword echo] [string "aaa\\${aaaa[[asd]]aaa.aaa"];', - '[meta ?>]'); - - MT('variable_interpolation_complex_syntax_1', - '[meta aaa.aaa"];', - '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa]}[string ->aaa.aaa"];', - '[keyword echo] [string "aaa][variable-2 $]{[variable-2 $aaaa][[',' [number 42]',']]}[string ->aaa.aaa"];', - '[keyword echo] [string "aaa][variable-2 $]{[variable aaaa][meta ?>]aaaaaa'); - - MT('variable_interpolation_complex_syntax_2', - '[meta } $aaaaaa.aaa"];', - '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*}?>*/][[',' [string "aaa][variable-2 $aaa][string {}][variable-2 $]{[variable aaa]}[string "]',']]}[string ->aaa.aaa"];', - '[keyword echo] [string "][variable-2 $]{[variable aaa][comment /*} } $aaa } */]}[string ->aaa.aaa"];'); - - - function build_recursive_monsters(nt, t, n){ - var monsters = [t]; - for (var i = 1; i <= n; ++i) - monsters[i] = nt.join(monsters[i - 1]); - return monsters; - } - - var m1 = build_recursive_monsters( - ['[string "][variable-2 $]{[variable aaa] [operator +] ', '}[string "]'], - '[comment /* }?>} */] [string "aaa][variable-2 $aaa][string .aaa"]', - 10 - ); - - MT('variable_interpolation_complex_syntax_3_1', - '[meta ]'); - - var m2 = build_recursive_monsters( - ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', '}[string .a"]'], - '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', - 5 - ); - - MT('variable_interpolation_complex_syntax_3_2', - '[meta ]'); - - function build_recursive_monsters_2(mf1, mf2, nt, t, n){ - var monsters = [t]; - for (var i = 1; i <= n; ++i) - monsters[i] = nt[0] + mf1[i - 1] + nt[1] + mf2[i - 1] + nt[2] + monsters[i - 1] + nt[3]; - return monsters; - } - - var m3 = build_recursive_monsters_2( - m1, - m2, - ['[string "a][variable-2 $]{[variable aaa] [operator +] ', ' [operator +] ', ' [operator +] ', '}[string .a"]'], - '[comment /* }?>{{ */] [string "a?>}{{aa][variable-2 $aaa][string .a}a?>a"]', - 4 - ); - - MT('variable_interpolation_complex_syntax_3_3', - '[meta ]'); - - MT("variable_interpolation_heredoc", - "[meta -CodeMirror: Pig Latin mode - - - - - - - - - -
-

Pig Latin mode

-
- - - -

- Simple mode that handles Pig Latin language. -

- -

MIME type defined: text/x-pig - (PIG code) -

diff --git a/public/plugins/codemirror-5.17.0/mode/pig/pig.js b/public/plugins/codemirror-5.17.0/mode/pig/pig.js deleted file mode 100644 index 5b56727..0000000 --- a/public/plugins/codemirror-5.17.0/mode/pig/pig.js +++ /dev/null @@ -1,178 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/* - * Pig Latin Mode for CodeMirror 2 - * @author Prasanth Jayachandran - * @link https://github.com/prasanthj/pig-codemirror-2 - * This implementation is adapted from PL/SQL mode in CodeMirror 2. - */ -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("pig", function(_config, parserConfig) { - var keywords = parserConfig.keywords, - builtins = parserConfig.builtins, - types = parserConfig.types, - multiLineStrings = parserConfig.multiLineStrings; - - var isOperatorChar = /[*+\-%<>=&?:\/!|]/; - - function chain(stream, state, f) { - state.tokenize = f; - return f(stream, state); - } - - function tokenComment(stream, state) { - var isEnd = false; - var ch; - while(ch = stream.next()) { - if(ch == "/" && isEnd) { - state.tokenize = tokenBase; - break; - } - isEnd = (ch == "*"); - } - return "comment"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while((next = stream.next()) != null) { - if (next == quote && !escaped) { - end = true; break; - } - escaped = !escaped && next == "\\"; - } - if (end || !(escaped || multiLineStrings)) - state.tokenize = tokenBase; - return "error"; - }; - } - - - function tokenBase(stream, state) { - var ch = stream.next(); - - // is a start of string? - if (ch == '"' || ch == "'") - return chain(stream, state, tokenString(ch)); - // is it one of the special chars - else if(/[\[\]{}\(\),;\.]/.test(ch)) - return null; - // is it a number? - else if(/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } - // multi line comment or operator - else if (ch == "/") { - if (stream.eat("*")) { - return chain(stream, state, tokenComment); - } - else { - stream.eatWhile(isOperatorChar); - return "operator"; - } - } - // single line comment or operator - else if (ch=="-") { - if(stream.eat("-")){ - stream.skipToEnd(); - return "comment"; - } - else { - stream.eatWhile(isOperatorChar); - return "operator"; - } - } - // is it an operator - else if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - else { - // get the while word - stream.eatWhile(/[\w\$_]/); - // is it one of the listed keywords? - if (keywords && keywords.propertyIsEnumerable(stream.current().toUpperCase())) { - //keywords can be used as variables like flatten(group), group.$0 etc.. - if (!stream.eat(")") && !stream.eat(".")) - return "keyword"; - } - // is it one of the builtin functions? - if (builtins && builtins.propertyIsEnumerable(stream.current().toUpperCase())) - return "variable-2"; - // is it one of the listed types? - if (types && types.propertyIsEnumerable(stream.current().toUpperCase())) - return "variable-3"; - // default is a 'variable' - return "variable"; - } - } - - // Interface - return { - startState: function() { - return { - tokenize: tokenBase, - startOfLine: true - }; - }, - - token: function(stream, state) { - if(stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - return style; - } - }; -}); - -(function() { - function keywords(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - // builtin funcs taken from trunk revision 1303237 - var pBuiltins = "ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL " - + "CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS " - + "DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG " - + "FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN " - + "INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER " - + "ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS " - + "LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA " - + "PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE " - + "SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG " - + "TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER "; - - // taken from QueryLexer.g - var pKeywords = "VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP " - + "JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL " - + "PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE " - + "SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE " - + "NEQ MATCHES TRUE FALSE DUMP"; - - // data types - var pTypes = "BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP "; - - CodeMirror.defineMIME("text/x-pig", { - name: "pig", - builtins: keywords(pBuiltins), - keywords: keywords(pKeywords), - types: keywords(pTypes) - }); - - CodeMirror.registerHelper("hintWords", "pig", (pBuiltins + pTypes + pKeywords).split(" ")); -}()); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/powershell/index.html b/public/plugins/codemirror-5.17.0/mode/powershell/index.html deleted file mode 100644 index 6b235df..0000000 --- a/public/plugins/codemirror-5.17.0/mode/powershell/index.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - CodeMirror: Powershell mode - - - - - - - - -
-

PowerShell mode

- -
- - -

MIME types defined: application/x-powershell.

-
- - diff --git a/public/plugins/codemirror-5.17.0/mode/powershell/powershell.js b/public/plugins/codemirror-5.17.0/mode/powershell/powershell.js deleted file mode 100644 index c443e72..0000000 --- a/public/plugins/codemirror-5.17.0/mode/powershell/powershell.js +++ /dev/null @@ -1,396 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - 'use strict'; - if (typeof exports == 'object' && typeof module == 'object') // CommonJS - mod(require('codemirror')); - else if (typeof define == 'function' && define.amd) // AMD - define(['codemirror'], mod); - else // Plain browser env - mod(window.CodeMirror); -})(function(CodeMirror) { -'use strict'; - -CodeMirror.defineMode('powershell', function() { - function buildRegexp(patterns, options) { - options = options || {}; - var prefix = options.prefix !== undefined ? options.prefix : '^'; - var suffix = options.suffix !== undefined ? options.suffix : '\\b'; - - for (var i = 0; i < patterns.length; i++) { - if (patterns[i] instanceof RegExp) { - patterns[i] = patterns[i].source; - } - else { - patterns[i] = patterns[i].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); - } - } - - return new RegExp(prefix + '(' + patterns.join('|') + ')' + suffix, 'i'); - } - - var notCharacterOrDash = '(?=[^A-Za-z\\d\\-_]|$)'; - var varNames = /[\w\-:]/ - var keywords = buildRegexp([ - /begin|break|catch|continue|data|default|do|dynamicparam/, - /else|elseif|end|exit|filter|finally|for|foreach|from|function|if|in/, - /param|process|return|switch|throw|trap|try|until|where|while/ - ], { suffix: notCharacterOrDash }); - - var punctuation = /[\[\]{},;`\.]|@[({]/; - var wordOperators = buildRegexp([ - 'f', - /b?not/, - /[ic]?split/, 'join', - /is(not)?/, 'as', - /[ic]?(eq|ne|[gl][te])/, - /[ic]?(not)?(like|match|contains)/, - /[ic]?replace/, - /b?(and|or|xor)/ - ], { prefix: '-' }); - var symbolOperators = /[+\-*\/%]=|\+\+|--|\.\.|[+\-*&^%:=!|\/]|<(?!#)|(?!#)>/; - var operators = buildRegexp([wordOperators, symbolOperators], { suffix: '' }); - - var numbers = /^((0x[\da-f]+)|((\d+\.\d+|\d\.|\.\d+|\d+)(e[\+\-]?\d+)?))[ld]?([kmgtp]b)?/i; - - var identifiers = /^[A-Za-z\_][A-Za-z\-\_\d]*\b/; - - var symbolBuiltins = /[A-Z]:|%|\?/i; - var namedBuiltins = buildRegexp([ - /Add-(Computer|Content|History|Member|PSSnapin|Type)/, - /Checkpoint-Computer/, - /Clear-(Content|EventLog|History|Host|Item(Property)?|Variable)/, - /Compare-Object/, - /Complete-Transaction/, - /Connect-PSSession/, - /ConvertFrom-(Csv|Json|SecureString|StringData)/, - /Convert-Path/, - /ConvertTo-(Csv|Html|Json|SecureString|Xml)/, - /Copy-Item(Property)?/, - /Debug-Process/, - /Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/, - /Disconnect-PSSession/, - /Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/, - /(Enter|Exit)-PSSession/, - /Export-(Alias|Clixml|Console|Counter|Csv|FormatData|ModuleMember|PSSession)/, - /ForEach-Object/, - /Format-(Custom|List|Table|Wide)/, - new RegExp('Get-(Acl|Alias|AuthenticodeSignature|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Counter|Credential' - + '|Culture|Date|Event|EventLog|EventSubscriber|ExecutionPolicy|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job' - + '|Location|Member|Module|PfxCertificate|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration' - + '|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|Verb|WinEvent|WmiObject)'), - /Group-Object/, - /Import-(Alias|Clixml|Counter|Csv|LocalizedData|Module|PSSession)/, - /ImportSystemModules/, - /Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)/, - /Join-Path/, - /Limit-EventLog/, - /Measure-(Command|Object)/, - /Move-Item(Property)?/, - new RegExp('New-(Alias|Event|EventLog|Item(Property)?|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile' - + '|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy|WinEvent)'), - /Out-(Default|File|GridView|Host|Null|Printer|String)/, - /Pause/, - /(Pop|Push)-Location/, - /Read-Host/, - /Receive-(Job|PSSession)/, - /Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)/, - /Remove-(Computer|Event|EventLog|Item(Property)?|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)/, - /Rename-(Computer|Item(Property)?)/, - /Reset-ComputerMachinePassword/, - /Resolve-Path/, - /Restart-(Computer|Service)/, - /Restore-Computer/, - /Resume-(Job|Service)/, - /Save-Help/, - /Select-(Object|String|Xml)/, - /Send-MailMessage/, - new RegExp('Set-(Acl|Alias|AuthenticodeSignature|Content|Date|ExecutionPolicy|Item(Property)?|Location|PSBreakpoint|PSDebug' + - '|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)'), - /Show-(Command|ControlPanelItem|EventLog)/, - /Sort-Object/, - /Split-Path/, - /Start-(Job|Process|Service|Sleep|Transaction|Transcript)/, - /Stop-(Computer|Job|Process|Service|Transcript)/, - /Suspend-(Job|Service)/, - /TabExpansion2/, - /Tee-Object/, - /Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)/, - /Trace-Command/, - /Unblock-File/, - /Undo-Transaction/, - /Unregister-(Event|PSSessionConfiguration)/, - /Update-(FormatData|Help|List|TypeData)/, - /Use-Transaction/, - /Wait-(Event|Job|Process)/, - /Where-Object/, - /Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning)/, - /cd|help|mkdir|more|oss|prompt/, - /ac|asnp|cat|cd|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|dnsn|ebp/, - /echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps/, - /group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md/, - /measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri/, - /rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls/, - /sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|where|wjb|write/ - ], { prefix: '', suffix: '' }); - var variableBuiltins = buildRegexp([ - /[$?^_]|Args|ConfirmPreference|ConsoleFileName|DebugPreference|Error|ErrorActionPreference|ErrorView|ExecutionContext/, - /FormatEnumerationLimit|Home|Host|Input|MaximumAliasCount|MaximumDriveCount|MaximumErrorCount|MaximumFunctionCount/, - /MaximumHistoryCount|MaximumVariableCount|MyInvocation|NestedPromptLevel|OutputEncoding|Pid|Profile|ProgressPreference/, - /PSBoundParameters|PSCommandPath|PSCulture|PSDefaultParameterValues|PSEmailServer|PSHome|PSScriptRoot|PSSessionApplicationName/, - /PSSessionConfigurationName|PSSessionOption|PSUICulture|PSVersionTable|Pwd|ShellId|StackTrace|VerbosePreference/, - /WarningPreference|WhatIfPreference/, - - /Event|EventArgs|EventSubscriber|Sender/, - /Matches|Ofs|ForEach|LastExitCode|PSCmdlet|PSItem|PSSenderInfo|This/, - /true|false|null/ - ], { prefix: '\\$', suffix: '' }); - - var builtins = buildRegexp([symbolBuiltins, namedBuiltins, variableBuiltins], { suffix: notCharacterOrDash }); - - var grammar = { - keyword: keywords, - number: numbers, - operator: operators, - builtin: builtins, - punctuation: punctuation, - identifier: identifiers - }; - - // tokenizers - function tokenBase(stream, state) { - // Handle Comments - //var ch = stream.peek(); - - var parent = state.returnStack[state.returnStack.length - 1]; - if (parent && parent.shouldReturnFrom(state)) { - state.tokenize = parent.tokenize; - state.returnStack.pop(); - return state.tokenize(stream, state); - } - - if (stream.eatSpace()) { - return null; - } - - if (stream.eat('(')) { - state.bracketNesting += 1; - return 'punctuation'; - } - - if (stream.eat(')')) { - state.bracketNesting -= 1; - return 'punctuation'; - } - - for (var key in grammar) { - if (stream.match(grammar[key])) { - return key; - } - } - - var ch = stream.next(); - - // single-quote string - if (ch === "'") { - return tokenSingleQuoteString(stream, state); - } - - if (ch === '$') { - return tokenVariable(stream, state); - } - - // double-quote string - if (ch === '"') { - return tokenDoubleQuoteString(stream, state); - } - - if (ch === '<' && stream.eat('#')) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - - if (ch === '#') { - stream.skipToEnd(); - return 'comment'; - } - - if (ch === '@') { - var quoteMatch = stream.eat(/["']/); - if (quoteMatch && stream.eol()) { - state.tokenize = tokenMultiString; - state.startQuote = quoteMatch[0]; - return tokenMultiString(stream, state); - } else if (stream.peek().match(/[({]/)) { - return 'punctuation'; - } else if (stream.peek().match(varNames)) { - // splatted variable - return tokenVariable(stream, state); - } - } - return 'error'; - } - - function tokenSingleQuoteString(stream, state) { - var ch; - while ((ch = stream.peek()) != null) { - stream.next(); - - if (ch === "'" && !stream.eat("'")) { - state.tokenize = tokenBase; - return 'string'; - } - } - - return 'error'; - } - - function tokenDoubleQuoteString(stream, state) { - var ch; - while ((ch = stream.peek()) != null) { - if (ch === '$') { - state.tokenize = tokenStringInterpolation; - return 'string'; - } - - stream.next(); - if (ch === '`') { - stream.next(); - continue; - } - - if (ch === '"' && !stream.eat('"')) { - state.tokenize = tokenBase; - return 'string'; - } - } - - return 'error'; - } - - function tokenStringInterpolation(stream, state) { - return tokenInterpolation(stream, state, tokenDoubleQuoteString); - } - - function tokenMultiStringReturn(stream, state) { - state.tokenize = tokenMultiString; - state.startQuote = '"' - return tokenMultiString(stream, state); - } - - function tokenHereStringInterpolation(stream, state) { - return tokenInterpolation(stream, state, tokenMultiStringReturn); - } - - function tokenInterpolation(stream, state, parentTokenize) { - if (stream.match('$(')) { - var savedBracketNesting = state.bracketNesting; - state.returnStack.push({ - /*jshint loopfunc:true */ - shouldReturnFrom: function(state) { - return state.bracketNesting === savedBracketNesting; - }, - tokenize: parentTokenize - }); - state.tokenize = tokenBase; - state.bracketNesting += 1; - return 'punctuation'; - } else { - stream.next(); - state.returnStack.push({ - shouldReturnFrom: function() { return true; }, - tokenize: parentTokenize - }); - state.tokenize = tokenVariable; - return state.tokenize(stream, state); - } - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while ((ch = stream.next()) != null) { - if (maybeEnd && ch == '>') { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch === '#'); - } - return 'comment'; - } - - function tokenVariable(stream, state) { - var ch = stream.peek(); - if (stream.eat('{')) { - state.tokenize = tokenVariableWithBraces; - return tokenVariableWithBraces(stream, state); - } else if (ch != undefined && ch.match(varNames)) { - stream.eatWhile(varNames); - state.tokenize = tokenBase; - return 'variable-2'; - } else { - state.tokenize = tokenBase; - return 'error'; - } - } - - function tokenVariableWithBraces(stream, state) { - var ch; - while ((ch = stream.next()) != null) { - if (ch === '}') { - state.tokenize = tokenBase; - break; - } - } - return 'variable-2'; - } - - function tokenMultiString(stream, state) { - var quote = state.startQuote; - if (stream.sol() && stream.match(new RegExp(quote + '@'))) { - state.tokenize = tokenBase; - } - else if (quote === '"') { - while (!stream.eol()) { - var ch = stream.peek(); - if (ch === '$') { - state.tokenize = tokenHereStringInterpolation; - return 'string'; - } - - stream.next(); - if (ch === '`') { - stream.next(); - } - } - } - else { - stream.skipToEnd(); - } - - return 'string'; - } - - var external = { - startState: function() { - return { - returnStack: [], - bracketNesting: 0, - tokenize: tokenBase - }; - }, - - token: function(stream, state) { - return state.tokenize(stream, state); - }, - - blockCommentStart: '<#', - blockCommentEnd: '#>', - lineComment: '#', - fold: 'brace' - }; - return external; -}); - -CodeMirror.defineMIME('application/x-powershell', 'powershell'); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/powershell/test.js b/public/plugins/codemirror-5.17.0/mode/powershell/test.js deleted file mode 100644 index 59b8e6f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/powershell/test.js +++ /dev/null @@ -1,72 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "powershell"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT('comment', '[number 1][comment # A]'); - MT('comment_multiline', '[number 1][comment <#]', - '[comment ABC]', - '[comment #>][number 2]'); - - [ - '0', '1234', - '12kb', '12mb', '12Gb', '12Tb', '12PB', '12L', '12D', '12lkb', '12dtb', - '1.234', '1.234e56', '1.', '1.e2', '.2', '.2e34', - '1.2MB', '1.kb', '.1dTB', '1.e1gb', '.2', '.2e34', - '0x1', '0xabcdef', '0x3tb', '0xelmb' - ].forEach(function(number) { - MT("number_" + number, "[number " + number + "]"); - }); - - MT('string_literal_escaping', "[string 'a''']"); - MT('string_literal_variable', "[string 'a $x']"); - MT('string_escaping_1', '[string "a `""]'); - MT('string_escaping_2', '[string "a """]'); - MT('string_variable_escaping', '[string "a `$x"]'); - MT('string_variable', '[string "a ][variable-2 $x][string b"]'); - MT('string_variable_spaces', '[string "a ][variable-2 ${x y}][string b"]'); - MT('string_expression', '[string "a ][punctuation $(][variable-2 $x][operator +][number 3][punctuation )][string b"]'); - MT('string_expression_nested', '[string "A][punctuation $(][string "a][punctuation $(][string "w"][punctuation )][string b"][punctuation )][string B"]'); - - MT('string_heredoc', '[string @"]', - '[string abc]', - '[string "@]'); - MT('string_heredoc_quotes', '[string @"]', - '[string abc "\']', - '[string "@]'); - MT('string_heredoc_variable', '[string @"]', - '[string a ][variable-2 $x][string b]', - '[string "@]'); - MT('string_heredoc_nested_string', '[string @"]', - '[string a][punctuation $(][string "w"][punctuation )][string b]', - '[string "@]'); - MT('string_heredoc_literal_quotes', "[string @']", - '[string abc "\']', - "[string '@]"); - - MT('array', "[punctuation @(][string 'a'][punctuation ,][string 'b'][punctuation )]"); - MT('hash', "[punctuation @{][string 'key'][operator :][string 'value'][punctuation }]"); - - MT('variable', "[variable-2 $test]"); - MT('variable_global', "[variable-2 $global:test]"); - MT('variable_spaces', "[variable-2 ${test test}]"); - MT('operator_splat', "[variable-2 @x]"); - MT('variable_builtin', "[builtin $ErrorActionPreference]"); - MT('variable_builtin_symbols', "[builtin $$]"); - - MT('operator', "[operator +]"); - MT('operator_unary', "[operator +][number 3]"); - MT('operator_long', "[operator -match]"); - - [ - '(', ')', '[[', ']]', '{', '}', ',', '`', ';', '.' - ].forEach(function(punctuation) { - MT("punctuation_" + punctuation.replace(/^[\[\]]/,''), "[punctuation " + punctuation + "]"); - }); - - MT('keyword', "[keyword if]"); - - MT('call_builtin', "[builtin Get-ChildItem]"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/properties/index.html b/public/plugins/codemirror-5.17.0/mode/properties/index.html deleted file mode 100644 index f885302..0000000 --- a/public/plugins/codemirror-5.17.0/mode/properties/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - -CodeMirror: Properties files mode - - - - - - - - - -
-

Properties files mode

-
- - -

MIME types defined: text/x-properties, - text/x-ini.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/properties/properties.js b/public/plugins/codemirror-5.17.0/mode/properties/properties.js deleted file mode 100644 index ef8bf37..0000000 --- a/public/plugins/codemirror-5.17.0/mode/properties/properties.js +++ /dev/null @@ -1,78 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("properties", function() { - return { - token: function(stream, state) { - var sol = stream.sol() || state.afterSection; - var eol = stream.eol(); - - state.afterSection = false; - - if (sol) { - if (state.nextMultiline) { - state.inMultiline = true; - state.nextMultiline = false; - } else { - state.position = "def"; - } - } - - if (eol && ! state.nextMultiline) { - state.inMultiline = false; - state.position = "def"; - } - - if (sol) { - while(stream.eatSpace()) {} - } - - var ch = stream.next(); - - if (sol && (ch === "#" || ch === "!" || ch === ";")) { - state.position = "comment"; - stream.skipToEnd(); - return "comment"; - } else if (sol && ch === "[") { - state.afterSection = true; - stream.skipTo("]"); stream.eat("]"); - return "header"; - } else if (ch === "=" || ch === ":") { - state.position = "quote"; - return null; - } else if (ch === "\\" && state.position === "quote") { - if (stream.eol()) { // end of line? - // Multiline value - state.nextMultiline = true; - } - } - - return state.position; - }, - - startState: function() { - return { - position : "def", // Current position, "def", "quote" or "comment" - nextMultiline : false, // Is the next line multiline value - inMultiline : false, // Is the current line a multiline value - afterSection : false // Did we just open a section - }; - } - - }; -}); - -CodeMirror.defineMIME("text/x-properties", "properties"); -CodeMirror.defineMIME("text/x-ini", "properties"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/protobuf/index.html b/public/plugins/codemirror-5.17.0/mode/protobuf/index.html deleted file mode 100644 index cfe7b9d..0000000 --- a/public/plugins/codemirror-5.17.0/mode/protobuf/index.html +++ /dev/null @@ -1,64 +0,0 @@ - - -CodeMirror: ProtoBuf mode - - - - - - - - - -
-

ProtoBuf mode

-
- - -

MIME types defined: text/x-protobuf.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/protobuf/protobuf.js b/public/plugins/codemirror-5.17.0/mode/protobuf/protobuf.js deleted file mode 100644 index bcae276..0000000 --- a/public/plugins/codemirror-5.17.0/mode/protobuf/protobuf.js +++ /dev/null @@ -1,68 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - function wordRegexp(words) { - return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); - }; - - var keywordArray = [ - "package", "message", "import", "syntax", - "required", "optional", "repeated", "reserved", "default", "extensions", "packed", - "bool", "bytes", "double", "enum", "float", "string", - "int32", "int64", "uint32", "uint64", "sint32", "sint64", "fixed32", "fixed64", "sfixed32", "sfixed64" - ]; - var keywords = wordRegexp(keywordArray); - - CodeMirror.registerHelper("hintWords", "protobuf", keywordArray); - - var identifiers = new RegExp("^[_A-Za-z\xa1-\uffff][_A-Za-z0-9\xa1-\uffff]*"); - - function tokenBase(stream) { - // whitespaces - if (stream.eatSpace()) return null; - - // Handle one line Comments - if (stream.match("//")) { - stream.skipToEnd(); - return "comment"; - } - - // Handle Number Literals - if (stream.match(/^[0-9\.+-]/, false)) { - if (stream.match(/^[+-]?0x[0-9a-fA-F]+/)) - return "number"; - if (stream.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)) - return "number"; - if (stream.match(/^[+-]?\d+([EeDd][+-]?\d+)?/)) - return "number"; - } - - // Handle Strings - if (stream.match(/^"([^"]|(""))*"/)) { return "string"; } - if (stream.match(/^'([^']|(''))*'/)) { return "string"; } - - // Handle words - if (stream.match(keywords)) { return "keyword"; } - if (stream.match(identifiers)) { return "variable"; } ; - - // Handle non-detected items - stream.next(); - return null; - }; - - CodeMirror.defineMode("protobuf", function() { - return {token: tokenBase}; - }); - - CodeMirror.defineMIME("text/x-protobuf", "protobuf"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/puppet/index.html b/public/plugins/codemirror-5.17.0/mode/puppet/index.html deleted file mode 100644 index 5614c36..0000000 --- a/public/plugins/codemirror-5.17.0/mode/puppet/index.html +++ /dev/null @@ -1,121 +0,0 @@ - - -CodeMirror: Puppet mode - - - - - - - - - - -
-

Puppet mode

-
- - -

MIME types defined: text/x-puppet.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/puppet/puppet.js b/public/plugins/codemirror-5.17.0/mode/puppet/puppet.js deleted file mode 100644 index 5704130..0000000 --- a/public/plugins/codemirror-5.17.0/mode/puppet/puppet.js +++ /dev/null @@ -1,220 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("puppet", function () { - // Stores the words from the define method - var words = {}; - // Taken, mostly, from the Puppet official variable standards regex - var variable_regex = /({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/; - - // Takes a string of words separated by spaces and adds them as - // keys with the value of the first argument 'style' - function define(style, string) { - var split = string.split(' '); - for (var i = 0; i < split.length; i++) { - words[split[i]] = style; - } - } - - // Takes commonly known puppet types/words and classifies them to a style - define('keyword', 'class define site node include import inherits'); - define('keyword', 'case if else in and elsif default or'); - define('atom', 'false true running present absent file directory undef'); - define('builtin', 'action augeas burst chain computer cron destination dport exec ' + - 'file filebucket group host icmp iniface interface jump k5login limit log_level ' + - 'log_prefix macauthorization mailalias maillist mcx mount nagios_command ' + - 'nagios_contact nagios_contactgroup nagios_host nagios_hostdependency ' + - 'nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service ' + - 'nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo ' + - 'nagios_servicegroup nagios_timeperiod name notify outiface package proto reject ' + - 'resources router schedule scheduled_task selboolean selmodule service source ' + - 'sport ssh_authorized_key sshkey stage state table tidy todest toports tosource ' + - 'user vlan yumrepo zfs zone zpool'); - - // After finding a start of a string ('|") this function attempts to find the end; - // If a variable is encountered along the way, we display it differently when it - // is encapsulated in a double-quoted string. - function tokenString(stream, state) { - var current, prev, found_var = false; - while (!stream.eol() && (current = stream.next()) != state.pending) { - if (current === '$' && prev != '\\' && state.pending == '"') { - found_var = true; - break; - } - prev = current; - } - if (found_var) { - stream.backUp(1); - } - if (current == state.pending) { - state.continueString = false; - } else { - state.continueString = true; - } - return "string"; - } - - // Main function - function tokenize(stream, state) { - // Matches one whole word - var word = stream.match(/[\w]+/, false); - // Matches attributes (i.e. ensure => present ; 'ensure' would be matched) - var attribute = stream.match(/(\s+)?\w+\s+=>.*/, false); - // Matches non-builtin resource declarations - // (i.e. "apache::vhost {" or "mycustomclasss {" would be matched) - var resource = stream.match(/(\s+)?[\w:_]+(\s+)?{/, false); - // Matches virtual and exported resources (i.e. @@user { ; and the like) - var special_resource = stream.match(/(\s+)?[@]{1,2}[\w:_]+(\s+)?{/, false); - - // Finally advance the stream - var ch = stream.next(); - - // Have we found a variable? - if (ch === '$') { - if (stream.match(variable_regex)) { - // If so, and its in a string, assign it a different color - return state.continueString ? 'variable-2' : 'variable'; - } - // Otherwise return an invalid variable - return "error"; - } - // Should we still be looking for the end of a string? - if (state.continueString) { - // If so, go through the loop again - stream.backUp(1); - return tokenString(stream, state); - } - // Are we in a definition (class, node, define)? - if (state.inDefinition) { - // If so, return def (i.e. for 'class myclass {' ; 'myclass' would be matched) - if (stream.match(/(\s+)?[\w:_]+(\s+)?/)) { - return 'def'; - } - // Match the rest it the next time around - stream.match(/\s+{/); - state.inDefinition = false; - } - // Are we in an 'include' statement? - if (state.inInclude) { - // Match and return the included class - stream.match(/(\s+)?\S+(\s+)?/); - state.inInclude = false; - return 'def'; - } - // Do we just have a function on our hands? - // In 'ensure_resource("myclass")', 'ensure_resource' is matched - if (stream.match(/(\s+)?\w+\(/)) { - stream.backUp(1); - return 'def'; - } - // Have we matched the prior attribute regex? - if (attribute) { - stream.match(/(\s+)?\w+/); - return 'tag'; - } - // Do we have Puppet specific words? - if (word && words.hasOwnProperty(word)) { - // Negates the initial next() - stream.backUp(1); - // rs move the stream - stream.match(/[\w]+/); - // We want to process these words differently - // do to the importance they have in Puppet - if (stream.match(/\s+\S+\s+{/, false)) { - state.inDefinition = true; - } - if (word == 'include') { - state.inInclude = true; - } - // Returns their value as state in the prior define methods - return words[word]; - } - // Is there a match on a reference? - if (/(^|\s+)[A-Z][\w:_]+/.test(word)) { - // Negate the next() - stream.backUp(1); - // Match the full reference - stream.match(/(^|\s+)[A-Z][\w:_]+/); - return 'def'; - } - // Have we matched the prior resource regex? - if (resource) { - stream.match(/(\s+)?[\w:_]+/); - return 'def'; - } - // Have we matched the prior special_resource regex? - if (special_resource) { - stream.match(/(\s+)?[@]{1,2}/); - return 'special'; - } - // Match all the comments. All of them. - if (ch == "#") { - stream.skipToEnd(); - return "comment"; - } - // Have we found a string? - if (ch == "'" || ch == '"') { - // Store the type (single or double) - state.pending = ch; - // Perform the looping function to find the end - return tokenString(stream, state); - } - // Match all the brackets - if (ch == '{' || ch == '}') { - return 'bracket'; - } - // Match characters that we are going to assume - // are trying to be regex - if (ch == '/') { - stream.match(/.*?\//); - return 'variable-3'; - } - // Match all the numbers - if (ch.match(/[0-9]/)) { - stream.eatWhile(/[0-9]+/); - return 'number'; - } - // Match the '=' and '=>' operators - if (ch == '=') { - if (stream.peek() == '>') { - stream.next(); - } - return "operator"; - } - // Keep advancing through all the rest - stream.eatWhile(/[\w-]/); - // Return a blank line for everything else - return null; - } - // Start it all - return { - startState: function () { - var state = {}; - state.inDefinition = false; - state.inInclude = false; - state.continueString = false; - state.pending = false; - return state; - }, - token: function (stream, state) { - // Strip the spaces, but regex will account for them eitherway - if (stream.eatSpace()) return null; - // Go through the main process - return tokenize(stream, state); - } - }; -}); - -CodeMirror.defineMIME("text/x-puppet", "puppet"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/python/index.html b/public/plugins/codemirror-5.17.0/mode/python/index.html deleted file mode 100644 index 6116a13..0000000 --- a/public/plugins/codemirror-5.17.0/mode/python/index.html +++ /dev/null @@ -1,198 +0,0 @@ - - -CodeMirror: Python mode - - - - - - - - - - -
-

Python mode

- -
- - -

Cython mode

- -
- - -

Configuration Options for Python mode:

-
    -
  • version - 2/3 - The version of Python to recognize. Default is 2.
  • -
  • singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.
  • -
  • hangingIndent - int - If you want to write long arguments to a function starting on a new line, how much that line should be indented. Defaults to one normal indentation unit.
  • -
-

Advanced Configuration Options:

-

Usefull for superset of python syntax like Enthought enaml, IPython magics and questionmark help

-
    -
  • singleOperators - RegEx - Regular Expression for single operator matching, default :
    ^[\\+\\-\\*/%&|\\^~<>!]
    including
    @
    on Python 3
  • -
  • singleDelimiters - RegEx - Regular Expression for single delimiter matching, default :
    ^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]
  • -
  • doubleOperators - RegEx - Regular Expression for double operators matching, default :
    ^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))
  • -
  • doubleDelimiters - RegEx - Regular Expression for double delimiters matching, default :
    ^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))
  • -
  • tripleDelimiters - RegEx - Regular Expression for triple delimiters matching, default :
    ^((//=)|(>>=)|(<<=)|(\\*\\*=))
  • -
  • identifiers - RegEx - Regular Expression for identifier, default :
    ^[_A-Za-z][_A-Za-z0-9]*
    on Python 2 and
    ^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*
    on Python 3.
  • -
  • extra_keywords - list of string - List of extra words ton consider as keywords
  • -
  • extra_builtins - list of string - List of extra words ton consider as builtins
  • -
- - -

MIME types defined: text/x-python and text/x-cython.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/python/python.js b/public/plugins/codemirror-5.17.0/mode/python/python.js deleted file mode 100644 index be65ad7..0000000 --- a/public/plugins/codemirror-5.17.0/mode/python/python.js +++ /dev/null @@ -1,340 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - function wordRegexp(words) { - return new RegExp("^((" + words.join(")|(") + "))\\b"); - } - - var wordOperators = wordRegexp(["and", "or", "not", "is"]); - var commonKeywords = ["as", "assert", "break", "class", "continue", - "def", "del", "elif", "else", "except", "finally", - "for", "from", "global", "if", "import", - "lambda", "pass", "raise", "return", - "try", "while", "with", "yield", "in"]; - var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", - "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", - "enumerate", "eval", "filter", "float", "format", "frozenset", - "getattr", "globals", "hasattr", "hash", "help", "hex", "id", - "input", "int", "isinstance", "issubclass", "iter", "len", - "list", "locals", "map", "max", "memoryview", "min", "next", - "object", "oct", "open", "ord", "pow", "property", "range", - "repr", "reversed", "round", "set", "setattr", "slice", - "sorted", "staticmethod", "str", "sum", "super", "tuple", - "type", "vars", "zip", "__import__", "NotImplemented", - "Ellipsis", "__debug__"]; - CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins)); - - function top(state) { - return state.scopes[state.scopes.length - 1]; - } - - CodeMirror.defineMode("python", function(conf, parserConf) { - var ERRORCLASS = "error"; - - var singleDelimiters = parserConf.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.]/; - var doubleOperators = parserConf.doubleOperators || /^([!<>]==|<>|<<|>>|\/\/|\*\*)/; - var doubleDelimiters = parserConf.doubleDelimiters || /^(\+=|\-=|\*=|%=|\/=|&=|\|=|\^=)/; - var tripleDelimiters = parserConf.tripleDelimiters || /^(\/\/=|>>=|<<=|\*\*=)/; - - var hangingIndent = parserConf.hangingIndent || conf.indentUnit; - - var myKeywords = commonKeywords, myBuiltins = commonBuiltins; - if (parserConf.extra_keywords != undefined) - myKeywords = myKeywords.concat(parserConf.extra_keywords); - - if (parserConf.extra_builtins != undefined) - myBuiltins = myBuiltins.concat(parserConf.extra_builtins); - - var py3 = parserConf.version && parseInt(parserConf.version, 10) == 3 - if (py3) { - // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator - var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!@]/; - var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/; - myKeywords = myKeywords.concat(["nonlocal", "False", "True", "None", "async", "await"]); - myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]); - var stringPrefixes = new RegExp("^(([rbuf]|(br))?('{3}|\"{3}|['\"]))", "i"); - } else { - var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!]/; - var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/; - myKeywords = myKeywords.concat(["exec", "print"]); - myBuiltins = myBuiltins.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile", - "file", "intern", "long", "raw_input", "reduce", "reload", - "unichr", "unicode", "xrange", "False", "True", "None"]); - var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i"); - } - var keywords = wordRegexp(myKeywords); - var builtins = wordRegexp(myBuiltins); - - // tokenizers - function tokenBase(stream, state) { - if (stream.sol()) state.indent = stream.indentation() - // Handle scope changes - if (stream.sol() && top(state).type == "py") { - var scopeOffset = top(state).offset; - if (stream.eatSpace()) { - var lineOffset = stream.indentation(); - if (lineOffset > scopeOffset) - pushPyScope(state); - else if (lineOffset < scopeOffset && dedent(stream, state)) - state.errorToken = true; - return null; - } else { - var style = tokenBaseInner(stream, state); - if (scopeOffset > 0 && dedent(stream, state)) - style += " " + ERRORCLASS; - return style; - } - } - return tokenBaseInner(stream, state); - } - - function tokenBaseInner(stream, state) { - if (stream.eatSpace()) return null; - - var ch = stream.peek(); - - // Handle Comments - if (ch == "#") { - stream.skipToEnd(); - return "comment"; - } - - // Handle Number Literals - if (stream.match(/^[0-9\.]/, false)) { - var floatLiteral = false; - // Floats - if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } - if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } - if (stream.match(/^\.\d+/)) { floatLiteral = true; } - if (floatLiteral) { - // Float literals may be "imaginary" - stream.eat(/J/i); - return "number"; - } - // Integers - var intLiteral = false; - // Hex - if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true; - // Binary - if (stream.match(/^0b[01]+/i)) intLiteral = true; - // Octal - if (stream.match(/^0o[0-7]+/i)) intLiteral = true; - // Decimal - if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { - // Decimal literals may be "imaginary" - stream.eat(/J/i); - // TODO - Can you have imaginary longs? - intLiteral = true; - } - // Zero by itself with no other piece of number. - if (stream.match(/^0(?![\dx])/i)) intLiteral = true; - if (intLiteral) { - // Integer literals may be "long" - stream.eat(/L/i); - return "number"; - } - } - - // Handle Strings - if (stream.match(stringPrefixes)) { - state.tokenize = tokenStringFactory(stream.current()); - return state.tokenize(stream, state); - } - - // Handle operators and Delimiters - if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) - return "punctuation"; - - if (stream.match(doubleOperators) || stream.match(singleOperators)) - return "operator"; - - if (stream.match(singleDelimiters)) - return "punctuation"; - - if (state.lastToken == "." && stream.match(identifiers)) - return "property"; - - if (stream.match(keywords) || stream.match(wordOperators)) - return "keyword"; - - if (stream.match(builtins)) - return "builtin"; - - if (stream.match(/^(self|cls)\b/)) - return "variable-2"; - - if (stream.match(identifiers)) { - if (state.lastToken == "def" || state.lastToken == "class") - return "def"; - return "variable"; - } - - // Handle non-detected items - stream.next(); - return ERRORCLASS; - } - - function tokenStringFactory(delimiter) { - while ("rub".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) - delimiter = delimiter.substr(1); - - var singleline = delimiter.length == 1; - var OUTCLASS = "string"; - - function tokenString(stream, state) { - while (!stream.eol()) { - stream.eatWhile(/[^'"\\]/); - if (stream.eat("\\")) { - stream.next(); - if (singleline && stream.eol()) - return OUTCLASS; - } else if (stream.match(delimiter)) { - state.tokenize = tokenBase; - return OUTCLASS; - } else { - stream.eat(/['"]/); - } - } - if (singleline) { - if (parserConf.singleLineStringErrors) - return ERRORCLASS; - else - state.tokenize = tokenBase; - } - return OUTCLASS; - } - tokenString.isString = true; - return tokenString; - } - - function pushPyScope(state) { - while (top(state).type != "py") state.scopes.pop() - state.scopes.push({offset: top(state).offset + conf.indentUnit, - type: "py", - align: null}) - } - - function pushBracketScope(stream, state, type) { - var align = stream.match(/^([\s\[\{\(]|#.*)*$/, false) ? null : stream.column() + 1 - state.scopes.push({offset: state.indent + hangingIndent, - type: type, - align: align}) - } - - function dedent(stream, state) { - var indented = stream.indentation(); - while (state.scopes.length > 1 && top(state).offset > indented) { - if (top(state).type != "py") return true; - state.scopes.pop(); - } - return top(state).offset != indented; - } - - function tokenLexer(stream, state) { - if (stream.sol()) state.beginningOfLine = true; - - var style = state.tokenize(stream, state); - var current = stream.current(); - - // Handle decorators - if (state.beginningOfLine && current == "@") - return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS; - - if (/\S/.test(current)) state.beginningOfLine = false; - - if ((style == "variable" || style == "builtin") - && state.lastToken == "meta") - style = "meta"; - - // Handle scope changes. - if (current == "pass" || current == "return") - state.dedent += 1; - - if (current == "lambda") state.lambda = true; - if (current == ":" && !state.lambda && top(state).type == "py") - pushPyScope(state); - - var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1; - if (delimiter_index != -1) - pushBracketScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); - - delimiter_index = "])}".indexOf(current); - if (delimiter_index != -1) { - if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent - else return ERRORCLASS; - } - if (state.dedent > 0 && stream.eol() && top(state).type == "py") { - if (state.scopes.length > 1) state.scopes.pop(); - state.dedent -= 1; - } - - return style; - } - - var external = { - startState: function(basecolumn) { - return { - tokenize: tokenBase, - scopes: [{offset: basecolumn || 0, type: "py", align: null}], - indent: basecolumn || 0, - lastToken: null, - lambda: false, - dedent: 0 - }; - }, - - token: function(stream, state) { - var addErr = state.errorToken; - if (addErr) state.errorToken = false; - var style = tokenLexer(stream, state); - - if (style && style != "comment") - state.lastToken = (style == "keyword" || style == "punctuation") ? stream.current() : style; - if (style == "punctuation") style = null; - - if (stream.eol() && state.lambda) - state.lambda = false; - return addErr ? style + " " + ERRORCLASS : style; - }, - - indent: function(state, textAfter) { - if (state.tokenize != tokenBase) - return state.tokenize.isString ? CodeMirror.Pass : 0; - - var scope = top(state), closing = scope.type == textAfter.charAt(0) - if (scope.align != null) - return scope.align - (closing ? 1 : 0) - else - return scope.offset - (closing ? hangingIndent : 0) - }, - - electricInput: /^\s*[\}\]\)]$/, - closeBrackets: {triples: "'\""}, - lineComment: "#", - fold: "indent" - }; - return external; - }); - - CodeMirror.defineMIME("text/x-python", "python"); - - var words = function(str) { return str.split(" "); }; - - CodeMirror.defineMIME("text/x-cython", { - name: "python", - extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+ - "extern gil include nogil property public"+ - "readonly struct union DEF IF ELIF ELSE") - }); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/python/test.js b/public/plugins/codemirror-5.17.0/mode/python/test.js deleted file mode 100644 index c1a9c6a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/python/test.js +++ /dev/null @@ -1,30 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 4}, - {name: "python", - version: 3, - singleLineStringErrors: false}); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - // Error, because "foobarhello" is neither a known type or property, but - // property was expected (after "and"), and it should be in parentheses. - MT("decoratorStartOfLine", - "[meta @dec]", - "[keyword def] [def function]():", - " [keyword pass]"); - - MT("decoratorIndented", - "[keyword class] [def Foo]:", - " [meta @dec]", - " [keyword def] [def function]():", - " [keyword pass]"); - - MT("matmulWithSpace:", "[variable a] [operator @] [variable b]"); - MT("matmulWithoutSpace:", "[variable a][operator @][variable b]"); - MT("matmulSpaceBefore:", "[variable a] [operator @][variable b]"); - - MT("fValidStringPrefix", "[string f'this is a {formatted} string']"); - MT("uValidStringPrefix", "[string u'this is an unicode string']"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/q/index.html b/public/plugins/codemirror-5.17.0/mode/q/index.html deleted file mode 100644 index 72785ba..0000000 --- a/public/plugins/codemirror-5.17.0/mode/q/index.html +++ /dev/null @@ -1,144 +0,0 @@ - - -CodeMirror: Q mode - - - - - - - - - - -
-

Q mode

- - -
- - - -

MIME type defined: text/x-q.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/q/q.js b/public/plugins/codemirror-5.17.0/mode/q/q.js deleted file mode 100644 index a4af938..0000000 --- a/public/plugins/codemirror-5.17.0/mode/q/q.js +++ /dev/null @@ -1,139 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("q",function(config){ - var indentUnit=config.indentUnit, - curPunc, - keywords=buildRE(["abs","acos","aj","aj0","all","and","any","asc","asin","asof","atan","attr","avg","avgs","bin","by","ceiling","cols","cor","cos","count","cov","cross","csv","cut","delete","deltas","desc","dev","differ","distinct","div","do","each","ej","enlist","eval","except","exec","exit","exp","fby","fills","first","fkeys","flip","floor","from","get","getenv","group","gtime","hclose","hcount","hdel","hopen","hsym","iasc","idesc","if","ij","in","insert","inter","inv","key","keys","last","like","list","lj","load","log","lower","lsq","ltime","ltrim","mavg","max","maxs","mcount","md5","mdev","med","meta","min","mins","mmax","mmin","mmu","mod","msum","neg","next","not","null","or","over","parse","peach","pj","plist","prd","prds","prev","prior","rand","rank","ratios","raze","read0","read1","reciprocal","reverse","rload","rotate","rsave","rtrim","save","scan","select","set","setenv","show","signum","sin","sqrt","ss","ssr","string","sublist","sum","sums","sv","system","tables","tan","til","trim","txf","type","uj","ungroup","union","update","upper","upsert","value","var","view","views","vs","wavg","where","where","while","within","wj","wj1","wsum","xasc","xbar","xcol","xcols","xdesc","xexp","xgroup","xkey","xlog","xprev","xrank"]), - E=/[|/&^!+:\\\-*%$=~#;@><,?_\'\"\[\(\]\)\s{}]/; - function buildRE(w){return new RegExp("^("+w.join("|")+")$");} - function tokenBase(stream,state){ - var sol=stream.sol(),c=stream.next(); - curPunc=null; - if(sol) - if(c=="/") - return(state.tokenize=tokenLineComment)(stream,state); - else if(c=="\\"){ - if(stream.eol()||/\s/.test(stream.peek())) - return stream.skipToEnd(),/^\\\s*$/.test(stream.current())?(state.tokenize=tokenCommentToEOF)(stream, state):state.tokenize=tokenBase,"comment"; - else - return state.tokenize=tokenBase,"builtin"; - } - if(/\s/.test(c)) - return stream.peek()=="/"?(stream.skipToEnd(),"comment"):"whitespace"; - if(c=='"') - return(state.tokenize=tokenString)(stream,state); - if(c=='`') - return stream.eatWhile(/[A-Z|a-z|\d|_|:|\/|\.]/),"symbol"; - if(("."==c&&/\d/.test(stream.peek()))||/\d/.test(c)){ - var t=null; - stream.backUp(1); - if(stream.match(/^\d{4}\.\d{2}(m|\.\d{2}([D|T](\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)?)?)/) - || stream.match(/^\d+D(\d{2}(:\d{2}(:\d{2}(\.\d{1,9})?)?)?)/) - || stream.match(/^\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?/) - || stream.match(/^\d+[ptuv]{1}/)) - t="temporal"; - else if(stream.match(/^0[NwW]{1}/) - || stream.match(/^0x[\d|a-f|A-F]*/) - || stream.match(/^[0|1]+[b]{1}/) - || stream.match(/^\d+[chijn]{1}/) - || stream.match(/-?\d*(\.\d*)?(e[+\-]?\d+)?(e|f)?/)) - t="number"; - return(t&&(!(c=stream.peek())||E.test(c)))?t:(stream.next(),"error"); - } - if(/[A-Z|a-z]|\./.test(c)) - return stream.eatWhile(/[A-Z|a-z|\.|_|\d]/),keywords.test(stream.current())?"keyword":"variable"; - if(/[|/&^!+:\\\-*%$=~#;@><\.,?_\']/.test(c)) - return null; - if(/[{}\(\[\]\)]/.test(c)) - return null; - return"error"; - } - function tokenLineComment(stream,state){ - return stream.skipToEnd(),/\/\s*$/.test(stream.current())?(state.tokenize=tokenBlockComment)(stream,state):(state.tokenize=tokenBase),"comment"; - } - function tokenBlockComment(stream,state){ - var f=stream.sol()&&stream.peek()=="\\"; - stream.skipToEnd(); - if(f&&/^\\\s*$/.test(stream.current())) - state.tokenize=tokenBase; - return"comment"; - } - function tokenCommentToEOF(stream){return stream.skipToEnd(),"comment";} - function tokenString(stream,state){ - var escaped=false,next,end=false; - while((next=stream.next())){ - if(next=="\""&&!escaped){end=true;break;} - escaped=!escaped&&next=="\\"; - } - if(end)state.tokenize=tokenBase; - return"string"; - } - function pushContext(state,type,col){state.context={prev:state.context,indent:state.indent,col:col,type:type};} - function popContext(state){state.indent=state.context.indent;state.context=state.context.prev;} - return{ - startState:function(){ - return{tokenize:tokenBase, - context:null, - indent:0, - col:0}; - }, - token:function(stream,state){ - if(stream.sol()){ - if(state.context&&state.context.align==null) - state.context.align=false; - state.indent=stream.indentation(); - } - //if (stream.eatSpace()) return null; - var style=state.tokenize(stream,state); - if(style!="comment"&&state.context&&state.context.align==null&&state.context.type!="pattern"){ - state.context.align=true; - } - if(curPunc=="(")pushContext(state,")",stream.column()); - else if(curPunc=="[")pushContext(state,"]",stream.column()); - else if(curPunc=="{")pushContext(state,"}",stream.column()); - else if(/[\]\}\)]/.test(curPunc)){ - while(state.context&&state.context.type=="pattern")popContext(state); - if(state.context&&curPunc==state.context.type)popContext(state); - } - else if(curPunc=="."&&state.context&&state.context.type=="pattern")popContext(state); - else if(/atom|string|variable/.test(style)&&state.context){ - if(/[\}\]]/.test(state.context.type)) - pushContext(state,"pattern",stream.column()); - else if(state.context.type=="pattern"&&!state.context.align){ - state.context.align=true; - state.context.col=stream.column(); - } - } - return style; - }, - indent:function(state,textAfter){ - var firstChar=textAfter&&textAfter.charAt(0); - var context=state.context; - if(/[\]\}]/.test(firstChar)) - while (context&&context.type=="pattern")context=context.prev; - var closing=context&&firstChar==context.type; - if(!context) - return 0; - else if(context.type=="pattern") - return context.col; - else if(context.align) - return context.col+(closing?0:1); - else - return context.indent+(closing?0:indentUnit); - } - }; -}); -CodeMirror.defineMIME("text/x-q","q"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/r/index.html b/public/plugins/codemirror-5.17.0/mode/r/index.html deleted file mode 100644 index 6dd9634..0000000 --- a/public/plugins/codemirror-5.17.0/mode/r/index.html +++ /dev/null @@ -1,85 +0,0 @@ - - -CodeMirror: R mode - - - - - - - - - -
-

R mode

-
- - -

MIME types defined: text/x-rsrc.

- -

Development of the CodeMirror R mode was kindly sponsored - by Ubalo.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/r/r.js b/public/plugins/codemirror-5.17.0/mode/r/r.js deleted file mode 100644 index d41d1c5..0000000 --- a/public/plugins/codemirror-5.17.0/mode/r/r.js +++ /dev/null @@ -1,164 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.registerHelper("wordChars", "r", /[\w.]/); - -CodeMirror.defineMode("r", function(config) { - function wordObj(str) { - var words = str.split(" "), res = {}; - for (var i = 0; i < words.length; ++i) res[words[i]] = true; - return res; - } - var atoms = wordObj("NULL NA Inf NaN NA_integer_ NA_real_ NA_complex_ NA_character_"); - var builtins = wordObj("list quote bquote eval return call parse deparse"); - var keywords = wordObj("if else repeat while function for in next break"); - var blockkeywords = wordObj("if else repeat while function for"); - var opChars = /[+\-*\/^<>=!&|~$:]/; - var curPunc; - - function tokenBase(stream, state) { - curPunc = null; - var ch = stream.next(); - if (ch == "#") { - stream.skipToEnd(); - return "comment"; - } else if (ch == "0" && stream.eat("x")) { - stream.eatWhile(/[\da-f]/i); - return "number"; - } else if (ch == "." && stream.eat(/\d/)) { - stream.match(/\d*(?:e[+\-]?\d+)?/); - return "number"; - } else if (/\d/.test(ch)) { - stream.match(/\d*(?:\.\d+)?(?:e[+\-]\d+)?L?/); - return "number"; - } else if (ch == "'" || ch == '"') { - state.tokenize = tokenString(ch); - return "string"; - } else if (ch == "." && stream.match(/.[.\d]+/)) { - return "keyword"; - } else if (/[\w\.]/.test(ch) && ch != "_") { - stream.eatWhile(/[\w\.]/); - var word = stream.current(); - if (atoms.propertyIsEnumerable(word)) return "atom"; - if (keywords.propertyIsEnumerable(word)) { - // Block keywords start new blocks, except 'else if', which only starts - // one new block for the 'if', no block for the 'else'. - if (blockkeywords.propertyIsEnumerable(word) && - !stream.match(/\s*if(\s+|$)/, false)) - curPunc = "block"; - return "keyword"; - } - if (builtins.propertyIsEnumerable(word)) return "builtin"; - return "variable"; - } else if (ch == "%") { - if (stream.skipTo("%")) stream.next(); - return "variable-2"; - } else if (ch == "<" && stream.eat("-")) { - return "arrow"; - } else if (ch == "=" && state.ctx.argList) { - return "arg-is"; - } else if (opChars.test(ch)) { - if (ch == "$") return "dollar"; - stream.eatWhile(opChars); - return "operator"; - } else if (/[\(\){}\[\];]/.test(ch)) { - curPunc = ch; - if (ch == ";") return "semi"; - return null; - } else { - return null; - } - } - - function tokenString(quote) { - return function(stream, state) { - if (stream.eat("\\")) { - var ch = stream.next(); - if (ch == "x") stream.match(/^[a-f0-9]{2}/i); - else if ((ch == "u" || ch == "U") && stream.eat("{") && stream.skipTo("}")) stream.next(); - else if (ch == "u") stream.match(/^[a-f0-9]{4}/i); - else if (ch == "U") stream.match(/^[a-f0-9]{8}/i); - else if (/[0-7]/.test(ch)) stream.match(/^[0-7]{1,2}/); - return "string-2"; - } else { - var next; - while ((next = stream.next()) != null) { - if (next == quote) { state.tokenize = tokenBase; break; } - if (next == "\\") { stream.backUp(1); break; } - } - return "string"; - } - }; - } - - function push(state, type, stream) { - state.ctx = {type: type, - indent: state.indent, - align: null, - column: stream.column(), - prev: state.ctx}; - } - function pop(state) { - state.indent = state.ctx.indent; - state.ctx = state.ctx.prev; - } - - return { - startState: function() { - return {tokenize: tokenBase, - ctx: {type: "top", - indent: -config.indentUnit, - align: false}, - indent: 0, - afterIdent: false}; - }, - - token: function(stream, state) { - if (stream.sol()) { - if (state.ctx.align == null) state.ctx.align = false; - state.indent = stream.indentation(); - } - if (stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - if (style != "comment" && state.ctx.align == null) state.ctx.align = true; - - var ctype = state.ctx.type; - if ((curPunc == ";" || curPunc == "{" || curPunc == "}") && ctype == "block") pop(state); - if (curPunc == "{") push(state, "}", stream); - else if (curPunc == "(") { - push(state, ")", stream); - if (state.afterIdent) state.ctx.argList = true; - } - else if (curPunc == "[") push(state, "]", stream); - else if (curPunc == "block") push(state, "block", stream); - else if (curPunc == ctype) pop(state); - state.afterIdent = style == "variable" || style == "keyword"; - return style; - }, - - indent: function(state, textAfter) { - if (state.tokenize != tokenBase) return 0; - var firstChar = textAfter && textAfter.charAt(0), ctx = state.ctx, - closing = firstChar == ctx.type; - if (ctx.type == "block") return ctx.indent + (firstChar == "{" ? 0 : config.indentUnit); - else if (ctx.align) return ctx.column + (closing ? 0 : 1); - else return ctx.indent + (closing ? 0 : config.indentUnit); - }, - - lineComment: "#" - }; -}); - -CodeMirror.defineMIME("text/x-rsrc", "r"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/rpm/changes/index.html b/public/plugins/codemirror-5.17.0/mode/rpm/changes/index.html deleted file mode 100644 index 6e5031b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/rpm/changes/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - -CodeMirror: RPM changes mode - - - - - - - - - - - -
-

RPM changes mode

- -
- - -

MIME types defined: text/x-rpm-changes.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/rpm/index.html b/public/plugins/codemirror-5.17.0/mode/rpm/index.html deleted file mode 100644 index 9a34e6d..0000000 --- a/public/plugins/codemirror-5.17.0/mode/rpm/index.html +++ /dev/null @@ -1,149 +0,0 @@ - - -CodeMirror: RPM changes mode - - - - - - - - - - - -
-

RPM changes mode

- -
- - -

RPM spec mode

- -
- - -

MIME types defined: text/x-rpm-spec, text/x-rpm-changes.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/rpm/rpm.js b/public/plugins/codemirror-5.17.0/mode/rpm/rpm.js deleted file mode 100644 index 87cde59..0000000 --- a/public/plugins/codemirror-5.17.0/mode/rpm/rpm.js +++ /dev/null @@ -1,109 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("rpm-changes", function() { - var headerSeperator = /^-+$/; - var headerLine = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /; - var simpleEmail = /^[\w+.-]+@[\w.-]+/; - - return { - token: function(stream) { - if (stream.sol()) { - if (stream.match(headerSeperator)) { return 'tag'; } - if (stream.match(headerLine)) { return 'tag'; } - } - if (stream.match(simpleEmail)) { return 'string'; } - stream.next(); - return null; - } - }; -}); - -CodeMirror.defineMIME("text/x-rpm-changes", "rpm-changes"); - -// Quick and dirty spec file highlighting - -CodeMirror.defineMode("rpm-spec", function() { - var arch = /^(i386|i586|i686|x86_64|ppc64le|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/; - - var preamble = /^[a-zA-Z0-9()]+:/; - var section = /^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pretrans|posttrans|pre|post|triggerin|triggerun|verifyscript|check|triggerpostun|triggerprein|trigger)/; - var control_flow_complex = /^%(ifnarch|ifarch|if)/; // rpm control flow macros - var control_flow_simple = /^%(else|endif)/; // rpm control flow macros - var operators = /^(\!|\?|\<\=|\<|\>\=|\>|\=\=|\&\&|\|\|)/; // operators in control flow macros - - return { - startState: function () { - return { - controlFlow: false, - macroParameters: false, - section: false - }; - }, - token: function (stream, state) { - var ch = stream.peek(); - if (ch == "#") { stream.skipToEnd(); return "comment"; } - - if (stream.sol()) { - if (stream.match(preamble)) { return "header"; } - if (stream.match(section)) { return "atom"; } - } - - if (stream.match(/^\$\w+/)) { return "def"; } // Variables like '$RPM_BUILD_ROOT' - if (stream.match(/^\$\{\w+\}/)) { return "def"; } // Variables like '${RPM_BUILD_ROOT}' - - if (stream.match(control_flow_simple)) { return "keyword"; } - if (stream.match(control_flow_complex)) { - state.controlFlow = true; - return "keyword"; - } - if (state.controlFlow) { - if (stream.match(operators)) { return "operator"; } - if (stream.match(/^(\d+)/)) { return "number"; } - if (stream.eol()) { state.controlFlow = false; } - } - - if (stream.match(arch)) { - if (stream.eol()) { state.controlFlow = false; } - return "number"; - } - - // Macros like '%make_install' or '%attr(0775,root,root)' - if (stream.match(/^%[\w]+/)) { - if (stream.match(/^\(/)) { state.macroParameters = true; } - return "keyword"; - } - if (state.macroParameters) { - if (stream.match(/^\d+/)) { return "number";} - if (stream.match(/^\)/)) { - state.macroParameters = false; - return "keyword"; - } - } - - // Macros like '%{defined fedora}' - if (stream.match(/^%\{\??[\w \-\:\!]+\}/)) { - if (stream.eol()) { state.controlFlow = false; } - return "def"; - } - - //TODO: Include bash script sub-parser (CodeMirror supports that) - stream.next(); - return null; - } - }; -}); - -CodeMirror.defineMIME("text/x-rpm-spec", "rpm-spec"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/rst/index.html b/public/plugins/codemirror-5.17.0/mode/rst/index.html deleted file mode 100644 index 2902dea..0000000 --- a/public/plugins/codemirror-5.17.0/mode/rst/index.html +++ /dev/null @@ -1,535 +0,0 @@ - - -CodeMirror: reStructuredText mode - - - - - - - - - - -
-

reStructuredText mode

-
- - -

- The python mode will be used for highlighting blocks - containing Python/IPython terminal sessions: blocks starting with - >>> (for Python) or In [num]: (for - IPython). - - Further, the stex mode will be used for highlighting - blocks containing LaTex code. -

- -

MIME types defined: text/x-rst.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/rst/rst.js b/public/plugins/codemirror-5.17.0/mode/rst/rst.js deleted file mode 100644 index bcf110c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/rst/rst.js +++ /dev/null @@ -1,557 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../python/python"), require("../stex/stex"), require("../../addon/mode/overlay")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../python/python", "../stex/stex", "../../addon/mode/overlay"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('rst', function (config, options) { - - var rx_strong = /^\*\*[^\*\s](?:[^\*]*[^\*\s])?\*\*/; - var rx_emphasis = /^\*[^\*\s](?:[^\*]*[^\*\s])?\*/; - var rx_literal = /^``[^`\s](?:[^`]*[^`\s])``/; - - var rx_number = /^(?:[\d]+(?:[\.,]\d+)*)/; - var rx_positive = /^(?:\s\+[\d]+(?:[\.,]\d+)*)/; - var rx_negative = /^(?:\s\-[\d]+(?:[\.,]\d+)*)/; - - var rx_uri_protocol = "[Hh][Tt][Tt][Pp][Ss]?://"; - var rx_uri_domain = "(?:[\\d\\w.-]+)\\.(?:\\w{2,6})"; - var rx_uri_path = "(?:/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*"; - var rx_uri = new RegExp("^" + rx_uri_protocol + rx_uri_domain + rx_uri_path); - - var overlay = { - token: function (stream) { - - if (stream.match(rx_strong) && stream.match (/\W+|$/, false)) - return 'strong'; - if (stream.match(rx_emphasis) && stream.match (/\W+|$/, false)) - return 'em'; - if (stream.match(rx_literal) && stream.match (/\W+|$/, false)) - return 'string-2'; - if (stream.match(rx_number)) - return 'number'; - if (stream.match(rx_positive)) - return 'positive'; - if (stream.match(rx_negative)) - return 'negative'; - if (stream.match(rx_uri)) - return 'link'; - - while (stream.next() != null) { - if (stream.match(rx_strong, false)) break; - if (stream.match(rx_emphasis, false)) break; - if (stream.match(rx_literal, false)) break; - if (stream.match(rx_number, false)) break; - if (stream.match(rx_positive, false)) break; - if (stream.match(rx_negative, false)) break; - if (stream.match(rx_uri, false)) break; - } - - return null; - } - }; - - var mode = CodeMirror.getMode( - config, options.backdrop || 'rst-base' - ); - - return CodeMirror.overlayMode(mode, overlay, true); // combine -}, 'python', 'stex'); - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -CodeMirror.defineMode('rst-base', function (config) { - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - function format(string) { - var args = Array.prototype.slice.call(arguments, 1); - return string.replace(/{(\d+)}/g, function (match, n) { - return typeof args[n] != 'undefined' ? args[n] : match; - }); - } - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - var mode_python = CodeMirror.getMode(config, 'python'); - var mode_stex = CodeMirror.getMode(config, 'stex'); - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - var SEPA = "\\s+"; - var TAIL = "(?:\\s*|\\W|$)", - rx_TAIL = new RegExp(format('^{0}', TAIL)); - - var NAME = - "(?:[^\\W\\d_](?:[\\w!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)", - rx_NAME = new RegExp(format('^{0}', NAME)); - var NAME_WWS = - "(?:[^\\W\\d_](?:[\\w\\s!\"#$%&'()\\*\\+,\\-\\.\/:;<=>\\?]*[^\\W_])?)"; - var REF_NAME = format('(?:{0}|`{1}`)', NAME, NAME_WWS); - - var TEXT1 = "(?:[^\\s\\|](?:[^\\|]*[^\\s\\|])?)"; - var TEXT2 = "(?:[^\\`]+)", - rx_TEXT2 = new RegExp(format('^{0}', TEXT2)); - - var rx_section = new RegExp( - "^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$"); - var rx_explicit = new RegExp( - format('^\\.\\.{0}', SEPA)); - var rx_link = new RegExp( - format('^_{0}:{1}|^__:{1}', REF_NAME, TAIL)); - var rx_directive = new RegExp( - format('^{0}::{1}', REF_NAME, TAIL)); - var rx_substitution = new RegExp( - format('^\\|{0}\\|{1}{2}::{3}', TEXT1, SEPA, REF_NAME, TAIL)); - var rx_footnote = new RegExp( - format('^\\[(?:\\d+|#{0}?|\\*)]{1}', REF_NAME, TAIL)); - var rx_citation = new RegExp( - format('^\\[{0}\\]{1}', REF_NAME, TAIL)); - - var rx_substitution_ref = new RegExp( - format('^\\|{0}\\|', TEXT1)); - var rx_footnote_ref = new RegExp( - format('^\\[(?:\\d+|#{0}?|\\*)]_', REF_NAME)); - var rx_citation_ref = new RegExp( - format('^\\[{0}\\]_', REF_NAME)); - var rx_link_ref1 = new RegExp( - format('^{0}__?', REF_NAME)); - var rx_link_ref2 = new RegExp( - format('^`{0}`_', TEXT2)); - - var rx_role_pre = new RegExp( - format('^:{0}:`{1}`{2}', NAME, TEXT2, TAIL)); - var rx_role_suf = new RegExp( - format('^`{1}`:{0}:{2}', NAME, TEXT2, TAIL)); - var rx_role = new RegExp( - format('^:{0}:{1}', NAME, TAIL)); - - var rx_directive_name = new RegExp(format('^{0}', REF_NAME)); - var rx_directive_tail = new RegExp(format('^::{0}', TAIL)); - var rx_substitution_text = new RegExp(format('^\\|{0}\\|', TEXT1)); - var rx_substitution_sepa = new RegExp(format('^{0}', SEPA)); - var rx_substitution_name = new RegExp(format('^{0}', REF_NAME)); - var rx_substitution_tail = new RegExp(format('^::{0}', TAIL)); - var rx_link_head = new RegExp("^_"); - var rx_link_name = new RegExp(format('^{0}|_', REF_NAME)); - var rx_link_tail = new RegExp(format('^:{0}', TAIL)); - - var rx_verbatim = new RegExp('^::\\s*$'); - var rx_examples = new RegExp('^\\s+(?:>>>|In \\[\\d+\\]:)\\s'); - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - function to_normal(stream, state) { - var token = null; - - if (stream.sol() && stream.match(rx_examples, false)) { - change(state, to_mode, { - mode: mode_python, local: CodeMirror.startState(mode_python) - }); - } else if (stream.sol() && stream.match(rx_explicit)) { - change(state, to_explicit); - token = 'meta'; - } else if (stream.sol() && stream.match(rx_section)) { - change(state, to_normal); - token = 'header'; - } else if (phase(state) == rx_role_pre || - stream.match(rx_role_pre, false)) { - - switch (stage(state)) { - case 0: - change(state, to_normal, context(rx_role_pre, 1)); - stream.match(/^:/); - token = 'meta'; - break; - case 1: - change(state, to_normal, context(rx_role_pre, 2)); - stream.match(rx_NAME); - token = 'keyword'; - - if (stream.current().match(/^(?:math|latex)/)) { - state.tmp_stex = true; - } - break; - case 2: - change(state, to_normal, context(rx_role_pre, 3)); - stream.match(/^:`/); - token = 'meta'; - break; - case 3: - if (state.tmp_stex) { - state.tmp_stex = undefined; state.tmp = { - mode: mode_stex, local: CodeMirror.startState(mode_stex) - }; - } - - if (state.tmp) { - if (stream.peek() == '`') { - change(state, to_normal, context(rx_role_pre, 4)); - state.tmp = undefined; - break; - } - - token = state.tmp.mode.token(stream, state.tmp.local); - break; - } - - change(state, to_normal, context(rx_role_pre, 4)); - stream.match(rx_TEXT2); - token = 'string'; - break; - case 4: - change(state, to_normal, context(rx_role_pre, 5)); - stream.match(/^`/); - token = 'meta'; - break; - case 5: - change(state, to_normal, context(rx_role_pre, 6)); - stream.match(rx_TAIL); - break; - default: - change(state, to_normal); - } - } else if (phase(state) == rx_role_suf || - stream.match(rx_role_suf, false)) { - - switch (stage(state)) { - case 0: - change(state, to_normal, context(rx_role_suf, 1)); - stream.match(/^`/); - token = 'meta'; - break; - case 1: - change(state, to_normal, context(rx_role_suf, 2)); - stream.match(rx_TEXT2); - token = 'string'; - break; - case 2: - change(state, to_normal, context(rx_role_suf, 3)); - stream.match(/^`:/); - token = 'meta'; - break; - case 3: - change(state, to_normal, context(rx_role_suf, 4)); - stream.match(rx_NAME); - token = 'keyword'; - break; - case 4: - change(state, to_normal, context(rx_role_suf, 5)); - stream.match(/^:/); - token = 'meta'; - break; - case 5: - change(state, to_normal, context(rx_role_suf, 6)); - stream.match(rx_TAIL); - break; - default: - change(state, to_normal); - } - } else if (phase(state) == rx_role || stream.match(rx_role, false)) { - - switch (stage(state)) { - case 0: - change(state, to_normal, context(rx_role, 1)); - stream.match(/^:/); - token = 'meta'; - break; - case 1: - change(state, to_normal, context(rx_role, 2)); - stream.match(rx_NAME); - token = 'keyword'; - break; - case 2: - change(state, to_normal, context(rx_role, 3)); - stream.match(/^:/); - token = 'meta'; - break; - case 3: - change(state, to_normal, context(rx_role, 4)); - stream.match(rx_TAIL); - break; - default: - change(state, to_normal); - } - } else if (phase(state) == rx_substitution_ref || - stream.match(rx_substitution_ref, false)) { - - switch (stage(state)) { - case 0: - change(state, to_normal, context(rx_substitution_ref, 1)); - stream.match(rx_substitution_text); - token = 'variable-2'; - break; - case 1: - change(state, to_normal, context(rx_substitution_ref, 2)); - if (stream.match(/^_?_?/)) token = 'link'; - break; - default: - change(state, to_normal); - } - } else if (stream.match(rx_footnote_ref)) { - change(state, to_normal); - token = 'quote'; - } else if (stream.match(rx_citation_ref)) { - change(state, to_normal); - token = 'quote'; - } else if (stream.match(rx_link_ref1)) { - change(state, to_normal); - if (!stream.peek() || stream.peek().match(/^\W$/)) { - token = 'link'; - } - } else if (phase(state) == rx_link_ref2 || - stream.match(rx_link_ref2, false)) { - - switch (stage(state)) { - case 0: - if (!stream.peek() || stream.peek().match(/^\W$/)) { - change(state, to_normal, context(rx_link_ref2, 1)); - } else { - stream.match(rx_link_ref2); - } - break; - case 1: - change(state, to_normal, context(rx_link_ref2, 2)); - stream.match(/^`/); - token = 'link'; - break; - case 2: - change(state, to_normal, context(rx_link_ref2, 3)); - stream.match(rx_TEXT2); - break; - case 3: - change(state, to_normal, context(rx_link_ref2, 4)); - stream.match(/^`_/); - token = 'link'; - break; - default: - change(state, to_normal); - } - } else if (stream.match(rx_verbatim)) { - change(state, to_verbatim); - } - - else { - if (stream.next()) change(state, to_normal); - } - - return token; - } - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - function to_explicit(stream, state) { - var token = null; - - if (phase(state) == rx_substitution || - stream.match(rx_substitution, false)) { - - switch (stage(state)) { - case 0: - change(state, to_explicit, context(rx_substitution, 1)); - stream.match(rx_substitution_text); - token = 'variable-2'; - break; - case 1: - change(state, to_explicit, context(rx_substitution, 2)); - stream.match(rx_substitution_sepa); - break; - case 2: - change(state, to_explicit, context(rx_substitution, 3)); - stream.match(rx_substitution_name); - token = 'keyword'; - break; - case 3: - change(state, to_explicit, context(rx_substitution, 4)); - stream.match(rx_substitution_tail); - token = 'meta'; - break; - default: - change(state, to_normal); - } - } else if (phase(state) == rx_directive || - stream.match(rx_directive, false)) { - - switch (stage(state)) { - case 0: - change(state, to_explicit, context(rx_directive, 1)); - stream.match(rx_directive_name); - token = 'keyword'; - - if (stream.current().match(/^(?:math|latex)/)) - state.tmp_stex = true; - else if (stream.current().match(/^python/)) - state.tmp_py = true; - break; - case 1: - change(state, to_explicit, context(rx_directive, 2)); - stream.match(rx_directive_tail); - token = 'meta'; - - if (stream.match(/^latex\s*$/) || state.tmp_stex) { - state.tmp_stex = undefined; change(state, to_mode, { - mode: mode_stex, local: CodeMirror.startState(mode_stex) - }); - } - break; - case 2: - change(state, to_explicit, context(rx_directive, 3)); - if (stream.match(/^python\s*$/) || state.tmp_py) { - state.tmp_py = undefined; change(state, to_mode, { - mode: mode_python, local: CodeMirror.startState(mode_python) - }); - } - break; - default: - change(state, to_normal); - } - } else if (phase(state) == rx_link || stream.match(rx_link, false)) { - - switch (stage(state)) { - case 0: - change(state, to_explicit, context(rx_link, 1)); - stream.match(rx_link_head); - stream.match(rx_link_name); - token = 'link'; - break; - case 1: - change(state, to_explicit, context(rx_link, 2)); - stream.match(rx_link_tail); - token = 'meta'; - break; - default: - change(state, to_normal); - } - } else if (stream.match(rx_footnote)) { - change(state, to_normal); - token = 'quote'; - } else if (stream.match(rx_citation)) { - change(state, to_normal); - token = 'quote'; - } - - else { - stream.eatSpace(); - if (stream.eol()) { - change(state, to_normal); - } else { - stream.skipToEnd(); - change(state, to_comment); - token = 'comment'; - } - } - - return token; - } - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - function to_comment(stream, state) { - return as_block(stream, state, 'comment'); - } - - function to_verbatim(stream, state) { - return as_block(stream, state, 'meta'); - } - - function as_block(stream, state, token) { - if (stream.eol() || stream.eatSpace()) { - stream.skipToEnd(); - return token; - } else { - change(state, to_normal); - return null; - } - } - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - function to_mode(stream, state) { - - if (state.ctx.mode && state.ctx.local) { - - if (stream.sol()) { - if (!stream.eatSpace()) change(state, to_normal); - return null; - } - - return state.ctx.mode.token(stream, state.ctx.local); - } - - change(state, to_normal); - return null; - } - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - function context(phase, stage, mode, local) { - return {phase: phase, stage: stage, mode: mode, local: local}; - } - - function change(state, tok, ctx) { - state.tok = tok; - state.ctx = ctx || {}; - } - - function stage(state) { - return state.ctx.stage || 0; - } - - function phase(state) { - return state.ctx.phase; - } - - /////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////// - - return { - startState: function () { - return {tok: to_normal, ctx: context(undefined, 0)}; - }, - - copyState: function (state) { - var ctx = state.ctx, tmp = state.tmp; - if (ctx.local) - ctx = {mode: ctx.mode, local: CodeMirror.copyState(ctx.mode, ctx.local)}; - if (tmp) - tmp = {mode: tmp.mode, local: CodeMirror.copyState(tmp.mode, tmp.local)}; - return {tok: state.tok, ctx: ctx, tmp: tmp}; - }, - - innerMode: function (state) { - return state.tmp ? {state: state.tmp.local, mode: state.tmp.mode} - : state.ctx.mode ? {state: state.ctx.local, mode: state.ctx.mode} - : null; - }, - - token: function (stream, state) { - return state.tok(stream, state); - } - }; -}, 'python', 'stex'); - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -CodeMirror.defineMIME('text/x-rst', 'rst'); - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/ruby/index.html b/public/plugins/codemirror-5.17.0/mode/ruby/index.html deleted file mode 100644 index 97544ba..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ruby/index.html +++ /dev/null @@ -1,183 +0,0 @@ - - -CodeMirror: Ruby mode - - - - - - - - - - -
-

Ruby mode

-
- - -

MIME types defined: text/x-ruby.

- -

Development of the CodeMirror Ruby mode was kindly sponsored - by Ubalo.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/ruby/ruby.js b/public/plugins/codemirror-5.17.0/mode/ruby/ruby.js deleted file mode 100644 index 10cad8d..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ruby/ruby.js +++ /dev/null @@ -1,285 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("ruby", function(config) { - function wordObj(words) { - var o = {}; - for (var i = 0, e = words.length; i < e; ++i) o[words[i]] = true; - return o; - } - var keywords = wordObj([ - "alias", "and", "BEGIN", "begin", "break", "case", "class", "def", "defined?", "do", "else", - "elsif", "END", "end", "ensure", "false", "for", "if", "in", "module", "next", "not", "or", - "redo", "rescue", "retry", "return", "self", "super", "then", "true", "undef", "unless", - "until", "when", "while", "yield", "nil", "raise", "throw", "catch", "fail", "loop", "callcc", - "caller", "lambda", "proc", "public", "protected", "private", "require", "load", - "require_relative", "extend", "autoload", "__END__", "__FILE__", "__LINE__", "__dir__" - ]); - var indentWords = wordObj(["def", "class", "case", "for", "while", "until", "module", "then", - "catch", "loop", "proc", "begin"]); - var dedentWords = wordObj(["end", "until"]); - var matching = {"[": "]", "{": "}", "(": ")"}; - var curPunc; - - function chain(newtok, stream, state) { - state.tokenize.push(newtok); - return newtok(stream, state); - } - - function tokenBase(stream, state) { - if (stream.sol() && stream.match("=begin") && stream.eol()) { - state.tokenize.push(readBlockComment); - return "comment"; - } - if (stream.eatSpace()) return null; - var ch = stream.next(), m; - if (ch == "`" || ch == "'" || ch == '"') { - return chain(readQuoted(ch, "string", ch == '"' || ch == "`"), stream, state); - } else if (ch == "/") { - var currentIndex = stream.current().length; - if (stream.skipTo("/")) { - var search_till = stream.current().length; - stream.backUp(stream.current().length - currentIndex); - var balance = 0; // balance brackets - while (stream.current().length < search_till) { - var chchr = stream.next(); - if (chchr == "(") balance += 1; - else if (chchr == ")") balance -= 1; - if (balance < 0) break; - } - stream.backUp(stream.current().length - currentIndex); - if (balance == 0) - return chain(readQuoted(ch, "string-2", true), stream, state); - } - return "operator"; - } else if (ch == "%") { - var style = "string", embed = true; - if (stream.eat("s")) style = "atom"; - else if (stream.eat(/[WQ]/)) style = "string"; - else if (stream.eat(/[r]/)) style = "string-2"; - else if (stream.eat(/[wxq]/)) { style = "string"; embed = false; } - var delim = stream.eat(/[^\w\s=]/); - if (!delim) return "operator"; - if (matching.propertyIsEnumerable(delim)) delim = matching[delim]; - return chain(readQuoted(delim, style, embed, true), stream, state); - } else if (ch == "#") { - stream.skipToEnd(); - return "comment"; - } else if (ch == "<" && (m = stream.match(/^<-?[\`\"\']?([a-zA-Z_?]\w*)[\`\"\']?(?:;|$)/))) { - return chain(readHereDoc(m[1]), stream, state); - } else if (ch == "0") { - if (stream.eat("x")) stream.eatWhile(/[\da-fA-F]/); - else if (stream.eat("b")) stream.eatWhile(/[01]/); - else stream.eatWhile(/[0-7]/); - return "number"; - } else if (/\d/.test(ch)) { - stream.match(/^[\d_]*(?:\.[\d_]+)?(?:[eE][+\-]?[\d_]+)?/); - return "number"; - } else if (ch == "?") { - while (stream.match(/^\\[CM]-/)) {} - if (stream.eat("\\")) stream.eatWhile(/\w/); - else stream.next(); - return "string"; - } else if (ch == ":") { - if (stream.eat("'")) return chain(readQuoted("'", "atom", false), stream, state); - if (stream.eat('"')) return chain(readQuoted('"', "atom", true), stream, state); - - // :> :>> :< :<< are valid symbols - if (stream.eat(/[\<\>]/)) { - stream.eat(/[\<\>]/); - return "atom"; - } - - // :+ :- :/ :* :| :& :! are valid symbols - if (stream.eat(/[\+\-\*\/\&\|\:\!]/)) { - return "atom"; - } - - // Symbols can't start by a digit - if (stream.eat(/[a-zA-Z$@_\xa1-\uffff]/)) { - stream.eatWhile(/[\w$\xa1-\uffff]/); - // Only one ? ! = is allowed and only as the last character - stream.eat(/[\?\!\=]/); - return "atom"; - } - return "operator"; - } else if (ch == "@" && stream.match(/^@?[a-zA-Z_\xa1-\uffff]/)) { - stream.eat("@"); - stream.eatWhile(/[\w\xa1-\uffff]/); - return "variable-2"; - } else if (ch == "$") { - if (stream.eat(/[a-zA-Z_]/)) { - stream.eatWhile(/[\w]/); - } else if (stream.eat(/\d/)) { - stream.eat(/\d/); - } else { - stream.next(); // Must be a special global like $: or $! - } - return "variable-3"; - } else if (/[a-zA-Z_\xa1-\uffff]/.test(ch)) { - stream.eatWhile(/[\w\xa1-\uffff]/); - stream.eat(/[\?\!]/); - if (stream.eat(":")) return "atom"; - return "ident"; - } else if (ch == "|" && (state.varList || state.lastTok == "{" || state.lastTok == "do")) { - curPunc = "|"; - return null; - } else if (/[\(\)\[\]{}\\;]/.test(ch)) { - curPunc = ch; - return null; - } else if (ch == "-" && stream.eat(">")) { - return "arrow"; - } else if (/[=+\-\/*:\.^%<>~|]/.test(ch)) { - var more = stream.eatWhile(/[=+\-\/*:\.^%<>~|]/); - if (ch == "." && !more) curPunc = "."; - return "operator"; - } else { - return null; - } - } - - function tokenBaseUntilBrace(depth) { - if (!depth) depth = 1; - return function(stream, state) { - if (stream.peek() == "}") { - if (depth == 1) { - state.tokenize.pop(); - return state.tokenize[state.tokenize.length-1](stream, state); - } else { - state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth - 1); - } - } else if (stream.peek() == "{") { - state.tokenize[state.tokenize.length - 1] = tokenBaseUntilBrace(depth + 1); - } - return tokenBase(stream, state); - }; - } - function tokenBaseOnce() { - var alreadyCalled = false; - return function(stream, state) { - if (alreadyCalled) { - state.tokenize.pop(); - return state.tokenize[state.tokenize.length-1](stream, state); - } - alreadyCalled = true; - return tokenBase(stream, state); - }; - } - function readQuoted(quote, style, embed, unescaped) { - return function(stream, state) { - var escaped = false, ch; - - if (state.context.type === 'read-quoted-paused') { - state.context = state.context.prev; - stream.eat("}"); - } - - while ((ch = stream.next()) != null) { - if (ch == quote && (unescaped || !escaped)) { - state.tokenize.pop(); - break; - } - if (embed && ch == "#" && !escaped) { - if (stream.eat("{")) { - if (quote == "}") { - state.context = {prev: state.context, type: 'read-quoted-paused'}; - } - state.tokenize.push(tokenBaseUntilBrace()); - break; - } else if (/[@\$]/.test(stream.peek())) { - state.tokenize.push(tokenBaseOnce()); - break; - } - } - escaped = !escaped && ch == "\\"; - } - return style; - }; - } - function readHereDoc(phrase) { - return function(stream, state) { - if (stream.match(phrase)) state.tokenize.pop(); - else stream.skipToEnd(); - return "string"; - }; - } - function readBlockComment(stream, state) { - if (stream.sol() && stream.match("=end") && stream.eol()) - state.tokenize.pop(); - stream.skipToEnd(); - return "comment"; - } - - return { - startState: function() { - return {tokenize: [tokenBase], - indented: 0, - context: {type: "top", indented: -config.indentUnit}, - continuedLine: false, - lastTok: null, - varList: false}; - }, - - token: function(stream, state) { - curPunc = null; - if (stream.sol()) state.indented = stream.indentation(); - var style = state.tokenize[state.tokenize.length-1](stream, state), kwtype; - var thisTok = curPunc; - if (style == "ident") { - var word = stream.current(); - style = state.lastTok == "." ? "property" - : keywords.propertyIsEnumerable(stream.current()) ? "keyword" - : /^[A-Z]/.test(word) ? "tag" - : (state.lastTok == "def" || state.lastTok == "class" || state.varList) ? "def" - : "variable"; - if (style == "keyword") { - thisTok = word; - if (indentWords.propertyIsEnumerable(word)) kwtype = "indent"; - else if (dedentWords.propertyIsEnumerable(word)) kwtype = "dedent"; - else if ((word == "if" || word == "unless") && stream.column() == stream.indentation()) - kwtype = "indent"; - else if (word == "do" && state.context.indented < state.indented) - kwtype = "indent"; - } - } - if (curPunc || (style && style != "comment")) state.lastTok = thisTok; - if (curPunc == "|") state.varList = !state.varList; - - if (kwtype == "indent" || /[\(\[\{]/.test(curPunc)) - state.context = {prev: state.context, type: curPunc || style, indented: state.indented}; - else if ((kwtype == "dedent" || /[\)\]\}]/.test(curPunc)) && state.context.prev) - state.context = state.context.prev; - - if (stream.eol()) - state.continuedLine = (curPunc == "\\" || style == "operator"); - return style; - }, - - indent: function(state, textAfter) { - if (state.tokenize[state.tokenize.length-1] != tokenBase) return 0; - var firstChar = textAfter && textAfter.charAt(0); - var ct = state.context; - var closing = ct.type == matching[firstChar] || - ct.type == "keyword" && /^(?:end|until|else|elsif|when|rescue)\b/.test(textAfter); - return ct.indented + (closing ? 0 : config.indentUnit) + - (state.continuedLine ? config.indentUnit : 0); - }, - - electricInput: /^\s*(?:end|rescue|\})$/, - lineComment: "#" - }; -}); - -CodeMirror.defineMIME("text/x-ruby", "ruby"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/ruby/test.js b/public/plugins/codemirror-5.17.0/mode/ruby/test.js deleted file mode 100644 index cade864..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ruby/test.js +++ /dev/null @@ -1,14 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "ruby"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT("divide_equal_operator", - "[variable bar] [operator /=] [variable foo]"); - - MT("divide_equal_operator_no_spacing", - "[variable foo][operator /=][number 42]"); - -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/rust/index.html b/public/plugins/codemirror-5.17.0/mode/rust/index.html deleted file mode 100644 index 1fe0ad1..0000000 --- a/public/plugins/codemirror-5.17.0/mode/rust/index.html +++ /dev/null @@ -1,64 +0,0 @@ - - -CodeMirror: Rust mode - - - - - - - - - - -
-

Rust mode

- - -
- - - -

MIME types defined: text/x-rustsrc.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/rust/rust.js b/public/plugins/codemirror-5.17.0/mode/rust/rust.js deleted file mode 100644 index 8558b53..0000000 --- a/public/plugins/codemirror-5.17.0/mode/rust/rust.js +++ /dev/null @@ -1,71 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../../addon/mode/simple")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../../addon/mode/simple"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineSimpleMode("rust",{ - start: [ - // string and byte string - {regex: /b?"/, token: "string", next: "string"}, - // raw string and raw byte string - {regex: /b?r"/, token: "string", next: "string_raw"}, - {regex: /b?r#+"/, token: "string", next: "string_raw_hash"}, - // character - {regex: /'(?:[^'\\]|\\(?:[nrt0'"]|x[\da-fA-F]{2}|u\{[\da-fA-F]{6}\}))'/, token: "string-2"}, - // byte - {regex: /b'(?:[^']|\\(?:['\\nrt0]|x[\da-fA-F]{2}))'/, token: "string-2"}, - - {regex: /(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/, - token: "number"}, - {regex: /(let(?:\s+mut)?|fn|enum|mod|struct|type)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, token: ["keyword", null, "def"]}, - {regex: /(?:abstract|alignof|as|box|break|continue|const|crate|do|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\b/, token: "keyword"}, - {regex: /\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\b/, token: "atom"}, - {regex: /\b(?:true|false|Some|None|Ok|Err)\b/, token: "builtin"}, - {regex: /\b(fn)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)/, - token: ["keyword", null ,"def"]}, - {regex: /#!?\[.*\]/, token: "meta"}, - {regex: /\/\/.*/, token: "comment"}, - {regex: /\/\*/, token: "comment", next: "comment"}, - {regex: /[-+\/*=<>!]+/, token: "operator"}, - {regex: /[a-zA-Z_]\w*!/,token: "variable-3"}, - {regex: /[a-zA-Z_]\w*/, token: "variable"}, - {regex: /[\{\[\(]/, indent: true}, - {regex: /[\}\]\)]/, dedent: true} - ], - string: [ - {regex: /"/, token: "string", next: "start"}, - {regex: /(?:[^\\"]|\\(?:.|$))*/, token: "string"} - ], - string_raw: [ - {regex: /"/, token: "string", next: "start"}, - {regex: /[^"]*/, token: "string"} - ], - string_raw_hash: [ - {regex: /"#+/, token: "string", next: "start"}, - {regex: /(?:[^"]|"(?!#))*/, token: "string"} - ], - comment: [ - {regex: /.*?\*\//, token: "comment", next: "start"}, - {regex: /.*/, token: "comment"} - ], - meta: { - dontIndentStates: ["comment"], - electricInput: /^\s*\}$/, - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: "//", - fold: "brace" - } -}); - - -CodeMirror.defineMIME("text/x-rustsrc", "rust"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/rust/test.js b/public/plugins/codemirror-5.17.0/mode/rust/test.js deleted file mode 100644 index eb256c4..0000000 --- a/public/plugins/codemirror-5.17.0/mode/rust/test.js +++ /dev/null @@ -1,39 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 4}, "rust"); - function MT(name) {test.mode(name, mode, Array.prototype.slice.call(arguments, 1));} - - MT('integer_test', - '[number 123i32]', - '[number 123u32]', - '[number 123_u32]', - '[number 0xff_u8]', - '[number 0o70_i16]', - '[number 0b1111_1111_1001_0000_i32]', - '[number 0usize]'); - - MT('float_test', - '[number 123.0f64]', - '[number 0.1f64]', - '[number 0.1f32]', - '[number 12E+99_f64]'); - - MT('string-literals-test', - '[string "foo"]', - '[string r"foo"]', - '[string "\\"foo\\""]', - '[string r#""foo""#]', - '[string "foo #\\"# bar"]', - - '[string b"foo"]', - '[string br"foo"]', - '[string b"\\"foo\\""]', - '[string br#""foo""#]', - '[string br##"foo #" bar"##]', - - "[string-2 'h']", - "[string-2 b'h']"); - -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/sas/index.html b/public/plugins/codemirror-5.17.0/mode/sas/index.html deleted file mode 100644 index 636e065..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sas/index.html +++ /dev/null @@ -1,81 +0,0 @@ - - -CodeMirror: SAS mode - - - - - - - - - - -
-

SAS mode

-
- - - -

MIME types defined: text/x-sas.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/sas/sas.js b/public/plugins/codemirror-5.17.0/mode/sas/sas.js deleted file mode 100755 index fe11482..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sas/sas.js +++ /dev/null @@ -1,315 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - - -// SAS mode copyright (c) 2016 Jared Dean, SAS Institute -// Created by Jared Dean - -// TODO -// indent and de-indent -// identify macro variables - - -//Definitions -// comment -- text withing * ; or /* */ -// keyword -- SAS language variable -// variable -- macro variables starts with '&' or variable formats -// variable-2 -- DATA Step, proc, or macro names -// string -- text within ' ' or " " -// operator -- numeric operator + / - * ** le eq ge ... and so on -// builtin -- proc %macro data run mend -// atom -// def - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("sas", function () { - var words = {}; - var isDoubleOperatorSym = { - eq: 'operator', - lt: 'operator', - le: 'operator', - gt: 'operator', - ge: 'operator', - "in": 'operator', - ne: 'operator', - or: 'operator' - }; - var isDoubleOperatorChar = /(<=|>=|!=|<>)/; - var isSingleOperatorChar = /[=\(:\),{}.*<>+\-\/^\[\]]/; - - // Takes a string of words separated by spaces and adds them as - // keys with the value of the first argument 'style' - function define(style, string, context) { - if (context) { - var split = string.split(' '); - for (var i = 0; i < split.length; i++) { - words[split[i]] = {style: style, state: context}; - } - } - } - //datastep - define('def', 'stack pgm view source debug nesting nolist', ['inDataStep']); - define('def', 'if while until for do do; end end; then else cancel', ['inDataStep']); - define('def', 'label format _n_ _error_', ['inDataStep']); - define('def', 'ALTER BUFNO BUFSIZE CNTLLEV COMPRESS DLDMGACTION ENCRYPT ENCRYPTKEY EXTENDOBSCOUNTER GENMAX GENNUM INDEX LABEL OBSBUF OUTREP PW PWREQ READ REPEMPTY REPLACE REUSE ROLE SORTEDBY SPILL TOBSNO TYPE WRITE FILECLOSE FIRSTOBS IN OBS POINTOBS WHERE WHEREUP IDXNAME IDXWHERE DROP KEEP RENAME', ['inDataStep']); - define('def', 'filevar finfo finv fipname fipnamel fipstate first firstobs floor', ['inDataStep']); - define('def', 'varfmt varinfmt varlabel varlen varname varnum varray varrayx vartype verify vformat vformatd vformatdx vformatn vformatnx vformatw vformatwx vformatx vinarray vinarrayx vinformat vinformatd vinformatdx vinformatn vinformatnx vinformatw vinformatwx vinformatx vlabel vlabelx vlength vlengthx vname vnamex vnferr vtype vtypex weekday', ['inDataStep']); - define('def', 'zipfips zipname zipnamel zipstate', ['inDataStep']); - define('def', 'put putc putn', ['inDataStep']); - define('builtin', 'data run', ['inDataStep']); - - - //proc - define('def', 'data', ['inProc']); - - // flow control for macros - define('def', '%if %end %end; %else %else; %do %do; %then', ['inMacro']); - - //everywhere - define('builtin', 'proc run; quit; libname filename %macro %mend option options', ['ALL']); - - define('def', 'footnote title libname ods', ['ALL']); - define('def', '%let %put %global %sysfunc %eval ', ['ALL']); - // automatic macro variables http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a003167023.htm - define('variable', '&sysbuffr &syscc &syscharwidth &syscmd &sysdate &sysdate9 &sysday &sysdevic &sysdmg &sysdsn &sysencoding &sysenv &syserr &syserrortext &sysfilrc &syshostname &sysindex &sysinfo &sysjobid &syslast &syslckrc &syslibrc &syslogapplname &sysmacroname &sysmenv &sysmsg &sysncpu &sysodspath &sysparm &syspbuff &sysprocessid &sysprocessname &sysprocname &sysrc &sysscp &sysscpl &sysscpl &syssite &sysstartid &sysstartname &systcpiphostname &systime &sysuserid &sysver &sysvlong &sysvlong4 &syswarningtext', ['ALL']); - - //footnote[1-9]? title[1-9]? - - //options statement - define('def', 'source2 nosource2 page pageno pagesize', ['ALL']); - - //proc and datastep - define('def', '_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref fmterr fmtsearch fnonct fnote font fontalias fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs on open order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2 paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps pw pwreq qtr quote r ranbin rancau ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni read recfm register regr remote remove rename repeat replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq min max', ['inDataStep', 'inProc']); - define('operator', 'and not ', ['inDataStep', 'inProc']); - - // Main function - function tokenize(stream, state) { - // Finally advance the stream - var ch = stream.next(); - - // BLOCKCOMMENT - if (ch === '/' && stream.eat('*')) { - state.continueComment = true; - return "comment"; - } else if (state.continueComment === true) { // in comment block - //comment ends at the beginning of the line - if (ch === '*' && stream.peek() === '/') { - stream.next(); - state.continueComment = false; - } else if (stream.skipTo('*')) { //comment is potentially later in line - stream.skipTo('*'); - stream.next(); - if (stream.eat('/')) - state.continueComment = false; - } else { - stream.skipToEnd(); - } - return "comment"; - } - - // DoubleOperator match - var doubleOperator = ch + stream.peek(); - - // Match all line comments. - var myString = stream.string; - var myRegexp = /(?:^\s*|[;]\s*)(\*.*?);/ig; - var match = myRegexp.exec(myString); - if (match !== null) { - if (match.index === 0 && (stream.column() !== (match.index + match[0].length - 1))) { - stream.backUp(stream.column()); - stream.skipTo(';'); - stream.next(); - return 'comment'; - } else if (match.index + 1 < stream.column() && stream.column() < match.index + match[0].length - 1) { - // the ';' triggers the match so move one past it to start - // the comment block that is why match.index+1 - stream.backUp(stream.column() - match.index - 1); - stream.skipTo(';'); - stream.next(); - return 'comment'; - } - } else if (!state.continueString && (ch === '"' || ch === "'")) { - // Have we found a string? - state.continueString = ch; //save the matching quote in the state - return "string"; - } else if (state.continueString !== null) { - if (stream.skipTo(state.continueString)) { - // quote found on this line - stream.next(); - state.continueString = null; - } else { - stream.skipToEnd(); - } - return "string"; - } else if (state.continueString !== null && stream.eol()) { - stream.skipTo(state.continueString) || stream.skipToEnd(); - return "string"; - } else if (/[\d\.]/.test(ch)) { //find numbers - if (ch === ".") - stream.match(/^[0-9]+([eE][\-+]?[0-9]+)?/); - else if (ch === "0") - stream.match(/^[xX][0-9a-fA-F]+/) || stream.match(/^0[0-7]+/); - else - stream.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/); - return "number"; - } else if (isDoubleOperatorChar.test(ch + stream.peek())) { // TWO SYMBOL TOKENS - stream.next(); - return "operator"; - } else if (isDoubleOperatorSym.hasOwnProperty(doubleOperator)) { - stream.next(); - if (stream.peek() === ' ') - return isDoubleOperatorSym[doubleOperator.toLowerCase()]; - } else if (isSingleOperatorChar.test(ch)) { // SINGLE SYMBOL TOKENS - return "operator"; - } - - // Matches one whole word -- even if the word is a character - var word; - if (stream.match(/[%&;\w]+/, false) != null) { - word = ch + stream.match(/[%&;\w]+/, true); - if (/&/.test(word)) return 'variable' - } else { - word = ch; - } - // the word after DATA PROC or MACRO - if (state.nextword) { - stream.match(/[\w]+/); - // match memname.libname - if (stream.peek() === '.') stream.skipTo(' '); - state.nextword = false; - return 'variable-2'; - - } - - // Are we in a DATA Step? - if (state.inDataStep) { - if (word.toLowerCase() === 'run;' || stream.match(/run\s;/)) { - state.inDataStep = false; - return 'builtin'; - } - // variable formats - if ((word) && stream.next() === '.') { - //either a format or libname.memname - if (/\w/.test(stream.peek())) return 'variable-2'; - else return 'variable'; - } - // do we have a DATA Step keyword - if (word && words.hasOwnProperty(word.toLowerCase()) && - (words[word.toLowerCase()].state.indexOf("inDataStep") !== -1 || - words[word.toLowerCase()].state.indexOf("ALL") !== -1)) { - //backup to the start of the word - if (stream.start < stream.pos) - stream.backUp(stream.pos - stream.start); - //advance the length of the word and return - for (var i = 0; i < word.length; ++i) stream.next(); - return words[word.toLowerCase()].style; - } - } - // Are we in an Proc statement? - if (state.inProc) { - if (word.toLowerCase() === 'run;' || word.toLowerCase() === 'quit;') { - state.inProc = false; - return 'builtin'; - } - // do we have a proc keyword - if (word && words.hasOwnProperty(word.toLowerCase()) && - (words[word.toLowerCase()].state.indexOf("inProc") !== -1 || - words[word.toLowerCase()].state.indexOf("ALL") !== -1)) { - stream.match(/[\w]+/); - return words[word].style; - } - } - // Are we in a Macro statement? - if (state.inMacro) { - if (word.toLowerCase() === '%mend') { - if (stream.peek() === ';') stream.next(); - state.inMacro = false; - return 'builtin'; - } - if (word && words.hasOwnProperty(word.toLowerCase()) && - (words[word.toLowerCase()].state.indexOf("inMacro") !== -1 || - words[word.toLowerCase()].state.indexOf("ALL") !== -1)) { - stream.match(/[\w]+/); - return words[word.toLowerCase()].style; - } - - return 'atom'; - } - // Do we have Keywords specific words? - if (word && words.hasOwnProperty(word.toLowerCase())) { - // Negates the initial next() - stream.backUp(1); - // Actually move the stream - stream.match(/[\w]+/); - if (word.toLowerCase() === 'data' && /=/.test(stream.peek()) === false) { - state.inDataStep = true; - state.nextword = true; - return 'builtin'; - } - if (word.toLowerCase() === 'proc') { - state.inProc = true; - state.nextword = true; - return 'builtin'; - } - if (word.toLowerCase() === '%macro') { - state.inMacro = true; - state.nextword = true; - return 'builtin'; - } - if (/title[1-9]/i.test(word)) return 'def'; - - if (word.toLowerCase() === 'footnote') { - stream.eat(/[1-9]/); - return 'def'; - } - - // Returns their value as state in the prior define methods - if (state.inDataStep === true && words[word.toLowerCase()].state.indexOf("inDataStep") !== -1) - return words[word.toLowerCase()].style; - if (state.inProc === true && words[word.toLowerCase()].state.indexOf("inProc") !== -1) - return words[word.toLowerCase()].style; - if (state.inMacro === true && words[word.toLowerCase()].state.indexOf("inMacro") !== -1) - return words[word.toLowerCase()].style; - if (words[word.toLowerCase()].state.indexOf("ALL") !== -1) - return words[word.toLowerCase()].style; - return null; - } - // Unrecognized syntax - return null; - } - - return { - startState: function () { - return { - inDataStep: false, - inProc: false, - inMacro: false, - nextword: false, - continueString: null, - continueComment: false - }; - }, - token: function (stream, state) { - // Strip the spaces, but regex will account for them either way - if (stream.eatSpace()) return null; - // Go through the main process - return tokenize(stream, state); - }, - - blockCommentStart: "/*", - blockCommentEnd: "*/" - }; - - }); - - CodeMirror.defineMIME("text/x-sas", "sas"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/sass/index.html b/public/plugins/codemirror-5.17.0/mode/sass/index.html deleted file mode 100644 index 9f4a790..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sass/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - -CodeMirror: Sass mode - - - - - - - - - - -
-

Sass mode

-
- - -

MIME types defined: text/x-sass.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/sass/sass.js b/public/plugins/codemirror-5.17.0/mode/sass/sass.js deleted file mode 100644 index 6973ece..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sass/sass.js +++ /dev/null @@ -1,414 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("sass", function(config) { - function tokenRegexp(words) { - return new RegExp("^" + words.join("|")); - } - - var keywords = ["true", "false", "null", "auto"]; - var keywordsRegexp = new RegExp("^" + keywords.join("|")); - - var operators = ["\\(", "\\)", "=", ">", "<", "==", ">=", "<=", "\\+", "-", - "\\!=", "/", "\\*", "%", "and", "or", "not", ";","\\{","\\}",":"]; - var opRegexp = tokenRegexp(operators); - - var pseudoElementsRegexp = /^::?[a-zA-Z_][\w\-]*/; - - function urlTokens(stream, state) { - var ch = stream.peek(); - - if (ch === ")") { - stream.next(); - state.tokenizer = tokenBase; - return "operator"; - } else if (ch === "(") { - stream.next(); - stream.eatSpace(); - - return "operator"; - } else if (ch === "'" || ch === '"') { - state.tokenizer = buildStringTokenizer(stream.next()); - return "string"; - } else { - state.tokenizer = buildStringTokenizer(")", false); - return "string"; - } - } - function comment(indentation, multiLine) { - return function(stream, state) { - if (stream.sol() && stream.indentation() <= indentation) { - state.tokenizer = tokenBase; - return tokenBase(stream, state); - } - - if (multiLine && stream.skipTo("*/")) { - stream.next(); - stream.next(); - state.tokenizer = tokenBase; - } else { - stream.skipToEnd(); - } - - return "comment"; - }; - } - - function buildStringTokenizer(quote, greedy) { - if (greedy == null) { greedy = true; } - - function stringTokenizer(stream, state) { - var nextChar = stream.next(); - var peekChar = stream.peek(); - var previousChar = stream.string.charAt(stream.pos-2); - - var endingString = ((nextChar !== "\\" && peekChar === quote) || (nextChar === quote && previousChar !== "\\")); - - if (endingString) { - if (nextChar !== quote && greedy) { stream.next(); } - state.tokenizer = tokenBase; - return "string"; - } else if (nextChar === "#" && peekChar === "{") { - state.tokenizer = buildInterpolationTokenizer(stringTokenizer); - stream.next(); - return "operator"; - } else { - return "string"; - } - } - - return stringTokenizer; - } - - function buildInterpolationTokenizer(currentTokenizer) { - return function(stream, state) { - if (stream.peek() === "}") { - stream.next(); - state.tokenizer = currentTokenizer; - return "operator"; - } else { - return tokenBase(stream, state); - } - }; - } - - function indent(state) { - if (state.indentCount == 0) { - state.indentCount++; - var lastScopeOffset = state.scopes[0].offset; - var currentOffset = lastScopeOffset + config.indentUnit; - state.scopes.unshift({ offset:currentOffset }); - } - } - - function dedent(state) { - if (state.scopes.length == 1) return; - - state.scopes.shift(); - } - - function tokenBase(stream, state) { - var ch = stream.peek(); - - // Comment - if (stream.match("/*")) { - state.tokenizer = comment(stream.indentation(), true); - return state.tokenizer(stream, state); - } - if (stream.match("//")) { - state.tokenizer = comment(stream.indentation(), false); - return state.tokenizer(stream, state); - } - - // Interpolation - if (stream.match("#{")) { - state.tokenizer = buildInterpolationTokenizer(tokenBase); - return "operator"; - } - - // Strings - if (ch === '"' || ch === "'") { - stream.next(); - state.tokenizer = buildStringTokenizer(ch); - return "string"; - } - - if(!state.cursorHalf){// state.cursorHalf === 0 - // first half i.e. before : for key-value pairs - // including selectors - - if (ch === ".") { - stream.next(); - if (stream.match(/^[\w-]+/)) { - indent(state); - return "atom"; - } else if (stream.peek() === "#") { - indent(state); - return "atom"; - } - } - - if (ch === "#") { - stream.next(); - // ID selectors - if (stream.match(/^[\w-]+/)) { - indent(state); - return "atom"; - } - if (stream.peek() === "#") { - indent(state); - return "atom"; - } - } - - // Variables - if (ch === "$") { - stream.next(); - stream.eatWhile(/[\w-]/); - return "variable-2"; - } - - // Numbers - if (stream.match(/^-?[0-9\.]+/)) - return "number"; - - // Units - if (stream.match(/^(px|em|in)\b/)) - return "unit"; - - if (stream.match(keywordsRegexp)) - return "keyword"; - - if (stream.match(/^url/) && stream.peek() === "(") { - state.tokenizer = urlTokens; - return "atom"; - } - - if (ch === "=") { - // Match shortcut mixin definition - if (stream.match(/^=[\w-]+/)) { - indent(state); - return "meta"; - } - } - - if (ch === "+") { - // Match shortcut mixin definition - if (stream.match(/^\+[\w-]+/)){ - return "variable-3"; - } - } - - if(ch === "@"){ - if(stream.match(/@extend/)){ - if(!stream.match(/\s*[\w]/)) - dedent(state); - } - } - - - // Indent Directives - if (stream.match(/^@(else if|if|media|else|for|each|while|mixin|function)/)) { - indent(state); - return "meta"; - } - - // Other Directives - if (ch === "@") { - stream.next(); - stream.eatWhile(/[\w-]/); - return "meta"; - } - - if (stream.eatWhile(/[\w-]/)){ - if(stream.match(/ *: *[\w-\+\$#!\("']/,false)){ - return "property"; - } - else if(stream.match(/ *:/,false)){ - indent(state); - state.cursorHalf = 1; - return "atom"; - } - else if(stream.match(/ *,/,false)){ - return "atom"; - } - else{ - indent(state); - return "atom"; - } - } - - if(ch === ":"){ - if (stream.match(pseudoElementsRegexp)){ // could be a pseudo-element - return "keyword"; - } - stream.next(); - state.cursorHalf=1; - return "operator"; - } - - } // cursorHalf===0 ends here - else{ - - if (ch === "#") { - stream.next(); - // Hex numbers - if (stream.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/)){ - if(!stream.peek()){ - state.cursorHalf = 0; - } - return "number"; - } - } - - // Numbers - if (stream.match(/^-?[0-9\.]+/)){ - if(!stream.peek()){ - state.cursorHalf = 0; - } - return "number"; - } - - // Units - if (stream.match(/^(px|em|in)\b/)){ - if(!stream.peek()){ - state.cursorHalf = 0; - } - return "unit"; - } - - if (stream.match(keywordsRegexp)){ - if(!stream.peek()){ - state.cursorHalf = 0; - } - return "keyword"; - } - - if (stream.match(/^url/) && stream.peek() === "(") { - state.tokenizer = urlTokens; - if(!stream.peek()){ - state.cursorHalf = 0; - } - return "atom"; - } - - // Variables - if (ch === "$") { - stream.next(); - stream.eatWhile(/[\w-]/); - if(!stream.peek()){ - state.cursorHalf = 0; - } - return "variable-3"; - } - - // bang character for !important, !default, etc. - if (ch === "!") { - stream.next(); - if(!stream.peek()){ - state.cursorHalf = 0; - } - return stream.match(/^[\w]+/) ? "keyword": "operator"; - } - - if (stream.match(opRegexp)){ - if(!stream.peek()){ - state.cursorHalf = 0; - } - return "operator"; - } - - // attributes - if (stream.eatWhile(/[\w-]/)) { - if(!stream.peek()){ - state.cursorHalf = 0; - } - return "attribute"; - } - - //stream.eatSpace(); - if(!stream.peek()){ - state.cursorHalf = 0; - return null; - } - - } // else ends here - - if (stream.match(opRegexp)) - return "operator"; - - // If we haven't returned by now, we move 1 character - // and return an error - stream.next(); - return null; - } - - function tokenLexer(stream, state) { - if (stream.sol()) state.indentCount = 0; - var style = state.tokenizer(stream, state); - var current = stream.current(); - - if (current === "@return" || current === "}"){ - dedent(state); - } - - if (style !== null) { - var startOfToken = stream.pos - current.length; - - var withCurrentIndent = startOfToken + (config.indentUnit * state.indentCount); - - var newScopes = []; - - for (var i = 0; i < state.scopes.length; i++) { - var scope = state.scopes[i]; - - if (scope.offset <= withCurrentIndent) - newScopes.push(scope); - } - - state.scopes = newScopes; - } - - - return style; - } - - return { - startState: function() { - return { - tokenizer: tokenBase, - scopes: [{offset: 0, type: "sass"}], - indentCount: 0, - cursorHalf: 0, // cursor half tells us if cursor lies after (1) - // or before (0) colon (well... more or less) - definedVars: [], - definedMixins: [] - }; - }, - token: function(stream, state) { - var style = tokenLexer(stream, state); - - state.lastToken = { style: style, content: stream.current() }; - - return style; - }, - - indent: function(state) { - return state.scopes[0].offset; - } - }; -}); - -CodeMirror.defineMIME("text/x-sass", "sass"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/scheme/index.html b/public/plugins/codemirror-5.17.0/mode/scheme/index.html deleted file mode 100644 index 04d5c6a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/scheme/index.html +++ /dev/null @@ -1,77 +0,0 @@ - - -CodeMirror: Scheme mode - - - - - - - - - -
-

Scheme mode

-
- - -

MIME types defined: text/x-scheme.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/scheme/scheme.js b/public/plugins/codemirror-5.17.0/mode/scheme/scheme.js deleted file mode 100644 index 2234645..0000000 --- a/public/plugins/codemirror-5.17.0/mode/scheme/scheme.js +++ /dev/null @@ -1,249 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/** - * Author: Koh Zi Han, based on implementation by Koh Zi Chun - */ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("scheme", function () { - var BUILTIN = "builtin", COMMENT = "comment", STRING = "string", - ATOM = "atom", NUMBER = "number", BRACKET = "bracket"; - var INDENT_WORD_SKIP = 2; - - function makeKeywords(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - var keywords = makeKeywords("λ case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"); - var indentKeys = makeKeywords("define let letrec let* lambda"); - - function stateStack(indent, type, prev) { // represents a state stack object - this.indent = indent; - this.type = type; - this.prev = prev; - } - - function pushStack(state, indent, type) { - state.indentStack = new stateStack(indent, type, state.indentStack); - } - - function popStack(state) { - state.indentStack = state.indentStack.prev; - } - - var binaryMatcher = new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\/[01]+#*)?i|[-+]?[01]+#*(?:\/[01]+#*)?@[-+]?[01]+#*(?:\/[01]+#*)?|[-+]?[01]+#*(?:\/[01]+#*)?[-+](?:[01]+#*(?:\/[01]+#*)?)?i|[-+]?[01]+#*(?:\/[01]+#*)?)(?=[()\s;"]|$)/i); - var octalMatcher = new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\/[0-7]+#*)?)(?=[()\s;"]|$)/i); - var hexMatcher = new RegExp(/^(?:[-+]i|[-+][\da-f]+#*(?:\/[\da-f]+#*)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?@[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?[-+](?:[\da-f]+#*(?:\/[\da-f]+#*)?)?i|[-+]?[\da-f]+#*(?:\/[\da-f]+#*)?)(?=[()\s;"]|$)/i); - var decimalMatcher = new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)i|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)@[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)|[-+]?(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)[-+](?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*)?i|(?:(?:(?:\d+#+\.?#*|\d+\.\d*#*|\.\d+#*|\d+)(?:[esfdl][-+]?\d+)?)|\d+#*\/\d+#*))(?=[()\s;"]|$)/i); - - function isBinaryNumber (stream) { - return stream.match(binaryMatcher); - } - - function isOctalNumber (stream) { - return stream.match(octalMatcher); - } - - function isDecimalNumber (stream, backup) { - if (backup === true) { - stream.backUp(1); - } - return stream.match(decimalMatcher); - } - - function isHexNumber (stream) { - return stream.match(hexMatcher); - } - - return { - startState: function () { - return { - indentStack: null, - indentation: 0, - mode: false, - sExprComment: false - }; - }, - - token: function (stream, state) { - if (state.indentStack == null && stream.sol()) { - // update indentation, but only if indentStack is empty - state.indentation = stream.indentation(); - } - - // skip spaces - if (stream.eatSpace()) { - return null; - } - var returnType = null; - - switch(state.mode){ - case "string": // multi-line string parsing mode - var next, escaped = false; - while ((next = stream.next()) != null) { - if (next == "\"" && !escaped) { - - state.mode = false; - break; - } - escaped = !escaped && next == "\\"; - } - returnType = STRING; // continue on in scheme-string mode - break; - case "comment": // comment parsing mode - var next, maybeEnd = false; - while ((next = stream.next()) != null) { - if (next == "#" && maybeEnd) { - - state.mode = false; - break; - } - maybeEnd = (next == "|"); - } - returnType = COMMENT; - break; - case "s-expr-comment": // s-expr commenting mode - state.mode = false; - if(stream.peek() == "(" || stream.peek() == "["){ - // actually start scheme s-expr commenting mode - state.sExprComment = 0; - }else{ - // if not we just comment the entire of the next token - stream.eatWhile(/[^/s]/); // eat non spaces - returnType = COMMENT; - break; - } - default: // default parsing mode - var ch = stream.next(); - - if (ch == "\"") { - state.mode = "string"; - returnType = STRING; - - } else if (ch == "'") { - returnType = ATOM; - } else if (ch == '#') { - if (stream.eat("|")) { // Multi-line comment - state.mode = "comment"; // toggle to comment mode - returnType = COMMENT; - } else if (stream.eat(/[tf]/i)) { // #t/#f (atom) - returnType = ATOM; - } else if (stream.eat(';')) { // S-Expr comment - state.mode = "s-expr-comment"; - returnType = COMMENT; - } else { - var numTest = null, hasExactness = false, hasRadix = true; - if (stream.eat(/[ei]/i)) { - hasExactness = true; - } else { - stream.backUp(1); // must be radix specifier - } - if (stream.match(/^#b/i)) { - numTest = isBinaryNumber; - } else if (stream.match(/^#o/i)) { - numTest = isOctalNumber; - } else if (stream.match(/^#x/i)) { - numTest = isHexNumber; - } else if (stream.match(/^#d/i)) { - numTest = isDecimalNumber; - } else if (stream.match(/^[-+0-9.]/, false)) { - hasRadix = false; - numTest = isDecimalNumber; - // re-consume the intial # if all matches failed - } else if (!hasExactness) { - stream.eat('#'); - } - if (numTest != null) { - if (hasRadix && !hasExactness) { - // consume optional exactness after radix - stream.match(/^#[ei]/i); - } - if (numTest(stream)) - returnType = NUMBER; - } - } - } else if (/^[-+0-9.]/.test(ch) && isDecimalNumber(stream, true)) { // match non-prefixed number, must be decimal - returnType = NUMBER; - } else if (ch == ";") { // comment - stream.skipToEnd(); // rest of the line is a comment - returnType = COMMENT; - } else if (ch == "(" || ch == "[") { - var keyWord = ''; var indentTemp = stream.column(), letter; - /** - Either - (indent-word .. - (non-indent-word .. - (;something else, bracket, etc. - */ - - while ((letter = stream.eat(/[^\s\(\[\;\)\]]/)) != null) { - keyWord += letter; - } - - if (keyWord.length > 0 && indentKeys.propertyIsEnumerable(keyWord)) { // indent-word - - pushStack(state, indentTemp + INDENT_WORD_SKIP, ch); - } else { // non-indent word - // we continue eating the spaces - stream.eatSpace(); - if (stream.eol() || stream.peek() == ";") { - // nothing significant after - // we restart indentation 1 space after - pushStack(state, indentTemp + 1, ch); - } else { - pushStack(state, indentTemp + stream.current().length, ch); // else we match - } - } - stream.backUp(stream.current().length - 1); // undo all the eating - - if(typeof state.sExprComment == "number") state.sExprComment++; - - returnType = BRACKET; - } else if (ch == ")" || ch == "]") { - returnType = BRACKET; - if (state.indentStack != null && state.indentStack.type == (ch == ")" ? "(" : "[")) { - popStack(state); - - if(typeof state.sExprComment == "number"){ - if(--state.sExprComment == 0){ - returnType = COMMENT; // final closing bracket - state.sExprComment = false; // turn off s-expr commenting mode - } - } - } - } else { - stream.eatWhile(/[\w\$_\-!$%&*+\.\/:<=>?@\^~]/); - - if (keywords && keywords.propertyIsEnumerable(stream.current())) { - returnType = BUILTIN; - } else returnType = "variable"; - } - } - return (typeof state.sExprComment == "number") ? COMMENT : returnType; - }, - - indent: function (state) { - if (state.indentStack == null) return state.indentation; - return state.indentStack.indent; - }, - - closeBrackets: {pairs: "()[]{}\"\""}, - lineComment: ";;" - }; -}); - -CodeMirror.defineMIME("text/x-scheme", "scheme"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/shell/index.html b/public/plugins/codemirror-5.17.0/mode/shell/index.html deleted file mode 100644 index 0b56300..0000000 --- a/public/plugins/codemirror-5.17.0/mode/shell/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - -CodeMirror: Shell mode - - - - - - - - - - -
-

Shell mode

- - - - - - -

MIME types defined: text/x-sh.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/shell/shell.js b/public/plugins/codemirror-5.17.0/mode/shell/shell.js deleted file mode 100644 index a684e8c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/shell/shell.js +++ /dev/null @@ -1,139 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('shell', function() { - - var words = {}; - function define(style, string) { - var split = string.split(' '); - for(var i = 0; i < split.length; i++) { - words[split[i]] = style; - } - }; - - // Atoms - define('atom', 'true false'); - - // Keywords - define('keyword', 'if then do else elif while until for in esac fi fin ' + - 'fil done exit set unset export function'); - - // Commands - define('builtin', 'ab awk bash beep cat cc cd chown chmod chroot clear cp ' + - 'curl cut diff echo find gawk gcc get git grep kill killall ln ls make ' + - 'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh ' + - 'shopt shred source sort sleep ssh start stop su sudo tee telnet top ' + - 'touch vi vim wall wc wget who write yes zsh'); - - function tokenBase(stream, state) { - if (stream.eatSpace()) return null; - - var sol = stream.sol(); - var ch = stream.next(); - - if (ch === '\\') { - stream.next(); - return null; - } - if (ch === '\'' || ch === '"' || ch === '`') { - state.tokens.unshift(tokenString(ch)); - return tokenize(stream, state); - } - if (ch === '#') { - if (sol && stream.eat('!')) { - stream.skipToEnd(); - return 'meta'; // 'comment'? - } - stream.skipToEnd(); - return 'comment'; - } - if (ch === '$') { - state.tokens.unshift(tokenDollar); - return tokenize(stream, state); - } - if (ch === '+' || ch === '=') { - return 'operator'; - } - if (ch === '-') { - stream.eat('-'); - stream.eatWhile(/\w/); - return 'attribute'; - } - if (/\d/.test(ch)) { - stream.eatWhile(/\d/); - if(stream.eol() || !/\w/.test(stream.peek())) { - return 'number'; - } - } - stream.eatWhile(/[\w-]/); - var cur = stream.current(); - if (stream.peek() === '=' && /\w+/.test(cur)) return 'def'; - return words.hasOwnProperty(cur) ? words[cur] : null; - } - - function tokenString(quote) { - return function(stream, state) { - var next, end = false, escaped = false; - while ((next = stream.next()) != null) { - if (next === quote && !escaped) { - end = true; - break; - } - if (next === '$' && !escaped && quote !== '\'') { - escaped = true; - stream.backUp(1); - state.tokens.unshift(tokenDollar); - break; - } - escaped = !escaped && next === '\\'; - } - if (end || !escaped) { - state.tokens.shift(); - } - return (quote === '`' || quote === ')' ? 'quote' : 'string'); - }; - }; - - var tokenDollar = function(stream, state) { - if (state.tokens.length > 1) stream.eat('$'); - var ch = stream.next(), hungry = /\w/; - if (ch === '{') hungry = /[^}]/; - if (ch === '(') { - state.tokens[0] = tokenString(')'); - return tokenize(stream, state); - } - if (!/\d/.test(ch)) { - stream.eatWhile(hungry); - stream.eat('}'); - } - state.tokens.shift(); - return 'def'; - }; - - function tokenize(stream, state) { - return (state.tokens[0] || tokenBase) (stream, state); - }; - - return { - startState: function() {return {tokens:[]};}, - token: function(stream, state) { - return tokenize(stream, state); - }, - lineComment: '#', - fold: "brace" - }; -}); - -CodeMirror.defineMIME('text/x-sh', 'shell'); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/shell/test.js b/public/plugins/codemirror-5.17.0/mode/shell/test.js deleted file mode 100644 index a413b5a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/shell/test.js +++ /dev/null @@ -1,58 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({}, "shell"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT("var", - "text [def $var] text"); - MT("varBraces", - "text[def ${var}]text"); - MT("varVar", - "text [def $a$b] text"); - MT("varBracesVarBraces", - "text[def ${a}${b}]text"); - - MT("singleQuotedVar", - "[string 'text $var text']"); - MT("singleQuotedVarBraces", - "[string 'text ${var} text']"); - - MT("doubleQuotedVar", - '[string "text ][def $var][string text"]'); - MT("doubleQuotedVarBraces", - '[string "text][def ${var}][string text"]'); - MT("doubleQuotedVarPunct", - '[string "text ][def $@][string text"]'); - MT("doubleQuotedVarVar", - '[string "][def $a$b][string "]'); - MT("doubleQuotedVarBracesVarBraces", - '[string "][def ${a}${b}][string "]'); - - MT("notAString", - "text\\'text"); - MT("escapes", - "outside\\'\\\"\\`\\\\[string \"inside\\`\\'\\\"\\\\`\\$notAVar\"]outside\\$\\(notASubShell\\)"); - - MT("subshell", - "[builtin echo] [quote $(whoami)] s log, stardate [quote `date`]."); - MT("doubleQuotedSubshell", - "[builtin echo] [string \"][quote $(whoami)][string 's log, stardate `date`.\"]"); - - MT("hashbang", - "[meta #!/bin/bash]"); - MT("comment", - "text [comment # Blurb]"); - - MT("numbers", - "[number 0] [number 1] [number 2]"); - MT("keywords", - "[keyword while] [atom true]; [keyword do]", - " [builtin sleep] [number 3]", - "[keyword done]"); - MT("options", - "[builtin ls] [attribute -l] [attribute --human-readable]"); - MT("operator", - "[def var][operator =]value"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/sieve/index.html b/public/plugins/codemirror-5.17.0/mode/sieve/index.html deleted file mode 100644 index 6f029b6..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sieve/index.html +++ /dev/null @@ -1,93 +0,0 @@ - - -CodeMirror: Sieve (RFC5228) mode - - - - - - - - - -
-

Sieve (RFC5228) mode

-
- - -

MIME types defined: application/sieve.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/sieve/sieve.js b/public/plugins/codemirror-5.17.0/mode/sieve/sieve.js deleted file mode 100644 index f67db2f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sieve/sieve.js +++ /dev/null @@ -1,193 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("sieve", function(config) { - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - var keywords = words("if elsif else stop require"); - var atoms = words("true false not"); - var indentUnit = config.indentUnit; - - function tokenBase(stream, state) { - - var ch = stream.next(); - if (ch == "/" && stream.eat("*")) { - state.tokenize = tokenCComment; - return tokenCComment(stream, state); - } - - if (ch === '#') { - stream.skipToEnd(); - return "comment"; - } - - if (ch == "\"") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - - if (ch == "(") { - state._indent.push("("); - // add virtual angel wings so that editor behaves... - // ...more sane incase of broken brackets - state._indent.push("{"); - return null; - } - - if (ch === "{") { - state._indent.push("{"); - return null; - } - - if (ch == ")") { - state._indent.pop(); - state._indent.pop(); - } - - if (ch === "}") { - state._indent.pop(); - return null; - } - - if (ch == ",") - return null; - - if (ch == ";") - return null; - - - if (/[{}\(\),;]/.test(ch)) - return null; - - // 1*DIGIT "K" / "M" / "G" - if (/\d/.test(ch)) { - stream.eatWhile(/[\d]/); - stream.eat(/[KkMmGg]/); - return "number"; - } - - // ":" (ALPHA / "_") *(ALPHA / DIGIT / "_") - if (ch == ":") { - stream.eatWhile(/[a-zA-Z_]/); - stream.eatWhile(/[a-zA-Z0-9_]/); - - return "operator"; - } - - stream.eatWhile(/\w/); - var cur = stream.current(); - - // "text:" *(SP / HTAB) (hash-comment / CRLF) - // *(multiline-literal / multiline-dotstart) - // "." CRLF - if ((cur == "text") && stream.eat(":")) - { - state.tokenize = tokenMultiLineString; - return "string"; - } - - if (keywords.propertyIsEnumerable(cur)) - return "keyword"; - - if (atoms.propertyIsEnumerable(cur)) - return "atom"; - - return null; - } - - function tokenMultiLineString(stream, state) - { - state._multiLineString = true; - // the first line is special it may contain a comment - if (!stream.sol()) { - stream.eatSpace(); - - if (stream.peek() == "#") { - stream.skipToEnd(); - return "comment"; - } - - stream.skipToEnd(); - return "string"; - } - - if ((stream.next() == ".") && (stream.eol())) - { - state._multiLineString = false; - state.tokenize = tokenBase; - } - - return "string"; - } - - function tokenCComment(stream, state) { - var maybeEnd = false, ch; - while ((ch = stream.next()) != null) { - if (maybeEnd && ch == "/") { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) - break; - escaped = !escaped && ch == "\\"; - } - if (!escaped) state.tokenize = tokenBase; - return "string"; - }; - } - - return { - startState: function(base) { - return {tokenize: tokenBase, - baseIndent: base || 0, - _indent: []}; - }, - - token: function(stream, state) { - if (stream.eatSpace()) - return null; - - return (state.tokenize || tokenBase)(stream, state);; - }, - - indent: function(state, _textAfter) { - var length = state._indent.length; - if (_textAfter && (_textAfter[0] == "}")) - length--; - - if (length <0) - length = 0; - - return length * indentUnit; - }, - - electricChars: "}" - }; -}); - -CodeMirror.defineMIME("application/sieve", "sieve"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/slim/index.html b/public/plugins/codemirror-5.17.0/mode/slim/index.html deleted file mode 100644 index 7fa4e50..0000000 --- a/public/plugins/codemirror-5.17.0/mode/slim/index.html +++ /dev/null @@ -1,96 +0,0 @@ - - -CodeMirror: SLIM mode - - - - - - - - - - - - - - - - - - - - -
-

SLIM mode

-
- - -

MIME types defined: application/x-slim.

- -

- Parsing/Highlighting Tests: - normal, - verbose. -

-
diff --git a/public/plugins/codemirror-5.17.0/mode/slim/slim.js b/public/plugins/codemirror-5.17.0/mode/slim/slim.js deleted file mode 100644 index 991a97e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/slim/slim.js +++ /dev/null @@ -1,575 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), require("../ruby/ruby")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../htmlmixed/htmlmixed", "../ruby/ruby"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - - CodeMirror.defineMode("slim", function(config) { - var htmlMode = CodeMirror.getMode(config, {name: "htmlmixed"}); - var rubyMode = CodeMirror.getMode(config, "ruby"); - var modes = { html: htmlMode, ruby: rubyMode }; - var embedded = { - ruby: "ruby", - javascript: "javascript", - css: "text/css", - sass: "text/x-sass", - scss: "text/x-scss", - less: "text/x-less", - styl: "text/x-styl", // no highlighting so far - coffee: "coffeescript", - asciidoc: "text/x-asciidoc", - markdown: "text/x-markdown", - textile: "text/x-textile", // no highlighting so far - creole: "text/x-creole", // no highlighting so far - wiki: "text/x-wiki", // no highlighting so far - mediawiki: "text/x-mediawiki", // no highlighting so far - rdoc: "text/x-rdoc", // no highlighting so far - builder: "text/x-builder", // no highlighting so far - nokogiri: "text/x-nokogiri", // no highlighting so far - erb: "application/x-erb" - }; - var embeddedRegexp = function(map){ - var arr = []; - for(var key in map) arr.push(key); - return new RegExp("^("+arr.join('|')+"):"); - }(embedded); - - var styleMap = { - "commentLine": "comment", - "slimSwitch": "operator special", - "slimTag": "tag", - "slimId": "attribute def", - "slimClass": "attribute qualifier", - "slimAttribute": "attribute", - "slimSubmode": "keyword special", - "closeAttributeTag": null, - "slimDoctype": null, - "lineContinuation": null - }; - var closing = { - "{": "}", - "[": "]", - "(": ")" - }; - - var nameStartChar = "_a-zA-Z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD"; - var nameChar = nameStartChar + "\\-0-9\xB7\u0300-\u036F\u203F-\u2040"; - var nameRegexp = new RegExp("^[:"+nameStartChar+"](?::["+nameChar+"]|["+nameChar+"]*)"); - var attributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*(?=\\s*=)"); - var wrappedAttributeNameRegexp = new RegExp("^[:"+nameStartChar+"][:\\."+nameChar+"]*"); - var classNameRegexp = /^\.-?[_a-zA-Z]+[\w\-]*/; - var classIdRegexp = /^#[_a-zA-Z]+[\w\-]*/; - - function backup(pos, tokenize, style) { - var restore = function(stream, state) { - state.tokenize = tokenize; - if (stream.pos < pos) { - stream.pos = pos; - return style; - } - return state.tokenize(stream, state); - }; - return function(stream, state) { - state.tokenize = restore; - return tokenize(stream, state); - }; - } - - function maybeBackup(stream, state, pat, offset, style) { - var cur = stream.current(); - var idx = cur.search(pat); - if (idx > -1) { - state.tokenize = backup(stream.pos, state.tokenize, style); - stream.backUp(cur.length - idx - offset); - } - return style; - } - - function continueLine(state, column) { - state.stack = { - parent: state.stack, - style: "continuation", - indented: column, - tokenize: state.line - }; - state.line = state.tokenize; - } - function finishContinue(state) { - if (state.line == state.tokenize) { - state.line = state.stack.tokenize; - state.stack = state.stack.parent; - } - } - - function lineContinuable(column, tokenize) { - return function(stream, state) { - finishContinue(state); - if (stream.match(/^\\$/)) { - continueLine(state, column); - return "lineContinuation"; - } - var style = tokenize(stream, state); - if (stream.eol() && stream.current().match(/(?:^|[^\\])(?:\\\\)*\\$/)) { - stream.backUp(1); - } - return style; - }; - } - function commaContinuable(column, tokenize) { - return function(stream, state) { - finishContinue(state); - var style = tokenize(stream, state); - if (stream.eol() && stream.current().match(/,$/)) { - continueLine(state, column); - } - return style; - }; - } - - function rubyInQuote(endQuote, tokenize) { - // TODO: add multi line support - return function(stream, state) { - var ch = stream.peek(); - if (ch == endQuote && state.rubyState.tokenize.length == 1) { - // step out of ruby context as it seems to complete processing all the braces - stream.next(); - state.tokenize = tokenize; - return "closeAttributeTag"; - } else { - return ruby(stream, state); - } - }; - } - function startRubySplat(tokenize) { - var rubyState; - var runSplat = function(stream, state) { - if (state.rubyState.tokenize.length == 1 && !state.rubyState.context.prev) { - stream.backUp(1); - if (stream.eatSpace()) { - state.rubyState = rubyState; - state.tokenize = tokenize; - return tokenize(stream, state); - } - stream.next(); - } - return ruby(stream, state); - }; - return function(stream, state) { - rubyState = state.rubyState; - state.rubyState = CodeMirror.startState(rubyMode); - state.tokenize = runSplat; - return ruby(stream, state); - }; - } - - function ruby(stream, state) { - return rubyMode.token(stream, state.rubyState); - } - - function htmlLine(stream, state) { - if (stream.match(/^\\$/)) { - return "lineContinuation"; - } - return html(stream, state); - } - function html(stream, state) { - if (stream.match(/^#\{/)) { - state.tokenize = rubyInQuote("}", state.tokenize); - return null; - } - return maybeBackup(stream, state, /[^\\]#\{/, 1, htmlMode.token(stream, state.htmlState)); - } - - function startHtmlLine(lastTokenize) { - return function(stream, state) { - var style = htmlLine(stream, state); - if (stream.eol()) state.tokenize = lastTokenize; - return style; - }; - } - - function startHtmlMode(stream, state, offset) { - state.stack = { - parent: state.stack, - style: "html", - indented: stream.column() + offset, // pipe + space - tokenize: state.line - }; - state.line = state.tokenize = html; - return null; - } - - function comment(stream, state) { - stream.skipToEnd(); - return state.stack.style; - } - - function commentMode(stream, state) { - state.stack = { - parent: state.stack, - style: "comment", - indented: state.indented + 1, - tokenize: state.line - }; - state.line = comment; - return comment(stream, state); - } - - function attributeWrapper(stream, state) { - if (stream.eat(state.stack.endQuote)) { - state.line = state.stack.line; - state.tokenize = state.stack.tokenize; - state.stack = state.stack.parent; - return null; - } - if (stream.match(wrappedAttributeNameRegexp)) { - state.tokenize = attributeWrapperAssign; - return "slimAttribute"; - } - stream.next(); - return null; - } - function attributeWrapperAssign(stream, state) { - if (stream.match(/^==?/)) { - state.tokenize = attributeWrapperValue; - return null; - } - return attributeWrapper(stream, state); - } - function attributeWrapperValue(stream, state) { - var ch = stream.peek(); - if (ch == '"' || ch == "\'") { - state.tokenize = readQuoted(ch, "string", true, false, attributeWrapper); - stream.next(); - return state.tokenize(stream, state); - } - if (ch == '[') { - return startRubySplat(attributeWrapper)(stream, state); - } - if (stream.match(/^(true|false|nil)\b/)) { - state.tokenize = attributeWrapper; - return "keyword"; - } - return startRubySplat(attributeWrapper)(stream, state); - } - - function startAttributeWrapperMode(state, endQuote, tokenize) { - state.stack = { - parent: state.stack, - style: "wrapper", - indented: state.indented + 1, - tokenize: tokenize, - line: state.line, - endQuote: endQuote - }; - state.line = state.tokenize = attributeWrapper; - return null; - } - - function sub(stream, state) { - if (stream.match(/^#\{/)) { - state.tokenize = rubyInQuote("}", state.tokenize); - return null; - } - var subStream = new CodeMirror.StringStream(stream.string.slice(state.stack.indented), stream.tabSize); - subStream.pos = stream.pos - state.stack.indented; - subStream.start = stream.start - state.stack.indented; - subStream.lastColumnPos = stream.lastColumnPos - state.stack.indented; - subStream.lastColumnValue = stream.lastColumnValue - state.stack.indented; - var style = state.subMode.token(subStream, state.subState); - stream.pos = subStream.pos + state.stack.indented; - return style; - } - function firstSub(stream, state) { - state.stack.indented = stream.column(); - state.line = state.tokenize = sub; - return state.tokenize(stream, state); - } - - function createMode(mode) { - var query = embedded[mode]; - var spec = CodeMirror.mimeModes[query]; - if (spec) { - return CodeMirror.getMode(config, spec); - } - var factory = CodeMirror.modes[query]; - if (factory) { - return factory(config, {name: query}); - } - return CodeMirror.getMode(config, "null"); - } - - function getMode(mode) { - if (!modes.hasOwnProperty(mode)) { - return modes[mode] = createMode(mode); - } - return modes[mode]; - } - - function startSubMode(mode, state) { - var subMode = getMode(mode); - var subState = CodeMirror.startState(subMode); - - state.subMode = subMode; - state.subState = subState; - - state.stack = { - parent: state.stack, - style: "sub", - indented: state.indented + 1, - tokenize: state.line - }; - state.line = state.tokenize = firstSub; - return "slimSubmode"; - } - - function doctypeLine(stream, _state) { - stream.skipToEnd(); - return "slimDoctype"; - } - - function startLine(stream, state) { - var ch = stream.peek(); - if (ch == '<') { - return (state.tokenize = startHtmlLine(state.tokenize))(stream, state); - } - if (stream.match(/^[|']/)) { - return startHtmlMode(stream, state, 1); - } - if (stream.match(/^\/(!|\[\w+])?/)) { - return commentMode(stream, state); - } - if (stream.match(/^(-|==?[<>]?)/)) { - state.tokenize = lineContinuable(stream.column(), commaContinuable(stream.column(), ruby)); - return "slimSwitch"; - } - if (stream.match(/^doctype\b/)) { - state.tokenize = doctypeLine; - return "keyword"; - } - - var m = stream.match(embeddedRegexp); - if (m) { - return startSubMode(m[1], state); - } - - return slimTag(stream, state); - } - - function slim(stream, state) { - if (state.startOfLine) { - return startLine(stream, state); - } - return slimTag(stream, state); - } - - function slimTag(stream, state) { - if (stream.eat('*')) { - state.tokenize = startRubySplat(slimTagExtras); - return null; - } - if (stream.match(nameRegexp)) { - state.tokenize = slimTagExtras; - return "slimTag"; - } - return slimClass(stream, state); - } - function slimTagExtras(stream, state) { - if (stream.match(/^(<>?|> state.indented && state.last != "slimSubmode") { - state.line = state.tokenize = state.stack.tokenize; - state.stack = state.stack.parent; - state.subMode = null; - state.subState = null; - } - } - if (stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - state.startOfLine = false; - if (style) state.last = style; - return styleMap.hasOwnProperty(style) ? styleMap[style] : style; - }, - - blankLine: function(state) { - if (state.subMode && state.subMode.blankLine) { - return state.subMode.blankLine(state.subState); - } - }, - - innerMode: function(state) { - if (state.subMode) return {state: state.subState, mode: state.subMode}; - return {state: state, mode: mode}; - } - - //indent: function(state) { - // return state.indented; - //} - }; - return mode; - }, "htmlmixed", "ruby"); - - CodeMirror.defineMIME("text/x-slim", "slim"); - CodeMirror.defineMIME("application/x-slim", "slim"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/slim/test.js b/public/plugins/codemirror-5.17.0/mode/slim/test.js deleted file mode 100644 index be4ddac..0000000 --- a/public/plugins/codemirror-5.17.0/mode/slim/test.js +++ /dev/null @@ -1,96 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Slim Highlighting for CodeMirror copyright (c) HicknHack Software Gmbh - -(function() { - var mode = CodeMirror.getMode({tabSize: 4, indentUnit: 2}, "slim"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - // Requires at least one media query - MT("elementName", - "[tag h1] Hey There"); - - MT("oneElementPerLine", - "[tag h1] Hey There .h2"); - - MT("idShortcut", - "[attribute&def #test] Hey There"); - - MT("tagWithIdShortcuts", - "[tag h1][attribute&def #test] Hey There"); - - MT("classShortcut", - "[attribute&qualifier .hello] Hey There"); - - MT("tagWithIdAndClassShortcuts", - "[tag h1][attribute&def #test][attribute&qualifier .hello] Hey There"); - - MT("docType", - "[keyword doctype] xml"); - - MT("comment", - "[comment / Hello WORLD]"); - - MT("notComment", - "[tag h1] This is not a / comment "); - - MT("attributes", - "[tag a]([attribute title]=[string \"test\"]) [attribute href]=[string \"link\"]}"); - - MT("multiLineAttributes", - "[tag a]([attribute title]=[string \"test\"]", - " ) [attribute href]=[string \"link\"]}"); - - MT("htmlCode", - "[tag&bracket <][tag h1][tag&bracket >]Title[tag&bracket ]"); - - MT("rubyBlock", - "[operator&special =][variable-2 @item]"); - - MT("selectorRubyBlock", - "[tag a][attribute&qualifier .test][operator&special =] [variable-2 @item]"); - - MT("nestedRubyBlock", - "[tag a]", - " [operator&special =][variable puts] [string \"test\"]"); - - MT("multilinePlaintext", - "[tag p]", - " | Hello,", - " World"); - - MT("multilineRuby", - "[tag p]", - " [comment /# this is a comment]", - " [comment and this is a comment too]", - " | Date/Time", - " [operator&special -] [variable now] [operator =] [tag DateTime][operator .][property now]", - " [tag strong][operator&special =] [variable now]", - " [operator&special -] [keyword if] [variable now] [operator >] [tag DateTime][operator .][property parse]([string \"December 31, 2006\"])", - " [operator&special =][string \"Happy\"]", - " [operator&special =][string \"Belated\"]", - " [operator&special =][string \"Birthday\"]"); - - MT("multilineComment", - "[comment /]", - " [comment Multiline]", - " [comment Comment]"); - - MT("hamlAfterRubyTag", - "[attribute&qualifier .block]", - " [tag strong][operator&special =] [variable now]", - " [attribute&qualifier .test]", - " [operator&special =][variable now]", - " [attribute&qualifier .right]"); - - MT("stretchedRuby", - "[operator&special =] [variable puts] [string \"Hello\"],", - " [string \"World\"]"); - - MT("interpolationInHashAttribute", - "[tag div]{[attribute id] = [string \"]#{[variable test]}[string _]#{[variable ting]}[string \"]} test"); - - MT("interpolationInHTMLAttribute", - "[tag div]([attribute title]=[string \"]#{[variable test]}[string _]#{[variable ting]()}[string \"]) Test"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/smalltalk/index.html b/public/plugins/codemirror-5.17.0/mode/smalltalk/index.html deleted file mode 100644 index 2155ebc..0000000 --- a/public/plugins/codemirror-5.17.0/mode/smalltalk/index.html +++ /dev/null @@ -1,68 +0,0 @@ - - -CodeMirror: Smalltalk mode - - - - - - - - - - -
-

Smalltalk mode

-
- - - -

Simple Smalltalk mode.

- -

MIME types defined: text/x-stsrc.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/smalltalk/smalltalk.js b/public/plugins/codemirror-5.17.0/mode/smalltalk/smalltalk.js deleted file mode 100644 index bb510ba..0000000 --- a/public/plugins/codemirror-5.17.0/mode/smalltalk/smalltalk.js +++ /dev/null @@ -1,168 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('smalltalk', function(config) { - - var specialChars = /[+\-\/\\*~<>=@%|&?!.,:;^]/; - var keywords = /true|false|nil|self|super|thisContext/; - - var Context = function(tokenizer, parent) { - this.next = tokenizer; - this.parent = parent; - }; - - var Token = function(name, context, eos) { - this.name = name; - this.context = context; - this.eos = eos; - }; - - var State = function() { - this.context = new Context(next, null); - this.expectVariable = true; - this.indentation = 0; - this.userIndentationDelta = 0; - }; - - State.prototype.userIndent = function(indentation) { - this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0; - }; - - var next = function(stream, context, state) { - var token = new Token(null, context, false); - var aChar = stream.next(); - - if (aChar === '"') { - token = nextComment(stream, new Context(nextComment, context)); - - } else if (aChar === '\'') { - token = nextString(stream, new Context(nextString, context)); - - } else if (aChar === '#') { - if (stream.peek() === '\'') { - stream.next(); - token = nextSymbol(stream, new Context(nextSymbol, context)); - } else { - if (stream.eatWhile(/[^\s.{}\[\]()]/)) - token.name = 'string-2'; - else - token.name = 'meta'; - } - - } else if (aChar === '$') { - if (stream.next() === '<') { - stream.eatWhile(/[^\s>]/); - stream.next(); - } - token.name = 'string-2'; - - } else if (aChar === '|' && state.expectVariable) { - token.context = new Context(nextTemporaries, context); - - } else if (/[\[\]{}()]/.test(aChar)) { - token.name = 'bracket'; - token.eos = /[\[{(]/.test(aChar); - - if (aChar === '[') { - state.indentation++; - } else if (aChar === ']') { - state.indentation = Math.max(0, state.indentation - 1); - } - - } else if (specialChars.test(aChar)) { - stream.eatWhile(specialChars); - token.name = 'operator'; - token.eos = aChar !== ';'; // ; cascaded message expression - - } else if (/\d/.test(aChar)) { - stream.eatWhile(/[\w\d]/); - token.name = 'number'; - - } else if (/[\w_]/.test(aChar)) { - stream.eatWhile(/[\w\d_]/); - token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null; - - } else { - token.eos = state.expectVariable; - } - - return token; - }; - - var nextComment = function(stream, context) { - stream.eatWhile(/[^"]/); - return new Token('comment', stream.eat('"') ? context.parent : context, true); - }; - - var nextString = function(stream, context) { - stream.eatWhile(/[^']/); - return new Token('string', stream.eat('\'') ? context.parent : context, false); - }; - - var nextSymbol = function(stream, context) { - stream.eatWhile(/[^']/); - return new Token('string-2', stream.eat('\'') ? context.parent : context, false); - }; - - var nextTemporaries = function(stream, context) { - var token = new Token(null, context, false); - var aChar = stream.next(); - - if (aChar === '|') { - token.context = context.parent; - token.eos = true; - - } else { - stream.eatWhile(/[^|]/); - token.name = 'variable'; - } - - return token; - }; - - return { - startState: function() { - return new State; - }, - - token: function(stream, state) { - state.userIndent(stream.indentation()); - - if (stream.eatSpace()) { - return null; - } - - var token = state.context.next(stream, state.context, state); - state.context = token.context; - state.expectVariable = token.eos; - - return token.name; - }, - - blankLine: function(state) { - state.userIndent(0); - }, - - indent: function(state, textAfter) { - var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta; - return (state.indentation + i) * config.indentUnit; - }, - - electricChars: ']' - }; - -}); - -CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'}); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/smarty/index.html b/public/plugins/codemirror-5.17.0/mode/smarty/index.html deleted file mode 100644 index b19c8f0..0000000 --- a/public/plugins/codemirror-5.17.0/mode/smarty/index.html +++ /dev/null @@ -1,138 +0,0 @@ - - -CodeMirror: Smarty mode - - - - - - - - - - -
-

Smarty mode

-
- -

Mode for Smarty version 2 or 3, which allows for custom delimiter tags.

- -

Several configuration parameters are supported:

- -
    -
  • leftDelimiter and rightDelimiter, - which should be strings that determine where the Smarty syntax - starts and ends.
  • -
  • version, which should be 2 or 3.
  • -
  • baseMode, which can be a mode spec - like "text/html" to set a different background mode.
  • -
- -

MIME types defined: text/x-smarty

- -

Smarty 2, custom delimiters

- -
- -

Smarty 3

- - - - - -
diff --git a/public/plugins/codemirror-5.17.0/mode/smarty/smarty.js b/public/plugins/codemirror-5.17.0/mode/smarty/smarty.js deleted file mode 100644 index 6e0fbed..0000000 --- a/public/plugins/codemirror-5.17.0/mode/smarty/smarty.js +++ /dev/null @@ -1,225 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/** - * Smarty 2 and 3 mode. - */ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("smarty", function(config, parserConf) { - var rightDelimiter = parserConf.rightDelimiter || "}"; - var leftDelimiter = parserConf.leftDelimiter || "{"; - var version = parserConf.version || 2; - var baseMode = CodeMirror.getMode(config, parserConf.baseMode || "null"); - - var keyFunctions = ["debug", "extends", "function", "include", "literal"]; - var regs = { - operatorChars: /[+\-*&%=<>!?]/, - validIdentifier: /[a-zA-Z0-9_]/, - stringChar: /['"]/ - }; - - var last; - function cont(style, lastType) { - last = lastType; - return style; - } - - function chain(stream, state, parser) { - state.tokenize = parser; - return parser(stream, state); - } - - // Smarty 3 allows { and } surrounded by whitespace to NOT slip into Smarty mode - function doesNotCount(stream, pos) { - if (pos == null) pos = stream.pos; - return version === 3 && leftDelimiter == "{" && - (pos == stream.string.length || /\s/.test(stream.string.charAt(pos))); - } - - function tokenTop(stream, state) { - var string = stream.string; - for (var scan = stream.pos;;) { - var nextMatch = string.indexOf(leftDelimiter, scan); - scan = nextMatch + leftDelimiter.length; - if (nextMatch == -1 || !doesNotCount(stream, nextMatch + leftDelimiter.length)) break; - } - if (nextMatch == stream.pos) { - stream.match(leftDelimiter); - if (stream.eat("*")) { - return chain(stream, state, tokenBlock("comment", "*" + rightDelimiter)); - } else { - state.depth++; - state.tokenize = tokenSmarty; - last = "startTag"; - return "tag"; - } - } - - if (nextMatch > -1) stream.string = string.slice(0, nextMatch); - var token = baseMode.token(stream, state.base); - if (nextMatch > -1) stream.string = string; - return token; - } - - // parsing Smarty content - function tokenSmarty(stream, state) { - if (stream.match(rightDelimiter, true)) { - if (version === 3) { - state.depth--; - if (state.depth <= 0) { - state.tokenize = tokenTop; - } - } else { - state.tokenize = tokenTop; - } - return cont("tag", null); - } - - if (stream.match(leftDelimiter, true)) { - state.depth++; - return cont("tag", "startTag"); - } - - var ch = stream.next(); - if (ch == "$") { - stream.eatWhile(regs.validIdentifier); - return cont("variable-2", "variable"); - } else if (ch == "|") { - return cont("operator", "pipe"); - } else if (ch == ".") { - return cont("operator", "property"); - } else if (regs.stringChar.test(ch)) { - state.tokenize = tokenAttribute(ch); - return cont("string", "string"); - } else if (regs.operatorChars.test(ch)) { - stream.eatWhile(regs.operatorChars); - return cont("operator", "operator"); - } else if (ch == "[" || ch == "]") { - return cont("bracket", "bracket"); - } else if (ch == "(" || ch == ")") { - return cont("bracket", "operator"); - } else if (/\d/.test(ch)) { - stream.eatWhile(/\d/); - return cont("number", "number"); - } else { - - if (state.last == "variable") { - if (ch == "@") { - stream.eatWhile(regs.validIdentifier); - return cont("property", "property"); - } else if (ch == "|") { - stream.eatWhile(regs.validIdentifier); - return cont("qualifier", "modifier"); - } - } else if (state.last == "pipe") { - stream.eatWhile(regs.validIdentifier); - return cont("qualifier", "modifier"); - } else if (state.last == "whitespace") { - stream.eatWhile(regs.validIdentifier); - return cont("attribute", "modifier"); - } if (state.last == "property") { - stream.eatWhile(regs.validIdentifier); - return cont("property", null); - } else if (/\s/.test(ch)) { - last = "whitespace"; - return null; - } - - var str = ""; - if (ch != "/") { - str += ch; - } - var c = null; - while (c = stream.eat(regs.validIdentifier)) { - str += c; - } - for (var i=0, j=keyFunctions.length; i - -CodeMirror: Solr mode - - - - - - - - - -
-

Solr mode

- -
- -
- - - -

MIME types defined: text/x-solr.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/solr/solr.js b/public/plugins/codemirror-5.17.0/mode/solr/solr.js deleted file mode 100644 index f7f7087..0000000 --- a/public/plugins/codemirror-5.17.0/mode/solr/solr.js +++ /dev/null @@ -1,104 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("solr", function() { - "use strict"; - - var isStringChar = /[^\s\|\!\+\-\*\?\~\^\&\:\(\)\[\]\{\}\^\"\\]/; - var isOperatorChar = /[\|\!\+\-\*\?\~\^\&]/; - var isOperatorString = /^(OR|AND|NOT|TO)$/i; - - function isNumber(word) { - return parseFloat(word, 10).toString() === word; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) break; - escaped = !escaped && next == "\\"; - } - - if (!escaped) state.tokenize = tokenBase; - return "string"; - }; - } - - function tokenOperator(operator) { - return function(stream, state) { - var style = "operator"; - if (operator == "+") - style += " positive"; - else if (operator == "-") - style += " negative"; - else if (operator == "|") - stream.eat(/\|/); - else if (operator == "&") - stream.eat(/\&/); - else if (operator == "^") - style += " boost"; - - state.tokenize = tokenBase; - return style; - }; - } - - function tokenWord(ch) { - return function(stream, state) { - var word = ch; - while ((ch = stream.peek()) && ch.match(isStringChar) != null) { - word += stream.next(); - } - - state.tokenize = tokenBase; - if (isOperatorString.test(word)) - return "operator"; - else if (isNumber(word)) - return "number"; - else if (stream.peek() == ":") - return "field"; - else - return "string"; - }; - } - - function tokenBase(stream, state) { - var ch = stream.next(); - if (ch == '"') - state.tokenize = tokenString(ch); - else if (isOperatorChar.test(ch)) - state.tokenize = tokenOperator(ch); - else if (isStringChar.test(ch)) - state.tokenize = tokenWord(ch); - - return (state.tokenize != tokenBase) ? state.tokenize(stream, state) : null; - } - - return { - startState: function() { - return { - tokenize: tokenBase - }; - }, - - token: function(stream, state) { - if (stream.eatSpace()) return null; - return state.tokenize(stream, state); - } - }; -}); - -CodeMirror.defineMIME("text/x-solr", "solr"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/soy/index.html b/public/plugins/codemirror-5.17.0/mode/soy/index.html deleted file mode 100644 index f0216f0..0000000 --- a/public/plugins/codemirror-5.17.0/mode/soy/index.html +++ /dev/null @@ -1,68 +0,0 @@ - - -CodeMirror: Soy (Closure Template) mode - - - - - - - - - - - - - - -
-

Soy (Closure Template) mode

-
- - - -

A mode for Closure Templates (Soy).

-

MIME type defined: text/x-soy.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/soy/soy.js b/public/plugins/codemirror-5.17.0/mode/soy/soy.js deleted file mode 100644 index 580c306..0000000 --- a/public/plugins/codemirror-5.17.0/mode/soy/soy.js +++ /dev/null @@ -1,199 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../htmlmixed/htmlmixed"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - var indentingTags = ["template", "literal", "msg", "fallbackmsg", "let", "if", "elseif", - "else", "switch", "case", "default", "foreach", "ifempty", "for", - "call", "param", "deltemplate", "delcall", "log"]; - - CodeMirror.defineMode("soy", function(config) { - var textMode = CodeMirror.getMode(config, "text/plain"); - var modes = { - html: CodeMirror.getMode(config, {name: "text/html", multilineTagIndentFactor: 2, multilineTagIndentPastTag: false}), - attributes: textMode, - text: textMode, - uri: textMode, - css: CodeMirror.getMode(config, "text/css"), - js: CodeMirror.getMode(config, {name: "text/javascript", statementIndent: 2 * config.indentUnit}) - }; - - function last(array) { - return array[array.length - 1]; - } - - function tokenUntil(stream, state, untilRegExp) { - var oldString = stream.string; - var match = untilRegExp.exec(oldString.substr(stream.pos)); - if (match) { - // We don't use backUp because it backs up just the position, not the state. - // This uses an undocumented API. - stream.string = oldString.substr(0, stream.pos + match.index); - } - var result = stream.hideFirstChars(state.indent, function() { - return state.localMode.token(stream, state.localState); - }); - stream.string = oldString; - return result; - } - - return { - startState: function() { - return { - kind: [], - kindTag: [], - soyState: [], - indent: 0, - localMode: modes.html, - localState: CodeMirror.startState(modes.html) - }; - }, - - copyState: function(state) { - return { - tag: state.tag, // Last seen Soy tag. - kind: state.kind.concat([]), // Values of kind="" attributes. - kindTag: state.kindTag.concat([]), // Opened tags with kind="" attributes. - soyState: state.soyState.concat([]), - indent: state.indent, // Indentation of the following line. - localMode: state.localMode, - localState: CodeMirror.copyState(state.localMode, state.localState) - }; - }, - - token: function(stream, state) { - var match; - - switch (last(state.soyState)) { - case "comment": - if (stream.match(/^.*?\*\//)) { - state.soyState.pop(); - } else { - stream.skipToEnd(); - } - return "comment"; - - case "variable": - if (stream.match(/^}/)) { - state.indent -= 2 * config.indentUnit; - state.soyState.pop(); - return "variable-2"; - } - stream.next(); - return null; - - case "tag": - if (stream.match(/^\/?}/)) { - if (state.tag == "/template" || state.tag == "/deltemplate") state.indent = 0; - else state.indent -= (stream.current() == "/}" || indentingTags.indexOf(state.tag) == -1 ? 2 : 1) * config.indentUnit; - state.soyState.pop(); - return "keyword"; - } else if (stream.match(/^([\w?]+)(?==)/)) { - if (stream.current() == "kind" && (match = stream.match(/^="([^"]+)/, false))) { - var kind = match[1]; - state.kind.push(kind); - state.kindTag.push(state.tag); - state.localMode = modes[kind] || modes.html; - state.localState = CodeMirror.startState(state.localMode); - } - return "attribute"; - } else if (stream.match(/^"/)) { - state.soyState.push("string"); - return "string"; - } - stream.next(); - return null; - - case "literal": - if (stream.match(/^(?=\{\/literal})/)) { - state.indent -= config.indentUnit; - state.soyState.pop(); - return this.token(stream, state); - } - return tokenUntil(stream, state, /\{\/literal}/); - - case "string": - var match = stream.match(/^.*?("|\\[\s\S])/); - if (!match) { - stream.skipToEnd(); - } else if (match[1] == "\"") { - state.soyState.pop(); - } - return "string"; - } - - if (stream.match(/^\/\*/)) { - state.soyState.push("comment"); - return "comment"; - } else if (stream.match(stream.sol() ? /^\s*\/\/.*/ : /^\s+\/\/.*/)) { - return "comment"; - } else if (stream.match(/^\{\$[\w?]*/)) { - state.indent += 2 * config.indentUnit; - state.soyState.push("variable"); - return "variable-2"; - } else if (stream.match(/^\{literal}/)) { - state.indent += config.indentUnit; - state.soyState.push("literal"); - return "keyword"; - } else if (match = stream.match(/^\{([\/@\\]?[\w?]*)/)) { - if (match[1] != "/switch") - state.indent += (/^(\/|(else|elseif|case|default)$)/.test(match[1]) && state.tag != "switch" ? 1 : 2) * config.indentUnit; - state.tag = match[1]; - if (state.tag == "/" + last(state.kindTag)) { - // We found the tag that opened the current kind="". - state.kind.pop(); - state.kindTag.pop(); - state.localMode = modes[last(state.kind)] || modes.html; - state.localState = CodeMirror.startState(state.localMode); - } - state.soyState.push("tag"); - return "keyword"; - } - - return tokenUntil(stream, state, /\{|\s+\/\/|\/\*/); - }, - - indent: function(state, textAfter) { - var indent = state.indent, top = last(state.soyState); - if (top == "comment") return CodeMirror.Pass; - - if (top == "literal") { - if (/^\{\/literal}/.test(textAfter)) indent -= config.indentUnit; - } else { - if (/^\s*\{\/(template|deltemplate)\b/.test(textAfter)) return 0; - if (/^\{(\/|(fallbackmsg|elseif|else|ifempty)\b)/.test(textAfter)) indent -= config.indentUnit; - if (state.tag != "switch" && /^\{(case|default)\b/.test(textAfter)) indent -= config.indentUnit; - if (/^\{\/switch\b/.test(textAfter)) indent -= config.indentUnit; - } - if (indent && state.localMode.indent) - indent += state.localMode.indent(state.localState, textAfter); - return indent; - }, - - innerMode: function(state) { - if (state.soyState.length && last(state.soyState) != "literal") return null; - else return {state: state.localState, mode: state.localMode}; - }, - - electricInput: /^\s*\{(\/|\/template|\/deltemplate|\/switch|fallbackmsg|elseif|else|case|default|ifempty|\/literal\})$/, - lineComment: "//", - blockCommentStart: "/*", - blockCommentEnd: "*/", - blockCommentContinue: " * ", - fold: "indent" - }; - }, "htmlmixed"); - - CodeMirror.registerHelper("hintWords", "soy", indentingTags.concat( - ["delpackage", "namespace", "alias", "print", "css", "debugger"])); - - CodeMirror.defineMIME("text/x-soy", "soy"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/sparql/index.html b/public/plugins/codemirror-5.17.0/mode/sparql/index.html deleted file mode 100644 index 84ef4d3..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sparql/index.html +++ /dev/null @@ -1,61 +0,0 @@ - - -CodeMirror: SPARQL mode - - - - - - - - - - -
-

SPARQL mode

-
- - -

MIME types defined: application/sparql-query.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/sparql/sparql.js b/public/plugins/codemirror-5.17.0/mode/sparql/sparql.js deleted file mode 100644 index 095dcca..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sparql/sparql.js +++ /dev/null @@ -1,180 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("sparql", function(config) { - var indentUnit = config.indentUnit; - var curPunc; - - function wordRegexp(words) { - return new RegExp("^(?:" + words.join("|") + ")$", "i"); - } - var ops = wordRegexp(["str", "lang", "langmatches", "datatype", "bound", "sameterm", "isiri", "isuri", - "iri", "uri", "bnode", "count", "sum", "min", "max", "avg", "sample", - "group_concat", "rand", "abs", "ceil", "floor", "round", "concat", "substr", "strlen", - "replace", "ucase", "lcase", "encode_for_uri", "contains", "strstarts", "strends", - "strbefore", "strafter", "year", "month", "day", "hours", "minutes", "seconds", - "timezone", "tz", "now", "uuid", "struuid", "md5", "sha1", "sha256", "sha384", - "sha512", "coalesce", "if", "strlang", "strdt", "isnumeric", "regex", "exists", - "isblank", "isliteral", "a", "bind"]); - var keywords = wordRegexp(["base", "prefix", "select", "distinct", "reduced", "construct", "describe", - "ask", "from", "named", "where", "order", "limit", "offset", "filter", "optional", - "graph", "by", "asc", "desc", "as", "having", "undef", "values", "group", - "minus", "in", "not", "service", "silent", "using", "insert", "delete", "union", - "true", "false", "with", - "data", "copy", "to", "move", "add", "create", "drop", "clear", "load"]); - var operatorChars = /[*+\-<>=&|\^\/!\?]/; - - function tokenBase(stream, state) { - var ch = stream.next(); - curPunc = null; - if (ch == "$" || ch == "?") { - if(ch == "?" && stream.match(/\s/, false)){ - return "operator"; - } - stream.match(/^[\w\d]*/); - return "variable-2"; - } - else if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { - stream.match(/^[^\s\u00a0>]*>?/); - return "atom"; - } - else if (ch == "\"" || ch == "'") { - state.tokenize = tokenLiteral(ch); - return state.tokenize(stream, state); - } - else if (/[{}\(\),\.;\[\]]/.test(ch)) { - curPunc = ch; - return "bracket"; - } - else if (ch == "#") { - stream.skipToEnd(); - return "comment"; - } - else if (operatorChars.test(ch)) { - stream.eatWhile(operatorChars); - return "operator"; - } - else if (ch == ":") { - stream.eatWhile(/[\w\d\._\-]/); - return "atom"; - } - else if (ch == "@") { - stream.eatWhile(/[a-z\d\-]/i); - return "meta"; - } - else { - stream.eatWhile(/[_\w\d]/); - if (stream.eat(":")) { - stream.eatWhile(/[\w\d_\-]/); - return "atom"; - } - var word = stream.current(); - if (ops.test(word)) - return "builtin"; - else if (keywords.test(word)) - return "keyword"; - else - return "variable"; - } - } - - function tokenLiteral(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) { - state.tokenize = tokenBase; - break; - } - escaped = !escaped && ch == "\\"; - } - return "string"; - }; - } - - function pushContext(state, type, col) { - state.context = {prev: state.context, indent: state.indent, col: col, type: type}; - } - function popContext(state) { - state.indent = state.context.indent; - state.context = state.context.prev; - } - - return { - startState: function() { - return {tokenize: tokenBase, - context: null, - indent: 0, - col: 0}; - }, - - token: function(stream, state) { - if (stream.sol()) { - if (state.context && state.context.align == null) state.context.align = false; - state.indent = stream.indentation(); - } - if (stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - - if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { - state.context.align = true; - } - - if (curPunc == "(") pushContext(state, ")", stream.column()); - else if (curPunc == "[") pushContext(state, "]", stream.column()); - else if (curPunc == "{") pushContext(state, "}", stream.column()); - else if (/[\]\}\)]/.test(curPunc)) { - while (state.context && state.context.type == "pattern") popContext(state); - if (state.context && curPunc == state.context.type) { - popContext(state); - if (curPunc == "}" && state.context && state.context.type == "pattern") - popContext(state); - } - } - else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); - else if (/atom|string|variable/.test(style) && state.context) { - if (/[\}\]]/.test(state.context.type)) - pushContext(state, "pattern", stream.column()); - else if (state.context.type == "pattern" && !state.context.align) { - state.context.align = true; - state.context.col = stream.column(); - } - } - - return style; - }, - - indent: function(state, textAfter) { - var firstChar = textAfter && textAfter.charAt(0); - var context = state.context; - if (/[\]\}]/.test(firstChar)) - while (context && context.type == "pattern") context = context.prev; - - var closing = context && firstChar == context.type; - if (!context) - return 0; - else if (context.type == "pattern") - return context.col; - else if (context.align) - return context.col + (closing ? 0 : 1); - else - return context.indent + (closing ? 0 : indentUnit); - }, - - lineComment: "#" - }; -}); - -CodeMirror.defineMIME("application/sparql-query", "sparql"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/spreadsheet/index.html b/public/plugins/codemirror-5.17.0/mode/spreadsheet/index.html deleted file mode 100644 index a52f76f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/spreadsheet/index.html +++ /dev/null @@ -1,42 +0,0 @@ - - -CodeMirror: Spreadsheet mode - - - - - - - - - - -
-

Spreadsheet mode

-
- - - -

MIME types defined: text/x-spreadsheet.

- -

The Spreadsheet Mode

-

Created by Robert Plummer

-
diff --git a/public/plugins/codemirror-5.17.0/mode/spreadsheet/spreadsheet.js b/public/plugins/codemirror-5.17.0/mode/spreadsheet/spreadsheet.js deleted file mode 100644 index 222f297..0000000 --- a/public/plugins/codemirror-5.17.0/mode/spreadsheet/spreadsheet.js +++ /dev/null @@ -1,112 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("spreadsheet", function () { - return { - startState: function () { - return { - stringType: null, - stack: [] - }; - }, - token: function (stream, state) { - if (!stream) return; - - //check for state changes - if (state.stack.length === 0) { - //strings - if ((stream.peek() == '"') || (stream.peek() == "'")) { - state.stringType = stream.peek(); - stream.next(); // Skip quote - state.stack.unshift("string"); - } - } - - //return state - //stack has - switch (state.stack[0]) { - case "string": - while (state.stack[0] === "string" && !stream.eol()) { - if (stream.peek() === state.stringType) { - stream.next(); // Skip quote - state.stack.shift(); // Clear flag - } else if (stream.peek() === "\\") { - stream.next(); - stream.next(); - } else { - stream.match(/^.[^\\\"\']*/); - } - } - return "string"; - - case "characterClass": - while (state.stack[0] === "characterClass" && !stream.eol()) { - if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) - state.stack.shift(); - } - return "operator"; - } - - var peek = stream.peek(); - - //no stack - switch (peek) { - case "[": - stream.next(); - state.stack.unshift("characterClass"); - return "bracket"; - case ":": - stream.next(); - return "operator"; - case "\\": - if (stream.match(/\\[a-z]+/)) return "string-2"; - else { - stream.next(); - return "atom"; - } - case ".": - case ",": - case ";": - case "*": - case "-": - case "+": - case "^": - case "<": - case "/": - case "=": - stream.next(); - return "atom"; - case "$": - stream.next(); - return "builtin"; - } - - if (stream.match(/\d+/)) { - if (stream.match(/^\w+/)) return "error"; - return "number"; - } else if (stream.match(/^[a-zA-Z_]\w*/)) { - if (stream.match(/(?=[\(.])/, false)) return "keyword"; - return "variable-2"; - } else if (["[", "]", "(", ")", "{", "}"].indexOf(peek) != -1) { - stream.next(); - return "bracket"; - } else if (!stream.eatSpace()) { - stream.next(); - } - return null; - } - }; - }); - - CodeMirror.defineMIME("text/x-spreadsheet", "spreadsheet"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/sql/index.html b/public/plugins/codemirror-5.17.0/mode/sql/index.html deleted file mode 100644 index dba069d..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sql/index.html +++ /dev/null @@ -1,86 +0,0 @@ - - -CodeMirror: SQL Mode for CodeMirror - - - - - - - - - - - - -
-

SQL Mode for CodeMirror

-
- - -

MIME types defined: - text/x-sql, - text/x-mysql, - text/x-mariadb, - text/x-cassandra, - text/x-plsql, - text/x-mssql, - text/x-hive, - text/x-pgsql, - text/x-gql. -

- - -
diff --git a/public/plugins/codemirror-5.17.0/mode/sql/sql.js b/public/plugins/codemirror-5.17.0/mode/sql/sql.js deleted file mode 100644 index 01ebd80..0000000 --- a/public/plugins/codemirror-5.17.0/mode/sql/sql.js +++ /dev/null @@ -1,413 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("sql", function(config, parserConfig) { - "use strict"; - - var client = parserConfig.client || {}, - atoms = parserConfig.atoms || {"false": true, "true": true, "null": true}, - builtin = parserConfig.builtin || {}, - keywords = parserConfig.keywords || {}, - operatorChars = parserConfig.operatorChars || /^[*+\-%<>!=&|~^]/, - support = parserConfig.support || {}, - hooks = parserConfig.hooks || {}, - dateSQL = parserConfig.dateSQL || {"date" : true, "time" : true, "timestamp" : true}; - - function tokenBase(stream, state) { - var ch = stream.next(); - - // call hooks from the mime type - if (hooks[ch]) { - var result = hooks[ch](stream, state); - if (result !== false) return result; - } - - if (support.hexNumber == true && - ((ch == "0" && stream.match(/^[xX][0-9a-fA-F]+/)) - || (ch == "x" || ch == "X") && stream.match(/^'[0-9a-fA-F]+'/))) { - // hex - // ref: http://dev.mysql.com/doc/refman/5.5/en/hexadecimal-literals.html - return "number"; - } else if (support.binaryNumber == true && - (((ch == "b" || ch == "B") && stream.match(/^'[01]+'/)) - || (ch == "0" && stream.match(/^b[01]+/)))) { - // bitstring - // ref: http://dev.mysql.com/doc/refman/5.5/en/bit-field-literals.html - return "number"; - } else if (ch.charCodeAt(0) > 47 && ch.charCodeAt(0) < 58) { - // numbers - // ref: http://dev.mysql.com/doc/refman/5.5/en/number-literals.html - stream.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/); - support.decimallessFloat == true && stream.eat('.'); - return "number"; - } else if (ch == "?" && (stream.eatSpace() || stream.eol() || stream.eat(";"))) { - // placeholders - return "variable-3"; - } else if (ch == "'" || (ch == '"' && support.doubleQuote)) { - // strings - // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html - state.tokenize = tokenLiteral(ch); - return state.tokenize(stream, state); - } else if ((((support.nCharCast == true && (ch == "n" || ch == "N")) - || (support.charsetCast == true && ch == "_" && stream.match(/[a-z][a-z0-9]*/i))) - && (stream.peek() == "'" || stream.peek() == '"'))) { - // charset casting: _utf8'str', N'str', n'str' - // ref: http://dev.mysql.com/doc/refman/5.5/en/string-literals.html - return "keyword"; - } else if (/^[\(\),\;\[\]]/.test(ch)) { - // no highlighting - return null; - } else if (support.commentSlashSlash && ch == "/" && stream.eat("/")) { - // 1-line comment - stream.skipToEnd(); - return "comment"; - } else if ((support.commentHash && ch == "#") - || (ch == "-" && stream.eat("-") && (!support.commentSpaceRequired || stream.eat(" ")))) { - // 1-line comments - // ref: https://kb.askmonty.org/en/comment-syntax/ - stream.skipToEnd(); - return "comment"; - } else if (ch == "/" && stream.eat("*")) { - // multi-line comments - // ref: https://kb.askmonty.org/en/comment-syntax/ - state.tokenize = tokenComment; - return state.tokenize(stream, state); - } else if (ch == ".") { - // .1 for 0.1 - if (support.zerolessFloat == true && stream.match(/^(?:\d+(?:e[+-]?\d+)?)/i)) { - return "number"; - } - // .table_name (ODBC) - // // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html - if (support.ODBCdotTable == true && stream.match(/^[a-zA-Z_]+/)) { - return "variable-2"; - } - } else if (operatorChars.test(ch)) { - // operators - stream.eatWhile(operatorChars); - return null; - } else if (ch == '{' && - (stream.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/) || stream.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/))) { - // dates (weird ODBC syntax) - // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html - return "number"; - } else { - stream.eatWhile(/^[_\w\d]/); - var word = stream.current().toLowerCase(); - // dates (standard SQL syntax) - // ref: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-literals.html - if (dateSQL.hasOwnProperty(word) && (stream.match(/^( )+'[^']*'/) || stream.match(/^( )+"[^"]*"/))) - return "number"; - if (atoms.hasOwnProperty(word)) return "atom"; - if (builtin.hasOwnProperty(word)) return "builtin"; - if (keywords.hasOwnProperty(word)) return "keyword"; - if (client.hasOwnProperty(word)) return "string-2"; - return null; - } - } - - // 'string', with char specified in quote escaped by '\' - function tokenLiteral(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) { - state.tokenize = tokenBase; - break; - } - escaped = !escaped && ch == "\\"; - } - return "string"; - }; - } - function tokenComment(stream, state) { - while (true) { - if (stream.skipTo("*")) { - stream.next(); - if (stream.eat("/")) { - state.tokenize = tokenBase; - break; - } - } else { - stream.skipToEnd(); - break; - } - } - return "comment"; - } - - function pushContext(stream, state, type) { - state.context = { - prev: state.context, - indent: stream.indentation(), - col: stream.column(), - type: type - }; - } - - function popContext(state) { - state.indent = state.context.indent; - state.context = state.context.prev; - } - - return { - startState: function() { - return {tokenize: tokenBase, context: null}; - }, - - token: function(stream, state) { - if (stream.sol()) { - if (state.context && state.context.align == null) - state.context.align = false; - } - if (stream.eatSpace()) return null; - - var style = state.tokenize(stream, state); - if (style == "comment") return style; - - if (state.context && state.context.align == null) - state.context.align = true; - - var tok = stream.current(); - if (tok == "(") - pushContext(stream, state, ")"); - else if (tok == "[") - pushContext(stream, state, "]"); - else if (state.context && state.context.type == tok) - popContext(state); - return style; - }, - - indent: function(state, textAfter) { - var cx = state.context; - if (!cx) return CodeMirror.Pass; - var closing = textAfter.charAt(0) == cx.type; - if (cx.align) return cx.col + (closing ? 0 : 1); - else return cx.indent + (closing ? 0 : config.indentUnit); - }, - - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: support.commentSlashSlash ? "//" : support.commentHash ? "#" : null - }; -}); - -(function() { - "use strict"; - - // `identifier` - function hookIdentifier(stream) { - // MySQL/MariaDB identifiers - // ref: http://dev.mysql.com/doc/refman/5.6/en/identifier-qualifiers.html - var ch; - while ((ch = stream.next()) != null) { - if (ch == "`" && !stream.eat("`")) return "variable-2"; - } - stream.backUp(stream.current().length - 1); - return stream.eatWhile(/\w/) ? "variable-2" : null; - } - - // variable token - function hookVar(stream) { - // variables - // @@prefix.varName @varName - // varName can be quoted with ` or ' or " - // ref: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html - if (stream.eat("@")) { - stream.match(/^session\./); - stream.match(/^local\./); - stream.match(/^global\./); - } - - if (stream.eat("'")) { - stream.match(/^.*'/); - return "variable-2"; - } else if (stream.eat('"')) { - stream.match(/^.*"/); - return "variable-2"; - } else if (stream.eat("`")) { - stream.match(/^.*`/); - return "variable-2"; - } else if (stream.match(/^[0-9a-zA-Z$\.\_]+/)) { - return "variable-2"; - } - return null; - }; - - // short client keyword token - function hookClient(stream) { - // \N means NULL - // ref: http://dev.mysql.com/doc/refman/5.5/en/null-values.html - if (stream.eat("N")) { - return "atom"; - } - // \g, etc - // ref: http://dev.mysql.com/doc/refman/5.5/en/mysql-commands.html - return stream.match(/^[a-zA-Z.#!?]/) ? "variable-2" : null; - } - - // these keywords are used by all SQL dialects (however, a mode can still overwrite it) - var sqlKeywords = "alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit "; - - // turn a space-separated list into an array - function set(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - // A generic SQL Mode. It's not a standard, it just try to support what is generally supported - CodeMirror.defineMIME("text/x-sql", { - name: "sql", - keywords: set(sqlKeywords + "begin"), - builtin: set("bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric"), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=]/, - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") - }); - - CodeMirror.defineMIME("text/x-mssql", { - name: "sql", - client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), - keywords: set(sqlKeywords + "begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare"), - builtin: set("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=]/, - dateSQL: set("date datetimeoffset datetime2 smalldatetime datetime time"), - hooks: { - "@": hookVar - } - }); - - CodeMirror.defineMIME("text/x-mysql", { - name: "sql", - client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), - keywords: set(sqlKeywords + "accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), - builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=&|^]/, - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), - hooks: { - "@": hookVar, - "`": hookIdentifier, - "\\": hookClient - } - }); - - CodeMirror.defineMIME("text/x-mariadb", { - name: "sql", - client: set("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"), - keywords: set(sqlKeywords + "accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"), - builtin: set("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=&|^]/, - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"), - hooks: { - "@": hookVar, - "`": hookIdentifier, - "\\": hookClient - } - }); - - // the query language used by Apache Cassandra is called CQL, but this mime type - // is called Cassandra to avoid confusion with Contextual Query Language - CodeMirror.defineMIME("text/x-cassandra", { - name: "sql", - client: { }, - keywords: set("add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime"), - builtin: set("ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint"), - atoms: set("false true infinity NaN"), - operatorChars: /^[<>=]/, - dateSQL: { }, - support: set("commentSlashSlash decimallessFloat"), - hooks: { } - }); - - // this is based on Peter Raganitsch's 'plsql' mode - CodeMirror.defineMIME("text/x-plsql", { - name: "sql", - client: set("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"), - keywords: set("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"), - builtin: set("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"), - operatorChars: /^[*+\-%<>!=~]/, - dateSQL: set("date time timestamp"), - support: set("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber") - }); - - // Created to support specific hive keywords - CodeMirror.defineMIME("text/x-hive", { - name: "sql", - keywords: set("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with"), - builtin: set("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype"), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=]/, - dateSQL: set("date timestamp"), - support: set("ODBCdotTable doubleQuote binaryNumber hexNumber") - }); - - CodeMirror.defineMIME("text/x-pgsql", { - name: "sql", - client: set("source"), - // http://www.postgresql.org/docs/9.5/static/sql-keywords-appendix.html - keywords: set(sqlKeywords + "a abort abs absent absolute access according action ada add admin after aggregate all allocate also always analyse analyze any are array array_agg array_max_cardinality asensitive assertion assignment asymmetric at atomic attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli binary bit_length blob blocked bom both breadth c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain characteristics characters character_length character_set_catalog character_set_name character_set_schema char_length check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column columns column_name command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constraint constraints constraint_catalog constraint_name constraint_schema constructor contains content continue control conversion convert copy corr corresponding cost covar_pop covar_samp cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datetime_interval_code datetime_interval_precision day db deallocate dec declare default defaults deferrable deferred defined definer degree delimiter delimiters dense_rank depth deref derived describe descriptor deterministic diagnostics dictionary disable discard disconnect dispatch dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain dynamic dynamic_function dynamic_function_code each element else empty enable encoding encrypted end end-exec end_frame end_partition enforced enum equals escape event every except exception exclude excluding exclusive exec execute exists exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreign fortran forward found frame_row free freeze fs full function functions fusion g general generated get global go goto grant granted greatest grouping groups handler header hex hierarchy hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import including increment indent index indexes indicator inherit inherits initially inline inner inout input insensitive instance instantiable instead integrity intersect intersection invoker isnull isolation k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like_regex link listen ln load local localtime localtimestamp location locator lock locked logged lower m map mapping match matched materialized max maxvalue max_cardinality member merge message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized nothing notify notnull nowait nth_value ntile null nullable nullif nulls number object occurrences_regex octets octet_length of off offset oids old only open operator option options ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password percent percentile_cont percentile_disc percent_rank period permission placing plans pli policy portion position position_regex power precedes preceding prepare prepared preserve primary prior privileges procedural procedure program public quote range rank read reads reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns revoke right role rollback rollup routine routine_catalog routine_name routine_schema row rows row_count row_number rule savepoint scale schema schema_name scope scope_catalog scope_name scope_schema scroll search second section security selective self sensitive sequence sequences serializable server server_name session session_user setof sets share show similar simple size skip snapshot some source space specific specifictype specific_name sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset substring substring_regex succeeds sum symmetric sysid system system_time system_user t tables tablesample tablespace table_name temp template temporary then ties timezone_hour timezone_minute to token top_level_count trailing transaction transactions_committed transactions_rolled_back transaction_active transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted unique unknown unlink unlisten unlogged unnamed unnest until untyped upper uri usage user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of varbinary variadic var_pop var_samp verbose version versioning view views volatile when whenever whitespace width_bucket window within work wrapper write xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes loop repeat"), - // http://www.postgresql.org/docs/9.5/static/datatype.html - builtin: set("bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml"), - atoms: set("false true null unknown"), - operatorChars: /^[*+\-%<>!=&|^\/#@?~]/, - dateSQL: set("date time timestamp"), - support: set("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast") - }); - - // Google's SQL-like query language, GQL - CodeMirror.defineMIME("text/x-gql", { - name: "sql", - keywords: set("ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where"), - atoms: set("false true"), - builtin: set("blob datetime first key __key__ string integer double boolean null"), - operatorChars: /^[*+\-%<>!=]/ - }); -}()); - -}); - -/* - How Properties of Mime Types are used by SQL Mode - ================================================= - - keywords: - A list of keywords you want to be highlighted. - builtin: - A list of builtin types you want to be highlighted (if you want types to be of class "builtin" instead of "keyword"). - operatorChars: - All characters that must be handled as operators. - client: - Commands parsed and executed by the client (not the server). - support: - A list of supported syntaxes which are not common, but are supported by more than 1 DBMS. - * ODBCdotTable: .tableName - * zerolessFloat: .1 - * doubleQuote - * nCharCast: N'string' - * charsetCast: _utf8'string' - * commentHash: use # char for comments - * commentSlashSlash: use // for comments - * commentSpaceRequired: require a space after -- for comments - atoms: - Keywords that must be highlighted as atoms,. Some DBMS's support more atoms than others: - UNKNOWN, INFINITY, UNDERFLOW, NaN... - dateSQL: - Used for date/time SQL standard syntax, because not all DBMS's support same temporal types. -*/ diff --git a/public/plugins/codemirror-5.17.0/mode/stex/index.html b/public/plugins/codemirror-5.17.0/mode/stex/index.html deleted file mode 100644 index 14679da..0000000 --- a/public/plugins/codemirror-5.17.0/mode/stex/index.html +++ /dev/null @@ -1,110 +0,0 @@ - - -CodeMirror: sTeX mode - - - - - - - - - -
-

sTeX mode

-
- - -

MIME types defined: text/x-stex.

- -

Parsing/Highlighting Tests: normal, verbose.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/stex/stex.js b/public/plugins/codemirror-5.17.0/mode/stex/stex.js deleted file mode 100644 index 835ed46..0000000 --- a/public/plugins/codemirror-5.17.0/mode/stex/stex.js +++ /dev/null @@ -1,251 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/* - * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de) - * Licence: MIT - */ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("stex", function() { - "use strict"; - - function pushCommand(state, command) { - state.cmdState.push(command); - } - - function peekCommand(state) { - if (state.cmdState.length > 0) { - return state.cmdState[state.cmdState.length - 1]; - } else { - return null; - } - } - - function popCommand(state) { - var plug = state.cmdState.pop(); - if (plug) { - plug.closeBracket(); - } - } - - // returns the non-default plugin closest to the end of the list - function getMostPowerful(state) { - var context = state.cmdState; - for (var i = context.length - 1; i >= 0; i--) { - var plug = context[i]; - if (plug.name == "DEFAULT") { - continue; - } - return plug; - } - return { styleIdentifier: function() { return null; } }; - } - - function addPluginPattern(pluginName, cmdStyle, styles) { - return function () { - this.name = pluginName; - this.bracketNo = 0; - this.style = cmdStyle; - this.styles = styles; - this.argument = null; // \begin and \end have arguments that follow. These are stored in the plugin - - this.styleIdentifier = function() { - return this.styles[this.bracketNo - 1] || null; - }; - this.openBracket = function() { - this.bracketNo++; - return "bracket"; - }; - this.closeBracket = function() {}; - }; - } - - var plugins = {}; - - plugins["importmodule"] = addPluginPattern("importmodule", "tag", ["string", "builtin"]); - plugins["documentclass"] = addPluginPattern("documentclass", "tag", ["", "atom"]); - plugins["usepackage"] = addPluginPattern("usepackage", "tag", ["atom"]); - plugins["begin"] = addPluginPattern("begin", "tag", ["atom"]); - plugins["end"] = addPluginPattern("end", "tag", ["atom"]); - - plugins["DEFAULT"] = function () { - this.name = "DEFAULT"; - this.style = "tag"; - - this.styleIdentifier = this.openBracket = this.closeBracket = function() {}; - }; - - function setState(state, f) { - state.f = f; - } - - // called when in a normal (no environment) context - function normal(source, state) { - var plug; - // Do we look like '\command' ? If so, attempt to apply the plugin 'command' - if (source.match(/^\\[a-zA-Z@]+/)) { - var cmdName = source.current().slice(1); - plug = plugins[cmdName] || plugins["DEFAULT"]; - plug = new plug(); - pushCommand(state, plug); - setState(state, beginParams); - return plug.style; - } - - // escape characters - if (source.match(/^\\[$&%#{}_]/)) { - return "tag"; - } - - // white space control characters - if (source.match(/^\\[,;!\/\\]/)) { - return "tag"; - } - - // find if we're starting various math modes - if (source.match("\\[")) { - setState(state, function(source, state){ return inMathMode(source, state, "\\]"); }); - return "keyword"; - } - if (source.match("$$")) { - setState(state, function(source, state){ return inMathMode(source, state, "$$"); }); - return "keyword"; - } - if (source.match("$")) { - setState(state, function(source, state){ return inMathMode(source, state, "$"); }); - return "keyword"; - } - - var ch = source.next(); - if (ch == "%") { - source.skipToEnd(); - return "comment"; - } else if (ch == '}' || ch == ']') { - plug = peekCommand(state); - if (plug) { - plug.closeBracket(ch); - setState(state, beginParams); - } else { - return "error"; - } - return "bracket"; - } else if (ch == '{' || ch == '[') { - plug = plugins["DEFAULT"]; - plug = new plug(); - pushCommand(state, plug); - return "bracket"; - } else if (/\d/.test(ch)) { - source.eatWhile(/[\w.%]/); - return "atom"; - } else { - source.eatWhile(/[\w\-_]/); - plug = getMostPowerful(state); - if (plug.name == 'begin') { - plug.argument = source.current(); - } - return plug.styleIdentifier(); - } - } - - function inMathMode(source, state, endModeSeq) { - if (source.eatSpace()) { - return null; - } - if (source.match(endModeSeq)) { - setState(state, normal); - return "keyword"; - } - if (source.match(/^\\[a-zA-Z@]+/)) { - return "tag"; - } - if (source.match(/^[a-zA-Z]+/)) { - return "variable-2"; - } - // escape characters - if (source.match(/^\\[$&%#{}_]/)) { - return "tag"; - } - // white space control characters - if (source.match(/^\\[,;!\/]/)) { - return "tag"; - } - // special math-mode characters - if (source.match(/^[\^_&]/)) { - return "tag"; - } - // non-special characters - if (source.match(/^[+\-<>|=,\/@!*:;'"`~#?]/)) { - return null; - } - if (source.match(/^(\d+\.\d*|\d*\.\d+|\d+)/)) { - return "number"; - } - var ch = source.next(); - if (ch == "{" || ch == "}" || ch == "[" || ch == "]" || ch == "(" || ch == ")") { - return "bracket"; - } - - if (ch == "%") { - source.skipToEnd(); - return "comment"; - } - return "error"; - } - - function beginParams(source, state) { - var ch = source.peek(), lastPlug; - if (ch == '{' || ch == '[') { - lastPlug = peekCommand(state); - lastPlug.openBracket(ch); - source.eat(ch); - setState(state, normal); - return "bracket"; - } - if (/[ \t\r]/.test(ch)) { - source.eat(ch); - return null; - } - setState(state, normal); - popCommand(state); - - return normal(source, state); - } - - return { - startState: function() { - return { - cmdState: [], - f: normal - }; - }, - copyState: function(s) { - return { - cmdState: s.cmdState.slice(), - f: s.f - }; - }, - token: function(stream, state) { - return state.f(stream, state); - }, - blankLine: function(state) { - state.f = normal; - state.cmdState.length = 0; - }, - lineComment: "%" - }; - }); - - CodeMirror.defineMIME("text/x-stex", "stex"); - CodeMirror.defineMIME("text/x-latex", "stex"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/stex/test.js b/public/plugins/codemirror-5.17.0/mode/stex/test.js deleted file mode 100644 index 22f027e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/stex/test.js +++ /dev/null @@ -1,123 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({tabSize: 4}, "stex"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT("word", - "foo"); - - MT("twoWords", - "foo bar"); - - MT("beginEndDocument", - "[tag \\begin][bracket {][atom document][bracket }]", - "[tag \\end][bracket {][atom document][bracket }]"); - - MT("beginEndEquation", - "[tag \\begin][bracket {][atom equation][bracket }]", - " E=mc^2", - "[tag \\end][bracket {][atom equation][bracket }]"); - - MT("beginModule", - "[tag \\begin][bracket {][atom module][bracket }[[]]]"); - - MT("beginModuleId", - "[tag \\begin][bracket {][atom module][bracket }[[]id=bbt-size[bracket ]]]"); - - MT("importModule", - "[tag \\importmodule][bracket [[][string b-b-t][bracket ]]{][builtin b-b-t][bracket }]"); - - MT("importModulePath", - "[tag \\importmodule][bracket [[][tag \\KWARCslides][bracket {][string dmath/en/cardinality][bracket }]]{][builtin card][bracket }]"); - - MT("psForPDF", - "[tag \\PSforPDF][bracket [[][atom 1][bracket ]]{]#1[bracket }]"); - - MT("comment", - "[comment % foo]"); - - MT("tagComment", - "[tag \\item][comment % bar]"); - - MT("commentTag", - " [comment % \\item]"); - - MT("commentLineBreak", - "[comment %]", - "foo"); - - MT("tagErrorCurly", - "[tag \\begin][error }][bracket {]"); - - MT("tagErrorSquare", - "[tag \\item][error ]]][bracket {]"); - - MT("commentCurly", - "[comment % }]"); - - MT("tagHash", - "the [tag \\#] key"); - - MT("tagNumber", - "a [tag \\$][atom 5] stetson"); - - MT("tagPercent", - "[atom 100][tag \\%] beef"); - - MT("tagAmpersand", - "L [tag \\&] N"); - - MT("tagUnderscore", - "foo[tag \\_]bar"); - - MT("tagBracketOpen", - "[tag \\emph][bracket {][tag \\{][bracket }]"); - - MT("tagBracketClose", - "[tag \\emph][bracket {][tag \\}][bracket }]"); - - MT("tagLetterNumber", - "section [tag \\S][atom 1]"); - - MT("textTagNumber", - "para [tag \\P][atom 2]"); - - MT("thinspace", - "x[tag \\,]y"); - - MT("thickspace", - "x[tag \\;]y"); - - MT("negativeThinspace", - "x[tag \\!]y"); - - MT("periodNotSentence", - "J.\\ L.\\ is"); - - MT("periodSentence", - "X[tag \\@]. The"); - - MT("italicCorrection", - "[bracket {][tag \\em] If[tag \\/][bracket }] I"); - - MT("tagBracket", - "[tag \\newcommand][bracket {][tag \\pop][bracket }]"); - - MT("inlineMathTagFollowedByNumber", - "[keyword $][tag \\pi][number 2][keyword $]"); - - MT("inlineMath", - "[keyword $][number 3][variable-2 x][tag ^][number 2.45]-[tag \\sqrt][bracket {][tag \\$\\alpha][bracket }] = [number 2][keyword $] other text"); - - MT("displayMath", - "More [keyword $$]\t[variable-2 S][tag ^][variable-2 n][tag \\sum] [variable-2 i][keyword $$] other text"); - - MT("mathWithComment", - "[keyword $][variable-2 x] [comment % $]", - "[variable-2 y][keyword $] other text"); - - MT("lineBreakArgument", - "[tag \\\\][bracket [[][atom 1cm][bracket ]]]"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/stylus/index.html b/public/plugins/codemirror-5.17.0/mode/stylus/index.html deleted file mode 100644 index 862c18f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/stylus/index.html +++ /dev/null @@ -1,106 +0,0 @@ - - -CodeMirror: Stylus mode - - - - - - - - - - - -
-

Stylus mode

-
- - - -

MIME types defined: text/x-styl.

-

Created by Dmitry Kiselyov

-
diff --git a/public/plugins/codemirror-5.17.0/mode/stylus/stylus.js b/public/plugins/codemirror-5.17.0/mode/stylus/stylus.js deleted file mode 100644 index 662cd03..0000000 --- a/public/plugins/codemirror-5.17.0/mode/stylus/stylus.js +++ /dev/null @@ -1,769 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Stylus mode created by Dmitry Kiselyov http://git.io/AaRB - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("stylus", function(config) { - var indentUnit = config.indentUnit, - tagKeywords = keySet(tagKeywords_), - tagVariablesRegexp = /^(a|b|i|s|col|em)$/i, - propertyKeywords = keySet(propertyKeywords_), - nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_), - valueKeywords = keySet(valueKeywords_), - colorKeywords = keySet(colorKeywords_), - documentTypes = keySet(documentTypes_), - documentTypesRegexp = wordRegexp(documentTypes_), - mediaFeatures = keySet(mediaFeatures_), - mediaTypes = keySet(mediaTypes_), - fontProperties = keySet(fontProperties_), - operatorsRegexp = /^\s*([.]{2,3}|&&|\|\||\*\*|[?!=:]?=|[-+*\/%<>]=?|\?:|\~)/, - wordOperatorKeywordsRegexp = wordRegexp(wordOperatorKeywords_), - blockKeywords = keySet(blockKeywords_), - vendorPrefixesRegexp = new RegExp(/^\-(moz|ms|o|webkit)-/i), - commonAtoms = keySet(commonAtoms_), - firstWordMatch = "", - states = {}, - ch, - style, - type, - override; - - /** - * Tokenizers - */ - function tokenBase(stream, state) { - firstWordMatch = stream.string.match(/(^[\w-]+\s*=\s*$)|(^\s*[\w-]+\s*=\s*[\w-])|(^\s*(\.|#|@|\$|\&|\[|\d|\+|::?|\{|\>|~|\/)?\s*[\w-]*([a-z0-9-]|\*|\/\*)(\(|,)?)/); - state.context.line.firstWord = firstWordMatch ? firstWordMatch[0].replace(/^\s*/, "") : ""; - state.context.line.indent = stream.indentation(); - ch = stream.peek(); - - // Line comment - if (stream.match("//")) { - stream.skipToEnd(); - return ["comment", "comment"]; - } - // Block comment - if (stream.match("/*")) { - state.tokenize = tokenCComment; - return tokenCComment(stream, state); - } - // String - if (ch == "\"" || ch == "'") { - stream.next(); - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - // Def - if (ch == "@") { - stream.next(); - stream.eatWhile(/[\w\\-]/); - return ["def", stream.current()]; - } - // ID selector or Hex color - if (ch == "#") { - stream.next(); - // Hex color - if (stream.match(/^[0-9a-f]{6}|[0-9a-f]{3}/i)) { - return ["atom", "atom"]; - } - // ID selector - if (stream.match(/^[a-z][\w-]*/i)) { - return ["builtin", "hash"]; - } - } - // Vendor prefixes - if (stream.match(vendorPrefixesRegexp)) { - return ["meta", "vendor-prefixes"]; - } - // Numbers - if (stream.match(/^-?[0-9]?\.?[0-9]/)) { - stream.eatWhile(/[a-z%]/i); - return ["number", "unit"]; - } - // !important|optional - if (ch == "!") { - stream.next(); - return [stream.match(/^(important|optional)/i) ? "keyword": "operator", "important"]; - } - // Class - if (ch == "." && stream.match(/^\.[a-z][\w-]*/i)) { - return ["qualifier", "qualifier"]; - } - // url url-prefix domain regexp - if (stream.match(documentTypesRegexp)) { - if (stream.peek() == "(") state.tokenize = tokenParenthesized; - return ["property", "word"]; - } - // Mixins / Functions - if (stream.match(/^[a-z][\w-]*\(/i)) { - stream.backUp(1); - return ["keyword", "mixin"]; - } - // Block mixins - if (stream.match(/^(\+|-)[a-z][\w-]*\(/i)) { - stream.backUp(1); - return ["keyword", "block-mixin"]; - } - // Parent Reference BEM naming - if (stream.string.match(/^\s*&/) && stream.match(/^[-_]+[a-z][\w-]*/)) { - return ["qualifier", "qualifier"]; - } - // / Root Reference & Parent Reference - if (stream.match(/^(\/|&)(-|_|:|\.|#|[a-z])/)) { - stream.backUp(1); - return ["variable-3", "reference"]; - } - if (stream.match(/^&{1}\s*$/)) { - return ["variable-3", "reference"]; - } - // Word operator - if (stream.match(wordOperatorKeywordsRegexp)) { - return ["operator", "operator"]; - } - // Word - if (stream.match(/^\$?[-_]*[a-z0-9]+[\w-]*/i)) { - // Variable - if (stream.match(/^(\.|\[)[\w-\'\"\]]+/i, false)) { - if (!wordIsTag(stream.current())) { - stream.match(/\./); - return ["variable-2", "variable-name"]; - } - } - return ["variable-2", "word"]; - } - // Operators - if (stream.match(operatorsRegexp)) { - return ["operator", stream.current()]; - } - // Delimiters - if (/[:;,{}\[\]\(\)]/.test(ch)) { - stream.next(); - return [null, ch]; - } - // Non-detected items - stream.next(); - return [null, null]; - } - - /** - * Token comment - */ - function tokenCComment(stream, state) { - var maybeEnd = false, ch; - while ((ch = stream.next()) != null) { - if (maybeEnd && ch == "/") { - state.tokenize = null; - break; - } - maybeEnd = (ch == "*"); - } - return ["comment", "comment"]; - } - - /** - * Token string - */ - function tokenString(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) { - if (quote == ")") stream.backUp(1); - break; - } - escaped = !escaped && ch == "\\"; - } - if (ch == quote || !escaped && quote != ")") state.tokenize = null; - return ["string", "string"]; - }; - } - - /** - * Token parenthesized - */ - function tokenParenthesized(stream, state) { - stream.next(); // Must be "(" - if (!stream.match(/\s*[\"\')]/, false)) - state.tokenize = tokenString(")"); - else - state.tokenize = null; - return [null, "("]; - } - - /** - * Context management - */ - function Context(type, indent, prev, line) { - this.type = type; - this.indent = indent; - this.prev = prev; - this.line = line || {firstWord: "", indent: 0}; - } - - function pushContext(state, stream, type, indent) { - indent = indent >= 0 ? indent : indentUnit; - state.context = new Context(type, stream.indentation() + indent, state.context); - return type; - } - - function popContext(state, currentIndent) { - var contextIndent = state.context.indent - indentUnit; - currentIndent = currentIndent || false; - state.context = state.context.prev; - if (currentIndent) state.context.indent = contextIndent; - return state.context.type; - } - - function pass(type, stream, state) { - return states[state.context.type](type, stream, state); - } - - function popAndPass(type, stream, state, n) { - for (var i = n || 1; i > 0; i--) - state.context = state.context.prev; - return pass(type, stream, state); - } - - - /** - * Parser - */ - function wordIsTag(word) { - return word.toLowerCase() in tagKeywords; - } - - function wordIsProperty(word) { - word = word.toLowerCase(); - return word in propertyKeywords || word in fontProperties; - } - - function wordIsBlock(word) { - return word.toLowerCase() in blockKeywords; - } - - function wordIsVendorPrefix(word) { - return word.toLowerCase().match(vendorPrefixesRegexp); - } - - function wordAsValue(word) { - var wordLC = word.toLowerCase(); - var override = "variable-2"; - if (wordIsTag(word)) override = "tag"; - else if (wordIsBlock(word)) override = "block-keyword"; - else if (wordIsProperty(word)) override = "property"; - else if (wordLC in valueKeywords || wordLC in commonAtoms) override = "atom"; - else if (wordLC == "return" || wordLC in colorKeywords) override = "keyword"; - - // Font family - else if (word.match(/^[A-Z]/)) override = "string"; - return override; - } - - function typeIsBlock(type, stream) { - return ((endOfLine(stream) && (type == "{" || type == "]" || type == "hash" || type == "qualifier")) || type == "block-mixin"); - } - - function typeIsInterpolation(type, stream) { - return type == "{" && stream.match(/^\s*\$?[\w-]+/i, false); - } - - function typeIsPseudo(type, stream) { - return type == ":" && stream.match(/^[a-z-]+/, false); - } - - function startOfLine(stream) { - return stream.sol() || stream.string.match(new RegExp("^\\s*" + escapeRegExp(stream.current()))); - } - - function endOfLine(stream) { - return stream.eol() || stream.match(/^\s*$/, false); - } - - function firstWordOfLine(line) { - var re = /^\s*[-_]*[a-z0-9]+[\w-]*/i; - var result = typeof line == "string" ? line.match(re) : line.string.match(re); - return result ? result[0].replace(/^\s*/, "") : ""; - } - - - /** - * Block - */ - states.block = function(type, stream, state) { - if ((type == "comment" && startOfLine(stream)) || - (type == "," && endOfLine(stream)) || - type == "mixin") { - return pushContext(state, stream, "block", 0); - } - if (typeIsInterpolation(type, stream)) { - return pushContext(state, stream, "interpolation"); - } - if (endOfLine(stream) && type == "]") { - if (!/^\s*(\.|#|:|\[|\*|&)/.test(stream.string) && !wordIsTag(firstWordOfLine(stream))) { - return pushContext(state, stream, "block", 0); - } - } - if (typeIsBlock(type, stream, state)) { - return pushContext(state, stream, "block"); - } - if (type == "}" && endOfLine(stream)) { - return pushContext(state, stream, "block", 0); - } - if (type == "variable-name") { - if (stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/) || wordIsBlock(firstWordOfLine(stream))) { - return pushContext(state, stream, "variableName"); - } - else { - return pushContext(state, stream, "variableName", 0); - } - } - if (type == "=") { - if (!endOfLine(stream) && !wordIsBlock(firstWordOfLine(stream))) { - return pushContext(state, stream, "block", 0); - } - return pushContext(state, stream, "block"); - } - if (type == "*") { - if (endOfLine(stream) || stream.match(/\s*(,|\.|#|\[|:|{)/,false)) { - override = "tag"; - return pushContext(state, stream, "block"); - } - } - if (typeIsPseudo(type, stream)) { - return pushContext(state, stream, "pseudo"); - } - if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { - return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); - } - if (/@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) { - return pushContext(state, stream, "keyframes"); - } - if (/@extends?/.test(type)) { - return pushContext(state, stream, "extend", 0); - } - if (type && type.charAt(0) == "@") { - - // Property Lookup - if (stream.indentation() > 0 && wordIsProperty(stream.current().slice(1))) { - override = "variable-2"; - return "block"; - } - if (/(@import|@require|@charset)/.test(type)) { - return pushContext(state, stream, "block", 0); - } - return pushContext(state, stream, "block"); - } - if (type == "reference" && endOfLine(stream)) { - return pushContext(state, stream, "block"); - } - if (type == "(") { - return pushContext(state, stream, "parens"); - } - - if (type == "vendor-prefixes") { - return pushContext(state, stream, "vendorPrefixes"); - } - if (type == "word") { - var word = stream.current(); - override = wordAsValue(word); - - if (override == "property") { - if (startOfLine(stream)) { - return pushContext(state, stream, "block", 0); - } else { - override = "atom"; - return "block"; - } - } - - if (override == "tag") { - - // tag is a css value - if (/embed|menu|pre|progress|sub|table/.test(word)) { - if (wordIsProperty(firstWordOfLine(stream))) { - override = "atom"; - return "block"; - } - } - - // tag is an attribute - if (stream.string.match(new RegExp("\\[\\s*" + word + "|" + word +"\\s*\\]"))) { - override = "atom"; - return "block"; - } - - // tag is a variable - if (tagVariablesRegexp.test(word)) { - if ((startOfLine(stream) && stream.string.match(/=/)) || - (!startOfLine(stream) && - !stream.string.match(/^(\s*\.|#|\&|\[|\/|>|\*)/) && - !wordIsTag(firstWordOfLine(stream)))) { - override = "variable-2"; - if (wordIsBlock(firstWordOfLine(stream))) return "block"; - return pushContext(state, stream, "block", 0); - } - } - - if (endOfLine(stream)) return pushContext(state, stream, "block"); - } - if (override == "block-keyword") { - override = "keyword"; - - // Postfix conditionals - if (stream.current(/(if|unless)/) && !startOfLine(stream)) { - return "block"; - } - return pushContext(state, stream, "block"); - } - if (word == "return") return pushContext(state, stream, "block", 0); - - // Placeholder selector - if (override == "variable-2" && stream.string.match(/^\s?\$[\w-\.\[\]\'\"]+$/)) { - return pushContext(state, stream, "block"); - } - } - return state.context.type; - }; - - - /** - * Parens - */ - states.parens = function(type, stream, state) { - if (type == "(") return pushContext(state, stream, "parens"); - if (type == ")") { - if (state.context.prev.type == "parens") { - return popContext(state); - } - if ((stream.string.match(/^[a-z][\w-]*\(/i) && endOfLine(stream)) || - wordIsBlock(firstWordOfLine(stream)) || - /(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(firstWordOfLine(stream)) || - (!stream.string.match(/^-?[a-z][\w-\.\[\]\'\"]*\s*=/) && - wordIsTag(firstWordOfLine(stream)))) { - return pushContext(state, stream, "block"); - } - if (stream.string.match(/^[\$-]?[a-z][\w-\.\[\]\'\"]*\s*=/) || - stream.string.match(/^\s*(\(|\)|[0-9])/) || - stream.string.match(/^\s+[a-z][\w-]*\(/i) || - stream.string.match(/^\s+[\$-]?[a-z]/i)) { - return pushContext(state, stream, "block", 0); - } - if (endOfLine(stream)) return pushContext(state, stream, "block"); - else return pushContext(state, stream, "block", 0); - } - if (type && type.charAt(0) == "@" && wordIsProperty(stream.current().slice(1))) { - override = "variable-2"; - } - if (type == "word") { - var word = stream.current(); - override = wordAsValue(word); - if (override == "tag" && tagVariablesRegexp.test(word)) { - override = "variable-2"; - } - if (override == "property" || word == "to") override = "atom"; - } - if (type == "variable-name") { - return pushContext(state, stream, "variableName"); - } - if (typeIsPseudo(type, stream)) { - return pushContext(state, stream, "pseudo"); - } - return state.context.type; - }; - - - /** - * Vendor prefixes - */ - states.vendorPrefixes = function(type, stream, state) { - if (type == "word") { - override = "property"; - return pushContext(state, stream, "block", 0); - } - return popContext(state); - }; - - - /** - * Pseudo - */ - states.pseudo = function(type, stream, state) { - if (!wordIsProperty(firstWordOfLine(stream.string))) { - stream.match(/^[a-z-]+/); - override = "variable-3"; - if (endOfLine(stream)) return pushContext(state, stream, "block"); - return popContext(state); - } - return popAndPass(type, stream, state); - }; - - - /** - * atBlock - */ - states.atBlock = function(type, stream, state) { - if (type == "(") return pushContext(state, stream, "atBlock_parens"); - if (typeIsBlock(type, stream, state)) { - return pushContext(state, stream, "block"); - } - if (typeIsInterpolation(type, stream)) { - return pushContext(state, stream, "interpolation"); - } - if (type == "word") { - var word = stream.current().toLowerCase(); - if (/^(only|not|and|or)$/.test(word)) - override = "keyword"; - else if (documentTypes.hasOwnProperty(word)) - override = "tag"; - else if (mediaTypes.hasOwnProperty(word)) - override = "attribute"; - else if (mediaFeatures.hasOwnProperty(word)) - override = "property"; - else if (nonStandardPropertyKeywords.hasOwnProperty(word)) - override = "string-2"; - else override = wordAsValue(stream.current()); - if (override == "tag" && endOfLine(stream)) { - return pushContext(state, stream, "block"); - } - } - if (type == "operator" && /^(not|and|or)$/.test(stream.current())) { - override = "keyword"; - } - return state.context.type; - }; - - states.atBlock_parens = function(type, stream, state) { - if (type == "{" || type == "}") return state.context.type; - if (type == ")") { - if (endOfLine(stream)) return pushContext(state, stream, "block"); - else return pushContext(state, stream, "atBlock"); - } - if (type == "word") { - var word = stream.current().toLowerCase(); - override = wordAsValue(word); - if (/^(max|min)/.test(word)) override = "property"; - if (override == "tag") { - tagVariablesRegexp.test(word) ? override = "variable-2" : override = "atom"; - } - return state.context.type; - } - return states.atBlock(type, stream, state); - }; - - - /** - * Keyframes - */ - states.keyframes = function(type, stream, state) { - if (stream.indentation() == "0" && ((type == "}" && startOfLine(stream)) || type == "]" || type == "hash" - || type == "qualifier" || wordIsTag(stream.current()))) { - return popAndPass(type, stream, state); - } - if (type == "{") return pushContext(state, stream, "keyframes"); - if (type == "}") { - if (startOfLine(stream)) return popContext(state, true); - else return pushContext(state, stream, "keyframes"); - } - if (type == "unit" && /^[0-9]+\%$/.test(stream.current())) { - return pushContext(state, stream, "keyframes"); - } - if (type == "word") { - override = wordAsValue(stream.current()); - if (override == "block-keyword") { - override = "keyword"; - return pushContext(state, stream, "keyframes"); - } - } - if (/@(font-face|media|supports|(-moz-)?document)/.test(type)) { - return pushContext(state, stream, endOfLine(stream) ? "block" : "atBlock"); - } - if (type == "mixin") { - return pushContext(state, stream, "block", 0); - } - return state.context.type; - }; - - - /** - * Interpolation - */ - states.interpolation = function(type, stream, state) { - if (type == "{") popContext(state) && pushContext(state, stream, "block"); - if (type == "}") { - if (stream.string.match(/^\s*(\.|#|:|\[|\*|&|>|~|\+|\/)/i) || - (stream.string.match(/^\s*[a-z]/i) && wordIsTag(firstWordOfLine(stream)))) { - return pushContext(state, stream, "block"); - } - if (!stream.string.match(/^(\{|\s*\&)/) || - stream.match(/\s*[\w-]/,false)) { - return pushContext(state, stream, "block", 0); - } - return pushContext(state, stream, "block"); - } - if (type == "variable-name") { - return pushContext(state, stream, "variableName", 0); - } - if (type == "word") { - override = wordAsValue(stream.current()); - if (override == "tag") override = "atom"; - } - return state.context.type; - }; - - - /** - * Extend/s - */ - states.extend = function(type, stream, state) { - if (type == "[" || type == "=") return "extend"; - if (type == "]") return popContext(state); - if (type == "word") { - override = wordAsValue(stream.current()); - return "extend"; - } - return popContext(state); - }; - - - /** - * Variable name - */ - states.variableName = function(type, stream, state) { - if (type == "string" || type == "[" || type == "]" || stream.current().match(/^(\.|\$)/)) { - if (stream.current().match(/^\.[\w-]+/i)) override = "variable-2"; - return "variableName"; - } - return popAndPass(type, stream, state); - }; - - - return { - startState: function(base) { - return { - tokenize: null, - state: "block", - context: new Context("block", base || 0, null) - }; - }, - token: function(stream, state) { - if (!state.tokenize && stream.eatSpace()) return null; - style = (state.tokenize || tokenBase)(stream, state); - if (style && typeof style == "object") { - type = style[1]; - style = style[0]; - } - override = style; - state.state = states[state.state](type, stream, state); - return override; - }, - indent: function(state, textAfter, line) { - - var cx = state.context, - ch = textAfter && textAfter.charAt(0), - indent = cx.indent, - lineFirstWord = firstWordOfLine(textAfter), - lineIndent = line.length - line.replace(/^\s*/, "").length, - prevLineFirstWord = state.context.prev ? state.context.prev.line.firstWord : "", - prevLineIndent = state.context.prev ? state.context.prev.line.indent : lineIndent; - - if (cx.prev && - (ch == "}" && (cx.type == "block" || cx.type == "atBlock" || cx.type == "keyframes") || - ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || - ch == "{" && (cx.type == "at"))) { - indent = cx.indent - indentUnit; - cx = cx.prev; - } else if (!(/(\})/.test(ch))) { - if (/@|\$|\d/.test(ch) || - /^\{/.test(textAfter) || -/^\s*\/(\/|\*)/.test(textAfter) || - /^\s*\/\*/.test(prevLineFirstWord) || - /^\s*[\w-\.\[\]\'\"]+\s*(\?|:|\+)?=/i.test(textAfter) || -/^(\+|-)?[a-z][\w-]*\(/i.test(textAfter) || -/^return/.test(textAfter) || - wordIsBlock(lineFirstWord)) { - indent = lineIndent; - } else if (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(ch) || wordIsTag(lineFirstWord)) { - if (/\,\s*$/.test(prevLineFirstWord)) { - indent = prevLineIndent; - } else if (/^\s+/.test(line) && (/(\.|#|:|\[|\*|&|>|~|\+|\/)/.test(prevLineFirstWord) || wordIsTag(prevLineFirstWord))) { - indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; - } else { - indent = lineIndent; - } - } else if (!/,\s*$/.test(line) && (wordIsVendorPrefix(lineFirstWord) || wordIsProperty(lineFirstWord))) { - if (wordIsBlock(prevLineFirstWord)) { - indent = lineIndent <= prevLineIndent ? prevLineIndent : prevLineIndent + indentUnit; - } else if (/^\{/.test(prevLineFirstWord)) { - indent = lineIndent <= prevLineIndent ? lineIndent : prevLineIndent + indentUnit; - } else if (wordIsVendorPrefix(prevLineFirstWord) || wordIsProperty(prevLineFirstWord)) { - indent = lineIndent >= prevLineIndent ? prevLineIndent : lineIndent; - } else if (/^(\.|#|:|\[|\*|&|@|\+|\-|>|~|\/)/.test(prevLineFirstWord) || - /=\s*$/.test(prevLineFirstWord) || - wordIsTag(prevLineFirstWord) || - /^\$[\w-\.\[\]\'\"]/.test(prevLineFirstWord)) { - indent = prevLineIndent + indentUnit; - } else { - indent = lineIndent; - } - } - } - return indent; - }, - electricChars: "}", - lineComment: "//", - fold: "indent" - }; - }); - - // developer.mozilla.org/en-US/docs/Web/HTML/Element - var tagKeywords_ = ["a","abbr","address","area","article","aside","audio", "b", "base","bdi", "bdo","bgsound","blockquote","body","br","button","canvas","caption","cite", "code","col","colgroup","data","datalist","dd","del","details","dfn","div", "dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1", "h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe", "img","input","ins","kbd","keygen","label","legend","li","link","main","map", "mark","marquee","menu","menuitem","meta","meter","nav","nobr","noframes", "noscript","object","ol","optgroup","option","output","p","param","pre", "progress","q","rp","rt","ruby","s","samp","script","section","select", "small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track", "u","ul","var","video"]; - - // github.com/codemirror/CodeMirror/blob/master/mode/css/css.js - var documentTypes_ = ["domain", "regexp", "url", "url-prefix"]; - var mediaTypes_ = ["all","aural","braille","handheld","print","projection","screen","tty","tv","embossed"]; - var mediaFeatures_ = ["width","min-width","max-width","height","min-height","max-height","device-width","min-device-width","max-device-width","device-height","min-device-height","max-device-height","aspect-ratio","min-aspect-ratio","max-aspect-ratio","device-aspect-ratio","min-device-aspect-ratio","max-device-aspect-ratio","color","min-color","max-color","color-index","min-color-index","max-color-index","monochrome","min-monochrome","max-monochrome","resolution","min-resolution","max-resolution","scan","grid"]; - var propertyKeywords_ = ["align-content","align-items","align-self","alignment-adjust","alignment-baseline","anchor-point","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","appearance","azimuth","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","baseline-shift","binding","bleed","bookmark-label","bookmark-level","bookmark-state","bookmark-target","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","color","color-profile","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","crop","cue","cue-after","cue-before","cursor","direction","display","dominant-baseline","drop-initial-after-adjust","drop-initial-after-align","drop-initial-before-adjust","drop-initial-before-align","drop-initial-size","drop-initial-value","elevation","empty-cells","fit","fit-position","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","float-offset","flow-from","flow-into","font","font-feature-settings","font-family","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-synthesis","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-weight","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-position","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","inline-box-align","justify-content","left","letter-spacing","line-break","line-height","line-stacking","line-stacking-ruby","line-stacking-shift","line-stacking-strategy","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marker-offset","marks","marquee-direction","marquee-loop","marquee-play-count","marquee-speed","marquee-style","max-height","max-width","min-height","min-width","move-to","nav-down","nav-index","nav-left","nav-right","nav-up","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-style","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","page-policy","pause","pause-after","pause-before","perspective","perspective-origin","pitch","pitch-range","play-during","position","presentation-level","punctuation-trim","quotes","region-break-after","region-break-before","region-break-inside","region-fragment","rendering-intent","resize","rest","rest-after","rest-before","richness","right","rotation","rotation-point","ruby-align","ruby-overhang","ruby-position","ruby-span","shape-image-threshold","shape-inside","shape-margin","shape-outside","size","speak","speak-as","speak-header","speak-numeral","speak-punctuation","speech-rate","stress","string-set","tab-size","table-layout","target","target-name","target-new","target-position","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-height","text-indent","text-justify","text-outline","text-overflow","text-shadow","text-size-adjust","text-space-collapse","text-transform","text-underline-position","text-wrap","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","volume","white-space","widows","width","word-break","word-spacing","word-wrap","z-index","clip-path","clip-rule","mask","enable-background","filter","flood-color","flood-opacity","lighting-color","stop-color","stop-opacity","pointer-events","color-interpolation","color-interpolation-filters","color-rendering","fill","fill-opacity","fill-rule","image-rendering","marker","marker-end","marker-mid","marker-start","shape-rendering","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-rendering","baseline-shift","dominant-baseline","glyph-orientation-horizontal","glyph-orientation-vertical","text-anchor","writing-mode","font-smoothing","osx-font-smoothing"]; - var nonStandardPropertyKeywords_ = ["scrollbar-arrow-color","scrollbar-base-color","scrollbar-dark-shadow-color","scrollbar-face-color","scrollbar-highlight-color","scrollbar-shadow-color","scrollbar-3d-light-color","scrollbar-track-color","shape-inside","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","zoom"]; - var fontProperties_ = ["font-family","src","unicode-range","font-variant","font-feature-settings","font-stretch","font-weight","font-style"]; - var colorKeywords_ = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"]; - var valueKeywords_ = ["above","absolute","activeborder","additive","activecaption","afar","after-white-space","ahead","alias","all","all-scroll","alphabetic","alternate","always","amharic","amharic-abegede","antialiased","appworkspace","arabic-indic","armenian","asterisks","attr","auto","avoid","avoid-column","avoid-page","avoid-region","background","backwards","baseline","below","bidi-override","binary","bengali","blink","block","block-axis","bold","bolder","border","border-box","both","bottom","break","break-all","break-word","bullets","button","button-bevel","buttonface","buttonhighlight","buttonshadow","buttontext","calc","cambodian","capitalize","caps-lock-indicator","caption","captiontext","caret","cell","center","checkbox","circle","cjk-decimal","cjk-earthly-branch","cjk-heavenly-stem","cjk-ideographic","clear","clip","close-quote","col-resize","collapse","column","compact","condensed","contain","content","content-box","context-menu","continuous","copy","counter","counters","cover","crop","cross","crosshair","currentcolor","cursive","cyclic","dashed","decimal","decimal-leading-zero","default","default-button","destination-atop","destination-in","destination-out","destination-over","devanagari","disc","discard","disclosure-closed","disclosure-open","document","dot-dash","dot-dot-dash","dotted","double","down","e-resize","ease","ease-in","ease-in-out","ease-out","element","ellipse","ellipsis","embed","end","ethiopic","ethiopic-abegede","ethiopic-abegede-am-et","ethiopic-abegede-gez","ethiopic-abegede-ti-er","ethiopic-abegede-ti-et","ethiopic-halehame-aa-er","ethiopic-halehame-aa-et","ethiopic-halehame-am-et","ethiopic-halehame-gez","ethiopic-halehame-om-et","ethiopic-halehame-sid-et","ethiopic-halehame-so-et","ethiopic-halehame-ti-er","ethiopic-halehame-ti-et","ethiopic-halehame-tig","ethiopic-numeric","ew-resize","expanded","extends","extra-condensed","extra-expanded","fantasy","fast","fill","fixed","flat","flex","footnotes","forwards","from","geometricPrecision","georgian","graytext","groove","gujarati","gurmukhi","hand","hangul","hangul-consonant","hebrew","help","hidden","hide","higher","highlight","highlighttext","hiragana","hiragana-iroha","horizontal","hsl","hsla","icon","ignore","inactiveborder","inactivecaption","inactivecaptiontext","infinite","infobackground","infotext","inherit","initial","inline","inline-axis","inline-block","inline-flex","inline-table","inset","inside","intrinsic","invert","italic","japanese-formal","japanese-informal","justify","kannada","katakana","katakana-iroha","keep-all","khmer","korean-hangul-formal","korean-hanja-formal","korean-hanja-informal","landscape","lao","large","larger","left","level","lighter","line-through","linear","linear-gradient","lines","list-item","listbox","listitem","local","logical","loud","lower","lower-alpha","lower-armenian","lower-greek","lower-hexadecimal","lower-latin","lower-norwegian","lower-roman","lowercase","ltr","malayalam","match","matrix","matrix3d","media-controls-background","media-current-time-display","media-fullscreen-button","media-mute-button","media-play-button","media-return-to-realtime-button","media-rewind-button","media-seek-back-button","media-seek-forward-button","media-slider","media-sliderthumb","media-time-remaining-display","media-volume-slider","media-volume-slider-container","media-volume-sliderthumb","medium","menu","menulist","menulist-button","menulist-text","menulist-textfield","menutext","message-box","middle","min-intrinsic","mix","mongolian","monospace","move","multiple","myanmar","n-resize","narrower","ne-resize","nesw-resize","no-close-quote","no-drop","no-open-quote","no-repeat","none","normal","not-allowed","nowrap","ns-resize","numbers","numeric","nw-resize","nwse-resize","oblique","octal","open-quote","optimizeLegibility","optimizeSpeed","oriya","oromo","outset","outside","outside-shape","overlay","overline","padding","padding-box","painted","page","paused","persian","perspective","plus-darker","plus-lighter","pointer","polygon","portrait","pre","pre-line","pre-wrap","preserve-3d","progress","push-button","radial-gradient","radio","read-only","read-write","read-write-plaintext-only","rectangle","region","relative","repeat","repeating-linear-gradient","repeating-radial-gradient","repeat-x","repeat-y","reset","reverse","rgb","rgba","ridge","right","rotate","rotate3d","rotateX","rotateY","rotateZ","round","row-resize","rtl","run-in","running","s-resize","sans-serif","scale","scale3d","scaleX","scaleY","scaleZ","scroll","scrollbar","se-resize","searchfield","searchfield-cancel-button","searchfield-decoration","searchfield-results-button","searchfield-results-decoration","semi-condensed","semi-expanded","separate","serif","show","sidama","simp-chinese-formal","simp-chinese-informal","single","skew","skewX","skewY","skip-white-space","slide","slider-horizontal","slider-vertical","sliderthumb-horizontal","sliderthumb-vertical","slow","small","small-caps","small-caption","smaller","solid","somali","source-atop","source-in","source-out","source-over","space","spell-out","square","square-button","start","static","status-bar","stretch","stroke","sub","subpixel-antialiased","super","sw-resize","symbolic","symbols","table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row","table-row-group","tamil","telugu","text","text-bottom","text-top","textarea","textfield","thai","thick","thin","threeddarkshadow","threedface","threedhighlight","threedlightshadow","threedshadow","tibetan","tigre","tigrinya-er","tigrinya-er-abegede","tigrinya-et","tigrinya-et-abegede","to","top","trad-chinese-formal","trad-chinese-informal","translate","translate3d","translateX","translateY","translateZ","transparent","ultra-condensed","ultra-expanded","underline","up","upper-alpha","upper-armenian","upper-greek","upper-hexadecimal","upper-latin","upper-norwegian","upper-roman","uppercase","urdu","url","var","vertical","vertical-text","visible","visibleFill","visiblePainted","visibleStroke","visual","w-resize","wait","wave","wider","window","windowframe","windowtext","words","x-large","x-small","xor","xx-large","xx-small","bicubic","optimizespeed","grayscale","row","row-reverse","wrap","wrap-reverse","column-reverse","flex-start","flex-end","space-between","space-around"]; - - var wordOperatorKeywords_ = ["in","and","or","not","is not","is a","is","isnt","defined","if unless"], - blockKeywords_ = ["for","if","else","unless", "from", "to"], - commonAtoms_ = ["null","true","false","href","title","type","not-allowed","readonly","disabled"], - commonDef_ = ["@font-face", "@keyframes", "@media", "@viewport", "@page", "@host", "@supports", "@block", "@css"]; - - var hintWords = tagKeywords_.concat(documentTypes_,mediaTypes_,mediaFeatures_, - propertyKeywords_,nonStandardPropertyKeywords_, - colorKeywords_,valueKeywords_,fontProperties_, - wordOperatorKeywords_,blockKeywords_, - commonAtoms_,commonDef_); - - function wordRegexp(words) { - words = words.sort(function(a,b){return b > a;}); - return new RegExp("^((" + words.join(")|(") + "))\\b"); - } - - function keySet(array) { - var keys = {}; - for (var i = 0; i < array.length; ++i) keys[array[i]] = true; - return keys; - } - - function escapeRegExp(text) { - return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); - } - - CodeMirror.registerHelper("hintWords", "stylus", hintWords); - CodeMirror.defineMIME("text/x-styl", "stylus"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/swift/index.html b/public/plugins/codemirror-5.17.0/mode/swift/index.html deleted file mode 100644 index 109f3fd..0000000 --- a/public/plugins/codemirror-5.17.0/mode/swift/index.html +++ /dev/null @@ -1,88 +0,0 @@ - - -CodeMirror: Swift mode - - - - - - - - - - -
-

Swift mode

-
- - - -

A simple mode for Swift

- -

MIME types defined: text/x-swift (Swift code)

-
diff --git a/public/plugins/codemirror-5.17.0/mode/swift/swift.js b/public/plugins/codemirror-5.17.0/mode/swift/swift.js deleted file mode 100644 index 3c28ced..0000000 --- a/public/plugins/codemirror-5.17.0/mode/swift/swift.js +++ /dev/null @@ -1,202 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Swift mode created by Michael Kaminsky https://github.com/mkaminsky11 - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") - mod(require("../../lib/codemirror")) - else if (typeof define == "function" && define.amd) - define(["../../lib/codemirror"], mod) - else - mod(CodeMirror) -})(function(CodeMirror) { - "use strict" - - function wordSet(words) { - var set = {} - for (var i = 0; i < words.length; i++) set[words[i]] = true - return set - } - - var keywords = wordSet(["var","let","class","deinit","enum","extension","func","import","init","protocol", - "static","struct","subscript","typealias","as","dynamicType","is","new","super", - "self","Self","Type","__COLUMN__","__FILE__","__FUNCTION__","__LINE__","break","case", - "continue","default","do","else","fallthrough","if","in","for","return","switch", - "where","while","associativity","didSet","get","infix","inout","left","mutating", - "none","nonmutating","operator","override","postfix","precedence","prefix","right", - "set","unowned","weak","willSet"]) - var definingKeywords = wordSet(["var","let","class","enum","extension","func","import","protocol","struct", - "typealias","dynamicType","for"]) - var atoms = wordSet(["Infinity","NaN","undefined","null","true","false","on","off","yes","no","nil","null", - "this","super"]) - var types = wordSet(["String","bool","int","string","double","Double","Int","Float","float","public", - "private","extension"]) - var operators = "+-/*%=|&<>#" - var punc = ";,.(){}[]" - var number = /^-?(?:(?:[\d_]+\.[_\d]*|\.[_\d]+|0o[0-7_\.]+|0b[01_\.]+)(?:e-?[\d_]+)?|0x[\d_a-f\.]+(?:p-?[\d_]+)?)/i - var identifier = /^[_A-Za-z$][_A-Za-z$0-9]*/ - var property = /^[@\.][_A-Za-z$][_A-Za-z$0-9]*/ - var regexp = /^\/(?!\s)(?:\/\/)?(?:\\.|[^\/])+\// - - function tokenBase(stream, state, prev) { - if (stream.sol()) state.indented = stream.indentation() - if (stream.eatSpace()) return null - - var ch = stream.peek() - if (ch == "/") { - if (stream.match("//")) { - stream.skipToEnd() - return "comment" - } - if (stream.match("/*")) { - state.tokenize.push(tokenComment) - return tokenComment(stream, state) - } - if (stream.match(regexp)) return "string-2" - } - if (operators.indexOf(ch) > -1) { - stream.next() - return "operator" - } - if (punc.indexOf(ch) > -1) { - stream.next() - stream.match("..") - return "punctuation" - } - if (ch == '"' || ch == "'") { - stream.next() - var tokenize = tokenString(ch) - state.tokenize.push(tokenize) - return tokenize(stream, state) - } - - if (stream.match(number)) return "number" - if (stream.match(property)) return "property" - - if (stream.match(identifier)) { - var ident = stream.current() - if (keywords.hasOwnProperty(ident)) { - if (definingKeywords.hasOwnProperty(ident)) - state.prev = "define" - return "keyword" - } - if (types.hasOwnProperty(ident)) return "variable-2" - if (atoms.hasOwnProperty(ident)) return "atom" - if (prev == "define") return "def" - return "variable" - } - - stream.next() - return null - } - - function tokenUntilClosingParen() { - var depth = 0 - return function(stream, state, prev) { - var inner = tokenBase(stream, state, prev) - if (inner == "punctuation") { - if (stream.current() == "(") ++depth - else if (stream.current() == ")") { - if (depth == 0) { - stream.backUp(1) - state.tokenize.pop() - return state.tokenize[state.tokenize.length - 1](stream, state) - } - else --depth - } - } - return inner - } - } - - function tokenString(quote) { - return function(stream, state) { - var ch, escaped = false - while (ch = stream.next()) { - if (escaped) { - if (ch == "(") { - state.tokenize.push(tokenUntilClosingParen()) - return "string" - } - escaped = false - } else if (ch == quote) { - break - } else { - escaped = ch == "\\" - } - } - state.tokenize.pop() - return "string" - } - } - - function tokenComment(stream, state) { - stream.match(/^(?:[^*]|\*(?!\/))*/) - if (stream.match("*/")) state.tokenize.pop() - return "comment" - } - - function Context(prev, align, indented) { - this.prev = prev - this.align = align - this.indented = indented - } - - function pushContext(state, stream) { - var align = stream.match(/^\s*($|\/[\/\*])/, false) ? null : stream.column() + 1 - state.context = new Context(state.context, align, state.indented) - } - - function popContext(state) { - if (state.context) { - state.indented = state.context.indented - state.context = state.context.prev - } - } - - CodeMirror.defineMode("swift", function(config) { - return { - startState: function() { - return { - prev: null, - context: null, - indented: 0, - tokenize: [] - } - }, - - token: function(stream, state) { - var prev = state.prev - state.prev = null - var tokenize = state.tokenize[state.tokenize.length - 1] || tokenBase - var style = tokenize(stream, state, prev) - if (!style || style == "comment") state.prev = prev - else if (!state.prev) state.prev = style - - if (style == "punctuation") { - var bracket = /[\(\[\{]|([\]\)\}])/.exec(stream.current()) - if (bracket) (bracket[1] ? popContext : pushContext)(state, stream) - } - - return style - }, - - indent: function(state, textAfter) { - var cx = state.context - if (!cx) return 0 - var closing = /^[\]\}\)]/.test(textAfter) - if (cx.align != null) return cx.align - (closing ? 1 : 0) - return cx.indented + (closing ? 0 : config.indentUnit) - }, - - electricInput: /^\s*[\)\}\]]$/, - - lineComment: "//", - blockCommentStart: "/*", - blockCommentEnd: "*/" - } - }) - - CodeMirror.defineMIME("text/x-swift","swift") -}); diff --git a/public/plugins/codemirror-5.17.0/mode/tcl/index.html b/public/plugins/codemirror-5.17.0/mode/tcl/index.html deleted file mode 100644 index ce4ad34..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tcl/index.html +++ /dev/null @@ -1,142 +0,0 @@ - - -CodeMirror: Tcl mode - - - - - - - - - - -
-

Tcl mode

-
- - -

MIME types defined: text/x-tcl.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/tcl/tcl.js b/public/plugins/codemirror-5.17.0/mode/tcl/tcl.js deleted file mode 100644 index 8c76d52..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tcl/tcl.js +++ /dev/null @@ -1,139 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -//tcl mode by Ford_Lawnmower :: Based on Velocity mode by Steve O'Hara - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("tcl", function() { - function parseWords(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - var keywords = parseWords("Tcl safe after append array auto_execok auto_import auto_load " + - "auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror " + - "binary break catch cd close concat continue dde eof encoding error " + - "eval exec exit expr fblocked fconfigure fcopy file fileevent filename " + - "filename flush for foreach format gets glob global history http if " + - "incr info interp join lappend lindex linsert list llength load lrange " + - "lreplace lsearch lset lsort memory msgcat namespace open package parray " + - "pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp " + - "registry regsub rename resource return scan seek set socket source split " + - "string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord " + - "tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest " + - "tclvars tell time trace unknown unset update uplevel upvar variable " + - "vwait"); - var functions = parseWords("if elseif else and not or eq ne in ni for foreach while switch"); - var isOperatorChar = /[+\-*&%=<>!?^\/\|]/; - function chain(stream, state, f) { - state.tokenize = f; - return f(stream, state); - } - function tokenBase(stream, state) { - var beforeParams = state.beforeParams; - state.beforeParams = false; - var ch = stream.next(); - if ((ch == '"' || ch == "'") && state.inParams) { - return chain(stream, state, tokenString(ch)); - } else if (/[\[\]{}\(\),;\.]/.test(ch)) { - if (ch == "(" && beforeParams) state.inParams = true; - else if (ch == ")") state.inParams = false; - return null; - } else if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } else if (ch == "#") { - if (stream.eat("*")) - return chain(stream, state, tokenComment); - if (ch == "#" && stream.match(/ *\[ *\[/)) - return chain(stream, state, tokenUnparsed); - stream.skipToEnd(); - return "comment"; - } else if (ch == '"') { - stream.skipTo(/"/); - return "comment"; - } else if (ch == "$") { - stream.eatWhile(/[$_a-z0-9A-Z\.{:]/); - stream.eatWhile(/}/); - state.beforeParams = true; - return "builtin"; - } else if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "comment"; - } else { - stream.eatWhile(/[\w\$_{}\xa1-\uffff]/); - var word = stream.current().toLowerCase(); - if (keywords && keywords.propertyIsEnumerable(word)) - return "keyword"; - if (functions && functions.propertyIsEnumerable(word)) { - state.beforeParams = true; - return "keyword"; - } - return null; - } - } - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) { - end = true; - break; - } - escaped = !escaped && next == "\\"; - } - if (end) state.tokenize = tokenBase; - return "string"; - }; - } - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "#" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - function tokenUnparsed(stream, state) { - var maybeEnd = 0, ch; - while (ch = stream.next()) { - if (ch == "#" && maybeEnd == 2) { - state.tokenize = tokenBase; - break; - } - if (ch == "]") - maybeEnd++; - else if (ch != " ") - maybeEnd = 0; - } - return "meta"; - } - return { - startState: function() { - return { - tokenize: tokenBase, - beforeParams: false, - inParams: false - }; - }, - token: function(stream, state) { - if (stream.eatSpace()) return null; - return state.tokenize(stream, state); - } - }; -}); -CodeMirror.defineMIME("text/x-tcl", "tcl"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/textile/index.html b/public/plugins/codemirror-5.17.0/mode/textile/index.html deleted file mode 100644 index 42b156b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/textile/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - -CodeMirror: Textile mode - - - - - - - - - -
-

Textile mode

-
- - -

MIME types defined: text/x-textile.

- -

Parsing/Highlighting Tests: normal, verbose.

- -
diff --git a/public/plugins/codemirror-5.17.0/mode/textile/test.js b/public/plugins/codemirror-5.17.0/mode/textile/test.js deleted file mode 100644 index 49cdaf9..0000000 --- a/public/plugins/codemirror-5.17.0/mode/textile/test.js +++ /dev/null @@ -1,417 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({tabSize: 4}, 'textile'); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT('simpleParagraphs', - 'Some text.', - '', - 'Some more text.'); - - /* - * Phrase Modifiers - */ - - MT('em', - 'foo [em _bar_]'); - - MT('emBoogus', - 'code_mirror'); - - MT('strong', - 'foo [strong *bar*]'); - - MT('strongBogus', - '3 * 3 = 9'); - - MT('italic', - 'foo [em __bar__]'); - - MT('italicBogus', - 'code__mirror'); - - MT('bold', - 'foo [strong **bar**]'); - - MT('boldBogus', - '3 ** 3 = 27'); - - MT('simpleLink', - '[link "CodeMirror":http://codemirror.net]'); - - MT('referenceLink', - '[link "CodeMirror":code_mirror]', - 'Normal Text.', - '[link [[code_mirror]]http://codemirror.net]'); - - MT('footCite', - 'foo bar[qualifier [[1]]]'); - - MT('footCiteBogus', - 'foo bar[[1a2]]'); - - MT('special-characters', - 'Registered [tag (r)], ' + - 'Trademark [tag (tm)], and ' + - 'Copyright [tag (c)] 2008'); - - MT('cite', - "A book is [keyword ??The Count of Monte Cristo??] by Dumas."); - - MT('additionAndDeletion', - 'The news networks declared [negative -Al Gore-] ' + - '[positive +George W. Bush+] the winner in Florida.'); - - MT('subAndSup', - 'f(x, n) = log [builtin ~4~] x [builtin ^n^]'); - - MT('spanAndCode', - 'A [quote %span element%] and [atom @code element@]'); - - MT('spanBogus', - 'Percentage 25% is not a span.'); - - MT('citeBogus', - 'Question? is not a citation.'); - - MT('codeBogus', - 'user@example.com'); - - MT('subBogus', - '~username'); - - MT('supBogus', - 'foo ^ bar'); - - MT('deletionBogus', - '3 - 3 = 0'); - - MT('additionBogus', - '3 + 3 = 6'); - - MT('image', - 'An image: [string !http://www.example.com/image.png!]'); - - MT('imageWithAltText', - 'An image: [string !http://www.example.com/image.png (Alt Text)!]'); - - MT('imageWithUrl', - 'An image: [string !http://www.example.com/image.png!:http://www.example.com/]'); - - /* - * Headers - */ - - MT('h1', - '[header&header-1 h1. foo]'); - - MT('h2', - '[header&header-2 h2. foo]'); - - MT('h3', - '[header&header-3 h3. foo]'); - - MT('h4', - '[header&header-4 h4. foo]'); - - MT('h5', - '[header&header-5 h5. foo]'); - - MT('h6', - '[header&header-6 h6. foo]'); - - MT('h7Bogus', - 'h7. foo'); - - MT('multipleHeaders', - '[header&header-1 h1. Heading 1]', - '', - 'Some text.', - '', - '[header&header-2 h2. Heading 2]', - '', - 'More text.'); - - MT('h1inline', - '[header&header-1 h1. foo ][header&header-1&em _bar_][header&header-1 baz]'); - - /* - * Lists - */ - - MT('ul', - 'foo', - 'bar', - '', - '[variable-2 * foo]', - '[variable-2 * bar]'); - - MT('ulNoBlank', - 'foo', - 'bar', - '[variable-2 * foo]', - '[variable-2 * bar]'); - - MT('ol', - 'foo', - 'bar', - '', - '[variable-2 # foo]', - '[variable-2 # bar]'); - - MT('olNoBlank', - 'foo', - 'bar', - '[variable-2 # foo]', - '[variable-2 # bar]'); - - MT('ulFormatting', - '[variable-2 * ][variable-2&em _foo_][variable-2 bar]', - '[variable-2 * ][variable-2&strong *][variable-2&em&strong _foo_]' + - '[variable-2&strong *][variable-2 bar]', - '[variable-2 * ][variable-2&strong *foo*][variable-2 bar]'); - - MT('olFormatting', - '[variable-2 # ][variable-2&em _foo_][variable-2 bar]', - '[variable-2 # ][variable-2&strong *][variable-2&em&strong _foo_]' + - '[variable-2&strong *][variable-2 bar]', - '[variable-2 # ][variable-2&strong *foo*][variable-2 bar]'); - - MT('ulNested', - '[variable-2 * foo]', - '[variable-3 ** bar]', - '[keyword *** bar]', - '[variable-2 **** bar]', - '[variable-3 ** bar]'); - - MT('olNested', - '[variable-2 # foo]', - '[variable-3 ## bar]', - '[keyword ### bar]', - '[variable-2 #### bar]', - '[variable-3 ## bar]'); - - MT('ulNestedWithOl', - '[variable-2 * foo]', - '[variable-3 ## bar]', - '[keyword *** bar]', - '[variable-2 #### bar]', - '[variable-3 ** bar]'); - - MT('olNestedWithUl', - '[variable-2 # foo]', - '[variable-3 ** bar]', - '[keyword ### bar]', - '[variable-2 **** bar]', - '[variable-3 ## bar]'); - - MT('definitionList', - '[number - coffee := Hot ][number&em _and_][number black]', - '', - 'Normal text.'); - - MT('definitionListSpan', - '[number - coffee :=]', - '', - '[number Hot ][number&em _and_][number black =:]', - '', - 'Normal text.'); - - MT('boo', - '[number - dog := woof woof]', - '[number - cat := meow meow]', - '[number - whale :=]', - '[number Whale noises.]', - '', - '[number Also, ][number&em _splashing_][number . =:]'); - - /* - * Attributes - */ - - MT('divWithAttribute', - '[punctuation div][punctuation&attribute (#my-id)][punctuation . foo bar]'); - - MT('divWithAttributeAnd2emRightPadding', - '[punctuation div][punctuation&attribute (#my-id)((][punctuation . foo bar]'); - - MT('divWithClassAndId', - '[punctuation div][punctuation&attribute (my-class#my-id)][punctuation . foo bar]'); - - MT('paragraphWithCss', - 'p[attribute {color:red;}]. foo bar'); - - MT('paragraphNestedStyles', - 'p. [strong *foo ][strong&em _bar_][strong *]'); - - MT('paragraphWithLanguage', - 'p[attribute [[fr]]]. Parlez-vous français?'); - - MT('paragraphLeftAlign', - 'p[attribute <]. Left'); - - MT('paragraphRightAlign', - 'p[attribute >]. Right'); - - MT('paragraphRightAlign', - 'p[attribute =]. Center'); - - MT('paragraphJustified', - 'p[attribute <>]. Justified'); - - MT('paragraphWithLeftIndent1em', - 'p[attribute (]. Left'); - - MT('paragraphWithRightIndent1em', - 'p[attribute )]. Right'); - - MT('paragraphWithLeftIndent2em', - 'p[attribute ((]. Left'); - - MT('paragraphWithRightIndent2em', - 'p[attribute ))]. Right'); - - MT('paragraphWithLeftIndent3emRightIndent2em', - 'p[attribute ((())]. Right'); - - MT('divFormatting', - '[punctuation div. ][punctuation&strong *foo ]' + - '[punctuation&strong&em _bar_][punctuation&strong *]'); - - MT('phraseModifierAttributes', - 'p[attribute (my-class)]. This is a paragraph that has a class and' + - ' this [em _][em&attribute (#special-phrase)][em emphasized phrase_]' + - ' has an id.'); - - MT('linkWithClass', - '[link "(my-class). This is a link with class":http://redcloth.org]'); - - /* - * Layouts - */ - - MT('paragraphLayouts', - 'p. This is one paragraph.', - '', - 'p. This is another.'); - - MT('div', - '[punctuation div. foo bar]'); - - MT('pre', - '[operator pre. Text]'); - - MT('bq.', - '[bracket bq. foo bar]', - '', - 'Normal text.'); - - MT('footnote', - '[variable fn123. foo ][variable&strong *bar*]'); - - /* - * Spanning Layouts - */ - - MT('bq..ThenParagraph', - '[bracket bq.. foo bar]', - '', - '[bracket More quote.]', - 'p. Normal Text'); - - MT('bq..ThenH1', - '[bracket bq.. foo bar]', - '', - '[bracket More quote.]', - '[header&header-1 h1. Header Text]'); - - MT('bc..ThenParagraph', - '[atom bc.. # Some ruby code]', - '[atom obj = {foo: :bar}]', - '[atom puts obj]', - '', - '[atom obj[[:love]] = "*love*"]', - '[atom puts obj.love.upcase]', - '', - 'p. Normal text.'); - - MT('fn1..ThenParagraph', - '[variable fn1.. foo bar]', - '', - '[variable More.]', - 'p. Normal Text'); - - MT('pre..ThenParagraph', - '[operator pre.. foo bar]', - '', - '[operator More.]', - 'p. Normal Text'); - - /* - * Tables - */ - - MT('table', - '[variable-3&operator |_. name |_. age|]', - '[variable-3 |][variable-3&strong *Walter*][variable-3 | 5 |]', - '[variable-3 |Florence| 6 |]', - '', - 'p. Normal text.'); - - MT('tableWithAttributes', - '[variable-3&operator |_. name |_. age|]', - '[variable-3 |][variable-3&attribute /2.][variable-3 Jim |]', - '[variable-3 |][variable-3&attribute \\2{color: red}.][variable-3 Sam |]'); - - /* - * HTML - */ - - MT('html', - '[comment
]', - '[comment
]', - '', - '[header&header-1 h1. Welcome]', - '', - '[variable-2 * Item one]', - '[variable-2 * Item two]', - '', - '[comment Example]', - '', - '[comment
]', - '[comment
]'); - - MT('inlineHtml', - 'I can use HTML directly in my [comment Textile].'); - - /* - * No-Textile - */ - - MT('notextile', - '[string-2 notextile. *No* formatting]'); - - MT('notextileInline', - 'Use [string-2 ==*asterisks*==] for [strong *strong*] text.'); - - MT('notextileWithPre', - '[operator pre. *No* formatting]'); - - MT('notextileWithSpanningPre', - '[operator pre.. *No* formatting]', - '', - '[operator *No* formatting]'); - - /* Only toggling phrases between non-word chars. */ - - MT('phrase-in-word', - 'foo_bar_baz'); - - MT('phrase-non-word', - '[negative -x-] aaa-bbb ccc-ddd [negative -eee-] fff [negative -ggg-]'); - - MT('phrase-lone-dash', - 'foo - bar - baz'); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/textile/textile.js b/public/plugins/codemirror-5.17.0/mode/textile/textile.js deleted file mode 100644 index a6f7576..0000000 --- a/public/plugins/codemirror-5.17.0/mode/textile/textile.js +++ /dev/null @@ -1,469 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") { // CommonJS - mod(require("../../lib/codemirror")); - } else if (typeof define == "function" && define.amd) { // AMD - define(["../../lib/codemirror"], mod); - } else { // Plain browser env - mod(CodeMirror); - } -})(function(CodeMirror) { - "use strict"; - - var TOKEN_STYLES = { - addition: "positive", - attributes: "attribute", - bold: "strong", - cite: "keyword", - code: "atom", - definitionList: "number", - deletion: "negative", - div: "punctuation", - em: "em", - footnote: "variable", - footCite: "qualifier", - header: "header", - html: "comment", - image: "string", - italic: "em", - link: "link", - linkDefinition: "link", - list1: "variable-2", - list2: "variable-3", - list3: "keyword", - notextile: "string-2", - pre: "operator", - p: "property", - quote: "bracket", - span: "quote", - specialChar: "tag", - strong: "strong", - sub: "builtin", - sup: "builtin", - table: "variable-3", - tableHeading: "operator" - }; - - function startNewLine(stream, state) { - state.mode = Modes.newLayout; - state.tableHeading = false; - - if (state.layoutType === "definitionList" && state.spanningLayout && - stream.match(RE("definitionListEnd"), false)) - state.spanningLayout = false; - } - - function handlePhraseModifier(stream, state, ch) { - if (ch === "_") { - if (stream.eat("_")) - return togglePhraseModifier(stream, state, "italic", /__/, 2); - else - return togglePhraseModifier(stream, state, "em", /_/, 1); - } - - if (ch === "*") { - if (stream.eat("*")) { - return togglePhraseModifier(stream, state, "bold", /\*\*/, 2); - } - return togglePhraseModifier(stream, state, "strong", /\*/, 1); - } - - if (ch === "[") { - if (stream.match(/\d+\]/)) state.footCite = true; - return tokenStyles(state); - } - - if (ch === "(") { - var spec = stream.match(/^(r|tm|c)\)/); - if (spec) - return tokenStylesWith(state, TOKEN_STYLES.specialChar); - } - - if (ch === "<" && stream.match(/(\w+)[^>]+>[^<]+<\/\1>/)) - return tokenStylesWith(state, TOKEN_STYLES.html); - - if (ch === "?" && stream.eat("?")) - return togglePhraseModifier(stream, state, "cite", /\?\?/, 2); - - if (ch === "=" && stream.eat("=")) - return togglePhraseModifier(stream, state, "notextile", /==/, 2); - - if (ch === "-" && !stream.eat("-")) - return togglePhraseModifier(stream, state, "deletion", /-/, 1); - - if (ch === "+") - return togglePhraseModifier(stream, state, "addition", /\+/, 1); - - if (ch === "~") - return togglePhraseModifier(stream, state, "sub", /~/, 1); - - if (ch === "^") - return togglePhraseModifier(stream, state, "sup", /\^/, 1); - - if (ch === "%") - return togglePhraseModifier(stream, state, "span", /%/, 1); - - if (ch === "@") - return togglePhraseModifier(stream, state, "code", /@/, 1); - - if (ch === "!") { - var type = togglePhraseModifier(stream, state, "image", /(?:\([^\)]+\))?!/, 1); - stream.match(/^:\S+/); // optional Url portion - return type; - } - return tokenStyles(state); - } - - function togglePhraseModifier(stream, state, phraseModifier, closeRE, openSize) { - var charBefore = stream.pos > openSize ? stream.string.charAt(stream.pos - openSize - 1) : null; - var charAfter = stream.peek(); - if (state[phraseModifier]) { - if ((!charAfter || /\W/.test(charAfter)) && charBefore && /\S/.test(charBefore)) { - var type = tokenStyles(state); - state[phraseModifier] = false; - return type; - } - } else if ((!charBefore || /\W/.test(charBefore)) && charAfter && /\S/.test(charAfter) && - stream.match(new RegExp("^.*\\S" + closeRE.source + "(?:\\W|$)"), false)) { - state[phraseModifier] = true; - state.mode = Modes.attributes; - } - return tokenStyles(state); - }; - - function tokenStyles(state) { - var disabled = textileDisabled(state); - if (disabled) return disabled; - - var styles = []; - if (state.layoutType) styles.push(TOKEN_STYLES[state.layoutType]); - - styles = styles.concat(activeStyles( - state, "addition", "bold", "cite", "code", "deletion", "em", "footCite", - "image", "italic", "link", "span", "strong", "sub", "sup", "table", "tableHeading")); - - if (state.layoutType === "header") - styles.push(TOKEN_STYLES.header + "-" + state.header); - - return styles.length ? styles.join(" ") : null; - } - - function textileDisabled(state) { - var type = state.layoutType; - - switch(type) { - case "notextile": - case "code": - case "pre": - return TOKEN_STYLES[type]; - default: - if (state.notextile) - return TOKEN_STYLES.notextile + (type ? (" " + TOKEN_STYLES[type]) : ""); - return null; - } - } - - function tokenStylesWith(state, extraStyles) { - var disabled = textileDisabled(state); - if (disabled) return disabled; - - var type = tokenStyles(state); - if (extraStyles) - return type ? (type + " " + extraStyles) : extraStyles; - else - return type; - } - - function activeStyles(state) { - var styles = []; - for (var i = 1; i < arguments.length; ++i) { - if (state[arguments[i]]) - styles.push(TOKEN_STYLES[arguments[i]]); - } - return styles; - } - - function blankLine(state) { - var spanningLayout = state.spanningLayout, type = state.layoutType; - - for (var key in state) if (state.hasOwnProperty(key)) - delete state[key]; - - state.mode = Modes.newLayout; - if (spanningLayout) { - state.layoutType = type; - state.spanningLayout = true; - } - } - - var REs = { - cache: {}, - single: { - bc: "bc", - bq: "bq", - definitionList: /- [^(?::=)]+:=+/, - definitionListEnd: /.*=:\s*$/, - div: "div", - drawTable: /\|.*\|/, - foot: /fn\d+/, - header: /h[1-6]/, - html: /\s*<(?:\/)?(\w+)(?:[^>]+)?>(?:[^<]+<\/\1>)?/, - link: /[^"]+":\S/, - linkDefinition: /\[[^\s\]]+\]\S+/, - list: /(?:#+|\*+)/, - notextile: "notextile", - para: "p", - pre: "pre", - table: "table", - tableCellAttributes: /[\/\\]\d+/, - tableHeading: /\|_\./, - tableText: /[^"_\*\[\(\?\+~\^%@|-]+/, - text: /[^!"_=\*\[\(<\?\+~\^%@-]+/ - }, - attributes: { - align: /(?:<>|<|>|=)/, - selector: /\([^\(][^\)]+\)/, - lang: /\[[^\[\]]+\]/, - pad: /(?:\(+|\)+){1,2}/, - css: /\{[^\}]+\}/ - }, - createRe: function(name) { - switch (name) { - case "drawTable": - return REs.makeRe("^", REs.single.drawTable, "$"); - case "html": - return REs.makeRe("^", REs.single.html, "(?:", REs.single.html, ")*", "$"); - case "linkDefinition": - return REs.makeRe("^", REs.single.linkDefinition, "$"); - case "listLayout": - return REs.makeRe("^", REs.single.list, RE("allAttributes"), "*\\s+"); - case "tableCellAttributes": - return REs.makeRe("^", REs.choiceRe(REs.single.tableCellAttributes, - RE("allAttributes")), "+\\."); - case "type": - return REs.makeRe("^", RE("allTypes")); - case "typeLayout": - return REs.makeRe("^", RE("allTypes"), RE("allAttributes"), - "*\\.\\.?", "(\\s+|$)"); - case "attributes": - return REs.makeRe("^", RE("allAttributes"), "+"); - - case "allTypes": - return REs.choiceRe(REs.single.div, REs.single.foot, - REs.single.header, REs.single.bc, REs.single.bq, - REs.single.notextile, REs.single.pre, REs.single.table, - REs.single.para); - - case "allAttributes": - return REs.choiceRe(REs.attributes.selector, REs.attributes.css, - REs.attributes.lang, REs.attributes.align, REs.attributes.pad); - - default: - return REs.makeRe("^", REs.single[name]); - } - }, - makeRe: function() { - var pattern = ""; - for (var i = 0; i < arguments.length; ++i) { - var arg = arguments[i]; - pattern += (typeof arg === "string") ? arg : arg.source; - } - return new RegExp(pattern); - }, - choiceRe: function() { - var parts = [arguments[0]]; - for (var i = 1; i < arguments.length; ++i) { - parts[i * 2 - 1] = "|"; - parts[i * 2] = arguments[i]; - } - - parts.unshift("(?:"); - parts.push(")"); - return REs.makeRe.apply(null, parts); - } - }; - - function RE(name) { - return (REs.cache[name] || (REs.cache[name] = REs.createRe(name))); - } - - var Modes = { - newLayout: function(stream, state) { - if (stream.match(RE("typeLayout"), false)) { - state.spanningLayout = false; - return (state.mode = Modes.blockType)(stream, state); - } - var newMode; - if (!textileDisabled(state)) { - if (stream.match(RE("listLayout"), false)) - newMode = Modes.list; - else if (stream.match(RE("drawTable"), false)) - newMode = Modes.table; - else if (stream.match(RE("linkDefinition"), false)) - newMode = Modes.linkDefinition; - else if (stream.match(RE("definitionList"))) - newMode = Modes.definitionList; - else if (stream.match(RE("html"), false)) - newMode = Modes.html; - } - return (state.mode = (newMode || Modes.text))(stream, state); - }, - - blockType: function(stream, state) { - var match, type; - state.layoutType = null; - - if (match = stream.match(RE("type"))) - type = match[0]; - else - return (state.mode = Modes.text)(stream, state); - - if (match = type.match(RE("header"))) { - state.layoutType = "header"; - state.header = parseInt(match[0][1]); - } else if (type.match(RE("bq"))) { - state.layoutType = "quote"; - } else if (type.match(RE("bc"))) { - state.layoutType = "code"; - } else if (type.match(RE("foot"))) { - state.layoutType = "footnote"; - } else if (type.match(RE("notextile"))) { - state.layoutType = "notextile"; - } else if (type.match(RE("pre"))) { - state.layoutType = "pre"; - } else if (type.match(RE("div"))) { - state.layoutType = "div"; - } else if (type.match(RE("table"))) { - state.layoutType = "table"; - } - - state.mode = Modes.attributes; - return tokenStyles(state); - }, - - text: function(stream, state) { - if (stream.match(RE("text"))) return tokenStyles(state); - - var ch = stream.next(); - if (ch === '"') - return (state.mode = Modes.link)(stream, state); - return handlePhraseModifier(stream, state, ch); - }, - - attributes: function(stream, state) { - state.mode = Modes.layoutLength; - - if (stream.match(RE("attributes"))) - return tokenStylesWith(state, TOKEN_STYLES.attributes); - else - return tokenStyles(state); - }, - - layoutLength: function(stream, state) { - if (stream.eat(".") && stream.eat(".")) - state.spanningLayout = true; - - state.mode = Modes.text; - return tokenStyles(state); - }, - - list: function(stream, state) { - var match = stream.match(RE("list")); - state.listDepth = match[0].length; - var listMod = (state.listDepth - 1) % 3; - if (!listMod) - state.layoutType = "list1"; - else if (listMod === 1) - state.layoutType = "list2"; - else - state.layoutType = "list3"; - - state.mode = Modes.attributes; - return tokenStyles(state); - }, - - link: function(stream, state) { - state.mode = Modes.text; - if (stream.match(RE("link"))) { - stream.match(/\S+/); - return tokenStylesWith(state, TOKEN_STYLES.link); - } - return tokenStyles(state); - }, - - linkDefinition: function(stream, state) { - stream.skipToEnd(); - return tokenStylesWith(state, TOKEN_STYLES.linkDefinition); - }, - - definitionList: function(stream, state) { - stream.match(RE("definitionList")); - - state.layoutType = "definitionList"; - - if (stream.match(/\s*$/)) - state.spanningLayout = true; - else - state.mode = Modes.attributes; - - return tokenStyles(state); - }, - - html: function(stream, state) { - stream.skipToEnd(); - return tokenStylesWith(state, TOKEN_STYLES.html); - }, - - table: function(stream, state) { - state.layoutType = "table"; - return (state.mode = Modes.tableCell)(stream, state); - }, - - tableCell: function(stream, state) { - if (stream.match(RE("tableHeading"))) - state.tableHeading = true; - else - stream.eat("|"); - - state.mode = Modes.tableCellAttributes; - return tokenStyles(state); - }, - - tableCellAttributes: function(stream, state) { - state.mode = Modes.tableText; - - if (stream.match(RE("tableCellAttributes"))) - return tokenStylesWith(state, TOKEN_STYLES.attributes); - else - return tokenStyles(state); - }, - - tableText: function(stream, state) { - if (stream.match(RE("tableText"))) - return tokenStyles(state); - - if (stream.peek() === "|") { // end of cell - state.mode = Modes.tableCell; - return tokenStyles(state); - } - return handlePhraseModifier(stream, state, stream.next()); - } - }; - - CodeMirror.defineMode("textile", function() { - return { - startState: function() { - return { mode: Modes.newLayout }; - }, - token: function(stream, state) { - if (stream.sol()) startNewLine(stream, state); - return state.mode(stream, state); - }, - blankLine: blankLine - }; - }); - - CodeMirror.defineMIME("text/x-textile", "textile"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/tiddlywiki/index.html b/public/plugins/codemirror-5.17.0/mode/tiddlywiki/index.html deleted file mode 100644 index 77dd045..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tiddlywiki/index.html +++ /dev/null @@ -1,154 +0,0 @@ - - -CodeMirror: TiddlyWiki mode - - - - - - - - - - - -
-

TiddlyWiki mode

- - -
- - - -

TiddlyWiki mode supports a single configuration.

- -

MIME types defined: text/x-tiddlywiki.

-
diff --git a/public/plugins/codemirror-5.17.0/mode/tiddlywiki/tiddlywiki.css b/public/plugins/codemirror-5.17.0/mode/tiddlywiki/tiddlywiki.css deleted file mode 100644 index 9a69b63..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tiddlywiki/tiddlywiki.css +++ /dev/null @@ -1,14 +0,0 @@ -span.cm-underlined { - text-decoration: underline; -} -span.cm-strikethrough { - text-decoration: line-through; -} -span.cm-brace { - color: #170; - font-weight: bold; -} -span.cm-table { - color: blue; - font-weight: bold; -} diff --git a/public/plugins/codemirror-5.17.0/mode/tiddlywiki/tiddlywiki.js b/public/plugins/codemirror-5.17.0/mode/tiddlywiki/tiddlywiki.js deleted file mode 100644 index 1a3b3bc..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tiddlywiki/tiddlywiki.js +++ /dev/null @@ -1,308 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/*** - |''Name''|tiddlywiki.js| - |''Description''|Enables TiddlyWikiy syntax highlighting using CodeMirror| - |''Author''|PMario| - |''Version''|0.1.7| - |''Status''|''stable''| - |''Source''|[[GitHub|https://github.com/pmario/CodeMirror2/blob/tw-syntax/mode/tiddlywiki]]| - |''Documentation''|http://codemirror.tiddlyspace.com/| - |''License''|[[MIT License|http://www.opensource.org/licenses/mit-license.php]]| - |''CoreVersion''|2.5.0| - |''Requires''|codemirror.js| - |''Keywords''|syntax highlighting color code mirror codemirror| - ! Info - CoreVersion parameter is needed for TiddlyWiki only! -***/ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("tiddlywiki", function () { - // Tokenizer - var textwords = {}; - - var keywords = { - "allTags": true, "closeAll": true, "list": true, - "newJournal": true, "newTiddler": true, - "permaview": true, "saveChanges": true, - "search": true, "slider": true, "tabs": true, - "tag": true, "tagging": true, "tags": true, - "tiddler": true, "timeline": true, - "today": true, "version": true, "option": true, - "with": true, "filter": true - }; - - var isSpaceName = /[\w_\-]/i, - reHR = /^\-\-\-\-+$/, //
- reWikiCommentStart = /^\/\*\*\*$/, // /*** - reWikiCommentStop = /^\*\*\*\/$/, // ***/ - reBlockQuote = /^<<<$/, - - reJsCodeStart = /^\/\/\{\{\{$/, // //{{{ js block start - reJsCodeStop = /^\/\/\}\}\}$/, // //}}} js stop - reXmlCodeStart = /^$/, // xml block start - reXmlCodeStop = /^$/, // xml stop - - reCodeBlockStart = /^\{\{\{$/, // {{{ TW text div block start - reCodeBlockStop = /^\}\}\}$/, // }}} TW text stop - - reUntilCodeStop = /.*?\}\}\}/; - - function chain(stream, state, f) { - state.tokenize = f; - return f(stream, state); - } - - function tokenBase(stream, state) { - var sol = stream.sol(), ch = stream.peek(); - - state.block = false; // indicates the start of a code block. - - // check start of blocks - if (sol && /[<\/\*{}\-]/.test(ch)) { - if (stream.match(reCodeBlockStart)) { - state.block = true; - return chain(stream, state, twTokenCode); - } - if (stream.match(reBlockQuote)) - return 'quote'; - if (stream.match(reWikiCommentStart) || stream.match(reWikiCommentStop)) - return 'comment'; - if (stream.match(reJsCodeStart) || stream.match(reJsCodeStop) || stream.match(reXmlCodeStart) || stream.match(reXmlCodeStop)) - return 'comment'; - if (stream.match(reHR)) - return 'hr'; - } - - stream.next(); - if (sol && /[\/\*!#;:>|]/.test(ch)) { - if (ch == "!") { // tw header - stream.skipToEnd(); - return "header"; - } - if (ch == "*") { // tw list - stream.eatWhile('*'); - return "comment"; - } - if (ch == "#") { // tw numbered list - stream.eatWhile('#'); - return "comment"; - } - if (ch == ";") { // definition list, term - stream.eatWhile(';'); - return "comment"; - } - if (ch == ":") { // definition list, description - stream.eatWhile(':'); - return "comment"; - } - if (ch == ">") { // single line quote - stream.eatWhile(">"); - return "quote"; - } - if (ch == '|') - return 'header'; - } - - if (ch == '{' && stream.match(/\{\{/)) - return chain(stream, state, twTokenCode); - - // rudimentary html:// file:// link matching. TW knows much more ... - if (/[hf]/i.test(ch) && - /[ti]/i.test(stream.peek()) && - stream.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i)) - return "link"; - - // just a little string indicator, don't want to have the whole string covered - if (ch == '"') - return 'string'; - - if (ch == '~') // _no_ CamelCase indicator should be bold - return 'brace'; - - if (/[\[\]]/.test(ch) && stream.match(ch)) // check for [[..]] - return 'brace'; - - if (ch == "@") { // check for space link. TODO fix @@...@@ highlighting - stream.eatWhile(isSpaceName); - return "link"; - } - - if (/\d/.test(ch)) { // numbers - stream.eatWhile(/\d/); - return "number"; - } - - if (ch == "/") { // tw invisible comment - if (stream.eat("%")) { - return chain(stream, state, twTokenComment); - } else if (stream.eat("/")) { // - return chain(stream, state, twTokenEm); - } - } - - if (ch == "_" && stream.eat("_")) // tw underline - return chain(stream, state, twTokenUnderline); - - // strikethrough and mdash handling - if (ch == "-" && stream.eat("-")) { - // if strikethrough looks ugly, change CSS. - if (stream.peek() != ' ') - return chain(stream, state, twTokenStrike); - // mdash - if (stream.peek() == ' ') - return 'brace'; - } - - if (ch == "'" && stream.eat("'")) // tw bold - return chain(stream, state, twTokenStrong); - - if (ch == "<" && stream.eat("<")) // tw macro - return chain(stream, state, twTokenMacro); - - // core macro handling - stream.eatWhile(/[\w\$_]/); - return textwords.propertyIsEnumerable(stream.current()) ? "keyword" : null - } - - // tw invisible comment - function twTokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "%"); - } - return "comment"; - } - - // tw strong / bold - function twTokenStrong(stream, state) { - var maybeEnd = false, - ch; - while (ch = stream.next()) { - if (ch == "'" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "'"); - } - return "strong"; - } - - // tw code - function twTokenCode(stream, state) { - var sb = state.block; - - if (sb && stream.current()) { - return "comment"; - } - - if (!sb && stream.match(reUntilCodeStop)) { - state.tokenize = tokenBase; - return "comment"; - } - - if (sb && stream.sol() && stream.match(reCodeBlockStop)) { - state.tokenize = tokenBase; - return "comment"; - } - - stream.next(); - return "comment"; - } - - // tw em / italic - function twTokenEm(stream, state) { - var maybeEnd = false, - ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "/"); - } - return "em"; - } - - // tw underlined text - function twTokenUnderline(stream, state) { - var maybeEnd = false, - ch; - while (ch = stream.next()) { - if (ch == "_" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "_"); - } - return "underlined"; - } - - // tw strike through text looks ugly - // change CSS if needed - function twTokenStrike(stream, state) { - var maybeEnd = false, ch; - - while (ch = stream.next()) { - if (ch == "-" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "-"); - } - return "strikethrough"; - } - - // macro - function twTokenMacro(stream, state) { - if (stream.current() == '<<') { - return 'macro'; - } - - var ch = stream.next(); - if (!ch) { - state.tokenize = tokenBase; - return null; - } - if (ch == ">") { - if (stream.peek() == '>') { - stream.next(); - state.tokenize = tokenBase; - return "macro"; - } - } - - stream.eatWhile(/[\w\$_]/); - return keywords.propertyIsEnumerable(stream.current()) ? "keyword" : null - } - - // Interface - return { - startState: function () { - return {tokenize: tokenBase}; - }, - - token: function (stream, state) { - if (stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - return style; - } - }; -}); - -CodeMirror.defineMIME("text/x-tiddlywiki", "tiddlywiki"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/tiki/index.html b/public/plugins/codemirror-5.17.0/mode/tiki/index.html deleted file mode 100644 index 091c5fb..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tiki/index.html +++ /dev/null @@ -1,95 +0,0 @@ - - -CodeMirror: Tiki wiki mode - - - - - - - - - - -
-

Tiki wiki mode

- - -
- - - -
diff --git a/public/plugins/codemirror-5.17.0/mode/tiki/tiki.css b/public/plugins/codemirror-5.17.0/mode/tiki/tiki.css deleted file mode 100644 index 1d8704c..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tiki/tiki.css +++ /dev/null @@ -1,26 +0,0 @@ -.cm-tw-syntaxerror { - color: #FFF; - background-color: #900; -} - -.cm-tw-deleted { - text-decoration: line-through; -} - -.cm-tw-header5 { - font-weight: bold; -} -.cm-tw-listitem:first-child { /*Added first child to fix duplicate padding when highlighting*/ - padding-left: 10px; -} - -.cm-tw-box { - border-top-width: 0px !important; - border-style: solid; - border-width: 1px; - border-color: inherit; -} - -.cm-tw-underline { - text-decoration: underline; -} \ No newline at end of file diff --git a/public/plugins/codemirror-5.17.0/mode/tiki/tiki.js b/public/plugins/codemirror-5.17.0/mode/tiki/tiki.js deleted file mode 100644 index 5e05b1f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tiki/tiki.js +++ /dev/null @@ -1,312 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('tiki', function(config) { - function inBlock(style, terminator, returnTokenizer) { - return function(stream, state) { - while (!stream.eol()) { - if (stream.match(terminator)) { - state.tokenize = inText; - break; - } - stream.next(); - } - - if (returnTokenizer) state.tokenize = returnTokenizer; - - return style; - }; - } - - function inLine(style) { - return function(stream, state) { - while(!stream.eol()) { - stream.next(); - } - state.tokenize = inText; - return style; - }; - } - - function inText(stream, state) { - function chain(parser) { - state.tokenize = parser; - return parser(stream, state); - } - - var sol = stream.sol(); - var ch = stream.next(); - - //non start of line - switch (ch) { //switch is generally much faster than if, so it is used here - case "{": //plugin - stream.eat("/"); - stream.eatSpace(); - stream.eatWhile(/[^\s\u00a0=\"\'\/?(}]/); - state.tokenize = inPlugin; - return "tag"; - case "_": //bold - if (stream.eat("_")) - return chain(inBlock("strong", "__", inText)); - break; - case "'": //italics - if (stream.eat("'")) - return chain(inBlock("em", "''", inText)); - break; - case "(":// Wiki Link - if (stream.eat("(")) - return chain(inBlock("variable-2", "))", inText)); - break; - case "[":// Weblink - return chain(inBlock("variable-3", "]", inText)); - break; - case "|": //table - if (stream.eat("|")) - return chain(inBlock("comment", "||")); - break; - case "-": - if (stream.eat("=")) {//titleBar - return chain(inBlock("header string", "=-", inText)); - } else if (stream.eat("-")) {//deleted - return chain(inBlock("error tw-deleted", "--", inText)); - } - break; - case "=": //underline - if (stream.match("==")) - return chain(inBlock("tw-underline", "===", inText)); - break; - case ":": - if (stream.eat(":")) - return chain(inBlock("comment", "::")); - break; - case "^": //box - return chain(inBlock("tw-box", "^")); - break; - case "~": //np - if (stream.match("np~")) - return chain(inBlock("meta", "~/np~")); - break; - } - - //start of line types - if (sol) { - switch (ch) { - case "!": //header at start of line - if (stream.match('!!!!!')) { - return chain(inLine("header string")); - } else if (stream.match('!!!!')) { - return chain(inLine("header string")); - } else if (stream.match('!!!')) { - return chain(inLine("header string")); - } else if (stream.match('!!')) { - return chain(inLine("header string")); - } else { - return chain(inLine("header string")); - } - break; - case "*": //unordered list line item, or
  • at start of line - case "#": //ordered list line item, or
  • at start of line - case "+": //ordered list line item, or
  • at start of line - return chain(inLine("tw-listitem bracket")); - break; - } - } - - //stream.eatWhile(/[&{]/); was eating up plugins, turned off to act less like html and more like tiki - return null; - } - - var indentUnit = config.indentUnit; - - // Return variables for tokenizers - var pluginName, type; - function inPlugin(stream, state) { - var ch = stream.next(); - var peek = stream.peek(); - - if (ch == "}") { - state.tokenize = inText; - //type = ch == ")" ? "endPlugin" : "selfclosePlugin"; inPlugin - return "tag"; - } else if (ch == "(" || ch == ")") { - return "bracket"; - } else if (ch == "=") { - type = "equals"; - - if (peek == ">") { - ch = stream.next(); - peek = stream.peek(); - } - - //here we detect values directly after equal character with no quotes - if (!/[\'\"]/.test(peek)) { - state.tokenize = inAttributeNoQuote(); - } - //end detect values - - return "operator"; - } else if (/[\'\"]/.test(ch)) { - state.tokenize = inAttribute(ch); - return state.tokenize(stream, state); - } else { - stream.eatWhile(/[^\s\u00a0=\"\'\/?]/); - return "keyword"; - } - } - - function inAttribute(quote) { - return function(stream, state) { - while (!stream.eol()) { - if (stream.next() == quote) { - state.tokenize = inPlugin; - break; - } - } - return "string"; - }; - } - - function inAttributeNoQuote() { - return function(stream, state) { - while (!stream.eol()) { - var ch = stream.next(); - var peek = stream.peek(); - if (ch == " " || ch == "," || /[ )}]/.test(peek)) { - state.tokenize = inPlugin; - break; - } - } - return "string"; -}; - } - -var curState, setStyle; -function pass() { - for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]); -} - -function cont() { - pass.apply(null, arguments); - return true; -} - -function pushContext(pluginName, startOfLine) { - var noIndent = curState.context && curState.context.noIndent; - curState.context = { - prev: curState.context, - pluginName: pluginName, - indent: curState.indented, - startOfLine: startOfLine, - noIndent: noIndent - }; -} - -function popContext() { - if (curState.context) curState.context = curState.context.prev; -} - -function element(type) { - if (type == "openPlugin") {curState.pluginName = pluginName; return cont(attributes, endplugin(curState.startOfLine));} - else if (type == "closePlugin") { - var err = false; - if (curState.context) { - err = curState.context.pluginName != pluginName; - popContext(); - } else { - err = true; - } - if (err) setStyle = "error"; - return cont(endcloseplugin(err)); - } - else if (type == "string") { - if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata"); - if (curState.tokenize == inText) popContext(); - return cont(); - } - else return cont(); -} - -function endplugin(startOfLine) { - return function(type) { - if ( - type == "selfclosePlugin" || - type == "endPlugin" - ) - return cont(); - if (type == "endPlugin") {pushContext(curState.pluginName, startOfLine); return cont();} - return cont(); - }; -} - -function endcloseplugin(err) { - return function(type) { - if (err) setStyle = "error"; - if (type == "endPlugin") return cont(); - return pass(); - }; -} - -function attributes(type) { - if (type == "keyword") {setStyle = "attribute"; return cont(attributes);} - if (type == "equals") return cont(attvalue, attributes); - return pass(); -} -function attvalue(type) { - if (type == "keyword") {setStyle = "string"; return cont();} - if (type == "string") return cont(attvaluemaybe); - return pass(); -} -function attvaluemaybe(type) { - if (type == "string") return cont(attvaluemaybe); - else return pass(); -} -return { - startState: function() { - return {tokenize: inText, cc: [], indented: 0, startOfLine: true, pluginName: null, context: null}; - }, - token: function(stream, state) { - if (stream.sol()) { - state.startOfLine = true; - state.indented = stream.indentation(); - } - if (stream.eatSpace()) return null; - - setStyle = type = pluginName = null; - var style = state.tokenize(stream, state); - if ((style || type) && style != "comment") { - curState = state; - while (true) { - var comb = state.cc.pop() || element; - if (comb(type || style)) break; - } - } - state.startOfLine = false; - return setStyle || style; - }, - indent: function(state, textAfter) { - var context = state.context; - if (context && context.noIndent) return 0; - if (context && /^{\//.test(textAfter)) - context = context.prev; - while (context && !context.startOfLine) - context = context.prev; - if (context) return context.indent + indentUnit; - else return 0; - }, - electricChars: "/" - }; -}); - -CodeMirror.defineMIME("text/tiki", "tiki"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/toml/index.html b/public/plugins/codemirror-5.17.0/mode/toml/index.html deleted file mode 100644 index 90a2a02..0000000 --- a/public/plugins/codemirror-5.17.0/mode/toml/index.html +++ /dev/null @@ -1,73 +0,0 @@ - - -CodeMirror: TOML Mode - - - - - - - - - -
    -

    TOML Mode

    -
    - -

    The TOML Mode

    -

    Created by Forbes Lindesay.

    -

    MIME type defined: text/x-toml.

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/toml/toml.js b/public/plugins/codemirror-5.17.0/mode/toml/toml.js deleted file mode 100644 index baeca15..0000000 --- a/public/plugins/codemirror-5.17.0/mode/toml/toml.js +++ /dev/null @@ -1,88 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("toml", function () { - return { - startState: function () { - return { - inString: false, - stringType: "", - lhs: true, - inArray: 0 - }; - }, - token: function (stream, state) { - //check for state changes - if (!state.inString && ((stream.peek() == '"') || (stream.peek() == "'"))) { - state.stringType = stream.peek(); - stream.next(); // Skip quote - state.inString = true; // Update state - } - if (stream.sol() && state.inArray === 0) { - state.lhs = true; - } - //return state - if (state.inString) { - while (state.inString && !stream.eol()) { - if (stream.peek() === state.stringType) { - stream.next(); // Skip quote - state.inString = false; // Clear flag - } else if (stream.peek() === '\\') { - stream.next(); - stream.next(); - } else { - stream.match(/^.[^\\\"\']*/); - } - } - return state.lhs ? "property string" : "string"; // Token style - } else if (state.inArray && stream.peek() === ']') { - stream.next(); - state.inArray--; - return 'bracket'; - } else if (state.lhs && stream.peek() === '[' && stream.skipTo(']')) { - stream.next();//skip closing ] - // array of objects has an extra open & close [] - if (stream.peek() === ']') stream.next(); - return "atom"; - } else if (stream.peek() === "#") { - stream.skipToEnd(); - return "comment"; - } else if (stream.eatSpace()) { - return null; - } else if (state.lhs && stream.eatWhile(function (c) { return c != '=' && c != ' '; })) { - return "property"; - } else if (state.lhs && stream.peek() === "=") { - stream.next(); - state.lhs = false; - return null; - } else if (!state.lhs && stream.match(/^\d\d\d\d[\d\-\:\.T]*Z/)) { - return 'atom'; //date - } else if (!state.lhs && (stream.match('true') || stream.match('false'))) { - return 'atom'; - } else if (!state.lhs && stream.peek() === '[') { - state.inArray++; - stream.next(); - return 'bracket'; - } else if (!state.lhs && stream.match(/^\-?\d+(?:\.\d+)?/)) { - return 'number'; - } else if (!stream.eatSpace()) { - stream.next(); - } - return null; - } - }; -}); - -CodeMirror.defineMIME('text/x-toml', 'toml'); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/tornado/index.html b/public/plugins/codemirror-5.17.0/mode/tornado/index.html deleted file mode 100644 index 8ee7ef5..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tornado/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - -CodeMirror: Tornado template mode - - - - - - - - - - - - -
    -

    Tornado template mode

    -
    - - - -

    Mode for HTML with embedded Tornado template markup.

    - -

    MIME types defined: text/x-tornado

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/tornado/tornado.js b/public/plugins/codemirror-5.17.0/mode/tornado/tornado.js deleted file mode 100644 index dbfbc34..0000000 --- a/public/plugins/codemirror-5.17.0/mode/tornado/tornado.js +++ /dev/null @@ -1,68 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../htmlmixed/htmlmixed"), - require("../../addon/mode/overlay")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../htmlmixed/htmlmixed", - "../../addon/mode/overlay"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("tornado:inner", function() { - var keywords = ["and","as","assert","autoescape","block","break","class","comment","context", - "continue","datetime","def","del","elif","else","end","escape","except", - "exec","extends","false","finally","for","from","global","if","import","in", - "include","is","json_encode","lambda","length","linkify","load","module", - "none","not","or","pass","print","put","raise","raw","return","self","set", - "squeeze","super","true","try","url_escape","while","with","without","xhtml_escape","yield"]; - keywords = new RegExp("^((" + keywords.join(")|(") + "))\\b"); - - function tokenBase (stream, state) { - stream.eatWhile(/[^\{]/); - var ch = stream.next(); - if (ch == "{") { - if (ch = stream.eat(/\{|%|#/)) { - state.tokenize = inTag(ch); - return "tag"; - } - } - } - function inTag (close) { - if (close == "{") { - close = "}"; - } - return function (stream, state) { - var ch = stream.next(); - if ((ch == close) && stream.eat("}")) { - state.tokenize = tokenBase; - return "tag"; - } - if (stream.match(keywords)) { - return "keyword"; - } - return close == "#" ? "comment" : "string"; - }; - } - return { - startState: function () { - return {tokenize: tokenBase}; - }, - token: function (stream, state) { - return state.tokenize(stream, state); - } - }; - }); - - CodeMirror.defineMode("tornado", function(config) { - var htmlBase = CodeMirror.getMode(config, "text/html"); - var tornadoInner = CodeMirror.getMode(config, "tornado:inner"); - return CodeMirror.overlayMode(htmlBase, tornadoInner); - }); - - CodeMirror.defineMIME("text/x-tornado", "tornado"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/troff/index.html b/public/plugins/codemirror-5.17.0/mode/troff/index.html deleted file mode 100644 index 7c5a54e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/troff/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - -CodeMirror: troff mode - - - - - - - - - - -
    -

    troff

    - - - - - - -

    MIME types defined: troff.

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/troff/troff.js b/public/plugins/codemirror-5.17.0/mode/troff/troff.js deleted file mode 100644 index 86154b6..0000000 --- a/public/plugins/codemirror-5.17.0/mode/troff/troff.js +++ /dev/null @@ -1,84 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) - define(["../../lib/codemirror"], mod); - else - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('troff', function() { - - var words = {}; - - function tokenBase(stream) { - if (stream.eatSpace()) return null; - - var sol = stream.sol(); - var ch = stream.next(); - - if (ch === '\\') { - if (stream.match('fB') || stream.match('fR') || stream.match('fI') || - stream.match('u') || stream.match('d') || - stream.match('%') || stream.match('&')) { - return 'string'; - } - if (stream.match('m[')) { - stream.skipTo(']'); - stream.next(); - return 'string'; - } - if (stream.match('s+') || stream.match('s-')) { - stream.eatWhile(/[\d-]/); - return 'string'; - } - if (stream.match('\(') || stream.match('*\(')) { - stream.eatWhile(/[\w-]/); - return 'string'; - } - return 'string'; - } - if (sol && (ch === '.' || ch === '\'')) { - if (stream.eat('\\') && stream.eat('\"')) { - stream.skipToEnd(); - return 'comment'; - } - } - if (sol && ch === '.') { - if (stream.match('B ') || stream.match('I ') || stream.match('R ')) { - return 'attribute'; - } - if (stream.match('TH ') || stream.match('SH ') || stream.match('SS ') || stream.match('HP ')) { - stream.skipToEnd(); - return 'quote'; - } - if ((stream.match(/[A-Z]/) && stream.match(/[A-Z]/)) || (stream.match(/[a-z]/) && stream.match(/[a-z]/))) { - return 'attribute'; - } - } - stream.eatWhile(/[\w-]/); - var cur = stream.current(); - return words.hasOwnProperty(cur) ? words[cur] : null; - } - - function tokenize(stream, state) { - return (state.tokens[0] || tokenBase) (stream, state); - }; - - return { - startState: function() {return {tokens:[]};}, - token: function(stream, state) { - return tokenize(stream, state); - } - }; -}); - -CodeMirror.defineMIME('text/troff', 'troff'); -CodeMirror.defineMIME('text/x-troff', 'troff'); -CodeMirror.defineMIME('application/x-troff', 'troff'); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/ttcn-cfg/index.html b/public/plugins/codemirror-5.17.0/mode/ttcn-cfg/index.html deleted file mode 100644 index 4a4cd45..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ttcn-cfg/index.html +++ /dev/null @@ -1,115 +0,0 @@ - - -CodeMirror: TTCN-CFG mode - - - - - - - - -
    -

    TTCN-CFG example

    -
    - -
    - - -
    -

    Language: Testing and Test Control Notation - - Configuration files - (TTCN-CFG) -

    -

    MIME types defined: text/x-ttcn-cfg.

    - -
    -

    The development of this mode has been sponsored by Ericsson - .

    -

    Coded by Asmelash Tsegay Gebretsadkan

    -
    - diff --git a/public/plugins/codemirror-5.17.0/mode/ttcn-cfg/ttcn-cfg.js b/public/plugins/codemirror-5.17.0/mode/ttcn-cfg/ttcn-cfg.js deleted file mode 100644 index e108051..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ttcn-cfg/ttcn-cfg.js +++ /dev/null @@ -1,214 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("ttcn-cfg", function(config, parserConfig) { - var indentUnit = config.indentUnit, - keywords = parserConfig.keywords || {}, - fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {}, - externalCommands = parserConfig.externalCommands || {}, - multiLineStrings = parserConfig.multiLineStrings, - indentStatements = parserConfig.indentStatements !== false; - var isOperatorChar = /[\|]/; - var curPunc; - - function tokenBase(stream, state) { - var ch = stream.next(); - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - if (/[:=]/.test(ch)) { - curPunc = ch; - return "punctuation"; - } - if (ch == "#"){ - stream.skipToEnd(); - return "comment"; - } - if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } - if (isOperatorChar.test(ch)) { - stream.eatWhile(isOperatorChar); - return "operator"; - } - if (ch == "["){ - stream.eatWhile(/[\w_\]]/); - return "number sectionTitle"; - } - - stream.eatWhile(/[\w\$_]/); - var cur = stream.current(); - if (keywords.propertyIsEnumerable(cur)) return "keyword"; - if (fileNCtrlMaskOptions.propertyIsEnumerable(cur)) - return "negative fileNCtrlMaskOptions"; - if (externalCommands.propertyIsEnumerable(cur)) return "negative externalCommands"; - - return "variable"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped){ - var afterNext = stream.peek(); - //look if the character if the quote is like the B in '10100010'B - if (afterNext){ - afterNext = afterNext.toLowerCase(); - if(afterNext == "b" || afterNext == "h" || afterNext == "o") - stream.next(); - } - end = true; break; - } - escaped = !escaped && next == "\\"; - } - if (end || !(escaped || multiLineStrings)) - state.tokenize = null; - return "string"; - }; - } - - function Context(indented, column, type, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.align = align; - this.prev = prev; - } - function pushContext(state, col, type) { - var indent = state.indented; - if (state.context && state.context.type == "statement") - indent = state.context.indented; - return state.context = new Context(indent, col, type, null, state.context); - } - function popContext(state) { - var t = state.context.type; - if (t == ")" || t == "]" || t == "}") - state.indented = state.context.indented; - return state.context = state.context.prev; - } - - //Interface - return { - startState: function(basecolumn) { - return { - tokenize: null, - context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), - indented: 0, - startOfLine: true - }; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - } - if (stream.eatSpace()) return null; - curPunc = null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment") return style; - if (ctx.align == null) ctx.align = true; - - if ((curPunc == ";" || curPunc == ":" || curPunc == ",") - && ctx.type == "statement"){ - popContext(state); - } - else if (curPunc == "{") pushContext(state, stream.column(), "}"); - else if (curPunc == "[") pushContext(state, stream.column(), "]"); - else if (curPunc == "(") pushContext(state, stream.column(), ")"); - else if (curPunc == "}") { - while (ctx.type == "statement") ctx = popContext(state); - if (ctx.type == "}") ctx = popContext(state); - while (ctx.type == "statement") ctx = popContext(state); - } - else if (curPunc == ctx.type) popContext(state); - else if (indentStatements && (((ctx.type == "}" || ctx.type == "top") - && curPunc != ';') || (ctx.type == "statement" - && curPunc == "newstatement"))) - pushContext(state, stream.column(), "statement"); - state.startOfLine = false; - return style; - }, - - electricChars: "{}", - lineComment: "#", - fold: "brace" - }; - }); - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) - obj[words[i]] = true; - return obj; - } - - CodeMirror.defineMIME("text/x-ttcn-cfg", { - name: "ttcn-cfg", - keywords: words("Yes No LogFile FileMask ConsoleMask AppendFile" + - " TimeStampFormat LogEventTypes SourceInfoFormat" + - " LogEntityName LogSourceInfo DiskFullAction" + - " LogFileNumber LogFileSize MatchingHints Detailed" + - " Compact SubCategories Stack Single None Seconds" + - " DateTime Time Stop Error Retry Delete TCPPort KillTimer" + - " NumHCs UnixSocketsEnabled LocalAddress"), - fileNCtrlMaskOptions: words("TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING" + - " TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP" + - " TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION" + - " TTCN_USER TTCN_FUNCTION TTCN_STATISTICS" + - " TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG" + - " EXECUTOR ERROR WARNING PORTEVENT TIMEROP" + - " VERDICTOP DEFAULTOP TESTCASE ACTION USER" + - " FUNCTION STATISTICS PARALLEL MATCHING DEBUG" + - " LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED" + - " DEBUG_ENCDEC DEBUG_TESTPORT" + - " DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE" + - " DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT" + - " DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED" + - " EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA" + - " EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS" + - " EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED" + - " FUNCTION_RND FUNCTION_UNQUALIFIED" + - " MATCHING_DONE MATCHING_MCSUCCESS" + - " MATCHING_MCUNSUCC MATCHING_MMSUCCESS" + - " MATCHING_MMUNSUCC MATCHING_PCSUCCESS" + - " MATCHING_PCUNSUCC MATCHING_PMSUCCESS" + - " MATCHING_PMUNSUCC MATCHING_PROBLEM" + - " MATCHING_TIMEOUT MATCHING_UNQUALIFIED" + - " PARALLEL_PORTCONN PARALLEL_PORTMAP" + - " PARALLEL_PTC PARALLEL_UNQUALIFIED" + - " PORTEVENT_DUALRECV PORTEVENT_DUALSEND" + - " PORTEVENT_MCRECV PORTEVENT_MCSEND" + - " PORTEVENT_MMRECV PORTEVENT_MMSEND" + - " PORTEVENT_MQUEUE PORTEVENT_PCIN" + - " PORTEVENT_PCOUT PORTEVENT_PMIN" + - " PORTEVENT_PMOUT PORTEVENT_PQUEUE" + - " PORTEVENT_STATE PORTEVENT_UNQUALIFIED" + - " STATISTICS_UNQUALIFIED STATISTICS_VERDICT" + - " TESTCASE_FINISH TESTCASE_START" + - " TESTCASE_UNQUALIFIED TIMEROP_GUARD" + - " TIMEROP_READ TIMEROP_START TIMEROP_STOP" + - " TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED" + - " USER_UNQUALIFIED VERDICTOP_FINAL" + - " VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT" + - " VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED"), - externalCommands: words("BeginControlPart EndControlPart BeginTestCase" + - " EndTestCase"), - multiLineStrings: true - }); -}); \ No newline at end of file diff --git a/public/plugins/codemirror-5.17.0/mode/ttcn/index.html b/public/plugins/codemirror-5.17.0/mode/ttcn/index.html deleted file mode 100644 index f1ef811..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ttcn/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - -CodeMirror: TTCN mode - - - - - - - - -
    -

    TTCN example

    -
    - -
    - - -
    -

    Language: Testing and Test Control Notation - (TTCN) -

    -

    MIME types defined: text/x-ttcn, - text/x-ttcn3, text/x-ttcnpp.

    -
    -

    The development of this mode has been sponsored by Ericsson - .

    -

    Coded by Asmelash Tsegay Gebretsadkan

    -
    - diff --git a/public/plugins/codemirror-5.17.0/mode/ttcn/ttcn.js b/public/plugins/codemirror-5.17.0/mode/ttcn/ttcn.js deleted file mode 100644 index 3051851..0000000 --- a/public/plugins/codemirror-5.17.0/mode/ttcn/ttcn.js +++ /dev/null @@ -1,283 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("ttcn", function(config, parserConfig) { - var indentUnit = config.indentUnit, - keywords = parserConfig.keywords || {}, - builtin = parserConfig.builtin || {}, - timerOps = parserConfig.timerOps || {}, - portOps = parserConfig.portOps || {}, - configOps = parserConfig.configOps || {}, - verdictOps = parserConfig.verdictOps || {}, - sutOps = parserConfig.sutOps || {}, - functionOps = parserConfig.functionOps || {}, - - verdictConsts = parserConfig.verdictConsts || {}, - booleanConsts = parserConfig.booleanConsts || {}, - otherConsts = parserConfig.otherConsts || {}, - - types = parserConfig.types || {}, - visibilityModifiers = parserConfig.visibilityModifiers || {}, - templateMatch = parserConfig.templateMatch || {}, - multiLineStrings = parserConfig.multiLineStrings, - indentStatements = parserConfig.indentStatements !== false; - var isOperatorChar = /[+\-*&@=<>!\/]/; - var curPunc; - - function tokenBase(stream, state) { - var ch = stream.next(); - - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - if (/[\[\]{}\(\),;\\:\?\.]/.test(ch)) { - curPunc = ch; - return "punctuation"; - } - if (ch == "#"){ - stream.skipToEnd(); - return "atom preprocessor"; - } - if (ch == "%"){ - stream.eatWhile(/\b/); - return "atom ttcn3Macros"; - } - if (/\d/.test(ch)) { - stream.eatWhile(/[\w\.]/); - return "number"; - } - if (ch == "/") { - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - } - if (isOperatorChar.test(ch)) { - if(ch == "@"){ - if(stream.match("try") || stream.match("catch") - || stream.match("lazy")){ - return "keyword"; - } - } - stream.eatWhile(isOperatorChar); - return "operator"; - } - stream.eatWhile(/[\w\$_\xa1-\uffff]/); - var cur = stream.current(); - - if (keywords.propertyIsEnumerable(cur)) return "keyword"; - if (builtin.propertyIsEnumerable(cur)) return "builtin"; - - if (timerOps.propertyIsEnumerable(cur)) return "def timerOps"; - if (configOps.propertyIsEnumerable(cur)) return "def configOps"; - if (verdictOps.propertyIsEnumerable(cur)) return "def verdictOps"; - if (portOps.propertyIsEnumerable(cur)) return "def portOps"; - if (sutOps.propertyIsEnumerable(cur)) return "def sutOps"; - if (functionOps.propertyIsEnumerable(cur)) return "def functionOps"; - - if (verdictConsts.propertyIsEnumerable(cur)) return "string verdictConsts"; - if (booleanConsts.propertyIsEnumerable(cur)) return "string booleanConsts"; - if (otherConsts.propertyIsEnumerable(cur)) return "string otherConsts"; - - if (types.propertyIsEnumerable(cur)) return "builtin types"; - if (visibilityModifiers.propertyIsEnumerable(cur)) - return "builtin visibilityModifiers"; - if (templateMatch.propertyIsEnumerable(cur)) return "atom templateMatch"; - - return "variable"; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped){ - var afterQuote = stream.peek(); - //look if the character after the quote is like the B in '10100010'B - if (afterQuote){ - afterQuote = afterQuote.toLowerCase(); - if(afterQuote == "b" || afterQuote == "h" || afterQuote == "o") - stream.next(); - } - end = true; break; - } - escaped = !escaped && next == "\\"; - } - if (end || !(escaped || multiLineStrings)) - state.tokenize = null; - return "string"; - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = null; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function Context(indented, column, type, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.align = align; - this.prev = prev; - } - - function pushContext(state, col, type) { - var indent = state.indented; - if (state.context && state.context.type == "statement") - indent = state.context.indented; - return state.context = new Context(indent, col, type, null, state.context); - } - - function popContext(state) { - var t = state.context.type; - if (t == ")" || t == "]" || t == "}") - state.indented = state.context.indented; - return state.context = state.context.prev; - } - - //Interface - return { - startState: function(basecolumn) { - return { - tokenize: null, - context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), - indented: 0, - startOfLine: true - }; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - } - if (stream.eatSpace()) return null; - curPunc = null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment") return style; - if (ctx.align == null) ctx.align = true; - - if ((curPunc == ";" || curPunc == ":" || curPunc == ",") - && ctx.type == "statement"){ - popContext(state); - } - else if (curPunc == "{") pushContext(state, stream.column(), "}"); - else if (curPunc == "[") pushContext(state, stream.column(), "]"); - else if (curPunc == "(") pushContext(state, stream.column(), ")"); - else if (curPunc == "}") { - while (ctx.type == "statement") ctx = popContext(state); - if (ctx.type == "}") ctx = popContext(state); - while (ctx.type == "statement") ctx = popContext(state); - } - else if (curPunc == ctx.type) popContext(state); - else if (indentStatements && - (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') || - (ctx.type == "statement" && curPunc == "newstatement"))) - pushContext(state, stream.column(), "statement"); - - state.startOfLine = false; - - return style; - }, - - electricChars: "{}", - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: "//", - fold: "brace" - }; - }); - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - function def(mimes, mode) { - if (typeof mimes == "string") mimes = [mimes]; - var words = []; - function add(obj) { - if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop)) - words.push(prop); - } - - add(mode.keywords); - add(mode.builtin); - add(mode.timerOps); - add(mode.portOps); - - if (words.length) { - mode.helperType = mimes[0]; - CodeMirror.registerHelper("hintWords", mimes[0], words); - } - - for (var i = 0; i < mimes.length; ++i) - CodeMirror.defineMIME(mimes[i], mode); - } - - def(["text/x-ttcn", "text/x-ttcn3", "text/x-ttcnpp"], { - name: "ttcn", - keywords: words("activate address alive all alt altstep and and4b any" + - " break case component const continue control deactivate" + - " display do else encode enumerated except exception" + - " execute extends extension external for from function" + - " goto group if import in infinity inout interleave" + - " label language length log match message mixed mod" + - " modifies module modulepar mtc noblock not not4b nowait" + - " of on optional or or4b out override param pattern port" + - " procedure record recursive rem repeat return runs select" + - " self sender set signature system template testcase to" + - " type union value valueof var variant while with xor xor4b"), - builtin: words("bit2hex bit2int bit2oct bit2str char2int char2oct encvalue" + - " decomp decvalue float2int float2str hex2bit hex2int" + - " hex2oct hex2str int2bit int2char int2float int2hex" + - " int2oct int2str int2unichar isbound ischosen ispresent" + - " isvalue lengthof log2str oct2bit oct2char oct2hex oct2int" + - " oct2str regexp replace rnd sizeof str2bit str2float" + - " str2hex str2int str2oct substr unichar2int unichar2char" + - " enum2int"), - types: words("anytype bitstring boolean char charstring default float" + - " hexstring integer objid octetstring universal verdicttype timer"), - timerOps: words("read running start stop timeout"), - portOps: words("call catch check clear getcall getreply halt raise receive" + - " reply send trigger"), - configOps: words("create connect disconnect done kill killed map unmap"), - verdictOps: words("getverdict setverdict"), - sutOps: words("action"), - functionOps: words("apply derefers refers"), - - verdictConsts: words("error fail inconc none pass"), - booleanConsts: words("true false"), - otherConsts: words("null NULL omit"), - - visibilityModifiers: words("private public friend"), - templateMatch: words("complement ifpresent subset superset permutation"), - multiLineStrings: true - }); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/turtle/index.html b/public/plugins/codemirror-5.17.0/mode/turtle/index.html deleted file mode 100644 index a4962b6..0000000 --- a/public/plugins/codemirror-5.17.0/mode/turtle/index.html +++ /dev/null @@ -1,50 +0,0 @@ - - -CodeMirror: Turtle mode - - - - - - - - - -
    -

    Turtle mode

    -
    - - -

    MIME types defined: text/turtle.

    - -
    diff --git a/public/plugins/codemirror-5.17.0/mode/turtle/turtle.js b/public/plugins/codemirror-5.17.0/mode/turtle/turtle.js deleted file mode 100644 index 0988f0a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/turtle/turtle.js +++ /dev/null @@ -1,162 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("turtle", function(config) { - var indentUnit = config.indentUnit; - var curPunc; - - function wordRegexp(words) { - return new RegExp("^(?:" + words.join("|") + ")$", "i"); - } - var ops = wordRegexp([]); - var keywords = wordRegexp(["@prefix", "@base", "a"]); - var operatorChars = /[*+\-<>=&|]/; - - function tokenBase(stream, state) { - var ch = stream.next(); - curPunc = null; - if (ch == "<" && !stream.match(/^[\s\u00a0=]/, false)) { - stream.match(/^[^\s\u00a0>]*>?/); - return "atom"; - } - else if (ch == "\"" || ch == "'") { - state.tokenize = tokenLiteral(ch); - return state.tokenize(stream, state); - } - else if (/[{}\(\),\.;\[\]]/.test(ch)) { - curPunc = ch; - return null; - } - else if (ch == "#") { - stream.skipToEnd(); - return "comment"; - } - else if (operatorChars.test(ch)) { - stream.eatWhile(operatorChars); - return null; - } - else if (ch == ":") { - return "operator"; - } else { - stream.eatWhile(/[_\w\d]/); - if(stream.peek() == ":") { - return "variable-3"; - } else { - var word = stream.current(); - - if(keywords.test(word)) { - return "meta"; - } - - if(ch >= "A" && ch <= "Z") { - return "comment"; - } else { - return "keyword"; - } - } - var word = stream.current(); - if (ops.test(word)) - return null; - else if (keywords.test(word)) - return "meta"; - else - return "variable"; - } - } - - function tokenLiteral(quote) { - return function(stream, state) { - var escaped = false, ch; - while ((ch = stream.next()) != null) { - if (ch == quote && !escaped) { - state.tokenize = tokenBase; - break; - } - escaped = !escaped && ch == "\\"; - } - return "string"; - }; - } - - function pushContext(state, type, col) { - state.context = {prev: state.context, indent: state.indent, col: col, type: type}; - } - function popContext(state) { - state.indent = state.context.indent; - state.context = state.context.prev; - } - - return { - startState: function() { - return {tokenize: tokenBase, - context: null, - indent: 0, - col: 0}; - }, - - token: function(stream, state) { - if (stream.sol()) { - if (state.context && state.context.align == null) state.context.align = false; - state.indent = stream.indentation(); - } - if (stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - - if (style != "comment" && state.context && state.context.align == null && state.context.type != "pattern") { - state.context.align = true; - } - - if (curPunc == "(") pushContext(state, ")", stream.column()); - else if (curPunc == "[") pushContext(state, "]", stream.column()); - else if (curPunc == "{") pushContext(state, "}", stream.column()); - else if (/[\]\}\)]/.test(curPunc)) { - while (state.context && state.context.type == "pattern") popContext(state); - if (state.context && curPunc == state.context.type) popContext(state); - } - else if (curPunc == "." && state.context && state.context.type == "pattern") popContext(state); - else if (/atom|string|variable/.test(style) && state.context) { - if (/[\}\]]/.test(state.context.type)) - pushContext(state, "pattern", stream.column()); - else if (state.context.type == "pattern" && !state.context.align) { - state.context.align = true; - state.context.col = stream.column(); - } - } - - return style; - }, - - indent: function(state, textAfter) { - var firstChar = textAfter && textAfter.charAt(0); - var context = state.context; - if (/[\]\}]/.test(firstChar)) - while (context && context.type == "pattern") context = context.prev; - - var closing = context && firstChar == context.type; - if (!context) - return 0; - else if (context.type == "pattern") - return context.col; - else if (context.align) - return context.col + (closing ? 0 : 1); - else - return context.indent + (closing ? 0 : indentUnit); - }, - - lineComment: "#" - }; -}); - -CodeMirror.defineMIME("text/turtle", "turtle"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/twig/index.html b/public/plugins/codemirror-5.17.0/mode/twig/index.html deleted file mode 100644 index 02493a5..0000000 --- a/public/plugins/codemirror-5.17.0/mode/twig/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - -CodeMirror: Twig mode - - - - - - - - - -
    -

    Twig mode

    -
    - -
    diff --git a/public/plugins/codemirror-5.17.0/mode/twig/twig.js b/public/plugins/codemirror-5.17.0/mode/twig/twig.js deleted file mode 100644 index 1f2854b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/twig/twig.js +++ /dev/null @@ -1,141 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../../addon/mode/multiplex")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../../addon/mode/multiplex"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { - "use strict"; - - CodeMirror.defineMode("twig:inner", function() { - var keywords = ["and", "as", "autoescape", "endautoescape", "block", "do", "endblock", "else", "elseif", "extends", "for", "endfor", "embed", "endembed", "filter", "endfilter", "flush", "from", "if", "endif", "in", "is", "include", "import", "not", "or", "set", "spaceless", "endspaceless", "with", "endwith", "trans", "endtrans", "blocktrans", "endblocktrans", "macro", "endmacro", "use", "verbatim", "endverbatim"], - operator = /^[+\-*&%=<>!?|~^]/, - sign = /^[:\[\(\{]/, - atom = ["true", "false", "null", "empty", "defined", "divisibleby", "divisible by", "even", "odd", "iterable", "sameas", "same as"], - number = /^(\d[+\-\*\/])?\d+(\.\d+)?/; - - keywords = new RegExp("((" + keywords.join(")|(") + "))\\b"); - atom = new RegExp("((" + atom.join(")|(") + "))\\b"); - - function tokenBase (stream, state) { - var ch = stream.peek(); - - //Comment - if (state.incomment) { - if (!stream.skipTo("#}")) { - stream.skipToEnd(); - } else { - stream.eatWhile(/\#|}/); - state.incomment = false; - } - return "comment"; - //Tag - } else if (state.intag) { - //After operator - if (state.operator) { - state.operator = false; - if (stream.match(atom)) { - return "atom"; - } - if (stream.match(number)) { - return "number"; - } - } - //After sign - if (state.sign) { - state.sign = false; - if (stream.match(atom)) { - return "atom"; - } - if (stream.match(number)) { - return "number"; - } - } - - if (state.instring) { - if (ch == state.instring) { - state.instring = false; - } - stream.next(); - return "string"; - } else if (ch == "'" || ch == '"') { - state.instring = ch; - stream.next(); - return "string"; - } else if (stream.match(state.intag + "}") || stream.eat("-") && stream.match(state.intag + "}")) { - state.intag = false; - return "tag"; - } else if (stream.match(operator)) { - state.operator = true; - return "operator"; - } else if (stream.match(sign)) { - state.sign = true; - } else { - if (stream.eat(" ") || stream.sol()) { - if (stream.match(keywords)) { - return "keyword"; - } - if (stream.match(atom)) { - return "atom"; - } - if (stream.match(number)) { - return "number"; - } - if (stream.sol()) { - stream.next(); - } - } else { - stream.next(); - } - - } - return "variable"; - } else if (stream.eat("{")) { - if (ch = stream.eat("#")) { - state.incomment = true; - if (!stream.skipTo("#}")) { - stream.skipToEnd(); - } else { - stream.eatWhile(/\#|}/); - state.incomment = false; - } - return "comment"; - //Open tag - } else if (ch = stream.eat(/\{|%/)) { - //Cache close tag - state.intag = ch; - if (ch == "{") { - state.intag = "}"; - } - stream.eat("-"); - return "tag"; - } - } - stream.next(); - }; - - return { - startState: function () { - return {}; - }, - token: function (stream, state) { - return tokenBase(stream, state); - } - }; - }); - - CodeMirror.defineMode("twig", function(config, parserConfig) { - var twigInner = CodeMirror.getMode(config, "twig:inner"); - if (!parserConfig || !parserConfig.base) return twigInner; - return CodeMirror.multiplexingMode( - CodeMirror.getMode(config, parserConfig.base), { - open: /\{[{#%]/, close: /[}#%]\}/, mode: twigInner, parseDelimiters: true - } - ); - }); - CodeMirror.defineMIME("text/x-twig", "twig"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/vb/index.html b/public/plugins/codemirror-5.17.0/mode/vb/index.html deleted file mode 100644 index adcc44f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/vb/index.html +++ /dev/null @@ -1,102 +0,0 @@ - - -CodeMirror: VB.NET mode - - - - - - - - - - - -
    -

    VB.NET mode

    - - - -
    - -
    -
    
    -  

    MIME type defined: text/x-vb.

    - -
    diff --git a/public/plugins/codemirror-5.17.0/mode/vb/vb.js b/public/plugins/codemirror-5.17.0/mode/vb/vb.js deleted file mode 100644 index d78f91f..0000000 --- a/public/plugins/codemirror-5.17.0/mode/vb/vb.js +++ /dev/null @@ -1,276 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("vb", function(conf, parserConf) { - var ERRORCLASS = 'error'; - - function wordRegexp(words) { - return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); - } - - var singleOperators = new RegExp("^[\\+\\-\\*/%&\\\\|\\^~<>!]"); - var singleDelimiters = new RegExp('^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]'); - var doubleOperators = new RegExp("^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))"); - var doubleDelimiters = new RegExp("^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))"); - var tripleDelimiters = new RegExp("^((//=)|(>>=)|(<<=)|(\\*\\*=))"); - var identifiers = new RegExp("^[_A-Za-z][_A-Za-z0-9]*"); - - var openingKeywords = ['class','module', 'sub','enum','select','while','if','function', 'get','set','property', 'try']; - var middleKeywords = ['else','elseif','case', 'catch']; - var endKeywords = ['next','loop']; - - var operatorKeywords = ['and', 'or', 'not', 'xor', 'in']; - var wordOperators = wordRegexp(operatorKeywords); - var commonKeywords = ['as', 'dim', 'break', 'continue','optional', 'then', 'until', - 'goto', 'byval','byref','new','handles','property', 'return', - 'const','private', 'protected', 'friend', 'public', 'shared', 'static', 'true','false']; - var commontypes = ['integer','string','double','decimal','boolean','short','char', 'float','single']; - - var keywords = wordRegexp(commonKeywords); - var types = wordRegexp(commontypes); - var stringPrefixes = '"'; - - var opening = wordRegexp(openingKeywords); - var middle = wordRegexp(middleKeywords); - var closing = wordRegexp(endKeywords); - var doubleClosing = wordRegexp(['end']); - var doOpening = wordRegexp(['do']); - - var indentInfo = null; - - CodeMirror.registerHelper("hintWords", "vb", openingKeywords.concat(middleKeywords).concat(endKeywords) - .concat(operatorKeywords).concat(commonKeywords).concat(commontypes)); - - function indent(_stream, state) { - state.currentIndent++; - } - - function dedent(_stream, state) { - state.currentIndent--; - } - // tokenizers - function tokenBase(stream, state) { - if (stream.eatSpace()) { - return null; - } - - var ch = stream.peek(); - - // Handle Comments - if (ch === "'") { - stream.skipToEnd(); - return 'comment'; - } - - - // Handle Number Literals - if (stream.match(/^((&H)|(&O))?[0-9\.a-f]/i, false)) { - var floatLiteral = false; - // Floats - if (stream.match(/^\d*\.\d+F?/i)) { floatLiteral = true; } - else if (stream.match(/^\d+\.\d*F?/)) { floatLiteral = true; } - else if (stream.match(/^\.\d+F?/)) { floatLiteral = true; } - - if (floatLiteral) { - // Float literals may be "imaginary" - stream.eat(/J/i); - return 'number'; - } - // Integers - var intLiteral = false; - // Hex - if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } - // Octal - else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } - // Decimal - else if (stream.match(/^[1-9]\d*F?/)) { - // Decimal literals may be "imaginary" - stream.eat(/J/i); - // TODO - Can you have imaginary longs? - intLiteral = true; - } - // Zero by itself with no other piece of number. - else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } - if (intLiteral) { - // Integer literals may be "long" - stream.eat(/L/i); - return 'number'; - } - } - - // Handle Strings - if (stream.match(stringPrefixes)) { - state.tokenize = tokenStringFactory(stream.current()); - return state.tokenize(stream, state); - } - - // Handle operators and Delimiters - if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) { - return null; - } - if (stream.match(doubleOperators) - || stream.match(singleOperators) - || stream.match(wordOperators)) { - return 'operator'; - } - if (stream.match(singleDelimiters)) { - return null; - } - if (stream.match(doOpening)) { - indent(stream,state); - state.doInCurrentLine = true; - return 'keyword'; - } - if (stream.match(opening)) { - if (! state.doInCurrentLine) - indent(stream,state); - else - state.doInCurrentLine = false; - return 'keyword'; - } - if (stream.match(middle)) { - return 'keyword'; - } - - if (stream.match(doubleClosing)) { - dedent(stream,state); - dedent(stream,state); - return 'keyword'; - } - if (stream.match(closing)) { - dedent(stream,state); - return 'keyword'; - } - - if (stream.match(types)) { - return 'keyword'; - } - - if (stream.match(keywords)) { - return 'keyword'; - } - - if (stream.match(identifiers)) { - return 'variable'; - } - - // Handle non-detected items - stream.next(); - return ERRORCLASS; - } - - function tokenStringFactory(delimiter) { - var singleline = delimiter.length == 1; - var OUTCLASS = 'string'; - - return function(stream, state) { - while (!stream.eol()) { - stream.eatWhile(/[^'"]/); - if (stream.match(delimiter)) { - state.tokenize = tokenBase; - return OUTCLASS; - } else { - stream.eat(/['"]/); - } - } - if (singleline) { - if (parserConf.singleLineStringErrors) { - return ERRORCLASS; - } else { - state.tokenize = tokenBase; - } - } - return OUTCLASS; - }; - } - - - function tokenLexer(stream, state) { - var style = state.tokenize(stream, state); - var current = stream.current(); - - // Handle '.' connected identifiers - if (current === '.') { - style = state.tokenize(stream, state); - current = stream.current(); - if (style === 'variable') { - return 'variable'; - } else { - return ERRORCLASS; - } - } - - - var delimiter_index = '[({'.indexOf(current); - if (delimiter_index !== -1) { - indent(stream, state ); - } - if (indentInfo === 'dedent') { - if (dedent(stream, state)) { - return ERRORCLASS; - } - } - delimiter_index = '])}'.indexOf(current); - if (delimiter_index !== -1) { - if (dedent(stream, state)) { - return ERRORCLASS; - } - } - - return style; - } - - var external = { - electricChars:"dDpPtTfFeE ", - startState: function() { - return { - tokenize: tokenBase, - lastToken: null, - currentIndent: 0, - nextLineIndent: 0, - doInCurrentLine: false - - - }; - }, - - token: function(stream, state) { - if (stream.sol()) { - state.currentIndent += state.nextLineIndent; - state.nextLineIndent = 0; - state.doInCurrentLine = 0; - } - var style = tokenLexer(stream, state); - - state.lastToken = {style:style, content: stream.current()}; - - - - return style; - }, - - indent: function(state, textAfter) { - var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; - if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); - if(state.currentIndent < 0) return 0; - return state.currentIndent * conf.indentUnit; - }, - - lineComment: "'" - }; - return external; -}); - -CodeMirror.defineMIME("text/x-vb", "vb"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/vbscript/index.html b/public/plugins/codemirror-5.17.0/mode/vbscript/index.html deleted file mode 100644 index ad7532d..0000000 --- a/public/plugins/codemirror-5.17.0/mode/vbscript/index.html +++ /dev/null @@ -1,55 +0,0 @@ - - -CodeMirror: VBScript mode - - - - - - - - - -
    -

    VBScript mode

    - - -
    - - - -

    MIME types defined: text/vbscript.

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/vbscript/vbscript.js b/public/plugins/codemirror-5.17.0/mode/vbscript/vbscript.js deleted file mode 100644 index b66df22..0000000 --- a/public/plugins/codemirror-5.17.0/mode/vbscript/vbscript.js +++ /dev/null @@ -1,350 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -/* -For extra ASP classic objects, initialize CodeMirror instance with this option: - isASP: true - -E.G.: - var editor = CodeMirror.fromTextArea(document.getElementById("code"), { - lineNumbers: true, - isASP: true - }); -*/ - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("vbscript", function(conf, parserConf) { - var ERRORCLASS = 'error'; - - function wordRegexp(words) { - return new RegExp("^((" + words.join(")|(") + "))\\b", "i"); - } - - var singleOperators = new RegExp("^[\\+\\-\\*/&\\\\\\^<>=]"); - var doubleOperators = new RegExp("^((<>)|(<=)|(>=))"); - var singleDelimiters = new RegExp('^[\\.,]'); - var brakets = new RegExp('^[\\(\\)]'); - var identifiers = new RegExp("^[A-Za-z][_A-Za-z0-9]*"); - - var openingKeywords = ['class','sub','select','while','if','function', 'property', 'with', 'for']; - var middleKeywords = ['else','elseif','case']; - var endKeywords = ['next','loop','wend']; - - var wordOperators = wordRegexp(['and', 'or', 'not', 'xor', 'is', 'mod', 'eqv', 'imp']); - var commonkeywords = ['dim', 'redim', 'then', 'until', 'randomize', - 'byval','byref','new','property', 'exit', 'in', - 'const','private', 'public', - 'get','set','let', 'stop', 'on error resume next', 'on error goto 0', 'option explicit', 'call', 'me']; - - //This list was from: http://msdn.microsoft.com/en-us/library/f8tbc79x(v=vs.84).aspx - var atomWords = ['true', 'false', 'nothing', 'empty', 'null']; - //This list was from: http://msdn.microsoft.com/en-us/library/3ca8tfek(v=vs.84).aspx - var builtinFuncsWords = ['abs', 'array', 'asc', 'atn', 'cbool', 'cbyte', 'ccur', 'cdate', 'cdbl', 'chr', 'cint', 'clng', 'cos', 'csng', 'cstr', 'date', 'dateadd', 'datediff', 'datepart', - 'dateserial', 'datevalue', 'day', 'escape', 'eval', 'execute', 'exp', 'filter', 'formatcurrency', 'formatdatetime', 'formatnumber', 'formatpercent', 'getlocale', 'getobject', - 'getref', 'hex', 'hour', 'inputbox', 'instr', 'instrrev', 'int', 'fix', 'isarray', 'isdate', 'isempty', 'isnull', 'isnumeric', 'isobject', 'join', 'lbound', 'lcase', 'left', - 'len', 'loadpicture', 'log', 'ltrim', 'rtrim', 'trim', 'maths', 'mid', 'minute', 'month', 'monthname', 'msgbox', 'now', 'oct', 'replace', 'rgb', 'right', 'rnd', 'round', - 'scriptengine', 'scriptenginebuildversion', 'scriptenginemajorversion', 'scriptengineminorversion', 'second', 'setlocale', 'sgn', 'sin', 'space', 'split', 'sqr', 'strcomp', - 'string', 'strreverse', 'tan', 'time', 'timer', 'timeserial', 'timevalue', 'typename', 'ubound', 'ucase', 'unescape', 'vartype', 'weekday', 'weekdayname', 'year']; - - //This list was from: http://msdn.microsoft.com/en-us/library/ydz4cfk3(v=vs.84).aspx - var builtinConsts = ['vbBlack', 'vbRed', 'vbGreen', 'vbYellow', 'vbBlue', 'vbMagenta', 'vbCyan', 'vbWhite', 'vbBinaryCompare', 'vbTextCompare', - 'vbSunday', 'vbMonday', 'vbTuesday', 'vbWednesday', 'vbThursday', 'vbFriday', 'vbSaturday', 'vbUseSystemDayOfWeek', 'vbFirstJan1', 'vbFirstFourDays', 'vbFirstFullWeek', - 'vbGeneralDate', 'vbLongDate', 'vbShortDate', 'vbLongTime', 'vbShortTime', 'vbObjectError', - 'vbOKOnly', 'vbOKCancel', 'vbAbortRetryIgnore', 'vbYesNoCancel', 'vbYesNo', 'vbRetryCancel', 'vbCritical', 'vbQuestion', 'vbExclamation', 'vbInformation', 'vbDefaultButton1', 'vbDefaultButton2', - 'vbDefaultButton3', 'vbDefaultButton4', 'vbApplicationModal', 'vbSystemModal', 'vbOK', 'vbCancel', 'vbAbort', 'vbRetry', 'vbIgnore', 'vbYes', 'vbNo', - 'vbCr', 'VbCrLf', 'vbFormFeed', 'vbLf', 'vbNewLine', 'vbNullChar', 'vbNullString', 'vbTab', 'vbVerticalTab', 'vbUseDefault', 'vbTrue', 'vbFalse', - 'vbEmpty', 'vbNull', 'vbInteger', 'vbLong', 'vbSingle', 'vbDouble', 'vbCurrency', 'vbDate', 'vbString', 'vbObject', 'vbError', 'vbBoolean', 'vbVariant', 'vbDataObject', 'vbDecimal', 'vbByte', 'vbArray']; - //This list was from: http://msdn.microsoft.com/en-us/library/hkc375ea(v=vs.84).aspx - var builtinObjsWords = ['WScript', 'err', 'debug', 'RegExp']; - var knownProperties = ['description', 'firstindex', 'global', 'helpcontext', 'helpfile', 'ignorecase', 'length', 'number', 'pattern', 'source', 'value', 'count']; - var knownMethods = ['clear', 'execute', 'raise', 'replace', 'test', 'write', 'writeline', 'close', 'open', 'state', 'eof', 'update', 'addnew', 'end', 'createobject', 'quit']; - - var aspBuiltinObjsWords = ['server', 'response', 'request', 'session', 'application']; - var aspKnownProperties = ['buffer', 'cachecontrol', 'charset', 'contenttype', 'expires', 'expiresabsolute', 'isclientconnected', 'pics', 'status', //response - 'clientcertificate', 'cookies', 'form', 'querystring', 'servervariables', 'totalbytes', //request - 'contents', 'staticobjects', //application - 'codepage', 'lcid', 'sessionid', 'timeout', //session - 'scripttimeout']; //server - var aspKnownMethods = ['addheader', 'appendtolog', 'binarywrite', 'end', 'flush', 'redirect', //response - 'binaryread', //request - 'remove', 'removeall', 'lock', 'unlock', //application - 'abandon', //session - 'getlasterror', 'htmlencode', 'mappath', 'transfer', 'urlencode']; //server - - var knownWords = knownMethods.concat(knownProperties); - - builtinObjsWords = builtinObjsWords.concat(builtinConsts); - - if (conf.isASP){ - builtinObjsWords = builtinObjsWords.concat(aspBuiltinObjsWords); - knownWords = knownWords.concat(aspKnownMethods, aspKnownProperties); - }; - - var keywords = wordRegexp(commonkeywords); - var atoms = wordRegexp(atomWords); - var builtinFuncs = wordRegexp(builtinFuncsWords); - var builtinObjs = wordRegexp(builtinObjsWords); - var known = wordRegexp(knownWords); - var stringPrefixes = '"'; - - var opening = wordRegexp(openingKeywords); - var middle = wordRegexp(middleKeywords); - var closing = wordRegexp(endKeywords); - var doubleClosing = wordRegexp(['end']); - var doOpening = wordRegexp(['do']); - var noIndentWords = wordRegexp(['on error resume next', 'exit']); - var comment = wordRegexp(['rem']); - - - function indent(_stream, state) { - state.currentIndent++; - } - - function dedent(_stream, state) { - state.currentIndent--; - } - // tokenizers - function tokenBase(stream, state) { - if (stream.eatSpace()) { - return 'space'; - //return null; - } - - var ch = stream.peek(); - - // Handle Comments - if (ch === "'") { - stream.skipToEnd(); - return 'comment'; - } - if (stream.match(comment)){ - stream.skipToEnd(); - return 'comment'; - } - - - // Handle Number Literals - if (stream.match(/^((&H)|(&O))?[0-9\.]/i, false) && !stream.match(/^((&H)|(&O))?[0-9\.]+[a-z_]/i, false)) { - var floatLiteral = false; - // Floats - if (stream.match(/^\d*\.\d+/i)) { floatLiteral = true; } - else if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } - else if (stream.match(/^\.\d+/)) { floatLiteral = true; } - - if (floatLiteral) { - // Float literals may be "imaginary" - stream.eat(/J/i); - return 'number'; - } - // Integers - var intLiteral = false; - // Hex - if (stream.match(/^&H[0-9a-f]+/i)) { intLiteral = true; } - // Octal - else if (stream.match(/^&O[0-7]+/i)) { intLiteral = true; } - // Decimal - else if (stream.match(/^[1-9]\d*F?/)) { - // Decimal literals may be "imaginary" - stream.eat(/J/i); - // TODO - Can you have imaginary longs? - intLiteral = true; - } - // Zero by itself with no other piece of number. - else if (stream.match(/^0(?![\dx])/i)) { intLiteral = true; } - if (intLiteral) { - // Integer literals may be "long" - stream.eat(/L/i); - return 'number'; - } - } - - // Handle Strings - if (stream.match(stringPrefixes)) { - state.tokenize = tokenStringFactory(stream.current()); - return state.tokenize(stream, state); - } - - // Handle operators and Delimiters - if (stream.match(doubleOperators) - || stream.match(singleOperators) - || stream.match(wordOperators)) { - return 'operator'; - } - if (stream.match(singleDelimiters)) { - return null; - } - - if (stream.match(brakets)) { - return "bracket"; - } - - if (stream.match(noIndentWords)) { - state.doInCurrentLine = true; - - return 'keyword'; - } - - if (stream.match(doOpening)) { - indent(stream,state); - state.doInCurrentLine = true; - - return 'keyword'; - } - if (stream.match(opening)) { - if (! state.doInCurrentLine) - indent(stream,state); - else - state.doInCurrentLine = false; - - return 'keyword'; - } - if (stream.match(middle)) { - return 'keyword'; - } - - - if (stream.match(doubleClosing)) { - dedent(stream,state); - dedent(stream,state); - - return 'keyword'; - } - if (stream.match(closing)) { - if (! state.doInCurrentLine) - dedent(stream,state); - else - state.doInCurrentLine = false; - - return 'keyword'; - } - - if (stream.match(keywords)) { - return 'keyword'; - } - - if (stream.match(atoms)) { - return 'atom'; - } - - if (stream.match(known)) { - return 'variable-2'; - } - - if (stream.match(builtinFuncs)) { - return 'builtin'; - } - - if (stream.match(builtinObjs)){ - return 'variable-2'; - } - - if (stream.match(identifiers)) { - return 'variable'; - } - - // Handle non-detected items - stream.next(); - return ERRORCLASS; - } - - function tokenStringFactory(delimiter) { - var singleline = delimiter.length == 1; - var OUTCLASS = 'string'; - - return function(stream, state) { - while (!stream.eol()) { - stream.eatWhile(/[^'"]/); - if (stream.match(delimiter)) { - state.tokenize = tokenBase; - return OUTCLASS; - } else { - stream.eat(/['"]/); - } - } - if (singleline) { - if (parserConf.singleLineStringErrors) { - return ERRORCLASS; - } else { - state.tokenize = tokenBase; - } - } - return OUTCLASS; - }; - } - - - function tokenLexer(stream, state) { - var style = state.tokenize(stream, state); - var current = stream.current(); - - // Handle '.' connected identifiers - if (current === '.') { - style = state.tokenize(stream, state); - - current = stream.current(); - if (style && (style.substr(0, 8) === 'variable' || style==='builtin' || style==='keyword')){//|| knownWords.indexOf(current.substring(1)) > -1) { - if (style === 'builtin' || style === 'keyword') style='variable'; - if (knownWords.indexOf(current.substr(1)) > -1) style='variable-2'; - - return style; - } else { - return ERRORCLASS; - } - } - - return style; - } - - var external = { - electricChars:"dDpPtTfFeE ", - startState: function() { - return { - tokenize: tokenBase, - lastToken: null, - currentIndent: 0, - nextLineIndent: 0, - doInCurrentLine: false, - ignoreKeyword: false - - - }; - }, - - token: function(stream, state) { - if (stream.sol()) { - state.currentIndent += state.nextLineIndent; - state.nextLineIndent = 0; - state.doInCurrentLine = 0; - } - var style = tokenLexer(stream, state); - - state.lastToken = {style:style, content: stream.current()}; - - if (style==='space') style=null; - - return style; - }, - - indent: function(state, textAfter) { - var trueText = textAfter.replace(/^\s+|\s+$/g, '') ; - if (trueText.match(closing) || trueText.match(doubleClosing) || trueText.match(middle)) return conf.indentUnit*(state.currentIndent-1); - if(state.currentIndent < 0) return 0; - return state.currentIndent * conf.indentUnit; - } - - }; - return external; -}); - -CodeMirror.defineMIME("text/vbscript", "vbscript"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/velocity/index.html b/public/plugins/codemirror-5.17.0/mode/velocity/index.html deleted file mode 100644 index 7eba8f4..0000000 --- a/public/plugins/codemirror-5.17.0/mode/velocity/index.html +++ /dev/null @@ -1,120 +0,0 @@ - - -CodeMirror: Velocity mode - - - - - - - - - - -
    -

    Velocity mode

    -
    - - -

    MIME types defined: text/velocity.

    - -
    diff --git a/public/plugins/codemirror-5.17.0/mode/velocity/velocity.js b/public/plugins/codemirror-5.17.0/mode/velocity/velocity.js deleted file mode 100644 index 12ee221..0000000 --- a/public/plugins/codemirror-5.17.0/mode/velocity/velocity.js +++ /dev/null @@ -1,201 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("velocity", function() { - function parseWords(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - var keywords = parseWords("#end #else #break #stop #[[ #]] " + - "#{end} #{else} #{break} #{stop}"); - var functions = parseWords("#if #elseif #foreach #set #include #parse #macro #define #evaluate " + - "#{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}"); - var specials = parseWords("$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent"); - var isOperatorChar = /[+\-*&%=<>!?:\/|]/; - - function chain(stream, state, f) { - state.tokenize = f; - return f(stream, state); - } - function tokenBase(stream, state) { - var beforeParams = state.beforeParams; - state.beforeParams = false; - var ch = stream.next(); - // start of unparsed string? - if ((ch == "'") && !state.inString && state.inParams) { - state.lastTokenWasBuiltin = false; - return chain(stream, state, tokenString(ch)); - } - // start of parsed string? - else if ((ch == '"')) { - state.lastTokenWasBuiltin = false; - if (state.inString) { - state.inString = false; - return "string"; - } - else if (state.inParams) - return chain(stream, state, tokenString(ch)); - } - // is it one of the special signs []{}().,;? Seperator? - else if (/[\[\]{}\(\),;\.]/.test(ch)) { - if (ch == "(" && beforeParams) - state.inParams = true; - else if (ch == ")") { - state.inParams = false; - state.lastTokenWasBuiltin = true; - } - return null; - } - // start of a number value? - else if (/\d/.test(ch)) { - state.lastTokenWasBuiltin = false; - stream.eatWhile(/[\w\.]/); - return "number"; - } - // multi line comment? - else if (ch == "#" && stream.eat("*")) { - state.lastTokenWasBuiltin = false; - return chain(stream, state, tokenComment); - } - // unparsed content? - else if (ch == "#" && stream.match(/ *\[ *\[/)) { - state.lastTokenWasBuiltin = false; - return chain(stream, state, tokenUnparsed); - } - // single line comment? - else if (ch == "#" && stream.eat("#")) { - state.lastTokenWasBuiltin = false; - stream.skipToEnd(); - return "comment"; - } - // variable? - else if (ch == "$") { - stream.eatWhile(/[\w\d\$_\.{}]/); - // is it one of the specials? - if (specials && specials.propertyIsEnumerable(stream.current())) { - return "keyword"; - } - else { - state.lastTokenWasBuiltin = true; - state.beforeParams = true; - return "builtin"; - } - } - // is it a operator? - else if (isOperatorChar.test(ch)) { - state.lastTokenWasBuiltin = false; - stream.eatWhile(isOperatorChar); - return "operator"; - } - else { - // get the whole word - stream.eatWhile(/[\w\$_{}@]/); - var word = stream.current(); - // is it one of the listed keywords? - if (keywords && keywords.propertyIsEnumerable(word)) - return "keyword"; - // is it one of the listed functions? - if (functions && functions.propertyIsEnumerable(word) || - (stream.current().match(/^#@?[a-z0-9_]+ *$/i) && stream.peek()=="(") && - !(functions && functions.propertyIsEnumerable(word.toLowerCase()))) { - state.beforeParams = true; - state.lastTokenWasBuiltin = false; - return "keyword"; - } - if (state.inString) { - state.lastTokenWasBuiltin = false; - return "string"; - } - if (stream.pos > word.length && stream.string.charAt(stream.pos-word.length-1)=="." && state.lastTokenWasBuiltin) - return "builtin"; - // default: just a "word" - state.lastTokenWasBuiltin = false; - return null; - } - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if ((next == quote) && !escaped) { - end = true; - break; - } - if (quote=='"' && stream.peek() == '$' && !escaped) { - state.inString = true; - end = true; - break; - } - escaped = !escaped && next == "\\"; - } - if (end) state.tokenize = tokenBase; - return "string"; - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "#" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function tokenUnparsed(stream, state) { - var maybeEnd = 0, ch; - while (ch = stream.next()) { - if (ch == "#" && maybeEnd == 2) { - state.tokenize = tokenBase; - break; - } - if (ch == "]") - maybeEnd++; - else if (ch != " ") - maybeEnd = 0; - } - return "meta"; - } - // Interface - - return { - startState: function() { - return { - tokenize: tokenBase, - beforeParams: false, - inParams: false, - inString: false, - lastTokenWasBuiltin: false - }; - }, - - token: function(stream, state) { - if (stream.eatSpace()) return null; - return state.tokenize(stream, state); - }, - blockCommentStart: "#*", - blockCommentEnd: "*#", - lineComment: "##", - fold: "velocity" - }; -}); - -CodeMirror.defineMIME("text/velocity", "velocity"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/verilog/index.html b/public/plugins/codemirror-5.17.0/mode/verilog/index.html deleted file mode 100644 index 9c52722..0000000 --- a/public/plugins/codemirror-5.17.0/mode/verilog/index.html +++ /dev/null @@ -1,120 +0,0 @@ - - -CodeMirror: Verilog/SystemVerilog mode - - - - - - - - - - -
    -

    SystemVerilog mode

    - -
    - - - -

    -Syntax highlighting and indentation for the Verilog and SystemVerilog languages (IEEE 1800). -

    Configuration options:

    -
      -
    • noIndentKeywords - List of keywords which should not cause indentation to increase. E.g. ["package", "module"]. Default: None
    • -
    -

    - -

    MIME types defined: text/x-verilog and text/x-systemverilog.

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/verilog/test.js b/public/plugins/codemirror-5.17.0/mode/verilog/test.js deleted file mode 100644 index 8334fab..0000000 --- a/public/plugins/codemirror-5.17.0/mode/verilog/test.js +++ /dev/null @@ -1,273 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 4}, "verilog"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT("binary_literals", - "[number 1'b0]", - "[number 1'b1]", - "[number 1'bx]", - "[number 1'bz]", - "[number 1'bX]", - "[number 1'bZ]", - "[number 1'B0]", - "[number 1'B1]", - "[number 1'Bx]", - "[number 1'Bz]", - "[number 1'BX]", - "[number 1'BZ]", - "[number 1'b0]", - "[number 1'b1]", - "[number 2'b01]", - "[number 2'bxz]", - "[number 2'b11]", - "[number 2'b10]", - "[number 2'b1Z]", - "[number 12'b0101_0101_0101]", - "[number 1'b 0]", - "[number 'b0101]" - ); - - MT("octal_literals", - "[number 3'o7]", - "[number 3'O7]", - "[number 3'so7]", - "[number 3'SO7]" - ); - - MT("decimal_literals", - "[number 0]", - "[number 1]", - "[number 7]", - "[number 123_456]", - "[number 'd33]", - "[number 8'd255]", - "[number 8'D255]", - "[number 8'sd255]", - "[number 8'SD255]", - "[number 32'd123]", - "[number 32 'd123]", - "[number 32 'd 123]" - ); - - MT("hex_literals", - "[number 4'h0]", - "[number 4'ha]", - "[number 4'hF]", - "[number 4'hx]", - "[number 4'hz]", - "[number 4'hX]", - "[number 4'hZ]", - "[number 32'hdc78]", - "[number 32'hDC78]", - "[number 32 'hDC78]", - "[number 32'h DC78]", - "[number 32 'h DC78]", - "[number 32'h44x7]", - "[number 32'hFFF?]" - ); - - MT("real_number_literals", - "[number 1.2]", - "[number 0.1]", - "[number 2394.26331]", - "[number 1.2E12]", - "[number 1.2e12]", - "[number 1.30e-2]", - "[number 0.1e-0]", - "[number 23E10]", - "[number 29E-2]", - "[number 236.123_763_e-12]" - ); - - MT("operators", - "[meta ^]" - ); - - MT("keywords", - "[keyword logic]", - "[keyword logic] [variable foo]", - "[keyword reg] [variable abc]" - ); - - MT("variables", - "[variable _leading_underscore]", - "[variable _if]", - "[number 12] [variable foo]", - "[variable foo] [number 14]" - ); - - MT("tick_defines", - "[def `FOO]", - "[def `foo]", - "[def `FOO_bar]" - ); - - MT("system_calls", - "[meta $display]", - "[meta $vpi_printf]" - ); - - MT("line_comment", "[comment // Hello world]"); - - // Alignment tests - MT("align_port_map_style1", - /** - * mod mod(.a(a), - * .b(b) - * ); - */ - "[variable mod] [variable mod][bracket (].[variable a][bracket (][variable a][bracket )],", - " .[variable b][bracket (][variable b][bracket )]", - " [bracket )];", - "" - ); - - MT("align_port_map_style2", - /** - * mod mod( - * .a(a), - * .b(b) - * ); - */ - "[variable mod] [variable mod][bracket (]", - " .[variable a][bracket (][variable a][bracket )],", - " .[variable b][bracket (][variable b][bracket )]", - "[bracket )];", - "" - ); - - // Indentation tests - MT("indent_single_statement_if", - "[keyword if] [bracket (][variable foo][bracket )]", - " [keyword break];", - "" - ); - - MT("no_indent_after_single_line_if", - "[keyword if] [bracket (][variable foo][bracket )] [keyword break];", - "" - ); - - MT("indent_after_if_begin_same_line", - "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]", - " [keyword break];", - " [keyword break];", - "[keyword end]", - "" - ); - - MT("indent_after_if_begin_next_line", - "[keyword if] [bracket (][variable foo][bracket )]", - " [keyword begin]", - " [keyword break];", - " [keyword break];", - " [keyword end]", - "" - ); - - MT("indent_single_statement_if_else", - "[keyword if] [bracket (][variable foo][bracket )]", - " [keyword break];", - "[keyword else]", - " [keyword break];", - "" - ); - - MT("indent_if_else_begin_same_line", - "[keyword if] [bracket (][variable foo][bracket )] [keyword begin]", - " [keyword break];", - " [keyword break];", - "[keyword end] [keyword else] [keyword begin]", - " [keyword break];", - " [keyword break];", - "[keyword end]", - "" - ); - - MT("indent_if_else_begin_next_line", - "[keyword if] [bracket (][variable foo][bracket )]", - " [keyword begin]", - " [keyword break];", - " [keyword break];", - " [keyword end]", - "[keyword else]", - " [keyword begin]", - " [keyword break];", - " [keyword break];", - " [keyword end]", - "" - ); - - MT("indent_if_nested_without_begin", - "[keyword if] [bracket (][variable foo][bracket )]", - " [keyword if] [bracket (][variable foo][bracket )]", - " [keyword if] [bracket (][variable foo][bracket )]", - " [keyword break];", - "" - ); - - MT("indent_case", - "[keyword case] [bracket (][variable state][bracket )]", - " [variable FOO]:", - " [keyword break];", - " [variable BAR]:", - " [keyword break];", - "[keyword endcase]", - "" - ); - - MT("unindent_after_end_with_preceding_text", - "[keyword begin]", - " [keyword break]; [keyword end]", - "" - ); - - MT("export_function_one_line_does_not_indent", - "[keyword export] [string \"DPI-C\"] [keyword function] [variable helloFromSV];", - "" - ); - - MT("export_task_one_line_does_not_indent", - "[keyword export] [string \"DPI-C\"] [keyword task] [variable helloFromSV];", - "" - ); - - MT("export_function_two_lines_indents_properly", - "[keyword export]", - " [string \"DPI-C\"] [keyword function] [variable helloFromSV];", - "" - ); - - MT("export_task_two_lines_indents_properly", - "[keyword export]", - " [string \"DPI-C\"] [keyword task] [variable helloFromSV];", - "" - ); - - MT("import_function_one_line_does_not_indent", - "[keyword import] [string \"DPI-C\"] [keyword function] [variable helloFromC];", - "" - ); - - MT("import_task_one_line_does_not_indent", - "[keyword import] [string \"DPI-C\"] [keyword task] [variable helloFromC];", - "" - ); - - MT("import_package_single_line_does_not_indent", - "[keyword import] [variable p]::[variable x];", - "[keyword import] [variable p]::[variable y];", - "" - ); - - MT("covergroup_with_function_indents_properly", - "[keyword covergroup] [variable cg] [keyword with] [keyword function] [variable sample][bracket (][keyword bit] [variable b][bracket )];", - " [variable c] : [keyword coverpoint] [variable c];", - "[keyword endgroup]: [variable cg]", - "" - ); - -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/verilog/verilog.js b/public/plugins/codemirror-5.17.0/mode/verilog/verilog.js deleted file mode 100644 index 7513dce..0000000 --- a/public/plugins/codemirror-5.17.0/mode/verilog/verilog.js +++ /dev/null @@ -1,537 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("verilog", function(config, parserConfig) { - - var indentUnit = config.indentUnit, - statementIndentUnit = parserConfig.statementIndentUnit || indentUnit, - dontAlignCalls = parserConfig.dontAlignCalls, - noIndentKeywords = parserConfig.noIndentKeywords || [], - multiLineStrings = parserConfig.multiLineStrings, - hooks = parserConfig.hooks || {}; - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - /** - * Keywords from IEEE 1800-2012 - */ - var keywords = words( - "accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind " + - "bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config " + - "const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable " + - "dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup " + - "endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask " + - "enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin " + - "function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import " + - "incdir include initial inout input inside instance int integer interconnect interface intersect join join_any " + - "join_none large let liblist library local localparam logic longint macromodule matches medium modport module " + - "nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed " + - "parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup " + - "pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg " + - "reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime " + - "s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify " + - "specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on " + - "table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior " + - "trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void " + - "wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor"); - - /** Operators from IEEE 1800-2012 - unary_operator ::= - + | - | ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ - binary_operator ::= - + | - | * | / | % | == | != | === | !== | ==? | !=? | && | || | ** - | < | <= | > | >= | & | | | ^ | ^~ | ~^ | >> | << | >>> | <<< - | -> | <-> - inc_or_dec_operator ::= ++ | -- - unary_module_path_operator ::= - ! | ~ | & | ~& | | | ~| | ^ | ~^ | ^~ - binary_module_path_operator ::= - == | != | && | || | & | | | ^ | ^~ | ~^ - */ - var isOperatorChar = /[\+\-\*\/!~&|^%=?:]/; - var isBracketChar = /[\[\]{}()]/; - - var unsignedNumber = /\d[0-9_]*/; - var decimalLiteral = /\d*\s*'s?d\s*\d[0-9_]*/i; - var binaryLiteral = /\d*\s*'s?b\s*[xz01][xz01_]*/i; - var octLiteral = /\d*\s*'s?o\s*[xz0-7][xz0-7_]*/i; - var hexLiteral = /\d*\s*'s?h\s*[0-9a-fxz?][0-9a-fxz?_]*/i; - var realLiteral = /(\d[\d_]*(\.\d[\d_]*)?E-?[\d_]+)|(\d[\d_]*\.\d[\d_]*)/i; - - var closingBracketOrWord = /^((\w+)|[)}\]])/; - var closingBracket = /[)}\]]/; - - var curPunc; - var curKeyword; - - // Block openings which are closed by a matching keyword in the form of ("end" + keyword) - // E.g. "task" => "endtask" - var blockKeywords = words( - "case checker class clocking config function generate interface module package" + - "primitive program property specify sequence table task" - ); - - // Opening/closing pairs - var openClose = {}; - for (var keyword in blockKeywords) { - openClose[keyword] = "end" + keyword; - } - openClose["begin"] = "end"; - openClose["casex"] = "endcase"; - openClose["casez"] = "endcase"; - openClose["do" ] = "while"; - openClose["fork" ] = "join;join_any;join_none"; - openClose["covergroup"] = "endgroup"; - - for (var i in noIndentKeywords) { - var keyword = noIndentKeywords[i]; - if (openClose[keyword]) { - openClose[keyword] = undefined; - } - } - - // Keywords which open statements that are ended with a semi-colon - var statementKeywords = words("always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while"); - - function tokenBase(stream, state) { - var ch = stream.peek(), style; - if (hooks[ch] && (style = hooks[ch](stream, state)) != false) return style; - if (hooks.tokenBase && (style = hooks.tokenBase(stream, state)) != false) - return style; - - if (/[,;:\.]/.test(ch)) { - curPunc = stream.next(); - return null; - } - if (isBracketChar.test(ch)) { - curPunc = stream.next(); - return "bracket"; - } - // Macros (tick-defines) - if (ch == '`') { - stream.next(); - if (stream.eatWhile(/[\w\$_]/)) { - return "def"; - } else { - return null; - } - } - // System calls - if (ch == '$') { - stream.next(); - if (stream.eatWhile(/[\w\$_]/)) { - return "meta"; - } else { - return null; - } - } - // Time literals - if (ch == '#') { - stream.next(); - stream.eatWhile(/[\d_.]/); - return "def"; - } - // Strings - if (ch == '"') { - stream.next(); - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } - // Comments - if (ch == "/") { - stream.next(); - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - stream.backUp(1); - } - - // Numeric literals - if (stream.match(realLiteral) || - stream.match(decimalLiteral) || - stream.match(binaryLiteral) || - stream.match(octLiteral) || - stream.match(hexLiteral) || - stream.match(unsignedNumber) || - stream.match(realLiteral)) { - return "number"; - } - - // Operators - if (stream.eatWhile(isOperatorChar)) { - return "meta"; - } - - // Keywords / plain variables - if (stream.eatWhile(/[\w\$_]/)) { - var cur = stream.current(); - if (keywords[cur]) { - if (openClose[cur]) { - curPunc = "newblock"; - } - if (statementKeywords[cur]) { - curPunc = "newstatement"; - } - curKeyword = cur; - return "keyword"; - } - return "variable"; - } - - stream.next(); - return null; - } - - function tokenString(quote) { - return function(stream, state) { - var escaped = false, next, end = false; - while ((next = stream.next()) != null) { - if (next == quote && !escaped) {end = true; break;} - escaped = !escaped && next == "\\"; - } - if (end || !(escaped || multiLineStrings)) - state.tokenize = tokenBase; - return "string"; - }; - } - - function tokenComment(stream, state) { - var maybeEnd = false, ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = (ch == "*"); - } - return "comment"; - } - - function Context(indented, column, type, align, prev) { - this.indented = indented; - this.column = column; - this.type = type; - this.align = align; - this.prev = prev; - } - function pushContext(state, col, type) { - var indent = state.indented; - var c = new Context(indent, col, type, null, state.context); - return state.context = c; - } - function popContext(state) { - var t = state.context.type; - if (t == ")" || t == "]" || t == "}") { - state.indented = state.context.indented; - } - return state.context = state.context.prev; - } - - function isClosing(text, contextClosing) { - if (text == contextClosing) { - return true; - } else { - // contextClosing may be multiple keywords separated by ; - var closingKeywords = contextClosing.split(";"); - for (var i in closingKeywords) { - if (text == closingKeywords[i]) { - return true; - } - } - return false; - } - } - - function buildElectricInputRegEx() { - // Reindentation should occur on any bracket char: {}()[] - // or on a match of any of the block closing keywords, at - // the end of a line - var allClosings = []; - for (var i in openClose) { - if (openClose[i]) { - var closings = openClose[i].split(";"); - for (var j in closings) { - allClosings.push(closings[j]); - } - } - } - var re = new RegExp("[{}()\\[\\]]|(" + allClosings.join("|") + ")$"); - return re; - } - - // Interface - return { - - // Regex to force current line to reindent - electricInput: buildElectricInputRegEx(), - - startState: function(basecolumn) { - var state = { - tokenize: null, - context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), - indented: 0, - startOfLine: true - }; - if (hooks.startState) hooks.startState(state); - return state; - }, - - token: function(stream, state) { - var ctx = state.context; - if (stream.sol()) { - if (ctx.align == null) ctx.align = false; - state.indented = stream.indentation(); - state.startOfLine = true; - } - if (hooks.token) hooks.token(stream, state); - if (stream.eatSpace()) return null; - curPunc = null; - curKeyword = null; - var style = (state.tokenize || tokenBase)(stream, state); - if (style == "comment" || style == "meta" || style == "variable") return style; - if (ctx.align == null) ctx.align = true; - - if (curPunc == ctx.type) { - popContext(state); - } else if ((curPunc == ";" && ctx.type == "statement") || - (ctx.type && isClosing(curKeyword, ctx.type))) { - ctx = popContext(state); - while (ctx && ctx.type == "statement") ctx = popContext(state); - } else if (curPunc == "{") { - pushContext(state, stream.column(), "}"); - } else if (curPunc == "[") { - pushContext(state, stream.column(), "]"); - } else if (curPunc == "(") { - pushContext(state, stream.column(), ")"); - } else if (ctx && ctx.type == "endcase" && curPunc == ":") { - pushContext(state, stream.column(), "statement"); - } else if (curPunc == "newstatement") { - pushContext(state, stream.column(), "statement"); - } else if (curPunc == "newblock") { - if (curKeyword == "function" && ctx && (ctx.type == "statement" || ctx.type == "endgroup")) { - // The 'function' keyword can appear in some other contexts where it actually does not - // indicate a function (import/export DPI and covergroup definitions). - // Do nothing in this case - } else if (curKeyword == "task" && ctx && ctx.type == "statement") { - // Same thing for task - } else { - var close = openClose[curKeyword]; - pushContext(state, stream.column(), close); - } - } - - state.startOfLine = false; - return style; - }, - - indent: function(state, textAfter) { - if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass; - if (hooks.indent) { - var fromHook = hooks.indent(state); - if (fromHook >= 0) return fromHook; - } - var ctx = state.context, firstChar = textAfter && textAfter.charAt(0); - if (ctx.type == "statement" && firstChar == "}") ctx = ctx.prev; - var closing = false; - var possibleClosing = textAfter.match(closingBracketOrWord); - if (possibleClosing) - closing = isClosing(possibleClosing[0], ctx.type); - if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : statementIndentUnit); - else if (closingBracket.test(ctx.type) && ctx.align && !dontAlignCalls) return ctx.column + (closing ? 0 : 1); - else if (ctx.type == ")" && !closing) return ctx.indented + statementIndentUnit; - else return ctx.indented + (closing ? 0 : indentUnit); - }, - - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: "//" - }; -}); - - CodeMirror.defineMIME("text/x-verilog", { - name: "verilog" - }); - - CodeMirror.defineMIME("text/x-systemverilog", { - name: "verilog" - }); - - // TLVVerilog mode - - var tlvchScopePrefixes = { - ">": "property", "->": "property", "-": "hr", "|": "link", "?$": "qualifier", "?*": "qualifier", - "@-": "variable-3", "@": "variable-3", "?": "qualifier" - }; - - function tlvGenIndent(stream, state) { - var tlvindentUnit = 2; - var rtnIndent = -1, indentUnitRq = 0, curIndent = stream.indentation(); - switch (state.tlvCurCtlFlowChar) { - case "\\": - curIndent = 0; - break; - case "|": - if (state.tlvPrevPrevCtlFlowChar == "@") { - indentUnitRq = -2; //-2 new pipe rq after cur pipe - break; - } - if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar]) - indentUnitRq = 1; // +1 new scope - break; - case "M": // m4 - if (state.tlvPrevPrevCtlFlowChar == "@") { - indentUnitRq = -2; //-2 new inst rq after pipe - break; - } - if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar]) - indentUnitRq = 1; // +1 new scope - break; - case "@": - if (state.tlvPrevCtlFlowChar == "S") - indentUnitRq = -1; // new pipe stage after stmts - if (state.tlvPrevCtlFlowChar == "|") - indentUnitRq = 1; // 1st pipe stage - break; - case "S": - if (state.tlvPrevCtlFlowChar == "@") - indentUnitRq = 1; // flow in pipe stage - if (tlvchScopePrefixes[state.tlvPrevCtlFlowChar]) - indentUnitRq = 1; // +1 new scope - break; - } - var statementIndentUnit = tlvindentUnit; - rtnIndent = curIndent + (indentUnitRq*statementIndentUnit); - return rtnIndent >= 0 ? rtnIndent : curIndent; - } - - CodeMirror.defineMIME("text/x-tlv", { - name: "verilog", - hooks: { - "\\": function(stream, state) { - var vxIndent = 0, style = false; - var curPunc = stream.string; - if ((stream.sol()) && ((/\\SV/.test(stream.string)) || (/\\TLV/.test(stream.string)))) { - curPunc = (/\\TLV_version/.test(stream.string)) - ? "\\TLV_version" : stream.string; - stream.skipToEnd(); - if (curPunc == "\\SV" && state.vxCodeActive) {state.vxCodeActive = false;}; - if ((/\\TLV/.test(curPunc) && !state.vxCodeActive) - || (curPunc=="\\TLV_version" && state.vxCodeActive)) {state.vxCodeActive = true;}; - style = "keyword"; - state.tlvCurCtlFlowChar = state.tlvPrevPrevCtlFlowChar - = state.tlvPrevCtlFlowChar = ""; - if (state.vxCodeActive == true) { - state.tlvCurCtlFlowChar = "\\"; - vxIndent = tlvGenIndent(stream, state); - } - state.vxIndentRq = vxIndent; - } - return style; - }, - tokenBase: function(stream, state) { - var vxIndent = 0, style = false; - var tlvisOperatorChar = /[\[\]=:]/; - var tlvkpScopePrefixs = { - "**":"variable-2", "*":"variable-2", "$$":"variable", "$":"variable", - "^^":"attribute", "^":"attribute"}; - var ch = stream.peek(); - var vxCurCtlFlowCharValueAtStart = state.tlvCurCtlFlowChar; - if (state.vxCodeActive == true) { - if (/[\[\]{}\(\);\:]/.test(ch)) { - // bypass nesting and 1 char punc - style = "meta"; - stream.next(); - } else if (ch == "/") { - stream.next(); - if (stream.eat("/")) { - stream.skipToEnd(); - style = "comment"; - state.tlvCurCtlFlowChar = "S"; - } else { - stream.backUp(1); - } - } else if (ch == "@") { - // pipeline stage - style = tlvchScopePrefixes[ch]; - state.tlvCurCtlFlowChar = "@"; - stream.next(); - stream.eatWhile(/[\w\$_]/); - } else if (stream.match(/\b[mM]4+/, true)) { // match: function(pattern, consume, caseInsensitive) - // m4 pre proc - stream.skipTo("("); - style = "def"; - state.tlvCurCtlFlowChar = "M"; - } else if (ch == "!" && stream.sol()) { - // v stmt in tlv region - // state.tlvCurCtlFlowChar = "S"; - style = "comment"; - stream.next(); - } else if (tlvisOperatorChar.test(ch)) { - // operators - stream.eatWhile(tlvisOperatorChar); - style = "operator"; - } else if (ch == "#") { - // phy hier - state.tlvCurCtlFlowChar = (state.tlvCurCtlFlowChar == "") - ? ch : state.tlvCurCtlFlowChar; - stream.next(); - stream.eatWhile(/[+-]\d/); - style = "tag"; - } else if (tlvkpScopePrefixs.propertyIsEnumerable(ch)) { - // special TLV operators - style = tlvkpScopePrefixs[ch]; - state.tlvCurCtlFlowChar = state.tlvCurCtlFlowChar == "" ? "S" : state.tlvCurCtlFlowChar; // stmt - stream.next(); - stream.match(/[a-zA-Z_0-9]+/); - } else if (style = tlvchScopePrefixes[ch] || false) { - // special TLV operators - state.tlvCurCtlFlowChar = state.tlvCurCtlFlowChar == "" ? ch : state.tlvCurCtlFlowChar; - stream.next(); - stream.match(/[a-zA-Z_0-9]+/); - } - if (state.tlvCurCtlFlowChar != vxCurCtlFlowCharValueAtStart) { // flow change - vxIndent = tlvGenIndent(stream, state); - state.vxIndentRq = vxIndent; - } - } - return style; - }, - token: function(stream, state) { - if (state.vxCodeActive == true && stream.sol() && state.tlvCurCtlFlowChar != "") { - state.tlvPrevPrevCtlFlowChar = state.tlvPrevCtlFlowChar; - state.tlvPrevCtlFlowChar = state.tlvCurCtlFlowChar; - state.tlvCurCtlFlowChar = ""; - } - }, - indent: function(state) { - return (state.vxCodeActive == true) ? state.vxIndentRq : -1; - }, - startState: function(state) { - state.tlvCurCtlFlowChar = ""; - state.tlvPrevCtlFlowChar = ""; - state.tlvPrevPrevCtlFlowChar = ""; - state.vxCodeActive = true; - state.vxIndentRq = 0; - } - } - }); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/vhdl/index.html b/public/plugins/codemirror-5.17.0/mode/vhdl/index.html deleted file mode 100644 index 3051bc3..0000000 --- a/public/plugins/codemirror-5.17.0/mode/vhdl/index.html +++ /dev/null @@ -1,95 +0,0 @@ - - -CodeMirror: VHDL mode - - - - - - - - - - -
    -

    VHDL mode

    - -
    - - - -

    -Syntax highlighting and indentation for the VHDL language. -

    Configuration options:

    -
      -
    • atoms - List of atom words. Default: "null"
    • -
    • hooks - List of meta hooks. Default: ["`", "$"]
    • -
    • multiLineStrings - Whether multi-line strings are accepted. Default: false
    • -
    -

    - -

    MIME types defined: text/x-vhdl.

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/vhdl/vhdl.js b/public/plugins/codemirror-5.17.0/mode/vhdl/vhdl.js deleted file mode 100644 index 97e086e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/vhdl/vhdl.js +++ /dev/null @@ -1,189 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Originally written by Alf Nielsen, re-written by Michael Zhou -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -function words(str) { - var obj = {}, words = str.split(","); - for (var i = 0; i < words.length; ++i) { - var allCaps = words[i].toUpperCase(); - var firstCap = words[i].charAt(0).toUpperCase() + words[i].slice(1); - obj[words[i]] = true; - obj[allCaps] = true; - obj[firstCap] = true; - } - return obj; -} - -function metaHook(stream) { - stream.eatWhile(/[\w\$_]/); - return "meta"; -} - -CodeMirror.defineMode("vhdl", function(config, parserConfig) { - var indentUnit = config.indentUnit, - atoms = parserConfig.atoms || words("null"), - hooks = parserConfig.hooks || {"`": metaHook, "$": metaHook}, - multiLineStrings = parserConfig.multiLineStrings; - - var keywords = words("abs,access,after,alias,all,and,architecture,array,assert,attribute,begin,block," + - "body,buffer,bus,case,component,configuration,constant,disconnect,downto,else,elsif,end,end block,end case," + - "end component,end for,end generate,end if,end loop,end process,end record,end units,entity,exit,file,for," + - "function,generate,generic,generic map,group,guarded,if,impure,in,inertial,inout,is,label,library,linkage," + - "literal,loop,map,mod,nand,new,next,nor,null,of,on,open,or,others,out,package,package body,port,port map," + - "postponed,procedure,process,pure,range,record,register,reject,rem,report,return,rol,ror,select,severity,signal," + - "sla,sll,sra,srl,subtype,then,to,transport,type,unaffected,units,until,use,variable,wait,when,while,with,xnor,xor"); - - var blockKeywords = words("architecture,entity,begin,case,port,else,elsif,end,for,function,if"); - - var isOperatorChar = /[&|~> - -CodeMirror: Vue.js mode - - - - - - - - - - - - - - - - - - - - - -
    -

    Vue.js mode

    -
    - - -

    MIME types defined: text/x-vue

    - -
    diff --git a/public/plugins/codemirror-5.17.0/mode/vue/vue.js b/public/plugins/codemirror-5.17.0/mode/vue/vue.js deleted file mode 100644 index d89a552..0000000 --- a/public/plugins/codemirror-5.17.0/mode/vue/vue.js +++ /dev/null @@ -1,69 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function (mod) { - "use strict"; - if (typeof exports === "object" && typeof module === "object") {// CommonJS - mod(require("../../lib/codemirror"), - require("../../addon/mode/overlay"), - require("../xml/xml"), - require("../javascript/javascript"), - require("../coffeescript/coffeescript"), - require("../css/css"), - require("../sass/sass"), - require("../stylus/stylus"), - require("../jade/jade"), - require("../handlebars/handlebars")); - } else if (typeof define === "function" && define.amd) { // AMD - define(["../../lib/codemirror", - "../../addon/mode/overlay", - "../xml/xml", - "../javascript/javascript", - "../coffeescript/coffeescript", - "../css/css", - "../sass/sass", - "../stylus/stylus", - "../jade/jade", - "../handlebars/handlebars"], mod); - } else { // Plain browser env - mod(CodeMirror); - } -})(function (CodeMirror) { - var tagLanguages = { - script: [ - ["lang", /coffee(script)?/, "coffeescript"], - ["type", /^(?:text|application)\/(?:x-)?coffee(?:script)?$/, "coffeescript"] - ], - style: [ - ["lang", /^stylus$/i, "stylus"], - ["lang", /^sass$/i, "sass"], - ["type", /^(text\/)?(x-)?styl(us)?$/i, "stylus"], - ["type", /^text\/sass/i, "sass"] - ], - template: [ - ["lang", /^vue-template$/i, "vue"], - ["lang", /^jade$/i, "jade"], - ["lang", /^handlebars$/i, "handlebars"], - ["type", /^(text\/)?(x-)?jade$/i, "jade"], - ["type", /^text\/x-handlebars-template$/i, "handlebars"], - [null, null, "vue-template"] - ] - }; - - CodeMirror.defineMode("vue-template", function (config, parserConfig) { - var mustacheOverlay = { - token: function (stream) { - if (stream.match(/^\{\{.*?\}\}/)) return "meta mustache"; - while (stream.next() && !stream.match("{{", false)) {} - return null; - } - }; - return CodeMirror.overlayMode(CodeMirror.getMode(config, parserConfig.backdrop || "text/html"), mustacheOverlay); - }); - - CodeMirror.defineMode("vue", function (config) { - return CodeMirror.getMode(config, {name: "htmlmixed", tags: tagLanguages}); - }, "htmlmixed", "xml", "javascript", "coffeescript", "css", "sass", "stylus", "jade", "handlebars"); - - CodeMirror.defineMIME("script/x-vue", "vue"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/webidl/index.html b/public/plugins/codemirror-5.17.0/mode/webidl/index.html deleted file mode 100644 index 1d4112e..0000000 --- a/public/plugins/codemirror-5.17.0/mode/webidl/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - -CodeMirror: Web IDL mode - - - - - - - - - - -
    -

    Web IDL mode

    - -
    - -
    - - - -

    MIME type defined: text/x-webidl.

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/webidl/webidl.js b/public/plugins/codemirror-5.17.0/mode/webidl/webidl.js deleted file mode 100644 index 8143336..0000000 --- a/public/plugins/codemirror-5.17.0/mode/webidl/webidl.js +++ /dev/null @@ -1,195 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -function wordRegexp(words) { - return new RegExp("^((" + words.join(")|(") + "))\\b"); -}; - -var builtinArray = [ - "Clamp", - "Constructor", - "EnforceRange", - "Exposed", - "ImplicitThis", - "Global", "PrimaryGlobal", - "LegacyArrayClass", - "LegacyUnenumerableNamedProperties", - "LenientThis", - "NamedConstructor", - "NewObject", - "NoInterfaceObject", - "OverrideBuiltins", - "PutForwards", - "Replaceable", - "SameObject", - "TreatNonObjectAsNull", - "TreatNullAs", - "EmptyString", - "Unforgeable", - "Unscopeable" -]; -var builtins = wordRegexp(builtinArray); - -var typeArray = [ - "unsigned", "short", "long", // UnsignedIntegerType - "unrestricted", "float", "double", // UnrestrictedFloatType - "boolean", "byte", "octet", // Rest of PrimitiveType - "Promise", // PromiseType - "ArrayBuffer", "DataView", "Int8Array", "Int16Array", "Int32Array", - "Uint8Array", "Uint16Array", "Uint32Array", "Uint8ClampedArray", - "Float32Array", "Float64Array", // BufferRelatedType - "ByteString", "DOMString", "USVString", "sequence", "object", "RegExp", - "Error", "DOMException", "FrozenArray", // Rest of NonAnyType - "any", // Rest of SingleType - "void" // Rest of ReturnType -]; -var types = wordRegexp(typeArray); - -var keywordArray = [ - "attribute", "callback", "const", "deleter", "dictionary", "enum", "getter", - "implements", "inherit", "interface", "iterable", "legacycaller", "maplike", - "partial", "required", "serializer", "setlike", "setter", "static", - "stringifier", "typedef", // ArgumentNameKeyword except - // "unrestricted" - "optional", "readonly", "or" -]; -var keywords = wordRegexp(keywordArray); - -var atomArray = [ - "true", "false", // BooleanLiteral - "Infinity", "NaN", // FloatLiteral - "null" // Rest of ConstValue -]; -var atoms = wordRegexp(atomArray); - -CodeMirror.registerHelper("hintWords", "webidl", - builtinArray.concat(typeArray).concat(keywordArray).concat(atomArray)); - -var startDefArray = ["callback", "dictionary", "enum", "interface"]; -var startDefs = wordRegexp(startDefArray); - -var endDefArray = ["typedef"]; -var endDefs = wordRegexp(endDefArray); - -var singleOperators = /^[:<=>?]/; -var integers = /^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/; -var floats = /^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/; -var identifiers = /^_?[A-Za-z][0-9A-Z_a-z-]*/; -var identifiersEnd = /^_?[A-Za-z][0-9A-Z_a-z-]*(?=\s*;)/; -var strings = /^"[^"]*"/; -var multilineComments = /^\/\*.*?\*\//; -var multilineCommentsStart = /^\/\*.*/; -var multilineCommentsEnd = /^.*?\*\//; - -function readToken(stream, state) { - // whitespace - if (stream.eatSpace()) return null; - - // comment - if (state.inComment) { - if (stream.match(multilineCommentsEnd)) { - state.inComment = false; - return "comment"; - } - stream.skipToEnd(); - return "comment"; - } - if (stream.match("//")) { - stream.skipToEnd(); - return "comment"; - } - if (stream.match(multilineComments)) return "comment"; - if (stream.match(multilineCommentsStart)) { - state.inComment = true; - return "comment"; - } - - // integer and float - if (stream.match(/^-?[0-9\.]/, false)) { - if (stream.match(integers) || stream.match(floats)) return "number"; - } - - // string - if (stream.match(strings)) return "string"; - - // identifier - if (state.startDef && stream.match(identifiers)) return "def"; - - if (state.endDef && stream.match(identifiersEnd)) { - state.endDef = false; - return "def"; - } - - if (stream.match(keywords)) return "keyword"; - - if (stream.match(types)) { - var lastToken = state.lastToken; - var nextToken = (stream.match(/^\s*(.+?)\b/, false) || [])[1]; - - if (lastToken === ":" || lastToken === "implements" || - nextToken === "implements" || nextToken === "=") { - // Used as identifier - return "builtin"; - } else { - // Used as type - return "variable-3"; - } - } - - if (stream.match(builtins)) return "builtin"; - if (stream.match(atoms)) return "atom"; - if (stream.match(identifiers)) return "variable"; - - // other - if (stream.match(singleOperators)) return "operator"; - - // unrecognized - stream.next(); - return null; -}; - -CodeMirror.defineMode("webidl", function() { - return { - startState: function() { - return { - // Is in multiline comment - inComment: false, - // Last non-whitespace, matched token - lastToken: "", - // Next token is a definition - startDef: false, - // Last token of the statement is a definition - endDef: false - }; - }, - token: function(stream, state) { - var style = readToken(stream, state); - - if (style) { - var cur = stream.current(); - state.lastToken = cur; - if (style === "keyword") { - state.startDef = startDefs.test(cur); - state.endDef = state.endDef || endDefs.test(cur); - } else { - state.startDef = false; - } - } - - return style; - } - }; -}); - -CodeMirror.defineMIME("text/x-webidl", "webidl"); -}); diff --git a/public/plugins/codemirror-5.17.0/mode/xml/index.html b/public/plugins/codemirror-5.17.0/mode/xml/index.html deleted file mode 100644 index c56b8b6..0000000 --- a/public/plugins/codemirror-5.17.0/mode/xml/index.html +++ /dev/null @@ -1,61 +0,0 @@ - - -CodeMirror: XML mode - - - - - - - - - -
    -

    XML mode

    -
    - -

    The XML mode supports these configuration parameters:

    -
    -
    htmlMode (boolean)
    -
    This switches the mode to parse HTML instead of XML. This - means attributes do not have to be quoted, and some elements - (such as br) do not require a closing tag.
    -
    matchClosing (boolean)
    -
    Controls whether the mode checks that close tags match the - corresponding opening tag, and highlights mismatches as errors. - Defaults to true.
    -
    alignCDATA (boolean)
    -
    Setting this to true will force the opening tag of CDATA - blocks to not be indented.
    -
    - -

    MIME types defined: application/xml, text/html.

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/xml/test.js b/public/plugins/codemirror-5.17.0/mode/xml/test.js deleted file mode 100644 index f48156b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/xml/test.js +++ /dev/null @@ -1,51 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function() { - var mode = CodeMirror.getMode({indentUnit: 2}, "xml"), mname = "xml"; - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1), mname); } - - MT("matching", - "[tag&bracket <][tag top][tag&bracket >]", - " text", - " [tag&bracket <][tag inner][tag&bracket />]", - "[tag&bracket ]"); - - MT("nonmatching", - "[tag&bracket <][tag top][tag&bracket >]", - " [tag&bracket <][tag inner][tag&bracket />]", - " [tag&bracket ]"); - - MT("doctype", - "[meta ]", - "[tag&bracket <][tag top][tag&bracket />]"); - - MT("cdata", - "[tag&bracket <][tag top][tag&bracket >]", - " [atom ]", - "[tag&bracket ]"); - - // HTML tests - mode = CodeMirror.getMode({indentUnit: 2}, "text/html"); - - MT("selfclose", - "[tag&bracket <][tag html][tag&bracket >]", - " [tag&bracket <][tag link] [attribute rel]=[string stylesheet] [attribute href]=[string \"/foobar\"][tag&bracket >]", - "[tag&bracket ]"); - - MT("list", - "[tag&bracket <][tag ol][tag&bracket >]", - " [tag&bracket <][tag li][tag&bracket >]one", - " [tag&bracket <][tag li][tag&bracket >]two", - "[tag&bracket ]"); - - MT("valueless", - "[tag&bracket <][tag input] [attribute type]=[string checkbox] [attribute checked][tag&bracket />]"); - - MT("pThenArticle", - "[tag&bracket <][tag p][tag&bracket >]", - " foo", - "[tag&bracket <][tag article][tag&bracket >]bar"); - -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/xml/xml.js b/public/plugins/codemirror-5.17.0/mode/xml/xml.js deleted file mode 100644 index f987a3a..0000000 --- a/public/plugins/codemirror-5.17.0/mode/xml/xml.js +++ /dev/null @@ -1,394 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -var htmlConfig = { - autoSelfClosers: {'area': true, 'base': true, 'br': true, 'col': true, 'command': true, - 'embed': true, 'frame': true, 'hr': true, 'img': true, 'input': true, - 'keygen': true, 'link': true, 'meta': true, 'param': true, 'source': true, - 'track': true, 'wbr': true, 'menuitem': true}, - implicitlyClosed: {'dd': true, 'li': true, 'optgroup': true, 'option': true, 'p': true, - 'rp': true, 'rt': true, 'tbody': true, 'td': true, 'tfoot': true, - 'th': true, 'tr': true}, - contextGrabbers: { - 'dd': {'dd': true, 'dt': true}, - 'dt': {'dd': true, 'dt': true}, - 'li': {'li': true}, - 'option': {'option': true, 'optgroup': true}, - 'optgroup': {'optgroup': true}, - 'p': {'address': true, 'article': true, 'aside': true, 'blockquote': true, 'dir': true, - 'div': true, 'dl': true, 'fieldset': true, 'footer': true, 'form': true, - 'h1': true, 'h2': true, 'h3': true, 'h4': true, 'h5': true, 'h6': true, - 'header': true, 'hgroup': true, 'hr': true, 'menu': true, 'nav': true, 'ol': true, - 'p': true, 'pre': true, 'section': true, 'table': true, 'ul': true}, - 'rp': {'rp': true, 'rt': true}, - 'rt': {'rp': true, 'rt': true}, - 'tbody': {'tbody': true, 'tfoot': true}, - 'td': {'td': true, 'th': true}, - 'tfoot': {'tbody': true}, - 'th': {'td': true, 'th': true}, - 'thead': {'tbody': true, 'tfoot': true}, - 'tr': {'tr': true} - }, - doNotIndent: {"pre": true}, - allowUnquoted: true, - allowMissing: true, - caseFold: true -} - -var xmlConfig = { - autoSelfClosers: {}, - implicitlyClosed: {}, - contextGrabbers: {}, - doNotIndent: {}, - allowUnquoted: false, - allowMissing: false, - caseFold: false -} - -CodeMirror.defineMode("xml", function(editorConf, config_) { - var indentUnit = editorConf.indentUnit - var config = {} - var defaults = config_.htmlMode ? htmlConfig : xmlConfig - for (var prop in defaults) config[prop] = defaults[prop] - for (var prop in config_) config[prop] = config_[prop] - - // Return variables for tokenizers - var type, setStyle; - - function inText(stream, state) { - function chain(parser) { - state.tokenize = parser; - return parser(stream, state); - } - - var ch = stream.next(); - if (ch == "<") { - if (stream.eat("!")) { - if (stream.eat("[")) { - if (stream.match("CDATA[")) return chain(inBlock("atom", "]]>")); - else return null; - } else if (stream.match("--")) { - return chain(inBlock("comment", "-->")); - } else if (stream.match("DOCTYPE", true, true)) { - stream.eatWhile(/[\w\._\-]/); - return chain(doctype(1)); - } else { - return null; - } - } else if (stream.eat("?")) { - stream.eatWhile(/[\w\._\-]/); - state.tokenize = inBlock("meta", "?>"); - return "meta"; - } else { - type = stream.eat("/") ? "closeTag" : "openTag"; - state.tokenize = inTag; - return "tag bracket"; - } - } else if (ch == "&") { - var ok; - if (stream.eat("#")) { - if (stream.eat("x")) { - ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(";"); - } else { - ok = stream.eatWhile(/[\d]/) && stream.eat(";"); - } - } else { - ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(";"); - } - return ok ? "atom" : "error"; - } else { - stream.eatWhile(/[^&<]/); - return null; - } - } - inText.isInText = true; - - function inTag(stream, state) { - var ch = stream.next(); - if (ch == ">" || (ch == "/" && stream.eat(">"))) { - state.tokenize = inText; - type = ch == ">" ? "endTag" : "selfcloseTag"; - return "tag bracket"; - } else if (ch == "=") { - type = "equals"; - return null; - } else if (ch == "<") { - state.tokenize = inText; - state.state = baseState; - state.tagName = state.tagStart = null; - var next = state.tokenize(stream, state); - return next ? next + " tag error" : "tag error"; - } else if (/[\'\"]/.test(ch)) { - state.tokenize = inAttribute(ch); - state.stringStartCol = stream.column(); - return state.tokenize(stream, state); - } else { - stream.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/); - return "word"; - } - } - - function inAttribute(quote) { - var closure = function(stream, state) { - while (!stream.eol()) { - if (stream.next() == quote) { - state.tokenize = inTag; - break; - } - } - return "string"; - }; - closure.isInAttribute = true; - return closure; - } - - function inBlock(style, terminator) { - return function(stream, state) { - while (!stream.eol()) { - if (stream.match(terminator)) { - state.tokenize = inText; - break; - } - stream.next(); - } - return style; - }; - } - function doctype(depth) { - return function(stream, state) { - var ch; - while ((ch = stream.next()) != null) { - if (ch == "<") { - state.tokenize = doctype(depth + 1); - return state.tokenize(stream, state); - } else if (ch == ">") { - if (depth == 1) { - state.tokenize = inText; - break; - } else { - state.tokenize = doctype(depth - 1); - return state.tokenize(stream, state); - } - } - } - return "meta"; - }; - } - - function Context(state, tagName, startOfLine) { - this.prev = state.context; - this.tagName = tagName; - this.indent = state.indented; - this.startOfLine = startOfLine; - if (config.doNotIndent.hasOwnProperty(tagName) || (state.context && state.context.noIndent)) - this.noIndent = true; - } - function popContext(state) { - if (state.context) state.context = state.context.prev; - } - function maybePopContext(state, nextTagName) { - var parentTagName; - while (true) { - if (!state.context) { - return; - } - parentTagName = state.context.tagName; - if (!config.contextGrabbers.hasOwnProperty(parentTagName) || - !config.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)) { - return; - } - popContext(state); - } - } - - function baseState(type, stream, state) { - if (type == "openTag") { - state.tagStart = stream.column(); - return tagNameState; - } else if (type == "closeTag") { - return closeTagNameState; - } else { - return baseState; - } - } - function tagNameState(type, stream, state) { - if (type == "word") { - state.tagName = stream.current(); - setStyle = "tag"; - return attrState; - } else { - setStyle = "error"; - return tagNameState; - } - } - function closeTagNameState(type, stream, state) { - if (type == "word") { - var tagName = stream.current(); - if (state.context && state.context.tagName != tagName && - config.implicitlyClosed.hasOwnProperty(state.context.tagName)) - popContext(state); - if ((state.context && state.context.tagName == tagName) || config.matchClosing === false) { - setStyle = "tag"; - return closeState; - } else { - setStyle = "tag error"; - return closeStateErr; - } - } else { - setStyle = "error"; - return closeStateErr; - } - } - - function closeState(type, _stream, state) { - if (type != "endTag") { - setStyle = "error"; - return closeState; - } - popContext(state); - return baseState; - } - function closeStateErr(type, stream, state) { - setStyle = "error"; - return closeState(type, stream, state); - } - - function attrState(type, _stream, state) { - if (type == "word") { - setStyle = "attribute"; - return attrEqState; - } else if (type == "endTag" || type == "selfcloseTag") { - var tagName = state.tagName, tagStart = state.tagStart; - state.tagName = state.tagStart = null; - if (type == "selfcloseTag" || - config.autoSelfClosers.hasOwnProperty(tagName)) { - maybePopContext(state, tagName); - } else { - maybePopContext(state, tagName); - state.context = new Context(state, tagName, tagStart == state.indented); - } - return baseState; - } - setStyle = "error"; - return attrState; - } - function attrEqState(type, stream, state) { - if (type == "equals") return attrValueState; - if (!config.allowMissing) setStyle = "error"; - return attrState(type, stream, state); - } - function attrValueState(type, stream, state) { - if (type == "string") return attrContinuedState; - if (type == "word" && config.allowUnquoted) {setStyle = "string"; return attrState;} - setStyle = "error"; - return attrState(type, stream, state); - } - function attrContinuedState(type, stream, state) { - if (type == "string") return attrContinuedState; - return attrState(type, stream, state); - } - - return { - startState: function(baseIndent) { - var state = {tokenize: inText, - state: baseState, - indented: baseIndent || 0, - tagName: null, tagStart: null, - context: null} - if (baseIndent != null) state.baseIndent = baseIndent - return state - }, - - token: function(stream, state) { - if (!state.tagName && stream.sol()) - state.indented = stream.indentation(); - - if (stream.eatSpace()) return null; - type = null; - var style = state.tokenize(stream, state); - if ((style || type) && style != "comment") { - setStyle = null; - state.state = state.state(type || style, stream, state); - if (setStyle) - style = setStyle == "error" ? style + " error" : setStyle; - } - return style; - }, - - indent: function(state, textAfter, fullLine) { - var context = state.context; - // Indent multi-line strings (e.g. css). - if (state.tokenize.isInAttribute) { - if (state.tagStart == state.indented) - return state.stringStartCol + 1; - else - return state.indented + indentUnit; - } - if (context && context.noIndent) return CodeMirror.Pass; - if (state.tokenize != inTag && state.tokenize != inText) - return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0; - // Indent the starts of attribute names. - if (state.tagName) { - if (config.multilineTagIndentPastTag !== false) - return state.tagStart + state.tagName.length + 2; - else - return state.tagStart + indentUnit * (config.multilineTagIndentFactor || 1); - } - if (config.alignCDATA && /$/, - blockCommentStart: "", - - configuration: config.htmlMode ? "html" : "xml", - helperType: config.htmlMode ? "html" : "xml", - - skipAttribute: function(state) { - if (state.state == attrValueState) - state.state = attrState - } - }; -}); - -CodeMirror.defineMIME("text/xml", "xml"); -CodeMirror.defineMIME("application/xml", "xml"); -if (!CodeMirror.mimeModes.hasOwnProperty("text/html")) - CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true}); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/xquery/index.html b/public/plugins/codemirror-5.17.0/mode/xquery/index.html deleted file mode 100644 index 7ac5aae..0000000 --- a/public/plugins/codemirror-5.17.0/mode/xquery/index.html +++ /dev/null @@ -1,210 +0,0 @@ - - -CodeMirror: XQuery mode - - - - - - - - - - -
    -

    XQuery mode

    - - -
    - -
    - - - -

    MIME types defined: application/xquery.

    - -

    Development of the CodeMirror XQuery mode was sponsored by - MarkLogic and developed by - Mike Brevoort. -

    - -
    diff --git a/public/plugins/codemirror-5.17.0/mode/xquery/test.js b/public/plugins/codemirror-5.17.0/mode/xquery/test.js deleted file mode 100644 index 1f148cd..0000000 --- a/public/plugins/codemirror-5.17.0/mode/xquery/test.js +++ /dev/null @@ -1,67 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Don't take these too seriously -- the expected results appear to be -// based on the results of actual runs without any serious manual -// verification. If a change you made causes them to fail, the test is -// as likely to wrong as the code. - -(function() { - var mode = CodeMirror.getMode({tabSize: 4}, "xquery"); - function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } - - MT("eviltest", - "[keyword xquery] [keyword version] [variable "1][keyword .][atom 0][keyword -][variable ml"][def&variable ;] [comment (: this is : a \"comment\" :)]", - " [keyword let] [variable $let] [keyword :=] [variable <x] [variable attr][keyword =][variable "value">"test"<func>][def&variable ;function]() [variable $var] {[keyword function]()} {[variable $var]}[variable <][keyword /][variable func><][keyword /][variable x>]", - " [keyword let] [variable $joe][keyword :=][atom 1]", - " [keyword return] [keyword element] [variable element] {", - " [keyword attribute] [variable attribute] { [atom 1] },", - " [keyword element] [variable test] { [variable 'a'] }, [keyword attribute] [variable foo] { [variable "bar"] },", - " [def&variable fn:doc]()[[ [variable foo][keyword /][variable @bar] [keyword eq] [variable $let] ]],", - " [keyword //][variable x] } [comment (: a more 'evil' test :)]", - " [comment (: Modified Blakeley example (: with nested comment :) ... :)]", - " [keyword declare] [keyword private] [keyword function] [def&variable local:declare]() {()}[variable ;]", - " [keyword declare] [keyword private] [keyword function] [def&variable local:private]() {()}[variable ;]", - " [keyword declare] [keyword private] [keyword function] [def&variable local:function]() {()}[variable ;]", - " [keyword declare] [keyword private] [keyword function] [def&variable local:local]() {()}[variable ;]", - " [keyword let] [variable $let] [keyword :=] [variable <let>let] [variable $let] [keyword :=] [variable "let"<][keyword /let][variable >]", - " [keyword return] [keyword element] [variable element] {", - " [keyword attribute] [variable attribute] { [keyword try] { [def&variable xdmp:version]() } [keyword catch]([variable $e]) { [def&variable xdmp:log]([variable $e]) } },", - " [keyword attribute] [variable fn:doc] { [variable "bar"] [variable castable] [keyword as] [atom xs:string] },", - " [keyword element] [variable text] { [keyword text] { [variable "text"] } },", - " [def&variable fn:doc]()[[ [qualifier child::][variable eq][keyword /]([variable @bar] [keyword |] [qualifier attribute::][variable attribute]) [keyword eq] [variable $let] ]],", - " [keyword //][variable fn:doc]", - " }"); - - MT("testEmptySequenceKeyword", - "[string \"foo\"] [keyword instance] [keyword of] [keyword empty-sequence]()"); - - MT("testMultiAttr", - "[tag

    ][variable hello] [variable world][tag

    ]"); - - MT("test namespaced variable", - "[keyword declare] [keyword namespace] [variable e] [keyword =] [string \"http://example.com/ANamespace\"][variable ;declare] [keyword variable] [variable $e:exampleComThisVarIsNotRecognized] [keyword as] [keyword element]([keyword *]) [variable external;]"); - - MT("test EQName variable", - "[keyword declare] [keyword variable] [variable $\"http://www.example.com/ns/my\":var] [keyword :=] [atom 12][variable ;]", - "[tag ]{[variable $\"http://www.example.com/ns/my\":var]}[tag ]"); - - MT("test EQName function", - "[keyword declare] [keyword function] [def&variable \"http://www.example.com/ns/my\":fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {", - " [variable $a] [keyword +] [atom 2]", - "}[variable ;]", - "[tag ]{[def&variable \"http://www.example.com/ns/my\":fn]([atom 12])}[tag ]"); - - MT("test EQName function with single quotes", - "[keyword declare] [keyword function] [def&variable 'http://www.example.com/ns/my':fn] ([variable $a] [keyword as] [atom xs:integer]) [keyword as] [atom xs:integer] {", - " [variable $a] [keyword +] [atom 2]", - "}[variable ;]", - "[tag ]{[def&variable 'http://www.example.com/ns/my':fn]([atom 12])}[tag ]"); - - MT("testProcessingInstructions", - "[def&variable data]([comment&meta ]) [keyword instance] [keyword of] [atom xs:string]"); - - MT("testQuoteEscapeDouble", - "[keyword let] [variable $rootfolder] [keyword :=] [string \"c:\\builds\\winnt\\HEAD\\qa\\scripts\\\"]", - "[keyword let] [variable $keysfolder] [keyword :=] [def&variable concat]([variable $rootfolder], [string \"keys\\\"])"); -})(); diff --git a/public/plugins/codemirror-5.17.0/mode/xquery/xquery.js b/public/plugins/codemirror-5.17.0/mode/xquery/xquery.js deleted file mode 100644 index 75dcbee..0000000 --- a/public/plugins/codemirror-5.17.0/mode/xquery/xquery.js +++ /dev/null @@ -1,437 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("xquery", function() { - - // The keywords object is set to the result of this self executing - // function. Each keyword is a property of the keywords object whose - // value is {type: atype, style: astyle} - var keywords = function(){ - // convenience functions used to build keywords object - function kw(type) {return {type: type, style: "keyword"};} - var A = kw("keyword a") - , B = kw("keyword b") - , C = kw("keyword c") - , operator = kw("operator") - , atom = {type: "atom", style: "atom"} - , punctuation = {type: "punctuation", style: null} - , qualifier = {type: "axis_specifier", style: "qualifier"}; - - // kwObj is what is return from this function at the end - var kwObj = { - 'if': A, 'switch': A, 'while': A, 'for': A, - 'else': B, 'then': B, 'try': B, 'finally': B, 'catch': B, - 'element': C, 'attribute': C, 'let': C, 'implements': C, 'import': C, 'module': C, 'namespace': C, - 'return': C, 'super': C, 'this': C, 'throws': C, 'where': C, 'private': C, - ',': punctuation, - 'null': atom, 'fn:false()': atom, 'fn:true()': atom - }; - - // a list of 'basic' keywords. For each add a property to kwObj with the value of - // {type: basic[i], style: "keyword"} e.g. 'after' --> {type: "after", style: "keyword"} - var basic = ['after','ancestor','ancestor-or-self','and','as','ascending','assert','attribute','before', - 'by','case','cast','child','comment','declare','default','define','descendant','descendant-or-self', - 'descending','document','document-node','element','else','eq','every','except','external','following', - 'following-sibling','follows','for','function','if','import','in','instance','intersect','item', - 'let','module','namespace','node','node','of','only','or','order','parent','precedes','preceding', - 'preceding-sibling','processing-instruction','ref','return','returns','satisfies','schema','schema-element', - 'self','some','sortby','stable','text','then','to','treat','typeswitch','union','variable','version','where', - 'xquery', 'empty-sequence']; - for(var i=0, l=basic.length; i < l; i++) { kwObj[basic[i]] = kw(basic[i]);}; - - // a list of types. For each add a property to kwObj with the value of - // {type: "atom", style: "atom"} - var types = ['xs:string', 'xs:float', 'xs:decimal', 'xs:double', 'xs:integer', 'xs:boolean', 'xs:date', 'xs:dateTime', - 'xs:time', 'xs:duration', 'xs:dayTimeDuration', 'xs:time', 'xs:yearMonthDuration', 'numeric', 'xs:hexBinary', - 'xs:base64Binary', 'xs:anyURI', 'xs:QName', 'xs:byte','xs:boolean','xs:anyURI','xf:yearMonthDuration']; - for(var i=0, l=types.length; i < l; i++) { kwObj[types[i]] = atom;}; - - // each operator will add a property to kwObj with value of {type: "operator", style: "keyword"} - var operators = ['eq', 'ne', 'lt', 'le', 'gt', 'ge', ':=', '=', '>', '>=', '<', '<=', '.', '|', '?', 'and', 'or', 'div', 'idiv', 'mod', '*', '/', '+', '-']; - for(var i=0, l=operators.length; i < l; i++) { kwObj[operators[i]] = operator;}; - - // each axis_specifiers will add a property to kwObj with value of {type: "axis_specifier", style: "qualifier"} - var axis_specifiers = ["self::", "attribute::", "child::", "descendant::", "descendant-or-self::", "parent::", - "ancestor::", "ancestor-or-self::", "following::", "preceding::", "following-sibling::", "preceding-sibling::"]; - for(var i=0, l=axis_specifiers.length; i < l; i++) { kwObj[axis_specifiers[i]] = qualifier; }; - - return kwObj; - }(); - - function chain(stream, state, f) { - state.tokenize = f; - return f(stream, state); - } - - // the primary mode tokenizer - function tokenBase(stream, state) { - var ch = stream.next(), - mightBeFunction = false, - isEQName = isEQNameAhead(stream); - - // an XML tag (if not in some sub, chained tokenizer) - if (ch == "<") { - if(stream.match("!--", true)) - return chain(stream, state, tokenXMLComment); - - if(stream.match("![CDATA", false)) { - state.tokenize = tokenCDATA; - return "tag"; - } - - if(stream.match("?", false)) { - return chain(stream, state, tokenPreProcessing); - } - - var isclose = stream.eat("/"); - stream.eatSpace(); - var tagName = "", c; - while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c; - - return chain(stream, state, tokenTag(tagName, isclose)); - } - // start code block - else if(ch == "{") { - pushStateStack(state,{ type: "codeblock"}); - return null; - } - // end code block - else if(ch == "}") { - popStateStack(state); - return null; - } - // if we're in an XML block - else if(isInXmlBlock(state)) { - if(ch == ">") - return "tag"; - else if(ch == "/" && stream.eat(">")) { - popStateStack(state); - return "tag"; - } - else - return "variable"; - } - // if a number - else if (/\d/.test(ch)) { - stream.match(/^\d*(?:\.\d*)?(?:E[+\-]?\d+)?/); - return "atom"; - } - // comment start - else if (ch === "(" && stream.eat(":")) { - pushStateStack(state, { type: "comment"}); - return chain(stream, state, tokenComment); - } - // quoted string - else if ( !isEQName && (ch === '"' || ch === "'")) - return chain(stream, state, tokenString(ch)); - // variable - else if(ch === "$") { - return chain(stream, state, tokenVariable); - } - // assignment - else if(ch ===":" && stream.eat("=")) { - return "keyword"; - } - // open paren - else if(ch === "(") { - pushStateStack(state, { type: "paren"}); - return null; - } - // close paren - else if(ch === ")") { - popStateStack(state); - return null; - } - // open paren - else if(ch === "[") { - pushStateStack(state, { type: "bracket"}); - return null; - } - // close paren - else if(ch === "]") { - popStateStack(state); - return null; - } - else { - var known = keywords.propertyIsEnumerable(ch) && keywords[ch]; - - // if there's a EQName ahead, consume the rest of the string portion, it's likely a function - if(isEQName && ch === '\"') while(stream.next() !== '"'){} - if(isEQName && ch === '\'') while(stream.next() !== '\''){} - - // gobble up a word if the character is not known - if(!known) stream.eatWhile(/[\w\$_-]/); - - // gobble a colon in the case that is a lib func type call fn:doc - var foundColon = stream.eat(":"); - - // if there's not a second colon, gobble another word. Otherwise, it's probably an axis specifier - // which should get matched as a keyword - if(!stream.eat(":") && foundColon) { - stream.eatWhile(/[\w\$_-]/); - } - // if the next non whitespace character is an open paren, this is probably a function (if not a keyword of other sort) - if(stream.match(/^[ \t]*\(/, false)) { - mightBeFunction = true; - } - // is the word a keyword? - var word = stream.current(); - known = keywords.propertyIsEnumerable(word) && keywords[word]; - - // if we think it's a function call but not yet known, - // set style to variable for now for lack of something better - if(mightBeFunction && !known) known = {type: "function_call", style: "variable def"}; - - // if the previous word was element, attribute, axis specifier, this word should be the name of that - if(isInXmlConstructor(state)) { - popStateStack(state); - return "variable"; - } - // as previously checked, if the word is element,attribute, axis specifier, call it an "xmlconstructor" and - // push the stack so we know to look for it on the next word - if(word == "element" || word == "attribute" || known.type == "axis_specifier") pushStateStack(state, {type: "xmlconstructor"}); - - // if the word is known, return the details of that else just call this a generic 'word' - return known ? known.style : "variable"; - } - } - - // handle comments, including nested - function tokenComment(stream, state) { - var maybeEnd = false, maybeNested = false, nestedCount = 0, ch; - while (ch = stream.next()) { - if (ch == ")" && maybeEnd) { - if(nestedCount > 0) - nestedCount--; - else { - popStateStack(state); - break; - } - } - else if(ch == ":" && maybeNested) { - nestedCount++; - } - maybeEnd = (ch == ":"); - maybeNested = (ch == "("); - } - - return "comment"; - } - - // tokenizer for string literals - // optionally pass a tokenizer function to set state.tokenize back to when finished - function tokenString(quote, f) { - return function(stream, state) { - var ch; - - if(isInString(state) && stream.current() == quote) { - popStateStack(state); - if(f) state.tokenize = f; - return "string"; - } - - pushStateStack(state, { type: "string", name: quote, tokenize: tokenString(quote, f) }); - - // if we're in a string and in an XML block, allow an embedded code block - if(stream.match("{", false) && isInXmlAttributeBlock(state)) { - state.tokenize = tokenBase; - return "string"; - } - - - while (ch = stream.next()) { - if (ch == quote) { - popStateStack(state); - if(f) state.tokenize = f; - break; - } - else { - // if we're in a string and in an XML block, allow an embedded code block in an attribute - if(stream.match("{", false) && isInXmlAttributeBlock(state)) { - state.tokenize = tokenBase; - return "string"; - } - - } - } - - return "string"; - }; - } - - // tokenizer for variables - function tokenVariable(stream, state) { - var isVariableChar = /[\w\$_-]/; - - // a variable may start with a quoted EQName so if the next character is quote, consume to the next quote - if(stream.eat("\"")) { - while(stream.next() !== '\"'){}; - stream.eat(":"); - } else { - stream.eatWhile(isVariableChar); - if(!stream.match(":=", false)) stream.eat(":"); - } - stream.eatWhile(isVariableChar); - state.tokenize = tokenBase; - return "variable"; - } - - // tokenizer for XML tags - function tokenTag(name, isclose) { - return function(stream, state) { - stream.eatSpace(); - if(isclose && stream.eat(">")) { - popStateStack(state); - state.tokenize = tokenBase; - return "tag"; - } - // self closing tag without attributes? - if(!stream.eat("/")) - pushStateStack(state, { type: "tag", name: name, tokenize: tokenBase}); - if(!stream.eat(">")) { - state.tokenize = tokenAttribute; - return "tag"; - } - else { - state.tokenize = tokenBase; - } - return "tag"; - }; - } - - // tokenizer for XML attributes - function tokenAttribute(stream, state) { - var ch = stream.next(); - - if(ch == "/" && stream.eat(">")) { - if(isInXmlAttributeBlock(state)) popStateStack(state); - if(isInXmlBlock(state)) popStateStack(state); - return "tag"; - } - if(ch == ">") { - if(isInXmlAttributeBlock(state)) popStateStack(state); - return "tag"; - } - if(ch == "=") - return null; - // quoted string - if (ch == '"' || ch == "'") - return chain(stream, state, tokenString(ch, tokenAttribute)); - - if(!isInXmlAttributeBlock(state)) - pushStateStack(state, { type: "attribute", tokenize: tokenAttribute}); - - stream.eat(/[a-zA-Z_:]/); - stream.eatWhile(/[-a-zA-Z0-9_:.]/); - stream.eatSpace(); - - // the case where the attribute has not value and the tag was closed - if(stream.match(">", false) || stream.match("/", false)) { - popStateStack(state); - state.tokenize = tokenBase; - } - - return "attribute"; - } - - // handle comments, including nested - function tokenXMLComment(stream, state) { - var ch; - while (ch = stream.next()) { - if (ch == "-" && stream.match("->", true)) { - state.tokenize = tokenBase; - return "comment"; - } - } - } - - - // handle CDATA - function tokenCDATA(stream, state) { - var ch; - while (ch = stream.next()) { - if (ch == "]" && stream.match("]", true)) { - state.tokenize = tokenBase; - return "comment"; - } - } - } - - // handle preprocessing instructions - function tokenPreProcessing(stream, state) { - var ch; - while (ch = stream.next()) { - if (ch == "?" && stream.match(">", true)) { - state.tokenize = tokenBase; - return "comment meta"; - } - } - } - - - // functions to test the current context of the state - function isInXmlBlock(state) { return isIn(state, "tag"); } - function isInXmlAttributeBlock(state) { return isIn(state, "attribute"); } - function isInXmlConstructor(state) { return isIn(state, "xmlconstructor"); } - function isInString(state) { return isIn(state, "string"); } - - function isEQNameAhead(stream) { - // assume we've already eaten a quote (") - if(stream.current() === '"') - return stream.match(/^[^\"]+\"\:/, false); - else if(stream.current() === '\'') - return stream.match(/^[^\"]+\'\:/, false); - else - return false; - } - - function isIn(state, type) { - return (state.stack.length && state.stack[state.stack.length - 1].type == type); - } - - function pushStateStack(state, newState) { - state.stack.push(newState); - } - - function popStateStack(state) { - state.stack.pop(); - var reinstateTokenize = state.stack.length && state.stack[state.stack.length-1].tokenize; - state.tokenize = reinstateTokenize || tokenBase; - } - - // the interface for the mode API - return { - startState: function() { - return { - tokenize: tokenBase, - cc: [], - stack: [] - }; - }, - - token: function(stream, state) { - if (stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - return style; - }, - - blockCommentStart: "(:", - blockCommentEnd: ":)" - - }; - -}); - -CodeMirror.defineMIME("application/xquery", "xquery"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/yacas/index.html b/public/plugins/codemirror-5.17.0/mode/yacas/index.html deleted file mode 100644 index 8e52caf..0000000 --- a/public/plugins/codemirror-5.17.0/mode/yacas/index.html +++ /dev/null @@ -1,87 +0,0 @@ - - -CodeMirror: yacas mode - - - - - - - - - - -
    -

    yacas mode

    - - - - - - -

    MIME types defined: text/x-yacas (yacas).

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/yacas/yacas.js b/public/plugins/codemirror-5.17.0/mode/yacas/yacas.js deleted file mode 100644 index 30bd60b..0000000 --- a/public/plugins/codemirror-5.17.0/mode/yacas/yacas.js +++ /dev/null @@ -1,204 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -// Yacas mode copyright (c) 2015 by Grzegorz Mazur -// Loosely based on mathematica mode by Calin Barbat - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('yacas', function(_config, _parserConfig) { - - function words(str) { - var obj = {}, words = str.split(" "); - for (var i = 0; i < words.length; ++i) obj[words[i]] = true; - return obj; - } - - var bodiedOps = words("Assert BackQuote D Defun Deriv For ForEach FromFile " + - "FromString Function Integrate InverseTaylor Limit " + - "LocalSymbols Macro MacroRule MacroRulePattern " + - "NIntegrate Rule RulePattern Subst TD TExplicitSum " + - "TSum Taylor Taylor1 Taylor2 Taylor3 ToFile " + - "ToStdout ToString TraceRule Until While"); - - // patterns - var pFloatForm = "(?:(?:\\.\\d+|\\d+\\.\\d*|\\d+)(?:[eE][+-]?\\d+)?)"; - var pIdentifier = "(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)"; - - // regular expressions - var reFloatForm = new RegExp(pFloatForm); - var reIdentifier = new RegExp(pIdentifier); - var rePattern = new RegExp(pIdentifier + "?_" + pIdentifier); - var reFunctionLike = new RegExp(pIdentifier + "\\s*\\("); - - function tokenBase(stream, state) { - var ch; - - // get next character - ch = stream.next(); - - // string - if (ch === '"') { - state.tokenize = tokenString; - return state.tokenize(stream, state); - } - - // comment - if (ch === '/') { - if (stream.eat('*')) { - state.tokenize = tokenComment; - return state.tokenize(stream, state); - } - if (stream.eat("/")) { - stream.skipToEnd(); - return "comment"; - } - } - - // go back one character - stream.backUp(1); - - // update scope info - var m = stream.match(/^(\w+)\s*\(/, false); - if (m !== null && bodiedOps.hasOwnProperty(m[1])) - state.scopes.push('bodied'); - - var scope = currentScope(state); - - if (scope === 'bodied' && ch === '[') - state.scopes.pop(); - - if (ch === '[' || ch === '{' || ch === '(') - state.scopes.push(ch); - - scope = currentScope(state); - - if (scope === '[' && ch === ']' || - scope === '{' && ch === '}' || - scope === '(' && ch === ')') - state.scopes.pop(); - - if (ch === ';') { - while (scope === 'bodied') { - state.scopes.pop(); - scope = currentScope(state); - } - } - - // look for ordered rules - if (stream.match(/\d+ *#/, true, false)) { - return 'qualifier'; - } - - // look for numbers - if (stream.match(reFloatForm, true, false)) { - return 'number'; - } - - // look for placeholders - if (stream.match(rePattern, true, false)) { - return 'variable-3'; - } - - // match all braces separately - if (stream.match(/(?:\[|\]|{|}|\(|\))/, true, false)) { - return 'bracket'; - } - - // literals looking like function calls - if (stream.match(reFunctionLike, true, false)) { - stream.backUp(1); - return 'variable'; - } - - // all other identifiers - if (stream.match(reIdentifier, true, false)) { - return 'variable-2'; - } - - // operators; note that operators like @@ or /; are matched separately for each symbol. - if (stream.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/, true, false)) { - return 'operator'; - } - - // everything else is an error - return 'error'; - } - - function tokenString(stream, state) { - var next, end = false, escaped = false; - while ((next = stream.next()) != null) { - if (next === '"' && !escaped) { - end = true; - break; - } - escaped = !escaped && next === '\\'; - } - if (end && !escaped) { - state.tokenize = tokenBase; - } - return 'string'; - }; - - function tokenComment(stream, state) { - var prev, next; - while((next = stream.next()) != null) { - if (prev === '*' && next === '/') { - state.tokenize = tokenBase; - break; - } - prev = next; - } - return 'comment'; - } - - function currentScope(state) { - var scope = null; - if (state.scopes.length > 0) - scope = state.scopes[state.scopes.length - 1]; - return scope; - } - - return { - startState: function() { - return { - tokenize: tokenBase, - scopes: [] - }; - }, - token: function(stream, state) { - if (stream.eatSpace()) return null; - return state.tokenize(stream, state); - }, - indent: function(state, textAfter) { - if (state.tokenize !== tokenBase && state.tokenize !== null) - return CodeMirror.Pass; - - var delta = 0; - if (textAfter === ']' || textAfter === '];' || - textAfter === '}' || textAfter === '};' || - textAfter === ');') - delta = -1; - - return (state.scopes.length + delta) * _config.indentUnit; - }, - electricChars: "{}[]();", - blockCommentStart: "/*", - blockCommentEnd: "*/", - lineComment: "//" - }; -}); - -CodeMirror.defineMIME('text/x-yacas', { - name: 'yacas' -}); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/yaml-frontmatter/index.html b/public/plugins/codemirror-5.17.0/mode/yaml-frontmatter/index.html deleted file mode 100644 index 30cb294..0000000 --- a/public/plugins/codemirror-5.17.0/mode/yaml-frontmatter/index.html +++ /dev/null @@ -1,121 +0,0 @@ - - -CodeMirror: YAML front matter mode - - - - - - - - - - - - - -
    -

    YAML front matter mode

    -
    - -

    Defines a mode that parses -a YAML frontmatter -at the start of a file, switching to a base mode at the end of that. -Takes a mode configuration option base to configure the -base mode, which defaults to "gfm".

    - - - -
    diff --git a/public/plugins/codemirror-5.17.0/mode/yaml-frontmatter/yaml-frontmatter.js b/public/plugins/codemirror-5.17.0/mode/yaml-frontmatter/yaml-frontmatter.js deleted file mode 100644 index 5f49772..0000000 --- a/public/plugins/codemirror-5.17.0/mode/yaml-frontmatter/yaml-frontmatter.js +++ /dev/null @@ -1,68 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function (mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror"), require("../yaml/yaml")) - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror", "../yaml/yaml"], mod) - else // Plain browser env - mod(CodeMirror) -})(function (CodeMirror) { - - var START = 0, FRONTMATTER = 1, BODY = 2 - - // a mixed mode for Markdown text with an optional YAML front matter - CodeMirror.defineMode("yaml-frontmatter", function (config, parserConfig) { - var yamlMode = CodeMirror.getMode(config, "yaml") - var innerMode = CodeMirror.getMode(config, parserConfig && parserConfig.base || "gfm") - - function curMode(state) { - return state.state == BODY ? innerMode : yamlMode - } - - return { - startState: function () { - return { - state: START, - inner: CodeMirror.startState(yamlMode) - } - }, - copyState: function (state) { - return { - state: state.state, - inner: CodeMirror.copyState(curMode(state), state.inner) - } - }, - token: function (stream, state) { - if (state.state == START) { - if (stream.match(/---/, false)) { - state.state = FRONTMATTER - return yamlMode.token(stream, state.inner) - } else { - state.state = BODY - state.inner = CodeMirror.startState(innerMode) - return innerMode.token(stream, state.inner) - } - } else if (state.state == FRONTMATTER) { - var end = stream.sol() && stream.match(/---/, false) - var style = yamlMode.token(stream, state.inner) - if (end) { - state.state = BODY - state.inner = CodeMirror.startState(innerMode) - } - return style - } else { - return innerMode.token(stream, state.inner) - } - }, - innerMode: function (state) { - return {mode: curMode(state), state: state.inner} - }, - blankLine: function (state) { - var mode = curMode(state) - if (mode.blankLine) return mode.blankLine(state.inner) - } - } - }) -}); diff --git a/public/plugins/codemirror-5.17.0/mode/yaml/index.html b/public/plugins/codemirror-5.17.0/mode/yaml/index.html deleted file mode 100644 index be9b632..0000000 --- a/public/plugins/codemirror-5.17.0/mode/yaml/index.html +++ /dev/null @@ -1,80 +0,0 @@ - - -CodeMirror: YAML mode - - - - - - - - - -
    -

    YAML mode

    -
    - - -

    MIME types defined: text/x-yaml.

    - -
    diff --git a/public/plugins/codemirror-5.17.0/mode/yaml/yaml.js b/public/plugins/codemirror-5.17.0/mode/yaml/yaml.js deleted file mode 100644 index b7015e5..0000000 --- a/public/plugins/codemirror-5.17.0/mode/yaml/yaml.js +++ /dev/null @@ -1,117 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode("yaml", function() { - - var cons = ['true', 'false', 'on', 'off', 'yes', 'no']; - var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i'); - - return { - token: function(stream, state) { - var ch = stream.peek(); - var esc = state.escaped; - state.escaped = false; - /* comments */ - if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) { - stream.skipToEnd(); - return "comment"; - } - - if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/)) - return "string"; - - if (state.literal && stream.indentation() > state.keyCol) { - stream.skipToEnd(); return "string"; - } else if (state.literal) { state.literal = false; } - if (stream.sol()) { - state.keyCol = 0; - state.pair = false; - state.pairStart = false; - /* document start */ - if(stream.match(/---/)) { return "def"; } - /* document end */ - if (stream.match(/\.\.\./)) { return "def"; } - /* array list item */ - if (stream.match(/\s*-\s+/)) { return 'meta'; } - } - /* inline pairs/lists */ - if (stream.match(/^(\{|\}|\[|\])/)) { - if (ch == '{') - state.inlinePairs++; - else if (ch == '}') - state.inlinePairs--; - else if (ch == '[') - state.inlineList++; - else - state.inlineList--; - return 'meta'; - } - - /* list seperator */ - if (state.inlineList > 0 && !esc && ch == ',') { - stream.next(); - return 'meta'; - } - /* pairs seperator */ - if (state.inlinePairs > 0 && !esc && ch == ',') { - state.keyCol = 0; - state.pair = false; - state.pairStart = false; - stream.next(); - return 'meta'; - } - - /* start of value of a pair */ - if (state.pairStart) { - /* block literals */ - if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; }; - /* references */ - if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; } - /* numbers */ - if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; } - if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; } - /* keywords */ - if (stream.match(keywordRegex)) { return 'keyword'; } - } - - /* pairs (associative arrays) -> key */ - if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)) { - state.pair = true; - state.keyCol = stream.indentation(); - return "atom"; - } - if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; } - - /* nothing found, continue */ - state.pairStart = false; - state.escaped = (ch == '\\'); - stream.next(); - return null; - }, - startState: function() { - return { - pair: false, - pairStart: false, - keyCol: 0, - inlinePairs: 0, - inlineList: 0, - literal: false, - escaped: false - }; - } - }; -}); - -CodeMirror.defineMIME("text/x-yaml", "yaml"); - -}); diff --git a/public/plugins/codemirror-5.17.0/mode/z80/index.html b/public/plugins/codemirror-5.17.0/mode/z80/index.html deleted file mode 100644 index a41b747..0000000 --- a/public/plugins/codemirror-5.17.0/mode/z80/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - -CodeMirror: Z80 assembly mode - - - - - - - - - -
    -

    Z80 assembly mode

    - - -
    - - - -

    MIME types defined: text/x-z80, text/x-ez80.

    -
    diff --git a/public/plugins/codemirror-5.17.0/mode/z80/z80.js b/public/plugins/codemirror-5.17.0/mode/z80/z80.js deleted file mode 100644 index aae7021..0000000 --- a/public/plugins/codemirror-5.17.0/mode/z80/z80.js +++ /dev/null @@ -1,116 +0,0 @@ -// CodeMirror, copyright (c) by Marijn Haverbeke and others -// Distributed under an MIT license: http://codemirror.net/LICENSE - -(function(mod) { - if (typeof exports == "object" && typeof module == "object") // CommonJS - mod(require("../../lib/codemirror")); - else if (typeof define == "function" && define.amd) // AMD - define(["../../lib/codemirror"], mod); - else // Plain browser env - mod(CodeMirror); -})(function(CodeMirror) { -"use strict"; - -CodeMirror.defineMode('z80', function(_config, parserConfig) { - var ez80 = parserConfig.ez80; - var keywords1, keywords2; - if (ez80) { - keywords1 = /^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\.([sl]?i)?[sl])?\b/i; - keywords2 = /^(((call|j[pr]|rst|ret[in]?)(\.([sl]?i)?[sl])?)|(rs|st)mix)\b/i; - } else { - keywords1 = /^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i; - keywords2 = /^(call|j[pr]|ret[in]?|b_?(call|jump))\b/i; - } - - var variables1 = /^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i; - var variables2 = /^(n?[zc]|p[oe]?|m)\b/i; - var errors = /^([hl][xy]|i[xy][hl]|slia|sll)\b/i; - var numbers = /^([\da-f]+h|[0-7]+o|[01]+b|\d+d?)\b/i; - - return { - startState: function() { - return { - context: 0 - }; - }, - token: function(stream, state) { - if (!stream.column()) - state.context = 0; - - if (stream.eatSpace()) - return null; - - var w; - - if (stream.eatWhile(/\w/)) { - if (ez80 && stream.eat('.')) { - stream.eatWhile(/\w/); - } - w = stream.current(); - - if (stream.indentation()) { - if ((state.context == 1 || state.context == 4) && variables1.test(w)) { - state.context = 4; - return 'var2'; - } - - if (state.context == 2 && variables2.test(w)) { - state.context = 4; - return 'var3'; - } - - if (keywords1.test(w)) { - state.context = 1; - return 'keyword'; - } else if (keywords2.test(w)) { - state.context = 2; - return 'keyword'; - } else if (state.context == 4 && numbers.test(w)) { - return 'number'; - } - - if (errors.test(w)) - return 'error'; - } else if (stream.match(numbers)) { - return 'number'; - } else { - return null; - } - } else if (stream.eat(';')) { - stream.skipToEnd(); - return 'comment'; - } else if (stream.eat('"')) { - while (w = stream.next()) { - if (w == '"') - break; - - if (w == '\\') - stream.next(); - } - return 'string'; - } else if (stream.eat('\'')) { - if (stream.match(/\\?.'/)) - return 'number'; - } else if (stream.eat('.') || stream.sol() && stream.eat('#')) { - state.context = 5; - - if (stream.eatWhile(/\w/)) - return 'def'; - } else if (stream.eat('$')) { - if (stream.eatWhile(/[\da-f]/i)) - return 'number'; - } else if (stream.eat('%')) { - if (stream.eatWhile(/[01]/)) - return 'number'; - } else { - stream.next(); - } - return null; - } - }; -}); - -CodeMirror.defineMIME("text/x-z80", "z80"); -CodeMirror.defineMIME("text/x-ez80", { name: "z80", ez80: true }); - -}); diff --git a/public/plugins/dropzone-4.2.0/dropzone.css b/public/plugins/dropzone-4.2.0/dropzone.css deleted file mode 100644 index 0494d1c..0000000 --- a/public/plugins/dropzone-4.2.0/dropzone.css +++ /dev/null @@ -1,388 +0,0 @@ -/* - * The MIT License - * Copyright (c) 2012 Matias Meno - */ -@-webkit-keyframes passing-through { - 0% { - opacity: 0; - -webkit-transform: translateY(40px); - -moz-transform: translateY(40px); - -ms-transform: translateY(40px); - -o-transform: translateY(40px); - transform: translateY(40px); } - 30%, 70% { - opacity: 1; - -webkit-transform: translateY(0px); - -moz-transform: translateY(0px); - -ms-transform: translateY(0px); - -o-transform: translateY(0px); - transform: translateY(0px); } - 100% { - opacity: 0; - -webkit-transform: translateY(-40px); - -moz-transform: translateY(-40px); - -ms-transform: translateY(-40px); - -o-transform: translateY(-40px); - transform: translateY(-40px); } } -@-moz-keyframes passing-through { - 0% { - opacity: 0; - -webkit-transform: translateY(40px); - -moz-transform: translateY(40px); - -ms-transform: translateY(40px); - -o-transform: translateY(40px); - transform: translateY(40px); } - 30%, 70% { - opacity: 1; - -webkit-transform: translateY(0px); - -moz-transform: translateY(0px); - -ms-transform: translateY(0px); - -o-transform: translateY(0px); - transform: translateY(0px); } - 100% { - opacity: 0; - -webkit-transform: translateY(-40px); - -moz-transform: translateY(-40px); - -ms-transform: translateY(-40px); - -o-transform: translateY(-40px); - transform: translateY(-40px); } } -@keyframes passing-through { - 0% { - opacity: 0; - -webkit-transform: translateY(40px); - -moz-transform: translateY(40px); - -ms-transform: translateY(40px); - -o-transform: translateY(40px); - transform: translateY(40px); } - 30%, 70% { - opacity: 1; - -webkit-transform: translateY(0px); - -moz-transform: translateY(0px); - -ms-transform: translateY(0px); - -o-transform: translateY(0px); - transform: translateY(0px); } - 100% { - opacity: 0; - -webkit-transform: translateY(-40px); - -moz-transform: translateY(-40px); - -ms-transform: translateY(-40px); - -o-transform: translateY(-40px); - transform: translateY(-40px); } } -@-webkit-keyframes slide-in { - 0% { - opacity: 0; - -webkit-transform: translateY(40px); - -moz-transform: translateY(40px); - -ms-transform: translateY(40px); - -o-transform: translateY(40px); - transform: translateY(40px); } - 30% { - opacity: 1; - -webkit-transform: translateY(0px); - -moz-transform: translateY(0px); - -ms-transform: translateY(0px); - -o-transform: translateY(0px); - transform: translateY(0px); } } -@-moz-keyframes slide-in { - 0% { - opacity: 0; - -webkit-transform: translateY(40px); - -moz-transform: translateY(40px); - -ms-transform: translateY(40px); - -o-transform: translateY(40px); - transform: translateY(40px); } - 30% { - opacity: 1; - -webkit-transform: translateY(0px); - -moz-transform: translateY(0px); - -ms-transform: translateY(0px); - -o-transform: translateY(0px); - transform: translateY(0px); } } -@keyframes slide-in { - 0% { - opacity: 0; - -webkit-transform: translateY(40px); - -moz-transform: translateY(40px); - -ms-transform: translateY(40px); - -o-transform: translateY(40px); - transform: translateY(40px); } - 30% { - opacity: 1; - -webkit-transform: translateY(0px); - -moz-transform: translateY(0px); - -ms-transform: translateY(0px); - -o-transform: translateY(0px); - transform: translateY(0px); } } -@-webkit-keyframes pulse { - 0% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); } - 10% { - -webkit-transform: scale(1.1); - -moz-transform: scale(1.1); - -ms-transform: scale(1.1); - -o-transform: scale(1.1); - transform: scale(1.1); } - 20% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); } } -@-moz-keyframes pulse { - 0% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); } - 10% { - -webkit-transform: scale(1.1); - -moz-transform: scale(1.1); - -ms-transform: scale(1.1); - -o-transform: scale(1.1); - transform: scale(1.1); } - 20% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); } } -@keyframes pulse { - 0% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); } - 10% { - -webkit-transform: scale(1.1); - -moz-transform: scale(1.1); - -ms-transform: scale(1.1); - -o-transform: scale(1.1); - transform: scale(1.1); } - 20% { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); } } -.dropzone, .dropzone * { - box-sizing: border-box; } - -.dropzone { - min-height: 150px; - border: 2px solid rgba(0, 0, 0, 0.3); - background: white; - padding: 20px 20px; } - .dropzone.dz-clickable { - cursor: pointer; } - .dropzone.dz-clickable * { - cursor: default; } - .dropzone.dz-clickable .dz-message, .dropzone.dz-clickable .dz-message * { - cursor: pointer; } - .dropzone.dz-started .dz-message { - display: none; } - .dropzone.dz-drag-hover { - border-style: solid; } - .dropzone.dz-drag-hover .dz-message { - opacity: 0.5; } - .dropzone .dz-message { - text-align: center; - margin: 2em 0; } - .dropzone .dz-preview { - position: relative; - display: inline-block; - vertical-align: top; - margin: 16px; - min-height: 100px; } - .dropzone .dz-preview:hover { - z-index: 1000; } - .dropzone .dz-preview:hover .dz-details { - opacity: 1; } - .dropzone .dz-preview.dz-file-preview .dz-image { - border-radius: 20px; - background: #999; - background: linear-gradient(to bottom, #eee, #ddd); } - .dropzone .dz-preview.dz-file-preview .dz-details { - opacity: 1; } - .dropzone .dz-preview.dz-image-preview { - background: white; } - .dropzone .dz-preview.dz-image-preview .dz-details { - -webkit-transition: opacity 0.2s linear; - -moz-transition: opacity 0.2s linear; - -ms-transition: opacity 0.2s linear; - -o-transition: opacity 0.2s linear; - transition: opacity 0.2s linear; } - .dropzone .dz-preview .dz-remove { - font-size: 14px; - text-align: center; - display: block; - cursor: pointer; - border: none; } - .dropzone .dz-preview .dz-remove:hover { - text-decoration: underline; } - .dropzone .dz-preview:hover .dz-details { - opacity: 1; } - .dropzone .dz-preview .dz-details { - z-index: 20; - position: absolute; - top: 0; - left: 0; - opacity: 0; - font-size: 13px; - min-width: 100%; - max-width: 100%; - padding: 2em 1em; - text-align: center; - color: rgba(0, 0, 0, 0.9); - line-height: 150%; } - .dropzone .dz-preview .dz-details .dz-size { - margin-bottom: 1em; - font-size: 16px; } - .dropzone .dz-preview .dz-details .dz-filename { - white-space: nowrap; } - .dropzone .dz-preview .dz-details .dz-filename:hover span { - border: 1px solid rgba(200, 200, 200, 0.8); - background-color: rgba(255, 255, 255, 0.8); } - .dropzone .dz-preview .dz-details .dz-filename:not(:hover) { - overflow: hidden; - text-overflow: ellipsis; } - .dropzone .dz-preview .dz-details .dz-filename:not(:hover) span { - border: 1px solid transparent; } - .dropzone .dz-preview .dz-details .dz-filename span, .dropzone .dz-preview .dz-details .dz-size span { - background-color: rgba(255, 255, 255, 0.4); - padding: 0 0.4em; - border-radius: 3px; } - .dropzone .dz-preview:hover .dz-image img { - -webkit-transform: scale(1.05, 1.05); - -moz-transform: scale(1.05, 1.05); - -ms-transform: scale(1.05, 1.05); - -o-transform: scale(1.05, 1.05); - transform: scale(1.05, 1.05); - -webkit-filter: blur(8px); - filter: blur(8px); } - .dropzone .dz-preview .dz-image { - border-radius: 20px; - overflow: hidden; - width: 120px; - height: 120px; - position: relative; - display: block; - z-index: 10; } - .dropzone .dz-preview .dz-image img { - display: block; } - .dropzone .dz-preview.dz-success .dz-success-mark { - -webkit-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1); - -moz-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1); - -ms-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1); - -o-animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1); - animation: passing-through 3s cubic-bezier(0.77, 0, 0.175, 1); } - .dropzone .dz-preview.dz-error .dz-error-mark { - opacity: 1; - -webkit-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1); - -moz-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1); - -ms-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1); - -o-animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1); - animation: slide-in 3s cubic-bezier(0.77, 0, 0.175, 1); } - .dropzone .dz-preview .dz-success-mark, .dropzone .dz-preview .dz-error-mark { - pointer-events: none; - opacity: 0; - z-index: 500; - position: absolute; - display: block; - top: 50%; - left: 50%; - margin-left: -27px; - margin-top: -27px; } - .dropzone .dz-preview .dz-success-mark svg, .dropzone .dz-preview .dz-error-mark svg { - display: block; - width: 54px; - height: 54px; } - .dropzone .dz-preview.dz-processing .dz-progress { - opacity: 1; - -webkit-transition: all 0.2s linear; - -moz-transition: all 0.2s linear; - -ms-transition: all 0.2s linear; - -o-transition: all 0.2s linear; - transition: all 0.2s linear; } - .dropzone .dz-preview.dz-complete .dz-progress { - opacity: 0; - -webkit-transition: opacity 0.4s ease-in; - -moz-transition: opacity 0.4s ease-in; - -ms-transition: opacity 0.4s ease-in; - -o-transition: opacity 0.4s ease-in; - transition: opacity 0.4s ease-in; } - .dropzone .dz-preview:not(.dz-processing) .dz-progress { - -webkit-animation: pulse 6s ease infinite; - -moz-animation: pulse 6s ease infinite; - -ms-animation: pulse 6s ease infinite; - -o-animation: pulse 6s ease infinite; - animation: pulse 6s ease infinite; } - .dropzone .dz-preview .dz-progress { - opacity: 1; - z-index: 1000; - pointer-events: none; - position: absolute; - height: 16px; - left: 50%; - top: 50%; - margin-top: -8px; - width: 80px; - margin-left: -40px; - background: rgba(255, 255, 255, 0.9); - -webkit-transform: scale(1); - border-radius: 8px; - overflow: hidden; } - .dropzone .dz-preview .dz-progress .dz-upload { - background: #333; - background: linear-gradient(to bottom, #666, #444); - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 0; - -webkit-transition: width 300ms ease-in-out; - -moz-transition: width 300ms ease-in-out; - -ms-transition: width 300ms ease-in-out; - -o-transition: width 300ms ease-in-out; - transition: width 300ms ease-in-out; } - .dropzone .dz-preview.dz-error .dz-error-message { - display: block; } - .dropzone .dz-preview.dz-error:hover .dz-error-message { - opacity: 1; - pointer-events: auto; } - .dropzone .dz-preview .dz-error-message { - pointer-events: none; - z-index: 1000; - position: absolute; - display: block; - display: none; - opacity: 0; - -webkit-transition: opacity 0.3s ease; - -moz-transition: opacity 0.3s ease; - -ms-transition: opacity 0.3s ease; - -o-transition: opacity 0.3s ease; - transition: opacity 0.3s ease; - border-radius: 8px; - font-size: 13px; - top: 130px; - left: -10px; - width: 140px; - background: #be2626; - background: linear-gradient(to bottom, #be2626, #a92222); - padding: 0.5em 1.2em; - color: white; } - .dropzone .dz-preview .dz-error-message:after { - content: ''; - position: absolute; - top: -6px; - left: 64px; - width: 0; - height: 0; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #be2626; } diff --git a/public/plugins/dropzone-4.2.0/dropzone.js b/public/plugins/dropzone-4.2.0/dropzone.js deleted file mode 100644 index cd7855f..0000000 --- a/public/plugins/dropzone-4.2.0/dropzone.js +++ /dev/null @@ -1,1752 +0,0 @@ - -/* - * - * More info at [www.dropzonejs.com](http://www.dropzonejs.com) - * - * Copyright (c) 2012, Matias Meno - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -(function() { - var Dropzone, Emitter, camelize, contentLoaded, detectVerticalSquash, drawImageIOSFix, noop, without, - __slice = [].slice, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; - - noop = function() {}; - - Emitter = (function() { - function Emitter() {} - - Emitter.prototype.addEventListener = Emitter.prototype.on; - - Emitter.prototype.on = function(event, fn) { - this._callbacks = this._callbacks || {}; - if (!this._callbacks[event]) { - this._callbacks[event] = []; - } - this._callbacks[event].push(fn); - return this; - }; - - Emitter.prototype.emit = function() { - var args, callback, callbacks, event, _i, _len; - event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - this._callbacks = this._callbacks || {}; - callbacks = this._callbacks[event]; - if (callbacks) { - for (_i = 0, _len = callbacks.length; _i < _len; _i++) { - callback = callbacks[_i]; - callback.apply(this, args); - } - } - return this; - }; - - Emitter.prototype.removeListener = Emitter.prototype.off; - - Emitter.prototype.removeAllListeners = Emitter.prototype.off; - - Emitter.prototype.removeEventListener = Emitter.prototype.off; - - Emitter.prototype.off = function(event, fn) { - var callback, callbacks, i, _i, _len; - if (!this._callbacks || arguments.length === 0) { - this._callbacks = {}; - return this; - } - callbacks = this._callbacks[event]; - if (!callbacks) { - return this; - } - if (arguments.length === 1) { - delete this._callbacks[event]; - return this; - } - for (i = _i = 0, _len = callbacks.length; _i < _len; i = ++_i) { - callback = callbacks[i]; - if (callback === fn) { - callbacks.splice(i, 1); - break; - } - } - return this; - }; - - return Emitter; - - })(); - - Dropzone = (function(_super) { - var extend, resolveOption; - - __extends(Dropzone, _super); - - Dropzone.prototype.Emitter = Emitter; - - - /* - This is a list of all available events you can register on a dropzone object. - - You can register an event handler like this: - - dropzone.on("dragEnter", function() { }); - */ - - Dropzone.prototype.events = ["drop", "dragstart", "dragend", "dragenter", "dragover", "dragleave", "addedfile", "addedfiles", "removedfile", "thumbnail", "error", "errormultiple", "processing", "processingmultiple", "uploadprogress", "totaluploadprogress", "sending", "sendingmultiple", "success", "successmultiple", "canceled", "canceledmultiple", "complete", "completemultiple", "reset", "maxfilesexceeded", "maxfilesreached", "queuecomplete"]; - - Dropzone.prototype.defaultOptions = { - url: null, - method: "post", - withCredentials: false, - parallelUploads: 2, - uploadMultiple: false, - maxFilesize: 256, - paramName: "file", - createImageThumbnails: true, - maxThumbnailFilesize: 10, - thumbnailWidth: 120, - thumbnailHeight: 120, - filesizeBase: 1000, - maxFiles: null, - params: {}, - clickable: true, - ignoreHiddenFiles: true, - acceptedFiles: null, - acceptedMimeTypes: null, - autoProcessQueue: true, - autoQueue: true, - addRemoveLinks: false, - previewsContainer: null, - hiddenInputContainer: "body", - capture: null, - dictDefaultMessage: "Drop files here to upload", - dictFallbackMessage: "Your browser does not support drag'n'drop file uploads.", - dictFallbackText: "Please use the fallback form below to upload your files like in the olden days.", - dictFileTooBig: "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.", - dictInvalidFileType: "You can't upload files of this type.", - dictResponseError: "Server responded with {{statusCode}} code.", - dictCancelUpload: "Cancel upload", - dictCancelUploadConfirmation: "Are you sure you want to cancel this upload?", - dictRemoveFile: "Remove file", - dictRemoveFileConfirmation: null, - dictMaxFilesExceeded: "You can not upload any more files.", - accept: function(file, done) { - return done(); - }, - init: function() { - return noop; - }, - forceFallback: false, - fallback: function() { - var child, messageElement, span, _i, _len, _ref; - this.element.className = "" + this.element.className + " dz-browser-not-supported"; - _ref = this.element.getElementsByTagName("div"); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - if (/(^| )dz-message($| )/.test(child.className)) { - messageElement = child; - child.className = "dz-message"; - continue; - } - } - if (!messageElement) { - messageElement = Dropzone.createElement("
    "); - this.element.appendChild(messageElement); - } - span = messageElement.getElementsByTagName("span")[0]; - if (span) { - if (span.textContent != null) { - span.textContent = this.options.dictFallbackMessage; - } else if (span.innerText != null) { - span.innerText = this.options.dictFallbackMessage; - } - } - return this.element.appendChild(this.getFallbackForm()); - }, - resize: function(file) { - var info, srcRatio, trgRatio; - info = { - srcX: 0, - srcY: 0, - srcWidth: file.width, - srcHeight: file.height - }; - srcRatio = file.width / file.height; - info.optWidth = this.options.thumbnailWidth; - info.optHeight = this.options.thumbnailHeight; - if ((info.optWidth == null) && (info.optHeight == null)) { - info.optWidth = info.srcWidth; - info.optHeight = info.srcHeight; - } else if (info.optWidth == null) { - info.optWidth = srcRatio * info.optHeight; - } else if (info.optHeight == null) { - info.optHeight = (1 / srcRatio) * info.optWidth; - } - trgRatio = info.optWidth / info.optHeight; - if (file.height < info.optHeight || file.width < info.optWidth) { - info.trgHeight = info.srcHeight; - info.trgWidth = info.srcWidth; - } else { - if (srcRatio > trgRatio) { - info.srcHeight = file.height; - info.srcWidth = info.srcHeight * trgRatio; - } else { - info.srcWidth = file.width; - info.srcHeight = info.srcWidth / trgRatio; - } - } - info.srcX = (file.width - info.srcWidth) / 2; - info.srcY = (file.height - info.srcHeight) / 2; - return info; - }, - - /* - Those functions register themselves to the events on init and handle all - the user interface specific stuff. Overwriting them won't break the upload - but can break the way it's displayed. - You can overwrite them if you don't like the default behavior. If you just - want to add an additional event handler, register it on the dropzone object - and don't overwrite those options. - */ - drop: function(e) { - return this.element.classList.remove("dz-drag-hover"); - }, - dragstart: noop, - dragend: function(e) { - return this.element.classList.remove("dz-drag-hover"); - }, - dragenter: function(e) { - return this.element.classList.add("dz-drag-hover"); - }, - dragover: function(e) { - return this.element.classList.add("dz-drag-hover"); - }, - dragleave: function(e) { - return this.element.classList.remove("dz-drag-hover"); - }, - paste: noop, - reset: function() { - return this.element.classList.remove("dz-started"); - }, - addedfile: function(file) { - var node, removeFileEvent, removeLink, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results; - if (this.element === this.previewsContainer) { - this.element.classList.add("dz-started"); - } - if (this.previewsContainer) { - file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim()); - file.previewTemplate = file.previewElement; - this.previewsContainer.appendChild(file.previewElement); - _ref = file.previewElement.querySelectorAll("[data-dz-name]"); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - node = _ref[_i]; - node.textContent = file.name; - } - _ref1 = file.previewElement.querySelectorAll("[data-dz-size]"); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - node = _ref1[_j]; - node.innerHTML = this.filesize(file.size); - } - if (this.options.addRemoveLinks) { - file._removeLink = Dropzone.createElement("" + this.options.dictRemoveFile + ""); - file.previewElement.appendChild(file._removeLink); - } - removeFileEvent = (function(_this) { - return function(e) { - e.preventDefault(); - e.stopPropagation(); - if (file.status === Dropzone.UPLOADING) { - return Dropzone.confirm(_this.options.dictCancelUploadConfirmation, function() { - return _this.removeFile(file); - }); - } else { - if (_this.options.dictRemoveFileConfirmation) { - return Dropzone.confirm(_this.options.dictRemoveFileConfirmation, function() { - return _this.removeFile(file); - }); - } else { - return _this.removeFile(file); - } - } - }; - })(this); - _ref2 = file.previewElement.querySelectorAll("[data-dz-remove]"); - _results = []; - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - removeLink = _ref2[_k]; - _results.push(removeLink.addEventListener("click", removeFileEvent)); - } - return _results; - } - }, - removedfile: function(file) { - var _ref; - if (file.previewElement) { - if ((_ref = file.previewElement) != null) { - _ref.parentNode.removeChild(file.previewElement); - } - } - return this._updateMaxFilesReachedClass(); - }, - thumbnail: function(file, dataUrl) { - var thumbnailElement, _i, _len, _ref; - if (file.previewElement) { - file.previewElement.classList.remove("dz-file-preview"); - _ref = file.previewElement.querySelectorAll("[data-dz-thumbnail]"); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - thumbnailElement = _ref[_i]; - thumbnailElement.alt = file.name; - thumbnailElement.src = dataUrl; - } - return setTimeout(((function(_this) { - return function() { - return file.previewElement.classList.add("dz-image-preview"); - }; - })(this)), 1); - } - }, - error: function(file, message) { - var node, _i, _len, _ref, _results; - if (file.previewElement) { - file.previewElement.classList.add("dz-error"); - if (typeof message !== "String" && message.error) { - message = message.error; - } - _ref = file.previewElement.querySelectorAll("[data-dz-errormessage]"); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - node = _ref[_i]; - _results.push(node.textContent = message); - } - return _results; - } - }, - errormultiple: noop, - processing: function(file) { - if (file.previewElement) { - file.previewElement.classList.add("dz-processing"); - if (file._removeLink) { - return file._removeLink.textContent = this.options.dictCancelUpload; - } - } - }, - processingmultiple: noop, - uploadprogress: function(file, progress, bytesSent) { - var node, _i, _len, _ref, _results; - if (file.previewElement) { - _ref = file.previewElement.querySelectorAll("[data-dz-uploadprogress]"); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - node = _ref[_i]; - if (node.nodeName === 'PROGRESS') { - _results.push(node.value = progress); - } else { - _results.push(node.style.width = "" + progress + "%"); - } - } - return _results; - } - }, - totaluploadprogress: noop, - sending: noop, - sendingmultiple: noop, - success: function(file) { - if (file.previewElement) { - return file.previewElement.classList.add("dz-success"); - } - }, - successmultiple: noop, - canceled: function(file) { - return this.emit("error", file, "Upload canceled."); - }, - canceledmultiple: noop, - complete: function(file) { - if (file._removeLink) { - file._removeLink.textContent = this.options.dictRemoveFile; - } - if (file.previewElement) { - return file.previewElement.classList.add("dz-complete"); - } - }, - completemultiple: noop, - maxfilesexceeded: noop, - maxfilesreached: noop, - queuecomplete: noop, - addedfiles: noop, - previewTemplate: "
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n Check\n \n \n \n \n \n
    \n
    \n \n Error\n \n \n \n \n \n \n \n
    \n
    " - }; - - extend = function() { - var key, object, objects, target, val, _i, _len; - target = arguments[0], objects = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - for (_i = 0, _len = objects.length; _i < _len; _i++) { - object = objects[_i]; - for (key in object) { - val = object[key]; - target[key] = val; - } - } - return target; - }; - - function Dropzone(element, options) { - var elementOptions, fallback, _ref; - this.element = element; - this.version = Dropzone.version; - this.defaultOptions.previewTemplate = this.defaultOptions.previewTemplate.replace(/\n*/g, ""); - this.clickableElements = []; - this.listeners = []; - this.files = []; - if (typeof this.element === "string") { - this.element = document.querySelector(this.element); - } - if (!(this.element && (this.element.nodeType != null))) { - throw new Error("Invalid dropzone element."); - } - if (this.element.dropzone) { - throw new Error("Dropzone already attached."); - } - Dropzone.instances.push(this); - this.element.dropzone = this; - elementOptions = (_ref = Dropzone.optionsForElement(this.element)) != null ? _ref : {}; - this.options = extend({}, this.defaultOptions, elementOptions, options != null ? options : {}); - if (this.options.forceFallback || !Dropzone.isBrowserSupported()) { - return this.options.fallback.call(this); - } - if (this.options.url == null) { - this.options.url = this.element.getAttribute("action"); - } - if (!this.options.url) { - throw new Error("No URL provided."); - } - if (this.options.acceptedFiles && this.options.acceptedMimeTypes) { - throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated."); - } - if (this.options.acceptedMimeTypes) { - this.options.acceptedFiles = this.options.acceptedMimeTypes; - delete this.options.acceptedMimeTypes; - } - this.options.method = this.options.method.toUpperCase(); - if ((fallback = this.getExistingFallback()) && fallback.parentNode) { - fallback.parentNode.removeChild(fallback); - } - if (this.options.previewsContainer !== false) { - if (this.options.previewsContainer) { - this.previewsContainer = Dropzone.getElement(this.options.previewsContainer, "previewsContainer"); - } else { - this.previewsContainer = this.element; - } - } - if (this.options.clickable) { - if (this.options.clickable === true) { - this.clickableElements = [this.element]; - } else { - this.clickableElements = Dropzone.getElements(this.options.clickable, "clickable"); - } - } - this.init(); - } - - Dropzone.prototype.getAcceptedFiles = function() { - var file, _i, _len, _ref, _results; - _ref = this.files; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - file = _ref[_i]; - if (file.accepted) { - _results.push(file); - } - } - return _results; - }; - - Dropzone.prototype.getRejectedFiles = function() { - var file, _i, _len, _ref, _results; - _ref = this.files; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - file = _ref[_i]; - if (!file.accepted) { - _results.push(file); - } - } - return _results; - }; - - Dropzone.prototype.getFilesWithStatus = function(status) { - var file, _i, _len, _ref, _results; - _ref = this.files; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - file = _ref[_i]; - if (file.status === status) { - _results.push(file); - } - } - return _results; - }; - - Dropzone.prototype.getQueuedFiles = function() { - return this.getFilesWithStatus(Dropzone.QUEUED); - }; - - Dropzone.prototype.getUploadingFiles = function() { - return this.getFilesWithStatus(Dropzone.UPLOADING); - }; - - Dropzone.prototype.getAddedFiles = function() { - return this.getFilesWithStatus(Dropzone.ADDED); - }; - - Dropzone.prototype.getActiveFiles = function() { - var file, _i, _len, _ref, _results; - _ref = this.files; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - file = _ref[_i]; - if (file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED) { - _results.push(file); - } - } - return _results; - }; - - Dropzone.prototype.init = function() { - var eventName, noPropagation, setupHiddenFileInput, _i, _len, _ref, _ref1; - if (this.element.tagName === "form") { - this.element.setAttribute("enctype", "multipart/form-data"); - } - if (this.element.classList.contains("dropzone") && !this.element.querySelector(".dz-message")) { - this.element.appendChild(Dropzone.createElement("
    " + this.options.dictDefaultMessage + "
    ")); - } - if (this.clickableElements.length) { - setupHiddenFileInput = (function(_this) { - return function() { - if (_this.hiddenFileInput) { - _this.hiddenFileInput.parentNode.removeChild(_this.hiddenFileInput); - } - _this.hiddenFileInput = document.createElement("input"); - _this.hiddenFileInput.setAttribute("type", "file"); - if ((_this.options.maxFiles == null) || _this.options.maxFiles > 1) { - _this.hiddenFileInput.setAttribute("multiple", "multiple"); - } - _this.hiddenFileInput.className = "dz-hidden-input"; - if (_this.options.acceptedFiles != null) { - _this.hiddenFileInput.setAttribute("accept", _this.options.acceptedFiles); - } - if (_this.options.capture != null) { - _this.hiddenFileInput.setAttribute("capture", _this.options.capture); - } - _this.hiddenFileInput.style.visibility = "hidden"; - _this.hiddenFileInput.style.position = "absolute"; - _this.hiddenFileInput.style.top = "0"; - _this.hiddenFileInput.style.left = "0"; - _this.hiddenFileInput.style.height = "0"; - _this.hiddenFileInput.style.width = "0"; - document.querySelector(_this.options.hiddenInputContainer).appendChild(_this.hiddenFileInput); - return _this.hiddenFileInput.addEventListener("change", function() { - var file, files, _i, _len; - files = _this.hiddenFileInput.files; - if (files.length) { - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - _this.addFile(file); - } - } - _this.emit("addedfiles", files); - return setupHiddenFileInput(); - }); - }; - })(this); - setupHiddenFileInput(); - } - this.URL = (_ref = window.URL) != null ? _ref : window.webkitURL; - _ref1 = this.events; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - eventName = _ref1[_i]; - this.on(eventName, this.options[eventName]); - } - this.on("uploadprogress", (function(_this) { - return function() { - return _this.updateTotalUploadProgress(); - }; - })(this)); - this.on("removedfile", (function(_this) { - return function() { - return _this.updateTotalUploadProgress(); - }; - })(this)); - this.on("canceled", (function(_this) { - return function(file) { - return _this.emit("complete", file); - }; - })(this)); - this.on("complete", (function(_this) { - return function(file) { - if (_this.getAddedFiles().length === 0 && _this.getUploadingFiles().length === 0 && _this.getQueuedFiles().length === 0) { - return setTimeout((function() { - return _this.emit("queuecomplete"); - }), 0); - } - }; - })(this)); - noPropagation = function(e) { - e.stopPropagation(); - if (e.preventDefault) { - return e.preventDefault(); - } else { - return e.returnValue = false; - } - }; - this.listeners = [ - { - element: this.element, - events: { - "dragstart": (function(_this) { - return function(e) { - return _this.emit("dragstart", e); - }; - })(this), - "dragenter": (function(_this) { - return function(e) { - noPropagation(e); - return _this.emit("dragenter", e); - }; - })(this), - "dragover": (function(_this) { - return function(e) { - var efct; - try { - efct = e.dataTransfer.effectAllowed; - } catch (_error) {} - e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy'; - noPropagation(e); - return _this.emit("dragover", e); - }; - })(this), - "dragleave": (function(_this) { - return function(e) { - return _this.emit("dragleave", e); - }; - })(this), - "drop": (function(_this) { - return function(e) { - noPropagation(e); - return _this.drop(e); - }; - })(this), - "dragend": (function(_this) { - return function(e) { - return _this.emit("dragend", e); - }; - })(this) - } - } - ]; - this.clickableElements.forEach((function(_this) { - return function(clickableElement) { - return _this.listeners.push({ - element: clickableElement, - events: { - "click": function(evt) { - if ((clickableElement !== _this.element) || (evt.target === _this.element || Dropzone.elementInside(evt.target, _this.element.querySelector(".dz-message")))) { - _this.hiddenFileInput.click(); - } - return true; - } - } - }); - }; - })(this)); - this.enable(); - return this.options.init.call(this); - }; - - Dropzone.prototype.destroy = function() { - var _ref; - this.disable(); - this.removeAllFiles(true); - if ((_ref = this.hiddenFileInput) != null ? _ref.parentNode : void 0) { - this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput); - this.hiddenFileInput = null; - } - delete this.element.dropzone; - return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1); - }; - - Dropzone.prototype.updateTotalUploadProgress = function() { - var activeFiles, file, totalBytes, totalBytesSent, totalUploadProgress, _i, _len, _ref; - totalBytesSent = 0; - totalBytes = 0; - activeFiles = this.getActiveFiles(); - if (activeFiles.length) { - _ref = this.getActiveFiles(); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - file = _ref[_i]; - totalBytesSent += file.upload.bytesSent; - totalBytes += file.upload.total; - } - totalUploadProgress = 100 * totalBytesSent / totalBytes; - } else { - totalUploadProgress = 100; - } - return this.emit("totaluploadprogress", totalUploadProgress, totalBytes, totalBytesSent); - }; - - Dropzone.prototype._getParamName = function(n) { - if (typeof this.options.paramName === "function") { - return this.options.paramName(n); - } else { - return "" + this.options.paramName + (this.options.uploadMultiple ? "[" + n + "]" : ""); - } - }; - - Dropzone.prototype.getFallbackForm = function() { - var existingFallback, fields, fieldsString, form; - if (existingFallback = this.getExistingFallback()) { - return existingFallback; - } - fieldsString = "
    "; - if (this.options.dictFallbackText) { - fieldsString += "

    " + this.options.dictFallbackText + "

    "; - } - fieldsString += "
    "; - fields = Dropzone.createElement(fieldsString); - if (this.element.tagName !== "FORM") { - form = Dropzone.createElement("
    "); - form.appendChild(fields); - } else { - this.element.setAttribute("enctype", "multipart/form-data"); - this.element.setAttribute("method", this.options.method); - } - return form != null ? form : fields; - }; - - Dropzone.prototype.getExistingFallback = function() { - var fallback, getFallback, tagName, _i, _len, _ref; - getFallback = function(elements) { - var el, _i, _len; - for (_i = 0, _len = elements.length; _i < _len; _i++) { - el = elements[_i]; - if (/(^| )fallback($| )/.test(el.className)) { - return el; - } - } - }; - _ref = ["div", "form"]; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - tagName = _ref[_i]; - if (fallback = getFallback(this.element.getElementsByTagName(tagName))) { - return fallback; - } - } - }; - - Dropzone.prototype.setupEventListeners = function() { - var elementListeners, event, listener, _i, _len, _ref, _results; - _ref = this.listeners; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - elementListeners = _ref[_i]; - _results.push((function() { - var _ref1, _results1; - _ref1 = elementListeners.events; - _results1 = []; - for (event in _ref1) { - listener = _ref1[event]; - _results1.push(elementListeners.element.addEventListener(event, listener, false)); - } - return _results1; - })()); - } - return _results; - }; - - Dropzone.prototype.removeEventListeners = function() { - var elementListeners, event, listener, _i, _len, _ref, _results; - _ref = this.listeners; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - elementListeners = _ref[_i]; - _results.push((function() { - var _ref1, _results1; - _ref1 = elementListeners.events; - _results1 = []; - for (event in _ref1) { - listener = _ref1[event]; - _results1.push(elementListeners.element.removeEventListener(event, listener, false)); - } - return _results1; - })()); - } - return _results; - }; - - Dropzone.prototype.disable = function() { - var file, _i, _len, _ref, _results; - this.clickableElements.forEach(function(element) { - return element.classList.remove("dz-clickable"); - }); - this.removeEventListeners(); - _ref = this.files; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - file = _ref[_i]; - _results.push(this.cancelUpload(file)); - } - return _results; - }; - - Dropzone.prototype.enable = function() { - this.clickableElements.forEach(function(element) { - return element.classList.add("dz-clickable"); - }); - return this.setupEventListeners(); - }; - - Dropzone.prototype.filesize = function(size) { - var cutoff, i, selectedSize, selectedUnit, unit, units, _i, _len; - selectedSize = 0; - selectedUnit = "b"; - if (size > 0) { - units = ['TB', 'GB', 'MB', 'KB', 'b']; - for (i = _i = 0, _len = units.length; _i < _len; i = ++_i) { - unit = units[i]; - cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10; - if (size >= cutoff) { - selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i); - selectedUnit = unit; - break; - } - } - selectedSize = Math.round(10 * selectedSize) / 10; - } - return "" + selectedSize + " " + selectedUnit; - }; - - Dropzone.prototype._updateMaxFilesReachedClass = function() { - if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) { - if (this.getAcceptedFiles().length === this.options.maxFiles) { - this.emit('maxfilesreached', this.files); - } - return this.element.classList.add("dz-max-files-reached"); - } else { - return this.element.classList.remove("dz-max-files-reached"); - } - }; - - Dropzone.prototype.drop = function(e) { - var files, items; - if (!e.dataTransfer) { - return; - } - this.emit("drop", e); - files = e.dataTransfer.files; - this.emit("addedfiles", files); - if (files.length) { - items = e.dataTransfer.items; - if (items && items.length && (items[0].webkitGetAsEntry != null)) { - this._addFilesFromItems(items); - } else { - this.handleFiles(files); - } - } - }; - - Dropzone.prototype.paste = function(e) { - var items, _ref; - if ((e != null ? (_ref = e.clipboardData) != null ? _ref.items : void 0 : void 0) == null) { - return; - } - this.emit("paste", e); - items = e.clipboardData.items; - if (items.length) { - return this._addFilesFromItems(items); - } - }; - - Dropzone.prototype.handleFiles = function(files) { - var file, _i, _len, _results; - _results = []; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - _results.push(this.addFile(file)); - } - return _results; - }; - - Dropzone.prototype._addFilesFromItems = function(items) { - var entry, item, _i, _len, _results; - _results = []; - for (_i = 0, _len = items.length; _i < _len; _i++) { - item = items[_i]; - if ((item.webkitGetAsEntry != null) && (entry = item.webkitGetAsEntry())) { - if (entry.isFile) { - _results.push(this.addFile(item.getAsFile())); - } else if (entry.isDirectory) { - _results.push(this._addFilesFromDirectory(entry, entry.name)); - } else { - _results.push(void 0); - } - } else if (item.getAsFile != null) { - if ((item.kind == null) || item.kind === "file") { - _results.push(this.addFile(item.getAsFile())); - } else { - _results.push(void 0); - } - } else { - _results.push(void 0); - } - } - return _results; - }; - - Dropzone.prototype._addFilesFromDirectory = function(directory, path) { - var dirReader, entriesReader; - dirReader = directory.createReader(); - entriesReader = (function(_this) { - return function(entries) { - var entry, _i, _len; - for (_i = 0, _len = entries.length; _i < _len; _i++) { - entry = entries[_i]; - if (entry.isFile) { - entry.file(function(file) { - if (_this.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') { - return; - } - file.fullPath = "" + path + "/" + file.name; - return _this.addFile(file); - }); - } else if (entry.isDirectory) { - _this._addFilesFromDirectory(entry, "" + path + "/" + entry.name); - } - } - }; - })(this); - return dirReader.readEntries(entriesReader, function(error) { - return typeof console !== "undefined" && console !== null ? typeof console.log === "function" ? console.log(error) : void 0 : void 0; - }); - }; - - Dropzone.prototype.accept = function(file, done) { - if (file.size > this.options.maxFilesize * 1024 * 1024) { - return done(this.options.dictFileTooBig.replace("{{filesize}}", Math.round(file.size / 1024 / 10.24) / 100).replace("{{maxFilesize}}", this.options.maxFilesize)); - } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) { - return done(this.options.dictInvalidFileType); - } else if ((this.options.maxFiles != null) && this.getAcceptedFiles().length >= this.options.maxFiles) { - done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}", this.options.maxFiles)); - return this.emit("maxfilesexceeded", file); - } else { - return this.options.accept.call(this, file, done); - } - }; - - Dropzone.prototype.addFile = function(file) { - file.upload = { - progress: 0, - total: file.size, - bytesSent: 0 - }; - this.files.push(file); - file.status = Dropzone.ADDED; - this.emit("addedfile", file); - this._enqueueThumbnail(file); - return this.accept(file, (function(_this) { - return function(error) { - if (error) { - file.accepted = false; - _this._errorProcessing([file], error); - } else { - file.accepted = true; - if (_this.options.autoQueue) { - _this.enqueueFile(file); - } - } - return _this._updateMaxFilesReachedClass(); - }; - })(this)); - }; - - Dropzone.prototype.enqueueFiles = function(files) { - var file, _i, _len; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - this.enqueueFile(file); - } - return null; - }; - - Dropzone.prototype.enqueueFile = function(file) { - if (file.status === Dropzone.ADDED && file.accepted === true) { - file.status = Dropzone.QUEUED; - if (this.options.autoProcessQueue) { - return setTimeout(((function(_this) { - return function() { - return _this.processQueue(); - }; - })(this)), 0); - } - } else { - throw new Error("This file can't be queued because it has already been processed or was rejected."); - } - }; - - Dropzone.prototype._thumbnailQueue = []; - - Dropzone.prototype._processingThumbnail = false; - - Dropzone.prototype._enqueueThumbnail = function(file) { - if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) { - this._thumbnailQueue.push(file); - return setTimeout(((function(_this) { - return function() { - return _this._processThumbnailQueue(); - }; - })(this)), 0); - } - }; - - Dropzone.prototype._processThumbnailQueue = function() { - if (this._processingThumbnail || this._thumbnailQueue.length === 0) { - return; - } - this._processingThumbnail = true; - return this.createThumbnail(this._thumbnailQueue.shift(), (function(_this) { - return function() { - _this._processingThumbnail = false; - return _this._processThumbnailQueue(); - }; - })(this)); - }; - - Dropzone.prototype.removeFile = function(file) { - if (file.status === Dropzone.UPLOADING) { - this.cancelUpload(file); - } - this.files = without(this.files, file); - this.emit("removedfile", file); - if (this.files.length === 0) { - return this.emit("reset"); - } - }; - - Dropzone.prototype.removeAllFiles = function(cancelIfNecessary) { - var file, _i, _len, _ref; - if (cancelIfNecessary == null) { - cancelIfNecessary = false; - } - _ref = this.files.slice(); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - file = _ref[_i]; - if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) { - this.removeFile(file); - } - } - return null; - }; - - Dropzone.prototype.createThumbnail = function(file, callback) { - var fileReader; - fileReader = new FileReader; - fileReader.onload = (function(_this) { - return function() { - if (file.type === "image/svg+xml") { - _this.emit("thumbnail", file, fileReader.result); - if (callback != null) { - callback(); - } - return; - } - return _this.createThumbnailFromUrl(file, fileReader.result, callback); - }; - })(this); - return fileReader.readAsDataURL(file); - }; - - Dropzone.prototype.createThumbnailFromUrl = function(file, imageUrl, callback, crossOrigin) { - var img; - img = document.createElement("img"); - if (crossOrigin) { - img.crossOrigin = crossOrigin; - } - img.onload = (function(_this) { - return function() { - var canvas, ctx, resizeInfo, thumbnail, _ref, _ref1, _ref2, _ref3; - file.width = img.width; - file.height = img.height; - resizeInfo = _this.options.resize.call(_this, file); - if (resizeInfo.trgWidth == null) { - resizeInfo.trgWidth = resizeInfo.optWidth; - } - if (resizeInfo.trgHeight == null) { - resizeInfo.trgHeight = resizeInfo.optHeight; - } - canvas = document.createElement("canvas"); - ctx = canvas.getContext("2d"); - canvas.width = resizeInfo.trgWidth; - canvas.height = resizeInfo.trgHeight; - drawImageIOSFix(ctx, img, (_ref = resizeInfo.srcX) != null ? _ref : 0, (_ref1 = resizeInfo.srcY) != null ? _ref1 : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, (_ref2 = resizeInfo.trgX) != null ? _ref2 : 0, (_ref3 = resizeInfo.trgY) != null ? _ref3 : 0, resizeInfo.trgWidth, resizeInfo.trgHeight); - thumbnail = canvas.toDataURL("image/png"); - _this.emit("thumbnail", file, thumbnail); - if (callback != null) { - return callback(); - } - }; - })(this); - if (callback != null) { - img.onerror = callback; - } - return img.src = imageUrl; - }; - - Dropzone.prototype.processQueue = function() { - var i, parallelUploads, processingLength, queuedFiles; - parallelUploads = this.options.parallelUploads; - processingLength = this.getUploadingFiles().length; - i = processingLength; - if (processingLength >= parallelUploads) { - return; - } - queuedFiles = this.getQueuedFiles(); - if (!(queuedFiles.length > 0)) { - return; - } - if (this.options.uploadMultiple) { - return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength)); - } else { - while (i < parallelUploads) { - if (!queuedFiles.length) { - return; - } - this.processFile(queuedFiles.shift()); - i++; - } - } - }; - - Dropzone.prototype.processFile = function(file) { - return this.processFiles([file]); - }; - - Dropzone.prototype.processFiles = function(files) { - var file, _i, _len; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - file.processing = true; - file.status = Dropzone.UPLOADING; - this.emit("processing", file); - } - if (this.options.uploadMultiple) { - this.emit("processingmultiple", files); - } - return this.uploadFiles(files); - }; - - Dropzone.prototype._getFilesWithXhr = function(xhr) { - var file, files; - return files = (function() { - var _i, _len, _ref, _results; - _ref = this.files; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - file = _ref[_i]; - if (file.xhr === xhr) { - _results.push(file); - } - } - return _results; - }).call(this); - }; - - Dropzone.prototype.cancelUpload = function(file) { - var groupedFile, groupedFiles, _i, _j, _len, _len1, _ref; - if (file.status === Dropzone.UPLOADING) { - groupedFiles = this._getFilesWithXhr(file.xhr); - for (_i = 0, _len = groupedFiles.length; _i < _len; _i++) { - groupedFile = groupedFiles[_i]; - groupedFile.status = Dropzone.CANCELED; - } - file.xhr.abort(); - for (_j = 0, _len1 = groupedFiles.length; _j < _len1; _j++) { - groupedFile = groupedFiles[_j]; - this.emit("canceled", groupedFile); - } - if (this.options.uploadMultiple) { - this.emit("canceledmultiple", groupedFiles); - } - } else if ((_ref = file.status) === Dropzone.ADDED || _ref === Dropzone.QUEUED) { - file.status = Dropzone.CANCELED; - this.emit("canceled", file); - if (this.options.uploadMultiple) { - this.emit("canceledmultiple", [file]); - } - } - if (this.options.autoProcessQueue) { - return this.processQueue(); - } - }; - - resolveOption = function() { - var args, option; - option = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - if (typeof option === 'function') { - return option.apply(this, args); - } - return option; - }; - - Dropzone.prototype.uploadFile = function(file) { - return this.uploadFiles([file]); - }; - - Dropzone.prototype.uploadFiles = function(files) { - var file, formData, handleError, headerName, headerValue, headers, i, input, inputName, inputType, key, method, option, progressObj, response, updateProgress, url, value, xhr, _i, _j, _k, _l, _len, _len1, _len2, _len3, _m, _ref, _ref1, _ref2, _ref3, _ref4, _ref5; - xhr = new XMLHttpRequest(); - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - file.xhr = xhr; - } - method = resolveOption(this.options.method, files); - url = resolveOption(this.options.url, files); - xhr.open(method, url, true); - xhr.withCredentials = !!this.options.withCredentials; - response = null; - handleError = (function(_this) { - return function() { - var _j, _len1, _results; - _results = []; - for (_j = 0, _len1 = files.length; _j < _len1; _j++) { - file = files[_j]; - _results.push(_this._errorProcessing(files, response || _this.options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr)); - } - return _results; - }; - })(this); - updateProgress = (function(_this) { - return function(e) { - var allFilesFinished, progress, _j, _k, _l, _len1, _len2, _len3, _results; - if (e != null) { - progress = 100 * e.loaded / e.total; - for (_j = 0, _len1 = files.length; _j < _len1; _j++) { - file = files[_j]; - file.upload = { - progress: progress, - total: e.total, - bytesSent: e.loaded - }; - } - } else { - allFilesFinished = true; - progress = 100; - for (_k = 0, _len2 = files.length; _k < _len2; _k++) { - file = files[_k]; - if (!(file.upload.progress === 100 && file.upload.bytesSent === file.upload.total)) { - allFilesFinished = false; - } - file.upload.progress = progress; - file.upload.bytesSent = file.upload.total; - } - if (allFilesFinished) { - return; - } - } - _results = []; - for (_l = 0, _len3 = files.length; _l < _len3; _l++) { - file = files[_l]; - _results.push(_this.emit("uploadprogress", file, progress, file.upload.bytesSent)); - } - return _results; - }; - })(this); - xhr.onload = (function(_this) { - return function(e) { - var _ref; - if (files[0].status === Dropzone.CANCELED) { - return; - } - if (xhr.readyState !== 4) { - return; - } - response = xhr.responseText; - if (xhr.getResponseHeader("content-type") && ~xhr.getResponseHeader("content-type").indexOf("application/json")) { - try { - response = JSON.parse(response); - } catch (_error) { - e = _error; - response = "Invalid JSON response from server."; - } - } - updateProgress(); - if (!((200 <= (_ref = xhr.status) && _ref < 300))) { - return handleError(); - } else { - return _this._finished(files, response, e); - } - }; - })(this); - xhr.onerror = (function(_this) { - return function() { - if (files[0].status === Dropzone.CANCELED) { - return; - } - return handleError(); - }; - })(this); - progressObj = (_ref = xhr.upload) != null ? _ref : xhr; - progressObj.onprogress = updateProgress; - headers = { - "Accept": "application/json", - "Cache-Control": "no-cache", - "X-Requested-With": "XMLHttpRequest" - }; - if (this.options.headers) { - extend(headers, this.options.headers); - } - for (headerName in headers) { - headerValue = headers[headerName]; - if (headerValue) { - xhr.setRequestHeader(headerName, headerValue); - } - } - formData = new FormData(); - if (this.options.params) { - _ref1 = this.options.params; - for (key in _ref1) { - value = _ref1[key]; - formData.append(key, value); - } - } - for (_j = 0, _len1 = files.length; _j < _len1; _j++) { - file = files[_j]; - this.emit("sending", file, xhr, formData); - } - if (this.options.uploadMultiple) { - this.emit("sendingmultiple", files, xhr, formData); - } - if (this.element.tagName === "FORM") { - _ref2 = this.element.querySelectorAll("input, textarea, select, button"); - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - input = _ref2[_k]; - inputName = input.getAttribute("name"); - inputType = input.getAttribute("type"); - if (input.tagName === "SELECT" && input.hasAttribute("multiple")) { - _ref3 = input.options; - for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { - option = _ref3[_l]; - if (option.selected) { - formData.append(inputName, option.value); - } - } - } else if (!inputType || ((_ref4 = inputType.toLowerCase()) !== "checkbox" && _ref4 !== "radio") || input.checked) { - formData.append(inputName, input.value); - } - } - } - for (i = _m = 0, _ref5 = files.length - 1; 0 <= _ref5 ? _m <= _ref5 : _m >= _ref5; i = 0 <= _ref5 ? ++_m : --_m) { - formData.append(this._getParamName(i), files[i], files[i].name); - } - return this.submitRequest(xhr, formData, files); - }; - - Dropzone.prototype.submitRequest = function(xhr, formData, files) { - return xhr.send(formData); - }; - - Dropzone.prototype._finished = function(files, responseText, e) { - var file, _i, _len; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - file.status = Dropzone.SUCCESS; - this.emit("success", file, responseText, e); - this.emit("complete", file); - } - if (this.options.uploadMultiple) { - this.emit("successmultiple", files, responseText, e); - this.emit("completemultiple", files); - } - if (this.options.autoProcessQueue) { - return this.processQueue(); - } - }; - - Dropzone.prototype._errorProcessing = function(files, message, xhr) { - var file, _i, _len; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - file.status = Dropzone.ERROR; - this.emit("error", file, message, xhr); - this.emit("complete", file); - } - if (this.options.uploadMultiple) { - this.emit("errormultiple", files, message, xhr); - this.emit("completemultiple", files); - } - if (this.options.autoProcessQueue) { - return this.processQueue(); - } - }; - - return Dropzone; - - })(Emitter); - - Dropzone.version = "4.2.0"; - - Dropzone.options = {}; - - Dropzone.optionsForElement = function(element) { - if (element.getAttribute("id")) { - return Dropzone.options[camelize(element.getAttribute("id"))]; - } else { - return void 0; - } - }; - - Dropzone.instances = []; - - Dropzone.forElement = function(element) { - if (typeof element === "string") { - element = document.querySelector(element); - } - if ((element != null ? element.dropzone : void 0) == null) { - throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone."); - } - return element.dropzone; - }; - - Dropzone.autoDiscover = true; - - Dropzone.discover = function() { - var checkElements, dropzone, dropzones, _i, _len, _results; - if (document.querySelectorAll) { - dropzones = document.querySelectorAll(".dropzone"); - } else { - dropzones = []; - checkElements = function(elements) { - var el, _i, _len, _results; - _results = []; - for (_i = 0, _len = elements.length; _i < _len; _i++) { - el = elements[_i]; - if (/(^| )dropzone($| )/.test(el.className)) { - _results.push(dropzones.push(el)); - } else { - _results.push(void 0); - } - } - return _results; - }; - checkElements(document.getElementsByTagName("div")); - checkElements(document.getElementsByTagName("form")); - } - _results = []; - for (_i = 0, _len = dropzones.length; _i < _len; _i++) { - dropzone = dropzones[_i]; - if (Dropzone.optionsForElement(dropzone) !== false) { - _results.push(new Dropzone(dropzone)); - } else { - _results.push(void 0); - } - } - return _results; - }; - - Dropzone.blacklistedBrowsers = [/opera.*Macintosh.*version\/12/i]; - - Dropzone.isBrowserSupported = function() { - var capableBrowser, regex, _i, _len, _ref; - capableBrowser = true; - if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) { - if (!("classList" in document.createElement("a"))) { - capableBrowser = false; - } else { - _ref = Dropzone.blacklistedBrowsers; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - regex = _ref[_i]; - if (regex.test(navigator.userAgent)) { - capableBrowser = false; - continue; - } - } - } - } else { - capableBrowser = false; - } - return capableBrowser; - }; - - without = function(list, rejectedItem) { - var item, _i, _len, _results; - _results = []; - for (_i = 0, _len = list.length; _i < _len; _i++) { - item = list[_i]; - if (item !== rejectedItem) { - _results.push(item); - } - } - return _results; - }; - - camelize = function(str) { - return str.replace(/[\-_](\w)/g, function(match) { - return match.charAt(1).toUpperCase(); - }); - }; - - Dropzone.createElement = function(string) { - var div; - div = document.createElement("div"); - div.innerHTML = string; - return div.childNodes[0]; - }; - - Dropzone.elementInside = function(element, container) { - if (element === container) { - return true; - } - while (element = element.parentNode) { - if (element === container) { - return true; - } - } - return false; - }; - - Dropzone.getElement = function(el, name) { - var element; - if (typeof el === "string") { - element = document.querySelector(el); - } else if (el.nodeType != null) { - element = el; - } - if (element == null) { - throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector or a plain HTML element."); - } - return element; - }; - - Dropzone.getElements = function(els, name) { - var e, el, elements, _i, _j, _len, _len1, _ref; - if (els instanceof Array) { - elements = []; - try { - for (_i = 0, _len = els.length; _i < _len; _i++) { - el = els[_i]; - elements.push(this.getElement(el, name)); - } - } catch (_error) { - e = _error; - elements = null; - } - } else if (typeof els === "string") { - elements = []; - _ref = document.querySelectorAll(els); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - el = _ref[_j]; - elements.push(el); - } - } else if (els.nodeType != null) { - elements = [els]; - } - if (!((elements != null) && elements.length)) { - throw new Error("Invalid `" + name + "` option provided. Please provide a CSS selector, a plain HTML element or a list of those."); - } - return elements; - }; - - Dropzone.confirm = function(question, accepted, rejected) { - if (window.confirm(question)) { - return accepted(); - } else if (rejected != null) { - return rejected(); - } - }; - - Dropzone.isValidFile = function(file, acceptedFiles) { - var baseMimeType, mimeType, validType, _i, _len; - if (!acceptedFiles) { - return true; - } - acceptedFiles = acceptedFiles.split(","); - mimeType = file.type; - baseMimeType = mimeType.replace(/\/.*$/, ""); - for (_i = 0, _len = acceptedFiles.length; _i < _len; _i++) { - validType = acceptedFiles[_i]; - validType = validType.trim(); - if (validType.charAt(0) === ".") { - if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) { - return true; - } - } else if (/\/\*$/.test(validType)) { - if (baseMimeType === validType.replace(/\/.*$/, "")) { - return true; - } - } else { - if (mimeType === validType) { - return true; - } - } - } - return false; - }; - - if (typeof jQuery !== "undefined" && jQuery !== null) { - jQuery.fn.dropzone = function(options) { - return this.each(function() { - return new Dropzone(this, options); - }); - }; - } - - if (typeof module !== "undefined" && module !== null) { - module.exports = Dropzone; - } else { - window.Dropzone = Dropzone; - } - - Dropzone.ADDED = "added"; - - Dropzone.QUEUED = "queued"; - - Dropzone.ACCEPTED = Dropzone.QUEUED; - - Dropzone.UPLOADING = "uploading"; - - Dropzone.PROCESSING = Dropzone.UPLOADING; - - Dropzone.CANCELED = "canceled"; - - Dropzone.ERROR = "error"; - - Dropzone.SUCCESS = "success"; - - - /* - - Bugfix for iOS 6 and 7 - Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios - based on the work of https://github.com/stomita/ios-imagefile-megapixel - */ - - detectVerticalSquash = function(img) { - var alpha, canvas, ctx, data, ey, ih, iw, py, ratio, sy; - iw = img.naturalWidth; - ih = img.naturalHeight; - canvas = document.createElement("canvas"); - canvas.width = 1; - canvas.height = ih; - ctx = canvas.getContext("2d"); - ctx.drawImage(img, 0, 0); - data = ctx.getImageData(0, 0, 1, ih).data; - sy = 0; - ey = ih; - py = ih; - while (py > sy) { - alpha = data[(py - 1) * 4 + 3]; - if (alpha === 0) { - ey = py; - } else { - sy = py; - } - py = (ey + sy) >> 1; - } - ratio = py / ih; - if (ratio === 0) { - return 1; - } else { - return ratio; - } - }; - - drawImageIOSFix = function(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) { - var vertSquashRatio; - vertSquashRatio = detectVerticalSquash(img); - return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio); - }; - - - /* - * contentloaded.js - * - * Author: Diego Perini (diego.perini at gmail.com) - * Summary: cross-browser wrapper for DOMContentLoaded - * Updated: 20101020 - * License: MIT - * Version: 1.2 - * - * URL: - * http://javascript.nwbox.com/ContentLoaded/ - * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE - */ - - contentLoaded = function(win, fn) { - var add, doc, done, init, poll, pre, rem, root, top; - done = false; - top = true; - doc = win.document; - root = doc.documentElement; - add = (doc.addEventListener ? "addEventListener" : "attachEvent"); - rem = (doc.addEventListener ? "removeEventListener" : "detachEvent"); - pre = (doc.addEventListener ? "" : "on"); - init = function(e) { - if (e.type === "readystatechange" && doc.readyState !== "complete") { - return; - } - (e.type === "load" ? win : doc)[rem](pre + e.type, init, false); - if (!done && (done = true)) { - return fn.call(win, e.type || e); - } - }; - poll = function() { - var e; - try { - root.doScroll("left"); - } catch (_error) { - e = _error; - setTimeout(poll, 50); - return; - } - return init("poll"); - }; - if (doc.readyState !== "complete") { - if (doc.createEventObject && root.doScroll) { - try { - top = !win.frameElement; - } catch (_error) {} - if (top) { - poll(); - } - } - doc[add](pre + "DOMContentLoaded", init, false); - doc[add](pre + "readystatechange", init, false); - return win[add](pre + "load", init, false); - } - }; - - Dropzone._autoDiscoverFunction = function() { - if (Dropzone.autoDiscover) { - return Dropzone.discover(); - } - }; - - contentLoaded(window, Dropzone._autoDiscoverFunction); - -}).call(this); diff --git a/public/plugins/highlight-9.6.0/default.css b/public/plugins/highlight-9.6.0/default.css deleted file mode 100644 index f1bfade..0000000 --- a/public/plugins/highlight-9.6.0/default.css +++ /dev/null @@ -1,99 +0,0 @@ -/* - -Original highlight.js style (c) Ivan Sagalaev - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - background: #F0F0F0; -} - - -/* Base color: saturation 0; */ - -.hljs, -.hljs-subst { - color: #444; -} - -.hljs-comment { - color: #888888; -} - -.hljs-keyword, -.hljs-attribute, -.hljs-selector-tag, -.hljs-meta-keyword, -.hljs-doctag, -.hljs-name { - font-weight: bold; -} - - -/* User color: hue: 0 */ - -.hljs-type, -.hljs-string, -.hljs-number, -.hljs-selector-id, -.hljs-selector-class, -.hljs-quote, -.hljs-template-tag, -.hljs-deletion { - color: #880000; -} - -.hljs-title, -.hljs-section { - color: #880000; - font-weight: bold; -} - -.hljs-regexp, -.hljs-symbol, -.hljs-variable, -.hljs-template-variable, -.hljs-link, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #BC6060; -} - - -/* Language color: hue: 90; */ - -.hljs-literal { - color: #78A960; -} - -.hljs-built_in, -.hljs-bullet, -.hljs-code, -.hljs-addition { - color: #397300; -} - - -/* Meta color: hue: 200 */ - -.hljs-meta { - color: #1f7199; -} - -.hljs-meta-string { - color: #4d99bf; -} - - -/* Misc effects */ - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/public/plugins/highlight-9.6.0/github.css b/public/plugins/highlight-9.6.0/github.css deleted file mode 100644 index 791932b..0000000 --- a/public/plugins/highlight-9.6.0/github.css +++ /dev/null @@ -1,99 +0,0 @@ -/* - -github.com style (c) Vasily Polovnyov - -*/ - -.hljs { - display: block; - overflow-x: auto; - padding: 0.5em; - color: #333; - background: #f8f8f8; -} - -.hljs-comment, -.hljs-quote { - color: #998; - font-style: italic; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-subst { - color: #333; - font-weight: bold; -} - -.hljs-number, -.hljs-literal, -.hljs-variable, -.hljs-template-variable, -.hljs-tag .hljs-attr { - color: #008080; -} - -.hljs-string, -.hljs-doctag { - color: #d14; -} - -.hljs-title, -.hljs-section, -.hljs-selector-id { - color: #900; - font-weight: bold; -} - -.hljs-subst { - font-weight: normal; -} - -.hljs-type, -.hljs-class .hljs-title { - color: #458; - font-weight: bold; -} - -.hljs-tag, -.hljs-name, -.hljs-attribute { - color: #000080; - font-weight: normal; -} - -.hljs-regexp, -.hljs-link { - color: #009926; -} - -.hljs-symbol, -.hljs-bullet { - color: #990073; -} - -.hljs-built_in, -.hljs-builtin-name { - color: #0086b3; -} - -.hljs-meta { - color: #999; - font-weight: bold; -} - -.hljs-deletion { - background: #fdd; -} - -.hljs-addition { - background: #dfd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/public/plugins/highlight-9.6.0/highlight.pack.js b/public/plugins/highlight-9.6.0/highlight.pack.js deleted file mode 100644 index 962b628..0000000 --- a/public/plugins/highlight-9.6.0/highlight.pack.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! highlight.js v9.6.0 | BSD3 License | git.io/hljslicense */ -!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/[&<>]/gm,function(e){return I[e]})}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return R(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||R(i))return i}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){l+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):E(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"===e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function l(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?"":y.classPrefix,i='',i+n+o}function p(){var e,t,r,a;if(!E.k)return n(B);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(B);r;)a+=n(B.substr(t,r.index-t)),e=g(E,r),e?(M+=e[1],a+=h(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(B);return a+n(B.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!x[E.sL])return n(B);var t=e?l(E.sL,B,!0,L[E.sL]):f(B,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(L[E.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){k+=null!=E.sL?d():p(),B=""}function v(e){k+=e.cN?h(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(B+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?B+=n:(t.eB&&(B+=n),b(),t.rB||t.eB||(B=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?B+=n:(a.rE||a.eE||(B+=n),b(),a.eE&&(B=n));do E.cN&&(k+=C),E.skip||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return B+=n,n.length||1}var N=R(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var w,E=i||N,L={},k="";for(w=E;w!==N;w=w.parent)w.cN&&(k=h(w.cN,"",!0)+k);var B="",M=0;try{for(var I,j,O=0;;){if(E.t.lastIndex=O,I=E.t.exec(t),!I)break;j=m(t.substr(O,I.index-O),I[0]),O=I.index+j}for(m(t.substr(O)),w=E;w.parent;w=w.parent)w.cN&&(k+=C);return{r:M,value:k,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function f(e,t){t=t||y.languages||E(x);var r={r:0,value:n(e)},a=r;return t.filter(R).forEach(function(n){var t=l(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function g(e){return y.tabReplace||y.useBR?e.replace(M,function(e,n){return y.useBR&&"\n"===e?"
    ":y.tabReplace?n.replace(/\t/g,y.tabReplace):void 0}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n,t,r,o,s,p=i(e);a(p)||(y.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=p?l(p,s,!0):f(s),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),s)),r.value=g(r.value),e.innerHTML=r.value,e.className=h(e.className,p,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function d(e){y=o(y,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");w.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function N(){return E(x)}function R(e){return e=(e||"").toLowerCase(),x[e]||x[L[e]]}var w=[],E=Object.keys,x={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
    ",y={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},I={"&":"&","<":"<",">":">"};return e.highlight=l,e.highlightAuto=f,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=R,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("dns",function(d){return{aliases:["bind","zone"],k:{keyword:"IN A AAAA AFSDB APL CAA CDNSKEY CDS CERT CNAME DHCID DLV DNAME DNSKEY DS HIP IPSECKEY KEY KX LOC MX NAPTR NS NSEC NSEC3 NSEC3PARAM PTR RRSIG RP SIG SOA SRV SSHFP TA TKEY TLSA TSIG TXT"},c:[d.C(";","$",{r:0}),{cN:"meta",b:/^\$(TTL|GENERATE|INCLUDE|ORIGIN)\b/},{cN:"number",b:"((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))\\b"},{cN:"number",b:"((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\b"},d.inherit(d.NM,{b:/\b\d+[dhwm]?/})]}});hljs.registerLanguage("zephir",function(e){var i={cN:"string",c:[e.BE],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},n={v:[e.BNM,e.CNM]};return{aliases:["zep"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var let while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally int uint long ulong char uchar double float bool boolean stringlikely unlikely",c:[e.CLCM,e.HCM,e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[e.BE]},{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e.CBCM,i,n]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},i,n]}});hljs.registerLanguage("cs",function(e){var i={keyword:"abstract as base bool break byte case catch char checked const continue decimal dynamic default delegate do double else enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long when object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async nameof ascending descending from get group into join let orderby partial select set value var where yield",literal:"null false true"},r={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},t=e.inherit(r,{i:/\n/}),n={cN:"subst",b:"{",e:"}",k:i},c=e.inherit(n,{i:/\n/}),a={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,c]},s={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},n]},o=e.inherit(s,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},c]});n.c=[s,a,r,e.ASM,e.QSM,e.CNM,e.CBCM],c.c=[o,a,t,e.ASM,e.QSM,e.CNM,e.inherit(e.CBCM,{i:/\n/})];var l={v:[s,a,r,e.ASM,e.QSM]},b=e.IR+"(<"+e.IR+">)?(\\[\\])?";return{aliases:["csharp"],k:i,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},l,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{bK:"new return throw await",r:0},{cN:"function",b:"("+b+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:i,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:i,r:0,c:[l,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("basic",function(E){return{cI:!0,i:"^.",l:"[a-zA-Z][a-zA-Z0-9_$%!#]*",k:{keyword:"ABS ASC AND ATN AUTO|0 BEEP BLOAD|10 BSAVE|10 CALL CALLS CDBL CHAIN CHDIR CHR$|10 CINT CIRCLE CLEAR CLOSE CLS COLOR COM COMMON CONT COS CSNG CSRLIN CVD CVI CVS DATA DATE$ DEFDBL DEFINT DEFSNG DEFSTR DEF|0 SEG USR DELETE DIM DRAW EDIT END ENVIRON ENVIRON$ EOF EQV ERASE ERDEV ERDEV$ ERL ERR ERROR EXP FIELD FILES FIX FOR|0 FRE GET GOSUB|10 GOTO HEX$ IF|0 THEN ELSE|0 INKEY$ INP INPUT INPUT# INPUT$ INSTR IMP INT IOCTL IOCTL$ KEY ON OFF LIST KILL LEFT$ LEN LET LINE LLIST LOAD LOC LOCATE LOF LOG LPRINT USING LSET MERGE MID$ MKDIR MKD$ MKI$ MKS$ MOD NAME NEW NEXT NOISE NOT OCT$ ON OR PEN PLAY STRIG OPEN OPTION BASE OUT PAINT PALETTE PCOPY PEEK PMAP POINT POKE POS PRINT PRINT] PSET PRESET PUT RANDOMIZE READ REM RENUM RESET|0 RESTORE RESUME RETURN|0 RIGHT$ RMDIR RND RSET RUN SAVE SCREEN SGN SHELL SIN SOUND SPACE$ SPC SQR STEP STICK STOP STR$ STRING$ SWAP SYSTEM TAB TAN TIME$ TIMER TROFF TRON TO USR VAL VARPTR VARPTR$ VIEW WAIT WHILE WEND WIDTH WINDOW WRITE XOR"},c:[E.QSM,E.C("REM","$",{r:10}),E.C("'","$",{r:0}),{cN:"symbol",b:"^[0-9]+ ",r:10},{cN:"number",b:"\\b([0-9]+[0-9edED.]*[#!]?)",r:0},{cN:"number",b:"(&[hH][0-9a-fA-F]{1,4})"},{cN:"number",b:"(&[oO][0-7]{1,6})"}]}});hljs.registerLanguage("thrift",function(e){var t="bool byte i16 i32 i64 double string binary";return{k:{keyword:"namespace const typedef struct enum service exception void oneway set list map required optional",built_in:t,literal:"true false"},c:[e.QSM,e.NM,e.CLCM,e.CBCM,{cN:"class",bK:"struct enum service exception",e:/\{/,i:/\n/,c:[e.inherit(e.TM,{starts:{eW:!0,eE:!0}})]},{b:"\\b(set|list|map)\\s*<",e:">",k:t,c:["self"]}]}});hljs.registerLanguage("cos",function(e){var t={cN:"string",v:[{b:'"',e:'"',c:[{b:'""',r:0}]}]},r={cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)",r:0},s="property parameter class classmethod clientmethod extends as break catch close continue do d|0 else elseif for goto halt hang h|0 if job j|0 kill k|0 lock l|0 merge new open quit q|0 read r|0 return set s|0 tcommit throw trollback try tstart use view while write w|0 xecute x|0 zkill znspace zn ztrap zwrite zw zzdump zzwrite print zbreak zinsert zload zprint zremove zsave zzprint mv mvcall mvcrt mvdim mvprint zquit zsync ascii";return{cI:!0,aliases:["cos","cls"],k:s,c:[r,t,e.CLCM,e.CBCM,{cN:"comment",b:/;/,e:"$",r:0},{cN:"built_in",b:/(?:\$\$?|\.\.)\^?[a-zA-Z]+/},{cN:"built_in",b:/\$\$\$[a-zA-Z]+/},{cN:"built_in",b:/%[a-z]+(?:\.[a-z]+)*/},{cN:"symbol",b:/\^%?[a-zA-Z][\w]*/},{cN:"keyword",b:/##class|##super|#define|#dim/},{b:/&sql\(/,e:/\)/,eB:!0,eE:!0,sL:"sql"},{b:/&(js|jscript|javascript)/,eB:!0,eE:!0,sL:"javascript"},{b:/&html<\s*\s*>/,sL:"xml"}]}});hljs.registerLanguage("gherkin",function(e){return{aliases:["feature"],k:"Feature Background Ability Business Need Scenario Scenarios Scenario Outline Scenario Template Examples Given And Then But When",c:[{cN:"symbol",b:"\\*",r:0},{cN:"meta",b:"@[^@\\s]+"},{b:"\\|",e:"\\|\\w*$",c:[{cN:"string",b:"[^|]+"}]},{cN:"variable",b:"<",e:">"},e.HCM,{cN:"string",b:'"""',e:'"""'},e.QSM]}});hljs.registerLanguage("elixir",function(e){var r="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?",n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",b="and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote",c={cN:"subst",b:"#\\{",e:"}",l:r,k:b},a={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/}]},i={cN:"function",bK:"def defp defmacro",e:/\B\b/,c:[e.inherit(e.TM,{b:r,endsParent:!0})]},l=e.inherit(i,{cN:"class",bK:"defimpl defmodule defprotocol defrecord",e:/\bdo\b|$|;/}),s=[a,e.HCM,l,i,{cN:"symbol",b:":(?!\\s)",c:[a,{b:n}],r:0},{cN:"symbol",b:r+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"->"},{b:"("+e.RSR+")\\s*",c:[e.HCM,{cN:"regexp",i:"\\n",c:[e.BE,c],v:[{b:"/",e:"/[a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];return c.c=s,{l:r,k:b,c:s}});hljs.registerLanguage("csp",function(r){return{cI:!1,l:"[a-zA-Z][a-zA-Z0-9_-]*",k:{keyword:"base-uri child-src connect-src default-src font-src form-action frame-ancestors frame-src img-src media-src object-src plugin-types report-uri sandbox script-src style-src"},c:[{cN:"string",b:"'",e:"'"},{cN:"attribute",b:"^Content",e:":",eE:!0}]}});hljs.registerLanguage("d",function(e){var t={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},r="(0|[1-9][\\d_]*)",a="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",i="0[bB][01_]+",n="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",_="0[xX]"+n,c="([eE][+-]?"+a+")",d="("+a+"(\\.\\d*|"+c+")|\\d+\\."+a+a+"|\\."+r+c+"?)",o="(0[xX]("+n+"\\."+n+"|\\.?"+n+")[pP][+-]?"+a+")",s="("+r+"|"+i+"|"+_+")",l="("+o+"|"+d+")",u="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",b={cN:"number",b:"\\b"+s+"(L|u|U|Lu|LU|uL|UL)?",r:0},f={cN:"number",b:"\\b("+l+"([fF]|L|i|[fF]i|Li)?|"+s+"(i|[fF]i|Li))",r:0},g={cN:"string",b:"'("+u+"|.)",e:"'",i:"."},h={b:u,r:0},p={cN:"string",b:'"',c:[h],e:'"[cwd]?'},m={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5},w={cN:"string",b:"`",e:"`[cwd]?"},N={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10},A={cN:"string",b:'q"\\{',e:'\\}"'},F={cN:"meta",b:"^#!",e:"$",r:5},y={cN:"meta",b:"#(line)",e:"$",r:5},L={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"},v=e.C("\\/\\+","\\+\\/",{c:["self"],r:10});return{l:e.UIR,k:t,c:[e.CLCM,e.CBCM,v,N,p,m,w,A,f,b,g,F,y,L]}});hljs.registerLanguage("x86asm",function(s){return{cI:!0,l:"[.%]?"+s.IR,k:{keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},c:[s.C(";","$",{r:0}),{cN:"number",v:[{b:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",r:0},{b:"\\$[0-9][0-9A-Fa-f]*",r:0},{b:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{b:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QSM,{cN:"string",v:[{b:"'",e:"[^\\\\]'"},{b:"`",e:"[^\\\\]`"}],r:0},{cN:"symbol",v:[{b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{b:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],r:0},{cN:"subst",b:"%[0-9]+",r:0},{cN:"subst",b:"%!S+",r:0},{cN:"meta",b:/^\s*\.[\w_-]+/}]}});hljs.registerLanguage("pony",function(e){var r={keyword:"actor addressof and as be break class compile_error compile_intrinsicconsume continue delegate digestof do else elseif embed end errorfor fun if ifdef in interface is isnt lambda let match new not objector primitive recover repeat return struct then trait try type until use var where while with xor",meta:"iso val tag trn box ref",literal:"this false true"},t={cN:"string",b:'"""',e:'"""',r:10},c={cN:"string",b:'"',e:'"',c:[e.BE]},i={cN:"string",b:"'",e:"'",c:[e.BE],r:0},n={cN:"type",b:"\\b_?[A-Z][\\w]*",r:0},s={b:e.IR+"'",r:0},a={cN:"class",bK:"class actor",e:"$",c:[e.TM,e.CLCM]},o={cN:"function",bK:"new fun",e:"=>",c:[e.TM,{b:/\(/,e:/\)/,c:[n,s,e.CNM,e.CBCM]},{b:/:/,eW:!0,c:[n]},e.CLCM]};return{k:r,c:[a,o,n,t,c,i,s,e.CNM,e.CLCM,e.CBCM]}});hljs.registerLanguage("stata",function(e){return{aliases:["do","ado"],cI:!0,k:"if else in foreach for forv forva forval forvalu forvalue forvalues by bys bysort xi quietly qui capture about ac ac_7 acprplot acprplot_7 adjust ado adopath adoupdate alpha ameans an ano anov anova anova_estat anova_terms anovadef aorder ap app appe appen append arch arch_dr arch_estat arch_p archlm areg areg_p args arima arima_dr arima_estat arima_p as asmprobit asmprobit_estat asmprobit_lf asmprobit_mfx__dlg asmprobit_p ass asse asser assert avplot avplot_7 avplots avplots_7 bcskew0 bgodfrey binreg bip0_lf biplot bipp_lf bipr_lf bipr_p biprobit bitest bitesti bitowt blogit bmemsize boot bootsamp bootstrap bootstrap_8 boxco_l boxco_p boxcox boxcox_6 boxcox_p bprobit br break brier bro brow brows browse brr brrstat bs bs_7 bsampl_w bsample bsample_7 bsqreg bstat bstat_7 bstat_8 bstrap bstrap_7 ca ca_estat ca_p cabiplot camat canon canon_8 canon_8_p canon_estat canon_p cap caprojection capt captu captur capture cat cc cchart cchart_7 cci cd censobs_table centile cf char chdir checkdlgfiles checkestimationsample checkhlpfiles checksum chelp ci cii cl class classutil clear cli clis clist clo clog clog_lf clog_p clogi clogi_sw clogit clogit_lf clogit_p clogitp clogl_sw cloglog clonevar clslistarray cluster cluster_measures cluster_stop cluster_tree cluster_tree_8 clustermat cmdlog cnr cnre cnreg cnreg_p cnreg_sw cnsreg codebook collaps4 collapse colormult_nb colormult_nw compare compress conf confi confir confirm conren cons const constr constra constrai constrain constraint continue contract copy copyright copysource cor corc corr corr2data corr_anti corr_kmo corr_smc corre correl correla correlat correlate corrgram cou coun count cox cox_p cox_sw coxbase coxhaz coxvar cprplot cprplot_7 crc cret cretu cretur creturn cross cs cscript cscript_log csi ct ct_is ctset ctst_5 ctst_st cttost cumsp cumsp_7 cumul cusum cusum_7 cutil d|0 datasig datasign datasigna datasignat datasignatu datasignatur datasignature datetof db dbeta de dec deco decod decode deff des desc descr descri describ describe destring dfbeta dfgls dfuller di di_g dir dirstats dis discard disp disp_res disp_s displ displa display distinct do doe doed doedi doedit dotplot dotplot_7 dprobit drawnorm drop ds ds_util dstdize duplicates durbina dwstat dydx e|0 ed edi edit egen eivreg emdef en enc enco encod encode eq erase ereg ereg_lf ereg_p ereg_sw ereghet ereghet_glf ereghet_glf_sh ereghet_gp ereghet_ilf ereghet_ilf_sh ereghet_ip eret eretu eretur ereturn err erro error est est_cfexist est_cfname est_clickable est_expand est_hold est_table est_unhold est_unholdok estat estat_default estat_summ estat_vce_only esti estimates etodow etof etomdy ex exi exit expand expandcl fac fact facto factor factor_estat factor_p factor_pca_rotated factor_rotate factormat fcast fcast_compute fcast_graph fdades fdadesc fdadescr fdadescri fdadescrib fdadescribe fdasav fdasave fdause fh_st file open file read file close file filefilter fillin find_hlp_file findfile findit findit_7 fit fl fli flis flist for5_0 form forma format fpredict frac_154 frac_adj frac_chk frac_cox frac_ddp frac_dis frac_dv frac_in frac_mun frac_pp frac_pq frac_pv frac_wgt frac_xo fracgen fracplot fracplot_7 fracpoly fracpred fron_ex fron_hn fron_p fron_tn fron_tn2 frontier ftodate ftoe ftomdy ftowdate g|0 gamhet_glf gamhet_gp gamhet_ilf gamhet_ip gamma gamma_d2 gamma_p gamma_sw gammahet gdi_hexagon gdi_spokes ge gen gene gener genera generat generate genrank genstd genvmean gettoken gl gladder gladder_7 glim_l01 glim_l02 glim_l03 glim_l04 glim_l05 glim_l06 glim_l07 glim_l08 glim_l09 glim_l10 glim_l11 glim_l12 glim_lf glim_mu glim_nw1 glim_nw2 glim_nw3 glim_p glim_v1 glim_v2 glim_v3 glim_v4 glim_v5 glim_v6 glim_v7 glm glm_6 glm_p glm_sw glmpred glo glob globa global glogit glogit_8 glogit_p gmeans gnbre_lf gnbreg gnbreg_5 gnbreg_p gomp_lf gompe_sw gomper_p gompertz gompertzhet gomphet_glf gomphet_glf_sh gomphet_gp gomphet_ilf gomphet_ilf_sh gomphet_ip gphdot gphpen gphprint gprefs gprobi_p gprobit gprobit_8 gr gr7 gr_copy gr_current gr_db gr_describe gr_dir gr_draw gr_draw_replay gr_drop gr_edit gr_editviewopts gr_example gr_example2 gr_export gr_print gr_qscheme gr_query gr_read gr_rename gr_replay gr_save gr_set gr_setscheme gr_table gr_undo gr_use graph graph7 grebar greigen greigen_7 greigen_8 grmeanby grmeanby_7 gs_fileinfo gs_filetype gs_graphinfo gs_stat gsort gwood h|0 hadimvo hareg hausman haver he heck_d2 heckma_p heckman heckp_lf heckpr_p heckprob hel help hereg hetpr_lf hetpr_p hetprob hettest hexdump hilite hist hist_7 histogram hlogit hlu hmeans hotel hotelling hprobit hreg hsearch icd9 icd9_ff icd9p iis impute imtest inbase include inf infi infil infile infix inp inpu input ins insheet insp inspe inspec inspect integ inten intreg intreg_7 intreg_p intrg2_ll intrg_ll intrg_ll2 ipolate iqreg ir irf irf_create irfm iri is_svy is_svysum isid istdize ivprob_1_lf ivprob_lf ivprobit ivprobit_p ivreg ivreg_footnote ivtob_1_lf ivtob_lf ivtobit ivtobit_p jackknife jacknife jknife jknife_6 jknife_8 jkstat joinby kalarma1 kap kap_3 kapmeier kappa kapwgt kdensity kdensity_7 keep ksm ksmirnov ktau kwallis l|0 la lab labe label labelbook ladder levels levelsof leverage lfit lfit_p li lincom line linktest lis list lloghet_glf lloghet_glf_sh lloghet_gp lloghet_ilf lloghet_ilf_sh lloghet_ip llogi_sw llogis_p llogist llogistic llogistichet lnorm_lf lnorm_sw lnorma_p lnormal lnormalhet lnormhet_glf lnormhet_glf_sh lnormhet_gp lnormhet_ilf lnormhet_ilf_sh lnormhet_ip lnskew0 loadingplot loc loca local log logi logis_lf logistic logistic_p logit logit_estat logit_p loglogs logrank loneway lookfor lookup lowess lowess_7 lpredict lrecomp lroc lroc_7 lrtest ls lsens lsens_7 lsens_x lstat ltable ltable_7 ltriang lv lvr2plot lvr2plot_7 m|0 ma mac macr macro makecns man manova manova_estat manova_p manovatest mantel mark markin markout marksample mat mat_capp mat_order mat_put_rr mat_rapp mata mata_clear mata_describe mata_drop mata_matdescribe mata_matsave mata_matuse mata_memory mata_mlib mata_mosave mata_rename mata_which matalabel matcproc matlist matname matr matri matrix matrix_input__dlg matstrik mcc mcci md0_ md1_ md1debug_ md2_ md2debug_ mds mds_estat mds_p mdsconfig mdslong mdsmat mdsshepard mdytoe mdytof me_derd mean means median memory memsize meqparse mer merg merge mfp mfx mhelp mhodds minbound mixed_ll mixed_ll_reparm mkassert mkdir mkmat mkspline ml ml_5 ml_adjs ml_bhhhs ml_c_d ml_check ml_clear ml_cnt ml_debug ml_defd ml_e0 ml_e0_bfgs ml_e0_cycle ml_e0_dfp ml_e0i ml_e1 ml_e1_bfgs ml_e1_bhhh ml_e1_cycle ml_e1_dfp ml_e2 ml_e2_cycle ml_ebfg0 ml_ebfr0 ml_ebfr1 ml_ebh0q ml_ebhh0 ml_ebhr0 ml_ebr0i ml_ecr0i ml_edfp0 ml_edfr0 ml_edfr1 ml_edr0i ml_eds ml_eer0i ml_egr0i ml_elf ml_elf_bfgs ml_elf_bhhh ml_elf_cycle ml_elf_dfp ml_elfi ml_elfs ml_enr0i ml_enrr0 ml_erdu0 ml_erdu0_bfgs ml_erdu0_bhhh ml_erdu0_bhhhq ml_erdu0_cycle ml_erdu0_dfp ml_erdu0_nrbfgs ml_exde ml_footnote ml_geqnr ml_grad0 ml_graph ml_hbhhh ml_hd0 ml_hold ml_init ml_inv ml_log ml_max ml_mlout ml_mlout_8 ml_model ml_nb0 ml_opt ml_p ml_plot ml_query ml_rdgrd ml_repor ml_s_e ml_score ml_searc ml_technique ml_unhold mleval mlf_ mlmatbysum mlmatsum mlog mlogi mlogit mlogit_footnote mlogit_p mlopts mlsum mlvecsum mnl0_ mor more mov move mprobit mprobit_lf mprobit_p mrdu0_ mrdu1_ mvdecode mvencode mvreg mvreg_estat n|0 nbreg nbreg_al nbreg_lf nbreg_p nbreg_sw nestreg net newey newey_7 newey_p news nl nl_7 nl_9 nl_9_p nl_p nl_p_7 nlcom nlcom_p nlexp2 nlexp2_7 nlexp2a nlexp2a_7 nlexp3 nlexp3_7 nlgom3 nlgom3_7 nlgom4 nlgom4_7 nlinit nllog3 nllog3_7 nllog4 nllog4_7 nlog_rd nlogit nlogit_p nlogitgen nlogittree nlpred no nobreak noi nois noisi noisil noisily note notes notes_dlg nptrend numlabel numlist odbc old_ver olo olog ologi ologi_sw ologit ologit_p ologitp on one onew onewa oneway op_colnm op_comp op_diff op_inv op_str opr opro oprob oprob_sw oprobi oprobi_p oprobit oprobitp opts_exclusive order orthog orthpoly ou out outf outfi outfil outfile outs outsh outshe outshee outsheet ovtest pac pac_7 palette parse parse_dissim pause pca pca_8 pca_display pca_estat pca_p pca_rotate pcamat pchart pchart_7 pchi pchi_7 pcorr pctile pentium pergram pergram_7 permute permute_8 personal peto_st pkcollapse pkcross pkequiv pkexamine pkexamine_7 pkshape pksumm pksumm_7 pl plo plot plugin pnorm pnorm_7 poisgof poiss_lf poiss_sw poisso_p poisson poisson_estat post postclose postfile postutil pperron pr prais prais_e prais_e2 prais_p predict predictnl preserve print pro prob probi probit probit_estat probit_p proc_time procoverlay procrustes procrustes_estat procrustes_p profiler prog progr progra program prop proportion prtest prtesti pwcorr pwd q\\s qby qbys qchi qchi_7 qladder qladder_7 qnorm qnorm_7 qqplot qqplot_7 qreg qreg_c qreg_p qreg_sw qu quadchk quantile quantile_7 que quer query range ranksum ratio rchart rchart_7 rcof recast reclink recode reg reg3 reg3_p regdw regr regre regre_p2 regres regres_p regress regress_estat regriv_p remap ren rena renam rename renpfix repeat replace report reshape restore ret retu retur return rm rmdir robvar roccomp roccomp_7 roccomp_8 rocf_lf rocfit rocfit_8 rocgold rocplot rocplot_7 roctab roctab_7 rolling rologit rologit_p rot rota rotat rotate rotatemat rreg rreg_p ru run runtest rvfplot rvfplot_7 rvpplot rvpplot_7 sa safesum sample sampsi sav save savedresults saveold sc sca scal scala scalar scatter scm_mine sco scob_lf scob_p scobi_sw scobit scor score scoreplot scoreplot_help scree screeplot screeplot_help sdtest sdtesti se search separate seperate serrbar serrbar_7 serset set set_defaults sfrancia sh she shel shell shewhart shewhart_7 signestimationsample signrank signtest simul simul_7 simulate simulate_8 sktest sleep slogit slogit_d2 slogit_p smooth snapspan so sor sort spearman spikeplot spikeplot_7 spikeplt spline_x split sqreg sqreg_p sret sretu sretur sreturn ssc st st_ct st_hc st_hcd st_hcd_sh st_is st_issys st_note st_promo st_set st_show st_smpl st_subid stack statsby statsby_8 stbase stci stci_7 stcox stcox_estat stcox_fr stcox_fr_ll stcox_p stcox_sw stcoxkm stcoxkm_7 stcstat stcurv stcurve stcurve_7 stdes stem stepwise stereg stfill stgen stir stjoin stmc stmh stphplot stphplot_7 stphtest stphtest_7 stptime strate strate_7 streg streg_sw streset sts sts_7 stset stsplit stsum sttocc sttoct stvary stweib su suest suest_8 sum summ summa summar summari summariz summarize sunflower sureg survcurv survsum svar svar_p svmat svy svy_disp svy_dreg svy_est svy_est_7 svy_estat svy_get svy_gnbreg_p svy_head svy_header svy_heckman_p svy_heckprob_p svy_intreg_p svy_ivreg_p svy_logistic_p svy_logit_p svy_mlogit_p svy_nbreg_p svy_ologit_p svy_oprobit_p svy_poisson_p svy_probit_p svy_regress_p svy_sub svy_sub_7 svy_x svy_x_7 svy_x_p svydes svydes_8 svygen svygnbreg svyheckman svyheckprob svyintreg svyintreg_7 svyintrg svyivreg svylc svylog_p svylogit svymarkout svymarkout_8 svymean svymlog svymlogit svynbreg svyolog svyologit svyoprob svyoprobit svyopts svypois svypois_7 svypoisson svyprobit svyprobt svyprop svyprop_7 svyratio svyreg svyreg_p svyregress svyset svyset_7 svyset_8 svytab svytab_7 svytest svytotal sw sw_8 swcnreg swcox swereg swilk swlogis swlogit swologit swoprbt swpois swprobit swqreg swtobit swweib symmetry symmi symplot symplot_7 syntax sysdescribe sysdir sysuse szroeter ta tab tab1 tab2 tab_or tabd tabdi tabdis tabdisp tabi table tabodds tabodds_7 tabstat tabu tabul tabula tabulat tabulate te tempfile tempname tempvar tes test testnl testparm teststd tetrachoric time_it timer tis tob tobi tobit tobit_p tobit_sw token tokeni tokeniz tokenize tostring total translate translator transmap treat_ll treatr_p treatreg trim trnb_cons trnb_mean trpoiss_d2 trunc_ll truncr_p truncreg tsappend tset tsfill tsline tsline_ex tsreport tsrevar tsrline tsset tssmooth tsunab ttest ttesti tut_chk tut_wait tutorial tw tware_st two twoway twoway__fpfit_serset twoway__function_gen twoway__histogram_gen twoway__ipoint_serset twoway__ipoints_serset twoway__kdensity_gen twoway__lfit_serset twoway__normgen_gen twoway__pci_serset twoway__qfit_serset twoway__scatteri_serset twoway__sunflower_gen twoway_ksm_serset ty typ type typeof u|0 unab unabbrev unabcmd update us use uselabel var var_mkcompanion var_p varbasic varfcast vargranger varirf varirf_add varirf_cgraph varirf_create varirf_ctable varirf_describe varirf_dir varirf_drop varirf_erase varirf_graph varirf_ograph varirf_rename varirf_set varirf_table varlist varlmar varnorm varsoc varstable varstable_w varstable_w2 varwle vce vec vec_fevd vec_mkphi vec_p vec_p_w vecirf_create veclmar veclmar_w vecnorm vecnorm_w vecrank vecstable verinst vers versi versio version view viewsource vif vwls wdatetof webdescribe webseek webuse weib1_lf weib2_lf weib_lf weib_lf0 weibhet_glf weibhet_glf_sh weibhet_glfa weibhet_glfa_sh weibhet_gp weibhet_ilf weibhet_ilf_sh weibhet_ilfa weibhet_ilfa_sh weibhet_ip weibu_sw weibul_p weibull weibull_c weibull_s weibullhet wh whelp whi which whil while wilc_st wilcoxon win wind windo window winexec wntestb wntestb_7 wntestq xchart xchart_7 xcorr xcorr_7 xi xi_6 xmlsav xmlsave xmluse xpose xsh xshe xshel xshell xt_iis xt_tis xtab_p xtabond xtbin_p xtclog xtcloglog xtcloglog_8 xtcloglog_d2 xtcloglog_pa_p xtcloglog_re_p xtcnt_p xtcorr xtdata xtdes xtfront_p xtfrontier xtgee xtgee_elink xtgee_estat xtgee_makeivar xtgee_p xtgee_plink xtgls xtgls_p xthaus xthausman xtht_p xthtaylor xtile xtint_p xtintreg xtintreg_8 xtintreg_d2 xtintreg_p xtivp_1 xtivp_2 xtivreg xtline xtline_ex xtlogit xtlogit_8 xtlogit_d2 xtlogit_fe_p xtlogit_pa_p xtlogit_re_p xtmixed xtmixed_estat xtmixed_p xtnb_fe xtnb_lf xtnbreg xtnbreg_pa_p xtnbreg_refe_p xtpcse xtpcse_p xtpois xtpoisson xtpoisson_d2 xtpoisson_pa_p xtpoisson_refe_p xtpred xtprobit xtprobit_8 xtprobit_d2 xtprobit_re_p xtps_fe xtps_lf xtps_ren xtps_ren_8 xtrar_p xtrc xtrc_p xtrchh xtrefe_p xtreg xtreg_be xtreg_fe xtreg_ml xtreg_pa_p xtreg_re xtregar xtrere_p xtset xtsf_ll xtsf_llti xtsum xttab xttest0 xttobit xttobit_8 xttobit_p xttrans yx yxview__barlike_draw yxview_area_draw yxview_bar_draw yxview_dot_draw yxview_dropline_draw yxview_function_draw yxview_iarrow_draw yxview_ilabels_draw yxview_normal_draw yxview_pcarrow_draw yxview_pcbarrow_draw yxview_pccapsym_draw yxview_pcscatter_draw yxview_pcspike_draw yxview_rarea_draw yxview_rbar_draw yxview_rbarm_draw yxview_rcap_draw yxview_rcapsym_draw yxview_rconnected_draw yxview_rline_draw yxview_rscatter_draw yxview_rspike_draw yxview_spike_draw yxview_sunflower_draw zap_s zinb zinb_llf zinb_plf zip zip_llf zip_p zip_plf zt_ct_5 zt_hc_5 zt_hcd_5 zt_is_5 zt_iss_5 zt_sho_5 zt_smp_5 ztbase_5 ztcox_5 ztdes_5 ztereg_5 ztfill_5 ztgen_5 ztir_5 ztjoin_5 ztnb ztnb_p ztp ztp_p zts_5 ztset_5 ztspli_5 ztsum_5 zttoct_5 ztvary_5 ztweib_5",c:[{cN:"symbol",b:/`[a-zA-Z0-9_]+'/},{cN:"variable",b:/\$\{?[a-zA-Z0-9_]+\}?/},{cN:"string",v:[{b:'`"[^\r\n]*?"\''},{b:'"[^\r\n"]*"'}]},{cN:"built_in",v:[{b:"\\b(abs|acos|asin|atan|atan2|atanh|ceil|cloglog|comb|cos|digamma|exp|floor|invcloglog|invlogit|ln|lnfact|lnfactorial|lngamma|log|log10|max|min|mod|reldif|round|sign|sin|sqrt|sum|tan|tanh|trigamma|trunc|betaden|Binomial|binorm|binormal|chi2|chi2tail|dgammapda|dgammapdada|dgammapdadx|dgammapdx|dgammapdxdx|F|Fden|Ftail|gammaden|gammap|ibeta|invbinomial|invchi2|invchi2tail|invF|invFtail|invgammap|invibeta|invnchi2|invnFtail|invnibeta|invnorm|invnormal|invttail|nbetaden|nchi2|nFden|nFtail|nibeta|norm|normal|normalden|normd|npnchi2|tden|ttail|uniform|abbrev|char|index|indexnot|length|lower|ltrim|match|plural|proper|real|regexm|regexr|regexs|reverse|rtrim|string|strlen|strlower|strltrim|strmatch|strofreal|strpos|strproper|strreverse|strrtrim|strtrim|strupper|subinstr|subinword|substr|trim|upper|word|wordcount|_caller|autocode|byteorder|chop|clip|cond|e|epsdouble|epsfloat|group|inlist|inrange|irecode|matrix|maxbyte|maxdouble|maxfloat|maxint|maxlong|mi|minbyte|mindouble|minfloat|minint|minlong|missing|r|recode|replay|return|s|scalar|d|date|day|dow|doy|halfyear|mdy|month|quarter|week|year|d|daily|dofd|dofh|dofm|dofq|dofw|dofy|h|halfyearly|hofd|m|mofd|monthly|q|qofd|quarterly|tin|twithin|w|weekly|wofd|y|yearly|yh|ym|yofd|yq|yw|cholesky|colnumb|colsof|corr|det|diag|diag0cnt|el|get|hadamard|I|inv|invsym|issym|issymmetric|J|matmissing|matuniform|mreldif|nullmat|rownumb|rowsof|sweep|syminv|trace|vec|vecdiag)(?=\\(|$)"}]},e.C("^[ ]*\\*.*$",!1),e.CLCM,e.CBCM]}});hljs.registerLanguage("accesslog",function(T){return{c:[{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+\\b",r:0},{cN:"string",b:'"(GET|POST|HEAD|PUT|DELETE|CONNECT|OPTIONS|PATCH|TRACE)',e:'"',k:"GET POST HEAD PUT DELETE CONNECT OPTIONS PATCH TRACE",i:"\\n",r:10},{cN:"string",b:/\[/,e:/\]/,i:"\\n"},{cN:"string",b:'"',e:'"',i:"\\n"}]}});hljs.registerLanguage("abnf",function(e){var r={ruleDeclaration:"^[a-zA-Z][a-zA-Z0-9-]*",unexpectedChars:"[!@#$^&',?+~`|:]"},a=["ALPHA","BIT","CHAR","CR","CRLF","CTL","DIGIT","DQUOTE","HEXDIG","HTAB","LF","LWSP","OCTET","SP","VCHAR","WSP"],b=e.C(";","$"),c={cN:"symbol",b:/%b[0-1]+(-[0-1]+|(\.[0-1]+)+){0,1}/},l={cN:"symbol",b:/%d[0-9]+(-[0-9]+|(\.[0-9]+)+){0,1}/},n={cN:"symbol",b:/%x[0-9A-F]+(-[0-9A-F]+|(\.[0-9A-F]+)+){0,1}/},t={cN:"symbol",b:/%[si]/},s={b:r.ruleDeclaration+"\\s*=",rB:!0,e:/=/,r:0,c:[{cN:"attribute",b:r.ruleDeclaration}]};return{i:r.unexpectedChars,k:a.join(" "),c:[s,b,c,l,n,t,e.QSM,e.NM]}});hljs.registerLanguage("ruby",function(e){var r="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",b={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:b},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:b},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:r}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:r}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:b},{b:"("+e.RSR+")\\s*",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var l="[>?]>",o="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+l+"|"+o+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:b,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("haml",function(s){return{cI:!0,c:[{cN:"meta",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},s.C("^\\s*(!=#|=#|-#|/).*$",!1,{r:0}),{b:"^\\s*(-|=|!=)(?!#)",starts:{e:"\\n",sL:"ruby"}},{cN:"tag",b:"^\\s*%",c:[{cN:"selector-tag",b:"\\w+"},{cN:"selector-id",b:"#[\\w-]+"},{cN:"selector-class",b:"\\.[\\w-]+"},{b:"{\\s*",e:"\\s*}",c:[{b:":\\w+\\s*=>",e:",\\s+",rB:!0,eW:!0,c:[{cN:"attr",b:":\\w+"},s.ASM,s.QSM,{b:"\\w+",r:0}]}]},{b:"\\(\\s*",e:"\\s*\\)",eE:!0,c:[{b:"\\w+\\s*=",e:"\\s+",rB:!0,eW:!0,c:[{cN:"attr",b:"\\w+",r:0},s.ASM,s.QSM,{b:"\\w+",r:0}]}]}]},{b:"^\\s*[=~]\\s*"},{b:"#{",starts:{e:"}",sL:"ruby"}}]}});hljs.registerLanguage("ruleslanguage",function(T){return{k:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM NUMDAYS READ_DATE STAGING",built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},c:[T.CLCM,T.CBCM,T.ASM,T.QSM,T.CNM,{cN:"literal",v:[{b:"#\\s+[a-zA-Z\\ \\.]*",r:0},{b:"#[a-zA-Z\\ \\.]+"}]}]}});hljs.registerLanguage("crystal",function(e){function r(e,r){var b=[{b:e,e:r}];return b[0].c=b,b}var b="(_[uif](8|16|32|64))?",c="[a-zA-Z_]\\w*[!?=]?",n="!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",i="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\][=?]?",s={keyword:"abstract alias as asm begin break case class def do else elsif end ensure enum extend for fun if ifdef include instance_sizeof is_a? lib macro module next of out pointerof private protected rescue responds_to? return require self sizeof struct super then type typeof union unless until when while with yield __DIR__ __FILE__ __LINE__",literal:"false nil true"},t={cN:"subst",b:"#{",e:"}",k:s},a={cN:"template-variable",v:[{b:"\\{\\{",e:"\\}\\}"},{b:"\\{%",e:"%\\}"}],k:s},l={cN:"string",c:[e.BE,t],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%w?\\(",e:"\\)",c:r("\\(","\\)")},{b:"%w?\\[",e:"\\]",c:r("\\[","\\]")},{b:"%w?{",e:"}",c:r("{","}")},{b:"%w?<",e:">",c:r("<",">")},{b:"%w?/",e:"/"},{b:"%w?%",e:"%"},{b:"%w?-",e:"-"},{b:"%w?\\|",e:"\\|"}],r:0},u={b:"("+n+")\\s*",c:[{cN:"regexp",c:[e.BE,t],v:[{b:"//[a-z]*",r:0},{b:"/",e:"/[a-z]*"},{b:"%r\\(",e:"\\)",c:r("\\(","\\)")},{b:"%r\\[",e:"\\]",c:r("\\[","\\]")},{b:"%r{",e:"}",c:r("{","}")},{b:"%r<",e:">",c:r("<",">")},{b:"%r/",e:"/"},{b:"%r%",e:"%"},{b:"%r-",e:"-"},{b:"%r\\|",e:"\\|"}]}],r:0},o={cN:"regexp",c:[e.BE,t],v:[{b:"%r\\(",e:"\\)",c:r("\\(","\\)")},{b:"%r\\[",e:"\\]",c:r("\\[","\\]")},{b:"%r{",e:"}",c:r("{","}")},{b:"%r<",e:">",c:r("<",">")},{b:"%r/",e:"/"},{b:"%r%",e:"%"},{b:"%r-",e:"-"},{b:"%r\\|",e:"\\|"}],r:0},_={cN:"meta",b:"@\\[",e:"\\]",c:[e.inherit(e.QSM,{cN:"meta-string"})]},f=[a,l,u,o,_,e.HCM,{cN:"class",bK:"class module struct",e:"$|;",i:/=/,c:[e.HCM,e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<"}]},{cN:"class",bK:"lib enum union",e:"$|;",i:/=/,c:[e.HCM,e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"})],r:10},{cN:"function",bK:"def",e:/\B\b/,c:[e.inherit(e.TM,{b:i,endsParent:!0})]},{cN:"function",bK:"fun macro",e:/\B\b/,c:[e.inherit(e.TM,{b:i,endsParent:!0})],r:5},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":",c:[l,{b:i}],r:0},{cN:"number",v:[{b:"\\b0b([01_]*[01])"+b},{b:"\\b0o([0-7_]*[0-7])"+b},{b:"\\b0x([A-Fa-f0-9_]*[A-Fa-f0-9])"+b},{b:"\\b(([0-9][0-9_]*[0-9]|[0-9])(\\.[0-9_]*[0-9])?([eE][+-]?[0-9_]*[0-9])?)"+b}],r:0}];return t.c=f,a.c=f.slice(1),{aliases:["cr"],l:c,k:s,c:f}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,s.c=o,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:o}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("crmsh",function(t){var e="primitive rsc_template",r="group clone ms master location colocation order fencing_topology rsc_ticket acl_target acl_group user role tag xml",s="property rsc_defaults op_defaults",a="params meta operations op rule attributes utilization",i="read write deny defined not_defined in_range date spec in ref reference attribute type xpath version and or lt gt tag lte gte eq ne \\",o="number string",n="Master Started Slave Stopped start promote demote stop monitor true false";return{aliases:["crm","pcmk"],cI:!0,k:{keyword:a+" "+i+" "+o,literal:n},c:[t.HCM,{bK:"node",starts:{e:"\\s*([\\w_-]+:)?",starts:{cN:"title",e:"\\s*[\\$\\w_][\\w_-]*"}}},{bK:e,starts:{cN:"title",e:"\\s*[\\$\\w_][\\w_-]*",starts:{e:"\\s*@?[\\w_][\\w_\\.:-]*"}}},{b:"\\b("+r.split(" ").join("|")+")\\s+",k:r,starts:{cN:"title",e:"[\\$\\w_][\\w_-]*"}},{bK:s,starts:{cN:"title",e:"\\s*([\\w_-]+:)?"}},t.QSM,{cN:"meta",b:"(ocf|systemd|service|lsb):[\\w_:-]+",r:0},{cN:"number",b:"\\b\\d+(\\.\\d+)?(ms|s|h|m)?",r:0},{cN:"literal",b:"[-]?(infinity|inf)",r:0},{cN:"attr",b:/([A-Za-z\$_\#][\w_-]+)=/,r:0},{cN:"tag",b:"",r:0}]}});hljs.registerLanguage("ebnf",function(a){var e=a.C(/\(\*/,/\*\)/),t={cN:"attribute",b:/^[ ]*[a-zA-Z][a-zA-Z-]*([\s-]+[a-zA-Z][a-zA-Z]*)*/},r={cN:"meta",b:/\?.*\?/},b={b:/=/,e:/;/,c:[e,r,a.ASM,a.QSM]};return{i:/\S/,c:[e,t,b]}});hljs.registerLanguage("matlab",function(e){var a=[e.CNM,{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]}],s={r:0,c:[{b:/'['\.]*/}]};return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}]}]},{b:/[a-zA-Z_][a-zA-Z_0-9]*'['\.]*/,rB:!0,r:0,c:[{b:/[a-zA-Z_][a-zA-Z_0-9]*/,r:0},s.c[0]]},{b:"\\[",e:"\\]",c:a,r:0,starts:s},{b:"\\{",e:/}/,c:a,r:0,starts:s},{b:/\)/,r:0,starts:s},e.C("^\\s*\\%\\{\\s*$","^\\s*\\%\\}\\s*$"),e.C("\\%","$")].concat(a)}});hljs.registerLanguage("q",function(e){var s={keyword:"do while select delete by update from",literal:"0b 1b",built_in:"neg not null string reciprocal floor ceiling signum mod xbar xlog and or each scan over prior mmu lsq inv md5 ltime gtime count first var dev med cov cor all any rand sums prds mins maxs fills deltas ratios avgs differ prev next rank reverse iasc idesc asc desc msum mcount mavg mdev xrank mmin mmax xprev rotate distinct group where flip type key til get value attr cut set upsert raze union inter except cross sv vs sublist enlist read0 read1 hopen hclose hdel hsym hcount peach system ltrim rtrim trim lower upper ssr view tables views cols xcols keys xkey xcol xasc xdesc fkeys meta lj aj aj0 ij pj asof uj ww wj wj1 fby xgroup ungroup ej save load rsave rload show csv parse eval min max avg wavg wsum sin cos tan sum",type:"`float `double int `timestamp `timespan `datetime `time `boolean `symbol `char `byte `short `long `real `month `date `minute `second `guid"};return{aliases:["k","kdb"],k:s,l:/(`?)[A-Za-z0-9_]+\b/,c:[e.CLCM,e.QSM,e.CNM]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("applescript",function(e){var t=e.inherit(e.QSM,{i:""}),r={cN:"params",b:"\\(",e:"\\)",c:["self",e.CNM,t]},i=e.C("--","$"),o=e.C("\\(\\*","\\*\\)",{c:["self",i]}),n=[i,o,e.HCM];return{aliases:["osascript"],k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the|0 then third through thru timeout times to transaction try until where while whose with without",literal:"AppleScript false linefeed return pi quote result space tab true",built_in:"alias application boolean class constant date file integer list number real record string text activate beep count delay launch log offset read round run say summarize write character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[t,e.CNM,{cN:"built_in",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"literal",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference)|POSIX file|POSIX path|(date|time) string|quoted form)\\b"},{bK:"on",i:"[${=;\\n]",c:[e.UTM,r]}].concat(n),i:"//|->|=>|\\[\\["}});hljs.registerLanguage("autohotkey",function(e){var r={b:/`[\s\S]/};return{cI:!0,k:{keyword:"Break Continue Else Gosub If Loop Return While",literal:"A|0 true false NOT AND OR",built_in:"ComSpec Clipboard ClipboardAll ErrorLevel"},c:[{cN:"built_in",b:"A_[a-zA-Z0-9]+"},r,e.inherit(e.QSM,{c:[r]}),e.C(";","$",{r:0}),{cN:"number",b:e.NR,r:0},{cN:"variable",b:"%",e:"%",i:"\\n",c:[r]},{cN:"symbol",c:[r],v:[{b:'^[^\\n";]+::(?!=)'},{b:'^[^\\n";]+:(?!=)',r:0}]},{b:",\\s*,"}]}});hljs.registerLanguage("moonscript",function(e){var t={keyword:"if then not for in while do return else elseif break continue switch and or unless when class extends super local import export from using",literal:"true false nil",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},r="[A-Za-z$_][0-9A-Za-z$_]*",s={cN:"subst",b:/#\{/,e:/}/,k:t},a=[e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'/,e:/'/,c:[e.BE]},{b:/"/,e:/"/,c:[e.BE,s]}]},{cN:"built_in",b:"@__"+e.IR},{b:"@"+e.IR},{b:e.IR+"\\\\"+e.IR}];s.c=a;var c=e.inherit(e.TM,{b:r}),n="(\\(.*\\))?\\s*\\B[-=]>",i={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:t,c:["self"].concat(a)}]};return{aliases:["moon"],k:t,i:/\/\*/,c:a.concat([e.C("--","$"),{cN:"function",b:"^\\s*"+r+"\\s*=\\s*"+n,e:"[-=]>",rB:!0,c:[c,i]},{b:/[\(,:=]\s*/,r:0,c:[{cN:"function",b:n,e:"[-=]>",rB:!0,c:[i]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[c]},c]},{cN:"name",b:r+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("xl",function(e){var t="ObjectLoader Animate MovieCredits Slides Filters Shading Materials LensFlare Mapping VLCAudioVideo StereoDecoder PointCloud NetworkAccess RemoteControl RegExp ChromaKey Snowfall NodeJS Speech Charts",o={keyword:"if then else do while until for loop import with is as where when by data constant integer real text name boolean symbol infix prefix postfix block tree",literal:"true false nil",built_in:"in mod rem and or xor not abs sign floor ceil sqrt sin cos tan asin acos atan exp expm1 log log2 log10 log1p pi at text_length text_range text_find text_replace contains page slide basic_slide title_slide title subtitle fade_in fade_out fade_at clear_color color line_color line_width texture_wrap texture_transform texture scale_?x scale_?y scale_?z? translate_?x translate_?y translate_?z? rotate_?x rotate_?y rotate_?z? rectangle circle ellipse sphere path line_to move_to quad_to curve_to theme background contents locally time mouse_?x mouse_?y mouse_buttons "+t},a={cN:"string",b:'"',e:'"',i:"\\n"},r={cN:"string",b:"'",e:"'",i:"\\n"},i={cN:"string",b:"<<",e:">>"},l={cN:"number",b:"[0-9]+#[0-9A-Z_]+(\\.[0-9-A-Z_]+)?#?([Ee][+-]?[0-9]+)?"},n={bK:"import",e:"$",k:o,c:[a]},s={cN:"function",b:/[a-z][^\n]*->/,rB:!0,e:/->/,c:[e.inherit(e.TM,{starts:{eW:!0,k:o}})]};return{aliases:["tao"],l:/[a-zA-Z][a-zA-Z0-9_?]*/,k:o,c:[e.CLCM,e.CBCM,a,r,i,s,n,l,e.NM]}});hljs.registerLanguage("avrasm",function(r){return{cI:!0,l:"\\.?"+r.IR,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf",meta:".byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list .listmac .macro .nolist .org .set"},c:[r.CBCM,r.C(";","$",{r:0}),r.CNM,r.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},r.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"symbol",b:"^[A-Za-z0-9_.$]+:"},{cN:"meta",b:"#",e:"$"},{cN:"subst",b:"@[0-9]+"}]}});hljs.registerLanguage("vhdl",function(e){var r="\\d(_|\\d)*",t="[eE][-+]?"+r,o=r+"(\\."+r+")?("+t+")?",n="\\w+",i=r+"#"+n+"(\\."+n+")?#("+t+")?",a="\\b("+i+"|"+o+")";return{cI:!0,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",built_in:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[e.CBCM,e.C("--","$"),e.QSM,{cN:"number",b:a,r:0},{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[e.BE]},{cN:"symbol",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[e.BE]}]}});hljs.registerLanguage("erb",function(e){return{sL:"xml",c:[e.C("<%#","%>"),{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0}]}});hljs.registerLanguage("twig",function(e){var t={cN:"params",b:"\\(",e:"\\)"},a="attribute block constant cycle date dump include max min parent random range source template_from_string",r={bK:a,k:{name:a},r:0,c:[t]},c={b:/\|[A-Za-z_]+:?/,k:"abs batch capitalize convert_encoding date date_modify default escape first format join json_encode keys last length lower merge nl2br number_format raw replace reverse round slice sort split striptags title trim upper url_encode",c:[r]},s="autoescape block do embed extends filter flush for if import include macro sandbox set spaceless use verbatim";return s=s+" "+s.split(" ").map(function(e){return"end"+e}).join(" "),{aliases:["craftcms"],cI:!0,sL:"xml",c:[e.C(/\{#/,/#}/),{cN:"template-tag",b:/\{%/,e:/%}/,c:[{cN:"name",b:/\w+/,k:s,starts:{eW:!0,c:[c,r],r:0}}]},{cN:"template-variable",b:/\{\{/,e:/}}/,c:["self",c,r]}]}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("nsis",function(e){var t={cN:"variable",b:"\\$(ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES32|COMMONFILES64|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES32|PROGRAMFILES64|PROGRAMFILES|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)"},i={cN:"variable",b:"\\$+{[a-zA-Z0-9_]+}"},n={cN:"variable",b:"\\$+[a-zA-Z0-9_]+",i:"\\(\\){}"},r={cN:"variable",b:"\\$+\\([a-zA-Z0-9_]+\\)"},l={cN:"built_in",b:"(ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)"},o={cN:"keyword",b:"\\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversionsystem|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|makensis|packhdr|searchparse|searchreplace|tempfile|undef|verbose|warning)"};return{cI:!1,k:{keyword:"Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ChangeUI CheckBitmap ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exch Exec ExecShell ExecWait ExpandEnvStrings File FileBufSize FileClose FileErrorText FileOpen FileRead FileReadByte FileReadUTF16LE FileReadWord FileSeek FileWrite FileWriteByte FileWriteUTF16LE FileWriteWord FindClose FindFirst FindNext FindWindow FlushINI FunctionEnd GetCurInstType GetCurrentAddress GetDlgItem GetDLLVersion GetDLLVersionLocal GetErrorLevel GetFileTime GetFileTimeLocal GetFullPathName GetFunctionAddress GetInstDirError GetLabelAddress GetTempFileName Goto HideWindow Icon IfAbort IfErrors IfFileExists IfRebootFlag IfSilent InitPluginsDir InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType InstTypeGetText InstTypeSetText IntCmp IntCmpU IntFmt IntOp IsWindow LangString LicenseBkColor LicenseData LicenseForceSelection LicenseLangString LicenseText LoadLanguageFile LockWindow LogSet LogText ManifestDPIAware ManifestSupportedOS MessageBox MiscButtonText Name Nop OutFile Page PageCallbacks PageExEnd Pop Push Quit ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr Reboot RegDLL Rename RequestExecutionLevel ReserveFile Return RMDir SearchPath SectionEnd SectionGetFlags SectionGetInstTypes SectionGetSize SectionGetText SectionGroupEnd SectionIn SectionSetFlags SectionSetInstTypes SectionSetSize SectionSetText SendMessage SetAutoClose SetBrandingImage SetCompress SetCompressor SetCompressorDictSize SetCtlColors SetCurInstType SetDatablockOptimize SetDateSave SetDetailsPrint SetDetailsView SetErrorLevel SetErrors SetFileAttributes SetFont SetOutPath SetOverwrite SetPluginUnload SetRebootFlag SetRegView SetShellVarContext SetSilent ShowInstDetails ShowUninstDetails ShowWindow SilentInstall SilentUnInstall Sleep SpaceTexts StrCmp StrCmpS StrCpy StrLen SubCaption SubSectionEnd Unicode UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText UninstPage UnRegDLL Var VIAddVersionKey VIFileVersion VIProductVersion WindowIcon WriteINIStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegStr WriteUninstaller XPStyle",literal:"admin all auto both colored current false force hide highest lastused leave listonly none normal notset off on open print show silent silentlog smooth textonly true user "},c:[e.HCM,e.CBCM,{cN:"string",b:'"',e:'"',i:"\\n",c:[{b:"\\$(\\\\(n|r|t)|\\$)"},t,i,n,r]},e.C(";","$",{r:0}),{cN:"function",bK:"Function PageEx Section SectionGroup SubSection",e:"$"},o,i,n,r,l,e.NM,{b:e.IR+"::"+e.IR}]}});hljs.registerLanguage("aspectj",function(e){var t="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else extends implements break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws privileged aspectOf adviceexecution proceed cflowbelow cflow initialization preinitialization staticinitialization withincode target within execution getWithinTypeName handler thisJoinPoint thisJoinPointStaticPart thisEnclosingJoinPointStaticPart declare parents warning error soft precedence thisAspectInstance",i="get set args call";return{k:t,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"aspect",e:/[{;=]/,eE:!0,i:/[:;"\[\]]/,c:[{bK:"extends implements pertypewithin perthis pertarget percflowbelow percflow issingleton"},e.UTM,{b:/\([^\)]*/,e:/[)]+/,k:t+" "+i,eE:!1}]},{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,r:0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"pointcut after before around throwing returning",e:/[)]/,eE:!1,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",rB:!0,c:[e.UTM]}]},{b:/[:]/,rB:!0,e:/[{;]/,r:0,eE:!1,k:t,i:/["\[\]]/,c:[{b:e.UIR+"\\s*\\(",k:t+" "+i},e.QSM]},{bK:"new throw",r:0},{cN:"function",b:/\w+ +\w+(\.)?\w+\s*\([^\)]*\)\s*((throws)[\w\s,]+)?[\{;]/,rB:!0,e:/[{;=]/,k:t,eE:!0,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,r:0,k:t,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U)?L?"',e:'"',i:"\\n",c:[t.BE]},{b:'(u8?|U)?R"',e:'"',c:[t.BE]},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(0b[01'_]+)"},{b:"\\b([\\d'_]+(\\.[\\d'_]*)?|\\.[\\d'_]+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9'_]+|(\\b[\\d'_]+(\\.[\\d'_]*)?|\\.[\\d'_]+)([eE][-+]?[\\d'_]+)?)"}],r:0},i={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:"<",e:">",i:"\\n"},t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,s,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,k:c,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s,e]},t.CLCM,t.CBCM,i]}]),exports:{preprocessor:i,strings:r,k:c}}});hljs.registerLanguage("arduino",function(e){var t=e.getLanguage("cpp").exports;return{k:{keyword:"boolean byte word string String array "+t.k.keyword,built_in:"setup loop while catch for if do goto try switch case else default break continue return KeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put",literal:"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW"},c:[t.preprocessor,e.CLCM,e.CBCM,e.ASM,e.QSM,e.CNM]}});hljs.registerLanguage("stan",function(e){return{c:[e.HCM,e.CLCM,e.CBCM,{b:e.UIR,l:e.UIR,k:{name:"for in while repeat until if then else",symbol:"bernoulli bernoulli_logit binomial binomial_logit beta_binomial hypergeometric categorical categorical_logit ordered_logistic neg_binomial neg_binomial_2 neg_binomial_2_log poisson poisson_log multinomial normal exp_mod_normal skew_normal student_t cauchy double_exponential logistic gumbel lognormal chi_square inv_chi_square scaled_inv_chi_square exponential inv_gamma weibull frechet rayleigh wiener pareto pareto_type_2 von_mises uniform multi_normal multi_normal_prec multi_normal_cholesky multi_gp multi_gp_cholesky multi_student_t gaussian_dlm_obs dirichlet lkj_corr lkj_corr_cholesky wishart inv_wishart","selector-tag":"int real vector simplex unit_vector ordered positive_ordered row_vector matrix cholesky_factor_corr cholesky_factor_cov corr_matrix cov_matrix",title:"functions model data parameters quantities transformed generated",literal:"true false"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0}]}});hljs.registerLanguage("inform7",function(e){var r="\\[",o="\\]";return{aliases:["i7"],cI:!0,k:{keyword:"thing room person man woman animal container supporter backdrop door scenery open closed locked inside gender is are say understand kind of rule"},c:[{cN:"string",b:'"',e:'"',r:0,c:[{cN:"subst",b:r,e:o}]},{cN:"section",b:/^(Volume|Book|Part|Chapter|Section|Table)\b/,e:"$"},{b:/^(Check|Carry out|Report|Instead of|To|Rule|When|Before|After)\b/,e:":",c:[{b:"\\(This",e:"\\)"}]},{cN:"comment",b:r,e:o,c:["self"]}]}});hljs.registerLanguage("stylus",function(e){var t={cN:"variable",b:"\\$"+e.IR},o={cN:"number",b:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"},i=["charset","css","debug","extend","font-face","for","import","include","media","mixin","page","warn","while"],r=["after","before","first-letter","first-line","active","first-child","focus","hover","lang","link","visited"],n=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],a="[\\.\\s\\n\\[\\:,]",l=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-variant-ligatures","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"],d=["\\?","(\\bReturn\\b)","(\\bEnd\\b)","(\\bend\\b)","(\\bdef\\b)",";","#\\s","\\*\\s","===\\s","\\|","%"];return{aliases:["styl"],cI:!1,k:"if else for in",i:"("+d.join("|")+")",c:[e.QSM,e.ASM,e.CLCM,e.CBCM,o,{b:"\\.[a-zA-Z][a-zA-Z0-9_-]*"+a,rB:!0,c:[{cN:"selector-class",b:"\\.[a-zA-Z][a-zA-Z0-9_-]*"}]},{b:"\\#[a-zA-Z][a-zA-Z0-9_-]*"+a,rB:!0,c:[{cN:"selector-id",b:"\\#[a-zA-Z][a-zA-Z0-9_-]*"}]},{b:"\\b("+n.join("|")+")"+a,rB:!0,c:[{cN:"selector-tag",b:"\\b[a-zA-Z][a-zA-Z0-9_-]*"}]},{b:"&?:?:\\b("+r.join("|")+")"+a},{b:"@("+i.join("|")+")\\b"},t,e.CSSNM,e.NM,{cN:"function",b:"^[a-zA-Z][a-zA-Z0-9_-]*\\(.*\\)",i:"[\\n]",rB:!0,c:[{cN:"title",b:"\\b[a-zA-Z][a-zA-Z0-9_-]*"},{cN:"params",b:/\(/,e:/\)/,c:[o,t,e.ASM,e.CSSNM,e.NM,e.QSM]}]},{cN:"attribute",b:"\\b("+l.reverse().join("|")+")\\b",starts:{e:/;|$/,c:[o,t,e.ASM,e.QSM,e.CSSNM,e.NM,e.CBCM],i:/\./,r:0}}]}});hljs.registerLanguage("erlang-repl",function(e){return{k:{built_in:"spawn spawn_link self",keyword:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"meta",b:"^[0-9]+> ",r:10},e.C("%","$"),{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},e.ASM,e.QSM,{b:"\\?(::)?([A-Z]\\w*(::)?)+"},{b:"->"},{b:"ok"},{b:"!"},{b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("groovy",function(e){return{k:{literal:"true false null",keyword:"byte short char int long boolean float double void def as in assert trait super this abstract static volatile transient public private protected synchronized final class interface enum if else for while switch case break default continue throw throws try catch finally implements extends new import package return instanceof"},c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,{cN:"string",b:'"""',e:'"""'},{cN:"string",b:"'''",e:"'''"},{cN:"string",b:"\\$/",e:"/\\$",r:10},e.ASM,{cN:"regexp",b:/~?\/[^\/\n]+\//,c:[e.BE]},e.QSM,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},e.BNM,{cN:"class",bK:"class interface trait enum",e:"{",i:":",c:[{bK:"extends implements"},e.UTM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"},{cN:"string",b:/[^\?]{0}[A-Za-z0-9_$]+ *:/},{b:/\?/,e:/\:/},{cN:"symbol",b:"^\\s*[A-Za-z0-9_$]+:",r:0}],i:/#|<\//}});hljs.registerLanguage("lisp",function(b){var e="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*",c="\\|[^]*?\\|",r="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?",a={cN:"meta",b:"^#!",e:"$"},l={cN:"literal",b:"\\b(t{1}|nil)\\b"},n={cN:"number",v:[{b:r,r:0},{b:"#(b|B)[0-1]+(/[0-1]+)?"},{b:"#(o|O)[0-7]+(/[0-7]+)?"},{b:"#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?"},{b:"#(c|C)\\("+r+" +"+r,e:"\\)"}]},i=b.inherit(b.QSM,{i:null}),t=b.C(";","$",{r:0}),s={b:"\\*",e:"\\*"},u={cN:"symbol",b:"[:&]"+e},d={b:e,r:0},f={b:c},m={b:"\\(",e:"\\)",c:["self",l,i,n,d]},o={c:[n,i,s,u,m,d],v:[{b:"['`]\\(",e:"\\)"},{b:"\\(quote ",e:"\\)",k:{name:"quote"}},{b:"'"+c}]},v={v:[{b:"'"+e},{b:"#'"+e+"(::"+e+")*"}]},N={b:"\\(\\s*",e:"\\)"},A={eW:!0,r:0};return N.c=[{cN:"name",v:[{b:e},{b:c}]},A],A.c=[o,v,N,l,n,i,t,s,u,f,d],{i:/\S/,c:[n,a,l,i,t,o,v,N,d]}});hljs.registerLanguage("tex",function(c){var e={cN:"tag",b:/\\/,r:0,c:[{cN:"name",v:[{b:/[a-zA-Zа-яА-я]+[*]?/},{b:/[^a-zA-Zа-яА-я0-9]/}],starts:{eW:!0,r:0,c:[{cN:"string",v:[{b:/\[/,e:/\]/},{b:/\{/,e:/\}/}]},{b:/\s*=\s*/,eW:!0,r:0,c:[{cN:"number",b:/-?\d*\.?\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?/}]}]}}]};return{c:[e,{cN:"formula",c:[e],r:0,v:[{b:/\$\$/,e:/\$\$/},{b:/\$/,e:/\$/}]},c.C("%","$",{r:0})]}});hljs.registerLanguage("livescript",function(e){var t={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger case default function var with then unless until loop of by when and or is isnt not it that otherwise from to til fallthrough super case default function var void const let enum export import native __hasProp __extends __slice __bind __indexOf",literal:"true false null undefined yes no on off it that void",built_in:"npm require console print module global window document"},s="[A-Za-z$_](?:-[0-9A-Za-z$_]|[0-9A-Za-z$_])*",n=e.inherit(e.TM,{b:s}),i={cN:"subst",b:/#\{/,e:/}/,k:t},r={cN:"subst",b:/#[A-Za-z$_]/,e:/(?:\-[0-9A-Za-z$_]|[0-9A-Za-z$_])*/,k:t},c=[e.BNM,{cN:"number",b:"(\\b0[xX][a-fA-F0-9_]+)|(\\b\\d(\\d|_\\d)*(\\.(\\d(\\d|_\\d)*)?)?(_*[eE]([-+]\\d(_\\d|\\d)*)?)?[_a-z]*)",r:0,starts:{e:"(\\s*/)?",r:0}},{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,i,r]},{b:/"/,e:/"/,c:[e.BE,i,r]},{b:/\\/,e:/(\s|$)/,eE:!0}]},{cN:"regexp",v:[{b:"//",e:"//[gim]*",c:[i,e.HCM]},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+s},{b:"``",e:"``",eB:!0,eE:!0,sL:"javascript"}];i.c=c;var a={cN:"params",b:"\\(",rB:!0,c:[{b:/\(/,e:/\)/,k:t,c:["self"].concat(c)}]};return{aliases:["ls"],k:t,i:/\/\*/,c:c.concat([e.C("\\/\\*","\\*\\/"),e.HCM,{cN:"function",c:[n,a],rB:!0,v:[{b:"("+s+"\\s*(?:=|:=)\\s*)?(\\(.*\\))?\\s*\\B\\->\\*?",e:"\\->\\*?"},{b:"("+s+"\\s*(?:=|:=)\\s*)?!?(\\(.*\\))?\\s*\\B[-~]{1,2}>\\*?",e:"[-~]{1,2}>\\*?"},{b:"("+s+"\\s*(?:=|:=)\\s*)?(\\(.*\\))?\\s*\\B!?[-~]{1,2}>\\*?",e:"!?[-~]{1,2}>\\*?"}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[n]},n]},{b:s+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("less",function(e){var r="[\\w-]+",t="("+r+"|@{"+r+"})",a=[],c=[],s=function(e){return{cN:"string",b:"~?"+e+".*?"+e}},b=function(e,r,t){return{cN:e,b:r,r:t}},n={b:"\\(",e:"\\)",c:c,r:0};c.push(e.CLCM,e.CBCM,s("'"),s('"'),e.CSSNM,{b:"(url|data-uri)\\(",starts:{cN:"string",e:"[\\)\\n]",eE:!0}},b("number","#[0-9A-Fa-f]+\\b"),n,b("variable","@@?"+r,10),b("variable","@{"+r+"}"),b("built_in","~?`[^`]*?`"),{cN:"attribute",b:r+"\\s*:",e:":",rB:!0,eE:!0},{cN:"meta",b:"!important"});var i=c.concat({b:"{",e:"}",c:a}),o={bK:"when",eW:!0,c:[{bK:"and not"}].concat(c)},u={b:t+"\\s*:",rB:!0,e:"[;}]",r:0,c:[{cN:"attribute",b:t,e:":",eE:!0,starts:{eW:!0,i:"[<=$]",r:0,c:c}}]},l={cN:"keyword",b:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{e:"[;{}]",rE:!0,c:c,r:0}},C={cN:"variable",v:[{b:"@"+r+"\\s*:",r:15},{b:"@"+r}],starts:{e:"[;}]",rE:!0,c:i}},p={v:[{b:"[\\.#:&\\[>]",e:"[;{}]"},{b:t+"[^;]*{",e:"{"}],rB:!0,rE:!0,i:"[<='$\"]",c:[e.CLCM,e.CBCM,o,b("keyword","all\\b"),b("variable","@{"+r+"}"),b("selector-tag",t+"%?",0),b("selector-id","#"+t),b("selector-class","\\."+t,0),b("selector-tag","&",0),{cN:"selector-attr",b:"\\[",e:"\\]"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"\\(",e:"\\)",c:i},{b:"!important"}]};return a.push(e.CLCM,e.CBCM,l,C,u,p),{cI:!0,i:"[=>'/<($\"]",c:a}});hljs.registerLanguage("dust",function(e){var t="if eq ne lt lte gt gte select default math sep";return{aliases:["dst"],cI:!0,sL:"xml",c:[{cN:"template-tag",b:/\{[#\/]/,e:/\}/,i:/;/,c:[{cN:"name",b:/[a-zA-Z\.-]+/,starts:{eW:!0,r:0,c:[e.QSM]}}]},{cN:"template-variable",b:/\{/,e:/\}/,i:/;/,k:t}]}});hljs.registerLanguage("verilog",function(e){var n={keyword:"accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind bins binsof bit break buf|0 bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin function generate|5 genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import incdir include initial inout input inside instance int integer interconnect interface intersect join join_any join_none large let liblist library local localparam logic longint macromodule matches medium modport module nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 or output package packed parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor",literal:"null",built_in:"$finish $stop $exit $fatal $error $warning $info $realtime $time $printtimescale $bitstoreal $bitstoshortreal $itor $signed $cast $bits $stime $timeformat $realtobits $shortrealtobits $rtoi $unsigned $asserton $assertkill $assertpasson $assertfailon $assertnonvacuouson $assertoff $assertcontrol $assertpassoff $assertfailoff $assertvacuousoff $isunbounded $sampled $fell $changed $past_gclk $fell_gclk $changed_gclk $rising_gclk $steady_gclk $coverage_control $coverage_get $coverage_save $set_coverage_db_name $rose $stable $past $rose_gclk $stable_gclk $future_gclk $falling_gclk $changing_gclk $display $coverage_get_max $coverage_merge $get_coverage $load_coverage_db $typename $unpacked_dimensions $left $low $increment $clog2 $ln $log10 $exp $sqrt $pow $floor $ceil $sin $cos $tan $countbits $onehot $isunknown $fatal $warning $dimensions $right $high $size $asin $acos $atan $atan2 $hypot $sinh $cosh $tanh $asinh $acosh $atanh $countones $onehot0 $error $info $random $dist_chi_square $dist_erlang $dist_exponential $dist_normal $dist_poisson $dist_t $dist_uniform $q_initialize $q_remove $q_exam $async$and$array $async$nand$array $async$or$array $async$nor$array $sync$and$array $sync$nand$array $sync$or$array $sync$nor$array $q_add $q_full $psprintf $async$and$plane $async$nand$plane $async$or$plane $async$nor$plane $sync$and$plane $sync$nand$plane $sync$or$plane $sync$nor$plane $system $display $displayb $displayh $displayo $strobe $strobeb $strobeh $strobeo $write $readmemb $readmemh $writememh $value$plusargs $dumpvars $dumpon $dumplimit $dumpports $dumpportson $dumpportslimit $writeb $writeh $writeo $monitor $monitorb $monitorh $monitoro $writememb $dumpfile $dumpoff $dumpall $dumpflush $dumpportsoff $dumpportsall $dumpportsflush $fclose $fdisplay $fdisplayb $fdisplayh $fdisplayo $fstrobe $fstrobeb $fstrobeh $fstrobeo $swrite $swriteb $swriteh $swriteo $fscanf $fread $fseek $fflush $feof $fopen $fwrite $fwriteb $fwriteh $fwriteo $fmonitor $fmonitorb $fmonitorh $fmonitoro $sformat $sformatf $fgetc $ungetc $fgets $sscanf $rewind $ftell $ferror"};return{aliases:["v","sv","svh"],cI:!1,k:n,l:/[\w\$]+/,c:[e.CBCM,e.CLCM,e.QSM,{cN:"number",c:[e.BE],v:[{b:"\\b((\\d+'(b|h|o|d|B|H|O|D))[0-9xzXZa-fA-F_]+)"},{b:"\\B(('(b|h|o|d|B|H|O|D))[0-9xzXZa-fA-F_]+)"},{b:"\\b([0-9_])+",r:0}]},{cN:"variable",v:[{b:"#\\((?!parameter).+\\)"},{b:"\\.\\w+",r:0}]},{cN:"meta",b:"`",e:"$",k:{"meta-keyword":"define __FILE__ __LINE__ begin_keywords celldefine default_nettype define else elsif end_keywords endcelldefine endif ifdef ifndef include line nounconnected_drive pragma resetall timescale unconnected_drive undef undefineall"},r:0}]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("openscad",function(e){var r={cN:"keyword",b:"\\$(f[asn]|t|vp[rtd]|children)"},n={cN:"literal",b:"false|true|PI|undef"},o={cN:"number",b:"\\b\\d+(\\.\\d+)?(e-?\\d+)?",r:0},i=e.inherit(e.QSM,{i:null}),t={cN:"meta",k:{"meta-keyword":"include use"},b:"include|use <",e:">"},s={cN:"params",b:"\\(",e:"\\)",c:["self",o,i,r,n]},c={b:"[*!#%]",r:0},a={cN:"function",bK:"module function",e:"\\=|\\{",c:[s,e.UTM]};return{aliases:["scad"],k:{keyword:"function module include use for intersection_for if else \\%",literal:"false true PI undef",built_in:"circle square polygon text sphere cube cylinder polyhedron translate rotate scale resize mirror multmatrix color offset hull minkowski union difference intersection abs sign sin cos tan acos asin atan atan2 floor round ceil ln log pow sqrt exp rands min max concat lookup str chr search version version_num norm cross parent_module echo import import_dxf dxf_linear_extrude linear_extrude rotate_extrude surface projection render children dxf_cross dxf_dim let assign"},c:[e.CLCM,e.CBCM,o,t,i,r,c,a]}});hljs.registerLanguage("mathematica",function(e){return{aliases:["mma"],l:"(\\$|\\b)"+e.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber", -c:[{cN:"comment",b:/\(\*/,e:/\*\)/},e.ASM,e.QSM,e.CNM,{b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("maxima",function(e){var t="if then else elseif for thru do while unless step in and or not",a="true false unknown inf minf ind und %e %i %pi %phi %gamma",r=" abasep abs absint absolute_real_time acos acosh acot acoth acsc acsch activate addcol add_edge add_edges addmatrices addrow add_vertex add_vertices adjacency_matrix adjoin adjoint af agd airy airy_ai airy_bi airy_dai airy_dbi algsys alg_type alias allroots alphacharp alphanumericp amortization %and annuity_fv annuity_pv antid antidiff AntiDifference append appendfile apply apply1 apply2 applyb1 apropos args arit_amortization arithmetic arithsum array arrayapply arrayinfo arraymake arraysetapply ascii asec asech asin asinh askinteger asksign assoc assoc_legendre_p assoc_legendre_q assume assume_external_byte_order asympa at atan atan2 atanh atensimp atom atvalue augcoefmatrix augmented_lagrangian_method av average_degree backtrace bars barsplot barsplot_description base64 base64_decode bashindices batch batchload bc2 bdvac belln benefit_cost bern bernpoly bernstein_approx bernstein_expand bernstein_poly bessel bessel_i bessel_j bessel_k bessel_simplify bessel_y beta beta_incomplete beta_incomplete_generalized beta_incomplete_regularized bezout bfallroots bffac bf_find_root bf_fmin_cobyla bfhzeta bfloat bfloatp bfpsi bfpsi0 bfzeta biconnected_components bimetric binomial bipartition block blockmatrixp bode_gain bode_phase bothcoef box boxplot boxplot_description break bug_report build_info|10 buildq build_sample burn cabs canform canten cardinality carg cartan cartesian_product catch cauchy_matrix cbffac cdf_bernoulli cdf_beta cdf_binomial cdf_cauchy cdf_chi2 cdf_continuous_uniform cdf_discrete_uniform cdf_exp cdf_f cdf_gamma cdf_general_finite_discrete cdf_geometric cdf_gumbel cdf_hypergeometric cdf_laplace cdf_logistic cdf_lognormal cdf_negative_binomial cdf_noncentral_chi2 cdf_noncentral_student_t cdf_normal cdf_pareto cdf_poisson cdf_rank_sum cdf_rayleigh cdf_signed_rank cdf_student_t cdf_weibull cdisplay ceiling central_moment cequal cequalignore cf cfdisrep cfexpand cgeodesic cgreaterp cgreaterpignore changename changevar chaosgame charat charfun charfun2 charlist charp charpoly chdir chebyshev_t chebyshev_u checkdiv check_overlaps chinese cholesky christof chromatic_index chromatic_number cint circulant_graph clear_edge_weight clear_rules clear_vertex_label clebsch_gordan clebsch_graph clessp clesspignore close closefile cmetric coeff coefmatrix cograd col collapse collectterms columnop columnspace columnswap columnvector combination combine comp2pui compare compfile compile compile_file complement_graph complete_bipartite_graph complete_graph complex_number_p components compose_functions concan concat conjugate conmetderiv connected_components connect_vertices cons constant constantp constituent constvalue cont2part content continuous_freq contortion contour_plot contract contract_edge contragrad contrib_ode convert coord copy copy_file copy_graph copylist copymatrix cor cos cosh cot coth cov cov1 covdiff covect covers crc24sum create_graph create_list csc csch csetup cspline ctaylor ct_coordsys ctransform ctranspose cube_graph cuboctahedron_graph cunlisp cv cycle_digraph cycle_graph cylindrical days360 dblint deactivate declare declare_constvalue declare_dimensions declare_fundamental_dimensions declare_fundamental_units declare_qty declare_translated declare_unit_conversion declare_units declare_weights decsym defcon define define_alt_display define_variable defint defmatch defrule defstruct deftaylor degree_sequence del delete deleten delta demo demoivre denom depends derivdegree derivlist describe desolve determinant dfloat dgauss_a dgauss_b dgeev dgemm dgeqrf dgesv dgesvd diag diagmatrix diag_matrix diagmatrixp diameter diff digitcharp dimacs_export dimacs_import dimension dimensionless dimensions dimensions_as_list direct directory discrete_freq disjoin disjointp disolate disp dispcon dispform dispfun dispJordan display disprule dispterms distrib divide divisors divsum dkummer_m dkummer_u dlange dodecahedron_graph dotproduct dotsimp dpart draw draw2d draw3d drawdf draw_file draw_graph dscalar echelon edge_coloring edge_connectivity edges eigens_by_jacobi eigenvalues eigenvectors eighth einstein eivals eivects elapsed_real_time elapsed_run_time ele2comp ele2polynome ele2pui elem elementp elevation_grid elim elim_allbut eliminate eliminate_using ellipse elliptic_e elliptic_ec elliptic_eu elliptic_f elliptic_kc elliptic_pi ematrix empty_graph emptyp endcons entermatrix entertensor entier equal equalp equiv_classes erf erfc erf_generalized erfi errcatch error errormsg errors euler ev eval_string evenp every evolution evolution2d evundiff example exp expand expandwrt expandwrt_factored expint expintegral_chi expintegral_ci expintegral_e expintegral_e1 expintegral_ei expintegral_e_simplify expintegral_li expintegral_shi expintegral_si explicit explose exponentialize express expt exsec extdiff extract_linear_equations extremal_subset ezgcd %f f90 facsum factcomb factor factorfacsum factorial factorout factorsum facts fast_central_elements fast_linsolve fasttimes featurep fernfale fft fib fibtophi fifth filename_merge file_search file_type fillarray findde find_root find_root_abs find_root_error find_root_rel first fix flatten flength float floatnump floor flower_snark flush flush1deriv flushd flushnd flush_output fmin_cobyla forget fortran fourcos fourexpand fourier fourier_elim fourint fourintcos fourintsin foursimp foursin fourth fposition frame_bracket freeof freshline fresnel_c fresnel_s from_adjacency_matrix frucht_graph full_listify fullmap fullmapl fullratsimp fullratsubst fullsetify funcsolve fundamental_dimensions fundamental_units fundef funmake funp fv g0 g1 gamma gamma_greek gamma_incomplete gamma_incomplete_generalized gamma_incomplete_regularized gauss gauss_a gauss_b gaussprob gcd gcdex gcdivide gcfac gcfactor gd generalized_lambert_w genfact gen_laguerre genmatrix gensym geo_amortization geo_annuity_fv geo_annuity_pv geomap geometric geometric_mean geosum get getcurrentdirectory get_edge_weight getenv get_lu_factors get_output_stream_string get_pixel get_plot_option get_tex_environment get_tex_environment_default get_vertex_label gfactor gfactorsum ggf girth global_variances gn gnuplot_close gnuplot_replot gnuplot_reset gnuplot_restart gnuplot_start go Gosper GosperSum gr2d gr3d gradef gramschmidt graph6_decode graph6_encode graph6_export graph6_import graph_center graph_charpoly graph_eigenvalues graph_flow graph_order graph_periphery graph_product graph_size graph_union great_rhombicosidodecahedron_graph great_rhombicuboctahedron_graph grid_graph grind grobner_basis grotzch_graph hamilton_cycle hamilton_path hankel hankel_1 hankel_2 harmonic harmonic_mean hav heawood_graph hermite hessian hgfred hilbertmap hilbert_matrix hipow histogram histogram_description hodge horner hypergeometric i0 i1 %ibes ic1 ic2 ic_convert ichr1 ichr2 icosahedron_graph icosidodecahedron_graph icurvature ident identfor identity idiff idim idummy ieqn %if ifactors iframes ifs igcdex igeodesic_coords ilt image imagpart imetric implicit implicit_derivative implicit_plot indexed_tensor indices induced_subgraph inferencep inference_result infix info_display init_atensor init_ctensor in_neighbors innerproduct inpart inprod inrt integerp integer_partitions integrate intersect intersection intervalp intopois intosum invariant1 invariant2 inverse_fft inverse_jacobi_cd inverse_jacobi_cn inverse_jacobi_cs inverse_jacobi_dc inverse_jacobi_dn inverse_jacobi_ds inverse_jacobi_nc inverse_jacobi_nd inverse_jacobi_ns inverse_jacobi_sc inverse_jacobi_sd inverse_jacobi_sn invert invert_by_adjoint invert_by_lu inv_mod irr is is_biconnected is_bipartite is_connected is_digraph is_edge_in_graph is_graph is_graph_or_digraph ishow is_isomorphic isolate isomorphism is_planar isqrt isreal_p is_sconnected is_tree is_vertex_in_graph items_inference %j j0 j1 jacobi jacobian jacobi_cd jacobi_cn jacobi_cs jacobi_dc jacobi_dn jacobi_ds jacobi_nc jacobi_nd jacobi_ns jacobi_p jacobi_sc jacobi_sd jacobi_sn JF jn join jordan julia julia_set julia_sin %k kdels kdelta kill killcontext kostka kron_delta kronecker_product kummer_m kummer_u kurtosis kurtosis_bernoulli kurtosis_beta kurtosis_binomial kurtosis_chi2 kurtosis_continuous_uniform kurtosis_discrete_uniform kurtosis_exp kurtosis_f kurtosis_gamma kurtosis_general_finite_discrete kurtosis_geometric kurtosis_gumbel kurtosis_hypergeometric kurtosis_laplace kurtosis_logistic kurtosis_lognormal kurtosis_negative_binomial kurtosis_noncentral_chi2 kurtosis_noncentral_student_t kurtosis_normal kurtosis_pareto kurtosis_poisson kurtosis_rayleigh kurtosis_student_t kurtosis_weibull label labels lagrange laguerre lambda lambert_w laplace laplacian_matrix last lbfgs lc2kdt lcharp lc_l lcm lc_u ldefint ldisp ldisplay legendre_p legendre_q leinstein length let letrules letsimp levi_civita lfreeof lgtreillis lhs li liediff limit Lindstedt linear linearinterpol linear_program linear_regression line_graph linsolve listarray list_correlations listify list_matrix_entries list_nc_monomials listoftens listofvars listp lmax lmin load loadfile local locate_matrix_entry log logcontract log_gamma lopow lorentz_gauge lowercasep lpart lratsubst lreduce lriemann lsquares_estimates lsquares_estimates_approximate lsquares_estimates_exact lsquares_mse lsquares_residual_mse lsquares_residuals lsum ltreillis lu_backsub lucas lu_factor %m macroexpand macroexpand1 make_array makebox makefact makegamma make_graph make_level_picture makelist makeOrders make_poly_continent make_poly_country make_polygon make_random_state make_rgb_picture makeset make_string_input_stream make_string_output_stream make_transform mandelbrot mandelbrot_set map mapatom maplist matchdeclare matchfix mat_cond mat_fullunblocker mat_function mathml_display mat_norm matrix matrixmap matrixp matrix_size mattrace mat_trace mat_unblocker max max_clique max_degree max_flow maximize_lp max_independent_set max_matching maybe md5sum mean mean_bernoulli mean_beta mean_binomial mean_chi2 mean_continuous_uniform mean_deviation mean_discrete_uniform mean_exp mean_f mean_gamma mean_general_finite_discrete mean_geometric mean_gumbel mean_hypergeometric mean_laplace mean_logistic mean_lognormal mean_negative_binomial mean_noncentral_chi2 mean_noncentral_student_t mean_normal mean_pareto mean_poisson mean_rayleigh mean_student_t mean_weibull median median_deviation member mesh metricexpandall mgf1_sha1 min min_degree min_edge_cut minfactorial minimalPoly minimize_lp minimum_spanning_tree minor minpack_lsquares minpack_solve min_vertex_cover min_vertex_cut mkdir mnewton mod mode_declare mode_identity ModeMatrix moebius mon2schur mono monomial_dimensions multibernstein_poly multi_display_for_texinfo multi_elem multinomial multinomial_coeff multi_orbit multiplot_mode multi_pui multsym multthru mycielski_graph nary natural_unit nc_degree ncexpt ncharpoly negative_picture neighbors new newcontext newdet new_graph newline newton new_variable next_prime nicedummies niceindices ninth nofix nonarray noncentral_moment nonmetricity nonnegintegerp nonscalarp nonzeroandfreeof notequal nounify nptetrad npv nroots nterms ntermst nthroot nullity nullspace num numbered_boundaries numberp number_to_octets num_distinct_partitions numerval numfactor num_partitions nusum nzeta nzetai nzetar octets_to_number octets_to_oid odd_girth oddp ode2 ode_check odelin oid_to_octets op opena opena_binary openr openr_binary openw openw_binary operatorp opsubst optimize %or orbit orbits ordergreat ordergreatp orderless orderlessp orthogonal_complement orthopoly_recur orthopoly_weight outermap out_neighbors outofpois pade parabolic_cylinder_d parametric parametric_surface parg parGosper parse_string parse_timedate part part2cont partfrac partition partition_set partpol path_digraph path_graph pathname_directory pathname_name pathname_type pdf_bernoulli pdf_beta pdf_binomial pdf_cauchy pdf_chi2 pdf_continuous_uniform pdf_discrete_uniform pdf_exp pdf_f pdf_gamma pdf_general_finite_discrete pdf_geometric pdf_gumbel pdf_hypergeometric pdf_laplace pdf_logistic pdf_lognormal pdf_negative_binomial pdf_noncentral_chi2 pdf_noncentral_student_t pdf_normal pdf_pareto pdf_poisson pdf_rank_sum pdf_rayleigh pdf_signed_rank pdf_student_t pdf_weibull pearson_skewness permanent permut permutation permutations petersen_graph petrov pickapart picture_equalp picturep piechart piechart_description planar_embedding playback plog plot2d plot3d plotdf ploteq plsquares pochhammer points poisdiff poisexpt poisint poismap poisplus poissimp poissubst poistimes poistrim polar polarform polartorect polar_to_xy poly_add poly_buchberger poly_buchberger_criterion poly_colon_ideal poly_content polydecomp poly_depends_p poly_elimination_ideal poly_exact_divide poly_expand poly_expt poly_gcd polygon poly_grobner poly_grobner_equal poly_grobner_member poly_grobner_subsetp poly_ideal_intersection poly_ideal_polysaturation poly_ideal_polysaturation1 poly_ideal_saturation poly_ideal_saturation1 poly_lcm poly_minimization polymod poly_multiply polynome2ele polynomialp poly_normal_form poly_normalize poly_normalize_list poly_polysaturation_extension poly_primitive_part poly_pseudo_divide poly_reduced_grobner poly_reduction poly_saturation_extension poly_s_polynomial poly_subtract polytocompanion pop postfix potential power_mod powerseries powerset prefix prev_prime primep primes principal_components print printf printfile print_graph printpois printprops prodrac product properties propvars psi psubst ptriangularize pui pui2comp pui2ele pui2polynome pui_direct puireduc push put pv qput qrange qty quad_control quad_qag quad_qagi quad_qagp quad_qags quad_qawc quad_qawf quad_qawo quad_qaws quadrilateral quantile quantile_bernoulli quantile_beta quantile_binomial quantile_cauchy quantile_chi2 quantile_continuous_uniform quantile_discrete_uniform quantile_exp quantile_f quantile_gamma quantile_general_finite_discrete quantile_geometric quantile_gumbel quantile_hypergeometric quantile_laplace quantile_logistic quantile_lognormal quantile_negative_binomial quantile_noncentral_chi2 quantile_noncentral_student_t quantile_normal quantile_pareto quantile_poisson quantile_rayleigh quantile_student_t quantile_weibull quartile_skewness quit qunit quotient racah_v racah_w radcan radius random random_bernoulli random_beta random_binomial random_bipartite_graph random_cauchy random_chi2 random_continuous_uniform random_digraph random_discrete_uniform random_exp random_f random_gamma random_general_finite_discrete random_geometric random_graph random_graph1 random_gumbel random_hypergeometric random_laplace random_logistic random_lognormal random_negative_binomial random_network random_noncentral_chi2 random_noncentral_student_t random_normal random_pareto random_permutation random_poisson random_rayleigh random_regular_graph random_student_t random_tournament random_tree random_weibull range rank rat ratcoef ratdenom ratdiff ratdisrep ratexpand ratinterpol rational rationalize ratnumer ratnump ratp ratsimp ratsubst ratvars ratweight read read_array read_binary_array read_binary_list read_binary_matrix readbyte readchar read_hashed_array readline read_list read_matrix read_nested_list readonly read_xpm real_imagpart_to_conjugate realpart realroots rearray rectangle rectform rectform_log_if_constant recttopolar rediff reduce_consts reduce_order region region_boundaries region_boundaries_plus rem remainder remarray rembox remcomps remcon remcoord remfun remfunction remlet remove remove_constvalue remove_dimensions remove_edge remove_fundamental_dimensions remove_fundamental_units remove_plot_option remove_vertex rempart remrule remsym remvalue rename rename_file reset reset_displays residue resolvante resolvante_alternee1 resolvante_bipartite resolvante_diedrale resolvante_klein resolvante_klein3 resolvante_produit_sym resolvante_unitaire resolvante_vierer rest resultant return reveal reverse revert revert2 rgb2level rhs ricci riemann rinvariant risch rk rmdir rncombine romberg room rootscontract round row rowop rowswap rreduce run_testsuite %s save saving scalarp scaled_bessel_i scaled_bessel_i0 scaled_bessel_i1 scalefactors scanmap scatterplot scatterplot_description scene schur2comp sconcat scopy scsimp scurvature sdowncase sec sech second sequal sequalignore set_alt_display setdifference set_draw_defaults set_edge_weight setelmx setequalp setify setp set_partitions set_plot_option set_prompt set_random_state set_tex_environment set_tex_environment_default setunits setup_autoload set_up_dot_simplifications set_vertex_label seventh sexplode sf sha1sum sha256sum shortest_path shortest_weighted_path show showcomps showratvars sierpinskiale sierpinskimap sign signum similaritytransform simp_inequality simplify_sum simplode simpmetderiv simtran sin sinh sinsert sinvertcase sixth skewness skewness_bernoulli skewness_beta skewness_binomial skewness_chi2 skewness_continuous_uniform skewness_discrete_uniform skewness_exp skewness_f skewness_gamma skewness_general_finite_discrete skewness_geometric skewness_gumbel skewness_hypergeometric skewness_laplace skewness_logistic skewness_lognormal skewness_negative_binomial skewness_noncentral_chi2 skewness_noncentral_student_t skewness_normal skewness_pareto skewness_poisson skewness_rayleigh skewness_student_t skewness_weibull slength smake small_rhombicosidodecahedron_graph small_rhombicuboctahedron_graph smax smin smismatch snowmap snub_cube_graph snub_dodecahedron_graph solve solve_rec solve_rec_rat some somrac sort sparse6_decode sparse6_encode sparse6_export sparse6_import specint spherical spherical_bessel_j spherical_bessel_y spherical_hankel1 spherical_hankel2 spherical_harmonic spherical_to_xyz splice split sposition sprint sqfr sqrt sqrtdenest sremove sremovefirst sreverse ssearch ssort sstatus ssubst ssubstfirst staircase standardize standardize_inverse_trig starplot starplot_description status std std1 std_bernoulli std_beta std_binomial std_chi2 std_continuous_uniform std_discrete_uniform std_exp std_f std_gamma std_general_finite_discrete std_geometric std_gumbel std_hypergeometric std_laplace std_logistic std_lognormal std_negative_binomial std_noncentral_chi2 std_noncentral_student_t std_normal std_pareto std_poisson std_rayleigh std_student_t std_weibull stemplot stirling stirling1 stirling2 strim striml strimr string stringout stringp strong_components struve_h struve_l sublis sublist sublist_indices submatrix subsample subset subsetp subst substinpart subst_parallel substpart substring subvar subvarp sum sumcontract summand_to_rec supcase supcontext symbolp symmdifference symmetricp system take_channel take_inference tan tanh taylor taylorinfo taylorp taylor_simplifier taytorat tcl_output tcontract tellrat tellsimp tellsimpafter tentex tenth test_mean test_means_difference test_normality test_proportion test_proportions_difference test_rank_sum test_sign test_signed_rank test_variance test_variance_ratio tex tex1 tex_display texput %th third throw time timedate timer timer_info tldefint tlimit todd_coxeter toeplitz tokens to_lisp topological_sort to_poly to_poly_solve totaldisrep totalfourier totient tpartpol trace tracematrix trace_options transform_sample translate translate_file transpose treefale tree_reduce treillis treinat triangle triangularize trigexpand trigrat trigreduce trigsimp trunc truncate truncated_cube_graph truncated_dodecahedron_graph truncated_icosahedron_graph truncated_tetrahedron_graph tr_warnings_get tube tutte_graph ueivects uforget ultraspherical underlying_graph undiff union unique uniteigenvectors unitp units unit_step unitvector unorder unsum untellrat untimer untrace uppercasep uricci uriemann uvect vandermonde_matrix var var1 var_bernoulli var_beta var_binomial var_chi2 var_continuous_uniform var_discrete_uniform var_exp var_f var_gamma var_general_finite_discrete var_geometric var_gumbel var_hypergeometric var_laplace var_logistic var_lognormal var_negative_binomial var_noncentral_chi2 var_noncentral_student_t var_normal var_pareto var_poisson var_rayleigh var_student_t var_weibull vector vectorpotential vectorsimp verbify vers vertex_coloring vertex_connectivity vertex_degree vertex_distance vertex_eccentricity vertex_in_degree vertex_out_degree vertices vertices_to_cycle vertices_to_path %w weyl wheel_graph wiener_index wigner_3j wigner_6j wigner_9j with_stdout write_binary_data writebyte write_data writefile wronskian xreduce xthru %y Zeilberger zeroequiv zerofor zeromatrix zeromatrixp zeta zgeev zheev zlange zn_add_table zn_carmichael_lambda zn_characteristic_factors zn_determinant zn_factor_generators zn_invert_by_lu zn_log zn_mult_table absboxchar activecontexts adapt_depth additive adim aform algebraic algepsilon algexact aliases allbut all_dotsimp_denoms allocation allsym alphabetic animation antisymmetric arrays askexp assume_pos assume_pos_pred assumescalar asymbol atomgrad atrig1 axes axis_3d axis_bottom axis_left axis_right axis_top azimuth background background_color backsubst berlefact bernstein_explicit besselexpand beta_args_sum_to_integer beta_expand bftorat bftrunc bindtest border boundaries_array box boxchar breakup %c capping cauchysum cbrange cbtics center cflength cframe_flag cnonmet_flag color color_bar color_bar_tics colorbox columns commutative complex cone context contexts contour contour_levels cosnpiflag ctaypov ctaypt ctayswitch ctayvar ct_coords ctorsion_flag ctrgsimp cube current_let_rule_package cylinder data_file_name debugmode decreasing default_let_rule_package delay dependencies derivabbrev derivsubst detout diagmetric diff dim dimensions dispflag display2d|10 display_format_internal distribute_over doallmxops domain domxexpt domxmxops domxnctimes dontfactor doscmxops doscmxplus dot0nscsimp dot0simp dot1simp dotassoc dotconstrules dotdistrib dotexptsimp dotident dotscrules draw_graph_program draw_realpart edge_color edge_coloring edge_partition edge_type edge_width %edispflag elevation %emode endphi endtheta engineering_format_floats enhanced3d %enumer epsilon_lp erfflag erf_representation errormsg error_size error_syms error_type %e_to_numlog eval even evenfun evflag evfun ev_point expandwrt_denom expintexpand expintrep expon expop exptdispflag exptisolate exptsubst facexpand facsum_combine factlim factorflag factorial_expand factors_only fb feature features file_name file_output_append file_search_demo file_search_lisp file_search_maxima|10 file_search_tests file_search_usage file_type_lisp file_type_maxima|10 fill_color fill_density filled_func fixed_vertices flipflag float2bf font font_size fortindent fortspaces fpprec fpprintprec functions gamma_expand gammalim gdet genindex gensumnum GGFCFMAX GGFINFINITY globalsolve gnuplot_command gnuplot_curve_styles gnuplot_curve_titles gnuplot_default_term_command gnuplot_dumb_term_command gnuplot_file_args gnuplot_file_name gnuplot_out_file gnuplot_pdf_term_command gnuplot_pm3d gnuplot_png_term_command gnuplot_postamble gnuplot_preamble gnuplot_ps_term_command gnuplot_svg_term_command gnuplot_term gnuplot_view_args Gosper_in_Zeilberger gradefs grid grid2d grind halfangles head_angle head_both head_length head_type height hypergeometric_representation %iargs ibase icc1 icc2 icounter idummyx ieqnprint ifb ifc1 ifc2 ifg ifgi ifr iframe_bracket_form ifri igeowedge_flag ikt1 ikt2 imaginary inchar increasing infeval infinity inflag infolists inm inmc1 inmc2 intanalysis integer integervalued integrate_use_rootsof integration_constant integration_constant_counter interpolate_color intfaclim ip_grid ip_grid_in irrational isolate_wrt_times iterations itr julia_parameter %k1 %k2 keepfloat key key_pos kinvariant kt label label_alignment label_orientation labels lassociative lbfgs_ncorrections lbfgs_nfeval_max leftjust legend letrat let_rule_packages lfg lg lhospitallim limsubst linear linear_solver linechar linel|10 linenum line_type linewidth line_width linsolve_params linsolvewarn lispdisp listarith listconstvars listdummyvars lmxchar load_pathname loadprint logabs logarc logcb logconcoeffp logexpand lognegint logsimp logx logx_secondary logy logy_secondary logz lriem m1pbranch macroexpansion macros mainvar manual_demo maperror mapprint matrix_element_add matrix_element_mult matrix_element_transpose maxapplydepth maxapplyheight maxima_tempdir|10 maxima_userdir|10 maxnegex MAX_ORD maxposex maxpsifracdenom maxpsifracnum maxpsinegint maxpsiposint maxtayorder mesh_lines_color method mod_big_prime mode_check_errorp mode_checkp mode_check_warnp mod_test mod_threshold modular_linear_solver modulus multiplicative multiplicities myoptions nary negdistrib negsumdispflag newline newtonepsilon newtonmaxiter nextlayerfactor niceindicespref nm nmc noeval nolabels nonegative_lp noninteger nonscalar noun noundisp nouns np npi nticks ntrig numer numer_pbranch obase odd oddfun opacity opproperties opsubst optimprefix optionset orientation origin orthopoly_returns_intervals outative outchar packagefile palette partswitch pdf_file pfeformat phiresolution %piargs piece pivot_count_sx pivot_max_sx plot_format plot_options plot_realpart png_file pochhammer_max_index points pointsize point_size points_joined point_type poislim poisson poly_coefficient_ring poly_elimination_order polyfactor poly_grobner_algorithm poly_grobner_debug poly_monomial_order poly_primary_elimination_order poly_return_term_list poly_secondary_elimination_order poly_top_reduction_only posfun position powerdisp pred prederror primep_number_of_tests product_use_gamma program programmode promote_float_to_bigfloat prompt proportional_axes props psexpand ps_file radexpand radius radsubstflag rassociative ratalgdenom ratchristof ratdenomdivide rateinstein ratepsilon ratfac rational ratmx ratprint ratriemann ratsimpexpons ratvarswitch ratweights ratweyl ratwtlvl real realonly redraw refcheck resolution restart resultant ric riem rmxchar %rnum_list rombergabs rombergit rombergmin rombergtol rootsconmode rootsepsilon run_viewer same_xy same_xyz savedef savefactors scalar scalarmatrixp scale scale_lp setcheck setcheckbreak setval show_edge_color show_edges show_edge_type show_edge_width show_id show_label showtime show_vertex_color show_vertex_size show_vertex_type show_vertices show_weight simp simplified_output simplify_products simpproduct simpsum sinnpiflag solvedecomposes solveexplicit solvefactors solvenullwarn solveradcan solvetrigwarn space sparse sphere spring_embedding_depth sqrtdispflag stardisp startphi starttheta stats_numer stringdisp structures style sublis_apply_lambda subnumsimp sumexpand sumsplitfact surface surface_hide svg_file symmetric tab taylordepth taylor_logexpand taylor_order_coefficients taylor_truncate_polynomials tensorkill terminal testsuite_files thetaresolution timer_devalue title tlimswitch tr track transcompile transform transform_xy translate_fast_arrays transparent transrun tr_array_as_ref tr_bound_function_applyp tr_file_tty_messagesp tr_float_can_branch_complex tr_function_call_default trigexpandplus trigexpandtimes triginverses trigsign trivial_solutions tr_numer tr_optimize_max_loop tr_semicompile tr_state_vars tr_warn_bad_function_calls tr_warn_fexpr tr_warn_meval tr_warn_mode tr_warn_undeclared tr_warn_undefined_variable tstep ttyoff tube_extremes ufg ug %unitexpand unit_vectors uric uriem use_fast_arrays user_preamble usersetunits values vect_cross verbose vertex_color vertex_coloring vertex_partition vertex_size vertex_type view warnings weyl width windowname windowtitle wired_surface wireframe xaxis xaxis_color xaxis_secondary xaxis_type xaxis_width xlabel xlabel_secondary xlength xrange xrange_secondary xtics xtics_axis xtics_rotate xtics_rotate_secondary xtics_secondary xtics_secondary_axis xu_grid x_voxel xy_file xyplane xy_scale yaxis yaxis_color yaxis_secondary yaxis_type yaxis_width ylabel ylabel_secondary ylength yrange yrange_secondary ytics ytics_axis ytics_rotate ytics_rotate_secondary ytics_secondary ytics_secondary_axis yv_grid y_voxel yx_ratio zaxis zaxis_color zaxis_type zaxis_width zeroa zerob zerobern zeta%pi zlabel zlabel_rotate zlength zmin zn_primroot_limit zn_primroot_pretest",i="_ __ %|0 %%|0";return{l:"[A-Za-z_%][0-9A-Za-z_%]*",k:{keyword:t,literal:a,built_in:r,symbol:i},c:[{cN:"comment",b:"/\\*",e:"\\*/",c:["self"]},e.QSM,{cN:"number",r:0,v:[{b:"\\b(\\d+|\\d+\\.|\\.\\d+|\\d+\\.\\d+)[Ee][-+]?\\d+\\b"},{b:"\\b(\\d+|\\d+\\.|\\.\\d+|\\d+\\.\\d+)[Bb][-+]?\\d+\\b",r:10},{b:"\\b(\\.\\d+|\\d+\\.\\d+)\\b"},{b:"\\b(\\d+|0[0-9A-Za-z]+)\\.?\\b"}]}],i:/@/}});hljs.registerLanguage("fsharp",function(e){var t={b:"<",e:">",c:[e.inherit(e.TM,{b:/'[a-zA-Z0-9_]+/})]};return{aliases:["fs"],k:"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield",i:/\/\*/,c:[{cN:"keyword",b:/\b(yield|return|let|do)!/},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},e.C("\\(\\*","\\*\\)"),{cN:"class",bK:"type",e:"\\(|=|$",eE:!0,c:[e.UTM,t]},{cN:"meta",b:"\\[<",e:">\\]",r:10},{cN:"symbol",b:"\\B('[A-Za-z])\\b",c:[e.BE]},e.CLCM,e.inherit(e.QSM,{i:null}),e.CNM]}});hljs.registerLanguage("processing",function(e){return{k:{keyword:"BufferedReader PVector PFont PImage PGraphics HashMap boolean byte char color double float int long String Array FloatDict FloatList IntDict IntList JSONArray JSONObject Object StringDict StringList Table TableRow XML false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private",literal:"P2D P3D HALF_PI PI QUARTER_PI TAU TWO_PI",title:"setup draw",built_in:"displayHeight displayWidth mouseY mouseX mousePressed pmouseX pmouseY key keyCode pixels focused frameCount frameRate height width size createGraphics beginDraw createShape loadShape PShape arc ellipse line point quad rect triangle bezier bezierDetail bezierPoint bezierTangent curve curveDetail curvePoint curveTangent curveTightness shape shapeMode beginContour beginShape bezierVertex curveVertex endContour endShape quadraticVertex vertex ellipseMode noSmooth rectMode smooth strokeCap strokeJoin strokeWeight mouseClicked mouseDragged mouseMoved mousePressed mouseReleased mouseWheel keyPressed keyPressedkeyReleased keyTyped print println save saveFrame day hour millis minute month second year background clear colorMode fill noFill noStroke stroke alpha blue brightness color green hue lerpColor red saturation modelX modelY modelZ screenX screenY screenZ ambient emissive shininess specular add createImage beginCamera camera endCamera frustum ortho perspective printCamera printProjection cursor frameRate noCursor exit loop noLoop popStyle pushStyle redraw binary boolean byte char float hex int str unbinary unhex join match matchAll nf nfc nfp nfs split splitTokens trim append arrayCopy concat expand reverse shorten sort splice subset box sphere sphereDetail createInput createReader loadBytes loadJSONArray loadJSONObject loadStrings loadTable loadXML open parseXML saveTable selectFolder selectInput beginRaw beginRecord createOutput createWriter endRaw endRecord PrintWritersaveBytes saveJSONArray saveJSONObject saveStream saveStrings saveXML selectOutput popMatrix printMatrix pushMatrix resetMatrix rotate rotateX rotateY rotateZ scale shearX shearY translate ambientLight directionalLight lightFalloff lights lightSpecular noLights normal pointLight spotLight image imageMode loadImage noTint requestImage tint texture textureMode textureWrap blend copy filter get loadPixels set updatePixels blendMode loadShader PShaderresetShader shader createFont loadFont text textFont textAlign textLeading textMode textSize textWidth textAscent textDescent abs ceil constrain dist exp floor lerp log mag map max min norm pow round sq sqrt acos asin atan atan2 cos degrees radians sin tan noise noiseDetail noiseSeed random randomGaussian randomSeed"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.CNM]}});hljs.registerLanguage("julia",function(e){var r={keyword:"in abstract baremodule begin bitstype break catch ccall const continue do else elseif end export finally for function global if immutable import importall let local macro module quote return try type typealias using while",literal:"true false ARGS CPU_CORES C_NULL DL_LOAD_PATH DevNull ENDIAN_BOM ENV I|0 Inf Inf16 Inf32 InsertionSort JULIA_HOME LOAD_PATH MS_ASYNC MS_INVALIDATE MS_SYNC MergeSort NaN NaN16 NaN32 OS_NAME QuickSort RTLD_DEEPBIND RTLD_FIRST RTLD_GLOBAL RTLD_LAZY RTLD_LOCAL RTLD_NODELETE RTLD_NOLOAD RTLD_NOW RoundDown RoundFromZero RoundNearest RoundToZero RoundUp STDERR STDIN STDOUT VERSION WORD_SIZE catalan cglobal e|0 eu|0 eulergamma golden im nothing pi γ π φ Inf64 NaN64 RoundNearestTiesAway RoundNearestTiesUp ",built_in:"ANY ASCIIString AbstractArray AbstractRNG AbstractSparseArray Any ArgumentError Array Associative Base64Pipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError Box CFILE Cchar Cdouble Cfloat Char CharString Cint Clong Clonglong ClusterManager Cmd Coff_t Colon Complex Complex128 Complex32 Complex64 Condition Cptrdiff_t Cshort Csize_t Cssize_t Cuchar Cuint Culong Culonglong Cushort Cwchar_t DArray DataType DenseArray Diagonal Dict DimensionMismatch DirectIndexString Display DivideError DomainError EOFError EachLine Enumerate ErrorException Exception Expr Factorization FileMonitor FileOffset Filter Float16 Float32 Float64 FloatRange FloatingPoint Function GetfieldNode GotoNode Hermitian IO IOBuffer IOStream IPv4 IPv6 InexactError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException IntrinsicFunction KeyError LabelNode LambdaStaticData LineNumberNode LoadError LocalProcess MIME MathConst MemoryError MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode Nothing Number ObjectIdDict OrdinalRange OverflowError ParseError PollingFileWatcher ProcessExitedException ProcessGroup Ptr QuoteNode Range Range1 Ranges Rational RawFD Real Regex RegexMatch RemoteRef RepString RevString RopeString RoundingMode Set SharedArray Signed SparseMatrixCSC StackOverflowError Stat StatStruct StepRange String SubArray SubString SymTridiagonal Symbol SymbolNode Symmetric SystemError Task TextDisplay Timer TmStruct TopNode Triangular Tridiagonal Type TypeConstructor TypeError TypeName TypeVar UTF16String UTF32String UTF8String UdpSocket Uint Uint128 Uint16 Uint32 Uint64 Uint8 UndefRefError UndefVarError UniformScaling UnionType UnitRange Unsigned Vararg VersionNumber WString WeakKeyDict WeakRef Woodbury Zip AbstractChannel AbstractFloat AbstractString AssertionError Base64DecodePipe Base64EncodePipe BufferStream CapturedException CartesianIndex CartesianRange Channel Cintmax_t CompositeException Cstring Cuintmax_t Cwstring Date DateTime Dims Enum GenSym GlobalRef HTML InitError InvalidStateException Irrational LinSpace LowerTriangular NullException Nullable OutOfMemoryError Pair PartialQuickSort Pipe RandomDevice ReadOnlyMemoryError ReentrantLock Ref RemoteException SegmentationFault SerializationState SimpleVector TCPSocket Text Tuple UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UnicodeError Union UpperTriangular Val Void WorkerConfig AbstractMatrix AbstractSparseMatrix AbstractSparseVector AbstractVecOrMat AbstractVector DenseMatrix DenseVecOrMat DenseVector Matrix SharedMatrix SharedVector StridedArray StridedMatrix StridedVecOrMat StridedVector VecOrMat Vector "},t="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",a={l:t,k:r,i:/<\//},n={cN:"type",b:/::/},o={cN:"type",b:/<:/},i={cN:"number",b:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,r:0},l={cN:"string",b:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},c={cN:"subst",b:/\$\(/,e:/\)/,k:r},s={cN:"variable",b:"\\$"+t},d={cN:"string",c:[e.BE,c,s],v:[{b:/\w*"""/,e:/"""\w*/,r:10},{b:/\w*"/,e:/"\w*/}]},S={cN:"string",c:[e.BE,c,s],b:"`",e:"`"},u={cN:"meta",b:"@"+t},g={cN:"comment",v:[{b:"#=",e:"=#",r:10},{b:"#",e:"$"}]};return a.c=[i,l,n,o,d,S,u,g,e.HCM],c.c=a.c,a});hljs.registerLanguage("fix",function(u){return{c:[{b:/[^\u2401\u0001]+/,e:/[\u2401\u0001]/,eE:!0,rB:!0,rE:!1,c:[{b:/([^\u2401\u0001=]+)/,e:/=([^\u2401\u0001=]+)/,rE:!0,rB:!1,cN:"attr"},{b:/=/,e:/([\u2401\u0001])/,eE:!0,eB:!0,cN:"string"}]}],cI:!0}});hljs.registerLanguage("awk",function(e){var r={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},b="BEGIN END if else while do for in break continue delete next nextfile function func exit|10",n={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,r:10},{b:/(u|b)?r?"""/,e:/"""/,r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},e.ASM,e.QSM]};return{k:{keyword:b},c:[r,n,e.RM,e.HCM,e.NM]}});hljs.registerLanguage("puppet",function(e){var s={keyword:"and case default else elsif false if in import enherits node or true undef unless main settings $string ",literal:"alias audit before loglevel noop require subscribe tag owner ensure group mode name|0 changes context force incl lens load_path onlyif provider returns root show_diff type_check en_address ip_address realname command environment hour monute month monthday special target weekday creates cwd ogoutput refresh refreshonly tries try_sleep umask backup checksum content ctime force ignore links mtime purge recurse recurselimit replace selinux_ignore_defaults selrange selrole seltype seluser source souirce_permissions sourceselect validate_cmd validate_replacement allowdupe attribute_membership auth_membership forcelocal gid ia_load_module members system host_aliases ip allowed_trunk_vlans description device_url duplex encapsulation etherchannel native_vlan speed principals allow_root auth_class auth_type authenticate_user k_of_n mechanisms rule session_owner shared options device fstype enable hasrestart directory present absent link atboot blockdevice device dump pass remounts poller_tag use message withpath adminfile allow_virtual allowcdrom category configfiles flavor install_options instance package_settings platform responsefile status uninstall_options vendor unless_system_user unless_uid binary control flags hasstatus manifest pattern restart running start stop allowdupe auths expiry gid groups home iterations key_membership keys managehome membership password password_max_age password_min_age profile_membership profiles project purge_ssh_keys role_membership roles salt shell uid baseurl cost descr enabled enablegroups exclude failovermethod gpgcheck gpgkey http_caching include includepkgs keepalive metadata_expire metalink mirrorlist priority protect proxy proxy_password proxy_username repo_gpgcheck s3_enabled skip_if_unavailable sslcacert sslclientcert sslclientkey sslverify mounted",built_in:"architecture augeasversion blockdevices boardmanufacturer boardproductname boardserialnumber cfkey dhcp_servers domain ec2_ ec2_userdata facterversion filesystems ldom fqdn gid hardwareisa hardwaremodel hostname id|0 interfaces ipaddress ipaddress_ ipaddress6 ipaddress6_ iphostnumber is_virtual kernel kernelmajversion kernelrelease kernelversion kernelrelease kernelversion lsbdistcodename lsbdistdescription lsbdistid lsbdistrelease lsbmajdistrelease lsbminordistrelease lsbrelease macaddress macaddress_ macosx_buildversion macosx_productname macosx_productversion macosx_productverson_major macosx_productversion_minor manufacturer memoryfree memorysize netmask metmask_ network_ operatingsystem operatingsystemmajrelease operatingsystemrelease osfamily partitions path physicalprocessorcount processor processorcount productname ps puppetversion rubysitedir rubyversion selinux selinux_config_mode selinux_config_policy selinux_current_mode selinux_current_mode selinux_enforced selinux_policyversion serialnumber sp_ sshdsakey sshecdsakey sshrsakey swapencrypted swapfree swapsize timezone type uniqueid uptime uptime_days uptime_hours uptime_seconds uuid virtual vlans xendomains zfs_version zonenae zones zpool_version"},r=e.C("#","$"),a="([A-Za-z_]|::)(\\w|::)*",i=e.inherit(e.TM,{b:a}),o={cN:"variable",b:"\\$"+a},t={cN:"string",c:[e.BE,o],v:[{b:/'/,e:/'/},{b:/"/,e:/"/}]};return{aliases:["pp"],c:[r,o,t,{bK:"class",e:"\\{|;",i:/=/,c:[i,r]},{bK:"define",e:/\{/,c:[{cN:"section",b:e.IR,endsParent:!0}]},{b:e.IR+"\\s+\\{",rB:!0,e:/\S/,c:[{cN:"keyword",b:e.IR},{b:/\{/,e:/\}/,k:s,r:0,c:[t,r,{b:"[a-zA-Z_]+\\s*=>",rB:!0,e:"=>",c:[{cN:"attr",b:e.IR}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},o]}],r:0}]}});hljs.registerLanguage("cal",function(e){var r="div mod in and or not xor asserterror begin case do downto else end exit for if of repeat then to until while with var",t="false true",c=[e.CLCM,e.C(/\{/,/\}/,{r:0}),e.C(/\(\*/,/\*\)/,{r:10})],n={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]},o={cN:"string",b:/(#\d+)+/},a={cN:"number",b:"\\b\\d+(\\.\\d+)?(DT|D|T)",r:0},i={cN:"string",b:'"',e:'"'},d={cN:"function",bK:"procedure",e:/[:;]/,k:"procedure|10",c:[e.TM,{cN:"params",b:/\(/,e:/\)/,k:r,c:[n,o]}].concat(c)},s={cN:"class",b:"OBJECT (Table|Form|Report|Dataport|Codeunit|XMLport|MenuSuite|Page|Query) (\\d+) ([^\\r\\n]+)",rB:!0,c:[e.TM,d]};return{cI:!0,k:{keyword:r,literal:t},i:/\/\*/,c:[n,o,a,i,e.NM,s,d]}});hljs.registerLanguage("autoit",function(e){var t="ByRef Case Const ContinueCase ContinueLoop Default Dim Do Else ElseIf EndFunc EndIf EndSelect EndSwitch EndWith Enum Exit ExitLoop For Func Global If In Local Next ReDim Return Select Static Step Switch Then To Until Volatile WEnd While With",r="True False And Null Not Or",i="Abs ACos AdlibRegister AdlibUnRegister Asc AscW ASin Assign ATan AutoItSetOption AutoItWinGetTitle AutoItWinSetTitle Beep Binary BinaryLen BinaryMid BinaryToString BitAND BitNOT BitOR BitRotate BitShift BitXOR BlockInput Break Call CDTray Ceiling Chr ChrW ClipGet ClipPut ConsoleRead ConsoleWrite ConsoleWriteError ControlClick ControlCommand ControlDisable ControlEnable ControlFocus ControlGetFocus ControlGetHandle ControlGetPos ControlGetText ControlHide ControlListView ControlMove ControlSend ControlSetText ControlShow ControlTreeView Cos Dec DirCopy DirCreate DirGetSize DirMove DirRemove DllCall DllCallAddress DllCallbackFree DllCallbackGetPtr DllCallbackRegister DllClose DllOpen DllStructCreate DllStructGetData DllStructGetPtr DllStructGetSize DllStructSetData DriveGetDrive DriveGetFileSystem DriveGetLabel DriveGetSerial DriveGetType DriveMapAdd DriveMapDel DriveMapGet DriveSetLabel DriveSpaceFree DriveSpaceTotal DriveStatus EnvGet EnvSet EnvUpdate Eval Execute Exp FileChangeDir FileClose FileCopy FileCreateNTFSLink FileCreateShortcut FileDelete FileExists FileFindFirstFile FileFindNextFile FileFlush FileGetAttrib FileGetEncoding FileGetLongName FileGetPos FileGetShortcut FileGetShortName FileGetSize FileGetTime FileGetVersion FileInstall FileMove FileOpen FileOpenDialog FileRead FileReadLine FileReadToArray FileRecycle FileRecycleEmpty FileSaveDialog FileSelectFolder FileSetAttrib FileSetEnd FileSetPos FileSetTime FileWrite FileWriteLine Floor FtpSetProxy FuncName GUICreate GUICtrlCreateAvi GUICtrlCreateButton GUICtrlCreateCheckbox GUICtrlCreateCombo GUICtrlCreateContextMenu GUICtrlCreateDate GUICtrlCreateDummy GUICtrlCreateEdit GUICtrlCreateGraphic GUICtrlCreateGroup GUICtrlCreateIcon GUICtrlCreateInput GUICtrlCreateLabel GUICtrlCreateList GUICtrlCreateListView GUICtrlCreateListViewItem GUICtrlCreateMenu GUICtrlCreateMenuItem GUICtrlCreateMonthCal GUICtrlCreateObj GUICtrlCreatePic GUICtrlCreateProgress GUICtrlCreateRadio GUICtrlCreateSlider GUICtrlCreateTab GUICtrlCreateTabItem GUICtrlCreateTreeView GUICtrlCreateTreeViewItem GUICtrlCreateUpdown GUICtrlDelete GUICtrlGetHandle GUICtrlGetState GUICtrlRead GUICtrlRecvMsg GUICtrlRegisterListViewSort GUICtrlSendMsg GUICtrlSendToDummy GUICtrlSetBkColor GUICtrlSetColor GUICtrlSetCursor GUICtrlSetData GUICtrlSetDefBkColor GUICtrlSetDefColor GUICtrlSetFont GUICtrlSetGraphic GUICtrlSetImage GUICtrlSetLimit GUICtrlSetOnEvent GUICtrlSetPos GUICtrlSetResizing GUICtrlSetState GUICtrlSetStyle GUICtrlSetTip GUIDelete GUIGetCursorInfo GUIGetMsg GUIGetStyle GUIRegisterMsg GUISetAccelerators GUISetBkColor GUISetCoord GUISetCursor GUISetFont GUISetHelp GUISetIcon GUISetOnEvent GUISetState GUISetStyle GUIStartGroup GUISwitch Hex HotKeySet HttpSetProxy HttpSetUserAgent HWnd InetClose InetGet InetGetInfo InetGetSize InetRead IniDelete IniRead IniReadSection IniReadSectionNames IniRenameSection IniWrite IniWriteSection InputBox Int IsAdmin IsArray IsBinary IsBool IsDeclared IsDllStruct IsFloat IsFunc IsHWnd IsInt IsKeyword IsNumber IsObj IsPtr IsString Log MemGetStats Mod MouseClick MouseClickDrag MouseDown MouseGetCursor MouseGetPos MouseMove MouseUp MouseWheel MsgBox Number ObjCreate ObjCreateInterface ObjEvent ObjGet ObjName OnAutoItExitRegister OnAutoItExitUnRegister Ping PixelChecksum PixelGetColor PixelSearch ProcessClose ProcessExists ProcessGetStats ProcessList ProcessSetPriority ProcessWait ProcessWaitClose ProgressOff ProgressOn ProgressSet Ptr Random RegDelete RegEnumKey RegEnumVal RegRead RegWrite Round Run RunAs RunAsWait RunWait Send SendKeepActive SetError SetExtended ShellExecute ShellExecuteWait Shutdown Sin Sleep SoundPlay SoundSetWaveVolume SplashImageOn SplashOff SplashTextOn Sqrt SRandom StatusbarGetText StderrRead StdinWrite StdioClose StdoutRead String StringAddCR StringCompare StringFormat StringFromASCIIArray StringInStr StringIsAlNum StringIsAlpha StringIsASCII StringIsDigit StringIsFloat StringIsInt StringIsLower StringIsSpace StringIsUpper StringIsXDigit StringLeft StringLen StringLower StringMid StringRegExp StringRegExpReplace StringReplace StringReverse StringRight StringSplit StringStripCR StringStripWS StringToASCIIArray StringToBinary StringTrimLeft StringTrimRight StringUpper Tan TCPAccept TCPCloseSocket TCPConnect TCPListen TCPNameToIP TCPRecv TCPSend TCPShutdown, UDPShutdown TCPStartup, UDPStartup TimerDiff TimerInit ToolTip TrayCreateItem TrayCreateMenu TrayGetMsg TrayItemDelete TrayItemGetHandle TrayItemGetState TrayItemGetText TrayItemSetOnEvent TrayItemSetState TrayItemSetText TraySetClick TraySetIcon TraySetOnEvent TraySetPauseIcon TraySetState TraySetToolTip TrayTip UBound UDPBind UDPCloseSocket UDPOpen UDPRecv UDPSend VarGetType WinActivate WinActive WinClose WinExists WinFlash WinGetCaretPos WinGetClassList WinGetClientSize WinGetHandle WinGetPos WinGetProcess WinGetState WinGetText WinGetTitle WinKill WinList WinMenuSelectItem WinMinimizeAll WinMinimizeAllUndo WinMove WinSetOnTop WinSetState WinSetTitle WinSetTrans WinWait",l={v:[e.C(";","$",{r:0}),e.C("#cs","#ce"),e.C("#comments-start","#comments-end")]},n={b:"\\$[A-z0-9_]+"},o={cN:"string",v:[{b:/"/,e:/"/,c:[{b:/""/,r:0}]},{b:/'/,e:/'/,c:[{b:/''/,r:0}]}]},a={v:[e.BNM,e.CNM]},S={cN:"meta",b:"#",e:"$",k:{"meta-keyword":"comments include include-once NoTrayIcon OnAutoItStartRegister pragma compile RequireAdmin"},c:[{b:/\\\n/,r:0},{bK:"include",k:{"meta-keyword":"include"},e:"$",c:[o,{cN:"meta-string",v:[{b:"<",e:">"},{b:/"/,e:/"/,c:[{b:/""/,r:0}]},{b:/'/,e:/'/,c:[{b:/''/,r:0}]}]}]},o,l]},C={cN:"symbol",b:"@[A-z0-9_]+"},s={cN:"function",bK:"Func",e:"$",i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:[n,o,a]}]};return{cI:!0,i:/\/\*/,k:{keyword:t,built_in:i,literal:r},c:[l,n,o,a,S,C,s]}});hljs.registerLanguage("mel",function(e){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:"",rB:!0,i:"\\(|#|//|/\\*|\\\\|:|;",c:[h,e.inherit(e.TM,{b:r})],starts:{e:";|\\.",k:b,c:u}},i,{b:"^-",e:"\\.",r:0,eE:!0,rB:!0,l:"-"+e.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[h]},n,e.QSM,l,t,f,o,{b:/\.$/}]}});hljs.registerLanguage("glsl",function(e){return{k:{keyword:"break continue discard do else for if return whileattribute binding buffer ccw centroid centroid varying coherent column_major const cw depth_any depth_greater depth_less depth_unchanged early_fragment_tests equal_spacing flat fractional_even_spacing fractional_odd_spacing highp in index inout invariant invocations isolines layout line_strip lines lines_adjacency local_size_x local_size_y local_size_z location lowp max_vertices mediump noperspective offset origin_upper_left out packed patch pixel_center_integer point_mode points precise precision quads r11f_g11f_b10f r16 r16_snorm r16f r16i r16ui r32f r32i r32ui r8 r8_snorm r8i r8ui readonly restrict rg16 rg16_snorm rg16f rg16i rg16ui rg32f rg32i rg32ui rg8 rg8_snorm rg8i rg8ui rgb10_a2 rgb10_a2ui rgba16 rgba16_snorm rgba16f rgba16i rgba16ui rgba32f rgba32i rgba32ui rgba8 rgba8_snorm rgba8i rgba8ui row_major sample shared smooth std140 std430 stream triangle_strip triangles triangles_adjacency uniform varying vertices volatile writeonly",type:"atomic_uint bool bvec2 bvec3 bvec4 dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 double dvec2 dvec3 dvec4 float iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBufferiimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray int isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow image1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D samplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 vec2 vec3 vec4 void",built_in:"gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxComputeAtomicCounterBuffers gl_MaxComputeAtomicCounters gl_MaxComputeImageUniforms gl_MaxComputeTextureImageUnits gl_MaxComputeUniformComponents gl_MaxComputeWorkGroupCount gl_MaxComputeWorkGroupSize gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentInputVectors gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexOutputVectors gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffset gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_GlobalInvocationID gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_LocalInvocationID gl_LocalInvocationIndex gl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_NumSamples gl_NumWorkGroups gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrix gl_TextureMatrixInverse gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_WorkGroupID gl_WorkGroupSize gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicAdd atomicAnd atomicCompSwap atomicCounter atomicCounterDecrement atomicCounterIncrement atomicExchange atomicMax atomicMin atomicOr atomicXor barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual groupMemoryBarrier imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageSize imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier memoryBarrierAtomicCounter memoryBarrierBuffer memoryBarrierImage memoryBarrierShared min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLevels textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow",literal:"true false"},i:'"',c:[e.CLCM,e.CBCM,e.CNM,{cN:"meta",b:"#",e:"$"}]}});hljs.registerLanguage("roboconf",function(a){var e="[a-zA-Z-_][^\\n{]+\\{",n={cN:"attribute",b:/[a-zA-Z-_]+/,e:/\s*:/,eE:!0,starts:{e:";",r:0,c:[{cN:"variable",b:/\.[a-zA-Z-_]+/},{cN:"keyword",b:/\(optional\)/}]}};return{aliases:["graph","instances"],cI:!0,k:"import",c:[{b:"^facet "+e,e:"}",k:"facet",c:[n,a.HCM]},{b:"^\\s*instance of "+e,e:"}",k:"name count channels instance-data instance-state instance of",i:/\S/,c:["self",n,a.HCM]},{b:"^"+e,e:"}",c:[n,a.HCM]},a.HCM]}});hljs.registerLanguage("monkey",function(e){var n={cN:"number",r:0,v:[{b:"[$][a-fA-F0-9]+"},e.NM]};return{cI:!0,k:{keyword:"public private property continue exit extern new try catch eachin not abstract final select case default const local global field end if then else elseif endif while wend repeat until forever for to step next return module inline throw import",built_in:"DebugLog DebugStop Error Print ACos ACosr ASin ASinr ATan ATan2 ATan2r ATanr Abs Abs Ceil Clamp Clamp Cos Cosr Exp Floor Log Max Max Min Min Pow Sgn Sgn Sin Sinr Sqrt Tan Tanr Seed PI HALFPI TWOPI",literal:"true false null and or shl shr mod"},i:/\/\*/,c:[e.C("#rem","#end"),e.C("'","$",{r:0}),{cN:"function",bK:"function method",e:"[(=:]|$",i:/\n/,c:[e.UTM]},{cN:"class",bK:"class interface",e:"$",c:[{bK:"extends implements"},e.UTM]},{cN:"built_in",b:"\\b(self|super)\\b"},{cN:"meta",b:"\\s*#",e:"$",k:{"meta-keyword":"if else elseif endif end then"}},{cN:"meta",b:"^\\s*strict\\b"},{bK:"alias",e:"=",c:[e.UTM]},e.QSM,n]}});hljs.registerLanguage("coq",function(e){return{k:{keyword:"_ as at cofix else end exists exists2 fix for forall fun if IF in let match mod Prop return Set then Type using where with Abort About Add Admit Admitted All Arguments Assumptions Axiom Back BackTo Backtrack Bind Blacklist Canonical Cd Check Class Classes Close Coercion Coercions CoFixpoint CoInductive Collection Combined Compute Conjecture Conjectures Constant constr Constraint Constructors Context Corollary CreateHintDb Cut Declare Defined Definition Delimit Dependencies DependentDerive Drop eauto End Equality Eval Example Existential Existentials Existing Export exporting Extern Extract Extraction Fact Field Fields File Fixpoint Focus for From Function Functional Generalizable Global Goal Grab Grammar Graph Guarded Heap Hint HintDb Hints Hypotheses Hypothesis ident Identity If Immediate Implicit Import Include Inductive Infix Info Initial Inline Inspect Instance Instances Intro Intros Inversion Inversion_clear Language Left Lemma Let Libraries Library Load LoadPath Local Locate Ltac ML Mode Module Modules Monomorphic Morphism Next NoInline Notation Obligation Obligations Opaque Open Optimize Options Parameter Parameters Parametric Path Paths pattern Polymorphic Preterm Print Printing Program Projections Proof Proposition Pwd Qed Quit Rec Record Recursive Redirect Relation Remark Remove Require Reserved Reset Resolve Restart Rewrite Right Ring Rings Save Scheme Scope Scopes Script Search SearchAbout SearchHead SearchPattern SearchRewrite Section Separate Set Setoid Show Solve Sorted Step Strategies Strategy Structure SubClass Table Tables Tactic Term Test Theorem Time Timeout Transparent Type Typeclasses Types Undelimit Undo Unfocus Unfocused Unfold Universe Universes Unset Unshelve using Variable Variables Variant Verbose Visibility where with",built_in:"abstract absurd admit after apply as assert assumption at auto autorewrite autounfold before bottom btauto by case case_eq cbn cbv change classical_left classical_right clear clearbody cofix compare compute congruence constr_eq constructor contradict contradiction cut cutrewrite cycle decide decompose dependent destruct destruction dintuition discriminate discrR do double dtauto eapply eassumption eauto ecase econstructor edestruct ediscriminate eelim eexact eexists einduction einjection eleft elim elimtype enough equality erewrite eright esimplify_eq esplit evar exact exactly_once exfalso exists f_equal fail field field_simplify field_simplify_eq first firstorder fix fold fourier functional generalize generalizing gfail give_up has_evar hnf idtac in induction injection instantiate intro intro_pattern intros intuition inversion inversion_clear is_evar is_var lapply lazy left lia lra move native_compute nia nsatz omega once pattern pose progress proof psatz quote record red refine reflexivity remember rename repeat replace revert revgoals rewrite rewrite_strat right ring ring_simplify rtauto set setoid_reflexivity setoid_replace setoid_rewrite setoid_symmetry setoid_transitivity shelve shelve_unifiable simpl simple simplify_eq solve specialize split split_Rabs split_Rmult stepl stepr subst sum swap symmetry tactic tauto time timeout top transitivity trivial try tryif unfold unify until using vm_compute with"},c:[e.QSM,e.C("\\(\\*","\\*\\)"),e.CNM,{cN:"type",eB:!0,b:"\\|\\s*",e:"\\w+"},{b:/[-=]>/}]}});hljs.registerLanguage("mojolicious",function(e){return{sL:"xml",c:[{cN:"meta",b:"^__(END|DATA)__$"},{b:"^\\s*%{1,2}={0,2}",e:"$",sL:"perl"},{b:"<%{1,2}={0,2}",e:"={0,1}%>",sL:"perl",eB:!0,eE:!0}]}});hljs.registerLanguage("rsl",function(e){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(s)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:s.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[i,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[i]},i]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("dos",function(e){var r=e.C(/^\s*@?rem\b/,/$/,{r:10}),t={cN:"symbol",b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)",r:0};return{aliases:["bat","cmd"],cI:!0,i:/\/\*/,k:{keyword:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",built_in:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux shift cd dir echo setlocal endlocal set pause copy append assoc at attrib break cacls cd chcp chdir chkdsk chkntfs cls cmd color comp compact convert date dir diskcomp diskcopy doskey erase fs find findstr format ftype graftabl help keyb label md mkdir mode more move path pause print popd pushd promt rd recover rem rename replace restore rmdir shiftsort start subst time title tree type ver verify vol ping net ipconfig taskkill xcopy ren del"},c:[{cN:"variable",b:/%%[^ ]|%[^ ]+?%|![^ ]+?!/},{cN:"function",b:t.b,e:"goto:eof",c:[e.inherit(e.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),r]},{cN:"number",b:"\\b\\d+",r:0},r]}});hljs.registerLanguage("lua",function(e){var t="\\[=*\\[",a="\\]=*\\]",r={b:t,e:a,c:["self"]},n=[e.C("--(?!"+t+")","$"),e.C("--"+t,a,{c:[r],r:10})];return{l:e.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:n.concat([{cN:"function",bK:"function",e:"\\)",c:[e.inherit(e.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{cN:"params",b:"\\(",eW:!0,c:n}].concat(n)},e.CNM,e.ASM,e.QSM,{cN:"string",b:t,e:a,c:[r],r:5}])}});hljs.registerLanguage("brainfuck",function(r){var n={cN:"literal",b:"[\\+\\-]",r:0};return{aliases:["bf"],c:[r.C("[^\\[\\]\\.,\\+\\-<> \r\n]","[\\[\\]\\.,\\+\\-<> \r\n]",{rE:!0,r:0}),{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]",r:0},{b:/\+\+|\-\-/,rB:!0,c:[n]},n]}});hljs.registerLanguage("oxygene",function(e){var r="abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained",t=e.C("{","}",{r:0}),a=e.C("\\(\\*","\\*\\)",{r:10}),n={cN:"string",b:"'",e:"'",c:[{b:"''"}]},o={cN:"string",b:"(#\\d+)+"},i={cN:"function",bK:"function constructor destructor procedure method",e:"[:;]",k:"function constructor|10 destructor|10 procedure|10 method|10",c:[e.TM,{cN:"params",b:"\\(",e:"\\)",k:r,c:[n,o]},t,a]};return{cI:!0,l:/\.?\w+/,k:r,i:'("|\\$[G-Zg-z]|\\/\\*||->)',c:[t,a,e.CLCM,n,o,e.NM,i,{cN:"class",b:"=\\bclass\\b",e:"end;",k:r,c:[n,o,t,a,e.CLCM,i]}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("dart",function(e){var t={cN:"subst",b:"\\$\\{",e:"}",k:"true false null this is new super"},r={cN:"string",v:[{b:"r'''",e:"'''"},{b:'r"""',e:'"""'},{b:"r'",e:"'",i:"\\n"},{b:'r"',e:'"',i:"\\n"},{b:"'''",e:"'''",c:[e.BE,t]},{b:'"""',e:'"""',c:[e.BE,t]},{b:"'",e:"'",i:"\\n",c:[e.BE,t]},{b:'"',e:'"',i:"\\n",c:[e.BE,t]}]};t.c=[e.CNM,r];var n={keyword:"assert async await break case catch class const continue default do else enum extends false final finally for if in is new null rethrow return super switch sync this throw true try var void while with yield abstract as dynamic export external factory get implements import library operator part set static typedef",built_in:"print Comparable DateTime Duration Function Iterable Iterator List Map Match Null Object Pattern RegExp Set Stopwatch String StringBuffer StringSink Symbol Type Uri bool double int num document window querySelector querySelectorAll Element ElementList"};return{k:n,c:[r,e.C("/\\*\\*","\\*/",{sL:"markdown"}),e.C("///","$",{sL:"markdown"}),e.CLCM,e.CBCM,{cN:"class",bK:"class interface",e:"{",eE:!0,c:[{bK:"extends implements"},e.UTM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"},{b:"=>"}]}});hljs.registerLanguage("fortran",function(e){var t={cN:"params",b:"\\(",e:"\\)"},n={literal:".False. .True.",keyword:"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data",built_in:"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image"};return{cI:!0,aliases:["f90","f95"],k:n,i:/\/\*/,c:[e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{cN:"string",r:0}),{cN:"function",bK:"subroutine function program",i:"[${=\\n]",c:[e.UTM,t]},e.C("!","$",{r:0}),{cN:"number",b:"(?=\\b|\\+|\\-|\\.)(?=\\.\\d|\\d)(?:\\d+)?(?:\\.?\\d*)(?:[de][+-]?\\d+)?\\b\\.?",r:0}]}});hljs.registerLanguage("pf",function(t){var o={cN:"variable",b:/\$[\w\d#@][\w\d_]*/},e={cN:"variable",b:/<(?!\/)/,e:/>/};return{aliases:["pf.conf"],l:/[a-z0-9_<>-]+/,k:{built_in:"block match pass load anchor|5 antispoof|10 set table",keyword:"in out log quick on rdomain inet inet6 proto from port os to routeallow-opts divert-packet divert-reply divert-to flags group icmp-typeicmp6-type label once probability recieved-on rtable prio queuetos tag tagged user keep fragment for os dropaf-to|10 binat-to|10 nat-to|10 rdr-to|10 bitmask least-stats random round-robinsource-hash static-portdup-to reply-to route-toparent bandwidth default min max qlimitblock-policy debug fingerprints hostid limit loginterface optimizationreassemble ruleset-optimization basic none profile skip state-defaultsstate-policy timeoutconst counters persistno modulate synproxy state|5 floating if-bound no-sync pflow|10 sloppysource-track global rule max-src-nodes max-src-states max-src-connmax-src-conn-rate overload flushscrub|5 max-mss min-ttl no-df|10 random-id",literal:"all any no-route self urpf-failed egress|5 unknown"},c:[t.HCM,t.NM,t.QSM,o,e]}});hljs.registerLanguage("nimrod",function(t){return{aliases:["nim"],k:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},c:[{cN:"meta",b:/{\./,e:/\.}/,r:10},{cN:"string",b:/[a-zA-Z]\w*"/,e:/"/,c:[{b:/""/}]},{cN:"string",b:/([a-zA-Z]\w*)?"""/,e:/"""/},t.QSM,{cN:"type",b:/\b[A-Z]\w+\b/,r:0},{cN:"number",r:0,v:[{b:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{b:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{b:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{b:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},t.HCM]}});hljs.registerLanguage("java",function(e){var t=e.UIR+"(<"+e.UIR+"(\\s*,\\s*"+e.UIR+")*>)?",a="false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports",r="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",s={cN:"number",b:r,r:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},s,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("javascript",function(e){return{aliases:["js","jsx"],k:{keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:["self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:[e.CLCM,e.CBCM]}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("qml",function(r){var e={keyword:"in of on if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await import",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Behavior bool color coordinate date double enumeration font geocircle georectangle geoshape int list matrix4x4 parent point quaternion real rect size string url var variant vector2d vector3d vector4dPromise"},t="[a-zA-Z_][a-zA-Z0-9\\._]*",a={cN:"keyword",b:"\\bproperty\\b",starts:{cN:"string",e:"(:|=|;|,|//|/\\*|$)",rE:!0}},n={cN:"keyword",b:"\\bsignal\\b",starts:{cN:"string",e:"(\\(|:|=|;|,|//|/\\*|$)",rE:!0}},o={cN:"attribute",b:"\\bid\\s*:",starts:{cN:"string",e:t,rE:!1}},i={b:t+"\\s*:",rB:!0,c:[{cN:"attribute",b:t,e:"\\s*:",eE:!0,r:0}],r:0},c={b:t+"\\s*{",e:"{",rB:!0,r:0,c:[r.inherit(r.TM,{b:t})]};return{aliases:["qt"],cI:!1,k:e,c:[{cN:"meta",b:/^\s*['"]use (strict|asm)['"]/},r.ASM,r.QSM,{cN:"string",b:"`",e:"`",c:[r.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},r.CLCM,r.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:r.CNR}],r:0},{b:"("+r.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[r.CLCM,r.CBCM,r.RM,{b:/\s*[);\]]/,r:0,sL:"xml"}],r:0},n,a,{cN:"function",bK:"function",e:/\{/,eE:!0,c:[r.inherit(r.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:[r.CLCM,r.CBCM]}],i:/\[|%/},{b:"\\."+r.IR,r:0},o,i,c],i:/#/}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\._]+/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("dockerfile",function(e){return{aliases:["docker"],cI:!0,k:"from maintainer cmd expose add copy entrypoint volume user workdir onbuild run env label",c:[e.HCM,{k:"run cmd entrypoint volume add copy workdir onbuild label",b:/^ *(onbuild +)?(run|cmd|entrypoint|volume|add|copy|workdir|label) +/,starts:{e:/[^\\]\n/,sL:"bash"}},{k:"from maintainer expose env user onbuild",b:/^ *(onbuild +)?(from|maintainer|expose|env|user|onbuild) +/,e:/[^\\]\n/,c:[e.ASM,e.QSM,e.NM,e.HCM]}]}});hljs.registerLanguage("nix",function(e){var r={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},t={cN:"subst",b:/\$\{/,e:/}/,k:r},i={b:/[a-zA-Z0-9-_]+(\s*=)/,rB:!0,r:0,c:[{cN:"attr",b:/\S+/}]},s={cN:"string",c:[t],v:[{b:"''",e:"''"},{b:'"',e:'"'}]},a=[e.NM,e.HCM,e.CBCM,s,i];return t.c=a,{aliases:["nixos"],k:r,c:a}});hljs.registerLanguage("tp",function(O){var R={cN:"number",b:"[1-9][0-9]*",r:0},E={cN:"symbol",b:":[^\\]]+"},T={cN:"built_in",b:"(AR|P|PAYLOAD|PR|R|SR|RSR|LBL|VR|UALM|MESSAGE|UTOOL|UFRAME|TIMER| TIMER_OVERFLOW|JOINT_MAX_SPEED|RESUME_PROG|DIAG_REC)\\[",e:"\\]",c:["self",R,E]},N={cN:"built_in",b:"(AI|AO|DI|DO|F|RI|RO|UI|UO|GI|GO|SI|SO)\\[",e:"\\]",c:["self",R,O.QSM,E]};return{k:{keyword:"ABORT ACC ADJUST AND AP_LD BREAK CALL CNT COL CONDITION CONFIG DA DB DIV DETECT ELSE END ENDFOR ERR_NUM ERROR_PROG FINE FOR GP GUARD INC IF JMP LINEAR_MAX_SPEED LOCK MOD MONITOR OFFSET Offset OR OVERRIDE PAUSE PREG PTH RT_LD RUN SELECT SKIP Skip TA TB TO TOOL_OFFSET Tool_Offset UF UT UFRAME_NUM UTOOL_NUM UNLOCK WAIT X Y Z W P R STRLEN SUBSTR FINDSTR VOFFSET PROG ATTR MN POS",literal:"ON OFF max_speed LPOS JPOS ENABLE DISABLE START STOP RESET"},c:[T,N,{cN:"keyword",b:"/(PROG|ATTR|MN|POS|END)\\b"},{cN:"keyword",b:"(CALL|RUN|POINT_LOGIC|LBL)\\b"},{cN:"keyword",b:"\\b(ACC|CNT|Skip|Offset|PSPD|RT_LD|AP_LD|Tool_Offset)"},{cN:"number",b:"\\d+(sec|msec|mm/sec|cm/min|inch/min|deg/sec|mm|in|cm)?\\b",r:0},O.C("//","[;$]"),O.C("!","[;$]"),O.C("--eg:","$"),O.QSM,{cN:"string",b:"'",e:"'"},O.CNM,{cN:"variable",b:"\\$[A-Za-z0-9_]+"}]}});hljs.registerLanguage("delphi",function(e){var r="exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure",t=[e.CLCM,e.C(/\{/,/\}/,{r:0}),e.C(/\(\*/,/\*\)/,{r:10})],a={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]},i={cN:"string",b:/(#\d+)+/},c={b:e.IR+"\\s*=\\s*class\\s*\\(",rB:!0,c:[e.TM]},o={cN:"function",bK:"function constructor destructor procedure",e:/[:;]/,k:"function constructor|10 destructor|10 procedure|10",c:[e.TM,{cN:"params",b:/\(/,e:/\)/,k:r,c:[a,i]}].concat(t)};return{aliases:["dpr","dfm","pas","pascal","freepascal","lazarus","lpr","lfm"],cI:!0,k:r,i:/"|\$[G-Zg-z]|\/\*|<\/|\|/,c:[a,i,e.NM,c,o].concat(t)}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("haxe",function(e){var a="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";return{aliases:["hx"],k:{keyword:"break callback case cast catch class continue default do dynamic else enum extends extern for function here if implements import in inline interface never new override package private public return static super switch this throw trace try typedef untyped using var while",literal:"true false null"},c:[e.ASM,e.QSM,e.CLCM,e.CBCM,e.CNM,{cN:"class",bK:"class interface",e:"{",eE:!0,c:[{bK:"extends implements"},e.TM]},{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elseif end error"}},{cN:"function",bK:"function",e:"[{;]",eE:!0,i:"\\S",c:[e.TM,{cN:"params",b:"\\(",e:"\\)",c:[e.ASM,e.QSM,e.CLCM,e.CBCM]},{b:":\\s*"+a}]}]}});hljs.registerLanguage("ocaml",function(e){return{aliases:["ml"],k:{keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref",literal:"true false"},i:/\/\/|>>/,l:"[a-z_]\\w*!?",c:[{cN:"literal",b:"\\[(\\|\\|)?\\]|\\(\\)",r:0},e.C("\\(\\*","\\*\\)",{c:["self"]}),{cN:"symbol",b:"'[A-Za-z_](?!')[\\w']*"},{cN:"type",b:"`[A-Z][\\w']*"},{cN:"type",b:"\\b[A-Z][\\w']*",r:0},{b:"[a-z_]\\w*'[\\w']*",r:0},e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{i:null}),{cN:"number",b:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",r:0},{b:/[-=]>/}]}});hljs.registerLanguage("yaml",function(e){var a={literal:"{ } true false yes no Yes No True False null"},b="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",t={cN:"attr",v:[{b:b+r+":"},{b:b+'"'+r+'":'},{b:b+"'"+r+"':"}]},c={cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]},l={cN:"string",r:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/}],c:[e.BE,c]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[t,{cN:"meta",b:"^---s*$",r:10},{cN:"string",b:"[\\|>] *$",rE:!0,c:l.c,e:t.v[0].b},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,r:0},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"^ *-",r:0},l,e.HCM,e.CNM],k:a}});hljs.registerLanguage("smali",function(t){var s=["add","and","cmp","cmpg","cmpl","const","div","double","float","goto","if","int","long","move","mul","neg","new","nop","not","or","rem","return","shl","shr","sput","sub","throw","ushr","xor"],e=["aget","aput","array","check","execute","fill","filled","goto/16","goto/32","iget","instance","invoke","iput","monitor","packed","sget","sparse"],r=["transient","constructor","abstract","final","synthetic","public","private","protected","static","bridge","system"];return{aliases:["smali"],c:[{cN:"string",b:'"',e:'"',r:0},t.C("#","$",{r:0}),{cN:"keyword",v:[{b:"\\s*\\.end\\s[a-zA-Z0-9]*"},{b:"^[ ]*\\.[a-zA-Z]*",r:0},{b:"\\s:[a-zA-Z_0-9]*",r:0},{b:"\\s("+r.join("|")+")"}]},{cN:"built_in",v:[{b:"\\s("+s.join("|")+")\\s"},{b:"\\s("+s.join("|")+")((\\-|/)[a-zA-Z0-9]+)+\\s",r:10},{b:"\\s("+e.join("|")+")((\\-|/)[a-zA-Z0-9]+)*\\s",r:10}]},{cN:"class",b:"L[^(;:\n]*;",r:0},{b:"[vp][0-9]+"}]}});hljs.registerLanguage("ldif",function(e){return{c:[{cN:"attribute",b:"^dn",e:": ",eE:!0,starts:{e:"$",r:0},r:10},{cN:"attribute",b:"^\\w",e:": ",eE:!0,starts:{e:"$",r:0}},{cN:"literal",b:"^-",e:"$"},e.HCM]}});hljs.registerLanguage("livecodeserver",function(e){var r={b:"\\b[gtps][A-Z]+[A-Za-z0-9_\\-]*\\b|\\$_[A-Z]+",r:0},t=[e.CBCM,e.HCM,e.C("--","$"),e.C("[^:]//","$")],a=e.inherit(e.TM,{v:[{b:"\\b_*rig[A-Z]+[A-Za-z0-9_\\-]*"},{b:"\\b_[a-z0-9\\-]+"}]}),o=e.inherit(e.TM,{b:"\\b([A-Za-z0-9_\\-]+)\\b"});return{cI:!1,k:{keyword:"$_COOKIE $_FILES $_GET $_GET_BINARY $_GET_RAW $_POST $_POST_BINARY $_POST_RAW $_SESSION $_SERVER codepoint codepoints segment segments codeunit codeunits sentence sentences trueWord trueWords paragraph after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word words fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys",literal:"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK",built_in:"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg avgDev base64Decode base64Encode baseConvert binaryDecode binaryEncode byteOffset byteToNum cachedURL cachedURLs charToNum cipherNames codepointOffset codepointProperty codepointToNum codeunitOffset commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames geometricMean global globals hasMemory harmonicMean hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames nativeCharToNum normalizeText num number numToByte numToChar numToCodepoint numToNativeChar offset open openfiles openProcesses openProcessIDs openSockets paragraphOffset paramCount param params peerAddress pendingMessages platform popStdDev populationStandardDeviation populationVariance popVariance processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLCreateTreeFromFileWithNamespaces revXMLCreateTreeWithNamespaces revXMLDataFromXPathQuery revXMLEvaluateXPath revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_Execute revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sampVariance sec secs seconds sentenceOffset sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName textDecode textEncode tick ticks time to tokenOffset toLower toUpper transpose truewordOffset trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus uuid value variableNames variance version waitDepth weekdayNames wordOffset xsltApplyStylesheet xsltApplyStylesheetFromFile xsltLoadStylesheet xsltLoadStylesheetFromFile add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket prepare process post seek rel relative read from process rename replace require resetAll resolve revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split start stop subtract union unload wait write"},c:[r,{cN:"keyword",b:"\\bend\\sif\\b"},{cN:"function",bK:"function",e:"$",c:[r,o,e.ASM,e.QSM,e.BNM,e.CNM,a]},{cN:"function",b:"\\bend\\s+",e:"$",k:"end",c:[o,a],r:0},{bK:"command on",e:"$",c:[r,o,e.ASM,e.QSM,e.BNM,e.CNM,a]},{cN:"meta",v:[{b:"<\\?(rev|lc|livecode)",r:10},{b:"<\\?"},{b:"\\?>"}]},e.ASM,e.QSM,e.BNM,e.CNM,a].concat(t),i:";$|^\\[|^=|&|{"}});hljs.registerLanguage("gams",function(e){var a={keyword:"abort acronym acronyms alias all and assign binary card diag display else eq file files for free ge gt if integer le loop lt maximizing minimizing model models ne negative no not option options or ord positive prod put putpage puttl repeat sameas semicont semiint smax smin solve sos1 sos2 sum system table then until using while xor yes",literal:"eps inf na","built-in":"abs arccos arcsin arctan arctan2 Beta betaReg binomial ceil centropy cos cosh cvPower div div0 eDist entropy errorf execSeed exp fact floor frac gamma gammaReg log logBeta logGamma log10 log2 mapVal max min mod ncpCM ncpF ncpVUpow ncpVUsin normal pi poly power randBinomial randLinear randTriangle round rPower sigmoid sign signPower sin sinh slexp sllog10 slrec sqexp sqlog10 sqr sqrec sqrt tan tanh trunc uniform uniformInt vcPower bool_and bool_eqv bool_imp bool_not bool_or bool_xor ifThen rel_eq rel_ge rel_gt rel_le rel_lt rel_ne gday gdow ghour gleap gmillisec gminute gmonth gsecond gyear jdate jnow jstart jtime errorLevel execError gamsRelease gamsVersion handleCollect handleDelete handleStatus handleSubmit heapFree heapLimit heapSize jobHandle jobKill jobStatus jobTerminate licenseLevel licenseStatus maxExecError sleep timeClose timeComp timeElapsed timeExec timeStart"},o={cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0},r={cN:"symbol",v:[{b:/\=[lgenxc]=/},{b:/\$/}]},t={cN:"comment",v:[{b:"'",e:"'"},{b:'"',e:'"'}],i:"\\n",c:[e.BE]},i={b:"/",e:"/",k:a,c:[t,e.CLCM,e.CBCM,e.QSM,e.ASM,e.CNM]},l={b:/[a-z][a-z0-9_]*(\([a-z0-9_, ]*\))?[ \t]+/,eB:!0,e:"$",eW:!0,c:[t,i,{cN:"comment",b:/([ ]*[a-z0-9&#*=?@>\\<:\-,()$\[\]_.{}!+%^]+)+/,r:0}]};return{aliases:["gms"],cI:!0,k:a,c:[e.C(/^\$ontext/,/^\$offtext/),{cN:"meta",b:"^\\$[a-z0-9]+",e:"$",rB:!0,c:[{cN:"meta-keyword",b:"^\\$[a-z0-9]+"}]},e.C("^\\*","$"),e.CLCM,e.CBCM,e.QSM,e.ASM,{bK:"set sets parameter parameters variable variables scalar scalars equation equations",e:";",c:[e.C("^\\*","$"),e.CLCM,e.CBCM,e.QSM,e.ASM,i,l]},{bK:"table",e:";",rB:!0,c:[{bK:"table",e:"$",c:[l]},e.C("^\\*","$"),e.CLCM,e.CBCM,e.QSM,e.ASM,e.CNM]},{cN:"function",b:/^[a-z][a-z0-9_,\-+' ()$]+\.{2}/,rB:!0,c:[{cN:"title",b:/^[a-z][a-z0-9_]+/},o,r]},e.CNM,r]}});hljs.registerLanguage("prolog",function(c){var b={b:/[a-z][A-Za-z0-9_]*/,r:0},r={cN:"symbol",v:[{b:/[A-Z][a-zA-Z0-9_]*/},{b:/_[A-Za-z0-9_]*/}],r:0},e={b:/\(/,e:/\)/,r:0},n={b:/\[/,e:/\]/},a={cN:"comment",b:/%/,e:/$/,c:[c.PWM]},t={cN:"string",b:/`/,e:/`/,c:[c.BE]},g={cN:"string",b:/0\'(\\\'|.)/},s={cN:"string",b:/0\'\\s/},o={b:/:-/},N=[b,r,e,o,n,a,c.CBCM,c.QSM,c.ASM,t,g,s,c.CNM];return e.c=N,n.c=N,{c:N.concat([{b:/\.$/}])}});hljs.registerLanguage("rust",function(e){var t="([uif](8|16|32|64|size))?",r=e.inherit(e.CBCM);r.c.push("self");var i="alignof as be box break const continue crate do else enum extern false fn for if impl in let loop match mod mut offsetof once priv proc pub pure ref return self Self sizeof static struct super trait true type typeof unsafe unsized use virtual while where yield move default int i8 i16 i32 i64 isize uint u8 u32 u64 usize float f32 f64 str char bool",n="Copy Send Sized Sync Drop Fn FnMut FnOnce drop Box ToOwned Clone PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator Option Result SliceConcatExt String ToString Vec assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules!";return{aliases:["rs"],k:{keyword:i,literal:"true false Some None Ok Err",built_in:n},l:e.IR+"!?",i:""}]}});hljs.registerLanguage("gradle",function(e){return{cI:!0,k:{keyword:"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage("golo",function(e){return{k:{keyword:"println readln print import module function local return let var while for foreach times in case when match with break continue augment augmentation each find filter reduce if then else otherwise try catch finally raise throw orIfNull DynamicObject|10 DynamicVariable struct Observable map set vector list array",literal:"true false null"},c:[e.HCM,e.QSM,e.CNM,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("vala",function(t){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object Gtk Posix",literal:"false true null"},c:[{cN:"class",bK:"class interface namespace",e:"{",eE:!0,i:"[^,:\\n\\s\\.]",c:[t.UTM]},t.CLCM,t.CBCM,{cN:"string",b:'"""',e:'"""',r:5},t.ASM,t.QSM,t.CNM,{cN:"meta",b:"^#",e:"$",r:2}]}});hljs.registerLanguage("capnproto",function(t){return{aliases:["capnp"],k:{keyword:"struct enum interface union group import using const annotation extends in of on as with from fixed",built_in:"Void Bool Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64 Float32 Float64 Text Data AnyPointer AnyStruct Capability List",literal:"true false"},c:[t.QSM,t.NM,t.HCM,{cN:"meta",b:/@0x[\w\d]{16};/,i:/\n/},{cN:"symbol",b:/@\d+\b/},{cN:"class",bK:"struct enum",e:/\{/,i:/\n/,c:[t.inherit(t.TM,{starts:{eW:!0,eE:!0}})]},{cN:"class",bK:"interface",e:/\{/,i:/\n/,c:[t.inherit(t.TM,{starts:{eW:!0,eE:!0}})]}]}});hljs.registerLanguage("parser3",function(r){var e=r.C("{","}",{c:["self"]});return{sL:"xml",r:0,c:[r.C("^#","$"),r.C("\\^rem{","}",{r:10,c:[e]}),{cN:"meta",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},r.CNM]}});hljs.registerLanguage("1c",function(c){var e="[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*",n="возврат дата для если и или иначе иначеесли исключение конецесли конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл число экспорт",b="ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить стрколичествострок стрполучитьстроку стрчисловхождений сформироватьпозициюдокумента счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты установитьтана установитьтапо фиксшаблон формат цел шаблон",i={b:'""'},r={cN:"string",b:'"',e:'"|$',c:[i]},t={cN:"string",b:"\\|",e:'"|$',c:[i]};return{cI:!0,l:e,k:{keyword:n,built_in:b},c:[c.CLCM,c.NM,r,t,{cN:"function",b:"(процедура|функция)",e:"$",l:e,k:"процедура функция",c:[{b:"экспорт",eW:!0,l:e,k:"экспорт",c:[c.CLCM]},{cN:"params",b:"\\(",e:"\\)",l:e,k:"знач",c:[r,t]},c.CLCM,c.inherit(c.TM,{b:e})]},{cN:"meta",b:"#",e:"$"},{cN:"number",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}});hljs.registerLanguage("gauss",function(e){var t={keyword:"and bool break call callexe checkinterrupt clear clearg closeall cls comlog compile continue create debug declare delete disable dlibrary dllcall do dos ed edit else elseif enable end endfor endif endp endo errorlog errorlogat expr external fn for format goto gosub graph if keyword let lib library line load loadarray loadexe loadf loadk loadm loadp loads loadx local locate loopnextindex lprint lpwidth lshow matrix msym ndpclex new not open or output outwidth plot plotsym pop prcsn print printdos proc push retp return rndcon rndmod rndmult rndseed run save saveall screen scroll setarray show sparse stop string struct system trace trap threadfor threadendfor threadbegin threadjoin threadstat threadend until use while winprint",built_in:"abs acf aconcat aeye amax amean AmericanBinomCall AmericanBinomCall_Greeks AmericanBinomCall_ImpVol AmericanBinomPut AmericanBinomPut_Greeks AmericanBinomPut_ImpVol AmericanBSCall AmericanBSCall_Greeks AmericanBSCall_ImpVol AmericanBSPut AmericanBSPut_Greeks AmericanBSPut_ImpVol amin amult annotationGetDefaults annotationSetBkd annotationSetFont annotationSetLineColor annotationSetLineStyle annotationSetLineThickness annualTradingDays arccos arcsin areshape arrayalloc arrayindex arrayinit arraytomat asciiload asclabel astd astds asum atan atan2 atranspose axmargin balance band bandchol bandcholsol bandltsol bandrv bandsolpd bar base10 begwind besselj bessely beta box boxcox cdfBeta cdfBetaInv cdfBinomial cdfBinomialInv cdfBvn cdfBvn2 cdfBvn2e cdfCauchy cdfCauchyInv cdfChic cdfChii cdfChinc cdfChincInv cdfExp cdfExpInv cdfFc cdfFnc cdfFncInv cdfGam cdfGenPareto cdfHyperGeo cdfLaplace cdfLaplaceInv cdfLogistic cdfLogisticInv cdfmControlCreate cdfMvn cdfMvn2e cdfMvnce cdfMvne cdfMvt2e cdfMvtce cdfMvte cdfN cdfN2 cdfNc cdfNegBinomial cdfNegBinomialInv cdfNi cdfPoisson cdfPoissonInv cdfRayleigh cdfRayleighInv cdfTc cdfTci cdfTnc cdfTvn cdfWeibull cdfWeibullInv cdir ceil ChangeDir chdir chiBarSquare chol choldn cholsol cholup chrs close code cols colsf combinate combinated complex con cond conj cons ConScore contour conv convertsatostr convertstrtosa corrm corrms corrvc corrx corrxs cos cosh counts countwts crossprd crout croutp csrcol csrlin csvReadM csvReadSA cumprodc cumsumc curve cvtos datacreate datacreatecomplex datalist dataload dataloop dataopen datasave date datestr datestring datestrymd dayinyr dayofweek dbAddDatabase dbClose dbCommit dbCreateQuery dbExecQuery dbGetConnectOptions dbGetDatabaseName dbGetDriverName dbGetDrivers dbGetHostName dbGetLastErrorNum dbGetLastErrorText dbGetNumericalPrecPolicy dbGetPassword dbGetPort dbGetTableHeaders dbGetTables dbGetUserName dbHasFeature dbIsDriverAvailable dbIsOpen dbIsOpenError dbOpen dbQueryBindValue dbQueryClear dbQueryCols dbQueryExecPrepared dbQueryFetchAllM dbQueryFetchAllSA dbQueryFetchOneM dbQueryFetchOneSA dbQueryFinish dbQueryGetBoundValue dbQueryGetBoundValues dbQueryGetField dbQueryGetLastErrorNum dbQueryGetLastErrorText dbQueryGetLastInsertID dbQueryGetLastQuery dbQueryGetPosition dbQueryIsActive dbQueryIsForwardOnly dbQueryIsNull dbQueryIsSelect dbQueryIsValid dbQueryPrepare dbQueryRows dbQuerySeek dbQuerySeekFirst dbQuerySeekLast dbQuerySeekNext dbQuerySeekPrevious dbQuerySetForwardOnly dbRemoveDatabase dbRollback dbSetConnectOptions dbSetDatabaseName dbSetHostName dbSetNumericalPrecPolicy dbSetPort dbSetUserName dbTransaction DeleteFile delif delrows denseToSp denseToSpRE denToZero design det detl dfft dffti diag diagrv digamma doswin DOSWinCloseall DOSWinOpen dotfeq dotfeqmt dotfge dotfgemt dotfgt dotfgtmt dotfle dotflemt dotflt dotfltmt dotfne dotfnemt draw drop dsCreate dstat dstatmt dstatmtControlCreate dtdate dtday dttime dttodtv dttostr dttoutc dtvnormal dtvtodt dtvtoutc dummy dummybr dummydn eig eigh eighv eigv elapsedTradingDays endwind envget eof eqSolve eqSolvemt eqSolvemtControlCreate eqSolvemtOutCreate eqSolveset erf erfc erfccplx erfcplx error etdays ethsec etstr EuropeanBinomCall EuropeanBinomCall_Greeks EuropeanBinomCall_ImpVol EuropeanBinomPut EuropeanBinomPut_Greeks EuropeanBinomPut_ImpVol EuropeanBSCall EuropeanBSCall_Greeks EuropeanBSCall_ImpVol EuropeanBSPut EuropeanBSPut_Greeks EuropeanBSPut_ImpVol exctsmpl exec execbg exp extern eye fcheckerr fclearerr feq feqmt fflush fft ffti fftm fftmi fftn fge fgemt fgets fgetsa fgetsat fgetst fgt fgtmt fileinfo filesa fle flemt floor flt fltmt fmod fne fnemt fonts fopen formatcv formatnv fputs fputst fseek fstrerror ftell ftocv ftos ftostrC gamma gammacplx gammaii gausset gdaAppend gdaCreate gdaDStat gdaDStatMat gdaGetIndex gdaGetName gdaGetNames gdaGetOrders gdaGetType gdaGetTypes gdaGetVarInfo gdaIsCplx gdaLoad gdaPack gdaRead gdaReadByIndex gdaReadSome gdaReadSparse gdaReadStruct gdaReportVarInfo gdaSave gdaUpdate gdaUpdateAndPack gdaVars gdaWrite gdaWrite32 gdaWriteSome getarray getdims getf getGAUSShome getmatrix getmatrix4D getname getnamef getNextTradingDay getNextWeekDay getnr getorders getpath getPreviousTradingDay getPreviousWeekDay getRow getscalar3D getscalar4D getTrRow getwind glm gradcplx gradMT gradMTm gradMTT gradMTTm gradp graphprt graphset hasimag header headermt hess hessMT hessMTg hessMTgw hessMTm hessMTmw hessMTT hessMTTg hessMTTgw hessMTTm hessMTw hessp hist histf histp hsec imag indcv indexcat indices indices2 indicesf indicesfn indnv indsav indx integrate1d integrateControlCreate intgrat2 intgrat3 inthp1 inthp2 inthp3 inthp4 inthpControlCreate intquad1 intquad2 intquad3 intrleav intrleavsa intrsect intsimp inv invpd invswp iscplx iscplxf isden isinfnanmiss ismiss key keyav keyw lag lag1 lagn lapEighb lapEighi lapEighvb lapEighvi lapgEig lapgEigh lapgEighv lapgEigv lapgSchur lapgSvdcst lapgSvds lapgSvdst lapSvdcusv lapSvds lapSvdusv ldlp ldlsol linSolve listwise ln lncdfbvn lncdfbvn2 lncdfmvn lncdfn lncdfn2 lncdfnc lnfact lngammacplx lnpdfmvn lnpdfmvt lnpdfn lnpdft loadd loadstruct loadwind loess loessmt loessmtControlCreate log loglog logx logy lower lowmat lowmat1 ltrisol lu lusol machEpsilon make makevars makewind margin matalloc matinit mattoarray maxbytes maxc maxindc maxv maxvec mbesselei mbesselei0 mbesselei1 mbesseli mbesseli0 mbesseli1 meanc median mergeby mergevar minc minindc minv miss missex missrv moment momentd movingave movingaveExpwgt movingaveWgt nextindex nextn nextnevn nextwind ntos null null1 numCombinations ols olsmt olsmtControlCreate olsqr olsqr2 olsqrmt ones optn optnevn orth outtyp pacf packedToSp packr parse pause pdfCauchy pdfChi pdfExp pdfGenPareto pdfHyperGeo pdfLaplace pdfLogistic pdfn pdfPoisson pdfRayleigh pdfWeibull pi pinv pinvmt plotAddArrow plotAddBar plotAddBox plotAddHist plotAddHistF plotAddHistP plotAddPolar plotAddScatter plotAddShape plotAddTextbox plotAddTS plotAddXY plotArea plotBar plotBox plotClearLayout plotContour plotCustomLayout plotGetDefaults plotHist plotHistF plotHistP plotLayout plotLogLog plotLogX plotLogY plotOpenWindow plotPolar plotSave plotScatter plotSetAxesPen plotSetBar plotSetBarFill plotSetBarStacked plotSetBkdColor plotSetFill plotSetGrid plotSetLegend plotSetLineColor plotSetLineStyle plotSetLineSymbol plotSetLineThickness plotSetNewWindow plotSetTitle plotSetWhichYAxis plotSetXAxisShow plotSetXLabel plotSetXRange plotSetXTicInterval plotSetXTicLabel plotSetYAxisShow plotSetYLabel plotSetYRange plotSetZAxisShow plotSetZLabel plotSurface plotTS plotXY polar polychar polyeval polygamma polyint polymake polymat polymroot polymult polyroot pqgwin previousindex princomp printfm printfmt prodc psi putarray putf putvals pvCreate pvGetIndex pvGetParNames pvGetParVector pvLength pvList pvPack pvPacki pvPackm pvPackmi pvPacks pvPacksi pvPacksm pvPacksmi pvPutParVector pvTest pvUnpack QNewton QNewtonmt QNewtonmtControlCreate QNewtonmtOutCreate QNewtonSet QProg QProgmt QProgmtInCreate qqr qqre qqrep qr qre qrep qrsol qrtsol qtyr qtyre qtyrep quantile quantiled qyr qyre qyrep qz rank rankindx readr real reclassify reclassifyCuts recode recserar recsercp recserrc rerun rescale reshape rets rev rfft rffti rfftip rfftn rfftnp rfftp rndBernoulli rndBeta rndBinomial rndCauchy rndChiSquare rndCon rndCreateState rndExp rndGamma rndGeo rndGumbel rndHyperGeo rndi rndKMbeta rndKMgam rndKMi rndKMn rndKMnb rndKMp rndKMu rndKMvm rndLaplace rndLCbeta rndLCgam rndLCi rndLCn rndLCnb rndLCp rndLCu rndLCvm rndLogNorm rndMTu rndMVn rndMVt rndn rndnb rndNegBinomial rndp rndPoisson rndRayleigh rndStateSkip rndu rndvm rndWeibull rndWishart rotater round rows rowsf rref sampleData satostrC saved saveStruct savewind scale scale3d scalerr scalinfnanmiss scalmiss schtoc schur searchsourcepath seekr select selif seqa seqm setdif setdifsa setvars setvwrmode setwind shell shiftr sin singleindex sinh sleep solpd sortc sortcc sortd sorthc sorthcc sortind sortindc sortmc sortr sortrc spBiconjGradSol spChol spConjGradSol spCreate spDenseSubmat spDiagRvMat spEigv spEye spLDL spline spLU spNumNZE spOnes spreadSheetReadM spreadSheetReadSA spreadSheetWrite spScale spSubmat spToDense spTrTDense spTScalar spZeros sqpSolve sqpSolveMT sqpSolveMTControlCreate sqpSolveMTlagrangeCreate sqpSolveMToutCreate sqpSolveSet sqrt statements stdc stdsc stocv stof strcombine strindx strlen strput strrindx strsect strsplit strsplitPad strtodt strtof strtofcplx strtriml strtrimr strtrunc strtruncl strtruncpad strtruncr submat subscat substute subvec sumc sumr surface svd svd1 svd2 svdcusv svds svdusv sysstate tab tan tanh tempname threadBegin threadEnd threadEndFor threadFor threadJoin threadStat time timedt timestr timeutc title tkf2eps tkf2ps tocart todaydt toeplitz token topolar trapchk trigamma trimr trunc type typecv typef union unionsa uniqindx uniqindxsa unique uniquesa upmat upmat1 upper utctodt utctodtv utrisol vals varCovMS varCovXS varget vargetl varmall varmares varput varputl vartypef vcm vcms vcx vcxs vec vech vecr vector vget view viewxyz vlist vnamecv volume vput vread vtypecv wait waitc walkindex where window writer xlabel xlsGetSheetCount xlsGetSheetSize xlsGetSheetTypes xlsMakeRange xlsReadM xlsReadSA xlsWrite xlsWriteM xlsWriteSA xpnd xtics xy xyz ylabel ytics zeros zeta zlabel ztics",literal:"DB_AFTER_LAST_ROW DB_ALL_TABLES DB_BATCH_OPERATIONS DB_BEFORE_FIRST_ROW DB_BLOB DB_EVENT_NOTIFICATIONS DB_FINISH_QUERY DB_HIGH_PRECISION DB_LAST_INSERT_ID DB_LOW_PRECISION_DOUBLE DB_LOW_PRECISION_INT32 DB_LOW_PRECISION_INT64 DB_LOW_PRECISION_NUMBERS DB_MULTIPLE_RESULT_SETS DB_NAMED_PLACEHOLDERS DB_POSITIONAL_PLACEHOLDERS DB_PREPARED_QUERIES DB_QUERY_SIZE DB_SIMPLE_LOCKING DB_SYSTEM_TABLES DB_TABLES DB_TRANSACTIONS DB_UNICODE DB_VIEWS"},a={cN:"meta",b:"#",e:"$",k:{"meta-keyword":"define definecs|10 undef ifdef ifndef iflight ifdllcall ifmac ifos2win ifunix else endif lineson linesoff srcfile srcline"},c:[{b:/\\\n/,r:0},{bK:"include",e:"$",k:{"meta-keyword":"include"},c:[{cN:"meta-string",b:'"',e:'"',i:"\\n"}]},e.CLCM,e.CBCM]},r=e.UIR+"\\s*\\(?",o=[{cN:"params",b:/\(/,e:/\)/,k:t,r:0,c:[e.CNM,e.CLCM,e.CBCM]}];return{aliases:["gss"],cI:!0,k:t,i:"(\\{[%#]|[%#]\\})",c:[e.CNM,e.CLCM,e.CBCM,e.C("@","@"),a,{cN:"string",b:'"',e:'"',c:[e.BE]},{cN:"function",bK:"proc keyword",e:";",eE:!0,k:t,c:[{b:r,rB:!0,c:[e.UTM],r:0},e.CNM,e.CLCM,e.CBCM,a].concat(o)},{cN:"function",bK:"fn",e:";",eE:!0,k:t,c:[{b:r+e.IR+"\\)?\\s*\\=\\s*",rB:!0,c:[e.UTM],r:0},e.CNM,e.CLCM,e.CBCM].concat(o)},{cN:"function",b:"\\bexternal (proc|keyword|fn)\\s+",e:";",eE:!0,k:t,c:[{b:r,rB:!0,c:[e.UTM],r:0},e.CLCM,e.CBCM]},{cN:"function",b:"\\bexternal (matrix|string|array|sparse matrix|struct "+e.IR+")\\s+",e:";",eE:!0,k:t,c:[e.CLCM,e.CBCM]}]}});hljs.registerLanguage("haskell",function(e){var i={v:[e.C("--","$"),e.C("{-","-}",{c:["self"]})]},a={cN:"meta",b:"{-#",e:"#-}"},l={cN:"meta",b:"^#",e:"$"},c={cN:"type",b:"\\b[A-Z][\\w']*",r:0},n={b:"\\(",e:"\\)",i:'"',c:[a,l,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TM,{b:"[_a-z][\\w']*"}),i]},s={b:"{",e:"}",c:n.c};return{aliases:["hs"],k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{bK:"module",e:"where",k:"module where",c:[n,i],i:"\\W\\.|;"},{b:"\\bimport\\b",e:"$",k:"import qualified as hiding",c:[n,i],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[c,n,i]},{cN:"class",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[a,c,n,s,i]},{bK:"default",e:"$",c:[c,n,i]},{bK:"infix infixl infixr",e:"$",c:[e.CNM,i]},{b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[c,e.QSM,i]},{cN:"meta",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:"^[_a-z][\\w']*"}),i,{b:"->|<-"}]}});hljs.registerLanguage("clojure",function(e){var t={"builtin-name":"def defonce cond apply if-not if-let if not not= = < > <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"},r="a-zA-Z_\\-!.?+*=<>&#'",n="["+r+"]["+r+"0-9/;:]*",a="[-+]?\\d+(\\.\\d+)?",o={b:n,r:0},s={cN:"number",b:a,r:0},i=e.inherit(e.QSM,{i:null}),c=e.C(";","$",{r:0}),d={cN:"literal",b:/\b(true|false|nil)\b/},l={b:"[\\[\\{]",e:"[\\]\\}]"},m={cN:"comment",b:"\\^"+n},p=e.C("\\^\\{","\\}"),u={cN:"symbol",b:"[:]{1,2}"+n},f={b:"\\(",e:"\\)"},h={eW:!0,r:0},y={k:t,l:n,cN:"name",b:n,starts:h},b=[f,i,m,p,c,u,l,s,d,o];return f.c=[e.C("comment",""),y,h],h.c=b,l.c=b,{aliases:["clj"],i:/\S/,c:[f,i,m,p,c,u,l,s,d]}});hljs.registerLanguage("clojure-repl",function(e){return{c:[{cN:"meta",b:/^([\w.-]+|\s*#_)=>/,starts:{e:/$/,sL:"clojure"}}]}});hljs.registerLanguage("python",function(e){var r={cN:"meta",b:/^(>>>|\.\.\.) /},b={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[r],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[r],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},e.ASM,e.QSM]},a={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},l={cN:"params",b:/\(/,e:/\)/,c:["self",r,a,b]};return{aliases:["py","gyp"],k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[r,a,b,e.HCM,{v:[{cN:"function",bK:"def",r:10},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,l,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("lasso",function(e){var r="[a-zA-Z_][\\w.]*",a="<\\?(lasso(script)?|=)",t="\\]|\\?>",n={literal:"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft",built_in:"array date decimal duration integer map pair string tag xml null boolean bytes keyword list locale queue set stack staticarray local var variable global data self inherited currentcapture givenblock",keyword:"cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else fail_if fail_ifnot fail if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome"},i=e.C("",{r:0}),s={cN:"meta",b:"\\[noprocess\\]",starts:{e:"\\[/noprocess\\]",rE:!0,c:[i]}},l={cN:"meta",b:"\\[/noprocess|"+a},o={cN:"symbol",b:"'"+r+"'"},c=[e.CLCM,e.CBCM,e.inherit(e.CNM,{b:e.CNR+"|(-?infinity|NaN)\\b"}),e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{v:[{b:"[#$]"+r},{b:"#",e:"\\d+",i:"\\W"}]},{cN:"type",b:"::\\s*",e:r,i:"\\W"},{cN:"params",v:[{b:"-(?!infinity)"+r,r:0},{b:"(\\.\\.\\.)"}]},{b:/(->|\.)\s*/,r:0,c:[o]},{cN:"class",bK:"define",rE:!0,e:"\\(|=>",c:[e.inherit(e.TM,{b:r+"(=(?!>))?|[-+*/%](?!>)"})]}];return{aliases:["ls","lassoscript"],cI:!0,l:r+"|&[lg]t;",k:n,c:[{cN:"meta",b:t,r:0,starts:{e:"\\[|"+a,rE:!0,r:0,c:[i]}},s,l,{cN:"meta",b:"\\[no_square_brackets",starts:{e:"\\[/no_square_brackets\\]",l:r+"|&[lg]t;",k:n,c:[{cN:"meta",b:t,r:0,starts:{e:"\\[noprocess\\]|"+a,rE:!0,c:[i]}},s,l].concat(c)}},{cN:"meta",b:"\\[",r:0},{cN:"meta",b:"^#!",e:"lasso9$",r:10}].concat(c)}});hljs.registerLanguage("django",function(e){var t={b:/\|[A-Za-z]+:?/,k:{name:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone"},c:[e.QSM,e.ASM]};return{aliases:["jinja"],cI:!0,sL:"xml",c:[e.C(/\{%\s*comment\s*%}/,/\{%\s*endcomment\s*%}/),e.C(/\{#/,/#}/),{cN:"template-tag",b:/\{%/,e:/%}/,c:[{cN:"name",b:/\w+/,k:{name:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim"},starts:{eW:!0,k:"in by as",c:[t],r:0}}]},{cN:"template-variable",b:/\{\{/,e:/}}/,c:[t]}]}});hljs.registerLanguage("sqf",function(e){var t=e.getLanguage("cpp").exports,a={cN:"string",v:[{b:'"',e:'"',c:[{b:'""',r:0}]},{b:"'",e:"'",c:[{b:"''",r:0}]}]};return{aliases:["sqf"],cI:!0,k:{keyword:"case catch default do else exit exitWith for forEach from if switch then throw to try while with",built_in:"or plus abs accTime acos action actionKeys actionKeysImages actionKeysNames actionKeysNamesArray actionName activateAddons activatedAddons activateKey addAction addBackpack addBackpackCargo addBackpackCargoGlobal addBackpackGlobal addCamShake addCuratorAddons addCuratorCameraArea addCuratorEditableObjects addCuratorEditingArea addCuratorPoints addEditorObject addEventHandler addGoggles addGroupIcon addHandgunItem addHeadgear addItem addItemCargo addItemCargoGlobal addItemPool addItemToBackpack addItemToUniform addItemToVest addLiveStats addMagazine addMagazine array addMagazineAmmoCargo addMagazineCargo addMagazineCargoGlobal addMagazineGlobal addMagazinePool addMagazines addMagazineTurret addMenu addMenuItem addMissionEventHandler addMPEventHandler addMusicEventHandler addPrimaryWeaponItem addPublicVariableEventHandler addRating addResources addScore addScoreSide addSecondaryWeaponItem addSwitchableUnit addTeamMember addToRemainsCollector addUniform addVehicle addVest addWaypoint addWeapon addWeaponCargo addWeaponCargoGlobal addWeaponGlobal addWeaponPool addWeaponTurret agent agents AGLToASL aimedAtTarget aimPos airDensityRTD airportSide AISFinishHeal alive allControls allCurators allDead allDeadMen allDisplays allGroups allMapMarkers allMines allMissionObjects allow3DMode allowCrewInImmobile allowCuratorLogicIgnoreAreas allowDamage allowDammage allowFileOperations allowFleeing allowGetIn allPlayers allSites allTurrets allUnits allUnitsUAV allVariables ammo and animate animateDoor animationPhase animationState append armoryPoints arrayIntersect asin ASLToAGL ASLToATL assert assignAsCargo assignAsCargoIndex assignAsCommander assignAsDriver assignAsGunner assignAsTurret assignCurator assignedCargo assignedCommander assignedDriver assignedGunner assignedItems assignedTarget assignedTeam assignedVehicle assignedVehicleRole assignItem assignTeam assignToAirport atan atan2 atg ATLToASL attachedObject attachedObjects attachedTo attachObject attachTo attackEnabled backpack backpackCargo backpackContainer backpackItems backpackMagazines backpackSpaceFor behaviour benchmark binocular blufor boundingBox boundingBoxReal boundingCenter breakOut breakTo briefingName buildingExit buildingPos buttonAction buttonSetAction cadetMode call callExtension camCommand camCommit camCommitPrepared camCommitted camConstuctionSetParams camCreate camDestroy cameraEffect cameraEffectEnableHUD cameraInterest cameraOn cameraView campaignConfigFile camPreload camPreloaded camPrepareBank camPrepareDir camPrepareDive camPrepareFocus camPrepareFov camPrepareFovRange camPreparePos camPrepareRelPos camPrepareTarget camSetBank camSetDir camSetDive camSetFocus camSetFov camSetFovRange camSetPos camSetRelPos camSetTarget camTarget camUseNVG canAdd canAddItemToBackpack canAddItemToUniform canAddItemToVest cancelSimpleTaskDestination canFire canMove canSlingLoad canStand canUnloadInCombat captive captiveNum cbChecked cbSetChecked ceil cheatsEnabled checkAIFeature civilian className clearAllItemsFromBackpack clearBackpackCargo clearBackpackCargoGlobal clearGroupIcons clearItemCargo clearItemCargoGlobal clearItemPool clearMagazineCargo clearMagazineCargoGlobal clearMagazinePool clearOverlay clearRadio clearWeaponCargo clearWeaponCargoGlobal clearWeaponPool closeDialog closeDisplay closeOverlay collapseObjectTree combatMode commandArtilleryFire commandChat commander commandFire commandFollow commandFSM commandGetOut commandingMenu commandMove commandRadio commandStop commandTarget commandWatch comment commitOverlay compile compileFinal completedFSM composeText configClasses configFile configHierarchy configName configProperties configSourceMod configSourceModList connectTerminalToUAV controlNull controlsGroupCtrl copyFromClipboard copyToClipboard copyWaypoints cos count countEnemy countFriendly countSide countType countUnknown createAgent createCenter createDialog createDiaryLink createDiaryRecord createDiarySubject createDisplay createGearDialog createGroup createGuardedPoint createLocation createMarker createMarkerLocal createMenu createMine createMissionDisplay createSimpleTask createSite createSoundSource createTask createTeam createTrigger createUnit createUnit array createVehicle createVehicle array createVehicleCrew createVehicleLocal crew ctrlActivate ctrlAddEventHandler ctrlAutoScrollDelay ctrlAutoScrollRewind ctrlAutoScrollSpeed ctrlChecked ctrlClassName ctrlCommit ctrlCommitted ctrlCreate ctrlDelete ctrlEnable ctrlEnabled ctrlFade ctrlHTMLLoaded ctrlIDC ctrlIDD ctrlMapAnimAdd ctrlMapAnimClear ctrlMapAnimCommit ctrlMapAnimDone ctrlMapCursor ctrlMapMouseOver ctrlMapScale ctrlMapScreenToWorld ctrlMapWorldToScreen ctrlModel ctrlModelDirAndUp ctrlModelScale ctrlParent ctrlPosition ctrlRemoveAllEventHandlers ctrlRemoveEventHandler ctrlScale ctrlSetActiveColor ctrlSetAutoScrollDelay ctrlSetAutoScrollRewind ctrlSetAutoScrollSpeed ctrlSetBackgroundColor ctrlSetChecked ctrlSetEventHandler ctrlSetFade ctrlSetFocus ctrlSetFont ctrlSetFontH1 ctrlSetFontH1B ctrlSetFontH2 ctrlSetFontH2B ctrlSetFontH3 ctrlSetFontH3B ctrlSetFontH4 ctrlSetFontH4B ctrlSetFontH5 ctrlSetFontH5B ctrlSetFontH6 ctrlSetFontH6B ctrlSetFontHeight ctrlSetFontHeightH1 ctrlSetFontHeightH2 ctrlSetFontHeightH3 ctrlSetFontHeightH4 ctrlSetFontHeightH5 ctrlSetFontHeightH6 ctrlSetFontP ctrlSetFontPB ctrlSetForegroundColor ctrlSetModel ctrlSetModelDirAndUp ctrlSetModelScale ctrlSetPosition ctrlSetScale ctrlSetStructuredText ctrlSetText ctrlSetTextColor ctrlSetTooltip ctrlSetTooltipColorBox ctrlSetTooltipColorShade ctrlSetTooltipColorText ctrlShow ctrlShown ctrlText ctrlTextHeight ctrlType ctrlVisible curatorAddons curatorCamera curatorCameraArea curatorCameraAreaCeiling curatorCoef curatorEditableObjects curatorEditingArea curatorEditingAreaType curatorMouseOver curatorPoints curatorRegisteredObjects curatorSelected curatorWaypointCost currentChannel currentCommand currentMagazine currentMagazineDetail currentMagazineDetailTurret currentMagazineTurret currentMuzzle currentNamespace currentTask currentTasks currentThrowable currentVisionMode currentWaypoint currentWeapon currentWeaponMode currentWeaponTurret currentZeroing cursorTarget customChat customRadio cutFadeOut cutObj cutRsc cutText damage date dateToNumber daytime deActivateKey debriefingText debugFSM debugLog deg deleteAt deleteCenter deleteCollection deleteEditorObject deleteGroup deleteIdentity deleteLocation deleteMarker deleteMarkerLocal deleteRange deleteResources deleteSite deleteStatus deleteTeam deleteVehicle deleteVehicleCrew deleteWaypoint detach detectedMines diag activeMissionFSMs diag activeSQFScripts diag activeSQSScripts diag captureFrame diag captureSlowFrame diag fps diag fpsMin diag frameNo diag log diag logSlowFrame diag tickTime dialog diarySubjectExists didJIP didJIPOwner difficulty difficultyEnabled difficultyEnabledRTD direction directSay disableAI disableCollisionWith disableConversation disableDebriefingStats disableSerialization disableTIEquipment disableUAVConnectability disableUserInput displayAddEventHandler displayCtrl displayNull displayRemoveAllEventHandlers displayRemoveEventHandler displaySetEventHandler dissolveTeam distance distance2D distanceSqr distributionRegion doArtilleryFire doFire doFollow doFSM doGetOut doMove doorPhase doStop doTarget doWatch drawArrow drawEllipse drawIcon drawIcon3D drawLine drawLine3D drawLink drawLocation drawRectangle driver drop east echo editObject editorSetEventHandler effectiveCommander emptyPositions enableAI enableAIFeature enableAttack enableCamShake enableCaustics enableCollisionWith enableCopilot enableDebriefingStats enableDiagLegend enableEndDialog enableEngineArtillery enableEnvironment enableFatigue enableGunLights enableIRLasers enableMimics enablePersonTurret enableRadio enableReload enableRopeAttach enableSatNormalOnDetail enableSaving enableSentences enableSimulation enableSimulationGlobal enableTeamSwitch enableUAVConnectability enableUAVWaypoints endLoadingScreen endMission engineOn enginesIsOnRTD enginesRpmRTD enginesTorqueRTD entities estimatedEndServerTime estimatedTimeLeft evalObjectArgument everyBackpack everyContainer exec execEditorScript execFSM execVM exp expectedDestination eyeDirection eyePos face faction fadeMusic fadeRadio fadeSound fadeSpeech failMission fillWeaponsFromPool find findCover findDisplay findEditorObject findEmptyPosition findEmptyPositionReady findNearestEnemy finishMissionInit finite fire fireAtTarget firstBackpack flag flagOwner fleeing floor flyInHeight fog fogForecast fogParams forceAddUniform forceEnd forceMap forceRespawn forceSpeed forceWalk forceWeaponFire forceWeatherChange forEachMember forEachMemberAgent forEachMemberTeam format formation formationDirection formationLeader formationMembers formationPosition formationTask formatText formLeader freeLook fromEditor fuel fullCrew gearSlotAmmoCount gearSlotData getAllHitPointsDamage getAmmoCargo getArray getArtilleryAmmo getArtilleryComputerSettings getArtilleryETA getAssignedCuratorLogic getAssignedCuratorUnit getBackpackCargo getBleedingRemaining getBurningValue getCargoIndex getCenterOfMass getClientState getConnectedUAV getDammage getDescription getDir getDirVisual getDLCs getEditorCamera getEditorMode getEditorObjectScope getElevationOffset getFatigue getFriend getFSMVariable getFuelCargo getGroupIcon getGroupIconParams getGroupIcons getHideFrom getHit getHitIndex getHitPointDamage getItemCargo getMagazineCargo getMarkerColor getMarkerPos getMarkerSize getMarkerType getMass getModelInfo getNumber getObjectArgument getObjectChildren getObjectDLC getObjectMaterials getObjectProxy getObjectTextures getObjectType getObjectViewDistance getOxygenRemaining getPersonUsedDLCs getPlayerChannel getPlayerUID getPos getPosASL getPosASLVisual getPosASLW getPosATL getPosATLVisual getPosVisual getPosWorld getRepairCargo getResolution getShadowDistance getSlingLoad getSpeed getSuppression getTerrainHeightASL getText getVariable getWeaponCargo getWPPos glanceAt globalChat globalRadio goggles goto group groupChat groupFromNetId groupIconSelectable groupIconsVisible groupId groupOwner groupRadio groupSelectedUnits groupSelectUnit grpNull gunner gusts halt handgunItems handgunMagazine handgunWeapon handsHit hasInterface hasWeapon hcAllGroups hcGroupParams hcLeader hcRemoveAllGroups hcRemoveGroup hcSelected hcSelectGroup hcSetGroup hcShowBar hcShownBar headgear hideBody hideObject hideObjectGlobal hint hintC hintCadet hintSilent hmd hostMission htmlLoad HUDMovementLevels humidity image importAllGroups importance in incapacitatedState independent inflame inflamed inGameUISetEventHandler inheritsFrom initAmbientLife inputAction inRangeOfArtillery insertEditorObject intersect isAbleToBreathe isAgent isArray isAutoHoverOn isAutonomous isAutotest isBleeding isBurning isClass isCollisionLightOn isCopilotEnabled isDedicated isDLCAvailable isEngineOn isEqualTo isFlashlightOn isFlatEmpty isForcedWalk isFormationLeader isHidden isInRemainsCollector isInstructorFigureEnabled isIRLaserOn isKeyActive isKindOf isLightOn isLocalized isManualFire isMarkedForCollection isMultiplayer isNil isNull isNumber isObjectHidden isObjectRTD isOnRoad isPipEnabled isPlayer isRealTime isServer isShowing3DIcons isSteamMission isStreamFriendlyUIEnabled isText isTouchingGround isTurnedOut isTutHintsEnabled isUAVConnectable isUAVConnected isUniformAllowed isWalking isWeaponDeployed isWeaponRested itemCargo items itemsWithMagazines join joinAs joinAsSilent joinSilent joinString kbAddDatabase kbAddDatabaseTargets kbAddTopic kbHasTopic kbReact kbRemoveTopic kbTell kbWasSaid keyImage keyName knowsAbout land landAt landResult language laserTarget lbAdd lbClear lbColor lbCurSel lbData lbDelete lbIsSelected lbPicture lbSelection lbSetColor lbSetCurSel lbSetData lbSetPicture lbSetPictureColor lbSetPictureColorDisabled lbSetPictureColorSelected lbSetSelectColor lbSetSelectColorRight lbSetSelected lbSetTooltip lbSetValue lbSize lbSort lbSortByValue lbText lbValue leader leaderboardDeInit leaderboardGetRows leaderboardInit leaveVehicle libraryCredits libraryDisclaimers lifeState lightAttachObject lightDetachObject lightIsOn lightnings limitSpeed linearConversion lineBreak lineIntersects lineIntersectsObjs lineIntersectsSurfaces lineIntersectsWith linkItem list listObjects ln lnbAddArray lnbAddColumn lnbAddRow lnbClear lnbColor lnbCurSelRow lnbData lnbDeleteColumn lnbDeleteRow lnbGetColumnsPosition lnbPicture lnbSetColor lnbSetColumnsPos lnbSetCurSelRow lnbSetData lnbSetPicture lnbSetText lnbSetValue lnbSize lnbText lnbValue load loadAbs loadBackpack loadFile loadGame loadIdentity loadMagazine loadOverlay loadStatus loadUniform loadVest local localize locationNull locationPosition lock lockCameraTo lockCargo lockDriver locked lockedCargo lockedDriver lockedTurret lockTurret lockWP log logEntities lookAt lookAtPos magazineCargo magazines magazinesAllTurrets magazinesAmmo magazinesAmmoCargo magazinesAmmoFull magazinesDetail magazinesDetailBackpack magazinesDetailUniform magazinesDetailVest magazinesTurret magazineTurretAmmo mapAnimAdd mapAnimClear mapAnimCommit mapAnimDone mapCenterOnCamera mapGridPosition markAsFinishedOnSteam markerAlpha markerBrush markerColor markerDir markerPos markerShape markerSize markerText markerType max members min mineActive mineDetectedBy missionConfigFile missionName missionNamespace missionStart mod modelToWorld modelToWorldVisual moonIntensity morale move moveInAny moveInCargo moveInCommander moveInDriver moveInGunner moveInTurret moveObjectToEnd moveOut moveTime moveTo moveToCompleted moveToFailed musicVolume name name location nameSound nearEntities nearestBuilding nearestLocation nearestLocations nearestLocationWithDubbing nearestObject nearestObjects nearObjects nearObjectsReady nearRoads nearSupplies nearTargets needReload netId netObjNull newOverlay nextMenuItemIndex nextWeatherChange nMenuItems not numberToDate objectCurators objectFromNetId objectParent objNull objStatus onBriefingGroup onBriefingNotes onBriefingPlan onBriefingTeamSwitch onCommandModeChanged onDoubleClick onEachFrame onGroupIconClick onGroupIconOverEnter onGroupIconOverLeave onHCGroupSelectionChanged onMapSingleClick onPlayerConnected onPlayerDisconnected onPreloadFinished onPreloadStarted onShowNewObject onTeamSwitch openCuratorInterface openMap openYoutubeVideo opfor or orderGetIn overcast overcastForecast owner param params parseNumber parseText parsingNamespace particlesQuality pi pickWeaponPool pitch playableSlotsNumber playableUnits playAction playActionNow player playerRespawnTime playerSide playersNumber playGesture playMission playMove playMoveNow playMusic playScriptedMission playSound playSound3D position positionCameraToWorld posScreenToWorld posWorldToScreen ppEffectAdjust ppEffectCommit ppEffectCommitted ppEffectCreate ppEffectDestroy ppEffectEnable ppEffectForceInNVG precision preloadCamera preloadObject preloadSound preloadTitleObj preloadTitleRsc preprocessFile preprocessFileLineNumbers primaryWeapon primaryWeaponItems primaryWeaponMagazine priority private processDiaryLink productVersion profileName profileNamespace profileNameSteam progressLoadingScreen progressPosition progressSetPosition publicVariable publicVariableClient publicVariableServer pushBack putWeaponPool queryItemsPool queryMagazinePool queryWeaponPool rad radioChannelAdd radioChannelCreate radioChannelRemove radioChannelSetCallSign radioChannelSetLabel radioVolume rain rainbow random rank rankId rating rectangular registeredTasks registerTask reload reloadEnabled remoteControl remoteExec remoteExecCall removeAction removeAllActions removeAllAssignedItems removeAllContainers removeAllCuratorAddons removeAllCuratorCameraAreas removeAllCuratorEditingAreas removeAllEventHandlers removeAllHandgunItems removeAllItems removeAllItemsWithMagazines removeAllMissionEventHandlers removeAllMPEventHandlers removeAllMusicEventHandlers removeAllPrimaryWeaponItems removeAllWeapons removeBackpack removeBackpackGlobal removeCuratorAddons removeCuratorCameraArea removeCuratorEditableObjects removeCuratorEditingArea removeDrawIcon removeDrawLinks removeEventHandler removeFromRemainsCollector removeGoggles removeGroupIcon removeHandgunItem removeHeadgear removeItem removeItemFromBackpack removeItemFromUniform removeItemFromVest removeItems removeMagazine removeMagazineGlobal removeMagazines removeMagazinesTurret removeMagazineTurret removeMenuItem removeMissionEventHandler removeMPEventHandler removeMusicEventHandler removePrimaryWeaponItem removeSecondaryWeaponItem removeSimpleTask removeSwitchableUnit removeTeamMember removeUniform removeVest removeWeapon removeWeaponGlobal removeWeaponTurret requiredVersion resetCamShake resetSubgroupDirection resistance resize resources respawnVehicle restartEditorCamera reveal revealMine reverse reversedMouseY roadsConnectedTo roleDescription ropeAttachedObjects ropeAttachedTo ropeAttachEnabled ropeAttachTo ropeCreate ropeCut ropeEndPosition ropeLength ropes ropeUnwind ropeUnwound rotorsForcesRTD rotorsRpmRTD round runInitScript safeZoneH safeZoneW safeZoneWAbs safeZoneX safeZoneXAbs safeZoneY saveGame saveIdentity saveJoysticks saveOverlay saveProfileNamespace saveStatus saveVar savingEnabled say say2D say3D scopeName score scoreSide screenToWorld scriptDone scriptName scriptNull scudState secondaryWeapon secondaryWeaponItems secondaryWeaponMagazine select selectBestPlaces selectDiarySubject selectedEditorObjects selectEditorObject selectionPosition selectLeader selectNoPlayer selectPlayer selectWeapon selectWeaponTurret sendAUMessage sendSimpleCommand sendTask sendTaskResult sendUDPMessage serverCommand serverCommandAvailable serverCommandExecutable serverName serverTime set setAccTime setAirportSide setAmmo setAmmoCargo setAperture setApertureNew setArmoryPoints setAttributes setAutonomous setBehaviour setBleedingRemaining setCameraInterest setCamShakeDefParams setCamShakeParams setCamUseTi setCaptive setCenterOfMass setCollisionLight setCombatMode setCompassOscillation setCuratorCameraAreaCeiling setCuratorCoef setCuratorEditingAreaType setCuratorWaypointCost setCurrentChannel setCurrentTask setCurrentWaypoint setDamage setDammage setDate setDebriefingText setDefaultCamera setDestination setDetailMapBlendPars setDir setDirection setDrawIcon setDropInterval setEditorMode setEditorObjectScope setEffectCondition setFace setFaceAnimation setFatigue setFlagOwner setFlagSide setFlagTexture setFog setFog array setFormation setFormationTask setFormDir setFriend setFromEditor setFSMVariable setFuel setFuelCargo setGroupIcon setGroupIconParams setGroupIconsSelectable setGroupIconsVisible setGroupId setGroupIdGlobal setGroupOwner setGusts setHideBehind setHit setHitIndex setHitPointDamage setHorizonParallaxCoef setHUDMovementLevels setIdentity setImportance setLeader setLightAmbient setLightAttenuation setLightBrightness setLightColor setLightDayLight setLightFlareMaxDistance setLightFlareSize setLightIntensity setLightnings setLightUseFlare setLocalWindParams setMagazineTurretAmmo setMarkerAlpha setMarkerAlphaLocal setMarkerBrush setMarkerBrushLocal setMarkerColor setMarkerColorLocal setMarkerDir setMarkerDirLocal setMarkerPos setMarkerPosLocal setMarkerShape setMarkerShapeLocal setMarkerSize setMarkerSizeLocal setMarkerText setMarkerTextLocal setMarkerType setMarkerTypeLocal setMass setMimic setMousePosition setMusicEffect setMusicEventHandler setName setNameSound setObjectArguments setObjectMaterial setObjectProxy setObjectTexture setObjectTextureGlobal setObjectViewDistance setOvercast setOwner setOxygenRemaining setParticleCircle setParticleClass setParticleFire setParticleParams setParticleRandom setPilotLight setPiPEffect setPitch setPlayable setPlayerRespawnTime setPos setPosASL setPosASL2 setPosASLW setPosATL setPosition setPosWorld setRadioMsg setRain setRainbow setRandomLip setRank setRectangular setRepairCargo setShadowDistance setSide setSimpleTaskDescription setSimpleTaskDestination setSimpleTaskTarget setSimulWeatherLayers setSize setSkill setSkill array setSlingLoad setSoundEffect setSpeaker setSpeech setSpeedMode setStatValue setSuppression setSystemOfUnits setTargetAge setTaskResult setTaskState setTerrainGrid setText setTimeMultiplier setTitleEffect setTriggerActivation setTriggerArea setTriggerStatements setTriggerText setTriggerTimeout setTriggerType setType setUnconscious setUnitAbility setUnitPos setUnitPosWeak setUnitRank setUnitRecoilCoefficient setUnloadInCombat setUserActionText setVariable setVectorDir setVectorDirAndUp setVectorUp setVehicleAmmo setVehicleAmmoDef setVehicleArmor setVehicleId setVehicleLock setVehiclePosition setVehicleTiPars setVehicleVarName setVelocity setVelocityTransformation setViewDistance setVisibleIfTreeCollapsed setWaves setWaypointBehaviour setWaypointCombatMode setWaypointCompletionRadius setWaypointDescription setWaypointFormation setWaypointHousePosition setWaypointLoiterRadius setWaypointLoiterType setWaypointName setWaypointPosition setWaypointScript setWaypointSpeed setWaypointStatements setWaypointTimeout setWaypointType setWaypointVisible setWeaponReloadingTime setWind setWindDir setWindForce setWindStr setWPPos show3DIcons showChat showCinemaBorder showCommandingMenu showCompass showCuratorCompass showGPS showHUD showLegend showMap shownArtilleryComputer shownChat shownCompass shownCuratorCompass showNewEditorObject shownGPS shownHUD shownMap shownPad shownRadio shownUAVFeed shownWarrant shownWatch showPad showRadio showSubtitles showUAVFeed showWarrant showWatch showWaypoint side sideChat sideEnemy sideFriendly sideLogic sideRadio sideUnknown simpleTasks simulationEnabled simulCloudDensity simulCloudOcclusion simulInClouds simulWeatherSync sin size sizeOf skill skillFinal skipTime sleep sliderPosition sliderRange sliderSetPosition sliderSetRange sliderSetSpeed sliderSpeed slingLoadAssistantShown soldierMagazines someAmmo sort soundVolume spawn speaker speed speedMode splitString sqrt squadParams stance startLoadingScreen step stop stopped str sunOrMoon supportInfo suppressFor surfaceIsWater surfaceNormal surfaceType swimInDepth switchableUnits switchAction switchCamera switchGesture switchLight switchMove synchronizedObjects synchronizedTriggers synchronizedWaypoints synchronizeObjectsAdd synchronizeObjectsRemove synchronizeTrigger synchronizeWaypoint synchronizeWaypoint trigger systemChat systemOfUnits tan targetKnowledge targetsAggregate targetsQuery taskChildren taskCompleted taskDescription taskDestination taskHint taskNull taskParent taskResult taskState teamMember teamMemberNull teamName teams teamSwitch teamSwitchEnabled teamType terminate terrainIntersect terrainIntersectASL text text location textLog textLogFormat tg time timeMultiplier titleCut titleFadeOut titleObj titleRsc titleText toArray toLower toString toUpper triggerActivated triggerActivation triggerArea triggerAttachedVehicle triggerAttachObject triggerAttachVehicle triggerStatements triggerText triggerTimeout triggerTimeoutCurrent triggerType turretLocal turretOwner turretUnit tvAdd tvClear tvCollapse tvCount tvCurSel tvData tvDelete tvExpand tvPicture tvSetCurSel tvSetData tvSetPicture tvSetPictureColor tvSetTooltip tvSetValue tvSort tvSortByValue tvText tvValue type typeName typeOf UAVControl uiNamespace uiSleep unassignCurator unassignItem unassignTeam unassignVehicle underwater uniform uniformContainer uniformItems uniformMagazines unitAddons unitBackpack unitPos unitReady unitRecoilCoefficient units unitsBelowHeight unlinkItem unlockAchievement unregisterTask updateDrawIcon updateMenuItem updateObjectTree useAudioTimeForMoves vectorAdd vectorCos vectorCrossProduct vectorDiff vectorDir vectorDirVisual vectorDistance vectorDistanceSqr vectorDotProduct vectorFromTo vectorMagnitude vectorMagnitudeSqr vectorMultiply vectorNormalized vectorUp vectorUpVisual vehicle vehicleChat vehicleRadio vehicles vehicleVarName velocity velocityModelSpace verifySignature vest vestContainer vestItems vestMagazines viewDistance visibleCompass visibleGPS visibleMap visiblePosition visiblePositionASL visibleWatch waitUntil waves waypointAttachedObject waypointAttachedVehicle waypointAttachObject waypointAttachVehicle waypointBehaviour waypointCombatMode waypointCompletionRadius waypointDescription waypointFormation waypointHousePosition waypointLoiterRadius waypointLoiterType waypointName waypointPosition waypoints waypointScript waypointsEnabledUAV waypointShow waypointSpeed waypointStatements waypointTimeout waypointTimeoutCurrent waypointType waypointVisible weaponAccessories weaponCargo weaponDirection weaponLowered weapons weaponsItems weaponsItemsCargo weaponState weaponsTurret weightRTD west WFSideText wind windDir windStr wingsForcesRTD worldName worldSize worldToModel worldToModelVisual worldToScreen _forEachIndex _this _x",literal:"true false nil"},c:[e.CLCM,e.CBCM,e.NM,a,t.preprocessor],i:/#/}});hljs.registerLanguage("vim",function(e){return{l:/[!#@\w]+/,k:{keyword:"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank",built_in:"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp"},i:/;/,c:[e.NM,e.ASM,{cN:"string",b:/"(\\"|\n\\|[^"\n])*"/},e.C('"',"$"),{cN:"variable",b:/[bwtglsav]:[\w\d_]*/},{cN:"function",bK:"function function!",e:"$",r:0,c:[e.TM,{cN:"params",b:"\\(",e:"\\)"}]},{cN:"symbol",b:/<[\w-]+>/}]}});hljs.registerLanguage("irpf90",function(e){var t={cN:"params",b:"\\(",e:"\\)"},n={literal:".False. .True.",keyword:"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data begin_provider &begin_provider end_provider begin_shell end_shell begin_template end_template subst assert touch soft_touch provide no_dep free irp_if irp_else irp_endif irp_write irp_read",built_in:"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image IRP_ALIGN irp_here"};return{cI:!0,k:n,i:/\/\*/,c:[e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{cN:"string",r:0}),{cN:"function",bK:"subroutine function program",i:"[${=\\n]",c:[e.UTM,t]},e.C("!","$",{r:0}),e.C("begin_doc","end_doc",{r:10}),{cN:"number",b:"(?=\\b|\\+|\\-|\\.)(?=\\.\\d|\\d)(?:\\d+)?(?:\\.?\\d*)(?:[de][+-]?\\d+)?\\b\\.?",r:0}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},_={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},i=/[a-zA-Z@][a-zA-Z0-9_]*/,n="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:_,l:i,i:""}]}]},{cN:"class",b:"("+n.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:n,l:i,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("swift",function(e){var t={keyword:"__COLUMN__ __FILE__ __FUNCTION__ __LINE__ as as! as? associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},i={cN:"type",b:"\\b[A-Z][\\w']*",r:0},n=e.C("/\\*","\\*/",{c:["self"]}),r={cN:"subst",b:/\\\(/,e:"\\)",k:t,c:[]},a={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",r:0},o=e.inherit(e.QSM,{c:[r,e.BE]});return r.c=[a],{k:t,c:[o,e.CLCM,n,i,a,{cN:"function",bK:"func",e:"{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b://},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,c:["self",a,o,e.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",bK:"struct protocol class extension enum",k:t,e:"\\{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/})]},{cN:"meta",b:"(@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},{bK:"import",e:/$/,c:[e.CLCM,n]}]}});hljs.registerLanguage("mizar",function(e){return{k:"environ vocabularies notations constructors definitions registrations theorems schemes requirements begin end definition registration cluster existence pred func defpred deffunc theorem proof let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from be being by means equals implies iff redefine define now not or attr is mode suppose per cases set thesis contradiction scheme reserve struct correctness compatibility coherence symmetry assymetry reflexivity irreflexivity connectedness uniqueness commutativity idempotence involutiveness projectivity",c:[e.C("::","$")]}});hljs.registerLanguage("dts",function(e){var a={cN:"string",v:[e.inherit(e.QSM,{b:'((u8?|U)|L)?"'}),{b:'(u8?|U)?R"',e:'"',c:[e.BE]},{b:"'\\\\?.",e:"'",i:"."}]},c={cN:"number",v:[{b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},{b:e.CNR}],r:0},b={cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef ifdef ifndef"},c:[{b:/\\\n/,r:0},{bK:"include",e:"$",k:{"meta-keyword":"include"},c:[e.inherit(a,{cN:"meta-string"}),{cN:"meta-string",b:"<",e:">",i:"\\n"}]},a,e.CLCM,e.CBCM]},i={cN:"variable",b:"\\&[a-z\\d_]*\\b"},r={cN:"meta-keyword",b:"/[a-z][a-z\\d-]*/"},d={cN:"symbol",b:"^\\s*[a-zA-Z_][a-zA-Z\\d_]*:"},n={cN:"params",b:"<",e:">",c:[c,i]},s={cN:"class",b:/[a-zA-Z_][a-zA-Z\d_@]*\s{/,e:/[{;=]/,rB:!0,eE:!0},t={cN:"class",b:"/\\s*{",e:"};",r:10,c:[i,r,d,s,n,e.CLCM,e.CBCM,c,a]};return{k:"",c:[t,i,r,d,s,n,e.CLCM,e.CBCM,c,a,b,{b:e.IR+"::",k:""}]}});hljs.registerLanguage("step21",function(e){var i="[A-Z_][A-Z0-9_.]*",r={keyword:"HEADER ENDSEC DATA"},t={cN:"meta",b:"ISO-10303-21;",r:10},n={cN:"meta",b:"END-ISO-10303-21;",r:10};return{aliases:["p21","step","stp"],cI:!0,l:i,k:r,c:[t,n,e.CLCM,e.CBCM,e.C("/\\*\\*!","\\*/"),e.CNM,e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null}),{cN:"string",b:"'",e:"'"},{cN:"symbol",v:[{b:"#",e:"\\d+",i:"\\W"}]}]}});hljs.registerLanguage("tap",function(b){return{cI:!0,c:[b.HCM,{cN:"meta",v:[{b:"^TAP version (\\d+)$"},{b:"^1\\.\\.(\\d+)$"}]},{b:"(s+)?---$",e:"\\.\\.\\.$",sL:"yaml",r:0},{cN:"number",b:" (\\d+) "},{cN:"symbol",v:[{b:"^ok"},{b:"^not ok"}]}]}});hljs.registerLanguage("rib",function(e){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:">/,l:"[a-z_]\\w*!?",c:[{cN:"literal",b:/\[(\|\|)?\]|\(\)/,r:0},e.C("\\(\\*","\\*\\)",{c:["self"]}),{cN:"symbol",b:"'[A-Za-z_](?!')[\\w']*"},{cN:"type",b:"`[A-Z][\\w']*"},{cN:"type",b:"\\b[A-Z][\\w']*",r:0},{b:"[a-z_]\\w*'[\\w']*"},e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{i:null}),{cN:"number",b:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",r:0},{b:/[-=]>/}]}});hljs.registerLanguage("mipsasm",function(s){return{cI:!0,aliases:["mips"],l:"\\.?"+s.IR,k:{meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .ltorg ",built_in:"$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 $16 $17 $18 $19 $20 $21 $22 $23 $24 $25 $26 $27 $28 $29 $30 $31 zero at v0 v1 a0 a1 a2 a3 a4 a5 a6 a7 t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 s0 s1 s2 s3 s4 s5 s6 s7 s8 k0 k1 gp sp fp ra $f0 $f1 $f2 $f2 $f4 $f5 $f6 $f7 $f8 $f9 $f10 $f11 $f12 $f13 $f14 $f15 $f16 $f17 $f18 $f19 $f20 $f21 $f22 $f23 $f24 $f25 $f26 $f27 $f28 $f29 $f30 $f31 Context Random EntryLo0 EntryLo1 Context PageMask Wired EntryHi HWREna BadVAddr Count Compare SR IntCtl SRSCtl SRSMap Cause EPC PRId EBase Config Config1 Config2 Config3 LLAddr Debug DEPC DESAVE CacheErr ECC ErrorEPC TagLo DataLo TagHi DataHi WatchLo WatchHi PerfCtl PerfCnt "},c:[{cN:"keyword",b:"\\b(addi?u?|andi?|b(al)?|beql?|bgez(al)?l?|bgtzl?|blezl?|bltz(al)?l?|bnel?|cl[oz]|divu?|ext|ins|j(al)?|jalr(.hb)?|jr(.hb)?|lbu?|lhu?|ll|lui|lw[lr]?|maddu?|mfhi|mflo|movn|movz|move|msubu?|mthi|mtlo|mul|multu?|nop|nor|ori?|rotrv?|sb|sc|se[bh]|sh|sllv?|slti?u?|srav?|srlv?|subu?|sw[lr]?|xori?|wsbh|abs.[sd]|add.[sd]|alnv.ps|bc1[ft]l?|c.(s?f|un|u?eq|[ou]lt|[ou]le|ngle?|seq|l[et]|ng[et]).[sd]|(ceil|floor|round|trunc).[lw].[sd]|cfc1|cvt.d.[lsw]|cvt.l.[dsw]|cvt.ps.s|cvt.s.[dlw]|cvt.s.p[lu]|cvt.w.[dls]|div.[ds]|ldx?c1|luxc1|lwx?c1|madd.[sd]|mfc1|mov[fntz]?.[ds]|msub.[sd]|mth?c1|mul.[ds]|neg.[ds]|nmadd.[ds]|nmsub.[ds]|p[lu][lu].ps|recip.fmt|r?sqrt.[ds]|sdx?c1|sub.[ds]|suxc1|swx?c1|break|cache|d?eret|[de]i|ehb|mfc0|mtc0|pause|prefx?|rdhwr|rdpgpr|sdbbp|ssnop|synci?|syscall|teqi?|tgei?u?|tlb(p|r|w[ir])|tlti?u?|tnei?|wait|wrpgpr)",e:"\\s"},s.C("[;#]","$"),s.CBCM,s.QSM,{cN:"string",b:"'",e:"[^\\\\]'",r:0},{cN:"title",b:"\\|",e:"\\|",i:"\\n",r:0},{cN:"number",v:[{b:"0x[0-9a-f]+"},{b:"\\b-?\\d+"}],r:0},{cN:"symbol",v:[{b:"^\\s*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{b:"^\\s*[0-9]+:"},{b:"[0-9]+[bf]"}],r:0}],i:"/"}});hljs.registerLanguage("subunit",function(s){var r={cN:"string",b:"\\[\n(multipart)?",e:"\\]\n"},t={cN:"string",b:"\\d{4}-\\d{2}-\\d{2}(\\s+)\\d{2}:\\d{2}:\\d{2}.\\d+Z"},e={cN:"string",b:"(\\+|-)\\d+"},c={cN:"keyword",r:10,v:[{b:"^(test|testing|success|successful|failure|error|skip|xfail|uxsuccess)(:?)\\s+(test)?"},{b:"^progress(:?)(\\s+)?(pop|push)?"},{b:"^tags:"},{b:"^time:"}]};return{cI:!0,c:[r,t,e,c]}});hljs.registerLanguage("vbscript",function(e){return{aliases:["vbs"],cI:!0,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[e.inherit(e.QSM,{c:[{b:'""'}]}),e.C(/'/,/$/,{r:0}),e.CNM]}});hljs.registerLanguage("vbscript-html",function(r){return{sL:"xml",c:[{b:"<%",e:"%>",sL:"vbscript"}]}});hljs.registerLanguage("typescript",function(e){var r={keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void"};return{aliases:["ts"],k:r,c:[{cN:"meta",b:/^\s*['"]use strict['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM],r:0},{cN:"function",b:"function",e:/[\{;]/,eE:!0,k:r,c:["self",e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:[e.CLCM,e.CBCM],i:/["'\(]/}],i:/%/,r:0},{bK:"constructor",e:/\{/,eE:!0},{b:/module\./,k:{built_in:"module"},r:0},{bK:"module",e:/\{/,eE:!0},{bK:"interface",e:/\{/,eE:!0,k:"interface extends"},{b:/\$[(.]/},{b:"\\."+e.IR,r:0}]}});hljs.registerLanguage("tcl",function(e){return{aliases:["tk"],k:"after append apply array auto_execok auto_import auto_load auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror binary break catch cd chan clock close concat continue dde dict encoding eof error eval exec exit expr fblocked fconfigure fcopy file fileevent filename flush for foreach format gets glob global history http if incr info interp join lappend|10 lassign|10 lindex|10 linsert|10 list llength|10 load lrange|10 lrepeat|10 lreplace|10 lreverse|10 lsearch|10 lset|10 lsort|10 mathfunc mathop memory msgcat namespace open package parray pid pkg::create pkg_mkIndex platform platform::shell proc puts pwd read refchan regexp registry regsub|10 rename return safe scan seek set socket source split string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord tcl_startOfPreviousWord tcl_wordBreakAfter tcl_wordBreakBefore tcltest tclvars tell time tm trace unknown unload unset update uplevel upvar variable vwait while",c:[e.C(";[ \\t]*#","$"),e.C("^[ \\t]*#","$"),{bK:"proc",e:"[\\{]",eE:!0,c:[{cN:"title",b:"[ \\t\\n\\r]+(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*",e:"[ \\t\\n\\r]",eW:!0,eE:!0}]},{eE:!0,v:[{b:"\\$(\\{)?(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*\\(([a-zA-Z0-9_])*\\)",e:"[^a-zA-Z0-9_\\}\\$]"},{b:"\\$(\\{)?(::)?[a-zA-Z_]((::)?[a-zA-Z0-9_])*",e:"(\\))?[^a-zA-Z0-9_\\}\\$]"}]},{cN:"string",c:[e.BE],v:[e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},{cN:"number",v:[e.BNM,e.CNM]}]}});hljs.registerLanguage("axapta",function(e){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.CNM,{cN:"meta",b:"#",e:"$"},{cN:"class",bK:"class interface",e:"{",eE:!0,i:":",c:[{bK:"extends implements"},e.UTM]}]}});hljs.registerLanguage("vbnet",function(e){return{aliases:["vb"],cI:!0,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"//|{|}|endif|gosub|variant|wend",c:[e.inherit(e.QSM,{c:[{b:'""'}]}),e.C("'","$",{rB:!0,c:[{cN:"doctag",b:"'''|",c:[e.PWM]},{cN:"doctag",b:"",c:[e.PWM]}]}),e.CNM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elseif end region externalsource"}}]}});hljs.registerLanguage("protobuf",function(e){return{k:{keyword:"package import option optional required repeated group",built_in:"double float int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes",literal:"true false"},c:[e.QSM,e.NM,e.CLCM,{cN:"class",bK:"message enum service",e:/\{/,i:/\n/,c:[e.inherit(e.TM,{starts:{eW:!0,eE:!0}})]},{cN:"function",bK:"rpc",e:/;/,eE:!0,k:"rpc returns"},{b:/^\s*[A-Z_]+/,e:/\s*=/,eE:!0}]}});hljs.registerLanguage("hsp",function(e){return{cI:!0,l:/[\w\._]+/,k:"goto gosub return break repeat loop continue wait await dim sdim foreach dimtype dup dupptr end stop newmod delmod mref run exgoto on mcall assert logmes newlab resume yield onexit onerror onkey onclick oncmd exist delete mkdir chdir dirlist bload bsave bcopy memfile if else poke wpoke lpoke getstr chdpm memexpand memcpy memset notesel noteadd notedel noteload notesave randomize noteunsel noteget split strrep setease button chgdisp exec dialog mmload mmplay mmstop mci pset pget syscolor mes print title pos circle cls font sysfont objsize picload color palcolor palette redraw width gsel gcopy gzoom gmode bmpsave hsvcolor getkey listbox chkbox combox input mesbox buffer screen bgscr mouse objsel groll line clrobj boxf objprm objmode stick grect grotate gsquare gradf objimage objskip objenable celload celdiv celput newcom querycom delcom cnvstow comres axobj winobj sendmsg comevent comevarg sarrayconv callfunc cnvwtos comevdisp libptr system hspstat hspver stat cnt err strsize looplev sublev iparam wparam lparam refstr refdval int rnd strlen length length2 length3 length4 vartype gettime peek wpeek lpeek varptr varuse noteinfo instr abs limit getease str strmid strf getpath strtrim sin cos tan atan sqrt double absf expf logf limitf powf geteasef mousex mousey mousew hwnd hinstance hdc ginfo objinfo dirinfo sysinfo thismod __hspver__ __hsp30__ __date__ __time__ __line__ __file__ _debug __hspdef__ and or xor not screen_normal screen_palette screen_hide screen_fixedsize screen_tool screen_frame gmode_gdi gmode_mem gmode_rgb0 gmode_alpha gmode_rgb0alpha gmode_add gmode_sub gmode_pixela ginfo_mx ginfo_my ginfo_act ginfo_sel ginfo_wx1 ginfo_wy1 ginfo_wx2 ginfo_wy2 ginfo_vx ginfo_vy ginfo_sizex ginfo_sizey ginfo_winx ginfo_winy ginfo_mesx ginfo_mesy ginfo_r ginfo_g ginfo_b ginfo_paluse ginfo_dispx ginfo_dispy ginfo_cx ginfo_cy ginfo_intid ginfo_newid ginfo_sx ginfo_sy objinfo_mode objinfo_bmscr objinfo_hwnd notemax notesize dir_cur dir_exe dir_win dir_sys dir_cmdline dir_desktop dir_mydoc dir_tv font_normal font_bold font_italic font_underline font_strikeout font_antialias objmode_normal objmode_guifont objmode_usefont gsquare_grad msgothic msmincho do until while wend for next _break _continue switch case default swbreak swend ddim ldim alloc m_pi rad2deg deg2rad ease_linear ease_quad_in ease_quad_out ease_quad_inout ease_cubic_in ease_cubic_out ease_cubic_inout ease_quartic_in ease_quartic_out ease_quartic_inout ease_bounce_in ease_bounce_out ease_bounce_inout ease_shake_in ease_shake_out ease_shake_inout ease_loop",c:[e.CLCM,e.CBCM,e.QSM,e.ASM,{cN:"string",b:'{"',e:'"}',c:[e.BE]},e.C(";","$",{r:0}),{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"addion cfunc cmd cmpopt comfunc const defcfunc deffunc define else endif enum epack func global if ifdef ifndef include modcfunc modfunc modinit modterm module pack packopt regcmd runtime undef usecom uselib"},c:[e.inherit(e.QSM,{cN:"meta-string"}),e.NM,e.CNM,e.CLCM,e.CBCM]},{cN:"symbol",b:"^\\*(\\w+|@)"},e.NM,e.CNM]}});hljs.registerLanguage("dsconfig",function(e){var i={cN:"string",b:/"/,e:/"/},r={cN:"string",b:/'/,e:/'/},s={cN:"string",b:"[\\w-?]+:\\w+",e:"\\W",r:0},t={cN:"string",b:"\\w+-?\\w+",e:"\\W",r:0};return{k:"dsconfig",c:[{cN:"keyword",b:"^dsconfig",e:"\\s",eE:!0,r:10},{cN:"built_in",b:"(list|create|get|set|delete)-(\\w+)",e:"\\s",eE:!0,i:"!@#$%^&*()",r:10},{cN:"built_in",b:"--(\\w+)",e:"\\s",eE:!0},i,r,s,t,e.HCM]}});hljs.registerLanguage("bnf",function(e){return{c:[{cN:"attribute",b://},{b:/::=/,starts:{e:/$/,c:[{b://},e.CLCM,e.CBCM,e.ASM,e.QSM]}}]}});hljs.registerLanguage("gcode",function(N){var e="[A-Z_][A-Z0-9_.]*",c="\\%",E="IF DO WHILE ENDWHILE CALL ENDIF SUB ENDSUB GOTO REPEAT ENDREPEAT EQ LT GT NE GE LE OR XOR",i={cN:"meta",b:"([O])([0-9]+)"},n=[N.CLCM,N.CBCM,N.C(/\(/,/\)/),N.inherit(N.CNM,{b:"([-+]?([0-9]*\\.?[0-9]+\\.?))|"+N.CNR}),N.inherit(N.ASM,{i:null}),N.inherit(N.QSM,{i:null}),{cN:"name",b:"([G])([0-9]+\\.?[0-9]?)"},{cN:"name",b:"([M])([0-9]+\\.?[0-9]?)"},{cN:"attr",b:"(VC|VS|#)",e:"(\\d+)"},{cN:"attr",b:"(VZOFX|VZOFY|VZOFZ)"},{cN:"built_in",b:"(ATAN|ABS|ACOS|ASIN|SIN|COS|EXP|FIX|FUP|ROUND|LN|TAN)(\\[)",e:"([-+]?([0-9]*\\.?[0-9]+\\.?))(\\])"},{cN:"symbol",v:[{b:"N",e:"\\d+",i:"\\W"}]}];return{aliases:["nc"],cI:!0,l:e,k:E,c:[{cN:"meta",b:c},i].concat(n)}});hljs.registerLanguage("ada",function(e){var r="\\d(_|\\d)*",t="[eE][-+]?"+r,s=r+"(\\."+r+")?("+t+")?",n="\\w+",a=r+"#"+n+"(\\."+n+")?#("+t+")?",i="\\b("+a+"|"+s+")",c="[A-Za-z](_?[A-Za-z0-9.])*",o="[]{}%#'\"",b=e.C("--","$"),d={b:"\\s+:\\s+",e:"\\s*(:=|;|\\)|=>|$)",i:o,c:[{bK:"loop for declare others",endsParent:!0},{cN:"keyword",bK:"not null constant access function procedure in out aliased exception"},{cN:"type",b:c,endsParent:!0,r:0}]};return{cI:!0,k:{keyword:"abort else new return abs elsif not reverse abstract end accept entry select access exception of separate aliased exit or some all others subtype and for out synchronized array function overriding at tagged generic package task begin goto pragma terminate body private then if procedure type case in protected constant interface is raise use declare range delay limited record when delta loop rem while digits renames with do mod requeue xor",literal:"True False"},c:[b,{cN:"string",b:/"/,e:/"/,c:[{b:/""/,r:0}]},{cN:"string",b:/'.'/},{cN:"number",b:i,r:0},{cN:"symbol",b:"'"+c},{cN:"title",b:"(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?",e:"(is|$)",k:"package body",eB:!0,eE:!0,i:o},{b:"(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+",e:"(\\bis|\\bwith|\\brenames|\\)\\s*;)",k:"overriding function procedure with is renames return",rB:!0,c:[b,{cN:"title",b:"(\\bwith\\s+)?\\b(function|procedure)\\s+",e:"(\\(|\\s+|$)",eB:!0,eE:!0,i:o},d,{cN:"type",b:"\\breturn\\s+",e:"(\\s+|;|$)",k:"return",eB:!0,eE:!0,endsParent:!0,i:o}]},{cN:"type",b:"\\b(sub)?type\\s+",e:"\\s+",k:"type",eB:!0,i:o},d]}});hljs.registerLanguage("powershell",function(e){var t={b:"`[\\s\\S]",r:0},o={cN:"variable",v:[{b:/\$[\w\d][\w\d_:]*/}]},n={cN:"literal",b:/\$(null|true|false)\b/},r={cN:"string",v:[{b:/"/,e:/"/},{b:/@"/,e:/^"@/}],c:[t,o,{cN:"variable",b:/\$[A-z]/,e:/[^A-z]/}]},i={cN:"string",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},a={cN:"doctag",v:[{b:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]},s=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[a]});return{aliases:["ps"],l:/-?[A-z\.\-]+/,cI:!0,k:{keyword:"if else foreach return function do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch",built_in:"Add-Computer Add-Content Add-History Add-JobTrigger Add-Member Add-PSSnapin Add-Type Checkpoint-Computer Clear-Content Clear-EventLog Clear-History Clear-Host Clear-Item Clear-ItemProperty Clear-Variable Compare-Object Complete-Transaction Connect-PSSession Connect-WSMan Convert-Path ConvertFrom-Csv ConvertFrom-Json ConvertFrom-SecureString ConvertFrom-StringData ConvertTo-Csv ConvertTo-Html ConvertTo-Json ConvertTo-SecureString ConvertTo-Xml Copy-Item Copy-ItemProperty Debug-Process Disable-ComputerRestore Disable-JobTrigger Disable-PSBreakpoint Disable-PSRemoting Disable-PSSessionConfiguration Disable-WSManCredSSP Disconnect-PSSession Disconnect-WSMan Disable-ScheduledJob Enable-ComputerRestore Enable-JobTrigger Enable-PSBreakpoint Enable-PSRemoting Enable-PSSessionConfiguration Enable-ScheduledJob Enable-WSManCredSSP Enter-PSSession Exit-PSSession Export-Alias Export-Clixml Export-Console Export-Counter Export-Csv Export-FormatData Export-ModuleMember Export-PSSession ForEach-Object Format-Custom Format-List Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command Get-ComputerRestorePoint Get-Content Get-ControlPanelItem Get-Counter Get-Credential Get-Culture Get-Date Get-Event Get-EventLog Get-EventSubscriber Get-ExecutionPolicy Get-FormatData Get-Host Get-HotFix Get-Help Get-History Get-IseSnippet Get-Item Get-ItemProperty Get-Job Get-JobTrigger Get-Location Get-Member Get-Module Get-PfxCertificate Get-Process Get-PSBreakpoint Get-PSCallStack Get-PSDrive Get-PSProvider Get-PSSession Get-PSSessionConfiguration Get-PSSnapin Get-Random Get-ScheduledJob Get-ScheduledJobOption Get-Service Get-TraceSource Get-Transaction Get-TypeData Get-UICulture Get-Unique Get-Variable Get-Verb Get-WinEvent Get-WmiObject Get-WSManCredSSP Get-WSManInstance Group-Object Import-Alias Import-Clixml Import-Counter Import-Csv Import-IseSnippet Import-LocalizedData Import-PSSession Import-Module Invoke-AsWorkflow Invoke-Command Invoke-Expression Invoke-History Invoke-Item Invoke-RestMethod Invoke-WebRequest Invoke-WmiMethod Invoke-WSManAction Join-Path Limit-EventLog Measure-Command Measure-Object Move-Item Move-ItemProperty New-Alias New-Event New-EventLog New-IseSnippet New-Item New-ItemProperty New-JobTrigger New-Object New-Module New-ModuleManifest New-PSDrive New-PSSession New-PSSessionConfigurationFile New-PSSessionOption New-PSTransportOption New-PSWorkflowExecutionOption New-PSWorkflowSession New-ScheduledJobOption New-Service New-TimeSpan New-Variable New-WebServiceProxy New-WinEvent New-WSManInstance New-WSManSessionOption Out-Default Out-File Out-GridView Out-Host Out-Null Out-Printer Out-String Pop-Location Push-Location Read-Host Receive-Job Register-EngineEvent Register-ObjectEvent Register-PSSessionConfiguration Register-ScheduledJob Register-WmiEvent Remove-Computer Remove-Event Remove-EventLog Remove-Item Remove-ItemProperty Remove-Job Remove-JobTrigger Remove-Module Remove-PSBreakpoint Remove-PSDrive Remove-PSSession Remove-PSSnapin Remove-TypeData Remove-Variable Remove-WmiObject Remove-WSManInstance Rename-Computer Rename-Item Rename-ItemProperty Reset-ComputerMachinePassword Resolve-Path Restart-Computer Restart-Service Restore-Computer Resume-Job Resume-Service Save-Help Select-Object Select-String Select-Xml Send-MailMessage Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-JobTrigger Set-Location Set-PSBreakpoint Set-PSDebug Set-PSSessionConfiguration Set-ScheduledJob Set-ScheduledJobOption Set-Service Set-StrictMode Set-TraceSource Set-Variable Set-WmiInstance Set-WSManInstance Set-WSManQuickConfig Show-Command Show-ControlPanelItem Show-EventLog Sort-Object Split-Path Start-Job Start-Process Start-Service Start-Sleep Start-Transaction Start-Transcript Stop-Computer Stop-Job Stop-Process Stop-Service Stop-Transcript Suspend-Job Suspend-Service Tee-Object Test-ComputerSecureChannel Test-Connection Test-ModuleManifest Test-Path Test-PSSessionConfigurationFile Trace-Command Unblock-File Undo-Transaction Unregister-Event Unregister-PSSessionConfiguration Unregister-ScheduledJob Update-FormatData Update-Help Update-List Update-TypeData Use-Transaction Wait-Event Wait-Job Wait-Process Where-Object Write-Debug Write-Error Write-EventLog Write-Host Write-Output Write-Progress Write-Verbose Write-Warning",nomarkup:"-ne -eq -lt -gt -ge -le -not -like -notlike -match -notmatch -contains -notcontains -in -notin -replace"},c:[t,e.NM,r,i,n,o,s]}});hljs.registerLanguage("ceylon",function(e){var a="assembly module package import alias class interface object given value assign void function new of extends satisfies abstracts in out return break continue throw assert dynamic if else switch case for while try catch finally then let this outer super is exists nonempty",t="shared abstract formal default actual variable late native deprecatedfinal sealed annotation suppressWarnings small",s="doc by license see throws tagged",n={cN:"subst",eB:!0,eE:!0,b:/``/,e:/``/,k:a,r:10},r=[{cN:"string",b:'"""',e:'"""',r:10},{cN:"string",b:'"',e:'"',c:[n]},{cN:"string",b:"'",e:"'"},{cN:"number",b:"#[0-9a-fA-F_]+|\\$[01_]+|[0-9_]+(?:\\.[0-9_](?:[eE][+-]?\\d+)?)?[kMGTPmunpf]?",r:0}];return n.c=r,{k:{keyword:a+" "+t,meta:s},i:"\\$[^01]|#[^0-9a-fA-F]",c:[e.CLCM,e.C("/\\*","\\*/",{c:["self"]}),{cN:"meta",b:'@[a-z]\\w*(?:\\:"[^"]*")?'}].concat(r)}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:"",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"symbol",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"string",v:[{b:"``.+?''"},{b:"`.+?'"}]},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:!0,c:[{b:"(link|image:?):",r:0},{cN:"link",b:"\\w",e:"[^\\[]+",r:0},{cN:"string",b:"\\[",e:"\\]",eB:!0,eE:!0,r:0}],r:10}]}});hljs.registerLanguage("purebasic",function(e){var r={cN:"string",b:'(~)?"',e:'"',i:"\\n"},t={cN:"symbol",b:"#[a-zA-Z_]\\w*\\$?"};return{aliases:["pb","pbi"],k:"And As Break CallDebugger Case CompilerCase CompilerDefault CompilerElse CompilerEndIf CompilerEndSelect CompilerError CompilerIf CompilerSelect Continue Data DataSection EndDataSection Debug DebugLevel Default Define Dim DisableASM DisableDebugger DisableExplicit Else ElseIf EnableASM EnableDebugger EnableExplicit End EndEnumeration EndIf EndImport EndInterface EndMacro EndProcedure EndSelect EndStructure EndStructureUnion EndWith Enumeration Extends FakeReturn For Next ForEach ForEver Global Gosub Goto If Import ImportC IncludeBinary IncludeFile IncludePath Interface Macro NewList Not Or ProcedureReturn Protected Prototype PrototypeC Read ReDim Repeat Until Restore Return Select Shared Static Step Structure StructureUnion Swap To Wend While With XIncludeFile XOr Procedure ProcedureC ProcedureCDLL ProcedureDLL Declare DeclareC DeclareCDLL DeclareDLL",c:[e.C(";","$",{r:0}),{cN:"function",b:"\\b(Procedure|Declare)(C|CDLL|DLL)?\\b",e:"\\(",eE:!0,rB:!0,c:[{cN:"keyword",b:"(Procedure|Declare)(C|CDLL|DLL)?",eE:!0},{cN:"type",b:"\\.\\w*"},e.UTM]},r,t]}});hljs.registerLanguage("scheme",function(e){var t="[^\\(\\)\\[\\]\\{\\}\",'`;#|\\\\\\s]+",r="(\\-|\\+)?\\d+([./]\\d+)?",a=r+"[+\\-]"+r+"i",i={"builtin-name":"case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules ' * + , ,@ - ... / ; < <= = => > >= ` abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string=? string>? string? substring symbol->string symbol? tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?"},n={cN:"meta",b:"^#!",e:"$"},c={cN:"literal",b:"(#t|#f|#\\\\"+t+"|#\\\\.)"},l={cN:"number",v:[{b:r,r:0},{b:a,r:0},{b:"#b[0-1]+(/[0-1]+)?"},{b:"#o[0-7]+(/[0-7]+)?"},{b:"#x[0-9a-f]+(/[0-9a-f]+)?"}]},s=e.QSM,o=[e.C(";","$",{r:0}),e.C("#\\|","\\|#")],u={b:t,r:0},p={cN:"symbol",b:"'"+t},d={eW:!0,r:0},m={b:/'/,c:[{b:"\\(",e:"\\)",c:["self",c,s,l,u,p]}]},g={cN:"name",b:t,l:t,k:i},h={b:/lambda/,eW:!0,rB:!0,c:[g,{b:/\(/,e:/\)/,endsParent:!0,c:[u]}]},b={v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}],c:[h,g,d]};return d.c=[c,l,s,u,p,m,b].concat(o),{i:/\S/,c:[n,l,s,p,m,b].concat(o)}});hljs.registerLanguage("scss",function(e){var t="[a-zA-Z-][a-zA-Z0-9_-]*",i={cN:"variable",b:"(\\$"+t+")\\b"},r={cN:"number",b:"#[0-9A-Fa-f]+"};({cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:!0,i:"[^\\s]",starts:{eW:!0,eE:!0,c:[r,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"meta",b:"!important"}]}});return{cI:!0,i:"[=/|']",c:[e.CLCM,e.CBCM,{cN:"selector-id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"selector-class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"selector-attr",b:"\\[",e:"\\]",i:"$"},{cN:"selector-tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},i,{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{b:":",e:";",c:[i,r,e.CSSNM,e.QSM,e.ASM,{cN:"meta",b:"!important"}]},{b:"@",e:"[{;]",k:"mixin include extend for if else each while charset import debug media page content font-face namespace warn",c:[i,e.QSM,e.ASM,r,e.CSSNM,{b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}});hljs.registerLanguage("xquery",function(e){var t="for let if while then else return where group by xquery encoding versionmodule namespace boundary-space preserve strip default collation base-uri orderingcopy-namespaces order declare import schema namespace function option in allowing emptyat tumbling window sliding window start when only end when previous next stable ascendingdescending empty greatest least some every satisfies switch case typeswitch try catch andor to union intersect instance of treat as castable cast map array delete insert intoreplace value rename copy modify update",a="false true xs:string xs:integer element item xs:date xs:datetime xs:float xs:double xs:decimal QName xs:anyURI xs:long xs:int xs:short xs:byte attribute",s={b:/\$[a-zA-Z0-9\-]+/},n={cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},r={cN:"string",v:[{b:/"/,e:/"/,c:[{b:/""/,r:0}]},{b:/'/,e:/'/,c:[{b:/''/,r:0}]}]},i={cN:"meta",b:"%\\w+"},c={cN:"comment",b:"\\(:",e:":\\)",r:10,c:[{cN:"doctag",b:"@\\w+"}]},o={b:"{",e:"}"},l=[s,r,n,c,i,o];return o.c=l,{aliases:["xpath","xq"],cI:!1,l:/[a-zA-Z\$][a-zA-Z0-9_:\-]*/,i:/(proc)|(abstract)|(extends)|(until)|(#)/,k:{keyword:t,literal:a},c:l}});hljs.registerLanguage("taggerscript",function(e){var c={cN:"comment",b:/\$noop\(/,e:/\)/,c:[{b:/\(/,e:/\)/,c:["self",{b:/\\./}]}],r:10},r={cN:"keyword",b:/\$(?!noop)[a-zA-Z][_a-zA-Z0-9]*/,e:/\(/,eE:!0},a={cN:"variable",b:/%[_a-zA-Z0-9:]*/,e:"%"},b={cN:"symbol",b:/\\./};return{c:[c,r,a,b]}});hljs.registerLanguage("smalltalk",function(e){var s="[a-z][a-zA-Z0-9_]*",a={cN:"string",b:"\\$.{1}"},r={cN:"symbol",b:"#"+e.UIR};return{aliases:["st"],k:"self super nil true false thisContext",c:[e.C('"','"'),e.ASM,{cN:"type",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{b:s+":",r:0},e.CNM,r,a,{b:"\\|[ ]*"+s+"([ ]+"+s+")*[ ]*\\|",rB:!0,e:/\|/,i:/\S/,c:[{b:"(\\|[ ]*)?"+s}]},{b:"\\#\\(",e:"\\)",c:[e.ASM,a,e.CNM,r]}]}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}});hljs.registerLanguage("actionscript",function(e){var a="[a-zA-Z_$][a-zA-Z0-9_$]*",t="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)",c={cN:"rest_arg",b:"[.]{3}",e:a,r:10};return{aliases:["as"],k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[e.ASM,e.QSM,e.CLCM,e.CBCM,e.CNM,{cN:"class",bK:"package",e:"{",c:[e.TM]},{cN:"class",bK:"class interface",e:"{",eE:!0,c:[{bK:"extends implements"},e.TM]},{cN:"meta",bK:"import include",e:";",k:{"meta-keyword":"import include"}},{cN:"function",bK:"function",e:"[{;]",eE:!0,i:"\\S",c:[e.TM,{cN:"params",b:"\\(",e:"\\)",c:[e.ASM,e.QSM,e.CLCM,e.CBCM,c]},{b:":\\s*"+t}]},e.METHOD_GUARD],i:/#/}});hljs.registerLanguage("mercury",function(e){var i={keyword:"module use_module import_module include_module end_module initialise mutable initialize finalize finalise interface implementation pred mode func type inst solver any_pred any_func is semidet det nondet multi erroneous failure cc_nondet cc_multi typeclass instance where pragma promise external trace atomic or_else require_complete_switch require_det require_semidet require_multi require_nondet require_cc_multi require_cc_nondet require_erroneous require_failure",meta:"inline no_inline type_spec source_file fact_table obsolete memo loop_check minimal_model terminates does_not_terminate check_termination promise_equivalent_clauses foreign_proc foreign_decl foreign_code foreign_type foreign_import_module foreign_export_enum foreign_export foreign_enum may_call_mercury will_not_call_mercury thread_safe not_thread_safe maybe_thread_safe promise_pure promise_semipure tabled_for_io local untrailed trailed attach_to_io_state can_pass_as_mercury_type stable will_not_throw_exception may_modify_trail will_not_modify_trail may_duplicate may_not_duplicate affects_liveness does_not_affect_liveness doesnt_affect_liveness no_sharing unknown_sharing sharing",built_in:"some all not if then else true fail false try catch catch_any semidet_true semidet_false semidet_fail impure_true impure semipure"},r=e.C("%","$"),t={cN:"number",b:"0'.\\|0[box][0-9a-fA-F]*"},_=e.inherit(e.ASM,{r:0}),n=e.inherit(e.QSM,{r:0}),a={cN:"subst",b:"\\\\[abfnrtv]\\|\\\\x[0-9a-fA-F]*\\\\\\|%[-+# *.0-9]*[dioxXucsfeEgGp]",r:0};n.c.push(a);var o={cN:"built_in",v:[{b:"<=>"},{b:"<=",r:0},{b:"=>",r:0},{b:"/\\\\"},{b:"\\\\/"}]},l={cN:"built_in",v:[{b:":-\\|-->"},{b:"=",r:0}]};return{aliases:["m","moo"],k:i,c:[o,l,r,e.CBCM,t,e.NM,_,n,{b:/:-/}]}});hljs.registerLanguage("scilab",function(e){var s=[e.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[e.BE,{b:"''"}]}];return{aliases:["sci"],l:/%?\w+/,k:{keyword:"abort break case clear catch continue do elseif else endfunction end for function global if pause return resume select try then while",literal:"%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp error exec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isempty isinfisnan isvector lasterror length load linspace list listfiles log10 log2 log max min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand real round sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tan type typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)"}]},{b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{b:"\\[",e:"\\]'*[\\.']*",r:0,c:s},e.C("//","$")].concat(s)}});hljs.registerLanguage("htmlbars",function(e){var a="action collection component concat debugger each each-in else get hash if input link-to loc log mut outlet partial query-params render textarea unbound unless with yield view",t={i:/\}\}/,b:/[a-zA-Z0-9_]+=/,rB:!0,r:0,c:[{cN:"attr",b:/[a-zA-Z0-9_]+/}]},i=({i:/\}\}/,b:/\)/,e:/\)/,c:[{b:/[a-zA-Z\.\-]+/,k:{built_in:a},starts:{eW:!0,r:0,c:[e.QSM]}}]},{eW:!0,r:0,k:{keyword:"as",built_in:a},c:[e.QSM,t,e.NM]});return{cI:!0,sL:"xml",c:[e.C("{{!(--)?","(--)?}}"),{cN:"template-tag",b:/\{\{[#\/]/,e:/\}\}/,c:[{cN:"name",b:/[a-zA-Z\.\-]+/,k:{"builtin-name":a},starts:i}]},{cN:"template-variable",b:/\{\{[a-zA-Z][a-zA-Z\-]+/,e:/\}\}/,k:{keyword:"as",built_in:a},c:[e.QSM]}]}});hljs.registerLanguage("kotlin",function(e){var t={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline interface annotation data sealed internal infix operator out by constructor super trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},r={cN:"keyword",b:/\b(break|continue|return|this)\b/,starts:{c:[{cN:"symbol",b:/@\w+/}]}},n={cN:"symbol",b:e.UIR+"@"},i={cN:"subst",v:[{b:"\\$"+e.UIR},{b:"\\${",e:"}",c:[e.ASM,e.CNM]}]},a={cN:"string",v:[{b:'"""',e:'"""',c:[i]},{b:"'",e:"'",i:/\n/,c:[e.BE]},{b:'"',e:'"',i:/\n/,c:[e.BE,i]}]},c={cN:"meta",b:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UIR+")?"},s={cN:"meta",b:"@"+e.UIR,c:[{b:/\(/,e:/\)/,c:[e.inherit(a,{cN:"meta-string"})]}]};return{k:t,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,r,n,c,s,{cN:"function",bK:"fun",e:"[(]|$",rB:!0,eE:!0,k:t,i:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,r:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"type",b://,k:"reified",r:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,r:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[{cN:"type",b:e.UIR},e.CLCM,e.CBCM],r:0},e.CLCM,e.CBCM,c,s,a,e.CNM]},e.CBCM]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b://,eB:!0,eE:!0,r:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},c,s]},a,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},e.CNM]}});hljs.registerLanguage("profile",function(e){return{c:[e.CNM,{b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:!0},{b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{b:"function calls",e:"$",c:[e.CNM],r:10},e.ASM,e.QSM,{cN:"string",b:"\\(",e:"\\)$",eB:!0,eE:!0,r:0}]}});hljs.registerLanguage("cmake",function(e){return{aliases:["cmake.in"],cI:!0,k:{keyword:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or equal less greater strless strgreater strequal matches"},c:[{cN:"variable",b:"\\${",e:"}"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage("elm",function(e){var i={v:[e.C("--","$"),e.C("{-","-}",{c:["self"]})]},t={cN:"type",b:"\\b[A-Z][\\w']*",r:0},c={b:"\\(",e:"\\)",i:'"',c:[{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},i]},n={b:"{",e:"}",c:c.c};return{k:"let in if then else case of where module import exposing type alias as infix infixl infixr port effect command subscription",c:[{bK:"port effect module",e:"exposing",k:"port effect module where command subscription exposing",c:[c,i],i:"\\W\\.|;"},{b:"import",e:"$",k:"import as exposing",c:[c,i],i:"\\W\\.|;"},{b:"type",e:"$",k:"type alias",c:[t,c,n,i]},{bK:"infix infixl infixr",e:"$",c:[e.CNM,i]},{b:"port",e:"$",k:"port",c:[i]},e.QSM,e.CNM,t,e.inherit(e.TM,{b:"^[_a-z][\\w']*"}),i,{b:"->|<-"}]}});hljs.registerLanguage("excel",function(E){return{aliases:["xlsx","xls"],cI:!0,l:/[a-zA-Z][\w\.]*/,k:{built_in:"ABS ACCRINT ACCRINTM ACOS ACOSH ACOT ACOTH AGGREGATE ADDRESS AMORDEGRC AMORLINC AND ARABIC AREAS ASC ASIN ASINH ATAN ATAN2 ATANH AVEDEV AVERAGE AVERAGEA AVERAGEIF AVERAGEIFS BAHTTEXT BASE BESSELI BESSELJ BESSELK BESSELY BETADIST BETA.DIST BETAINV BETA.INV BIN2DEC BIN2HEX BIN2OCT BINOMDIST BINOM.DIST BINOM.DIST.RANGE BINOM.INV BITAND BITLSHIFT BITOR BITRSHIFT BITXOR CALL CEILING CEILING.MATH CEILING.PRECISE CELL CHAR CHIDIST CHIINV CHITEST CHISQ.DIST CHISQ.DIST.RT CHISQ.INV CHISQ.INV.RT CHISQ.TEST CHOOSE CLEAN CODE COLUMN COLUMNS COMBIN COMBINA COMPLEX CONCAT CONCATENATE CONFIDENCE CONFIDENCE.NORM CONFIDENCE.T CONVERT CORREL COS COSH COT COTH COUNT COUNTA COUNTBLANK COUNTIF COUNTIFS COUPDAYBS COUPDAYS COUPDAYSNC COUPNCD COUPNUM COUPPCD COVAR COVARIANCE.P COVARIANCE.S CRITBINOM CSC CSCH CUBEKPIMEMBER CUBEMEMBER CUBEMEMBERPROPERTY CUBERANKEDMEMBER CUBESET CUBESETCOUNT CUBEVALUE CUMIPMT CUMPRINC DATE DATEDIF DATEVALUE DAVERAGE DAY DAYS DAYS360 DB DBCS DCOUNT DCOUNTA DDB DEC2BIN DEC2HEX DEC2OCT DECIMAL DEGREES DELTA DEVSQ DGET DISC DMAX DMIN DOLLAR DOLLARDE DOLLARFR DPRODUCT DSTDEV DSTDEVP DSUM DURATION DVAR DVARP EDATE EFFECT ENCODEURL EOMONTH ERF ERF.PRECISE ERFC ERFC.PRECISE ERROR.TYPE EUROCONVERT EVEN EXACT EXP EXPON.DIST EXPONDIST FACT FACTDOUBLE FALSE|0 F.DIST FDIST F.DIST.RT FILTERXML FIND FINDB F.INV F.INV.RT FINV FISHER FISHERINV FIXED FLOOR FLOOR.MATH FLOOR.PRECISE FORECAST FORECAST.ETS FORECAST.ETS.CONFINT FORECAST.ETS.SEASONALITY FORECAST.ETS.STAT FORECAST.LINEAR FORMULATEXT FREQUENCY F.TEST FTEST FV FVSCHEDULE GAMMA GAMMA.DIST GAMMADIST GAMMA.INV GAMMAINV GAMMALN GAMMALN.PRECISE GAUSS GCD GEOMEAN GESTEP GETPIVOTDATA GROWTH HARMEAN HEX2BIN HEX2DEC HEX2OCT HLOOKUP HOUR HYPERLINK HYPGEOM.DIST HYPGEOMDIST IF|0 IFERROR IFNA IFS IMABS IMAGINARY IMARGUMENT IMCONJUGATE IMCOS IMCOSH IMCOT IMCSC IMCSCH IMDIV IMEXP IMLN IMLOG10 IMLOG2 IMPOWER IMPRODUCT IMREAL IMSEC IMSECH IMSIN IMSINH IMSQRT IMSUB IMSUM IMTAN INDEX INDIRECT INFO INT INTERCEPT INTRATE IPMT IRR ISBLANK ISERR ISERROR ISEVEN ISFORMULA ISLOGICAL ISNA ISNONTEXT ISNUMBER ISODD ISREF ISTEXT ISO.CEILING ISOWEEKNUM ISPMT JIS KURT LARGE LCM LEFT LEFTB LEN LENB LINEST LN LOG LOG10 LOGEST LOGINV LOGNORM.DIST LOGNORMDIST LOGNORM.INV LOOKUP LOWER MATCH MAX MAXA MAXIFS MDETERM MDURATION MEDIAN MID MIDBs MIN MINIFS MINA MINUTE MINVERSE MIRR MMULT MOD MODE MODE.MULT MODE.SNGL MONTH MROUND MULTINOMIAL MUNIT N NA NEGBINOM.DIST NEGBINOMDIST NETWORKDAYS NETWORKDAYS.INTL NOMINAL NORM.DIST NORMDIST NORMINV NORM.INV NORM.S.DIST NORMSDIST NORM.S.INV NORMSINV NOT NOW NPER NPV NUMBERVALUE OCT2BIN OCT2DEC OCT2HEX ODD ODDFPRICE ODDFYIELD ODDLPRICE ODDLYIELD OFFSET OR PDURATION PEARSON PERCENTILE.EXC PERCENTILE.INC PERCENTILE PERCENTRANK.EXC PERCENTRANK.INC PERCENTRANK PERMUT PERMUTATIONA PHI PHONETIC PI PMT POISSON.DIST POISSON POWER PPMT PRICE PRICEDISC PRICEMAT PROB PRODUCT PROPER PV QUARTILE QUARTILE.EXC QUARTILE.INC QUOTIENT RADIANS RAND RANDBETWEEN RANK.AVG RANK.EQ RANK RATE RECEIVED REGISTER.ID REPLACE REPLACEB REPT RIGHT RIGHTB ROMAN ROUND ROUNDDOWN ROUNDUP ROW ROWS RRI RSQ RTD SEARCH SEARCHB SEC SECH SECOND SERIESSUM SHEET SHEETS SIGN SIN SINH SKEW SKEW.P SLN SLOPE SMALL SQL.REQUEST SQRT SQRTPI STANDARDIZE STDEV STDEV.P STDEV.S STDEVA STDEVP STDEVPA STEYX SUBSTITUTE SUBTOTAL SUM SUMIF SUMIFS SUMPRODUCT SUMSQ SUMX2MY2 SUMX2PY2 SUMXMY2 SWITCH SYD T TAN TANH TBILLEQ TBILLPRICE TBILLYIELD T.DIST T.DIST.2T T.DIST.RT TDIST TEXT TEXTJOIN TIME TIMEVALUE T.INV T.INV.2T TINV TODAY TRANSPOSE TREND TRIM TRIMMEAN TRUE|0 TRUNC T.TEST TTEST TYPE UNICHAR UNICODE UPPER VALUE VAR VAR.P VAR.S VARA VARP VARPA VDB VLOOKUP WEBSERVICE WEEKDAY WEEKNUM WEIBULL WEIBULL.DIST WORKDAY WORKDAY.INTL XIRR XNPV XOR YEAR YEARFRAC YIELD YIELDDISC YIELDMAT Z.TEST ZTEST"},c:[{b:/^=/,e:/[^=]/,rE:!0,i:/=/,r:10},{cN:"symbol",b:/\b[A-Z]{1,2}\d+\b/,e:/[^\d]/,eE:!0,r:0},{cN:"symbol",b:/[A-Z]{0,2}\d*:[A-Z]{0,2}\d*/,r:0},E.BE,E.QSM,{cN:"number",b:E.NR+"(%)?",r:0},E.C(/\bN\(/,/\)/,{eB:!0,eE:!0,i:/\n/})]}});hljs.registerLanguage("r",function(e){var r="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[e.HCM,{b:r,l:r,k:{keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[e.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}}); \ No newline at end of file diff --git a/public/plugins/jquery.datetimepicker-2.4.5/jquery.datetimepicker.css b/public/plugins/jquery.datetimepicker-2.4.5/jquery.datetimepicker.css deleted file mode 100644 index a26fcce..0000000 --- a/public/plugins/jquery.datetimepicker-2.4.5/jquery.datetimepicker.css +++ /dev/null @@ -1,545 +0,0 @@ -.xdsoft_datetimepicker { - box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.506); - background: #fff; - border-bottom: 1px solid #bbb; - border-left: 1px solid #ccc; - border-right: 1px solid #ccc; - border-top: 1px solid #ccc; - color: #333; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - padding: 8px; - padding-left: 0; - padding-top: 2px; - position: absolute; - z-index: 9999; - -moz-box-sizing: border-box; - box-sizing: border-box; - display: none; -} - -.xdsoft_datetimepicker iframe { - position: absolute; - left: 0; - top: 0; - width: 75px; - height: 210px; - background: transparent; - border: none; -} - -/*For IE8 or lower*/ -.xdsoft_datetimepicker button { - border: none !important; -} - -.xdsoft_noselect { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -.xdsoft_noselect::selection { background: transparent } -.xdsoft_noselect::-moz-selection { background: transparent } - -.xdsoft_datetimepicker.xdsoft_inline { - display: inline-block; - position: static; - box-shadow: none; -} - -.xdsoft_datetimepicker * { - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; - margin: 0; -} - -.xdsoft_datetimepicker .xdsoft_datepicker, .xdsoft_datetimepicker .xdsoft_timepicker { - display: none; -} - -.xdsoft_datetimepicker .xdsoft_datepicker.active, .xdsoft_datetimepicker .xdsoft_timepicker.active { - display: block; -} - -.xdsoft_datetimepicker .xdsoft_datepicker { - width: 224px; - float: left; - margin-left: 8px; -} - -.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_datepicker { - width: 256px; -} - -.xdsoft_datetimepicker .xdsoft_timepicker { - width: 58px; - float: left; - text-align: center; - margin-left: 8px; - margin-top: 0; -} - -.xdsoft_datetimepicker .xdsoft_datepicker.active+.xdsoft_timepicker { - margin-top: 8px; - margin-bottom: 3px -} - -.xdsoft_datetimepicker .xdsoft_mounthpicker { - position: relative; - text-align: center; -} - -.xdsoft_datetimepicker .xdsoft_label i, -.xdsoft_datetimepicker .xdsoft_prev, -.xdsoft_datetimepicker .xdsoft_next, -.xdsoft_datetimepicker .xdsoft_today_button { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0NBRjI1NjM0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0NBRjI1NjQ0M0UwMTFFNDk4NkFGMzJFQkQzQjEwRUIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDQ0FGMjU2MTQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDQ0FGMjU2MjQzRTAxMUU0OTg2QUYzMkVCRDNCMTBFQiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoNEP54AAAIOSURBVHja7Jq9TsMwEMcxrZD4WpBYeKUCe+kTMCACHZh4BFfHO/AAIHZGFhYkBBsSEqxsLCAgXKhbXYOTxh9pfJVP+qutnZ5s/5Lz2Y5I03QhWji2GIcgAokWgfCxNvcOCCGKqiSqhUp0laHOne05vdEyGMfkdxJDVjgwDlEQgYQBgx+ULJaWSXXS6r/ER5FBVR8VfGftTKcITNs+a1XpcFoExREIDF14AVIFxgQUS+h520cdud6wNkC0UBw6BCO/HoCYwBhD8QCkQ/x1mwDyD4plh4D6DDV0TAGyo4HcawLIBBSLDkHeH0Mg2yVP3l4TQMZQDDsEOl/MgHQqhMNuE0D+oBh0CIr8MAKyazBH9WyBuKxDWgbXfjNf32TZ1KWm/Ap1oSk/R53UtQ5xTh3LUlMmT8gt6g51Q9p+SobxgJQ/qmsfZhWywGFSl0yBjCLJCMgXail3b7+rumdVJ2YRss4cN+r6qAHDkPWjPjdJCF4n9RmAD/V9A/Wp4NQassDjwlB6XBiCxcJQWmZZb8THFilfy/lfrTvLghq2TqTHrRMTKNJ0sIhdo15RT+RpyWwFdY96UZ/LdQKBGjcXpcc1AlSFEfLmouD+1knuxBDUVrvOBmoOC/rEcN7OQxKVeJTCiAdUzUJhA2Oez9QTkp72OTVcxDcXY8iKNkxGAJXmJCOQwOa6dhyXsOa6XwEGAKdeb5ET3rQdAAAAAElFTkSuQmCC); -} - -.xdsoft_datetimepicker .xdsoft_label i { - opacity: 0.5; - background-position: -92px -19px; - display: inline-block; - width: 9px; - height: 20px; - vertical-align: middle; -} - -.xdsoft_datetimepicker .xdsoft_prev { - float: left; - background-position: -20px 0; -} -.xdsoft_datetimepicker .xdsoft_today_button { - float: left; - background-position: -70px 0; - margin-left: 5px; -} - -.xdsoft_datetimepicker .xdsoft_next { - float: right; - background-position: 0 0; -} - -.xdsoft_datetimepicker .xdsoft_next, -.xdsoft_datetimepicker .xdsoft_prev , -.xdsoft_datetimepicker .xdsoft_today_button { - background-color: transparent; - background-repeat: no-repeat; - border: 0 none; - cursor: pointer; - display: block; - height: 30px; - opacity: 0.5; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; - outline: medium none; - overflow: hidden; - padding: 0; - position: relative; - text-indent: 100%; - white-space: nowrap; - width: 20px; - min-width: 0; -} - -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_next { - float: none; - background-position: -40px -15px; - height: 15px; - width: 30px; - display: block; - margin-left: 14px; - margin-top: 7px; -} - -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev { - background-position: -40px 0; - margin-bottom: 7px; - margin-top: 0; -} - -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box { - height: 151px; - overflow: hidden; - border-bottom: 1px solid #ddd; -} - -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div { - background: #f5f5f5; - border-top: 1px solid #ddd; - color: #666; - font-size: 12px; - text-align: center; - border-collapse: collapse; - cursor: pointer; - border-bottom-width: 0; - height: 25px; - line-height: 25px; -} - -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div > div:first-child { - border-top-width: 0; -} - -.xdsoft_datetimepicker .xdsoft_today_button:hover, -.xdsoft_datetimepicker .xdsoft_next:hover, -.xdsoft_datetimepicker .xdsoft_prev:hover { - opacity: 1; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; -} - -.xdsoft_datetimepicker .xdsoft_label { - display: inline; - position: relative; - z-index: 9999; - margin: 0; - padding: 5px 3px; - font-size: 14px; - line-height: 20px; - font-weight: bold; - background-color: #fff; - float: left; - width: 182px; - text-align: center; - cursor: pointer; -} - -.xdsoft_datetimepicker .xdsoft_label:hover>span { - text-decoration: underline; -} - -.xdsoft_datetimepicker .xdsoft_label:hover i { - opacity: 1.0; -} - -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select { - border: 1px solid #ccc; - position: absolute; - right: 0; - top: 30px; - z-index: 101; - display: none; - background: #fff; - max-height: 160px; - overflow-y: hidden; -} - -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_monthselect{ right: -7px } -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_yearselect{ right: 2px } -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover { - color: #fff; - background: #ff8000; -} - -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option { - padding: 2px 10px 2px 5px; - text-decoration: none !important; -} - -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current { - background: #33aaff; - box-shadow: #178fe5 0 1px 3px 0 inset; - color: #fff; - font-weight: 700; -} - -.xdsoft_datetimepicker .xdsoft_month { - width: 100px; - text-align: right; -} - -.xdsoft_datetimepicker .xdsoft_calendar { - clear: both; -} - -.xdsoft_datetimepicker .xdsoft_year{ - width: 48px; - margin-left: 5px; -} - -.xdsoft_datetimepicker .xdsoft_calendar table { - border-collapse: collapse; - width: 100%; - -} - -.xdsoft_datetimepicker .xdsoft_calendar td > div { - padding-right: 5px; -} - -.xdsoft_datetimepicker .xdsoft_calendar th { - height: 25px; -} - -.xdsoft_datetimepicker .xdsoft_calendar td,.xdsoft_datetimepicker .xdsoft_calendar th { - width: 14.2857142%; - background: #f5f5f5; - border: 1px solid #ddd; - color: #666; - font-size: 12px; - text-align: right; - vertical-align: middle; - padding: 0; - border-collapse: collapse; - cursor: pointer; - height: 25px; -} -.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar td,.xdsoft_datetimepicker.xdsoft_showweeks .xdsoft_calendar th { - width: 12.5%; -} - -.xdsoft_datetimepicker .xdsoft_calendar th { - background: #f1f1f1; -} - -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today { - color: #33aaff; -} - -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_default { - background: #ffe9d2; - box-shadow: #ffb871 0 1px 4px 0 inset; - color: #000; -} -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_highlighted_mint { - background: #c1ffc9; - box-shadow: #00dd1c 0 1px 4px 0 inset; - color: #000; -} - -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_current { - background: #33aaff; - box-shadow: #178fe5 0 1px 3px 0 inset; - color: #fff; - font-weight: 700; -} - -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled, -.xdsoft_datetimepicker .xdsoft_time_box >div >div.xdsoft_disabled { - opacity: 0.5; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; - cursor: default; -} - -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month.xdsoft_disabled { - opacity: 0.2; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)"; -} - -.xdsoft_datetimepicker .xdsoft_calendar td:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div:hover { - color: #fff !important; - background: #ff8000 !important; - box-shadow: none !important; -} - -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current.xdsoft_disabled:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box>div>div.xdsoft_current.xdsoft_disabled:hover { - background: #33aaff !important; - box-shadow: #178fe5 0 1px 3px 0 inset !important; - color: #fff !important; -} - -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_disabled:hover { - color: inherit !important; - background: inherit !important; - box-shadow: inherit !important; -} - -.xdsoft_datetimepicker .xdsoft_calendar th { - font-weight: 700; - text-align: center; - color: #999; - cursor: default; -} - -.xdsoft_datetimepicker .xdsoft_copyright { - color: #ccc !important; - font-size: 10px; - clear: both; - float: none; - margin-left: 8px; -} - -.xdsoft_datetimepicker .xdsoft_copyright a { color: #eee !important } -.xdsoft_datetimepicker .xdsoft_copyright a:hover { color: #aaa !important } - -.xdsoft_time_box { - position: relative; - border: 1px solid #ccc; -} -.xdsoft_scrollbar >.xdsoft_scroller { - background: #ccc !important; - height: 20px; - border-radius: 3px; -} -.xdsoft_scrollbar { - position: absolute; - width: 7px; - right: 0; - top: 0; - bottom: 0; - cursor: pointer; -} -.xdsoft_scroller_box { - position: relative; -} - -.xdsoft_datetimepicker.xdsoft_dark { - box-shadow: 0 5px 15px -5px rgba(255, 255, 255, 0.506); - background: #000; - border-bottom: 1px solid #444; - border-left: 1px solid #333; - border-right: 1px solid #333; - border-top: 1px solid #333; - color: #ccc; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box { - border-bottom: 1px solid #222; -} -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div { - background: #0a0a0a; - border-top: 1px solid #222; - color: #999; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label { - background-color: #000; -} -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select { - border: 1px solid #333; - background: #000; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover { - color: #000; - background: #007fff; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current { - background: #cc5500; - box-shadow: #b03e00 0 1px 3px 0 inset; - color: #000; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_label i, -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_prev, -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_next, -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_today_button { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAeCAYAAADaW7vzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUExQUUzOTA0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUExQUUzOTE0M0UyMTFFNDlBM0FFQTJENTExRDVBODYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQTFBRTM4RTQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQTFBRTM4RjQzRTIxMUU0OUEzQUVBMkQ1MTFENUE4NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pp0VxGEAAAIASURBVHja7JrNSgMxEMebtgh+3MSLr1T1Xn2CHoSKB08+QmR8Bx9A8e7RixdB9CKCoNdexIugxFlJa7rNZneTbLIpM/CnNLsdMvNjM8l0mRCiQ9Ye61IKCAgZAUnH+mU3MMZaHYChBnJUDzWOFZdVfc5+ZFLbrWDeXPwbxIqrLLfaeS0hEBVGIRQCEiZoHQwtlGSByCCdYBl8g8egTTAWoKQMRBRBcZxYlhzhKegqMOageErsCHVkk3hXIFooDgHB1KkHIHVgzKB4ADJQ/A1jAFmAYhkQqA5TOBtocrKrgXwQA8gcFIuAIO8sQSA7hidvPwaQGZSaAYHOUWJABhWWw2EMIH9QagQERU4SArJXo0ZZL18uvaxejXt/Em8xjVBXmvFr1KVm/AJ10tRe2XnraNqaJvKE3KHuUbfK1E+VHB0q40/y3sdQSxY4FHWeKJCunP8UyDdqJZenT3ntVV5jIYCAh20vT7ioP8tpf6E2lfEMwERe+whV1MHjwZB7PBiCxcGQWwKZKD62lfGNnP/1poFAA60T7rF1UgcKd2id3KDeUS+oLWV8DfWAepOfq00CgQabi9zjcgJVYVD7PVzQUAUGAQkbNJTBICDhgwYTjDYD6XeW08ZKh+A4pYkzenOxXUbvZcWz7E8ykRMnIHGX1XPl+1m2vPYpL+2qdb8CDAARlKFEz/ZVkAAAAABJRU5ErkJggg==); -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td, -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th { - background: #0a0a0a; - border: 1px solid #222; - color: #999; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th { - background: #0e0e0e; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_today { - color: #cc5500; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_default { - background: #ffe9d2; - box-shadow: #ffb871 0 1px 4px 0 inset; - color:#000; -} -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_highlighted_mint { - background: #c1ffc9; - box-shadow: #00dd1c 0 1px 4px 0 inset; - color:#000; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_default, -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td.xdsoft_current, -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div.xdsoft_current { - background: #cc5500; - box-shadow: #b03e00 0 1px 3px 0 inset; - color: #000; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar td:hover, -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_timepicker .xdsoft_time_box >div >div:hover { - color: #000 !important; - background: #007fff !important; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_calendar th { - color: #666; -} - -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright { color: #333 !important } -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a { color: #111 !important } -.xdsoft_datetimepicker.xdsoft_dark .xdsoft_copyright a:hover { color: #555 !important } - -.xdsoft_dark .xdsoft_time_box { - border: 1px solid #333; -} - -.xdsoft_dark .xdsoft_scrollbar >.xdsoft_scroller { - background: #333 !important; -} -.xdsoft_datetimepicker .xdsoft_save_selected { - display: block; - border: 1px solid #dddddd !important; - margin-top: 5px; - width: 100%; - color: #454551; - font-size: 13px; -} -.xdsoft_datetimepicker .blue-gradient-button { - font-family: "museo-sans", "Book Antiqua", sans-serif; - font-size: 12px; - font-weight: 300; - color: #82878c; - height: 28px; - position: relative; - padding: 4px 17px 4px 33px; - border: 1px solid #d7d8da; - background: -moz-linear-gradient(top, #fff 0%, #f4f8fa 73%); - /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(73%, #f4f8fa)); - /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #fff 0%, #f4f8fa 73%); - /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #fff 0%, #f4f8fa 73%); - /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #fff 0%, #f4f8fa 73%); - /* IE10+ */ - background: linear-gradient(to bottom, #fff 0%, #f4f8fa 73%); - /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff', endColorstr='#f4f8fa',GradientType=0 ); -/* IE6-9 */ -} -.xdsoft_datetimepicker .blue-gradient-button:hover, .xdsoft_datetimepicker .blue-gradient-button:focus, .xdsoft_datetimepicker .blue-gradient-button:hover span, .xdsoft_datetimepicker .blue-gradient-button:focus span { - color: #454551; - background: -moz-linear-gradient(top, #f4f8fa 0%, #FFF 73%); - /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f4f8fa), color-stop(73%, #FFF)); - /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, #f4f8fa 0%, #FFF 73%); - /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, #f4f8fa 0%, #FFF 73%); - /* Opera 11.10+ */ - background: -ms-linear-gradient(top, #f4f8fa 0%, #FFF 73%); - /* IE10+ */ - background: linear-gradient(to bottom, #f4f8fa 0%, #FFF 73%); - /* W3C */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f8fa', endColorstr='#FFF',GradientType=0 ); - /* IE6-9 */ -} diff --git a/public/plugins/jquery.datetimepicker-2.4.5/jquery.datetimepicker.js b/public/plugins/jquery.datetimepicker-2.4.5/jquery.datetimepicker.js deleted file mode 100644 index 9c00413..0000000 --- a/public/plugins/jquery.datetimepicker-2.4.5/jquery.datetimepicker.js +++ /dev/null @@ -1,2073 +0,0 @@ -/** - * @preserve jQuery DateTimePicker plugin v2.4.5 - * @homepage http://xdsoft.net/jqplugins/datetimepicker/ - * (c) 2014, Chupurnov Valeriy. - */ -/*global document,window,jQuery,setTimeout,clearTimeout,HighlightedDate,getCurrentValue*/ -(function ($) { - 'use strict'; - var default_options = { - i18n: { - ar: { // Arabic - months: [ - "كانون الثاني", "شباط", "آذار", "نيسان", "مايو", "حزيران", "تموز", "آب", "أيلول", "تشرين الأول", "تشرين الثاني", "كانون الأول" - ], - dayOfWeek: [ - "ن", "ث", "ع", "خ", "ج", "س", "ح" - ] - }, - ro: { // Romanian - months: [ - "ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie" - ], - dayOfWeek: [ - "l", "ma", "mi", "j", "v", "s", "d" - ] - }, - id: { // Indonesian - months: [ - "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember" - ], - dayOfWeek: [ - "Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab" - ] - }, - is: { // Icelandic - months: [ - "Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember" - ], - dayOfWeek: [ - "Sun", "Mán", "Þrið", "Mið", "Fim", "Fös", "Lau" - ] - }, - bg: { // Bulgarian - months: [ - "Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември" - ], - dayOfWeek: [ - "Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" - ] - }, - fa: { // Persian/Farsi - months: [ - 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند' - ], - dayOfWeek: [ - 'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه' - ] - }, - ru: { // Russian - months: [ - 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' - ], - dayOfWeek: [ - "Вск", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" - ] - }, - uk: { // Ukrainian - months: [ - 'Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень' - ], - dayOfWeek: [ - "Ндл", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Сбт" - ] - }, - en: { // English - months: [ - "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" - ], - dayOfWeek: [ - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - ] - }, - el: { // Ελληνικά - months: [ - "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος" - ], - dayOfWeek: [ - "Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ" - ] - }, - de: { // German - months: [ - 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember' - ], - dayOfWeek: [ - "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa" - ] - }, - nl: { // Dutch - months: [ - "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december" - ], - dayOfWeek: [ - "zo", "ma", "di", "wo", "do", "vr", "za" - ] - }, - tr: { // Turkish - months: [ - "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık" - ], - dayOfWeek: [ - "Paz", "Pts", "Sal", "Çar", "Per", "Cum", "Cts" - ] - }, - fr: { //French - months: [ - "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre" - ], - dayOfWeek: [ - "Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam" - ] - }, - es: { // Spanish - months: [ - "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" - ], - dayOfWeek: [ - "Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb" - ] - }, - th: { // Thai - months: [ - 'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม' - ], - dayOfWeek: [ - 'อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.' - ] - }, - pl: { // Polish - months: [ - "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień" - ], - dayOfWeek: [ - "nd", "pn", "wt", "śr", "cz", "pt", "sb" - ] - }, - pt: { // Portuguese - months: [ - "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" - ], - dayOfWeek: [ - "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab" - ] - }, - ch: { // Simplified Chinese - months: [ - "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" - ], - dayOfWeek: [ - "日", "一", "二", "三", "四", "五", "六" - ] - }, - se: { // Swedish - months: [ - "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December" - ], - dayOfWeek: [ - "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör" - ] - }, - kr: { // Korean - months: [ - "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" - ], - dayOfWeek: [ - "일", "월", "화", "수", "목", "금", "토" - ] - }, - it: { // Italian - months: [ - "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre" - ], - dayOfWeek: [ - "Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab" - ] - }, - da: { // Dansk - months: [ - "January", "Februar", "Marts", "April", "Maj", "Juni", "July", "August", "September", "Oktober", "November", "December" - ], - dayOfWeek: [ - "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør" - ] - }, - no: { // Norwegian - months: [ - "Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember" - ], - dayOfWeek: [ - "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør" - ] - }, - ja: { // Japanese - months: [ - "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" - ], - dayOfWeek: [ - "日", "月", "火", "水", "木", "金", "土" - ] - }, - vi: { // Vietnamese - months: [ - "Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12" - ], - dayOfWeek: [ - "CN", "T2", "T3", "T4", "T5", "T6", "T7" - ] - }, - sl: { // Slovenščina - months: [ - "Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December" - ], - dayOfWeek: [ - "Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob" - ] - }, - cs: { // Čeština - months: [ - "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec" - ], - dayOfWeek: [ - "Ne", "Po", "Út", "St", "Čt", "Pá", "So" - ] - }, - hu: { // Hungarian - months: [ - "Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December" - ], - dayOfWeek: [ - "Va", "Hé", "Ke", "Sze", "Cs", "Pé", "Szo" - ] - }, - az: { //Azerbaijanian (Azeri) - months: [ - "Yanvar", "Fevral", "Mart", "Aprel", "May", "Iyun", "Iyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr" - ], - dayOfWeek: [ - "B", "Be", "Ça", "Ç", "Ca", "C", "Ş" - ] - }, - bs: { //Bosanski - months: [ - "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar" - ], - dayOfWeek: [ - "Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub" - ] - }, - ca: { //Català - months: [ - "Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre" - ], - dayOfWeek: [ - "Dg", "Dl", "Dt", "Dc", "Dj", "Dv", "Ds" - ] - }, - 'en-GB': { //English (British) - months: [ - "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" - ], - dayOfWeek: [ - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - ] - }, - et: { //"Eesti" - months: [ - "Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", "Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember" - ], - dayOfWeek: [ - "P", "E", "T", "K", "N", "R", "L" - ] - }, - eu: { //Euskara - months: [ - "Urtarrila", "Otsaila", "Martxoa", "Apirila", "Maiatza", "Ekaina", "Uztaila", "Abuztua", "Iraila", "Urria", "Azaroa", "Abendua" - ], - dayOfWeek: [ - "Ig.", "Al.", "Ar.", "Az.", "Og.", "Or.", "La." - ] - }, - fi: { //Finnish (Suomi) - months: [ - "Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu" - ], - dayOfWeek: [ - "Su", "Ma", "Ti", "Ke", "To", "Pe", "La" - ] - }, - gl: { //Galego - months: [ - "Xan", "Feb", "Maz", "Abr", "Mai", "Xun", "Xul", "Ago", "Set", "Out", "Nov", "Dec" - ], - dayOfWeek: [ - "Dom", "Lun", "Mar", "Mer", "Xov", "Ven", "Sab" - ] - }, - hr: { //Hrvatski - months: [ - "Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac" - ], - dayOfWeek: [ - "Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub" - ] - }, - ko: { //Korean (한국어) - months: [ - "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" - ], - dayOfWeek: [ - "일", "월", "화", "수", "목", "금", "토" - ] - }, - lt: { //Lithuanian (lietuvių) - months: [ - "Sausio", "Vasario", "Kovo", "Balandžio", "Gegužės", "Birželio", "Liepos", "Rugpjūčio", "Rugsėjo", "Spalio", "Lapkričio", "Gruodžio" - ], - dayOfWeek: [ - "Sek", "Pir", "Ant", "Tre", "Ket", "Pen", "Šeš" - ] - }, - lv: { //Latvian (Latviešu) - months: [ - "Janvāris", "Februāris", "Marts", "Aprīlis ", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris" - ], - dayOfWeek: [ - "Sv", "Pr", "Ot", "Tr", "Ct", "Pk", "St" - ] - }, - mk: { //Macedonian (Македонски) - months: [ - "јануари", "февруари", "март", "април", "мај", "јуни", "јули", "август", "септември", "октомври", "ноември", "декември" - ], - dayOfWeek: [ - "нед", "пон", "вто", "сре", "чет", "пет", "саб" - ] - }, - mn: { //Mongolian (Монгол) - months: [ - "1-р сар", "2-р сар", "3-р сар", "4-р сар", "5-р сар", "6-р сар", "7-р сар", "8-р сар", "9-р сар", "10-р сар", "11-р сар", "12-р сар" - ], - dayOfWeek: [ - "Дав", "Мяг", "Лха", "Пүр", "Бсн", "Бям", "Ням" - ] - }, - 'pt-BR': { //Português(Brasil) - months: [ - "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" - ], - dayOfWeek: [ - "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb" - ] - }, - sk: { //Slovenčina - months: [ - "Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December" - ], - dayOfWeek: [ - "Ne", "Po", "Ut", "St", "Št", "Pi", "So" - ] - }, - sq: { //Albanian (Shqip) - months: [ - "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" - ], - dayOfWeek: [ - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - ] - }, - 'sr-YU': { //Serbian (Srpski) - months: [ - "Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar" - ], - dayOfWeek: [ - "Ned", "Pon", "Uto", "Sre", "čet", "Pet", "Sub" - ] - }, - sr: { //Serbian Cyrillic (Српски) - months: [ - "јануар", "фебруар", "март", "април", "мај", "јун", "јул", "август", "септембар", "октобар", "новембар", "децембар" - ], - dayOfWeek: [ - "нед", "пон", "уто", "сре", "чет", "пет", "суб" - ] - }, - sv: { //Svenska - months: [ - "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December" - ], - dayOfWeek: [ - "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör" - ] - }, - 'zh-TW': { //Traditional Chinese (繁體中文) - months: [ - "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" - ], - dayOfWeek: [ - "日", "一", "二", "三", "四", "五", "六" - ] - }, - zh: { //Simplified Chinese (简体中文) - months: [ - "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月" - ], - dayOfWeek: [ - "日", "一", "二", "三", "四", "五", "六" - ] - }, - he: { //Hebrew (עברית) - months: [ - 'ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר' - ], - dayOfWeek: [ - 'א\'', 'ב\'', 'ג\'', 'ד\'', 'ה\'', 'ו\'', 'שבת' - ] - }, - hy: { // Armenian - months: [ - "Հունվար", "Փետրվար", "Մարտ", "Ապրիլ", "Մայիս", "Հունիս", "Հուլիս", "Օգոստոս", "Սեպտեմբեր", "Հոկտեմբեր", "Նոյեմբեր", "Դեկտեմբեր" - ], - dayOfWeek: [ - "Կի", "Երկ", "Երք", "Չոր", "Հնգ", "Ուրբ", "Շբթ" - ] - }, - kg: { // Kyrgyz - months: [ - 'Үчтүн айы', 'Бирдин айы', 'Жалган Куран', 'Чын Куран', 'Бугу', 'Кулжа', 'Теке', 'Баш Оона', 'Аяк Оона', 'Тогуздун айы', 'Жетинин айы', 'Бештин айы' - ], - dayOfWeek: [ - "Жек", "Дүй", "Шей", "Шар", "Бей", "Жум", "Ише" - ] - } - }, - value: '', - lang: 'en', - - format: 'Y/m/d H:i', - formatTime: 'H:i', - formatDate: 'Y/m/d', - - startDate: false, // new Date(), '1986/12/08', '-1970/01/05','-1970/01/05', - step: 60, - monthChangeSpinner: true, - - closeOnDateSelect: false, - closeOnTimeSelect: true, - closeOnWithoutClick: true, - closeOnInputClick: true, - - timepicker: true, - datepicker: true, - weeks: false, - - defaultTime: false, // use formatTime format (ex. '10:00' for formatTime: 'H:i') - defaultDate: false, // use formatDate format (ex new Date() or '1986/12/08' or '-1970/01/05' or '-1970/01/05') - - minDate: false, - maxDate: false, - minTime: false, - maxTime: false, - disabledMinTime: false, - disabledMaxTime: false, - - allowTimes: [], - opened: false, - initTime: true, - inline: false, - theme: '', - - onSelectDate: function () {}, - onSelectTime: function () {}, - onChangeMonth: function () {}, - onChangeYear: function () {}, - onChangeDateTime: function () {}, - onShow: function () {}, - onClose: function () {}, - onGenerate: function () {}, - - withoutCopyright: true, - inverseButton: false, - hours12: false, - next: 'xdsoft_next', - prev : 'xdsoft_prev', - dayOfWeekStart: 0, - parentID: 'body', - timeHeightInTimePicker: 25, - timepickerScrollbar: true, - todayButton: true, - prevButton: true, - nextButton: true, - defaultSelect: true, - - scrollMonth: true, - scrollTime: true, - scrollInput: true, - - lazyInit: false, - mask: false, - validateOnBlur: true, - allowBlank: true, - yearStart: 1950, - yearEnd: 2050, - monthStart: 0, - monthEnd: 11, - style: '', - id: '', - fixed: false, - roundTime: 'round', // ceil, floor - className: '', - weekends: [], - highlightedDates: [], - highlightedPeriods: [], - disabledDates : [], - disabledWeekDays: [], - yearOffset: 0, - beforeShowDay: null, - - enterLikeTab: true, - showApplyButton: false - }; - // fix for ie8 - if (!window.getComputedStyle) { - window.getComputedStyle = function (el, pseudo) { - this.el = el; - this.getPropertyValue = function (prop) { - var re = /(\-([a-z]){1})/g; - if (prop === 'float') { - prop = 'styleFloat'; - } - if (re.test(prop)) { - prop = prop.replace(re, function (a, b, c) { - return c.toUpperCase(); - }); - } - return el.currentStyle[prop] || null; - }; - return this; - }; - } - if (!Array.prototype.indexOf) { - Array.prototype.indexOf = function (obj, start) { - var i, j; - for (i = (start || 0), j = this.length; i < j; i += 1) { - if (this[i] === obj) { return i; } - } - return -1; - }; - } - Date.prototype.countDaysInMonth = function () { - return new Date(this.getFullYear(), this.getMonth() + 1, 0).getDate(); - }; - $.fn.xdsoftScroller = function (percent) { - return this.each(function () { - var timeboxparent = $(this), - pointerEventToXY = function (e) { - var out = {x: 0, y: 0}, - touch; - if (e.type === 'touchstart' || e.type === 'touchmove' || e.type === 'touchend' || e.type === 'touchcancel') { - touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; - out.x = touch.clientX; - out.y = touch.clientY; - } else if (e.type === 'mousedown' || e.type === 'mouseup' || e.type === 'mousemove' || e.type === 'mouseover' || e.type === 'mouseout' || e.type === 'mouseenter' || e.type === 'mouseleave') { - out.x = e.clientX; - out.y = e.clientY; - } - return out; - }, - move = 0, - timebox, - parentHeight, - height, - scrollbar, - scroller, - maximumOffset = 100, - start = false, - startY = 0, - startTop = 0, - h1 = 0, - touchStart = false, - startTopScroll = 0, - calcOffset = function () {}; - if (percent === 'hide') { - timeboxparent.find('.xdsoft_scrollbar').hide(); - return; - } - if (!$(this).hasClass('xdsoft_scroller_box')) { - timebox = timeboxparent.children().eq(0); - parentHeight = timeboxparent[0].clientHeight; - height = timebox[0].offsetHeight; - scrollbar = $('
    '); - scroller = $('
    '); - scrollbar.append(scroller); - - timeboxparent.addClass('xdsoft_scroller_box').append(scrollbar); - calcOffset = function calcOffset(event) { - var offset = pointerEventToXY(event).y - startY + startTopScroll; - if (offset < 0) { - offset = 0; - } - if (offset + scroller[0].offsetHeight > h1) { - offset = h1 - scroller[0].offsetHeight; - } - timeboxparent.trigger('scroll_element.xdsoft_scroller', [maximumOffset ? offset / maximumOffset : 0]); - }; - - scroller - .on('touchstart.xdsoft_scroller mousedown.xdsoft_scroller', function (event) { - if (!parentHeight) { - timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]); - } - - startY = pointerEventToXY(event).y; - startTopScroll = parseInt(scroller.css('margin-top'), 10); - h1 = scrollbar[0].offsetHeight; - - if (event.type === 'mousedown') { - if (document) { - $(document.body).addClass('xdsoft_noselect'); - } - $([document.body, window]).on('mouseup.xdsoft_scroller', function arguments_callee() { - $([document.body, window]).off('mouseup.xdsoft_scroller', arguments_callee) - .off('mousemove.xdsoft_scroller', calcOffset) - .removeClass('xdsoft_noselect'); - }); - $(document.body).on('mousemove.xdsoft_scroller', calcOffset); - } else { - touchStart = true; - event.stopPropagation(); - event.preventDefault(); - } - }) - .on('touchmove', function (event) { - if (touchStart) { - event.preventDefault(); - calcOffset(event); - } - }) - .on('touchend touchcancel', function (event) { - touchStart = false; - startTopScroll = 0; - }); - - timeboxparent - .on('scroll_element.xdsoft_scroller', function (event, percentage) { - if (!parentHeight) { - timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percentage, true]); - } - percentage = percentage > 1 ? 1 : (percentage < 0 || isNaN(percentage)) ? 0 : percentage; - - scroller.css('margin-top', maximumOffset * percentage); - - setTimeout(function () { - timebox.css('marginTop', -parseInt((timebox[0].offsetHeight - parentHeight) * percentage, 10)); - }, 10); - }) - .on('resize_scroll.xdsoft_scroller', function (event, percentage, noTriggerScroll) { - var percent, sh; - parentHeight = timeboxparent[0].clientHeight; - height = timebox[0].offsetHeight; - percent = parentHeight / height; - sh = percent * scrollbar[0].offsetHeight; - if (percent > 1) { - scroller.hide(); - } else { - scroller.show(); - scroller.css('height', parseInt(sh > 10 ? sh : 10, 10)); - maximumOffset = scrollbar[0].offsetHeight - scroller[0].offsetHeight; - if (noTriggerScroll !== true) { - timeboxparent.trigger('scroll_element.xdsoft_scroller', [percentage || Math.abs(parseInt(timebox.css('marginTop'), 10)) / (height - parentHeight)]); - } - } - }); - - timeboxparent.on('mousewheel', function (event) { - var top = Math.abs(parseInt(timebox.css('marginTop'), 10)); - - top = top - (event.deltaY * 20); - if (top < 0) { - top = 0; - } - - timeboxparent.trigger('scroll_element.xdsoft_scroller', [top / (height - parentHeight)]); - event.stopPropagation(); - return false; - }); - - timeboxparent.on('touchstart', function (event) { - start = pointerEventToXY(event); - startTop = Math.abs(parseInt(timebox.css('marginTop'), 10)); - }); - - timeboxparent.on('touchmove', function (event) { - if (start) { - event.preventDefault(); - var coord = pointerEventToXY(event); - timeboxparent.trigger('scroll_element.xdsoft_scroller', [(startTop - (coord.y - start.y)) / (height - parentHeight)]); - } - }); - - timeboxparent.on('touchend touchcancel', function (event) { - start = false; - startTop = 0; - }); - } - timeboxparent.trigger('resize_scroll.xdsoft_scroller', [percent]); - }); - }; - - $.fn.datetimepicker = function (opt) { - var KEY0 = 48, - KEY9 = 57, - _KEY0 = 96, - _KEY9 = 105, - CTRLKEY = 17, - DEL = 46, - ENTER = 13, - ESC = 27, - BACKSPACE = 8, - ARROWLEFT = 37, - ARROWUP = 38, - ARROWRIGHT = 39, - ARROWDOWN = 40, - TAB = 9, - F5 = 116, - AKEY = 65, - CKEY = 67, - VKEY = 86, - ZKEY = 90, - YKEY = 89, - ctrlDown = false, - options = ($.isPlainObject(opt) || !opt) ? $.extend(true, {}, default_options, opt) : $.extend(true, {}, default_options), - - lazyInitTimer = 0, - createDateTimePicker, - destroyDateTimePicker, - - lazyInit = function (input) { - input - .on('open.xdsoft focusin.xdsoft mousedown.xdsoft', function initOnActionCallback(event) { - if (input.is(':disabled') || input.data('xdsoft_datetimepicker')) { - return; - } - clearTimeout(lazyInitTimer); - lazyInitTimer = setTimeout(function () { - - if (!input.data('xdsoft_datetimepicker')) { - createDateTimePicker(input); - } - input - .off('open.xdsoft focusin.xdsoft mousedown.xdsoft', initOnActionCallback) - .trigger('open.xdsoft'); - }, 100); - }); - }; - - createDateTimePicker = function (input) { - var datetimepicker = $('
    '), - xdsoft_copyright = $(''), - datepicker = $('
    '), - mounth_picker = $('
    ' + - '
    ' + - '
    ' + - '
    '), - calendar = $('
    '), - timepicker = $('
    '), - timeboxparent = timepicker.find('.xdsoft_time_box').eq(0), - timebox = $('
    '), - applyButton = $(''), - /*scrollbar = $('
    '), - scroller = $('
    '),*/ - monthselect = $('
    '), - yearselect = $('
    '), - triggerAfterOpen = false, - XDSoft_datetime, - //scroll_element, - xchangeTimer, - timerclick, - current_time_index, - setPos, - timer = 0, - timer1 = 0, - _xdsoft_datetime; - - if (options.id) { - datetimepicker.attr('id', options.id); - } - if (options.style) { - datetimepicker.attr('style', options.style); - } - if (options.weeks) { - datetimepicker.addClass('xdsoft_showweeks'); - } - - datetimepicker.addClass('xdsoft_' + options.theme); - datetimepicker.addClass(options.className); - - mounth_picker - .find('.xdsoft_month span') - .after(monthselect); - mounth_picker - .find('.xdsoft_year span') - .after(yearselect); - - mounth_picker - .find('.xdsoft_month,.xdsoft_year') - .on('mousedown.xdsoft', function (event) { - var select = $(this).find('.xdsoft_select').eq(0), - val = 0, - top = 0, - visible = select.is(':visible'), - items, - i; - - mounth_picker - .find('.xdsoft_select') - .hide(); - if (_xdsoft_datetime.currentTime) { - val = _xdsoft_datetime.currentTime[$(this).hasClass('xdsoft_month') ? 'getMonth' : 'getFullYear'](); - } - - select[visible ? 'hide' : 'show'](); - for (items = select.find('div.xdsoft_option'), i = 0; i < items.length; i += 1) { - if (items.eq(i).data('value') === val) { - break; - } else { - top += items[0].offsetHeight; - } - } - - select.xdsoftScroller(top / (select.children()[0].offsetHeight - (select[0].clientHeight))); - event.stopPropagation(); - return false; - }); - - mounth_picker - .find('.xdsoft_select') - .xdsoftScroller() - .on('mousedown.xdsoft', function (event) { - event.stopPropagation(); - event.preventDefault(); - }) - .on('mousedown.xdsoft', '.xdsoft_option', function (event) { - - if (_xdsoft_datetime.currentTime === undefined || _xdsoft_datetime.currentTime === null) { - _xdsoft_datetime.currentTime = _xdsoft_datetime.now(); - } - - var year = _xdsoft_datetime.currentTime.getFullYear(); - if (_xdsoft_datetime && _xdsoft_datetime.currentTime) { - _xdsoft_datetime.currentTime[$(this).parent().parent().hasClass('xdsoft_monthselect') ? 'setMonth' : 'setFullYear']($(this).data('value')); - } - - $(this).parent().parent().hide(); - - datetimepicker.trigger('xchange.xdsoft'); - if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) { - options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input')); - } - - if (year !== _xdsoft_datetime.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) { - options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input')); - } - }); - - datetimepicker.setOptions = function (_options) { - var highlightedDates = {}, - getCaretPos = function (input) { - try { - if (document.selection && document.selection.createRange) { - var range = document.selection.createRange(); - return range.getBookmark().charCodeAt(2) - 2; - } - if (input.setSelectionRange) { - return input.selectionStart; - } - } catch (e) { - return 0; - } - }, - setCaretPos = function (node, pos) { - node = (typeof node === "string" || node instanceof String) ? document.getElementById(node) : node; - if (!node) { - return false; - } - if (node.createTextRange) { - var textRange = node.createTextRange(); - textRange.collapse(true); - textRange.moveEnd('character', pos); - textRange.moveStart('character', pos); - textRange.select(); - return true; - } - if (node.setSelectionRange) { - node.setSelectionRange(pos, pos); - return true; - } - return false; - }, - isValidValue = function (mask, value) { - var reg = mask - .replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g, '\\$1') - .replace(/_/g, '{digit+}') - .replace(/([0-9]{1})/g, '{digit$1}') - .replace(/\{digit([0-9]{1})\}/g, '[0-$1_]{1}') - .replace(/\{digit[\+]\}/g, '[0-9_]{1}'); - return (new RegExp(reg)).test(value); - }; - options = $.extend(true, {}, options, _options); - - if (_options.allowTimes && $.isArray(_options.allowTimes) && _options.allowTimes.length) { - options.allowTimes = $.extend(true, [], _options.allowTimes); - } - - if (_options.weekends && $.isArray(_options.weekends) && _options.weekends.length) { - options.weekends = $.extend(true, [], _options.weekends); - } - - if (_options.highlightedDates && $.isArray(_options.highlightedDates) && _options.highlightedDates.length) { - $.each(_options.highlightedDates, function (index, value) { - var splitData = $.map(value.split(','), $.trim), - exDesc, - hDate = new HighlightedDate(Date.parseDate(splitData[0], options.formatDate), splitData[1], splitData[2]), // date, desc, style - keyDate = hDate.date.dateFormat(options.formatDate); - if (highlightedDates[keyDate] !== undefined) { - exDesc = highlightedDates[keyDate].desc; - if (exDesc && exDesc.length && hDate.desc && hDate.desc.length) { - highlightedDates[keyDate].desc = exDesc + "\n" + hDate.desc; - } - } else { - highlightedDates[keyDate] = hDate; - } - }); - - options.highlightedDates = $.extend(true, [], highlightedDates); - } - - if (_options.highlightedPeriods && $.isArray(_options.highlightedPeriods) && _options.highlightedPeriods.length) { - highlightedDates = $.extend(true, [], options.highlightedDates); - $.each(_options.highlightedPeriods, function (index, value) { - var splitData = $.map(value.split(','), $.trim), - dateTest = Date.parseDate(splitData[0], options.formatDate), // start date - dateEnd = Date.parseDate(splitData[1], options.formatDate), - desc = splitData[2], - hDate, - keyDate, - exDesc, - style = splitData[3]; - - while (dateTest <= dateEnd) { - hDate = new HighlightedDate(dateTest, desc, style); - keyDate = dateTest.dateFormat(options.formatDate); - dateTest.setDate(dateTest.getDate() + 1); - if (highlightedDates[keyDate] !== undefined) { - exDesc = highlightedDates[keyDate].desc; - if (exDesc && exDesc.length && hDate.desc && hDate.desc.length) { - highlightedDates[keyDate].desc = exDesc + "\n" + hDate.desc; - } - } else { - highlightedDates[keyDate] = hDate; - } - } - }); - - options.highlightedDates = $.extend(true, [], highlightedDates); - } - - if (_options.disabledDates && $.isArray(_options.disabledDates) && _options.disabledDates.length) { - options.disabledDates = $.extend(true, [], _options.disabledDates); - } - - if (_options.disabledWeekDays && $.isArray(_options.disabledWeekDays) && _options.disabledWeekDays.length) { - options.disabledWeekDays = $.extend(true, [], _options.disabledWeekDays); - } - - if ((options.open || options.opened) && (!options.inline)) { - input.trigger('open.xdsoft'); - } - - if (options.inline) { - triggerAfterOpen = true; - datetimepicker.addClass('xdsoft_inline'); - input.after(datetimepicker).hide(); - } - - if (options.inverseButton) { - options.next = 'xdsoft_prev'; - options.prev = 'xdsoft_next'; - } - - if (options.datepicker) { - datepicker.addClass('active'); - } else { - datepicker.removeClass('active'); - } - - if (options.timepicker) { - timepicker.addClass('active'); - } else { - timepicker.removeClass('active'); - } - - if (options.value) { - _xdsoft_datetime.setCurrentTime(options.value); - if (input && input.val) { - input.val(_xdsoft_datetime.str); - } - } - - if (isNaN(options.dayOfWeekStart)) { - options.dayOfWeekStart = 0; - } else { - options.dayOfWeekStart = parseInt(options.dayOfWeekStart, 10) % 7; - } - - if (!options.timepickerScrollbar) { - timeboxparent.xdsoftScroller('hide'); - } - - if (options.minDate && /^-(.*)$/.test(options.minDate)) { - options.minDate = _xdsoft_datetime.strToDateTime(options.minDate).dateFormat(options.formatDate); - } - - if (options.maxDate && /^\+(.*)$/.test(options.maxDate)) { - options.maxDate = _xdsoft_datetime.strToDateTime(options.maxDate).dateFormat(options.formatDate); - } - - applyButton.toggle(options.showApplyButton); - - mounth_picker - .find('.xdsoft_today_button') - .css('visibility', !options.todayButton ? 'hidden' : 'visible'); - - mounth_picker - .find('.' + options.prev) - .css('visibility', !options.prevButton ? 'hidden' : 'visible'); - - mounth_picker - .find('.' + options.next) - .css('visibility', !options.nextButton ? 'hidden' : 'visible'); - - if (options.mask) { - input.off('keydown.xdsoft'); - - if (options.mask === true) { - options.mask = options.format - .replace(/Y/g, '9999') - .replace(/F/g, '9999') - .replace(/m/g, '19') - .replace(/d/g, '39') - .replace(/H/g, '29') - .replace(/i/g, '59') - .replace(/s/g, '59'); - } - - if ($.type(options.mask) === 'string') { - if (!isValidValue(options.mask, input.val())) { - input.val(options.mask.replace(/[0-9]/g, '_')); - } - - input.on('keydown.xdsoft', function (event) { - var val = this.value, - key = event.which, - pos, - digit; - - if (((key >= KEY0 && key <= KEY9) || (key >= _KEY0 && key <= _KEY9)) || (key === BACKSPACE || key === DEL)) { - pos = getCaretPos(this); - digit = (key !== BACKSPACE && key !== DEL) ? String.fromCharCode((_KEY0 <= key && key <= _KEY9) ? key - KEY0 : key) : '_'; - - if ((key === BACKSPACE || key === DEL) && pos) { - pos -= 1; - digit = '_'; - } - - while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) { - pos += (key === BACKSPACE || key === DEL) ? -1 : 1; - } - - val = val.substr(0, pos) + digit + val.substr(pos + 1); - if ($.trim(val) === '') { - val = options.mask.replace(/[0-9]/g, '_'); - } else { - if (pos === options.mask.length) { - event.preventDefault(); - return false; - } - } - - pos += (key === BACKSPACE || key === DEL) ? 0 : 1; - while (/[^0-9_]/.test(options.mask.substr(pos, 1)) && pos < options.mask.length && pos > 0) { - pos += (key === BACKSPACE || key === DEL) ? -1 : 1; - } - - if (isValidValue(options.mask, val)) { - this.value = val; - setCaretPos(this, pos); - } else if ($.trim(val) === '') { - this.value = options.mask.replace(/[0-9]/g, '_'); - } else { - input.trigger('error_input.xdsoft'); - } - } else { - if (([AKEY, CKEY, VKEY, ZKEY, YKEY].indexOf(key) !== -1 && ctrlDown) || [ESC, ARROWUP, ARROWDOWN, ARROWLEFT, ARROWRIGHT, F5, CTRLKEY, TAB, ENTER].indexOf(key) !== -1) { - return true; - } - } - - event.preventDefault(); - return false; - }); - } - } - if (options.validateOnBlur) { - input - .off('blur.xdsoft') - .on('blur.xdsoft', function () { - if (options.allowBlank && !$.trim($(this).val()).length) { - $(this).val(null); - datetimepicker.data('xdsoft_datetime').empty(); - } else if (!Date.parseDate($(this).val(), options.format)) { - var splittedHours = +([$(this).val()[0], $(this).val()[1]].join('')), - splittedMinutes = +([$(this).val()[2], $(this).val()[3]].join('')); - - // parse the numbers as 0312 => 03:12 - if (!options.datepicker && options.timepicker && splittedHours >= 0 && splittedHours < 24 && splittedMinutes >= 0 && splittedMinutes < 60) { - $(this).val([splittedHours, splittedMinutes].map(function (item) { - return item > 9 ? item : '0' + item; - }).join(':')); - } else { - $(this).val((_xdsoft_datetime.now()).dateFormat(options.format)); - } - - datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val()); - } else { - datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val()); - } - - datetimepicker.trigger('changedatetime.xdsoft'); - }); - } - options.dayOfWeekStartPrev = (options.dayOfWeekStart === 0) ? 6 : options.dayOfWeekStart - 1; - - datetimepicker - .trigger('xchange.xdsoft') - .trigger('afterOpen.xdsoft'); - }; - - datetimepicker - .data('options', options) - .on('mousedown.xdsoft', function (event) { - event.stopPropagation(); - event.preventDefault(); - yearselect.hide(); - monthselect.hide(); - return false; - }); - - //scroll_element = timepicker.find('.xdsoft_time_box'); - timeboxparent.append(timebox); - timeboxparent.xdsoftScroller(); - - datetimepicker.on('afterOpen.xdsoft', function () { - timeboxparent.xdsoftScroller(); - }); - - datetimepicker - .append(datepicker) - .append(timepicker); - - if (options.withoutCopyright !== true) { - datetimepicker - .append(xdsoft_copyright); - } - - datepicker - .append(mounth_picker) - .append(calendar) - .append(applyButton); - - $(options.parentID) - .append(datetimepicker); - - XDSoft_datetime = function () { - var _this = this; - _this.now = function (norecursion) { - var d = new Date(), - date, - time; - - if (!norecursion && options.defaultDate) { - date = _this.strToDateTime(options.defaultDate); - d.setFullYear(date.getFullYear()); - d.setMonth(date.getMonth()); - d.setDate(date.getDate()); - } - - if (options.yearOffset) { - d.setFullYear(d.getFullYear() + options.yearOffset); - } - - if (!norecursion && options.defaultTime) { - time = _this.strtotime(options.defaultTime); - d.setHours(time.getHours()); - d.setMinutes(time.getMinutes()); - } - return d; - }; - - _this.isValidDate = function (d) { - if (Object.prototype.toString.call(d) !== "[object Date]") { - return false; - } - return !isNaN(d.getTime()); - }; - - _this.setCurrentTime = function (dTime) { - _this.currentTime = (typeof dTime === 'string') ? _this.strToDateTime(dTime) : _this.isValidDate(dTime) ? dTime : _this.now(); - datetimepicker.trigger('xchange.xdsoft'); - }; - - _this.empty = function () { - _this.currentTime = null; - }; - - _this.getCurrentTime = function (dTime) { - return _this.currentTime; - }; - - _this.nextMonth = function () { - - if (_this.currentTime === undefined || _this.currentTime === null) { - _this.currentTime = _this.now(); - } - - var month = _this.currentTime.getMonth() + 1, - year; - if (month === 12) { - _this.currentTime.setFullYear(_this.currentTime.getFullYear() + 1); - month = 0; - } - - year = _this.currentTime.getFullYear(); - - _this.currentTime.setDate( - Math.min( - new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(), - _this.currentTime.getDate() - ) - ); - _this.currentTime.setMonth(month); - - if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) { - options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input')); - } - - if (year !== _this.currentTime.getFullYear() && $.isFunction(options.onChangeYear)) { - options.onChangeYear.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input')); - } - - datetimepicker.trigger('xchange.xdsoft'); - return month; - }; - - _this.prevMonth = function () { - - if (_this.currentTime === undefined || _this.currentTime === null) { - _this.currentTime = _this.now(); - } - - var month = _this.currentTime.getMonth() - 1; - if (month === -1) { - _this.currentTime.setFullYear(_this.currentTime.getFullYear() - 1); - month = 11; - } - _this.currentTime.setDate( - Math.min( - new Date(_this.currentTime.getFullYear(), month + 1, 0).getDate(), - _this.currentTime.getDate() - ) - ); - _this.currentTime.setMonth(month); - if (options.onChangeMonth && $.isFunction(options.onChangeMonth)) { - options.onChangeMonth.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input')); - } - datetimepicker.trigger('xchange.xdsoft'); - return month; - }; - - _this.getWeekOfYear = function (datetime) { - var onejan = new Date(datetime.getFullYear(), 0, 1); - return Math.ceil((((datetime - onejan) / 86400000) + onejan.getDay() + 1) / 7); - }; - - _this.strToDateTime = function (sDateTime) { - var tmpDate = [], timeOffset, currentTime; - - if (sDateTime && sDateTime instanceof Date && _this.isValidDate(sDateTime)) { - return sDateTime; - } - - tmpDate = /^(\+|\-)(.*)$/.exec(sDateTime); - if (tmpDate) { - tmpDate[2] = Date.parseDate(tmpDate[2], options.formatDate); - } - if (tmpDate && tmpDate[2]) { - timeOffset = tmpDate[2].getTime() - (tmpDate[2].getTimezoneOffset()) * 60000; - currentTime = new Date((_this.now(true)).getTime() + parseInt(tmpDate[1] + '1', 10) * timeOffset); - } else { - currentTime = sDateTime ? Date.parseDate(sDateTime, options.format) : _this.now(); - } - - if (!_this.isValidDate(currentTime)) { - currentTime = _this.now(); - } - - return currentTime; - }; - - _this.strToDate = function (sDate) { - if (sDate && sDate instanceof Date && _this.isValidDate(sDate)) { - return sDate; - } - - var currentTime = sDate ? Date.parseDate(sDate, options.formatDate) : _this.now(true); - if (!_this.isValidDate(currentTime)) { - currentTime = _this.now(true); - } - return currentTime; - }; - - _this.strtotime = function (sTime) { - if (sTime && sTime instanceof Date && _this.isValidDate(sTime)) { - return sTime; - } - var currentTime = sTime ? Date.parseDate(sTime, options.formatTime) : _this.now(true); - if (!_this.isValidDate(currentTime)) { - currentTime = _this.now(true); - } - return currentTime; - }; - - _this.str = function () { - return _this.currentTime.dateFormat(options.format); - }; - _this.currentTime = this.now(); - }; - - _xdsoft_datetime = new XDSoft_datetime(); - - applyButton.on('click', function (e) {//pathbrite - e.preventDefault(); - datetimepicker.data('changed', true); - _xdsoft_datetime.setCurrentTime(getCurrentValue()); - input.val(_xdsoft_datetime.str()); - datetimepicker.trigger('close.xdsoft'); - }); - mounth_picker - .find('.xdsoft_today_button') - .on('mousedown.xdsoft', function () { - datetimepicker.data('changed', true); - _xdsoft_datetime.setCurrentTime(0); - datetimepicker.trigger('afterOpen.xdsoft'); - }).on('dblclick.xdsoft', function () { - var currentDate = _xdsoft_datetime.getCurrentTime(), minDate, maxDate; - currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate()); - minDate = _xdsoft_datetime.strToDate(options.minDate); - minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()); - if (currentDate < minDate) { - return; - } - maxDate = _xdsoft_datetime.strToDate(options.maxDate); - maxDate = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate()); - if (currentDate > maxDate) { - return; - } - input.val(_xdsoft_datetime.str()); - datetimepicker.trigger('close.xdsoft'); - }); - mounth_picker - .find('.xdsoft_prev,.xdsoft_next') - .on('mousedown.xdsoft', function () { - var $this = $(this), - timer = 0, - stop = false; - - (function arguments_callee1(v) { - if ($this.hasClass(options.next)) { - _xdsoft_datetime.nextMonth(); - } else if ($this.hasClass(options.prev)) { - _xdsoft_datetime.prevMonth(); - } - if (options.monthChangeSpinner) { - if (!stop) { - timer = setTimeout(arguments_callee1, v || 100); - } - } - }(500)); - - $([document.body, window]).on('mouseup.xdsoft', function arguments_callee2() { - clearTimeout(timer); - stop = true; - $([document.body, window]).off('mouseup.xdsoft', arguments_callee2); - }); - }); - - timepicker - .find('.xdsoft_prev,.xdsoft_next') - .on('mousedown.xdsoft', function () { - var $this = $(this), - timer = 0, - stop = false, - period = 110; - (function arguments_callee4(v) { - var pheight = timeboxparent[0].clientHeight, - height = timebox[0].offsetHeight, - top = Math.abs(parseInt(timebox.css('marginTop'), 10)); - if ($this.hasClass(options.next) && (height - pheight) - options.timeHeightInTimePicker >= top) { - timebox.css('marginTop', '-' + (top + options.timeHeightInTimePicker) + 'px'); - } else if ($this.hasClass(options.prev) && top - options.timeHeightInTimePicker >= 0) { - timebox.css('marginTop', '-' + (top - options.timeHeightInTimePicker) + 'px'); - } - timeboxparent.trigger('scroll_element.xdsoft_scroller', [Math.abs(parseInt(timebox.css('marginTop'), 10) / (height - pheight))]); - period = (period > 10) ? 10 : period - 10; - if (!stop) { - timer = setTimeout(arguments_callee4, v || period); - } - }(500)); - $([document.body, window]).on('mouseup.xdsoft', function arguments_callee5() { - clearTimeout(timer); - stop = true; - $([document.body, window]) - .off('mouseup.xdsoft', arguments_callee5); - }); - }); - - xchangeTimer = 0; - // base handler - generating a calendar and timepicker - datetimepicker - .on('xchange.xdsoft', function (event) { - clearTimeout(xchangeTimer); - xchangeTimer = setTimeout(function () { - - if (_xdsoft_datetime.currentTime === undefined || _xdsoft_datetime.currentTime === null) { - _xdsoft_datetime.currentTime = _xdsoft_datetime.now(); - } - - var table = '', - start = new Date(_xdsoft_datetime.currentTime.getFullYear(), _xdsoft_datetime.currentTime.getMonth(), 1, 12, 0, 0), - i = 0, - j, - today = _xdsoft_datetime.now(), - maxDate = false, - minDate = false, - hDate, - day, - d, - y, - m, - w, - classes = [], - customDateSettings, - newRow = true, - time = '', - h = '', - line_time, - description; - - while (start.getDay() !== options.dayOfWeekStart) { - start.setDate(start.getDate() - 1); - } - - table += '
  • '; - - if (options.weeks) { - table += ''; - } - - for (j = 0; j < 7; j += 1) { - table += ''; - } - - table += ''; - table += ''; - - if (options.maxDate !== false) { - maxDate = _xdsoft_datetime.strToDate(options.maxDate); - maxDate = new Date(maxDate.getFullYear(), maxDate.getMonth(), maxDate.getDate(), 23, 59, 59, 999); - } - - if (options.minDate !== false) { - minDate = _xdsoft_datetime.strToDate(options.minDate); - minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate()); - } - - while (i < _xdsoft_datetime.currentTime.countDaysInMonth() || start.getDay() !== options.dayOfWeekStart || _xdsoft_datetime.currentTime.getMonth() === start.getMonth()) { - classes = []; - i += 1; - - day = start.getDay(); - d = start.getDate(); - y = start.getFullYear(); - m = start.getMonth(); - w = _xdsoft_datetime.getWeekOfYear(start); - description = ''; - - classes.push('xdsoft_date'); - - if (options.beforeShowDay && $.isFunction(options.beforeShowDay.call)) { - customDateSettings = options.beforeShowDay.call(datetimepicker, start); - } else { - customDateSettings = null; - } - - if ((maxDate !== false && start > maxDate) || (minDate !== false && start < minDate) || (customDateSettings && customDateSettings[0] === false)) { - classes.push('xdsoft_disabled'); - } else if (options.disabledDates.indexOf(start.dateFormat(options.formatDate)) !== -1) { - classes.push('xdsoft_disabled'); - } else if (options.disabledWeekDays.indexOf(day) !== -1) { - classes.push('xdsoft_disabled'); - } - - if (customDateSettings && customDateSettings[1] !== "") { - classes.push(customDateSettings[1]); - } - - if (_xdsoft_datetime.currentTime.getMonth() !== m) { - classes.push('xdsoft_other_month'); - } - - if ((options.defaultSelect || datetimepicker.data('changed')) && _xdsoft_datetime.currentTime.dateFormat(options.formatDate) === start.dateFormat(options.formatDate)) { - classes.push('xdsoft_current'); - } - - if (today.dateFormat(options.formatDate) === start.dateFormat(options.formatDate)) { - classes.push('xdsoft_today'); - } - - if (start.getDay() === 0 || start.getDay() === 6 || options.weekends.indexOf(start.dateFormat(options.formatDate)) !== -1) { - classes.push('xdsoft_weekend'); - } - - if (options.highlightedDates[start.dateFormat(options.formatDate)] !== undefined) { - hDate = options.highlightedDates[start.dateFormat(options.formatDate)]; - classes.push(hDate.style === undefined ? 'xdsoft_highlighted_default' : hDate.style); - description = hDate.desc === undefined ? '' : hDate.desc; - } - - if (options.beforeShowDay && $.isFunction(options.beforeShowDay)) { - classes.push(options.beforeShowDay(start)); - } - - if (newRow) { - table += ''; - newRow = false; - if (options.weeks) { - table += ''; - } - } - - table += ''; - - if (start.getDay() === options.dayOfWeekStartPrev) { - table += ''; - newRow = true; - } - - start.setDate(d + 1); - } - table += '
    ' + options.i18n[options.lang].dayOfWeek[(j + options.dayOfWeekStart) % 7] + '
    ' + w + '' + - '
    ' + d + '
    ' + - '
    '; - - calendar.html(table); - - mounth_picker.find('.xdsoft_label span').eq(0).text(options.i18n[options.lang].months[_xdsoft_datetime.currentTime.getMonth()]); - mounth_picker.find('.xdsoft_label span').eq(1).text(_xdsoft_datetime.currentTime.getFullYear()); - - // generate timebox - time = ''; - h = ''; - m = ''; - line_time = function line_time(h, m) { - var now = _xdsoft_datetime.now(), optionDateTime, current_time; - now.setHours(h); - h = parseInt(now.getHours(), 10); - now.setMinutes(m); - m = parseInt(now.getMinutes(), 10); - optionDateTime = new Date(_xdsoft_datetime.currentTime); - optionDateTime.setHours(h); - optionDateTime.setMinutes(m); - classes = []; - if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || (options.maxTime !== false && _xdsoft_datetime.strtotime(options.maxTime).getTime() < now.getTime()) || (options.minTime !== false && _xdsoft_datetime.strtotime(options.minTime).getTime() > now.getTime())) { - classes.push('xdsoft_disabled'); - } - if ((options.minDateTime !== false && options.minDateTime > optionDateTime) || ((options.disabledMinTime !== false && now.getTime() > _xdsoft_datetime.strtotime(options.disabledMinTime).getTime()) && (options.disabledMaxTime !== false && now.getTime() < _xdsoft_datetime.strtotime(options.disabledMaxTime).getTime()))) { - classes.push('xdsoft_disabled'); - } - - current_time = new Date(_xdsoft_datetime.currentTime); - current_time.setHours(parseInt(_xdsoft_datetime.currentTime.getHours(), 10)); - current_time.setMinutes(Math[options.roundTime](_xdsoft_datetime.currentTime.getMinutes() / options.step) * options.step); - - if ((options.initTime || options.defaultSelect || datetimepicker.data('changed')) && current_time.getHours() === parseInt(h, 10) && (options.step > 59 || current_time.getMinutes() === parseInt(m, 10))) { - if (options.defaultSelect || datetimepicker.data('changed')) { - classes.push('xdsoft_current'); - } else if (options.initTime) { - classes.push('xdsoft_init_time'); - } - } - if (parseInt(today.getHours(), 10) === parseInt(h, 10) && parseInt(today.getMinutes(), 10) === parseInt(m, 10)) { - classes.push('xdsoft_today'); - } - time += '
    ' + now.dateFormat(options.formatTime) + '
    '; - }; - - if (!options.allowTimes || !$.isArray(options.allowTimes) || !options.allowTimes.length) { - for (i = 0, j = 0; i < (options.hours12 ? 12 : 24); i += 1) { - for (j = 0; j < 60; j += options.step) { - h = (i < 10 ? '0' : '') + i; - m = (j < 10 ? '0' : '') + j; - line_time(h, m); - } - } - } else { - for (i = 0; i < options.allowTimes.length; i += 1) { - h = _xdsoft_datetime.strtotime(options.allowTimes[i]).getHours(); - m = _xdsoft_datetime.strtotime(options.allowTimes[i]).getMinutes(); - line_time(h, m); - } - } - - timebox.html(time); - - opt = ''; - i = 0; - - for (i = parseInt(options.yearStart, 10) + options.yearOffset; i <= parseInt(options.yearEnd, 10) + options.yearOffset; i += 1) { - opt += '
    ' + i + '
    '; - } - yearselect.children().eq(0) - .html(opt); - - for (i = parseInt(options.monthStart, 10), opt = ''; i <= parseInt(options.monthEnd, 10); i += 1) { - opt += '
    ' + options.i18n[options.lang].months[i] + '
    '; - } - monthselect.children().eq(0).html(opt); - $(datetimepicker) - .trigger('generate.xdsoft'); - }, 10); - event.stopPropagation(); - }) - .on('afterOpen.xdsoft', function () { - if (options.timepicker) { - var classType, pheight, height, top; - if (timebox.find('.xdsoft_current').length) { - classType = '.xdsoft_current'; - } else if (timebox.find('.xdsoft_init_time').length) { - classType = '.xdsoft_init_time'; - } - if (classType) { - pheight = timeboxparent[0].clientHeight; - height = timebox[0].offsetHeight; - top = timebox.find(classType).index() * options.timeHeightInTimePicker + 1; - if ((height - pheight) < top) { - top = height - pheight; - } - timeboxparent.trigger('scroll_element.xdsoft_scroller', [parseInt(top, 10) / (height - pheight)]); - } else { - timeboxparent.trigger('scroll_element.xdsoft_scroller', [0]); - } - } - }); - - timerclick = 0; - calendar - .on('click.xdsoft', 'td', function (xdevent) { - xdevent.stopPropagation(); // Prevents closing of Pop-ups, Modals and Flyouts in Bootstrap - timerclick += 1; - var $this = $(this), - currentTime = _xdsoft_datetime.currentTime; - - if (currentTime === undefined || currentTime === null) { - _xdsoft_datetime.currentTime = _xdsoft_datetime.now(); - currentTime = _xdsoft_datetime.currentTime; - } - - if ($this.hasClass('xdsoft_disabled')) { - return false; - } - - currentTime.setDate(1); - currentTime.setFullYear($this.data('year')); - currentTime.setMonth($this.data('month')); - currentTime.setDate($this.data('date')); - - datetimepicker.trigger('select.xdsoft', [currentTime]); - - input.val(_xdsoft_datetime.str()); - if ((timerclick > 1 || (options.closeOnDateSelect === true || (options.closeOnDateSelect === false && !options.timepicker))) && !options.inline) { - datetimepicker.trigger('close.xdsoft'); - } - - if (options.onSelectDate && $.isFunction(options.onSelectDate)) { - options.onSelectDate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent); - } - - datetimepicker.data('changed', true); - datetimepicker.trigger('xchange.xdsoft'); - datetimepicker.trigger('changedatetime.xdsoft'); - setTimeout(function () { - timerclick = 0; - }, 200); - }); - - timebox - .on('click.xdsoft', 'div', function (xdevent) { - xdevent.stopPropagation(); - var $this = $(this), - currentTime = _xdsoft_datetime.currentTime; - - if (currentTime === undefined || currentTime === null) { - _xdsoft_datetime.currentTime = _xdsoft_datetime.now(); - currentTime = _xdsoft_datetime.currentTime; - } - - if ($this.hasClass('xdsoft_disabled')) { - return false; - } - currentTime.setHours($this.data('hour')); - currentTime.setMinutes($this.data('minute')); - datetimepicker.trigger('select.xdsoft', [currentTime]); - - datetimepicker.data('input').val(_xdsoft_datetime.str()); - - if (options.inline !== true && options.closeOnTimeSelect === true) { - datetimepicker.trigger('close.xdsoft'); - } - - if (options.onSelectTime && $.isFunction(options.onSelectTime)) { - options.onSelectTime.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), xdevent); - } - datetimepicker.data('changed', true); - datetimepicker.trigger('xchange.xdsoft'); - datetimepicker.trigger('changedatetime.xdsoft'); - }); - - - datepicker - .on('mousewheel.xdsoft', function (event) { - if (!options.scrollMonth) { - return true; - } - if (event.deltaY < 0) { - _xdsoft_datetime.nextMonth(); - } else { - _xdsoft_datetime.prevMonth(); - } - return false; - }); - - input - .on('mousewheel.xdsoft', function (event) { - if (!options.scrollInput) { - return true; - } - if (!options.datepicker && options.timepicker) { - current_time_index = timebox.find('.xdsoft_current').length ? timebox.find('.xdsoft_current').eq(0).index() : 0; - if (current_time_index + event.deltaY >= 0 && current_time_index + event.deltaY < timebox.children().length) { - current_time_index += event.deltaY; - } - if (timebox.children().eq(current_time_index).length) { - timebox.children().eq(current_time_index).trigger('mousedown'); - } - return false; - } - if (options.datepicker && !options.timepicker) { - datepicker.trigger(event, [event.deltaY, event.deltaX, event.deltaY]); - if (input.val) { - input.val(_xdsoft_datetime.str()); - } - datetimepicker.trigger('changedatetime.xdsoft'); - return false; - } - }); - - datetimepicker - .on('changedatetime.xdsoft', function (event) { - if (options.onChangeDateTime && $.isFunction(options.onChangeDateTime)) { - var $input = datetimepicker.data('input'); - options.onChangeDateTime.call(datetimepicker, _xdsoft_datetime.currentTime, $input, event); - delete options.value; - $input.trigger('change'); - } - }) - .on('generate.xdsoft', function () { - if (options.onGenerate && $.isFunction(options.onGenerate)) { - options.onGenerate.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input')); - } - if (triggerAfterOpen) { - datetimepicker.trigger('afterOpen.xdsoft'); - triggerAfterOpen = false; - } - }) - .on('click.xdsoft', function (xdevent) { - xdevent.stopPropagation(); - }); - - current_time_index = 0; - - setPos = function () { - var offset = datetimepicker.data('input').offset(), top = offset.top + datetimepicker.data('input')[0].offsetHeight - 1, left = offset.left, position = "absolute", node; - if (options.fixed) { - top -= $(window).scrollTop(); - left -= $(window).scrollLeft(); - position = "fixed"; - } else { - if (top + datetimepicker[0].offsetHeight > $(window).height() + $(window).scrollTop()) { - top = offset.top - datetimepicker[0].offsetHeight + 1; - } - if (top < 0) { - top = 0; - } - if (left + datetimepicker[0].offsetWidth > $(window).width()) { - left = $(window).width() - datetimepicker[0].offsetWidth; - } - } - - node = datetimepicker[0]; - do { - node = node.parentNode; - if (window.getComputedStyle(node).getPropertyValue('position') === 'relative' && $(window).width() >= node.offsetWidth) { - left = left - (($(window).width() - node.offsetWidth) / 2); - break; - } - } while (node.nodeName !== 'HTML'); - datetimepicker.css({ - left: left, - top: top, - position: position - }); - }; - datetimepicker - .on('open.xdsoft', function (event) { - var onShow = true; - if (options.onShow && $.isFunction(options.onShow)) { - onShow = options.onShow.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event); - } - if (onShow !== false) { - datetimepicker.show(); - setPos(); - $(window) - .off('resize.xdsoft', setPos) - .on('resize.xdsoft', setPos); - - if (options.closeOnWithoutClick) { - $([document.body, window]).on('mousedown.xdsoft', function arguments_callee6() { - datetimepicker.trigger('close.xdsoft'); - $([document.body, window]).off('mousedown.xdsoft', arguments_callee6); - }); - } - } - }) - .on('close.xdsoft', function (event) { - var onClose = true; - mounth_picker - .find('.xdsoft_month,.xdsoft_year') - .find('.xdsoft_select') - .hide(); - if (options.onClose && $.isFunction(options.onClose)) { - onClose = options.onClose.call(datetimepicker, _xdsoft_datetime.currentTime, datetimepicker.data('input'), event); - } - if (onClose !== false && !options.opened && !options.inline) { - datetimepicker.hide(); - } - event.stopPropagation(); - }) - .on('toggle.xdsoft', function (event) { - if (datetimepicker.is(':visible')) { - datetimepicker.trigger('close.xdsoft'); - } else { - datetimepicker.trigger('open.xdsoft'); - } - }) - .data('input', input); - - timer = 0; - timer1 = 0; - - datetimepicker.data('xdsoft_datetime', _xdsoft_datetime); - datetimepicker.setOptions(options); - - function getCurrentValue() { - var ct = false, time; - - if (options.startDate) { - ct = _xdsoft_datetime.strToDate(options.startDate); - } else { - ct = options.value || ((input && input.val && input.val()) ? input.val() : ''); - if (ct) { - ct = _xdsoft_datetime.strToDateTime(ct); - } else if (options.defaultDate) { - ct = _xdsoft_datetime.strToDateTime(options.defaultDate); - if (options.defaultTime) { - time = _xdsoft_datetime.strtotime(options.defaultTime); - ct.setHours(time.getHours()); - ct.setMinutes(time.getMinutes()); - } - } - } - - if (ct && _xdsoft_datetime.isValidDate(ct)) { - datetimepicker.data('changed', true); - } else { - ct = ''; - } - - return ct || 0; - } - - _xdsoft_datetime.setCurrentTime(getCurrentValue()); - - input - .data('xdsoft_datetimepicker', datetimepicker) - .on('open.xdsoft focusin.xdsoft mousedown.xdsoft', function (event) { - if (input.is(':disabled') || (input.data('xdsoft_datetimepicker').is(':visible') && options.closeOnInputClick)) { - return; - } - clearTimeout(timer); - timer = setTimeout(function () { - if (input.is(':disabled')) { - return; - } - - triggerAfterOpen = true; - _xdsoft_datetime.setCurrentTime(getCurrentValue()); - - datetimepicker.trigger('open.xdsoft'); - }, 100); - }) - .on('keydown.xdsoft', function (event) { - var val = this.value, elementSelector, - key = event.which; - if ([ENTER].indexOf(key) !== -1 && options.enterLikeTab) { - elementSelector = $("input:visible,textarea:visible"); - datetimepicker.trigger('close.xdsoft'); - elementSelector.eq(elementSelector.index(this) + 1).focus(); - return false; - } - if ([TAB].indexOf(key) !== -1) { - datetimepicker.trigger('close.xdsoft'); - return true; - } - }); - }; - destroyDateTimePicker = function (input) { - var datetimepicker = input.data('xdsoft_datetimepicker'); - if (datetimepicker) { - datetimepicker.data('xdsoft_datetime', null); - datetimepicker.remove(); - input - .data('xdsoft_datetimepicker', null) - .off('.xdsoft'); - $(window).off('resize.xdsoft'); - $([window, document.body]).off('mousedown.xdsoft'); - if (input.unmousewheel) { - input.unmousewheel(); - } - } - }; - $(document) - .off('keydown.xdsoftctrl keyup.xdsoftctrl') - .on('keydown.xdsoftctrl', function (e) { - if (e.keyCode === CTRLKEY) { - ctrlDown = true; - } - }) - .on('keyup.xdsoftctrl', function (e) { - if (e.keyCode === CTRLKEY) { - ctrlDown = false; - } - }); - return this.each(function () { - var datetimepicker = $(this).data('xdsoft_datetimepicker'), $input; - if (datetimepicker) { - if ($.type(opt) === 'string') { - switch (opt) { - case 'show': - $(this).select().focus(); - datetimepicker.trigger('open.xdsoft'); - break; - case 'hide': - datetimepicker.trigger('close.xdsoft'); - break; - case 'toggle': - datetimepicker.trigger('toggle.xdsoft'); - break; - case 'destroy': - destroyDateTimePicker($(this)); - break; - case 'reset': - this.value = this.defaultValue; - if (!this.value || !datetimepicker.data('xdsoft_datetime').isValidDate(Date.parseDate(this.value, options.format))) { - datetimepicker.data('changed', false); - } - datetimepicker.data('xdsoft_datetime').setCurrentTime(this.value); - break; - case 'validate': - $input = datetimepicker.data('input'); - $input.trigger('blur.xdsoft'); - break; - } - } else { - datetimepicker - .setOptions(opt); - } - return 0; - } - if ($.type(opt) !== 'string') { - if (!options.lazyInit || options.open || options.inline) { - createDateTimePicker($(this)); - } else { - lazyInit($(this)); - } - } - }); - }; - $.fn.datetimepicker.defaults = default_options; -}(jQuery)); - -function HighlightedDate(date, desc, style) { - "use strict"; - this.date = date; - this.desc = desc; - this.style = style; -} - -(function () { - -/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh) - * Licensed under the MIT License (LICENSE.txt). - * - * Version: 3.1.12 - * - * Requires: jQuery 1.2.2+ - */ -!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}); - -// Parse and Format Library -//http://www.xaprb.com/blog/2005/12/12/javascript-closures-for-runtime-efficiency/ -/* - * Copyright (C) 2004 Baron Schwartz - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation, version 2.1. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - */ -Date.parseFunctions={count:0};Date.parseRegexes=[];Date.formatFunctions={count:0};Date.prototype.dateFormat=function(b){if(b=="unixtime"){return parseInt(this.getTime()/1000);}if(Date.formatFunctions[b]==null){Date.createNewFormat(b);}var a=Date.formatFunctions[b];return this[a]();};Date.createNewFormat=function(format){var funcName="format"+Date.formatFunctions.count++;Date.formatFunctions[format]=funcName;var codePrefix="Date.prototype."+funcName+" = function() {return ";var code="";var special=false;var ch="";for(var i=0;i 0) {";var regex="";var special=false;var ch="";for(var i=0;i 0 && z > 0){\nvar doyDate = new Date(y,0);\ndoyDate.setDate(z);\nm = doyDate.getMonth();\nd = doyDate.getDate();\n}";code+="if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n{return new Date(y, m, d, h, i, s);}\nelse if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n{return new Date(y, m, d, h, i);}\nelse if (y > 0 && m >= 0 && d > 0 && h >= 0)\n{return new Date(y, m, d, h);}\nelse if (y > 0 && m >= 0 && d > 0)\n{return new Date(y, m, d);}\nelse if (y > 0 && m >= 0)\n{return new Date(y, m);}\nelse if (y > 0)\n{return new Date(y);}\n}return null;}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$",'i');eval(code);};Date.formatCodeToRegex=function(b,a){switch(b){case"D":return{g:0,c:null,s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};case"j":case"d":return{g:1,c:"d = parseInt(results["+a+"], 10);\n",s:"(\\d{1,2})"};case"l":return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"};case"S":return{g:0,c:null,s:"(?:st|nd|rd|th)"};case"w":return{g:0,c:null,s:"\\d"};case"z":return{g:1,c:"z = parseInt(results["+a+"], 10);\n",s:"(\\d{1,3})"};case"W":return{g:0,c:null,s:"(?:\\d{2})"};case"F":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+a+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case"M":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+a+"]], 10);\n",s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};case"n":case"m":return{g:1,c:"m = parseInt(results["+a+"], 10) - 1;\n",s:"(\\d{1,2})"};case"t":return{g:0,c:null,s:"\\d{1,2}"};case"L":return{g:0,c:null,s:"(?:1|0)"};case"Y":return{g:1,c:"y = parseInt(results["+a+"], 10);\n",s:"(\\d{4})"};case"y":return{g:1,c:"var ty = parseInt(results["+a+"], 10);\ny = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case"a":return{g:1,c:"if (results["+a+"] == 'am') {\nif (h == 12) { h = 0; }\n} else { if (h < 12) { h += 12; }}",s:"(am|pm)"};case"A":return{g:1,c:"if (results["+a+"] == 'AM') {\nif (h == 12) { h = 0; }\n} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"};case"g":case"G":case"h":case"H":return{g:1,c:"h = parseInt(results["+a+"], 10);\n",s:"(\\d{1,2})"};case"i":return{g:1,c:"i = parseInt(results["+a+"], 10);\n",s:"(\\d{2})"};case"s":return{g:1,c:"s = parseInt(results["+a+"], 10);\n",s:"(\\d{2})"};case"O":return{g:0,c:null,s:"[+-]\\d{4}"};case"T":return{g:0,c:null,s:"[A-Z]{3}"};case"Z":return{g:0,c:null,s:"[+-]\\d{1,5}"};default:return{g:0,c:null,s:String.escape(b)};}};Date.prototype.getTimezone=function(){return this.toString().replace(/^.*? ([A-Z]{3}) [0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3");};Date.prototype.getGMTOffset=function(){return(this.getTimezoneOffset()>0?"-":"+")+String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset())/60),2,"0")+String.leftPad(Math.abs(this.getTimezoneOffset())%60,2,"0");};Date.prototype.getDayOfYear=function(){var a=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var b=0;b div { - position: absolute; - top: 0; - left: 0; - width: 8px; - height: 8px; - border-radius: 8px; - border: solid 2px white; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; -} - -.minicolors-picker { - position: absolute; - top: 0; - left: 0; - width: 18px; - height: 2px; - background: white; - border: solid 1px black; - margin-top: -2px; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - box-sizing: content-box; -} - -/* Swatches */ -.minicolors-swatches,.minicolors-swatches li { - margin: 0; - padding: 0; - list-style: none; - overflow: hidden; - position: absolute; - top: 157px; - left: 5px; -} - -.minicolors-swatches .minicolors-swatch { - position: relative; - float: left; - cursor: pointer; - margin:0 4px 0 0; -} - -.minicolors-with-opacity .minicolors-swatches .minicolors-swatch { - margin-right:7px; -} - -.minicolors-swatch.selected { - border-color:#000; -} - -/* Inline controls */ -.minicolors-inline { - display: inline-block; -} - -.minicolors-inline .minicolors-input { - display: none !important; -} - -.minicolors-inline .minicolors-panel { - position: relative; - top: auto; - left: auto; - box-shadow: none; - z-index: auto; - display: inline-block; -} - -/* Default theme */ -.minicolors-theme-default .minicolors-swatch { - top: 5px; - left: 5px; - width: 18px; - height: 18px; -} -.minicolors-theme-default .minicolors-swatches .minicolors-swatch { - top: 0; - left: 0; - width: 18px; - height: 18px; -} -.minicolors-theme-default .minicolors-swatches { - height: 20px; -} -.minicolors-theme-default.minicolors-position-right .minicolors-swatch { - left: auto; - right: 5px; -} -.minicolors-theme-default.minicolors { - width: auto; - display: inline-block; -} -.minicolors-theme-default .minicolors-input { - height: 20px; - width: auto; - display: inline-block; - padding-left: 26px; -} -.minicolors-theme-default.minicolors-position-right .minicolors-input { - padding-right: 26px; - padding-left: inherit; -} - -/* Bootstrap theme */ -.minicolors-theme-bootstrap .minicolors-swatch { - z-index: 2; - top: 3px; - left: 3px; - width: 28px; - height: 28px; - border-radius: 3px; -} -.minicolors-theme-bootstrap .minicolors-swatches .minicolors-swatch { - top: 0; - left: 0; - width: 20px; - height: 20px; -} -.minicolors-theme-bootstrap .minicolors-swatch-color { - border-radius: inherit; -} -.minicolors-theme-bootstrap.minicolors-position-right .minicolors-swatch { - left: auto; - right: 3px; -} -.minicolors-theme-bootstrap .minicolors-input { - float: none; - padding-left: 44px; -} -.minicolors-theme-bootstrap.minicolors-position-right .minicolors-input { - padding-right: 44px; - padding-left: 12px; -} -.minicolors-theme-bootstrap .minicolors-input.input-lg + .minicolors-swatch { - top: 4px; - left: 4px; - width: 37px; - height: 37px; - border-radius: 5px; -} -.minicolors-theme-bootstrap .minicolors-input.input-sm + .minicolors-swatch { - width: 24px; - height: 24px; -} -.input-group .minicolors-theme-bootstrap:not(:first-child) .minicolors-input { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} diff --git a/public/plugins/jquery.minicolors-2.2.3/jquery.minicolors.min.js b/public/plugins/jquery.minicolors-2.2.3/jquery.minicolors.min.js deleted file mode 100644 index 5e5d7c9..0000000 --- a/public/plugins/jquery.minicolors-2.2.3/jquery.minicolors.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/* - * jQuery MiniColors: A tiny color picker built on jQuery - * - * Copyright: Cory LaViska for A Beautiful Site, LLC: http://www.abeautifulsite.net/ - * - * Contribute: https://github.com/claviska/jquery-minicolors - * - * @license: http://opensource.org/licenses/MIT - * - */ -!function(i){"function"==typeof define&&define.amd?define(["jquery"],i):"object"==typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function($){"use strict";function i(i,t){var o=$('
    '),a=$.minicolors.defaults,s=i.attr("data-opacity"),n;i.data("minicolors-initialized")||(t=$.extend(!0,{},a,t),o.addClass("minicolors-theme-"+t.theme).toggleClass("minicolors-with-opacity",t.opacity).toggleClass("minicolors-no-data-uris",t.dataUris!==!0),void 0!==t.position&&$.each(t.position.split(" "),function(){o.addClass("minicolors-position-"+this)}),n="rgb"===t.format?t.opacity?"25":"20":t.keywords?"11":"7",i.addClass("minicolors-input").data("minicolors-initialized",!1).data("minicolors-settings",t).prop("size",n).wrap(o).after('
    '),t.inline||(i.after(''),i.next(".minicolors-swatch").on("click",function(t){t.preventDefault(),i.focus()})),i.parent().find(".minicolors-panel").on("selectstart",function(){return!1}).end(),t.inline&&i.parent().addClass("minicolors-inline"),r(i,!1),i.data("minicolors-initialized",!0))}function t(i){var t=i.parent();i.removeData("minicolors-initialized").removeData("minicolors-settings").removeProp("size").removeClass("minicolors-input"),t.before(i).remove()}function o(i){var t=i.parent(),o=t.find(".minicolors-panel"),s=i.data("minicolors-settings");!i.data("minicolors-initialized")||i.prop("disabled")||t.hasClass("minicolors-inline")||t.hasClass("minicolors-focus")||(a(),t.addClass("minicolors-focus"),o.stop(!0,!0).fadeIn(s.showSpeed,function(){s.show&&s.show.call(i.get(0))}))}function a(){$(".minicolors-focus").each(function(){var i=$(this),t=i.find(".minicolors-input"),o=i.find(".minicolors-panel"),a=t.data("minicolors-settings");o.fadeOut(a.hideSpeed,function(){a.hide&&a.hide.call(t.get(0)),i.removeClass("minicolors-focus")})})}function s(i,t,o){var a=i.parents(".minicolors").find(".minicolors-input"),s=a.data("minicolors-settings"),r=i.find("[class$=-picker]"),e=i.offset().left,c=i.offset().top,l=Math.round(t.pageX-e),h=Math.round(t.pageY-c),d=o?s.animationSpeed:0,u,p,g,m;t.originalEvent.changedTouches&&(l=t.originalEvent.changedTouches[0].pageX-e,h=t.originalEvent.changedTouches[0].pageY-c),0>l&&(l=0),0>h&&(h=0),l>i.width()&&(l=i.width()),h>i.height()&&(h=i.height()),i.parent().is(".minicolors-slider-wheel")&&r.parent().is(".minicolors-grid")&&(u=75-l,p=75-h,g=Math.sqrt(u*u+p*p),m=Math.atan2(p,u),0>m&&(m+=2*Math.PI),g>75&&(g=75,l=75-75*Math.cos(m),h=75-75*Math.sin(m)),l=Math.round(l),h=Math.round(h)),i.is(".minicolors-grid")?r.stop(!0).animate({top:h+"px",left:l+"px"},d,s.animationEasing,function(){n(a,i)}):r.stop(!0).animate({top:h+"px"},d,s.animationEasing,function(){n(a,i)})}function n(i,t){function o(i,t){var o,a;return i.length&&t?(o=i.offset().left,a=i.offset().top,{x:o-t.offset().left+i.outerWidth()/2,y:a-t.offset().top+i.outerHeight()/2}):null}var a,s,n,r,c,l,d,u=i.val(),p=i.attr("data-opacity"),m,f=i.parent(),v=i.data("minicolors-settings"),b=f.find(".minicolors-swatch"),y=f.find(".minicolors-grid"),C=f.find(".minicolors-slider"),M=f.find(".minicolors-opacity-slider"),x=y.find("[class$=-picker]"),I=C.find("[class$=-picker]"),S=M.find("[class$=-picker]"),z=o(x,y),F=o(I,C),j=o(S,M);if(t.is(".minicolors-grid, .minicolors-slider, .minicolors-opacity-slider")){switch(v.control){case"wheel":r=y.width()/2-z.x,c=y.height()/2-z.y,l=Math.sqrt(r*r+c*c),d=Math.atan2(c,r),0>d&&(d+=2*Math.PI),l>75&&(l=75,z.x=69-75*Math.cos(d),z.y=69-75*Math.sin(d)),s=g(l/.75,0,100),a=g(180*d/Math.PI,0,360),n=g(100-Math.floor(F.y*(100/C.height())),0,100),u=w({h:a,s:s,b:n}),C.css("backgroundColor",w({h:a,s:s,b:100}));break;case"saturation":a=g(parseInt(z.x*(360/y.width()),10),0,360),s=g(100-Math.floor(F.y*(100/C.height())),0,100),n=g(100-Math.floor(z.y*(100/y.height())),0,100),u=w({h:a,s:s,b:n}),C.css("backgroundColor",w({h:a,s:100,b:n})),f.find(".minicolors-grid-inner").css("opacity",s/100);break;case"brightness":a=g(parseInt(z.x*(360/y.width()),10),0,360),s=g(100-Math.floor(z.y*(100/y.height())),0,100),n=g(100-Math.floor(F.y*(100/C.height())),0,100),u=w({h:a,s:s,b:n}),C.css("backgroundColor",w({h:a,s:s,b:100})),f.find(".minicolors-grid-inner").css("opacity",1-n/100);break;default:a=g(360-parseInt(F.y*(360/C.height()),10),0,360),s=g(Math.floor(z.x*(100/y.width())),0,100),n=g(100-Math.floor(z.y*(100/y.height())),0,100),u=w({h:a,s:s,b:n}),y.css("backgroundColor",w({h:a,s:100,b:100}))}if(p=v.opacity?parseFloat(1-j.y/M.height()).toFixed(2):1,v.opacity&&i.attr("data-opacity",p),"rgb"===v.format){var D=k(u),p=""===i.attr("data-opacity")?1:g(parseFloat(i.attr("data-opacity")).toFixed(2),0,1);(isNaN(p)||!v.opacity)&&(p=1),m=i.minicolors("rgbObject").a<=1&&D&&v.opacity?"rgba("+D.r+", "+D.g+", "+D.b+", "+parseFloat(p)+")":"rgb("+D.r+", "+D.g+", "+D.b+")"}else m=h(u,v.letterCase);i.val(m)}b.find("span").css({backgroundColor:u,opacity:p}),e(i,m,p)}function r(i,t){var o,a,s,n,r,c,l,v,y,M,k=i.parent(),x=i.data("minicolors-settings"),I=k.find(".minicolors-swatch"),S=k.find(".minicolors-grid"),z=k.find(".minicolors-slider"),F=k.find(".minicolors-opacity-slider"),j=S.find("[class$=-picker]"),D=z.find("[class$=-picker]"),T=F.find("[class$=-picker]");switch(m(i.val())?(o=b(i.val()),r=g(parseFloat(f(i.val())).toFixed(2),0,1),r&&i.attr("data-opacity",r)):o=h(d(i.val(),!0),x.letterCase),o||(o=h(p(x.defaultValue,!0),x.letterCase)),a=C(o),n=x.keywords?$.map(x.keywords.split(","),function(i){return $.trim(i.toLowerCase())}):[],c=""!==i.val()&&$.inArray(i.val().toLowerCase(),n)>-1?h(i.val()):m(i.val())?u(i.val()):o,t||i.val(c),x.opacity&&(s=""===i.attr("data-opacity")?1:g(parseFloat(i.attr("data-opacity")).toFixed(2),0,1),isNaN(s)&&(s=1),i.attr("data-opacity",s),I.find("span").css("opacity",s),v=g(F.height()-F.height()*s,0,F.height()),T.css("top",v+"px")),"transparent"===i.val().toLowerCase()&&I.find("span").css("opacity",0),I.find("span").css("backgroundColor",o),x.control){case"wheel":y=g(Math.ceil(.75*a.s),0,S.height()/2),M=a.h*Math.PI/180,l=g(75-Math.cos(M)*y,0,S.width()),v=g(75-Math.sin(M)*y,0,S.height()),j.css({top:v+"px",left:l+"px"}),v=150-a.b/(100/S.height()),""===o&&(v=0),D.css("top",v+"px"),z.css("backgroundColor",w({h:a.h,s:a.s,b:100}));break;case"saturation":l=g(5*a.h/12,0,150),v=g(S.height()-Math.ceil(a.b/(100/S.height())),0,S.height()),j.css({top:v+"px",left:l+"px"}),v=g(z.height()-a.s*(z.height()/100),0,z.height()),D.css("top",v+"px"),z.css("backgroundColor",w({h:a.h,s:100,b:a.b})),k.find(".minicolors-grid-inner").css("opacity",a.s/100);break;case"brightness":l=g(5*a.h/12,0,150),v=g(S.height()-Math.ceil(a.s/(100/S.height())),0,S.height()),j.css({top:v+"px",left:l+"px"}),v=g(z.height()-a.b*(z.height()/100),0,z.height()),D.css("top",v+"px"),z.css("backgroundColor",w({h:a.h,s:a.s,b:100})),k.find(".minicolors-grid-inner").css("opacity",1-a.b/100);break;default:l=g(Math.ceil(a.s/(100/S.width())),0,S.width()),v=g(S.height()-Math.ceil(a.b/(100/S.height())),0,S.height()),j.css({top:v+"px",left:l+"px"}),v=g(z.height()-a.h/(360/z.height()),0,z.height()),D.css("top",v+"px"),S.css("backgroundColor",w({h:a.h,s:100,b:100}))}i.data("minicolors-initialized")&&e(i,c,s)}function e(i,t,o){var a=i.data("minicolors-settings"),s=i.data("minicolors-lastChange");s&&s.value===t&&s.opacity===o||(i.data("minicolors-lastChange",{value:t,opacity:o}),a.change&&(a.changeDelay?(clearTimeout(i.data("minicolors-changeTimeout")),i.data("minicolors-changeTimeout",setTimeout(function(){a.change.call(i.get(0),t,o)},a.changeDelay))):a.change.call(i.get(0),t,o)),i.trigger("change").trigger("input"))}function c(i){var t=d($(i).val(),!0),o=k(t),a=$(i).attr("data-opacity");return o?(void 0!==a&&$.extend(o,{a:parseFloat(a)}),o):null}function l(i,t){var o=d($(i).val(),!0),a=k(o),s=$(i).attr("data-opacity");return a?(void 0===s&&(s=1),t?"rgba("+a.r+", "+a.g+", "+a.b+", "+parseFloat(s)+")":"rgb("+a.r+", "+a.g+", "+a.b+")"):null}function h(i,t){return"uppercase"===t?i.toUpperCase():i.toLowerCase()}function d(i,t){return i=i.replace(/^#/g,""),i.match(/^[A-F0-9]{3,6}/gi)?3!==i.length&&6!==i.length?"":(3===i.length&&t&&(i=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]),"#"+i):""}function u(i,t){var o=i.replace(/[^\d,.]/g,""),a=o.split(","),s;return a[0]=g(parseInt(a[0],10),0,255),a[1]=g(parseInt(a[1],10),0,255),a[2]=g(parseInt(a[2],10),0,255),a[3]&&(a[3]=g(parseFloat(a[3],10),0,1)),t?{r:a[0],g:a[1],b:a[2],a:a[3]?a[3]:null}:"undefined"!=typeof a[3]&&a[3]<=1?"rgba("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")":"rgb("+a[0]+", "+a[1]+", "+a[2]+")"}function p(i,t){return m(i)?u(i):d(i,t)}function g(i,t,o){return t>i&&(i=t),i>o&&(i=o),i}function m(i){var t=i.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i);return t&&4===t.length?!0:!1}function f(i){var i=i.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+(\.\d{1,2})?|\.\d{1,2})[\s+]?/i);return i&&6===i.length?i[4]:"1"}function v(i){var t={},o=Math.round(i.h),a=Math.round(255*i.s/100),s=Math.round(255*i.b/100);if(0===a)t.r=t.g=t.b=s;else{var n=s,r=(255-a)*s/255,e=(n-r)*(o%60)/60;360===o&&(o=0),60>o?(t.r=n,t.b=r,t.g=r+e):120>o?(t.g=n,t.b=r,t.r=n-e):180>o?(t.g=n,t.r=r,t.b=r+e):240>o?(t.b=n,t.r=r,t.g=n-e):300>o?(t.b=n,t.g=r,t.r=r+e):360>o?(t.r=n,t.g=r,t.b=n-e):(t.r=0,t.g=0,t.b=0)}return{r:Math.round(t.r),g:Math.round(t.g),b:Math.round(t.b)}}function b(i){return i=i.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i),i&&4===i.length?"#"+("0"+parseInt(i[1],10).toString(16)).slice(-2)+("0"+parseInt(i[2],10).toString(16)).slice(-2)+("0"+parseInt(i[3],10).toString(16)).slice(-2):""}function y(i){var t=[i.r.toString(16),i.g.toString(16),i.b.toString(16)];return $.each(t,function(i,o){1===o.length&&(t[i]="0"+o)}),"#"+t.join("")}function w(i){return y(v(i))}function C(i){var t=M(k(i));return 0===t.s&&(t.h=360),t}function M(i){var t={h:0,s:0,b:0},o=Math.min(i.r,i.g,i.b),a=Math.max(i.r,i.g,i.b),s=a-o;return t.b=a,t.s=0!==a?255*s/a:0,0!==t.s?i.r===a?t.h=(i.g-i.b)/s:i.g===a?t.h=2+(i.b-i.r)/s:t.h=4+(i.r-i.g)/s:t.h=-1,t.h*=60,t.h<0&&(t.h+=360),t.s*=100/255,t.b*=100/255,t}function k(i){return i=parseInt(i.indexOf("#")>-1?i.substring(1):i,16),{r:i>>16,g:(65280&i)>>8,b:255&i}}$.minicolors={defaults:{animationSpeed:50,animationEasing:"swing",change:null,changeDelay:0,control:"hue",dataUris:!0,defaultValue:"",format:"hex",hide:null,hideSpeed:100,inline:!1,keywords:"",letterCase:"lowercase",opacity:!1,position:"bottom left",show:null,showSpeed:100,theme:"default"}},$.extend($.fn,{minicolors:function(s,n){switch(s){case"destroy":return $(this).each(function(){t($(this))}),$(this);case"hide":return a(),$(this);case"opacity":return void 0===n?$(this).attr("data-opacity"):($(this).each(function(){r($(this).attr("data-opacity",n))}),$(this));case"rgbObject":return c($(this),"rgbaObject"===s);case"rgbString":case"rgbaString":return l($(this),"rgbaString"===s);case"settings":return void 0===n?$(this).data("minicolors-settings"):($(this).each(function(){var i=$(this).data("minicolors-settings")||{};t($(this)),$(this).minicolors($.extend(!0,i,n))}),$(this));case"show":return o($(this).eq(0)),$(this);case"value":return void 0===n?$(this).val():($(this).each(function(){"object"==typeof n?(n.opacity&&$(this).attr("data-opacity",g(n.opacity,0,1)),n.color&&$(this).val(n.color)):$(this).val(n),r($(this))}),$(this));default:return"create"!==s&&(n=s),$(this).each(function(){i($(this),n)}),$(this)}}}),$(document).on("mousedown.minicolors touchstart.minicolors",function(i){$(i.target).parents().add(i.target).hasClass("minicolors")||a()}).on("mousedown.minicolors touchstart.minicolors",".minicolors-grid, .minicolors-slider, .minicolors-opacity-slider",function(i){var t=$(this);i.preventDefault(),$(document).data("minicolors-target",t),s(t,i,!0)}).on("mousemove.minicolors touchmove.minicolors",function(i){var t=$(document).data("minicolors-target");t&&s(t,i)}).on("mouseup.minicolors touchend.minicolors",function(){$(this).removeData("minicolors-target")}).on("mousedown.minicolors touchstart.minicolors",".minicolors-swatch",function(i){var t=$(this).parent().find(".minicolors-input");i.preventDefault(),o(t)}).on("focus.minicolors",".minicolors-input",function(){var i=$(this);i.data("minicolors-initialized")&&o(i)}).on("blur.minicolors",".minicolors-input",function(){var i=$(this),t=i.data("minicolors-settings"),o,a,s,n,r;i.data("minicolors-initialized")&&(o=t.keywords?$.map(t.keywords.split(","),function(i){return $.trim(i.toLowerCase())}):[],""!==i.val()&&$.inArray(i.val().toLowerCase(),o)>-1?r=i.val():(m(i.val())?s=u(i.val(),!0):(a=d(i.val(),!0),s=a?k(a):null),r=null===s?t.defaultValue:"rgb"===t.format?u(t.opacity?"rgba("+s.r+","+s.g+","+s.b+","+i.attr("data-opacity")+")":"rgb("+s.r+","+s.g+","+s.b+")"):y(s)),n=t.opacity?i.attr("data-opacity"):1,"transparent"===r.toLowerCase()&&(n=0),i.closest(".minicolors").find(".minicolors-swatch > span").css("opacity",n),i.val(r),""===i.val()&&i.val(p(t.defaultValue,!0)),i.val(h(i.val(),t.letterCase)))}).on("keydown.minicolors",".minicolors-input",function(i){var t=$(this);if(t.data("minicolors-initialized"))switch(i.keyCode){case 9:a();break;case 13:case 27:a(),t.blur()}}).on("keyup.minicolors",".minicolors-input",function(){var i=$(this);i.data("minicolors-initialized")&&r(i,!0)}).on("paste.minicolors",".minicolors-input",function(){var i=$(this);i.data("minicolors-initialized")&&setTimeout(function(){r(i,!0)},1)})}); \ No newline at end of file diff --git a/public/plugins/jquery.minicolors-2.2.3/jquery.minicolors.png b/public/plugins/jquery.minicolors-2.2.3/jquery.minicolors.png deleted file mode 100644 index bccc2012af78a0358e893f004e0207cac8f9e642..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68627 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 PDFJS.VERBOSITY_LEVELS.infos) { - console.log('Info: ' + msg); - } -} - -// Non-fatal warnings. -function warn(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) { - console.log('Warning: ' + msg); - } -} - -// Deprecated API function -- treated as warnings. -function deprecated(details) { - warn('Deprecated API usage: ' + details); -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) { - console.log('Error: ' + msg); - console.log(backtrace()); - } - throw new Error(msg); -} - -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} - -function assert(cond, msg) { - if (!cond) { - error(msg); - } -} - -var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = { - unknown: 'unknown', - forms: 'forms', - javaScript: 'javaScript', - smask: 'smask', - shadingPattern: 'shadingPattern', - font: 'font' -}; - -// Combines two URLs. The baseUrl shall be absolute URL. If the url is an -// absolute URL, it will be returned as is. -function combineUrl(baseUrl, url) { - if (!url) { - return baseUrl; - } - return new URL(url, baseUrl).href; -} - -// Validates if URL is safe and allowed, e.g. to avoid XSS. -function isValidUrl(url, allowRelative) { - if (!url) { - return false; - } - // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) - // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); - if (!protocol) { - return allowRelative; - } - protocol = protocol[0].toLowerCase(); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - case 'tel': - return true; - default: - return false; - } -} -PDFJS.isValidUrl = isValidUrl; - -/** - * Adds various attributes (href, title, target, rel) to hyperlinks. - * @param {HTMLLinkElement} link - The link element. - * @param {Object} params - An object with the properties: - * @param {string} params.url - An absolute URL. - */ -function addLinkAttributes(link, params) { - var url = params && params.url; - link.href = link.title = (url ? removeNullCharacters(url) : ''); - - if (url) { - if (isExternalLinkTargetSet()) { - link.target = LinkTargetStringMap[PDFJS.externalLinkTarget]; - } - // Strip referrer from the URL. - link.rel = PDFJS.externalLinkRel; - } -} -PDFJS.addLinkAttributes = addLinkAttributes; - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} -PDFJS.shadow = shadow; - -var LinkTarget = PDFJS.LinkTarget = { - NONE: 0, // Default value. - SELF: 1, - BLANK: 2, - PARENT: 3, - TOP: 4, -}; -var LinkTargetStringMap = [ - '', - '_self', - '_blank', - '_parent', - '_top' -]; - -function isExternalLinkTargetSet() { - if (PDFJS.openExternalLinksInNewWindow) { - deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + - '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); - if (PDFJS.externalLinkTarget === LinkTarget.NONE) { - PDFJS.externalLinkTarget = LinkTarget.BLANK; - } - // Reset the deprecated parameter, to suppress further warnings. - PDFJS.openExternalLinksInNewWindow = false; - } - switch (PDFJS.externalLinkTarget) { - case LinkTarget.NONE: - return false; - case LinkTarget.SELF: - case LinkTarget.BLANK: - case LinkTarget.PARENT: - case LinkTarget.TOP: - return true; - } - warn('PDFJS.externalLinkTarget is invalid: ' + PDFJS.externalLinkTarget); - // Reset the external link target, to suppress further warnings. - PDFJS.externalLinkTarget = LinkTarget.NONE; - return false; -} -PDFJS.isExternalLinkTargetSet = isExternalLinkTargetSet; - -var PasswordResponses = PDFJS.PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; - -var PasswordException = (function PasswordExceptionClosure() { - function PasswordException(msg, code) { - this.name = 'PasswordException'; - this.message = msg; - this.code = code; - } - - PasswordException.prototype = new Error(); - PasswordException.constructor = PasswordException; - - return PasswordException; -})(); -PDFJS.PasswordException = PasswordException; - -var UnknownErrorException = (function UnknownErrorExceptionClosure() { - function UnknownErrorException(msg, details) { - this.name = 'UnknownErrorException'; - this.message = msg; - this.details = details; - } - - UnknownErrorException.prototype = new Error(); - UnknownErrorException.constructor = UnknownErrorException; - - return UnknownErrorException; -})(); -PDFJS.UnknownErrorException = UnknownErrorException; - -var InvalidPDFException = (function InvalidPDFExceptionClosure() { - function InvalidPDFException(msg) { - this.name = 'InvalidPDFException'; - this.message = msg; - } - - InvalidPDFException.prototype = new Error(); - InvalidPDFException.constructor = InvalidPDFException; - - return InvalidPDFException; -})(); -PDFJS.InvalidPDFException = InvalidPDFException; - -var MissingPDFException = (function MissingPDFExceptionClosure() { - function MissingPDFException(msg) { - this.name = 'MissingPDFException'; - this.message = msg; - } - - MissingPDFException.prototype = new Error(); - MissingPDFException.constructor = MissingPDFException; - - return MissingPDFException; -})(); -PDFJS.MissingPDFException = MissingPDFException; - -var UnexpectedResponseException = - (function UnexpectedResponseExceptionClosure() { - function UnexpectedResponseException(msg, status) { - this.name = 'UnexpectedResponseException'; - this.message = msg; - this.status = status; - } - - UnexpectedResponseException.prototype = new Error(); - UnexpectedResponseException.constructor = UnexpectedResponseException; - - return UnexpectedResponseException; -})(); -PDFJS.UnexpectedResponseException = UnexpectedResponseException; - -var NotImplementedException = (function NotImplementedExceptionClosure() { - function NotImplementedException(msg) { - this.message = msg; - } - - NotImplementedException.prototype = new Error(); - NotImplementedException.prototype.name = 'NotImplementedException'; - NotImplementedException.constructor = NotImplementedException; - - return NotImplementedException; -})(); - -var MissingDataException = (function MissingDataExceptionClosure() { - function MissingDataException(begin, end) { - this.begin = begin; - this.end = end; - this.message = 'Missing data [' + begin + ', ' + end + ')'; - } - - MissingDataException.prototype = new Error(); - MissingDataException.prototype.name = 'MissingDataException'; - MissingDataException.constructor = MissingDataException; - - return MissingDataException; -})(); - -var XRefParseException = (function XRefParseExceptionClosure() { - function XRefParseException(msg) { - this.message = msg; - } - - XRefParseException.prototype = new Error(); - XRefParseException.prototype.name = 'XRefParseException'; - XRefParseException.constructor = XRefParseException; - - return XRefParseException; -})(); - -var NullCharactersRegExp = /\x00/g; - -function removeNullCharacters(str) { - if (typeof str !== 'string') { - warn('The argument for removeNullCharacters must be a string.'); - return str; - } - return str.replace(NullCharactersRegExp, ''); -} -PDFJS.removeNullCharacters = removeNullCharacters; - -function bytesToString(bytes) { - assert(bytes !== null && typeof bytes === 'object' && - bytes.length !== undefined, 'Invalid argument for bytesToString'); - var length = bytes.length; - var MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - var strBuf = []; - for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - var chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(''); -} - -function stringToBytes(str) { - assert(typeof str === 'string', 'Invalid argument for stringToBytes'); - var length = str.length; - var bytes = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xFF; - } - return bytes; -} - -function string32(value) { - return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, - (value >> 8) & 0xff, value & 0xff); -} - -function log2(x) { - var n = 1, i = 0; - while (x > n) { - n <<= 1; - i++; - } - return i; -} - -function readInt8(data, start) { - return (data[start] << 24) >> 24; -} - -function readUint16(data, offset) { - return (data[offset] << 8) | data[offset + 1]; -} - -function readUint32(data, offset) { - return ((data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]) >>> 0; -} - -// Lazy test the endianness of the platform -// NOTE: This will be 'true' for simulated TypedArrays -function isLittleEndian() { - var buffer8 = new Uint8Array(2); - buffer8[0] = 1; - var buffer16 = new Uint16Array(buffer8.buffer); - return (buffer16[0] === 1); -} - -Object.defineProperty(PDFJS, 'isLittleEndian', { - configurable: true, - get: function PDFJS_isLittleEndian() { - return shadow(PDFJS, 'isLittleEndian', isLittleEndian()); - } -}); - - // Lazy test if the userAgent support CanvasTypedArrays -function hasCanvasTypedArrays() { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - var imageData = ctx.createImageData(1, 1); - return (typeof imageData.data.buffer !== 'undefined'); -} - -Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { - configurable: true, - get: function PDFJS_hasCanvasTypedArrays() { - return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays()); - } -}); - -var Uint32ArrayView = (function Uint32ArrayViewClosure() { - - function Uint32ArrayView(buffer, length) { - this.buffer = buffer; - this.byteLength = buffer.length; - this.length = length === undefined ? (this.byteLength >> 2) : length; - ensureUint32ArrayViewProps(this.length); - } - Uint32ArrayView.prototype = Object.create(null); - - var uint32ArrayViewSetters = 0; - function createUint32ArrayProp(index) { - return { - get: function () { - var buffer = this.buffer, offset = index << 2; - return (buffer[offset] | (buffer[offset + 1] << 8) | - (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; - }, - set: function (value) { - var buffer = this.buffer, offset = index << 2; - buffer[offset] = value & 255; - buffer[offset + 1] = (value >> 8) & 255; - buffer[offset + 2] = (value >> 16) & 255; - buffer[offset + 3] = (value >>> 24) & 255; - } - }; - } - - function ensureUint32ArrayViewProps(length) { - while (uint32ArrayViewSetters < length) { - Object.defineProperty(Uint32ArrayView.prototype, - uint32ArrayViewSetters, - createUint32ArrayProp(uint32ArrayViewSetters)); - uint32ArrayViewSetters++; - } - } - - return Uint32ArrayView; -})(); - -exports.Uint32ArrayView = Uint32ArrayView; - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = PDFJS.Util = (function UtilClosure() { - function Util() {} - - var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; - - // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids - // creating many intermediate strings. - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - rgbBuf[1] = r; - rgbBuf[3] = g; - rgbBuf[5] = b; - return rgbBuf.join(''); - }; - - // Concatenates two transformation matrices together and returns the result. - Util.transform = function Util_transform(m1, m2) { - return [ - m1[0] * m2[0] + m1[2] * m2[1], - m1[1] * m2[0] + m1[3] * m2[1], - m1[0] * m2[2] + m1[2] * m2[3], - m1[1] * m2[2] + m1[3] * m2[3], - m1[0] * m2[4] + m1[2] * m2[5] + m1[4], - m1[1] * m2[4] + m1[3] * m2[5] + m1[5] - ]; - }; - - // For 2d affine transforms - Util.applyTransform = function Util_applyTransform(p, m) { - var xt = p[0] * m[0] + p[1] * m[2] + m[4]; - var yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - }; - - Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { - var d = m[0] * m[3] - m[1] * m[2]; - var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - }; - - // Applies the transform to the rectangle and finds the minimum axially - // aligned bounding box. - Util.getAxialAlignedBoundingBox = - function Util_getAxialAlignedBoundingBox(r, m) { - - var p1 = Util.applyTransform(r, m); - var p2 = Util.applyTransform(r.slice(2, 4), m); - var p3 = Util.applyTransform([r[0], r[3]], m); - var p4 = Util.applyTransform([r[2], r[1]], m); - return [ - Math.min(p1[0], p2[0], p3[0], p4[0]), - Math.min(p1[1], p2[1], p3[1], p4[1]), - Math.max(p1[0], p2[0], p3[0], p4[0]), - Math.max(p1[1], p2[1], p3[1], p4[1]) - ]; - }; - - Util.inverseTransform = function Util_inverseTransform(m) { - var d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, - (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - }; - - // Apply a generic 3d matrix M on a 3-vector v: - // | a b c | | X | - // | d e f | x | Y | - // | g h i | | Z | - // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], - // with v as [X,Y,Z] - Util.apply3dTransform = function Util_apply3dTransform(m, v) { - return [ - m[0] * v[0] + m[1] * v[1] + m[2] * v[2], - m[3] * v[0] + m[4] * v[1] + m[5] * v[2], - m[6] * v[0] + m[7] * v[1] + m[8] * v[2] - ]; - }; - - // This calculation uses Singular Value Decomposition. - // The SVD can be represented with formula A = USV. We are interested in the - // matrix S here because it represents the scale values. - Util.singularValueDecompose2dScale = - function Util_singularValueDecompose2dScale(m) { - - var transpose = [m[0], m[2], m[1], m[3]]; - - // Multiply matrix m with its transpose. - var a = m[0] * transpose[0] + m[1] * transpose[2]; - var b = m[0] * transpose[1] + m[1] * transpose[3]; - var c = m[2] * transpose[0] + m[3] * transpose[2]; - var d = m[2] * transpose[1] + m[3] * transpose[3]; - - // Solve the second degree polynomial to get roots. - var first = (a + d) / 2; - var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; - var sx = first + second || 1; - var sy = first - second || 1; - - // Scale values are the square roots of the eigenvalues. - return [Math.sqrt(sx), Math.sqrt(sy)]; - }; - - // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) - // For coordinate systems whose origin lies in the bottom-left, this - // means normalization to (BL,TR) ordering. For systems with origin in the - // top-left, this means (TL,BR) ordering. - Util.normalizeRect = function Util_normalizeRect(rect) { - var r = rect.slice(0); // clone rect - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - }; - - // Returns a rectangle [x1, y1, x2, y2] corresponding to the - // intersection of rect1 and rect2. If no intersection, returns 'false' - // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] - Util.intersect = function Util_intersect(rect1, rect2) { - function compare(a, b) { - return a - b; - } - - // Order points along the axes - var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), - orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), - result = []; - - rect1 = Util.normalizeRect(rect1); - rect2 = Util.normalizeRect(rect2); - - // X: first and second points belong to different rectangles? - if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || - (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { - // Intersection must be between second and third points - result[0] = orderedX[1]; - result[2] = orderedX[2]; - } else { - return false; - } - - // Y: first and second points belong to different rectangles? - if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || - (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { - // Intersection must be between second and third points - result[1] = orderedY[1]; - result[3] = orderedY[2]; - } else { - return false; - } - - return result; - }; - - Util.sign = function Util_sign(num) { - return num < 0 ? -1 : 1; - }; - - var ROMAN_NUMBER_MAP = [ - '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', - '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', - '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' - ]; - /** - * Converts positive integers to (upper case) Roman numerals. - * @param {integer} number - The number that should be converted. - * @param {boolean} lowerCase - Indicates if the result should be converted - * to lower case letters. The default is false. - * @return {string} The resulting Roman number. - */ - Util.toRoman = function Util_toRoman(number, lowerCase) { - assert(isInt(number) && number > 0, - 'The number should be a positive integer.'); - var pos, romanBuf = []; - // Thousands - while (number >= 1000) { - number -= 1000; - romanBuf.push('M'); - } - // Hundreds - pos = (number / 100) | 0; - number %= 100; - romanBuf.push(ROMAN_NUMBER_MAP[pos]); - // Tens - pos = (number / 10) | 0; - number %= 10; - romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); - // Ones - romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); - - var romanStr = romanBuf.join(''); - return (lowerCase ? romanStr.toLowerCase() : romanStr); - }; - - Util.appendToArray = function Util_appendToArray(arr1, arr2) { - Array.prototype.push.apply(arr1, arr2); - }; - - Util.prependToArray = function Util_prependToArray(arr1, arr2) { - Array.prototype.unshift.apply(arr1, arr2); - }; - - Util.extendObj = function extendObj(obj1, obj2) { - for (var key in obj2) { - obj1[key] = obj2[key]; - } - }; - - Util.getInheritableProperty = function Util_getInheritableProperty(dict, - name) { - while (dict && !dict.has(name)) { - dict = dict.get('Parent'); - } - if (!dict) { - return null; - } - return dict.get(name); - }; - - Util.inherit = function Util_inherit(sub, base, prototype) { - sub.prototype = Object.create(base.prototype); - sub.prototype.constructor = sub; - for (var prop in prototype) { - sub.prototype[prop] = prototype[prop]; - } - }; - - Util.loadScript = function Util_loadScript(src, callback) { - var script = document.createElement('script'); - var loaded = false; - script.setAttribute('src', src); - if (callback) { - script.onload = function() { - if (!loaded) { - callback(); - } - loaded = true; - }; - } - document.getElementsByTagName('head')[0].appendChild(script); - }; - - return Util; -})(); - -/** - * PDF page viewport created based on scale, rotation and offset. - * @class - * @alias PDFJS.PageViewport - */ -var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() { - /** - * @constructor - * @private - * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. - * @param scale {number} scale of the viewport. - * @param rotation {number} rotations of the viewport in degrees. - * @param offsetX {number} offset X - * @param offsetY {number} offset Y - * @param dontFlip {boolean} if true, axis Y will not be flipped. - */ - function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - - // creating transform to convert pdf coordinate system to the normal - // canvas like coordinates taking in account scale and rotation - var centerX = (viewBox[2] + viewBox[0]) / 2; - var centerY = (viewBox[3] + viewBox[1]) / 2; - var rotateA, rotateB, rotateC, rotateD; - rotation = rotation % 360; - rotation = rotation < 0 ? rotation + 360 : rotation; - switch (rotation) { - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - //case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - - if (dontFlip) { - rotateC = -rotateC; rotateD = -rotateD; - } - - var offsetCanvasX, offsetCanvasY; - var width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = Math.abs(viewBox[3] - viewBox[1]) * scale; - height = Math.abs(viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = Math.abs(viewBox[2] - viewBox[0]) * scale; - height = Math.abs(viewBox[3] - viewBox[1]) * scale; - } - // creating transform for the following operations: - // translate(-centerX, -centerY), rotate and flip vertically, - // scale, and translate(offsetCanvasX, offsetCanvasY) - this.transform = [ - rotateA * scale, - rotateB * scale, - rotateC * scale, - rotateD * scale, - offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, - offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY - ]; - - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ { - /** - * Clones viewport with additional properties. - * @param args {Object} (optional) If specified, may contain the 'scale' or - * 'rotation' properties to override the corresponding properties in - * the cloned viewport. - * @returns {PDFJS.PageViewport} Cloned viewport. - */ - clone: function PageViewPort_clone(args) { - args = args || {}; - var scale = 'scale' in args ? args.scale : this.scale; - var rotation = 'rotation' in args ? args.rotation : this.rotation; - return new PageViewport(this.viewBox.slice(), scale, rotation, - this.offsetX, this.offsetY, args.dontFlip); - }, - /** - * Converts PDF point to the viewport coordinates. For examples, useful for - * converting PDF location into canvas pixel coordinates. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the viewport coordinate space. - * @see {@link convertToPdfPoint} - * @see {@link convertToViewportRectangle} - */ - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - /** - * Converts PDF rectangle to the viewport coordinates. - * @param rect {Array} xMin, yMin, xMax and yMax coordinates. - * @returns {Array} Contains corresponding coordinates of the rectangle - * in the viewport coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToViewportRectangle: - function PageViewport_convertToViewportRectangle(rect) { - var tl = Util.applyTransform([rect[0], rect[1]], this.transform); - var br = Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; - }, - /** - * Converts viewport coordinates to the PDF location. For examples, useful - * for converting canvas pixel location into PDF one. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the PDF coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { - return Util.applyInverseTransform([x, y], this.transform); - } - }; - return PageViewport; -})(); - -var PDFStringTranslateTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, - 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, - 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, - 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC -]; - -function stringToPDFString(str) { - var i, n = str.length, strBuf = []; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) { - strBuf.push(String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); - } - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - } - return strBuf.join(''); -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} - -function isEmptyObj(obj) { - for (var key in obj) { - return false; - } - return true; -} - -function isBool(v) { - return typeof v === 'boolean'; -} - -function isInt(v) { - return typeof v === 'number' && ((v | 0) === v); -} - -function isNum(v) { - return typeof v === 'number'; -} - -function isString(v) { - return typeof v === 'string'; -} - -function isArray(v) { - return v instanceof Array; -} - -function isArrayBuffer(v) { - return typeof v === 'object' && v !== null && v.byteLength !== undefined; -} - -/** - * Promise Capability object. - * - * @typedef {Object} PromiseCapability - * @property {Promise} promise - A promise object. - * @property {function} resolve - Fullfills the promise. - * @property {function} reject - Rejects the promise. - */ - -/** - * Creates a promise capability object. - * @alias PDFJS.createPromiseCapability - * - * @return {PromiseCapability} A capability object contains: - * - a Promise, resolve and reject methods. - */ -function createPromiseCapability() { - var capability = {}; - capability.promise = new Promise(function (resolve, reject) { - capability.resolve = resolve; - capability.reject = reject; - }); - return capability; -} - -PDFJS.createPromiseCapability = createPromiseCapability; - -/** - * Polyfill for Promises: - * The following promise implementation tries to generally implement the - * Promise/A+ spec. Some notable differences from other promise libaries are: - * - There currently isn't a seperate deferred and promise object. - * - Unhandled rejections eventually show an error if they aren't handled. - * - * Based off of the work in: - * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 - */ -(function PromiseClosure() { - if (globalScope.Promise) { - // Promises existing in the DOM/Worker, checking presence of all/resolve - if (typeof globalScope.Promise.all !== 'function') { - globalScope.Promise.all = function (iterable) { - var count = 0, results = [], resolve, reject; - var promise = new globalScope.Promise(function (resolve_, reject_) { - resolve = resolve_; - reject = reject_; - }); - iterable.forEach(function (p, i) { - count++; - p.then(function (result) { - results[i] = result; - count--; - if (count === 0) { - resolve(results); - } - }, reject); - }); - if (count === 0) { - resolve(results); - } - return promise; - }; - } - if (typeof globalScope.Promise.resolve !== 'function') { - globalScope.Promise.resolve = function (value) { - return new globalScope.Promise(function (resolve) { resolve(value); }); - }; - } - if (typeof globalScope.Promise.reject !== 'function') { - globalScope.Promise.reject = function (reason) { - return new globalScope.Promise(function (resolve, reject) { - reject(reason); - }); - }; - } - if (typeof globalScope.Promise.prototype.catch !== 'function') { - globalScope.Promise.prototype.catch = function (onReject) { - return globalScope.Promise.prototype.then(undefined, onReject); - }; - } - return; - } - var STATUS_PENDING = 0; - var STATUS_RESOLVED = 1; - var STATUS_REJECTED = 2; - - // In an attempt to avoid silent exceptions, unhandled rejections are - // tracked and if they aren't handled in a certain amount of time an - // error is logged. - var REJECTION_TIMEOUT = 500; - - var HandlerManager = { - handlers: [], - running: false, - unhandledRejections: [], - pendingRejectionCheck: false, - - scheduleHandlers: function scheduleHandlers(promise) { - if (promise._status === STATUS_PENDING) { - return; - } - - this.handlers = this.handlers.concat(promise._handlers); - promise._handlers = []; - - if (this.running) { - return; - } - this.running = true; - - setTimeout(this.runHandlers.bind(this), 0); - }, - - runHandlers: function runHandlers() { - var RUN_TIMEOUT = 1; // ms - var timeoutAt = Date.now() + RUN_TIMEOUT; - while (this.handlers.length > 0) { - var handler = this.handlers.shift(); - - var nextStatus = handler.thisPromise._status; - var nextValue = handler.thisPromise._value; - - try { - if (nextStatus === STATUS_RESOLVED) { - if (typeof handler.onResolve === 'function') { - nextValue = handler.onResolve(nextValue); - } - } else if (typeof handler.onReject === 'function') { - nextValue = handler.onReject(nextValue); - nextStatus = STATUS_RESOLVED; - - if (handler.thisPromise._unhandledRejection) { - this.removeUnhandeledRejection(handler.thisPromise); - } - } - } catch (ex) { - nextStatus = STATUS_REJECTED; - nextValue = ex; - } - - handler.nextPromise._updateStatus(nextStatus, nextValue); - if (Date.now() >= timeoutAt) { - break; - } - } - - if (this.handlers.length > 0) { - setTimeout(this.runHandlers.bind(this), 0); - return; - } - - this.running = false; - }, - - addUnhandledRejection: function addUnhandledRejection(promise) { - this.unhandledRejections.push({ - promise: promise, - time: Date.now() - }); - this.scheduleRejectionCheck(); - }, - - removeUnhandeledRejection: function removeUnhandeledRejection(promise) { - promise._unhandledRejection = false; - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (this.unhandledRejections[i].promise === promise) { - this.unhandledRejections.splice(i); - i--; - } - } - }, - - scheduleRejectionCheck: function scheduleRejectionCheck() { - if (this.pendingRejectionCheck) { - return; - } - this.pendingRejectionCheck = true; - setTimeout(function rejectionCheck() { - this.pendingRejectionCheck = false; - var now = Date.now(); - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { - var unhandled = this.unhandledRejections[i].promise._value; - var msg = 'Unhandled rejection: ' + unhandled; - if (unhandled.stack) { - msg += '\n' + unhandled.stack; - } - warn(msg); - this.unhandledRejections.splice(i); - i--; - } - } - if (this.unhandledRejections.length) { - this.scheduleRejectionCheck(); - } - }.bind(this), REJECTION_TIMEOUT); - } - }; - - function Promise(resolver) { - this._status = STATUS_PENDING; - this._handlers = []; - try { - resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); - } catch (e) { - this._reject(e); - } - } - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {array} array of data and/or promises to wait for. - * @return {Promise} New dependant promise. - */ - Promise.all = function Promise_all(promises) { - var resolveAll, rejectAll; - var deferred = new Promise(function (resolve, reject) { - resolveAll = resolve; - rejectAll = reject; - }); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - resolveAll(results); - return deferred; - } - function reject(reason) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results = []; - rejectAll(reason); - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - var resolve = (function(i) { - return function(value) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results[i] = value; - unresolved--; - if (unresolved === 0) { - resolveAll(results); - } - }; - })(i); - if (Promise.isPromise(promise)) { - promise.then(resolve, reject); - } else { - resolve(promise); - } - } - return deferred; - }; - - /** - * Checks if the value is likely a promise (has a 'then' function). - * @return {boolean} true if value is thenable - */ - Promise.isPromise = function Promise_isPromise(value) { - return value && typeof value.then === 'function'; - }; - - /** - * Creates resolved promise - * @param value resolve value - * @returns {Promise} - */ - Promise.resolve = function Promise_resolve(value) { - return new Promise(function (resolve) { resolve(value); }); - }; - - /** - * Creates rejected promise - * @param reason rejection value - * @returns {Promise} - */ - Promise.reject = function Promise_reject(reason) { - return new Promise(function (resolve, reject) { reject(reason); }); - }; - - Promise.prototype = { - _status: null, - _value: null, - _handlers: null, - _unhandledRejection: null, - - _updateStatus: function Promise__updateStatus(status, value) { - if (this._status === STATUS_RESOLVED || - this._status === STATUS_REJECTED) { - return; - } - - if (status === STATUS_RESOLVED && - Promise.isPromise(value)) { - value.then(this._updateStatus.bind(this, STATUS_RESOLVED), - this._updateStatus.bind(this, STATUS_REJECTED)); - return; - } - - this._status = status; - this._value = value; - - if (status === STATUS_REJECTED && this._handlers.length === 0) { - this._unhandledRejection = true; - HandlerManager.addUnhandledRejection(this); - } - - HandlerManager.scheduleHandlers(this); - }, - - _resolve: function Promise_resolve(value) { - this._updateStatus(STATUS_RESOLVED, value); - }, - - _reject: function Promise_reject(reason) { - this._updateStatus(STATUS_REJECTED, reason); - }, - - then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(function (resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }); - this._handlers.push({ - thisPromise: this, - onResolve: onResolve, - onReject: onReject, - nextPromise: nextPromise - }); - HandlerManager.scheduleHandlers(this); - return nextPromise; - }, - - catch: function Promise_catch(onReject) { - return this.then(undefined, onReject); - } - }; - - globalScope.Promise = Promise; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) { - str += pad; - } - return str; - } - function StatTimer() { - this.started = {}; - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) { - return; - } - if (name in this.started) { - warn('Timer is already running for ' + name); - } - this.started[name] = Date.now(); - }, - timeEnd: function StatTimer_timeEnd(name) { - if (!this.enabled) { - return; - } - if (!(name in this.started)) { - warn('Timer has not been started for ' + name); - } - this.times.push({ - 'name': name, - 'start': this.started[name], - 'end': Date.now() - }); - // Remove timer from started so it can be called again. - delete this.started[name]; - }, - toString: function StatTimer_toString() { - var i, ii; - var times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) { - longest = name.length; - } - } - for (i = 0, ii = times.length; i < ii; ++i) { - var span = times[i]; - var duration = span.end - span.start; - out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; - } - return out; - } - }; - return StatTimer; -})(); - -PDFJS.createBlob = function createBlob(data, contentType) { - if (typeof Blob !== 'undefined') { - return new Blob([data], { type: contentType }); - } - // Blob builder is deprecated in FF14 and removed in FF18. - var bb = new MozBlobBuilder(); - bb.append(data); - return bb.getBlob(contentType); -}; - -PDFJS.createObjectURL = (function createObjectURLClosure() { - // Blob/createObjectURL is not available, falling back to data schema. - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - return function createObjectURL(data, contentType) { - if (!PDFJS.disableCreateObjectURL && - typeof URL !== 'undefined' && URL.createObjectURL) { - var blob = PDFJS.createBlob(data, contentType); - return URL.createObjectURL(blob); - } - - var buffer = 'data:' + contentType + ';base64,'; - for (var i = 0, ii = data.length; i < ii; i += 3) { - var b1 = data[i] & 0xFF; - var b2 = data[i + 1] & 0xFF; - var b3 = data[i + 2] & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; - buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; - } - return buffer; - }; -})(); - -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackIndex = 1; - this.postMessageTransfers = true; - var callbacksCapabilities = this.callbacksCapabilities = {}; - var ah = this.actionHandler = {}; - - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { - var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.isReply) { - var callbackId = data.callbackId; - if (data.callbackId in callbacksCapabilities) { - var callback = callbacksCapabilities[callbackId]; - delete callbacksCapabilities[callbackId]; - if ('error' in data) { - callback.reject(data.error); - } else { - callback.resolve(data.data); - } - } else { - error('Cannot resolve callback ' + callbackId); - } - } else if (data.action in ah) { - var action = ah[data.action]; - if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; - Promise.resolve().then(function () { - return action[0].call(action[1], data.data); - }).then(function (result) { - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - if (reason instanceof Error) { - // Serialize error to avoid "DataCloneError" - reason = reason + ''; - } - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - error: reason - }); - }); - } else { - action[0].call(action[1], data.data); - } - } else { - error('Unknown action from worker: ' + data.action); - } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); -} - -MessageHandler.prototype = { - on: function messageHandlerOn(actionName, handler, scope) { - var ah = this.actionHandler; - if (ah[actionName]) { - error('There is already an actionName called "' + actionName + '"'); - } - ah[actionName] = [handler, scope]; - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers - */ - send: function messageHandlerSend(actionName, data, transfers) { - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data - }; - this.postMessage(message, transfers); - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * Expects that other side will callback with the response. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. - * @returns {Promise} Promise to be resolved with response data. - */ - sendWithPromise: - function messageHandlerSendWithPromise(actionName, data, transfers) { - var callbackId = this.callbackIndex++; - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data, - callbackId: callbackId - }; - var capability = createPromiseCapability(); - this.callbacksCapabilities[callbackId] = capability; - try { - this.postMessage(message, transfers); - } catch (e) { - capability.reject(e); - } - return capability.promise; - }, - /** - * Sends raw message to the comObj. - * @private - * @param message {Object} Raw message. - * @param transfers List of transfers/ArrayBuffers, or undefined. - */ - postMessage: function (message, transfers) { - if (transfers && this.postMessageTransfers) { - this.comObj.postMessage(message, transfers); - } else { - this.comObj.postMessage(message); - } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); - } -}; - -function loadJpegStream(id, imageUrl, objs) { - var img = new Image(); - img.onload = (function loadJpegStream_onloadClosure() { - objs.resolve(id, img); - }); - img.onerror = (function loadJpegStream_onerrorClosure() { - objs.resolve(id, null); - warn('Error during JPEG image loading'); - }); - img.src = imageUrl; -} - - // Polyfill from https://github.com/Polymer/URL -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ -(function checkURLConstructor(scope) { - /* jshint ignore:start */ - - // feature detect for URL constructor - var hasWorkingUrl = false; - try { - if (typeof URL === 'function' && - typeof URL.prototype === 'object' && - ('origin' in URL.prototype)) { - var u = new URL('b', 'http://a'); - u.pathname = 'c%20d'; - hasWorkingUrl = u.href === 'http://a/c%20d'; - } - } catch(e) { } - - if (hasWorkingUrl) - return; - - var relative = Object.create(null); - relative['ftp'] = 21; - relative['file'] = 0; - relative['gopher'] = 70; - relative['http'] = 80; - relative['https'] = 443; - relative['ws'] = 80; - relative['wss'] = 443; - - var relativePathDotMapping = Object.create(null); - relativePathDotMapping['%2e'] = '.'; - relativePathDotMapping['.%2e'] = '..'; - relativePathDotMapping['%2e.'] = '..'; - relativePathDotMapping['%2e%2e'] = '..'; - - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - - function invalid() { - clear.call(this); - this._isInvalid = true; - } - - function IDNAToASCII(h) { - if ('' == h) { - invalid.call(this) - } - // XXX - return h.toLowerCase() - } - - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ? ` - [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - function percentEscapeQuery(c) { - // XXX This actually needs to encode c using encoding and then - // convert the bytes one-by-one. - - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ` (do not escape '?') - [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - var EOF = undefined, - ALPHA = /[a-zA-Z]/, - ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message) - } - - var state = stateOverride || 'scheme start', - cursor = 0, - buffer = '', - seenAt = false, - seenBracket = false, - errors = []; - - loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case 'scheme start': - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - state = 'scheme'; - } else if (!stateOverride) { - buffer = ''; - state = 'no scheme'; - continue; - } else { - err('Invalid scheme.'); - break loop; - } - break; - - case 'scheme': - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - } else if (':' == c) { - this._scheme = buffer; - buffer = ''; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ('file' == this._scheme) { - state = 'relative'; - } else if (this._isRelative && base && base._scheme == this._scheme) { - state = 'relative or authority'; - } else if (this._isRelative) { - state = 'authority first slash'; - } else { - state = 'scheme data'; - } - } else if (!stateOverride) { - buffer = ''; - cursor = 0; - state = 'no scheme'; - continue; - } else if (EOF == c) { - break loop; - } else { - err('Code point not allowed in scheme: ' + c) - break loop; - } - break; - - case 'scheme data': - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else { - // XXX error handling - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._schemeData += percentEscape(c); - } - } - break; - - case 'no scheme': - if (!base || !(isRelativeScheme(base._scheme))) { - err('Missing scheme.'); - invalid.call(this); - } else { - state = 'relative'; - continue; - } - break; - - case 'relative or authority': - if ('/' == c && '/' == input[cursor+1]) { - state = 'authority ignore slashes'; - } else { - err('Expected /, got: ' + c); - state = 'relative'; - continue - } - break; - - case 'relative': - this._isRelative = true; - if ('file' != this._scheme) - this._scheme = base._scheme; - if (EOF == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ('/' == c || '\\' == c) { - if ('\\' == c) - err('\\ is an invalid code point.'); - state = 'relative slash'; - } else if ('?' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = '?'; - this._username = base._username; - this._password = base._password; - state = 'query'; - } else if ('#' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = '#'; - this._username = base._username; - this._password = base._password; - state = 'fragment'; - } else { - var nextC = input[cursor+1] - var nextNextC = input[cursor+2] - if ( - 'file' != this._scheme || !ALPHA.test(c) || - (nextC != ':' && nextC != '|') || - (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = 'relative path'; - continue; - } - break; - - case 'relative slash': - if ('/' == c || '\\' == c) { - if ('\\' == c) { - err('\\ is an invalid code point.'); - } - if ('file' == this._scheme) { - state = 'file host'; - } else { - state = 'authority ignore slashes'; - } - } else { - if ('file' != this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = 'relative path'; - continue; - } - break; - - case 'authority first slash': - if ('/' == c) { - state = 'authority second slash'; - } else { - err("Expected '/', got: " + c); - state = 'authority ignore slashes'; - continue; - } - break; - - case 'authority second slash': - state = 'authority ignore slashes'; - if ('/' != c) { - err("Expected '/', got: " + c); - continue; - } - break; - - case 'authority ignore slashes': - if ('/' != c && '\\' != c) { - state = 'authority'; - continue; - } else { - err('Expected authority, got: ' + c); - } - break; - - case 'authority': - if ('@' == c) { - if (seenAt) { - err('@ already seen.'); - buffer += '%40'; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if ('\t' == cp || '\n' == cp || '\r' == cp) { - err('Invalid whitespace in authority.'); - continue; - } - // XXX check URL code points - if (':' == cp && null === this._password) { - this._password = ''; - continue; - } - var tempC = percentEscape(cp); - (null !== this._password) ? this._password += tempC : this._username += tempC; - } - buffer = ''; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - cursor -= buffer.length; - buffer = ''; - state = 'host'; - continue; - } else { - buffer += c; - } - break; - - case 'file host': - if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { - state = 'relative path'; - } else if (buffer.length == 0) { - state = 'relative path start'; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - } - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid whitespace in file host.'); - } else { - buffer += c; - } - break; - - case 'host': - case 'hostname': - if (':' == c && !seenBracket) { - // XXX host parsing - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'port'; - if ('hostname' == stateOverride) { - break loop; - } - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - if (stateOverride) { - break loop; - } - continue; - } else if ('\t' != c && '\n' != c && '\r' != c) { - if ('[' == c) { - seenBracket = true; - } else if (']' == c) { - seenBracket = false; - } - buffer += c; - } else { - err('Invalid code point in host/hostname: ' + c); - } - break; - - case 'port': - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { - if ('' != buffer) { - var temp = parseInt(buffer, 10); - if (temp != relative[this._scheme]) { - this._port = temp + ''; - } - buffer = ''; - } - if (stateOverride) { - break loop; - } - state = 'relative path start'; - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid code point in port: ' + c); - } else { - invalid.call(this); - } - break; - - case 'relative path start': - if ('\\' == c) - err("'\\' not allowed in path."); - state = 'relative path'; - if ('/' != c && '\\' != c) { - continue; - } - break; - - case 'relative path': - if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) { - if ('\\' == c) { - err('\\ not allowed in relative path.'); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if ('..' == buffer) { - this._path.pop(); - if ('/' != c && '\\' != c) { - this._path.push(''); - } - } else if ('.' == buffer && '/' != c && '\\' != c) { - this._path.push(''); - } else if ('.' != buffer) { - if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { - buffer = buffer[0] + ':'; - } - this._path.push(buffer); - } - buffer = ''; - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } - } else if ('\t' != c && '\n' != c && '\r' != c) { - buffer += percentEscape(c); - } - break; - - case 'query': - if (!stateOverride && '#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._query += percentEscapeQuery(c); - } - break; - - case 'fragment': - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._fragment += c; - } - break; - } - - cursor++; - } - } - - function clear() { - this._scheme = ''; - this._schemeData = ''; - this._username = ''; - this._password = null; - this._host = ''; - this._port = ''; - this._path = []; - this._query = ''; - this._fragment = ''; - this._isInvalid = false; - this._isRelative = false; - } - - // Does not process domain names or IP addresses. - // Does not handle encoding for the query parameter. - function jURL(url, base /* , encoding */) { - if (base !== undefined && !(base instanceof jURL)) - base = new jURL(String(base)); - - this._url = url; - clear.call(this); - - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); - // encoding = encoding || 'utf-8' - - parse.call(this, input, null, base); - } - - jURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) - return this._url; - - var authority = ''; - if ('' != this._username || null != this._password) { - authority = this._username + - (null != this._password ? ':' + this._password : '') + '@'; - } - - return this.protocol + - (this._isRelative ? '//' + authority + this.host : '') + - this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - - get protocol() { - return this._scheme + ':'; - }, - set protocol(protocol) { - if (this._isInvalid) - return; - parse.call(this, protocol + ':', 'scheme start'); - }, - - get host() { - return this._isInvalid ? '' : this._port ? - this._host + ':' + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, host, 'host'); - }, - - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, hostname, 'hostname'); - }, - - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, port, 'port'); - }, - - get pathname() { - return this._isInvalid ? '' : this._isRelative ? - '/' + this._path.join('/') : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) - return; - this._path = []; - parse.call(this, pathname, 'relative path start'); - }, - - get search() { - return this._isInvalid || !this._query || '?' == this._query ? - '' : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) - return; - this._query = '?'; - if ('?' == search[0]) - search = search.slice(1); - parse.call(this, search, 'query'); - }, - - get hash() { - return this._isInvalid || !this._fragment || '#' == this._fragment ? - '' : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) - return; - this._fragment = '#'; - if ('#' == hash[0]) - hash = hash.slice(1); - parse.call(this, hash, 'fragment'); - }, - - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ''; - } - // javascript: Gecko returns String(""), WebKit/Blink String("null") - // Gecko throws error for "data://" - // data: Gecko returns "", Blink returns "data://", WebKit returns "null" - // Gecko returns String("") for file: mailto: - // WebKit/Blink returns String("SCHEME://") for file: mailto: - switch (this._scheme) { - case 'data': - case 'file': - case 'javascript': - case 'mailto': - return 'null'; - } - host = this.host; - if (!host) { - return ''; - } - return this._scheme + '://' + host; - } - }; - - // Copy over the static methods - var OriginalURL = scope.URL; - if (OriginalURL) { - jURL.createObjectURL = function(blob) { - // IE extension allows a second optional options argument. - // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - jURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - - scope.URL = jURL; - /* jshint ignore:end */ -})(globalScope); - -exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; -exports.IDENTITY_MATRIX = IDENTITY_MATRIX; -exports.OPS = OPS; -exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; -exports.AnnotationBorderStyleType = AnnotationBorderStyleType; -exports.AnnotationFlag = AnnotationFlag; -exports.AnnotationType = AnnotationType; -exports.FontType = FontType; -exports.ImageKind = ImageKind; -exports.InvalidPDFException = InvalidPDFException; -exports.LinkTarget = LinkTarget; -exports.LinkTargetStringMap = LinkTargetStringMap; -exports.MessageHandler = MessageHandler; -exports.MissingDataException = MissingDataException; -exports.MissingPDFException = MissingPDFException; -exports.NotImplementedException = NotImplementedException; -exports.PasswordException = PasswordException; -exports.PasswordResponses = PasswordResponses; -exports.StatTimer = StatTimer; -exports.StreamType = StreamType; -exports.TextRenderingMode = TextRenderingMode; -exports.UnexpectedResponseException = UnexpectedResponseException; -exports.UnknownErrorException = UnknownErrorException; -exports.Util = Util; -exports.XRefParseException = XRefParseException; -exports.assert = assert; -exports.bytesToString = bytesToString; -exports.combineUrl = combineUrl; -exports.createPromiseCapability = createPromiseCapability; -exports.deprecated = deprecated; -exports.error = error; -exports.info = info; -exports.isArray = isArray; -exports.isArrayBuffer = isArrayBuffer; -exports.isBool = isBool; -exports.isEmptyObj = isEmptyObj; -exports.isExternalLinkTargetSet = isExternalLinkTargetSet; -exports.isInt = isInt; -exports.isNum = isNum; -exports.isString = isString; -exports.isValidUrl = isValidUrl; -exports.addLinkAttributes = addLinkAttributes; -exports.loadJpegStream = loadJpegStream; -exports.log2 = log2; -exports.readInt8 = readInt8; -exports.readUint16 = readUint16; -exports.readUint32 = readUint32; -exports.removeNullCharacters = removeNullCharacters; -exports.shadow = shadow; -exports.string32 = string32; -exports.stringToBytes = stringToBytes; -exports.stringToPDFString = stringToPDFString; -exports.stringToUTF8String = stringToUTF8String; -exports.utf8StringToString = utf8StringToString; -exports.warn = warn; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayAnnotationLayer = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayDOMUtils); - } -}(this, function (exports, sharedUtil, displayDOMUtils) { - -var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType; -var AnnotationType = sharedUtil.AnnotationType; -var Util = sharedUtil.Util; -var addLinkAttributes = sharedUtil.addLinkAttributes; -var warn = sharedUtil.warn; -var CustomStyle = displayDOMUtils.CustomStyle; - -/** - * @typedef {Object} AnnotationElementParameters - * @property {Object} data - * @property {HTMLDivElement} layer - * @property {PDFPage} page - * @property {PageViewport} viewport - * @property {IPDFLinkService} linkService - */ - -/** - * @class - * @alias AnnotationElementFactory - */ -function AnnotationElementFactory() {} -AnnotationElementFactory.prototype = - /** @lends AnnotationElementFactory.prototype */ { - /** - * @param {AnnotationElementParameters} parameters - * @returns {AnnotationElement} - */ - create: function AnnotationElementFactory_create(parameters) { - var subtype = parameters.data.annotationType; - - switch (subtype) { - case AnnotationType.LINK: - return new LinkAnnotationElement(parameters); - - case AnnotationType.TEXT: - return new TextAnnotationElement(parameters); - - case AnnotationType.WIDGET: - return new WidgetAnnotationElement(parameters); - - case AnnotationType.POPUP: - return new PopupAnnotationElement(parameters); - - case AnnotationType.HIGHLIGHT: - return new HighlightAnnotationElement(parameters); - - case AnnotationType.UNDERLINE: - return new UnderlineAnnotationElement(parameters); - - case AnnotationType.SQUIGGLY: - return new SquigglyAnnotationElement(parameters); - - case AnnotationType.STRIKEOUT: - return new StrikeOutAnnotationElement(parameters); - - default: - throw new Error('Unimplemented annotation type "' + subtype + '"'); - } - } -}; - -/** - * @class - * @alias AnnotationElement - */ -var AnnotationElement = (function AnnotationElementClosure() { - function AnnotationElement(parameters) { - this.data = parameters.data; - this.layer = parameters.layer; - this.page = parameters.page; - this.viewport = parameters.viewport; - this.linkService = parameters.linkService; - - this.container = this._createContainer(); - } - - AnnotationElement.prototype = /** @lends AnnotationElement.prototype */ { - /** - * Create an empty container for the annotation's HTML element. - * - * @private - * @memberof AnnotationElement - * @returns {HTMLSectionElement} - */ - _createContainer: function AnnotationElement_createContainer() { - var data = this.data, page = this.page, viewport = this.viewport; - var container = document.createElement('section'); - var width = data.rect[2] - data.rect[0]; - var height = data.rect[3] - data.rect[1]; - - container.setAttribute('data-annotation-id', data.id); - - // Do *not* modify `data.rect`, since that will corrupt the annotation - // position on subsequent calls to `_createContainer` (see issue 6804). - var rect = Util.normalizeRect([ - data.rect[0], - page.view[3] - data.rect[1] + page.view[1], - data.rect[2], - page.view[3] - data.rect[3] + page.view[1] - ]); - - CustomStyle.setProp('transform', container, - 'matrix(' + viewport.transform.join(',') + ')'); - CustomStyle.setProp('transformOrigin', container, - -rect[0] + 'px ' + -rect[1] + 'px'); - - if (data.borderStyle.width > 0) { - container.style.borderWidth = data.borderStyle.width + 'px'; - if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) { - // Underline styles only have a bottom border, so we do not need - // to adjust for all borders. This yields a similar result as - // Adobe Acrobat/Reader. - width = width - 2 * data.borderStyle.width; - height = height - 2 * data.borderStyle.width; - } - - var horizontalRadius = data.borderStyle.horizontalCornerRadius; - var verticalRadius = data.borderStyle.verticalCornerRadius; - if (horizontalRadius > 0 || verticalRadius > 0) { - var radius = horizontalRadius + 'px / ' + verticalRadius + 'px'; - CustomStyle.setProp('borderRadius', container, radius); - } - - switch (data.borderStyle.style) { - case AnnotationBorderStyleType.SOLID: - container.style.borderStyle = 'solid'; - break; - - case AnnotationBorderStyleType.DASHED: - container.style.borderStyle = 'dashed'; - break; - - case AnnotationBorderStyleType.BEVELED: - warn('Unimplemented border style: beveled'); - break; - - case AnnotationBorderStyleType.INSET: - warn('Unimplemented border style: inset'); - break; - - case AnnotationBorderStyleType.UNDERLINE: - container.style.borderBottomStyle = 'solid'; - break; - - default: - break; - } - - if (data.color) { - container.style.borderColor = - Util.makeCssRgb(data.color[0] | 0, - data.color[1] | 0, - data.color[2] | 0); - } else { - // Transparent (invisible) border, so do not draw it at all. - container.style.borderWidth = 0; - } - } - - container.style.left = rect[0] + 'px'; - container.style.top = rect[1] + 'px'; - - container.style.width = width + 'px'; - container.style.height = height + 'px'; - - return container; - }, - - /** - * Render the annotation's HTML element in the empty container. - * - * @public - * @memberof AnnotationElement - */ - render: function AnnotationElement_render() { - throw new Error('Abstract method AnnotationElement.render called'); - } - }; - - return AnnotationElement; -})(); - -/** - * @class - * @alias LinkAnnotationElement - */ -var LinkAnnotationElement = (function LinkAnnotationElementClosure() { - function LinkAnnotationElement(parameters) { - AnnotationElement.call(this, parameters); - } - - Util.inherit(LinkAnnotationElement, AnnotationElement, { - /** - * Render the link annotation's HTML element in the empty container. - * - * @public - * @memberof LinkAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function LinkAnnotationElement_render() { - this.container.className = 'linkAnnotation'; - - var link = document.createElement('a'); - addLinkAttributes(link, { url: this.data.url }); - - if (!this.data.url) { - if (this.data.action) { - this._bindNamedAction(link, this.data.action); - } else { - this._bindLink(link, ('dest' in this.data) ? this.data.dest : null); - } - } - - this.container.appendChild(link); - return this.container; - }, - - /** - * Bind internal links to the link element. - * - * @private - * @param {Object} link - * @param {Object} destination - * @memberof LinkAnnotationElement - */ - _bindLink: function LinkAnnotationElement_bindLink(link, destination) { - var self = this; - - link.href = this.linkService.getDestinationHash(destination); - link.onclick = function() { - if (destination) { - self.linkService.navigateTo(destination); - } - return false; - }; - if (destination) { - link.className = 'internalLink'; - } - }, - - /** - * Bind named actions to the link element. - * - * @private - * @param {Object} link - * @param {Object} action - * @memberof LinkAnnotationElement - */ - _bindNamedAction: - function LinkAnnotationElement_bindNamedAction(link, action) { - var self = this; - - link.href = this.linkService.getAnchorUrl(''); - link.onclick = function() { - self.linkService.executeNamedAction(action); - return false; - }; - link.className = 'internalLink'; - } - }); - - return LinkAnnotationElement; -})(); - -/** - * @class - * @alias TextAnnotationElement - */ -var TextAnnotationElement = (function TextAnnotationElementClosure() { - function TextAnnotationElement(parameters) { - AnnotationElement.call(this, parameters); - } - - Util.inherit(TextAnnotationElement, AnnotationElement, { - /** - * Render the text annotation's HTML element in the empty container. - * - * @public - * @memberof TextAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function TextAnnotationElement_render() { - this.container.className = 'textAnnotation'; - - var image = document.createElement('img'); - image.style.height = this.container.style.height; - image.style.width = this.container.style.width; - image.src = PDFJS.imageResourcesPath + 'annotation-' + - this.data.name.toLowerCase() + '.svg'; - image.alt = '[{{type}} Annotation]'; - image.dataset.l10nId = 'text_annotation_type'; - image.dataset.l10nArgs = JSON.stringify({type: this.data.name}); - - if (!this.data.hasPopup) { - var popupElement = new PopupElement({ - container: this.container, - trigger: image, - color: this.data.color, - title: this.data.title, - contents: this.data.contents, - hideWrapper: true - }); - var popup = popupElement.render(); - - // Position the popup next to the Text annotation's container. - popup.style.left = image.style.width; - - this.container.appendChild(popup); - } - - this.container.appendChild(image); - return this.container; - } - }); - - return TextAnnotationElement; -})(); - -/** - * @class - * @alias WidgetAnnotationElement - */ -var WidgetAnnotationElement = (function WidgetAnnotationElementClosure() { - function WidgetAnnotationElement(parameters) { - AnnotationElement.call(this, parameters); - } - - Util.inherit(WidgetAnnotationElement, AnnotationElement, { - /** - * Render the widget annotation's HTML element in the empty container. - * - * @public - * @memberof WidgetAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function WidgetAnnotationElement_render() { - var content = document.createElement('div'); - content.textContent = this.data.fieldValue; - var textAlignment = this.data.textAlignment; - content.style.textAlign = ['left', 'center', 'right'][textAlignment]; - content.style.verticalAlign = 'middle'; - content.style.display = 'table-cell'; - - var font = (this.data.fontRefName ? - this.page.commonObjs.getData(this.data.fontRefName) : null); - this._setTextStyle(content, font); - - this.container.appendChild(content); - return this.container; - }, - - /** - * Apply text styles to the text in the element. - * - * @private - * @param {HTMLDivElement} element - * @param {Object} font - * @memberof WidgetAnnotationElement - */ - _setTextStyle: - function WidgetAnnotationElement_setTextStyle(element, font) { - // TODO: This duplicates some of the logic in CanvasGraphics.setFont(). - var style = element.style; - style.fontSize = this.data.fontSize + 'px'; - style.direction = (this.data.fontDirection < 0 ? 'rtl': 'ltr'); - - if (!font) { - return; - } - - style.fontWeight = (font.black ? - (font.bold ? '900' : 'bold') : - (font.bold ? 'bold' : 'normal')); - style.fontStyle = (font.italic ? 'italic' : 'normal'); - - // Use a reasonable default font if the font doesn't specify a fallback. - var fontFamily = font.loadedName ? '"' + font.loadedName + '", ' : ''; - var fallbackName = font.fallbackName || 'Helvetica, sans-serif'; - style.fontFamily = fontFamily + fallbackName; - } - }); - - return WidgetAnnotationElement; -})(); - -/** - * @class - * @alias PopupAnnotationElement - */ -var PopupAnnotationElement = (function PopupAnnotationElementClosure() { - function PopupAnnotationElement(parameters) { - AnnotationElement.call(this, parameters); - } - - Util.inherit(PopupAnnotationElement, AnnotationElement, { - /** - * Render the popup annotation's HTML element in the empty container. - * - * @public - * @memberof PopupAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function PopupAnnotationElement_render() { - this.container.className = 'popupAnnotation'; - - var selector = '[data-annotation-id="' + this.data.parentId + '"]'; - var parentElement = this.layer.querySelector(selector); - if (!parentElement) { - return this.container; - } - - var popup = new PopupElement({ - container: this.container, - trigger: parentElement, - color: this.data.color, - title: this.data.title, - contents: this.data.contents - }); - - // Position the popup next to the parent annotation's container. - // PDF viewers ignore a popup annotation's rectangle. - var parentLeft = parseFloat(parentElement.style.left); - var parentWidth = parseFloat(parentElement.style.width); - CustomStyle.setProp('transformOrigin', this.container, - -(parentLeft + parentWidth) + 'px -' + - parentElement.style.top); - this.container.style.left = (parentLeft + parentWidth) + 'px'; - - this.container.appendChild(popup.render()); - return this.container; - } - }); - - return PopupAnnotationElement; -})(); - -/** - * @class - * @alias PopupElement - */ -var PopupElement = (function PopupElementClosure() { - var BACKGROUND_ENLIGHT = 0.7; - - function PopupElement(parameters) { - this.container = parameters.container; - this.trigger = parameters.trigger; - this.color = parameters.color; - this.title = parameters.title; - this.contents = parameters.contents; - this.hideWrapper = parameters.hideWrapper || false; - - this.pinned = false; - } - - PopupElement.prototype = /** @lends PopupElement.prototype */ { - /** - * Render the popup's HTML element. - * - * @public - * @memberof PopupElement - * @returns {HTMLSectionElement} - */ - render: function PopupElement_render() { - var wrapper = document.createElement('div'); - wrapper.className = 'popupWrapper'; - - // For Popup annotations we hide the entire section because it contains - // only the popup. However, for Text annotations without a separate Popup - // annotation, we cannot hide the entire container as the image would - // disappear too. In that special case, hiding the wrapper suffices. - this.hideElement = (this.hideWrapper ? wrapper : this.container); - this.hideElement.setAttribute('hidden', true); - - var popup = document.createElement('div'); - popup.className = 'popup'; - - var color = this.color; - if (color) { - // Enlighten the color. - var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0]; - var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1]; - var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2]; - popup.style.backgroundColor = Util.makeCssRgb(r | 0, g | 0, b | 0); - } - - var contents = this._formatContents(this.contents); - var title = document.createElement('h1'); - title.textContent = this.title; - - // Attach the event listeners to the trigger element. - this.trigger.addEventListener('click', this._toggle.bind(this)); - this.trigger.addEventListener('mouseover', this._show.bind(this, false)); - this.trigger.addEventListener('mouseout', this._hide.bind(this, false)); - popup.addEventListener('click', this._hide.bind(this, true)); - - popup.appendChild(title); - popup.appendChild(contents); - wrapper.appendChild(popup); - return wrapper; - }, - - /** - * Format the contents of the popup by adding newlines where necessary. - * - * @private - * @param {string} contents - * @memberof PopupElement - * @returns {HTMLParagraphElement} - */ - _formatContents: function PopupElement_formatContents(contents) { - var p = document.createElement('p'); - var lines = contents.split(/(?:\r\n?|\n)/); - for (var i = 0, ii = lines.length; i < ii; ++i) { - var line = lines[i]; - p.appendChild(document.createTextNode(line)); - if (i < (ii - 1)) { - p.appendChild(document.createElement('br')); - } - } - return p; - }, - - /** - * Toggle the visibility of the popup. - * - * @private - * @memberof PopupElement - */ - _toggle: function PopupElement_toggle() { - if (this.pinned) { - this._hide(true); - } else { - this._show(true); - } - }, - - /** - * Show the popup. - * - * @private - * @param {boolean} pin - * @memberof PopupElement - */ - _show: function PopupElement_show(pin) { - if (pin) { - this.pinned = true; - } - if (this.hideElement.hasAttribute('hidden')) { - this.hideElement.removeAttribute('hidden'); - this.container.style.zIndex += 1; - } - }, - - /** - * Hide the popup. - * - * @private - * @param {boolean} unpin - * @memberof PopupElement - */ - _hide: function PopupElement_hide(unpin) { - if (unpin) { - this.pinned = false; - } - if (!this.hideElement.hasAttribute('hidden') && !this.pinned) { - this.hideElement.setAttribute('hidden', true); - this.container.style.zIndex -= 1; - } - } - }; - - return PopupElement; -})(); - -/** - * @class - * @alias HighlightAnnotationElement - */ -var HighlightAnnotationElement = ( - function HighlightAnnotationElementClosure() { - function HighlightAnnotationElement(parameters) { - AnnotationElement.call(this, parameters); - } - - Util.inherit(HighlightAnnotationElement, AnnotationElement, { - /** - * Render the highlight annotation's HTML element in the empty container. - * - * @public - * @memberof HighlightAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function HighlightAnnotationElement_render() { - this.container.className = 'highlightAnnotation'; - return this.container; - } - }); - - return HighlightAnnotationElement; -})(); - -/** - * @class - * @alias UnderlineAnnotationElement - */ -var UnderlineAnnotationElement = ( - function UnderlineAnnotationElementClosure() { - function UnderlineAnnotationElement(parameters) { - AnnotationElement.call(this, parameters); - } - - Util.inherit(UnderlineAnnotationElement, AnnotationElement, { - /** - * Render the underline annotation's HTML element in the empty container. - * - * @public - * @memberof UnderlineAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function UnderlineAnnotationElement_render() { - this.container.className = 'underlineAnnotation'; - return this.container; - } - }); - - return UnderlineAnnotationElement; -})(); - -/** - * @class - * @alias SquigglyAnnotationElement - */ -var SquigglyAnnotationElement = (function SquigglyAnnotationElementClosure() { - function SquigglyAnnotationElement(parameters) { - AnnotationElement.call(this, parameters); - } - - Util.inherit(SquigglyAnnotationElement, AnnotationElement, { - /** - * Render the squiggly annotation's HTML element in the empty container. - * - * @public - * @memberof SquigglyAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function SquigglyAnnotationElement_render() { - this.container.className = 'squigglyAnnotation'; - return this.container; - } - }); - - return SquigglyAnnotationElement; -})(); - -/** - * @class - * @alias StrikeOutAnnotationElement - */ -var StrikeOutAnnotationElement = ( - function StrikeOutAnnotationElementClosure() { - function StrikeOutAnnotationElement(parameters) { - AnnotationElement.call(this, parameters); - } - - Util.inherit(StrikeOutAnnotationElement, AnnotationElement, { - /** - * Render the strikeout annotation's HTML element in the empty container. - * - * @public - * @memberof StrikeOutAnnotationElement - * @returns {HTMLSectionElement} - */ - render: function StrikeOutAnnotationElement_render() { - this.container.className = 'strikeoutAnnotation'; - return this.container; - } - }); - - return StrikeOutAnnotationElement; -})(); - -/** - * @typedef {Object} AnnotationLayerParameters - * @property {PageViewport} viewport - * @property {HTMLDivElement} div - * @property {Array} annotations - * @property {PDFPage} page - * @property {IPDFLinkService} linkService - */ - -/** - * @class - * @alias AnnotationLayer - */ -var AnnotationLayer = (function AnnotationLayerClosure() { - return { - /** - * Render a new annotation layer with all annotation elements. - * - * @public - * @param {AnnotationLayerParameters} parameters - * @memberof AnnotationLayer - */ - render: function AnnotationLayer_render(parameters) { - var annotationElementFactory = new AnnotationElementFactory(); - - for (var i = 0, ii = parameters.annotations.length; i < ii; i++) { - var data = parameters.annotations[i]; - if (!data || !data.hasHtml) { - continue; - } - - var properties = { - data: data, - layer: parameters.div, - page: parameters.page, - viewport: parameters.viewport, - linkService: parameters.linkService - }; - var element = annotationElementFactory.create(properties); - parameters.div.appendChild(element.render()); - } - }, - - /** - * Update the annotation elements on existing annotation layer. - * - * @public - * @param {AnnotationLayerParameters} parameters - * @memberof AnnotationLayer - */ - update: function AnnotationLayer_update(parameters) { - for (var i = 0, ii = parameters.annotations.length; i < ii; i++) { - var data = parameters.annotations[i]; - var element = parameters.div.querySelector( - '[data-annotation-id="' + data.id + '"]'); - if (element) { - CustomStyle.setProp('transform', element, - 'matrix(' + parameters.viewport.transform.join(',') + ')'); - } - } - parameters.div.removeAttribute('hidden'); - } - }; -})(); - -PDFJS.AnnotationLayer = AnnotationLayer; - -exports.AnnotationLayer = AnnotationLayer; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayFontLoader = {}), root.pdfjsSharedUtil, - root.pdfjsSharedGlobal); - } -}(this, function (exports, sharedUtil, sharedGlobal) { - -var assert = sharedUtil.assert; -var bytesToString = sharedUtil.bytesToString; -var string32 = sharedUtil.string32; -var shadow = sharedUtil.shadow; -var warn = sharedUtil.warn; - -var PDFJS = sharedGlobal.PDFJS; -var globalScope = sharedGlobal.globalScope; -var isWorker = sharedGlobal.isWorker; - -function FontLoader(docId) { - this.docId = docId; - this.styleElement = null; - this.nativeFontFaces = []; - this.loadTestFontId = 0; - this.loadingContext = { - requests: [], - nextRequestId: 0 - }; -} -FontLoader.prototype = { - insertRule: function fontLoaderInsertRule(rule) { - var styleElement = this.styleElement; - if (!styleElement) { - styleElement = this.styleElement = document.createElement('style'); - styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId; - document.documentElement.getElementsByTagName('head')[0].appendChild( - styleElement); - } - - var styleSheet = styleElement.sheet; - styleSheet.insertRule(rule, styleSheet.cssRules.length); - }, - - clear: function fontLoaderClear() { - var styleElement = this.styleElement; - if (styleElement) { - styleElement.parentNode.removeChild(styleElement); - styleElement = this.styleElement = null; - } - this.nativeFontFaces.forEach(function(nativeFontFace) { - document.fonts.delete(nativeFontFace); - }); - this.nativeFontFaces.length = 0; - }, - get loadTestFont() { - // This is a CFF font with 1 glyph for '.' that fills its entire width and - // height. - return shadow(this, 'loadTestFont', atob( - 'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' + - 'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' + - 'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' + - 'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' + - 'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' + - 'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' + - 'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' + - 'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' + - 'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' + - 'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' + - 'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' + - 'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' + - 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' + - 'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' + - 'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' + - 'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' + - 'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' + - 'ABAAAAAAAAAAAD6AAAAAAAAA==' - )); - }, - - addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) { - this.nativeFontFaces.push(nativeFontFace); - document.fonts.add(nativeFontFace); - }, - - bind: function fontLoaderBind(fonts, callback) { - assert(!isWorker, 'bind() shall be called from main thread'); - - var rules = []; - var fontsToLoad = []; - var fontLoadPromises = []; - var getNativeFontPromise = function(nativeFontFace) { - // Return a promise that is always fulfilled, even when the font fails to - // load. - return nativeFontFace.loaded.catch(function(e) { - warn('Failed to load font "' + nativeFontFace.family + '": ' + e); - }); - }; - for (var i = 0, ii = fonts.length; i < ii; i++) { - var font = fonts[i]; - - // Add the font to the DOM only once or skip if the font - // is already loaded. - if (font.attached || font.loading === false) { - continue; - } - font.attached = true; - - if (FontLoader.isFontLoadingAPISupported) { - var nativeFontFace = font.createNativeFontFace(); - if (nativeFontFace) { - this.addNativeFontFace(nativeFontFace); - fontLoadPromises.push(getNativeFontPromise(nativeFontFace)); - } - } else { - var rule = font.createFontFaceRule(); - if (rule) { - this.insertRule(rule); - rules.push(rule); - fontsToLoad.push(font); - } - } - } - - var request = this.queueLoadingCallback(callback); - if (FontLoader.isFontLoadingAPISupported) { - Promise.all(fontLoadPromises).then(function() { - request.complete(); - }); - } else if (rules.length > 0 && !FontLoader.isSyncFontLoadingSupported) { - this.prepareFontLoadEvent(rules, fontsToLoad, request); - } else { - request.complete(); - } - }, - - queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) { - function LoadLoader_completeRequest() { - assert(!request.end, 'completeRequest() cannot be called twice'); - request.end = Date.now(); - - // sending all completed requests in order how they were queued - while (context.requests.length > 0 && context.requests[0].end) { - var otherRequest = context.requests.shift(); - setTimeout(otherRequest.callback, 0); - } - } - - var context = this.loadingContext; - var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++); - var request = { - id: requestId, - complete: LoadLoader_completeRequest, - callback: callback, - started: Date.now() - }; - context.requests.push(request); - return request; - }, - - prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, - fonts, - request) { - /** Hack begin */ - // There's currently no event when a font has finished downloading so the - // following code is a dirty hack to 'guess' when a font is - // ready. It's assumed fonts are loaded in order, so add a known test - // font after the desired fonts and then test for the loading of that - // test font. - - function int32(data, offset) { - return (data.charCodeAt(offset) << 24) | - (data.charCodeAt(offset + 1) << 16) | - (data.charCodeAt(offset + 2) << 8) | - (data.charCodeAt(offset + 3) & 0xff); - } - - function spliceString(s, offset, remove, insert) { - var chunk1 = s.substr(0, offset); - var chunk2 = s.substr(offset + remove); - return chunk1 + insert + chunk2; - } - - var i, ii; - - var canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - var ctx = canvas.getContext('2d'); - - var called = 0; - function isFontReady(name, callback) { - called++; - // With setTimeout clamping this gives the font ~100ms to load. - if(called > 30) { - warn('Load test font never loaded.'); - callback(); - return; - } - ctx.font = '30px ' + name; - ctx.fillText('.', 0, 20); - var imageData = ctx.getImageData(0, 0, 1, 1); - if (imageData.data[3] > 0) { - callback(); - return; - } - setTimeout(isFontReady.bind(null, name, callback)); - } - - var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++; - // Chromium seems to cache fonts based on a hash of the actual font data, - // so the font must be modified for each load test else it will appear to - // be loaded already. - // TODO: This could maybe be made faster by avoiding the btoa of the full - // font by splitting it in chunks before hand and padding the font id. - var data = this.loadTestFont; - var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum) - data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, - loadTestFontId); - // CFF checksum is important for IE, adjusting it - var CFF_CHECKSUM_OFFSET = 16; - var XXXX_VALUE = 0x58585858; // the "comment" filled with 'X' - var checksum = int32(data, CFF_CHECKSUM_OFFSET); - for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) { - checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0; - } - if (i < loadTestFontId.length) { // align to 4 bytes boundary - checksum = (checksum - XXXX_VALUE + - int32(loadTestFontId + 'XXX', i)) | 0; - } - data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum)); - - var url = 'url(data:font/opentype;base64,' + btoa(data) + ');'; - var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' + - url + '}'; - this.insertRule(rule); - - var names = []; - for (i = 0, ii = fonts.length; i < ii; i++) { - names.push(fonts[i].loadedName); - } - names.push(loadTestFontId); - - var div = document.createElement('div'); - div.setAttribute('style', - 'visibility: hidden;' + - 'width: 10px; height: 10px;' + - 'position: absolute; top: 0px; left: 0px;'); - for (i = 0, ii = names.length; i < ii; ++i) { - var span = document.createElement('span'); - span.textContent = 'Hi'; - span.style.fontFamily = names[i]; - div.appendChild(span); - } - document.body.appendChild(div); - - isFontReady(loadTestFontId, function() { - document.body.removeChild(div); - request.complete(); - }); - /** Hack end */ - } -}; -FontLoader.isFontLoadingAPISupported = (!isWorker && - typeof document !== 'undefined' && !!document.fonts); -Object.defineProperty(FontLoader, 'isSyncFontLoadingSupported', { - get: function () { - var supported = false; - - // User agent string sniffing is bad, but there is no reliable way to tell - // if font is fully loaded and ready to be used with canvas. - var userAgent = window.navigator.userAgent; - var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent); - if (m && m[1] >= 14) { - supported = true; - } - // TODO other browsers - if (userAgent === 'node') { - supported = true; - } - return shadow(FontLoader, 'isSyncFontLoadingSupported', supported); - }, - enumerable: true, - configurable: true -}); - -var FontFaceObject = (function FontFaceObjectClosure() { - function FontFaceObject(translatedData) { - this.compiledGlyphs = {}; - // importing translated data - for (var i in translatedData) { - this[i] = translatedData[i]; - } - } - Object.defineProperty(FontFaceObject, 'isEvalSupported', { - get: function () { - var evalSupport = false; - if (PDFJS.isEvalSupported) { - try { - /* jshint evil: true */ - new Function(''); - evalSupport = true; - } catch (e) {} - } - return shadow(this, 'isEvalSupported', evalSupport); - }, - enumerable: true, - configurable: true - }); - FontFaceObject.prototype = { - createNativeFontFace: function FontFaceObject_createNativeFontFace() { - if (!this.data) { - return null; - } - - if (PDFJS.disableFontFace) { - this.disableFontFace = true; - return null; - } - - var nativeFontFace = new FontFace(this.loadedName, this.data, {}); - - if (PDFJS.pdfBug && 'FontInspector' in globalScope && - globalScope['FontInspector'].enabled) { - globalScope['FontInspector'].fontAdded(this); - } - return nativeFontFace; - }, - - createFontFaceRule: function FontFaceObject_createFontFaceRule() { - if (!this.data) { - return null; - } - - if (PDFJS.disableFontFace) { - this.disableFontFace = true; - return null; - } - - var data = bytesToString(new Uint8Array(this.data)); - var fontName = this.loadedName; - - // Add the font-face rule to the document - var url = ('url(data:' + this.mimetype + ';base64,' + - window.btoa(data) + ');'); - var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; - - if (PDFJS.pdfBug && 'FontInspector' in globalScope && - globalScope['FontInspector'].enabled) { - globalScope['FontInspector'].fontAdded(this, url); - } - - return rule; - }, - - getPathGenerator: - function FontFaceObject_getPathGenerator(objs, character) { - if (!(character in this.compiledGlyphs)) { - var cmds = objs.get(this.loadedName + '_path_' + character); - var current, i, len; - - // If we can, compile cmds into JS for MAXIMUM SPEED - if (FontFaceObject.isEvalSupported) { - var args, js = ''; - for (i = 0, len = cmds.length; i < len; i++) { - current = cmds[i]; - - if (current.args !== undefined) { - args = current.args.join(','); - } else { - args = ''; - } - - js += 'c.' + current.cmd + '(' + args + ');\n'; - } - /* jshint -W054 */ - this.compiledGlyphs[character] = new Function('c', 'size', js); - } else { - // But fall back on using Function.prototype.apply() if we're - // blocked from using eval() for whatever reason (like CSP policies) - this.compiledGlyphs[character] = function(c, size) { - for (i = 0, len = cmds.length; i < len; i++) { - current = cmds[i]; - - if (current.cmd === 'scale') { - current.args = [size, -size]; - } - - c[current.cmd].apply(c, current.args); - } - }; - } - } - return this.compiledGlyphs[character]; - } - }; - return FontFaceObject; -})(); - -exports.FontFaceObject = FontFaceObject; -exports.FontLoader = FontLoader; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayMetadata = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var error = sharedUtil.error; - -var Metadata = PDFJS.Metadata = (function MetadataClosure() { - function fixMetadata(meta) { - return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) { - var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, - function(code, d1, d2, d3) { - return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); - }); - var chars = ''; - for (var i = 0; i < bytes.length; i += 2) { - var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); - chars += code >= 32 && code < 127 && code !== 60 && code !== 62 && - code !== 38 && false ? String.fromCharCode(code) : - '&#x' + (0x10000 + code).toString(16).substring(1) + ';'; - } - return '>' + chars; - }); - } - - function Metadata(meta) { - if (typeof meta === 'string') { - // Ghostscript produces invalid metadata - meta = fixMetadata(meta); - - var parser = new DOMParser(); - meta = parser.parseFromString(meta, 'application/xml'); - } else if (!(meta instanceof Document)) { - error('Metadata: Invalid metadata object'); - } - - this.metaDocument = meta; - this.metadata = {}; - this.parse(); - } - - Metadata.prototype = { - parse: function Metadata_parse() { - var doc = this.metaDocument; - var rdf = doc.documentElement; - - if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in - rdf = rdf.firstChild; - while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') { - rdf = rdf.nextSibling; - } - } - - var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null; - if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) { - return; - } - - var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength; - for (i = 0, length = children.length; i < length; i++) { - desc = children[i]; - if (desc.nodeName.toLowerCase() !== 'rdf:description') { - continue; - } - - for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) { - if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') { - entry = desc.childNodes[ii]; - name = entry.nodeName.toLowerCase(); - this.metadata[name] = entry.textContent.trim(); - } - } - } - }, - - get: function Metadata_get(name) { - return this.metadata[name] || null; - }, - - has: function Metadata_has(name) { - return typeof this.metadata[name] !== 'undefined'; - } - }; - - return Metadata; -})(); - -exports.Metadata = Metadata; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplaySVG = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; -var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; -var ImageKind = sharedUtil.ImageKind; -var OPS = sharedUtil.OPS; -var Util = sharedUtil.Util; -var isNum = sharedUtil.isNum; -var isArray = sharedUtil.isArray; -var warn = sharedUtil.warn; - -var SVG_DEFAULTS = { - fontStyle: 'normal', - fontWeight: 'normal', - fillColor: '#000000' -}; - -var convertImgDataToPng = (function convertImgDataToPngClosure() { - var PNG_HEADER = - new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); - - var CHUNK_WRAPPER_SIZE = 12; - - var crcTable = new Int32Array(256); - for (var i = 0; i < 256; i++) { - var c = i; - for (var h = 0; h < 8; h++) { - if (c & 1) { - c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff); - } else { - c = (c >> 1) & 0x7fffffff; - } - } - crcTable[i] = c; - } - - function crc32(data, start, end) { - var crc = -1; - for (var i = start; i < end; i++) { - var a = (crc ^ data[i]) & 0xff; - var b = crcTable[a]; - crc = (crc >>> 8) ^ b; - } - return crc ^ -1; - } - - function writePngChunk(type, body, data, offset) { - var p = offset; - var len = body.length; - - data[p] = len >> 24 & 0xff; - data[p + 1] = len >> 16 & 0xff; - data[p + 2] = len >> 8 & 0xff; - data[p + 3] = len & 0xff; - p += 4; - - data[p] = type.charCodeAt(0) & 0xff; - data[p + 1] = type.charCodeAt(1) & 0xff; - data[p + 2] = type.charCodeAt(2) & 0xff; - data[p + 3] = type.charCodeAt(3) & 0xff; - p += 4; - - data.set(body, p); - p += body.length; - - var crc = crc32(data, offset + 4, p); - - data[p] = crc >> 24 & 0xff; - data[p + 1] = crc >> 16 & 0xff; - data[p + 2] = crc >> 8 & 0xff; - data[p + 3] = crc & 0xff; - } - - function adler32(data, start, end) { - var a = 1; - var b = 0; - for (var i = start; i < end; ++i) { - a = (a + (data[i] & 0xff)) % 65521; - b = (b + a) % 65521; - } - return (b << 16) | a; - } - - function encode(imgData, kind) { - var width = imgData.width; - var height = imgData.height; - var bitDepth, colorType, lineSize; - var bytes = imgData.data; - - switch (kind) { - case ImageKind.GRAYSCALE_1BPP: - colorType = 0; - bitDepth = 1; - lineSize = (width + 7) >> 3; - break; - case ImageKind.RGB_24BPP: - colorType = 2; - bitDepth = 8; - lineSize = width * 3; - break; - case ImageKind.RGBA_32BPP: - colorType = 6; - bitDepth = 8; - lineSize = width * 4; - break; - default: - throw new Error('invalid format'); - } - - // prefix every row with predictor 0 - var literals = new Uint8Array((1 + lineSize) * height); - var offsetLiterals = 0, offsetBytes = 0; - var y, i; - for (y = 0; y < height; ++y) { - literals[offsetLiterals++] = 0; // no prediction - literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), - offsetLiterals); - offsetBytes += lineSize; - offsetLiterals += lineSize; - } - - if (kind === ImageKind.GRAYSCALE_1BPP) { - // inverting for B/W - offsetLiterals = 0; - for (y = 0; y < height; y++) { - offsetLiterals++; // skipping predictor - for (i = 0; i < lineSize; i++) { - literals[offsetLiterals++] ^= 0xFF; - } - } - } - - var ihdr = new Uint8Array([ - width >> 24 & 0xff, - width >> 16 & 0xff, - width >> 8 & 0xff, - width & 0xff, - height >> 24 & 0xff, - height >> 16 & 0xff, - height >> 8 & 0xff, - height & 0xff, - bitDepth, // bit depth - colorType, // color type - 0x00, // compression method - 0x00, // filter method - 0x00 // interlace method - ]); - - var len = literals.length; - var maxBlockLength = 0xFFFF; - - var deflateBlocks = Math.ceil(len / maxBlockLength); - var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4); - var pi = 0; - idat[pi++] = 0x78; // compression method and flags - idat[pi++] = 0x9c; // flags - - var pos = 0; - while (len > maxBlockLength) { - // writing non-final DEFLATE blocks type 0 and length of 65535 - idat[pi++] = 0x00; - idat[pi++] = 0xff; - idat[pi++] = 0xff; - idat[pi++] = 0x00; - idat[pi++] = 0x00; - idat.set(literals.subarray(pos, pos + maxBlockLength), pi); - pi += maxBlockLength; - pos += maxBlockLength; - len -= maxBlockLength; - } - - // writing non-final DEFLATE blocks type 0 - idat[pi++] = 0x01; - idat[pi++] = len & 0xff; - idat[pi++] = len >> 8 & 0xff; - idat[pi++] = (~len & 0xffff) & 0xff; - idat[pi++] = (~len & 0xffff) >> 8 & 0xff; - idat.set(literals.subarray(pos), pi); - pi += literals.length - pos; - - var adler = adler32(literals, 0, literals.length); // checksum - idat[pi++] = adler >> 24 & 0xff; - idat[pi++] = adler >> 16 & 0xff; - idat[pi++] = adler >> 8 & 0xff; - idat[pi++] = adler & 0xff; - - // PNG will consists: header, IHDR+data, IDAT+data, and IEND. - var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) + - ihdr.length + idat.length; - var data = new Uint8Array(pngLength); - var offset = 0; - data.set(PNG_HEADER, offset); - offset += PNG_HEADER.length; - writePngChunk('IHDR', ihdr, data, offset); - offset += CHUNK_WRAPPER_SIZE + ihdr.length; - writePngChunk('IDATA', idat, data, offset); - offset += CHUNK_WRAPPER_SIZE + idat.length; - writePngChunk('IEND', new Uint8Array(0), data, offset); - - return PDFJS.createObjectURL(data, 'image/png'); - } - - return function convertImgDataToPng(imgData) { - var kind = (imgData.kind === undefined ? - ImageKind.GRAYSCALE_1BPP : imgData.kind); - return encode(imgData, kind); - }; -})(); - -var SVGExtraState = (function SVGExtraStateClosure() { - function SVGExtraState() { - this.fontSizeScale = 1; - this.fontWeight = SVG_DEFAULTS.fontWeight; - this.fontSize = 0; - - this.textMatrix = IDENTITY_MATRIX; - this.fontMatrix = FONT_IDENTITY_MATRIX; - this.leading = 0; - - // Current point (in user coordinates) - this.x = 0; - this.y = 0; - - // Start of text line (in text coordinates) - this.lineX = 0; - this.lineY = 0; - - // Character and word spacing - this.charSpacing = 0; - this.wordSpacing = 0; - this.textHScale = 1; - this.textRise = 0; - - // Default foreground and background colors - this.fillColor = SVG_DEFAULTS.fillColor; - this.strokeColor = '#000000'; - - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.lineJoin = ''; - this.lineCap = ''; - this.miterLimit = 0; - - this.dashArray = []; - this.dashPhase = 0; - - this.dependencies = []; - - // Clipping - this.clipId = ''; - this.pendingClip = false; - - this.maskId = ''; - } - - SVGExtraState.prototype = { - clone: function SVGExtraState_clone() { - return Object.create(this); - }, - setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) { - this.x = x; - this.y = y; - } - }; - return SVGExtraState; -})(); - -var SVGGraphics = (function SVGGraphicsClosure() { - function createScratchSVG(width, height) { - var NS = 'http://www.w3.org/2000/svg'; - var svg = document.createElementNS(NS, 'svg:svg'); - svg.setAttributeNS(null, 'version', '1.1'); - svg.setAttributeNS(null, 'width', width + 'px'); - svg.setAttributeNS(null, 'height', height + 'px'); - svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height); - return svg; - } - - function opListToTree(opList) { - var opTree = []; - var tmp = []; - var opListLen = opList.length; - - for (var x = 0; x < opListLen; x++) { - if (opList[x].fn === 'save') { - opTree.push({'fnId': 92, 'fn': 'group', 'items': []}); - tmp.push(opTree); - opTree = opTree[opTree.length - 1].items; - continue; - } - - if(opList[x].fn === 'restore') { - opTree = tmp.pop(); - } else { - opTree.push(opList[x]); - } - } - return opTree; - } - - /** - * Formats float number. - * @param value {number} number to format. - * @returns {string} - */ - function pf(value) { - if (value === (value | 0)) { // integer number - return value.toString(); - } - var s = value.toFixed(10); - var i = s.length - 1; - if (s[i] !== '0') { - return s; - } - // removing trailing zeros - do { - i--; - } while (s[i] === '0'); - return s.substr(0, s[i] === '.' ? i : i + 1); - } - - /** - * Formats transform matrix. The standard rotation, scale and translate - * matrices are replaced by their shorter forms, and for identity matrix - * returns empty string to save the memory. - * @param m {Array} matrix to format. - * @returns {string} - */ - function pm(m) { - if (m[4] === 0 && m[5] === 0) { - if (m[1] === 0 && m[2] === 0) { - if (m[0] === 1 && m[3] === 1) { - return ''; - } - return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')'; - } - if (m[0] === m[3] && m[1] === -m[2]) { - var a = Math.acos(m[0]) * 180 / Math.PI; - return 'rotate(' + pf(a) + ')'; - } - } else { - if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) { - return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } - } - return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + - pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')'; - } - - function SVGGraphics(commonObjs, objs) { - this.current = new SVGExtraState(); - this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix - this.transformStack = []; - this.extraStack = []; - this.commonObjs = commonObjs; - this.objs = objs; - this.pendingEOFill = false; - - this.embedFonts = false; - this.embeddedFonts = {}; - this.cssStyle = null; - } - - var NS = 'http://www.w3.org/2000/svg'; - var XML_NS = 'http://www.w3.org/XML/1998/namespace'; - var XLINK_NS = 'http://www.w3.org/1999/xlink'; - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var clipCount = 0; - var maskCount = 0; - - SVGGraphics.prototype = { - save: function SVGGraphics_save() { - this.transformStack.push(this.transformMatrix); - var old = this.current; - this.extraStack.push(old); - this.current = old.clone(); - }, - - restore: function SVGGraphics_restore() { - this.transformMatrix = this.transformStack.pop(); - this.current = this.extraStack.pop(); - - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.pgrp.appendChild(this.tgrp); - }, - - group: function SVGGraphics_group(items) { - this.save(); - this.executeOpTree(items); - this.restore(); - }, - - loadDependencies: function SVGGraphics_loadDependencies(operatorList) { - var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; - var argsArray = operatorList.argsArray; - - var self = this; - for (var i = 0; i < fnArrayLen; i++) { - if (OPS.dependency === fnArray[i]) { - var deps = argsArray[i]; - for (var n = 0, nn = deps.length; n < nn; n++) { - var obj = deps[n]; - var common = obj.substring(0, 2) === 'g_'; - var promise; - if (common) { - promise = new Promise(function(resolve) { - self.commonObjs.get(obj, resolve); - }); - } else { - promise = new Promise(function(resolve) { - self.objs.get(obj, resolve); - }); - } - this.current.dependencies.push(promise); - } - } - } - return Promise.all(this.current.dependencies); - }, - - transform: function SVGGraphics_transform(a, b, c, d, e, f) { - var transformMatrix = [a, b, c, d, e, f]; - this.transformMatrix = PDFJS.Util.transform(this.transformMatrix, - transformMatrix); - - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - getSVG: function SVGGraphics_getSVG(operatorList, viewport) { - this.svg = createScratchSVG(viewport.width, viewport.height); - this.viewport = viewport; - - return this.loadDependencies(operatorList).then(function () { - this.transformMatrix = IDENTITY_MATRIX; - this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group - this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform)); - this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.defs = document.createElementNS(NS, 'svg:defs'); - this.pgrp.appendChild(this.defs); - this.pgrp.appendChild(this.tgrp); - this.svg.appendChild(this.pgrp); - var opTree = this.convertOpList(operatorList); - this.executeOpTree(opTree); - return this.svg; - }.bind(this)); - }, - - convertOpList: function SVGGraphics_convertOpList(operatorList) { - var argsArray = operatorList.argsArray; - var fnArray = operatorList.fnArray; - var fnArrayLen = fnArray.length; - var REVOPS = []; - var opList = []; - - for (var op in OPS) { - REVOPS[OPS[op]] = op; - } - - for (var x = 0; x < fnArrayLen; x++) { - var fnId = fnArray[x]; - opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]}); - } - return opListToTree(opList); - }, - - executeOpTree: function SVGGraphics_executeOpTree(opTree) { - var opTreeLen = opTree.length; - for(var x = 0; x < opTreeLen; x++) { - var fn = opTree[x].fn; - var fnId = opTree[x].fnId; - var args = opTree[x].args; - - switch (fnId | 0) { - case OPS.beginText: - this.beginText(); - break; - case OPS.setLeading: - this.setLeading(args); - break; - case OPS.setLeadingMoveText: - this.setLeadingMoveText(args[0], args[1]); - break; - case OPS.setFont: - this.setFont(args); - break; - case OPS.showText: - this.showText(args[0]); - break; - case OPS.showSpacedText: - this.showText(args[0]); - break; - case OPS.endText: - this.endText(); - break; - case OPS.moveText: - this.moveText(args[0], args[1]); - break; - case OPS.setCharSpacing: - this.setCharSpacing(args[0]); - break; - case OPS.setWordSpacing: - this.setWordSpacing(args[0]); - break; - case OPS.setHScale: - this.setHScale(args[0]); - break; - case OPS.setTextMatrix: - this.setTextMatrix(args[0], args[1], args[2], - args[3], args[4], args[5]); - break; - case OPS.setLineWidth: - this.setLineWidth(args[0]); - break; - case OPS.setLineJoin: - this.setLineJoin(args[0]); - break; - case OPS.setLineCap: - this.setLineCap(args[0]); - break; - case OPS.setMiterLimit: - this.setMiterLimit(args[0]); - break; - case OPS.setFillRGBColor: - this.setFillRGBColor(args[0], args[1], args[2]); - break; - case OPS.setStrokeRGBColor: - this.setStrokeRGBColor(args[0], args[1], args[2]); - break; - case OPS.setDash: - this.setDash(args[0], args[1]); - break; - case OPS.setGState: - this.setGState(args[0]); - break; - case OPS.fill: - this.fill(); - break; - case OPS.eoFill: - this.eoFill(); - break; - case OPS.stroke: - this.stroke(); - break; - case OPS.fillStroke: - this.fillStroke(); - break; - case OPS.eoFillStroke: - this.eoFillStroke(); - break; - case OPS.clip: - this.clip('nonzero'); - break; - case OPS.eoClip: - this.clip('evenodd'); - break; - case OPS.paintSolidColorImageMask: - this.paintSolidColorImageMask(); - break; - case OPS.paintJpegXObject: - this.paintJpegXObject(args[0], args[1], args[2]); - break; - case OPS.paintImageXObject: - this.paintImageXObject(args[0]); - break; - case OPS.paintInlineImageXObject: - this.paintInlineImageXObject(args[0]); - break; - case OPS.paintImageMaskXObject: - this.paintImageMaskXObject(args[0]); - break; - case OPS.paintFormXObjectBegin: - this.paintFormXObjectBegin(args[0], args[1]); - break; - case OPS.paintFormXObjectEnd: - this.paintFormXObjectEnd(); - break; - case OPS.closePath: - this.closePath(); - break; - case OPS.closeStroke: - this.closeStroke(); - break; - case OPS.closeFillStroke: - this.closeFillStroke(); - break; - case OPS.nextLine: - this.nextLine(); - break; - case OPS.transform: - this.transform(args[0], args[1], args[2], args[3], - args[4], args[5]); - break; - case OPS.constructPath: - this.constructPath(args[0], args[1]); - break; - case OPS.endPath: - this.endPath(); - break; - case 92: - this.group(opTree[x].items); - break; - default: - warn('Unimplemented method '+ fn); - break; - } - } - }, - - setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) { - this.current.wordSpacing = wordSpacing; - }, - - setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) { - this.current.charSpacing = charSpacing; - }, - - nextLine: function SVGGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - - setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) { - var current = this.current; - this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f]; - - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - - current.xcoords = []; - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - - current.txtElement = document.createElementNS(NS, 'svg:text'); - current.txtElement.appendChild(current.tspan); - }, - - beginText: function SVGGraphics_beginText() { - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - this.current.textMatrix = IDENTITY_MATRIX; - this.current.lineMatrix = IDENTITY_MATRIX; - this.current.tspan = document.createElementNS(NS, 'svg:tspan'); - this.current.txtElement = document.createElementNS(NS, 'svg:text'); - this.current.txtgrp = document.createElementNS(NS, 'svg:g'); - this.current.xcoords = []; - }, - - moveText: function SVGGraphics_moveText(x, y) { - var current = this.current; - this.current.x = this.current.lineX += x; - this.current.y = this.current.lineY += y; - - current.xcoords = []; - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - }, - - showText: function SVGGraphics_showText(glyphs) { - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - - if (fontSize === 0) { - return; - } - - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var fontDirection = current.fontDirection; - var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; - var vertical = font.vertical; - var widthAdvanceScale = fontSize * current.fontMatrix[0]; - - var x = 0, i; - for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (glyph === null) { - // word break - x += fontDirection * wordSpacing; - continue; - } else if (isNum(glyph)) { - x += -glyph * fontSize * 0.001; - continue; - } - current.xcoords.push(current.x + x * textHScale); - - var width = glyph.width; - var character = glyph.fontChar; - var charWidth = width * widthAdvanceScale + charSpacing * fontDirection; - x += charWidth; - - current.tspan.textContent += character; - } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - - current.tspan.setAttributeNS(null, 'x', - current.xcoords.map(pf).join(' ')); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - current.tspan.setAttributeNS(null, 'font-family', current.fontFamily); - current.tspan.setAttributeNS(null, 'font-size', - pf(current.fontSize) + 'px'); - if (current.fontStyle !== SVG_DEFAULTS.fontStyle) { - current.tspan.setAttributeNS(null, 'font-style', current.fontStyle); - } - if (current.fontWeight !== SVG_DEFAULTS.fontWeight) { - current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight); - } - if (current.fillColor !== SVG_DEFAULTS.fillColor) { - current.tspan.setAttributeNS(null, 'fill', current.fillColor); - } - - current.txtElement.setAttributeNS(null, 'transform', - pm(current.textMatrix) + - ' scale(1, -1)' ); - current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve'); - current.txtElement.appendChild(current.tspan); - current.txtgrp.appendChild(current.txtElement); - - this.tgrp.appendChild(current.txtElement); - - }, - - setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) { - this.setLeading(-y); - this.moveText(x, y); - }, - - addFontStyle: function SVGGraphics_addFontStyle(fontObj) { - if (!this.cssStyle) { - this.cssStyle = document.createElementNS(NS, 'svg:style'); - this.cssStyle.setAttributeNS(null, 'type', 'text/css'); - this.defs.appendChild(this.cssStyle); - } - - var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype); - this.cssStyle.textContent += - '@font-face { font-family: "' + fontObj.loadedName + '";' + - ' src: url(' + url + '); }\n'; - }, - - setFont: function SVGGraphics_setFont(details) { - var current = this.current; - var fontObj = this.commonObjs.get(details[0]); - var size = details[1]; - this.current.font = fontObj; - - if (this.embedFonts && fontObj.data && - !this.embeddedFonts[fontObj.loadedName]) { - this.addFontStyle(fontObj); - this.embeddedFonts[fontObj.loadedName] = fontObj; - } - - current.fontMatrix = (fontObj.fontMatrix ? - fontObj.fontMatrix : FONT_IDENTITY_MATRIX); - - var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : - (fontObj.bold ? 'bold' : 'normal'); - var italic = fontObj.italic ? 'italic' : 'normal'; - - if (size < 0) { - size = -size; - current.fontDirection = -1; - } else { - current.fontDirection = 1; - } - current.fontSize = size; - current.fontFamily = fontObj.loadedName; - current.fontWeight = bold; - current.fontStyle = italic; - - current.tspan = document.createElementNS(NS, 'svg:tspan'); - current.tspan.setAttributeNS(null, 'y', pf(-current.y)); - current.xcoords = []; - }, - - endText: function SVGGraphics_endText() { - if (this.current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - // Path properties - setLineWidth: function SVGGraphics_setLineWidth(width) { - this.current.lineWidth = width; - }, - setLineCap: function SVGGraphics_setLineCap(style) { - this.current.lineCap = LINE_CAP_STYLES[style]; - }, - setLineJoin: function SVGGraphics_setLineJoin(style) { - this.current.lineJoin = LINE_JOIN_STYLES[style]; - }, - setMiterLimit: function SVGGraphics_setMiterLimit(limit) { - this.current.miterLimit = limit; - }, - setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.current.strokeColor = color; - }, - setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.current.fillColor = color; - this.current.tspan = document.createElementNS(NS, 'svg:tspan'); - this.current.xcoords = []; - }, - setDash: function SVGGraphics_setDash(dashArray, dashPhase) { - this.current.dashArray = dashArray; - this.current.dashPhase = dashPhase; - }, - - constructPath: function SVGGraphics_constructPath(ops, args) { - var current = this.current; - var x = current.x, y = current.y; - current.path = document.createElementNS(NS, 'svg:path'); - var d = []; - var opLength = ops.length; - - for (var i = 0, j = 0; i < opLength; i++) { - switch (ops[i] | 0) { - case OPS.rectangle: - x = args[j++]; - y = args[j++]; - var width = args[j++]; - var height = args[j++]; - var xw = x + width; - var yh = y + height; - d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh), - 'L', pf(x), pf(yh), 'Z'); - break; - case OPS.moveTo: - x = args[j++]; - y = args[j++]; - d.push('M', pf(x), pf(y)); - break; - case OPS.lineTo: - x = args[j++]; - y = args[j++]; - d.push('L', pf(x) , pf(y)); - break; - case OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), - pf(args[j + 3]), pf(x), pf(y)); - j += 6; - break; - case OPS.curveTo2: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), - pf(args[j + 2]), pf(args[j + 3])); - j += 4; - break; - case OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), - pf(x), pf(y)); - j += 4; - break; - case OPS.closePath: - d.push('Z'); - break; - } - } - current.path.setAttributeNS(null, 'd', d.join(' ')); - current.path.setAttributeNS(null, 'stroke-miterlimit', - pf(current.miterLimit)); - current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap); - current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin); - current.path.setAttributeNS(null, 'stroke-width', - pf(current.lineWidth) + 'px'); - current.path.setAttributeNS(null, 'stroke-dasharray', - current.dashArray.map(pf).join(' ')); - current.path.setAttributeNS(null, 'stroke-dashoffset', - pf(current.dashPhase) + 'px'); - current.path.setAttributeNS(null, 'fill', 'none'); - - this.tgrp.appendChild(current.path); - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - // Saving a reference in current.element so that it can be addressed - // in 'fill' and 'stroke' - current.element = current.path; - current.setCurrentPoint(x, y); - }, - - endPath: function SVGGraphics_endPath() { - var current = this.current; - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - this.tgrp = document.createElementNS(NS, 'svg:g'); - this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - }, - - clip: function SVGGraphics_clip(type) { - var current = this.current; - // Add current path to clipping path - current.clipId = 'clippath' + clipCount; - clipCount++; - this.clippath = document.createElementNS(NS, 'svg:clipPath'); - this.clippath.setAttributeNS(null, 'id', current.clipId); - var clipElement = current.element.cloneNode(); - if (type === 'evenodd') { - clipElement.setAttributeNS(null, 'clip-rule', 'evenodd'); - } else { - clipElement.setAttributeNS(null, 'clip-rule', 'nonzero'); - } - this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix)); - this.clippath.appendChild(clipElement); - this.defs.appendChild(this.clippath); - - // Create a new group with that attribute - current.pendingClip = true; - this.cgrp = document.createElementNS(NS, 'svg:g'); - this.cgrp.setAttributeNS(null, 'clip-path', - 'url(#' + current.clipId + ')'); - this.pgrp.appendChild(this.cgrp); - }, - - closePath: function SVGGraphics_closePath() { - var current = this.current; - var d = current.path.getAttributeNS(null, 'd'); - d += 'Z'; - current.path.setAttributeNS(null, 'd', d); - }, - - setLeading: function SVGGraphics_setLeading(leading) { - this.current.leading = -leading; - }, - - setTextRise: function SVGGraphics_setTextRise(textRise) { - this.current.textRise = textRise; - }, - - setHScale: function SVGGraphics_setHScale(scale) { - this.current.textHScale = scale / 100; - }, - - setGState: function SVGGraphics_setGState(states) { - for (var i = 0, ii = states.length; i < ii; i++) { - var state = states[i]; - var key = state[0]; - var value = state[1]; - - switch (key) { - case 'LW': - this.setLineWidth(value); - break; - case 'LC': - this.setLineCap(value); - break; - case 'LJ': - this.setLineJoin(value); - break; - case 'ML': - this.setMiterLimit(value); - break; - case 'D': - this.setDash(value[0], value[1]); - break; - case 'RI': - break; - case 'FL': - break; - case 'Font': - this.setFont(value); - break; - case 'CA': - break; - case 'ca': - break; - case 'BM': - break; - case 'SMask': - break; - } - } - }, - - fill: function SVGGraphics_fill() { - var current = this.current; - current.element.setAttributeNS(null, 'fill', current.fillColor); - }, - - stroke: function SVGGraphics_stroke() { - var current = this.current; - current.element.setAttributeNS(null, 'stroke', current.strokeColor); - current.element.setAttributeNS(null, 'fill', 'none'); - }, - - eoFill: function SVGGraphics_eoFill() { - var current = this.current; - current.element.setAttributeNS(null, 'fill', current.fillColor); - current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); - }, - - fillStroke: function SVGGraphics_fillStroke() { - // Order is important since stroke wants fill to be none. - // First stroke, then if fill needed, it will be overwritten. - this.stroke(); - this.fill(); - }, - - eoFillStroke: function SVGGraphics_eoFillStroke() { - this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd'); - this.fillStroke(); - }, - - closeStroke: function SVGGraphics_closeStroke() { - this.closePath(); - this.stroke(); - }, - - closeFillStroke: function SVGGraphics_closeFillStroke() { - this.closePath(); - this.fillStroke(); - }, - - paintSolidColorImageMask: - function SVGGraphics_paintSolidColorImageMask() { - var current = this.current; - var rect = document.createElementNS(NS, 'svg:rect'); - rect.setAttributeNS(null, 'x', '0'); - rect.setAttributeNS(null, 'y', '0'); - rect.setAttributeNS(null, 'width', '1px'); - rect.setAttributeNS(null, 'height', '1px'); - rect.setAttributeNS(null, 'fill', current.fillColor); - this.tgrp.appendChild(rect); - }, - - paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) { - var current = this.current; - var imgObj = this.objs.get(objId); - var imgEl = document.createElementNS(NS, 'svg:image'); - imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src); - imgEl.setAttributeNS(null, 'width', imgObj.width + 'px'); - imgEl.setAttributeNS(null, 'height', imgObj.height + 'px'); - imgEl.setAttributeNS(null, 'x', '0'); - imgEl.setAttributeNS(null, 'y', pf(-h)); - imgEl.setAttributeNS(null, 'transform', - 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')'); - - this.tgrp.appendChild(imgEl); - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - }, - - paintImageXObject: function SVGGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - this.paintInlineImageXObject(imgData); - }, - - paintInlineImageXObject: - function SVGGraphics_paintInlineImageXObject(imgData, mask) { - var current = this.current; - var width = imgData.width; - var height = imgData.height; - - var imgSrc = convertImgDataToPng(imgData); - var cliprect = document.createElementNS(NS, 'svg:rect'); - cliprect.setAttributeNS(null, 'x', '0'); - cliprect.setAttributeNS(null, 'y', '0'); - cliprect.setAttributeNS(null, 'width', pf(width)); - cliprect.setAttributeNS(null, 'height', pf(height)); - current.element = cliprect; - this.clip('nonzero'); - var imgEl = document.createElementNS(NS, 'svg:image'); - imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc); - imgEl.setAttributeNS(null, 'x', '0'); - imgEl.setAttributeNS(null, 'y', pf(-height)); - imgEl.setAttributeNS(null, 'width', pf(width) + 'px'); - imgEl.setAttributeNS(null, 'height', pf(height) + 'px'); - imgEl.setAttributeNS(null, 'transform', - 'scale(' + pf(1 / width) + ' ' + - pf(-1 / height) + ')'); - if (mask) { - mask.appendChild(imgEl); - } else { - this.tgrp.appendChild(imgEl); - } - if (current.pendingClip) { - this.cgrp.appendChild(this.tgrp); - this.pgrp.appendChild(this.cgrp); - } else { - this.pgrp.appendChild(this.tgrp); - } - }, - - paintImageMaskXObject: - function SVGGraphics_paintImageMaskXObject(imgData) { - var current = this.current; - var width = imgData.width; - var height = imgData.height; - var fillColor = current.fillColor; - - current.maskId = 'mask' + maskCount++; - var mask = document.createElementNS(NS, 'svg:mask'); - mask.setAttributeNS(null, 'id', current.maskId); - - var rect = document.createElementNS(NS, 'svg:rect'); - rect.setAttributeNS(null, 'x', '0'); - rect.setAttributeNS(null, 'y', '0'); - rect.setAttributeNS(null, 'width', pf(width)); - rect.setAttributeNS(null, 'height', pf(height)); - rect.setAttributeNS(null, 'fill', fillColor); - rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')'); - this.defs.appendChild(mask); - this.tgrp.appendChild(rect); - - this.paintInlineImageXObject(imgData, mask); - }, - - paintFormXObjectBegin: - function SVGGraphics_paintFormXObjectBegin(matrix, bbox) { - this.save(); - - if (isArray(matrix) && matrix.length === 6) { - this.transform(matrix[0], matrix[1], matrix[2], - matrix[3], matrix[4], matrix[5]); - } - - if (isArray(bbox) && bbox.length === 4) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - - var cliprect = document.createElementNS(NS, 'svg:rect'); - cliprect.setAttributeNS(null, 'x', bbox[0]); - cliprect.setAttributeNS(null, 'y', bbox[1]); - cliprect.setAttributeNS(null, 'width', pf(width)); - cliprect.setAttributeNS(null, 'height', pf(height)); - this.current.element = cliprect; - this.clip('nonzero'); - this.endPath(); - } - }, - - paintFormXObjectEnd: - function SVGGraphics_paintFormXObjectEnd() { - this.restore(); - } - }; - return SVGGraphics; -})(); - -PDFJS.SVGGraphics = SVGGraphics; - -exports.SVGGraphics = SVGGraphics; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayTextLayer = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayDOMUtils, root.pdfjsSharedGlobal); - } -}(this, function (exports, sharedUtil, displayDOMUtils, sharedGlobal) { - -var Util = sharedUtil.Util; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var CustomStyle = displayDOMUtils.CustomStyle; -var PDFJS = sharedGlobal.PDFJS; - -/** - * Text layer render parameters. - * - * @typedef {Object} TextLayerRenderParameters - * @property {TextContent} textContent - Text content to render (the object is - * returned by the page's getTextContent() method). - * @property {HTMLElement} container - HTML element that will contain text runs. - * @property {PDFJS.PageViewport} viewport - The target viewport to properly - * layout the text runs. - * @property {Array} textDivs - (optional) HTML elements that are correspond - * the text items of the textContent input. This is output and shall be - * initially be set to empty array. - * @property {number} timeout - (optional) Delay in milliseconds before - * rendering of the text runs occurs. - */ -var renderTextLayer = (function renderTextLayerClosure() { - var MAX_TEXT_DIVS_TO_RENDER = 100000; - - var NonWhitespaceRegexp = /\S/; - - function isAllWhitespace(str) { - return !NonWhitespaceRegexp.test(str); - } - - function appendText(textDivs, viewport, geom, styles) { - var style = styles[geom.fontName]; - var textDiv = document.createElement('div'); - textDivs.push(textDiv); - if (isAllWhitespace(geom.str)) { - textDiv.dataset.isWhitespace = true; - return; - } - var tx = Util.transform(viewport.transform, geom.transform); - var angle = Math.atan2(tx[1], tx[0]); - if (style.vertical) { - angle += Math.PI / 2; - } - var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3])); - var fontAscent = fontHeight; - if (style.ascent) { - fontAscent = style.ascent * fontAscent; - } else if (style.descent) { - fontAscent = (1 + style.descent) * fontAscent; - } - - var left; - var top; - if (angle === 0) { - left = tx[4]; - top = tx[5] - fontAscent; - } else { - left = tx[4] + (fontAscent * Math.sin(angle)); - top = tx[5] - (fontAscent * Math.cos(angle)); - } - textDiv.style.left = left + 'px'; - textDiv.style.top = top + 'px'; - textDiv.style.fontSize = fontHeight + 'px'; - textDiv.style.fontFamily = style.fontFamily; - - textDiv.textContent = geom.str; - // |fontName| is only used by the Font Inspector. This test will succeed - // when e.g. the Font Inspector is off but the Stepper is on, but it's - // not worth the effort to do a more accurate test. - if (PDFJS.pdfBug) { - textDiv.dataset.fontName = geom.fontName; - } - // Storing into dataset will convert number into string. - if (angle !== 0) { - textDiv.dataset.angle = angle * (180 / Math.PI); - } - // We don't bother scaling single-char text divs, because it has very - // little effect on text highlighting. This makes scrolling on docs with - // lots of such divs a lot faster. - if (geom.str.length > 1) { - if (style.vertical) { - textDiv.dataset.canvasWidth = geom.height * viewport.scale; - } else { - textDiv.dataset.canvasWidth = geom.width * viewport.scale; - } - } - } - - function render(task) { - if (task._canceled) { - return; - } - var textLayerFrag = task._container; - var textDivs = task._textDivs; - var capability = task._capability; - var textDivsLength = textDivs.length; - - // No point in rendering many divs as it would make the browser - // unusable even after the divs are rendered. - if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) { - capability.resolve(); - return; - } - - var canvas = document.createElement('canvas'); - canvas.mozOpaque = true; - var ctx = canvas.getContext('2d', {alpha: false}); - - var lastFontSize; - var lastFontFamily; - for (var i = 0; i < textDivsLength; i++) { - var textDiv = textDivs[i]; - if (textDiv.dataset.isWhitespace !== undefined) { - continue; - } - - var fontSize = textDiv.style.fontSize; - var fontFamily = textDiv.style.fontFamily; - - // Only build font string and set to context if different from last. - if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) { - ctx.font = fontSize + ' ' + fontFamily; - lastFontSize = fontSize; - lastFontFamily = fontFamily; - } - - var width = ctx.measureText(textDiv.textContent).width; - if (width > 0) { - textLayerFrag.appendChild(textDiv); - var transform; - if (textDiv.dataset.canvasWidth !== undefined) { - // Dataset values come of type string. - var textScale = textDiv.dataset.canvasWidth / width; - transform = 'scaleX(' + textScale + ')'; - } else { - transform = ''; - } - var rotation = textDiv.dataset.angle; - if (rotation) { - transform = 'rotate(' + rotation + 'deg) ' + transform; - } - if (transform) { - CustomStyle.setProp('transform' , textDiv, transform); - } - } - } - capability.resolve(); - } - - /** - * Text layer rendering task. - * - * @param {TextContent} textContent - * @param {HTMLElement} container - * @param {PDFJS.PageViewport} viewport - * @param {Array} textDivs - * @private - */ - function TextLayerRenderTask(textContent, container, viewport, textDivs) { - this._textContent = textContent; - this._container = container; - this._viewport = viewport; - textDivs = textDivs || []; - this._textDivs = textDivs; - this._canceled = false; - this._capability = createPromiseCapability(); - this._renderTimer = null; - } - TextLayerRenderTask.prototype = { - get promise() { - return this._capability.promise; - }, - - cancel: function TextLayer_cancel() { - this._canceled = true; - if (this._renderTimer !== null) { - clearTimeout(this._renderTimer); - this._renderTimer = null; - } - this._capability.reject('canceled'); - }, - - _render: function TextLayer_render(timeout) { - var textItems = this._textContent.items; - var styles = this._textContent.styles; - var textDivs = this._textDivs; - var viewport = this._viewport; - for (var i = 0, len = textItems.length; i < len; i++) { - appendText(textDivs, viewport, textItems[i], styles); - } - - if (!timeout) { // Render right away - render(this); - } else { // Schedule - var self = this; - this._renderTimer = setTimeout(function() { - render(self); - self._renderTimer = null; - }, timeout); - } - } - }; - - - /** - * Starts rendering of the text layer. - * - * @param {TextLayerRenderParameters} renderParameters - * @returns {TextLayerRenderTask} - */ - function renderTextLayer(renderParameters) { - var task = new TextLayerRenderTask(renderParameters.textContent, - renderParameters.container, - renderParameters.viewport, - renderParameters.textDivs); - task._render(renderParameters.timeout); - return task; - } - - return renderTextLayer; -})(); - -PDFJS.renderTextLayer = renderTextLayer; - -exports.renderTextLayer = renderTextLayer; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayWebGL = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var shadow = sharedUtil.shadow; - -var WebGLUtils = (function WebGLUtilsClosure() { - function loadShader(gl, code, shaderType) { - var shader = gl.createShader(shaderType); - gl.shaderSource(shader, code); - gl.compileShader(shader); - var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); - if (!compiled) { - var errorMsg = gl.getShaderInfoLog(shader); - throw new Error('Error during shader compilation: ' + errorMsg); - } - return shader; - } - function createVertexShader(gl, code) { - return loadShader(gl, code, gl.VERTEX_SHADER); - } - function createFragmentShader(gl, code) { - return loadShader(gl, code, gl.FRAGMENT_SHADER); - } - function createProgram(gl, shaders) { - var program = gl.createProgram(); - for (var i = 0, ii = shaders.length; i < ii; ++i) { - gl.attachShader(program, shaders[i]); - } - gl.linkProgram(program); - var linked = gl.getProgramParameter(program, gl.LINK_STATUS); - if (!linked) { - var errorMsg = gl.getProgramInfoLog(program); - throw new Error('Error during program linking: ' + errorMsg); - } - return program; - } - function createTexture(gl, image, textureId) { - gl.activeTexture(textureId); - var texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - - // Set the parameters so we can render any size image. - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - - // Upload the image into the texture. - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); - return texture; - } - - var currentGL, currentCanvas; - function generateGL() { - if (currentGL) { - return; - } - currentCanvas = document.createElement('canvas'); - currentGL = currentCanvas.getContext('webgl', - { premultipliedalpha: false }); - } - - var smaskVertexShaderCode = '\ - attribute vec2 a_position; \ - attribute vec2 a_texCoord; \ - \ - uniform vec2 u_resolution; \ - \ - varying vec2 v_texCoord; \ - \ - void main() { \ - vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0; \ - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ - \ - v_texCoord = a_texCoord; \ - } '; - - var smaskFragmentShaderCode = '\ - precision mediump float; \ - \ - uniform vec4 u_backdrop; \ - uniform int u_subtype; \ - uniform sampler2D u_image; \ - uniform sampler2D u_mask; \ - \ - varying vec2 v_texCoord; \ - \ - void main() { \ - vec4 imageColor = texture2D(u_image, v_texCoord); \ - vec4 maskColor = texture2D(u_mask, v_texCoord); \ - if (u_backdrop.a > 0.0) { \ - maskColor.rgb = maskColor.rgb * maskColor.a + \ - u_backdrop.rgb * (1.0 - maskColor.a); \ - } \ - float lum; \ - if (u_subtype == 0) { \ - lum = maskColor.a; \ - } else { \ - lum = maskColor.r * 0.3 + maskColor.g * 0.59 + \ - maskColor.b * 0.11; \ - } \ - imageColor.a *= lum; \ - imageColor.rgb *= imageColor.a; \ - gl_FragColor = imageColor; \ - } '; - - var smaskCache = null; - - function initSmaskGL() { - var canvas, gl; - - generateGL(); - canvas = currentCanvas; - currentCanvas = null; - gl = currentGL; - currentGL = null; - - // setup a GLSL program - var vertexShader = createVertexShader(gl, smaskVertexShaderCode); - var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); - gl.useProgram(program); - - var cache = {}; - cache.gl = gl; - cache.canvas = canvas; - cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); - cache.positionLocation = gl.getAttribLocation(program, 'a_position'); - cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop'); - cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype'); - - var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord'); - var texLayerLocation = gl.getUniformLocation(program, 'u_image'); - var texMaskLocation = gl.getUniformLocation(program, 'u_mask'); - - // provide texture coordinates for the rectangle. - var texCoordBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ - 0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, - 0.0, 1.0, - 1.0, 0.0, - 1.0, 1.0]), gl.STATIC_DRAW); - gl.enableVertexAttribArray(texCoordLocation); - gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0); - - gl.uniform1i(texLayerLocation, 0); - gl.uniform1i(texMaskLocation, 1); - - smaskCache = cache; - } - - function composeSMask(layer, mask, properties) { - var width = layer.width, height = layer.height; - - if (!smaskCache) { - initSmaskGL(); - } - var cache = smaskCache,canvas = cache.canvas, gl = cache.gl; - canvas.width = width; - canvas.height = height; - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - gl.uniform2f(cache.resolutionLocation, width, height); - - if (properties.backdrop) { - gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], - properties.backdrop[1], properties.backdrop[2], 1); - } else { - gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0); - } - gl.uniform1i(cache.subtypeLocation, - properties.subtype === 'Luminosity' ? 1 : 0); - - // Create a textures - var texture = createTexture(gl, layer, gl.TEXTURE0); - var maskTexture = createTexture(gl, mask, gl.TEXTURE1); - - - // Create a buffer and put a single clipspace rectangle in - // it (2 triangles) - var buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ - 0, 0, - width, 0, - 0, height, - 0, height, - width, 0, - width, height]), gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.positionLocation); - gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); - - // draw - gl.clearColor(0, 0, 0, 0); - gl.enable(gl.BLEND); - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - gl.clear(gl.COLOR_BUFFER_BIT); - - gl.drawArrays(gl.TRIANGLES, 0, 6); - - gl.flush(); - - gl.deleteTexture(texture); - gl.deleteTexture(maskTexture); - gl.deleteBuffer(buffer); - - return canvas; - } - - var figuresVertexShaderCode = '\ - attribute vec2 a_position; \ - attribute vec3 a_color; \ - \ - uniform vec2 u_resolution; \ - uniform vec2 u_scale; \ - uniform vec2 u_offset; \ - \ - varying vec4 v_color; \ - \ - void main() { \ - vec2 position = (a_position + u_offset) * u_scale; \ - vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0; \ - gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \ - \ - v_color = vec4(a_color / 255.0, 1.0); \ - } '; - - var figuresFragmentShaderCode = '\ - precision mediump float; \ - \ - varying vec4 v_color; \ - \ - void main() { \ - gl_FragColor = v_color; \ - } '; - - var figuresCache = null; - - function initFiguresGL() { - var canvas, gl; - - generateGL(); - canvas = currentCanvas; - currentCanvas = null; - gl = currentGL; - currentGL = null; - - // setup a GLSL program - var vertexShader = createVertexShader(gl, figuresVertexShaderCode); - var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode); - var program = createProgram(gl, [vertexShader, fragmentShader]); - gl.useProgram(program); - - var cache = {}; - cache.gl = gl; - cache.canvas = canvas; - cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution'); - cache.scaleLocation = gl.getUniformLocation(program, 'u_scale'); - cache.offsetLocation = gl.getUniformLocation(program, 'u_offset'); - cache.positionLocation = gl.getAttribLocation(program, 'a_position'); - cache.colorLocation = gl.getAttribLocation(program, 'a_color'); - - figuresCache = cache; - } - - function drawFigures(width, height, backgroundColor, figures, context) { - if (!figuresCache) { - initFiguresGL(); - } - var cache = figuresCache, canvas = cache.canvas, gl = cache.gl; - - canvas.width = width; - canvas.height = height; - gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight); - gl.uniform2f(cache.resolutionLocation, width, height); - - // count triangle points - var count = 0; - var i, ii, rows; - for (i = 0, ii = figures.length; i < ii; i++) { - switch (figures[i].type) { - case 'lattice': - rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0; - count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6; - break; - case 'triangles': - count += figures[i].coords.length; - break; - } - } - // transfer data - var coords = new Float32Array(count * 2); - var colors = new Uint8Array(count * 3); - var coordsMap = context.coords, colorsMap = context.colors; - var pIndex = 0, cIndex = 0; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], ps = figure.coords, cs = figure.colors; - switch (figure.type) { - case 'lattice': - var cols = figure.verticesPerRow; - rows = (ps.length / cols) | 0; - for (var row = 1; row < rows; row++) { - var offset = row * cols + 1; - for (var col = 1; col < cols; col++, offset++) { - coords[pIndex] = coordsMap[ps[offset - cols - 1]]; - coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1]; - coords[pIndex + 2] = coordsMap[ps[offset - cols]]; - coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1]; - coords[pIndex + 4] = coordsMap[ps[offset - 1]]; - coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1]; - colors[cIndex] = colorsMap[cs[offset - cols - 1]]; - colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1]; - colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2]; - colors[cIndex + 3] = colorsMap[cs[offset - cols]]; - colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1]; - colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2]; - colors[cIndex + 6] = colorsMap[cs[offset - 1]]; - colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1]; - colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2]; - - coords[pIndex + 6] = coords[pIndex + 2]; - coords[pIndex + 7] = coords[pIndex + 3]; - coords[pIndex + 8] = coords[pIndex + 4]; - coords[pIndex + 9] = coords[pIndex + 5]; - coords[pIndex + 10] = coordsMap[ps[offset]]; - coords[pIndex + 11] = coordsMap[ps[offset] + 1]; - colors[cIndex + 9] = colors[cIndex + 3]; - colors[cIndex + 10] = colors[cIndex + 4]; - colors[cIndex + 11] = colors[cIndex + 5]; - colors[cIndex + 12] = colors[cIndex + 6]; - colors[cIndex + 13] = colors[cIndex + 7]; - colors[cIndex + 14] = colors[cIndex + 8]; - colors[cIndex + 15] = colorsMap[cs[offset]]; - colors[cIndex + 16] = colorsMap[cs[offset] + 1]; - colors[cIndex + 17] = colorsMap[cs[offset] + 2]; - pIndex += 12; - cIndex += 18; - } - } - break; - case 'triangles': - for (var j = 0, jj = ps.length; j < jj; j++) { - coords[pIndex] = coordsMap[ps[j]]; - coords[pIndex + 1] = coordsMap[ps[j] + 1]; - colors[cIndex] = colorsMap[cs[j]]; - colors[cIndex + 1] = colorsMap[cs[j] + 1]; - colors[cIndex + 2] = colorsMap[cs[j] + 2]; - pIndex += 2; - cIndex += 3; - } - break; - } - } - - // draw - if (backgroundColor) { - gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, - backgroundColor[2] / 255, 1.0); - } else { - gl.clearColor(0, 0, 0, 0); - } - gl.clear(gl.COLOR_BUFFER_BIT); - - var coordsBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer); - gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.positionLocation); - gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0); - - var colorsBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer); - gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW); - gl.enableVertexAttribArray(cache.colorLocation); - gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, - 0, 0); - - gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY); - gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY); - - gl.drawArrays(gl.TRIANGLES, 0, count); - - gl.flush(); - - gl.deleteBuffer(coordsBuffer); - gl.deleteBuffer(colorsBuffer); - - return canvas; - } - - function cleanup() { - if (smaskCache && smaskCache.canvas) { - smaskCache.canvas.width = 0; - smaskCache.canvas.height = 0; - } - if (figuresCache && figuresCache.canvas) { - figuresCache.canvas.width = 0; - figuresCache.canvas.height = 0; - } - smaskCache = null; - figuresCache = null; - } - - return { - get isEnabled() { - if (PDFJS.disableWebGL) { - return false; - } - var enabled = false; - try { - generateGL(); - enabled = !!currentGL; - } catch (e) { } - return shadow(this, 'isEnabled', enabled); - }, - composeSMask: composeSMask, - drawFigures: drawFigures, - clear: cleanup - }; -})(); - -exports.WebGLUtils = WebGLUtils; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayPatternHelper = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayWebGL); - } -}(this, function (exports, sharedUtil, displayWebGL) { - -var Util = sharedUtil.Util; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var error = sharedUtil.error; -var WebGLUtils = displayWebGL.WebGLUtils; - -var ShadingIRs = {}; - -ShadingIRs.RadialAxial = { - fromIR: function RadialAxial_fromIR(raw) { - var type = raw[1]; - var colorStops = raw[2]; - var p0 = raw[3]; - var p1 = raw[4]; - var r0 = raw[5]; - var r1 = raw[6]; - return { - type: 'Pattern', - getPattern: function RadialAxial_getPattern(ctx) { - var grad; - if (type === 'axial') { - grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); - } else if (type === 'radial') { - grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); - } - - for (var i = 0, ii = colorStops.length; i < ii; ++i) { - var c = colorStops[i]; - grad.addColorStop(c[0], c[1]); - } - return grad; - } - }; - } -}; - -var createMeshCanvas = (function createMeshCanvasClosure() { - function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) { - // Very basic Gouraud-shaded triangle rasterization algorithm. - var coords = context.coords, colors = context.colors; - var bytes = data.data, rowSize = data.width * 4; - var tmp; - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; - } - if (coords[p2 + 1] > coords[p3 + 1]) { - tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp; - } - if (coords[p1 + 1] > coords[p2 + 1]) { - tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp; - } - var x1 = (coords[p1] + context.offsetX) * context.scaleX; - var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY; - var x2 = (coords[p2] + context.offsetX) * context.scaleX; - var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY; - var x3 = (coords[p3] + context.offsetX) * context.scaleX; - var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY; - if (y1 >= y3) { - return; - } - var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2]; - var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2]; - var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2]; - - var minY = Math.round(y1), maxY = Math.round(y3); - var xa, car, cag, cab; - var xb, cbr, cbg, cbb; - var k; - for (var y = minY; y <= maxY; y++) { - if (y < y2) { - k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2); - xa = x1 - (x1 - x2) * k; - car = c1r - (c1r - c2r) * k; - cag = c1g - (c1g - c2g) * k; - cab = c1b - (c1b - c2b) * k; - } else { - k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3); - xa = x2 - (x2 - x3) * k; - car = c2r - (c2r - c3r) * k; - cag = c2g - (c2g - c3g) * k; - cab = c2b - (c2b - c3b) * k; - } - k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3); - xb = x1 - (x1 - x3) * k; - cbr = c1r - (c1r - c3r) * k; - cbg = c1g - (c1g - c3g) * k; - cbb = c1b - (c1b - c3b) * k; - var x1_ = Math.round(Math.min(xa, xb)); - var x2_ = Math.round(Math.max(xa, xb)); - var j = rowSize * y + x1_ * 4; - for (var x = x1_; x <= x2_; x++) { - k = (xa - x) / (xa - xb); - k = k < 0 ? 0 : k > 1 ? 1 : k; - bytes[j++] = (car - (car - cbr) * k) | 0; - bytes[j++] = (cag - (cag - cbg) * k) | 0; - bytes[j++] = (cab - (cab - cbb) * k) | 0; - bytes[j++] = 255; - } - } - } - - function drawFigure(data, figure, context) { - var ps = figure.coords; - var cs = figure.colors; - var i, ii; - switch (figure.type) { - case 'lattice': - var verticesPerRow = figure.verticesPerRow; - var rows = Math.floor(ps.length / verticesPerRow) - 1; - var cols = verticesPerRow - 1; - for (i = 0; i < rows; i++) { - var q = i * verticesPerRow; - for (var j = 0; j < cols; j++, q++) { - drawTriangle(data, context, - ps[q], ps[q + 1], ps[q + verticesPerRow], - cs[q], cs[q + 1], cs[q + verticesPerRow]); - drawTriangle(data, context, - ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], - cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]); - } - } - break; - case 'triangles': - for (i = 0, ii = ps.length; i < ii; i += 3) { - drawTriangle(data, context, - ps[i], ps[i + 1], ps[i + 2], - cs[i], cs[i + 1], cs[i + 2]); - } - break; - default: - error('illigal figure'); - break; - } - } - - function createMeshCanvas(bounds, combinesScale, coords, colors, figures, - backgroundColor, cachedCanvases) { - // we will increase scale on some weird factor to let antialiasing take - // care of "rough" edges - var EXPECTED_SCALE = 1.1; - // MAX_PATTERN_SIZE is used to avoid OOM situation. - var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough - - var offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var boundsWidth = Math.ceil(bounds[2]) - offsetX; - var boundsHeight = Math.ceil(bounds[3]) - offsetY; - - var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * - EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * - EXPECTED_SCALE)), MAX_PATTERN_SIZE); - var scaleX = boundsWidth / width; - var scaleY = boundsHeight / height; - - var context = { - coords: coords, - colors: colors, - offsetX: -offsetX, - offsetY: -offsetY, - scaleX: 1 / scaleX, - scaleY: 1 / scaleY - }; - - var canvas, tmpCanvas, i, ii; - if (WebGLUtils.isEnabled) { - canvas = WebGLUtils.drawFigures(width, height, backgroundColor, - figures, context); - - // https://bugzilla.mozilla.org/show_bug.cgi?id=972126 - tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false); - tmpCanvas.context.drawImage(canvas, 0, 0); - canvas = tmpCanvas.canvas; - } else { - tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false); - var tmpCtx = tmpCanvas.context; - - var data = tmpCtx.createImageData(width, height); - if (backgroundColor) { - var bytes = data.data; - for (i = 0, ii = bytes.length; i < ii; i += 4) { - bytes[i] = backgroundColor[0]; - bytes[i + 1] = backgroundColor[1]; - bytes[i + 2] = backgroundColor[2]; - bytes[i + 3] = 255; - } - } - for (i = 0; i < figures.length; i++) { - drawFigure(data, figures[i], context); - } - tmpCtx.putImageData(data, 0, 0); - canvas = tmpCanvas.canvas; - } - - return {canvas: canvas, offsetX: offsetX, offsetY: offsetY, - scaleX: scaleX, scaleY: scaleY}; - } - return createMeshCanvas; -})(); - -ShadingIRs.Mesh = { - fromIR: function Mesh_fromIR(raw) { - //var type = raw[1]; - var coords = raw[2]; - var colors = raw[3]; - var figures = raw[4]; - var bounds = raw[5]; - var matrix = raw[6]; - //var bbox = raw[7]; - var background = raw[8]; - return { - type: 'Pattern', - getPattern: function Mesh_getPattern(ctx, owner, shadingFill) { - var scale; - if (shadingFill) { - scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform); - } else { - // Obtain scale from matrix and current transformation matrix. - scale = Util.singularValueDecompose2dScale(owner.baseTransform); - if (matrix) { - var matrixScale = Util.singularValueDecompose2dScale(matrix); - scale = [scale[0] * matrixScale[0], - scale[1] * matrixScale[1]]; - } - } - - - // Rasterizing on the main thread since sending/queue large canvases - // might cause OOM. - var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, - colors, figures, shadingFill ? null : background, - owner.cachedCanvases); - - if (!shadingFill) { - ctx.setTransform.apply(ctx, owner.baseTransform); - if (matrix) { - ctx.transform.apply(ctx, matrix); - } - } - - ctx.translate(temporaryPatternCanvas.offsetX, - temporaryPatternCanvas.offsetY); - ctx.scale(temporaryPatternCanvas.scaleX, - temporaryPatternCanvas.scaleY); - - return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat'); - } - }; - } -}; - -ShadingIRs.Dummy = { - fromIR: function Dummy_fromIR() { - return { - type: 'Pattern', - getPattern: function Dummy_fromIR_getPattern() { - return 'hotpink'; - } - }; - } -}; - -function getShadingPatternFromIR(raw) { - var shadingIR = ShadingIRs[raw[0]]; - if (!shadingIR) { - error('Unknown IR type: ' + raw[0]); - } - return shadingIR.fromIR(raw); -} - -var TilingPattern = (function TilingPatternClosure() { - var PaintType = { - COLORED: 1, - UNCOLORED: 2 - }; - - var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough - - function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) { - this.operatorList = IR[2]; - this.matrix = IR[3] || [1, 0, 0, 1, 0, 0]; - this.bbox = IR[4]; - this.xstep = IR[5]; - this.ystep = IR[6]; - this.paintType = IR[7]; - this.tilingType = IR[8]; - this.color = color; - this.canvasGraphicsFactory = canvasGraphicsFactory; - this.baseTransform = baseTransform; - this.type = 'Pattern'; - this.ctx = ctx; - } - - TilingPattern.prototype = { - createPatternCanvas: function TilinPattern_createPatternCanvas(owner) { - var operatorList = this.operatorList; - var bbox = this.bbox; - var xstep = this.xstep; - var ystep = this.ystep; - var paintType = this.paintType; - var tilingType = this.tilingType; - var color = this.color; - var canvasGraphicsFactory = this.canvasGraphicsFactory; - - info('TilingType: ' + tilingType); - - var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; - - var topLeft = [x0, y0]; - // we want the canvas to be as large as the step size - var botRight = [x0 + xstep, y0 + ystep]; - - var width = botRight[0] - topLeft[0]; - var height = botRight[1] - topLeft[1]; - - // Obtain scale from matrix and current transformation matrix. - var matrixScale = Util.singularValueDecompose2dScale(this.matrix); - var curMatrixScale = Util.singularValueDecompose2dScale( - this.baseTransform); - var combinedScale = [matrixScale[0] * curMatrixScale[0], - matrixScale[1] * curMatrixScale[1]]; - - // MAX_PATTERN_SIZE is used to avoid OOM situation. - // Use width and height values that are as close as possible to the end - // result when the pattern is used. Too low value makes the pattern look - // blurry. Too large value makes it look too crispy. - width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), - MAX_PATTERN_SIZE); - - height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), - MAX_PATTERN_SIZE); - - var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', - width, height, true); - var tmpCtx = tmpCanvas.context; - var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx); - graphics.groupLevel = owner.groupLevel; - - this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color); - - this.setScale(width, height, xstep, ystep); - this.transformToScale(graphics); - - // transform coordinates to pattern space - var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]]; - graphics.transform.apply(graphics, tmpTranslate); - - this.clipBbox(graphics, bbox, x0, y0, x1, y1); - - graphics.executeOperatorList(operatorList); - return tmpCanvas.canvas; - }, - - setScale: function TilingPattern_setScale(width, height, xstep, ystep) { - this.scale = [width / xstep, height / ystep]; - }, - - transformToScale: function TilingPattern_transformToScale(graphics) { - var scale = this.scale; - var tmpScale = [scale[0], 0, 0, scale[1], 0, 0]; - graphics.transform.apply(graphics, tmpScale); - }, - - scaleToContext: function TilingPattern_scaleToContext() { - var scale = this.scale; - this.ctx.scale(1 / scale[0], 1 / scale[1]); - }, - - clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) { - if (bbox && isArray(bbox) && bbox.length === 4) { - var bboxWidth = x1 - x0; - var bboxHeight = y1 - y0; - graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight); - graphics.clip(); - graphics.endPath(); - } - }, - - setFillAndStrokeStyleToContext: - function setFillAndStrokeStyleToContext(context, paintType, color) { - switch (paintType) { - case PaintType.COLORED: - var ctx = this.ctx; - context.fillStyle = ctx.fillStyle; - context.strokeStyle = ctx.strokeStyle; - break; - case PaintType.UNCOLORED: - var cssColor = Util.makeCssRgb(color[0], color[1], color[2]); - context.fillStyle = cssColor; - context.strokeStyle = cssColor; - break; - default: - error('Unsupported paint type: ' + paintType); - } - }, - - getPattern: function TilingPattern_getPattern(ctx, owner) { - var temporaryPatternCanvas = this.createPatternCanvas(owner); - - ctx = this.ctx; - ctx.setTransform.apply(ctx, this.baseTransform); - ctx.transform.apply(ctx, this.matrix); - this.scaleToContext(); - - return ctx.createPattern(temporaryPatternCanvas, 'repeat'); - } - }; - - return TilingPattern; -})(); - -exports.getShadingPatternFromIR = getShadingPatternFromIR; -exports.TilingPattern = TilingPattern; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayCanvas = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayPatternHelper, root.pdfjsDisplayWebGL); - } -}(this, function (exports, sharedUtil, displayPatternHelper, displayWebGL) { - -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; -var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; -var ImageKind = sharedUtil.ImageKind; -var OPS = sharedUtil.OPS; -var TextRenderingMode = sharedUtil.TextRenderingMode; -var Uint32ArrayView = sharedUtil.Uint32ArrayView; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var info = sharedUtil.info; -var isNum = sharedUtil.isNum; -var isArray = sharedUtil.isArray; -var error = sharedUtil.error; -var shadow = sharedUtil.shadow; -var warn = sharedUtil.warn; -var TilingPattern = displayPatternHelper.TilingPattern; -var getShadingPatternFromIR = displayPatternHelper.getShadingPatternFromIR; -var WebGLUtils = displayWebGL.WebGLUtils; - -// contexts store most of the state we need natively. -// However, PDF needs a bit more state, which we store here. - -// Minimal font size that would be used during canvas fillText operations. -var MIN_FONT_SIZE = 16; -// Maximum font size that would be used during canvas fillText operations. -var MAX_FONT_SIZE = 100; -var MAX_GROUP_SIZE = 4096; - -// Heuristic value used when enforcing minimum line widths. -var MIN_WIDTH_FACTOR = 0.65; - -var COMPILE_TYPE3_GLYPHS = true; -var MAX_SIZE_TO_COMPILE = 1000; - -var FULL_CHUNK_HEIGHT = 16; - -function createScratchCanvas(width, height) { - var canvas = document.createElement('canvas'); - canvas.width = width; - canvas.height = height; - return canvas; -} - -function addContextCurrentTransform(ctx) { - // If the context doesn't expose a `mozCurrentTransform`, add a JS based one. - if (!ctx.mozCurrentTransform) { - ctx._originalSave = ctx.save; - ctx._originalRestore = ctx.restore; - ctx._originalRotate = ctx.rotate; - ctx._originalScale = ctx.scale; - ctx._originalTranslate = ctx.translate; - ctx._originalTransform = ctx.transform; - ctx._originalSetTransform = ctx.setTransform; - - ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0]; - ctx._transformStack = []; - - Object.defineProperty(ctx, 'mozCurrentTransform', { - get: function getCurrentTransform() { - return this._transformMatrix; - } - }); - - Object.defineProperty(ctx, 'mozCurrentTransformInverse', { - get: function getCurrentTransformInverse() { - // Calculation done using WolframAlpha: - // http://www.wolframalpha.com/input/? - // i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}} - - var m = this._transformMatrix; - var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5]; - - var ad_bc = a * d - b * c; - var bc_ad = b * c - a * d; - - return [ - d / ad_bc, - b / bc_ad, - c / bc_ad, - a / ad_bc, - (d * e - c * f) / bc_ad, - (b * e - a * f) / ad_bc - ]; - } - }); - - ctx.save = function ctxSave() { - var old = this._transformMatrix; - this._transformStack.push(old); - this._transformMatrix = old.slice(0, 6); - - this._originalSave(); - }; - - ctx.restore = function ctxRestore() { - var prev = this._transformStack.pop(); - if (prev) { - this._transformMatrix = prev; - this._originalRestore(); - } - }; - - ctx.translate = function ctxTranslate(x, y) { - var m = this._transformMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - - this._originalTranslate(x, y); - }; - - ctx.scale = function ctxScale(x, y) { - var m = this._transformMatrix; - m[0] = m[0] * x; - m[1] = m[1] * x; - m[2] = m[2] * y; - m[3] = m[3] * y; - - this._originalScale(x, y); - }; - - ctx.transform = function ctxTransform(a, b, c, d, e, f) { - var m = this._transformMatrix; - this._transformMatrix = [ - m[0] * a + m[2] * b, - m[1] * a + m[3] * b, - m[0] * c + m[2] * d, - m[1] * c + m[3] * d, - m[0] * e + m[2] * f + m[4], - m[1] * e + m[3] * f + m[5] - ]; - - ctx._originalTransform(a, b, c, d, e, f); - }; - - ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) { - this._transformMatrix = [a, b, c, d, e, f]; - - ctx._originalSetTransform(a, b, c, d, e, f); - }; - - ctx.rotate = function ctxRotate(angle) { - var cosValue = Math.cos(angle); - var sinValue = Math.sin(angle); - - var m = this._transformMatrix; - this._transformMatrix = [ - m[0] * cosValue + m[2] * sinValue, - m[1] * cosValue + m[3] * sinValue, - m[0] * (-sinValue) + m[2] * cosValue, - m[1] * (-sinValue) + m[3] * cosValue, - m[4], - m[5] - ]; - - this._originalRotate(angle); - }; - } -} - -var CachedCanvases = (function CachedCanvasesClosure() { - function CachedCanvases() { - this.cache = Object.create(null); - } - CachedCanvases.prototype = { - getCanvas: function CachedCanvases_getCanvas(id, width, height, - trackTransform) { - var canvasEntry; - if (this.cache[id] !== undefined) { - canvasEntry = this.cache[id]; - canvasEntry.canvas.width = width; - canvasEntry.canvas.height = height; - // reset canvas transform for emulated mozCurrentTransform, if needed - canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0); - } else { - var canvas = createScratchCanvas(width, height); - var ctx = canvas.getContext('2d'); - if (trackTransform) { - addContextCurrentTransform(ctx); - } - this.cache[id] = canvasEntry = {canvas: canvas, context: ctx}; - } - return canvasEntry; - }, - clear: function () { - for (var id in this.cache) { - var canvasEntry = this.cache[id]; - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - canvasEntry.canvas.width = 0; - canvasEntry.canvas.height = 0; - delete this.cache[id]; - } - } - }; - return CachedCanvases; -})(); - -function compileType3Glyph(imgData) { - var POINT_TO_PROCESS_LIMIT = 1000; - - var width = imgData.width, height = imgData.height; - var i, j, j0, width1 = width + 1; - var points = new Uint8Array(width1 * (height + 1)); - var POINT_TYPES = - new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]); - - // decodes bit-packed mask data - var lineSize = (width + 7) & ~7, data0 = imgData.data; - var data = new Uint8Array(lineSize * height), pos = 0, ii; - for (i = 0, ii = data0.length; i < ii; i++) { - var mask = 128, elem = data0[i]; - while (mask > 0) { - data[pos++] = (elem & mask) ? 0 : 255; - mask >>= 1; - } - } - - // finding iteresting points: every point is located between mask pixels, - // so there will be points of the (width + 1)x(height + 1) grid. Every point - // will have flags assigned based on neighboring mask pixels: - // 4 | 8 - // --P-- - // 2 | 1 - // We are interested only in points with the flags: - // - outside corners: 1, 2, 4, 8; - // - inside corners: 7, 11, 13, 14; - // - and, intersections: 5, 10. - var count = 0; - pos = 0; - if (data[pos] !== 0) { - points[0] = 1; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j] = data[pos] ? 2 : 1; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j] = 2; - ++count; - } - for (i = 1; i < height; i++) { - pos = i * lineSize; - j0 = i * width1; - if (data[pos - lineSize] !== data[pos]) { - points[j0] = data[pos] ? 1 : 8; - ++count; - } - // 'sum' is the position of the current pixel configuration in the 'TYPES' - // array (in order 8-1-2-4, so we can use '>>2' to shift the column). - var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0); - for (j = 1; j < width; j++) { - sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + - (data[pos - lineSize + 1] ? 8 : 0); - if (POINT_TYPES[sum]) { - points[j0 + j] = POINT_TYPES[sum]; - ++count; - } - pos++; - } - if (data[pos - lineSize] !== data[pos]) { - points[j0 + j] = data[pos] ? 2 : 4; - ++count; - } - - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - } - - pos = lineSize * (height - 1); - j0 = i * width1; - if (data[pos] !== 0) { - points[j0] = 8; - ++count; - } - for (j = 1; j < width; j++) { - if (data[pos] !== data[pos + 1]) { - points[j0 + j] = data[pos] ? 4 : 8; - ++count; - } - pos++; - } - if (data[pos] !== 0) { - points[j0 + j] = 4; - ++count; - } - if (count > POINT_TO_PROCESS_LIMIT) { - return null; - } - - // building outlines - var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]); - var outlines = []; - for (i = 0; count && i <= height; i++) { - var p = i * width1; - var end = p + width; - while (p < end && !points[p]) { - p++; - } - if (p === end) { - continue; - } - var coords = [p % width1, i]; - - var type = points[p], p0 = p, pp; - do { - var step = steps[type]; - do { - p += step; - } while (!points[p]); - - pp = points[p]; - if (pp !== 5 && pp !== 10) { - // set new direction - type = pp; - // delete mark - points[p] = 0; - } else { // type is 5 or 10, ie, a crossing - // set new direction - type = pp & ((0x33 * type) >> 4); - // set new type for "future hit" - points[p] &= (type >> 2 | type << 2); - } - - coords.push(p % width1); - coords.push((p / width1) | 0); - --count; - } while (p0 !== p); - outlines.push(coords); - --i; - } - - var drawOutline = function(c) { - c.save(); - // the path shall be painted in [0..1]x[0..1] space - c.scale(1 / width, -1 / height); - c.translate(0, -height); - c.beginPath(); - for (var i = 0, ii = outlines.length; i < ii; i++) { - var o = outlines[i]; - c.moveTo(o[0], o[1]); - for (var j = 2, jj = o.length; j < jj; j += 2) { - c.lineTo(o[j], o[j+1]); - } - } - c.fill(); - c.beginPath(); - c.restore(); - }; - - return drawOutline; -} - -var CanvasExtraState = (function CanvasExtraStateClosure() { - function CanvasExtraState(old) { - // Are soft masks and alpha values shapes or opacities? - this.alphaIsShape = false; - this.fontSize = 0; - this.fontSizeScale = 1; - this.textMatrix = IDENTITY_MATRIX; - this.textMatrixScale = 1; - this.fontMatrix = FONT_IDENTITY_MATRIX; - this.leading = 0; - // Current point (in user coordinates) - this.x = 0; - this.y = 0; - // Start of text line (in text coordinates) - this.lineX = 0; - this.lineY = 0; - // Character and word spacing - this.charSpacing = 0; - this.wordSpacing = 0; - this.textHScale = 1; - this.textRenderingMode = TextRenderingMode.FILL; - this.textRise = 0; - // Default fore and background colors - this.fillColor = '#000000'; - this.strokeColor = '#000000'; - this.patternFill = false; - // Note: fill alpha applies to all non-stroking operations - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - this.activeSMask = null; // nonclonable field (see the save method below) - - this.old = old; - } - - CanvasExtraState.prototype = { - clone: function CanvasExtraState_clone() { - return Object.create(this); - }, - setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) { - this.x = x; - this.y = y; - } - }; - return CanvasExtraState; -})(); - -var CanvasGraphics = (function CanvasGraphicsClosure() { - // Defines the time the executeOperatorList is going to be executing - // before it stops and shedules a continue of execution. - var EXECUTION_TIME = 15; - // Defines the number of steps before checking the execution time - var EXECUTION_STEPS = 10; - - function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) { - this.ctx = canvasCtx; - this.current = new CanvasExtraState(); - this.stateStack = []; - this.pendingClip = null; - this.pendingEOFill = false; - this.res = null; - this.xobjs = null; - this.commonObjs = commonObjs; - this.objs = objs; - this.imageLayer = imageLayer; - this.groupStack = []; - this.processingType3 = null; - // Patterns are painted relative to the initial page/form transform, see pdf - // spec 8.7.2 NOTE 1. - this.baseTransform = null; - this.baseTransformStack = []; - this.groupLevel = 0; - this.smaskStack = []; - this.smaskCounter = 0; - this.tempSMask = null; - this.cachedCanvases = new CachedCanvases(); - if (canvasCtx) { - // NOTE: if mozCurrentTransform is polyfilled, then the current state of - // the transformation must already be set in canvasCtx._transformMatrix. - addContextCurrentTransform(canvasCtx); - } - this.cachedGetSinglePixelWidth = null; - } - - function putBinaryImageData(ctx, imgData) { - if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) { - ctx.putImageData(imgData, 0, 0); - return; - } - - // Put the image data to the canvas in chunks, rather than putting the - // whole image at once. This saves JS memory, because the ImageData object - // is smaller. It also possibly saves C++ memory within the implementation - // of putImageData(). (E.g. in Firefox we make two short-lived copies of - // the data passed to putImageData()). |n| shouldn't be too small, however, - // because too many putImageData() calls will slow things down. - // - // Note: as written, if the last chunk is partial, the putImageData() call - // will (conceptually) put pixels past the bounds of the canvas. But - // that's ok; any such pixels are ignored. - - var height = imgData.height, width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0, destPos; - var src = imgData.data; - var dest = chunkImgData.data; - var i, j, thisChunkHeight, elemsInThisChunk; - - // There are multiple forms in which the pixel data can be passed, and - // imgData.kind tells us which one this is. - if (imgData.kind === ImageKind.GRAYSCALE_1BPP) { - // Grayscale, 1 bit per pixel (i.e. black-and-white). - var srcLength = src.byteLength; - var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) : - new Uint32ArrayView(dest); - var dest32DataLength = dest32.length; - var fullSrcDiff = (width + 7) >> 3; - var white = 0xFFFFFFFF; - var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ? - 0xFF000000 : 0x000000FF; - for (i = 0; i < totalChunks; i++) { - thisChunkHeight = - (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; - destPos = 0; - for (j = 0; j < thisChunkHeight; j++) { - var srcDiff = srcLength - srcPos; - var k = 0; - var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7; - var kEndUnrolled = kEnd & ~7; - var mask = 0; - var srcByte = 0; - for (; k < kEndUnrolled; k += 8) { - srcByte = src[srcPos++]; - dest32[destPos++] = (srcByte & 128) ? white : black; - dest32[destPos++] = (srcByte & 64) ? white : black; - dest32[destPos++] = (srcByte & 32) ? white : black; - dest32[destPos++] = (srcByte & 16) ? white : black; - dest32[destPos++] = (srcByte & 8) ? white : black; - dest32[destPos++] = (srcByte & 4) ? white : black; - dest32[destPos++] = (srcByte & 2) ? white : black; - dest32[destPos++] = (srcByte & 1) ? white : black; - } - for (; k < kEnd; k++) { - if (mask === 0) { - srcByte = src[srcPos++]; - mask = 128; - } - - dest32[destPos++] = (srcByte & mask) ? white : black; - mask >>= 1; - } - } - // We ran out of input. Make all remaining pixels transparent. - while (destPos < dest32DataLength) { - dest32[destPos++] = 0; - } - - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else if (imgData.kind === ImageKind.RGBA_32BPP) { - // RGBA, 32-bits per pixel. - - j = 0; - elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; - for (i = 0; i < fullChunks; i++) { - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - srcPos += elemsInThisChunk; - - ctx.putImageData(chunkImgData, 0, j); - j += FULL_CHUNK_HEIGHT; - } - if (i < totalChunks) { - elemsInThisChunk = width * partialChunkHeight * 4; - dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); - ctx.putImageData(chunkImgData, 0, j); - } - - } else if (imgData.kind === ImageKind.RGB_24BPP) { - // RGB, 24-bits per pixel. - thisChunkHeight = FULL_CHUNK_HEIGHT; - elemsInThisChunk = width * thisChunkHeight; - for (i = 0; i < totalChunks; i++) { - if (i >= fullChunks) { - thisChunkHeight = partialChunkHeight; - elemsInThisChunk = width * thisChunkHeight; - } - - destPos = 0; - for (j = elemsInThisChunk; j--;) { - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = src[srcPos++]; - dest[destPos++] = 255; - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } else { - error('bad image kind: ' + imgData.kind); - } - } - - function putBinaryImageMask(ctx, imgData) { - var height = imgData.height, width = imgData.width; - var partialChunkHeight = height % FULL_CHUNK_HEIGHT; - var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT; - var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1; - - var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT); - var srcPos = 0; - var src = imgData.data; - var dest = chunkImgData.data; - - for (var i = 0; i < totalChunks; i++) { - var thisChunkHeight = - (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight; - - // Expand the mask so it can be used by the canvas. Any required - // inversion has already been handled. - var destPos = 3; // alpha component offset - for (var j = 0; j < thisChunkHeight; j++) { - var mask = 0; - for (var k = 0; k < width; k++) { - if (!mask) { - var elem = src[srcPos++]; - mask = 128; - } - dest[destPos] = (elem & mask) ? 0 : 255; - destPos += 4; - mask >>= 1; - } - } - ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); - } - } - - function copyCtxState(sourceCtx, destCtx) { - var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha', - 'lineWidth', 'lineCap', 'lineJoin', 'miterLimit', - 'globalCompositeOperation', 'font']; - for (var i = 0, ii = properties.length; i < ii; i++) { - var property = properties[i]; - if (sourceCtx[property] !== undefined) { - destCtx[property] = sourceCtx[property]; - } - } - if (sourceCtx.setLineDash !== undefined) { - destCtx.setLineDash(sourceCtx.getLineDash()); - destCtx.lineDashOffset = sourceCtx.lineDashOffset; - } else if (sourceCtx.mozDashOffset !== undefined) { - destCtx.mozDash = sourceCtx.mozDash; - destCtx.mozDashOffset = sourceCtx.mozDashOffset; - } - } - - function composeSMaskBackdrop(bytes, r0, g0, b0) { - var length = bytes.length; - for (var i = 3; i < length; i += 4) { - var alpha = bytes[i]; - if (alpha === 0) { - bytes[i - 3] = r0; - bytes[i - 2] = g0; - bytes[i - 1] = b0; - } else if (alpha < 255) { - var alpha_ = 255 - alpha; - bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8; - bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8; - bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8; - } - } - } - - function composeSMaskAlpha(maskData, layerData, transferMap) { - var length = maskData.length; - var scale = 1 / 255; - for (var i = 3; i < length; i += 4) { - var alpha = transferMap ? transferMap[maskData[i]] : maskData[i]; - layerData[i] = (layerData[i] * alpha * scale) | 0; - } - } - - function composeSMaskLuminosity(maskData, layerData, transferMap) { - var length = maskData.length; - for (var i = 3; i < length; i += 4) { - var y = (maskData[i - 3] * 77) + // * 0.3 / 255 * 0x10000 - (maskData[i - 2] * 152) + // * 0.59 .... - (maskData[i - 1] * 28); // * 0.11 .... - layerData[i] = transferMap ? - (layerData[i] * transferMap[y >> 8]) >> 8 : - (layerData[i] * y) >> 16; - } - } - - function genericComposeSMask(maskCtx, layerCtx, width, height, - subtype, backdrop, transferMap) { - var hasBackdrop = !!backdrop; - var r0 = hasBackdrop ? backdrop[0] : 0; - var g0 = hasBackdrop ? backdrop[1] : 0; - var b0 = hasBackdrop ? backdrop[2] : 0; - - var composeFn; - if (subtype === 'Luminosity') { - composeFn = composeSMaskLuminosity; - } else { - composeFn = composeSMaskAlpha; - } - - // processing image in chunks to save memory - var PIXELS_TO_PROCESS = 1048576; - var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width)); - for (var row = 0; row < height; row += chunkSize) { - var chunkHeight = Math.min(chunkSize, height - row); - var maskData = maskCtx.getImageData(0, row, width, chunkHeight); - var layerData = layerCtx.getImageData(0, row, width, chunkHeight); - - if (hasBackdrop) { - composeSMaskBackdrop(maskData.data, r0, g0, b0); - } - composeFn(maskData.data, layerData.data, transferMap); - - maskCtx.putImageData(layerData, 0, row); - } - } - - function composeSMask(ctx, smask, layerCtx) { - var mask = smask.canvas; - var maskCtx = smask.context; - - ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, - smask.offsetX, smask.offsetY); - - var backdrop = smask.backdrop || null; - if (!smask.transferMap && WebGLUtils.isEnabled) { - var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask, - {subtype: smask.subtype, backdrop: backdrop}); - ctx.setTransform(1, 0, 0, 1, 0, 0); - ctx.drawImage(composed, smask.offsetX, smask.offsetY); - return; - } - genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, - smask.subtype, backdrop, smask.transferMap); - ctx.drawImage(mask, 0, 0); - } - - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var NORMAL_CLIP = {}; - var EO_CLIP = {}; - - CanvasGraphics.prototype = { - - beginDrawing: function CanvasGraphics_beginDrawing(transform, viewport, - transparency) { - // For pdfs that use blend modes we have to clear the canvas else certain - // blend modes can look wrong since we'd be blending with a white - // backdrop. The problem with a transparent backdrop though is we then - // don't get sub pixel anti aliasing on text, creating temporary - // transparent canvas when we have blend modes. - var width = this.ctx.canvas.width; - var height = this.ctx.canvas.height; - - this.ctx.save(); - this.ctx.fillStyle = 'rgb(255, 255, 255)'; - this.ctx.fillRect(0, 0, width, height); - this.ctx.restore(); - - if (transparency) { - var transparentCanvas = this.cachedCanvases.getCanvas( - 'transparent', width, height, true); - this.compositeCtx = this.ctx; - this.transparentCanvas = transparentCanvas.canvas; - this.ctx = transparentCanvas.context; - this.ctx.save(); - // The transform can be applied before rendering, transferring it to - // the new canvas. - this.ctx.transform.apply(this.ctx, - this.compositeCtx.mozCurrentTransform); - } - - this.ctx.save(); - if (transform) { - this.ctx.transform.apply(this.ctx, transform); - } - this.ctx.transform.apply(this.ctx, viewport.transform); - - this.baseTransform = this.ctx.mozCurrentTransform.slice(); - - if (this.imageLayer) { - this.imageLayer.beginLayout(); - } - }, - - executeOperatorList: function CanvasGraphics_executeOperatorList( - operatorList, - executionStartIdx, continueCallback, - stepper) { - var argsArray = operatorList.argsArray; - var fnArray = operatorList.fnArray; - var i = executionStartIdx || 0; - var argsArrayLen = argsArray.length; - - // Sometimes the OperatorList to execute is empty. - if (argsArrayLen === i) { - return i; - } - - var chunkOperations = (argsArrayLen - i > EXECUTION_STEPS && - typeof continueCallback === 'function'); - var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0; - var steps = 0; - - var commonObjs = this.commonObjs; - var objs = this.objs; - var fnId; - - while (true) { - if (stepper !== undefined && i === stepper.nextBreakPoint) { - stepper.breakIt(i, continueCallback); - return i; - } - - fnId = fnArray[i]; - - if (fnId !== OPS.dependency) { - this[fnId].apply(this, argsArray[i]); - } else { - var deps = argsArray[i]; - for (var n = 0, nn = deps.length; n < nn; n++) { - var depObjId = deps[n]; - var common = depObjId[0] === 'g' && depObjId[1] === '_'; - var objsPool = common ? commonObjs : objs; - - // If the promise isn't resolved yet, add the continueCallback - // to the promise and bail out. - if (!objsPool.isResolved(depObjId)) { - objsPool.get(depObjId, continueCallback); - return i; - } - } - } - - i++; - - // If the entire operatorList was executed, stop as were done. - if (i === argsArrayLen) { - return i; - } - - // If the execution took longer then a certain amount of time and - // `continueCallback` is specified, interrupt the execution. - if (chunkOperations && ++steps > EXECUTION_STEPS) { - if (Date.now() > endTime) { - continueCallback(); - return i; - } - steps = 0; - } - - // If the operatorList isn't executed completely yet OR the execution - // time was short enough, do another execution round. - } - }, - - endDrawing: function CanvasGraphics_endDrawing() { - this.ctx.restore(); - - if (this.transparentCanvas) { - this.ctx = this.compositeCtx; - this.ctx.drawImage(this.transparentCanvas, 0, 0); - this.transparentCanvas = null; - } - - this.cachedCanvases.clear(); - WebGLUtils.clear(); - - if (this.imageLayer) { - this.imageLayer.endLayout(); - } - }, - - // Graphics state - setLineWidth: function CanvasGraphics_setLineWidth(width) { - this.current.lineWidth = width; - this.ctx.lineWidth = width; - }, - setLineCap: function CanvasGraphics_setLineCap(style) { - this.ctx.lineCap = LINE_CAP_STYLES[style]; - }, - setLineJoin: function CanvasGraphics_setLineJoin(style) { - this.ctx.lineJoin = LINE_JOIN_STYLES[style]; - }, - setMiterLimit: function CanvasGraphics_setMiterLimit(limit) { - this.ctx.miterLimit = limit; - }, - setDash: function CanvasGraphics_setDash(dashArray, dashPhase) { - var ctx = this.ctx; - if (ctx.setLineDash !== undefined) { - ctx.setLineDash(dashArray); - ctx.lineDashOffset = dashPhase; - } else { - ctx.mozDash = dashArray; - ctx.mozDashOffset = dashPhase; - } - }, - setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) { - // Maybe if we one day fully support color spaces this will be important - // for now we can ignore. - // TODO set rendering intent? - }, - setFlatness: function CanvasGraphics_setFlatness(flatness) { - // There's no way to control this with canvas, but we can safely ignore. - // TODO set flatness? - }, - setGState: function CanvasGraphics_setGState(states) { - for (var i = 0, ii = states.length; i < ii; i++) { - var state = states[i]; - var key = state[0]; - var value = state[1]; - - switch (key) { - case 'LW': - this.setLineWidth(value); - break; - case 'LC': - this.setLineCap(value); - break; - case 'LJ': - this.setLineJoin(value); - break; - case 'ML': - this.setMiterLimit(value); - break; - case 'D': - this.setDash(value[0], value[1]); - break; - case 'RI': - this.setRenderingIntent(value); - break; - case 'FL': - this.setFlatness(value); - break; - case 'Font': - this.setFont(value[0], value[1]); - break; - case 'CA': - this.current.strokeAlpha = state[1]; - break; - case 'ca': - this.current.fillAlpha = state[1]; - this.ctx.globalAlpha = state[1]; - break; - case 'BM': - if (value && value.name && (value.name !== 'Normal')) { - var mode = value.name.replace(/([A-Z])/g, - function(c) { - return '-' + c.toLowerCase(); - } - ).substring(1); - this.ctx.globalCompositeOperation = mode; - if (this.ctx.globalCompositeOperation !== mode) { - warn('globalCompositeOperation "' + mode + - '" is not supported'); - } - } else { - this.ctx.globalCompositeOperation = 'source-over'; - } - break; - case 'SMask': - if (this.current.activeSMask) { - this.endSMaskGroup(); - } - this.current.activeSMask = value ? this.tempSMask : null; - if (this.current.activeSMask) { - this.beginSMaskGroup(); - } - this.tempSMask = null; - break; - } - } - }, - beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() { - - var activeSMask = this.current.activeSMask; - var drawnWidth = activeSMask.canvas.width; - var drawnHeight = activeSMask.canvas.height; - var cacheId = 'smaskGroupAt' + this.groupLevel; - var scratchCanvas = this.cachedCanvases.getCanvas( - cacheId, drawnWidth, drawnHeight, true); - - var currentCtx = this.ctx; - var currentTransform = currentCtx.mozCurrentTransform; - this.ctx.save(); - - var groupCtx = scratchCanvas.context; - groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY); - groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY); - groupCtx.transform.apply(groupCtx, currentTransform); - - copyCtxState(currentCtx, groupCtx); - this.ctx = groupCtx; - this.setGState([ - ['BM', 'Normal'], - ['ca', 1], - ['CA', 1] - ]); - this.groupStack.push(currentCtx); - this.groupLevel++; - }, - endSMaskGroup: function CanvasGraphics_endSMaskGroup() { - var groupCtx = this.ctx; - this.groupLevel--; - this.ctx = this.groupStack.pop(); - - composeSMask(this.ctx, this.current.activeSMask, groupCtx); - this.ctx.restore(); - copyCtxState(groupCtx, this.ctx); - }, - save: function CanvasGraphics_save() { - this.ctx.save(); - var old = this.current; - this.stateStack.push(old); - this.current = old.clone(); - this.current.activeSMask = null; - }, - restore: function CanvasGraphics_restore() { - if (this.stateStack.length !== 0) { - if (this.current.activeSMask !== null) { - this.endSMaskGroup(); - } - - this.current = this.stateStack.pop(); - this.ctx.restore(); - - // Ensure that the clipping path is reset (fixes issue6413.pdf). - this.pendingClip = null; - - this.cachedGetSinglePixelWidth = null; - } - }, - transform: function CanvasGraphics_transform(a, b, c, d, e, f) { - this.ctx.transform(a, b, c, d, e, f); - - this.cachedGetSinglePixelWidth = null; - }, - - // Path - constructPath: function CanvasGraphics_constructPath(ops, args) { - var ctx = this.ctx; - var current = this.current; - var x = current.x, y = current.y; - for (var i = 0, j = 0, ii = ops.length; i < ii; i++) { - switch (ops[i] | 0) { - case OPS.rectangle: - x = args[j++]; - y = args[j++]; - var width = args[j++]; - var height = args[j++]; - if (width === 0) { - width = this.getSinglePixelWidth(); - } - if (height === 0) { - height = this.getSinglePixelWidth(); - } - var xw = x + width; - var yh = y + height; - this.ctx.moveTo(x, y); - this.ctx.lineTo(xw, y); - this.ctx.lineTo(xw, yh); - this.ctx.lineTo(x, yh); - this.ctx.lineTo(x, y); - this.ctx.closePath(); - break; - case OPS.moveTo: - x = args[j++]; - y = args[j++]; - ctx.moveTo(x, y); - break; - case OPS.lineTo: - x = args[j++]; - y = args[j++]; - ctx.lineTo(x, y); - break; - case OPS.curveTo: - x = args[j + 4]; - y = args[j + 5]; - ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], - x, y); - j += 6; - break; - case OPS.curveTo2: - ctx.bezierCurveTo(x, y, args[j], args[j + 1], - args[j + 2], args[j + 3]); - x = args[j + 2]; - y = args[j + 3]; - j += 4; - break; - case OPS.curveTo3: - x = args[j + 2]; - y = args[j + 3]; - ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y); - j += 4; - break; - case OPS.closePath: - ctx.closePath(); - break; - } - } - current.setCurrentPoint(x, y); - }, - closePath: function CanvasGraphics_closePath() { - this.ctx.closePath(); - }, - stroke: function CanvasGraphics_stroke(consumePath) { - consumePath = typeof consumePath !== 'undefined' ? consumePath : true; - var ctx = this.ctx; - var strokeColor = this.current.strokeColor; - // Prevent drawing too thin lines by enforcing a minimum line width. - ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, - this.current.lineWidth); - // For stroke we want to temporarily change the global alpha to the - // stroking alpha. - ctx.globalAlpha = this.current.strokeAlpha; - if (strokeColor && strokeColor.hasOwnProperty('type') && - strokeColor.type === 'Pattern') { - // for patterns, we transform to pattern space, calculate - // the pattern, call stroke, and restore to user space - ctx.save(); - ctx.strokeStyle = strokeColor.getPattern(ctx, this); - ctx.stroke(); - ctx.restore(); - } else { - ctx.stroke(); - } - if (consumePath) { - this.consumePath(); - } - // Restore the global alpha to the fill alpha - ctx.globalAlpha = this.current.fillAlpha; - }, - closeStroke: function CanvasGraphics_closeStroke() { - this.closePath(); - this.stroke(); - }, - fill: function CanvasGraphics_fill(consumePath) { - consumePath = typeof consumePath !== 'undefined' ? consumePath : true; - var ctx = this.ctx; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - var needRestore = false; - - if (isPatternFill) { - ctx.save(); - if (this.baseTransform) { - ctx.setTransform.apply(ctx, this.baseTransform); - } - ctx.fillStyle = fillColor.getPattern(ctx, this); - needRestore = true; - } - - if (this.pendingEOFill) { - if (ctx.mozFillRule !== undefined) { - ctx.mozFillRule = 'evenodd'; - ctx.fill(); - ctx.mozFillRule = 'nonzero'; - } else { - ctx.fill('evenodd'); - } - this.pendingEOFill = false; - } else { - ctx.fill(); - } - - if (needRestore) { - ctx.restore(); - } - if (consumePath) { - this.consumePath(); - } - }, - eoFill: function CanvasGraphics_eoFill() { - this.pendingEOFill = true; - this.fill(); - }, - fillStroke: function CanvasGraphics_fillStroke() { - this.fill(false); - this.stroke(false); - - this.consumePath(); - }, - eoFillStroke: function CanvasGraphics_eoFillStroke() { - this.pendingEOFill = true; - this.fillStroke(); - }, - closeFillStroke: function CanvasGraphics_closeFillStroke() { - this.closePath(); - this.fillStroke(); - }, - closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() { - this.pendingEOFill = true; - this.closePath(); - this.fillStroke(); - }, - endPath: function CanvasGraphics_endPath() { - this.consumePath(); - }, - - // Clipping - clip: function CanvasGraphics_clip() { - this.pendingClip = NORMAL_CLIP; - }, - eoClip: function CanvasGraphics_eoClip() { - this.pendingClip = EO_CLIP; - }, - - // Text - beginText: function CanvasGraphics_beginText() { - this.current.textMatrix = IDENTITY_MATRIX; - this.current.textMatrixScale = 1; - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - endText: function CanvasGraphics_endText() { - var paths = this.pendingTextPaths; - var ctx = this.ctx; - if (paths === undefined) { - ctx.beginPath(); - return; - } - - ctx.save(); - ctx.beginPath(); - for (var i = 0; i < paths.length; i++) { - var path = paths[i]; - ctx.setTransform.apply(ctx, path.transform); - ctx.translate(path.x, path.y); - path.addToPath(ctx, path.fontSize); - } - ctx.restore(); - ctx.clip(); - ctx.beginPath(); - delete this.pendingTextPaths; - }, - setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) { - this.current.charSpacing = spacing; - }, - setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) { - this.current.wordSpacing = spacing; - }, - setHScale: function CanvasGraphics_setHScale(scale) { - this.current.textHScale = scale / 100; - }, - setLeading: function CanvasGraphics_setLeading(leading) { - this.current.leading = -leading; - }, - setFont: function CanvasGraphics_setFont(fontRefName, size) { - var fontObj = this.commonObjs.get(fontRefName); - var current = this.current; - - if (!fontObj) { - error('Can\'t find font for ' + fontRefName); - } - - current.fontMatrix = (fontObj.fontMatrix ? - fontObj.fontMatrix : FONT_IDENTITY_MATRIX); - - // A valid matrix needs all main diagonal elements to be non-zero - // This also ensures we bypass FF bugzilla bug #719844. - if (current.fontMatrix[0] === 0 || - current.fontMatrix[3] === 0) { - warn('Invalid font matrix for font ' + fontRefName); - } - - // The spec for Tf (setFont) says that 'size' specifies the font 'scale', - // and in some docs this can be negative (inverted x-y axes). - if (size < 0) { - size = -size; - current.fontDirection = -1; - } else { - current.fontDirection = 1; - } - - this.current.font = fontObj; - this.current.fontSize = size; - - if (fontObj.isType3Font) { - return; // we don't need ctx.font for Type3 fonts - } - - var name = fontObj.loadedName || 'sans-serif'; - var bold = fontObj.black ? (fontObj.bold ? '900' : 'bold') : - (fontObj.bold ? 'bold' : 'normal'); - - var italic = fontObj.italic ? 'italic' : 'normal'; - var typeface = '"' + name + '", ' + fontObj.fallbackName; - - // Some font backends cannot handle fonts below certain size. - // Keeping the font at minimal size and using the fontSizeScale to change - // the current transformation matrix before the fillText/strokeText. - // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227 - var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE : - size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size; - this.current.fontSizeScale = size / browserFontSize; - - var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface; - this.ctx.font = rule; - }, - setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) { - this.current.textRenderingMode = mode; - }, - setTextRise: function CanvasGraphics_setTextRise(rise) { - this.current.textRise = rise; - }, - moveText: function CanvasGraphics_moveText(x, y) { - this.current.x = this.current.lineX += x; - this.current.y = this.current.lineY += y; - }, - setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) { - this.setLeading(-y); - this.moveText(x, y); - }, - setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) { - this.current.textMatrix = [a, b, c, d, e, f]; - this.current.textMatrixScale = Math.sqrt(a * a + b * b); - - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - nextLine: function CanvasGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - - paintChar: function CanvasGraphics_paintChar(character, x, y) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var textRenderingMode = current.textRenderingMode; - var fontSize = current.fontSize / current.fontSizeScale; - var fillStrokeMode = textRenderingMode & - TextRenderingMode.FILL_STROKE_MASK; - var isAddToPathSet = !!(textRenderingMode & - TextRenderingMode.ADD_TO_PATH_FLAG); - - var addToPath; - if (font.disableFontFace || isAddToPathSet) { - addToPath = font.getPathGenerator(this.commonObjs, character); - } - - if (font.disableFontFace) { - ctx.save(); - ctx.translate(x, y); - ctx.beginPath(); - addToPath(ctx, fontSize); - if (fillStrokeMode === TextRenderingMode.FILL || - fillStrokeMode === TextRenderingMode.FILL_STROKE) { - ctx.fill(); - } - if (fillStrokeMode === TextRenderingMode.STROKE || - fillStrokeMode === TextRenderingMode.FILL_STROKE) { - ctx.stroke(); - } - ctx.restore(); - } else { - if (fillStrokeMode === TextRenderingMode.FILL || - fillStrokeMode === TextRenderingMode.FILL_STROKE) { - ctx.fillText(character, x, y); - } - if (fillStrokeMode === TextRenderingMode.STROKE || - fillStrokeMode === TextRenderingMode.FILL_STROKE) { - ctx.strokeText(character, x, y); - } - } - - if (isAddToPathSet) { - var paths = this.pendingTextPaths || (this.pendingTextPaths = []); - paths.push({ - transform: ctx.mozCurrentTransform, - x: x, - y: y, - fontSize: fontSize, - addToPath: addToPath - }); - } - }, - - get isFontSubpixelAAEnabled() { - // Checks if anti-aliasing is enabled when scaled text is painted. - // On Windows GDI scaled fonts looks bad. - var ctx = document.createElement('canvas').getContext('2d'); - ctx.scale(1.5, 1); - ctx.fillText('I', 0, 10); - var data = ctx.getImageData(0, 0, 10, 10).data; - var enabled = false; - for (var i = 3; i < data.length; i += 4) { - if (data[i] > 0 && data[i] < 255) { - enabled = true; - break; - } - } - return shadow(this, 'isFontSubpixelAAEnabled', enabled); - }, - - showText: function CanvasGraphics_showText(glyphs) { - var current = this.current; - var font = current.font; - if (font.isType3Font) { - return this.showType3Text(glyphs); - } - - var fontSize = current.fontSize; - if (fontSize === 0) { - return; - } - - var ctx = this.ctx; - var fontSizeScale = current.fontSizeScale; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var fontDirection = current.fontDirection; - var textHScale = current.textHScale * fontDirection; - var glyphsLength = glyphs.length; - var vertical = font.vertical; - var spacingDir = vertical ? 1 : -1; - var defaultVMetrics = font.defaultVMetrics; - var widthAdvanceScale = fontSize * current.fontMatrix[0]; - - var simpleFillText = - current.textRenderingMode === TextRenderingMode.FILL && - !font.disableFontFace; - - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y + current.textRise); - - if (current.patternFill) { - // TODO: Some shading patterns are not applied correctly to text, - // e.g. issues 3988 and 5432, and ShowText-ShadingPattern.pdf. - ctx.fillStyle = current.fillColor.getPattern(ctx, this); - } - - if (fontDirection > 0) { - ctx.scale(textHScale, -1); - } else { - ctx.scale(textHScale, 1); - } - - var lineWidth = current.lineWidth; - var scale = current.textMatrixScale; - if (scale === 0 || lineWidth === 0) { - var fillStrokeMode = current.textRenderingMode & - TextRenderingMode.FILL_STROKE_MASK; - if (fillStrokeMode === TextRenderingMode.STROKE || - fillStrokeMode === TextRenderingMode.FILL_STROKE) { - this.cachedGetSinglePixelWidth = null; - lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR; - } - } else { - lineWidth /= scale; - } - - if (fontSizeScale !== 1.0) { - ctx.scale(fontSizeScale, fontSizeScale); - lineWidth /= fontSizeScale; - } - - ctx.lineWidth = lineWidth; - - var x = 0, i; - for (i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (isNum(glyph)) { - x += spacingDir * glyph * fontSize / 1000; - continue; - } - - var restoreNeeded = false; - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var character = glyph.fontChar; - var accent = glyph.accent; - var scaledX, scaledY, scaledAccentX, scaledAccentY; - var width = glyph.width; - if (vertical) { - var vmetric, vx, vy; - vmetric = glyph.vmetric || defaultVMetrics; - vx = glyph.vmetric ? vmetric[1] : width * 0.5; - vx = -vx * widthAdvanceScale; - vy = vmetric[2] * widthAdvanceScale; - - width = vmetric ? -vmetric[0] : width; - scaledX = vx / fontSizeScale; - scaledY = (x + vy) / fontSizeScale; - } else { - scaledX = x / fontSizeScale; - scaledY = 0; - } - - if (font.remeasure && width > 0) { - // Some standard fonts may not have the exact width: rescale per - // character if measured width is greater than expected glyph width - // and subpixel-aa is enabled, otherwise just center the glyph. - var measuredWidth = ctx.measureText(character).width * 1000 / - fontSize * fontSizeScale; - if (width < measuredWidth && this.isFontSubpixelAAEnabled) { - var characterScaleX = width / measuredWidth; - restoreNeeded = true; - ctx.save(); - ctx.scale(characterScaleX, 1); - scaledX /= characterScaleX; - } else if (width !== measuredWidth) { - scaledX += (width - measuredWidth) / 2000 * - fontSize / fontSizeScale; - } - } - - if (simpleFillText && !accent) { - // common case - ctx.fillText(character, scaledX, scaledY); - } else { - this.paintChar(character, scaledX, scaledY); - if (accent) { - scaledAccentX = scaledX + accent.offset.x / fontSizeScale; - scaledAccentY = scaledY - accent.offset.y / fontSizeScale; - this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY); - } - } - - var charWidth = width * widthAdvanceScale + spacing * fontDirection; - x += charWidth; - - if (restoreNeeded) { - ctx.restore(); - } - } - if (vertical) { - current.y -= x * textHScale; - } else { - current.x += x * textHScale; - } - ctx.restore(); - }, - - showType3Text: function CanvasGraphics_showType3Text(glyphs) { - // Type3 fonts - each glyph is a "mini-PDF" - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - var fontDirection = current.fontDirection; - var spacingDir = font.vertical ? 1 : -1; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var textHScale = current.textHScale * fontDirection; - var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX; - var glyphsLength = glyphs.length; - var isTextInvisible = - current.textRenderingMode === TextRenderingMode.INVISIBLE; - var i, glyph, width, spacingLength; - - if (isTextInvisible || fontSize === 0) { - return; - } - this.cachedGetSinglePixelWidth = null; - - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y); - - ctx.scale(textHScale, fontDirection); - - for (i = 0; i < glyphsLength; ++i) { - glyph = glyphs[i]; - if (isNum(glyph)) { - spacingLength = spacingDir * glyph * fontSize / 1000; - this.ctx.translate(spacingLength, 0); - current.x += spacingLength * textHScale; - continue; - } - - var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; - var operatorList = font.charProcOperatorList[glyph.operatorListId]; - if (!operatorList) { - warn('Type3 character \"' + glyph.operatorListId + - '\" is not available'); - continue; - } - this.processingType3 = glyph; - this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform.apply(ctx, fontMatrix); - this.executeOperatorList(operatorList); - this.restore(); - - var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - width = transformed[0] * fontSize + spacing; - - ctx.translate(width, 0); - current.x += width * textHScale; - } - ctx.restore(); - this.processingType3 = null; - }, - - // Type3 fonts - setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) { - // We can safely ignore this since the width should be the same - // as the width in the Widths array. - }, - setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, - yWidth, - llx, - lly, - urx, - ury) { - // TODO According to the spec we're also suppose to ignore any operators - // that set color or include images while processing this type3 font. - this.ctx.rect(llx, lly, urx - llx, ury - lly); - this.clip(); - this.endPath(); - }, - - // Color - getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) { - var pattern; - if (IR[0] === 'TilingPattern') { - var color = IR[1]; - var baseTransform = this.baseTransform || - this.ctx.mozCurrentTransform.slice(); - var self = this; - var canvasGraphicsFactory = { - createCanvasGraphics: function (ctx) { - return new CanvasGraphics(ctx, self.commonObjs, self.objs); - } - }; - pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, - baseTransform); - } else { - pattern = getShadingPatternFromIR(IR); - } - return pattern; - }, - setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) { - this.current.strokeColor = this.getColorN_Pattern(arguments); - }, - setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) { - this.current.fillColor = this.getColorN_Pattern(arguments); - this.current.patternFill = true; - }, - setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { - var color = Util.makeCssRgb(r, g, b); - this.ctx.fillStyle = color; - this.current.fillColor = color; - this.current.patternFill = false; - }, - - shadingFill: function CanvasGraphics_shadingFill(patternIR) { - var ctx = this.ctx; - - this.save(); - var pattern = getShadingPatternFromIR(patternIR); - ctx.fillStyle = pattern.getPattern(ctx, this, true); - - var inv = ctx.mozCurrentTransformInverse; - if (inv) { - var canvas = ctx.canvas; - var width = canvas.width; - var height = canvas.height; - - var bl = Util.applyTransform([0, 0], inv); - var br = Util.applyTransform([0, height], inv); - var ul = Util.applyTransform([width, 0], inv); - var ur = Util.applyTransform([width, height], inv); - - var x0 = Math.min(bl[0], br[0], ul[0], ur[0]); - var y0 = Math.min(bl[1], br[1], ul[1], ur[1]); - var x1 = Math.max(bl[0], br[0], ul[0], ur[0]); - var y1 = Math.max(bl[1], br[1], ul[1], ur[1]); - - this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); - } else { - // HACK to draw the gradient onto an infinite rectangle. - // PDF gradients are drawn across the entire image while - // Canvas only allows gradients to be drawn in a rectangle - // The following bug should allow us to remove this. - // https://bugzilla.mozilla.org/show_bug.cgi?id=664884 - - this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); - } - - this.restore(); - }, - - // Images - beginInlineImage: function CanvasGraphics_beginInlineImage() { - error('Should not call beginInlineImage'); - }, - beginImageData: function CanvasGraphics_beginImageData() { - error('Should not call beginImageData'); - }, - - paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, - bbox) { - this.save(); - this.baseTransformStack.push(this.baseTransform); - - if (isArray(matrix) && 6 === matrix.length) { - this.transform.apply(this, matrix); - } - - this.baseTransform = this.ctx.mozCurrentTransform; - - if (isArray(bbox) && 4 === bbox.length) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - this.ctx.rect(bbox[0], bbox[1], width, height); - this.clip(); - this.endPath(); - } - }, - - paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() { - this.restore(); - this.baseTransform = this.baseTransformStack.pop(); - }, - - beginGroup: function CanvasGraphics_beginGroup(group) { - this.save(); - var currentCtx = this.ctx; - // TODO non-isolated groups - according to Rik at adobe non-isolated - // group results aren't usually that different and they even have tools - // that ignore this setting. Notes from Rik on implmenting: - // - When you encounter an transparency group, create a new canvas with - // the dimensions of the bbox - // - copy the content from the previous canvas to the new canvas - // - draw as usual - // - remove the backdrop alpha: - // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha - // value of your transparency group and 'alphaBackdrop' the alpha of the - // backdrop - // - remove background color: - // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew) - if (!group.isolated) { - info('TODO: Support non-isolated groups.'); - } - - // TODO knockout - supposedly possible with the clever use of compositing - // modes. - if (group.knockout) { - warn('Knockout groups not supported.'); - } - - var currentTransform = currentCtx.mozCurrentTransform; - if (group.matrix) { - currentCtx.transform.apply(currentCtx, group.matrix); - } - assert(group.bbox, 'Bounding box is required.'); - - // Based on the current transform figure out how big the bounding box - // will actually be. - var bounds = Util.getAxialAlignedBoundingBox( - group.bbox, - currentCtx.mozCurrentTransform); - // Clip the bounding box to the current canvas. - var canvasBounds = [0, - 0, - currentCtx.canvas.width, - currentCtx.canvas.height]; - bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; - // Use ceil in case we're between sizes so we don't create canvas that is - // too small and make the canvas at least 1x1 pixels. - var offsetX = Math.floor(bounds[0]); - var offsetY = Math.floor(bounds[1]); - var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); - var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); - var scaleX = 1, scaleY = 1; - if (drawnWidth > MAX_GROUP_SIZE) { - scaleX = drawnWidth / MAX_GROUP_SIZE; - drawnWidth = MAX_GROUP_SIZE; - } - if (drawnHeight > MAX_GROUP_SIZE) { - scaleY = drawnHeight / MAX_GROUP_SIZE; - drawnHeight = MAX_GROUP_SIZE; - } - - var cacheId = 'groupAt' + this.groupLevel; - if (group.smask) { - // Using two cache entries is case if masks are used one after another. - cacheId += '_smask_' + ((this.smaskCounter++) % 2); - } - var scratchCanvas = this.cachedCanvases.getCanvas( - cacheId, drawnWidth, drawnHeight, true); - var groupCtx = scratchCanvas.context; - - // Since we created a new canvas that is just the size of the bounding box - // we have to translate the group ctx. - groupCtx.scale(1 / scaleX, 1 / scaleY); - groupCtx.translate(-offsetX, -offsetY); - groupCtx.transform.apply(groupCtx, currentTransform); - - if (group.smask) { - // Saving state and cached mask to be used in setGState. - this.smaskStack.push({ - canvas: scratchCanvas.canvas, - context: groupCtx, - offsetX: offsetX, - offsetY: offsetY, - scaleX: scaleX, - scaleY: scaleY, - subtype: group.smask.subtype, - backdrop: group.smask.backdrop, - transferMap: group.smask.transferMap || null - }); - } else { - // Setup the current ctx so when the group is popped we draw it at the - // right location. - currentCtx.setTransform(1, 0, 0, 1, 0, 0); - currentCtx.translate(offsetX, offsetY); - currentCtx.scale(scaleX, scaleY); - } - // The transparency group inherits all off the current graphics state - // except the blend mode, soft mask, and alpha constants. - copyCtxState(currentCtx, groupCtx); - this.ctx = groupCtx; - this.setGState([ - ['BM', 'Normal'], - ['ca', 1], - ['CA', 1] - ]); - this.groupStack.push(currentCtx); - this.groupLevel++; - }, - - endGroup: function CanvasGraphics_endGroup(group) { - this.groupLevel--; - var groupCtx = this.ctx; - this.ctx = this.groupStack.pop(); - // Turn off image smoothing to avoid sub pixel interpolation which can - // look kind of blurry for some pdfs. - if (this.ctx.imageSmoothingEnabled !== undefined) { - this.ctx.imageSmoothingEnabled = false; - } else { - this.ctx.mozImageSmoothingEnabled = false; - } - if (group.smask) { - this.tempSMask = this.smaskStack.pop(); - } else { - this.ctx.drawImage(groupCtx.canvas, 0, 0); - } - this.restore(); - }, - - beginAnnotations: function CanvasGraphics_beginAnnotations() { - this.save(); - this.current = new CanvasExtraState(); - - if (this.baseTransform) { - this.ctx.setTransform.apply(this.ctx, this.baseTransform); - } - }, - - endAnnotations: function CanvasGraphics_endAnnotations() { - this.restore(); - }, - - beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, - matrix) { - this.save(); - - if (isArray(rect) && 4 === rect.length) { - var width = rect[2] - rect[0]; - var height = rect[3] - rect[1]; - this.ctx.rect(rect[0], rect[1], width, height); - this.clip(); - this.endPath(); - } - - this.transform.apply(this, transform); - this.transform.apply(this, matrix); - }, - - endAnnotation: function CanvasGraphics_endAnnotation() { - this.restore(); - }, - - paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) { - var domImage = this.objs.get(objId); - if (!domImage) { - warn('Dependent image isn\'t ready yet'); - return; - } - - this.save(); - - var ctx = this.ctx; - // scale the image to the unit square - ctx.scale(1 / w, -1 / h); - - ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height, - 0, -h, w, h); - if (this.imageLayer) { - var currentTransform = ctx.mozCurrentTransformInverse; - var position = this.getCanvasPosition(0, 0); - this.imageLayer.appendImage({ - objId: objId, - left: position[0], - top: position[1], - width: w / currentTransform[0], - height: h / currentTransform[3] - }); - } - this.restore(); - }, - - paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) { - var ctx = this.ctx; - var width = img.width, height = img.height; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - - var glyph = this.processingType3; - - if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) { - if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) { - glyph.compiled = - compileType3Glyph({data: img.data, width: width, height: height}); - } else { - glyph.compiled = null; - } - } - - if (glyph && glyph.compiled) { - glyph.compiled(ctx); - return; - } - - var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, img); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - this.paintInlineImageXObject(maskCanvas.canvas); - }, - - paintImageMaskXObjectRepeat: - function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX, - scaleY, positions) { - var width = imgData.width; - var height = imgData.height; - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - - var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, imgData); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - var ctx = this.ctx; - for (var i = 0, ii = positions.length; i < ii; i += 2) { - ctx.save(); - ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]); - ctx.scale(1, -1); - ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, - 0, -1, 1, 1); - ctx.restore(); - } - }, - - paintImageMaskXObjectGroup: - function CanvasGraphics_paintImageMaskXObjectGroup(images) { - var ctx = this.ctx; - - var fillColor = this.current.fillColor; - var isPatternFill = this.current.patternFill; - for (var i = 0, ii = images.length; i < ii; i++) { - var image = images[i]; - var width = image.width, height = image.height; - - var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', - width, height); - var maskCtx = maskCanvas.context; - maskCtx.save(); - - putBinaryImageMask(maskCtx, image); - - maskCtx.globalCompositeOperation = 'source-in'; - - maskCtx.fillStyle = isPatternFill ? - fillColor.getPattern(maskCtx, this) : fillColor; - maskCtx.fillRect(0, 0, width, height); - - maskCtx.restore(); - - ctx.save(); - ctx.transform.apply(ctx, image.transform); - ctx.scale(1, -1); - ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, - 0, -1, 1, 1); - ctx.restore(); - } - }, - - paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - - this.paintInlineImageXObject(imgData); - }, - - paintImageXObjectRepeat: - function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, - positions) { - var imgData = this.objs.get(objId); - if (!imgData) { - warn('Dependent image isn\'t ready yet'); - return; - } - - var width = imgData.width; - var height = imgData.height; - var map = []; - for (var i = 0, ii = positions.length; i < ii; i += 2) { - map.push({transform: [scaleX, 0, 0, scaleY, positions[i], - positions[i + 1]], x: 0, y: 0, w: width, h: height}); - } - this.paintInlineImageXObjectGroup(imgData, map); - }, - - paintInlineImageXObject: - function CanvasGraphics_paintInlineImageXObject(imgData) { - var width = imgData.width; - var height = imgData.height; - var ctx = this.ctx; - - this.save(); - // scale the image to the unit square - ctx.scale(1 / width, -1 / height); - - var currentTransform = ctx.mozCurrentTransformInverse; - var a = currentTransform[0], b = currentTransform[1]; - var widthScale = Math.max(Math.sqrt(a * a + b * b), 1); - var c = currentTransform[2], d = currentTransform[3]; - var heightScale = Math.max(Math.sqrt(c * c + d * d), 1); - - var imgToPaint, tmpCanvas; - // instanceof HTMLElement does not work in jsdom node.js module - if (imgData instanceof HTMLElement || !imgData.data) { - imgToPaint = imgData; - } else { - tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', - width, height); - var tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData); - imgToPaint = tmpCanvas.canvas; - } - - var paintWidth = width, paintHeight = height; - var tmpCanvasId = 'prescale1'; - // Vertial or horizontal scaling shall not be more than 2 to not loose the - // pixels during drawImage operation, painting on the temporary canvas(es) - // that are twice smaller in size - while ((widthScale > 2 && paintWidth > 1) || - (heightScale > 2 && paintHeight > 1)) { - var newWidth = paintWidth, newHeight = paintHeight; - if (widthScale > 2 && paintWidth > 1) { - newWidth = Math.ceil(paintWidth / 2); - widthScale /= paintWidth / newWidth; - } - if (heightScale > 2 && paintHeight > 1) { - newHeight = Math.ceil(paintHeight / 2); - heightScale /= paintHeight / newHeight; - } - tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, - newWidth, newHeight); - tmpCtx = tmpCanvas.context; - tmpCtx.clearRect(0, 0, newWidth, newHeight); - tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, - 0, 0, newWidth, newHeight); - imgToPaint = tmpCanvas.canvas; - paintWidth = newWidth; - paintHeight = newHeight; - tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1'; - } - ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, - 0, -height, width, height); - - if (this.imageLayer) { - var position = this.getCanvasPosition(0, -height); - this.imageLayer.appendImage({ - imgData: imgData, - left: position[0], - top: position[1], - width: width / currentTransform[0], - height: height / currentTransform[3] - }); - } - this.restore(); - }, - - paintInlineImageXObjectGroup: - function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) { - var ctx = this.ctx; - var w = imgData.width; - var h = imgData.height; - - var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h); - var tmpCtx = tmpCanvas.context; - putBinaryImageData(tmpCtx, imgData); - - for (var i = 0, ii = map.length; i < ii; i++) { - var entry = map[i]; - ctx.save(); - ctx.transform.apply(ctx, entry.transform); - ctx.scale(1, -1); - ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, - 0, -1, 1, 1); - if (this.imageLayer) { - var position = this.getCanvasPosition(entry.x, entry.y); - this.imageLayer.appendImage({ - imgData: imgData, - left: position[0], - top: position[1], - width: w, - height: h - }); - } - ctx.restore(); - } - }, - - paintSolidColorImageMask: - function CanvasGraphics_paintSolidColorImageMask() { - this.ctx.fillRect(0, 0, 1, 1); - }, - - paintXObject: function CanvasGraphics_paintXObject() { - warn('Unsupported \'paintXObject\' command.'); - }, - - // Marked content - - markPoint: function CanvasGraphics_markPoint(tag) { - // TODO Marked content. - }, - markPointProps: function CanvasGraphics_markPointProps(tag, properties) { - // TODO Marked content. - }, - beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) { - // TODO Marked content. - }, - beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps( - tag, properties) { - // TODO Marked content. - }, - endMarkedContent: function CanvasGraphics_endMarkedContent() { - // TODO Marked content. - }, - - // Compatibility - - beginCompat: function CanvasGraphics_beginCompat() { - // TODO ignore undefined operators (should we do that anyway?) - }, - endCompat: function CanvasGraphics_endCompat() { - // TODO stop ignoring undefined operators - }, - - // Helper functions - - consumePath: function CanvasGraphics_consumePath() { - var ctx = this.ctx; - if (this.pendingClip) { - if (this.pendingClip === EO_CLIP) { - if (ctx.mozFillRule !== undefined) { - ctx.mozFillRule = 'evenodd'; - ctx.clip(); - ctx.mozFillRule = 'nonzero'; - } else { - ctx.clip('evenodd'); - } - } else { - ctx.clip(); - } - this.pendingClip = null; - } - ctx.beginPath(); - }, - getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) { - if (this.cachedGetSinglePixelWidth === null) { - var inverse = this.ctx.mozCurrentTransformInverse; - // max of the current horizontal and vertical scale - this.cachedGetSinglePixelWidth = Math.sqrt(Math.max( - (inverse[0] * inverse[0] + inverse[1] * inverse[1]), - (inverse[2] * inverse[2] + inverse[3] * inverse[3]))); - } - return this.cachedGetSinglePixelWidth; - }, - getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) { - var transform = this.ctx.mozCurrentTransform; - return [ - transform[0] * x + transform[2] * y + transform[4], - transform[1] * x + transform[3] * y + transform[5] - ]; - } - }; - - for (var op in OPS) { - CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; - } - - return CanvasGraphics; -})(); - -exports.CanvasGraphics = CanvasGraphics; -exports.createScratchCanvas = createScratchCanvas; -})); - - -(function (root, factory) { - { - factory((root.pdfjsDisplayAPI = {}), root.pdfjsSharedUtil, - root.pdfjsDisplayFontLoader, root.pdfjsDisplayCanvas, - root.pdfjsDisplayMetadata, root.pdfjsSharedGlobal); - } -}(this, function (exports, sharedUtil, displayFontLoader, displayCanvas, - displayMetadata, sharedGlobal, amdRequire) { - -var InvalidPDFException = sharedUtil.InvalidPDFException; -var MessageHandler = sharedUtil.MessageHandler; -var MissingPDFException = sharedUtil.MissingPDFException; -var PasswordResponses = sharedUtil.PasswordResponses; -var PasswordException = sharedUtil.PasswordException; -var StatTimer = sharedUtil.StatTimer; -var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; -var UnknownErrorException = sharedUtil.UnknownErrorException; -var Util = sharedUtil.Util; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var combineUrl = sharedUtil.combineUrl; -var error = sharedUtil.error; -var deprecated = sharedUtil.deprecated; -var info = sharedUtil.info; -var isArrayBuffer = sharedUtil.isArrayBuffer; -var loadJpegStream = sharedUtil.loadJpegStream; -var stringToBytes = sharedUtil.stringToBytes; -var warn = sharedUtil.warn; -var FontFaceObject = displayFontLoader.FontFaceObject; -var FontLoader = displayFontLoader.FontLoader; -var CanvasGraphics = displayCanvas.CanvasGraphics; -var createScratchCanvas = displayCanvas.createScratchCanvas; -var Metadata = displayMetadata.Metadata; -var PDFJS = sharedGlobal.PDFJS; -var globalScope = sharedGlobal.globalScope; - -var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536 - - -var useRequireEnsure = false; -if (typeof module !== 'undefined' && module.require) { - // node.js - disable worker and set require.ensure. - PDFJS.disableWorker = true; - if (typeof require.ensure === 'undefined') { - require.ensure = require('node-ensure'); - } - useRequireEnsure = true; -} -if (typeof __webpack_require__ !== 'undefined') { - // Webpack - get/bundle pdf.worker.js as additional file. - PDFJS.workerSrc = require('entry?name=[hash]-worker.js!./pdf.worker.js'); - useRequireEnsure = true; -} -if (typeof requirejs !== 'undefined' && requirejs.toUrl) { - PDFJS.workerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js'); -} -var fakeWorkerFilesLoader = useRequireEnsure ? (function (callback) { - require.ensure([], function () { - require('./pdf.worker.js'); - callback(); - }); -}) : (typeof requirejs !== 'undefined') ? (function (callback) { - requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) { - callback(); - }); -}) : null; - - -/** - * The maximum allowed image size in total pixels e.g. width * height. Images - * above this value will not be drawn. Use -1 for no limit. - * @var {number} - */ -PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ? - -1 : PDFJS.maxImageSize); - -/** - * The url of where the predefined Adobe CMaps are located. Include trailing - * slash. - * @var {string} - */ -PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl); - -/** - * Specifies if CMaps are binary packed. - * @var {boolean} - */ -PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked; - -/** - * By default fonts are converted to OpenType fonts and loaded via font face - * rules. If disabled, the font will be rendered using a built in font renderer - * that constructs the glyphs with primitive path commands. - * @var {boolean} - */ -PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ? - false : PDFJS.disableFontFace); - -/** - * Path for image resources, mainly for annotation icons. Include trailing - * slash. - * @var {string} - */ -PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ? - '' : PDFJS.imageResourcesPath); - -/** - * Disable the web worker and run all code on the main thread. This will happen - * automatically if the browser doesn't support workers or sending typed arrays - * to workers. - * @var {boolean} - */ -PDFJS.disableWorker = (PDFJS.disableWorker === undefined ? - false : PDFJS.disableWorker); - -/** - * Path and filename of the worker file. Required when the worker is enabled in - * development mode. If unspecified in the production build, the worker will be - * loaded based on the location of the pdf.js file. It is recommended that - * the workerSrc is set in a custom application to prevent issues caused by - * third-party frameworks and libraries. - * @var {string} - */ -PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc); - -/** - * Disable range request loading of PDF files. When enabled and if the server - * supports partial content requests then the PDF will be fetched in chunks. - * Enabled (false) by default. - * @var {boolean} - */ -PDFJS.disableRange = (PDFJS.disableRange === undefined ? - false : PDFJS.disableRange); - -/** - * Disable streaming of PDF file data. By default PDF.js attempts to load PDF - * in chunks. This default behavior can be disabled. - * @var {boolean} - */ -PDFJS.disableStream = (PDFJS.disableStream === undefined ? - false : PDFJS.disableStream); - -/** - * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js - * will automatically keep fetching more data even if it isn't needed to display - * the current page. This default behavior can be disabled. - * - * NOTE: It is also necessary to disable streaming, see above, - * in order for disabling of pre-fetching to work correctly. - * @var {boolean} - */ -PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ? - false : PDFJS.disableAutoFetch); - -/** - * Enables special hooks for debugging PDF.js. - * @var {boolean} - */ -PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug); - -/** - * Enables transfer usage in postMessage for ArrayBuffers. - * @var {boolean} - */ -PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ? - true : PDFJS.postMessageTransfers); - -/** - * Disables URL.createObjectURL usage. - * @var {boolean} - */ -PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ? - false : PDFJS.disableCreateObjectURL); - -/** - * Disables WebGL usage. - * @var {boolean} - */ -PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ? - true : PDFJS.disableWebGL); - -/** - * Disables fullscreen support, and by extension Presentation Mode, - * in browsers which support the fullscreen API. - * @var {boolean} - */ -PDFJS.disableFullscreen = (PDFJS.disableFullscreen === undefined ? - false : PDFJS.disableFullscreen); - -/** - * Enables CSS only zooming. - * @var {boolean} - */ -PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ? - false : PDFJS.useOnlyCssZoom); - -/** - * Controls the logging level. - * The constants from PDFJS.VERBOSITY_LEVELS should be used: - * - errors - * - warnings [default] - * - infos - * @var {number} - */ -PDFJS.verbosity = (PDFJS.verbosity === undefined ? - PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity); - -/** - * The maximum supported canvas size in total pixels e.g. width * height. - * The default value is 4096 * 4096. Use -1 for no limit. - * @var {number} - */ -PDFJS.maxCanvasPixels = (PDFJS.maxCanvasPixels === undefined ? - 16777216 : PDFJS.maxCanvasPixels); - -/** - * (Deprecated) Opens external links in a new window if enabled. - * The default behavior opens external links in the PDF.js window. - * - * NOTE: This property has been deprecated, please use - * `PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK` instead. - * @var {boolean} - */ -PDFJS.openExternalLinksInNewWindow = ( - PDFJS.openExternalLinksInNewWindow === undefined ? - false : PDFJS.openExternalLinksInNewWindow); - -/** - * Specifies the |target| attribute for external links. - * The constants from PDFJS.LinkTarget should be used: - * - NONE [default] - * - SELF - * - BLANK - * - PARENT - * - TOP - * @var {number} - */ -PDFJS.externalLinkTarget = (PDFJS.externalLinkTarget === undefined ? - PDFJS.LinkTarget.NONE : PDFJS.externalLinkTarget); - -/** - * Specifies the |rel| attribute for external links. Defaults to stripping - * the referrer. - * @var {string} - */ -PDFJS.externalLinkRel = (PDFJS.externalLinkRel === undefined ? - 'noreferrer' : PDFJS.externalLinkRel); - -/** - * Determines if we can eval strings as JS. Primarily used to improve - * performance for font rendering. - * @var {boolean} - */ -PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? - true : PDFJS.isEvalSupported); - -/** - * Document initialization / loading parameters object. - * - * @typedef {Object} DocumentInitParameters - * @property {string} url - The URL of the PDF. - * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays - * (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded, - * use atob() to convert it to a binary string first. - * @property {Object} httpHeaders - Basic authentication headers. - * @property {boolean} withCredentials - Indicates whether or not cross-site - * Access-Control requests should be made using credentials such as cookies - * or authorization headers. The default is false. - * @property {string} password - For decrypting password-protected PDFs. - * @property {TypedArray} initialData - A typed array with the first portion or - * all of the pdf data. Used by the extension since some data is already - * loaded before the switch to range requests. - * @property {number} length - The PDF file length. It's used for progress - * reports and range requests operations. - * @property {PDFDataRangeTransport} range - * @property {number} rangeChunkSize - Optional parameter to specify - * maximum number of bytes fetched per range request. The default value is - * 2^16 = 65536. - * @property {PDFWorker} worker - The worker that will be used for the loading - * and parsing of the PDF data. - */ - -/** - * @typedef {Object} PDFDocumentStats - * @property {Array} streamTypes - Used stream types in the document (an item - * is set to true if specific stream ID was used in the document). - * @property {Array} fontTypes - Used font type in the document (an item is set - * to true if specific font ID was used in the document). - */ - -/** - * This is the main entry point for loading a PDF and interacting with it. - * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR) - * is used, which means it must follow the same origin rules that any XHR does - * e.g. No cross domain requests without CORS. - * - * @param {string|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src - * Can be a url to where a PDF is located, a typed array (Uint8Array) - * already populated with data or parameter object. - * - * @param {PDFDataRangeTransport} pdfDataRangeTransport (deprecated) It is used - * if you want to manually serve range requests for data in the PDF. - * - * @param {function} passwordCallback (deprecated) It is used to request a - * password if wrong or no password was provided. The callback receives two - * parameters: function that needs to be called with new password and reason - * (see {PasswordResponses}). - * - * @param {function} progressCallback (deprecated) It is used to be able to - * monitor the loading progress of the PDF file (necessary to implement e.g. - * a loading bar). The callback receives an {Object} with the properties: - * {number} loaded and {number} total. - * - * @return {PDFDocumentLoadingTask} - */ -PDFJS.getDocument = function getDocument(src, - pdfDataRangeTransport, - passwordCallback, - progressCallback) { - var task = new PDFDocumentLoadingTask(); - - // Support of the obsolete arguments (for compatibility with API v1.0) - if (arguments.length > 1) { - deprecated('getDocument is called with pdfDataRangeTransport, ' + - 'passwordCallback or progressCallback argument'); - } - if (pdfDataRangeTransport) { - if (!(pdfDataRangeTransport instanceof PDFDataRangeTransport)) { - // Not a PDFDataRangeTransport instance, trying to add missing properties. - pdfDataRangeTransport = Object.create(pdfDataRangeTransport); - pdfDataRangeTransport.length = src.length; - pdfDataRangeTransport.initialData = src.initialData; - if (!pdfDataRangeTransport.abort) { - pdfDataRangeTransport.abort = function () {}; - } - } - src = Object.create(src); - src.range = pdfDataRangeTransport; - } - task.onPassword = passwordCallback || null; - task.onProgress = progressCallback || null; - - var source; - if (typeof src === 'string') { - source = { url: src }; - } else if (isArrayBuffer(src)) { - source = { data: src }; - } else if (src instanceof PDFDataRangeTransport) { - source = { range: src }; - } else { - if (typeof src !== 'object') { - error('Invalid parameter in getDocument, need either Uint8Array, ' + - 'string or a parameter object'); - } - if (!src.url && !src.data && !src.range) { - error('Invalid parameter object: need either .data, .range or .url'); - } - - source = src; - } - - var params = {}; - var rangeTransport = null; - var worker = null; - for (var key in source) { - if (key === 'url' && typeof window !== 'undefined') { - // The full path is required in the 'url' field. - params[key] = combineUrl(window.location.href, source[key]); - continue; - } else if (key === 'range') { - rangeTransport = source[key]; - continue; - } else if (key === 'worker') { - worker = source[key]; - continue; - } else if (key === 'data' && !(source[key] instanceof Uint8Array)) { - // Converting string or array-like data to Uint8Array. - var pdfBytes = source[key]; - if (typeof pdfBytes === 'string') { - params[key] = stringToBytes(pdfBytes); - } else if (typeof pdfBytes === 'object' && pdfBytes !== null && - !isNaN(pdfBytes.length)) { - params[key] = new Uint8Array(pdfBytes); - } else if (isArrayBuffer(pdfBytes)) { - params[key] = new Uint8Array(pdfBytes); - } else { - error('Invalid PDF binary data: either typed array, string or ' + - 'array-like object is expected in the data property.'); - } - continue; - } - params[key] = source[key]; - } - - params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE; - - if (!worker) { - // Worker was not provided -- creating and owning our own. - worker = new PDFWorker(); - task._worker = worker; - } - var docId = task.docId; - worker.promise.then(function () { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - return _fetchDocument(worker, params, rangeTransport, docId).then( - function (workerId) { - if (task.destroyed) { - throw new Error('Loading aborted'); - } - var messageHandler = new MessageHandler(docId, workerId, worker.port); - messageHandler.send('Ready', null); - var transport = new WorkerTransport(messageHandler, task, rangeTransport); - task._transport = transport; - }); - }).catch(task._capability.reject); - - return task; -}; - -/** - * Starts fetching of specified PDF document/data. - * @param {PDFWorker} worker - * @param {Object} source - * @param {PDFDataRangeTransport} pdfDataRangeTransport - * @param {string} docId Unique document id, used as MessageHandler id. - * @returns {Promise} The promise, which is resolved when worker id of - * MessageHandler is known. - * @private - */ -function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { - if (worker.destroyed) { - return Promise.reject(new Error('Worker was destroyed')); - } - - source.disableAutoFetch = PDFJS.disableAutoFetch; - source.disableStream = PDFJS.disableStream; - source.chunkedViewerLoading = !!pdfDataRangeTransport; - if (pdfDataRangeTransport) { - source.length = pdfDataRangeTransport.length; - source.initialData = pdfDataRangeTransport.initialData; - } - return worker.messageHandler.sendWithPromise('GetDocRequest', { - docId: docId, - source: source, - disableRange: PDFJS.disableRange, - maxImageSize: PDFJS.maxImageSize, - cMapUrl: PDFJS.cMapUrl, - cMapPacked: PDFJS.cMapPacked, - disableFontFace: PDFJS.disableFontFace, - disableCreateObjectURL: PDFJS.disableCreateObjectURL, - verbosity: PDFJS.verbosity - }).then(function (workerId) { - if (worker.destroyed) { - throw new Error('Worker was destroyed'); - } - return workerId; - }); -} - -/** - * PDF document loading operation. - * @class - * @alias PDFDocumentLoadingTask - */ -var PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { - var nextDocumentId = 0; - - /** @constructs PDFDocumentLoadingTask */ - function PDFDocumentLoadingTask() { - this._capability = createPromiseCapability(); - this._transport = null; - this._worker = null; - - /** - * Unique document loading task id -- used in MessageHandlers. - * @type {string} - */ - this.docId = 'd' + (nextDocumentId++); - - /** - * Shows if loading task is destroyed. - * @type {boolean} - */ - this.destroyed = false; - - /** - * Callback to request a password if wrong or no password was provided. - * The callback receives two parameters: function that needs to be called - * with new password and reason (see {PasswordResponses}). - */ - this.onPassword = null; - - /** - * Callback to be able to monitor the loading progress of the PDF file - * (necessary to implement e.g. a loading bar). The callback receives - * an {Object} with the properties: {number} loaded and {number} total. - */ - this.onProgress = null; - - /** - * Callback to when unsupported feature is used. The callback receives - * an {PDFJS.UNSUPPORTED_FEATURES} argument. - */ - this.onUnsupportedFeature = null; - } - - PDFDocumentLoadingTask.prototype = - /** @lends PDFDocumentLoadingTask.prototype */ { - /** - * @return {Promise} - */ - get promise() { - return this._capability.promise; - }, - - /** - * Aborts all network requests and destroys worker. - * @return {Promise} A promise that is resolved after destruction activity - * is completed. - */ - destroy: function () { - this.destroyed = true; - - var transportDestroyed = !this._transport ? Promise.resolve() : - this._transport.destroy(); - return transportDestroyed.then(function () { - this._transport = null; - if (this._worker) { - this._worker.destroy(); - this._worker = null; - } - }.bind(this)); - }, - - /** - * Registers callbacks to indicate the document loading completion. - * - * @param {function} onFulfilled The callback for the loading completion. - * @param {function} onRejected The callback for the loading failure. - * @return {Promise} A promise that is resolved after the onFulfilled or - * onRejected callback. - */ - then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) { - return this.promise.then.apply(this.promise, arguments); - } - }; - - return PDFDocumentLoadingTask; -})(); - -/** - * Abstract class to support range requests file loading. - * @class - * @alias PDFJS.PDFDataRangeTransport - * @param {number} length - * @param {Uint8Array} initialData - */ -var PDFDataRangeTransport = (function pdfDataRangeTransportClosure() { - function PDFDataRangeTransport(length, initialData) { - this.length = length; - this.initialData = initialData; - - this._rangeListeners = []; - this._progressListeners = []; - this._progressiveReadListeners = []; - this._readyCapability = createPromiseCapability(); - } - PDFDataRangeTransport.prototype = - /** @lends PDFDataRangeTransport.prototype */ { - addRangeListener: - function PDFDataRangeTransport_addRangeListener(listener) { - this._rangeListeners.push(listener); - }, - - addProgressListener: - function PDFDataRangeTransport_addProgressListener(listener) { - this._progressListeners.push(listener); - }, - - addProgressiveReadListener: - function PDFDataRangeTransport_addProgressiveReadListener(listener) { - this._progressiveReadListeners.push(listener); - }, - - onDataRange: function PDFDataRangeTransport_onDataRange(begin, chunk) { - var listeners = this._rangeListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](begin, chunk); - } - }, - - onDataProgress: function PDFDataRangeTransport_onDataProgress(loaded) { - this._readyCapability.promise.then(function () { - var listeners = this._progressListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](loaded); - } - }.bind(this)); - }, - - onDataProgressiveRead: - function PDFDataRangeTransport_onDataProgress(chunk) { - this._readyCapability.promise.then(function () { - var listeners = this._progressiveReadListeners; - for (var i = 0, n = listeners.length; i < n; ++i) { - listeners[i](chunk); - } - }.bind(this)); - }, - - transportReady: function PDFDataRangeTransport_transportReady() { - this._readyCapability.resolve(); - }, - - requestDataRange: - function PDFDataRangeTransport_requestDataRange(begin, end) { - throw new Error('Abstract method PDFDataRangeTransport.requestDataRange'); - }, - - abort: function PDFDataRangeTransport_abort() { - } - }; - return PDFDataRangeTransport; -})(); - -PDFJS.PDFDataRangeTransport = PDFDataRangeTransport; - -/** - * Proxy to a PDFDocument in the worker thread. Also, contains commonly used - * properties that can be read synchronously. - * @class - * @alias PDFDocumentProxy - */ -var PDFDocumentProxy = (function PDFDocumentProxyClosure() { - function PDFDocumentProxy(pdfInfo, transport, loadingTask) { - this.pdfInfo = pdfInfo; - this.transport = transport; - this.loadingTask = loadingTask; - } - PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ { - /** - * @return {number} Total number of pages the PDF contains. - */ - get numPages() { - return this.pdfInfo.numPages; - }, - /** - * @return {string} A unique ID to identify a PDF. Not guaranteed to be - * unique. - */ - get fingerprint() { - return this.pdfInfo.fingerprint; - }, - /** - * @param {number} pageNumber The page number to get. The first page is 1. - * @return {Promise} A promise that is resolved with a {@link PDFPageProxy} - * object. - */ - getPage: function PDFDocumentProxy_getPage(pageNumber) { - return this.transport.getPage(pageNumber); - }, - /** - * @param {{num: number, gen: number}} ref The page reference. Must have - * the 'num' and 'gen' properties. - * @return {Promise} A promise that is resolved with the page index that is - * associated with the reference. - */ - getPageIndex: function PDFDocumentProxy_getPageIndex(ref) { - return this.transport.getPageIndex(ref); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named destinations to reference numbers. - * - * This can be slow for large documents: use getDestination instead - */ - getDestinations: function PDFDocumentProxy_getDestinations() { - return this.transport.getDestinations(); - }, - /** - * @param {string} id The named destination to get. - * @return {Promise} A promise that is resolved with all information - * of the given named destination. - */ - getDestination: function PDFDocumentProxy_getDestination(id) { - return this.transport.getDestination(id); - }, - /** - * @return {Promise} A promise that is resolved with: - * an Array containing the pageLabels that correspond to the pageIndexes, - * or `null` when no pageLabels are present in the PDF file. - */ - getPageLabels: function PDFDocumentProxy_getPageLabels() { - return this.transport.getPageLabels(); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named attachments to their content. - */ - getAttachments: function PDFDocumentProxy_getAttachments() { - return this.transport.getAttachments(); - }, - /** - * @return {Promise} A promise that is resolved with an array of all the - * JavaScript strings in the name tree. - */ - getJavaScript: function PDFDocumentProxy_getJavaScript() { - return this.transport.getJavaScript(); - }, - /** - * @return {Promise} A promise that is resolved with an {Array} that is a - * tree outline (if it has one) of the PDF. The tree is in the format of: - * [ - * { - * title: string, - * bold: boolean, - * italic: boolean, - * color: rgb array, - * dest: dest obj, - * url: string, - * items: array of more items like this - * }, - * ... - * ]. - */ - getOutline: function PDFDocumentProxy_getOutline() { - return this.transport.getOutline(); - }, - /** - * @return {Promise} A promise that is resolved with an {Object} that has - * info and metadata properties. Info is an {Object} filled with anything - * available in the information dictionary and similarly metadata is a - * {Metadata} object with information from the metadata section of the PDF. - */ - getMetadata: function PDFDocumentProxy_getMetadata() { - return this.transport.getMetadata(); - }, - /** - * @return {Promise} A promise that is resolved with a TypedArray that has - * the raw data from the PDF. - */ - getData: function PDFDocumentProxy_getData() { - return this.transport.getData(); - }, - /** - * @return {Promise} A promise that is resolved when the document's data - * is loaded. It is resolved with an {Object} that contains the length - * property that indicates size of the PDF data in bytes. - */ - getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() { - return this.transport.downloadInfoCapability.promise; - }, - /** - * @return {Promise} A promise this is resolved with current stats about - * document structures (see {@link PDFDocumentStats}). - */ - getStats: function PDFDocumentProxy_getStats() { - return this.transport.getStats(); - }, - /** - * Cleans up resources allocated by the document, e.g. created @font-face. - */ - cleanup: function PDFDocumentProxy_cleanup() { - this.transport.startCleanup(); - }, - /** - * Destroys current document instance and terminates worker. - */ - destroy: function PDFDocumentProxy_destroy() { - return this.loadingTask.destroy(); - } - }; - return PDFDocumentProxy; -})(); - -/** - * Page getTextContent parameters. - * - * @typedef {Object} getTextContentParameters - * @param {boolean} normalizeWhitespace - replaces all occurrences of - * whitespace with standard spaces (0x20). The default value is `false`. - */ - -/** - * Page text content. - * - * @typedef {Object} TextContent - * @property {array} items - array of {@link TextItem} - * @property {Object} styles - {@link TextStyles} objects, indexed by font - * name. - */ - -/** - * Page text content part. - * - * @typedef {Object} TextItem - * @property {string} str - text content. - * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'. - * @property {array} transform - transformation matrix. - * @property {number} width - width in device space. - * @property {number} height - height in device space. - * @property {string} fontName - font name used by pdf.js for converted font. - */ - -/** - * Text style. - * - * @typedef {Object} TextStyle - * @property {number} ascent - font ascent. - * @property {number} descent - font descent. - * @property {boolean} vertical - text is in vertical mode. - * @property {string} fontFamily - possible font family - */ - -/** - * Page annotation parameters. - * - * @typedef {Object} GetAnnotationsParameters - * @param {string} intent - Determines the annotations that will be fetched, - * can be either 'display' (viewable annotations) or 'print' - * (printable annotations). - * If the parameter is omitted, all annotations are fetched. - */ - -/** - * Page render parameters. - * - * @typedef {Object} RenderParameters - * @property {Object} canvasContext - A 2D context of a DOM Canvas object. - * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by - * calling of PDFPage.getViewport method. - * @property {string} intent - Rendering intent, can be 'display' or 'print' - * (default value is 'display'). - * @property {Array} transform - (optional) Additional transform, applied - * just before viewport transform. - * @property {Object} imageLayer - (optional) An object that has beginLayout, - * endLayout and appendImage functions. - * @property {function} continueCallback - (deprecated) A function that will be - * called each time the rendering is paused. To continue - * rendering call the function that is the first argument - * to the callback. - */ - -/** - * PDF page operator list. - * - * @typedef {Object} PDFOperatorList - * @property {Array} fnArray - Array containing the operator functions. - * @property {Array} argsArray - Array containing the arguments of the - * functions. - */ - -/** - * Proxy to a PDFPage in the worker thread. - * @class - * @alias PDFPageProxy - */ -var PDFPageProxy = (function PDFPageProxyClosure() { - function PDFPageProxy(pageIndex, pageInfo, transport) { - this.pageIndex = pageIndex; - this.pageInfo = pageInfo; - this.transport = transport; - this.stats = new StatTimer(); - this.stats.enabled = !!globalScope.PDFJS.enableStats; - this.commonObjs = transport.commonObjs; - this.objs = new PDFObjects(); - this.cleanupAfterRender = false; - this.pendingCleanup = false; - this.intentStates = {}; - this.destroyed = false; - } - PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ { - /** - * @return {number} Page number of the page. First page is 1. - */ - get pageNumber() { - return this.pageIndex + 1; - }, - /** - * @return {number} The number of degrees the page is rotated clockwise. - */ - get rotate() { - return this.pageInfo.rotate; - }, - /** - * @return {Object} The reference that points to this page. It has 'num' and - * 'gen' properties. - */ - get ref() { - return this.pageInfo.ref; - }, - /** - * @return {Array} An array of the visible portion of the PDF page in the - * user space units - [x1, y1, x2, y2]. - */ - get view() { - return this.pageInfo.view; - }, - /** - * @param {number} scale The desired scale of the viewport. - * @param {number} rotate Degrees to rotate the viewport. If omitted this - * defaults to the page rotation. - * @return {PDFJS.PageViewport} Contains 'width' and 'height' properties - * along with transforms required for rendering. - */ - getViewport: function PDFPageProxy_getViewport(scale, rotate) { - if (arguments.length < 2) { - rotate = this.rotate; - } - return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0); - }, - /** - * @param {GetAnnotationsParameters} params - Annotation parameters. - * @return {Promise} A promise that is resolved with an {Array} of the - * annotation objects. - */ - getAnnotations: function PDFPageProxy_getAnnotations(params) { - var intent = (params && params.intent) || null; - - if (!this.annotationsPromise || this.annotationsIntent !== intent) { - this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, - intent); - this.annotationsIntent = intent; - } - return this.annotationsPromise; - }, - /** - * Begins the process of rendering a page to the desired context. - * @param {RenderParameters} params Page render parameters. - * @return {RenderTask} An object that contains the promise, which - * is resolved when the page finishes rendering. - */ - render: function PDFPageProxy_render(params) { - var stats = this.stats; - stats.time('Overall'); - - // If there was a pending destroy cancel it so no cleanup happens during - // this call to render. - this.pendingCleanup = false; - - var renderingIntent = (params.intent === 'print' ? 'print' : 'display'); - - if (!this.intentStates[renderingIntent]) { - this.intentStates[renderingIntent] = {}; - } - var intentState = this.intentStates[renderingIntent]; - - // If there's no displayReadyCapability yet, then the operatorList - // was never requested before. Make the request and create the promise. - if (!intentState.displayReadyCapability) { - intentState.receivingOperatorList = true; - intentState.displayReadyCapability = createPromiseCapability(); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false - }; - - this.stats.time('Page Request'); - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageNumber - 1, - intent: renderingIntent - }); - } - - var internalRenderTask = new InternalRenderTask(complete, params, - this.objs, - this.commonObjs, - intentState.operatorList, - this.pageNumber); - internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print'; - if (!intentState.renderTasks) { - intentState.renderTasks = []; - } - intentState.renderTasks.push(internalRenderTask); - var renderTask = internalRenderTask.task; - - // Obsolete parameter support - if (params.continueCallback) { - deprecated('render is used with continueCallback parameter'); - renderTask.onContinue = params.continueCallback; - } - - var self = this; - intentState.displayReadyCapability.promise.then( - function pageDisplayReadyPromise(transparency) { - if (self.pendingCleanup) { - complete(); - return; - } - stats.time('Rendering'); - internalRenderTask.initalizeGraphics(transparency); - internalRenderTask.operatorListChanged(); - }, - function pageDisplayReadPromiseError(reason) { - complete(reason); - } - ); - - function complete(error) { - var i = intentState.renderTasks.indexOf(internalRenderTask); - if (i >= 0) { - intentState.renderTasks.splice(i, 1); - } - - if (self.cleanupAfterRender) { - self.pendingCleanup = true; - } - self._tryCleanup(); - - if (error) { - internalRenderTask.capability.reject(error); - } else { - internalRenderTask.capability.resolve(); - } - stats.timeEnd('Rendering'); - stats.timeEnd('Overall'); - } - - return renderTask; - }, - - /** - * @return {Promise} A promise resolved with an {@link PDFOperatorList} - * object that represents page's operator list. - */ - getOperatorList: function PDFPageProxy_getOperatorList() { - function operatorListChanged() { - if (intentState.operatorList.lastChunk) { - intentState.opListReadCapability.resolve(intentState.operatorList); - } - } - - var renderingIntent = 'oplist'; - if (!this.intentStates[renderingIntent]) { - this.intentStates[renderingIntent] = {}; - } - var intentState = this.intentStates[renderingIntent]; - - if (!intentState.opListReadCapability) { - var opListTask = {}; - opListTask.operatorListChanged = operatorListChanged; - intentState.receivingOperatorList = true; - intentState.opListReadCapability = createPromiseCapability(); - intentState.renderTasks = []; - intentState.renderTasks.push(opListTask); - intentState.operatorList = { - fnArray: [], - argsArray: [], - lastChunk: false - }; - - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageIndex, - intent: renderingIntent - }); - } - return intentState.opListReadCapability.promise; - }, - - /** - * @param {getTextContentParameters} params - getTextContent parameters. - * @return {Promise} That is resolved a {@link TextContent} - * object that represent the page text content. - */ - getTextContent: function PDFPageProxy_getTextContent(params) { - var normalizeWhitespace = (params && params.normalizeWhitespace) || false; - - return this.transport.messageHandler.sendWithPromise('GetTextContent', { - pageIndex: this.pageNumber - 1, - normalizeWhitespace: normalizeWhitespace, - }); - }, - - /** - * Destroys page object. - */ - _destroy: function PDFPageProxy_destroy() { - this.destroyed = true; - this.transport.pageCache[this.pageIndex] = null; - - var waitOn = []; - Object.keys(this.intentStates).forEach(function(intent) { - var intentState = this.intentStates[intent]; - intentState.renderTasks.forEach(function(renderTask) { - var renderCompleted = renderTask.capability.promise. - catch(function () {}); // ignoring failures - waitOn.push(renderCompleted); - renderTask.cancel(); - }); - }, this); - this.objs.clear(); - this.annotationsPromise = null; - this.pendingCleanup = false; - return Promise.all(waitOn); - }, - - /** - * Cleans up resources allocated by the page. (deprecated) - */ - destroy: function() { - deprecated('page destroy method, use cleanup() instead'); - this.cleanup(); - }, - - /** - * Cleans up resources allocated by the page. - */ - cleanup: function PDFPageProxy_cleanup() { - this.pendingCleanup = true; - this._tryCleanup(); - }, - /** - * For internal use only. Attempts to clean up if rendering is in a state - * where that's possible. - * @ignore - */ - _tryCleanup: function PDFPageProxy_tryCleanup() { - if (!this.pendingCleanup || - Object.keys(this.intentStates).some(function(intent) { - var intentState = this.intentStates[intent]; - return (intentState.renderTasks.length !== 0 || - intentState.receivingOperatorList); - }, this)) { - return; - } - - Object.keys(this.intentStates).forEach(function(intent) { - delete this.intentStates[intent]; - }, this); - this.objs.clear(); - this.annotationsPromise = null; - this.pendingCleanup = false; - }, - /** - * For internal use only. - * @ignore - */ - _startRenderPage: function PDFPageProxy_startRenderPage(transparency, - intent) { - var intentState = this.intentStates[intent]; - // TODO Refactor RenderPageRequest to separate rendering - // and operator list logic - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.resolve(transparency); - } - }, - /** - * For internal use only. - * @ignore - */ - _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, - intent) { - var intentState = this.intentStates[intent]; - var i, ii; - // Add the new chunk to the current operator list. - for (i = 0, ii = operatorListChunk.length; i < ii; i++) { - intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]); - intentState.operatorList.argsArray.push( - operatorListChunk.argsArray[i]); - } - intentState.operatorList.lastChunk = operatorListChunk.lastChunk; - - // Notify all the rendering tasks there are more operators to be consumed. - for (i = 0; i < intentState.renderTasks.length; i++) { - intentState.renderTasks[i].operatorListChanged(); - } - - if (operatorListChunk.lastChunk) { - intentState.receivingOperatorList = false; - this._tryCleanup(); - } - } - }; - return PDFPageProxy; -})(); - -/** - * PDF.js web worker abstraction, it controls instantiation of PDF documents and - * WorkerTransport for them. If creation of a web worker is not possible, - * a "fake" worker will be used instead. - * @class - */ -var PDFWorker = (function PDFWorkerClosure() { - var nextFakeWorkerId = 0; - - function getWorkerSrc() { - if (PDFJS.workerSrc) { - return PDFJS.workerSrc; - } - if (pdfjsFilePath) { - return pdfjsFilePath.replace(/\.js$/i, '.worker.js'); - } - error('No PDFJS.workerSrc specified'); - } - - // Loads worker code into main thread. - function setupFakeWorkerGlobal() { - if (!PDFJS.fakeWorkerFilesLoadedCapability) { - PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability(); - // In the developer build load worker_loader which in turn loads all the - // other files and resolves the promise. In production only the - // pdf.worker.js file is needed. - var loader = fakeWorkerFilesLoader || function (callback) { - Util.loadScript(getWorkerSrc(), callback); - }; - loader(function () { - PDFJS.fakeWorkerFilesLoadedCapability.resolve(); - }); - } - return PDFJS.fakeWorkerFilesLoadedCapability.promise; - } - - function PDFWorker(name) { - this.name = name; - this.destroyed = false; - - this._readyCapability = createPromiseCapability(); - this._port = null; - this._webWorker = null; - this._messageHandler = null; - this._initialize(); - } - - PDFWorker.prototype = /** @lends PDFWorker.prototype */ { - get promise() { - return this._readyCapability.promise; - }, - - get port() { - return this._port; - }, - - get messageHandler() { - return this._messageHandler; - }, - - _initialize: function PDFWorker_initialize() { - // If worker support isn't disabled explicit and the browser has worker - // support, create a new web worker and test if it/the browser fullfills - // all requirements to run parts of pdf.js in a web worker. - // Right now, the requirement is, that an Uint8Array is still an - // Uint8Array as it arrives on the worker. (Chrome added this with v.15.) - if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { - var workerSrc = getWorkerSrc(); - - try { - // Some versions of FF can't create a worker on localhost, see: - // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 - var worker = new Worker(workerSrc); - var messageHandler = new MessageHandler('main', 'worker', worker); - messageHandler.on('test', function PDFWorker_test(data) { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - messageHandler.destroy(); - worker.terminate(); - return; // worker was destroyed - } - var supportTypedArray = data && data.supportTypedArray; - if (supportTypedArray) { - this._messageHandler = messageHandler; - this._port = worker; - this._webWorker = worker; - if (!data.supportTransfers) { - PDFJS.postMessageTransfers = false; - } - this._readyCapability.resolve(); - } else { - this._setupFakeWorker(); - messageHandler.destroy(); - worker.terminate(); - } - }.bind(this)); - - messageHandler.on('console_log', function (data) { - console.log.apply(console, data); - }); - messageHandler.on('console_error', function (data) { - console.error.apply(console, data); - }); - - messageHandler.on('ready', function (data) { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - messageHandler.destroy(); - worker.terminate(); - return; // worker was destroyed - } - try { - sendTest(); - } catch (e) { - // We need fallback to a faked worker. - this._setupFakeWorker(); - } - }.bind(this)); - - var sendTest = function () { - var testObj = new Uint8Array( - [PDFJS.postMessageTransfers ? 255 : 0]); - // Some versions of Opera throw a DATA_CLONE_ERR on serializing the - // typed array. Also, checking if we can use transfers. - try { - messageHandler.send('test', testObj, [testObj.buffer]); - } catch (ex) { - info('Cannot use postMessage transfers'); - testObj[0] = 0; - messageHandler.send('test', testObj); - } - }; - - // It might take time for worker to initialize (especially when AMD - // loader is used). We will try to send test immediately, and then - // when 'ready' message will arrive. The worker shall process only - // first received 'test'. - sendTest(); - return; - } catch (e) { - info('The worker has been disabled.'); - } - } - // Either workers are disabled, not supported or have thrown an exception. - // Thus, we fallback to a faked worker. - this._setupFakeWorker(); - }, - - _setupFakeWorker: function PDFWorker_setupFakeWorker() { - if (!globalScope.PDFJS.disableWorker) { - warn('Setting up fake worker.'); - globalScope.PDFJS.disableWorker = true; - } - - setupFakeWorkerGlobal().then(function () { - if (this.destroyed) { - this._readyCapability.reject(new Error('Worker was destroyed')); - return; - } - - // If we don't use a worker, just post/sendMessage to the main thread. - var port = { - _listeners: [], - postMessage: function (obj) { - var e = {data: obj}; - this._listeners.forEach(function (listener) { - listener.call(this, e); - }, this); - }, - addEventListener: function (name, listener) { - this._listeners.push(listener); - }, - removeEventListener: function (name, listener) { - var i = this._listeners.indexOf(listener); - this._listeners.splice(i, 1); - }, - terminate: function () {} - }; - this._port = port; - - // All fake workers use the same port, making id unique. - var id = 'fake' + (nextFakeWorkerId++); - - // If the main thread is our worker, setup the handling for the - // messages -- the main thread sends to it self. - var workerHandler = new MessageHandler(id + '_worker', id, port); - PDFJS.WorkerMessageHandler.setup(workerHandler, port); - - var messageHandler = new MessageHandler(id, id + '_worker', port); - this._messageHandler = messageHandler; - this._readyCapability.resolve(); - }.bind(this)); - }, - - /** - * Destroys the worker instance. - */ - destroy: function PDFWorker_destroy() { - this.destroyed = true; - if (this._webWorker) { - // We need to terminate only web worker created resource. - this._webWorker.terminate(); - this._webWorker = null; - } - this._port = null; - if (this._messageHandler) { - this._messageHandler.destroy(); - this._messageHandler = null; - } - } - }; - - return PDFWorker; -})(); -PDFJS.PDFWorker = PDFWorker; - -/** - * For internal use only. - * @ignore - */ -var WorkerTransport = (function WorkerTransportClosure() { - function WorkerTransport(messageHandler, loadingTask, pdfDataRangeTransport) { - this.messageHandler = messageHandler; - this.loadingTask = loadingTask; - this.pdfDataRangeTransport = pdfDataRangeTransport; - this.commonObjs = new PDFObjects(); - this.fontLoader = new FontLoader(loadingTask.docId); - - this.destroyed = false; - this.destroyCapability = null; - - this.pageCache = []; - this.pagePromises = []; - this.downloadInfoCapability = createPromiseCapability(); - - this.setupMessageHandler(); - } - WorkerTransport.prototype = { - destroy: function WorkerTransport_destroy() { - if (this.destroyCapability) { - return this.destroyCapability.promise; - } - - this.destroyed = true; - this.destroyCapability = createPromiseCapability(); - - var waitOn = []; - // We need to wait for all renderings to be completed, e.g. - // timeout/rAF can take a long time. - this.pageCache.forEach(function (page) { - if (page) { - waitOn.push(page._destroy()); - } - }); - this.pageCache = []; - this.pagePromises = []; - var self = this; - // We also need to wait for the worker to finish its long running tasks. - var terminated = this.messageHandler.sendWithPromise('Terminate', null); - waitOn.push(terminated); - Promise.all(waitOn).then(function () { - self.fontLoader.clear(); - if (self.pdfDataRangeTransport) { - self.pdfDataRangeTransport.abort(); - self.pdfDataRangeTransport = null; - } - if (self.messageHandler) { - self.messageHandler.destroy(); - self.messageHandler = null; - } - self.destroyCapability.resolve(); - }, this.destroyCapability.reject); - return this.destroyCapability.promise; - }, - - setupMessageHandler: - function WorkerTransport_setupMessageHandler() { - var messageHandler = this.messageHandler; - - function updatePassword(password) { - messageHandler.send('UpdatePassword', password); - } - - var pdfDataRangeTransport = this.pdfDataRangeTransport; - if (pdfDataRangeTransport) { - pdfDataRangeTransport.addRangeListener(function(begin, chunk) { - messageHandler.send('OnDataRange', { - begin: begin, - chunk: chunk - }); - }); - - pdfDataRangeTransport.addProgressListener(function(loaded) { - messageHandler.send('OnDataProgress', { - loaded: loaded - }); - }); - - pdfDataRangeTransport.addProgressiveReadListener(function(chunk) { - messageHandler.send('OnDataRange', { - chunk: chunk - }); - }); - - messageHandler.on('RequestDataRange', - function transportDataRange(data) { - pdfDataRangeTransport.requestDataRange(data.begin, data.end); - }, this); - } - - messageHandler.on('GetDoc', function transportDoc(data) { - var pdfInfo = data.pdfInfo; - this.numPages = data.pdfInfo.numPages; - var loadingTask = this.loadingTask; - var pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask); - this.pdfDocument = pdfDocument; - loadingTask._capability.resolve(pdfDocument); - }, this); - - messageHandler.on('NeedPassword', - function transportNeedPassword(exception) { - var loadingTask = this.loadingTask; - if (loadingTask.onPassword) { - return loadingTask.onPassword(updatePassword, - PasswordResponses.NEED_PASSWORD); - } - loadingTask._capability.reject( - new PasswordException(exception.message, exception.code)); - }, this); - - messageHandler.on('IncorrectPassword', - function transportIncorrectPassword(exception) { - var loadingTask = this.loadingTask; - if (loadingTask.onPassword) { - return loadingTask.onPassword(updatePassword, - PasswordResponses.INCORRECT_PASSWORD); - } - loadingTask._capability.reject( - new PasswordException(exception.message, exception.code)); - }, this); - - messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) { - this.loadingTask._capability.reject( - new InvalidPDFException(exception.message)); - }, this); - - messageHandler.on('MissingPDF', function transportMissingPDF(exception) { - this.loadingTask._capability.reject( - new MissingPDFException(exception.message)); - }, this); - - messageHandler.on('UnexpectedResponse', - function transportUnexpectedResponse(exception) { - this.loadingTask._capability.reject( - new UnexpectedResponseException(exception.message, exception.status)); - }, this); - - messageHandler.on('UnknownError', - function transportUnknownError(exception) { - this.loadingTask._capability.reject( - new UnknownErrorException(exception.message, exception.details)); - }, this); - - messageHandler.on('DataLoaded', function transportPage(data) { - this.downloadInfoCapability.resolve(data); - }, this); - - messageHandler.on('PDFManagerReady', function transportPage(data) { - if (this.pdfDataRangeTransport) { - this.pdfDataRangeTransport.transportReady(); - } - }, this); - - messageHandler.on('StartRenderPage', function transportRender(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var page = this.pageCache[data.pageIndex]; - - page.stats.timeEnd('Page Request'); - page._startRenderPage(data.transparency, data.intent); - }, this); - - messageHandler.on('RenderPageChunk', function transportRender(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var page = this.pageCache[data.pageIndex]; - - page._renderPageChunk(data.operatorList, data.intent); - }, this); - - messageHandler.on('commonobj', function transportObj(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var id = data[0]; - var type = data[1]; - if (this.commonObjs.hasData(id)) { - return; - } - - switch (type) { - case 'Font': - var exportedData = data[2]; - - var font; - if ('error' in exportedData) { - var error = exportedData.error; - warn('Error during font loading: ' + error); - this.commonObjs.resolve(id, error); - break; - } else { - font = new FontFaceObject(exportedData); - } - - this.fontLoader.bind( - [font], - function fontReady(fontObjs) { - this.commonObjs.resolve(id, font); - }.bind(this) - ); - break; - case 'FontPath': - this.commonObjs.resolve(id, data[2]); - break; - default: - error('Got unknown common object type ' + type); - } - }, this); - - messageHandler.on('obj', function transportObj(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var id = data[0]; - var pageIndex = data[1]; - var type = data[2]; - var pageProxy = this.pageCache[pageIndex]; - var imageData; - if (pageProxy.objs.hasData(id)) { - return; - } - - switch (type) { - case 'JpegStream': - imageData = data[3]; - loadJpegStream(id, imageData, pageProxy.objs); - break; - case 'Image': - imageData = data[3]; - pageProxy.objs.resolve(id, imageData); - - // heuristics that will allow not to store large data - var MAX_IMAGE_SIZE_TO_STORE = 8000000; - if (imageData && 'data' in imageData && - imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) { - pageProxy.cleanupAfterRender = true; - } - break; - default: - error('Got unknown object type ' + type); - } - }, this); - - messageHandler.on('DocProgress', function transportDocProgress(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var loadingTask = this.loadingTask; - if (loadingTask.onProgress) { - loadingTask.onProgress({ - loaded: data.loaded, - total: data.total - }); - } - }, this); - - messageHandler.on('PageError', function transportError(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - - var page = this.pageCache[data.pageNum - 1]; - var intentState = page.intentStates[data.intent]; - if (intentState.displayReadyCapability) { - intentState.displayReadyCapability.reject(data.error); - } else { - error(data.error); - } - }, this); - - messageHandler.on('UnsupportedFeature', - function transportUnsupportedFeature(data) { - if (this.destroyed) { - return; // Ignore any pending requests if the worker was terminated. - } - var featureId = data.featureId; - var loadingTask = this.loadingTask; - if (loadingTask.onUnsupportedFeature) { - loadingTask.onUnsupportedFeature(featureId); - } - PDFJS.UnsupportedManager.notify(featureId); - }, this); - - messageHandler.on('JpegDecode', function(data) { - if (this.destroyed) { - return Promise.reject('Worker was terminated'); - } - - var imageUrl = data[0]; - var components = data[1]; - if (components !== 3 && components !== 1) { - return Promise.reject( - new Error('Only 3 components or 1 component can be returned')); - } - - return new Promise(function (resolve, reject) { - var img = new Image(); - img.onload = function () { - var width = img.width; - var height = img.height; - var size = width * height; - var rgbaLength = size * 4; - var buf = new Uint8Array(size * components); - var tmpCanvas = createScratchCanvas(width, height); - var tmpCtx = tmpCanvas.getContext('2d'); - tmpCtx.drawImage(img, 0, 0); - var data = tmpCtx.getImageData(0, 0, width, height).data; - var i, j; - - if (components === 3) { - for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) { - buf[j] = data[i]; - buf[j + 1] = data[i + 1]; - buf[j + 2] = data[i + 2]; - } - } else if (components === 1) { - for (i = 0, j = 0; i < rgbaLength; i += 4, j++) { - buf[j] = data[i]; - } - } - resolve({ data: buf, width: width, height: height}); - }; - img.onerror = function () { - reject(new Error('JpegDecode failed to load image')); - }; - img.src = imageUrl; - }); - }, this); - }, - - getData: function WorkerTransport_getData() { - return this.messageHandler.sendWithPromise('GetData', null); - }, - - getPage: function WorkerTransport_getPage(pageNumber, capability) { - if (pageNumber <= 0 || pageNumber > this.numPages || - (pageNumber|0) !== pageNumber) { - return Promise.reject(new Error('Invalid page request')); - } - - var pageIndex = pageNumber - 1; - if (pageIndex in this.pagePromises) { - return this.pagePromises[pageIndex]; - } - var promise = this.messageHandler.sendWithPromise('GetPage', { - pageIndex: pageIndex - }).then(function (pageInfo) { - if (this.destroyed) { - throw new Error('Transport destroyed'); - } - var page = new PDFPageProxy(pageIndex, pageInfo, this); - this.pageCache[pageIndex] = page; - return page; - }.bind(this)); - this.pagePromises[pageIndex] = promise; - return promise; - }, - - getPageIndex: function WorkerTransport_getPageIndexByRef(ref) { - return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }); - }, - - getAnnotations: function WorkerTransport_getAnnotations(pageIndex, intent) { - return this.messageHandler.sendWithPromise('GetAnnotations', { - pageIndex: pageIndex, - intent: intent, - }); - }, - - getDestinations: function WorkerTransport_getDestinations() { - return this.messageHandler.sendWithPromise('GetDestinations', null); - }, - - getDestination: function WorkerTransport_getDestination(id) { - return this.messageHandler.sendWithPromise('GetDestination', { id: id }); - }, - - getPageLabels: function WorkerTransport_getPageLabels() { - return this.messageHandler.sendWithPromise('GetPageLabels', null); - }, - - getAttachments: function WorkerTransport_getAttachments() { - return this.messageHandler.sendWithPromise('GetAttachments', null); - }, - - getJavaScript: function WorkerTransport_getJavaScript() { - return this.messageHandler.sendWithPromise('GetJavaScript', null); - }, - - getOutline: function WorkerTransport_getOutline() { - return this.messageHandler.sendWithPromise('GetOutline', null); - }, - - getMetadata: function WorkerTransport_getMetadata() { - return this.messageHandler.sendWithPromise('GetMetadata', null). - then(function transportMetadata(results) { - return { - info: results[0], - metadata: (results[1] ? new Metadata(results[1]) : null) - }; - }); - }, - - getStats: function WorkerTransport_getStats() { - return this.messageHandler.sendWithPromise('GetStats', null); - }, - - startCleanup: function WorkerTransport_startCleanup() { - this.messageHandler.sendWithPromise('Cleanup', null). - then(function endCleanup() { - for (var i = 0, ii = this.pageCache.length; i < ii; i++) { - var page = this.pageCache[i]; - if (page) { - page.cleanup(); - } - } - this.commonObjs.clear(); - this.fontLoader.clear(); - }.bind(this)); - } - }; - return WorkerTransport; - -})(); - -/** - * A PDF document and page is built of many objects. E.g. there are objects - * for fonts, images, rendering code and such. These objects might get processed - * inside of a worker. The `PDFObjects` implements some basic functions to - * manage these objects. - * @ignore - */ -var PDFObjects = (function PDFObjectsClosure() { - function PDFObjects() { - this.objs = {}; - } - - PDFObjects.prototype = { - /** - * Internal function. - * Ensures there is an object defined for `objId`. - */ - ensureObj: function PDFObjects_ensureObj(objId) { - if (this.objs[objId]) { - return this.objs[objId]; - } - - var obj = { - capability: createPromiseCapability(), - data: null, - resolved: false - }; - this.objs[objId] = obj; - - return obj; - }, - - /** - * If called *without* callback, this returns the data of `objId` but the - * object needs to be resolved. If it isn't, this function throws. - * - * If called *with* a callback, the callback is called with the data of the - * object once the object is resolved. That means, if you call this - * function and the object is already resolved, the callback gets called - * right away. - */ - get: function PDFObjects_get(objId, callback) { - // If there is a callback, then the get can be async and the object is - // not required to be resolved right now - if (callback) { - this.ensureObj(objId).capability.promise.then(callback); - return null; - } - - // If there isn't a callback, the user expects to get the resolved data - // directly. - var obj = this.objs[objId]; - - // If there isn't an object yet or the object isn't resolved, then the - // data isn't ready yet! - if (!obj || !obj.resolved) { - error('Requesting object that isn\'t resolved yet ' + objId); - } - - return obj.data; - }, - - /** - * Resolves the object `objId` with optional `data`. - */ - resolve: function PDFObjects_resolve(objId, data) { - var obj = this.ensureObj(objId); - - obj.resolved = true; - obj.data = data; - obj.capability.resolve(data); - }, - - isResolved: function PDFObjects_isResolved(objId) { - var objs = this.objs; - - if (!objs[objId]) { - return false; - } else { - return objs[objId].resolved; - } - }, - - hasData: function PDFObjects_hasData(objId) { - return this.isResolved(objId); - }, - - /** - * Returns the data of `objId` if object exists, null otherwise. - */ - getData: function PDFObjects_getData(objId) { - var objs = this.objs; - if (!objs[objId] || !objs[objId].resolved) { - return null; - } else { - return objs[objId].data; - } - }, - - clear: function PDFObjects_clear() { - this.objs = {}; - } - }; - return PDFObjects; -})(); - -/** - * Allows controlling of the rendering tasks. - * @class - * @alias RenderTask - */ -var RenderTask = (function RenderTaskClosure() { - function RenderTask(internalRenderTask) { - this._internalRenderTask = internalRenderTask; - - /** - * Callback for incremental rendering -- a function that will be called - * each time the rendering is paused. To continue rendering call the - * function that is the first argument to the callback. - * @type {function} - */ - this.onContinue = null; - } - - RenderTask.prototype = /** @lends RenderTask.prototype */ { - /** - * Promise for rendering task completion. - * @return {Promise} - */ - get promise() { - return this._internalRenderTask.capability.promise; - }, - - /** - * Cancels the rendering task. If the task is currently rendering it will - * not be cancelled until graphics pauses with a timeout. The promise that - * this object extends will resolved when cancelled. - */ - cancel: function RenderTask_cancel() { - this._internalRenderTask.cancel(); - }, - - /** - * Registers callbacks to indicate the rendering task completion. - * - * @param {function} onFulfilled The callback for the rendering completion. - * @param {function} onRejected The callback for the rendering failure. - * @return {Promise} A promise that is resolved after the onFulfilled or - * onRejected callback. - */ - then: function RenderTask_then(onFulfilled, onRejected) { - return this.promise.then.apply(this.promise, arguments); - } - }; - - return RenderTask; -})(); - -/** - * For internal use only. - * @ignore - */ -var InternalRenderTask = (function InternalRenderTaskClosure() { - - function InternalRenderTask(callback, params, objs, commonObjs, operatorList, - pageNumber) { - this.callback = callback; - this.params = params; - this.objs = objs; - this.commonObjs = commonObjs; - this.operatorListIdx = null; - this.operatorList = operatorList; - this.pageNumber = pageNumber; - this.running = false; - this.graphicsReadyCallback = null; - this.graphicsReady = false; - this.useRequestAnimationFrame = false; - this.cancelled = false; - this.capability = createPromiseCapability(); - this.task = new RenderTask(this); - // caching this-bound methods - this._continueBound = this._continue.bind(this); - this._scheduleNextBound = this._scheduleNext.bind(this); - this._nextBound = this._next.bind(this); - } - - InternalRenderTask.prototype = { - - initalizeGraphics: - function InternalRenderTask_initalizeGraphics(transparency) { - - if (this.cancelled) { - return; - } - if (PDFJS.pdfBug && 'StepperManager' in globalScope && - globalScope.StepperManager.enabled) { - this.stepper = globalScope.StepperManager.create(this.pageNumber - 1); - this.stepper.init(this.operatorList); - this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint(); - } - - var params = this.params; - this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs, - this.objs, params.imageLayer); - - this.gfx.beginDrawing(params.transform, params.viewport, transparency); - this.operatorListIdx = 0; - this.graphicsReady = true; - if (this.graphicsReadyCallback) { - this.graphicsReadyCallback(); - } - }, - - cancel: function InternalRenderTask_cancel() { - this.running = false; - this.cancelled = true; - this.callback('cancelled'); - }, - - operatorListChanged: function InternalRenderTask_operatorListChanged() { - if (!this.graphicsReady) { - if (!this.graphicsReadyCallback) { - this.graphicsReadyCallback = this._continueBound; - } - return; - } - - if (this.stepper) { - this.stepper.updateOperatorList(this.operatorList); - } - - if (this.running) { - return; - } - this._continue(); - }, - - _continue: function InternalRenderTask__continue() { - this.running = true; - if (this.cancelled) { - return; - } - if (this.task.onContinue) { - this.task.onContinue.call(this.task, this._scheduleNextBound); - } else { - this._scheduleNext(); - } - }, - - _scheduleNext: function InternalRenderTask__scheduleNext() { - if (this.useRequestAnimationFrame) { - window.requestAnimationFrame(this._nextBound); - } else { - Promise.resolve(undefined).then(this._nextBound); - } - }, - - _next: function InternalRenderTask__next() { - if (this.cancelled) { - return; - } - this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, - this.operatorListIdx, - this._continueBound, - this.stepper); - if (this.operatorListIdx === this.operatorList.argsArray.length) { - this.running = false; - if (this.operatorList.lastChunk) { - this.gfx.endDrawing(); - this.callback(); - } - } - } - - }; - - return InternalRenderTask; -})(); - -/** - * (Deprecated) Global observer of unsupported feature usages. Use - * onUnsupportedFeature callback of the {PDFDocumentLoadingTask} instance. - */ -PDFJS.UnsupportedManager = (function UnsupportedManagerClosure() { - var listeners = []; - return { - listen: function (cb) { - deprecated('Global UnsupportedManager.listen is used: ' + - ' use PDFDocumentLoadingTask.onUnsupportedFeature instead'); - listeners.push(cb); - }, - notify: function (featureId) { - for (var i = 0, ii = listeners.length; i < ii; i++) { - listeners[i](featureId); - } - } - }; -})(); - -exports.getDocument = PDFJS.getDocument; -exports.PDFDataRangeTransport = PDFDataRangeTransport; -exports.PDFDocumentProxy = PDFDocumentProxy; -exports.PDFPageProxy = PDFPageProxy; -})); - - - }).call(pdfjsLibs); - - exports.PDFJS = pdfjsLibs.pdfjsSharedGlobal.PDFJS; - - exports.getDocument = pdfjsLibs.pdfjsDisplayAPI.getDocument; - exports.PDFDataRangeTransport = - pdfjsLibs.pdfjsDisplayAPI.PDFDataRangeTransport; - exports.renderTextLayer = pdfjsLibs.pdfjsDisplayTextLayer.renderTextLayer; - exports.AnnotationLayer = - pdfjsLibs.pdfjsDisplayAnnotationLayer.AnnotationLayer; - exports.CustomStyle = pdfjsLibs.pdfjsDisplayDOMUtils.CustomStyle; - exports.PasswordResponses = pdfjsLibs.pdfjsSharedUtil.PasswordResponses; - exports.InvalidPDFException = pdfjsLibs.pdfjsSharedUtil.InvalidPDFException; - exports.MissingPDFException = pdfjsLibs.pdfjsSharedUtil.MissingPDFException; - exports.UnexpectedResponseException = - pdfjsLibs.pdfjsSharedUtil.UnexpectedResponseException; -})); - - diff --git a/public/plugins/pdfjs-1.4.20/build/pdf.worker.js b/public/plugins/pdfjs-1.4.20/build/pdf.worker.js deleted file mode 100644 index 821ceac..0000000 --- a/public/plugins/pdfjs-1.4.20/build/pdf.worker.js +++ /dev/null @@ -1,42034 +0,0 @@ -/* Copyright 2012 Mozilla Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* jshint globalstrict: false */ -/* umdutils ignore */ - -(function (root, factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { -define('pdfjs-dist/build/pdf.worker', ['exports'], factory); - } else if (typeof exports !== 'undefined') { - factory(exports); - } else { -factory((root.pdfjsDistBuildPdfWorker = {})); - } -}(this, function (exports) { - // Use strict in our context only - users might not want it - 'use strict'; - -var pdfjsVersion = '1.4.20'; -var pdfjsBuild = 'b15f335'; - - var pdfjsFilePath = - typeof document !== 'undefined' && document.currentScript ? - document.currentScript.src : null; - - var pdfjsLibs = {}; - - (function pdfjsWrapper() { - - - -(function (root, factory) { - { - factory((root.pdfjsCoreArithmeticDecoder = {})); - } -}(this, function (exports) { - -/* This class implements the QM Coder decoding as defined in - * JPEG 2000 Part I Final Committee Draft Version 1.0 - * Annex C.3 Arithmetic decoding procedure - * available at http://www.jpeg.org/public/fcd15444-1.pdf - * - * The arithmetic decoder is used in conjunction with context models to decode - * JPEG2000 and JBIG2 streams. - */ -var ArithmeticDecoder = (function ArithmeticDecoderClosure() { - // Table C-2 - var QeTable = [ - {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1}, - {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0}, - {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0}, - {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0}, - {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0}, - {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0}, - {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1}, - {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0}, - {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0}, - {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0}, - {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0}, - {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0}, - {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0}, - {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0}, - {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1}, - {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0}, - {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0}, - {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0}, - {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0}, - {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0}, - {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0}, - {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0}, - {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0}, - {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0}, - {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0}, - {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0}, - {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0}, - {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0}, - {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0}, - {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0}, - {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0}, - {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0}, - {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0}, - {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0}, - {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0}, - {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0}, - {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0}, - {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0}, - {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0}, - {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0}, - {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0}, - {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0}, - {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0}, - {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0}, - {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0}, - {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0}, - {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0} - ]; - - // C.3.5 Initialisation of the decoder (INITDEC) - function ArithmeticDecoder(data, start, end) { - this.data = data; - this.bp = start; - this.dataEnd = end; - - this.chigh = data[start]; - this.clow = 0; - - this.byteIn(); - - this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F); - this.clow = (this.clow << 7) & 0xFFFF; - this.ct -= 7; - this.a = 0x8000; - } - - ArithmeticDecoder.prototype = { - // C.3.4 Compressed data input (BYTEIN) - byteIn: function ArithmeticDecoder_byteIn() { - var data = this.data; - var bp = this.bp; - if (data[bp] === 0xFF) { - var b1 = data[bp + 1]; - if (b1 > 0x8F) { - this.clow += 0xFF00; - this.ct = 8; - } else { - bp++; - this.clow += (data[bp] << 9); - this.ct = 7; - this.bp = bp; - } - } else { - bp++; - this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00; - this.ct = 8; - this.bp = bp; - } - if (this.clow > 0xFFFF) { - this.chigh += (this.clow >> 16); - this.clow &= 0xFFFF; - } - }, - // C.3.2 Decoding a decision (DECODE) - readBit: function ArithmeticDecoder_readBit(contexts, pos) { - // contexts are packed into 1 byte: - // highest 7 bits carry cx.index, lowest bit carries cx.mps - var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1; - var qeTableIcx = QeTable[cx_index]; - var qeIcx = qeTableIcx.qe; - var d; - var a = this.a - qeIcx; - - if (this.chigh < qeIcx) { - // exchangeLps - if (a < qeIcx) { - a = qeIcx; - d = cx_mps; - cx_index = qeTableIcx.nmps; - } else { - a = qeIcx; - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } - } else { - this.chigh -= qeIcx; - if ((a & 0x8000) !== 0) { - this.a = a; - return cx_mps; - } - // exchangeMps - if (a < qeIcx) { - d = 1 ^ cx_mps; - if (qeTableIcx.switchFlag === 1) { - cx_mps = d; - } - cx_index = qeTableIcx.nlps; - } else { - d = cx_mps; - cx_index = qeTableIcx.nmps; - } - } - // C.3.3 renormD; - do { - if (this.ct === 0) { - this.byteIn(); - } - - a <<= 1; - this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1); - this.clow = (this.clow << 1) & 0xFFFF; - this.ct--; - } while ((a & 0x8000) === 0); - this.a = a; - - contexts[pos] = cx_index << 1 | cx_mps; - return d; - } - }; - - return ArithmeticDecoder; -})(); - -exports.ArithmeticDecoder = ArithmeticDecoder; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreCharsets = {})); - } -}(this, function (exports) { - -var ISOAdobeCharset = [ - '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', - 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', - 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', - 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', - 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', - 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', - 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', - 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', - 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', - 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', - 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', - 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', - 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', - 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', - 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', - 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', - 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', - 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', - 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', - 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', - 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', - 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', - 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', - 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', - 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', - 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', - 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', - 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', - 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', - 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', - 'ugrave', 'yacute', 'ydieresis', 'zcaron' -]; - -var ExpertCharset = [ - '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', - 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', - 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', - 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', - 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', - 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', - 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', - 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', - 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', - 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', - 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', - 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', - 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', - 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', - 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', - 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', - 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', - 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', - 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', - 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', - 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', - 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', - 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', - 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', - 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', - 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', - 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', - 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', - 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', - 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', - 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', - 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', - 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', - 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', - 'Ydieresissmall' -]; - -var ExpertSubsetCharset = [ - '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', - 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', - 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', - 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', - 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', - 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', - 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', - 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', - 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', - 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', - 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', - 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', - 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', - 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', - 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', - 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', - 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', - 'periodinferior', 'commainferior' -]; - -exports.ISOAdobeCharset = ISOAdobeCharset; -exports.ExpertCharset = ExpertCharset; -exports.ExpertSubsetCharset = ExpertSubsetCharset; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreGlyphList = {})); - } -}(this, function (exports) { - -var GlyphsUnicode = { - A: 0x0041, - AE: 0x00C6, - AEacute: 0x01FC, - AEmacron: 0x01E2, - AEsmall: 0xF7E6, - Aacute: 0x00C1, - Aacutesmall: 0xF7E1, - Abreve: 0x0102, - Abreveacute: 0x1EAE, - Abrevecyrillic: 0x04D0, - Abrevedotbelow: 0x1EB6, - Abrevegrave: 0x1EB0, - Abrevehookabove: 0x1EB2, - Abrevetilde: 0x1EB4, - Acaron: 0x01CD, - Acircle: 0x24B6, - Acircumflex: 0x00C2, - Acircumflexacute: 0x1EA4, - Acircumflexdotbelow: 0x1EAC, - Acircumflexgrave: 0x1EA6, - Acircumflexhookabove: 0x1EA8, - Acircumflexsmall: 0xF7E2, - Acircumflextilde: 0x1EAA, - Acute: 0xF6C9, - Acutesmall: 0xF7B4, - Acyrillic: 0x0410, - Adblgrave: 0x0200, - Adieresis: 0x00C4, - Adieresiscyrillic: 0x04D2, - Adieresismacron: 0x01DE, - Adieresissmall: 0xF7E4, - Adotbelow: 0x1EA0, - Adotmacron: 0x01E0, - Agrave: 0x00C0, - Agravesmall: 0xF7E0, - Ahookabove: 0x1EA2, - Aiecyrillic: 0x04D4, - Ainvertedbreve: 0x0202, - Alpha: 0x0391, - Alphatonos: 0x0386, - Amacron: 0x0100, - Amonospace: 0xFF21, - Aogonek: 0x0104, - Aring: 0x00C5, - Aringacute: 0x01FA, - Aringbelow: 0x1E00, - Aringsmall: 0xF7E5, - Asmall: 0xF761, - Atilde: 0x00C3, - Atildesmall: 0xF7E3, - Aybarmenian: 0x0531, - B: 0x0042, - Bcircle: 0x24B7, - Bdotaccent: 0x1E02, - Bdotbelow: 0x1E04, - Becyrillic: 0x0411, - Benarmenian: 0x0532, - Beta: 0x0392, - Bhook: 0x0181, - Blinebelow: 0x1E06, - Bmonospace: 0xFF22, - Brevesmall: 0xF6F4, - Bsmall: 0xF762, - Btopbar: 0x0182, - C: 0x0043, - Caarmenian: 0x053E, - Cacute: 0x0106, - Caron: 0xF6CA, - Caronsmall: 0xF6F5, - Ccaron: 0x010C, - Ccedilla: 0x00C7, - Ccedillaacute: 0x1E08, - Ccedillasmall: 0xF7E7, - Ccircle: 0x24B8, - Ccircumflex: 0x0108, - Cdot: 0x010A, - Cdotaccent: 0x010A, - Cedillasmall: 0xF7B8, - Chaarmenian: 0x0549, - Cheabkhasiancyrillic: 0x04BC, - Checyrillic: 0x0427, - Chedescenderabkhasiancyrillic: 0x04BE, - Chedescendercyrillic: 0x04B6, - Chedieresiscyrillic: 0x04F4, - Cheharmenian: 0x0543, - Chekhakassiancyrillic: 0x04CB, - Cheverticalstrokecyrillic: 0x04B8, - Chi: 0x03A7, - Chook: 0x0187, - Circumflexsmall: 0xF6F6, - Cmonospace: 0xFF23, - Coarmenian: 0x0551, - Csmall: 0xF763, - D: 0x0044, - DZ: 0x01F1, - DZcaron: 0x01C4, - Daarmenian: 0x0534, - Dafrican: 0x0189, - Dcaron: 0x010E, - Dcedilla: 0x1E10, - Dcircle: 0x24B9, - Dcircumflexbelow: 0x1E12, - Dcroat: 0x0110, - Ddotaccent: 0x1E0A, - Ddotbelow: 0x1E0C, - Decyrillic: 0x0414, - Deicoptic: 0x03EE, - Delta: 0x2206, - Deltagreek: 0x0394, - Dhook: 0x018A, - Dieresis: 0xF6CB, - DieresisAcute: 0xF6CC, - DieresisGrave: 0xF6CD, - Dieresissmall: 0xF7A8, - Digammagreek: 0x03DC, - Djecyrillic: 0x0402, - Dlinebelow: 0x1E0E, - Dmonospace: 0xFF24, - Dotaccentsmall: 0xF6F7, - Dslash: 0x0110, - Dsmall: 0xF764, - Dtopbar: 0x018B, - Dz: 0x01F2, - Dzcaron: 0x01C5, - Dzeabkhasiancyrillic: 0x04E0, - Dzecyrillic: 0x0405, - Dzhecyrillic: 0x040F, - E: 0x0045, - Eacute: 0x00C9, - Eacutesmall: 0xF7E9, - Ebreve: 0x0114, - Ecaron: 0x011A, - Ecedillabreve: 0x1E1C, - Echarmenian: 0x0535, - Ecircle: 0x24BA, - Ecircumflex: 0x00CA, - Ecircumflexacute: 0x1EBE, - Ecircumflexbelow: 0x1E18, - Ecircumflexdotbelow: 0x1EC6, - Ecircumflexgrave: 0x1EC0, - Ecircumflexhookabove: 0x1EC2, - Ecircumflexsmall: 0xF7EA, - Ecircumflextilde: 0x1EC4, - Ecyrillic: 0x0404, - Edblgrave: 0x0204, - Edieresis: 0x00CB, - Edieresissmall: 0xF7EB, - Edot: 0x0116, - Edotaccent: 0x0116, - Edotbelow: 0x1EB8, - Efcyrillic: 0x0424, - Egrave: 0x00C8, - Egravesmall: 0xF7E8, - Eharmenian: 0x0537, - Ehookabove: 0x1EBA, - Eightroman: 0x2167, - Einvertedbreve: 0x0206, - Eiotifiedcyrillic: 0x0464, - Elcyrillic: 0x041B, - Elevenroman: 0x216A, - Emacron: 0x0112, - Emacronacute: 0x1E16, - Emacrongrave: 0x1E14, - Emcyrillic: 0x041C, - Emonospace: 0xFF25, - Encyrillic: 0x041D, - Endescendercyrillic: 0x04A2, - Eng: 0x014A, - Enghecyrillic: 0x04A4, - Enhookcyrillic: 0x04C7, - Eogonek: 0x0118, - Eopen: 0x0190, - Epsilon: 0x0395, - Epsilontonos: 0x0388, - Ercyrillic: 0x0420, - Ereversed: 0x018E, - Ereversedcyrillic: 0x042D, - Escyrillic: 0x0421, - Esdescendercyrillic: 0x04AA, - Esh: 0x01A9, - Esmall: 0xF765, - Eta: 0x0397, - Etarmenian: 0x0538, - Etatonos: 0x0389, - Eth: 0x00D0, - Ethsmall: 0xF7F0, - Etilde: 0x1EBC, - Etildebelow: 0x1E1A, - Euro: 0x20AC, - Ezh: 0x01B7, - Ezhcaron: 0x01EE, - Ezhreversed: 0x01B8, - F: 0x0046, - Fcircle: 0x24BB, - Fdotaccent: 0x1E1E, - Feharmenian: 0x0556, - Feicoptic: 0x03E4, - Fhook: 0x0191, - Fitacyrillic: 0x0472, - Fiveroman: 0x2164, - Fmonospace: 0xFF26, - Fourroman: 0x2163, - Fsmall: 0xF766, - G: 0x0047, - GBsquare: 0x3387, - Gacute: 0x01F4, - Gamma: 0x0393, - Gammaafrican: 0x0194, - Gangiacoptic: 0x03EA, - Gbreve: 0x011E, - Gcaron: 0x01E6, - Gcedilla: 0x0122, - Gcircle: 0x24BC, - Gcircumflex: 0x011C, - Gcommaaccent: 0x0122, - Gdot: 0x0120, - Gdotaccent: 0x0120, - Gecyrillic: 0x0413, - Ghadarmenian: 0x0542, - Ghemiddlehookcyrillic: 0x0494, - Ghestrokecyrillic: 0x0492, - Gheupturncyrillic: 0x0490, - Ghook: 0x0193, - Gimarmenian: 0x0533, - Gjecyrillic: 0x0403, - Gmacron: 0x1E20, - Gmonospace: 0xFF27, - Grave: 0xF6CE, - Gravesmall: 0xF760, - Gsmall: 0xF767, - Gsmallhook: 0x029B, - Gstroke: 0x01E4, - H: 0x0048, - H18533: 0x25CF, - H18543: 0x25AA, - H18551: 0x25AB, - H22073: 0x25A1, - HPsquare: 0x33CB, - Haabkhasiancyrillic: 0x04A8, - Hadescendercyrillic: 0x04B2, - Hardsigncyrillic: 0x042A, - Hbar: 0x0126, - Hbrevebelow: 0x1E2A, - Hcedilla: 0x1E28, - Hcircle: 0x24BD, - Hcircumflex: 0x0124, - Hdieresis: 0x1E26, - Hdotaccent: 0x1E22, - Hdotbelow: 0x1E24, - Hmonospace: 0xFF28, - Hoarmenian: 0x0540, - Horicoptic: 0x03E8, - Hsmall: 0xF768, - Hungarumlaut: 0xF6CF, - Hungarumlautsmall: 0xF6F8, - Hzsquare: 0x3390, - I: 0x0049, - IAcyrillic: 0x042F, - IJ: 0x0132, - IUcyrillic: 0x042E, - Iacute: 0x00CD, - Iacutesmall: 0xF7ED, - Ibreve: 0x012C, - Icaron: 0x01CF, - Icircle: 0x24BE, - Icircumflex: 0x00CE, - Icircumflexsmall: 0xF7EE, - Icyrillic: 0x0406, - Idblgrave: 0x0208, - Idieresis: 0x00CF, - Idieresisacute: 0x1E2E, - Idieresiscyrillic: 0x04E4, - Idieresissmall: 0xF7EF, - Idot: 0x0130, - Idotaccent: 0x0130, - Idotbelow: 0x1ECA, - Iebrevecyrillic: 0x04D6, - Iecyrillic: 0x0415, - Ifraktur: 0x2111, - Igrave: 0x00CC, - Igravesmall: 0xF7EC, - Ihookabove: 0x1EC8, - Iicyrillic: 0x0418, - Iinvertedbreve: 0x020A, - Iishortcyrillic: 0x0419, - Imacron: 0x012A, - Imacroncyrillic: 0x04E2, - Imonospace: 0xFF29, - Iniarmenian: 0x053B, - Iocyrillic: 0x0401, - Iogonek: 0x012E, - Iota: 0x0399, - Iotaafrican: 0x0196, - Iotadieresis: 0x03AA, - Iotatonos: 0x038A, - Ismall: 0xF769, - Istroke: 0x0197, - Itilde: 0x0128, - Itildebelow: 0x1E2C, - Izhitsacyrillic: 0x0474, - Izhitsadblgravecyrillic: 0x0476, - J: 0x004A, - Jaarmenian: 0x0541, - Jcircle: 0x24BF, - Jcircumflex: 0x0134, - Jecyrillic: 0x0408, - Jheharmenian: 0x054B, - Jmonospace: 0xFF2A, - Jsmall: 0xF76A, - K: 0x004B, - KBsquare: 0x3385, - KKsquare: 0x33CD, - Kabashkircyrillic: 0x04A0, - Kacute: 0x1E30, - Kacyrillic: 0x041A, - Kadescendercyrillic: 0x049A, - Kahookcyrillic: 0x04C3, - Kappa: 0x039A, - Kastrokecyrillic: 0x049E, - Kaverticalstrokecyrillic: 0x049C, - Kcaron: 0x01E8, - Kcedilla: 0x0136, - Kcircle: 0x24C0, - Kcommaaccent: 0x0136, - Kdotbelow: 0x1E32, - Keharmenian: 0x0554, - Kenarmenian: 0x053F, - Khacyrillic: 0x0425, - Kheicoptic: 0x03E6, - Khook: 0x0198, - Kjecyrillic: 0x040C, - Klinebelow: 0x1E34, - Kmonospace: 0xFF2B, - Koppacyrillic: 0x0480, - Koppagreek: 0x03DE, - Ksicyrillic: 0x046E, - Ksmall: 0xF76B, - L: 0x004C, - LJ: 0x01C7, - LL: 0xF6BF, - Lacute: 0x0139, - Lambda: 0x039B, - Lcaron: 0x013D, - Lcedilla: 0x013B, - Lcircle: 0x24C1, - Lcircumflexbelow: 0x1E3C, - Lcommaaccent: 0x013B, - Ldot: 0x013F, - Ldotaccent: 0x013F, - Ldotbelow: 0x1E36, - Ldotbelowmacron: 0x1E38, - Liwnarmenian: 0x053C, - Lj: 0x01C8, - Ljecyrillic: 0x0409, - Llinebelow: 0x1E3A, - Lmonospace: 0xFF2C, - Lslash: 0x0141, - Lslashsmall: 0xF6F9, - Lsmall: 0xF76C, - M: 0x004D, - MBsquare: 0x3386, - Macron: 0xF6D0, - Macronsmall: 0xF7AF, - Macute: 0x1E3E, - Mcircle: 0x24C2, - Mdotaccent: 0x1E40, - Mdotbelow: 0x1E42, - Menarmenian: 0x0544, - Mmonospace: 0xFF2D, - Msmall: 0xF76D, - Mturned: 0x019C, - Mu: 0x039C, - N: 0x004E, - NJ: 0x01CA, - Nacute: 0x0143, - Ncaron: 0x0147, - Ncedilla: 0x0145, - Ncircle: 0x24C3, - Ncircumflexbelow: 0x1E4A, - Ncommaaccent: 0x0145, - Ndotaccent: 0x1E44, - Ndotbelow: 0x1E46, - Nhookleft: 0x019D, - Nineroman: 0x2168, - Nj: 0x01CB, - Njecyrillic: 0x040A, - Nlinebelow: 0x1E48, - Nmonospace: 0xFF2E, - Nowarmenian: 0x0546, - Nsmall: 0xF76E, - Ntilde: 0x00D1, - Ntildesmall: 0xF7F1, - Nu: 0x039D, - O: 0x004F, - OE: 0x0152, - OEsmall: 0xF6FA, - Oacute: 0x00D3, - Oacutesmall: 0xF7F3, - Obarredcyrillic: 0x04E8, - Obarreddieresiscyrillic: 0x04EA, - Obreve: 0x014E, - Ocaron: 0x01D1, - Ocenteredtilde: 0x019F, - Ocircle: 0x24C4, - Ocircumflex: 0x00D4, - Ocircumflexacute: 0x1ED0, - Ocircumflexdotbelow: 0x1ED8, - Ocircumflexgrave: 0x1ED2, - Ocircumflexhookabove: 0x1ED4, - Ocircumflexsmall: 0xF7F4, - Ocircumflextilde: 0x1ED6, - Ocyrillic: 0x041E, - Odblacute: 0x0150, - Odblgrave: 0x020C, - Odieresis: 0x00D6, - Odieresiscyrillic: 0x04E6, - Odieresissmall: 0xF7F6, - Odotbelow: 0x1ECC, - Ogoneksmall: 0xF6FB, - Ograve: 0x00D2, - Ogravesmall: 0xF7F2, - Oharmenian: 0x0555, - Ohm: 0x2126, - Ohookabove: 0x1ECE, - Ohorn: 0x01A0, - Ohornacute: 0x1EDA, - Ohorndotbelow: 0x1EE2, - Ohorngrave: 0x1EDC, - Ohornhookabove: 0x1EDE, - Ohorntilde: 0x1EE0, - Ohungarumlaut: 0x0150, - Oi: 0x01A2, - Oinvertedbreve: 0x020E, - Omacron: 0x014C, - Omacronacute: 0x1E52, - Omacrongrave: 0x1E50, - Omega: 0x2126, - Omegacyrillic: 0x0460, - Omegagreek: 0x03A9, - Omegaroundcyrillic: 0x047A, - Omegatitlocyrillic: 0x047C, - Omegatonos: 0x038F, - Omicron: 0x039F, - Omicrontonos: 0x038C, - Omonospace: 0xFF2F, - Oneroman: 0x2160, - Oogonek: 0x01EA, - Oogonekmacron: 0x01EC, - Oopen: 0x0186, - Oslash: 0x00D8, - Oslashacute: 0x01FE, - Oslashsmall: 0xF7F8, - Osmall: 0xF76F, - Ostrokeacute: 0x01FE, - Otcyrillic: 0x047E, - Otilde: 0x00D5, - Otildeacute: 0x1E4C, - Otildedieresis: 0x1E4E, - Otildesmall: 0xF7F5, - P: 0x0050, - Pacute: 0x1E54, - Pcircle: 0x24C5, - Pdotaccent: 0x1E56, - Pecyrillic: 0x041F, - Peharmenian: 0x054A, - Pemiddlehookcyrillic: 0x04A6, - Phi: 0x03A6, - Phook: 0x01A4, - Pi: 0x03A0, - Piwrarmenian: 0x0553, - Pmonospace: 0xFF30, - Psi: 0x03A8, - Psicyrillic: 0x0470, - Psmall: 0xF770, - Q: 0x0051, - Qcircle: 0x24C6, - Qmonospace: 0xFF31, - Qsmall: 0xF771, - R: 0x0052, - Raarmenian: 0x054C, - Racute: 0x0154, - Rcaron: 0x0158, - Rcedilla: 0x0156, - Rcircle: 0x24C7, - Rcommaaccent: 0x0156, - Rdblgrave: 0x0210, - Rdotaccent: 0x1E58, - Rdotbelow: 0x1E5A, - Rdotbelowmacron: 0x1E5C, - Reharmenian: 0x0550, - Rfraktur: 0x211C, - Rho: 0x03A1, - Ringsmall: 0xF6FC, - Rinvertedbreve: 0x0212, - Rlinebelow: 0x1E5E, - Rmonospace: 0xFF32, - Rsmall: 0xF772, - Rsmallinverted: 0x0281, - Rsmallinvertedsuperior: 0x02B6, - S: 0x0053, - SF010000: 0x250C, - SF020000: 0x2514, - SF030000: 0x2510, - SF040000: 0x2518, - SF050000: 0x253C, - SF060000: 0x252C, - SF070000: 0x2534, - SF080000: 0x251C, - SF090000: 0x2524, - SF100000: 0x2500, - SF110000: 0x2502, - SF190000: 0x2561, - SF200000: 0x2562, - SF210000: 0x2556, - SF220000: 0x2555, - SF230000: 0x2563, - SF240000: 0x2551, - SF250000: 0x2557, - SF260000: 0x255D, - SF270000: 0x255C, - SF280000: 0x255B, - SF360000: 0x255E, - SF370000: 0x255F, - SF380000: 0x255A, - SF390000: 0x2554, - SF400000: 0x2569, - SF410000: 0x2566, - SF420000: 0x2560, - SF430000: 0x2550, - SF440000: 0x256C, - SF450000: 0x2567, - SF460000: 0x2568, - SF470000: 0x2564, - SF480000: 0x2565, - SF490000: 0x2559, - SF500000: 0x2558, - SF510000: 0x2552, - SF520000: 0x2553, - SF530000: 0x256B, - SF540000: 0x256A, - Sacute: 0x015A, - Sacutedotaccent: 0x1E64, - Sampigreek: 0x03E0, - Scaron: 0x0160, - Scarondotaccent: 0x1E66, - Scaronsmall: 0xF6FD, - Scedilla: 0x015E, - Schwa: 0x018F, - Schwacyrillic: 0x04D8, - Schwadieresiscyrillic: 0x04DA, - Scircle: 0x24C8, - Scircumflex: 0x015C, - Scommaaccent: 0x0218, - Sdotaccent: 0x1E60, - Sdotbelow: 0x1E62, - Sdotbelowdotaccent: 0x1E68, - Seharmenian: 0x054D, - Sevenroman: 0x2166, - Shaarmenian: 0x0547, - Shacyrillic: 0x0428, - Shchacyrillic: 0x0429, - Sheicoptic: 0x03E2, - Shhacyrillic: 0x04BA, - Shimacoptic: 0x03EC, - Sigma: 0x03A3, - Sixroman: 0x2165, - Smonospace: 0xFF33, - Softsigncyrillic: 0x042C, - Ssmall: 0xF773, - Stigmagreek: 0x03DA, - T: 0x0054, - Tau: 0x03A4, - Tbar: 0x0166, - Tcaron: 0x0164, - Tcedilla: 0x0162, - Tcircle: 0x24C9, - Tcircumflexbelow: 0x1E70, - Tcommaaccent: 0x0162, - Tdotaccent: 0x1E6A, - Tdotbelow: 0x1E6C, - Tecyrillic: 0x0422, - Tedescendercyrillic: 0x04AC, - Tenroman: 0x2169, - Tetsecyrillic: 0x04B4, - Theta: 0x0398, - Thook: 0x01AC, - Thorn: 0x00DE, - Thornsmall: 0xF7FE, - Threeroman: 0x2162, - Tildesmall: 0xF6FE, - Tiwnarmenian: 0x054F, - Tlinebelow: 0x1E6E, - Tmonospace: 0xFF34, - Toarmenian: 0x0539, - Tonefive: 0x01BC, - Tonesix: 0x0184, - Tonetwo: 0x01A7, - Tretroflexhook: 0x01AE, - Tsecyrillic: 0x0426, - Tshecyrillic: 0x040B, - Tsmall: 0xF774, - Twelveroman: 0x216B, - Tworoman: 0x2161, - U: 0x0055, - Uacute: 0x00DA, - Uacutesmall: 0xF7FA, - Ubreve: 0x016C, - Ucaron: 0x01D3, - Ucircle: 0x24CA, - Ucircumflex: 0x00DB, - Ucircumflexbelow: 0x1E76, - Ucircumflexsmall: 0xF7FB, - Ucyrillic: 0x0423, - Udblacute: 0x0170, - Udblgrave: 0x0214, - Udieresis: 0x00DC, - Udieresisacute: 0x01D7, - Udieresisbelow: 0x1E72, - Udieresiscaron: 0x01D9, - Udieresiscyrillic: 0x04F0, - Udieresisgrave: 0x01DB, - Udieresismacron: 0x01D5, - Udieresissmall: 0xF7FC, - Udotbelow: 0x1EE4, - Ugrave: 0x00D9, - Ugravesmall: 0xF7F9, - Uhookabove: 0x1EE6, - Uhorn: 0x01AF, - Uhornacute: 0x1EE8, - Uhorndotbelow: 0x1EF0, - Uhorngrave: 0x1EEA, - Uhornhookabove: 0x1EEC, - Uhorntilde: 0x1EEE, - Uhungarumlaut: 0x0170, - Uhungarumlautcyrillic: 0x04F2, - Uinvertedbreve: 0x0216, - Ukcyrillic: 0x0478, - Umacron: 0x016A, - Umacroncyrillic: 0x04EE, - Umacrondieresis: 0x1E7A, - Umonospace: 0xFF35, - Uogonek: 0x0172, - Upsilon: 0x03A5, - Upsilon1: 0x03D2, - Upsilonacutehooksymbolgreek: 0x03D3, - Upsilonafrican: 0x01B1, - Upsilondieresis: 0x03AB, - Upsilondieresishooksymbolgreek: 0x03D4, - Upsilonhooksymbol: 0x03D2, - Upsilontonos: 0x038E, - Uring: 0x016E, - Ushortcyrillic: 0x040E, - Usmall: 0xF775, - Ustraightcyrillic: 0x04AE, - Ustraightstrokecyrillic: 0x04B0, - Utilde: 0x0168, - Utildeacute: 0x1E78, - Utildebelow: 0x1E74, - V: 0x0056, - Vcircle: 0x24CB, - Vdotbelow: 0x1E7E, - Vecyrillic: 0x0412, - Vewarmenian: 0x054E, - Vhook: 0x01B2, - Vmonospace: 0xFF36, - Voarmenian: 0x0548, - Vsmall: 0xF776, - Vtilde: 0x1E7C, - W: 0x0057, - Wacute: 0x1E82, - Wcircle: 0x24CC, - Wcircumflex: 0x0174, - Wdieresis: 0x1E84, - Wdotaccent: 0x1E86, - Wdotbelow: 0x1E88, - Wgrave: 0x1E80, - Wmonospace: 0xFF37, - Wsmall: 0xF777, - X: 0x0058, - Xcircle: 0x24CD, - Xdieresis: 0x1E8C, - Xdotaccent: 0x1E8A, - Xeharmenian: 0x053D, - Xi: 0x039E, - Xmonospace: 0xFF38, - Xsmall: 0xF778, - Y: 0x0059, - Yacute: 0x00DD, - Yacutesmall: 0xF7FD, - Yatcyrillic: 0x0462, - Ycircle: 0x24CE, - Ycircumflex: 0x0176, - Ydieresis: 0x0178, - Ydieresissmall: 0xF7FF, - Ydotaccent: 0x1E8E, - Ydotbelow: 0x1EF4, - Yericyrillic: 0x042B, - Yerudieresiscyrillic: 0x04F8, - Ygrave: 0x1EF2, - Yhook: 0x01B3, - Yhookabove: 0x1EF6, - Yiarmenian: 0x0545, - Yicyrillic: 0x0407, - Yiwnarmenian: 0x0552, - Ymonospace: 0xFF39, - Ysmall: 0xF779, - Ytilde: 0x1EF8, - Yusbigcyrillic: 0x046A, - Yusbigiotifiedcyrillic: 0x046C, - Yuslittlecyrillic: 0x0466, - Yuslittleiotifiedcyrillic: 0x0468, - Z: 0x005A, - Zaarmenian: 0x0536, - Zacute: 0x0179, - Zcaron: 0x017D, - Zcaronsmall: 0xF6FF, - Zcircle: 0x24CF, - Zcircumflex: 0x1E90, - Zdot: 0x017B, - Zdotaccent: 0x017B, - Zdotbelow: 0x1E92, - Zecyrillic: 0x0417, - Zedescendercyrillic: 0x0498, - Zedieresiscyrillic: 0x04DE, - Zeta: 0x0396, - Zhearmenian: 0x053A, - Zhebrevecyrillic: 0x04C1, - Zhecyrillic: 0x0416, - Zhedescendercyrillic: 0x0496, - Zhedieresiscyrillic: 0x04DC, - Zlinebelow: 0x1E94, - Zmonospace: 0xFF3A, - Zsmall: 0xF77A, - Zstroke: 0x01B5, - a: 0x0061, - aabengali: 0x0986, - aacute: 0x00E1, - aadeva: 0x0906, - aagujarati: 0x0A86, - aagurmukhi: 0x0A06, - aamatragurmukhi: 0x0A3E, - aarusquare: 0x3303, - aavowelsignbengali: 0x09BE, - aavowelsigndeva: 0x093E, - aavowelsigngujarati: 0x0ABE, - abbreviationmarkarmenian: 0x055F, - abbreviationsigndeva: 0x0970, - abengali: 0x0985, - abopomofo: 0x311A, - abreve: 0x0103, - abreveacute: 0x1EAF, - abrevecyrillic: 0x04D1, - abrevedotbelow: 0x1EB7, - abrevegrave: 0x1EB1, - abrevehookabove: 0x1EB3, - abrevetilde: 0x1EB5, - acaron: 0x01CE, - acircle: 0x24D0, - acircumflex: 0x00E2, - acircumflexacute: 0x1EA5, - acircumflexdotbelow: 0x1EAD, - acircumflexgrave: 0x1EA7, - acircumflexhookabove: 0x1EA9, - acircumflextilde: 0x1EAB, - acute: 0x00B4, - acutebelowcmb: 0x0317, - acutecmb: 0x0301, - acutecomb: 0x0301, - acutedeva: 0x0954, - acutelowmod: 0x02CF, - acutetonecmb: 0x0341, - acyrillic: 0x0430, - adblgrave: 0x0201, - addakgurmukhi: 0x0A71, - adeva: 0x0905, - adieresis: 0x00E4, - adieresiscyrillic: 0x04D3, - adieresismacron: 0x01DF, - adotbelow: 0x1EA1, - adotmacron: 0x01E1, - ae: 0x00E6, - aeacute: 0x01FD, - aekorean: 0x3150, - aemacron: 0x01E3, - afii00208: 0x2015, - afii08941: 0x20A4, - afii10017: 0x0410, - afii10018: 0x0411, - afii10019: 0x0412, - afii10020: 0x0413, - afii10021: 0x0414, - afii10022: 0x0415, - afii10023: 0x0401, - afii10024: 0x0416, - afii10025: 0x0417, - afii10026: 0x0418, - afii10027: 0x0419, - afii10028: 0x041A, - afii10029: 0x041B, - afii10030: 0x041C, - afii10031: 0x041D, - afii10032: 0x041E, - afii10033: 0x041F, - afii10034: 0x0420, - afii10035: 0x0421, - afii10036: 0x0422, - afii10037: 0x0423, - afii10038: 0x0424, - afii10039: 0x0425, - afii10040: 0x0426, - afii10041: 0x0427, - afii10042: 0x0428, - afii10043: 0x0429, - afii10044: 0x042A, - afii10045: 0x042B, - afii10046: 0x042C, - afii10047: 0x042D, - afii10048: 0x042E, - afii10049: 0x042F, - afii10050: 0x0490, - afii10051: 0x0402, - afii10052: 0x0403, - afii10053: 0x0404, - afii10054: 0x0405, - afii10055: 0x0406, - afii10056: 0x0407, - afii10057: 0x0408, - afii10058: 0x0409, - afii10059: 0x040A, - afii10060: 0x040B, - afii10061: 0x040C, - afii10062: 0x040E, - afii10063: 0xF6C4, - afii10064: 0xF6C5, - afii10065: 0x0430, - afii10066: 0x0431, - afii10067: 0x0432, - afii10068: 0x0433, - afii10069: 0x0434, - afii10070: 0x0435, - afii10071: 0x0451, - afii10072: 0x0436, - afii10073: 0x0437, - afii10074: 0x0438, - afii10075: 0x0439, - afii10076: 0x043A, - afii10077: 0x043B, - afii10078: 0x043C, - afii10079: 0x043D, - afii10080: 0x043E, - afii10081: 0x043F, - afii10082: 0x0440, - afii10083: 0x0441, - afii10084: 0x0442, - afii10085: 0x0443, - afii10086: 0x0444, - afii10087: 0x0445, - afii10088: 0x0446, - afii10089: 0x0447, - afii10090: 0x0448, - afii10091: 0x0449, - afii10092: 0x044A, - afii10093: 0x044B, - afii10094: 0x044C, - afii10095: 0x044D, - afii10096: 0x044E, - afii10097: 0x044F, - afii10098: 0x0491, - afii10099: 0x0452, - afii10100: 0x0453, - afii10101: 0x0454, - afii10102: 0x0455, - afii10103: 0x0456, - afii10104: 0x0457, - afii10105: 0x0458, - afii10106: 0x0459, - afii10107: 0x045A, - afii10108: 0x045B, - afii10109: 0x045C, - afii10110: 0x045E, - afii10145: 0x040F, - afii10146: 0x0462, - afii10147: 0x0472, - afii10148: 0x0474, - afii10192: 0xF6C6, - afii10193: 0x045F, - afii10194: 0x0463, - afii10195: 0x0473, - afii10196: 0x0475, - afii10831: 0xF6C7, - afii10832: 0xF6C8, - afii10846: 0x04D9, - afii299: 0x200E, - afii300: 0x200F, - afii301: 0x200D, - afii57381: 0x066A, - afii57388: 0x060C, - afii57392: 0x0660, - afii57393: 0x0661, - afii57394: 0x0662, - afii57395: 0x0663, - afii57396: 0x0664, - afii57397: 0x0665, - afii57398: 0x0666, - afii57399: 0x0667, - afii57400: 0x0668, - afii57401: 0x0669, - afii57403: 0x061B, - afii57407: 0x061F, - afii57409: 0x0621, - afii57410: 0x0622, - afii57411: 0x0623, - afii57412: 0x0624, - afii57413: 0x0625, - afii57414: 0x0626, - afii57415: 0x0627, - afii57416: 0x0628, - afii57417: 0x0629, - afii57418: 0x062A, - afii57419: 0x062B, - afii57420: 0x062C, - afii57421: 0x062D, - afii57422: 0x062E, - afii57423: 0x062F, - afii57424: 0x0630, - afii57425: 0x0631, - afii57426: 0x0632, - afii57427: 0x0633, - afii57428: 0x0634, - afii57429: 0x0635, - afii57430: 0x0636, - afii57431: 0x0637, - afii57432: 0x0638, - afii57433: 0x0639, - afii57434: 0x063A, - afii57440: 0x0640, - afii57441: 0x0641, - afii57442: 0x0642, - afii57443: 0x0643, - afii57444: 0x0644, - afii57445: 0x0645, - afii57446: 0x0646, - afii57448: 0x0648, - afii57449: 0x0649, - afii57450: 0x064A, - afii57451: 0x064B, - afii57452: 0x064C, - afii57453: 0x064D, - afii57454: 0x064E, - afii57455: 0x064F, - afii57456: 0x0650, - afii57457: 0x0651, - afii57458: 0x0652, - afii57470: 0x0647, - afii57505: 0x06A4, - afii57506: 0x067E, - afii57507: 0x0686, - afii57508: 0x0698, - afii57509: 0x06AF, - afii57511: 0x0679, - afii57512: 0x0688, - afii57513: 0x0691, - afii57514: 0x06BA, - afii57519: 0x06D2, - afii57534: 0x06D5, - afii57636: 0x20AA, - afii57645: 0x05BE, - afii57658: 0x05C3, - afii57664: 0x05D0, - afii57665: 0x05D1, - afii57666: 0x05D2, - afii57667: 0x05D3, - afii57668: 0x05D4, - afii57669: 0x05D5, - afii57670: 0x05D6, - afii57671: 0x05D7, - afii57672: 0x05D8, - afii57673: 0x05D9, - afii57674: 0x05DA, - afii57675: 0x05DB, - afii57676: 0x05DC, - afii57677: 0x05DD, - afii57678: 0x05DE, - afii57679: 0x05DF, - afii57680: 0x05E0, - afii57681: 0x05E1, - afii57682: 0x05E2, - afii57683: 0x05E3, - afii57684: 0x05E4, - afii57685: 0x05E5, - afii57686: 0x05E6, - afii57687: 0x05E7, - afii57688: 0x05E8, - afii57689: 0x05E9, - afii57690: 0x05EA, - afii57694: 0xFB2A, - afii57695: 0xFB2B, - afii57700: 0xFB4B, - afii57705: 0xFB1F, - afii57716: 0x05F0, - afii57717: 0x05F1, - afii57718: 0x05F2, - afii57723: 0xFB35, - afii57793: 0x05B4, - afii57794: 0x05B5, - afii57795: 0x05B6, - afii57796: 0x05BB, - afii57797: 0x05B8, - afii57798: 0x05B7, - afii57799: 0x05B0, - afii57800: 0x05B2, - afii57801: 0x05B1, - afii57802: 0x05B3, - afii57803: 0x05C2, - afii57804: 0x05C1, - afii57806: 0x05B9, - afii57807: 0x05BC, - afii57839: 0x05BD, - afii57841: 0x05BF, - afii57842: 0x05C0, - afii57929: 0x02BC, - afii61248: 0x2105, - afii61289: 0x2113, - afii61352: 0x2116, - afii61573: 0x202C, - afii61574: 0x202D, - afii61575: 0x202E, - afii61664: 0x200C, - afii63167: 0x066D, - afii64937: 0x02BD, - agrave: 0x00E0, - agujarati: 0x0A85, - agurmukhi: 0x0A05, - ahiragana: 0x3042, - ahookabove: 0x1EA3, - aibengali: 0x0990, - aibopomofo: 0x311E, - aideva: 0x0910, - aiecyrillic: 0x04D5, - aigujarati: 0x0A90, - aigurmukhi: 0x0A10, - aimatragurmukhi: 0x0A48, - ainarabic: 0x0639, - ainfinalarabic: 0xFECA, - aininitialarabic: 0xFECB, - ainmedialarabic: 0xFECC, - ainvertedbreve: 0x0203, - aivowelsignbengali: 0x09C8, - aivowelsigndeva: 0x0948, - aivowelsigngujarati: 0x0AC8, - akatakana: 0x30A2, - akatakanahalfwidth: 0xFF71, - akorean: 0x314F, - alef: 0x05D0, - alefarabic: 0x0627, - alefdageshhebrew: 0xFB30, - aleffinalarabic: 0xFE8E, - alefhamzaabovearabic: 0x0623, - alefhamzaabovefinalarabic: 0xFE84, - alefhamzabelowarabic: 0x0625, - alefhamzabelowfinalarabic: 0xFE88, - alefhebrew: 0x05D0, - aleflamedhebrew: 0xFB4F, - alefmaddaabovearabic: 0x0622, - alefmaddaabovefinalarabic: 0xFE82, - alefmaksuraarabic: 0x0649, - alefmaksurafinalarabic: 0xFEF0, - alefmaksurainitialarabic: 0xFEF3, - alefmaksuramedialarabic: 0xFEF4, - alefpatahhebrew: 0xFB2E, - alefqamatshebrew: 0xFB2F, - aleph: 0x2135, - allequal: 0x224C, - alpha: 0x03B1, - alphatonos: 0x03AC, - amacron: 0x0101, - amonospace: 0xFF41, - ampersand: 0x0026, - ampersandmonospace: 0xFF06, - ampersandsmall: 0xF726, - amsquare: 0x33C2, - anbopomofo: 0x3122, - angbopomofo: 0x3124, - angbracketleft: 0x3008, // This glyph is missing from Adobe's original list. - angbracketright: 0x3009, // This glyph is missing from Adobe's original list. - angkhankhuthai: 0x0E5A, - angle: 0x2220, - anglebracketleft: 0x3008, - anglebracketleftvertical: 0xFE3F, - anglebracketright: 0x3009, - anglebracketrightvertical: 0xFE40, - angleleft: 0x2329, - angleright: 0x232A, - angstrom: 0x212B, - anoteleia: 0x0387, - anudattadeva: 0x0952, - anusvarabengali: 0x0982, - anusvaradeva: 0x0902, - anusvaragujarati: 0x0A82, - aogonek: 0x0105, - apaatosquare: 0x3300, - aparen: 0x249C, - apostrophearmenian: 0x055A, - apostrophemod: 0x02BC, - apple: 0xF8FF, - approaches: 0x2250, - approxequal: 0x2248, - approxequalorimage: 0x2252, - approximatelyequal: 0x2245, - araeaekorean: 0x318E, - araeakorean: 0x318D, - arc: 0x2312, - arighthalfring: 0x1E9A, - aring: 0x00E5, - aringacute: 0x01FB, - aringbelow: 0x1E01, - arrowboth: 0x2194, - arrowdashdown: 0x21E3, - arrowdashleft: 0x21E0, - arrowdashright: 0x21E2, - arrowdashup: 0x21E1, - arrowdblboth: 0x21D4, - arrowdbldown: 0x21D3, - arrowdblleft: 0x21D0, - arrowdblright: 0x21D2, - arrowdblup: 0x21D1, - arrowdown: 0x2193, - arrowdownleft: 0x2199, - arrowdownright: 0x2198, - arrowdownwhite: 0x21E9, - arrowheaddownmod: 0x02C5, - arrowheadleftmod: 0x02C2, - arrowheadrightmod: 0x02C3, - arrowheadupmod: 0x02C4, - arrowhorizex: 0xF8E7, - arrowleft: 0x2190, - arrowleftdbl: 0x21D0, - arrowleftdblstroke: 0x21CD, - arrowleftoverright: 0x21C6, - arrowleftwhite: 0x21E6, - arrowright: 0x2192, - arrowrightdblstroke: 0x21CF, - arrowrightheavy: 0x279E, - arrowrightoverleft: 0x21C4, - arrowrightwhite: 0x21E8, - arrowtableft: 0x21E4, - arrowtabright: 0x21E5, - arrowup: 0x2191, - arrowupdn: 0x2195, - arrowupdnbse: 0x21A8, - arrowupdownbase: 0x21A8, - arrowupleft: 0x2196, - arrowupleftofdown: 0x21C5, - arrowupright: 0x2197, - arrowupwhite: 0x21E7, - arrowvertex: 0xF8E6, - asciicircum: 0x005E, - asciicircummonospace: 0xFF3E, - asciitilde: 0x007E, - asciitildemonospace: 0xFF5E, - ascript: 0x0251, - ascriptturned: 0x0252, - asmallhiragana: 0x3041, - asmallkatakana: 0x30A1, - asmallkatakanahalfwidth: 0xFF67, - asterisk: 0x002A, - asteriskaltonearabic: 0x066D, - asteriskarabic: 0x066D, - asteriskmath: 0x2217, - asteriskmonospace: 0xFF0A, - asterisksmall: 0xFE61, - asterism: 0x2042, - asuperior: 0xF6E9, - asymptoticallyequal: 0x2243, - at: 0x0040, - atilde: 0x00E3, - atmonospace: 0xFF20, - atsmall: 0xFE6B, - aturned: 0x0250, - aubengali: 0x0994, - aubopomofo: 0x3120, - audeva: 0x0914, - augujarati: 0x0A94, - augurmukhi: 0x0A14, - aulengthmarkbengali: 0x09D7, - aumatragurmukhi: 0x0A4C, - auvowelsignbengali: 0x09CC, - auvowelsigndeva: 0x094C, - auvowelsigngujarati: 0x0ACC, - avagrahadeva: 0x093D, - aybarmenian: 0x0561, - ayin: 0x05E2, - ayinaltonehebrew: 0xFB20, - ayinhebrew: 0x05E2, - b: 0x0062, - babengali: 0x09AC, - backslash: 0x005C, - backslashmonospace: 0xFF3C, - badeva: 0x092C, - bagujarati: 0x0AAC, - bagurmukhi: 0x0A2C, - bahiragana: 0x3070, - bahtthai: 0x0E3F, - bakatakana: 0x30D0, - bar: 0x007C, - barmonospace: 0xFF5C, - bbopomofo: 0x3105, - bcircle: 0x24D1, - bdotaccent: 0x1E03, - bdotbelow: 0x1E05, - beamedsixteenthnotes: 0x266C, - because: 0x2235, - becyrillic: 0x0431, - beharabic: 0x0628, - behfinalarabic: 0xFE90, - behinitialarabic: 0xFE91, - behiragana: 0x3079, - behmedialarabic: 0xFE92, - behmeeminitialarabic: 0xFC9F, - behmeemisolatedarabic: 0xFC08, - behnoonfinalarabic: 0xFC6D, - bekatakana: 0x30D9, - benarmenian: 0x0562, - bet: 0x05D1, - beta: 0x03B2, - betasymbolgreek: 0x03D0, - betdagesh: 0xFB31, - betdageshhebrew: 0xFB31, - bethebrew: 0x05D1, - betrafehebrew: 0xFB4C, - bhabengali: 0x09AD, - bhadeva: 0x092D, - bhagujarati: 0x0AAD, - bhagurmukhi: 0x0A2D, - bhook: 0x0253, - bihiragana: 0x3073, - bikatakana: 0x30D3, - bilabialclick: 0x0298, - bindigurmukhi: 0x0A02, - birusquare: 0x3331, - blackcircle: 0x25CF, - blackdiamond: 0x25C6, - blackdownpointingtriangle: 0x25BC, - blackleftpointingpointer: 0x25C4, - blackleftpointingtriangle: 0x25C0, - blacklenticularbracketleft: 0x3010, - blacklenticularbracketleftvertical: 0xFE3B, - blacklenticularbracketright: 0x3011, - blacklenticularbracketrightvertical: 0xFE3C, - blacklowerlefttriangle: 0x25E3, - blacklowerrighttriangle: 0x25E2, - blackrectangle: 0x25AC, - blackrightpointingpointer: 0x25BA, - blackrightpointingtriangle: 0x25B6, - blacksmallsquare: 0x25AA, - blacksmilingface: 0x263B, - blacksquare: 0x25A0, - blackstar: 0x2605, - blackupperlefttriangle: 0x25E4, - blackupperrighttriangle: 0x25E5, - blackuppointingsmalltriangle: 0x25B4, - blackuppointingtriangle: 0x25B2, - blank: 0x2423, - blinebelow: 0x1E07, - block: 0x2588, - bmonospace: 0xFF42, - bobaimaithai: 0x0E1A, - bohiragana: 0x307C, - bokatakana: 0x30DC, - bparen: 0x249D, - bqsquare: 0x33C3, - braceex: 0xF8F4, - braceleft: 0x007B, - braceleftbt: 0xF8F3, - braceleftmid: 0xF8F2, - braceleftmonospace: 0xFF5B, - braceleftsmall: 0xFE5B, - bracelefttp: 0xF8F1, - braceleftvertical: 0xFE37, - braceright: 0x007D, - bracerightbt: 0xF8FE, - bracerightmid: 0xF8FD, - bracerightmonospace: 0xFF5D, - bracerightsmall: 0xFE5C, - bracerighttp: 0xF8FC, - bracerightvertical: 0xFE38, - bracketleft: 0x005B, - bracketleftbt: 0xF8F0, - bracketleftex: 0xF8EF, - bracketleftmonospace: 0xFF3B, - bracketlefttp: 0xF8EE, - bracketright: 0x005D, - bracketrightbt: 0xF8FB, - bracketrightex: 0xF8FA, - bracketrightmonospace: 0xFF3D, - bracketrighttp: 0xF8F9, - breve: 0x02D8, - brevebelowcmb: 0x032E, - brevecmb: 0x0306, - breveinvertedbelowcmb: 0x032F, - breveinvertedcmb: 0x0311, - breveinverteddoublecmb: 0x0361, - bridgebelowcmb: 0x032A, - bridgeinvertedbelowcmb: 0x033A, - brokenbar: 0x00A6, - bstroke: 0x0180, - bsuperior: 0xF6EA, - btopbar: 0x0183, - buhiragana: 0x3076, - bukatakana: 0x30D6, - bullet: 0x2022, - bulletinverse: 0x25D8, - bulletoperator: 0x2219, - bullseye: 0x25CE, - c: 0x0063, - caarmenian: 0x056E, - cabengali: 0x099A, - cacute: 0x0107, - cadeva: 0x091A, - cagujarati: 0x0A9A, - cagurmukhi: 0x0A1A, - calsquare: 0x3388, - candrabindubengali: 0x0981, - candrabinducmb: 0x0310, - candrabindudeva: 0x0901, - candrabindugujarati: 0x0A81, - capslock: 0x21EA, - careof: 0x2105, - caron: 0x02C7, - caronbelowcmb: 0x032C, - caroncmb: 0x030C, - carriagereturn: 0x21B5, - cbopomofo: 0x3118, - ccaron: 0x010D, - ccedilla: 0x00E7, - ccedillaacute: 0x1E09, - ccircle: 0x24D2, - ccircumflex: 0x0109, - ccurl: 0x0255, - cdot: 0x010B, - cdotaccent: 0x010B, - cdsquare: 0x33C5, - cedilla: 0x00B8, - cedillacmb: 0x0327, - cent: 0x00A2, - centigrade: 0x2103, - centinferior: 0xF6DF, - centmonospace: 0xFFE0, - centoldstyle: 0xF7A2, - centsuperior: 0xF6E0, - chaarmenian: 0x0579, - chabengali: 0x099B, - chadeva: 0x091B, - chagujarati: 0x0A9B, - chagurmukhi: 0x0A1B, - chbopomofo: 0x3114, - cheabkhasiancyrillic: 0x04BD, - checkmark: 0x2713, - checyrillic: 0x0447, - chedescenderabkhasiancyrillic: 0x04BF, - chedescendercyrillic: 0x04B7, - chedieresiscyrillic: 0x04F5, - cheharmenian: 0x0573, - chekhakassiancyrillic: 0x04CC, - cheverticalstrokecyrillic: 0x04B9, - chi: 0x03C7, - chieuchacirclekorean: 0x3277, - chieuchaparenkorean: 0x3217, - chieuchcirclekorean: 0x3269, - chieuchkorean: 0x314A, - chieuchparenkorean: 0x3209, - chochangthai: 0x0E0A, - chochanthai: 0x0E08, - chochingthai: 0x0E09, - chochoethai: 0x0E0C, - chook: 0x0188, - cieucacirclekorean: 0x3276, - cieucaparenkorean: 0x3216, - cieuccirclekorean: 0x3268, - cieuckorean: 0x3148, - cieucparenkorean: 0x3208, - cieucuparenkorean: 0x321C, - circle: 0x25CB, - circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list. - circlemultiply: 0x2297, - circleot: 0x2299, - circleplus: 0x2295, - circlepostalmark: 0x3036, - circlewithlefthalfblack: 0x25D0, - circlewithrighthalfblack: 0x25D1, - circumflex: 0x02C6, - circumflexbelowcmb: 0x032D, - circumflexcmb: 0x0302, - clear: 0x2327, - clickalveolar: 0x01C2, - clickdental: 0x01C0, - clicklateral: 0x01C1, - clickretroflex: 0x01C3, - club: 0x2663, - clubsuitblack: 0x2663, - clubsuitwhite: 0x2667, - cmcubedsquare: 0x33A4, - cmonospace: 0xFF43, - cmsquaredsquare: 0x33A0, - coarmenian: 0x0581, - colon: 0x003A, - colonmonetary: 0x20A1, - colonmonospace: 0xFF1A, - colonsign: 0x20A1, - colonsmall: 0xFE55, - colontriangularhalfmod: 0x02D1, - colontriangularmod: 0x02D0, - comma: 0x002C, - commaabovecmb: 0x0313, - commaaboverightcmb: 0x0315, - commaaccent: 0xF6C3, - commaarabic: 0x060C, - commaarmenian: 0x055D, - commainferior: 0xF6E1, - commamonospace: 0xFF0C, - commareversedabovecmb: 0x0314, - commareversedmod: 0x02BD, - commasmall: 0xFE50, - commasuperior: 0xF6E2, - commaturnedabovecmb: 0x0312, - commaturnedmod: 0x02BB, - compass: 0x263C, - congruent: 0x2245, - contourintegral: 0x222E, - control: 0x2303, - controlACK: 0x0006, - controlBEL: 0x0007, - controlBS: 0x0008, - controlCAN: 0x0018, - controlCR: 0x000D, - controlDC1: 0x0011, - controlDC2: 0x0012, - controlDC3: 0x0013, - controlDC4: 0x0014, - controlDEL: 0x007F, - controlDLE: 0x0010, - controlEM: 0x0019, - controlENQ: 0x0005, - controlEOT: 0x0004, - controlESC: 0x001B, - controlETB: 0x0017, - controlETX: 0x0003, - controlFF: 0x000C, - controlFS: 0x001C, - controlGS: 0x001D, - controlHT: 0x0009, - controlLF: 0x000A, - controlNAK: 0x0015, - controlRS: 0x001E, - controlSI: 0x000F, - controlSO: 0x000E, - controlSOT: 0x0002, - controlSTX: 0x0001, - controlSUB: 0x001A, - controlSYN: 0x0016, - controlUS: 0x001F, - controlVT: 0x000B, - copyright: 0x00A9, - copyrightsans: 0xF8E9, - copyrightserif: 0xF6D9, - cornerbracketleft: 0x300C, - cornerbracketlefthalfwidth: 0xFF62, - cornerbracketleftvertical: 0xFE41, - cornerbracketright: 0x300D, - cornerbracketrighthalfwidth: 0xFF63, - cornerbracketrightvertical: 0xFE42, - corporationsquare: 0x337F, - cosquare: 0x33C7, - coverkgsquare: 0x33C6, - cparen: 0x249E, - cruzeiro: 0x20A2, - cstretched: 0x0297, - curlyand: 0x22CF, - curlyor: 0x22CE, - currency: 0x00A4, - cyrBreve: 0xF6D1, - cyrFlex: 0xF6D2, - cyrbreve: 0xF6D4, - cyrflex: 0xF6D5, - d: 0x0064, - daarmenian: 0x0564, - dabengali: 0x09A6, - dadarabic: 0x0636, - dadeva: 0x0926, - dadfinalarabic: 0xFEBE, - dadinitialarabic: 0xFEBF, - dadmedialarabic: 0xFEC0, - dagesh: 0x05BC, - dageshhebrew: 0x05BC, - dagger: 0x2020, - daggerdbl: 0x2021, - dagujarati: 0x0AA6, - dagurmukhi: 0x0A26, - dahiragana: 0x3060, - dakatakana: 0x30C0, - dalarabic: 0x062F, - dalet: 0x05D3, - daletdagesh: 0xFB33, - daletdageshhebrew: 0xFB33, - dalethebrew: 0x05D3, - dalfinalarabic: 0xFEAA, - dammaarabic: 0x064F, - dammalowarabic: 0x064F, - dammatanaltonearabic: 0x064C, - dammatanarabic: 0x064C, - danda: 0x0964, - dargahebrew: 0x05A7, - dargalefthebrew: 0x05A7, - dasiapneumatacyrilliccmb: 0x0485, - dblGrave: 0xF6D3, - dblanglebracketleft: 0x300A, - dblanglebracketleftvertical: 0xFE3D, - dblanglebracketright: 0x300B, - dblanglebracketrightvertical: 0xFE3E, - dblarchinvertedbelowcmb: 0x032B, - dblarrowleft: 0x21D4, - dblarrowright: 0x21D2, - dbldanda: 0x0965, - dblgrave: 0xF6D6, - dblgravecmb: 0x030F, - dblintegral: 0x222C, - dbllowline: 0x2017, - dbllowlinecmb: 0x0333, - dbloverlinecmb: 0x033F, - dblprimemod: 0x02BA, - dblverticalbar: 0x2016, - dblverticallineabovecmb: 0x030E, - dbopomofo: 0x3109, - dbsquare: 0x33C8, - dcaron: 0x010F, - dcedilla: 0x1E11, - dcircle: 0x24D3, - dcircumflexbelow: 0x1E13, - dcroat: 0x0111, - ddabengali: 0x09A1, - ddadeva: 0x0921, - ddagujarati: 0x0AA1, - ddagurmukhi: 0x0A21, - ddalarabic: 0x0688, - ddalfinalarabic: 0xFB89, - dddhadeva: 0x095C, - ddhabengali: 0x09A2, - ddhadeva: 0x0922, - ddhagujarati: 0x0AA2, - ddhagurmukhi: 0x0A22, - ddotaccent: 0x1E0B, - ddotbelow: 0x1E0D, - decimalseparatorarabic: 0x066B, - decimalseparatorpersian: 0x066B, - decyrillic: 0x0434, - degree: 0x00B0, - dehihebrew: 0x05AD, - dehiragana: 0x3067, - deicoptic: 0x03EF, - dekatakana: 0x30C7, - deleteleft: 0x232B, - deleteright: 0x2326, - delta: 0x03B4, - deltaturned: 0x018D, - denominatorminusonenumeratorbengali: 0x09F8, - dezh: 0x02A4, - dhabengali: 0x09A7, - dhadeva: 0x0927, - dhagujarati: 0x0AA7, - dhagurmukhi: 0x0A27, - dhook: 0x0257, - dialytikatonos: 0x0385, - dialytikatonoscmb: 0x0344, - diamond: 0x2666, - diamondsuitwhite: 0x2662, - dieresis: 0x00A8, - dieresisacute: 0xF6D7, - dieresisbelowcmb: 0x0324, - dieresiscmb: 0x0308, - dieresisgrave: 0xF6D8, - dieresistonos: 0x0385, - dihiragana: 0x3062, - dikatakana: 0x30C2, - dittomark: 0x3003, - divide: 0x00F7, - divides: 0x2223, - divisionslash: 0x2215, - djecyrillic: 0x0452, - dkshade: 0x2593, - dlinebelow: 0x1E0F, - dlsquare: 0x3397, - dmacron: 0x0111, - dmonospace: 0xFF44, - dnblock: 0x2584, - dochadathai: 0x0E0E, - dodekthai: 0x0E14, - dohiragana: 0x3069, - dokatakana: 0x30C9, - dollar: 0x0024, - dollarinferior: 0xF6E3, - dollarmonospace: 0xFF04, - dollaroldstyle: 0xF724, - dollarsmall: 0xFE69, - dollarsuperior: 0xF6E4, - dong: 0x20AB, - dorusquare: 0x3326, - dotaccent: 0x02D9, - dotaccentcmb: 0x0307, - dotbelowcmb: 0x0323, - dotbelowcomb: 0x0323, - dotkatakana: 0x30FB, - dotlessi: 0x0131, - dotlessj: 0xF6BE, - dotlessjstrokehook: 0x0284, - dotmath: 0x22C5, - dottedcircle: 0x25CC, - doubleyodpatah: 0xFB1F, - doubleyodpatahhebrew: 0xFB1F, - downtackbelowcmb: 0x031E, - downtackmod: 0x02D5, - dparen: 0x249F, - dsuperior: 0xF6EB, - dtail: 0x0256, - dtopbar: 0x018C, - duhiragana: 0x3065, - dukatakana: 0x30C5, - dz: 0x01F3, - dzaltone: 0x02A3, - dzcaron: 0x01C6, - dzcurl: 0x02A5, - dzeabkhasiancyrillic: 0x04E1, - dzecyrillic: 0x0455, - dzhecyrillic: 0x045F, - e: 0x0065, - eacute: 0x00E9, - earth: 0x2641, - ebengali: 0x098F, - ebopomofo: 0x311C, - ebreve: 0x0115, - ecandradeva: 0x090D, - ecandragujarati: 0x0A8D, - ecandravowelsigndeva: 0x0945, - ecandravowelsigngujarati: 0x0AC5, - ecaron: 0x011B, - ecedillabreve: 0x1E1D, - echarmenian: 0x0565, - echyiwnarmenian: 0x0587, - ecircle: 0x24D4, - ecircumflex: 0x00EA, - ecircumflexacute: 0x1EBF, - ecircumflexbelow: 0x1E19, - ecircumflexdotbelow: 0x1EC7, - ecircumflexgrave: 0x1EC1, - ecircumflexhookabove: 0x1EC3, - ecircumflextilde: 0x1EC5, - ecyrillic: 0x0454, - edblgrave: 0x0205, - edeva: 0x090F, - edieresis: 0x00EB, - edot: 0x0117, - edotaccent: 0x0117, - edotbelow: 0x1EB9, - eegurmukhi: 0x0A0F, - eematragurmukhi: 0x0A47, - efcyrillic: 0x0444, - egrave: 0x00E8, - egujarati: 0x0A8F, - eharmenian: 0x0567, - ehbopomofo: 0x311D, - ehiragana: 0x3048, - ehookabove: 0x1EBB, - eibopomofo: 0x311F, - eight: 0x0038, - eightarabic: 0x0668, - eightbengali: 0x09EE, - eightcircle: 0x2467, - eightcircleinversesansserif: 0x2791, - eightdeva: 0x096E, - eighteencircle: 0x2471, - eighteenparen: 0x2485, - eighteenperiod: 0x2499, - eightgujarati: 0x0AEE, - eightgurmukhi: 0x0A6E, - eighthackarabic: 0x0668, - eighthangzhou: 0x3028, - eighthnotebeamed: 0x266B, - eightideographicparen: 0x3227, - eightinferior: 0x2088, - eightmonospace: 0xFF18, - eightoldstyle: 0xF738, - eightparen: 0x247B, - eightperiod: 0x248F, - eightpersian: 0x06F8, - eightroman: 0x2177, - eightsuperior: 0x2078, - eightthai: 0x0E58, - einvertedbreve: 0x0207, - eiotifiedcyrillic: 0x0465, - ekatakana: 0x30A8, - ekatakanahalfwidth: 0xFF74, - ekonkargurmukhi: 0x0A74, - ekorean: 0x3154, - elcyrillic: 0x043B, - element: 0x2208, - elevencircle: 0x246A, - elevenparen: 0x247E, - elevenperiod: 0x2492, - elevenroman: 0x217A, - ellipsis: 0x2026, - ellipsisvertical: 0x22EE, - emacron: 0x0113, - emacronacute: 0x1E17, - emacrongrave: 0x1E15, - emcyrillic: 0x043C, - emdash: 0x2014, - emdashvertical: 0xFE31, - emonospace: 0xFF45, - emphasismarkarmenian: 0x055B, - emptyset: 0x2205, - enbopomofo: 0x3123, - encyrillic: 0x043D, - endash: 0x2013, - endashvertical: 0xFE32, - endescendercyrillic: 0x04A3, - eng: 0x014B, - engbopomofo: 0x3125, - enghecyrillic: 0x04A5, - enhookcyrillic: 0x04C8, - enspace: 0x2002, - eogonek: 0x0119, - eokorean: 0x3153, - eopen: 0x025B, - eopenclosed: 0x029A, - eopenreversed: 0x025C, - eopenreversedclosed: 0x025E, - eopenreversedhook: 0x025D, - eparen: 0x24A0, - epsilon: 0x03B5, - epsilontonos: 0x03AD, - equal: 0x003D, - equalmonospace: 0xFF1D, - equalsmall: 0xFE66, - equalsuperior: 0x207C, - equivalence: 0x2261, - erbopomofo: 0x3126, - ercyrillic: 0x0440, - ereversed: 0x0258, - ereversedcyrillic: 0x044D, - escyrillic: 0x0441, - esdescendercyrillic: 0x04AB, - esh: 0x0283, - eshcurl: 0x0286, - eshortdeva: 0x090E, - eshortvowelsigndeva: 0x0946, - eshreversedloop: 0x01AA, - eshsquatreversed: 0x0285, - esmallhiragana: 0x3047, - esmallkatakana: 0x30A7, - esmallkatakanahalfwidth: 0xFF6A, - estimated: 0x212E, - esuperior: 0xF6EC, - eta: 0x03B7, - etarmenian: 0x0568, - etatonos: 0x03AE, - eth: 0x00F0, - etilde: 0x1EBD, - etildebelow: 0x1E1B, - etnahtafoukhhebrew: 0x0591, - etnahtafoukhlefthebrew: 0x0591, - etnahtahebrew: 0x0591, - etnahtalefthebrew: 0x0591, - eturned: 0x01DD, - eukorean: 0x3161, - euro: 0x20AC, - evowelsignbengali: 0x09C7, - evowelsigndeva: 0x0947, - evowelsigngujarati: 0x0AC7, - exclam: 0x0021, - exclamarmenian: 0x055C, - exclamdbl: 0x203C, - exclamdown: 0x00A1, - exclamdownsmall: 0xF7A1, - exclammonospace: 0xFF01, - exclamsmall: 0xF721, - existential: 0x2203, - ezh: 0x0292, - ezhcaron: 0x01EF, - ezhcurl: 0x0293, - ezhreversed: 0x01B9, - ezhtail: 0x01BA, - f: 0x0066, - fadeva: 0x095E, - fagurmukhi: 0x0A5E, - fahrenheit: 0x2109, - fathaarabic: 0x064E, - fathalowarabic: 0x064E, - fathatanarabic: 0x064B, - fbopomofo: 0x3108, - fcircle: 0x24D5, - fdotaccent: 0x1E1F, - feharabic: 0x0641, - feharmenian: 0x0586, - fehfinalarabic: 0xFED2, - fehinitialarabic: 0xFED3, - fehmedialarabic: 0xFED4, - feicoptic: 0x03E5, - female: 0x2640, - ff: 0xFB00, - ffi: 0xFB03, - ffl: 0xFB04, - fi: 0xFB01, - fifteencircle: 0x246E, - fifteenparen: 0x2482, - fifteenperiod: 0x2496, - figuredash: 0x2012, - filledbox: 0x25A0, - filledrect: 0x25AC, - finalkaf: 0x05DA, - finalkafdagesh: 0xFB3A, - finalkafdageshhebrew: 0xFB3A, - finalkafhebrew: 0x05DA, - finalmem: 0x05DD, - finalmemhebrew: 0x05DD, - finalnun: 0x05DF, - finalnunhebrew: 0x05DF, - finalpe: 0x05E3, - finalpehebrew: 0x05E3, - finaltsadi: 0x05E5, - finaltsadihebrew: 0x05E5, - firsttonechinese: 0x02C9, - fisheye: 0x25C9, - fitacyrillic: 0x0473, - five: 0x0035, - fivearabic: 0x0665, - fivebengali: 0x09EB, - fivecircle: 0x2464, - fivecircleinversesansserif: 0x278E, - fivedeva: 0x096B, - fiveeighths: 0x215D, - fivegujarati: 0x0AEB, - fivegurmukhi: 0x0A6B, - fivehackarabic: 0x0665, - fivehangzhou: 0x3025, - fiveideographicparen: 0x3224, - fiveinferior: 0x2085, - fivemonospace: 0xFF15, - fiveoldstyle: 0xF735, - fiveparen: 0x2478, - fiveperiod: 0x248C, - fivepersian: 0x06F5, - fiveroman: 0x2174, - fivesuperior: 0x2075, - fivethai: 0x0E55, - fl: 0xFB02, - florin: 0x0192, - fmonospace: 0xFF46, - fmsquare: 0x3399, - fofanthai: 0x0E1F, - fofathai: 0x0E1D, - fongmanthai: 0x0E4F, - forall: 0x2200, - four: 0x0034, - fourarabic: 0x0664, - fourbengali: 0x09EA, - fourcircle: 0x2463, - fourcircleinversesansserif: 0x278D, - fourdeva: 0x096A, - fourgujarati: 0x0AEA, - fourgurmukhi: 0x0A6A, - fourhackarabic: 0x0664, - fourhangzhou: 0x3024, - fourideographicparen: 0x3223, - fourinferior: 0x2084, - fourmonospace: 0xFF14, - fournumeratorbengali: 0x09F7, - fouroldstyle: 0xF734, - fourparen: 0x2477, - fourperiod: 0x248B, - fourpersian: 0x06F4, - fourroman: 0x2173, - foursuperior: 0x2074, - fourteencircle: 0x246D, - fourteenparen: 0x2481, - fourteenperiod: 0x2495, - fourthai: 0x0E54, - fourthtonechinese: 0x02CB, - fparen: 0x24A1, - fraction: 0x2044, - franc: 0x20A3, - g: 0x0067, - gabengali: 0x0997, - gacute: 0x01F5, - gadeva: 0x0917, - gafarabic: 0x06AF, - gaffinalarabic: 0xFB93, - gafinitialarabic: 0xFB94, - gafmedialarabic: 0xFB95, - gagujarati: 0x0A97, - gagurmukhi: 0x0A17, - gahiragana: 0x304C, - gakatakana: 0x30AC, - gamma: 0x03B3, - gammalatinsmall: 0x0263, - gammasuperior: 0x02E0, - gangiacoptic: 0x03EB, - gbopomofo: 0x310D, - gbreve: 0x011F, - gcaron: 0x01E7, - gcedilla: 0x0123, - gcircle: 0x24D6, - gcircumflex: 0x011D, - gcommaaccent: 0x0123, - gdot: 0x0121, - gdotaccent: 0x0121, - gecyrillic: 0x0433, - gehiragana: 0x3052, - gekatakana: 0x30B2, - geometricallyequal: 0x2251, - gereshaccenthebrew: 0x059C, - gereshhebrew: 0x05F3, - gereshmuqdamhebrew: 0x059D, - germandbls: 0x00DF, - gershayimaccenthebrew: 0x059E, - gershayimhebrew: 0x05F4, - getamark: 0x3013, - ghabengali: 0x0998, - ghadarmenian: 0x0572, - ghadeva: 0x0918, - ghagujarati: 0x0A98, - ghagurmukhi: 0x0A18, - ghainarabic: 0x063A, - ghainfinalarabic: 0xFECE, - ghaininitialarabic: 0xFECF, - ghainmedialarabic: 0xFED0, - ghemiddlehookcyrillic: 0x0495, - ghestrokecyrillic: 0x0493, - gheupturncyrillic: 0x0491, - ghhadeva: 0x095A, - ghhagurmukhi: 0x0A5A, - ghook: 0x0260, - ghzsquare: 0x3393, - gihiragana: 0x304E, - gikatakana: 0x30AE, - gimarmenian: 0x0563, - gimel: 0x05D2, - gimeldagesh: 0xFB32, - gimeldageshhebrew: 0xFB32, - gimelhebrew: 0x05D2, - gjecyrillic: 0x0453, - glottalinvertedstroke: 0x01BE, - glottalstop: 0x0294, - glottalstopinverted: 0x0296, - glottalstopmod: 0x02C0, - glottalstopreversed: 0x0295, - glottalstopreversedmod: 0x02C1, - glottalstopreversedsuperior: 0x02E4, - glottalstopstroke: 0x02A1, - glottalstopstrokereversed: 0x02A2, - gmacron: 0x1E21, - gmonospace: 0xFF47, - gohiragana: 0x3054, - gokatakana: 0x30B4, - gparen: 0x24A2, - gpasquare: 0x33AC, - gradient: 0x2207, - grave: 0x0060, - gravebelowcmb: 0x0316, - gravecmb: 0x0300, - gravecomb: 0x0300, - gravedeva: 0x0953, - gravelowmod: 0x02CE, - gravemonospace: 0xFF40, - gravetonecmb: 0x0340, - greater: 0x003E, - greaterequal: 0x2265, - greaterequalorless: 0x22DB, - greatermonospace: 0xFF1E, - greaterorequivalent: 0x2273, - greaterorless: 0x2277, - greateroverequal: 0x2267, - greatersmall: 0xFE65, - gscript: 0x0261, - gstroke: 0x01E5, - guhiragana: 0x3050, - guillemotleft: 0x00AB, - guillemotright: 0x00BB, - guilsinglleft: 0x2039, - guilsinglright: 0x203A, - gukatakana: 0x30B0, - guramusquare: 0x3318, - gysquare: 0x33C9, - h: 0x0068, - haabkhasiancyrillic: 0x04A9, - haaltonearabic: 0x06C1, - habengali: 0x09B9, - hadescendercyrillic: 0x04B3, - hadeva: 0x0939, - hagujarati: 0x0AB9, - hagurmukhi: 0x0A39, - haharabic: 0x062D, - hahfinalarabic: 0xFEA2, - hahinitialarabic: 0xFEA3, - hahiragana: 0x306F, - hahmedialarabic: 0xFEA4, - haitusquare: 0x332A, - hakatakana: 0x30CF, - hakatakanahalfwidth: 0xFF8A, - halantgurmukhi: 0x0A4D, - hamzaarabic: 0x0621, - hamzalowarabic: 0x0621, - hangulfiller: 0x3164, - hardsigncyrillic: 0x044A, - harpoonleftbarbup: 0x21BC, - harpoonrightbarbup: 0x21C0, - hasquare: 0x33CA, - hatafpatah: 0x05B2, - hatafpatah16: 0x05B2, - hatafpatah23: 0x05B2, - hatafpatah2f: 0x05B2, - hatafpatahhebrew: 0x05B2, - hatafpatahnarrowhebrew: 0x05B2, - hatafpatahquarterhebrew: 0x05B2, - hatafpatahwidehebrew: 0x05B2, - hatafqamats: 0x05B3, - hatafqamats1b: 0x05B3, - hatafqamats28: 0x05B3, - hatafqamats34: 0x05B3, - hatafqamatshebrew: 0x05B3, - hatafqamatsnarrowhebrew: 0x05B3, - hatafqamatsquarterhebrew: 0x05B3, - hatafqamatswidehebrew: 0x05B3, - hatafsegol: 0x05B1, - hatafsegol17: 0x05B1, - hatafsegol24: 0x05B1, - hatafsegol30: 0x05B1, - hatafsegolhebrew: 0x05B1, - hatafsegolnarrowhebrew: 0x05B1, - hatafsegolquarterhebrew: 0x05B1, - hatafsegolwidehebrew: 0x05B1, - hbar: 0x0127, - hbopomofo: 0x310F, - hbrevebelow: 0x1E2B, - hcedilla: 0x1E29, - hcircle: 0x24D7, - hcircumflex: 0x0125, - hdieresis: 0x1E27, - hdotaccent: 0x1E23, - hdotbelow: 0x1E25, - he: 0x05D4, - heart: 0x2665, - heartsuitblack: 0x2665, - heartsuitwhite: 0x2661, - hedagesh: 0xFB34, - hedageshhebrew: 0xFB34, - hehaltonearabic: 0x06C1, - heharabic: 0x0647, - hehebrew: 0x05D4, - hehfinalaltonearabic: 0xFBA7, - hehfinalalttwoarabic: 0xFEEA, - hehfinalarabic: 0xFEEA, - hehhamzaabovefinalarabic: 0xFBA5, - hehhamzaaboveisolatedarabic: 0xFBA4, - hehinitialaltonearabic: 0xFBA8, - hehinitialarabic: 0xFEEB, - hehiragana: 0x3078, - hehmedialaltonearabic: 0xFBA9, - hehmedialarabic: 0xFEEC, - heiseierasquare: 0x337B, - hekatakana: 0x30D8, - hekatakanahalfwidth: 0xFF8D, - hekutaarusquare: 0x3336, - henghook: 0x0267, - herutusquare: 0x3339, - het: 0x05D7, - hethebrew: 0x05D7, - hhook: 0x0266, - hhooksuperior: 0x02B1, - hieuhacirclekorean: 0x327B, - hieuhaparenkorean: 0x321B, - hieuhcirclekorean: 0x326D, - hieuhkorean: 0x314E, - hieuhparenkorean: 0x320D, - hihiragana: 0x3072, - hikatakana: 0x30D2, - hikatakanahalfwidth: 0xFF8B, - hiriq: 0x05B4, - hiriq14: 0x05B4, - hiriq21: 0x05B4, - hiriq2d: 0x05B4, - hiriqhebrew: 0x05B4, - hiriqnarrowhebrew: 0x05B4, - hiriqquarterhebrew: 0x05B4, - hiriqwidehebrew: 0x05B4, - hlinebelow: 0x1E96, - hmonospace: 0xFF48, - hoarmenian: 0x0570, - hohipthai: 0x0E2B, - hohiragana: 0x307B, - hokatakana: 0x30DB, - hokatakanahalfwidth: 0xFF8E, - holam: 0x05B9, - holam19: 0x05B9, - holam26: 0x05B9, - holam32: 0x05B9, - holamhebrew: 0x05B9, - holamnarrowhebrew: 0x05B9, - holamquarterhebrew: 0x05B9, - holamwidehebrew: 0x05B9, - honokhukthai: 0x0E2E, - hookabovecomb: 0x0309, - hookcmb: 0x0309, - hookpalatalizedbelowcmb: 0x0321, - hookretroflexbelowcmb: 0x0322, - hoonsquare: 0x3342, - horicoptic: 0x03E9, - horizontalbar: 0x2015, - horncmb: 0x031B, - hotsprings: 0x2668, - house: 0x2302, - hparen: 0x24A3, - hsuperior: 0x02B0, - hturned: 0x0265, - huhiragana: 0x3075, - huiitosquare: 0x3333, - hukatakana: 0x30D5, - hukatakanahalfwidth: 0xFF8C, - hungarumlaut: 0x02DD, - hungarumlautcmb: 0x030B, - hv: 0x0195, - hyphen: 0x002D, - hypheninferior: 0xF6E5, - hyphenmonospace: 0xFF0D, - hyphensmall: 0xFE63, - hyphensuperior: 0xF6E6, - hyphentwo: 0x2010, - i: 0x0069, - iacute: 0x00ED, - iacyrillic: 0x044F, - ibengali: 0x0987, - ibopomofo: 0x3127, - ibreve: 0x012D, - icaron: 0x01D0, - icircle: 0x24D8, - icircumflex: 0x00EE, - icyrillic: 0x0456, - idblgrave: 0x0209, - ideographearthcircle: 0x328F, - ideographfirecircle: 0x328B, - ideographicallianceparen: 0x323F, - ideographiccallparen: 0x323A, - ideographiccentrecircle: 0x32A5, - ideographicclose: 0x3006, - ideographiccomma: 0x3001, - ideographiccommaleft: 0xFF64, - ideographiccongratulationparen: 0x3237, - ideographiccorrectcircle: 0x32A3, - ideographicearthparen: 0x322F, - ideographicenterpriseparen: 0x323D, - ideographicexcellentcircle: 0x329D, - ideographicfestivalparen: 0x3240, - ideographicfinancialcircle: 0x3296, - ideographicfinancialparen: 0x3236, - ideographicfireparen: 0x322B, - ideographichaveparen: 0x3232, - ideographichighcircle: 0x32A4, - ideographiciterationmark: 0x3005, - ideographiclaborcircle: 0x3298, - ideographiclaborparen: 0x3238, - ideographicleftcircle: 0x32A7, - ideographiclowcircle: 0x32A6, - ideographicmedicinecircle: 0x32A9, - ideographicmetalparen: 0x322E, - ideographicmoonparen: 0x322A, - ideographicnameparen: 0x3234, - ideographicperiod: 0x3002, - ideographicprintcircle: 0x329E, - ideographicreachparen: 0x3243, - ideographicrepresentparen: 0x3239, - ideographicresourceparen: 0x323E, - ideographicrightcircle: 0x32A8, - ideographicsecretcircle: 0x3299, - ideographicselfparen: 0x3242, - ideographicsocietyparen: 0x3233, - ideographicspace: 0x3000, - ideographicspecialparen: 0x3235, - ideographicstockparen: 0x3231, - ideographicstudyparen: 0x323B, - ideographicsunparen: 0x3230, - ideographicsuperviseparen: 0x323C, - ideographicwaterparen: 0x322C, - ideographicwoodparen: 0x322D, - ideographiczero: 0x3007, - ideographmetalcircle: 0x328E, - ideographmooncircle: 0x328A, - ideographnamecircle: 0x3294, - ideographsuncircle: 0x3290, - ideographwatercircle: 0x328C, - ideographwoodcircle: 0x328D, - ideva: 0x0907, - idieresis: 0x00EF, - idieresisacute: 0x1E2F, - idieresiscyrillic: 0x04E5, - idotbelow: 0x1ECB, - iebrevecyrillic: 0x04D7, - iecyrillic: 0x0435, - ieungacirclekorean: 0x3275, - ieungaparenkorean: 0x3215, - ieungcirclekorean: 0x3267, - ieungkorean: 0x3147, - ieungparenkorean: 0x3207, - igrave: 0x00EC, - igujarati: 0x0A87, - igurmukhi: 0x0A07, - ihiragana: 0x3044, - ihookabove: 0x1EC9, - iibengali: 0x0988, - iicyrillic: 0x0438, - iideva: 0x0908, - iigujarati: 0x0A88, - iigurmukhi: 0x0A08, - iimatragurmukhi: 0x0A40, - iinvertedbreve: 0x020B, - iishortcyrillic: 0x0439, - iivowelsignbengali: 0x09C0, - iivowelsigndeva: 0x0940, - iivowelsigngujarati: 0x0AC0, - ij: 0x0133, - ikatakana: 0x30A4, - ikatakanahalfwidth: 0xFF72, - ikorean: 0x3163, - ilde: 0x02DC, - iluyhebrew: 0x05AC, - imacron: 0x012B, - imacroncyrillic: 0x04E3, - imageorapproximatelyequal: 0x2253, - imatragurmukhi: 0x0A3F, - imonospace: 0xFF49, - increment: 0x2206, - infinity: 0x221E, - iniarmenian: 0x056B, - integral: 0x222B, - integralbottom: 0x2321, - integralbt: 0x2321, - integralex: 0xF8F5, - integraltop: 0x2320, - integraltp: 0x2320, - intersection: 0x2229, - intisquare: 0x3305, - invbullet: 0x25D8, - invcircle: 0x25D9, - invsmileface: 0x263B, - iocyrillic: 0x0451, - iogonek: 0x012F, - iota: 0x03B9, - iotadieresis: 0x03CA, - iotadieresistonos: 0x0390, - iotalatin: 0x0269, - iotatonos: 0x03AF, - iparen: 0x24A4, - irigurmukhi: 0x0A72, - ismallhiragana: 0x3043, - ismallkatakana: 0x30A3, - ismallkatakanahalfwidth: 0xFF68, - issharbengali: 0x09FA, - istroke: 0x0268, - isuperior: 0xF6ED, - iterationhiragana: 0x309D, - iterationkatakana: 0x30FD, - itilde: 0x0129, - itildebelow: 0x1E2D, - iubopomofo: 0x3129, - iucyrillic: 0x044E, - ivowelsignbengali: 0x09BF, - ivowelsigndeva: 0x093F, - ivowelsigngujarati: 0x0ABF, - izhitsacyrillic: 0x0475, - izhitsadblgravecyrillic: 0x0477, - j: 0x006A, - jaarmenian: 0x0571, - jabengali: 0x099C, - jadeva: 0x091C, - jagujarati: 0x0A9C, - jagurmukhi: 0x0A1C, - jbopomofo: 0x3110, - jcaron: 0x01F0, - jcircle: 0x24D9, - jcircumflex: 0x0135, - jcrossedtail: 0x029D, - jdotlessstroke: 0x025F, - jecyrillic: 0x0458, - jeemarabic: 0x062C, - jeemfinalarabic: 0xFE9E, - jeeminitialarabic: 0xFE9F, - jeemmedialarabic: 0xFEA0, - jeharabic: 0x0698, - jehfinalarabic: 0xFB8B, - jhabengali: 0x099D, - jhadeva: 0x091D, - jhagujarati: 0x0A9D, - jhagurmukhi: 0x0A1D, - jheharmenian: 0x057B, - jis: 0x3004, - jmonospace: 0xFF4A, - jparen: 0x24A5, - jsuperior: 0x02B2, - k: 0x006B, - kabashkircyrillic: 0x04A1, - kabengali: 0x0995, - kacute: 0x1E31, - kacyrillic: 0x043A, - kadescendercyrillic: 0x049B, - kadeva: 0x0915, - kaf: 0x05DB, - kafarabic: 0x0643, - kafdagesh: 0xFB3B, - kafdageshhebrew: 0xFB3B, - kaffinalarabic: 0xFEDA, - kafhebrew: 0x05DB, - kafinitialarabic: 0xFEDB, - kafmedialarabic: 0xFEDC, - kafrafehebrew: 0xFB4D, - kagujarati: 0x0A95, - kagurmukhi: 0x0A15, - kahiragana: 0x304B, - kahookcyrillic: 0x04C4, - kakatakana: 0x30AB, - kakatakanahalfwidth: 0xFF76, - kappa: 0x03BA, - kappasymbolgreek: 0x03F0, - kapyeounmieumkorean: 0x3171, - kapyeounphieuphkorean: 0x3184, - kapyeounpieupkorean: 0x3178, - kapyeounssangpieupkorean: 0x3179, - karoriisquare: 0x330D, - kashidaautoarabic: 0x0640, - kashidaautonosidebearingarabic: 0x0640, - kasmallkatakana: 0x30F5, - kasquare: 0x3384, - kasraarabic: 0x0650, - kasratanarabic: 0x064D, - kastrokecyrillic: 0x049F, - katahiraprolongmarkhalfwidth: 0xFF70, - kaverticalstrokecyrillic: 0x049D, - kbopomofo: 0x310E, - kcalsquare: 0x3389, - kcaron: 0x01E9, - kcedilla: 0x0137, - kcircle: 0x24DA, - kcommaaccent: 0x0137, - kdotbelow: 0x1E33, - keharmenian: 0x0584, - kehiragana: 0x3051, - kekatakana: 0x30B1, - kekatakanahalfwidth: 0xFF79, - kenarmenian: 0x056F, - kesmallkatakana: 0x30F6, - kgreenlandic: 0x0138, - khabengali: 0x0996, - khacyrillic: 0x0445, - khadeva: 0x0916, - khagujarati: 0x0A96, - khagurmukhi: 0x0A16, - khaharabic: 0x062E, - khahfinalarabic: 0xFEA6, - khahinitialarabic: 0xFEA7, - khahmedialarabic: 0xFEA8, - kheicoptic: 0x03E7, - khhadeva: 0x0959, - khhagurmukhi: 0x0A59, - khieukhacirclekorean: 0x3278, - khieukhaparenkorean: 0x3218, - khieukhcirclekorean: 0x326A, - khieukhkorean: 0x314B, - khieukhparenkorean: 0x320A, - khokhaithai: 0x0E02, - khokhonthai: 0x0E05, - khokhuatthai: 0x0E03, - khokhwaithai: 0x0E04, - khomutthai: 0x0E5B, - khook: 0x0199, - khorakhangthai: 0x0E06, - khzsquare: 0x3391, - kihiragana: 0x304D, - kikatakana: 0x30AD, - kikatakanahalfwidth: 0xFF77, - kiroguramusquare: 0x3315, - kiromeetorusquare: 0x3316, - kirosquare: 0x3314, - kiyeokacirclekorean: 0x326E, - kiyeokaparenkorean: 0x320E, - kiyeokcirclekorean: 0x3260, - kiyeokkorean: 0x3131, - kiyeokparenkorean: 0x3200, - kiyeoksioskorean: 0x3133, - kjecyrillic: 0x045C, - klinebelow: 0x1E35, - klsquare: 0x3398, - kmcubedsquare: 0x33A6, - kmonospace: 0xFF4B, - kmsquaredsquare: 0x33A2, - kohiragana: 0x3053, - kohmsquare: 0x33C0, - kokaithai: 0x0E01, - kokatakana: 0x30B3, - kokatakanahalfwidth: 0xFF7A, - kooposquare: 0x331E, - koppacyrillic: 0x0481, - koreanstandardsymbol: 0x327F, - koroniscmb: 0x0343, - kparen: 0x24A6, - kpasquare: 0x33AA, - ksicyrillic: 0x046F, - ktsquare: 0x33CF, - kturned: 0x029E, - kuhiragana: 0x304F, - kukatakana: 0x30AF, - kukatakanahalfwidth: 0xFF78, - kvsquare: 0x33B8, - kwsquare: 0x33BE, - l: 0x006C, - labengali: 0x09B2, - lacute: 0x013A, - ladeva: 0x0932, - lagujarati: 0x0AB2, - lagurmukhi: 0x0A32, - lakkhangyaothai: 0x0E45, - lamaleffinalarabic: 0xFEFC, - lamalefhamzaabovefinalarabic: 0xFEF8, - lamalefhamzaaboveisolatedarabic: 0xFEF7, - lamalefhamzabelowfinalarabic: 0xFEFA, - lamalefhamzabelowisolatedarabic: 0xFEF9, - lamalefisolatedarabic: 0xFEFB, - lamalefmaddaabovefinalarabic: 0xFEF6, - lamalefmaddaaboveisolatedarabic: 0xFEF5, - lamarabic: 0x0644, - lambda: 0x03BB, - lambdastroke: 0x019B, - lamed: 0x05DC, - lameddagesh: 0xFB3C, - lameddageshhebrew: 0xFB3C, - lamedhebrew: 0x05DC, - lamfinalarabic: 0xFEDE, - lamhahinitialarabic: 0xFCCA, - laminitialarabic: 0xFEDF, - lamjeeminitialarabic: 0xFCC9, - lamkhahinitialarabic: 0xFCCB, - lamlamhehisolatedarabic: 0xFDF2, - lammedialarabic: 0xFEE0, - lammeemhahinitialarabic: 0xFD88, - lammeeminitialarabic: 0xFCCC, - largecircle: 0x25EF, - lbar: 0x019A, - lbelt: 0x026C, - lbopomofo: 0x310C, - lcaron: 0x013E, - lcedilla: 0x013C, - lcircle: 0x24DB, - lcircumflexbelow: 0x1E3D, - lcommaaccent: 0x013C, - ldot: 0x0140, - ldotaccent: 0x0140, - ldotbelow: 0x1E37, - ldotbelowmacron: 0x1E39, - leftangleabovecmb: 0x031A, - lefttackbelowcmb: 0x0318, - less: 0x003C, - lessequal: 0x2264, - lessequalorgreater: 0x22DA, - lessmonospace: 0xFF1C, - lessorequivalent: 0x2272, - lessorgreater: 0x2276, - lessoverequal: 0x2266, - lesssmall: 0xFE64, - lezh: 0x026E, - lfblock: 0x258C, - lhookretroflex: 0x026D, - lira: 0x20A4, - liwnarmenian: 0x056C, - lj: 0x01C9, - ljecyrillic: 0x0459, - ll: 0xF6C0, - lladeva: 0x0933, - llagujarati: 0x0AB3, - llinebelow: 0x1E3B, - llladeva: 0x0934, - llvocalicbengali: 0x09E1, - llvocalicdeva: 0x0961, - llvocalicvowelsignbengali: 0x09E3, - llvocalicvowelsigndeva: 0x0963, - lmiddletilde: 0x026B, - lmonospace: 0xFF4C, - lmsquare: 0x33D0, - lochulathai: 0x0E2C, - logicaland: 0x2227, - logicalnot: 0x00AC, - logicalnotreversed: 0x2310, - logicalor: 0x2228, - lolingthai: 0x0E25, - longs: 0x017F, - lowlinecenterline: 0xFE4E, - lowlinecmb: 0x0332, - lowlinedashed: 0xFE4D, - lozenge: 0x25CA, - lparen: 0x24A7, - lslash: 0x0142, - lsquare: 0x2113, - lsuperior: 0xF6EE, - ltshade: 0x2591, - luthai: 0x0E26, - lvocalicbengali: 0x098C, - lvocalicdeva: 0x090C, - lvocalicvowelsignbengali: 0x09E2, - lvocalicvowelsigndeva: 0x0962, - lxsquare: 0x33D3, - m: 0x006D, - mabengali: 0x09AE, - macron: 0x00AF, - macronbelowcmb: 0x0331, - macroncmb: 0x0304, - macronlowmod: 0x02CD, - macronmonospace: 0xFFE3, - macute: 0x1E3F, - madeva: 0x092E, - magujarati: 0x0AAE, - magurmukhi: 0x0A2E, - mahapakhhebrew: 0x05A4, - mahapakhlefthebrew: 0x05A4, - mahiragana: 0x307E, - maichattawalowleftthai: 0xF895, - maichattawalowrightthai: 0xF894, - maichattawathai: 0x0E4B, - maichattawaupperleftthai: 0xF893, - maieklowleftthai: 0xF88C, - maieklowrightthai: 0xF88B, - maiekthai: 0x0E48, - maiekupperleftthai: 0xF88A, - maihanakatleftthai: 0xF884, - maihanakatthai: 0x0E31, - maitaikhuleftthai: 0xF889, - maitaikhuthai: 0x0E47, - maitholowleftthai: 0xF88F, - maitholowrightthai: 0xF88E, - maithothai: 0x0E49, - maithoupperleftthai: 0xF88D, - maitrilowleftthai: 0xF892, - maitrilowrightthai: 0xF891, - maitrithai: 0x0E4A, - maitriupperleftthai: 0xF890, - maiyamokthai: 0x0E46, - makatakana: 0x30DE, - makatakanahalfwidth: 0xFF8F, - male: 0x2642, - mansyonsquare: 0x3347, - maqafhebrew: 0x05BE, - mars: 0x2642, - masoracirclehebrew: 0x05AF, - masquare: 0x3383, - mbopomofo: 0x3107, - mbsquare: 0x33D4, - mcircle: 0x24DC, - mcubedsquare: 0x33A5, - mdotaccent: 0x1E41, - mdotbelow: 0x1E43, - meemarabic: 0x0645, - meemfinalarabic: 0xFEE2, - meeminitialarabic: 0xFEE3, - meemmedialarabic: 0xFEE4, - meemmeeminitialarabic: 0xFCD1, - meemmeemisolatedarabic: 0xFC48, - meetorusquare: 0x334D, - mehiragana: 0x3081, - meizierasquare: 0x337E, - mekatakana: 0x30E1, - mekatakanahalfwidth: 0xFF92, - mem: 0x05DE, - memdagesh: 0xFB3E, - memdageshhebrew: 0xFB3E, - memhebrew: 0x05DE, - menarmenian: 0x0574, - merkhahebrew: 0x05A5, - merkhakefulahebrew: 0x05A6, - merkhakefulalefthebrew: 0x05A6, - merkhalefthebrew: 0x05A5, - mhook: 0x0271, - mhzsquare: 0x3392, - middledotkatakanahalfwidth: 0xFF65, - middot: 0x00B7, - mieumacirclekorean: 0x3272, - mieumaparenkorean: 0x3212, - mieumcirclekorean: 0x3264, - mieumkorean: 0x3141, - mieumpansioskorean: 0x3170, - mieumparenkorean: 0x3204, - mieumpieupkorean: 0x316E, - mieumsioskorean: 0x316F, - mihiragana: 0x307F, - mikatakana: 0x30DF, - mikatakanahalfwidth: 0xFF90, - minus: 0x2212, - minusbelowcmb: 0x0320, - minuscircle: 0x2296, - minusmod: 0x02D7, - minusplus: 0x2213, - minute: 0x2032, - miribaarusquare: 0x334A, - mirisquare: 0x3349, - mlonglegturned: 0x0270, - mlsquare: 0x3396, - mmcubedsquare: 0x33A3, - mmonospace: 0xFF4D, - mmsquaredsquare: 0x339F, - mohiragana: 0x3082, - mohmsquare: 0x33C1, - mokatakana: 0x30E2, - mokatakanahalfwidth: 0xFF93, - molsquare: 0x33D6, - momathai: 0x0E21, - moverssquare: 0x33A7, - moverssquaredsquare: 0x33A8, - mparen: 0x24A8, - mpasquare: 0x33AB, - mssquare: 0x33B3, - msuperior: 0xF6EF, - mturned: 0x026F, - mu: 0x00B5, - mu1: 0x00B5, - muasquare: 0x3382, - muchgreater: 0x226B, - muchless: 0x226A, - mufsquare: 0x338C, - mugreek: 0x03BC, - mugsquare: 0x338D, - muhiragana: 0x3080, - mukatakana: 0x30E0, - mukatakanahalfwidth: 0xFF91, - mulsquare: 0x3395, - multiply: 0x00D7, - mumsquare: 0x339B, - munahhebrew: 0x05A3, - munahlefthebrew: 0x05A3, - musicalnote: 0x266A, - musicalnotedbl: 0x266B, - musicflatsign: 0x266D, - musicsharpsign: 0x266F, - mussquare: 0x33B2, - muvsquare: 0x33B6, - muwsquare: 0x33BC, - mvmegasquare: 0x33B9, - mvsquare: 0x33B7, - mwmegasquare: 0x33BF, - mwsquare: 0x33BD, - n: 0x006E, - nabengali: 0x09A8, - nabla: 0x2207, - nacute: 0x0144, - nadeva: 0x0928, - nagujarati: 0x0AA8, - nagurmukhi: 0x0A28, - nahiragana: 0x306A, - nakatakana: 0x30CA, - nakatakanahalfwidth: 0xFF85, - napostrophe: 0x0149, - nasquare: 0x3381, - nbopomofo: 0x310B, - nbspace: 0x00A0, - ncaron: 0x0148, - ncedilla: 0x0146, - ncircle: 0x24DD, - ncircumflexbelow: 0x1E4B, - ncommaaccent: 0x0146, - ndotaccent: 0x1E45, - ndotbelow: 0x1E47, - nehiragana: 0x306D, - nekatakana: 0x30CD, - nekatakanahalfwidth: 0xFF88, - newsheqelsign: 0x20AA, - nfsquare: 0x338B, - ngabengali: 0x0999, - ngadeva: 0x0919, - ngagujarati: 0x0A99, - ngagurmukhi: 0x0A19, - ngonguthai: 0x0E07, - nhiragana: 0x3093, - nhookleft: 0x0272, - nhookretroflex: 0x0273, - nieunacirclekorean: 0x326F, - nieunaparenkorean: 0x320F, - nieuncieuckorean: 0x3135, - nieuncirclekorean: 0x3261, - nieunhieuhkorean: 0x3136, - nieunkorean: 0x3134, - nieunpansioskorean: 0x3168, - nieunparenkorean: 0x3201, - nieunsioskorean: 0x3167, - nieuntikeutkorean: 0x3166, - nihiragana: 0x306B, - nikatakana: 0x30CB, - nikatakanahalfwidth: 0xFF86, - nikhahitleftthai: 0xF899, - nikhahitthai: 0x0E4D, - nine: 0x0039, - ninearabic: 0x0669, - ninebengali: 0x09EF, - ninecircle: 0x2468, - ninecircleinversesansserif: 0x2792, - ninedeva: 0x096F, - ninegujarati: 0x0AEF, - ninegurmukhi: 0x0A6F, - ninehackarabic: 0x0669, - ninehangzhou: 0x3029, - nineideographicparen: 0x3228, - nineinferior: 0x2089, - ninemonospace: 0xFF19, - nineoldstyle: 0xF739, - nineparen: 0x247C, - nineperiod: 0x2490, - ninepersian: 0x06F9, - nineroman: 0x2178, - ninesuperior: 0x2079, - nineteencircle: 0x2472, - nineteenparen: 0x2486, - nineteenperiod: 0x249A, - ninethai: 0x0E59, - nj: 0x01CC, - njecyrillic: 0x045A, - nkatakana: 0x30F3, - nkatakanahalfwidth: 0xFF9D, - nlegrightlong: 0x019E, - nlinebelow: 0x1E49, - nmonospace: 0xFF4E, - nmsquare: 0x339A, - nnabengali: 0x09A3, - nnadeva: 0x0923, - nnagujarati: 0x0AA3, - nnagurmukhi: 0x0A23, - nnnadeva: 0x0929, - nohiragana: 0x306E, - nokatakana: 0x30CE, - nokatakanahalfwidth: 0xFF89, - nonbreakingspace: 0x00A0, - nonenthai: 0x0E13, - nonuthai: 0x0E19, - noonarabic: 0x0646, - noonfinalarabic: 0xFEE6, - noonghunnaarabic: 0x06BA, - noonghunnafinalarabic: 0xFB9F, - nooninitialarabic: 0xFEE7, - noonjeeminitialarabic: 0xFCD2, - noonjeemisolatedarabic: 0xFC4B, - noonmedialarabic: 0xFEE8, - noonmeeminitialarabic: 0xFCD5, - noonmeemisolatedarabic: 0xFC4E, - noonnoonfinalarabic: 0xFC8D, - notcontains: 0x220C, - notelement: 0x2209, - notelementof: 0x2209, - notequal: 0x2260, - notgreater: 0x226F, - notgreaternorequal: 0x2271, - notgreaternorless: 0x2279, - notidentical: 0x2262, - notless: 0x226E, - notlessnorequal: 0x2270, - notparallel: 0x2226, - notprecedes: 0x2280, - notsubset: 0x2284, - notsucceeds: 0x2281, - notsuperset: 0x2285, - nowarmenian: 0x0576, - nparen: 0x24A9, - nssquare: 0x33B1, - nsuperior: 0x207F, - ntilde: 0x00F1, - nu: 0x03BD, - nuhiragana: 0x306C, - nukatakana: 0x30CC, - nukatakanahalfwidth: 0xFF87, - nuktabengali: 0x09BC, - nuktadeva: 0x093C, - nuktagujarati: 0x0ABC, - nuktagurmukhi: 0x0A3C, - numbersign: 0x0023, - numbersignmonospace: 0xFF03, - numbersignsmall: 0xFE5F, - numeralsigngreek: 0x0374, - numeralsignlowergreek: 0x0375, - numero: 0x2116, - nun: 0x05E0, - nundagesh: 0xFB40, - nundageshhebrew: 0xFB40, - nunhebrew: 0x05E0, - nvsquare: 0x33B5, - nwsquare: 0x33BB, - nyabengali: 0x099E, - nyadeva: 0x091E, - nyagujarati: 0x0A9E, - nyagurmukhi: 0x0A1E, - o: 0x006F, - oacute: 0x00F3, - oangthai: 0x0E2D, - obarred: 0x0275, - obarredcyrillic: 0x04E9, - obarreddieresiscyrillic: 0x04EB, - obengali: 0x0993, - obopomofo: 0x311B, - obreve: 0x014F, - ocandradeva: 0x0911, - ocandragujarati: 0x0A91, - ocandravowelsigndeva: 0x0949, - ocandravowelsigngujarati: 0x0AC9, - ocaron: 0x01D2, - ocircle: 0x24DE, - ocircumflex: 0x00F4, - ocircumflexacute: 0x1ED1, - ocircumflexdotbelow: 0x1ED9, - ocircumflexgrave: 0x1ED3, - ocircumflexhookabove: 0x1ED5, - ocircumflextilde: 0x1ED7, - ocyrillic: 0x043E, - odblacute: 0x0151, - odblgrave: 0x020D, - odeva: 0x0913, - odieresis: 0x00F6, - odieresiscyrillic: 0x04E7, - odotbelow: 0x1ECD, - oe: 0x0153, - oekorean: 0x315A, - ogonek: 0x02DB, - ogonekcmb: 0x0328, - ograve: 0x00F2, - ogujarati: 0x0A93, - oharmenian: 0x0585, - ohiragana: 0x304A, - ohookabove: 0x1ECF, - ohorn: 0x01A1, - ohornacute: 0x1EDB, - ohorndotbelow: 0x1EE3, - ohorngrave: 0x1EDD, - ohornhookabove: 0x1EDF, - ohorntilde: 0x1EE1, - ohungarumlaut: 0x0151, - oi: 0x01A3, - oinvertedbreve: 0x020F, - okatakana: 0x30AA, - okatakanahalfwidth: 0xFF75, - okorean: 0x3157, - olehebrew: 0x05AB, - omacron: 0x014D, - omacronacute: 0x1E53, - omacrongrave: 0x1E51, - omdeva: 0x0950, - omega: 0x03C9, - omega1: 0x03D6, - omegacyrillic: 0x0461, - omegalatinclosed: 0x0277, - omegaroundcyrillic: 0x047B, - omegatitlocyrillic: 0x047D, - omegatonos: 0x03CE, - omgujarati: 0x0AD0, - omicron: 0x03BF, - omicrontonos: 0x03CC, - omonospace: 0xFF4F, - one: 0x0031, - onearabic: 0x0661, - onebengali: 0x09E7, - onecircle: 0x2460, - onecircleinversesansserif: 0x278A, - onedeva: 0x0967, - onedotenleader: 0x2024, - oneeighth: 0x215B, - onefitted: 0xF6DC, - onegujarati: 0x0AE7, - onegurmukhi: 0x0A67, - onehackarabic: 0x0661, - onehalf: 0x00BD, - onehangzhou: 0x3021, - oneideographicparen: 0x3220, - oneinferior: 0x2081, - onemonospace: 0xFF11, - onenumeratorbengali: 0x09F4, - oneoldstyle: 0xF731, - oneparen: 0x2474, - oneperiod: 0x2488, - onepersian: 0x06F1, - onequarter: 0x00BC, - oneroman: 0x2170, - onesuperior: 0x00B9, - onethai: 0x0E51, - onethird: 0x2153, - oogonek: 0x01EB, - oogonekmacron: 0x01ED, - oogurmukhi: 0x0A13, - oomatragurmukhi: 0x0A4B, - oopen: 0x0254, - oparen: 0x24AA, - openbullet: 0x25E6, - option: 0x2325, - ordfeminine: 0x00AA, - ordmasculine: 0x00BA, - orthogonal: 0x221F, - oshortdeva: 0x0912, - oshortvowelsigndeva: 0x094A, - oslash: 0x00F8, - oslashacute: 0x01FF, - osmallhiragana: 0x3049, - osmallkatakana: 0x30A9, - osmallkatakanahalfwidth: 0xFF6B, - ostrokeacute: 0x01FF, - osuperior: 0xF6F0, - otcyrillic: 0x047F, - otilde: 0x00F5, - otildeacute: 0x1E4D, - otildedieresis: 0x1E4F, - oubopomofo: 0x3121, - overline: 0x203E, - overlinecenterline: 0xFE4A, - overlinecmb: 0x0305, - overlinedashed: 0xFE49, - overlinedblwavy: 0xFE4C, - overlinewavy: 0xFE4B, - overscore: 0x00AF, - ovowelsignbengali: 0x09CB, - ovowelsigndeva: 0x094B, - ovowelsigngujarati: 0x0ACB, - p: 0x0070, - paampssquare: 0x3380, - paasentosquare: 0x332B, - pabengali: 0x09AA, - pacute: 0x1E55, - padeva: 0x092A, - pagedown: 0x21DF, - pageup: 0x21DE, - pagujarati: 0x0AAA, - pagurmukhi: 0x0A2A, - pahiragana: 0x3071, - paiyannoithai: 0x0E2F, - pakatakana: 0x30D1, - palatalizationcyrilliccmb: 0x0484, - palochkacyrillic: 0x04C0, - pansioskorean: 0x317F, - paragraph: 0x00B6, - parallel: 0x2225, - parenleft: 0x0028, - parenleftaltonearabic: 0xFD3E, - parenleftbt: 0xF8ED, - parenleftex: 0xF8EC, - parenleftinferior: 0x208D, - parenleftmonospace: 0xFF08, - parenleftsmall: 0xFE59, - parenleftsuperior: 0x207D, - parenlefttp: 0xF8EB, - parenleftvertical: 0xFE35, - parenright: 0x0029, - parenrightaltonearabic: 0xFD3F, - parenrightbt: 0xF8F8, - parenrightex: 0xF8F7, - parenrightinferior: 0x208E, - parenrightmonospace: 0xFF09, - parenrightsmall: 0xFE5A, - parenrightsuperior: 0x207E, - parenrighttp: 0xF8F6, - parenrightvertical: 0xFE36, - partialdiff: 0x2202, - paseqhebrew: 0x05C0, - pashtahebrew: 0x0599, - pasquare: 0x33A9, - patah: 0x05B7, - patah11: 0x05B7, - patah1d: 0x05B7, - patah2a: 0x05B7, - patahhebrew: 0x05B7, - patahnarrowhebrew: 0x05B7, - patahquarterhebrew: 0x05B7, - patahwidehebrew: 0x05B7, - pazerhebrew: 0x05A1, - pbopomofo: 0x3106, - pcircle: 0x24DF, - pdotaccent: 0x1E57, - pe: 0x05E4, - pecyrillic: 0x043F, - pedagesh: 0xFB44, - pedageshhebrew: 0xFB44, - peezisquare: 0x333B, - pefinaldageshhebrew: 0xFB43, - peharabic: 0x067E, - peharmenian: 0x057A, - pehebrew: 0x05E4, - pehfinalarabic: 0xFB57, - pehinitialarabic: 0xFB58, - pehiragana: 0x307A, - pehmedialarabic: 0xFB59, - pekatakana: 0x30DA, - pemiddlehookcyrillic: 0x04A7, - perafehebrew: 0xFB4E, - percent: 0x0025, - percentarabic: 0x066A, - percentmonospace: 0xFF05, - percentsmall: 0xFE6A, - period: 0x002E, - periodarmenian: 0x0589, - periodcentered: 0x00B7, - periodhalfwidth: 0xFF61, - periodinferior: 0xF6E7, - periodmonospace: 0xFF0E, - periodsmall: 0xFE52, - periodsuperior: 0xF6E8, - perispomenigreekcmb: 0x0342, - perpendicular: 0x22A5, - perthousand: 0x2030, - peseta: 0x20A7, - pfsquare: 0x338A, - phabengali: 0x09AB, - phadeva: 0x092B, - phagujarati: 0x0AAB, - phagurmukhi: 0x0A2B, - phi: 0x03C6, - phi1: 0x03D5, - phieuphacirclekorean: 0x327A, - phieuphaparenkorean: 0x321A, - phieuphcirclekorean: 0x326C, - phieuphkorean: 0x314D, - phieuphparenkorean: 0x320C, - philatin: 0x0278, - phinthuthai: 0x0E3A, - phisymbolgreek: 0x03D5, - phook: 0x01A5, - phophanthai: 0x0E1E, - phophungthai: 0x0E1C, - phosamphaothai: 0x0E20, - pi: 0x03C0, - pieupacirclekorean: 0x3273, - pieupaparenkorean: 0x3213, - pieupcieuckorean: 0x3176, - pieupcirclekorean: 0x3265, - pieupkiyeokkorean: 0x3172, - pieupkorean: 0x3142, - pieupparenkorean: 0x3205, - pieupsioskiyeokkorean: 0x3174, - pieupsioskorean: 0x3144, - pieupsiostikeutkorean: 0x3175, - pieupthieuthkorean: 0x3177, - pieuptikeutkorean: 0x3173, - pihiragana: 0x3074, - pikatakana: 0x30D4, - pisymbolgreek: 0x03D6, - piwrarmenian: 0x0583, - plus: 0x002B, - plusbelowcmb: 0x031F, - pluscircle: 0x2295, - plusminus: 0x00B1, - plusmod: 0x02D6, - plusmonospace: 0xFF0B, - plussmall: 0xFE62, - plussuperior: 0x207A, - pmonospace: 0xFF50, - pmsquare: 0x33D8, - pohiragana: 0x307D, - pointingindexdownwhite: 0x261F, - pointingindexleftwhite: 0x261C, - pointingindexrightwhite: 0x261E, - pointingindexupwhite: 0x261D, - pokatakana: 0x30DD, - poplathai: 0x0E1B, - postalmark: 0x3012, - postalmarkface: 0x3020, - pparen: 0x24AB, - precedes: 0x227A, - prescription: 0x211E, - primemod: 0x02B9, - primereversed: 0x2035, - product: 0x220F, - projective: 0x2305, - prolongedkana: 0x30FC, - propellor: 0x2318, - propersubset: 0x2282, - propersuperset: 0x2283, - proportion: 0x2237, - proportional: 0x221D, - psi: 0x03C8, - psicyrillic: 0x0471, - psilipneumatacyrilliccmb: 0x0486, - pssquare: 0x33B0, - puhiragana: 0x3077, - pukatakana: 0x30D7, - pvsquare: 0x33B4, - pwsquare: 0x33BA, - q: 0x0071, - qadeva: 0x0958, - qadmahebrew: 0x05A8, - qafarabic: 0x0642, - qaffinalarabic: 0xFED6, - qafinitialarabic: 0xFED7, - qafmedialarabic: 0xFED8, - qamats: 0x05B8, - qamats10: 0x05B8, - qamats1a: 0x05B8, - qamats1c: 0x05B8, - qamats27: 0x05B8, - qamats29: 0x05B8, - qamats33: 0x05B8, - qamatsde: 0x05B8, - qamatshebrew: 0x05B8, - qamatsnarrowhebrew: 0x05B8, - qamatsqatanhebrew: 0x05B8, - qamatsqatannarrowhebrew: 0x05B8, - qamatsqatanquarterhebrew: 0x05B8, - qamatsqatanwidehebrew: 0x05B8, - qamatsquarterhebrew: 0x05B8, - qamatswidehebrew: 0x05B8, - qarneyparahebrew: 0x059F, - qbopomofo: 0x3111, - qcircle: 0x24E0, - qhook: 0x02A0, - qmonospace: 0xFF51, - qof: 0x05E7, - qofdagesh: 0xFB47, - qofdageshhebrew: 0xFB47, - qofhebrew: 0x05E7, - qparen: 0x24AC, - quarternote: 0x2669, - qubuts: 0x05BB, - qubuts18: 0x05BB, - qubuts25: 0x05BB, - qubuts31: 0x05BB, - qubutshebrew: 0x05BB, - qubutsnarrowhebrew: 0x05BB, - qubutsquarterhebrew: 0x05BB, - qubutswidehebrew: 0x05BB, - question: 0x003F, - questionarabic: 0x061F, - questionarmenian: 0x055E, - questiondown: 0x00BF, - questiondownsmall: 0xF7BF, - questiongreek: 0x037E, - questionmonospace: 0xFF1F, - questionsmall: 0xF73F, - quotedbl: 0x0022, - quotedblbase: 0x201E, - quotedblleft: 0x201C, - quotedblmonospace: 0xFF02, - quotedblprime: 0x301E, - quotedblprimereversed: 0x301D, - quotedblright: 0x201D, - quoteleft: 0x2018, - quoteleftreversed: 0x201B, - quotereversed: 0x201B, - quoteright: 0x2019, - quoterightn: 0x0149, - quotesinglbase: 0x201A, - quotesingle: 0x0027, - quotesinglemonospace: 0xFF07, - r: 0x0072, - raarmenian: 0x057C, - rabengali: 0x09B0, - racute: 0x0155, - radeva: 0x0930, - radical: 0x221A, - radicalex: 0xF8E5, - radoverssquare: 0x33AE, - radoverssquaredsquare: 0x33AF, - radsquare: 0x33AD, - rafe: 0x05BF, - rafehebrew: 0x05BF, - ragujarati: 0x0AB0, - ragurmukhi: 0x0A30, - rahiragana: 0x3089, - rakatakana: 0x30E9, - rakatakanahalfwidth: 0xFF97, - ralowerdiagonalbengali: 0x09F1, - ramiddlediagonalbengali: 0x09F0, - ramshorn: 0x0264, - ratio: 0x2236, - rbopomofo: 0x3116, - rcaron: 0x0159, - rcedilla: 0x0157, - rcircle: 0x24E1, - rcommaaccent: 0x0157, - rdblgrave: 0x0211, - rdotaccent: 0x1E59, - rdotbelow: 0x1E5B, - rdotbelowmacron: 0x1E5D, - referencemark: 0x203B, - reflexsubset: 0x2286, - reflexsuperset: 0x2287, - registered: 0x00AE, - registersans: 0xF8E8, - registerserif: 0xF6DA, - reharabic: 0x0631, - reharmenian: 0x0580, - rehfinalarabic: 0xFEAE, - rehiragana: 0x308C, - rekatakana: 0x30EC, - rekatakanahalfwidth: 0xFF9A, - resh: 0x05E8, - reshdageshhebrew: 0xFB48, - reshhebrew: 0x05E8, - reversedtilde: 0x223D, - reviahebrew: 0x0597, - reviamugrashhebrew: 0x0597, - revlogicalnot: 0x2310, - rfishhook: 0x027E, - rfishhookreversed: 0x027F, - rhabengali: 0x09DD, - rhadeva: 0x095D, - rho: 0x03C1, - rhook: 0x027D, - rhookturned: 0x027B, - rhookturnedsuperior: 0x02B5, - rhosymbolgreek: 0x03F1, - rhotichookmod: 0x02DE, - rieulacirclekorean: 0x3271, - rieulaparenkorean: 0x3211, - rieulcirclekorean: 0x3263, - rieulhieuhkorean: 0x3140, - rieulkiyeokkorean: 0x313A, - rieulkiyeoksioskorean: 0x3169, - rieulkorean: 0x3139, - rieulmieumkorean: 0x313B, - rieulpansioskorean: 0x316C, - rieulparenkorean: 0x3203, - rieulphieuphkorean: 0x313F, - rieulpieupkorean: 0x313C, - rieulpieupsioskorean: 0x316B, - rieulsioskorean: 0x313D, - rieulthieuthkorean: 0x313E, - rieultikeutkorean: 0x316A, - rieulyeorinhieuhkorean: 0x316D, - rightangle: 0x221F, - righttackbelowcmb: 0x0319, - righttriangle: 0x22BF, - rihiragana: 0x308A, - rikatakana: 0x30EA, - rikatakanahalfwidth: 0xFF98, - ring: 0x02DA, - ringbelowcmb: 0x0325, - ringcmb: 0x030A, - ringhalfleft: 0x02BF, - ringhalfleftarmenian: 0x0559, - ringhalfleftbelowcmb: 0x031C, - ringhalfleftcentered: 0x02D3, - ringhalfright: 0x02BE, - ringhalfrightbelowcmb: 0x0339, - ringhalfrightcentered: 0x02D2, - rinvertedbreve: 0x0213, - rittorusquare: 0x3351, - rlinebelow: 0x1E5F, - rlongleg: 0x027C, - rlonglegturned: 0x027A, - rmonospace: 0xFF52, - rohiragana: 0x308D, - rokatakana: 0x30ED, - rokatakanahalfwidth: 0xFF9B, - roruathai: 0x0E23, - rparen: 0x24AD, - rrabengali: 0x09DC, - rradeva: 0x0931, - rragurmukhi: 0x0A5C, - rreharabic: 0x0691, - rrehfinalarabic: 0xFB8D, - rrvocalicbengali: 0x09E0, - rrvocalicdeva: 0x0960, - rrvocalicgujarati: 0x0AE0, - rrvocalicvowelsignbengali: 0x09C4, - rrvocalicvowelsigndeva: 0x0944, - rrvocalicvowelsigngujarati: 0x0AC4, - rsuperior: 0xF6F1, - rtblock: 0x2590, - rturned: 0x0279, - rturnedsuperior: 0x02B4, - ruhiragana: 0x308B, - rukatakana: 0x30EB, - rukatakanahalfwidth: 0xFF99, - rupeemarkbengali: 0x09F2, - rupeesignbengali: 0x09F3, - rupiah: 0xF6DD, - ruthai: 0x0E24, - rvocalicbengali: 0x098B, - rvocalicdeva: 0x090B, - rvocalicgujarati: 0x0A8B, - rvocalicvowelsignbengali: 0x09C3, - rvocalicvowelsigndeva: 0x0943, - rvocalicvowelsigngujarati: 0x0AC3, - s: 0x0073, - sabengali: 0x09B8, - sacute: 0x015B, - sacutedotaccent: 0x1E65, - sadarabic: 0x0635, - sadeva: 0x0938, - sadfinalarabic: 0xFEBA, - sadinitialarabic: 0xFEBB, - sadmedialarabic: 0xFEBC, - sagujarati: 0x0AB8, - sagurmukhi: 0x0A38, - sahiragana: 0x3055, - sakatakana: 0x30B5, - sakatakanahalfwidth: 0xFF7B, - sallallahoualayhewasallamarabic: 0xFDFA, - samekh: 0x05E1, - samekhdagesh: 0xFB41, - samekhdageshhebrew: 0xFB41, - samekhhebrew: 0x05E1, - saraaathai: 0x0E32, - saraaethai: 0x0E41, - saraaimaimalaithai: 0x0E44, - saraaimaimuanthai: 0x0E43, - saraamthai: 0x0E33, - saraathai: 0x0E30, - saraethai: 0x0E40, - saraiileftthai: 0xF886, - saraiithai: 0x0E35, - saraileftthai: 0xF885, - saraithai: 0x0E34, - saraothai: 0x0E42, - saraueeleftthai: 0xF888, - saraueethai: 0x0E37, - saraueleftthai: 0xF887, - sarauethai: 0x0E36, - sarauthai: 0x0E38, - sarauuthai: 0x0E39, - sbopomofo: 0x3119, - scaron: 0x0161, - scarondotaccent: 0x1E67, - scedilla: 0x015F, - schwa: 0x0259, - schwacyrillic: 0x04D9, - schwadieresiscyrillic: 0x04DB, - schwahook: 0x025A, - scircle: 0x24E2, - scircumflex: 0x015D, - scommaaccent: 0x0219, - sdotaccent: 0x1E61, - sdotbelow: 0x1E63, - sdotbelowdotaccent: 0x1E69, - seagullbelowcmb: 0x033C, - second: 0x2033, - secondtonechinese: 0x02CA, - section: 0x00A7, - seenarabic: 0x0633, - seenfinalarabic: 0xFEB2, - seeninitialarabic: 0xFEB3, - seenmedialarabic: 0xFEB4, - segol: 0x05B6, - segol13: 0x05B6, - segol1f: 0x05B6, - segol2c: 0x05B6, - segolhebrew: 0x05B6, - segolnarrowhebrew: 0x05B6, - segolquarterhebrew: 0x05B6, - segoltahebrew: 0x0592, - segolwidehebrew: 0x05B6, - seharmenian: 0x057D, - sehiragana: 0x305B, - sekatakana: 0x30BB, - sekatakanahalfwidth: 0xFF7E, - semicolon: 0x003B, - semicolonarabic: 0x061B, - semicolonmonospace: 0xFF1B, - semicolonsmall: 0xFE54, - semivoicedmarkkana: 0x309C, - semivoicedmarkkanahalfwidth: 0xFF9F, - sentisquare: 0x3322, - sentosquare: 0x3323, - seven: 0x0037, - sevenarabic: 0x0667, - sevenbengali: 0x09ED, - sevencircle: 0x2466, - sevencircleinversesansserif: 0x2790, - sevendeva: 0x096D, - seveneighths: 0x215E, - sevengujarati: 0x0AED, - sevengurmukhi: 0x0A6D, - sevenhackarabic: 0x0667, - sevenhangzhou: 0x3027, - sevenideographicparen: 0x3226, - seveninferior: 0x2087, - sevenmonospace: 0xFF17, - sevenoldstyle: 0xF737, - sevenparen: 0x247A, - sevenperiod: 0x248E, - sevenpersian: 0x06F7, - sevenroman: 0x2176, - sevensuperior: 0x2077, - seventeencircle: 0x2470, - seventeenparen: 0x2484, - seventeenperiod: 0x2498, - seventhai: 0x0E57, - sfthyphen: 0x00AD, - shaarmenian: 0x0577, - shabengali: 0x09B6, - shacyrillic: 0x0448, - shaddaarabic: 0x0651, - shaddadammaarabic: 0xFC61, - shaddadammatanarabic: 0xFC5E, - shaddafathaarabic: 0xFC60, - shaddakasraarabic: 0xFC62, - shaddakasratanarabic: 0xFC5F, - shade: 0x2592, - shadedark: 0x2593, - shadelight: 0x2591, - shademedium: 0x2592, - shadeva: 0x0936, - shagujarati: 0x0AB6, - shagurmukhi: 0x0A36, - shalshelethebrew: 0x0593, - shbopomofo: 0x3115, - shchacyrillic: 0x0449, - sheenarabic: 0x0634, - sheenfinalarabic: 0xFEB6, - sheeninitialarabic: 0xFEB7, - sheenmedialarabic: 0xFEB8, - sheicoptic: 0x03E3, - sheqel: 0x20AA, - sheqelhebrew: 0x20AA, - sheva: 0x05B0, - sheva115: 0x05B0, - sheva15: 0x05B0, - sheva22: 0x05B0, - sheva2e: 0x05B0, - shevahebrew: 0x05B0, - shevanarrowhebrew: 0x05B0, - shevaquarterhebrew: 0x05B0, - shevawidehebrew: 0x05B0, - shhacyrillic: 0x04BB, - shimacoptic: 0x03ED, - shin: 0x05E9, - shindagesh: 0xFB49, - shindageshhebrew: 0xFB49, - shindageshshindot: 0xFB2C, - shindageshshindothebrew: 0xFB2C, - shindageshsindot: 0xFB2D, - shindageshsindothebrew: 0xFB2D, - shindothebrew: 0x05C1, - shinhebrew: 0x05E9, - shinshindot: 0xFB2A, - shinshindothebrew: 0xFB2A, - shinsindot: 0xFB2B, - shinsindothebrew: 0xFB2B, - shook: 0x0282, - sigma: 0x03C3, - sigma1: 0x03C2, - sigmafinal: 0x03C2, - sigmalunatesymbolgreek: 0x03F2, - sihiragana: 0x3057, - sikatakana: 0x30B7, - sikatakanahalfwidth: 0xFF7C, - siluqhebrew: 0x05BD, - siluqlefthebrew: 0x05BD, - similar: 0x223C, - sindothebrew: 0x05C2, - siosacirclekorean: 0x3274, - siosaparenkorean: 0x3214, - sioscieuckorean: 0x317E, - sioscirclekorean: 0x3266, - sioskiyeokkorean: 0x317A, - sioskorean: 0x3145, - siosnieunkorean: 0x317B, - siosparenkorean: 0x3206, - siospieupkorean: 0x317D, - siostikeutkorean: 0x317C, - six: 0x0036, - sixarabic: 0x0666, - sixbengali: 0x09EC, - sixcircle: 0x2465, - sixcircleinversesansserif: 0x278F, - sixdeva: 0x096C, - sixgujarati: 0x0AEC, - sixgurmukhi: 0x0A6C, - sixhackarabic: 0x0666, - sixhangzhou: 0x3026, - sixideographicparen: 0x3225, - sixinferior: 0x2086, - sixmonospace: 0xFF16, - sixoldstyle: 0xF736, - sixparen: 0x2479, - sixperiod: 0x248D, - sixpersian: 0x06F6, - sixroman: 0x2175, - sixsuperior: 0x2076, - sixteencircle: 0x246F, - sixteencurrencydenominatorbengali: 0x09F9, - sixteenparen: 0x2483, - sixteenperiod: 0x2497, - sixthai: 0x0E56, - slash: 0x002F, - slashmonospace: 0xFF0F, - slong: 0x017F, - slongdotaccent: 0x1E9B, - smileface: 0x263A, - smonospace: 0xFF53, - sofpasuqhebrew: 0x05C3, - softhyphen: 0x00AD, - softsigncyrillic: 0x044C, - sohiragana: 0x305D, - sokatakana: 0x30BD, - sokatakanahalfwidth: 0xFF7F, - soliduslongoverlaycmb: 0x0338, - solidusshortoverlaycmb: 0x0337, - sorusithai: 0x0E29, - sosalathai: 0x0E28, - sosothai: 0x0E0B, - sosuathai: 0x0E2A, - space: 0x0020, - spacehackarabic: 0x0020, - spade: 0x2660, - spadesuitblack: 0x2660, - spadesuitwhite: 0x2664, - sparen: 0x24AE, - squarebelowcmb: 0x033B, - squarecc: 0x33C4, - squarecm: 0x339D, - squarediagonalcrosshatchfill: 0x25A9, - squarehorizontalfill: 0x25A4, - squarekg: 0x338F, - squarekm: 0x339E, - squarekmcapital: 0x33CE, - squareln: 0x33D1, - squarelog: 0x33D2, - squaremg: 0x338E, - squaremil: 0x33D5, - squaremm: 0x339C, - squaremsquared: 0x33A1, - squareorthogonalcrosshatchfill: 0x25A6, - squareupperlefttolowerrightfill: 0x25A7, - squareupperrighttolowerleftfill: 0x25A8, - squareverticalfill: 0x25A5, - squarewhitewithsmallblack: 0x25A3, - srsquare: 0x33DB, - ssabengali: 0x09B7, - ssadeva: 0x0937, - ssagujarati: 0x0AB7, - ssangcieuckorean: 0x3149, - ssanghieuhkorean: 0x3185, - ssangieungkorean: 0x3180, - ssangkiyeokkorean: 0x3132, - ssangnieunkorean: 0x3165, - ssangpieupkorean: 0x3143, - ssangsioskorean: 0x3146, - ssangtikeutkorean: 0x3138, - ssuperior: 0xF6F2, - sterling: 0x00A3, - sterlingmonospace: 0xFFE1, - strokelongoverlaycmb: 0x0336, - strokeshortoverlaycmb: 0x0335, - subset: 0x2282, - subsetnotequal: 0x228A, - subsetorequal: 0x2286, - succeeds: 0x227B, - suchthat: 0x220B, - suhiragana: 0x3059, - sukatakana: 0x30B9, - sukatakanahalfwidth: 0xFF7D, - sukunarabic: 0x0652, - summation: 0x2211, - sun: 0x263C, - superset: 0x2283, - supersetnotequal: 0x228B, - supersetorequal: 0x2287, - svsquare: 0x33DC, - syouwaerasquare: 0x337C, - t: 0x0074, - tabengali: 0x09A4, - tackdown: 0x22A4, - tackleft: 0x22A3, - tadeva: 0x0924, - tagujarati: 0x0AA4, - tagurmukhi: 0x0A24, - taharabic: 0x0637, - tahfinalarabic: 0xFEC2, - tahinitialarabic: 0xFEC3, - tahiragana: 0x305F, - tahmedialarabic: 0xFEC4, - taisyouerasquare: 0x337D, - takatakana: 0x30BF, - takatakanahalfwidth: 0xFF80, - tatweelarabic: 0x0640, - tau: 0x03C4, - tav: 0x05EA, - tavdages: 0xFB4A, - tavdagesh: 0xFB4A, - tavdageshhebrew: 0xFB4A, - tavhebrew: 0x05EA, - tbar: 0x0167, - tbopomofo: 0x310A, - tcaron: 0x0165, - tccurl: 0x02A8, - tcedilla: 0x0163, - tcheharabic: 0x0686, - tchehfinalarabic: 0xFB7B, - tchehinitialarabic: 0xFB7C, - tchehmedialarabic: 0xFB7D, - tcircle: 0x24E3, - tcircumflexbelow: 0x1E71, - tcommaaccent: 0x0163, - tdieresis: 0x1E97, - tdotaccent: 0x1E6B, - tdotbelow: 0x1E6D, - tecyrillic: 0x0442, - tedescendercyrillic: 0x04AD, - teharabic: 0x062A, - tehfinalarabic: 0xFE96, - tehhahinitialarabic: 0xFCA2, - tehhahisolatedarabic: 0xFC0C, - tehinitialarabic: 0xFE97, - tehiragana: 0x3066, - tehjeeminitialarabic: 0xFCA1, - tehjeemisolatedarabic: 0xFC0B, - tehmarbutaarabic: 0x0629, - tehmarbutafinalarabic: 0xFE94, - tehmedialarabic: 0xFE98, - tehmeeminitialarabic: 0xFCA4, - tehmeemisolatedarabic: 0xFC0E, - tehnoonfinalarabic: 0xFC73, - tekatakana: 0x30C6, - tekatakanahalfwidth: 0xFF83, - telephone: 0x2121, - telephoneblack: 0x260E, - telishagedolahebrew: 0x05A0, - telishaqetanahebrew: 0x05A9, - tencircle: 0x2469, - tenideographicparen: 0x3229, - tenparen: 0x247D, - tenperiod: 0x2491, - tenroman: 0x2179, - tesh: 0x02A7, - tet: 0x05D8, - tetdagesh: 0xFB38, - tetdageshhebrew: 0xFB38, - tethebrew: 0x05D8, - tetsecyrillic: 0x04B5, - tevirhebrew: 0x059B, - tevirlefthebrew: 0x059B, - thabengali: 0x09A5, - thadeva: 0x0925, - thagujarati: 0x0AA5, - thagurmukhi: 0x0A25, - thalarabic: 0x0630, - thalfinalarabic: 0xFEAC, - thanthakhatlowleftthai: 0xF898, - thanthakhatlowrightthai: 0xF897, - thanthakhatthai: 0x0E4C, - thanthakhatupperleftthai: 0xF896, - theharabic: 0x062B, - thehfinalarabic: 0xFE9A, - thehinitialarabic: 0xFE9B, - thehmedialarabic: 0xFE9C, - thereexists: 0x2203, - therefore: 0x2234, - theta: 0x03B8, - theta1: 0x03D1, - thetasymbolgreek: 0x03D1, - thieuthacirclekorean: 0x3279, - thieuthaparenkorean: 0x3219, - thieuthcirclekorean: 0x326B, - thieuthkorean: 0x314C, - thieuthparenkorean: 0x320B, - thirteencircle: 0x246C, - thirteenparen: 0x2480, - thirteenperiod: 0x2494, - thonangmonthothai: 0x0E11, - thook: 0x01AD, - thophuthaothai: 0x0E12, - thorn: 0x00FE, - thothahanthai: 0x0E17, - thothanthai: 0x0E10, - thothongthai: 0x0E18, - thothungthai: 0x0E16, - thousandcyrillic: 0x0482, - thousandsseparatorarabic: 0x066C, - thousandsseparatorpersian: 0x066C, - three: 0x0033, - threearabic: 0x0663, - threebengali: 0x09E9, - threecircle: 0x2462, - threecircleinversesansserif: 0x278C, - threedeva: 0x0969, - threeeighths: 0x215C, - threegujarati: 0x0AE9, - threegurmukhi: 0x0A69, - threehackarabic: 0x0663, - threehangzhou: 0x3023, - threeideographicparen: 0x3222, - threeinferior: 0x2083, - threemonospace: 0xFF13, - threenumeratorbengali: 0x09F6, - threeoldstyle: 0xF733, - threeparen: 0x2476, - threeperiod: 0x248A, - threepersian: 0x06F3, - threequarters: 0x00BE, - threequartersemdash: 0xF6DE, - threeroman: 0x2172, - threesuperior: 0x00B3, - threethai: 0x0E53, - thzsquare: 0x3394, - tihiragana: 0x3061, - tikatakana: 0x30C1, - tikatakanahalfwidth: 0xFF81, - tikeutacirclekorean: 0x3270, - tikeutaparenkorean: 0x3210, - tikeutcirclekorean: 0x3262, - tikeutkorean: 0x3137, - tikeutparenkorean: 0x3202, - tilde: 0x02DC, - tildebelowcmb: 0x0330, - tildecmb: 0x0303, - tildecomb: 0x0303, - tildedoublecmb: 0x0360, - tildeoperator: 0x223C, - tildeoverlaycmb: 0x0334, - tildeverticalcmb: 0x033E, - timescircle: 0x2297, - tipehahebrew: 0x0596, - tipehalefthebrew: 0x0596, - tippigurmukhi: 0x0A70, - titlocyrilliccmb: 0x0483, - tiwnarmenian: 0x057F, - tlinebelow: 0x1E6F, - tmonospace: 0xFF54, - toarmenian: 0x0569, - tohiragana: 0x3068, - tokatakana: 0x30C8, - tokatakanahalfwidth: 0xFF84, - tonebarextrahighmod: 0x02E5, - tonebarextralowmod: 0x02E9, - tonebarhighmod: 0x02E6, - tonebarlowmod: 0x02E8, - tonebarmidmod: 0x02E7, - tonefive: 0x01BD, - tonesix: 0x0185, - tonetwo: 0x01A8, - tonos: 0x0384, - tonsquare: 0x3327, - topatakthai: 0x0E0F, - tortoiseshellbracketleft: 0x3014, - tortoiseshellbracketleftsmall: 0xFE5D, - tortoiseshellbracketleftvertical: 0xFE39, - tortoiseshellbracketright: 0x3015, - tortoiseshellbracketrightsmall: 0xFE5E, - tortoiseshellbracketrightvertical: 0xFE3A, - totaothai: 0x0E15, - tpalatalhook: 0x01AB, - tparen: 0x24AF, - trademark: 0x2122, - trademarksans: 0xF8EA, - trademarkserif: 0xF6DB, - tretroflexhook: 0x0288, - triagdn: 0x25BC, - triaglf: 0x25C4, - triagrt: 0x25BA, - triagup: 0x25B2, - ts: 0x02A6, - tsadi: 0x05E6, - tsadidagesh: 0xFB46, - tsadidageshhebrew: 0xFB46, - tsadihebrew: 0x05E6, - tsecyrillic: 0x0446, - tsere: 0x05B5, - tsere12: 0x05B5, - tsere1e: 0x05B5, - tsere2b: 0x05B5, - tserehebrew: 0x05B5, - tserenarrowhebrew: 0x05B5, - tserequarterhebrew: 0x05B5, - tserewidehebrew: 0x05B5, - tshecyrillic: 0x045B, - tsuperior: 0xF6F3, - ttabengali: 0x099F, - ttadeva: 0x091F, - ttagujarati: 0x0A9F, - ttagurmukhi: 0x0A1F, - tteharabic: 0x0679, - ttehfinalarabic: 0xFB67, - ttehinitialarabic: 0xFB68, - ttehmedialarabic: 0xFB69, - tthabengali: 0x09A0, - tthadeva: 0x0920, - tthagujarati: 0x0AA0, - tthagurmukhi: 0x0A20, - tturned: 0x0287, - tuhiragana: 0x3064, - tukatakana: 0x30C4, - tukatakanahalfwidth: 0xFF82, - tusmallhiragana: 0x3063, - tusmallkatakana: 0x30C3, - tusmallkatakanahalfwidth: 0xFF6F, - twelvecircle: 0x246B, - twelveparen: 0x247F, - twelveperiod: 0x2493, - twelveroman: 0x217B, - twentycircle: 0x2473, - twentyhangzhou: 0x5344, - twentyparen: 0x2487, - twentyperiod: 0x249B, - two: 0x0032, - twoarabic: 0x0662, - twobengali: 0x09E8, - twocircle: 0x2461, - twocircleinversesansserif: 0x278B, - twodeva: 0x0968, - twodotenleader: 0x2025, - twodotleader: 0x2025, - twodotleadervertical: 0xFE30, - twogujarati: 0x0AE8, - twogurmukhi: 0x0A68, - twohackarabic: 0x0662, - twohangzhou: 0x3022, - twoideographicparen: 0x3221, - twoinferior: 0x2082, - twomonospace: 0xFF12, - twonumeratorbengali: 0x09F5, - twooldstyle: 0xF732, - twoparen: 0x2475, - twoperiod: 0x2489, - twopersian: 0x06F2, - tworoman: 0x2171, - twostroke: 0x01BB, - twosuperior: 0x00B2, - twothai: 0x0E52, - twothirds: 0x2154, - u: 0x0075, - uacute: 0x00FA, - ubar: 0x0289, - ubengali: 0x0989, - ubopomofo: 0x3128, - ubreve: 0x016D, - ucaron: 0x01D4, - ucircle: 0x24E4, - ucircumflex: 0x00FB, - ucircumflexbelow: 0x1E77, - ucyrillic: 0x0443, - udattadeva: 0x0951, - udblacute: 0x0171, - udblgrave: 0x0215, - udeva: 0x0909, - udieresis: 0x00FC, - udieresisacute: 0x01D8, - udieresisbelow: 0x1E73, - udieresiscaron: 0x01DA, - udieresiscyrillic: 0x04F1, - udieresisgrave: 0x01DC, - udieresismacron: 0x01D6, - udotbelow: 0x1EE5, - ugrave: 0x00F9, - ugujarati: 0x0A89, - ugurmukhi: 0x0A09, - uhiragana: 0x3046, - uhookabove: 0x1EE7, - uhorn: 0x01B0, - uhornacute: 0x1EE9, - uhorndotbelow: 0x1EF1, - uhorngrave: 0x1EEB, - uhornhookabove: 0x1EED, - uhorntilde: 0x1EEF, - uhungarumlaut: 0x0171, - uhungarumlautcyrillic: 0x04F3, - uinvertedbreve: 0x0217, - ukatakana: 0x30A6, - ukatakanahalfwidth: 0xFF73, - ukcyrillic: 0x0479, - ukorean: 0x315C, - umacron: 0x016B, - umacroncyrillic: 0x04EF, - umacrondieresis: 0x1E7B, - umatragurmukhi: 0x0A41, - umonospace: 0xFF55, - underscore: 0x005F, - underscoredbl: 0x2017, - underscoremonospace: 0xFF3F, - underscorevertical: 0xFE33, - underscorewavy: 0xFE4F, - union: 0x222A, - universal: 0x2200, - uogonek: 0x0173, - uparen: 0x24B0, - upblock: 0x2580, - upperdothebrew: 0x05C4, - upsilon: 0x03C5, - upsilondieresis: 0x03CB, - upsilondieresistonos: 0x03B0, - upsilonlatin: 0x028A, - upsilontonos: 0x03CD, - uptackbelowcmb: 0x031D, - uptackmod: 0x02D4, - uragurmukhi: 0x0A73, - uring: 0x016F, - ushortcyrillic: 0x045E, - usmallhiragana: 0x3045, - usmallkatakana: 0x30A5, - usmallkatakanahalfwidth: 0xFF69, - ustraightcyrillic: 0x04AF, - ustraightstrokecyrillic: 0x04B1, - utilde: 0x0169, - utildeacute: 0x1E79, - utildebelow: 0x1E75, - uubengali: 0x098A, - uudeva: 0x090A, - uugujarati: 0x0A8A, - uugurmukhi: 0x0A0A, - uumatragurmukhi: 0x0A42, - uuvowelsignbengali: 0x09C2, - uuvowelsigndeva: 0x0942, - uuvowelsigngujarati: 0x0AC2, - uvowelsignbengali: 0x09C1, - uvowelsigndeva: 0x0941, - uvowelsigngujarati: 0x0AC1, - v: 0x0076, - vadeva: 0x0935, - vagujarati: 0x0AB5, - vagurmukhi: 0x0A35, - vakatakana: 0x30F7, - vav: 0x05D5, - vavdagesh: 0xFB35, - vavdagesh65: 0xFB35, - vavdageshhebrew: 0xFB35, - vavhebrew: 0x05D5, - vavholam: 0xFB4B, - vavholamhebrew: 0xFB4B, - vavvavhebrew: 0x05F0, - vavyodhebrew: 0x05F1, - vcircle: 0x24E5, - vdotbelow: 0x1E7F, - vecyrillic: 0x0432, - veharabic: 0x06A4, - vehfinalarabic: 0xFB6B, - vehinitialarabic: 0xFB6C, - vehmedialarabic: 0xFB6D, - vekatakana: 0x30F9, - venus: 0x2640, - verticalbar: 0x007C, - verticallineabovecmb: 0x030D, - verticallinebelowcmb: 0x0329, - verticallinelowmod: 0x02CC, - verticallinemod: 0x02C8, - vewarmenian: 0x057E, - vhook: 0x028B, - vikatakana: 0x30F8, - viramabengali: 0x09CD, - viramadeva: 0x094D, - viramagujarati: 0x0ACD, - visargabengali: 0x0983, - visargadeva: 0x0903, - visargagujarati: 0x0A83, - vmonospace: 0xFF56, - voarmenian: 0x0578, - voicediterationhiragana: 0x309E, - voicediterationkatakana: 0x30FE, - voicedmarkkana: 0x309B, - voicedmarkkanahalfwidth: 0xFF9E, - vokatakana: 0x30FA, - vparen: 0x24B1, - vtilde: 0x1E7D, - vturned: 0x028C, - vuhiragana: 0x3094, - vukatakana: 0x30F4, - w: 0x0077, - wacute: 0x1E83, - waekorean: 0x3159, - wahiragana: 0x308F, - wakatakana: 0x30EF, - wakatakanahalfwidth: 0xFF9C, - wakorean: 0x3158, - wasmallhiragana: 0x308E, - wasmallkatakana: 0x30EE, - wattosquare: 0x3357, - wavedash: 0x301C, - wavyunderscorevertical: 0xFE34, - wawarabic: 0x0648, - wawfinalarabic: 0xFEEE, - wawhamzaabovearabic: 0x0624, - wawhamzaabovefinalarabic: 0xFE86, - wbsquare: 0x33DD, - wcircle: 0x24E6, - wcircumflex: 0x0175, - wdieresis: 0x1E85, - wdotaccent: 0x1E87, - wdotbelow: 0x1E89, - wehiragana: 0x3091, - weierstrass: 0x2118, - wekatakana: 0x30F1, - wekorean: 0x315E, - weokorean: 0x315D, - wgrave: 0x1E81, - whitebullet: 0x25E6, - whitecircle: 0x25CB, - whitecircleinverse: 0x25D9, - whitecornerbracketleft: 0x300E, - whitecornerbracketleftvertical: 0xFE43, - whitecornerbracketright: 0x300F, - whitecornerbracketrightvertical: 0xFE44, - whitediamond: 0x25C7, - whitediamondcontainingblacksmalldiamond: 0x25C8, - whitedownpointingsmalltriangle: 0x25BF, - whitedownpointingtriangle: 0x25BD, - whiteleftpointingsmalltriangle: 0x25C3, - whiteleftpointingtriangle: 0x25C1, - whitelenticularbracketleft: 0x3016, - whitelenticularbracketright: 0x3017, - whiterightpointingsmalltriangle: 0x25B9, - whiterightpointingtriangle: 0x25B7, - whitesmallsquare: 0x25AB, - whitesmilingface: 0x263A, - whitesquare: 0x25A1, - whitestar: 0x2606, - whitetelephone: 0x260F, - whitetortoiseshellbracketleft: 0x3018, - whitetortoiseshellbracketright: 0x3019, - whiteuppointingsmalltriangle: 0x25B5, - whiteuppointingtriangle: 0x25B3, - wihiragana: 0x3090, - wikatakana: 0x30F0, - wikorean: 0x315F, - wmonospace: 0xFF57, - wohiragana: 0x3092, - wokatakana: 0x30F2, - wokatakanahalfwidth: 0xFF66, - won: 0x20A9, - wonmonospace: 0xFFE6, - wowaenthai: 0x0E27, - wparen: 0x24B2, - wring: 0x1E98, - wsuperior: 0x02B7, - wturned: 0x028D, - wynn: 0x01BF, - x: 0x0078, - xabovecmb: 0x033D, - xbopomofo: 0x3112, - xcircle: 0x24E7, - xdieresis: 0x1E8D, - xdotaccent: 0x1E8B, - xeharmenian: 0x056D, - xi: 0x03BE, - xmonospace: 0xFF58, - xparen: 0x24B3, - xsuperior: 0x02E3, - y: 0x0079, - yaadosquare: 0x334E, - yabengali: 0x09AF, - yacute: 0x00FD, - yadeva: 0x092F, - yaekorean: 0x3152, - yagujarati: 0x0AAF, - yagurmukhi: 0x0A2F, - yahiragana: 0x3084, - yakatakana: 0x30E4, - yakatakanahalfwidth: 0xFF94, - yakorean: 0x3151, - yamakkanthai: 0x0E4E, - yasmallhiragana: 0x3083, - yasmallkatakana: 0x30E3, - yasmallkatakanahalfwidth: 0xFF6C, - yatcyrillic: 0x0463, - ycircle: 0x24E8, - ycircumflex: 0x0177, - ydieresis: 0x00FF, - ydotaccent: 0x1E8F, - ydotbelow: 0x1EF5, - yeharabic: 0x064A, - yehbarreearabic: 0x06D2, - yehbarreefinalarabic: 0xFBAF, - yehfinalarabic: 0xFEF2, - yehhamzaabovearabic: 0x0626, - yehhamzaabovefinalarabic: 0xFE8A, - yehhamzaaboveinitialarabic: 0xFE8B, - yehhamzaabovemedialarabic: 0xFE8C, - yehinitialarabic: 0xFEF3, - yehmedialarabic: 0xFEF4, - yehmeeminitialarabic: 0xFCDD, - yehmeemisolatedarabic: 0xFC58, - yehnoonfinalarabic: 0xFC94, - yehthreedotsbelowarabic: 0x06D1, - yekorean: 0x3156, - yen: 0x00A5, - yenmonospace: 0xFFE5, - yeokorean: 0x3155, - yeorinhieuhkorean: 0x3186, - yerahbenyomohebrew: 0x05AA, - yerahbenyomolefthebrew: 0x05AA, - yericyrillic: 0x044B, - yerudieresiscyrillic: 0x04F9, - yesieungkorean: 0x3181, - yesieungpansioskorean: 0x3183, - yesieungsioskorean: 0x3182, - yetivhebrew: 0x059A, - ygrave: 0x1EF3, - yhook: 0x01B4, - yhookabove: 0x1EF7, - yiarmenian: 0x0575, - yicyrillic: 0x0457, - yikorean: 0x3162, - yinyang: 0x262F, - yiwnarmenian: 0x0582, - ymonospace: 0xFF59, - yod: 0x05D9, - yoddagesh: 0xFB39, - yoddageshhebrew: 0xFB39, - yodhebrew: 0x05D9, - yodyodhebrew: 0x05F2, - yodyodpatahhebrew: 0xFB1F, - yohiragana: 0x3088, - yoikorean: 0x3189, - yokatakana: 0x30E8, - yokatakanahalfwidth: 0xFF96, - yokorean: 0x315B, - yosmallhiragana: 0x3087, - yosmallkatakana: 0x30E7, - yosmallkatakanahalfwidth: 0xFF6E, - yotgreek: 0x03F3, - yoyaekorean: 0x3188, - yoyakorean: 0x3187, - yoyakthai: 0x0E22, - yoyingthai: 0x0E0D, - yparen: 0x24B4, - ypogegrammeni: 0x037A, - ypogegrammenigreekcmb: 0x0345, - yr: 0x01A6, - yring: 0x1E99, - ysuperior: 0x02B8, - ytilde: 0x1EF9, - yturned: 0x028E, - yuhiragana: 0x3086, - yuikorean: 0x318C, - yukatakana: 0x30E6, - yukatakanahalfwidth: 0xFF95, - yukorean: 0x3160, - yusbigcyrillic: 0x046B, - yusbigiotifiedcyrillic: 0x046D, - yuslittlecyrillic: 0x0467, - yuslittleiotifiedcyrillic: 0x0469, - yusmallhiragana: 0x3085, - yusmallkatakana: 0x30E5, - yusmallkatakanahalfwidth: 0xFF6D, - yuyekorean: 0x318B, - yuyeokorean: 0x318A, - yyabengali: 0x09DF, - yyadeva: 0x095F, - z: 0x007A, - zaarmenian: 0x0566, - zacute: 0x017A, - zadeva: 0x095B, - zagurmukhi: 0x0A5B, - zaharabic: 0x0638, - zahfinalarabic: 0xFEC6, - zahinitialarabic: 0xFEC7, - zahiragana: 0x3056, - zahmedialarabic: 0xFEC8, - zainarabic: 0x0632, - zainfinalarabic: 0xFEB0, - zakatakana: 0x30B6, - zaqefgadolhebrew: 0x0595, - zaqefqatanhebrew: 0x0594, - zarqahebrew: 0x0598, - zayin: 0x05D6, - zayindagesh: 0xFB36, - zayindageshhebrew: 0xFB36, - zayinhebrew: 0x05D6, - zbopomofo: 0x3117, - zcaron: 0x017E, - zcircle: 0x24E9, - zcircumflex: 0x1E91, - zcurl: 0x0291, - zdot: 0x017C, - zdotaccent: 0x017C, - zdotbelow: 0x1E93, - zecyrillic: 0x0437, - zedescendercyrillic: 0x0499, - zedieresiscyrillic: 0x04DF, - zehiragana: 0x305C, - zekatakana: 0x30BC, - zero: 0x0030, - zeroarabic: 0x0660, - zerobengali: 0x09E6, - zerodeva: 0x0966, - zerogujarati: 0x0AE6, - zerogurmukhi: 0x0A66, - zerohackarabic: 0x0660, - zeroinferior: 0x2080, - zeromonospace: 0xFF10, - zerooldstyle: 0xF730, - zeropersian: 0x06F0, - zerosuperior: 0x2070, - zerothai: 0x0E50, - zerowidthjoiner: 0xFEFF, - zerowidthnonjoiner: 0x200C, - zerowidthspace: 0x200B, - zeta: 0x03B6, - zhbopomofo: 0x3113, - zhearmenian: 0x056A, - zhebrevecyrillic: 0x04C2, - zhecyrillic: 0x0436, - zhedescendercyrillic: 0x0497, - zhedieresiscyrillic: 0x04DD, - zihiragana: 0x3058, - zikatakana: 0x30B8, - zinorhebrew: 0x05AE, - zlinebelow: 0x1E95, - zmonospace: 0xFF5A, - zohiragana: 0x305E, - zokatakana: 0x30BE, - zparen: 0x24B5, - zretroflexhook: 0x0290, - zstroke: 0x01B6, - zuhiragana: 0x305A, - zukatakana: 0x30BA, - '.notdef': 0x0000 -}; - -var DingbatsGlyphsUnicode = { - space: 0x0020, - a1: 0x2701, - a2: 0x2702, - a202: 0x2703, - a3: 0x2704, - a4: 0x260E, - a5: 0x2706, - a119: 0x2707, - a118: 0x2708, - a117: 0x2709, - a11: 0x261B, - a12: 0x261E, - a13: 0x270C, - a14: 0x270D, - a15: 0x270E, - a16: 0x270F, - a105: 0x2710, - a17: 0x2711, - a18: 0x2712, - a19: 0x2713, - a20: 0x2714, - a21: 0x2715, - a22: 0x2716, - a23: 0x2717, - a24: 0x2718, - a25: 0x2719, - a26: 0x271A, - a27: 0x271B, - a28: 0x271C, - a6: 0x271D, - a7: 0x271E, - a8: 0x271F, - a9: 0x2720, - a10: 0x2721, - a29: 0x2722, - a30: 0x2723, - a31: 0x2724, - a32: 0x2725, - a33: 0x2726, - a34: 0x2727, - a35: 0x2605, - a36: 0x2729, - a37: 0x272A, - a38: 0x272B, - a39: 0x272C, - a40: 0x272D, - a41: 0x272E, - a42: 0x272F, - a43: 0x2730, - a44: 0x2731, - a45: 0x2732, - a46: 0x2733, - a47: 0x2734, - a48: 0x2735, - a49: 0x2736, - a50: 0x2737, - a51: 0x2738, - a52: 0x2739, - a53: 0x273A, - a54: 0x273B, - a55: 0x273C, - a56: 0x273D, - a57: 0x273E, - a58: 0x273F, - a59: 0x2740, - a60: 0x2741, - a61: 0x2742, - a62: 0x2743, - a63: 0x2744, - a64: 0x2745, - a65: 0x2746, - a66: 0x2747, - a67: 0x2748, - a68: 0x2749, - a69: 0x274A, - a70: 0x274B, - a71: 0x25CF, - a72: 0x274D, - a73: 0x25A0, - a74: 0x274F, - a203: 0x2750, - a75: 0x2751, - a204: 0x2752, - a76: 0x25B2, - a77: 0x25BC, - a78: 0x25C6, - a79: 0x2756, - a81: 0x25D7, - a82: 0x2758, - a83: 0x2759, - a84: 0x275A, - a97: 0x275B, - a98: 0x275C, - a99: 0x275D, - a100: 0x275E, - a101: 0x2761, - a102: 0x2762, - a103: 0x2763, - a104: 0x2764, - a106: 0x2765, - a107: 0x2766, - a108: 0x2767, - a112: 0x2663, - a111: 0x2666, - a110: 0x2665, - a109: 0x2660, - a120: 0x2460, - a121: 0x2461, - a122: 0x2462, - a123: 0x2463, - a124: 0x2464, - a125: 0x2465, - a126: 0x2466, - a127: 0x2467, - a128: 0x2468, - a129: 0x2469, - a130: 0x2776, - a131: 0x2777, - a132: 0x2778, - a133: 0x2779, - a134: 0x277A, - a135: 0x277B, - a136: 0x277C, - a137: 0x277D, - a138: 0x277E, - a139: 0x277F, - a140: 0x2780, - a141: 0x2781, - a142: 0x2782, - a143: 0x2783, - a144: 0x2784, - a145: 0x2785, - a146: 0x2786, - a147: 0x2787, - a148: 0x2788, - a149: 0x2789, - a150: 0x278A, - a151: 0x278B, - a152: 0x278C, - a153: 0x278D, - a154: 0x278E, - a155: 0x278F, - a156: 0x2790, - a157: 0x2791, - a158: 0x2792, - a159: 0x2793, - a160: 0x2794, - a161: 0x2192, - a163: 0x2194, - a164: 0x2195, - a196: 0x2798, - a165: 0x2799, - a192: 0x279A, - a166: 0x279B, - a167: 0x279C, - a168: 0x279D, - a169: 0x279E, - a170: 0x279F, - a171: 0x27A0, - a172: 0x27A1, - a173: 0x27A2, - a162: 0x27A3, - a174: 0x27A4, - a175: 0x27A5, - a176: 0x27A6, - a177: 0x27A7, - a178: 0x27A8, - a179: 0x27A9, - a193: 0x27AA, - a180: 0x27AB, - a199: 0x27AC, - a181: 0x27AD, - a200: 0x27AE, - a182: 0x27AF, - a201: 0x27B1, - a183: 0x27B2, - a184: 0x27B3, - a197: 0x27B4, - a185: 0x27B5, - a194: 0x27B6, - a198: 0x27B7, - a186: 0x27B8, - a195: 0x27B9, - a187: 0x27BA, - a188: 0x27BB, - a189: 0x27BC, - a190: 0x27BD, - a191: 0x27BE, - a89: 0x2768, // 0xF8D7 - a90: 0x2769, // 0xF8D8 - a93: 0x276A, // 0xF8D9 - a94: 0x276B, // 0xF8DA - a91: 0x276C, // 0xF8DB - a92: 0x276D, // 0xF8DC - a205: 0x276E, // 0xF8DD - a85: 0x276F, // 0xF8DE - a206: 0x2770, // 0xF8DF - a86: 0x2771, // 0xF8E0 - a87: 0x2772, // 0xF8E1 - a88: 0x2773, // 0xF8E2 - a95: 0x2774, // 0xF8E3 - a96: 0x2775, // 0xF8E4 - '.notdef': 0x0000 -}; - -exports.GlyphsUnicode = GlyphsUnicode; -exports.DingbatsGlyphsUnicode = DingbatsGlyphsUnicode; -})); - - - -(function (root, factory) { - { - factory((root.pdfjsCoreJpg = {})); - } -}(this, function (exports) { - -/* -This code was forked from https://github.com/notmasteryet/jpgjs. The original -version was created by github user notmasteryet - -- The JPEG specification can be found in the ITU CCITT Recommendation T.81 - (www.w3.org/Graphics/JPEG/itu-t81.pdf) -- The JFIF specification can be found in the JPEG File Interchange Format - (www.w3.org/Graphics/JPEG/jfif3.pdf) -- The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters - in PostScript Level 2, Technical Note #5116 - (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf) -*/ - -var JpegImage = (function jpegImage() { - var dctZigZag = new Uint8Array([ - 0, - 1, 8, - 16, 9, 2, - 3, 10, 17, 24, - 32, 25, 18, 11, 4, - 5, 12, 19, 26, 33, 40, - 48, 41, 34, 27, 20, 13, 6, - 7, 14, 21, 28, 35, 42, 49, 56, - 57, 50, 43, 36, 29, 22, 15, - 23, 30, 37, 44, 51, 58, - 59, 52, 45, 38, 31, - 39, 46, 53, 60, - 61, 54, 47, - 55, 62, - 63 - ]); - - var dctCos1 = 4017; // cos(pi/16) - var dctSin1 = 799; // sin(pi/16) - var dctCos3 = 3406; // cos(3*pi/16) - var dctSin3 = 2276; // sin(3*pi/16) - var dctCos6 = 1567; // cos(6*pi/16) - var dctSin6 = 3784; // sin(6*pi/16) - var dctSqrt2 = 5793; // sqrt(2) - var dctSqrt1d2 = 2896; // sqrt(2) / 2 - - function constructor() { - } - - function buildHuffmanTable(codeLengths, values) { - var k = 0, code = [], i, j, length = 16; - while (length > 0 && !codeLengths[length - 1]) { - length--; - } - code.push({children: [], index: 0}); - var p = code[0], q; - for (i = 0; i < length; i++) { - for (j = 0; j < codeLengths[i]; j++) { - p = code.pop(); - p.children[p.index] = values[k]; - while (p.index > 0) { - p = code.pop(); - } - p.index++; - code.push(p); - while (code.length <= i) { - code.push(q = {children: [], index: 0}); - p.children[p.index] = q.children; - p = q; - } - k++; - } - if (i + 1 < length) { - // p here points to last code - code.push(q = {children: [], index: 0}); - p.children[p.index] = q.children; - p = q; - } - } - return code[0].children; - } - - function getBlockBufferOffset(component, row, col) { - return 64 * ((component.blocksPerLine + 1) * row + col); - } - - function decodeScan(data, offset, frame, components, resetInterval, - spectralStart, spectralEnd, successivePrev, successive) { - var mcusPerLine = frame.mcusPerLine; - var progressive = frame.progressive; - - var startOffset = offset, bitsData = 0, bitsCount = 0; - - function readBit() { - if (bitsCount > 0) { - bitsCount--; - return (bitsData >> bitsCount) & 1; - } - bitsData = data[offset++]; - if (bitsData === 0xFF) { - var nextByte = data[offset++]; - if (nextByte) { - throw 'unexpected marker: ' + - ((bitsData << 8) | nextByte).toString(16); - } - // unstuff 0 - } - bitsCount = 7; - return bitsData >>> 7; - } - - function decodeHuffman(tree) { - var node = tree; - while (true) { - node = node[readBit()]; - if (typeof node === 'number') { - return node; - } - if (typeof node !== 'object') { - throw 'invalid huffman sequence'; - } - } - } - - function receive(length) { - var n = 0; - while (length > 0) { - n = (n << 1) | readBit(); - length--; - } - return n; - } - - function receiveAndExtend(length) { - if (length === 1) { - return readBit() === 1 ? 1 : -1; - } - var n = receive(length); - if (n >= 1 << (length - 1)) { - return n; - } - return n + (-1 << length) + 1; - } - - function decodeBaseline(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : receiveAndExtend(t); - component.blockData[offset] = (component.pred += diff); - var k = 1; - while (k < 64) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = receiveAndExtend(s); - k++; - } - } - - function decodeDCFirst(component, offset) { - var t = decodeHuffman(component.huffmanTableDC); - var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive); - component.blockData[offset] = (component.pred += diff); - } - - function decodeDCSuccessive(component, offset) { - component.blockData[offset] |= readBit() << successive; - } - - var eobrun = 0; - function decodeACFirst(component, offset) { - if (eobrun > 0) { - eobrun--; - return; - } - var k = spectralStart, e = spectralEnd; - while (k <= e) { - var rs = decodeHuffman(component.huffmanTableAC); - var s = rs & 15, r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r) - 1; - break; - } - k += 16; - continue; - } - k += r; - var z = dctZigZag[k]; - component.blockData[offset + z] = - receiveAndExtend(s) * (1 << successive); - k++; - } - } - - var successiveACState = 0, successiveACNextValue; - function decodeACSuccessive(component, offset) { - var k = spectralStart; - var e = spectralEnd; - var r = 0; - var s; - var rs; - while (k <= e) { - var z = dctZigZag[k]; - switch (successiveACState) { - case 0: // initial state - rs = decodeHuffman(component.huffmanTableAC); - s = rs & 15; - r = rs >> 4; - if (s === 0) { - if (r < 15) { - eobrun = receive(r) + (1 << r); - successiveACState = 4; - } else { - r = 16; - successiveACState = 1; - } - } else { - if (s !== 1) { - throw 'invalid ACn encoding'; - } - successiveACNextValue = receiveAndExtend(s); - successiveACState = r ? 2 : 3; - } - continue; - case 1: // skipping r zero items - case 2: - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } else { - r--; - if (r === 0) { - successiveACState = successiveACState === 2 ? 3 : 0; - } - } - break; - case 3: // set value for a zero item - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } else { - component.blockData[offset + z] = - successiveACNextValue << successive; - successiveACState = 0; - } - break; - case 4: // eob - if (component.blockData[offset + z]) { - component.blockData[offset + z] += (readBit() << successive); - } - break; - } - k++; - } - if (successiveACState === 4) { - eobrun--; - if (eobrun === 0) { - successiveACState = 0; - } - } - } - - function decodeMcu(component, decode, mcu, row, col) { - var mcuRow = (mcu / mcusPerLine) | 0; - var mcuCol = mcu % mcusPerLine; - var blockRow = mcuRow * component.v + row; - var blockCol = mcuCol * component.h + col; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - - function decodeBlock(component, decode, mcu) { - var blockRow = (mcu / component.blocksPerLine) | 0; - var blockCol = mcu % component.blocksPerLine; - var offset = getBlockBufferOffset(component, blockRow, blockCol); - decode(component, offset); - } - - var componentsLength = components.length; - var component, i, j, k, n; - var decodeFn; - if (progressive) { - if (spectralStart === 0) { - decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; - } else { - decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; - } - } else { - decodeFn = decodeBaseline; - } - - var mcu = 0, marker; - var mcuExpected; - if (componentsLength === 1) { - mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; - } else { - mcuExpected = mcusPerLine * frame.mcusPerColumn; - } - if (!resetInterval) { - resetInterval = mcuExpected; - } - - var h, v; - while (mcu < mcuExpected) { - // reset interval stuff - for (i = 0; i < componentsLength; i++) { - components[i].pred = 0; - } - eobrun = 0; - - if (componentsLength === 1) { - component = components[0]; - for (n = 0; n < resetInterval; n++) { - decodeBlock(component, decodeFn, mcu); - mcu++; - } - } else { - for (n = 0; n < resetInterval; n++) { - for (i = 0; i < componentsLength; i++) { - component = components[i]; - h = component.h; - v = component.v; - for (j = 0; j < v; j++) { - for (k = 0; k < h; k++) { - decodeMcu(component, decodeFn, mcu, j, k); - } - } - } - mcu++; - } - } - - // find marker - bitsCount = 0; - marker = (data[offset] << 8) | data[offset + 1]; - if (marker <= 0xFF00) { - throw 'marker was not found'; - } - - if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx - offset += 2; - } else { - break; - } - } - - return offset - startOffset; - } - - // A port of poppler's IDCT method which in turn is taken from: - // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, - // 'Practical Fast 1-D DCT Algorithms with 11 Multiplications', - // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, - // 988-991. - function quantizeAndInverse(component, blockBufferOffset, p) { - var qt = component.quantizationTable, blockData = component.blockData; - var v0, v1, v2, v3, v4, v5, v6, v7; - var p0, p1, p2, p3, p4, p5, p6, p7; - var t; - - // inverse DCT on rows - for (var row = 0; row < 64; row += 8) { - // gather block data - p0 = blockData[blockBufferOffset + row]; - p1 = blockData[blockBufferOffset + row + 1]; - p2 = blockData[blockBufferOffset + row + 2]; - p3 = blockData[blockBufferOffset + row + 3]; - p4 = blockData[blockBufferOffset + row + 4]; - p5 = blockData[blockBufferOffset + row + 5]; - p6 = blockData[blockBufferOffset + row + 6]; - p7 = blockData[blockBufferOffset + row + 7]; - - // dequant p0 - p0 *= qt[row]; - - // check for all-zero AC coefficients - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = (dctSqrt2 * p0 + 512) >> 10; - p[row] = t; - p[row + 1] = t; - p[row + 2] = t; - p[row + 3] = t; - p[row + 4] = t; - p[row + 5] = t; - p[row + 6] = t; - p[row + 7] = t; - continue; - } - // dequant p1 ... p7 - p1 *= qt[row + 1]; - p2 *= qt[row + 2]; - p3 *= qt[row + 3]; - p4 *= qt[row + 4]; - p5 *= qt[row + 5]; - p6 *= qt[row + 6]; - p7 *= qt[row + 7]; - - // stage 4 - v0 = (dctSqrt2 * p0 + 128) >> 8; - v1 = (dctSqrt2 * p4 + 128) >> 8; - v2 = p2; - v3 = p6; - v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8; - v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8; - v5 = p3 << 4; - v6 = p5 << 4; - - // stage 3 - v0 = (v0 + v1 + 1) >> 1; - v1 = v0 - v1; - t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; - v3 = t; - v4 = (v4 + v6 + 1) >> 1; - v6 = v4 - v6; - v7 = (v7 + v5 + 1) >> 1; - v5 = v7 - v5; - - // stage 2 - v0 = (v0 + v3 + 1) >> 1; - v3 = v0 - v3; - v1 = (v1 + v2 + 1) >> 1; - v2 = v1 - v2; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p[row] = v0 + v7; - p[row + 7] = v0 - v7; - p[row + 1] = v1 + v6; - p[row + 6] = v1 - v6; - p[row + 2] = v2 + v5; - p[row + 5] = v2 - v5; - p[row + 3] = v3 + v4; - p[row + 4] = v3 - v4; - } - - // inverse DCT on columns - for (var col = 0; col < 8; ++col) { - p0 = p[col]; - p1 = p[col + 8]; - p2 = p[col + 16]; - p3 = p[col + 24]; - p4 = p[col + 32]; - p5 = p[col + 40]; - p6 = p[col + 48]; - p7 = p[col + 56]; - - // check for all-zero AC coefficients - if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) { - t = (dctSqrt2 * p0 + 8192) >> 14; - // convert to 8 bit - t = (t < -2040) ? 0 : (t >= 2024) ? 255 : (t + 2056) >> 4; - blockData[blockBufferOffset + col] = t; - blockData[blockBufferOffset + col + 8] = t; - blockData[blockBufferOffset + col + 16] = t; - blockData[blockBufferOffset + col + 24] = t; - blockData[blockBufferOffset + col + 32] = t; - blockData[blockBufferOffset + col + 40] = t; - blockData[blockBufferOffset + col + 48] = t; - blockData[blockBufferOffset + col + 56] = t; - continue; - } - - // stage 4 - v0 = (dctSqrt2 * p0 + 2048) >> 12; - v1 = (dctSqrt2 * p4 + 2048) >> 12; - v2 = p2; - v3 = p6; - v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12; - v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12; - v5 = p3; - v6 = p5; - - // stage 3 - // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when - // converting to UInt8 range later. - v0 = ((v0 + v1 + 1) >> 1) + 4112; - v1 = v0 - v1; - t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; - v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; - v3 = t; - v4 = (v4 + v6 + 1) >> 1; - v6 = v4 - v6; - v7 = (v7 + v5 + 1) >> 1; - v5 = v7 - v5; - - // stage 2 - v0 = (v0 + v3 + 1) >> 1; - v3 = v0 - v3; - v1 = (v1 + v2 + 1) >> 1; - v2 = v1 - v2; - t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; - v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; - v7 = t; - t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; - v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; - v6 = t; - - // stage 1 - p0 = v0 + v7; - p7 = v0 - v7; - p1 = v1 + v6; - p6 = v1 - v6; - p2 = v2 + v5; - p5 = v2 - v5; - p3 = v3 + v4; - p4 = v3 - v4; - - // convert to 8-bit integers - p0 = (p0 < 16) ? 0 : (p0 >= 4080) ? 255 : p0 >> 4; - p1 = (p1 < 16) ? 0 : (p1 >= 4080) ? 255 : p1 >> 4; - p2 = (p2 < 16) ? 0 : (p2 >= 4080) ? 255 : p2 >> 4; - p3 = (p3 < 16) ? 0 : (p3 >= 4080) ? 255 : p3 >> 4; - p4 = (p4 < 16) ? 0 : (p4 >= 4080) ? 255 : p4 >> 4; - p5 = (p5 < 16) ? 0 : (p5 >= 4080) ? 255 : p5 >> 4; - p6 = (p6 < 16) ? 0 : (p6 >= 4080) ? 255 : p6 >> 4; - p7 = (p7 < 16) ? 0 : (p7 >= 4080) ? 255 : p7 >> 4; - - // store block data - blockData[blockBufferOffset + col] = p0; - blockData[blockBufferOffset + col + 8] = p1; - blockData[blockBufferOffset + col + 16] = p2; - blockData[blockBufferOffset + col + 24] = p3; - blockData[blockBufferOffset + col + 32] = p4; - blockData[blockBufferOffset + col + 40] = p5; - blockData[blockBufferOffset + col + 48] = p6; - blockData[blockBufferOffset + col + 56] = p7; - } - } - - function buildComponentData(frame, component) { - var blocksPerLine = component.blocksPerLine; - var blocksPerColumn = component.blocksPerColumn; - var computationBuffer = new Int16Array(64); - - for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { - for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { - var offset = getBlockBufferOffset(component, blockRow, blockCol); - quantizeAndInverse(component, offset, computationBuffer); - } - } - return component.blockData; - } - - function clamp0to255(a) { - return a <= 0 ? 0 : a >= 255 ? 255 : a; - } - - constructor.prototype = { - parse: function parse(data) { - - function readUint16() { - var value = (data[offset] << 8) | data[offset + 1]; - offset += 2; - return value; - } - - function readDataBlock() { - var length = readUint16(); - var array = data.subarray(offset, offset + length - 2); - offset += array.length; - return array; - } - - function prepareComponents(frame) { - var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH); - var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV); - for (var i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * - component.h / frame.maxH); - var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * - component.v / frame.maxV); - var blocksPerLineForMcu = mcusPerLine * component.h; - var blocksPerColumnForMcu = mcusPerColumn * component.v; - - var blocksBufferSize = 64 * blocksPerColumnForMcu * - (blocksPerLineForMcu + 1); - component.blockData = new Int16Array(blocksBufferSize); - component.blocksPerLine = blocksPerLine; - component.blocksPerColumn = blocksPerColumn; - } - frame.mcusPerLine = mcusPerLine; - frame.mcusPerColumn = mcusPerColumn; - } - - var offset = 0; - var jfif = null; - var adobe = null; - var frame, resetInterval; - var quantizationTables = []; - var huffmanTablesAC = [], huffmanTablesDC = []; - var fileMarker = readUint16(); - if (fileMarker !== 0xFFD8) { // SOI (Start of Image) - throw 'SOI not found'; - } - - fileMarker = readUint16(); - while (fileMarker !== 0xFFD9) { // EOI (End of image) - var i, j, l; - switch(fileMarker) { - case 0xFFE0: // APP0 (Application Specific) - case 0xFFE1: // APP1 - case 0xFFE2: // APP2 - case 0xFFE3: // APP3 - case 0xFFE4: // APP4 - case 0xFFE5: // APP5 - case 0xFFE6: // APP6 - case 0xFFE7: // APP7 - case 0xFFE8: // APP8 - case 0xFFE9: // APP9 - case 0xFFEA: // APP10 - case 0xFFEB: // APP11 - case 0xFFEC: // APP12 - case 0xFFED: // APP13 - case 0xFFEE: // APP14 - case 0xFFEF: // APP15 - case 0xFFFE: // COM (Comment) - var appData = readDataBlock(); - - if (fileMarker === 0xFFE0) { - if (appData[0] === 0x4A && appData[1] === 0x46 && - appData[2] === 0x49 && appData[3] === 0x46 && - appData[4] === 0) { // 'JFIF\x00' - jfif = { - version: { major: appData[5], minor: appData[6] }, - densityUnits: appData[7], - xDensity: (appData[8] << 8) | appData[9], - yDensity: (appData[10] << 8) | appData[11], - thumbWidth: appData[12], - thumbHeight: appData[13], - thumbData: appData.subarray(14, 14 + - 3 * appData[12] * appData[13]) - }; - } - } - // TODO APP1 - Exif - if (fileMarker === 0xFFEE) { - if (appData[0] === 0x41 && appData[1] === 0x64 && - appData[2] === 0x6F && appData[3] === 0x62 && - appData[4] === 0x65) { // 'Adobe' - adobe = { - version: (appData[5] << 8) | appData[6], - flags0: (appData[7] << 8) | appData[8], - flags1: (appData[9] << 8) | appData[10], - transformCode: appData[11] - }; - } - } - break; - - case 0xFFDB: // DQT (Define Quantization Tables) - var quantizationTablesLength = readUint16(); - var quantizationTablesEnd = quantizationTablesLength + offset - 2; - var z; - while (offset < quantizationTablesEnd) { - var quantizationTableSpec = data[offset++]; - var tableData = new Uint16Array(64); - if ((quantizationTableSpec >> 4) === 0) { // 8 bit values - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = data[offset++]; - } - } else if ((quantizationTableSpec >> 4) === 1) { //16 bit - for (j = 0; j < 64; j++) { - z = dctZigZag[j]; - tableData[z] = readUint16(); - } - } else { - throw 'DQT: invalid table spec'; - } - quantizationTables[quantizationTableSpec & 15] = tableData; - } - break; - - case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT) - case 0xFFC1: // SOF1 (Start of Frame, Extended DCT) - case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT) - if (frame) { - throw 'Only single frame JPEGs supported'; - } - readUint16(); // skip data length - frame = {}; - frame.extended = (fileMarker === 0xFFC1); - frame.progressive = (fileMarker === 0xFFC2); - frame.precision = data[offset++]; - frame.scanLines = readUint16(); - frame.samplesPerLine = readUint16(); - frame.components = []; - frame.componentIds = {}; - var componentsCount = data[offset++], componentId; - var maxH = 0, maxV = 0; - for (i = 0; i < componentsCount; i++) { - componentId = data[offset]; - var h = data[offset + 1] >> 4; - var v = data[offset + 1] & 15; - if (maxH < h) { - maxH = h; - } - if (maxV < v) { - maxV = v; - } - var qId = data[offset + 2]; - l = frame.components.push({ - h: h, - v: v, - quantizationTable: quantizationTables[qId] - }); - frame.componentIds[componentId] = l - 1; - offset += 3; - } - frame.maxH = maxH; - frame.maxV = maxV; - prepareComponents(frame); - break; - - case 0xFFC4: // DHT (Define Huffman Tables) - var huffmanLength = readUint16(); - for (i = 2; i < huffmanLength;) { - var huffmanTableSpec = data[offset++]; - var codeLengths = new Uint8Array(16); - var codeLengthSum = 0; - for (j = 0; j < 16; j++, offset++) { - codeLengthSum += (codeLengths[j] = data[offset]); - } - var huffmanValues = new Uint8Array(codeLengthSum); - for (j = 0; j < codeLengthSum; j++, offset++) { - huffmanValues[j] = data[offset]; - } - i += 17 + codeLengthSum; - - ((huffmanTableSpec >> 4) === 0 ? - huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = - buildHuffmanTable(codeLengths, huffmanValues); - } - break; - - case 0xFFDD: // DRI (Define Restart Interval) - readUint16(); // skip data length - resetInterval = readUint16(); - break; - - case 0xFFDA: // SOS (Start of Scan) - var scanLength = readUint16(); - var selectorsCount = data[offset++]; - var components = [], component; - for (i = 0; i < selectorsCount; i++) { - var componentIndex = frame.componentIds[data[offset++]]; - component = frame.components[componentIndex]; - var tableSpec = data[offset++]; - component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; - component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; - components.push(component); - } - var spectralStart = data[offset++]; - var spectralEnd = data[offset++]; - var successiveApproximation = data[offset++]; - var processed = decodeScan(data, offset, - frame, components, resetInterval, - spectralStart, spectralEnd, - successiveApproximation >> 4, successiveApproximation & 15); - offset += processed; - break; - - case 0xFFFF: // Fill bytes - if (data[offset] !== 0xFF) { // Avoid skipping a valid marker. - offset--; - } - break; - - default: - if (data[offset - 3] === 0xFF && - data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) { - // could be incorrect encoding -- last 0xFF byte of the previous - // block was eaten by the encoder - offset -= 3; - break; - } - throw 'unknown JPEG marker ' + fileMarker.toString(16); - } - fileMarker = readUint16(); - } - - this.width = frame.samplesPerLine; - this.height = frame.scanLines; - this.jfif = jfif; - this.adobe = adobe; - this.components = []; - for (i = 0; i < frame.components.length; i++) { - component = frame.components[i]; - this.components.push({ - output: buildComponentData(frame, component), - scaleX: component.h / frame.maxH, - scaleY: component.v / frame.maxV, - blocksPerLine: component.blocksPerLine, - blocksPerColumn: component.blocksPerColumn - }); - } - this.numComponents = this.components.length; - }, - - _getLinearizedBlockData: function getLinearizedBlockData(width, height) { - var scaleX = this.width / width, scaleY = this.height / height; - - var component, componentScaleX, componentScaleY, blocksPerScanline; - var x, y, i, j, k; - var index; - var offset = 0; - var output; - var numComponents = this.components.length; - var dataLength = width * height * numComponents; - var data = new Uint8Array(dataLength); - var xScaleBlockOffset = new Uint32Array(width); - var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs - - for (i = 0; i < numComponents; i++) { - component = this.components[i]; - componentScaleX = component.scaleX * scaleX; - componentScaleY = component.scaleY * scaleY; - offset = i; - output = component.output; - blocksPerScanline = (component.blocksPerLine + 1) << 3; - // precalculate the xScaleBlockOffset - for (x = 0; x < width; x++) { - j = 0 | (x * componentScaleX); - xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7); - } - // linearize the blocks of the component - for (y = 0; y < height; y++) { - j = 0 | (y * componentScaleY); - index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3); - for (x = 0; x < width; x++) { - data[offset] = output[index + xScaleBlockOffset[x]]; - offset += numComponents; - } - } - } - - // decodeTransform contains pairs of multiplier (-256..256) and additive - var transform = this.decodeTransform; - if (transform) { - for (i = 0; i < dataLength;) { - for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) { - data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1]; - } - } - } - return data; - }, - - _isColorConversionNeeded: function isColorConversionNeeded() { - if (this.adobe && this.adobe.transformCode) { - // The adobe transform marker overrides any previous setting - return true; - } else if (this.numComponents === 3) { - return true; - } else { - return false; - } - }, - - _convertYccToRgb: function convertYccToRgb(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 3) { - Y = data[i ]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i ] = clamp0to255(Y - 179.456 + 1.402 * Cr); - data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr); - data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb); - } - return data; - }, - - _convertYcckToRgb: function convertYcckToRgb(data) { - var Y, Cb, Cr, k; - var offset = 0; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - k = data[i + 3]; - - var r = -122.67195406894 + - Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - - 0.154362151871126) + - Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - - 0.00477271405408747 * k + 1.53380253221734) + - Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + - 0.48357088451265) + - k * (-0.000336197177618394 * k + 0.484791561490776); - - var g = 107.268039397724 + - Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + - 0.000659397001245577 * Y + 0.000426105652938837 * k - - 0.176491792462875) + - Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + - 0.000770482631801132 * k - 0.151051492775562) + - Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + - 0.25802910206845) + - k * (-0.000318913117588328 * k - 0.213742400323665); - - var b = -20.810012546947 + - Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + - 0.0020741088115012 * Y - 0.00288260236853442 * k + - 0.814272968359295) + - Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + - 0.000560833691242812 * k - 0.195152027534049) + - Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + - 0.116935020465145) + - k * (-0.000343531996510555 * k + 0.24165260232407); - - data[offset++] = clamp0to255(r); - data[offset++] = clamp0to255(g); - data[offset++] = clamp0to255(b); - } - return data; - }, - - _convertYcckToCmyk: function convertYcckToCmyk(data) { - var Y, Cb, Cr; - for (var i = 0, length = data.length; i < length; i += 4) { - Y = data[i]; - Cb = data[i + 1]; - Cr = data[i + 2]; - data[i ] = clamp0to255(434.456 - Y - 1.402 * Cr); - data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr); - data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb); - // K in data[i + 3] is unchanged - } - return data; - }, - - _convertCmykToRgb: function convertCmykToRgb(data) { - var c, m, y, k; - var offset = 0; - var min = -255 * 255 * 255; - var scale = 1 / 255 / 255; - for (var i = 0, length = data.length; i < length; i += 4) { - c = data[i]; - m = data[i + 1]; - y = data[i + 2]; - k = data[i + 3]; - - var r = - c * (-4.387332384609988 * c + 54.48615194189176 * m + - 18.82290502165302 * y + 212.25662451639585 * k - - 72734.4411664936) + - m * (1.7149763477362134 * m - 5.6096736904047315 * y - - 17.873870861415444 * k - 1401.7366389350734) + - y * (-2.5217340131683033 * y - 21.248923337353073 * k + - 4465.541406466231) - - k * (21.86122147463605 * k + 48317.86113160301); - var g = - c * (8.841041422036149 * c + 60.118027045597366 * m + - 6.871425592049007 * y + 31.159100130055922 * k - - 20220.756542821975) + - m * (-15.310361306967817 * m + 17.575251261109482 * y + - 131.35250912493976 * k - 48691.05921601825) + - y * (4.444339102852739 * y + 9.8632861493405 * k - - 6341.191035517494) - - k * (20.737325471181034 * k + 47890.15695978492); - var b = - c * (0.8842522430003296 * c + 8.078677503112928 * m + - 30.89978309703729 * y - 0.23883238689178934 * k - - 3616.812083916688) + - m * (10.49593273432072 * m + 63.02378494754052 * y + - 50.606957656360734 * k - 28620.90484698408) + - y * (0.03296041114873217 * y + 115.60384449646641 * k - - 49363.43385999684) - - k * (22.33816807309886 * k + 45932.16563550634); - - data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0; - data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0; - data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0; - } - return data; - }, - - getData: function getData(width, height, forceRGBoutput) { - if (this.numComponents > 4) { - throw 'Unsupported color mode'; - } - // type of data: Uint8Array(width * height * numComponents) - var data = this._getLinearizedBlockData(width, height); - - if (this.numComponents === 3) { - return this._convertYccToRgb(data); - } else if (this.numComponents === 4) { - if (this._isColorConversionNeeded()) { - if (forceRGBoutput) { - return this._convertYcckToRgb(data); - } else { - return this._convertYcckToCmyk(data); - } - } else if (forceRGBoutput) { - return this._convertCmykToRgb(data); - } - } - return data; - } - }; - - return constructor; -})(); - -exports.JpegImage = JpegImage; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreMetrics = {})); - } -}(this, function (exports) { - -// The Metrics object contains glyph widths (in glyph space units). -// As per PDF spec, for most fonts (Type 3 being an exception) a glyph -// space unit corresponds to 1/1000th of text space unit. -var Metrics = { - 'Courier': 600, - 'Courier-Bold': 600, - 'Courier-BoldOblique': 600, - 'Courier-Oblique': 600, - 'Helvetica' : { - 'space': 278, - 'exclam': 278, - 'quotedbl': 355, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 667, - 'quoteright': 222, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 278, - 'semicolon': 278, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 556, - 'at': 1015, - 'A': 667, - 'B': 667, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 500, - 'K': 667, - 'L': 556, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 278, - 'backslash': 278, - 'bracketright': 278, - 'asciicircum': 469, - 'underscore': 556, - 'quoteleft': 222, - 'a': 556, - 'b': 556, - 'c': 500, - 'd': 556, - 'e': 556, - 'f': 278, - 'g': 556, - 'h': 556, - 'i': 222, - 'j': 222, - 'k': 500, - 'l': 222, - 'm': 833, - 'n': 556, - 'o': 556, - 'p': 556, - 'q': 556, - 'r': 333, - 's': 500, - 't': 278, - 'u': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 500, - 'braceleft': 334, - 'bar': 260, - 'braceright': 334, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 191, - 'quotedblleft': 333, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 500, - 'fl': 500, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 537, - 'bullet': 350, - 'quotesinglbase': 222, - 'quotedblbase': 333, - 'quotedblright': 333, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 556, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 222, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 556, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 667, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 500, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 500, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 222, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 500, - 'scedilla': 500, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 556, - 'acircumflex': 556, - 'Amacron': 667, - 'rcaron': 333, - 'ccedilla': 500, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 643, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 667, - 'Abreve': 667, - 'multiply': 584, - 'uacute': 556, - 'Tcaron': 611, - 'partialdiff': 476, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 500, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 260, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 333, - 'omacron': 556, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 222, - 'tcaron': 317, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 667, - 'Adieresis': 667, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 222, - 'Oacute': 778, - 'oacute': 556, - 'amacron': 556, - 'sacute': 500, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 556, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 556, - 'igrave': 278, - 'ohungarumlaut': 556, - 'Eogonek': 667, - 'dcroat': 556, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 299, - 'Kcommaaccent': 667, - 'Lacute': 556, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 556, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 556, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 556, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 556, - 'Ccaron': 722, - 'ugrave': 556, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 333, - 'Ntilde': 722, - 'otilde': 556, - 'Rcommaaccent': 722, - 'Lcommaaccent': 556, - 'Atilde': 667, - 'Aogonek': 667, - 'Aring': 667, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 500, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 556, - 'tcommaaccent': 278, - 'logicalnot': 584, - 'odieresis': 556, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 556, - 'eth': 556, - 'zcaron': 500, - 'ncommaaccent': 556, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Helvetica-Bold': { - 'space': 278, - 'exclam': 333, - 'quotedbl': 474, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 722, - 'quoteright': 278, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 333, - 'semicolon': 333, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 611, - 'at': 975, - 'A': 722, - 'B': 722, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 556, - 'K': 722, - 'L': 611, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 584, - 'underscore': 556, - 'quoteleft': 278, - 'a': 556, - 'b': 611, - 'c': 556, - 'd': 611, - 'e': 556, - 'f': 333, - 'g': 611, - 'h': 611, - 'i': 278, - 'j': 278, - 'k': 556, - 'l': 278, - 'm': 889, - 'n': 611, - 'o': 611, - 'p': 611, - 'q': 611, - 'r': 389, - 's': 556, - 't': 333, - 'u': 611, - 'v': 556, - 'w': 778, - 'x': 556, - 'y': 556, - 'z': 500, - 'braceleft': 389, - 'bar': 280, - 'braceright': 389, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 238, - 'quotedblleft': 500, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 611, - 'fl': 611, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 556, - 'bullet': 350, - 'quotesinglbase': 278, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 611, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 611, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 722, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 556, - 'scommaaccent': 556, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 611, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 556, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 556, - 'scedilla': 556, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 611, - 'acircumflex': 556, - 'Amacron': 722, - 'rcaron': 389, - 'ccedilla': 556, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 743, - 'Umacron': 722, - 'uring': 611, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 584, - 'uacute': 611, - 'Tcaron': 611, - 'partialdiff': 494, - 'ydieresis': 556, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 556, - 'nacute': 611, - 'umacron': 611, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 280, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 389, - 'omacron': 611, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 278, - 'tcaron': 389, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 278, - 'Oacute': 778, - 'oacute': 611, - 'amacron': 556, - 'sacute': 556, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 611, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 611, - 'igrave': 278, - 'ohungarumlaut': 611, - 'Eogonek': 667, - 'dcroat': 611, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 400, - 'Kcommaaccent': 722, - 'Lacute': 611, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 611, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 611, - 'ntilde': 611, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 611, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 611, - 'Ccaron': 722, - 'ugrave': 611, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 722, - 'otilde': 611, - 'Rcommaaccent': 722, - 'Lcommaaccent': 611, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 556, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 611, - 'tcommaaccent': 333, - 'logicalnot': 584, - 'odieresis': 611, - 'udieresis': 611, - 'notequal': 549, - 'gcommaaccent': 611, - 'eth': 611, - 'zcaron': 500, - 'ncommaaccent': 611, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Helvetica-BoldOblique': { - 'space': 278, - 'exclam': 333, - 'quotedbl': 474, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 722, - 'quoteright': 278, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 333, - 'semicolon': 333, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 611, - 'at': 975, - 'A': 722, - 'B': 722, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 556, - 'K': 722, - 'L': 611, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 584, - 'underscore': 556, - 'quoteleft': 278, - 'a': 556, - 'b': 611, - 'c': 556, - 'd': 611, - 'e': 556, - 'f': 333, - 'g': 611, - 'h': 611, - 'i': 278, - 'j': 278, - 'k': 556, - 'l': 278, - 'm': 889, - 'n': 611, - 'o': 611, - 'p': 611, - 'q': 611, - 'r': 389, - 's': 556, - 't': 333, - 'u': 611, - 'v': 556, - 'w': 778, - 'x': 556, - 'y': 556, - 'z': 500, - 'braceleft': 389, - 'bar': 280, - 'braceright': 389, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 238, - 'quotedblleft': 500, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 611, - 'fl': 611, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 556, - 'bullet': 350, - 'quotesinglbase': 278, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 611, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 611, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 722, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 556, - 'scommaaccent': 556, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 611, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 556, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 556, - 'scedilla': 556, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 611, - 'acircumflex': 556, - 'Amacron': 722, - 'rcaron': 389, - 'ccedilla': 556, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 743, - 'Umacron': 722, - 'uring': 611, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 584, - 'uacute': 611, - 'Tcaron': 611, - 'partialdiff': 494, - 'ydieresis': 556, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 556, - 'nacute': 611, - 'umacron': 611, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 280, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 389, - 'omacron': 611, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 278, - 'tcaron': 389, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 278, - 'Oacute': 778, - 'oacute': 611, - 'amacron': 556, - 'sacute': 556, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 611, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 611, - 'igrave': 278, - 'ohungarumlaut': 611, - 'Eogonek': 667, - 'dcroat': 611, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 400, - 'Kcommaaccent': 722, - 'Lacute': 611, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 611, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 611, - 'ntilde': 611, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 611, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 611, - 'Ccaron': 722, - 'ugrave': 611, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 722, - 'otilde': 611, - 'Rcommaaccent': 722, - 'Lcommaaccent': 611, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 556, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 611, - 'tcommaaccent': 333, - 'logicalnot': 584, - 'odieresis': 611, - 'udieresis': 611, - 'notequal': 549, - 'gcommaaccent': 611, - 'eth': 611, - 'zcaron': 500, - 'ncommaaccent': 611, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Helvetica-Oblique' : { - 'space': 278, - 'exclam': 278, - 'quotedbl': 355, - 'numbersign': 556, - 'dollar': 556, - 'percent': 889, - 'ampersand': 667, - 'quoteright': 222, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 389, - 'plus': 584, - 'comma': 278, - 'hyphen': 333, - 'period': 278, - 'slash': 278, - 'zero': 556, - 'one': 556, - 'two': 556, - 'three': 556, - 'four': 556, - 'five': 556, - 'six': 556, - 'seven': 556, - 'eight': 556, - 'nine': 556, - 'colon': 278, - 'semicolon': 278, - 'less': 584, - 'equal': 584, - 'greater': 584, - 'question': 556, - 'at': 1015, - 'A': 667, - 'B': 667, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'J': 500, - 'K': 667, - 'L': 556, - 'M': 833, - 'N': 722, - 'O': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Z': 611, - 'bracketleft': 278, - 'backslash': 278, - 'bracketright': 278, - 'asciicircum': 469, - 'underscore': 556, - 'quoteleft': 222, - 'a': 556, - 'b': 556, - 'c': 500, - 'd': 556, - 'e': 556, - 'f': 278, - 'g': 556, - 'h': 556, - 'i': 222, - 'j': 222, - 'k': 500, - 'l': 222, - 'm': 833, - 'n': 556, - 'o': 556, - 'p': 556, - 'q': 556, - 'r': 333, - 's': 500, - 't': 278, - 'u': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 500, - 'braceleft': 334, - 'bar': 260, - 'braceright': 334, - 'asciitilde': 584, - 'exclamdown': 333, - 'cent': 556, - 'sterling': 556, - 'fraction': 167, - 'yen': 556, - 'florin': 556, - 'section': 556, - 'currency': 556, - 'quotesingle': 191, - 'quotedblleft': 333, - 'guillemotleft': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 500, - 'fl': 500, - 'endash': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'periodcentered': 278, - 'paragraph': 537, - 'bullet': 350, - 'quotesinglbase': 222, - 'quotedblbase': 333, - 'quotedblright': 333, - 'guillemotright': 556, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 611, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 370, - 'Lslash': 556, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 365, - 'ae': 889, - 'dotlessi': 278, - 'lslash': 222, - 'oslash': 611, - 'oe': 944, - 'germandbls': 611, - 'Idieresis': 278, - 'eacute': 556, - 'abreve': 556, - 'uhungarumlaut': 556, - 'ecaron': 556, - 'Ydieresis': 667, - 'divide': 584, - 'Yacute': 667, - 'Acircumflex': 667, - 'aacute': 556, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 500, - 'ecircumflex': 556, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 556, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 737, - 'Emacron': 667, - 'ccaron': 500, - 'aring': 556, - 'Ncommaaccent': 722, - 'lacute': 222, - 'agrave': 556, - 'Tcommaaccent': 611, - 'Cacute': 722, - 'atilde': 556, - 'Edotaccent': 667, - 'scaron': 500, - 'scedilla': 500, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 556, - 'acircumflex': 556, - 'Amacron': 667, - 'rcaron': 333, - 'ccedilla': 500, - 'Zdotaccent': 611, - 'Thorn': 667, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 667, - 'dcaron': 643, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 333, - 'Ograve': 778, - 'Agrave': 667, - 'Abreve': 667, - 'multiply': 584, - 'uacute': 556, - 'Tcaron': 611, - 'partialdiff': 476, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 556, - 'edieresis': 556, - 'cacute': 500, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 278, - 'plusminus': 584, - 'brokenbar': 260, - 'registered': 737, - 'Gbreve': 778, - 'Idotaccent': 278, - 'summation': 600, - 'Egrave': 667, - 'racute': 333, - 'omacron': 556, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 222, - 'tcaron': 317, - 'eogonek': 556, - 'Uogonek': 722, - 'Aacute': 667, - 'Adieresis': 667, - 'egrave': 556, - 'zacute': 500, - 'iogonek': 222, - 'Oacute': 778, - 'oacute': 556, - 'amacron': 556, - 'sacute': 500, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 556, - 'twosuperior': 333, - 'Odieresis': 778, - 'mu': 556, - 'igrave': 278, - 'ohungarumlaut': 556, - 'Eogonek': 667, - 'dcroat': 556, - 'threequarters': 834, - 'Scedilla': 667, - 'lcaron': 299, - 'Kcommaaccent': 667, - 'Lacute': 556, - 'trademark': 1000, - 'edotaccent': 556, - 'Igrave': 278, - 'Imacron': 278, - 'Lcaron': 556, - 'onehalf': 834, - 'lessequal': 549, - 'ocircumflex': 556, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 556, - 'gbreve': 556, - 'onequarter': 834, - 'Scaron': 667, - 'Scommaaccent': 667, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 556, - 'Ccaron': 722, - 'ugrave': 556, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 333, - 'Ntilde': 722, - 'otilde': 556, - 'Rcommaaccent': 722, - 'Lcommaaccent': 556, - 'Atilde': 667, - 'Aogonek': 667, - 'Aring': 667, - 'Otilde': 778, - 'zdotaccent': 500, - 'Ecaron': 667, - 'Iogonek': 278, - 'kcommaaccent': 500, - 'minus': 584, - 'Icircumflex': 278, - 'ncaron': 556, - 'tcommaaccent': 278, - 'logicalnot': 584, - 'odieresis': 556, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 556, - 'eth': 556, - 'zcaron': 500, - 'ncommaaccent': 556, - 'onesuperior': 333, - 'imacron': 278, - 'Euro': 556 - }, - 'Symbol': { - 'space': 250, - 'exclam': 333, - 'universal': 713, - 'numbersign': 500, - 'existential': 549, - 'percent': 833, - 'ampersand': 778, - 'suchthat': 439, - 'parenleft': 333, - 'parenright': 333, - 'asteriskmath': 500, - 'plus': 549, - 'comma': 250, - 'minus': 549, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 278, - 'semicolon': 278, - 'less': 549, - 'equal': 549, - 'greater': 549, - 'question': 444, - 'congruent': 549, - 'Alpha': 722, - 'Beta': 667, - 'Chi': 722, - 'Delta': 612, - 'Epsilon': 611, - 'Phi': 763, - 'Gamma': 603, - 'Eta': 722, - 'Iota': 333, - 'theta1': 631, - 'Kappa': 722, - 'Lambda': 686, - 'Mu': 889, - 'Nu': 722, - 'Omicron': 722, - 'Pi': 768, - 'Theta': 741, - 'Rho': 556, - 'Sigma': 592, - 'Tau': 611, - 'Upsilon': 690, - 'sigma1': 439, - 'Omega': 768, - 'Xi': 645, - 'Psi': 795, - 'Zeta': 611, - 'bracketleft': 333, - 'therefore': 863, - 'bracketright': 333, - 'perpendicular': 658, - 'underscore': 500, - 'radicalex': 500, - 'alpha': 631, - 'beta': 549, - 'chi': 549, - 'delta': 494, - 'epsilon': 439, - 'phi': 521, - 'gamma': 411, - 'eta': 603, - 'iota': 329, - 'phi1': 603, - 'kappa': 549, - 'lambda': 549, - 'mu': 576, - 'nu': 521, - 'omicron': 549, - 'pi': 549, - 'theta': 521, - 'rho': 549, - 'sigma': 603, - 'tau': 439, - 'upsilon': 576, - 'omega1': 713, - 'omega': 686, - 'xi': 493, - 'psi': 686, - 'zeta': 494, - 'braceleft': 480, - 'bar': 200, - 'braceright': 480, - 'similar': 549, - 'Euro': 750, - 'Upsilon1': 620, - 'minute': 247, - 'lessequal': 549, - 'fraction': 167, - 'infinity': 713, - 'florin': 500, - 'club': 753, - 'diamond': 753, - 'heart': 753, - 'spade': 753, - 'arrowboth': 1042, - 'arrowleft': 987, - 'arrowup': 603, - 'arrowright': 987, - 'arrowdown': 603, - 'degree': 400, - 'plusminus': 549, - 'second': 411, - 'greaterequal': 549, - 'multiply': 549, - 'proportional': 713, - 'partialdiff': 494, - 'bullet': 460, - 'divide': 549, - 'notequal': 549, - 'equivalence': 549, - 'approxequal': 549, - 'ellipsis': 1000, - 'arrowvertex': 603, - 'arrowhorizex': 1000, - 'carriagereturn': 658, - 'aleph': 823, - 'Ifraktur': 686, - 'Rfraktur': 795, - 'weierstrass': 987, - 'circlemultiply': 768, - 'circleplus': 768, - 'emptyset': 823, - 'intersection': 768, - 'union': 768, - 'propersuperset': 713, - 'reflexsuperset': 713, - 'notsubset': 713, - 'propersubset': 713, - 'reflexsubset': 713, - 'element': 713, - 'notelement': 713, - 'angle': 768, - 'gradient': 713, - 'registerserif': 790, - 'copyrightserif': 790, - 'trademarkserif': 890, - 'product': 823, - 'radical': 549, - 'dotmath': 250, - 'logicalnot': 713, - 'logicaland': 603, - 'logicalor': 603, - 'arrowdblboth': 1042, - 'arrowdblleft': 987, - 'arrowdblup': 603, - 'arrowdblright': 987, - 'arrowdbldown': 603, - 'lozenge': 494, - 'angleleft': 329, - 'registersans': 790, - 'copyrightsans': 790, - 'trademarksans': 786, - 'summation': 713, - 'parenlefttp': 384, - 'parenleftex': 384, - 'parenleftbt': 384, - 'bracketlefttp': 384, - 'bracketleftex': 384, - 'bracketleftbt': 384, - 'bracelefttp': 494, - 'braceleftmid': 494, - 'braceleftbt': 494, - 'braceex': 494, - 'angleright': 329, - 'integral': 274, - 'integraltp': 686, - 'integralex': 686, - 'integralbt': 686, - 'parenrighttp': 384, - 'parenrightex': 384, - 'parenrightbt': 384, - 'bracketrighttp': 384, - 'bracketrightex': 384, - 'bracketrightbt': 384, - 'bracerighttp': 494, - 'bracerightmid': 494, - 'bracerightbt': 494, - 'apple': 790 - }, - 'Times-Roman': { - 'space': 250, - 'exclam': 333, - 'quotedbl': 408, - 'numbersign': 500, - 'dollar': 500, - 'percent': 833, - 'ampersand': 778, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 564, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 278, - 'semicolon': 278, - 'less': 564, - 'equal': 564, - 'greater': 564, - 'question': 444, - 'at': 921, - 'A': 722, - 'B': 667, - 'C': 667, - 'D': 722, - 'E': 611, - 'F': 556, - 'G': 722, - 'H': 722, - 'I': 333, - 'J': 389, - 'K': 722, - 'L': 611, - 'M': 889, - 'N': 722, - 'O': 722, - 'P': 556, - 'Q': 722, - 'R': 667, - 'S': 556, - 'T': 611, - 'U': 722, - 'V': 722, - 'W': 944, - 'X': 722, - 'Y': 722, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 469, - 'underscore': 500, - 'quoteleft': 333, - 'a': 444, - 'b': 500, - 'c': 444, - 'd': 500, - 'e': 444, - 'f': 333, - 'g': 500, - 'h': 500, - 'i': 278, - 'j': 278, - 'k': 500, - 'l': 278, - 'm': 778, - 'n': 500, - 'o': 500, - 'p': 500, - 'q': 500, - 'r': 333, - 's': 389, - 't': 278, - 'u': 500, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 444, - 'braceleft': 480, - 'bar': 200, - 'braceright': 480, - 'asciitilde': 541, - 'exclamdown': 333, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 180, - 'quotedblleft': 444, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 556, - 'fl': 556, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 453, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 444, - 'quotedblright': 444, - 'guillemotright': 500, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 444, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 889, - 'ordfeminine': 276, - 'Lslash': 611, - 'Oslash': 722, - 'OE': 889, - 'ordmasculine': 310, - 'ae': 667, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 722, - 'germandbls': 500, - 'Idieresis': 333, - 'eacute': 444, - 'abreve': 444, - 'uhungarumlaut': 500, - 'ecaron': 444, - 'Ydieresis': 722, - 'divide': 564, - 'Yacute': 722, - 'Acircumflex': 722, - 'aacute': 444, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 444, - 'Uacute': 722, - 'uogonek': 500, - 'Edieresis': 611, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 760, - 'Emacron': 611, - 'ccaron': 444, - 'aring': 444, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 444, - 'Tcommaaccent': 611, - 'Cacute': 667, - 'atilde': 444, - 'Edotaccent': 611, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 667, - 'Gcommaaccent': 722, - 'ucircumflex': 500, - 'acircumflex': 444, - 'Amacron': 722, - 'rcaron': 333, - 'ccedilla': 444, - 'Zdotaccent': 611, - 'Thorn': 556, - 'Omacron': 722, - 'Racute': 667, - 'Sacute': 556, - 'dcaron': 588, - 'Umacron': 722, - 'uring': 500, - 'threesuperior': 300, - 'Ograve': 722, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 564, - 'uacute': 500, - 'Tcaron': 611, - 'partialdiff': 476, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 611, - 'adieresis': 444, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 500, - 'umacron': 500, - 'Ncaron': 722, - 'Iacute': 333, - 'plusminus': 564, - 'brokenbar': 200, - 'registered': 760, - 'Gbreve': 722, - 'Idotaccent': 333, - 'summation': 600, - 'Egrave': 611, - 'racute': 333, - 'omacron': 500, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 667, - 'lcommaaccent': 278, - 'tcaron': 326, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 444, - 'zacute': 444, - 'iogonek': 278, - 'Oacute': 722, - 'oacute': 500, - 'amacron': 444, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 722, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 500, - 'twosuperior': 300, - 'Odieresis': 722, - 'mu': 500, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 611, - 'dcroat': 500, - 'threequarters': 750, - 'Scedilla': 556, - 'lcaron': 344, - 'Kcommaaccent': 722, - 'Lacute': 611, - 'trademark': 980, - 'edotaccent': 444, - 'Igrave': 333, - 'Imacron': 333, - 'Lcaron': 611, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 500, - 'Uhungarumlaut': 722, - 'Eacute': 611, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 556, - 'Scommaaccent': 556, - 'Ohungarumlaut': 722, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 667, - 'ugrave': 500, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 333, - 'Ntilde': 722, - 'otilde': 500, - 'Rcommaaccent': 667, - 'Lcommaaccent': 611, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 722, - 'zdotaccent': 444, - 'Ecaron': 611, - 'Iogonek': 333, - 'kcommaaccent': 500, - 'minus': 564, - 'Icircumflex': 333, - 'ncaron': 500, - 'tcommaaccent': 278, - 'logicalnot': 564, - 'odieresis': 500, - 'udieresis': 500, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 444, - 'ncommaaccent': 500, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'Times-Bold': { - 'space': 250, - 'exclam': 333, - 'quotedbl': 555, - 'numbersign': 500, - 'dollar': 500, - 'percent': 1000, - 'ampersand': 833, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 570, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 333, - 'semicolon': 333, - 'less': 570, - 'equal': 570, - 'greater': 570, - 'question': 500, - 'at': 930, - 'A': 722, - 'B': 667, - 'C': 722, - 'D': 722, - 'E': 667, - 'F': 611, - 'G': 778, - 'H': 778, - 'I': 389, - 'J': 500, - 'K': 778, - 'L': 667, - 'M': 944, - 'N': 722, - 'O': 778, - 'P': 611, - 'Q': 778, - 'R': 722, - 'S': 556, - 'T': 667, - 'U': 722, - 'V': 722, - 'W': 1000, - 'X': 722, - 'Y': 722, - 'Z': 667, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 581, - 'underscore': 500, - 'quoteleft': 333, - 'a': 500, - 'b': 556, - 'c': 444, - 'd': 556, - 'e': 444, - 'f': 333, - 'g': 500, - 'h': 556, - 'i': 278, - 'j': 333, - 'k': 556, - 'l': 278, - 'm': 833, - 'n': 556, - 'o': 500, - 'p': 556, - 'q': 556, - 'r': 444, - 's': 389, - 't': 333, - 'u': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'z': 444, - 'braceleft': 394, - 'bar': 220, - 'braceright': 394, - 'asciitilde': 520, - 'exclamdown': 333, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 278, - 'quotedblleft': 500, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 556, - 'fl': 556, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 540, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 500, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 500, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 1000, - 'ordfeminine': 300, - 'Lslash': 667, - 'Oslash': 778, - 'OE': 1000, - 'ordmasculine': 330, - 'ae': 722, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 722, - 'germandbls': 556, - 'Idieresis': 389, - 'eacute': 444, - 'abreve': 500, - 'uhungarumlaut': 556, - 'ecaron': 444, - 'Ydieresis': 722, - 'divide': 570, - 'Yacute': 722, - 'Acircumflex': 722, - 'aacute': 500, - 'Ucircumflex': 722, - 'yacute': 500, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 500, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 747, - 'Emacron': 667, - 'ccaron': 444, - 'aring': 500, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 500, - 'Tcommaaccent': 667, - 'Cacute': 722, - 'atilde': 500, - 'Edotaccent': 667, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 722, - 'Gcommaaccent': 778, - 'ucircumflex': 556, - 'acircumflex': 500, - 'Amacron': 722, - 'rcaron': 444, - 'ccedilla': 444, - 'Zdotaccent': 667, - 'Thorn': 611, - 'Omacron': 778, - 'Racute': 722, - 'Sacute': 556, - 'dcaron': 672, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 300, - 'Ograve': 778, - 'Agrave': 722, - 'Abreve': 722, - 'multiply': 570, - 'uacute': 556, - 'Tcaron': 667, - 'partialdiff': 494, - 'ydieresis': 500, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 500, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 389, - 'plusminus': 570, - 'brokenbar': 220, - 'registered': 747, - 'Gbreve': 778, - 'Idotaccent': 389, - 'summation': 600, - 'Egrave': 667, - 'racute': 444, - 'omacron': 500, - 'Zacute': 667, - 'Zcaron': 667, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 722, - 'lcommaaccent': 278, - 'tcaron': 416, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 722, - 'Adieresis': 722, - 'egrave': 444, - 'zacute': 444, - 'iogonek': 278, - 'Oacute': 778, - 'oacute': 500, - 'amacron': 500, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 778, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 556, - 'twosuperior': 300, - 'Odieresis': 778, - 'mu': 556, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 667, - 'dcroat': 556, - 'threequarters': 750, - 'Scedilla': 556, - 'lcaron': 394, - 'Kcommaaccent': 778, - 'Lacute': 667, - 'trademark': 1000, - 'edotaccent': 444, - 'Igrave': 389, - 'Imacron': 389, - 'Lcaron': 667, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 556, - 'Scommaaccent': 556, - 'Ohungarumlaut': 778, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 722, - 'ugrave': 556, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 444, - 'Ntilde': 722, - 'otilde': 500, - 'Rcommaaccent': 722, - 'Lcommaaccent': 667, - 'Atilde': 722, - 'Aogonek': 722, - 'Aring': 722, - 'Otilde': 778, - 'zdotaccent': 444, - 'Ecaron': 667, - 'Iogonek': 389, - 'kcommaaccent': 556, - 'minus': 570, - 'Icircumflex': 389, - 'ncaron': 556, - 'tcommaaccent': 333, - 'logicalnot': 570, - 'odieresis': 500, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 444, - 'ncommaaccent': 556, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'Times-BoldItalic': { - 'space': 250, - 'exclam': 389, - 'quotedbl': 555, - 'numbersign': 500, - 'dollar': 500, - 'percent': 833, - 'ampersand': 778, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 570, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 333, - 'semicolon': 333, - 'less': 570, - 'equal': 570, - 'greater': 570, - 'question': 500, - 'at': 832, - 'A': 667, - 'B': 667, - 'C': 667, - 'D': 722, - 'E': 667, - 'F': 667, - 'G': 722, - 'H': 778, - 'I': 389, - 'J': 500, - 'K': 667, - 'L': 611, - 'M': 889, - 'N': 722, - 'O': 722, - 'P': 611, - 'Q': 722, - 'R': 667, - 'S': 556, - 'T': 611, - 'U': 722, - 'V': 667, - 'W': 889, - 'X': 667, - 'Y': 611, - 'Z': 611, - 'bracketleft': 333, - 'backslash': 278, - 'bracketright': 333, - 'asciicircum': 570, - 'underscore': 500, - 'quoteleft': 333, - 'a': 500, - 'b': 500, - 'c': 444, - 'd': 500, - 'e': 444, - 'f': 333, - 'g': 500, - 'h': 556, - 'i': 278, - 'j': 278, - 'k': 500, - 'l': 278, - 'm': 778, - 'n': 556, - 'o': 500, - 'p': 500, - 'q': 500, - 'r': 389, - 's': 389, - 't': 278, - 'u': 556, - 'v': 444, - 'w': 667, - 'x': 500, - 'y': 444, - 'z': 389, - 'braceleft': 348, - 'bar': 220, - 'braceright': 348, - 'asciitilde': 570, - 'exclamdown': 389, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 278, - 'quotedblleft': 500, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 556, - 'fl': 556, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 500, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 500, - 'quotedblright': 500, - 'guillemotright': 500, - 'ellipsis': 1000, - 'perthousand': 1000, - 'questiondown': 500, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 1000, - 'AE': 944, - 'ordfeminine': 266, - 'Lslash': 611, - 'Oslash': 722, - 'OE': 944, - 'ordmasculine': 300, - 'ae': 722, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 722, - 'germandbls': 500, - 'Idieresis': 389, - 'eacute': 444, - 'abreve': 500, - 'uhungarumlaut': 556, - 'ecaron': 444, - 'Ydieresis': 611, - 'divide': 570, - 'Yacute': 611, - 'Acircumflex': 667, - 'aacute': 500, - 'Ucircumflex': 722, - 'yacute': 444, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 500, - 'Uacute': 722, - 'uogonek': 556, - 'Edieresis': 667, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 747, - 'Emacron': 667, - 'ccaron': 444, - 'aring': 500, - 'Ncommaaccent': 722, - 'lacute': 278, - 'agrave': 500, - 'Tcommaaccent': 611, - 'Cacute': 667, - 'atilde': 500, - 'Edotaccent': 667, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 494, - 'Rcaron': 667, - 'Gcommaaccent': 722, - 'ucircumflex': 556, - 'acircumflex': 500, - 'Amacron': 667, - 'rcaron': 389, - 'ccedilla': 444, - 'Zdotaccent': 611, - 'Thorn': 611, - 'Omacron': 722, - 'Racute': 667, - 'Sacute': 556, - 'dcaron': 608, - 'Umacron': 722, - 'uring': 556, - 'threesuperior': 300, - 'Ograve': 722, - 'Agrave': 667, - 'Abreve': 667, - 'multiply': 570, - 'uacute': 556, - 'Tcaron': 611, - 'partialdiff': 494, - 'ydieresis': 444, - 'Nacute': 722, - 'icircumflex': 278, - 'Ecircumflex': 667, - 'adieresis': 500, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 556, - 'umacron': 556, - 'Ncaron': 722, - 'Iacute': 389, - 'plusminus': 570, - 'brokenbar': 220, - 'registered': 747, - 'Gbreve': 722, - 'Idotaccent': 389, - 'summation': 600, - 'Egrave': 667, - 'racute': 389, - 'omacron': 500, - 'Zacute': 611, - 'Zcaron': 611, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 667, - 'lcommaaccent': 278, - 'tcaron': 366, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 667, - 'Adieresis': 667, - 'egrave': 444, - 'zacute': 389, - 'iogonek': 278, - 'Oacute': 722, - 'oacute': 500, - 'amacron': 500, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 722, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 500, - 'twosuperior': 300, - 'Odieresis': 722, - 'mu': 576, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 667, - 'dcroat': 500, - 'threequarters': 750, - 'Scedilla': 556, - 'lcaron': 382, - 'Kcommaaccent': 667, - 'Lacute': 611, - 'trademark': 1000, - 'edotaccent': 444, - 'Igrave': 389, - 'Imacron': 389, - 'Lcaron': 611, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 556, - 'Uhungarumlaut': 722, - 'Eacute': 667, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 556, - 'Scommaaccent': 556, - 'Ohungarumlaut': 722, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 667, - 'ugrave': 556, - 'radical': 549, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 722, - 'otilde': 500, - 'Rcommaaccent': 667, - 'Lcommaaccent': 611, - 'Atilde': 667, - 'Aogonek': 667, - 'Aring': 667, - 'Otilde': 722, - 'zdotaccent': 389, - 'Ecaron': 667, - 'Iogonek': 389, - 'kcommaaccent': 500, - 'minus': 606, - 'Icircumflex': 389, - 'ncaron': 556, - 'tcommaaccent': 278, - 'logicalnot': 606, - 'odieresis': 500, - 'udieresis': 556, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 389, - 'ncommaaccent': 556, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'Times-Italic': { - 'space': 250, - 'exclam': 333, - 'quotedbl': 420, - 'numbersign': 500, - 'dollar': 500, - 'percent': 833, - 'ampersand': 778, - 'quoteright': 333, - 'parenleft': 333, - 'parenright': 333, - 'asterisk': 500, - 'plus': 675, - 'comma': 250, - 'hyphen': 333, - 'period': 250, - 'slash': 278, - 'zero': 500, - 'one': 500, - 'two': 500, - 'three': 500, - 'four': 500, - 'five': 500, - 'six': 500, - 'seven': 500, - 'eight': 500, - 'nine': 500, - 'colon': 333, - 'semicolon': 333, - 'less': 675, - 'equal': 675, - 'greater': 675, - 'question': 500, - 'at': 920, - 'A': 611, - 'B': 611, - 'C': 667, - 'D': 722, - 'E': 611, - 'F': 611, - 'G': 722, - 'H': 722, - 'I': 333, - 'J': 444, - 'K': 667, - 'L': 556, - 'M': 833, - 'N': 667, - 'O': 722, - 'P': 611, - 'Q': 722, - 'R': 611, - 'S': 500, - 'T': 556, - 'U': 722, - 'V': 611, - 'W': 833, - 'X': 611, - 'Y': 556, - 'Z': 556, - 'bracketleft': 389, - 'backslash': 278, - 'bracketright': 389, - 'asciicircum': 422, - 'underscore': 500, - 'quoteleft': 333, - 'a': 500, - 'b': 500, - 'c': 444, - 'd': 500, - 'e': 444, - 'f': 278, - 'g': 500, - 'h': 500, - 'i': 278, - 'j': 278, - 'k': 444, - 'l': 278, - 'm': 722, - 'n': 500, - 'o': 500, - 'p': 500, - 'q': 500, - 'r': 389, - 's': 389, - 't': 278, - 'u': 500, - 'v': 444, - 'w': 667, - 'x': 444, - 'y': 444, - 'z': 389, - 'braceleft': 400, - 'bar': 275, - 'braceright': 400, - 'asciitilde': 541, - 'exclamdown': 389, - 'cent': 500, - 'sterling': 500, - 'fraction': 167, - 'yen': 500, - 'florin': 500, - 'section': 500, - 'currency': 500, - 'quotesingle': 214, - 'quotedblleft': 556, - 'guillemotleft': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'fi': 500, - 'fl': 500, - 'endash': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'periodcentered': 250, - 'paragraph': 523, - 'bullet': 350, - 'quotesinglbase': 333, - 'quotedblbase': 556, - 'quotedblright': 556, - 'guillemotright': 500, - 'ellipsis': 889, - 'perthousand': 1000, - 'questiondown': 500, - 'grave': 333, - 'acute': 333, - 'circumflex': 333, - 'tilde': 333, - 'macron': 333, - 'breve': 333, - 'dotaccent': 333, - 'dieresis': 333, - 'ring': 333, - 'cedilla': 333, - 'hungarumlaut': 333, - 'ogonek': 333, - 'caron': 333, - 'emdash': 889, - 'AE': 889, - 'ordfeminine': 276, - 'Lslash': 556, - 'Oslash': 722, - 'OE': 944, - 'ordmasculine': 310, - 'ae': 667, - 'dotlessi': 278, - 'lslash': 278, - 'oslash': 500, - 'oe': 667, - 'germandbls': 500, - 'Idieresis': 333, - 'eacute': 444, - 'abreve': 500, - 'uhungarumlaut': 500, - 'ecaron': 444, - 'Ydieresis': 556, - 'divide': 675, - 'Yacute': 556, - 'Acircumflex': 611, - 'aacute': 500, - 'Ucircumflex': 722, - 'yacute': 444, - 'scommaaccent': 389, - 'ecircumflex': 444, - 'Uring': 722, - 'Udieresis': 722, - 'aogonek': 500, - 'Uacute': 722, - 'uogonek': 500, - 'Edieresis': 611, - 'Dcroat': 722, - 'commaaccent': 250, - 'copyright': 760, - 'Emacron': 611, - 'ccaron': 444, - 'aring': 500, - 'Ncommaaccent': 667, - 'lacute': 278, - 'agrave': 500, - 'Tcommaaccent': 556, - 'Cacute': 667, - 'atilde': 500, - 'Edotaccent': 611, - 'scaron': 389, - 'scedilla': 389, - 'iacute': 278, - 'lozenge': 471, - 'Rcaron': 611, - 'Gcommaaccent': 722, - 'ucircumflex': 500, - 'acircumflex': 500, - 'Amacron': 611, - 'rcaron': 389, - 'ccedilla': 444, - 'Zdotaccent': 556, - 'Thorn': 611, - 'Omacron': 722, - 'Racute': 611, - 'Sacute': 500, - 'dcaron': 544, - 'Umacron': 722, - 'uring': 500, - 'threesuperior': 300, - 'Ograve': 722, - 'Agrave': 611, - 'Abreve': 611, - 'multiply': 675, - 'uacute': 500, - 'Tcaron': 556, - 'partialdiff': 476, - 'ydieresis': 444, - 'Nacute': 667, - 'icircumflex': 278, - 'Ecircumflex': 611, - 'adieresis': 500, - 'edieresis': 444, - 'cacute': 444, - 'nacute': 500, - 'umacron': 500, - 'Ncaron': 667, - 'Iacute': 333, - 'plusminus': 675, - 'brokenbar': 275, - 'registered': 760, - 'Gbreve': 722, - 'Idotaccent': 333, - 'summation': 600, - 'Egrave': 611, - 'racute': 389, - 'omacron': 500, - 'Zacute': 556, - 'Zcaron': 556, - 'greaterequal': 549, - 'Eth': 722, - 'Ccedilla': 667, - 'lcommaaccent': 278, - 'tcaron': 300, - 'eogonek': 444, - 'Uogonek': 722, - 'Aacute': 611, - 'Adieresis': 611, - 'egrave': 444, - 'zacute': 389, - 'iogonek': 278, - 'Oacute': 722, - 'oacute': 500, - 'amacron': 500, - 'sacute': 389, - 'idieresis': 278, - 'Ocircumflex': 722, - 'Ugrave': 722, - 'Delta': 612, - 'thorn': 500, - 'twosuperior': 300, - 'Odieresis': 722, - 'mu': 500, - 'igrave': 278, - 'ohungarumlaut': 500, - 'Eogonek': 611, - 'dcroat': 500, - 'threequarters': 750, - 'Scedilla': 500, - 'lcaron': 300, - 'Kcommaaccent': 667, - 'Lacute': 556, - 'trademark': 980, - 'edotaccent': 444, - 'Igrave': 333, - 'Imacron': 333, - 'Lcaron': 611, - 'onehalf': 750, - 'lessequal': 549, - 'ocircumflex': 500, - 'ntilde': 500, - 'Uhungarumlaut': 722, - 'Eacute': 611, - 'emacron': 444, - 'gbreve': 500, - 'onequarter': 750, - 'Scaron': 500, - 'Scommaaccent': 500, - 'Ohungarumlaut': 722, - 'degree': 400, - 'ograve': 500, - 'Ccaron': 667, - 'ugrave': 500, - 'radical': 453, - 'Dcaron': 722, - 'rcommaaccent': 389, - 'Ntilde': 667, - 'otilde': 500, - 'Rcommaaccent': 611, - 'Lcommaaccent': 556, - 'Atilde': 611, - 'Aogonek': 611, - 'Aring': 611, - 'Otilde': 722, - 'zdotaccent': 389, - 'Ecaron': 611, - 'Iogonek': 333, - 'kcommaaccent': 444, - 'minus': 675, - 'Icircumflex': 333, - 'ncaron': 500, - 'tcommaaccent': 278, - 'logicalnot': 675, - 'odieresis': 500, - 'udieresis': 500, - 'notequal': 549, - 'gcommaaccent': 500, - 'eth': 500, - 'zcaron': 389, - 'ncommaaccent': 500, - 'onesuperior': 300, - 'imacron': 278, - 'Euro': 500 - }, - 'ZapfDingbats': { - 'space': 278, - 'a1': 974, - 'a2': 961, - 'a202': 974, - 'a3': 980, - 'a4': 719, - 'a5': 789, - 'a119': 790, - 'a118': 791, - 'a117': 690, - 'a11': 960, - 'a12': 939, - 'a13': 549, - 'a14': 855, - 'a15': 911, - 'a16': 933, - 'a105': 911, - 'a17': 945, - 'a18': 974, - 'a19': 755, - 'a20': 846, - 'a21': 762, - 'a22': 761, - 'a23': 571, - 'a24': 677, - 'a25': 763, - 'a26': 760, - 'a27': 759, - 'a28': 754, - 'a6': 494, - 'a7': 552, - 'a8': 537, - 'a9': 577, - 'a10': 692, - 'a29': 786, - 'a30': 788, - 'a31': 788, - 'a32': 790, - 'a33': 793, - 'a34': 794, - 'a35': 816, - 'a36': 823, - 'a37': 789, - 'a38': 841, - 'a39': 823, - 'a40': 833, - 'a41': 816, - 'a42': 831, - 'a43': 923, - 'a44': 744, - 'a45': 723, - 'a46': 749, - 'a47': 790, - 'a48': 792, - 'a49': 695, - 'a50': 776, - 'a51': 768, - 'a52': 792, - 'a53': 759, - 'a54': 707, - 'a55': 708, - 'a56': 682, - 'a57': 701, - 'a58': 826, - 'a59': 815, - 'a60': 789, - 'a61': 789, - 'a62': 707, - 'a63': 687, - 'a64': 696, - 'a65': 689, - 'a66': 786, - 'a67': 787, - 'a68': 713, - 'a69': 791, - 'a70': 785, - 'a71': 791, - 'a72': 873, - 'a73': 761, - 'a74': 762, - 'a203': 762, - 'a75': 759, - 'a204': 759, - 'a76': 892, - 'a77': 892, - 'a78': 788, - 'a79': 784, - 'a81': 438, - 'a82': 138, - 'a83': 277, - 'a84': 415, - 'a97': 392, - 'a98': 392, - 'a99': 668, - 'a100': 668, - 'a89': 390, - 'a90': 390, - 'a93': 317, - 'a94': 317, - 'a91': 276, - 'a92': 276, - 'a205': 509, - 'a85': 509, - 'a206': 410, - 'a86': 410, - 'a87': 234, - 'a88': 234, - 'a95': 334, - 'a96': 334, - 'a101': 732, - 'a102': 544, - 'a103': 544, - 'a104': 910, - 'a106': 667, - 'a107': 760, - 'a108': 760, - 'a112': 776, - 'a111': 595, - 'a110': 694, - 'a109': 626, - 'a120': 788, - 'a121': 788, - 'a122': 788, - 'a123': 788, - 'a124': 788, - 'a125': 788, - 'a126': 788, - 'a127': 788, - 'a128': 788, - 'a129': 788, - 'a130': 788, - 'a131': 788, - 'a132': 788, - 'a133': 788, - 'a134': 788, - 'a135': 788, - 'a136': 788, - 'a137': 788, - 'a138': 788, - 'a139': 788, - 'a140': 788, - 'a141': 788, - 'a142': 788, - 'a143': 788, - 'a144': 788, - 'a145': 788, - 'a146': 788, - 'a147': 788, - 'a148': 788, - 'a149': 788, - 'a150': 788, - 'a151': 788, - 'a152': 788, - 'a153': 788, - 'a154': 788, - 'a155': 788, - 'a156': 788, - 'a157': 788, - 'a158': 788, - 'a159': 788, - 'a160': 894, - 'a161': 838, - 'a163': 1016, - 'a164': 458, - 'a196': 748, - 'a165': 924, - 'a192': 748, - 'a166': 918, - 'a167': 927, - 'a168': 928, - 'a169': 928, - 'a170': 834, - 'a171': 873, - 'a172': 828, - 'a173': 924, - 'a162': 924, - 'a174': 917, - 'a175': 930, - 'a176': 931, - 'a177': 463, - 'a178': 883, - 'a179': 836, - 'a193': 836, - 'a180': 867, - 'a199': 867, - 'a181': 696, - 'a200': 696, - 'a182': 874, - 'a201': 874, - 'a183': 760, - 'a184': 946, - 'a197': 771, - 'a185': 865, - 'a194': 771, - 'a198': 888, - 'a186': 967, - 'a195': 888, - 'a187': 831, - 'a188': 873, - 'a189': 927, - 'a190': 970, - 'a191': 918 - } -}; - -exports.Metrics = Metrics; -})); - - - - -var NetworkManager = (function NetworkManagerClosure() { - - var OK_RESPONSE = 200; - var PARTIAL_CONTENT_RESPONSE = 206; - - function NetworkManager(url, args) { - this.url = url; - args = args || {}; - this.isHttp = /^https?:/i.test(url); - this.httpHeaders = (this.isHttp && args.httpHeaders) || {}; - this.withCredentials = args.withCredentials || false; - this.getXhr = args.getXhr || - function NetworkManager_getXhr() { - return new XMLHttpRequest(); - }; - - this.currXhrId = 0; - this.pendingRequests = {}; - this.loadedRequests = {}; - } - - function getArrayBuffer(xhr) { - var data = xhr.response; - if (typeof data !== 'string') { - return data; - } - var length = data.length; - var array = new Uint8Array(length); - for (var i = 0; i < length; i++) { - array[i] = data.charCodeAt(i) & 0xFF; - } - return array.buffer; - } - - var supportsMozChunked = (function supportsMozChunkedClosure() { - try { - var x = new XMLHttpRequest(); - // Firefox 37- required .open() to be called before setting responseType. - // https://bugzilla.mozilla.org/show_bug.cgi?id=707484 - // Even though the URL is not visited, .open() could fail if the URL is - // blocked, e.g. via the connect-src CSP directive or the NoScript addon. - // When this error occurs, this feature detection method will mistakenly - // report that moz-chunked-arraybuffer is not supported in Firefox 37-. - x.open('GET', 'https://example.com'); - x.responseType = 'moz-chunked-arraybuffer'; - return x.responseType === 'moz-chunked-arraybuffer'; - } catch (e) { - return false; - } - })(); - - NetworkManager.prototype = { - requestRange: function NetworkManager_requestRange(begin, end, listeners) { - var args = { - begin: begin, - end: end - }; - for (var prop in listeners) { - args[prop] = listeners[prop]; - } - return this.request(args); - }, - - requestFull: function NetworkManager_requestFull(listeners) { - return this.request(listeners); - }, - - request: function NetworkManager_request(args) { - var xhr = this.getXhr(); - var xhrId = this.currXhrId++; - var pendingRequest = this.pendingRequests[xhrId] = { - xhr: xhr - }; - - xhr.open('GET', this.url); - xhr.withCredentials = this.withCredentials; - for (var property in this.httpHeaders) { - var value = this.httpHeaders[property]; - if (typeof value === 'undefined') { - continue; - } - xhr.setRequestHeader(property, value); - } - if (this.isHttp && 'begin' in args && 'end' in args) { - var rangeStr = args.begin + '-' + (args.end - 1); - xhr.setRequestHeader('Range', 'bytes=' + rangeStr); - pendingRequest.expectedStatus = 206; - } else { - pendingRequest.expectedStatus = 200; - } - - var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData; - if (useMozChunkedLoading) { - xhr.responseType = 'moz-chunked-arraybuffer'; - pendingRequest.onProgressiveData = args.onProgressiveData; - pendingRequest.mozChunked = true; - } else { - xhr.responseType = 'arraybuffer'; - } - - if (args.onError) { - xhr.onerror = function(evt) { - args.onError(xhr.status); - }; - } - xhr.onreadystatechange = this.onStateChange.bind(this, xhrId); - xhr.onprogress = this.onProgress.bind(this, xhrId); - - pendingRequest.onHeadersReceived = args.onHeadersReceived; - pendingRequest.onDone = args.onDone; - pendingRequest.onError = args.onError; - pendingRequest.onProgress = args.onProgress; - - xhr.send(null); - - return xhrId; - }, - - onProgress: function NetworkManager_onProgress(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - if (pendingRequest.mozChunked) { - var chunk = getArrayBuffer(pendingRequest.xhr); - pendingRequest.onProgressiveData(chunk); - } - - var onProgress = pendingRequest.onProgress; - if (onProgress) { - onProgress(evt); - } - }, - - onStateChange: function NetworkManager_onStateChange(xhrId, evt) { - var pendingRequest = this.pendingRequests[xhrId]; - if (!pendingRequest) { - // Maybe abortRequest was called... - return; - } - - var xhr = pendingRequest.xhr; - if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) { - pendingRequest.onHeadersReceived(); - delete pendingRequest.onHeadersReceived; - } - - if (xhr.readyState !== 4) { - return; - } - - if (!(xhrId in this.pendingRequests)) { - // The XHR request might have been aborted in onHeadersReceived() - // callback, in which case we should abort request - return; - } - - delete this.pendingRequests[xhrId]; - - // success status == 0 can be on ftp, file and other protocols - if (xhr.status === 0 && this.isHttp) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - var xhrStatus = xhr.status || OK_RESPONSE; - - // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2: - // "A server MAY ignore the Range header". This means it's possible to - // get a 200 rather than a 206 response from a range request. - var ok_response_on_range_request = - xhrStatus === OK_RESPONSE && - pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE; - - if (!ok_response_on_range_request && - xhrStatus !== pendingRequest.expectedStatus) { - if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - return; - } - - this.loadedRequests[xhrId] = true; - - var chunk = getArrayBuffer(xhr); - if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { - var rangeHeader = xhr.getResponseHeader('Content-Range'); - var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); - var begin = parseInt(matches[1], 10); - pendingRequest.onDone({ - begin: begin, - chunk: chunk - }); - } else if (pendingRequest.onProgressiveData) { - pendingRequest.onDone(null); - } else if (chunk) { - pendingRequest.onDone({ - begin: 0, - chunk: chunk - }); - } else if (pendingRequest.onError) { - pendingRequest.onError(xhr.status); - } - }, - - hasPendingRequests: function NetworkManager_hasPendingRequests() { - for (var xhrId in this.pendingRequests) { - return true; - } - return false; - }, - - getRequestXhr: function NetworkManager_getXhr(xhrId) { - return this.pendingRequests[xhrId].xhr; - }, - - isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) { - return !!(this.pendingRequests[xhrId].onProgressiveData); - }, - - isPendingRequest: function NetworkManager_isPendingRequest(xhrId) { - return xhrId in this.pendingRequests; - }, - - isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) { - return xhrId in this.loadedRequests; - }, - - abortAllRequests: function NetworkManager_abortAllRequests() { - for (var xhrId in this.pendingRequests) { - this.abortRequest(xhrId | 0); - } - }, - - abortRequest: function NetworkManager_abortRequest(xhrId) { - var xhr = this.pendingRequests[xhrId].xhr; - delete this.pendingRequests[xhrId]; - xhr.abort(); - } - }; - - return NetworkManager; -})(); - -(function (root, factory) { - { - factory((root.pdfjsCoreNetwork = {})); - } -}(this, function (exports) { - exports.NetworkManager = NetworkManager; -})); - - -(function (root, factory) { - { - factory((root.pdfjsSharedGlobal = {})); - } -}(this, function (exports) { - - var globalScope = (typeof window !== 'undefined') ? window : - (typeof global !== 'undefined') ? global : - (typeof self !== 'undefined') ? self : this; - - var isWorker = (typeof window === 'undefined'); - - // The global PDFJS object exposes the API - // In production, it will be declared outside a global wrapper - // In development, it will be declared here - if (!globalScope.PDFJS) { - globalScope.PDFJS = {}; - } - - if (typeof pdfjsVersion !== 'undefined') { - globalScope.PDFJS.version = pdfjsVersion; - } - if (typeof pdfjsVersion !== 'undefined') { - globalScope.PDFJS.build = pdfjsBuild; - } - - globalScope.PDFJS.pdfBug = false; - - exports.globalScope = globalScope; - exports.isWorker = isWorker; - exports.PDFJS = globalScope.PDFJS; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreBidi = {}), root.pdfjsSharedGlobal); - } -}(this, function (exports, sharedGlobal) { - -var PDFJS = sharedGlobal.PDFJS; - -var bidi = PDFJS.bidi = (function bidiClosure() { - // Character types for symbols from 0000 to 00FF. - var baseTypes = [ - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', - 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', - 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN', - 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON', - 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', - 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', - 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', - 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', - 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', - 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L' - ]; - - // Character types for symbols from 0600 to 06FF - var arabicTypes = [ - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', - 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', - 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', - 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM', - 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', - 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL' - ]; - - function isOdd(i) { - return (i & 1) !== 0; - } - - function isEven(i) { - return (i & 1) === 0; - } - - function findUnequal(arr, start, value) { - for (var j = start, jj = arr.length; j < jj; ++j) { - if (arr[j] !== value) { - return j; - } - } - return j; - } - - function setValues(arr, start, end, value) { - for (var j = start; j < end; ++j) { - arr[j] = value; - } - } - - function reverseValues(arr, start, end) { - for (var i = start, j = end - 1; i < j; ++i, --j) { - var temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - } - - function createBidiText(str, isLTR, vertical) { - return { - str: str, - dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl')) - }; - } - - // These are used in bidi(), which is called frequently. We re-use them on - // each call to avoid unnecessary allocations. - var chars = []; - var types = []; - - function bidi(str, startLevel, vertical) { - var isLTR = true; - var strLength = str.length; - if (strLength === 0 || vertical) { - return createBidiText(str, isLTR, vertical); - } - - // Get types and fill arrays - chars.length = strLength; - types.length = strLength; - var numBidi = 0; - - var i, ii; - for (i = 0; i < strLength; ++i) { - chars[i] = str.charAt(i); - - var charCode = str.charCodeAt(i); - var charType = 'L'; - if (charCode <= 0x00ff) { - charType = baseTypes[charCode]; - } else if (0x0590 <= charCode && charCode <= 0x05f4) { - charType = 'R'; - } else if (0x0600 <= charCode && charCode <= 0x06ff) { - charType = arabicTypes[charCode & 0xff]; - } else if (0x0700 <= charCode && charCode <= 0x08AC) { - charType = 'AL'; - } - if (charType === 'R' || charType === 'AL' || charType === 'AN') { - numBidi++; - } - types[i] = charType; - } - - // Detect the bidi method - // - If there are no rtl characters then no bidi needed - // - If less than 30% chars are rtl then string is primarily ltr - // - If more than 30% chars are rtl then string is primarily rtl - if (numBidi === 0) { - isLTR = true; - return createBidiText(str, isLTR); - } - - if (startLevel === -1) { - if ((strLength / numBidi) < 0.3) { - isLTR = true; - startLevel = 0; - } else { - isLTR = false; - startLevel = 1; - } - } - - var levels = []; - for (i = 0; i < strLength; ++i) { - levels[i] = startLevel; - } - - /* - X1-X10: skip most of this, since we are NOT doing the embeddings. - */ - var e = (isOdd(startLevel) ? 'R' : 'L'); - var sor = e; - var eor = sor; - - /* - W1. Examine each non-spacing mark (NSM) in the level run, and change the - type of the NSM to the type of the previous character. If the NSM is at the - start of the level run, it will get the type of sor. - */ - var lastType = sor; - for (i = 0; i < strLength; ++i) { - if (types[i] === 'NSM') { - types[i] = lastType; - } else { - lastType = types[i]; - } - } - - /* - W2. Search backwards from each instance of a European number until the - first strong type (R, L, AL, or sor) is found. If an AL is found, change - the type of the European number to Arabic number. - */ - lastType = sor; - var t; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'EN') { - types[i] = (lastType === 'AL') ? 'AN' : 'EN'; - } else if (t === 'R' || t === 'L' || t === 'AL') { - lastType = t; - } - } - - /* - W3. Change all ALs to R. - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'AL') { - types[i] = 'R'; - } - } - - /* - W4. A single European separator between two European numbers changes to a - European number. A single common separator between two numbers of the same - type changes to that type: - */ - for (i = 1; i < strLength - 1; ++i) { - if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') { - types[i] = 'EN'; - } - if (types[i] === 'CS' && - (types[i - 1] === 'EN' || types[i - 1] === 'AN') && - types[i + 1] === types[i - 1]) { - types[i] = types[i - 1]; - } - } - - /* - W5. A sequence of European terminators adjacent to European numbers changes - to all European numbers: - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'EN') { - // do before - var j; - for (j = i - 1; j >= 0; --j) { - if (types[j] !== 'ET') { - break; - } - types[j] = 'EN'; - } - // do after - for (j = i + 1; j < strLength; --j) { - if (types[j] !== 'ET') { - break; - } - types[j] = 'EN'; - } - } - } - - /* - W6. Otherwise, separators and terminators change to Other Neutral: - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') { - types[i] = 'ON'; - } - } - - /* - W7. Search backwards from each instance of a European number until the - first strong type (R, L, or sor) is found. If an L is found, then change - the type of the European number to L. - */ - lastType = sor; - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (t === 'EN') { - types[i] = ((lastType === 'L') ? 'L' : 'EN'); - } else if (t === 'R' || t === 'L') { - lastType = t; - } - } - - /* - N1. A sequence of neutrals takes the direction of the surrounding strong - text if the text on both sides has the same direction. European and Arabic - numbers are treated as though they were R. Start-of-level-run (sor) and - end-of-level-run (eor) are used at level run boundaries. - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'ON') { - var end = findUnequal(types, i + 1, 'ON'); - var before = sor; - if (i > 0) { - before = types[i - 1]; - } - - var after = eor; - if (end + 1 < strLength) { - after = types[end + 1]; - } - if (before !== 'L') { - before = 'R'; - } - if (after !== 'L') { - after = 'R'; - } - if (before === after) { - setValues(types, i, end, before); - } - i = end - 1; // reset to end (-1 so next iteration is ok) - } - } - - /* - N2. Any remaining neutrals take the embedding direction. - */ - for (i = 0; i < strLength; ++i) { - if (types[i] === 'ON') { - types[i] = e; - } - } - - /* - I1. For all characters with an even (left-to-right) embedding direction, - those of type R go up one level and those of type AN or EN go up two - levels. - I2. For all characters with an odd (right-to-left) embedding direction, - those of type L, EN or AN go up one level. - */ - for (i = 0; i < strLength; ++i) { - t = types[i]; - if (isEven(levels[i])) { - if (t === 'R') { - levels[i] += 1; - } else if (t === 'AN' || t === 'EN') { - levels[i] += 2; - } - } else { // isOdd - if (t === 'L' || t === 'AN' || t === 'EN') { - levels[i] += 1; - } - } - } - - /* - L1. On each line, reset the embedding level of the following characters to - the paragraph embedding level: - - segment separators, - paragraph separators, - any sequence of whitespace characters preceding a segment separator or - paragraph separator, and any sequence of white space characters at the end - of the line. - */ - - // don't bother as text is only single line - - /* - L2. From the highest level found in the text to the lowest odd level on - each line, reverse any contiguous sequence of characters that are at that - level or higher. - */ - - // find highest level & lowest odd level - var highestLevel = -1; - var lowestOddLevel = 99; - var level; - for (i = 0, ii = levels.length; i < ii; ++i) { - level = levels[i]; - if (highestLevel < level) { - highestLevel = level; - } - if (lowestOddLevel > level && isOdd(level)) { - lowestOddLevel = level; - } - } - - // now reverse between those limits - for (level = highestLevel; level >= lowestOddLevel; --level) { - // find segments to reverse - var start = -1; - for (i = 0, ii = levels.length; i < ii; ++i) { - if (levels[i] < level) { - if (start >= 0) { - reverseValues(chars, start, i); - start = -1; - } - } else if (start < 0) { - start = i; - } - } - if (start >= 0) { - reverseValues(chars, start, levels.length); - } - } - - /* - L3. Combining marks applied to a right-to-left base character will at this - point precede their base character. If the rendering engine expects them to - follow the base characters in the final display process, then the ordering - of the marks and the base character must be reversed. - */ - - // don't bother for now - - /* - L4. A character that possesses the mirrored property as specified by - Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved - directionality of that character is R. - */ - - // don't mirror as characters are already mirrored in the pdf - - // Finally, return string - for (i = 0, ii = chars.length; i < ii; ++i) { - var ch = chars[i]; - if (ch === '<' || ch === '>') { - chars[i] = ''; - } - } - return createBidiText(chars.join(''), isLTR); - } - - return bidi; -})(); - -exports.bidi = bidi; -})); - - -(function (root, factory) { - { - factory((root.pdfjsSharedUtil = {}), root.pdfjsSharedGlobal); - } -}(this, function (exports, sharedGlobal) { - -var PDFJS = sharedGlobal.PDFJS; -var globalScope = sharedGlobal.globalScope; - -var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; - -var TextRenderingMode = { - FILL: 0, - STROKE: 1, - FILL_STROKE: 2, - INVISIBLE: 3, - FILL_ADD_TO_PATH: 4, - STROKE_ADD_TO_PATH: 5, - FILL_STROKE_ADD_TO_PATH: 6, - ADD_TO_PATH: 7, - FILL_STROKE_MASK: 3, - ADD_TO_PATH_FLAG: 4 -}; - -var ImageKind = { - GRAYSCALE_1BPP: 1, - RGB_24BPP: 2, - RGBA_32BPP: 3 -}; - -var AnnotationType = { - TEXT: 1, - LINK: 2, - FREETEXT: 3, - LINE: 4, - SQUARE: 5, - CIRCLE: 6, - POLYGON: 7, - POLYLINE: 8, - HIGHLIGHT: 9, - UNDERLINE: 10, - SQUIGGLY: 11, - STRIKEOUT: 12, - STAMP: 13, - CARET: 14, - INK: 15, - POPUP: 16, - FILEATTACHMENT: 17, - SOUND: 18, - MOVIE: 19, - WIDGET: 20, - SCREEN: 21, - PRINTERMARK: 22, - TRAPNET: 23, - WATERMARK: 24, - THREED: 25, - REDACT: 26 -}; - -var AnnotationFlag = { - INVISIBLE: 0x01, - HIDDEN: 0x02, - PRINT: 0x04, - NOZOOM: 0x08, - NOROTATE: 0x10, - NOVIEW: 0x20, - READONLY: 0x40, - LOCKED: 0x80, - TOGGLENOVIEW: 0x100, - LOCKEDCONTENTS: 0x200 -}; - -var AnnotationBorderStyleType = { - SOLID: 1, - DASHED: 2, - BEVELED: 3, - INSET: 4, - UNDERLINE: 5 -}; - -var StreamType = { - UNKNOWN: 0, - FLATE: 1, - LZW: 2, - DCT: 3, - JPX: 4, - JBIG: 5, - A85: 6, - AHX: 7, - CCF: 8, - RL: 9 -}; - -var FontType = { - UNKNOWN: 0, - TYPE1: 1, - TYPE1C: 2, - CIDFONTTYPE0: 3, - CIDFONTTYPE0C: 4, - TRUETYPE: 5, - CIDFONTTYPE2: 6, - TYPE3: 7, - OPENTYPE: 8, - TYPE0: 9, - MMTYPE1: 10 -}; - -PDFJS.VERBOSITY_LEVELS = { - errors: 0, - warnings: 1, - infos: 5 -}; - -// All the possible operations for an operator list. -var OPS = PDFJS.OPS = { - // Intentionally start from 1 so it is easy to spot bad operators that will be - // 0's. - dependency: 1, - setLineWidth: 2, - setLineCap: 3, - setLineJoin: 4, - setMiterLimit: 5, - setDash: 6, - setRenderingIntent: 7, - setFlatness: 8, - setGState: 9, - save: 10, - restore: 11, - transform: 12, - moveTo: 13, - lineTo: 14, - curveTo: 15, - curveTo2: 16, - curveTo3: 17, - closePath: 18, - rectangle: 19, - stroke: 20, - closeStroke: 21, - fill: 22, - eoFill: 23, - fillStroke: 24, - eoFillStroke: 25, - closeFillStroke: 26, - closeEOFillStroke: 27, - endPath: 28, - clip: 29, - eoClip: 30, - beginText: 31, - endText: 32, - setCharSpacing: 33, - setWordSpacing: 34, - setHScale: 35, - setLeading: 36, - setFont: 37, - setTextRenderingMode: 38, - setTextRise: 39, - moveText: 40, - setLeadingMoveText: 41, - setTextMatrix: 42, - nextLine: 43, - showText: 44, - showSpacedText: 45, - nextLineShowText: 46, - nextLineSetSpacingShowText: 47, - setCharWidth: 48, - setCharWidthAndBounds: 49, - setStrokeColorSpace: 50, - setFillColorSpace: 51, - setStrokeColor: 52, - setStrokeColorN: 53, - setFillColor: 54, - setFillColorN: 55, - setStrokeGray: 56, - setFillGray: 57, - setStrokeRGBColor: 58, - setFillRGBColor: 59, - setStrokeCMYKColor: 60, - setFillCMYKColor: 61, - shadingFill: 62, - beginInlineImage: 63, - beginImageData: 64, - endInlineImage: 65, - paintXObject: 66, - markPoint: 67, - markPointProps: 68, - beginMarkedContent: 69, - beginMarkedContentProps: 70, - endMarkedContent: 71, - beginCompat: 72, - endCompat: 73, - paintFormXObjectBegin: 74, - paintFormXObjectEnd: 75, - beginGroup: 76, - endGroup: 77, - beginAnnotations: 78, - endAnnotations: 79, - beginAnnotation: 80, - endAnnotation: 81, - paintJpegXObject: 82, - paintImageMaskXObject: 83, - paintImageMaskXObjectGroup: 84, - paintImageXObject: 85, - paintInlineImageXObject: 86, - paintInlineImageXObjectGroup: 87, - paintImageXObjectRepeat: 88, - paintImageMaskXObjectRepeat: 89, - paintSolidColorImageMask: 90, - constructPath: 91 -}; - -// A notice for devs. These are good for things that are helpful to devs, such -// as warning that Workers were disabled, which is important to devs but not -// end users. -function info(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) { - console.log('Info: ' + msg); - } -} - -// Non-fatal warnings. -function warn(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) { - console.log('Warning: ' + msg); - } -} - -// Deprecated API function -- treated as warnings. -function deprecated(details) { - warn('Deprecated API usage: ' + details); -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) { - console.log('Error: ' + msg); - console.log(backtrace()); - } - throw new Error(msg); -} - -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} - -function assert(cond, msg) { - if (!cond) { - error(msg); - } -} - -var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = { - unknown: 'unknown', - forms: 'forms', - javaScript: 'javaScript', - smask: 'smask', - shadingPattern: 'shadingPattern', - font: 'font' -}; - -// Combines two URLs. The baseUrl shall be absolute URL. If the url is an -// absolute URL, it will be returned as is. -function combineUrl(baseUrl, url) { - if (!url) { - return baseUrl; - } - return new URL(url, baseUrl).href; -} - -// Validates if URL is safe and allowed, e.g. to avoid XSS. -function isValidUrl(url, allowRelative) { - if (!url) { - return false; - } - // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1) - // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url); - if (!protocol) { - return allowRelative; - } - protocol = protocol[0].toLowerCase(); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - case 'tel': - return true; - default: - return false; - } -} -PDFJS.isValidUrl = isValidUrl; - -/** - * Adds various attributes (href, title, target, rel) to hyperlinks. - * @param {HTMLLinkElement} link - The link element. - * @param {Object} params - An object with the properties: - * @param {string} params.url - An absolute URL. - */ -function addLinkAttributes(link, params) { - var url = params && params.url; - link.href = link.title = (url ? removeNullCharacters(url) : ''); - - if (url) { - if (isExternalLinkTargetSet()) { - link.target = LinkTargetStringMap[PDFJS.externalLinkTarget]; - } - // Strip referrer from the URL. - link.rel = PDFJS.externalLinkRel; - } -} -PDFJS.addLinkAttributes = addLinkAttributes; - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} -PDFJS.shadow = shadow; - -var LinkTarget = PDFJS.LinkTarget = { - NONE: 0, // Default value. - SELF: 1, - BLANK: 2, - PARENT: 3, - TOP: 4, -}; -var LinkTargetStringMap = [ - '', - '_self', - '_blank', - '_parent', - '_top' -]; - -function isExternalLinkTargetSet() { - if (PDFJS.openExternalLinksInNewWindow) { - deprecated('PDFJS.openExternalLinksInNewWindow, please use ' + - '"PDFJS.externalLinkTarget = PDFJS.LinkTarget.BLANK" instead.'); - if (PDFJS.externalLinkTarget === LinkTarget.NONE) { - PDFJS.externalLinkTarget = LinkTarget.BLANK; - } - // Reset the deprecated parameter, to suppress further warnings. - PDFJS.openExternalLinksInNewWindow = false; - } - switch (PDFJS.externalLinkTarget) { - case LinkTarget.NONE: - return false; - case LinkTarget.SELF: - case LinkTarget.BLANK: - case LinkTarget.PARENT: - case LinkTarget.TOP: - return true; - } - warn('PDFJS.externalLinkTarget is invalid: ' + PDFJS.externalLinkTarget); - // Reset the external link target, to suppress further warnings. - PDFJS.externalLinkTarget = LinkTarget.NONE; - return false; -} -PDFJS.isExternalLinkTargetSet = isExternalLinkTargetSet; - -var PasswordResponses = PDFJS.PasswordResponses = { - NEED_PASSWORD: 1, - INCORRECT_PASSWORD: 2 -}; - -var PasswordException = (function PasswordExceptionClosure() { - function PasswordException(msg, code) { - this.name = 'PasswordException'; - this.message = msg; - this.code = code; - } - - PasswordException.prototype = new Error(); - PasswordException.constructor = PasswordException; - - return PasswordException; -})(); -PDFJS.PasswordException = PasswordException; - -var UnknownErrorException = (function UnknownErrorExceptionClosure() { - function UnknownErrorException(msg, details) { - this.name = 'UnknownErrorException'; - this.message = msg; - this.details = details; - } - - UnknownErrorException.prototype = new Error(); - UnknownErrorException.constructor = UnknownErrorException; - - return UnknownErrorException; -})(); -PDFJS.UnknownErrorException = UnknownErrorException; - -var InvalidPDFException = (function InvalidPDFExceptionClosure() { - function InvalidPDFException(msg) { - this.name = 'InvalidPDFException'; - this.message = msg; - } - - InvalidPDFException.prototype = new Error(); - InvalidPDFException.constructor = InvalidPDFException; - - return InvalidPDFException; -})(); -PDFJS.InvalidPDFException = InvalidPDFException; - -var MissingPDFException = (function MissingPDFExceptionClosure() { - function MissingPDFException(msg) { - this.name = 'MissingPDFException'; - this.message = msg; - } - - MissingPDFException.prototype = new Error(); - MissingPDFException.constructor = MissingPDFException; - - return MissingPDFException; -})(); -PDFJS.MissingPDFException = MissingPDFException; - -var UnexpectedResponseException = - (function UnexpectedResponseExceptionClosure() { - function UnexpectedResponseException(msg, status) { - this.name = 'UnexpectedResponseException'; - this.message = msg; - this.status = status; - } - - UnexpectedResponseException.prototype = new Error(); - UnexpectedResponseException.constructor = UnexpectedResponseException; - - return UnexpectedResponseException; -})(); -PDFJS.UnexpectedResponseException = UnexpectedResponseException; - -var NotImplementedException = (function NotImplementedExceptionClosure() { - function NotImplementedException(msg) { - this.message = msg; - } - - NotImplementedException.prototype = new Error(); - NotImplementedException.prototype.name = 'NotImplementedException'; - NotImplementedException.constructor = NotImplementedException; - - return NotImplementedException; -})(); - -var MissingDataException = (function MissingDataExceptionClosure() { - function MissingDataException(begin, end) { - this.begin = begin; - this.end = end; - this.message = 'Missing data [' + begin + ', ' + end + ')'; - } - - MissingDataException.prototype = new Error(); - MissingDataException.prototype.name = 'MissingDataException'; - MissingDataException.constructor = MissingDataException; - - return MissingDataException; -})(); - -var XRefParseException = (function XRefParseExceptionClosure() { - function XRefParseException(msg) { - this.message = msg; - } - - XRefParseException.prototype = new Error(); - XRefParseException.prototype.name = 'XRefParseException'; - XRefParseException.constructor = XRefParseException; - - return XRefParseException; -})(); - -var NullCharactersRegExp = /\x00/g; - -function removeNullCharacters(str) { - if (typeof str !== 'string') { - warn('The argument for removeNullCharacters must be a string.'); - return str; - } - return str.replace(NullCharactersRegExp, ''); -} -PDFJS.removeNullCharacters = removeNullCharacters; - -function bytesToString(bytes) { - assert(bytes !== null && typeof bytes === 'object' && - bytes.length !== undefined, 'Invalid argument for bytesToString'); - var length = bytes.length; - var MAX_ARGUMENT_COUNT = 8192; - if (length < MAX_ARGUMENT_COUNT) { - return String.fromCharCode.apply(null, bytes); - } - var strBuf = []; - for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) { - var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); - var chunk = bytes.subarray(i, chunkEnd); - strBuf.push(String.fromCharCode.apply(null, chunk)); - } - return strBuf.join(''); -} - -function stringToBytes(str) { - assert(typeof str === 'string', 'Invalid argument for stringToBytes'); - var length = str.length; - var bytes = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - bytes[i] = str.charCodeAt(i) & 0xFF; - } - return bytes; -} - -function string32(value) { - return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff, - (value >> 8) & 0xff, value & 0xff); -} - -function log2(x) { - var n = 1, i = 0; - while (x > n) { - n <<= 1; - i++; - } - return i; -} - -function readInt8(data, start) { - return (data[start] << 24) >> 24; -} - -function readUint16(data, offset) { - return (data[offset] << 8) | data[offset + 1]; -} - -function readUint32(data, offset) { - return ((data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]) >>> 0; -} - -// Lazy test the endianness of the platform -// NOTE: This will be 'true' for simulated TypedArrays -function isLittleEndian() { - var buffer8 = new Uint8Array(2); - buffer8[0] = 1; - var buffer16 = new Uint16Array(buffer8.buffer); - return (buffer16[0] === 1); -} - -Object.defineProperty(PDFJS, 'isLittleEndian', { - configurable: true, - get: function PDFJS_isLittleEndian() { - return shadow(PDFJS, 'isLittleEndian', isLittleEndian()); - } -}); - - // Lazy test if the userAgent support CanvasTypedArrays -function hasCanvasTypedArrays() { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - var imageData = ctx.createImageData(1, 1); - return (typeof imageData.data.buffer !== 'undefined'); -} - -Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', { - configurable: true, - get: function PDFJS_hasCanvasTypedArrays() { - return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays()); - } -}); - -var Uint32ArrayView = (function Uint32ArrayViewClosure() { - - function Uint32ArrayView(buffer, length) { - this.buffer = buffer; - this.byteLength = buffer.length; - this.length = length === undefined ? (this.byteLength >> 2) : length; - ensureUint32ArrayViewProps(this.length); - } - Uint32ArrayView.prototype = Object.create(null); - - var uint32ArrayViewSetters = 0; - function createUint32ArrayProp(index) { - return { - get: function () { - var buffer = this.buffer, offset = index << 2; - return (buffer[offset] | (buffer[offset + 1] << 8) | - (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0; - }, - set: function (value) { - var buffer = this.buffer, offset = index << 2; - buffer[offset] = value & 255; - buffer[offset + 1] = (value >> 8) & 255; - buffer[offset + 2] = (value >> 16) & 255; - buffer[offset + 3] = (value >>> 24) & 255; - } - }; - } - - function ensureUint32ArrayViewProps(length) { - while (uint32ArrayViewSetters < length) { - Object.defineProperty(Uint32ArrayView.prototype, - uint32ArrayViewSetters, - createUint32ArrayProp(uint32ArrayViewSetters)); - uint32ArrayViewSetters++; - } - } - - return Uint32ArrayView; -})(); - -exports.Uint32ArrayView = Uint32ArrayView; - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = PDFJS.Util = (function UtilClosure() { - function Util() {} - - var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')']; - - // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids - // creating many intermediate strings. - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - rgbBuf[1] = r; - rgbBuf[3] = g; - rgbBuf[5] = b; - return rgbBuf.join(''); - }; - - // Concatenates two transformation matrices together and returns the result. - Util.transform = function Util_transform(m1, m2) { - return [ - m1[0] * m2[0] + m1[2] * m2[1], - m1[1] * m2[0] + m1[3] * m2[1], - m1[0] * m2[2] + m1[2] * m2[3], - m1[1] * m2[2] + m1[3] * m2[3], - m1[0] * m2[4] + m1[2] * m2[5] + m1[4], - m1[1] * m2[4] + m1[3] * m2[5] + m1[5] - ]; - }; - - // For 2d affine transforms - Util.applyTransform = function Util_applyTransform(p, m) { - var xt = p[0] * m[0] + p[1] * m[2] + m[4]; - var yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - }; - - Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { - var d = m[0] * m[3] - m[1] * m[2]; - var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - }; - - // Applies the transform to the rectangle and finds the minimum axially - // aligned bounding box. - Util.getAxialAlignedBoundingBox = - function Util_getAxialAlignedBoundingBox(r, m) { - - var p1 = Util.applyTransform(r, m); - var p2 = Util.applyTransform(r.slice(2, 4), m); - var p3 = Util.applyTransform([r[0], r[3]], m); - var p4 = Util.applyTransform([r[2], r[1]], m); - return [ - Math.min(p1[0], p2[0], p3[0], p4[0]), - Math.min(p1[1], p2[1], p3[1], p4[1]), - Math.max(p1[0], p2[0], p3[0], p4[0]), - Math.max(p1[1], p2[1], p3[1], p4[1]) - ]; - }; - - Util.inverseTransform = function Util_inverseTransform(m) { - var d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, - (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - }; - - // Apply a generic 3d matrix M on a 3-vector v: - // | a b c | | X | - // | d e f | x | Y | - // | g h i | | Z | - // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], - // with v as [X,Y,Z] - Util.apply3dTransform = function Util_apply3dTransform(m, v) { - return [ - m[0] * v[0] + m[1] * v[1] + m[2] * v[2], - m[3] * v[0] + m[4] * v[1] + m[5] * v[2], - m[6] * v[0] + m[7] * v[1] + m[8] * v[2] - ]; - }; - - // This calculation uses Singular Value Decomposition. - // The SVD can be represented with formula A = USV. We are interested in the - // matrix S here because it represents the scale values. - Util.singularValueDecompose2dScale = - function Util_singularValueDecompose2dScale(m) { - - var transpose = [m[0], m[2], m[1], m[3]]; - - // Multiply matrix m with its transpose. - var a = m[0] * transpose[0] + m[1] * transpose[2]; - var b = m[0] * transpose[1] + m[1] * transpose[3]; - var c = m[2] * transpose[0] + m[3] * transpose[2]; - var d = m[2] * transpose[1] + m[3] * transpose[3]; - - // Solve the second degree polynomial to get roots. - var first = (a + d) / 2; - var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2; - var sx = first + second || 1; - var sy = first - second || 1; - - // Scale values are the square roots of the eigenvalues. - return [Math.sqrt(sx), Math.sqrt(sy)]; - }; - - // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) - // For coordinate systems whose origin lies in the bottom-left, this - // means normalization to (BL,TR) ordering. For systems with origin in the - // top-left, this means (TL,BR) ordering. - Util.normalizeRect = function Util_normalizeRect(rect) { - var r = rect.slice(0); // clone rect - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - }; - - // Returns a rectangle [x1, y1, x2, y2] corresponding to the - // intersection of rect1 and rect2. If no intersection, returns 'false' - // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] - Util.intersect = function Util_intersect(rect1, rect2) { - function compare(a, b) { - return a - b; - } - - // Order points along the axes - var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), - orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), - result = []; - - rect1 = Util.normalizeRect(rect1); - rect2 = Util.normalizeRect(rect2); - - // X: first and second points belong to different rectangles? - if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || - (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { - // Intersection must be between second and third points - result[0] = orderedX[1]; - result[2] = orderedX[2]; - } else { - return false; - } - - // Y: first and second points belong to different rectangles? - if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || - (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { - // Intersection must be between second and third points - result[1] = orderedY[1]; - result[3] = orderedY[2]; - } else { - return false; - } - - return result; - }; - - Util.sign = function Util_sign(num) { - return num < 0 ? -1 : 1; - }; - - var ROMAN_NUMBER_MAP = [ - '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', - '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', - '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' - ]; - /** - * Converts positive integers to (upper case) Roman numerals. - * @param {integer} number - The number that should be converted. - * @param {boolean} lowerCase - Indicates if the result should be converted - * to lower case letters. The default is false. - * @return {string} The resulting Roman number. - */ - Util.toRoman = function Util_toRoman(number, lowerCase) { - assert(isInt(number) && number > 0, - 'The number should be a positive integer.'); - var pos, romanBuf = []; - // Thousands - while (number >= 1000) { - number -= 1000; - romanBuf.push('M'); - } - // Hundreds - pos = (number / 100) | 0; - number %= 100; - romanBuf.push(ROMAN_NUMBER_MAP[pos]); - // Tens - pos = (number / 10) | 0; - number %= 10; - romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]); - // Ones - romanBuf.push(ROMAN_NUMBER_MAP[20 + number]); - - var romanStr = romanBuf.join(''); - return (lowerCase ? romanStr.toLowerCase() : romanStr); - }; - - Util.appendToArray = function Util_appendToArray(arr1, arr2) { - Array.prototype.push.apply(arr1, arr2); - }; - - Util.prependToArray = function Util_prependToArray(arr1, arr2) { - Array.prototype.unshift.apply(arr1, arr2); - }; - - Util.extendObj = function extendObj(obj1, obj2) { - for (var key in obj2) { - obj1[key] = obj2[key]; - } - }; - - Util.getInheritableProperty = function Util_getInheritableProperty(dict, - name) { - while (dict && !dict.has(name)) { - dict = dict.get('Parent'); - } - if (!dict) { - return null; - } - return dict.get(name); - }; - - Util.inherit = function Util_inherit(sub, base, prototype) { - sub.prototype = Object.create(base.prototype); - sub.prototype.constructor = sub; - for (var prop in prototype) { - sub.prototype[prop] = prototype[prop]; - } - }; - - Util.loadScript = function Util_loadScript(src, callback) { - var script = document.createElement('script'); - var loaded = false; - script.setAttribute('src', src); - if (callback) { - script.onload = function() { - if (!loaded) { - callback(); - } - loaded = true; - }; - } - document.getElementsByTagName('head')[0].appendChild(script); - }; - - return Util; -})(); - -/** - * PDF page viewport created based on scale, rotation and offset. - * @class - * @alias PDFJS.PageViewport - */ -var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() { - /** - * @constructor - * @private - * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates. - * @param scale {number} scale of the viewport. - * @param rotation {number} rotations of the viewport in degrees. - * @param offsetX {number} offset X - * @param offsetY {number} offset Y - * @param dontFlip {boolean} if true, axis Y will not be flipped. - */ - function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) { - this.viewBox = viewBox; - this.scale = scale; - this.rotation = rotation; - this.offsetX = offsetX; - this.offsetY = offsetY; - - // creating transform to convert pdf coordinate system to the normal - // canvas like coordinates taking in account scale and rotation - var centerX = (viewBox[2] + viewBox[0]) / 2; - var centerY = (viewBox[3] + viewBox[1]) / 2; - var rotateA, rotateB, rotateC, rotateD; - rotation = rotation % 360; - rotation = rotation < 0 ? rotation + 360 : rotation; - switch (rotation) { - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - //case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - - if (dontFlip) { - rotateC = -rotateC; rotateD = -rotateD; - } - - var offsetCanvasX, offsetCanvasY; - var width, height; - if (rotateA === 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = Math.abs(viewBox[3] - viewBox[1]) * scale; - height = Math.abs(viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = Math.abs(viewBox[2] - viewBox[0]) * scale; - height = Math.abs(viewBox[3] - viewBox[1]) * scale; - } - // creating transform for the following operations: - // translate(-centerX, -centerY), rotate and flip vertically, - // scale, and translate(offsetCanvasX, offsetCanvasY) - this.transform = [ - rotateA * scale, - rotateB * scale, - rotateC * scale, - rotateD * scale, - offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, - offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY - ]; - - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ { - /** - * Clones viewport with additional properties. - * @param args {Object} (optional) If specified, may contain the 'scale' or - * 'rotation' properties to override the corresponding properties in - * the cloned viewport. - * @returns {PDFJS.PageViewport} Cloned viewport. - */ - clone: function PageViewPort_clone(args) { - args = args || {}; - var scale = 'scale' in args ? args.scale : this.scale; - var rotation = 'rotation' in args ? args.rotation : this.rotation; - return new PageViewport(this.viewBox.slice(), scale, rotation, - this.offsetX, this.offsetY, args.dontFlip); - }, - /** - * Converts PDF point to the viewport coordinates. For examples, useful for - * converting PDF location into canvas pixel coordinates. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the viewport coordinate space. - * @see {@link convertToPdfPoint} - * @see {@link convertToViewportRectangle} - */ - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - /** - * Converts PDF rectangle to the viewport coordinates. - * @param rect {Array} xMin, yMin, xMax and yMax coordinates. - * @returns {Array} Contains corresponding coordinates of the rectangle - * in the viewport coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToViewportRectangle: - function PageViewport_convertToViewportRectangle(rect) { - var tl = Util.applyTransform([rect[0], rect[1]], this.transform); - var br = Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; - }, - /** - * Converts viewport coordinates to the PDF location. For examples, useful - * for converting canvas pixel location into PDF one. - * @param x {number} X coordinate. - * @param y {number} Y coordinate. - * @returns {Object} Object that contains 'x' and 'y' properties of the - * point in the PDF coordinate space. - * @see {@link convertToViewportPoint} - */ - convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { - return Util.applyInverseTransform([x, y], this.transform); - } - }; - return PageViewport; -})(); - -var PDFStringTranslateTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, - 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, - 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, - 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC -]; - -function stringToPDFString(str) { - var i, n = str.length, strBuf = []; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) { - strBuf.push(String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1))); - } - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); - } - } - return strBuf.join(''); -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -function utf8StringToString(str) { - return unescape(encodeURIComponent(str)); -} - -function isEmptyObj(obj) { - for (var key in obj) { - return false; - } - return true; -} - -function isBool(v) { - return typeof v === 'boolean'; -} - -function isInt(v) { - return typeof v === 'number' && ((v | 0) === v); -} - -function isNum(v) { - return typeof v === 'number'; -} - -function isString(v) { - return typeof v === 'string'; -} - -function isArray(v) { - return v instanceof Array; -} - -function isArrayBuffer(v) { - return typeof v === 'object' && v !== null && v.byteLength !== undefined; -} - -/** - * Promise Capability object. - * - * @typedef {Object} PromiseCapability - * @property {Promise} promise - A promise object. - * @property {function} resolve - Fullfills the promise. - * @property {function} reject - Rejects the promise. - */ - -/** - * Creates a promise capability object. - * @alias PDFJS.createPromiseCapability - * - * @return {PromiseCapability} A capability object contains: - * - a Promise, resolve and reject methods. - */ -function createPromiseCapability() { - var capability = {}; - capability.promise = new Promise(function (resolve, reject) { - capability.resolve = resolve; - capability.reject = reject; - }); - return capability; -} - -PDFJS.createPromiseCapability = createPromiseCapability; - -/** - * Polyfill for Promises: - * The following promise implementation tries to generally implement the - * Promise/A+ spec. Some notable differences from other promise libaries are: - * - There currently isn't a seperate deferred and promise object. - * - Unhandled rejections eventually show an error if they aren't handled. - * - * Based off of the work in: - * https://bugzilla.mozilla.org/show_bug.cgi?id=810490 - */ -(function PromiseClosure() { - if (globalScope.Promise) { - // Promises existing in the DOM/Worker, checking presence of all/resolve - if (typeof globalScope.Promise.all !== 'function') { - globalScope.Promise.all = function (iterable) { - var count = 0, results = [], resolve, reject; - var promise = new globalScope.Promise(function (resolve_, reject_) { - resolve = resolve_; - reject = reject_; - }); - iterable.forEach(function (p, i) { - count++; - p.then(function (result) { - results[i] = result; - count--; - if (count === 0) { - resolve(results); - } - }, reject); - }); - if (count === 0) { - resolve(results); - } - return promise; - }; - } - if (typeof globalScope.Promise.resolve !== 'function') { - globalScope.Promise.resolve = function (value) { - return new globalScope.Promise(function (resolve) { resolve(value); }); - }; - } - if (typeof globalScope.Promise.reject !== 'function') { - globalScope.Promise.reject = function (reason) { - return new globalScope.Promise(function (resolve, reject) { - reject(reason); - }); - }; - } - if (typeof globalScope.Promise.prototype.catch !== 'function') { - globalScope.Promise.prototype.catch = function (onReject) { - return globalScope.Promise.prototype.then(undefined, onReject); - }; - } - return; - } - var STATUS_PENDING = 0; - var STATUS_RESOLVED = 1; - var STATUS_REJECTED = 2; - - // In an attempt to avoid silent exceptions, unhandled rejections are - // tracked and if they aren't handled in a certain amount of time an - // error is logged. - var REJECTION_TIMEOUT = 500; - - var HandlerManager = { - handlers: [], - running: false, - unhandledRejections: [], - pendingRejectionCheck: false, - - scheduleHandlers: function scheduleHandlers(promise) { - if (promise._status === STATUS_PENDING) { - return; - } - - this.handlers = this.handlers.concat(promise._handlers); - promise._handlers = []; - - if (this.running) { - return; - } - this.running = true; - - setTimeout(this.runHandlers.bind(this), 0); - }, - - runHandlers: function runHandlers() { - var RUN_TIMEOUT = 1; // ms - var timeoutAt = Date.now() + RUN_TIMEOUT; - while (this.handlers.length > 0) { - var handler = this.handlers.shift(); - - var nextStatus = handler.thisPromise._status; - var nextValue = handler.thisPromise._value; - - try { - if (nextStatus === STATUS_RESOLVED) { - if (typeof handler.onResolve === 'function') { - nextValue = handler.onResolve(nextValue); - } - } else if (typeof handler.onReject === 'function') { - nextValue = handler.onReject(nextValue); - nextStatus = STATUS_RESOLVED; - - if (handler.thisPromise._unhandledRejection) { - this.removeUnhandeledRejection(handler.thisPromise); - } - } - } catch (ex) { - nextStatus = STATUS_REJECTED; - nextValue = ex; - } - - handler.nextPromise._updateStatus(nextStatus, nextValue); - if (Date.now() >= timeoutAt) { - break; - } - } - - if (this.handlers.length > 0) { - setTimeout(this.runHandlers.bind(this), 0); - return; - } - - this.running = false; - }, - - addUnhandledRejection: function addUnhandledRejection(promise) { - this.unhandledRejections.push({ - promise: promise, - time: Date.now() - }); - this.scheduleRejectionCheck(); - }, - - removeUnhandeledRejection: function removeUnhandeledRejection(promise) { - promise._unhandledRejection = false; - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (this.unhandledRejections[i].promise === promise) { - this.unhandledRejections.splice(i); - i--; - } - } - }, - - scheduleRejectionCheck: function scheduleRejectionCheck() { - if (this.pendingRejectionCheck) { - return; - } - this.pendingRejectionCheck = true; - setTimeout(function rejectionCheck() { - this.pendingRejectionCheck = false; - var now = Date.now(); - for (var i = 0; i < this.unhandledRejections.length; i++) { - if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) { - var unhandled = this.unhandledRejections[i].promise._value; - var msg = 'Unhandled rejection: ' + unhandled; - if (unhandled.stack) { - msg += '\n' + unhandled.stack; - } - warn(msg); - this.unhandledRejections.splice(i); - i--; - } - } - if (this.unhandledRejections.length) { - this.scheduleRejectionCheck(); - } - }.bind(this), REJECTION_TIMEOUT); - } - }; - - function Promise(resolver) { - this._status = STATUS_PENDING; - this._handlers = []; - try { - resolver.call(this, this._resolve.bind(this), this._reject.bind(this)); - } catch (e) { - this._reject(e); - } - } - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {array} array of data and/or promises to wait for. - * @return {Promise} New dependant promise. - */ - Promise.all = function Promise_all(promises) { - var resolveAll, rejectAll; - var deferred = new Promise(function (resolve, reject) { - resolveAll = resolve; - rejectAll = reject; - }); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - resolveAll(results); - return deferred; - } - function reject(reason) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results = []; - rejectAll(reason); - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - var resolve = (function(i) { - return function(value) { - if (deferred._status === STATUS_REJECTED) { - return; - } - results[i] = value; - unresolved--; - if (unresolved === 0) { - resolveAll(results); - } - }; - })(i); - if (Promise.isPromise(promise)) { - promise.then(resolve, reject); - } else { - resolve(promise); - } - } - return deferred; - }; - - /** - * Checks if the value is likely a promise (has a 'then' function). - * @return {boolean} true if value is thenable - */ - Promise.isPromise = function Promise_isPromise(value) { - return value && typeof value.then === 'function'; - }; - - /** - * Creates resolved promise - * @param value resolve value - * @returns {Promise} - */ - Promise.resolve = function Promise_resolve(value) { - return new Promise(function (resolve) { resolve(value); }); - }; - - /** - * Creates rejected promise - * @param reason rejection value - * @returns {Promise} - */ - Promise.reject = function Promise_reject(reason) { - return new Promise(function (resolve, reject) { reject(reason); }); - }; - - Promise.prototype = { - _status: null, - _value: null, - _handlers: null, - _unhandledRejection: null, - - _updateStatus: function Promise__updateStatus(status, value) { - if (this._status === STATUS_RESOLVED || - this._status === STATUS_REJECTED) { - return; - } - - if (status === STATUS_RESOLVED && - Promise.isPromise(value)) { - value.then(this._updateStatus.bind(this, STATUS_RESOLVED), - this._updateStatus.bind(this, STATUS_REJECTED)); - return; - } - - this._status = status; - this._value = value; - - if (status === STATUS_REJECTED && this._handlers.length === 0) { - this._unhandledRejection = true; - HandlerManager.addUnhandledRejection(this); - } - - HandlerManager.scheduleHandlers(this); - }, - - _resolve: function Promise_resolve(value) { - this._updateStatus(STATUS_RESOLVED, value); - }, - - _reject: function Promise_reject(reason) { - this._updateStatus(STATUS_REJECTED, reason); - }, - - then: function Promise_then(onResolve, onReject) { - var nextPromise = new Promise(function (resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }); - this._handlers.push({ - thisPromise: this, - onResolve: onResolve, - onReject: onReject, - nextPromise: nextPromise - }); - HandlerManager.scheduleHandlers(this); - return nextPromise; - }, - - catch: function Promise_catch(onReject) { - return this.then(undefined, onReject); - } - }; - - globalScope.Promise = Promise; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) { - str += pad; - } - return str; - } - function StatTimer() { - this.started = {}; - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) { - return; - } - if (name in this.started) { - warn('Timer is already running for ' + name); - } - this.started[name] = Date.now(); - }, - timeEnd: function StatTimer_timeEnd(name) { - if (!this.enabled) { - return; - } - if (!(name in this.started)) { - warn('Timer has not been started for ' + name); - } - this.times.push({ - 'name': name, - 'start': this.started[name], - 'end': Date.now() - }); - // Remove timer from started so it can be called again. - delete this.started[name]; - }, - toString: function StatTimer_toString() { - var i, ii; - var times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) { - longest = name.length; - } - } - for (i = 0, ii = times.length; i < ii; ++i) { - var span = times[i]; - var duration = span.end - span.start; - out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; - } - return out; - } - }; - return StatTimer; -})(); - -PDFJS.createBlob = function createBlob(data, contentType) { - if (typeof Blob !== 'undefined') { - return new Blob([data], { type: contentType }); - } - // Blob builder is deprecated in FF14 and removed in FF18. - var bb = new MozBlobBuilder(); - bb.append(data); - return bb.getBlob(contentType); -}; - -PDFJS.createObjectURL = (function createObjectURLClosure() { - // Blob/createObjectURL is not available, falling back to data schema. - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - return function createObjectURL(data, contentType) { - if (!PDFJS.disableCreateObjectURL && - typeof URL !== 'undefined' && URL.createObjectURL) { - var blob = PDFJS.createBlob(data, contentType); - return URL.createObjectURL(blob); - } - - var buffer = 'data:' + contentType + ';base64,'; - for (var i = 0, ii = data.length; i < ii; i += 3) { - var b1 = data[i] & 0xFF; - var b2 = data[i + 1] & 0xFF; - var b3 = data[i + 2] & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < ii ? (b3 & 0x3F) : 64; - buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4]; - } - return buffer; - }; -})(); - -function MessageHandler(sourceName, targetName, comObj) { - this.sourceName = sourceName; - this.targetName = targetName; - this.comObj = comObj; - this.callbackIndex = 1; - this.postMessageTransfers = true; - var callbacksCapabilities = this.callbacksCapabilities = {}; - var ah = this.actionHandler = {}; - - this._onComObjOnMessage = function messageHandlerComObjOnMessage(event) { - var data = event.data; - if (data.targetName !== this.sourceName) { - return; - } - if (data.isReply) { - var callbackId = data.callbackId; - if (data.callbackId in callbacksCapabilities) { - var callback = callbacksCapabilities[callbackId]; - delete callbacksCapabilities[callbackId]; - if ('error' in data) { - callback.reject(data.error); - } else { - callback.resolve(data.data); - } - } else { - error('Cannot resolve callback ' + callbackId); - } - } else if (data.action in ah) { - var action = ah[data.action]; - if (data.callbackId) { - var sourceName = this.sourceName; - var targetName = data.sourceName; - Promise.resolve().then(function () { - return action[0].call(action[1], data.data); - }).then(function (result) { - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - data: result - }); - }, function (reason) { - if (reason instanceof Error) { - // Serialize error to avoid "DataCloneError" - reason = reason + ''; - } - comObj.postMessage({ - sourceName: sourceName, - targetName: targetName, - isReply: true, - callbackId: data.callbackId, - error: reason - }); - }); - } else { - action[0].call(action[1], data.data); - } - } else { - error('Unknown action from worker: ' + data.action); - } - }.bind(this); - comObj.addEventListener('message', this._onComObjOnMessage); -} - -MessageHandler.prototype = { - on: function messageHandlerOn(actionName, handler, scope) { - var ah = this.actionHandler; - if (ah[actionName]) { - error('There is already an actionName called "' + actionName + '"'); - } - ah[actionName] = [handler, scope]; - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers - */ - send: function messageHandlerSend(actionName, data, transfers) { - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data - }; - this.postMessage(message, transfers); - }, - /** - * Sends a message to the comObj to invoke the action with the supplied data. - * Expects that other side will callback with the response. - * @param {String} actionName Action to call. - * @param {JSON} data JSON data to send. - * @param {Array} [transfers] Optional list of transfers/ArrayBuffers. - * @returns {Promise} Promise to be resolved with response data. - */ - sendWithPromise: - function messageHandlerSendWithPromise(actionName, data, transfers) { - var callbackId = this.callbackIndex++; - var message = { - sourceName: this.sourceName, - targetName: this.targetName, - action: actionName, - data: data, - callbackId: callbackId - }; - var capability = createPromiseCapability(); - this.callbacksCapabilities[callbackId] = capability; - try { - this.postMessage(message, transfers); - } catch (e) { - capability.reject(e); - } - return capability.promise; - }, - /** - * Sends raw message to the comObj. - * @private - * @param message {Object} Raw message. - * @param transfers List of transfers/ArrayBuffers, or undefined. - */ - postMessage: function (message, transfers) { - if (transfers && this.postMessageTransfers) { - this.comObj.postMessage(message, transfers); - } else { - this.comObj.postMessage(message); - } - }, - - destroy: function () { - this.comObj.removeEventListener('message', this._onComObjOnMessage); - } -}; - -function loadJpegStream(id, imageUrl, objs) { - var img = new Image(); - img.onload = (function loadJpegStream_onloadClosure() { - objs.resolve(id, img); - }); - img.onerror = (function loadJpegStream_onerrorClosure() { - objs.resolve(id, null); - warn('Error during JPEG image loading'); - }); - img.src = imageUrl; -} - - // Polyfill from https://github.com/Polymer/URL -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ -(function checkURLConstructor(scope) { - /* jshint ignore:start */ - - // feature detect for URL constructor - var hasWorkingUrl = false; - try { - if (typeof URL === 'function' && - typeof URL.prototype === 'object' && - ('origin' in URL.prototype)) { - var u = new URL('b', 'http://a'); - u.pathname = 'c%20d'; - hasWorkingUrl = u.href === 'http://a/c%20d'; - } - } catch(e) { } - - if (hasWorkingUrl) - return; - - var relative = Object.create(null); - relative['ftp'] = 21; - relative['file'] = 0; - relative['gopher'] = 70; - relative['http'] = 80; - relative['https'] = 443; - relative['ws'] = 80; - relative['wss'] = 443; - - var relativePathDotMapping = Object.create(null); - relativePathDotMapping['%2e'] = '.'; - relativePathDotMapping['.%2e'] = '..'; - relativePathDotMapping['%2e.'] = '..'; - relativePathDotMapping['%2e%2e'] = '..'; - - function isRelativeScheme(scheme) { - return relative[scheme] !== undefined; - } - - function invalid() { - clear.call(this); - this._isInvalid = true; - } - - function IDNAToASCII(h) { - if ('' == h) { - invalid.call(this) - } - // XXX - return h.toLowerCase() - } - - function percentEscape(c) { - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ? ` - [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - function percentEscapeQuery(c) { - // XXX This actually needs to encode c using encoding and then - // convert the bytes one-by-one. - - var unicode = c.charCodeAt(0); - if (unicode > 0x20 && - unicode < 0x7F && - // " # < > ` (do not escape '?') - [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1 - ) { - return c; - } - return encodeURIComponent(c); - } - - var EOF = undefined, - ALPHA = /[a-zA-Z]/, - ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/; - - function parse(input, stateOverride, base) { - function err(message) { - errors.push(message) - } - - var state = stateOverride || 'scheme start', - cursor = 0, - buffer = '', - seenAt = false, - seenBracket = false, - errors = []; - - loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) { - var c = input[cursor]; - switch (state) { - case 'scheme start': - if (c && ALPHA.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - state = 'scheme'; - } else if (!stateOverride) { - buffer = ''; - state = 'no scheme'; - continue; - } else { - err('Invalid scheme.'); - break loop; - } - break; - - case 'scheme': - if (c && ALPHANUMERIC.test(c)) { - buffer += c.toLowerCase(); // ASCII-safe - } else if (':' == c) { - this._scheme = buffer; - buffer = ''; - if (stateOverride) { - break loop; - } - if (isRelativeScheme(this._scheme)) { - this._isRelative = true; - } - if ('file' == this._scheme) { - state = 'relative'; - } else if (this._isRelative && base && base._scheme == this._scheme) { - state = 'relative or authority'; - } else if (this._isRelative) { - state = 'authority first slash'; - } else { - state = 'scheme data'; - } - } else if (!stateOverride) { - buffer = ''; - cursor = 0; - state = 'no scheme'; - continue; - } else if (EOF == c) { - break loop; - } else { - err('Code point not allowed in scheme: ' + c) - break loop; - } - break; - - case 'scheme data': - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else { - // XXX error handling - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._schemeData += percentEscape(c); - } - } - break; - - case 'no scheme': - if (!base || !(isRelativeScheme(base._scheme))) { - err('Missing scheme.'); - invalid.call(this); - } else { - state = 'relative'; - continue; - } - break; - - case 'relative or authority': - if ('/' == c && '/' == input[cursor+1]) { - state = 'authority ignore slashes'; - } else { - err('Expected /, got: ' + c); - state = 'relative'; - continue - } - break; - - case 'relative': - this._isRelative = true; - if ('file' != this._scheme) - this._scheme = base._scheme; - if (EOF == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._username = base._username; - this._password = base._password; - break loop; - } else if ('/' == c || '\\' == c) { - if ('\\' == c) - err('\\ is an invalid code point.'); - state = 'relative slash'; - } else if ('?' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = '?'; - this._username = base._username; - this._password = base._password; - state = 'query'; - } else if ('#' == c) { - this._host = base._host; - this._port = base._port; - this._path = base._path.slice(); - this._query = base._query; - this._fragment = '#'; - this._username = base._username; - this._password = base._password; - state = 'fragment'; - } else { - var nextC = input[cursor+1] - var nextNextC = input[cursor+2] - if ( - 'file' != this._scheme || !ALPHA.test(c) || - (nextC != ':' && nextC != '|') || - (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - this._path = base._path.slice(); - this._path.pop(); - } - state = 'relative path'; - continue; - } - break; - - case 'relative slash': - if ('/' == c || '\\' == c) { - if ('\\' == c) { - err('\\ is an invalid code point.'); - } - if ('file' == this._scheme) { - state = 'file host'; - } else { - state = 'authority ignore slashes'; - } - } else { - if ('file' != this._scheme) { - this._host = base._host; - this._port = base._port; - this._username = base._username; - this._password = base._password; - } - state = 'relative path'; - continue; - } - break; - - case 'authority first slash': - if ('/' == c) { - state = 'authority second slash'; - } else { - err("Expected '/', got: " + c); - state = 'authority ignore slashes'; - continue; - } - break; - - case 'authority second slash': - state = 'authority ignore slashes'; - if ('/' != c) { - err("Expected '/', got: " + c); - continue; - } - break; - - case 'authority ignore slashes': - if ('/' != c && '\\' != c) { - state = 'authority'; - continue; - } else { - err('Expected authority, got: ' + c); - } - break; - - case 'authority': - if ('@' == c) { - if (seenAt) { - err('@ already seen.'); - buffer += '%40'; - } - seenAt = true; - for (var i = 0; i < buffer.length; i++) { - var cp = buffer[i]; - if ('\t' == cp || '\n' == cp || '\r' == cp) { - err('Invalid whitespace in authority.'); - continue; - } - // XXX check URL code points - if (':' == cp && null === this._password) { - this._password = ''; - continue; - } - var tempC = percentEscape(cp); - (null !== this._password) ? this._password += tempC : this._username += tempC; - } - buffer = ''; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - cursor -= buffer.length; - buffer = ''; - state = 'host'; - continue; - } else { - buffer += c; - } - break; - - case 'file host': - if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) { - state = 'relative path'; - } else if (buffer.length == 0) { - state = 'relative path start'; - } else { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - } - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid whitespace in file host.'); - } else { - buffer += c; - } - break; - - case 'host': - case 'hostname': - if (':' == c && !seenBracket) { - // XXX host parsing - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'port'; - if ('hostname' == stateOverride) { - break loop; - } - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) { - this._host = IDNAToASCII.call(this, buffer); - buffer = ''; - state = 'relative path start'; - if (stateOverride) { - break loop; - } - continue; - } else if ('\t' != c && '\n' != c && '\r' != c) { - if ('[' == c) { - seenBracket = true; - } else if (']' == c) { - seenBracket = false; - } - buffer += c; - } else { - err('Invalid code point in host/hostname: ' + c); - } - break; - - case 'port': - if (/[0-9]/.test(c)) { - buffer += c; - } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) { - if ('' != buffer) { - var temp = parseInt(buffer, 10); - if (temp != relative[this._scheme]) { - this._port = temp + ''; - } - buffer = ''; - } - if (stateOverride) { - break loop; - } - state = 'relative path start'; - continue; - } else if ('\t' == c || '\n' == c || '\r' == c) { - err('Invalid code point in port: ' + c); - } else { - invalid.call(this); - } - break; - - case 'relative path start': - if ('\\' == c) - err("'\\' not allowed in path."); - state = 'relative path'; - if ('/' != c && '\\' != c) { - continue; - } - break; - - case 'relative path': - if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) { - if ('\\' == c) { - err('\\ not allowed in relative path.'); - } - var tmp; - if (tmp = relativePathDotMapping[buffer.toLowerCase()]) { - buffer = tmp; - } - if ('..' == buffer) { - this._path.pop(); - if ('/' != c && '\\' != c) { - this._path.push(''); - } - } else if ('.' == buffer && '/' != c && '\\' != c) { - this._path.push(''); - } else if ('.' != buffer) { - if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') { - buffer = buffer[0] + ':'; - } - this._path.push(buffer); - } - buffer = ''; - if ('?' == c) { - this._query = '?'; - state = 'query'; - } else if ('#' == c) { - this._fragment = '#'; - state = 'fragment'; - } - } else if ('\t' != c && '\n' != c && '\r' != c) { - buffer += percentEscape(c); - } - break; - - case 'query': - if (!stateOverride && '#' == c) { - this._fragment = '#'; - state = 'fragment'; - } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._query += percentEscapeQuery(c); - } - break; - - case 'fragment': - if (EOF != c && '\t' != c && '\n' != c && '\r' != c) { - this._fragment += c; - } - break; - } - - cursor++; - } - } - - function clear() { - this._scheme = ''; - this._schemeData = ''; - this._username = ''; - this._password = null; - this._host = ''; - this._port = ''; - this._path = []; - this._query = ''; - this._fragment = ''; - this._isInvalid = false; - this._isRelative = false; - } - - // Does not process domain names or IP addresses. - // Does not handle encoding for the query parameter. - function jURL(url, base /* , encoding */) { - if (base !== undefined && !(base instanceof jURL)) - base = new jURL(String(base)); - - this._url = url; - clear.call(this); - - var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, ''); - // encoding = encoding || 'utf-8' - - parse.call(this, input, null, base); - } - - jURL.prototype = { - toString: function() { - return this.href; - }, - get href() { - if (this._isInvalid) - return this._url; - - var authority = ''; - if ('' != this._username || null != this._password) { - authority = this._username + - (null != this._password ? ':' + this._password : '') + '@'; - } - - return this.protocol + - (this._isRelative ? '//' + authority + this.host : '') + - this.pathname + this._query + this._fragment; - }, - set href(href) { - clear.call(this); - parse.call(this, href); - }, - - get protocol() { - return this._scheme + ':'; - }, - set protocol(protocol) { - if (this._isInvalid) - return; - parse.call(this, protocol + ':', 'scheme start'); - }, - - get host() { - return this._isInvalid ? '' : this._port ? - this._host + ':' + this._port : this._host; - }, - set host(host) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, host, 'host'); - }, - - get hostname() { - return this._host; - }, - set hostname(hostname) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, hostname, 'hostname'); - }, - - get port() { - return this._port; - }, - set port(port) { - if (this._isInvalid || !this._isRelative) - return; - parse.call(this, port, 'port'); - }, - - get pathname() { - return this._isInvalid ? '' : this._isRelative ? - '/' + this._path.join('/') : this._schemeData; - }, - set pathname(pathname) { - if (this._isInvalid || !this._isRelative) - return; - this._path = []; - parse.call(this, pathname, 'relative path start'); - }, - - get search() { - return this._isInvalid || !this._query || '?' == this._query ? - '' : this._query; - }, - set search(search) { - if (this._isInvalid || !this._isRelative) - return; - this._query = '?'; - if ('?' == search[0]) - search = search.slice(1); - parse.call(this, search, 'query'); - }, - - get hash() { - return this._isInvalid || !this._fragment || '#' == this._fragment ? - '' : this._fragment; - }, - set hash(hash) { - if (this._isInvalid) - return; - this._fragment = '#'; - if ('#' == hash[0]) - hash = hash.slice(1); - parse.call(this, hash, 'fragment'); - }, - - get origin() { - var host; - if (this._isInvalid || !this._scheme) { - return ''; - } - // javascript: Gecko returns String(""), WebKit/Blink String("null") - // Gecko throws error for "data://" - // data: Gecko returns "", Blink returns "data://", WebKit returns "null" - // Gecko returns String("") for file: mailto: - // WebKit/Blink returns String("SCHEME://") for file: mailto: - switch (this._scheme) { - case 'data': - case 'file': - case 'javascript': - case 'mailto': - return 'null'; - } - host = this.host; - if (!host) { - return ''; - } - return this._scheme + '://' + host; - } - }; - - // Copy over the static methods - var OriginalURL = scope.URL; - if (OriginalURL) { - jURL.createObjectURL = function(blob) { - // IE extension allows a second optional options argument. - // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx - return OriginalURL.createObjectURL.apply(OriginalURL, arguments); - }; - jURL.revokeObjectURL = function(url) { - OriginalURL.revokeObjectURL(url); - }; - } - - scope.URL = jURL; - /* jshint ignore:end */ -})(globalScope); - -exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX; -exports.IDENTITY_MATRIX = IDENTITY_MATRIX; -exports.OPS = OPS; -exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES; -exports.AnnotationBorderStyleType = AnnotationBorderStyleType; -exports.AnnotationFlag = AnnotationFlag; -exports.AnnotationType = AnnotationType; -exports.FontType = FontType; -exports.ImageKind = ImageKind; -exports.InvalidPDFException = InvalidPDFException; -exports.LinkTarget = LinkTarget; -exports.LinkTargetStringMap = LinkTargetStringMap; -exports.MessageHandler = MessageHandler; -exports.MissingDataException = MissingDataException; -exports.MissingPDFException = MissingPDFException; -exports.NotImplementedException = NotImplementedException; -exports.PasswordException = PasswordException; -exports.PasswordResponses = PasswordResponses; -exports.StatTimer = StatTimer; -exports.StreamType = StreamType; -exports.TextRenderingMode = TextRenderingMode; -exports.UnexpectedResponseException = UnexpectedResponseException; -exports.UnknownErrorException = UnknownErrorException; -exports.Util = Util; -exports.XRefParseException = XRefParseException; -exports.assert = assert; -exports.bytesToString = bytesToString; -exports.combineUrl = combineUrl; -exports.createPromiseCapability = createPromiseCapability; -exports.deprecated = deprecated; -exports.error = error; -exports.info = info; -exports.isArray = isArray; -exports.isArrayBuffer = isArrayBuffer; -exports.isBool = isBool; -exports.isEmptyObj = isEmptyObj; -exports.isExternalLinkTargetSet = isExternalLinkTargetSet; -exports.isInt = isInt; -exports.isNum = isNum; -exports.isString = isString; -exports.isValidUrl = isValidUrl; -exports.addLinkAttributes = addLinkAttributes; -exports.loadJpegStream = loadJpegStream; -exports.log2 = log2; -exports.readInt8 = readInt8; -exports.readUint16 = readUint16; -exports.readUint32 = readUint32; -exports.removeNullCharacters = removeNullCharacters; -exports.shadow = shadow; -exports.string32 = string32; -exports.stringToBytes = stringToBytes; -exports.stringToPDFString = stringToPDFString; -exports.stringToUTF8String = stringToUTF8String; -exports.utf8StringToString = utf8StringToString; -exports.warn = warn; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreChunkedStream = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var MissingDataException = sharedUtil.MissingDataException; -var assert = sharedUtil.assert; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var isInt = sharedUtil.isInt; -var isEmptyObj = sharedUtil.isEmptyObj; - -var ChunkedStream = (function ChunkedStreamClosure() { - function ChunkedStream(length, chunkSize, manager) { - this.bytes = new Uint8Array(length); - this.start = 0; - this.pos = 0; - this.end = length; - this.chunkSize = chunkSize; - this.loadedChunks = []; - this.numChunksLoaded = 0; - this.numChunks = Math.ceil(length / chunkSize); - this.manager = manager; - this.progressiveDataLength = 0; - this.lastSuccessfulEnsureByteChunk = -1; // a single-entry cache - } - - // required methods for a stream. if a particular stream does not - // implement these, an error should be thrown - ChunkedStream.prototype = { - - getMissingChunks: function ChunkedStream_getMissingChunks() { - var chunks = []; - for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) { - if (!this.loadedChunks[chunk]) { - chunks.push(chunk); - } - } - return chunks; - }, - - getBaseStreams: function ChunkedStream_getBaseStreams() { - return [this]; - }, - - allChunksLoaded: function ChunkedStream_allChunksLoaded() { - return this.numChunksLoaded === this.numChunks; - }, - - onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) { - var end = begin + chunk.byteLength; - - assert(begin % this.chunkSize === 0, 'Bad begin offset: ' + begin); - // Using this.length is inaccurate here since this.start can be moved - // See ChunkedStream.moveStart() - var length = this.bytes.length; - assert(end % this.chunkSize === 0 || end === length, - 'Bad end offset: ' + end); - - this.bytes.set(new Uint8Array(chunk), begin); - var chunkSize = this.chunkSize; - var beginChunk = Math.floor(begin / chunkSize); - var endChunk = Math.floor((end - 1) / chunkSize) + 1; - var curChunk; - - for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - if (!this.loadedChunks[curChunk]) { - this.loadedChunks[curChunk] = true; - ++this.numChunksLoaded; - } - } - }, - - onReceiveProgressiveData: - function ChunkedStream_onReceiveProgressiveData(data) { - var position = this.progressiveDataLength; - var beginChunk = Math.floor(position / this.chunkSize); - - this.bytes.set(new Uint8Array(data), position); - position += data.byteLength; - this.progressiveDataLength = position; - var endChunk = position >= this.end ? this.numChunks : - Math.floor(position / this.chunkSize); - var curChunk; - for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) { - if (!this.loadedChunks[curChunk]) { - this.loadedChunks[curChunk] = true; - ++this.numChunksLoaded; - } - } - }, - - ensureByte: function ChunkedStream_ensureByte(pos) { - var chunk = Math.floor(pos / this.chunkSize); - if (chunk === this.lastSuccessfulEnsureByteChunk) { - return; - } - - if (!this.loadedChunks[chunk]) { - throw new MissingDataException(pos, pos + 1); - } - this.lastSuccessfulEnsureByteChunk = chunk; - }, - - ensureRange: function ChunkedStream_ensureRange(begin, end) { - if (begin >= end) { - return; - } - - if (end <= this.progressiveDataLength) { - return; - } - - var chunkSize = this.chunkSize; - var beginChunk = Math.floor(begin / chunkSize); - var endChunk = Math.floor((end - 1) / chunkSize) + 1; - for (var chunk = beginChunk; chunk < endChunk; ++chunk) { - if (!this.loadedChunks[chunk]) { - throw new MissingDataException(begin, end); - } - } - }, - - nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) { - var chunk, numChunks = this.numChunks; - for (var i = 0; i < numChunks; ++i) { - chunk = (beginChunk + i) % numChunks; // Wrap around to beginning - if (!this.loadedChunks[chunk]) { - return chunk; - } - } - return null; - }, - - hasChunk: function ChunkedStream_hasChunk(chunk) { - return !!this.loadedChunks[chunk]; - }, - - get length() { - return this.end - this.start; - }, - - get isEmpty() { - return this.length === 0; - }, - - getByte: function ChunkedStream_getByte() { - var pos = this.pos; - if (pos >= this.end) { - return -1; - } - this.ensureByte(pos); - return this.bytes[this.pos++]; - }, - - getUint16: function ChunkedStream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - - getInt32: function ChunkedStream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - - // returns subarray of original buffer - // should only be read - getBytes: function ChunkedStream_getBytes(length) { - var bytes = this.bytes; - var pos = this.pos; - var strEnd = this.end; - - if (!length) { - this.ensureRange(pos, strEnd); - return bytes.subarray(pos, strEnd); - } - - var end = pos + length; - if (end > strEnd) { - end = strEnd; - } - this.ensureRange(pos, end); - - this.pos = end; - return bytes.subarray(pos, end); - }, - - peekByte: function ChunkedStream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - - peekBytes: function ChunkedStream_peekBytes(length) { - var bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - }, - - getByteRange: function ChunkedStream_getBytes(begin, end) { - this.ensureRange(begin, end); - return this.bytes.subarray(begin, end); - }, - - skip: function ChunkedStream_skip(n) { - if (!n) { - n = 1; - } - this.pos += n; - }, - - reset: function ChunkedStream_reset() { - this.pos = this.start; - }, - - moveStart: function ChunkedStream_moveStart() { - this.start = this.pos; - }, - - makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) { - this.ensureRange(start, start + length); - - function ChunkedStreamSubstream() {} - ChunkedStreamSubstream.prototype = Object.create(this); - ChunkedStreamSubstream.prototype.getMissingChunks = function() { - var chunkSize = this.chunkSize; - var beginChunk = Math.floor(this.start / chunkSize); - var endChunk = Math.floor((this.end - 1) / chunkSize) + 1; - var missingChunks = []; - for (var chunk = beginChunk; chunk < endChunk; ++chunk) { - if (!this.loadedChunks[chunk]) { - missingChunks.push(chunk); - } - } - return missingChunks; - }; - var subStream = new ChunkedStreamSubstream(); - subStream.pos = subStream.start = start; - subStream.end = start + length || this.end; - subStream.dict = dict; - return subStream; - }, - - isStream: true - }; - - return ChunkedStream; -})(); - -var ChunkedStreamManager = (function ChunkedStreamManagerClosure() { - - function ChunkedStreamManager(length, chunkSize, url, args) { - this.stream = new ChunkedStream(length, chunkSize, this); - this.length = length; - this.chunkSize = chunkSize; - this.url = url; - this.disableAutoFetch = args.disableAutoFetch; - var msgHandler = this.msgHandler = args.msgHandler; - - if (args.chunkedViewerLoading) { - msgHandler.on('OnDataRange', this.onReceiveData.bind(this)); - msgHandler.on('OnDataProgress', this.onProgress.bind(this)); - this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) { - msgHandler.send('RequestDataRange', { begin: begin, end: end }); - }; - } else { - - var getXhr = function getXhr() { - return new XMLHttpRequest(); - }; - this.networkManager = new NetworkManager(this.url, { - getXhr: getXhr, - httpHeaders: args.httpHeaders, - withCredentials: args.withCredentials - }); - this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) { - this.networkManager.requestRange(begin, end, { - onDone: this.onReceiveData.bind(this), - onProgress: this.onProgress.bind(this) - }); - }; - } - - this.currRequestId = 0; - - this.chunksNeededByRequest = {}; - this.requestsByChunk = {}; - this.promisesByRequest = {}; - this.progressiveDataLength = 0; - - this._loadedStreamCapability = createPromiseCapability(); - - if (args.initialData) { - this.onReceiveData({chunk: args.initialData}); - } - } - - ChunkedStreamManager.prototype = { - onLoadedStream: function ChunkedStreamManager_getLoadedStream() { - return this._loadedStreamCapability.promise; - }, - - // Get all the chunks that are not yet loaded and groups them into - // contiguous ranges to load in as few requests as possible - requestAllChunks: function ChunkedStreamManager_requestAllChunks() { - var missingChunks = this.stream.getMissingChunks(); - this._requestChunks(missingChunks); - return this._loadedStreamCapability.promise; - }, - - _requestChunks: function ChunkedStreamManager_requestChunks(chunks) { - var requestId = this.currRequestId++; - - var chunksNeeded; - var i, ii; - this.chunksNeededByRequest[requestId] = chunksNeeded = {}; - for (i = 0, ii = chunks.length; i < ii; i++) { - if (!this.stream.hasChunk(chunks[i])) { - chunksNeeded[chunks[i]] = true; - } - } - - if (isEmptyObj(chunksNeeded)) { - return Promise.resolve(); - } - - var capability = createPromiseCapability(); - this.promisesByRequest[requestId] = capability; - - var chunksToRequest = []; - for (var chunk in chunksNeeded) { - chunk = chunk | 0; - if (!(chunk in this.requestsByChunk)) { - this.requestsByChunk[chunk] = []; - chunksToRequest.push(chunk); - } - this.requestsByChunk[chunk].push(requestId); - } - - if (!chunksToRequest.length) { - return capability.promise; - } - - var groupedChunksToRequest = this.groupChunks(chunksToRequest); - - for (i = 0; i < groupedChunksToRequest.length; ++i) { - var groupedChunk = groupedChunksToRequest[i]; - var begin = groupedChunk.beginChunk * this.chunkSize; - var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length); - this.sendRequest(begin, end); - } - - return capability.promise; - }, - - getStream: function ChunkedStreamManager_getStream() { - return this.stream; - }, - - // Loads any chunks in the requested range that are not yet loaded - requestRange: function ChunkedStreamManager_requestRange(begin, end) { - - end = Math.min(end, this.length); - - var beginChunk = this.getBeginChunk(begin); - var endChunk = this.getEndChunk(end); - - var chunks = []; - for (var chunk = beginChunk; chunk < endChunk; ++chunk) { - chunks.push(chunk); - } - - return this._requestChunks(chunks); - }, - - requestRanges: function ChunkedStreamManager_requestRanges(ranges) { - ranges = ranges || []; - var chunksToRequest = []; - - for (var i = 0; i < ranges.length; i++) { - var beginChunk = this.getBeginChunk(ranges[i].begin); - var endChunk = this.getEndChunk(ranges[i].end); - for (var chunk = beginChunk; chunk < endChunk; ++chunk) { - if (chunksToRequest.indexOf(chunk) < 0) { - chunksToRequest.push(chunk); - } - } - } - - chunksToRequest.sort(function(a, b) { return a - b; }); - return this._requestChunks(chunksToRequest); - }, - - // Groups a sorted array of chunks into as few contiguous larger - // chunks as possible - groupChunks: function ChunkedStreamManager_groupChunks(chunks) { - var groupedChunks = []; - var beginChunk = -1; - var prevChunk = -1; - for (var i = 0; i < chunks.length; ++i) { - var chunk = chunks[i]; - - if (beginChunk < 0) { - beginChunk = chunk; - } - - if (prevChunk >= 0 && prevChunk + 1 !== chunk) { - groupedChunks.push({ beginChunk: beginChunk, - endChunk: prevChunk + 1 }); - beginChunk = chunk; - } - if (i + 1 === chunks.length) { - groupedChunks.push({ beginChunk: beginChunk, - endChunk: chunk + 1 }); - } - - prevChunk = chunk; - } - return groupedChunks; - }, - - onProgress: function ChunkedStreamManager_onProgress(args) { - var bytesLoaded = (this.stream.numChunksLoaded * this.chunkSize + - args.loaded); - this.msgHandler.send('DocProgress', { - loaded: bytesLoaded, - total: this.length - }); - }, - - onReceiveData: function ChunkedStreamManager_onReceiveData(args) { - var chunk = args.chunk; - var isProgressive = args.begin === undefined; - var begin = isProgressive ? this.progressiveDataLength : args.begin; - var end = begin + chunk.byteLength; - - var beginChunk = Math.floor(begin / this.chunkSize); - var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : - Math.ceil(end / this.chunkSize); - - if (isProgressive) { - this.stream.onReceiveProgressiveData(chunk); - this.progressiveDataLength = end; - } else { - this.stream.onReceiveData(begin, chunk); - } - - if (this.stream.allChunksLoaded()) { - this._loadedStreamCapability.resolve(this.stream); - } - - var loadedRequests = []; - var i, requestId; - for (chunk = beginChunk; chunk < endChunk; ++chunk) { - // The server might return more chunks than requested - var requestIds = this.requestsByChunk[chunk] || []; - delete this.requestsByChunk[chunk]; - - for (i = 0; i < requestIds.length; ++i) { - requestId = requestIds[i]; - var chunksNeeded = this.chunksNeededByRequest[requestId]; - if (chunk in chunksNeeded) { - delete chunksNeeded[chunk]; - } - - if (!isEmptyObj(chunksNeeded)) { - continue; - } - - loadedRequests.push(requestId); - } - } - - // If there are no pending requests, automatically fetch the next - // unfetched chunk of the PDF - if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) { - var nextEmptyChunk; - if (this.stream.numChunksLoaded === 1) { - // This is a special optimization so that after fetching the first - // chunk, rather than fetching the second chunk, we fetch the last - // chunk. - var lastChunk = this.stream.numChunks - 1; - if (!this.stream.hasChunk(lastChunk)) { - nextEmptyChunk = lastChunk; - } - } else { - nextEmptyChunk = this.stream.nextEmptyChunk(endChunk); - } - if (isInt(nextEmptyChunk)) { - this._requestChunks([nextEmptyChunk]); - } - } - - for (i = 0; i < loadedRequests.length; ++i) { - requestId = loadedRequests[i]; - var capability = this.promisesByRequest[requestId]; - delete this.promisesByRequest[requestId]; - capability.resolve(); - } - - this.msgHandler.send('DocProgress', { - loaded: this.stream.numChunksLoaded * this.chunkSize, - total: this.length - }); - }, - - onError: function ChunkedStreamManager_onError(err) { - this._loadedStreamCapability.reject(err); - }, - - getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) { - var chunk = Math.floor(begin / this.chunkSize); - return chunk; - }, - - getEndChunk: function ChunkedStreamManager_getEndChunk(end) { - var chunk = Math.floor((end - 1) / this.chunkSize) + 1; - return chunk; - }, - - abort: function ChunkedStreamManager_abort() { - if (this.networkManager) { - this.networkManager.abortAllRequests(); - } - for(var requestId in this.promisesByRequest) { - var capability = this.promisesByRequest[requestId]; - capability.reject(new Error('Request was aborted')); - } - } - }; - - return ChunkedStreamManager; -})(); - -exports.ChunkedStream = ChunkedStream; -exports.ChunkedStreamManager = ChunkedStreamManager; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreJbig2 = {}), root.pdfjsSharedUtil, - root.pdfjsCoreArithmeticDecoder); - } -}(this, function (exports, sharedUtil, coreArithmeticDecoder) { - -var error = sharedUtil.error; -var log2 = sharedUtil.log2; -var readInt8 = sharedUtil.readInt8; -var readUint16 = sharedUtil.readUint16; -var readUint32 = sharedUtil.readUint32; -var shadow = sharedUtil.shadow; -var ArithmeticDecoder = coreArithmeticDecoder.ArithmeticDecoder; - -var Jbig2Image = (function Jbig2ImageClosure() { - // Utility data structures - function ContextCache() {} - - ContextCache.prototype = { - getContexts: function(id) { - if (id in this) { - return this[id]; - } - return (this[id] = new Int8Array(1 << 16)); - } - }; - - function DecodingContext(data, start, end) { - this.data = data; - this.start = start; - this.end = end; - } - - DecodingContext.prototype = { - get decoder() { - var decoder = new ArithmeticDecoder(this.data, this.start, this.end); - return shadow(this, 'decoder', decoder); - }, - get contextCache() { - var cache = new ContextCache(); - return shadow(this, 'contextCache', cache); - } - }; - - // Annex A. Arithmetic Integer Decoding Procedure - // A.2 Procedure for decoding values - function decodeInteger(contextCache, procedure, decoder) { - var contexts = contextCache.getContexts(procedure); - var prev = 1; - - function readBits(length) { - var v = 0; - for (var i = 0; i < length; i++) { - var bit = decoder.readBit(contexts, prev); - prev = (prev < 256 ? (prev << 1) | bit : - (((prev << 1) | bit) & 511) | 256); - v = (v << 1) | bit; - } - return v >>> 0; - } - - var sign = readBits(1); - var value = readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(1) ? - (readBits(32) + 4436) : - readBits(12) + 340) : - readBits(8) + 84) : - readBits(6) + 20) : - readBits(4) + 4) : - readBits(2); - return (sign === 0 ? value : (value > 0 ? -value : null)); - } - - // A.3 The IAID decoding procedure - function decodeIAID(contextCache, decoder, codeLength) { - var contexts = contextCache.getContexts('IAID'); - - var prev = 1; - for (var i = 0; i < codeLength; i++) { - var bit = decoder.readBit(contexts, prev); - prev = (prev << 1) | bit; - } - if (codeLength < 31) { - return prev & ((1 << codeLength) - 1); - } - return prev & 0x7FFFFFFF; - } - - // 7.3 Segment types - var SegmentTypes = [ - 'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, - 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, - null, null, null, null, null, 'patternDictionary', null, null, null, - 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', - 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, - null, null, null, null, null, 'IntermediateGenericRegion', null, - 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', - 'IntermediateGenericRefinementRegion', null, - 'ImmediateGenericRefinementRegion', - 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, - 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', - 'Tables', null, null, null, null, null, null, null, null, - 'Extension' - ]; - - var CodingTemplates = [ - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, - {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1}, - {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: 2, y: -2}, - {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, - {x: 2, y: -1}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}], - [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1}, - {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0}, - {x: -1, y: 0}], - [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, - {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}] - ]; - - var RefinementTemplates = [ - { - coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], - reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, - {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}] - }, - { - coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}], - reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0}, - {x: 0, y: 1}, {x: 1, y: 1}] - } - ]; - - // See 6.2.5.7 Decoding the bitmap. - var ReusedContexts = [ - 0x9B25, // 10011 0110010 0101 - 0x0795, // 0011 110010 101 - 0x00E5, // 001 11001 01 - 0x0195 // 011001 0101 - ]; - - var RefinementReusedContexts = [ - 0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference) - 0x0008 // '0000' + '001000' - ]; - - function decodeBitmapTemplate0(width, height, decodingContext) { - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GB'); - var contextLabel, i, j, pixel, row, row1, row2, bitmap = []; - - // ...ooooo.... - // ..ooooooo... Context template for current pixel (X) - // .ooooX...... (concatenate values of 'o'-pixels to get contextLabel) - var OLD_PIXEL_MASK = 0x7BF7; // 01111 0111111 0111 - - for (i = 0; i < height; i++) { - row = bitmap[i] = new Uint8Array(width); - row1 = (i < 1) ? row : bitmap[i - 1]; - row2 = (i < 2) ? row : bitmap[i - 2]; - - // At the beginning of each row: - // Fill contextLabel with pixels that are above/right of (X) - contextLabel = (row2[0] << 13) | (row2[1] << 12) | (row2[2] << 11) | - (row1[0] << 7) | (row1[1] << 6) | (row1[2] << 5) | - (row1[3] << 4); - - for (j = 0; j < width; j++) { - row[j] = pixel = decoder.readBit(contexts, contextLabel); - - // At each pixel: Clear contextLabel pixels that are shifted - // out of the context, then add new ones. - contextLabel = ((contextLabel & OLD_PIXEL_MASK) << 1) | - (j + 3 < width ? row2[j + 3] << 11 : 0) | - (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel; - } - } - - return bitmap; - } - - // 6.2 Generic Region Decoding Procedure - function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, - decodingContext) { - if (mmr) { - error('JBIG2 error: MMR encoding is not supported'); - } - - // Use optimized version for the most common case - if (templateIndex === 0 && !skip && !prediction && at.length === 4 && - at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && - at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) { - return decodeBitmapTemplate0(width, height, decodingContext); - } - - var useskip = !!skip; - var template = CodingTemplates[templateIndex].concat(at); - - // Sorting is non-standard, and it is not required. But sorting increases - // the number of template bits that can be reused from the previous - // contextLabel in the main loop. - template.sort(function (a, b) { - return (a.y - b.y) || (a.x - b.x); - }); - - var templateLength = template.length; - var templateX = new Int8Array(templateLength); - var templateY = new Int8Array(templateLength); - var changingTemplateEntries = []; - var reuseMask = 0, minX = 0, maxX = 0, minY = 0; - var c, k; - - for (k = 0; k < templateLength; k++) { - templateX[k] = template[k].x; - templateY[k] = template[k].y; - minX = Math.min(minX, template[k].x); - maxX = Math.max(maxX, template[k].x); - minY = Math.min(minY, template[k].y); - // Check if the template pixel appears in two consecutive context labels, - // so it can be reused. Otherwise, we add it to the list of changing - // template entries. - if (k < templateLength - 1 && - template[k].y === template[k + 1].y && - template[k].x === template[k + 1].x - 1) { - reuseMask |= 1 << (templateLength - 1 - k); - } else { - changingTemplateEntries.push(k); - } - } - var changingEntriesLength = changingTemplateEntries.length; - - var changingTemplateX = new Int8Array(changingEntriesLength); - var changingTemplateY = new Int8Array(changingEntriesLength); - var changingTemplateBit = new Uint16Array(changingEntriesLength); - for (c = 0; c < changingEntriesLength; c++) { - k = changingTemplateEntries[c]; - changingTemplateX[c] = template[k].x; - changingTemplateY[c] = template[k].y; - changingTemplateBit[c] = 1 << (templateLength - 1 - k); - } - - // Get the safe bounding box edges from the width, height, minX, maxX, minY - var sbb_left = -minX; - var sbb_top = -minY; - var sbb_right = width - maxX; - - var pseudoPixelContext = ReusedContexts[templateIndex]; - var row = new Uint8Array(width); - var bitmap = []; - - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GB'); - - var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - bitmap.push(row); // duplicate previous row - continue; - } - } - row = new Uint8Array(row); - bitmap.push(row); - for (j = 0; j < width; j++) { - if (useskip && skip[i][j]) { - row[j] = 0; - continue; - } - // Are we in the middle of a scanline, so we can reuse contextLabel - // bits? - if (j >= sbb_left && j < sbb_right && i >= sbb_top) { - // If yes, we can just shift the bits that are reusable and only - // fetch the remaining ones. - contextLabel = (contextLabel << 1) & reuseMask; - for (k = 0; k < changingEntriesLength; k++) { - i0 = i + changingTemplateY[k]; - j0 = j + changingTemplateX[k]; - bit = bitmap[i0][j0]; - if (bit) { - bit = changingTemplateBit[k]; - contextLabel |= bit; - } - } - } else { - // compute the contextLabel from scratch - contextLabel = 0; - shift = templateLength - 1; - for (k = 0; k < templateLength; k++, shift--) { - j0 = j + templateX[k]; - if (j0 >= 0 && j0 < width) { - i0 = i + templateY[k]; - if (i0 >= 0) { - bit = bitmap[i0][j0]; - if (bit) { - contextLabel |= bit << shift; - } - } - } - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - return bitmap; - } - - // 6.3.2 Generic Refinement Region Decoding Procedure - function decodeRefinement(width, height, templateIndex, referenceBitmap, - offsetX, offsetY, prediction, at, - decodingContext) { - var codingTemplate = RefinementTemplates[templateIndex].coding; - if (templateIndex === 0) { - codingTemplate = codingTemplate.concat([at[0]]); - } - var codingTemplateLength = codingTemplate.length; - var codingTemplateX = new Int32Array(codingTemplateLength); - var codingTemplateY = new Int32Array(codingTemplateLength); - var k; - for (k = 0; k < codingTemplateLength; k++) { - codingTemplateX[k] = codingTemplate[k].x; - codingTemplateY[k] = codingTemplate[k].y; - } - - var referenceTemplate = RefinementTemplates[templateIndex].reference; - if (templateIndex === 0) { - referenceTemplate = referenceTemplate.concat([at[1]]); - } - var referenceTemplateLength = referenceTemplate.length; - var referenceTemplateX = new Int32Array(referenceTemplateLength); - var referenceTemplateY = new Int32Array(referenceTemplateLength); - for (k = 0; k < referenceTemplateLength; k++) { - referenceTemplateX[k] = referenceTemplate[k].x; - referenceTemplateY[k] = referenceTemplate[k].y; - } - var referenceWidth = referenceBitmap[0].length; - var referenceHeight = referenceBitmap.length; - - var pseudoPixelContext = RefinementReusedContexts[templateIndex]; - var bitmap = []; - - var decoder = decodingContext.decoder; - var contexts = decodingContext.contextCache.getContexts('GR'); - - var ltp = 0; - for (var i = 0; i < height; i++) { - if (prediction) { - var sltp = decoder.readBit(contexts, pseudoPixelContext); - ltp ^= sltp; - if (ltp) { - error('JBIG2 error: prediction is not supported'); - } - } - var row = new Uint8Array(width); - bitmap.push(row); - for (var j = 0; j < width; j++) { - var i0, j0; - var contextLabel = 0; - for (k = 0; k < codingTemplateLength; k++) { - i0 = i + codingTemplateY[k]; - j0 = j + codingTemplateX[k]; - if (i0 < 0 || j0 < 0 || j0 >= width) { - contextLabel <<= 1; // out of bound pixel - } else { - contextLabel = (contextLabel << 1) | bitmap[i0][j0]; - } - } - for (k = 0; k < referenceTemplateLength; k++) { - i0 = i + referenceTemplateY[k] + offsetY; - j0 = j + referenceTemplateX[k] + offsetX; - if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || - j0 >= referenceWidth) { - contextLabel <<= 1; // out of bound pixel - } else { - contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0]; - } - } - var pixel = decoder.readBit(contexts, contextLabel); - row[j] = pixel; - } - } - - return bitmap; - } - - // 6.5.5 Decoding the symbol dictionary - function decodeSymbolDictionary(huffman, refinement, symbols, - numberOfNewSymbols, numberOfExportedSymbols, - huffmanTables, templateIndex, at, - refinementTemplateIndex, refinementAt, - decodingContext) { - if (huffman) { - error('JBIG2 error: huffman is not supported'); - } - - var newSymbols = []; - var currentHeight = 0; - var symbolCodeLength = log2(symbols.length + numberOfNewSymbols); - - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - - while (newSymbols.length < numberOfNewSymbols) { - var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6 - currentHeight += deltaHeight; - var currentWidth = 0; - var totalWidth = 0; - while (true) { - var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7 - if (deltaWidth === null) { - break; // OOB - } - currentWidth += deltaWidth; - totalWidth += currentWidth; - var bitmap; - if (refinement) { - // 6.5.8.2 Refinement/aggregate-coded symbol bitmap - var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder); - if (numberOfInstances > 1) { - bitmap = decodeTextRegion(huffman, refinement, - currentWidth, currentHeight, 0, - numberOfInstances, 1, //strip size - symbols.concat(newSymbols), - symbolCodeLength, - 0, //transposed - 0, //ds offset - 1, //top left 7.4.3.1.1 - 0, //OR operator - huffmanTables, - refinementTemplateIndex, refinementAt, - decodingContext); - } else { - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 - var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 - var symbol = (symbolId < symbols.length ? symbols[symbolId] : - newSymbols[symbolId - symbols.length]); - bitmap = decodeRefinement(currentWidth, currentHeight, - refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, - decodingContext); - } - } else { - // 6.5.8.1 Direct-coded symbol bitmap - bitmap = decodeBitmap(false, currentWidth, currentHeight, - templateIndex, false, null, at, decodingContext); - } - newSymbols.push(bitmap); - } - } - // 6.5.10 Exported symbols - var exportedSymbols = []; - var flags = [], currentFlag = false; - var totalSymbolsLength = symbols.length + numberOfNewSymbols; - while (flags.length < totalSymbolsLength) { - var runLength = decodeInteger(contextCache, 'IAEX', decoder); - while (runLength--) { - flags.push(currentFlag); - } - currentFlag = !currentFlag; - } - for (var i = 0, ii = symbols.length; i < ii; i++) { - if (flags[i]) { - exportedSymbols.push(symbols[i]); - } - } - for (var j = 0; j < numberOfNewSymbols; i++, j++) { - if (flags[i]) { - exportedSymbols.push(newSymbols[j]); - } - } - return exportedSymbols; - } - - function decodeTextRegion(huffman, refinement, width, height, - defaultPixelValue, numberOfSymbolInstances, - stripSize, inputSymbols, symbolCodeLength, - transposed, dsOffset, referenceCorner, - combinationOperator, huffmanTables, - refinementTemplateIndex, refinementAt, - decodingContext) { - if (huffman) { - error('JBIG2 error: huffman is not supported'); - } - - // Prepare bitmap - var bitmap = []; - var i, row; - for (i = 0; i < height; i++) { - row = new Uint8Array(width); - if (defaultPixelValue) { - for (var j = 0; j < width; j++) { - row[j] = defaultPixelValue; - } - } - bitmap.push(row); - } - - var decoder = decodingContext.decoder; - var contextCache = decodingContext.contextCache; - var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 - var firstS = 0; - i = 0; - while (i < numberOfSymbolInstances) { - var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6 - stripT += deltaT; - - var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7 - firstS += deltaFirstS; - var currentS = firstS; - do { - var currentT = (stripSize === 1 ? 0 : - decodeInteger(contextCache, 'IAIT', decoder)); // 6.4.9 - var t = stripSize * stripT + currentT; - var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength); - var applyRefinement = (refinement && - decodeInteger(contextCache, 'IARI', decoder)); - var symbolBitmap = inputSymbols[symbolId]; - var symbolWidth = symbolBitmap[0].length; - var symbolHeight = symbolBitmap.length; - if (applyRefinement) { - var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1 - var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2 - var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3 - var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4 - symbolWidth += rdw; - symbolHeight += rdh; - symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, - refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, - (rdh >> 1) + rdy, false, refinementAt, - decodingContext); - } - var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight); - var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0); - var s2, t2, symbolRow; - if (transposed) { - // Place Symbol Bitmap from T1,S1 - for (s2 = 0; s2 < symbolHeight; s2++) { - row = bitmap[offsetS + s2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[s2]; - // To ignore Parts of Symbol bitmap which goes - // outside bitmap region - var maxWidth = Math.min(width - offsetT, symbolWidth); - switch (combinationOperator) { - case 0: // OR - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] |= symbolRow[t2]; - } - break; - case 2: // XOR - for (t2 = 0; t2 < maxWidth; t2++) { - row[offsetT + t2] ^= symbolRow[t2]; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - } - currentS += symbolHeight - 1; - } else { - for (t2 = 0; t2 < symbolHeight; t2++) { - row = bitmap[offsetT + t2]; - if (!row) { - continue; - } - symbolRow = symbolBitmap[t2]; - switch (combinationOperator) { - case 0: // OR - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] |= symbolRow[s2]; - } - break; - case 2: // XOR - for (s2 = 0; s2 < symbolWidth; s2++) { - row[offsetS + s2] ^= symbolRow[s2]; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - } - currentS += symbolWidth - 1; - } - i++; - var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8 - if (deltaS === null) { - break; // OOB - } - currentS += deltaS + dsOffset; - } while (true); - } - return bitmap; - } - - function readSegmentHeader(data, start) { - var segmentHeader = {}; - segmentHeader.number = readUint32(data, start); - var flags = data[start + 4]; - var segmentType = flags & 0x3F; - if (!SegmentTypes[segmentType]) { - error('JBIG2 error: invalid segment type: ' + segmentType); - } - segmentHeader.type = segmentType; - segmentHeader.typeName = SegmentTypes[segmentType]; - segmentHeader.deferredNonRetain = !!(flags & 0x80); - - var pageAssociationFieldSize = !!(flags & 0x40); - var referredFlags = data[start + 5]; - var referredToCount = (referredFlags >> 5) & 7; - var retainBits = [referredFlags & 31]; - var position = start + 6; - if (referredFlags === 7) { - referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF; - position += 3; - var bytes = (referredToCount + 7) >> 3; - retainBits[0] = data[position++]; - while (--bytes > 0) { - retainBits.push(data[position++]); - } - } else if (referredFlags === 5 || referredFlags === 6) { - error('JBIG2 error: invalid referred-to flags'); - } - - segmentHeader.retainBits = retainBits; - var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 : - (segmentHeader.number <= 65536 ? 2 : 4)); - var referredTo = []; - var i, ii; - for (i = 0; i < referredToCount; i++) { - var number = (referredToSegmentNumberSize === 1 ? data[position] : - (referredToSegmentNumberSize === 2 ? readUint16(data, position) : - readUint32(data, position))); - referredTo.push(number); - position += referredToSegmentNumberSize; - } - segmentHeader.referredTo = referredTo; - if (!pageAssociationFieldSize) { - segmentHeader.pageAssociation = data[position++]; - } else { - segmentHeader.pageAssociation = readUint32(data, position); - position += 4; - } - segmentHeader.length = readUint32(data, position); - position += 4; - - if (segmentHeader.length === 0xFFFFFFFF) { - // 7.2.7 Segment data length, unknown segment length - if (segmentType === 38) { // ImmediateGenericRegion - var genericRegionInfo = readRegionSegmentInformation(data, position); - var genericRegionSegmentFlags = data[position + - RegionSegmentInformationFieldLength]; - var genericRegionMmr = !!(genericRegionSegmentFlags & 1); - // searching for the segment end - var searchPatternLength = 6; - var searchPattern = new Uint8Array(searchPatternLength); - if (!genericRegionMmr) { - searchPattern[0] = 0xFF; - searchPattern[1] = 0xAC; - } - searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF; - searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF; - searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF; - searchPattern[5] = genericRegionInfo.height & 0xFF; - for (i = position, ii = data.length; i < ii; i++) { - var j = 0; - while (j < searchPatternLength && searchPattern[j] === data[i + j]) { - j++; - } - if (j === searchPatternLength) { - segmentHeader.length = i + searchPatternLength; - break; - } - } - if (segmentHeader.length === 0xFFFFFFFF) { - error('JBIG2 error: segment end was not found'); - } - } else { - error('JBIG2 error: invalid unknown segment length'); - } - } - segmentHeader.headerEnd = position; - return segmentHeader; - } - - function readSegments(header, data, start, end) { - var segments = []; - var position = start; - while (position < end) { - var segmentHeader = readSegmentHeader(data, position); - position = segmentHeader.headerEnd; - var segment = { - header: segmentHeader, - data: data - }; - if (!header.randomAccess) { - segment.start = position; - position += segmentHeader.length; - segment.end = position; - } - segments.push(segment); - if (segmentHeader.type === 51) { - break; // end of file is found - } - } - if (header.randomAccess) { - for (var i = 0, ii = segments.length; i < ii; i++) { - segments[i].start = position; - position += segments[i].header.length; - segments[i].end = position; - } - } - return segments; - } - - // 7.4.1 Region segment information field - function readRegionSegmentInformation(data, start) { - return { - width: readUint32(data, start), - height: readUint32(data, start + 4), - x: readUint32(data, start + 8), - y: readUint32(data, start + 12), - combinationOperator: data[start + 16] & 7 - }; - } - var RegionSegmentInformationFieldLength = 17; - - function processSegment(segment, visitor) { - var header = segment.header; - - var data = segment.data, position = segment.start, end = segment.end; - var args, at, i, atLength; - switch (header.type) { - case 0: // SymbolDictionary - // 7.4.2 Symbol dictionary segment syntax - var dictionary = {}; - var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1 - dictionary.huffman = !!(dictionaryFlags & 1); - dictionary.refinement = !!(dictionaryFlags & 2); - dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3; - dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3; - dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1; - dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1; - dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256); - dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512); - dictionary.template = (dictionaryFlags >> 10) & 3; - dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1; - position += 2; - if (!dictionary.huffman) { - atLength = dictionary.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.at = at; - } - if (dictionary.refinement && !dictionary.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - dictionary.refinementAt = at; - } - dictionary.numberOfExportedSymbols = readUint32(data, position); - position += 4; - dictionary.numberOfNewSymbols = readUint32(data, position); - position += 4; - args = [dictionary, header.number, header.referredTo, - data, position, end]; - break; - case 6: // ImmediateTextRegion - case 7: // ImmediateLosslessTextRegion - var textRegion = {}; - textRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var textRegionSegmentFlags = readUint16(data, position); - position += 2; - textRegion.huffman = !!(textRegionSegmentFlags & 1); - textRegion.refinement = !!(textRegionSegmentFlags & 2); - textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3); - textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3; - textRegion.transposed = !!(textRegionSegmentFlags & 64); - textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3; - textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1; - textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27; - textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1; - if (textRegion.huffman) { - var textRegionHuffmanFlags = readUint16(data, position); - position += 2; - textRegion.huffmanFS = (textRegionHuffmanFlags) & 3; - textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3; - textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3; - textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3; - textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3; - textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3; - textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3; - textRegion.huffmanRefinementSizeSelector = - !!(textRegionHuffmanFlags & 14); - } - if (textRegion.refinement && !textRegion.refinementTemplate) { - at = []; - for (i = 0; i < 2; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - textRegion.refinementAt = at; - } - textRegion.numberOfSymbolInstances = readUint32(data, position); - position += 4; - // TODO 7.4.3.1.7 Symbol ID Huffman table decoding - if (textRegion.huffman) { - error('JBIG2 error: huffman is not supported'); - } - args = [textRegion, header.referredTo, data, position, end]; - break; - case 38: // ImmediateGenericRegion - case 39: // ImmediateLosslessGenericRegion - var genericRegion = {}; - genericRegion.info = readRegionSegmentInformation(data, position); - position += RegionSegmentInformationFieldLength; - var genericRegionSegmentFlags = data[position++]; - genericRegion.mmr = !!(genericRegionSegmentFlags & 1); - genericRegion.template = (genericRegionSegmentFlags >> 1) & 3; - genericRegion.prediction = !!(genericRegionSegmentFlags & 8); - if (!genericRegion.mmr) { - atLength = genericRegion.template === 0 ? 4 : 1; - at = []; - for (i = 0; i < atLength; i++) { - at.push({ - x: readInt8(data, position), - y: readInt8(data, position + 1) - }); - position += 2; - } - genericRegion.at = at; - } - args = [genericRegion, data, position, end]; - break; - case 48: // PageInformation - var pageInfo = { - width: readUint32(data, position), - height: readUint32(data, position + 4), - resolutionX: readUint32(data, position + 8), - resolutionY: readUint32(data, position + 12) - }; - if (pageInfo.height === 0xFFFFFFFF) { - delete pageInfo.height; - } - var pageSegmentFlags = data[position + 16]; - var pageStripingInformation = readUint16(data, position + 17); - pageInfo.lossless = !!(pageSegmentFlags & 1); - pageInfo.refinement = !!(pageSegmentFlags & 2); - pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1; - pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3; - pageInfo.requiresBuffer = !!(pageSegmentFlags & 32); - pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64); - args = [pageInfo]; - break; - case 49: // EndOfPage - break; - case 50: // EndOfStripe - break; - case 51: // EndOfFile - break; - case 62: // 7.4.15 defines 2 extension types which - // are comments and can be ignored. - break; - default: - error('JBIG2 error: segment type ' + header.typeName + '(' + - header.type + ') is not implemented'); - } - var callbackName = 'on' + header.typeName; - if (callbackName in visitor) { - visitor[callbackName].apply(visitor, args); - } - } - - function processSegments(segments, visitor) { - for (var i = 0, ii = segments.length; i < ii; i++) { - processSegment(segments[i], visitor); - } - } - - function parseJbig2(data, start, end) { - var position = start; - if (data[position] !== 0x97 || data[position + 1] !== 0x4A || - data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || - data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || - data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) { - error('JBIG2 error: invalid header'); - } - var header = {}; - position += 8; - var flags = data[position++]; - header.randomAccess = !(flags & 1); - if (!(flags & 2)) { - header.numberOfPages = readUint32(data, position); - position += 4; - } - var segments = readSegments(header, data, position, end); - error('Not implemented'); - // processSegments(segments, new SimpleSegmentVisitor()); - } - - function parseJbig2Chunks(chunks) { - var visitor = new SimpleSegmentVisitor(); - for (var i = 0, ii = chunks.length; i < ii; i++) { - var chunk = chunks[i]; - var segments = readSegments({}, chunk.data, chunk.start, chunk.end); - processSegments(segments, visitor); - } - return visitor.buffer; - } - - function SimpleSegmentVisitor() {} - - SimpleSegmentVisitor.prototype = { - onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) { - this.currentPageInfo = info; - var rowSize = (info.width + 7) >> 3; - var buffer = new Uint8Array(rowSize * info.height); - // The contents of ArrayBuffers are initialized to 0. - // Fill the buffer with 0xFF only if info.defaultPixelValue is set - if (info.defaultPixelValue) { - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = 0xFF; - } - } - this.buffer = buffer; - }, - drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) { - var pageInfo = this.currentPageInfo; - var width = regionInfo.width, height = regionInfo.height; - var rowSize = (pageInfo.width + 7) >> 3; - var combinationOperator = pageInfo.combinationOperatorOverride ? - regionInfo.combinationOperator : pageInfo.combinationOperator; - var buffer = this.buffer; - var mask0 = 128 >> (regionInfo.x & 7); - var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3); - var i, j, mask, offset; - switch (combinationOperator) { - case 0: // OR - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] |= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - case 2: // XOR - for (i = 0; i < height; i++) { - mask = mask0; - offset = offset0; - for (j = 0; j < width; j++) { - if (bitmap[i][j]) { - buffer[offset] ^= mask; - } - mask >>= 1; - if (!mask) { - mask = 128; - offset++; - } - } - offset0 += rowSize; - } - break; - default: - error('JBIG2 error: operator ' + combinationOperator + - ' is not supported'); - } - }, - onImmediateGenericRegion: - function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, - start, end) { - var regionInfo = region.info; - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, - region.template, region.prediction, null, - region.at, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessGenericRegion: - function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() { - this.onImmediateGenericRegion.apply(this, arguments); - }, - onSymbolDictionary: - function SimpleSegmentVisitor_onSymbolDictionary(dictionary, - currentSegment, - referredSegments, - data, start, end) { - var huffmanTables; - if (dictionary.huffman) { - error('JBIG2 error: huffman is not supported'); - } - - // Combines exported symbols from all referred segments - var symbols = this.symbols; - if (!symbols) { - this.symbols = symbols = {}; - } - - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - - var decodingContext = new DecodingContext(data, start, end); - symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, - dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, - dictionary.numberOfExportedSymbols, huffmanTables, - dictionary.template, dictionary.at, - dictionary.refinementTemplate, dictionary.refinementAt, - decodingContext); - }, - onImmediateTextRegion: - function SimpleSegmentVisitor_onImmediateTextRegion(region, - referredSegments, - data, start, end) { - var regionInfo = region.info; - var huffmanTables; - - // Combines exported symbols from all referred segments - var symbols = this.symbols; - var inputSymbols = []; - for (var i = 0, ii = referredSegments.length; i < ii; i++) { - inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]); - } - var symbolCodeLength = log2(inputSymbols.length); - - var decodingContext = new DecodingContext(data, start, end); - var bitmap = decodeTextRegion(region.huffman, region.refinement, - regionInfo.width, regionInfo.height, region.defaultPixelValue, - region.numberOfSymbolInstances, region.stripSize, inputSymbols, - symbolCodeLength, region.transposed, region.dsOffset, - region.referenceCorner, region.combinationOperator, huffmanTables, - region.refinementTemplate, region.refinementAt, decodingContext); - this.drawBitmap(regionInfo, bitmap); - }, - onImmediateLosslessTextRegion: - function SimpleSegmentVisitor_onImmediateLosslessTextRegion() { - this.onImmediateTextRegion.apply(this, arguments); - } - }; - - function Jbig2Image() {} - - Jbig2Image.prototype = { - parseChunks: function Jbig2Image_parseChunks(chunks) { - return parseJbig2Chunks(chunks); - } - }; - - return Jbig2Image; -})(); - -exports.Jbig2Image = Jbig2Image; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreJpx = {}), root.pdfjsSharedUtil, - root.pdfjsCoreArithmeticDecoder); - } -}(this, function (exports, sharedUtil, coreArithmeticDecoder) { - -var info = sharedUtil.info; -var log2 = sharedUtil.log2; -var readUint16 = sharedUtil.readUint16; -var readUint32 = sharedUtil.readUint32; -var warn = sharedUtil.warn; -var ArithmeticDecoder = coreArithmeticDecoder.ArithmeticDecoder; - -var JpxImage = (function JpxImageClosure() { - // Table E.1 - var SubbandsGainLog2 = { - 'LL': 0, - 'LH': 1, - 'HL': 1, - 'HH': 2 - }; - function JpxImage() { - this.failOnCorruptedImage = false; - } - JpxImage.prototype = { - parse: function JpxImage_parse(data) { - - var head = readUint16(data, 0); - // No box header, immediate start of codestream (SOC) - if (head === 0xFF4F) { - this.parseCodestream(data, 0, data.length); - return; - } - - var position = 0, length = data.length; - while (position < length) { - var headerSize = 8; - var lbox = readUint32(data, position); - var tbox = readUint32(data, position + 4); - position += headerSize; - if (lbox === 1) { - // XLBox: read UInt64 according to spec. - // JavaScript's int precision of 53 bit should be sufficient here. - lbox = readUint32(data, position) * 4294967296 + - readUint32(data, position + 4); - position += 8; - headerSize += 8; - } - if (lbox === 0) { - lbox = length - position + headerSize; - } - if (lbox < headerSize) { - throw new Error('JPX Error: Invalid box field size'); - } - var dataLength = lbox - headerSize; - var jumpDataLength = true; - switch (tbox) { - case 0x6A703268: // 'jp2h' - jumpDataLength = false; // parsing child boxes - break; - case 0x636F6C72: // 'colr' - // Colorspaces are not used, the CS from the PDF is used. - var method = data[position]; - if (method === 1) { - // enumerated colorspace - var colorspace = readUint32(data, position + 3); - switch (colorspace) { - case 16: // this indicates a sRGB colorspace - case 17: // this indicates a grayscale colorspace - case 18: // this indicates a YUV colorspace - break; - default: - warn('Unknown colorspace ' + colorspace); - break; - } - } else if (method === 2) { - info('ICC profile not supported'); - } - break; - case 0x6A703263: // 'jp2c' - this.parseCodestream(data, position, position + dataLength); - break; - case 0x6A502020: // 'jP\024\024' - if (0x0d0a870a !== readUint32(data, position)) { - warn('Invalid JP2 signature'); - } - break; - // The following header types are valid but currently not used: - case 0x6A501A1A: // 'jP\032\032' - case 0x66747970: // 'ftyp' - case 0x72726571: // 'rreq' - case 0x72657320: // 'res ' - case 0x69686472: // 'ihdr' - break; - default: - var headerType = String.fromCharCode((tbox >> 24) & 0xFF, - (tbox >> 16) & 0xFF, - (tbox >> 8) & 0xFF, - tbox & 0xFF); - warn('Unsupported header type ' + tbox + ' (' + headerType + ')'); - break; - } - if (jumpDataLength) { - position += dataLength; - } - } - }, - parseImageProperties: function JpxImage_parseImageProperties(stream) { - var newByte = stream.getByte(); - while (newByte >= 0) { - var oldByte = newByte; - newByte = stream.getByte(); - var code = (oldByte << 8) | newByte; - // Image and tile size (SIZ) - if (code === 0xFF51) { - stream.skip(4); - var Xsiz = stream.getInt32() >>> 0; // Byte 4 - var Ysiz = stream.getInt32() >>> 0; // Byte 8 - var XOsiz = stream.getInt32() >>> 0; // Byte 12 - var YOsiz = stream.getInt32() >>> 0; // Byte 16 - stream.skip(16); - var Csiz = stream.getUint16(); // Byte 36 - this.width = Xsiz - XOsiz; - this.height = Ysiz - YOsiz; - this.componentsCount = Csiz; - // Results are always returned as Uint8Arrays - this.bitsPerComponent = 8; - return; - } - } - throw new Error('JPX Error: No size marker found in JPX stream'); - }, - parseCodestream: function JpxImage_parseCodestream(data, start, end) { - var context = {}; - try { - var doNotRecover = false; - var position = start; - while (position + 1 < end) { - var code = readUint16(data, position); - position += 2; - - var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile; - switch (code) { - case 0xFF4F: // Start of codestream (SOC) - context.mainHeader = true; - break; - case 0xFFD9: // End of codestream (EOC) - break; - case 0xFF51: // Image and tile size (SIZ) - length = readUint16(data, position); - var siz = {}; - siz.Xsiz = readUint32(data, position + 4); - siz.Ysiz = readUint32(data, position + 8); - siz.XOsiz = readUint32(data, position + 12); - siz.YOsiz = readUint32(data, position + 16); - siz.XTsiz = readUint32(data, position + 20); - siz.YTsiz = readUint32(data, position + 24); - siz.XTOsiz = readUint32(data, position + 28); - siz.YTOsiz = readUint32(data, position + 32); - var componentsCount = readUint16(data, position + 36); - siz.Csiz = componentsCount; - var components = []; - j = position + 38; - for (var i = 0; i < componentsCount; i++) { - var component = { - precision: (data[j] & 0x7F) + 1, - isSigned: !!(data[j] & 0x80), - XRsiz: data[j + 1], - YRsiz: data[j + 1] - }; - calculateComponentDimensions(component, siz); - components.push(component); - } - context.SIZ = siz; - context.components = components; - calculateTileGrids(context, components); - context.QCC = []; - context.COC = []; - break; - case 0xFF5C: // Quantization default (QCD) - length = readUint16(data, position); - var qcd = {}; - j = position + 2; - sqcd = data[j++]; - switch (sqcd & 0x1F) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error('JPX Error: Invalid SQcd value ' + sqcd); - } - qcd.noQuantization = (spqcdSize === 8); - qcd.scalarExpounded = scalarExpounded; - qcd.guardBits = sqcd >> 5; - spqcds = []; - while (j < length + position) { - var spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcd.SPqcds = spqcds; - if (context.mainHeader) { - context.QCD = qcd; - } else { - context.currentTile.QCD = qcd; - context.currentTile.QCC = []; - } - break; - case 0xFF5D: // Quantization component (QCC) - length = readUint16(data, position); - var qcc = {}; - j = position + 2; - var cqcc; - if (context.SIZ.Csiz < 257) { - cqcc = data[j++]; - } else { - cqcc = readUint16(data, j); - j += 2; - } - sqcd = data[j++]; - switch (sqcd & 0x1F) { - case 0: - spqcdSize = 8; - scalarExpounded = true; - break; - case 1: - spqcdSize = 16; - scalarExpounded = false; - break; - case 2: - spqcdSize = 16; - scalarExpounded = true; - break; - default: - throw new Error('JPX Error: Invalid SQcd value ' + sqcd); - } - qcc.noQuantization = (spqcdSize === 8); - qcc.scalarExpounded = scalarExpounded; - qcc.guardBits = sqcd >> 5; - spqcds = []; - while (j < (length + position)) { - spqcd = {}; - if (spqcdSize === 8) { - spqcd.epsilon = data[j++] >> 3; - spqcd.mu = 0; - } else { - spqcd.epsilon = data[j] >> 3; - spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; - j += 2; - } - spqcds.push(spqcd); - } - qcc.SPqcds = spqcds; - if (context.mainHeader) { - context.QCC[cqcc] = qcc; - } else { - context.currentTile.QCC[cqcc] = qcc; - } - break; - case 0xFF52: // Coding style default (COD) - length = readUint16(data, position); - var cod = {}; - j = position + 2; - var scod = data[j++]; - cod.entropyCoderWithCustomPrecincts = !!(scod & 1); - cod.sopMarkerUsed = !!(scod & 2); - cod.ephMarkerUsed = !!(scod & 4); - cod.progressionOrder = data[j++]; - cod.layersCount = readUint16(data, j); - j += 2; - cod.multipleComponentTransform = data[j++]; - - cod.decompositionLevelsCount = data[j++]; - cod.xcb = (data[j++] & 0xF) + 2; - cod.ycb = (data[j++] & 0xF) + 2; - var blockStyle = data[j++]; - cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); - cod.resetContextProbabilities = !!(blockStyle & 2); - cod.terminationOnEachCodingPass = !!(blockStyle & 4); - cod.verticalyStripe = !!(blockStyle & 8); - cod.predictableTermination = !!(blockStyle & 16); - cod.segmentationSymbolUsed = !!(blockStyle & 32); - cod.reversibleTransformation = data[j++]; - if (cod.entropyCoderWithCustomPrecincts) { - var precinctsSizes = []; - while (j < length + position) { - var precinctsSize = data[j++]; - precinctsSizes.push({ - PPx: precinctsSize & 0xF, - PPy: precinctsSize >> 4 - }); - } - cod.precinctsSizes = precinctsSizes; - } - var unsupported = []; - if (cod.selectiveArithmeticCodingBypass) { - unsupported.push('selectiveArithmeticCodingBypass'); - } - if (cod.resetContextProbabilities) { - unsupported.push('resetContextProbabilities'); - } - if (cod.terminationOnEachCodingPass) { - unsupported.push('terminationOnEachCodingPass'); - } - if (cod.verticalyStripe) { - unsupported.push('verticalyStripe'); - } - if (cod.predictableTermination) { - unsupported.push('predictableTermination'); - } - if (unsupported.length > 0) { - doNotRecover = true; - throw new Error('JPX Error: Unsupported COD options (' + - unsupported.join(', ') + ')'); - } - if (context.mainHeader) { - context.COD = cod; - } else { - context.currentTile.COD = cod; - context.currentTile.COC = []; - } - break; - case 0xFF90: // Start of tile-part (SOT) - length = readUint16(data, position); - tile = {}; - tile.index = readUint16(data, position + 2); - tile.length = readUint32(data, position + 4); - tile.dataEnd = tile.length + position - 2; - tile.partIndex = data[position + 8]; - tile.partsCount = data[position + 9]; - - context.mainHeader = false; - if (tile.partIndex === 0) { - // reset component specific settings - tile.COD = context.COD; - tile.COC = context.COC.slice(0); // clone of the global COC - tile.QCD = context.QCD; - tile.QCC = context.QCC.slice(0); // clone of the global COC - } - context.currentTile = tile; - break; - case 0xFF93: // Start of data (SOD) - tile = context.currentTile; - if (tile.partIndex === 0) { - initializeTile(context, tile.index); - buildPackets(context); - } - - // moving to the end of the data - length = tile.dataEnd - position; - parseTilePackets(context, data, position, length); - break; - case 0xFF55: // Tile-part lengths, main header (TLM) - case 0xFF57: // Packet length, main header (PLM) - case 0xFF58: // Packet length, tile-part header (PLT) - case 0xFF64: // Comment (COM) - length = readUint16(data, position); - // skipping content - break; - case 0xFF53: // Coding style component (COC) - throw new Error('JPX Error: Codestream code 0xFF53 (COC) is ' + - 'not implemented'); - default: - throw new Error('JPX Error: Unknown codestream code: ' + - code.toString(16)); - } - position += length; - } - } catch (e) { - if (doNotRecover || this.failOnCorruptedImage) { - throw e; - } else { - warn('Trying to recover from ' + e.message); - } - } - this.tiles = transformComponents(context); - this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; - this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; - this.componentsCount = context.SIZ.Csiz; - } - }; - function calculateComponentDimensions(component, siz) { - // Section B.2 Component mapping - component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); - component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); - component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); - component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); - component.width = component.x1 - component.x0; - component.height = component.y1 - component.y0; - } - function calculateTileGrids(context, components) { - var siz = context.SIZ; - // Section B.3 Division into tile and tile-components - var tile, tiles = []; - var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); - var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); - for (var q = 0; q < numYtiles; q++) { - for (var p = 0; p < numXtiles; p++) { - tile = {}; - tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); - tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); - tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); - tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); - tile.width = tile.tx1 - tile.tx0; - tile.height = tile.ty1 - tile.ty0; - tile.components = []; - tiles.push(tile); - } - } - context.tiles = tiles; - - var componentsCount = siz.Csiz; - for (var i = 0, ii = componentsCount; i < ii; i++) { - var component = components[i]; - for (var j = 0, jj = tiles.length; j < jj; j++) { - var tileComponent = {}; - tile = tiles[j]; - tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); - tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); - tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); - tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); - tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; - tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; - tile.components[i] = tileComponent; - } - } - } - function getBlocksDimensions(context, component, r) { - var codOrCoc = component.codingStyleParameters; - var result = {}; - if (!codOrCoc.entropyCoderWithCustomPrecincts) { - result.PPx = 15; - result.PPy = 15; - } else { - result.PPx = codOrCoc.precinctsSizes[r].PPx; - result.PPy = codOrCoc.precinctsSizes[r].PPy; - } - // calculate codeblock size as described in section B.7 - result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : - Math.min(codOrCoc.xcb, result.PPx)); - result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : - Math.min(codOrCoc.ycb, result.PPy)); - return result; - } - function buildPrecincts(context, resolution, dimensions) { - // Section B.6 Division resolution to precincts - var precinctWidth = 1 << dimensions.PPx; - var precinctHeight = 1 << dimensions.PPy; - // Jasper introduces codeblock groups for mapping each subband codeblocks - // to precincts. Precinct partition divides a resolution according to width - // and height parameters. The subband that belongs to the resolution level - // has a different size than the level, unless it is the zero resolution. - - // From Jasper documentation: jpeg2000.pdf, section K: Tier-2 coding: - // The precinct partitioning for a particular subband is derived from a - // partitioning of its parent LL band (i.e., the LL band at the next higher - // resolution level)... The LL band associated with each resolution level is - // divided into precincts... Each of the resulting precinct regions is then - // mapped into its child subbands (if any) at the next lower resolution - // level. This is accomplished by using the coordinate transformation - // (u, v) = (ceil(x/2), ceil(y/2)) where (x, y) and (u, v) are the - // coordinates of a point in the LL band and child subband, respectively. - var isZeroRes = resolution.resLevel === 0; - var precinctWidthInSubband = 1 << (dimensions.PPx + (isZeroRes ? 0 : -1)); - var precinctHeightInSubband = 1 << (dimensions.PPy + (isZeroRes ? 0 : -1)); - var numprecinctswide = (resolution.trx1 > resolution.trx0 ? - Math.ceil(resolution.trx1 / precinctWidth) - - Math.floor(resolution.trx0 / precinctWidth) : 0); - var numprecinctshigh = (resolution.try1 > resolution.try0 ? - Math.ceil(resolution.try1 / precinctHeight) - - Math.floor(resolution.try0 / precinctHeight) : 0); - var numprecincts = numprecinctswide * numprecinctshigh; - - resolution.precinctParameters = { - precinctWidth: precinctWidth, - precinctHeight: precinctHeight, - numprecinctswide: numprecinctswide, - numprecinctshigh: numprecinctshigh, - numprecincts: numprecincts, - precinctWidthInSubband: precinctWidthInSubband, - precinctHeightInSubband: precinctHeightInSubband - }; - } - function buildCodeblocks(context, subband, dimensions) { - // Section B.7 Division sub-band into code-blocks - var xcb_ = dimensions.xcb_; - var ycb_ = dimensions.ycb_; - var codeblockWidth = 1 << xcb_; - var codeblockHeight = 1 << ycb_; - var cbx0 = subband.tbx0 >> xcb_; - var cby0 = subband.tby0 >> ycb_; - var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_; - var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_; - var precinctParameters = subband.resolution.precinctParameters; - var codeblocks = []; - var precincts = []; - var i, j, codeblock, precinctNumber; - for (j = cby0; j < cby1; j++) { - for (i = cbx0; i < cbx1; i++) { - codeblock = { - cbx: i, - cby: j, - tbx0: codeblockWidth * i, - tby0: codeblockHeight * j, - tbx1: codeblockWidth * (i + 1), - tby1: codeblockHeight * (j + 1) - }; - - codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); - codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); - codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); - codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); - - // Calculate precinct number for this codeblock, codeblock position - // should be relative to its subband, use actual dimension and position - // See comment about codeblock group width and height - var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / - precinctParameters.precinctWidthInSubband); - var pj = Math.floor((codeblock.tby0_ - subband.tby0) / - precinctParameters.precinctHeightInSubband); - precinctNumber = pi + (pj * precinctParameters.numprecinctswide); - - codeblock.precinctNumber = precinctNumber; - codeblock.subbandType = subband.type; - codeblock.Lblock = 3; - - if (codeblock.tbx1_ <= codeblock.tbx0_ || - codeblock.tby1_ <= codeblock.tby0_) { - continue; - } - codeblocks.push(codeblock); - // building precinct for the sub-band - var precinct = precincts[precinctNumber]; - if (precinct !== undefined) { - if (i < precinct.cbxMin) { - precinct.cbxMin = i; - } else if (i > precinct.cbxMax) { - precinct.cbxMax = i; - } - if (j < precinct.cbyMin) { - precinct.cbxMin = j; - } else if (j > precinct.cbyMax) { - precinct.cbyMax = j; - } - } else { - precincts[precinctNumber] = precinct = { - cbxMin: i, - cbyMin: j, - cbxMax: i, - cbyMax: j - }; - } - codeblock.precinct = precinct; - } - } - subband.codeblockParameters = { - codeblockWidth: xcb_, - codeblockHeight: ycb_, - numcodeblockwide: cbx1 - cbx0 + 1, - numcodeblockhigh: cby1 - cby0 + 1 - }; - subband.codeblocks = codeblocks; - subband.precincts = precincts; - } - function createPacket(resolution, precinctNumber, layerNumber) { - var precinctCodeblocks = []; - // Section B.10.8 Order of info in packet - var subbands = resolution.subbands; - // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence - for (var i = 0, ii = subbands.length; i < ii; i++) { - var subband = subbands[i]; - var codeblocks = subband.codeblocks; - for (var j = 0, jj = codeblocks.length; j < jj; j++) { - var codeblock = codeblocks[j]; - if (codeblock.precinctNumber !== precinctNumber) { - continue; - } - precinctCodeblocks.push(codeblock); - } - } - return { - layerNumber: layerNumber, - codeblocks: precinctCodeblocks - }; - } - function LayerResolutionComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - - var l = 0, r = 0, i = 0, k = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.1 Layer-resolution-component-position - for (; l < layersCount; l++) { - for (; r <= maxDecompositionLevelsCount; r++) { - for (; i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - r = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function ResolutionLayerComponentPositionIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var maxDecompositionLevelsCount = 0; - for (var q = 0; q < componentsCount; q++) { - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - tile.components[q].codingStyleParameters.decompositionLevelsCount); - } - - var r = 0, l = 0, i = 0, k = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.2 Resolution-layer-component-position - for (; r <= maxDecompositionLevelsCount; r++) { - for (; l < layersCount; l++) { - for (; i < componentsCount; i++) { - var component = tile.components[i]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - for (; k < numprecincts;) { - var packet = createPacket(resolution, k, l); - k++; - return packet; - } - k = 0; - } - i = 0; - } - l = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function ResolutionPositionComponentLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var l, r, c, p; - var maxDecompositionLevelsCount = 0; - for (c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, - component.codingStyleParameters.decompositionLevelsCount); - } - var maxNumPrecinctsInLevel = new Int32Array( - maxDecompositionLevelsCount + 1); - for (r = 0; r <= maxDecompositionLevelsCount; ++r) { - var maxNumPrecincts = 0; - for (c = 0; c < componentsCount; ++c) { - var resolutions = tile.components[c].resolutions; - if (r < resolutions.length) { - maxNumPrecincts = Math.max(maxNumPrecincts, - resolutions[r].precinctParameters.numprecincts); - } - } - maxNumPrecinctsInLevel[r] = maxNumPrecincts; - } - l = 0; - r = 0; - c = 0; - p = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.3 Resolution-position-component-layer - for (; r <= maxDecompositionLevelsCount; r++) { - for (; p < maxNumPrecinctsInLevel[r]; p++) { - for (; c < componentsCount; c++) { - var component = tile.components[c]; - if (r > component.codingStyleParameters.decompositionLevelsCount) { - continue; - } - var resolution = component.resolutions[r]; - var numprecincts = resolution.precinctParameters.numprecincts; - if (p >= numprecincts) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, p, l); - l++; - return packet; - } - l = 0; - } - c = 0; - } - p = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function PositionComponentResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var precinctsIterationSizes = precinctsSizes; - var l = 0, r = 0, c = 0, px = 0, py = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.4 Position-component-resolution-layer - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - for (; r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = - precinctsSizes.components[c].resolutions[r]; - var k = getPrecinctIndexIfExist( - px, - py, - sizeInImageScale, - precinctsIterationSizes, - resolution); - if (k === null) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - c = 0; - } - px = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function ComponentPositionResolutionLayerIterator(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var layersCount = tile.codingStyleDefaultParameters.layersCount; - var componentsCount = siz.Csiz; - var precinctsSizes = getPrecinctSizesInImageScale(tile); - var l = 0, r = 0, c = 0, px = 0, py = 0; - - this.nextPacket = function JpxImage_nextPacket() { - // Section B.12.1.5 Component-position-resolution-layer - for (; c < componentsCount; ++c) { - var component = tile.components[c]; - var precinctsIterationSizes = precinctsSizes.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - for (; py < precinctsIterationSizes.maxNumHigh; py++) { - for (; px < precinctsIterationSizes.maxNumWide; px++) { - for (; r <= decompositionLevelsCount; r++) { - var resolution = component.resolutions[r]; - var sizeInImageScale = precinctsIterationSizes.resolutions[r]; - var k = getPrecinctIndexIfExist( - px, - py, - sizeInImageScale, - precinctsIterationSizes, - resolution); - if (k === null) { - continue; - } - for (; l < layersCount;) { - var packet = createPacket(resolution, k, l); - l++; - return packet; - } - l = 0; - } - r = 0; - } - px = 0; - } - py = 0; - } - throw new Error('JPX Error: Out of packets'); - }; - } - function getPrecinctIndexIfExist( - pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) { - var posX = pxIndex * precinctIterationSizes.minWidth; - var posY = pyIndex * precinctIterationSizes.minHeight; - if (posX % sizeInImageScale.width !== 0 || - posY % sizeInImageScale.height !== 0) { - return null; - } - var startPrecinctRowIndex = - (posY / sizeInImageScale.width) * - resolution.precinctParameters.numprecinctswide; - return (posX / sizeInImageScale.height) + startPrecinctRowIndex; - } - function getPrecinctSizesInImageScale(tile) { - var componentsCount = tile.components.length; - var minWidth = Number.MAX_VALUE; - var minHeight = Number.MAX_VALUE; - var maxNumWide = 0; - var maxNumHigh = 0; - var sizePerComponent = new Array(componentsCount); - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - var sizePerResolution = new Array(decompositionLevelsCount + 1); - var minWidthCurrentComponent = Number.MAX_VALUE; - var minHeightCurrentComponent = Number.MAX_VALUE; - var maxNumWideCurrentComponent = 0; - var maxNumHighCurrentComponent = 0; - var scale = 1; - for (var r = decompositionLevelsCount; r >= 0; --r) { - var resolution = component.resolutions[r]; - var widthCurrentResolution = - scale * resolution.precinctParameters.precinctWidth; - var heightCurrentResolution = - scale * resolution.precinctParameters.precinctHeight; - minWidthCurrentComponent = Math.min( - minWidthCurrentComponent, - widthCurrentResolution); - minHeightCurrentComponent = Math.min( - minHeightCurrentComponent, - heightCurrentResolution); - maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, - resolution.precinctParameters.numprecinctswide); - maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, - resolution.precinctParameters.numprecinctshigh); - sizePerResolution[r] = { - width: widthCurrentResolution, - height: heightCurrentResolution - }; - scale <<= 1; - } - minWidth = Math.min(minWidth, minWidthCurrentComponent); - minHeight = Math.min(minHeight, minHeightCurrentComponent); - maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent); - maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent); - sizePerComponent[c] = { - resolutions: sizePerResolution, - minWidth: minWidthCurrentComponent, - minHeight: minHeightCurrentComponent, - maxNumWide: maxNumWideCurrentComponent, - maxNumHigh: maxNumHighCurrentComponent - }; - } - return { - components: sizePerComponent, - minWidth: minWidth, - minHeight: minHeight, - maxNumWide: maxNumWide, - maxNumHigh: maxNumHigh - }; - } - function buildPackets(context) { - var siz = context.SIZ; - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var componentsCount = siz.Csiz; - // Creating resolutions and sub-bands for each component - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var decompositionLevelsCount = - component.codingStyleParameters.decompositionLevelsCount; - // Section B.5 Resolution levels and sub-bands - var resolutions = []; - var subbands = []; - for (var r = 0; r <= decompositionLevelsCount; r++) { - var blocksDimensions = getBlocksDimensions(context, component, r); - var resolution = {}; - var scale = 1 << (decompositionLevelsCount - r); - resolution.trx0 = Math.ceil(component.tcx0 / scale); - resolution.try0 = Math.ceil(component.tcy0 / scale); - resolution.trx1 = Math.ceil(component.tcx1 / scale); - resolution.try1 = Math.ceil(component.tcy1 / scale); - resolution.resLevel = r; - buildPrecincts(context, resolution, blocksDimensions); - resolutions.push(resolution); - - var subband; - if (r === 0) { - // one sub-band (LL) with last decomposition - subband = {}; - subband.type = 'LL'; - subband.tbx0 = Math.ceil(component.tcx0 / scale); - subband.tby0 = Math.ceil(component.tcy0 / scale); - subband.tbx1 = Math.ceil(component.tcx1 / scale); - subband.tby1 = Math.ceil(component.tcy1 / scale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolution.subbands = [subband]; - } else { - var bscale = 1 << (decompositionLevelsCount - r + 1); - var resolutionSubbands = []; - // three sub-bands (HL, LH and HH) with rest of decompositions - subband = {}; - subband.type = 'HL'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - subband = {}; - subband.type = 'LH'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - subband = {}; - subband.type = 'HH'; - subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); - subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); - subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); - subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); - subband.resolution = resolution; - buildCodeblocks(context, subband, blocksDimensions); - subbands.push(subband); - resolutionSubbands.push(subband); - - resolution.subbands = resolutionSubbands; - } - } - component.resolutions = resolutions; - component.subbands = subbands; - } - // Generate the packets sequence - var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; - switch (progressionOrder) { - case 0: - tile.packetsIterator = - new LayerResolutionComponentPositionIterator(context); - break; - case 1: - tile.packetsIterator = - new ResolutionLayerComponentPositionIterator(context); - break; - case 2: - tile.packetsIterator = - new ResolutionPositionComponentLayerIterator(context); - break; - case 3: - tile.packetsIterator = - new PositionComponentResolutionLayerIterator(context); - break; - case 4: - tile.packetsIterator = - new ComponentPositionResolutionLayerIterator(context); - break; - default: - throw new Error('JPX Error: Unsupported progression order ' + - progressionOrder); - } - } - function parseTilePackets(context, data, offset, dataLength) { - var position = 0; - var buffer, bufferSize = 0, skipNextBit = false; - function readBits(count) { - while (bufferSize < count) { - var b = data[offset + position]; - position++; - if (skipNextBit) { - buffer = (buffer << 7) | b; - bufferSize += 7; - skipNextBit = false; - } else { - buffer = (buffer << 8) | b; - bufferSize += 8; - } - if (b === 0xFF) { - skipNextBit = true; - } - } - bufferSize -= count; - return (buffer >>> bufferSize) & ((1 << count) - 1); - } - function skipMarkerIfEqual(value) { - if (data[offset + position - 1] === 0xFF && - data[offset + position] === value) { - skipBytes(1); - return true; - } else if (data[offset + position] === 0xFF && - data[offset + position + 1] === value) { - skipBytes(2); - return true; - } - return false; - } - function skipBytes(count) { - position += count; - } - function alignToByte() { - bufferSize = 0; - if (skipNextBit) { - position++; - skipNextBit = false; - } - } - function readCodingpasses() { - if (readBits(1) === 0) { - return 1; - } - if (readBits(1) === 0) { - return 2; - } - var value = readBits(2); - if (value < 3) { - return value + 3; - } - value = readBits(5); - if (value < 31) { - return value + 6; - } - value = readBits(7); - return value + 37; - } - var tileIndex = context.currentTile.index; - var tile = context.tiles[tileIndex]; - var sopMarkerUsed = context.COD.sopMarkerUsed; - var ephMarkerUsed = context.COD.ephMarkerUsed; - var packetsIterator = tile.packetsIterator; - while (position < dataLength) { - alignToByte(); - if (sopMarkerUsed && skipMarkerIfEqual(0x91)) { - // Skip also marker segment length and packet sequence ID - skipBytes(4); - } - var packet = packetsIterator.nextPacket(); - if (!readBits(1)) { - continue; - } - var layerNumber = packet.layerNumber; - var queue = [], codeblock; - for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { - codeblock = packet.codeblocks[i]; - var precinct = codeblock.precinct; - var codeblockColumn = codeblock.cbx - precinct.cbxMin; - var codeblockRow = codeblock.cby - precinct.cbyMin; - var codeblockIncluded = false; - var firstTimeInclusion = false; - var valueReady; - if (codeblock['included'] !== undefined) { - codeblockIncluded = !!readBits(1); - } else { - // reading inclusion tree - precinct = codeblock.precinct; - var inclusionTree, zeroBitPlanesTree; - if (precinct['inclusionTree'] !== undefined) { - inclusionTree = precinct.inclusionTree; - } else { - // building inclusion and zero bit-planes trees - var width = precinct.cbxMax - precinct.cbxMin + 1; - var height = precinct.cbyMax - precinct.cbyMin + 1; - inclusionTree = new InclusionTree(width, height, layerNumber); - zeroBitPlanesTree = new TagTree(width, height); - precinct.inclusionTree = inclusionTree; - precinct.zeroBitPlanesTree = zeroBitPlanesTree; - } - - if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { - while (true) { - if (readBits(1)) { - valueReady = !inclusionTree.nextLevel(); - if (valueReady) { - codeblock.included = true; - codeblockIncluded = firstTimeInclusion = true; - break; - } - } else { - inclusionTree.incrementValue(layerNumber); - break; - } - } - } - } - if (!codeblockIncluded) { - continue; - } - if (firstTimeInclusion) { - zeroBitPlanesTree = precinct.zeroBitPlanesTree; - zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); - while (true) { - if (readBits(1)) { - valueReady = !zeroBitPlanesTree.nextLevel(); - if (valueReady) { - break; - } - } else { - zeroBitPlanesTree.incrementValue(); - } - } - codeblock.zeroBitPlanes = zeroBitPlanesTree.value; - } - var codingpasses = readCodingpasses(); - while (readBits(1)) { - codeblock.Lblock++; - } - var codingpassesLog2 = log2(codingpasses); - // rounding down log2 - var bits = ((codingpasses < (1 << codingpassesLog2)) ? - codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; - var codedDataLength = readBits(bits); - queue.push({ - codeblock: codeblock, - codingpasses: codingpasses, - dataLength: codedDataLength - }); - } - alignToByte(); - if (ephMarkerUsed) { - skipMarkerIfEqual(0x92); - } - while (queue.length > 0) { - var packetItem = queue.shift(); - codeblock = packetItem.codeblock; - if (codeblock['data'] === undefined) { - codeblock.data = []; - } - codeblock.data.push({ - data: data, - start: offset + position, - end: offset + position + packetItem.dataLength, - codingpasses: packetItem.codingpasses - }); - position += packetItem.dataLength; - } - } - return position; - } - function copyCoefficients(coefficients, levelWidth, levelHeight, subband, - delta, mb, reversible, segmentationSymbolUsed) { - var x0 = subband.tbx0; - var y0 = subband.tby0; - var width = subband.tbx1 - subband.tbx0; - var codeblocks = subband.codeblocks; - var right = subband.type.charAt(0) === 'H' ? 1 : 0; - var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0; - - for (var i = 0, ii = codeblocks.length; i < ii; ++i) { - var codeblock = codeblocks[i]; - var blockWidth = codeblock.tbx1_ - codeblock.tbx0_; - var blockHeight = codeblock.tby1_ - codeblock.tby0_; - if (blockWidth === 0 || blockHeight === 0) { - continue; - } - if (codeblock['data'] === undefined) { - continue; - } - - var bitModel, currentCodingpassType; - bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, - codeblock.zeroBitPlanes, mb); - currentCodingpassType = 2; // first bit plane starts from cleanup - - // collect data - var data = codeblock.data, totalLength = 0, codingpasses = 0; - var j, jj, dataItem; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - totalLength += dataItem.end - dataItem.start; - codingpasses += dataItem.codingpasses; - } - var encodedData = new Uint8Array(totalLength); - var position = 0; - for (j = 0, jj = data.length; j < jj; j++) { - dataItem = data[j]; - var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); - encodedData.set(chunk, position); - position += chunk.length; - } - // decoding the item - var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); - bitModel.setDecoder(decoder); - - for (j = 0; j < codingpasses; j++) { - switch (currentCodingpassType) { - case 0: - bitModel.runSignificancePropogationPass(); - break; - case 1: - bitModel.runMagnitudeRefinementPass(); - break; - case 2: - bitModel.runCleanupPass(); - if (segmentationSymbolUsed) { - bitModel.checkSegmentationSymbol(); - } - break; - } - currentCodingpassType = (currentCodingpassType + 1) % 3; - } - - var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width; - var sign = bitModel.coefficentsSign; - var magnitude = bitModel.coefficentsMagnitude; - var bitsDecoded = bitModel.bitsDecoded; - var magnitudeCorrection = reversible ? 0 : 0.5; - var k, n, nb; - position = 0; - // Do the interleaving of Section F.3.3 here, so we do not need - // to copy later. LL level is not interleaved, just copied. - var interleave = (subband.type !== 'LL'); - for (j = 0; j < blockHeight; j++) { - var row = (offset / width) | 0; // row in the non-interleaved subband - var levelOffset = 2 * row * (levelWidth - width) + right + bottom; - for (k = 0; k < blockWidth; k++) { - n = magnitude[position]; - if (n !== 0) { - n = (n + magnitudeCorrection) * delta; - if (sign[position] !== 0) { - n = -n; - } - nb = bitsDecoded[position]; - var pos = interleave ? (levelOffset + (offset << 1)) : offset; - if (reversible && (nb >= mb)) { - coefficients[pos] = n; - } else { - coefficients[pos] = n * (1 << (mb - nb)); - } - } - offset++; - position++; - } - offset += width - blockWidth; - } - } - } - function transformTile(context, tile, c) { - var component = tile.components[c]; - var codingStyleParameters = component.codingStyleParameters; - var quantizationParameters = component.quantizationParameters; - var decompositionLevelsCount = - codingStyleParameters.decompositionLevelsCount; - var spqcds = quantizationParameters.SPqcds; - var scalarExpounded = quantizationParameters.scalarExpounded; - var guardBits = quantizationParameters.guardBits; - var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed; - var precision = context.components[c].precision; - - var reversible = codingStyleParameters.reversibleTransformation; - var transform = (reversible ? new ReversibleTransform() : - new IrreversibleTransform()); - - var subbandCoefficients = []; - var b = 0; - for (var i = 0; i <= decompositionLevelsCount; i++) { - var resolution = component.resolutions[i]; - - var width = resolution.trx1 - resolution.trx0; - var height = resolution.try1 - resolution.try0; - // Allocate space for the whole sublevel. - var coefficients = new Float32Array(width * height); - - for (var j = 0, jj = resolution.subbands.length; j < jj; j++) { - var mu, epsilon; - if (!scalarExpounded) { - // formula E-5 - mu = spqcds[0].mu; - epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); - } else { - mu = spqcds[b].mu; - epsilon = spqcds[b].epsilon; - b++; - } - - var subband = resolution.subbands[j]; - var gainLog2 = SubbandsGainLog2[subband.type]; - - // calulate quantization coefficient (Section E.1.1.1) - var delta = (reversible ? 1 : - Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048)); - var mb = (guardBits + epsilon - 1); - - // In the first resolution level, copyCoefficients will fill the - // whole array with coefficients. In the succeding passes, - // copyCoefficients will consecutively fill in the values that belong - // to the interleaved positions of the HL, LH, and HH coefficients. - // The LL coefficients will then be interleaved in Transform.iterate(). - copyCoefficients(coefficients, width, height, subband, delta, mb, - reversible, segmentationSymbolUsed); - } - subbandCoefficients.push({ - width: width, - height: height, - items: coefficients - }); - } - - var result = transform.calculate(subbandCoefficients, - component.tcx0, component.tcy0); - return { - left: component.tcx0, - top: component.tcy0, - width: result.width, - height: result.height, - items: result.items - }; - } - function transformComponents(context) { - var siz = context.SIZ; - var components = context.components; - var componentsCount = siz.Csiz; - var resultImages = []; - for (var i = 0, ii = context.tiles.length; i < ii; i++) { - var tile = context.tiles[i]; - var transformedTiles = []; - var c; - for (c = 0; c < componentsCount; c++) { - transformedTiles[c] = transformTile(context, tile, c); - } - var tile0 = transformedTiles[0]; - var out = new Uint8Array(tile0.items.length * componentsCount); - var result = { - left: tile0.left, - top: tile0.top, - width: tile0.width, - height: tile0.height, - items: out - }; - - // Section G.2.2 Inverse multi component transform - var shift, offset, max, min, maxK; - var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val; - if (tile.codingStyleDefaultParameters.multipleComponentTransform) { - var fourComponents = componentsCount === 4; - var y0items = transformedTiles[0].items; - var y1items = transformedTiles[1].items; - var y2items = transformedTiles[2].items; - var y3items = fourComponents ? transformedTiles[3].items : null; - - // HACK: The multiple component transform formulas below assume that - // all components have the same precision. With this in mind, we - // compute shift and offset only once. - shift = components[0].precision - 8; - offset = (128 << shift) + 0.5; - max = 255 * (1 << shift); - maxK = max * 0.5; - min = -maxK; - - var component0 = tile.components[0]; - var alpha01 = componentsCount - 3; - jj = y0items.length; - if (!component0.codingStyleParameters.reversibleTransformation) { - // inverse irreversible multiple component transform - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - r = y0 + 1.402 * y2; - g = y0 - 0.34413 * y1 - 0.71414 * y2; - b = y0 + 1.772 * y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } else { - // inverse reversible multiple component transform - for (j = 0; j < jj; j++, pos += alpha01) { - y0 = y0items[j] + offset; - y1 = y1items[j]; - y2 = y2items[j]; - g = y0 - ((y2 + y1) >> 2); - r = g + y2; - b = g + y1; - out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift; - out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift; - out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift; - } - } - if (fourComponents) { - for (j = 0, pos = 3; j < jj; j++, pos += 4) { - k = y3items[j]; - out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift; - } - } - } else { // no multi-component transform - for (c = 0; c < componentsCount; c++) { - var items = transformedTiles[c].items; - shift = components[c].precision - 8; - offset = (128 << shift) + 0.5; - max = (127.5 * (1 << shift)); - min = -max; - for (pos = c, j = 0, jj = items.length; j < jj; j++) { - val = items[j]; - out[pos] = val <= min ? 0 : - val >= max ? 255 : (val + offset) >> shift; - pos += componentsCount; - } - } - } - resultImages.push(result); - } - return resultImages; - } - function initializeTile(context, tileIndex) { - var siz = context.SIZ; - var componentsCount = siz.Csiz; - var tile = context.tiles[tileIndex]; - for (var c = 0; c < componentsCount; c++) { - var component = tile.components[c]; - var qcdOrQcc = (context.currentTile.QCC[c] !== undefined ? - context.currentTile.QCC[c] : context.currentTile.QCD); - component.quantizationParameters = qcdOrQcc; - var codOrCoc = (context.currentTile.COC[c] !== undefined ? - context.currentTile.COC[c] : context.currentTile.COD); - component.codingStyleParameters = codOrCoc; - } - tile.codingStyleDefaultParameters = context.currentTile.COD; - } - - // Section B.10.2 Tag trees - var TagTree = (function TagTreeClosure() { - function TagTree(width, height) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var level = { - width: width, - height: height, - items: [] - }; - this.levels.push(level); - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - TagTree.prototype = { - reset: function TagTree_reset(i, j) { - var currentLevel = 0, value = 0, level; - while (currentLevel < this.levels.length) { - level = this.levels[currentLevel]; - var index = i + j * level.width; - if (level.items[index] !== undefined) { - value = level.items[index]; - break; - } - level.index = index; - i >>= 1; - j >>= 1; - currentLevel++; - } - currentLevel--; - level = this.levels[currentLevel]; - level.items[level.index] = value; - this.currentLevel = currentLevel; - delete this.value; - }, - incrementValue: function TagTree_incrementValue() { - var level = this.levels[this.currentLevel]; - level.items[level.index]++; - }, - nextLevel: function TagTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - currentLevel--; - if (currentLevel < 0) { - this.value = value; - return false; - } - - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return TagTree; - })(); - - var InclusionTree = (function InclusionTreeClosure() { - function InclusionTree(width, height, defaultValue) { - var levelsLength = log2(Math.max(width, height)) + 1; - this.levels = []; - for (var i = 0; i < levelsLength; i++) { - var items = new Uint8Array(width * height); - for (var j = 0, jj = items.length; j < jj; j++) { - items[j] = defaultValue; - } - - var level = { - width: width, - height: height, - items: items - }; - this.levels.push(level); - - width = Math.ceil(width / 2); - height = Math.ceil(height / 2); - } - } - InclusionTree.prototype = { - reset: function InclusionTree_reset(i, j, stopValue) { - var currentLevel = 0; - while (currentLevel < this.levels.length) { - var level = this.levels[currentLevel]; - var index = i + j * level.width; - level.index = index; - var value = level.items[index]; - - if (value === 0xFF) { - break; - } - - if (value > stopValue) { - this.currentLevel = currentLevel; - // already know about this one, propagating the value to top levels - this.propagateValues(); - return false; - } - - i >>= 1; - j >>= 1; - currentLevel++; - } - this.currentLevel = currentLevel - 1; - return true; - }, - incrementValue: function InclusionTree_incrementValue(stopValue) { - var level = this.levels[this.currentLevel]; - level.items[level.index] = stopValue + 1; - this.propagateValues(); - }, - propagateValues: function InclusionTree_propagateValues() { - var levelIndex = this.currentLevel; - var level = this.levels[levelIndex]; - var currentValue = level.items[level.index]; - while (--levelIndex >= 0) { - level = this.levels[levelIndex]; - level.items[level.index] = currentValue; - } - }, - nextLevel: function InclusionTree_nextLevel() { - var currentLevel = this.currentLevel; - var level = this.levels[currentLevel]; - var value = level.items[level.index]; - level.items[level.index] = 0xFF; - currentLevel--; - if (currentLevel < 0) { - return false; - } - - this.currentLevel = currentLevel; - level = this.levels[currentLevel]; - level.items[level.index] = value; - return true; - } - }; - return InclusionTree; - })(); - - // Section D. Coefficient bit modeling - var BitModel = (function BitModelClosure() { - var UNIFORM_CONTEXT = 17; - var RUNLENGTH_CONTEXT = 18; - // Table D-1 - // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4), - // vv - sum of Vi (0..2), and hh - sum of Hi (0..2) - var LLAndLHContextsLabel = new Uint8Array([ - 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, - 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, - 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8 - ]); - var HLContextLabel = new Uint8Array([ - 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, - 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, - 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8 - ]); - var HHContextLabel = new Uint8Array([ - 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, - 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, - 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8 - ]); - - function BitModel(width, height, subband, zeroBitPlanes, mb) { - this.width = width; - this.height = height; - - this.contextLabelTable = (subband === 'HH' ? HHContextLabel : - (subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel)); - - var coefficientCount = width * height; - - // coefficients outside the encoding region treated as insignificant - // add border state cells for significanceState - this.neighborsSignificance = new Uint8Array(coefficientCount); - this.coefficentsSign = new Uint8Array(coefficientCount); - this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : - mb > 6 ? new Uint16Array(coefficientCount) : - new Uint8Array(coefficientCount); - this.processingFlags = new Uint8Array(coefficientCount); - - var bitsDecoded = new Uint8Array(coefficientCount); - if (zeroBitPlanes !== 0) { - for (var i = 0; i < coefficientCount; i++) { - bitsDecoded[i] = zeroBitPlanes; - } - } - this.bitsDecoded = bitsDecoded; - - this.reset(); - } - - BitModel.prototype = { - setDecoder: function BitModel_setDecoder(decoder) { - this.decoder = decoder; - }, - reset: function BitModel_reset() { - // We have 17 contexts that are accessed via context labels, - // plus the uniform and runlength context. - this.contexts = new Int8Array(19); - - // Contexts are packed into 1 byte: - // highest 7 bits carry the index, lowest bit carries mps - this.contexts[0] = (4 << 1) | 0; - this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0; - this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0; - }, - setNeighborsSignificance: - function BitModel_setNeighborsSignificance(row, column, index) { - var neighborsSignificance = this.neighborsSignificance; - var width = this.width, height = this.height; - var left = (column > 0); - var right = (column + 1 < width); - var i; - - if (row > 0) { - i = index - width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - - if (row + 1 < height) { - i = index + width; - if (left) { - neighborsSignificance[i - 1] += 0x10; - } - if (right) { - neighborsSignificance[i + 1] += 0x10; - } - neighborsSignificance[i] += 0x04; - } - - if (left) { - neighborsSignificance[index - 1] += 0x01; - } - if (right) { - neighborsSignificance[index + 1] += 0x01; - } - neighborsSignificance[index] |= 0x80; - }, - runSignificancePropogationPass: - function BitModel_runSignificancePropogationPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var neighborsSignificance = this.neighborsSignificance; - var processingFlags = this.processingFlags; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processedInverseMask = ~1; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - - for (var i0 = 0; i0 < height; i0 += 4) { - for (var j = 0; j < width; j++) { - var index = i0 * width + j; - for (var i1 = 0; i1 < 4; i1++, index += width) { - var i = i0 + i1; - if (i >= height) { - break; - } - // clear processed flag first - processingFlags[index] &= processedInverseMask; - - if (coefficentsMagnitude[index] || - !neighborsSignificance[index]) { - continue; - } - - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision) { - var sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - decodeSignBit: function BitModel_decodeSignBit(row, column, index) { - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contribution, sign0, sign1, significance1; - var contextLabel, decoded; - - // calculate horizontal contribution - significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0); - if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) { - sign1 = coefficentsSign[index + 1]; - if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign1 - sign0; - } else { - contribution = 1 - sign1 - sign1; - } - } else if (significance1) { - sign0 = coefficentsSign[index - 1]; - contribution = 1 - sign0 - sign0; - } else { - contribution = 0; - } - var horizontalContribution = 3 * contribution; - - // calculate vertical contribution and combine with the horizontal - significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0); - if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) { - sign1 = coefficentsSign[index + width]; - if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign1 - sign0 + horizontalContribution; - } else { - contribution = 1 - sign1 - sign1 + horizontalContribution; - } - } else if (significance1) { - sign0 = coefficentsSign[index - width]; - contribution = 1 - sign0 - sign0 + horizontalContribution; - } else { - contribution = horizontalContribution; - } - - if (contribution >= 0) { - contextLabel = 9 + contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel); - } else { - contextLabel = 9 - contribution; - decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1; - } - return decoded; - }, - runMagnitudeRefinementPass: - function BitModel_runMagnitudeRefinementPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var coefficentsMagnitude = this.coefficentsMagnitude; - var neighborsSignificance = this.neighborsSignificance; - var contexts = this.contexts; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var length = width * height; - var width4 = width * 4; - - for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) { - indexNext = Math.min(length, index0 + width4); - for (var j = 0; j < width; j++) { - for (var index = index0 + j; index < indexNext; index += width) { - - // significant but not those that have just become - if (!coefficentsMagnitude[index] || - (processingFlags[index] & processedMask) !== 0) { - continue; - } - - var contextLabel = 16; - if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) { - processingFlags[index] ^= firstMagnitudeBitMask; - // first refinement - var significance = neighborsSignificance[index] & 127; - contextLabel = significance === 0 ? 15 : 14; - } - - var bit = decoder.readBit(contexts, contextLabel); - coefficentsMagnitude[index] = - (coefficentsMagnitude[index] << 1) | bit; - bitsDecoded[index]++; - processingFlags[index] |= processedMask; - } - } - } - }, - runCleanupPass: function BitModel_runCleanupPass() { - var decoder = this.decoder; - var width = this.width, height = this.height; - var neighborsSignificance = this.neighborsSignificance; - var coefficentsMagnitude = this.coefficentsMagnitude; - var coefficentsSign = this.coefficentsSign; - var contexts = this.contexts; - var labels = this.contextLabelTable; - var bitsDecoded = this.bitsDecoded; - var processingFlags = this.processingFlags; - var processedMask = 1; - var firstMagnitudeBitMask = 2; - var oneRowDown = width; - var twoRowsDown = width * 2; - var threeRowsDown = width * 3; - var iNext; - for (var i0 = 0; i0 < height; i0 = iNext) { - iNext = Math.min(i0 + 4, height); - var indexBase = i0 * width; - var checkAllEmpty = i0 + 3 < height; - for (var j = 0; j < width; j++) { - var index0 = indexBase + j; - // using the property: labels[neighborsSignificance[index]] === 0 - // when neighborsSignificance[index] === 0 - var allEmpty = (checkAllEmpty && - processingFlags[index0] === 0 && - processingFlags[index0 + oneRowDown] === 0 && - processingFlags[index0 + twoRowsDown] === 0 && - processingFlags[index0 + threeRowsDown] === 0 && - neighborsSignificance[index0] === 0 && - neighborsSignificance[index0 + oneRowDown] === 0 && - neighborsSignificance[index0 + twoRowsDown] === 0 && - neighborsSignificance[index0 + threeRowsDown] === 0); - var i1 = 0, index = index0; - var i = i0, sign; - if (allEmpty) { - var hasSignificantCoefficent = - decoder.readBit(contexts, RUNLENGTH_CONTEXT); - if (!hasSignificantCoefficent) { - bitsDecoded[index0]++; - bitsDecoded[index0 + oneRowDown]++; - bitsDecoded[index0 + twoRowsDown]++; - bitsDecoded[index0 + threeRowsDown]++; - continue; // next column - } - i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | - decoder.readBit(contexts, UNIFORM_CONTEXT); - if (i1 !== 0) { - i = i0 + i1; - index += i1 * width; - } - - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - - index = index0; - for (var i2 = i0; i2 <= i; i2++, index += width) { - bitsDecoded[index]++; - } - - i1++; - } - for (i = i0 + i1; i < iNext; i++, index += width) { - if (coefficentsMagnitude[index] || - (processingFlags[index] & processedMask) !== 0) { - continue; - } - - var contextLabel = labels[neighborsSignificance[index]]; - var decision = decoder.readBit(contexts, contextLabel); - if (decision === 1) { - sign = this.decodeSignBit(i, j, index); - coefficentsSign[index] = sign; - coefficentsMagnitude[index] = 1; - this.setNeighborsSignificance(i, j, index); - processingFlags[index] |= firstMagnitudeBitMask; - } - bitsDecoded[index]++; - } - } - } - }, - checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() { - var decoder = this.decoder; - var contexts = this.contexts; - var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) | - (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) | - (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) | - decoder.readBit(contexts, UNIFORM_CONTEXT); - if (symbol !== 0xA) { - throw new Error('JPX Error: Invalid segmentation symbol'); - } - } - }; - - return BitModel; - })(); - - // Section F, Discrete wavelet transformation - var Transform = (function TransformClosure() { - function Transform() {} - - Transform.prototype.calculate = - function transformCalculate(subbands, u0, v0) { - var ll = subbands[0]; - for (var i = 1, ii = subbands.length; i < ii; i++) { - ll = this.iterate(ll, subbands[i], u0, v0); - } - return ll; - }; - Transform.prototype.extend = function extend(buffer, offset, size) { - // Section F.3.7 extending... using max extension of 4 - var i1 = offset - 1, j1 = offset + 1; - var i2 = offset + size - 2, j2 = offset + size; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1--] = buffer[j1++]; - buffer[j2++] = buffer[i2--]; - buffer[i1] = buffer[j1]; - buffer[j2] = buffer[i2]; - }; - Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, - u0, v0) { - var llWidth = ll.width, llHeight = ll.height, llItems = ll.items; - var width = hl_lh_hh.width; - var height = hl_lh_hh.height; - var items = hl_lh_hh.items; - var i, j, k, l, u, v; - - // Interleave LL according to Section F.3.3 - for (k = 0, i = 0; i < llHeight; i++) { - l = i * 2 * width; - for (j = 0; j < llWidth; j++, k++, l += 2) { - items[l] = llItems[k]; - } - } - // The LL band is not needed anymore. - llItems = ll.items = null; - - var bufferPadding = 4; - var rowBuffer = new Float32Array(width + 2 * bufferPadding); - - // Section F.3.4 HOR_SR - if (width === 1) { - // if width = 1, when u0 even keep items as is, when odd divide by 2 - if ((u0 & 1) !== 0) { - for (v = 0, k = 0; v < height; v++, k += width) { - items[k] *= 0.5; - } - } - } else { - for (v = 0, k = 0; v < height; v++, k += width) { - rowBuffer.set(items.subarray(k, k + width), bufferPadding); - - this.extend(rowBuffer, bufferPadding, width); - this.filter(rowBuffer, bufferPadding, width); - - items.set( - rowBuffer.subarray(bufferPadding, bufferPadding + width), - k); - } - } - - // Accesses to the items array can take long, because it may not fit into - // CPU cache and has to be fetched from main memory. Since subsequent - // accesses to the items array are not local when reading columns, we - // have a cache miss every time. To reduce cache misses, get up to - // 'numBuffers' items at a time and store them into the individual - // buffers. The colBuffers should be small enough to fit into CPU cache. - var numBuffers = 16; - var colBuffers = []; - for (i = 0; i < numBuffers; i++) { - colBuffers.push(new Float32Array(height + 2 * bufferPadding)); - } - var b, currentBuffer = 0; - ll = bufferPadding + height; - - // Section F.3.5 VER_SR - if (height === 1) { - // if height = 1, when v0 even keep items as is, when odd divide by 2 - if ((v0 & 1) !== 0) { - for (u = 0; u < width; u++) { - items[u] *= 0.5; - } - } - } else { - for (u = 0; u < width; u++) { - // if we ran out of buffers, copy several image columns at once - if (currentBuffer === 0) { - numBuffers = Math.min(width - u, numBuffers); - for (k = u, l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - colBuffers[b][l] = items[k + b]; - } - } - currentBuffer = numBuffers; - } - - currentBuffer--; - var buffer = colBuffers[currentBuffer]; - this.extend(buffer, bufferPadding, height); - this.filter(buffer, bufferPadding, height); - - // If this is last buffer in this group of buffers, flush all buffers. - if (currentBuffer === 0) { - k = u - numBuffers + 1; - for (l = bufferPadding; l < ll; k += width, l++) { - for (b = 0; b < numBuffers; b++) { - items[k + b] = colBuffers[b][l]; - } - } - } - } - } - - return { - width: width, - height: height, - items: items - }; - }; - return Transform; - })(); - - // Section 3.8.2 Irreversible 9-7 filter - var IrreversibleTransform = (function IrreversibleTransformClosure() { - function IrreversibleTransform() { - Transform.call(this); - } - - IrreversibleTransform.prototype = Object.create(Transform.prototype); - IrreversibleTransform.prototype.filter = - function irreversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n, current, next; - - var alpha = -1.586134342059924; - var beta = -0.052980118572961; - var gamma = 0.882911075530934; - var delta = 0.443506852043971; - var K = 1.230174104914001; - var K_ = 1 / K; - - // step 1 is combined with step 3 - - // step 2 - j = offset - 3; - for (n = len + 4; n--; j += 2) { - x[j] *= K_; - } - - // step 1 & 3 - j = offset - 2; - current = delta * x[j -1]; - for (n = len + 3; n--; j += 2) { - next = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - if (n--) { - j += 2; - current = delta * x[j + 1]; - x[j] = K * x[j] - current - next; - } else { - break; - } - } - - // step 4 - j = offset - 1; - current = gamma * x[j - 1]; - for (n = len + 2; n--; j += 2) { - next = gamma * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = gamma * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - - // step 5 - j = offset; - current = beta * x[j - 1]; - for (n = len + 1; n--; j += 2) { - next = beta * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = beta * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - - // step 6 - if (len !== 0) { - j = offset + 1; - current = alpha * x[j - 1]; - for (n = len; n--; j += 2) { - next = alpha * x[j + 1]; - x[j] -= current + next; - if (n--) { - j += 2; - current = alpha * x[j + 1]; - x[j] -= current + next; - } else { - break; - } - } - } - }; - - return IrreversibleTransform; - })(); - - // Section 3.8.1 Reversible 5-3 filter - var ReversibleTransform = (function ReversibleTransformClosure() { - function ReversibleTransform() { - Transform.call(this); - } - - ReversibleTransform.prototype = Object.create(Transform.prototype); - ReversibleTransform.prototype.filter = - function reversibleTransformFilter(x, offset, length) { - var len = length >> 1; - offset = offset | 0; - var j, n; - - for (j = offset, n = len + 1; n--; j += 2) { - x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2; - } - - for (j = offset + 1, n = len; n--; j += 2) { - x[j] += (x[j - 1] + x[j + 1]) >> 1; - } - }; - - return ReversibleTransform; - })(); - - return JpxImage; -})(); - -exports.JpxImage = JpxImage; -})); - - - -(function (root, factory) { - { - factory((root.pdfjsCoreMurmurHash3 = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var Uint32ArrayView = sharedUtil.Uint32ArrayView; - -var MurmurHash3_64 = (function MurmurHash3_64Closure (seed) { - // Workaround for missing math precison in JS. - var MASK_HIGH = 0xffff0000; - var MASK_LOW = 0xffff; - - function MurmurHash3_64 (seed) { - var SEED = 0xc3d2e1f0; - this.h1 = seed ? seed & 0xffffffff : SEED; - this.h2 = seed ? seed & 0xffffffff : SEED; - } - - var alwaysUseUint32ArrayView = false; - // old webkits have issues with non-aligned arrays - try { - new Uint32Array(new Uint8Array(5).buffer, 0, 1); - } catch (e) { - alwaysUseUint32ArrayView = true; - } - - MurmurHash3_64.prototype = { - update: function MurmurHash3_64_update(input) { - var useUint32ArrayView = alwaysUseUint32ArrayView; - var i; - if (typeof input === 'string') { - var data = new Uint8Array(input.length * 2); - var length = 0; - for (i = 0; i < input.length; i++) { - var code = input.charCodeAt(i); - if (code <= 0xff) { - data[length++] = code; - } - else { - data[length++] = code >>> 8; - data[length++] = code & 0xff; - } - } - } else if (input instanceof Uint8Array) { - data = input; - length = data.length; - } else if (typeof input === 'object' && ('length' in input)) { - // processing regular arrays as well, e.g. for IE9 - data = input; - length = data.length; - useUint32ArrayView = true; - } else { - throw new Error('Wrong data format in MurmurHash3_64_update. ' + - 'Input must be a string or array.'); - } - - var blockCounts = length >> 2; - var tailLength = length - blockCounts * 4; - // we don't care about endianness here - var dataUint32 = useUint32ArrayView ? - new Uint32ArrayView(data, blockCounts) : - new Uint32Array(data.buffer, 0, blockCounts); - var k1 = 0; - var k2 = 0; - var h1 = this.h1; - var h2 = this.h2; - var C1 = 0xcc9e2d51; - var C2 = 0x1b873593; - var C1_LOW = C1 & MASK_LOW; - var C2_LOW = C2 & MASK_LOW; - - for (i = 0; i < blockCounts; i++) { - if (i & 1) { - k1 = dataUint32[i]; - k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); - k1 = k1 << 15 | k1 >>> 17; - k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); - h1 ^= k1; - h1 = h1 << 13 | h1 >>> 19; - h1 = h1 * 5 + 0xe6546b64; - } else { - k2 = dataUint32[i]; - k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW); - k2 = k2 << 15 | k2 >>> 17; - k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW); - h2 ^= k2; - h2 = h2 << 13 | h2 >>> 19; - h2 = h2 * 5 + 0xe6546b64; - } - } - - k1 = 0; - - switch (tailLength) { - case 3: - k1 ^= data[blockCounts * 4 + 2] << 16; - /* falls through */ - case 2: - k1 ^= data[blockCounts * 4 + 1] << 8; - /* falls through */ - case 1: - k1 ^= data[blockCounts * 4]; - /* falls through */ - k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW); - k1 = k1 << 15 | k1 >>> 17; - k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW); - if (blockCounts & 1) { - h1 ^= k1; - } else { - h2 ^= k1; - } - } - - this.h1 = h1; - this.h2 = h2; - return this; - }, - - hexdigest: function MurmurHash3_64_hexdigest () { - var h1 = this.h1; - var h2 = this.h2; - - h1 ^= h2 >>> 1; - h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW); - h2 = (h2 * 0xff51afd7 & MASK_HIGH) | - (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16); - h1 ^= h2 >>> 1; - h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW); - h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) | - (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16); - h1 ^= h2 >>> 1; - - for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) { - var hex = (arr[i] >>> 0).toString(16); - while (hex.length < 8) { - hex = '0' + hex; - } - str += hex; - } - - return str; - } - }; - - return MurmurHash3_64; -})(); - -exports.MurmurHash3_64 = MurmurHash3_64; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePrimitives = {}), root.pdfjsSharedUtil); - } -}(this, function (exports, sharedUtil) { - -var isArray = sharedUtil.isArray; - -var Name = (function NameClosure() { - function Name(name) { - this.name = name; - } - - Name.prototype = {}; - - var nameCache = {}; - - Name.get = function Name_get(name) { - var nameValue = nameCache[name]; - return (nameValue ? nameValue : (nameCache[name] = new Name(name))); - }; - - return Name; -})(); - -var Cmd = (function CmdClosure() { - function Cmd(cmd) { - this.cmd = cmd; - } - - Cmd.prototype = {}; - - var cmdCache = {}; - - Cmd.get = function Cmd_get(cmd) { - var cmdValue = cmdCache[cmd]; - return (cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd))); - }; - - return Cmd; -})(); - -var Dict = (function DictClosure() { - var nonSerializable = function nonSerializableClosure() { - return nonSerializable; // creating closure on some variable - }; - - var GETALL_DICTIONARY_TYPES_WHITELIST = { - 'Background': true, - 'ExtGState': true, - 'Halftone': true, - 'Layout': true, - 'Mask': true, - 'Pagination': true, - 'Printing': true - }; - - function isRecursionAllowedFor(dict) { - if (!isName(dict.Type)) { - return true; - } - var dictType = dict.Type.name; - return GETALL_DICTIONARY_TYPES_WHITELIST[dictType] === true; - } - - // xref is optional - function Dict(xref) { - // Map should only be used internally, use functions below to access. - this.map = Object.create(null); - this.xref = xref; - this.objId = null; - this.__nonSerializable__ = nonSerializable; // disable cloning of the Dict - } - - Dict.prototype = { - assignXref: function Dict_assignXref(newXref) { - this.xref = newXref; - }, - - // automatically dereferences Ref objects - get: function Dict_get(key1, key2, key3) { - var value; - var xref = this.xref; - if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || - typeof key2 === 'undefined') { - return xref ? xref.fetchIfRef(value) : value; - } - if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || - typeof key3 === 'undefined') { - return xref ? xref.fetchIfRef(value) : value; - } - value = this.map[key3] || null; - return xref ? xref.fetchIfRef(value) : value; - }, - - // Same as get(), but returns a promise and uses fetchIfRefAsync(). - getAsync: function Dict_getAsync(key1, key2, key3) { - var value; - var xref = this.xref; - if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map || - typeof key2 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - } - if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map || - typeof key3 === 'undefined') { - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - } - value = this.map[key3] || null; - if (xref) { - return xref.fetchIfRefAsync(value); - } - return Promise.resolve(value); - }, - - // Same as get(), but dereferences all elements if the result is an Array. - getArray: function Dict_getArray(key1, key2, key3) { - var value = this.get(key1, key2, key3); - var xref = this.xref; - if (!isArray(value) || !xref) { - return value; - } - value = value.slice(); // Ensure that we don't modify the Dict data. - for (var i = 0, ii = value.length; i < ii; i++) { - if (!isRef(value[i])) { - continue; - } - value[i] = xref.fetch(value[i]); - } - return value; - }, - - // no dereferencing - getRaw: function Dict_getRaw(key) { - return this.map[key]; - }, - - // creates new map and dereferences all Refs - getAll: function Dict_getAll() { - var all = Object.create(null); - var queue = null; - var key, obj; - for (key in this.map) { - obj = this.get(key); - if (obj instanceof Dict) { - if (isRecursionAllowedFor(obj)) { - (queue || (queue = [])).push({target: all, key: key, obj: obj}); - } else { - all[key] = this.getRaw(key); - } - } else { - all[key] = obj; - } - } - if (!queue) { - return all; - } - - // trying to take cyclic references into the account - var processed = Object.create(null); - while (queue.length > 0) { - var item = queue.shift(); - var itemObj = item.obj; - var objId = itemObj.objId; - if (objId && objId in processed) { - item.target[item.key] = processed[objId]; - continue; - } - var dereferenced = Object.create(null); - for (key in itemObj.map) { - obj = itemObj.get(key); - if (obj instanceof Dict) { - if (isRecursionAllowedFor(obj)) { - queue.push({target: dereferenced, key: key, obj: obj}); - } else { - dereferenced[key] = itemObj.getRaw(key); - } - } else { - dereferenced[key] = obj; - } - } - if (objId) { - processed[objId] = dereferenced; - } - item.target[item.key] = dereferenced; - } - return all; - }, - - getKeys: function Dict_getKeys() { - return Object.keys(this.map); - }, - - set: function Dict_set(key, value) { - this.map[key] = value; - }, - - has: function Dict_has(key) { - return key in this.map; - }, - - forEach: function Dict_forEach(callback) { - for (var key in this.map) { - callback(key, this.get(key)); - } - } - }; - - Dict.empty = new Dict(null); - - Dict.merge = function Dict_merge(xref, dictArray) { - var mergedDict = new Dict(xref); - - for (var i = 0, ii = dictArray.length; i < ii; i++) { - var dict = dictArray[i]; - if (!isDict(dict)) { - continue; - } - for (var keyName in dict.map) { - if (mergedDict.map[keyName]) { - continue; - } - mergedDict.map[keyName] = dict.map[keyName]; - } - } - return mergedDict; - }; - - return Dict; -})(); - -var Ref = (function RefClosure() { - function Ref(num, gen) { - this.num = num; - this.gen = gen; - } - - Ref.prototype = { - toString: function Ref_toString() { - // This function is hot, so we make the string as compact as possible. - // |this.gen| is almost always zero, so we treat that case specially. - var str = this.num + 'R'; - if (this.gen !== 0) { - str += this.gen; - } - return str; - } - }; - - return Ref; -})(); - -// The reference is identified by number and generation. -// This structure stores only one instance of the reference. -var RefSet = (function RefSetClosure() { - function RefSet() { - this.dict = {}; - } - - RefSet.prototype = { - has: function RefSet_has(ref) { - return ref.toString() in this.dict; - }, - - put: function RefSet_put(ref) { - this.dict[ref.toString()] = true; - }, - - remove: function RefSet_remove(ref) { - delete this.dict[ref.toString()]; - } - }; - - return RefSet; -})(); - -var RefSetCache = (function RefSetCacheClosure() { - function RefSetCache() { - this.dict = Object.create(null); - } - - RefSetCache.prototype = { - get: function RefSetCache_get(ref) { - return this.dict[ref.toString()]; - }, - - has: function RefSetCache_has(ref) { - return ref.toString() in this.dict; - }, - - put: function RefSetCache_put(ref, obj) { - this.dict[ref.toString()] = obj; - }, - - putAlias: function RefSetCache_putAlias(ref, aliasRef) { - this.dict[ref.toString()] = this.get(aliasRef); - }, - - forEach: function RefSetCache_forEach(fn, thisArg) { - for (var i in this.dict) { - fn.call(thisArg, this.dict[i]); - } - }, - - clear: function RefSetCache_clear() { - this.dict = Object.create(null); - } - }; - - return RefSetCache; -})(); - -function isName(v) { - return v instanceof Name; -} - -function isCmd(v, cmd) { - return v instanceof Cmd && (cmd === undefined || v.cmd === cmd); -} - -function isDict(v, type) { - if (!(v instanceof Dict)) { - return false; - } - if (!type) { - return true; - } - var dictType = v.get('Type'); - return isName(dictType) && dictType.name === type; -} - -function isRef(v) { - return v instanceof Ref; -} - -function isStream(v) { - return typeof v === 'object' && v !== null && v.getBytes !== undefined; -} - -exports.Cmd = Cmd; -exports.Dict = Dict; -exports.Name = Name; -exports.Ref = Ref; -exports.RefSet = RefSet; -exports.RefSetCache = RefSetCache; -exports.isCmd = isCmd; -exports.isDict = isDict; -exports.isName = isName; -exports.isRef = isRef; -exports.isStream = isStream; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreStream = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreJbig2, root.pdfjsCoreJpg, - root.pdfjsCoreJpx); - } -}(this, function (exports, sharedUtil, corePrimitives, coreJbig2, coreJpg, - coreJpx) { - -var Util = sharedUtil.Util; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var shadow = sharedUtil.shadow; -var warn = sharedUtil.warn; -var Dict = corePrimitives.Dict; -var Jbig2Image = coreJbig2.Jbig2Image; -var JpegImage = coreJpg.JpegImage; -var JpxImage = coreJpx.JpxImage; - -var coreParser; // see _setCoreParser below -var EOF; // = coreParser.EOF; -var Lexer; // = coreParser.Lexer; - -var coreColorSpace; // see _setCoreColorSpace below -var ColorSpace; // = coreColorSpace.ColorSpace; - -var Stream = (function StreamClosure() { - function Stream(arrayBuffer, start, length, dict) { - this.bytes = (arrayBuffer instanceof Uint8Array ? - arrayBuffer : new Uint8Array(arrayBuffer)); - this.start = start || 0; - this.pos = this.start; - this.end = (start + length) || this.bytes.length; - this.dict = dict; - } - - // required methods for a stream. if a particular stream does not - // implement these, an error should be thrown - Stream.prototype = { - get length() { - return this.end - this.start; - }, - get isEmpty() { - return this.length === 0; - }, - getByte: function Stream_getByte() { - if (this.pos >= this.end) { - return -1; - } - return this.bytes[this.pos++]; - }, - getUint16: function Stream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - getInt32: function Stream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - // returns subarray of original buffer - // should only be read - getBytes: function Stream_getBytes(length) { - var bytes = this.bytes; - var pos = this.pos; - var strEnd = this.end; - - if (!length) { - return bytes.subarray(pos, strEnd); - } - var end = pos + length; - if (end > strEnd) { - end = strEnd; - } - this.pos = end; - return bytes.subarray(pos, end); - }, - peekByte: function Stream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - peekBytes: function Stream_peekBytes(length) { - var bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - }, - skip: function Stream_skip(n) { - if (!n) { - n = 1; - } - this.pos += n; - }, - reset: function Stream_reset() { - this.pos = this.start; - }, - moveStart: function Stream_moveStart() { - this.start = this.pos; - }, - makeSubStream: function Stream_makeSubStream(start, length, dict) { - return new Stream(this.bytes.buffer, start, length, dict); - }, - isStream: true - }; - - return Stream; -})(); - -var StringStream = (function StringStreamClosure() { - function StringStream(str) { - var length = str.length; - var bytes = new Uint8Array(length); - for (var n = 0; n < length; ++n) { - bytes[n] = str.charCodeAt(n); - } - Stream.call(this, bytes); - } - - StringStream.prototype = Stream.prototype; - - return StringStream; -})(); - -// super class for the decoding streams -var DecodeStream = (function DecodeStreamClosure() { - // Lots of DecodeStreams are created whose buffers are never used. For these - // we share a single empty buffer. This is (a) space-efficient and (b) avoids - // having special cases that would be required if we used |null| for an empty - // buffer. - var emptyBuffer = new Uint8Array(0); - - function DecodeStream(maybeMinBufferLength) { - this.pos = 0; - this.bufferLength = 0; - this.eof = false; - this.buffer = emptyBuffer; - this.minBufferLength = 512; - if (maybeMinBufferLength) { - // Compute the first power of two that is as big as maybeMinBufferLength. - while (this.minBufferLength < maybeMinBufferLength) { - this.minBufferLength *= 2; - } - } - } - - DecodeStream.prototype = { - get isEmpty() { - while (!this.eof && this.bufferLength === 0) { - this.readBlock(); - } - return this.bufferLength === 0; - }, - ensureBuffer: function DecodeStream_ensureBuffer(requested) { - var buffer = this.buffer; - if (requested <= buffer.byteLength) { - return buffer; - } - var size = this.minBufferLength; - while (size < requested) { - size *= 2; - } - var buffer2 = new Uint8Array(size); - buffer2.set(buffer); - return (this.buffer = buffer2); - }, - getByte: function DecodeStream_getByte() { - var pos = this.pos; - while (this.bufferLength <= pos) { - if (this.eof) { - return -1; - } - this.readBlock(); - } - return this.buffer[this.pos++]; - }, - getUint16: function DecodeStream_getUint16() { - var b0 = this.getByte(); - var b1 = this.getByte(); - if (b0 === -1 || b1 === -1) { - return -1; - } - return (b0 << 8) + b1; - }, - getInt32: function DecodeStream_getInt32() { - var b0 = this.getByte(); - var b1 = this.getByte(); - var b2 = this.getByte(); - var b3 = this.getByte(); - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - }, - getBytes: function DecodeStream_getBytes(length) { - var end, pos = this.pos; - - if (length) { - this.ensureBuffer(pos + length); - end = pos + length; - - while (!this.eof && this.bufferLength < end) { - this.readBlock(); - } - var bufEnd = this.bufferLength; - if (end > bufEnd) { - end = bufEnd; - } - } else { - while (!this.eof) { - this.readBlock(); - } - end = this.bufferLength; - } - - this.pos = end; - return this.buffer.subarray(pos, end); - }, - peekByte: function DecodeStream_peekByte() { - var peekedByte = this.getByte(); - this.pos--; - return peekedByte; - }, - peekBytes: function DecodeStream_peekBytes(length) { - var bytes = this.getBytes(length); - this.pos -= bytes.length; - return bytes; - }, - makeSubStream: function DecodeStream_makeSubStream(start, length, dict) { - var end = start + length; - while (this.bufferLength <= end && !this.eof) { - this.readBlock(); - } - return new Stream(this.buffer, start, length, dict); - }, - skip: function DecodeStream_skip(n) { - if (!n) { - n = 1; - } - this.pos += n; - }, - reset: function DecodeStream_reset() { - this.pos = 0; - }, - getBaseStreams: function DecodeStream_getBaseStreams() { - if (this.str && this.str.getBaseStreams) { - return this.str.getBaseStreams(); - } - return []; - } - }; - - return DecodeStream; -})(); - -var StreamsSequenceStream = (function StreamsSequenceStreamClosure() { - function StreamsSequenceStream(streams) { - this.streams = streams; - DecodeStream.call(this, /* maybeLength = */ null); - } - - StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype); - - StreamsSequenceStream.prototype.readBlock = - function streamSequenceStreamReadBlock() { - - var streams = this.streams; - if (streams.length === 0) { - this.eof = true; - return; - } - var stream = streams.shift(); - var chunk = stream.getBytes(); - var bufferLength = this.bufferLength; - var newLength = bufferLength + chunk.length; - var buffer = this.ensureBuffer(newLength); - buffer.set(chunk, bufferLength); - this.bufferLength = newLength; - }; - - StreamsSequenceStream.prototype.getBaseStreams = - function StreamsSequenceStream_getBaseStreams() { - - var baseStreams = []; - for (var i = 0, ii = this.streams.length; i < ii; i++) { - var stream = this.streams[i]; - if (stream.getBaseStreams) { - Util.appendToArray(baseStreams, stream.getBaseStreams()); - } - } - return baseStreams; - }; - - return StreamsSequenceStream; -})(); - -var FlateStream = (function FlateStreamClosure() { - var codeLenCodeMap = new Int32Array([ - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 - ]); - - var lengthDecode = new Int32Array([ - 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, - 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, - 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, - 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102 - ]); - - var distDecode = new Int32Array([ - 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, - 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, - 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, - 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001 - ]); - - var fixedLitCodeTab = [new Int32Array([ - 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, - 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, - 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, - 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, - 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, - 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, - 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, - 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, - 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, - 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, - 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, - 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, - 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, - 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, - 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, - 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, - 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, - 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, - 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, - 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, - 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, - 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, - 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, - 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, - 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, - 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, - 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, - 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, - 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, - 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, - 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, - 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, - 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, - 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, - 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, - 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, - 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, - 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, - 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, - 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, - 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, - 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, - 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, - 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, - 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, - 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, - 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, - 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, - 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, - 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, - 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, - 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, - 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, - 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, - 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, - 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, - 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, - 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, - 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, - 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, - 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, - 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, - 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, - 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff - ]), 9]; - - var fixedDistCodeTab = [new Int32Array([ - 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, - 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, - 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, - 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000 - ]), 5]; - - function FlateStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - var cmf = str.getByte(); - var flg = str.getByte(); - if (cmf === -1 || flg === -1) { - error('Invalid header in flate stream: ' + cmf + ', ' + flg); - } - if ((cmf & 0x0f) !== 0x08) { - error('Unknown compression method in flate stream: ' + cmf + ', ' + flg); - } - if ((((cmf << 8) + flg) % 31) !== 0) { - error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg); - } - if (flg & 0x20) { - error('FDICT bit set in flate stream: ' + cmf + ', ' + flg); - } - - this.codeSize = 0; - this.codeBuf = 0; - - DecodeStream.call(this, maybeLength); - } - - FlateStream.prototype = Object.create(DecodeStream.prototype); - - FlateStream.prototype.getBits = function FlateStream_getBits(bits) { - var str = this.str; - var codeSize = this.codeSize; - var codeBuf = this.codeBuf; - - var b; - while (codeSize < bits) { - if ((b = str.getByte()) === -1) { - error('Bad encoding in flate stream'); - } - codeBuf |= b << codeSize; - codeSize += 8; - } - b = codeBuf & ((1 << bits) - 1); - this.codeBuf = codeBuf >> bits; - this.codeSize = codeSize -= bits; - - return b; - }; - - FlateStream.prototype.getCode = function FlateStream_getCode(table) { - var str = this.str; - var codes = table[0]; - var maxLen = table[1]; - var codeSize = this.codeSize; - var codeBuf = this.codeBuf; - - var b; - while (codeSize < maxLen) { - if ((b = str.getByte()) === -1) { - // premature end of stream. code might however still be valid. - // codeSize < codeLen check below guards against incomplete codeVal. - break; - } - codeBuf |= (b << codeSize); - codeSize += 8; - } - var code = codes[codeBuf & ((1 << maxLen) - 1)]; - var codeLen = code >> 16; - var codeVal = code & 0xffff; - if (codeLen < 1 || codeSize < codeLen) { - error('Bad encoding in flate stream'); - } - this.codeBuf = (codeBuf >> codeLen); - this.codeSize = (codeSize - codeLen); - return codeVal; - }; - - FlateStream.prototype.generateHuffmanTable = - function flateStreamGenerateHuffmanTable(lengths) { - var n = lengths.length; - - // find max code length - var maxLen = 0; - var i; - for (i = 0; i < n; ++i) { - if (lengths[i] > maxLen) { - maxLen = lengths[i]; - } - } - - // build the table - var size = 1 << maxLen; - var codes = new Int32Array(size); - for (var len = 1, code = 0, skip = 2; - len <= maxLen; - ++len, code <<= 1, skip <<= 1) { - for (var val = 0; val < n; ++val) { - if (lengths[val] === len) { - // bit-reverse the code - var code2 = 0; - var t = code; - for (i = 0; i < len; ++i) { - code2 = (code2 << 1) | (t & 1); - t >>= 1; - } - - // fill the table entries - for (i = code2; i < size; i += skip) { - codes[i] = (len << 16) | val; - } - ++code; - } - } - } - - return [codes, maxLen]; - }; - - FlateStream.prototype.readBlock = function FlateStream_readBlock() { - var buffer, len; - var str = this.str; - // read block header - var hdr = this.getBits(3); - if (hdr & 1) { - this.eof = true; - } - hdr >>= 1; - - if (hdr === 0) { // uncompressed block - var b; - - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - var blockLen = b; - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - blockLen |= (b << 8); - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - var check = b; - if ((b = str.getByte()) === -1) { - error('Bad block header in flate stream'); - } - check |= (b << 8); - if (check !== (~blockLen & 0xffff) && - (blockLen !== 0 || check !== 0)) { - // Ignoring error for bad "empty" block (see issue 1277) - error('Bad uncompressed block length in flate stream'); - } - - this.codeBuf = 0; - this.codeSize = 0; - - var bufferLength = this.bufferLength; - buffer = this.ensureBuffer(bufferLength + blockLen); - var end = bufferLength + blockLen; - this.bufferLength = end; - if (blockLen === 0) { - if (str.peekByte() === -1) { - this.eof = true; - } - } else { - for (var n = bufferLength; n < end; ++n) { - if ((b = str.getByte()) === -1) { - this.eof = true; - break; - } - buffer[n] = b; - } - } - return; - } - - var litCodeTable; - var distCodeTable; - if (hdr === 1) { // compressed block, fixed codes - litCodeTable = fixedLitCodeTab; - distCodeTable = fixedDistCodeTab; - } else if (hdr === 2) { // compressed block, dynamic codes - var numLitCodes = this.getBits(5) + 257; - var numDistCodes = this.getBits(5) + 1; - var numCodeLenCodes = this.getBits(4) + 4; - - // build the code lengths code table - var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); - - var i; - for (i = 0; i < numCodeLenCodes; ++i) { - codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); - } - var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); - - // build the literal and distance code tables - len = 0; - i = 0; - var codes = numLitCodes + numDistCodes; - var codeLengths = new Uint8Array(codes); - var bitsLength, bitsOffset, what; - while (i < codes) { - var code = this.getCode(codeLenCodeTab); - if (code === 16) { - bitsLength = 2; bitsOffset = 3; what = len; - } else if (code === 17) { - bitsLength = 3; bitsOffset = 3; what = (len = 0); - } else if (code === 18) { - bitsLength = 7; bitsOffset = 11; what = (len = 0); - } else { - codeLengths[i++] = len = code; - continue; - } - - var repeatLength = this.getBits(bitsLength) + bitsOffset; - while (repeatLength-- > 0) { - codeLengths[i++] = what; - } - } - - litCodeTable = - this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); - distCodeTable = - this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); - } else { - error('Unknown block type in flate stream'); - } - - buffer = this.buffer; - var limit = buffer ? buffer.length : 0; - var pos = this.bufferLength; - while (true) { - var code1 = this.getCode(litCodeTable); - if (code1 < 256) { - if (pos + 1 >= limit) { - buffer = this.ensureBuffer(pos + 1); - limit = buffer.length; - } - buffer[pos++] = code1; - continue; - } - if (code1 === 256) { - this.bufferLength = pos; - return; - } - code1 -= 257; - code1 = lengthDecode[code1]; - var code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - len = (code1 & 0xffff) + code2; - code1 = this.getCode(distCodeTable); - code1 = distDecode[code1]; - code2 = code1 >> 16; - if (code2 > 0) { - code2 = this.getBits(code2); - } - var dist = (code1 & 0xffff) + code2; - if (pos + len >= limit) { - buffer = this.ensureBuffer(pos + len); - limit = buffer.length; - } - for (var k = 0; k < len; ++k, ++pos) { - buffer[pos] = buffer[pos - dist]; - } - } - }; - - return FlateStream; -})(); - -var PredictorStream = (function PredictorStreamClosure() { - function PredictorStream(str, maybeLength, params) { - var predictor = this.predictor = params.get('Predictor') || 1; - - if (predictor <= 1) { - return str; // no prediction - } - if (predictor !== 2 && (predictor < 10 || predictor > 15)) { - error('Unsupported predictor: ' + predictor); - } - - if (predictor === 2) { - this.readBlock = this.readBlockTiff; - } else { - this.readBlock = this.readBlockPng; - } - - this.str = str; - this.dict = str.dict; - - var colors = this.colors = params.get('Colors') || 1; - var bits = this.bits = params.get('BitsPerComponent') || 8; - var columns = this.columns = params.get('Columns') || 1; - - this.pixBytes = (colors * bits + 7) >> 3; - this.rowBytes = (columns * colors * bits + 7) >> 3; - - DecodeStream.call(this, maybeLength); - return this; - } - - PredictorStream.prototype = Object.create(DecodeStream.prototype); - - PredictorStream.prototype.readBlockTiff = - function predictorStreamReadBlockTiff() { - var rowBytes = this.rowBytes; - - var bufferLength = this.bufferLength; - var buffer = this.ensureBuffer(bufferLength + rowBytes); - - var bits = this.bits; - var colors = this.colors; - - var rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - - var inbuf = 0, outbuf = 0; - var inbits = 0, outbits = 0; - var pos = bufferLength; - var i; - - if (bits === 1) { - for (i = 0; i < rowBytes; ++i) { - var c = rawBytes[i]; - inbuf = (inbuf << 8) | c; - // bitwise addition is exclusive or - // first shift inbuf and then add - buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF; - // truncate inbuf (assumes colors < 16) - inbuf &= 0xFFFF; - } - } else if (bits === 8) { - for (i = 0; i < colors; ++i) { - buffer[pos++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[pos] = buffer[pos - colors] + rawBytes[i]; - pos++; - } - } else { - var compArray = new Uint8Array(colors + 1); - var bitMask = (1 << bits) - 1; - var j = 0, k = bufferLength; - var columns = this.columns; - for (i = 0; i < columns; ++i) { - for (var kk = 0; kk < colors; ++kk) { - if (inbits < bits) { - inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF); - inbits += 8; - } - compArray[kk] = (compArray[kk] + - (inbuf >> (inbits - bits))) & bitMask; - inbits -= bits; - outbuf = (outbuf << bits) | compArray[kk]; - outbits += bits; - if (outbits >= 8) { - buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF; - outbits -= 8; - } - } - } - if (outbits > 0) { - buffer[k++] = (outbuf << (8 - outbits)) + - (inbuf & ((1 << (8 - outbits)) - 1)); - } - } - this.bufferLength += rowBytes; - }; - - PredictorStream.prototype.readBlockPng = - function predictorStreamReadBlockPng() { - - var rowBytes = this.rowBytes; - var pixBytes = this.pixBytes; - - var predictor = this.str.getByte(); - var rawBytes = this.str.getBytes(rowBytes); - this.eof = !rawBytes.length; - if (this.eof) { - return; - } - - var bufferLength = this.bufferLength; - var buffer = this.ensureBuffer(bufferLength + rowBytes); - - var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); - if (prevRow.length === 0) { - prevRow = new Uint8Array(rowBytes); - } - - var i, j = bufferLength, up, c; - switch (predictor) { - case 0: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - break; - case 1: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF; - j++; - } - break; - case 2: - for (i = 0; i < rowBytes; ++i) { - buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF; - } - break; - case 3: - for (i = 0; i < pixBytes; ++i) { - buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; - } - for (; i < rowBytes; ++i) { - buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) + - rawBytes[i]) & 0xFF; - j++; - } - break; - case 4: - // we need to save the up left pixels values. the simplest way - // is to create a new buffer - for (i = 0; i < pixBytes; ++i) { - up = prevRow[i]; - c = rawBytes[i]; - buffer[j++] = up + c; - } - for (; i < rowBytes; ++i) { - up = prevRow[i]; - var upLeft = prevRow[i - pixBytes]; - var left = buffer[j - pixBytes]; - var p = left + up - upLeft; - - var pa = p - left; - if (pa < 0) { - pa = -pa; - } - var pb = p - up; - if (pb < 0) { - pb = -pb; - } - var pc = p - upLeft; - if (pc < 0) { - pc = -pc; - } - - c = rawBytes[i]; - if (pa <= pb && pa <= pc) { - buffer[j++] = left + c; - } else if (pb <= pc) { - buffer[j++] = up + c; - } else { - buffer[j++] = upLeft + c; - } - } - break; - default: - error('Unsupported predictor: ' + predictor); - } - this.bufferLength += rowBytes; - }; - - return PredictorStream; -})(); - -/** - * Depending on the type of JPEG a JpegStream is handled in different ways. For - * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image - * data is stored and then loaded by the browser. For unsupported JPEG's we use - * a library to decode these images and the stream behaves like all the other - * DecodeStreams. - */ -var JpegStream = (function JpegStreamClosure() { - function JpegStream(stream, maybeLength, dict, xref) { - // Some images may contain 'junk' before the SOI (start-of-image) marker. - // Note: this seems to mainly affect inline images. - var ch; - while ((ch = stream.getByte()) !== -1) { - if (ch === 0xFF) { // Find the first byte of the SOI marker (0xFFD8). - stream.skip(-1); // Reset the stream position to the SOI. - break; - } - } - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - JpegStream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(JpegStream.prototype, 'bytes', { - get: function JpegStream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - try { - var jpegImage = new JpegImage(); - - // checking if values needs to be transformed before conversion - if (this.forceRGB && this.dict && isArray(this.dict.get('Decode'))) { - var decodeArr = this.dict.get('Decode'); - var bitsPerComponent = this.dict.get('BitsPerComponent') || 8; - var decodeArrLength = decodeArr.length; - var transform = new Int32Array(decodeArrLength); - var transformNeeded = false; - var maxValue = (1 << bitsPerComponent) - 1; - for (var i = 0; i < decodeArrLength; i += 2) { - transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0; - transform[i + 1] = (decodeArr[i] * maxValue) | 0; - if (transform[i] !== 256 || transform[i + 1] !== 0) { - transformNeeded = true; - } - } - if (transformNeeded) { - jpegImage.decodeTransform = transform; - } - } - - jpegImage.parse(this.bytes); - var data = jpegImage.getData(this.drawWidth, this.drawHeight, - this.forceRGB); - this.buffer = data; - this.bufferLength = data.length; - this.eof = true; - } catch (e) { - error('JPEG error: ' + e); - } - }; - - JpegStream.prototype.getBytes = function JpegStream_getBytes(length) { - this.ensureBuffer(); - return this.buffer; - }; - - JpegStream.prototype.getIR = function JpegStream_getIR() { - return PDFJS.createObjectURL(this.bytes, 'image/jpeg'); - }; - /** - * Checks if the image can be decoded and displayed by the browser without any - * further processing such as color space conversions. - */ - JpegStream.prototype.isNativelySupported = - function JpegStream_isNativelySupported(xref, res) { - var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res); - return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && - cs.isDefaultDecode(this.dict.get('Decode', 'D')); - }; - /** - * Checks if the image can be decoded by the browser. - */ - JpegStream.prototype.isNativelyDecodable = - function JpegStream_isNativelyDecodable(xref, res) { - var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res); - return (cs.numComps === 1 || cs.numComps === 3) && - cs.isDefaultDecode(this.dict.get('Decode', 'D')); - }; - - return JpegStream; -})(); - -/** - * For JPEG 2000's we use a library to decode these images and - * the stream behaves like all the other DecodeStreams. - */ -var JpxStream = (function JpxStreamClosure() { - function JpxStream(stream, maybeLength, dict) { - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - JpxStream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(JpxStream.prototype, 'bytes', { - get: function JpxStream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - - var jpxImage = new JpxImage(); - jpxImage.parse(this.bytes); - - var width = jpxImage.width; - var height = jpxImage.height; - var componentsCount = jpxImage.componentsCount; - var tileCount = jpxImage.tiles.length; - if (tileCount === 1) { - this.buffer = jpxImage.tiles[0].items; - } else { - var data = new Uint8Array(width * height * componentsCount); - - for (var k = 0; k < tileCount; k++) { - var tileComponents = jpxImage.tiles[k]; - var tileWidth = tileComponents.width; - var tileHeight = tileComponents.height; - var tileLeft = tileComponents.left; - var tileTop = tileComponents.top; - - var src = tileComponents.items; - var srcPosition = 0; - var dataPosition = (width * tileTop + tileLeft) * componentsCount; - var imgRowSize = width * componentsCount; - var tileRowSize = tileWidth * componentsCount; - - for (var j = 0; j < tileHeight; j++) { - var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize); - data.set(rowBytes, dataPosition); - srcPosition += tileRowSize; - dataPosition += imgRowSize; - } - } - this.buffer = data; - } - this.bufferLength = this.buffer.length; - this.eof = true; - }; - - return JpxStream; -})(); - -/** - * For JBIG2's we use a library to decode these images and - * the stream behaves like all the other DecodeStreams. - */ -var Jbig2Stream = (function Jbig2StreamClosure() { - function Jbig2Stream(stream, maybeLength, dict) { - this.stream = stream; - this.maybeLength = maybeLength; - this.dict = dict; - - DecodeStream.call(this, maybeLength); - } - - Jbig2Stream.prototype = Object.create(DecodeStream.prototype); - - Object.defineProperty(Jbig2Stream.prototype, 'bytes', { - get: function Jbig2Stream_bytes() { - // If this.maybeLength is null, we'll get the entire stream. - return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength)); - }, - configurable: true - }); - - Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) { - if (this.bufferLength) { - return; - } - - var jbig2Image = new Jbig2Image(); - - var chunks = [], xref = this.dict.xref; - var decodeParams = xref.fetchIfRef(this.dict.get('DecodeParms')); - - // According to the PDF specification, DecodeParms can be either - // a dictionary, or an array whose elements are dictionaries. - if (isArray(decodeParams)) { - if (decodeParams.length > 1) { - warn('JBIG2 - \'DecodeParms\' array with multiple elements ' + - 'not supported.'); - } - decodeParams = xref.fetchIfRef(decodeParams[0]); - } - if (decodeParams && decodeParams.has('JBIG2Globals')) { - var globalsStream = decodeParams.get('JBIG2Globals'); - var globals = globalsStream.getBytes(); - chunks.push({data: globals, start: 0, end: globals.length}); - } - chunks.push({data: this.bytes, start: 0, end: this.bytes.length}); - var data = jbig2Image.parseChunks(chunks); - var dataLength = data.length; - - // JBIG2 had black as 1 and white as 0, inverting the colors - for (var i = 0; i < dataLength; i++) { - data[i] ^= 0xFF; - } - - this.buffer = data; - this.bufferLength = dataLength; - this.eof = true; - }; - - return Jbig2Stream; -})(); - -var DecryptStream = (function DecryptStreamClosure() { - function DecryptStream(str, maybeLength, decrypt) { - this.str = str; - this.dict = str.dict; - this.decrypt = decrypt; - this.nextChunk = null; - this.initialized = false; - - DecodeStream.call(this, maybeLength); - } - - var chunkSize = 512; - - DecryptStream.prototype = Object.create(DecodeStream.prototype); - - DecryptStream.prototype.readBlock = function DecryptStream_readBlock() { - var chunk; - if (this.initialized) { - chunk = this.nextChunk; - } else { - chunk = this.str.getBytes(chunkSize); - this.initialized = true; - } - if (!chunk || chunk.length === 0) { - this.eof = true; - return; - } - this.nextChunk = this.str.getBytes(chunkSize); - var hasMoreData = this.nextChunk && this.nextChunk.length > 0; - - var decrypt = this.decrypt; - chunk = decrypt(chunk, !hasMoreData); - - var bufferLength = this.bufferLength; - var i, n = chunk.length; - var buffer = this.ensureBuffer(bufferLength + n); - for (i = 0; i < n; i++) { - buffer[bufferLength++] = chunk[i]; - } - this.bufferLength = bufferLength; - }; - - return DecryptStream; -})(); - -var Ascii85Stream = (function Ascii85StreamClosure() { - function Ascii85Stream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - this.input = new Uint8Array(5); - - // Most streams increase in size when decoded, but Ascii85 streams - // typically shrink by ~20%. - if (maybeLength) { - maybeLength = 0.8 * maybeLength; - } - DecodeStream.call(this, maybeLength); - } - - Ascii85Stream.prototype = Object.create(DecodeStream.prototype); - - Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() { - var TILDA_CHAR = 0x7E; // '~' - var Z_LOWER_CHAR = 0x7A; // 'z' - var EOF = -1; - - var str = this.str; - - var c = str.getByte(); - while (Lexer.isSpace(c)) { - c = str.getByte(); - } - - if (c === EOF || c === TILDA_CHAR) { - this.eof = true; - return; - } - - var bufferLength = this.bufferLength, buffer; - var i; - - // special code for z - if (c === Z_LOWER_CHAR) { - buffer = this.ensureBuffer(bufferLength + 4); - for (i = 0; i < 4; ++i) { - buffer[bufferLength + i] = 0; - } - this.bufferLength += 4; - } else { - var input = this.input; - input[0] = c; - for (i = 1; i < 5; ++i) { - c = str.getByte(); - while (Lexer.isSpace(c)) { - c = str.getByte(); - } - - input[i] = c; - - if (c === EOF || c === TILDA_CHAR) { - break; - } - } - buffer = this.ensureBuffer(bufferLength + i - 1); - this.bufferLength += i - 1; - - // partial ending; - if (i < 5) { - for (; i < 5; ++i) { - input[i] = 0x21 + 84; - } - this.eof = true; - } - var t = 0; - for (i = 0; i < 5; ++i) { - t = t * 85 + (input[i] - 0x21); - } - - for (i = 3; i >= 0; --i) { - buffer[bufferLength + i] = t & 0xFF; - t >>= 8; - } - } - }; - - return Ascii85Stream; -})(); - -var AsciiHexStream = (function AsciiHexStreamClosure() { - function AsciiHexStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - this.firstDigit = -1; - - // Most streams increase in size when decoded, but AsciiHex streams shrink - // by 50%. - if (maybeLength) { - maybeLength = 0.5 * maybeLength; - } - DecodeStream.call(this, maybeLength); - } - - AsciiHexStream.prototype = Object.create(DecodeStream.prototype); - - AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() { - var UPSTREAM_BLOCK_SIZE = 8000; - var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE); - if (!bytes.length) { - this.eof = true; - return; - } - - var maxDecodeLength = (bytes.length + 1) >> 1; - var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength); - var bufferLength = this.bufferLength; - - var firstDigit = this.firstDigit; - for (var i = 0, ii = bytes.length; i < ii; i++) { - var ch = bytes[i], digit; - if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' - digit = ch & 0x0F; - } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { - // 'A'-'Z', 'a'-'z' - digit = (ch & 0x0F) + 9; - } else if (ch === 0x3E) { // '>' - this.eof = true; - break; - } else { // probably whitespace - continue; // ignoring - } - if (firstDigit < 0) { - firstDigit = digit; - } else { - buffer[bufferLength++] = (firstDigit << 4) | digit; - firstDigit = -1; - } - } - if (firstDigit >= 0 && this.eof) { - // incomplete byte - buffer[bufferLength++] = (firstDigit << 4); - firstDigit = -1; - } - this.firstDigit = firstDigit; - this.bufferLength = bufferLength; - }; - - return AsciiHexStream; -})(); - -var RunLengthStream = (function RunLengthStreamClosure() { - function RunLengthStream(str, maybeLength) { - this.str = str; - this.dict = str.dict; - - DecodeStream.call(this, maybeLength); - } - - RunLengthStream.prototype = Object.create(DecodeStream.prototype); - - RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() { - // The repeatHeader has following format. The first byte defines type of run - // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes - // (in addition to the second byte from the header), n = 129 through 255 - - // duplicate the second byte from the header (257 - n) times, n = 128 - end. - var repeatHeader = this.str.getBytes(2); - if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) { - this.eof = true; - return; - } - - var buffer; - var bufferLength = this.bufferLength; - var n = repeatHeader[0]; - if (n < 128) { - // copy n bytes - buffer = this.ensureBuffer(bufferLength + n + 1); - buffer[bufferLength++] = repeatHeader[1]; - if (n > 0) { - var source = this.str.getBytes(n); - buffer.set(source, bufferLength); - bufferLength += n; - } - } else { - n = 257 - n; - var b = repeatHeader[1]; - buffer = this.ensureBuffer(bufferLength + n + 1); - for (var i = 0; i < n; i++) { - buffer[bufferLength++] = b; - } - } - this.bufferLength = bufferLength; - }; - - return RunLengthStream; -})(); - -var CCITTFaxStream = (function CCITTFaxStreamClosure() { - - var ccittEOL = -2; - var twoDimPass = 0; - var twoDimHoriz = 1; - var twoDimVert0 = 2; - var twoDimVertR1 = 3; - var twoDimVertL1 = 4; - var twoDimVertR2 = 5; - var twoDimVertL2 = 6; - var twoDimVertR3 = 7; - var twoDimVertL3 = 8; - - var twoDimTable = [ - [-1, -1], [-1, -1], // 000000x - [7, twoDimVertL3], // 0000010 - [7, twoDimVertR3], // 0000011 - [6, twoDimVertL2], [6, twoDimVertL2], // 000010x - [6, twoDimVertR2], [6, twoDimVertR2], // 000011x - [4, twoDimPass], [4, twoDimPass], // 0001xxx - [4, twoDimPass], [4, twoDimPass], - [4, twoDimPass], [4, twoDimPass], - [4, twoDimPass], [4, twoDimPass], - [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimHoriz], [3, twoDimHoriz], - [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertL1], [3, twoDimVertL1], - [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [3, twoDimVertR1], [3, twoDimVertR1], - [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0], - [1, twoDimVert0], [1, twoDimVert0] - ]; - - var whiteTable1 = [ - [-1, -1], // 00000 - [12, ccittEOL], // 00001 - [-1, -1], [-1, -1], // 0001x - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx - [11, 1792], [11, 1792], // 1000x - [12, 1984], // 10010 - [12, 2048], // 10011 - [12, 2112], // 10100 - [12, 2176], // 10101 - [12, 2240], // 10110 - [12, 2304], // 10111 - [11, 1856], [11, 1856], // 1100x - [11, 1920], [11, 1920], // 1101x - [12, 2368], // 11100 - [12, 2432], // 11101 - [12, 2496], // 11110 - [12, 2560] // 11111 - ]; - - var whiteTable2 = [ - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx - [8, 29], [8, 29], // 00000010x - [8, 30], [8, 30], // 00000011x - [8, 45], [8, 45], // 00000100x - [8, 46], [8, 46], // 00000101x - [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx - [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx - [8, 47], [8, 47], // 00001010x - [8, 48], [8, 48], // 00001011x - [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx - [6, 13], [6, 13], [6, 13], [6, 13], - [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx - [8, 33], [8, 33], // 00010010x - [8, 34], [8, 34], // 00010011x - [8, 35], [8, 35], // 00010100x - [8, 36], [8, 36], // 00010101x - [8, 37], [8, 37], // 00010110x - [8, 38], [8, 38], // 00010111x - [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx - [8, 31], [8, 31], // 00011010x - [8, 32], [8, 32], // 00011011x - [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx - [6, 1], [6, 1], [6, 1], [6, 1], - [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx - [6, 12], [6, 12], [6, 12], [6, 12], - [8, 53], [8, 53], // 00100100x - [8, 54], [8, 54], // 00100101x - [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx - [8, 39], [8, 39], // 00101000x - [8, 40], [8, 40], // 00101001x - [8, 41], [8, 41], // 00101010x - [8, 42], [8, 42], // 00101011x - [8, 43], [8, 43], // 00101100x - [8, 44], [8, 44], // 00101101x - [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx - [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx - [8, 61], [8, 61], // 00110010x - [8, 62], [8, 62], // 00110011x - [8, 63], [8, 63], // 00110100x - [8, 0], [8, 0], // 00110101x - [8, 320], [8, 320], // 00110110x - [8, 384], [8, 384], // 00110111x - [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 10], [5, 10], [5, 10], [5, 10], - [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx - [5, 11], [5, 11], [5, 11], [5, 11], - [5, 11], [5, 11], [5, 11], [5, 11], - [5, 11], [5, 11], [5, 11], [5, 11], - [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx - [8, 59], [8, 59], // 01001010x - [8, 60], [8, 60], // 01001011x - [9, 1472], // 010011000 - [9, 1536], // 010011001 - [9, 1600], // 010011010 - [9, 1728], // 010011011 - [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx - [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx - [8, 49], [8, 49], // 01010010x - [8, 50], [8, 50], // 01010011x - [8, 51], [8, 51], // 01010100x - [8, 52], [8, 52], // 01010101x - [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx - [8, 55], [8, 55], // 01011000x - [8, 56], [8, 56], // 01011001x - [8, 57], [8, 57], // 01011010x - [8, 58], [8, 58], // 01011011x - [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx - [6, 192], [6, 192], [6, 192], [6, 192], - [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx - [6, 1664], [6, 1664], [6, 1664], [6, 1664], - [8, 448], [8, 448], // 01100100x - [8, 512], [8, 512], // 01100101x - [9, 704], // 011001100 - [9, 768], // 011001101 - [8, 640], [8, 640], // 01100111x - [8, 576], [8, 576], // 01101000x - [9, 832], // 011010010 - [9, 896], // 011010011 - [9, 960], // 011010100 - [9, 1024], // 011010101 - [9, 1088], // 011010110 - [9, 1152], // 011010111 - [9, 1216], // 011011000 - [9, 1280], // 011011001 - [9, 1344], // 011011010 - [9, 1408], // 011011011 - [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx - [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 2], [4, 2], [4, 2], [4, 2], - [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [4, 3], [4, 3], [4, 3], [4, 3], - [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 128], [5, 128], [5, 128], [5, 128], - [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 8], [5, 8], [5, 8], [5, 8], - [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx - [5, 9], [5, 9], [5, 9], [5, 9], - [5, 9], [5, 9], [5, 9], [5, 9], - [5, 9], [5, 9], [5, 9], [5, 9], - [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx - [6, 16], [6, 16], [6, 16], [6, 16], - [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx - [6, 17], [6, 17], [6, 17], [6, 17], - [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 4], [4, 4], [4, 4], [4, 4], - [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [4, 5], [4, 5], [4, 5], [4, 5], - [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx - [6, 14], [6, 14], [6, 14], [6, 14], - [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx - [6, 15], [6, 15], [6, 15], [6, 15], - [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx - [5, 64], [5, 64], [5, 64], [5, 64], - [5, 64], [5, 64], [5, 64], [5, 64], - [5, 64], [5, 64], [5, 64], [5, 64], - [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 6], [4, 6], [4, 6], [4, 6], - [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7], - [4, 7], [4, 7], [4, 7], [4, 7] - ]; - - var blackTable1 = [ - [-1, -1], [-1, -1], // 000000000000x - [12, ccittEOL], [12, ccittEOL], // 000000000001x - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx - [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx - [12, 1984], [12, 1984], // 000000010010x - [12, 2048], [12, 2048], // 000000010011x - [12, 2112], [12, 2112], // 000000010100x - [12, 2176], [12, 2176], // 000000010101x - [12, 2240], [12, 2240], // 000000010110x - [12, 2304], [12, 2304], // 000000010111x - [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx - [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx - [12, 2368], [12, 2368], // 000000011100x - [12, 2432], [12, 2432], // 000000011101x - [12, 2496], [12, 2496], // 000000011110x - [12, 2560], [12, 2560], // 000000011111x - [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx - [10, 18], [10, 18], [10, 18], [10, 18], - [12, 52], [12, 52], // 000000100100x - [13, 640], // 0000001001010 - [13, 704], // 0000001001011 - [13, 768], // 0000001001100 - [13, 832], // 0000001001101 - [12, 55], [12, 55], // 000000100111x - [12, 56], [12, 56], // 000000101000x - [13, 1280], // 0000001010010 - [13, 1344], // 0000001010011 - [13, 1408], // 0000001010100 - [13, 1472], // 0000001010101 - [12, 59], [12, 59], // 000000101011x - [12, 60], [12, 60], // 000000101100x - [13, 1536], // 0000001011010 - [13, 1600], // 0000001011011 - [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx - [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx - [13, 1664], // 0000001100100 - [13, 1728], // 0000001100101 - [12, 320], [12, 320], // 000000110011x - [12, 384], [12, 384], // 000000110100x - [12, 448], [12, 448], // 000000110101x - [13, 512], // 0000001101100 - [13, 576], // 0000001101101 - [12, 53], [12, 53], // 000000110111x - [12, 54], [12, 54], // 000000111000x - [13, 896], // 0000001110010 - [13, 960], // 0000001110011 - [13, 1024], // 0000001110100 - [13, 1088], // 0000001110101 - [13, 1152], // 0000001110110 - [13, 1216], // 0000001110111 - [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx - [10, 64], [10, 64], [10, 64], [10, 64] - ]; - - var blackTable2 = [ - [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx - [8, 13], [8, 13], [8, 13], [8, 13], - [8, 13], [8, 13], [8, 13], [8, 13], - [8, 13], [8, 13], [8, 13], [8, 13], - [11, 23], [11, 23], // 00000101000x - [12, 50], // 000001010010 - [12, 51], // 000001010011 - [12, 44], // 000001010100 - [12, 45], // 000001010101 - [12, 46], // 000001010110 - [12, 47], // 000001010111 - [12, 57], // 000001011000 - [12, 58], // 000001011001 - [12, 61], // 000001011010 - [12, 256], // 000001011011 - [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx - [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx - [12, 48], // 000001100100 - [12, 49], // 000001100101 - [12, 62], // 000001100110 - [12, 63], // 000001100111 - [12, 30], // 000001101000 - [12, 31], // 000001101001 - [12, 32], // 000001101010 - [12, 33], // 000001101011 - [12, 40], // 000001101100 - [12, 41], // 000001101101 - [11, 22], [11, 22], // 00000110111x - [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx - [8, 14], [8, 14], [8, 14], [8, 14], - [8, 14], [8, 14], [8, 14], [8, 14], - [8, 14], [8, 14], [8, 14], [8, 14], - [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 10], [7, 10], [7, 10], [7, 10], - [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [7, 11], [7, 11], [7, 11], [7, 11], - [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx - [9, 15], [9, 15], [9, 15], [9, 15], - [12, 128], // 000011001000 - [12, 192], // 000011001001 - [12, 26], // 000011001010 - [12, 27], // 000011001011 - [12, 28], // 000011001100 - [12, 29], // 000011001101 - [11, 19], [11, 19], // 00001100111x - [11, 20], [11, 20], // 00001101000x - [12, 34], // 000011010010 - [12, 35], // 000011010011 - [12, 36], // 000011010100 - [12, 37], // 000011010101 - [12, 38], // 000011010110 - [12, 39], // 000011010111 - [11, 21], [11, 21], // 00001101100x - [12, 42], // 000011011010 - [12, 43], // 000011011011 - [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx - [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12], - [7, 12], [7, 12], [7, 12], [7, 12] - ]; - - var blackTable3 = [ - [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx - [6, 9], // 000100 - [6, 8], // 000101 - [5, 7], [5, 7], // 00011x - [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx - [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx - [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx - [3, 1], [3, 1], [3, 1], [3, 1], - [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx - [3, 4], [3, 4], [3, 4], [3, 4], - [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 3], [2, 3], [2, 3], [2, 3], - [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx - [2, 2], [2, 2], [2, 2], [2, 2], - [2, 2], [2, 2], [2, 2], [2, 2], - [2, 2], [2, 2], [2, 2], [2, 2] - ]; - - function CCITTFaxStream(str, maybeLength, params) { - this.str = str; - this.dict = str.dict; - - params = params || Dict.empty; - - this.encoding = params.get('K') || 0; - this.eoline = params.get('EndOfLine') || false; - this.byteAlign = params.get('EncodedByteAlign') || false; - this.columns = params.get('Columns') || 1728; - this.rows = params.get('Rows') || 0; - var eoblock = params.get('EndOfBlock'); - if (eoblock === null || eoblock === undefined) { - eoblock = true; - } - this.eoblock = eoblock; - this.black = params.get('BlackIs1') || false; - - this.codingLine = new Uint32Array(this.columns + 1); - this.refLine = new Uint32Array(this.columns + 2); - - this.codingLine[0] = this.columns; - this.codingPos = 0; - - this.row = 0; - this.nextLine2D = this.encoding < 0; - this.inputBits = 0; - this.inputBuf = 0; - this.outputBits = 0; - - var code1; - while ((code1 = this.lookBits(12)) === 0) { - this.eatBits(1); - } - if (code1 === 1) { - this.eatBits(12); - } - if (this.encoding > 0) { - this.nextLine2D = !this.lookBits(1); - this.eatBits(1); - } - - DecodeStream.call(this, maybeLength); - } - - CCITTFaxStream.prototype = Object.create(DecodeStream.prototype); - - CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() { - while (!this.eof) { - var c = this.lookChar(); - this.ensureBuffer(this.bufferLength + 1); - this.buffer[this.bufferLength++] = c; - } - }; - - CCITTFaxStream.prototype.addPixels = - function ccittFaxStreamAddPixels(a1, blackPixels) { - var codingLine = this.codingLine; - var codingPos = this.codingPos; - - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info('row is wrong length'); - this.err = true; - a1 = this.columns; - } - if ((codingPos & 1) ^ blackPixels) { - ++codingPos; - } - - codingLine[codingPos] = a1; - } - this.codingPos = codingPos; - }; - - CCITTFaxStream.prototype.addPixelsNeg = - function ccittFaxStreamAddPixelsNeg(a1, blackPixels) { - var codingLine = this.codingLine; - var codingPos = this.codingPos; - - if (a1 > codingLine[codingPos]) { - if (a1 > this.columns) { - info('row is wrong length'); - this.err = true; - a1 = this.columns; - } - if ((codingPos & 1) ^ blackPixels) { - ++codingPos; - } - - codingLine[codingPos] = a1; - } else if (a1 < codingLine[codingPos]) { - if (a1 < 0) { - info('invalid code'); - this.err = true; - a1 = 0; - } - while (codingPos > 0 && a1 < codingLine[codingPos - 1]) { - --codingPos; - } - codingLine[codingPos] = a1; - } - - this.codingPos = codingPos; - }; - - CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() { - var refLine = this.refLine; - var codingLine = this.codingLine; - var columns = this.columns; - - var refPos, blackPixels, bits, i; - - if (this.outputBits === 0) { - if (this.eof) { - return null; - } - this.err = false; - - var code1, code2, code3; - if (this.nextLine2D) { - for (i = 0; codingLine[i] < columns; ++i) { - refLine[i] = codingLine[i]; - } - refLine[i++] = columns; - refLine[i] = columns; - codingLine[0] = 0; - this.codingPos = 0; - refPos = 0; - blackPixels = 0; - - while (codingLine[this.codingPos] < columns) { - code1 = this.getTwoDimCode(); - switch (code1) { - case twoDimPass: - this.addPixels(refLine[refPos + 1], blackPixels); - if (refLine[refPos + 1] < columns) { - refPos += 2; - } - break; - case twoDimHoriz: - code1 = code2 = 0; - if (blackPixels) { - do { - code1 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - do { - code2 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - } else { - do { - code1 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - do { - code2 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - } - this.addPixels(codingLine[this.codingPos] + - code1, blackPixels); - if (codingLine[this.codingPos] < columns) { - this.addPixels(codingLine[this.codingPos] + code2, - blackPixels ^ 1); - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - break; - case twoDimVertR3: - this.addPixels(refLine[refPos] + 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR2: - this.addPixels(refLine[refPos] + 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertR1: - this.addPixels(refLine[refPos] + 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVert0: - this.addPixels(refLine[refPos], blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - ++refPos; - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL3: - this.addPixelsNeg(refLine[refPos] - 3, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL2: - this.addPixelsNeg(refLine[refPos] - 2, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case twoDimVertL1: - this.addPixelsNeg(refLine[refPos] - 1, blackPixels); - blackPixels ^= 1; - if (codingLine[this.codingPos] < columns) { - if (refPos > 0) { - --refPos; - } else { - ++refPos; - } - while (refLine[refPos] <= codingLine[this.codingPos] && - refLine[refPos] < columns) { - refPos += 2; - } - } - break; - case EOF: - this.addPixels(columns, 0); - this.eof = true; - break; - default: - info('bad 2d code'); - this.addPixels(columns, 0); - this.err = true; - } - } - } else { - codingLine[0] = 0; - this.codingPos = 0; - blackPixels = 0; - while (codingLine[this.codingPos] < columns) { - code1 = 0; - if (blackPixels) { - do { - code1 += (code3 = this.getBlackCode()); - } while (code3 >= 64); - } else { - do { - code1 += (code3 = this.getWhiteCode()); - } while (code3 >= 64); - } - this.addPixels(codingLine[this.codingPos] + code1, blackPixels); - blackPixels ^= 1; - } - } - - var gotEOL = false; - - if (this.byteAlign) { - this.inputBits &= ~7; - } - - if (!this.eoblock && this.row === this.rows - 1) { - this.eof = true; - } else { - code1 = this.lookBits(12); - if (this.eoline) { - while (code1 !== EOF && code1 !== 1) { - this.eatBits(1); - code1 = this.lookBits(12); - } - } else { - while (code1 === 0) { - this.eatBits(1); - code1 = this.lookBits(12); - } - } - if (code1 === 1) { - this.eatBits(12); - gotEOL = true; - } else if (code1 === EOF) { - this.eof = true; - } - } - - if (!this.eof && this.encoding > 0) { - this.nextLine2D = !this.lookBits(1); - this.eatBits(1); - } - - if (this.eoblock && gotEOL && this.byteAlign) { - code1 = this.lookBits(12); - if (code1 === 1) { - this.eatBits(12); - if (this.encoding > 0) { - this.lookBits(1); - this.eatBits(1); - } - if (this.encoding >= 0) { - for (i = 0; i < 4; ++i) { - code1 = this.lookBits(12); - if (code1 !== 1) { - info('bad rtc code: ' + code1); - } - this.eatBits(12); - if (this.encoding > 0) { - this.lookBits(1); - this.eatBits(1); - } - } - } - this.eof = true; - } - } else if (this.err && this.eoline) { - while (true) { - code1 = this.lookBits(13); - if (code1 === EOF) { - this.eof = true; - return null; - } - if ((code1 >> 1) === 1) { - break; - } - this.eatBits(1); - } - this.eatBits(12); - if (this.encoding > 0) { - this.eatBits(1); - this.nextLine2D = !(code1 & 1); - } - } - - if (codingLine[0] > 0) { - this.outputBits = codingLine[this.codingPos = 0]; - } else { - this.outputBits = codingLine[this.codingPos = 1]; - } - this.row++; - } - - var c; - if (this.outputBits >= 8) { - c = (this.codingPos & 1) ? 0 : 0xFF; - this.outputBits -= 8; - if (this.outputBits === 0 && codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = (codingLine[this.codingPos] - - codingLine[this.codingPos - 1]); - } - } else { - bits = 8; - c = 0; - do { - if (this.outputBits > bits) { - c <<= bits; - if (!(this.codingPos & 1)) { - c |= 0xFF >> (8 - bits); - } - this.outputBits -= bits; - bits = 0; - } else { - c <<= this.outputBits; - if (!(this.codingPos & 1)) { - c |= 0xFF >> (8 - this.outputBits); - } - bits -= this.outputBits; - this.outputBits = 0; - if (codingLine[this.codingPos] < columns) { - this.codingPos++; - this.outputBits = (codingLine[this.codingPos] - - codingLine[this.codingPos - 1]); - } else if (bits > 0) { - c <<= bits; - bits = 0; - } - } - } while (bits); - } - if (this.black) { - c ^= 0xFF; - } - return c; - }; - - // This functions returns the code found from the table. - // The start and end parameters set the boundaries for searching the table. - // The limit parameter is optional. Function returns an array with three - // values. The first array element indicates whether a valid code is being - // returned. The second array element is the actual code. The third array - // element indicates whether EOF was reached. - CCITTFaxStream.prototype.findTableCode = - function ccittFaxStreamFindTableCode(start, end, table, limit) { - - var limitValue = limit || 0; - for (var i = start; i <= end; ++i) { - var code = this.lookBits(i); - if (code === EOF) { - return [true, 1, false]; - } - if (i < end) { - code <<= end - i; - } - if (!limitValue || code >= limitValue) { - var p = table[code - limitValue]; - if (p[0] === i) { - this.eatBits(i); - return [true, p[1], true]; - } - } - } - return [false, 0, false]; - }; - - CCITTFaxStream.prototype.getTwoDimCode = - function ccittFaxStreamGetTwoDimCode() { - - var code = 0; - var p; - if (this.eoblock) { - code = this.lookBits(7); - p = twoDimTable[code]; - if (p && p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(1, 7, twoDimTable); - if (result[0] && result[2]) { - return result[1]; - } - } - info('Bad two dim code'); - return EOF; - }; - - CCITTFaxStream.prototype.getWhiteCode = - function ccittFaxStreamGetWhiteCode() { - - var code = 0; - var p; - if (this.eoblock) { - code = this.lookBits(12); - if (code === EOF) { - return 1; - } - - if ((code >> 5) === 0) { - p = whiteTable1[code]; - } else { - p = whiteTable2[code >> 3]; - } - - if (p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(1, 9, whiteTable2); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(11, 12, whiteTable1); - if (result[0]) { - return result[1]; - } - } - info('bad white code'); - this.eatBits(1); - return 1; - }; - - CCITTFaxStream.prototype.getBlackCode = - function ccittFaxStreamGetBlackCode() { - - var code, p; - if (this.eoblock) { - code = this.lookBits(13); - if (code === EOF) { - return 1; - } - if ((code >> 7) === 0) { - p = blackTable1[code]; - } else if ((code >> 9) === 0 && (code >> 7) !== 0) { - p = blackTable2[(code >> 1) - 64]; - } else { - p = blackTable3[code >> 7]; - } - - if (p[0] > 0) { - this.eatBits(p[0]); - return p[1]; - } - } else { - var result = this.findTableCode(2, 6, blackTable3); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(7, 12, blackTable2, 64); - if (result[0]) { - return result[1]; - } - - result = this.findTableCode(10, 13, blackTable1); - if (result[0]) { - return result[1]; - } - } - info('bad black code'); - this.eatBits(1); - return 1; - }; - - CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) { - var c; - while (this.inputBits < n) { - if ((c = this.str.getByte()) === -1) { - if (this.inputBits === 0) { - return EOF; - } - return ((this.inputBuf << (n - this.inputBits)) & - (0xFFFF >> (16 - n))); - } - this.inputBuf = (this.inputBuf << 8) + c; - this.inputBits += 8; - } - return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n)); - }; - - CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) { - if ((this.inputBits -= n) < 0) { - this.inputBits = 0; - } - }; - - return CCITTFaxStream; -})(); - -var LZWStream = (function LZWStreamClosure() { - function LZWStream(str, maybeLength, earlyChange) { - this.str = str; - this.dict = str.dict; - this.cachedData = 0; - this.bitsCached = 0; - - var maxLzwDictionarySize = 4096; - var lzwState = { - earlyChange: earlyChange, - codeLength: 9, - nextCode: 258, - dictionaryValues: new Uint8Array(maxLzwDictionarySize), - dictionaryLengths: new Uint16Array(maxLzwDictionarySize), - dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), - currentSequence: new Uint8Array(maxLzwDictionarySize), - currentSequenceLength: 0 - }; - for (var i = 0; i < 256; ++i) { - lzwState.dictionaryValues[i] = i; - lzwState.dictionaryLengths[i] = 1; - } - this.lzwState = lzwState; - - DecodeStream.call(this, maybeLength); - } - - LZWStream.prototype = Object.create(DecodeStream.prototype); - - LZWStream.prototype.readBits = function LZWStream_readBits(n) { - var bitsCached = this.bitsCached; - var cachedData = this.cachedData; - while (bitsCached < n) { - var c = this.str.getByte(); - if (c === -1) { - this.eof = true; - return null; - } - cachedData = (cachedData << 8) | c; - bitsCached += 8; - } - this.bitsCached = (bitsCached -= n); - this.cachedData = cachedData; - this.lastCode = null; - return (cachedData >>> bitsCached) & ((1 << n) - 1); - }; - - LZWStream.prototype.readBlock = function LZWStream_readBlock() { - var blockSize = 512; - var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize; - var i, j, q; - - var lzwState = this.lzwState; - if (!lzwState) { - return; // eof was found - } - - var earlyChange = lzwState.earlyChange; - var nextCode = lzwState.nextCode; - var dictionaryValues = lzwState.dictionaryValues; - var dictionaryLengths = lzwState.dictionaryLengths; - var dictionaryPrevCodes = lzwState.dictionaryPrevCodes; - var codeLength = lzwState.codeLength; - var prevCode = lzwState.prevCode; - var currentSequence = lzwState.currentSequence; - var currentSequenceLength = lzwState.currentSequenceLength; - - var decodedLength = 0; - var currentBufferLength = this.bufferLength; - var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - - for (i = 0; i < blockSize; i++) { - var code = this.readBits(codeLength); - var hasPrev = currentSequenceLength > 0; - if (code < 256) { - currentSequence[0] = code; - currentSequenceLength = 1; - } else if (code >= 258) { - if (code < nextCode) { - currentSequenceLength = dictionaryLengths[code]; - for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { - currentSequence[j] = dictionaryValues[q]; - q = dictionaryPrevCodes[q]; - } - } else { - currentSequence[currentSequenceLength++] = currentSequence[0]; - } - } else if (code === 256) { - codeLength = 9; - nextCode = 258; - currentSequenceLength = 0; - continue; - } else { - this.eof = true; - delete this.lzwState; - break; - } - - if (hasPrev) { - dictionaryPrevCodes[nextCode] = prevCode; - dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; - dictionaryValues[nextCode] = currentSequence[0]; - nextCode++; - codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ? - codeLength : Math.min(Math.log(nextCode + earlyChange) / - 0.6931471805599453 + 1, 12) | 0; - } - prevCode = code; - - decodedLength += currentSequenceLength; - if (estimatedDecodedSize < decodedLength) { - do { - estimatedDecodedSize += decodedSizeDelta; - } while (estimatedDecodedSize < decodedLength); - buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); - } - for (j = 0; j < currentSequenceLength; j++) { - buffer[currentBufferLength++] = currentSequence[j]; - } - } - lzwState.nextCode = nextCode; - lzwState.codeLength = codeLength; - lzwState.prevCode = prevCode; - lzwState.currentSequenceLength = currentSequenceLength; - - this.bufferLength = currentBufferLength; - }; - - return LZWStream; -})(); - -var NullStream = (function NullStreamClosure() { - function NullStream() { - Stream.call(this, new Uint8Array(0)); - } - - NullStream.prototype = Stream.prototype; - - return NullStream; -})(); - -// TODO refactor to remove dependency on parser.js -function _setCoreParser(coreParser_) { - coreParser = coreParser_; - EOF = coreParser_.EOF; - Lexer = coreParser_.Lexer; -} -exports._setCoreParser = _setCoreParser; - -// TODO refactor to remove dependency on colorspace.js -function _setCoreColorSpace(coreColorSpace_) { - coreColorSpace = coreColorSpace_; - ColorSpace = coreColorSpace_.ColorSpace; -} -exports._setCoreColorSpace = _setCoreColorSpace; - -exports.Ascii85Stream = Ascii85Stream; -exports.AsciiHexStream = AsciiHexStream; -exports.CCITTFaxStream = CCITTFaxStream; -exports.DecryptStream = DecryptStream; -exports.DecodeStream = DecodeStream; -exports.FlateStream = FlateStream; -exports.Jbig2Stream = Jbig2Stream; -exports.JpegStream = JpegStream; -exports.JpxStream = JpxStream; -exports.NullStream = NullStream; -exports.PredictorStream = PredictorStream; -exports.RunLengthStream = RunLengthStream; -exports.Stream = Stream; -exports.StreamsSequenceStream = StreamsSequenceStream; -exports.StringStream = StringStream; -exports.LZWStream = LZWStream; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreCrypto = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream) { - -var PasswordException = sharedUtil.PasswordException; -var PasswordResponses = sharedUtil.PasswordResponses; -var bytesToString = sharedUtil.bytesToString; -var error = sharedUtil.error; -var isInt = sharedUtil.isInt; -var stringToBytes = sharedUtil.stringToBytes; -var utf8StringToString = sharedUtil.utf8StringToString; -var warn = sharedUtil.warn; -var Name = corePrimitives.Name; -var isName = corePrimitives.isName; -var isDict = corePrimitives.isDict; -var DecryptStream = coreStream.DecryptStream; - -var ARCFourCipher = (function ARCFourCipherClosure() { - function ARCFourCipher(key) { - this.a = 0; - this.b = 0; - var s = new Uint8Array(256); - var i, j = 0, tmp, keyLength = key.length; - for (i = 0; i < 256; ++i) { - s[i] = i; - } - for (i = 0; i < 256; ++i) { - tmp = s[i]; - j = (j + tmp + key[i % keyLength]) & 0xFF; - s[i] = s[j]; - s[j] = tmp; - } - this.s = s; - } - - ARCFourCipher.prototype = { - encryptBlock: function ARCFourCipher_encryptBlock(data) { - var i, n = data.length, tmp, tmp2; - var a = this.a, b = this.b, s = this.s; - var output = new Uint8Array(n); - for (i = 0; i < n; ++i) { - a = (a + 1) & 0xFF; - tmp = s[a]; - b = (b + tmp) & 0xFF; - tmp2 = s[b]; - s[a] = tmp2; - s[b] = tmp; - output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF]; - } - this.a = a; - this.b = b; - return output; - } - }; - ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock; - - return ARCFourCipher; -})(); - -var calculateMD5 = (function calculateMD5Closure() { - var r = new Uint8Array([ - 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); - - var k = new Int32Array([ - -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, - -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, - 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, - 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, - 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, - 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, - -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, - -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, - -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, - -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, - -145523070, -1120210379, 718787259, -343485551]); - - function hash(data, offset, length) { - var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; - // pre-processing - var paddedLength = (length + 72) & ~63; // data + 9 extra bytes - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = (length << 3) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - var w = new Int32Array(16); - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j, i += 4) { - w[j] = (padded[i] | (padded[i + 1] << 8) | - (padded[i + 2] << 16) | (padded[i + 3] << 24)); - } - var a = h0, b = h1, c = h2, d = h3, f, g; - for (j = 0; j < 64; ++j) { - if (j < 16) { - f = (b & c) | ((~b) & d); - g = j; - } else if (j < 32) { - f = (d & b) | ((~d) & c); - g = (5 * j + 1) & 15; - } else if (j < 48) { - f = b ^ c ^ d; - g = (3 * j + 5) & 15; - } else { - f = c ^ (b | (~d)); - g = (7 * j) & 15; - } - var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j]; - d = c; - c = b; - b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0; - a = tmp; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - } - return new Uint8Array([ - h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF, - h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF, - h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF, - h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF - ]); - } - - return hash; -})(); -var Word64 = (function Word64Closure() { - function Word64(highInteger, lowInteger) { - this.high = highInteger | 0; - this.low = lowInteger | 0; - } - Word64.prototype = { - and: function Word64_and(word) { - this.high &= word.high; - this.low &= word.low; - }, - xor: function Word64_xor(word) { - this.high ^= word.high; - this.low ^= word.low; - }, - - or: function Word64_or(word) { - this.high |= word.high; - this.low |= word.low; - }, - - shiftRight: function Word64_shiftRight(places) { - if (places >= 32) { - this.low = (this.high >>> (places - 32)) | 0; - this.high = 0; - } else { - this.low = (this.low >>> places) | (this.high << (32 - places)); - this.high = (this.high >>> places) | 0; - } - }, - - shiftLeft: function Word64_shiftLeft(places) { - if (places >= 32) { - this.high = this.low << (places - 32); - this.low = 0; - } else { - this.high = (this.high << places) | (this.low >>> (32 - places)); - this.low = this.low << places; - } - }, - - rotateRight: function Word64_rotateRight(places) { - var low, high; - if (places & 32) { - high = this.low; - low = this.high; - } else { - low = this.low; - high = this.high; - } - places &= 31; - this.low = (low >>> places) | (high << (32 - places)); - this.high = (high >>> places) | (low << (32 - places)); - }, - - not: function Word64_not() { - this.high = ~this.high; - this.low = ~this.low; - }, - - add: function Word64_add(word) { - var lowAdd = (this.low >>> 0) + (word.low >>> 0); - var highAdd = (this.high >>> 0) + (word.high >>> 0); - if (lowAdd > 0xFFFFFFFF) { - highAdd += 1; - } - this.low = lowAdd | 0; - this.high = highAdd | 0; - }, - - copyTo: function Word64_copyTo(bytes, offset) { - bytes[offset] = (this.high >>> 24) & 0xFF; - bytes[offset + 1] = (this.high >> 16) & 0xFF; - bytes[offset + 2] = (this.high >> 8) & 0xFF; - bytes[offset + 3] = this.high & 0xFF; - bytes[offset + 4] = (this.low >>> 24) & 0xFF; - bytes[offset + 5] = (this.low >> 16) & 0xFF; - bytes[offset + 6] = (this.low >> 8) & 0xFF; - bytes[offset + 7] = this.low & 0xFF; - }, - - assign: function Word64_assign(word) { - this.high = word.high; - this.low = word.low; - } - }; - return Word64; -})(); - -var calculateSHA256 = (function calculateSHA256Closure() { - function rotr(x, n) { - return (x >>> n) | (x << 32 - n); - } - - function ch(x, y, z) { - return (x & y) ^ (~x & z); - } - - function maj(x, y, z) { - return (x & y) ^ (x & z) ^ (y & z); - } - - function sigma(x) { - return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22); - } - - function sigmaPrime(x) { - return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25); - } - - function littleSigma(x) { - return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3; - } - - function littleSigmaPrime(x) { - return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10; - } - - var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; - - function hash(data, offset, length) { - // initial hash values - var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, - h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c, - h6 = 0x1f83d9ab, h7 = 0x5be0cd19; - // pre-processing - var paddedLength = Math.ceil((length + 9) / 64) * 64; - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length << 3) & 0xFF; - var w = new Uint32Array(64); - // for each 512 bit block - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j] = (padded[i] << 24 | (padded[i + 1] << 16) | - (padded[i + 2] << 8) | (padded[i + 3])); - i += 4; - } - - for (j = 16; j < 64; ++j) { - w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + - littleSigma(w[j - 15]) + w[j - 16] | 0; - } - var a = h0, b = h1, c = h2, d = h3, e = h4, - f = h5, g = h6, h = h7, t1, t2; - for (j = 0; j < 64; ++j) { - t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j]; - t2 = sigma(a) + maj(a, b, c); - h = g; - g = f; - f = e; - e = (d + t1) | 0; - d = c; - c = b; - b = a; - a = (t1 + t2) | 0; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - h4 = (h4 + e) | 0; - h5 = (h5 + f) | 0; - h6 = (h6 + g) | 0; - h7 = (h7 + h) | 0; - } - return new Uint8Array([ - (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF, - (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF, - (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF, - (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF, - (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF, - (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF, - (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF, - (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF - ]); - } - - return hash; -})(); - -var calculateSHA512 = (function calculateSHA512Closure() { - function ch(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.not(); - tmp.and(z); - result.xor(tmp); - } - - function maj(result, x, y, z, tmp) { - result.assign(x); - result.and(y); - tmp.assign(x); - tmp.and(z); - result.xor(tmp); - tmp.assign(y); - tmp.and(z); - result.xor(tmp); - } - - function sigma(result, x, tmp) { - result.assign(x); - result.rotateRight(28); - tmp.assign(x); - tmp.rotateRight(34); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(39); - result.xor(tmp); - } - - function sigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(14); - tmp.assign(x); - tmp.rotateRight(18); - result.xor(tmp); - tmp.assign(x); - tmp.rotateRight(41); - result.xor(tmp); - } - - function littleSigma(result, x, tmp) { - result.assign(x); - result.rotateRight(1); - tmp.assign(x); - tmp.rotateRight(8); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(7); - result.xor(tmp); - } - - function littleSigmaPrime(result, x, tmp) { - result.assign(x); - result.rotateRight(19); - tmp.assign(x); - tmp.rotateRight(61); - result.xor(tmp); - tmp.assign(x); - tmp.shiftRight(6); - result.xor(tmp); - } - - var k = [ - new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), - new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), - new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), - new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), - new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), - new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), - new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), - new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), - new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), - new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), - new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), - new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), - new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), - new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), - new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), - new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), - new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), - new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), - new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), - new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), - new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), - new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), - new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), - new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), - new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), - new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), - new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), - new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), - new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), - new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), - new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), - new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), - new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), - new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), - new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), - new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), - new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), - new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), - new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), - new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)]; - - function hash(data, offset, length, mode384) { - mode384 = !!mode384; - // initial hash values - var h0, h1, h2, h3, h4, h5, h6, h7; - if (!mode384) { - h0 = new Word64(0x6a09e667, 0xf3bcc908); - h1 = new Word64(0xbb67ae85, 0x84caa73b); - h2 = new Word64(0x3c6ef372, 0xfe94f82b); - h3 = new Word64(0xa54ff53a, 0x5f1d36f1); - h4 = new Word64(0x510e527f, 0xade682d1); - h5 = new Word64(0x9b05688c, 0x2b3e6c1f); - h6 = new Word64(0x1f83d9ab, 0xfb41bd6b); - h7 = new Word64(0x5be0cd19, 0x137e2179); - } - else { - // SHA384 is exactly the same - // except with different starting values and a trimmed result - h0 = new Word64(0xcbbb9d5d, 0xc1059ed8); - h1 = new Word64(0x629a292a, 0x367cd507); - h2 = new Word64(0x9159015a, 0x3070dd17); - h3 = new Word64(0x152fecd8, 0xf70e5939); - h4 = new Word64(0x67332667, 0xffc00b31); - h5 = new Word64(0x8eb44a87, 0x68581511); - h6 = new Word64(0xdb0c2e0d, 0x64f98fa7); - h7 = new Word64(0x47b5481d, 0xbefa4fa4); - } - - // pre-processing - var paddedLength = Math.ceil((length + 17) / 128) * 128; - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) { - padded[i] = data[offset++]; - } - padded[i++] = 0x80; - n = paddedLength - 16; - while (i < n) { - padded[i++] = 0; - } - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length << 3) & 0xFF; - - var w = new Array(80); - for (i = 0; i < 80; i++) { - w[i] = new Word64(0, 0); - } - var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0); - var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0); - var g = new Word64(0, 0), h = new Word64(0, 0); - var t1 = new Word64(0, 0), t2 = new Word64(0, 0); - var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3; - - // for each 1024 bit block - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j) { - w[j].high = (padded[i] << 24) | (padded[i + 1] << 16) | - (padded[i + 2] << 8) | (padded[i + 3]); - w[j].low = (padded[i + 4]) << 24 | (padded[i + 5]) << 16 | - (padded[i + 6]) << 8 | (padded[i + 7]); - i += 8; - } - for (j = 16; j < 80; ++j) { - tmp3 = w[j]; - littleSigmaPrime(tmp3, w[j - 2], tmp2); - tmp3.add(w[j - 7]); - littleSigma(tmp1, w[j - 15], tmp2); - tmp3.add(tmp1); - tmp3.add(w[j - 16]); - } - - a.assign(h0); b.assign(h1); c.assign(h2); d.assign(h3); - e.assign(h4); f.assign(h5); g.assign(h6); h.assign(h7); - for (j = 0; j < 80; ++j) { - t1.assign(h); - sigmaPrime(tmp1, e, tmp2); - t1.add(tmp1); - ch(tmp1, e, f, g, tmp2); - t1.add(tmp1); - t1.add(k[j]); - t1.add(w[j]); - - sigma(t2, a, tmp2); - maj(tmp1, a, b, c, tmp2); - t2.add(tmp1); - - tmp3 = h; - h = g; - g = f; - f = e; - d.add(t1); - e = d; - d = c; - c = b; - b = a; - tmp3.assign(t1); - tmp3.add(t2); - a = tmp3; - } - h0.add(a); - h1.add(b); - h2.add(c); - h3.add(d); - h4.add(e); - h5.add(f); - h6.add(g); - h7.add(h); - } - - var result; - if (!mode384) { - result = new Uint8Array(64); - h0.copyTo(result,0); - h1.copyTo(result,8); - h2.copyTo(result,16); - h3.copyTo(result,24); - h4.copyTo(result,32); - h5.copyTo(result,40); - h6.copyTo(result,48); - h7.copyTo(result,56); - } - else { - result = new Uint8Array(48); - h0.copyTo(result,0); - h1.copyTo(result,8); - h2.copyTo(result,16); - h3.copyTo(result,24); - h4.copyTo(result,32); - h5.copyTo(result,40); - } - return result; - } - - return hash; -})(); -var calculateSHA384 = (function calculateSHA384Closure() { - function hash(data, offset, length) { - return calculateSHA512(data, offset, length, true); - } - - return hash; -})(); -var NullCipher = (function NullCipherClosure() { - function NullCipher() { - } - - NullCipher.prototype = { - decryptBlock: function NullCipher_decryptBlock(data) { - return data; - } - }; - - return NullCipher; -})(); - -var AES128Cipher = (function AES128CipherClosure() { - var rcon = new Uint8Array([ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, - 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, - 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, - 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, - 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, - 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, - 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, - 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, - 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, - 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d]); - - var s = new Uint8Array([ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16]); - - var inv_s = new Uint8Array([ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d]); - var mixCol = new Uint8Array(256); - for (var i = 0; i < 256; i++) { - if (i < 128) { - mixCol[i] = i << 1; - } else { - mixCol[i] = (i << 1) ^ 0x1b; - } - } - var mix = new Uint32Array([ - 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, - 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, - 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, - 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, - 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, - 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, - 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, - 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, - 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, - 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, - 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, - 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, - 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, - 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, - 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, - 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, - 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, - 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, - 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, - 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, - 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, - 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, - 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, - 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, - 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, - 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, - 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, - 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, - 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, - 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, - 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, - 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, - 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, - 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, - 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, - 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, - 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, - 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, - 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, - 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, - 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, - 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, - 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - - function expandKey128(cipherKey) { - var b = 176, result = new Uint8Array(b); - result.set(cipherKey); - for (var j = 16, i = 1; j < b; ++i) { - // RotWord - var t1 = result[j - 3], t2 = result[j - 2], - t3 = result[j - 1], t4 = result[j - 4]; - // SubWord - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - // Rcon - t1 = t1 ^ rcon[i]; - for (var n = 0; n < 4; ++n) { - result[j] = (t1 ^= result[j - 16]); - j++; - result[j] = (t2 ^= result[j - 16]); - j++; - result[j] = (t3 ^= result[j - 16]); - j++; - result[j] = (t4 ^= result[j - 16]); - j++; - } - } - return result; - } - - function decrypt128(input, key) { - var state = new Uint8Array(16); - state.set(input); - var i, j, k; - var t, u, v; - // AddRoundKey - for (j = 0, k = 160; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (i = 9; i >= 1; --i) { - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - // InvSubBytes - for (j = 0; j < 16; ++j) { - state[j] = inv_s[state[j]]; - } - // AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - // InvMixColumns - for (j = 0; j < 16; j += 4) { - var s0 = mix[state[j]], s1 = mix[state[j + 1]], - s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; - t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ - (s3 >>> 24) ^ (s3 << 8)); - state[j] = (t >>> 24) & 0xFF; - state[j + 1] = (t >> 16) & 0xFF; - state[j + 2] = (t >> 8) & 0xFF; - state[j + 3] = t & 0xFF; - } - } - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (j = 0; j < 16; ++j) { - // InvSubBytes - state[j] = inv_s[state[j]]; - // AddRoundKey - state[j] ^= key[j]; - } - return state; - } - - function encrypt128(input, key) { - var t, u, v, k; - var state = new Uint8Array(16); - state.set(input); - for (j = 0; j < 16; ++j) { - // AddRoundKey - state[j] ^= key[j]; - } - - for (i = 1; i < 10; i++) { - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //MixColumns - for (var j = 0; j < 16; j += 4) { - var s0 = state[j + 0], s1 = state[j + 1]; - var s2 = state[j + 2], s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j + 0] ^= t ^ mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ mixCol[s3 ^ s0]; - } - //AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //AddRoundKey - for (j = 0, k = 160; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - return state; - } - - function AES128Cipher(key) { - this.key = expandKey128(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data, finalize) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = [], iv = this.iv; - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - // buffer is full, decrypting - var plain = decrypt128(buffer, this.key); - // xor-ing the IV vector to get plain text - for (j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - if (finalize) { - // undo a padding that is described in RFC 2898 - var lastBlock = result[result.length - 1]; - var psLen = lastBlock[15]; - if (psLen <= 16) { - for (i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - // Invalid padding, assume that the block has no padding. - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - - AES128Cipher.prototype = { - decryptBlock: function AES128Cipher_decryptBlock(data, finalize) { - var i, sourceLength = data.length; - var buffer = this.buffer, bufferLength = this.bufferPosition; - // waiting for IV values -- they are at the start of the stream - for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - // need more data - this.bufferLength = bufferLength; - return new Uint8Array([]); - } - this.iv = buffer; - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - // starting decryption - this.decryptBlock = decryptBlock2; - return this.decryptBlock(data.subarray(16), finalize); - }, - encrypt: function AES128Cipher_encrypt(data, iv) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = []; - if (!iv) { - iv = new Uint8Array(16); - } - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - - // buffer is full, encrypting - var cipher = encrypt128(buffer, this.key); - iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - }; - - return AES128Cipher; -})(); - -var AES256Cipher = (function AES256CipherClosure() { - var rcon = new Uint8Array([ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, - 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, - 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, - 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, - 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, - 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, - 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, - 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, - 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, - 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d]); - - var s = new Uint8Array([ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16]); - - var inv_s = new Uint8Array([ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d]); - - var mixCol = new Uint8Array(256); - for (var i = 0; i < 256; i++) { - if (i < 128) { - mixCol[i] = i << 1; - } else { - mixCol[i] = (i << 1) ^ 0x1b; - } - } - var mix = new Uint32Array([ - 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, - 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, - 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, - 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, - 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, - 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, - 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, - 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, - 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, - 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, - 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, - 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, - 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, - 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, - 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, - 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, - 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, - 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, - 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, - 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, - 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, - 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, - 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, - 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, - 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, - 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, - 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, - 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, - 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, - 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, - 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, - 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, - 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, - 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, - 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, - 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, - 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, - 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, - 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, - 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, - 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, - 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, - 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - - function expandKey256(cipherKey) { - var b = 240, result = new Uint8Array(b); - var r = 1; - - result.set(cipherKey); - for (var j = 32, i = 1; j < b; ++i) { - if (j % 32 === 16) { - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - } else if (j % 32 === 0) { - // RotWord - var t1 = result[j - 3], t2 = result[j - 2], - t3 = result[j - 1], t4 = result[j - 4]; - // SubWord - t1 = s[t1]; - t2 = s[t2]; - t3 = s[t3]; - t4 = s[t4]; - // Rcon - t1 = t1 ^ r; - if ((r <<= 1) >= 256) { - r = (r ^ 0x1b) & 0xFF; - } - } - - for (var n = 0; n < 4; ++n) { - result[j] = (t1 ^= result[j - 32]); - j++; - result[j] = (t2 ^= result[j - 32]); - j++; - result[j] = (t3 ^= result[j - 32]); - j++; - result[j] = (t4 ^= result[j - 32]); - j++; - } - } - return result; - } - - function decrypt256(input, key) { - var state = new Uint8Array(16); - state.set(input); - var i, j, k; - var t, u, v; - // AddRoundKey - for (j = 0, k = 224; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - for (i = 13; i >= 1; --i) { - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - // InvSubBytes - for (j = 0; j < 16; ++j) { - state[j] = inv_s[state[j]]; - } - // AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - // InvMixColumns - for (j = 0; j < 16; j += 4) { - var s0 = mix[state[j]], s1 = mix[state[j + 1]], - s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; - t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ - (s3 >>> 24) ^ (s3 << 8)); - state[j] = (t >>> 24) & 0xFF; - state[j + 1] = (t >> 16) & 0xFF; - state[j + 2] = (t >> 8) & 0xFF; - state[j + 3] = t & 0xFF; - } - } - // InvShiftRows - t = state[13]; - state[13] = state[9]; - state[9] = state[5]; - state[5] = state[1]; - state[1] = t; - t = state[14]; - u = state[10]; - state[14] = state[6]; - state[10] = state[2]; - state[6] = t; - state[2] = u; - t = state[15]; - u = state[11]; - v = state[7]; - state[15] = state[3]; - state[11] = t; - state[7] = u; - state[3] = v; - for (j = 0; j < 16; ++j) { - // InvSubBytes - state[j] = inv_s[state[j]]; - // AddRoundKey - state[j] ^= key[j]; - } - return state; - } - - function encrypt256(input, key) { - var t, u, v, k; - var state = new Uint8Array(16); - state.set(input); - for (j = 0; j < 16; ++j) { - // AddRoundKey - state[j] ^= key[j]; - } - - for (i = 1; i < 14; i++) { - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //MixColumns - for (var j = 0; j < 16; j += 4) { - var s0 = state[j + 0], s1 = state[j + 1]; - var s2 = state[j + 2], s3 = state[j + 3]; - t = s0 ^ s1 ^ s2 ^ s3; - state[j + 0] ^= t ^ mixCol[s0 ^ s1]; - state[j + 1] ^= t ^ mixCol[s1 ^ s2]; - state[j + 2] ^= t ^ mixCol[s2 ^ s3]; - state[j + 3] ^= t ^ mixCol[s3 ^ s0]; - } - //AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - } - - //SubBytes - for (j = 0; j < 16; ++j) { - state[j] = s[state[j]]; - } - //ShiftRows - v = state[1]; - state[1] = state[5]; - state[5] = state[9]; - state[9] = state[13]; - state[13] = v; - v = state[2]; - u = state[6]; - state[2] = state[10]; - state[6] = state[14]; - state[10] = v; - state[14] = u; - v = state[3]; - u = state[7]; - t = state[11]; - state[3] = state[15]; - state[7] = v; - state[11] = u; - state[15] = t; - //AddRoundKey - for (j = 0, k = 224; j < 16; ++j, ++k) { - state[j] ^= key[k]; - } - - return state; - - } - - function AES256Cipher(key) { - this.key = expandKey256(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data, finalize) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = [], iv = this.iv; - - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - // buffer is full, decrypting - var plain = decrypt256(buffer, this.key); - // xor-ing the IV vector to get plain text - for (j = 0; j < 16; ++j) { - plain[j] ^= iv[j]; - } - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - if (finalize) { - // undo a padding that is described in RFC 2898 - var lastBlock = result[result.length - 1]; - var psLen = lastBlock[15]; - if (psLen <= 16) { - for (i = 15, ii = 16 - psLen; i >= ii; --i) { - if (lastBlock[i] !== psLen) { - // Invalid padding, assume that the block has no padding. - psLen = 0; - break; - } - } - outputLength -= psLen; - result[result.length - 1] = lastBlock.subarray(0, 16 - psLen); - } - } - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - - } - - AES256Cipher.prototype = { - decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) { - var i, sourceLength = data.length; - var buffer = this.buffer, bufferLength = this.bufferPosition; - // if not supplied an IV wait for IV values - // they are at the start of the stream - if (iv) { - this.iv = iv; - } else { - for (i = 0; bufferLength < 16 && - i < sourceLength; ++i, ++bufferLength) { - buffer[bufferLength] = data[i]; - } - if (bufferLength < 16) { - //need more data - this.bufferLength = bufferLength; - return new Uint8Array([]); - } - this.iv = buffer; - data = data.subarray(16); - } - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - // starting decryption - this.decryptBlock = decryptBlock2; - return this.decryptBlock(data, finalize); - }, - encrypt: function AES256Cipher_encrypt(data, iv) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = []; - if (!iv) { - iv = new Uint8Array(16); - } - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) { - continue; - } - for (j = 0; j < 16; ++j) { - buffer[j] ^= iv[j]; - } - - // buffer is full, encrypting - var cipher = encrypt256(buffer, this.key); - this.iv = cipher; - result.push(cipher); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length === 0) { - return new Uint8Array([]); - } - // combining plain text blocks into one - var outputLength = 16 * result.length; - var output = new Uint8Array(outputLength); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) { - output.set(result[i], j); - } - return output; - } - }; - - return AES256Cipher; -})(); - -var PDF17 = (function PDF17Closure() { - - function compareByteArrays(array1, array2) { - if (array1.length !== array2.length) { - return false; - } - for (var i = 0; i < array1.length; i++) { - if (array1[i] !== array2[i]) { - return false; - } - } - return true; - } - - function PDF17() { - } - - PDF17.prototype = { - checkOwnerPassword: function PDF17_checkOwnerPassword(password, - ownerValidationSalt, - userBytes, - ownerPassword) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - var result = calculateSHA256(hashData, 0, hashData.length); - return compareByteArrays(result, ownerPassword); - }, - checkUserPassword: function PDF17_checkUserPassword(password, - userValidationSalt, - userPassword) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - var result = calculateSHA256(hashData, 0, hashData.length); - return compareByteArrays(result, userPassword); - }, - getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, - ownerEncryption) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - var key = calculateSHA256(hashData, 0, hashData.length); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, - false, - new Uint8Array(16)); - - }, - getUserKey: function PDF17_getUserKey(password, userKeySalt, - userEncryption) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - //key is the decryption key for the UE string - var key = calculateSHA256(hashData, 0, hashData.length); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, - false, - new Uint8Array(16)); - } - }; - return PDF17; -})(); - -var PDF20 = (function PDF20Closure() { - - function concatArrays(array1, array2) { - var t = new Uint8Array(array1.length + array2.length); - t.set(array1, 0); - t.set(array2, array1.length); - return t; - } - - function calculatePDF20Hash(password, input, userBytes) { - //This refers to Algorithm 2.B as defined in ISO 32000-2 - var k = calculateSHA256(input, 0, input.length).subarray(0, 32); - var e = [0]; - var i = 0; - while (i < 64 || e[e.length - 1] > i - 32) { - var arrayLength = password.length + k.length + userBytes.length; - - var k1 = new Uint8Array(arrayLength * 64); - var array = concatArrays(password, k); - array = concatArrays(array, userBytes); - for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) { - k1.set(array, pos); - } - //AES128 CBC NO PADDING with - //first 16 bytes of k as the key and the second 16 as the iv. - var cipher = new AES128Cipher(k.subarray(0, 16)); - e = cipher.encrypt(k1, k.subarray(16, 32)); - //Now we have to take the first 16 bytes of an unsigned - //big endian integer... and compute the remainder - //modulo 3.... That is a fairly large number and - //JavaScript isn't going to handle that well... - //So we're using a trick that allows us to perform - //modulo math byte by byte - var remainder = 0; - for (var z = 0; z < 16; z++) { - remainder *= (256 % 3); - remainder %= 3; - remainder += ((e[z] >>> 0) % 3); - remainder %= 3; - } - if (remainder === 0) { - k = calculateSHA256(e, 0, e.length); - } - else if (remainder === 1) { - k = calculateSHA384(e, 0, e.length); - } - else if (remainder === 2) { - k = calculateSHA512(e, 0, e.length); - } - i++; - } - return k.subarray(0, 32); - } - - function PDF20() { - } - - function compareByteArrays(array1, array2) { - if (array1.length !== array2.length) { - return false; - } - for (var i = 0; i < array1.length; i++) { - if (array1[i] !== array2[i]) { - return false; - } - } - return true; - } - - PDF20.prototype = { - hash: function PDF20_hash(password, concatBytes, userBytes) { - return calculatePDF20Hash(password, concatBytes, userBytes); - }, - checkOwnerPassword: function PDF20_checkOwnerPassword(password, - ownerValidationSalt, - userBytes, - ownerPassword) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerValidationSalt, password.length); - hashData.set(userBytes, password.length + ownerValidationSalt.length); - var result = calculatePDF20Hash(password, hashData, userBytes); - return compareByteArrays(result, ownerPassword); - }, - checkUserPassword: function PDF20_checkUserPassword(password, - userValidationSalt, - userPassword) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userValidationSalt, password.length); - var result = calculatePDF20Hash(password, hashData, []); - return compareByteArrays(result, userPassword); - }, - getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, - ownerEncryption) { - var hashData = new Uint8Array(password.length + 56); - hashData.set(password, 0); - hashData.set(ownerKeySalt, password.length); - hashData.set(userBytes, password.length + ownerKeySalt.length); - var key = calculatePDF20Hash(password, hashData, userBytes); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(ownerEncryption, - false, - new Uint8Array(16)); - - }, - getUserKey: function PDF20_getUserKey(password, userKeySalt, - userEncryption) { - var hashData = new Uint8Array(password.length + 8); - hashData.set(password, 0); - hashData.set(userKeySalt, password.length); - //key is the decryption key for the UE string - var key = calculatePDF20Hash(password, hashData, []); - var cipher = new AES256Cipher(key); - return cipher.decryptBlock(userEncryption, - false, - new Uint8Array(16)); - } - }; - return PDF20; -})(); - -var CipherTransform = (function CipherTransformClosure() { - function CipherTransform(stringCipherConstructor, streamCipherConstructor) { - this.stringCipherConstructor = stringCipherConstructor; - this.streamCipherConstructor = streamCipherConstructor; - } - - CipherTransform.prototype = { - createStream: function CipherTransform_createStream(stream, length) { - var cipher = new this.streamCipherConstructor(); - return new DecryptStream(stream, length, - function cipherTransformDecryptStream(data, finalize) { - return cipher.decryptBlock(data, finalize); - } - ); - }, - decryptString: function CipherTransform_decryptString(s) { - var cipher = new this.stringCipherConstructor(); - var data = stringToBytes(s); - data = cipher.decryptBlock(data, true); - return bytesToString(data); - } - }; - return CipherTransform; -})(); - -var CipherTransformFactory = (function CipherTransformFactoryClosure() { - var defaultPasswordBytes = new Uint8Array([ - 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, - 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, - 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, - 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]); - - function createEncryptionKey20(revision, password, ownerPassword, - ownerValidationSalt, ownerKeySalt, uBytes, - userPassword, userValidationSalt, userKeySalt, - ownerEncryption, userEncryption, perms) { - if (password) { - var passwordLength = Math.min(127, password.length); - password = password.subarray(0, passwordLength); - } else { - password = []; - } - var pdfAlgorithm; - if (revision === 6) { - pdfAlgorithm = new PDF20(); - } else { - pdfAlgorithm = new PDF17(); - } - - if (pdfAlgorithm) { - if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, - userPassword)) { - return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption); - } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, - ownerValidationSalt, - uBytes, - ownerPassword)) { - return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, - ownerEncryption); - } - } - - return null; - } - - function prepareKeyData(fileId, password, ownerPassword, userPassword, - flags, revision, keyLength, encryptMetadata) { - var hashDataSize = 40 + ownerPassword.length + fileId.length; - var hashData = new Uint8Array(hashDataSize), i = 0, j, n; - if (password) { - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - } - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - // as now the padded password in the hashData[0..i] - for (j = 0, n = ownerPassword.length; j < n; ++j) { - hashData[i++] = ownerPassword[j]; - } - hashData[i++] = flags & 0xFF; - hashData[i++] = (flags >> 8) & 0xFF; - hashData[i++] = (flags >> 16) & 0xFF; - hashData[i++] = (flags >>> 24) & 0xFF; - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; - } - if (revision >= 4 && !encryptMetadata) { - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, keyLengthInBytes); - } - } - var encryptionKey = hash.subarray(0, keyLengthInBytes); - var cipher, checkData; - - if (revision >= 3) { - for (i = 0; i < 32; ++i) { - hashData[i] = defaultPasswordBytes[i]; - } - for (j = 0, n = fileId.length; j < n; ++j) { - hashData[i++] = fileId[j]; - } - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); - n = encryptionKey.length; - var derivedKey = new Uint8Array(n), k; - for (j = 1; j <= 19; ++j) { - for (k = 0; k < n; ++k) { - derivedKey[k] = encryptionKey[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - checkData = cipher.encryptBlock(checkData); - } - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { - return null; - } - } - } else { - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(defaultPasswordBytes); - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] !== checkData[j]) { - return null; - } - } - } - return encryptionKey; - } - - function decodeUserPassword(password, ownerPassword, revision, keyLength) { - var hashData = new Uint8Array(32), i = 0, j, n; - n = Math.min(32, password.length); - for (; i < n; ++i) { - hashData[i] = password[i]; - } - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, hash.length); - } - } - - var cipher, userPassword; - if (revision >= 3) { - userPassword = ownerPassword; - var derivedKey = new Uint8Array(keyLengthInBytes), k; - for (j = 19; j >= 0; j--) { - for (k = 0; k < keyLengthInBytes; ++k) { - derivedKey[k] = hash[k] ^ j; - } - cipher = new ARCFourCipher(derivedKey); - userPassword = cipher.encryptBlock(userPassword); - } - } else { - cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); - userPassword = cipher.encryptBlock(ownerPassword); - } - return userPassword; - } - - var identityName = Name.get('Identity'); - - function CipherTransformFactory(dict, fileId, password) { - var filter = dict.get('Filter'); - if (!isName(filter) || filter.name !== 'Standard') { - error('unknown encryption method'); - } - this.dict = dict; - var algorithm = dict.get('V'); - if (!isInt(algorithm) || - (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && - algorithm !== 5)) { - error('unsupported encryption algorithm'); - } - this.algorithm = algorithm; - var keyLength = dict.get('Length'); - if (!keyLength) { - // Spec asks to rely on encryption dictionary's Length entry, however - // some PDFs don't have it. Trying to recover. - if (algorithm <= 3) { - // For 1 and 2 it's fixed to 40-bit, for 3 40-bit is a minimal value. - keyLength = 40; - } else { - // Trying to find default handler -- it usually has Length. - var cfDict = dict.get('CF'); - var streamCryptoName = dict.get('StmF'); - if (isDict(cfDict) && isName(streamCryptoName)) { - var handlerDict = cfDict.get(streamCryptoName.name); - keyLength = (handlerDict && handlerDict.get('Length')) || 128; - if (keyLength < 40) { - // Sometimes it's incorrect value of bits, generators specify bytes. - keyLength <<= 3; - } - } - } - } - if (!isInt(keyLength) || - keyLength < 40 || (keyLength % 8) !== 0) { - error('invalid key length'); - } - - // prepare keys - var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32); - var userPassword = stringToBytes(dict.get('U')).subarray(0, 32); - var flags = dict.get('P'); - var revision = dict.get('R'); - // meaningful when V is 4 or 5 - var encryptMetadata = ((algorithm === 4 || algorithm === 5) && - dict.get('EncryptMetadata') !== false); - this.encryptMetadata = encryptMetadata; - - var fileIdBytes = stringToBytes(fileId); - var passwordBytes; - if (password) { - if (revision === 6) { - try { - password = utf8StringToString(password); - } catch (ex) { - warn('CipherTransformFactory: ' + - 'Unable to convert UTF8 encoded password.'); - } - } - passwordBytes = stringToBytes(password); - } - - var encryptionKey; - if (algorithm !== 5) { - encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - } - else { - var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40); - var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48); - var uBytes = stringToBytes(dict.get('U')).subarray(0, 48); - var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40); - var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48); - var ownerEncryption = stringToBytes(dict.get('OE')); - var userEncryption = stringToBytes(dict.get('UE')); - var perms = stringToBytes(dict.get('Perms')); - encryptionKey = - createEncryptionKey20(revision, passwordBytes, - ownerPassword, ownerValidationSalt, - ownerKeySalt, uBytes, - userPassword, userValidationSalt, - userKeySalt, ownerEncryption, - userEncryption, perms); - } - if (!encryptionKey && !password) { - throw new PasswordException('No password given', - PasswordResponses.NEED_PASSWORD); - } else if (!encryptionKey && password) { - // Attempting use the password as an owner password - var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, - revision, keyLength); - encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - } - - if (!encryptionKey) { - throw new PasswordException('Incorrect Password', - PasswordResponses.INCORRECT_PASSWORD); - } - - this.encryptionKey = encryptionKey; - - if (algorithm >= 4) { - this.cf = dict.get('CF'); - this.stmf = dict.get('StmF') || identityName; - this.strf = dict.get('StrF') || identityName; - this.eff = dict.get('EFF') || this.stmf; - } - } - - function buildObjectKey(num, gen, encryptionKey, isAes) { - var key = new Uint8Array(encryptionKey.length + 9), i, n; - for (i = 0, n = encryptionKey.length; i < n; ++i) { - key[i] = encryptionKey[i]; - } - key[i++] = num & 0xFF; - key[i++] = (num >> 8) & 0xFF; - key[i++] = (num >> 16) & 0xFF; - key[i++] = gen & 0xFF; - key[i++] = (gen >> 8) & 0xFF; - if (isAes) { - key[i++] = 0x73; - key[i++] = 0x41; - key[i++] = 0x6C; - key[i++] = 0x54; - } - var hash = calculateMD5(key, 0, i); - return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); - } - - function buildCipherConstructor(cf, name, num, gen, key) { - var cryptFilter = cf.get(name.name); - var cfm; - if (cryptFilter !== null && cryptFilter !== undefined) { - cfm = cryptFilter.get('CFM'); - } - if (!cfm || cfm.name === 'None') { - return function cipherTransformFactoryBuildCipherConstructorNone() { - return new NullCipher(); - }; - } - if ('V2' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorV2() { - return new ARCFourCipher(buildObjectKey(num, gen, key, false)); - }; - } - if ('AESV2' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorAESV2() { - return new AES128Cipher(buildObjectKey(num, gen, key, true)); - }; - } - if ('AESV3' === cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorAESV3() { - return new AES256Cipher(key); - }; - } - error('Unknown crypto method'); - } - - CipherTransformFactory.prototype = { - createCipherTransform: - function CipherTransformFactory_createCipherTransform(num, gen) { - if (this.algorithm === 4 || this.algorithm === 5) { - return new CipherTransform( - buildCipherConstructor(this.cf, this.stmf, - num, gen, this.encryptionKey), - buildCipherConstructor(this.cf, this.strf, - num, gen, this.encryptionKey)); - } - // algorithms 1 and 2 - var key = buildObjectKey(num, gen, this.encryptionKey, false); - var cipherConstructor = function buildCipherCipherConstructor() { - return new ARCFourCipher(key); - }; - return new CipherTransform(cipherConstructor, cipherConstructor); - } - }; - - return CipherTransformFactory; -})(); - -exports.AES128Cipher = AES128Cipher; -exports.AES256Cipher = AES256Cipher; -exports.ARCFourCipher = ARCFourCipher; -exports.CipherTransformFactory = CipherTransformFactory; -exports.PDF17 = PDF17; -exports.PDF20 = PDF20; -exports.calculateMD5 = calculateMD5; -exports.calculateSHA256 = calculateSHA256; -exports.calculateSHA384 = calculateSHA384; -exports.calculateSHA512 = calculateSHA512; -})); - -(function (root, factory) { - { - factory((root.pdfjsCoreFontRenderer = {}), root.pdfjsSharedUtil, - root.pdfjsCoreStream, root.pdfjsCoreGlyphList); - } -}(this, function (exports, sharedUtil, coreStream, coreGlyphList) { - -var Util = sharedUtil.Util; -var bytesToString = sharedUtil.bytesToString; -var error = sharedUtil.error; -var Stream = coreStream.Stream; -var GlyphsUnicode = coreGlyphList.GlyphsUnicode; - -var coreFonts; // see _setCoreFonts below -var CFFParser; // = coreFonts.CFFParser; -var Encodings; // = coreFonts.Encodings; - -var FontRendererFactory = (function FontRendererFactoryClosure() { - function getLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - } - - function getUshort(data, offset) { - return (data[offset] << 8) | data[offset + 1]; - } - - function parseCmap(data, start, end) { - var offset = (getUshort(data, start + 2) === 1 ? - getLong(data, start + 8) : getLong(data, start + 16)); - var format = getUshort(data, start + offset); - var length, ranges, p, i; - if (format === 4) { - length = getUshort(data, start + offset + 2); - var segCount = getUshort(data, start + offset + 6) >> 1; - p = start + offset + 14; - ranges = []; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i] = {end: getUshort(data, p)}; - } - p += 2; - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].start = getUshort(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - ranges[i].idDelta = getUshort(data, p); - } - for (i = 0; i < segCount; i++, p += 2) { - var idOffset = getUshort(data, p); - if (idOffset === 0) { - continue; - } - ranges[i].ids = []; - for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) { - ranges[i].ids[j] = getUshort(data, p + idOffset); - idOffset += 2; - } - } - return ranges; - } else if (format === 12) { - length = getLong(data, start + offset + 4); - var groups = getLong(data, start + offset + 12); - p = start + offset + 16; - ranges = []; - for (i = 0; i < groups; i++) { - ranges.push({ - start: getLong(data, p), - end: getLong(data, p + 4), - idDelta: getLong(data, p + 8) - getLong(data, p) - }); - p += 12; - } - return ranges; - } - error('not supported cmap: ' + format); - } - - function parseCff(data, start, end) { - var properties = {}; - var parser = new CFFParser(new Stream(data, start, end - start), - properties); - var cff = parser.parse(); - return { - glyphs: cff.charStrings.objects, - subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && - cff.topDict.privateDict.subrsIndex.objects), - gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects - }; - } - - function parseGlyfTable(glyf, loca, isGlyphLocationsLong) { - var itemSize, itemDecode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = function fontItemDecodeLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - }; - } else { - itemSize = 2; - itemDecode = function fontItemDecode(data, offset) { - return (data[offset] << 9) | (data[offset + 1] << 1); - }; - } - var glyphs = []; - var startOffset = itemDecode(loca, 0); - for (var j = itemSize; j < loca.length; j += itemSize) { - var endOffset = itemDecode(loca, j); - glyphs.push(glyf.subarray(startOffset, endOffset)); - startOffset = endOffset; - } - return glyphs; - } - - function lookupCmap(ranges, unicode) { - var code = unicode.charCodeAt(0); - var l = 0, r = ranges.length - 1; - while (l < r) { - var c = (l + r + 1) >> 1; - if (code < ranges[c].start) { - r = c - 1; - } else { - l = c; - } - } - if (ranges[l].start <= code && code <= ranges[l].end) { - return (ranges[l].idDelta + (ranges[l].ids ? - ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF; - } - return 0; - } - - function compileGlyf(code, cmds, font) { - function moveTo(x, y) { - cmds.push({cmd: 'moveTo', args: [x, y]}); - } - function lineTo(x, y) { - cmds.push({cmd: 'lineTo', args: [x, y]}); - } - function quadraticCurveTo(xa, ya, x, y) { - cmds.push({cmd: 'quadraticCurveTo', args: [xa, ya, x, y]}); - } - - var i = 0; - var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - var flags; - var x = 0, y = 0; - i += 10; - if (numberOfContours < 0) { - // composite glyph - do { - flags = (code[i] << 8) | code[i + 1]; - var glyphIndex = (code[i + 2] << 8) | code[i + 3]; - i += 4; - var arg1, arg2; - if ((flags & 0x01)) { - arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16; - i += 4; - } else { - arg1 = code[i++]; arg2 = code[i++]; - } - if ((flags & 0x02)) { - x = arg1; - y = arg2; - } else { - x = 0; y = 0; // TODO "they are points" ? - } - var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0; - if ((flags & 0x08)) { - scaleX = - scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - i += 2; - } else if ((flags & 0x40)) { - scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; - i += 4; - } else if ((flags & 0x80)) { - scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824; - scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824; - scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824; - scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824; - i += 8; - } - var subglyph = font.glyphs[glyphIndex]; - if (subglyph) { - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'transform', - args: [scaleX, scale01, scale10, scaleY, x, y]}); - compileGlyf(subglyph, cmds, font); - cmds.push({cmd: 'restore'}); - } - } while ((flags & 0x20)); - } else { - // simple glyph - var endPtsOfContours = []; - var j, jj; - for (j = 0; j < numberOfContours; j++) { - endPtsOfContours.push((code[i] << 8) | code[i + 1]); - i += 2; - } - var instructionLength = (code[i] << 8) | code[i + 1]; - i += 2 + instructionLength; // skipping the instructions - var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1; - var points = []; - while (points.length < numberOfPoints) { - flags = code[i++]; - var repeat = 1; - if ((flags & 0x08)) { - repeat += code[i++]; - } - while (repeat-- > 0) { - points.push({flags: flags}); - } - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x12) { - case 0x00: - x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - i += 2; - break; - case 0x02: - x -= code[i++]; - break; - case 0x12: - x += code[i++]; - break; - } - points[j].x = x; - } - for (j = 0; j < numberOfPoints; j++) { - switch (points[j].flags & 0x24) { - case 0x00: - y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16; - i += 2; - break; - case 0x04: - y -= code[i++]; - break; - case 0x24: - y += code[i++]; - break; - } - points[j].y = y; - } - - var startPoint = 0; - for (i = 0; i < numberOfContours; i++) { - var endPoint = endPtsOfContours[i]; - // contours might have implicit points, which is located in the middle - // between two neighboring off-curve points - var contour = points.slice(startPoint, endPoint + 1); - if ((contour[0].flags & 1)) { - contour.push(contour[0]); // using start point at the contour end - } else if ((contour[contour.length - 1].flags & 1)) { - // first is off-curve point, trying to use one from the end - contour.unshift(contour[contour.length - 1]); - } else { - // start and end are off-curve points, creating implicit one - var p = { - flags: 1, - x: (contour[0].x + contour[contour.length - 1].x) / 2, - y: (contour[0].y + contour[contour.length - 1].y) / 2 - }; - contour.unshift(p); - contour.push(p); - } - moveTo(contour[0].x, contour[0].y); - for (j = 1, jj = contour.length; j < jj; j++) { - if ((contour[j].flags & 1)) { - lineTo(contour[j].x, contour[j].y); - } else if ((contour[j + 1].flags & 1)){ - quadraticCurveTo(contour[j].x, contour[j].y, - contour[j + 1].x, contour[j + 1].y); - j++; - } else { - quadraticCurveTo(contour[j].x, contour[j].y, - (contour[j].x + contour[j + 1].x) / 2, - (contour[j].y + contour[j + 1].y) / 2); - } - } - startPoint = endPoint + 1; - } - } - } - - function compileCharString(code, cmds, font) { - var stack = []; - var x = 0, y = 0; - var stems = 0; - - function moveTo(x, y) { - cmds.push({cmd: 'moveTo', args: [x, y]}); - } - function lineTo(x, y) { - cmds.push({cmd: 'lineTo', args: [x, y]}); - } - function bezierCurveTo(x1, y1, x2, y2, x, y) { - cmds.push({cmd: 'bezierCurveTo', args: [x1, y1, x2, y2, x, y]}); - } - - function parse(code) { - var i = 0; - while (i < code.length) { - var stackClean = false; - var v = code[i++]; - var xa, xb, ya, yb, y1, y2, y3, n, subrCode; - switch (v) { - case 1: // hstem - stems += stack.length >> 1; - stackClean = true; - break; - case 3: // vstem - stems += stack.length >> 1; - stackClean = true; - break; - case 4: // vmoveto - y += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 5: // rlineto - while (stack.length > 0) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - break; - case 6: // hlineto - while (stack.length > 0) { - x += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - y += stack.shift(); - lineTo(x, y); - } - break; - case 7: // vlineto - while (stack.length > 0) { - y += stack.shift(); - lineTo(x, y); - if (stack.length === 0) { - break; - } - x += stack.shift(); - lineTo(x, y); - } - break; - case 8: // rrcurveto - while (stack.length > 0) { - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 10: // callsubr - n = stack.pop() + font.subrsBias; - subrCode = font.subrs[n]; - if (subrCode) { - parse(subrCode); - } - break; - case 11: // return - return; - case 12: - v = code[i++]; - switch (v) { - case 34: // flex - xa = x + stack.shift(); - xb = xa + stack.shift(); y1 = y + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y, xb, y1, x, y1); - xa = x + stack.shift(); - xb = xa + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y, x, y); - break; - case 35: // flex - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - stack.pop(); // fd - break; - case 36: // hflex1 - xa = x + stack.shift(); y1 = y + stack.shift(); - xb = xa + stack.shift(); y2 = y1 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y1, xb, y2, x, y2); - xa = x + stack.shift(); - xb = xa + stack.shift(); y3 = y2 + stack.shift(); - x = xb + stack.shift(); - bezierCurveTo(xa, y2, xb, y3, x, y); - break; - case 37: // flex1 - var x0 = x, y0 = y; - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb; y = yb; - if (Math.abs(x - x0) > Math.abs(y - y0)) { - x += stack.shift(); - } else { - y += stack.shift(); - } - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - default: - error('unknown operator: 12 ' + v); - } - break; - case 14: // endchar - if (stack.length >= 4) { - var achar = stack.pop(); - var bchar = stack.pop(); - y = stack.pop(); - x = stack.pop(); - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'translate', args: [x, y]}); - var gid = lookupCmap(font.cmap, String.fromCharCode( - font.glyphNameMap[Encodings.StandardEncoding[achar]])); - compileCharString(font.glyphs[gid], cmds, font); - cmds.push({cmd: 'restore'}); - - gid = lookupCmap(font.cmap, String.fromCharCode( - font.glyphNameMap[Encodings.StandardEncoding[bchar]])); - compileCharString(font.glyphs[gid], cmds, font); - } - return; - case 18: // hstemhm - stems += stack.length >> 1; - stackClean = true; - break; - case 19: // hintmask - stems += stack.length >> 1; - i += (stems + 7) >> 3; - stackClean = true; - break; - case 20: // cntrmask - stems += stack.length >> 1; - i += (stems + 7) >> 3; - stackClean = true; - break; - case 21: // rmoveto - y += stack.pop(); - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 22: // hmoveto - x += stack.pop(); - moveTo(x, y); - stackClean = true; - break; - case 23: // vstemhm - stems += stack.length >> 1; - stackClean = true; - break; - case 24: // rcurveline - while (stack.length > 2) { - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - break; - case 25: // rlinecurve - while (stack.length > 6) { - x += stack.shift(); - y += stack.shift(); - lineTo(x, y); - } - xa = x + stack.shift(); ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - break; - case 26: // vvcurveto - if (stack.length % 2) { - x += stack.shift(); - } - while (stack.length > 0) { - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb; y = yb + stack.shift(); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 27: // hhcurveto - if (stack.length % 2) { - y += stack.shift(); - } - while (stack.length > 0) { - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); y = yb; - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 28: - stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16); - i += 2; - break; - case 29: // callgsubr - n = stack.pop() + font.gsubrsBias; - subrCode = font.gsubrs[n]; - if (subrCode) { - parse(subrCode); - } - break; - case 30: // vhcurveto - while (stack.length > 0) { - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - case 31: // hvcurveto - while (stack.length > 0) { - xa = x + stack.shift(); ya = y; - xb = xa + stack.shift(); yb = ya + stack.shift(); - y = yb + stack.shift(); - x = xb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - if (stack.length === 0) { - break; - } - - xa = x; ya = y + stack.shift(); - xb = xa + stack.shift(); yb = ya + stack.shift(); - x = xb + stack.shift(); - y = yb + (stack.length === 1 ? stack.shift() : 0); - bezierCurveTo(xa, ya, xb, yb, x, y); - } - break; - default: - if (v < 32) { - error('unknown operator: ' + v); - } - if (v < 247) { - stack.push(v - 139); - } else if (v < 251) { - stack.push((v - 247) * 256 + code[i++] + 108); - } else if (v < 255) { - stack.push(-(v - 251) * 256 - code[i++] - 108); - } else { - stack.push(((code[i] << 24) | (code[i + 1] << 16) | - (code[i + 2] << 8) | code[i + 3]) / 65536); - i += 4; - } - break; - } - if (stackClean) { - stack.length = 0; - } - } - } - parse(code); - } - - var noop = ''; - - function CompiledFont(fontMatrix) { - this.compiledGlyphs = {}; - this.fontMatrix = fontMatrix; - } - CompiledFont.prototype = { - getPathJs: function (unicode) { - var gid = lookupCmap(this.cmap, unicode); - var fn = this.compiledGlyphs[gid]; - if (!fn) { - this.compiledGlyphs[gid] = fn = this.compileGlyph(this.glyphs[gid]); - } - return fn; - }, - - compileGlyph: function (code) { - if (!code || code.length === 0 || code[0] === 14) { - return noop; - } - - var cmds = []; - cmds.push({cmd: 'save'}); - cmds.push({cmd: 'transform', args: this.fontMatrix.slice()}); - cmds.push({cmd: 'scale', args: ['size', '-size']}); - - this.compileGlyphImpl(code, cmds); - - cmds.push({cmd: 'restore'}); - - return cmds; - }, - - compileGlyphImpl: function () { - error('Children classes should implement this.'); - }, - - hasBuiltPath: function (unicode) { - var gid = lookupCmap(this.cmap, unicode); - return gid in this.compiledGlyphs; - } - }; - - function TrueTypeCompiled(glyphs, cmap, fontMatrix) { - fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]; - CompiledFont.call(this, fontMatrix); - - this.glyphs = glyphs; - this.cmap = cmap; - - this.compiledGlyphs = []; - } - - Util.inherit(TrueTypeCompiled, CompiledFont, { - compileGlyphImpl: function (code, cmds) { - compileGlyf(code, cmds, this); - } - }); - - function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) { - fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0]; - CompiledFont.call(this, fontMatrix); - this.glyphs = cffInfo.glyphs; - this.gsubrs = cffInfo.gsubrs || []; - this.subrs = cffInfo.subrs || []; - this.cmap = cmap; - this.glyphNameMap = glyphNameMap || GlyphsUnicode; - - this.compiledGlyphs = []; - this.gsubrsBias = (this.gsubrs.length < 1240 ? - 107 : (this.gsubrs.length < 33900 ? 1131 : 32768)); - this.subrsBias = (this.subrs.length < 1240 ? - 107 : (this.subrs.length < 33900 ? 1131 : 32768)); - } - - Util.inherit(Type2Compiled, CompiledFont, { - compileGlyphImpl: function (code, cmds) { - compileCharString(code, cmds, this); - } - }); - - - return { - create: function FontRendererFactory_create(font) { - var data = new Uint8Array(font.data); - var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm; - var numTables = getUshort(data, 4); - for (var i = 0, p = 12; i < numTables; i++, p += 16) { - var tag = bytesToString(data.subarray(p, p + 4)); - var offset = getLong(data, p + 8); - var length = getLong(data, p + 12); - switch (tag) { - case 'cmap': - cmap = parseCmap(data, offset, offset + length); - break; - case 'glyf': - glyf = data.subarray(offset, offset + length); - break; - case 'loca': - loca = data.subarray(offset, offset + length); - break; - case 'head': - unitsPerEm = getUshort(data, offset + 18); - indexToLocFormat = getUshort(data, offset + 50); - break; - case 'CFF ': - cff = parseCff(data, offset, offset + length); - break; - } - } - - if (glyf) { - var fontMatrix = (!unitsPerEm ? font.fontMatrix : - [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]); - return new TrueTypeCompiled( - parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix); - } else { - return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap); - } - } - }; -})(); - - -// TODO refactor to remove cyclic dependency on fonts.js -function _setCoreFonts(coreFonts_) { - coreFonts = coreFonts_; - Encodings = coreFonts_.Encodings; - CFFParser = coreFonts_.CFFParser; -} -exports._setCoreFonts = _setCoreFonts; - -exports.FontRendererFactory = FontRendererFactory; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreParser = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream) { - -var MissingDataException = sharedUtil.MissingDataException; -var StreamType = sharedUtil.StreamType; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isNum = sharedUtil.isNum; -var isString = sharedUtil.isString; -var warn = sharedUtil.warn; -var Cmd = corePrimitives.Cmd; -var Dict = corePrimitives.Dict; -var Name = corePrimitives.Name; -var Ref = corePrimitives.Ref; -var isCmd = corePrimitives.isCmd; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var Ascii85Stream = coreStream.Ascii85Stream; -var AsciiHexStream = coreStream.AsciiHexStream; -var CCITTFaxStream = coreStream.CCITTFaxStream; -var FlateStream = coreStream.FlateStream; -var Jbig2Stream = coreStream.Jbig2Stream; -var JpegStream = coreStream.JpegStream; -var JpxStream = coreStream.JpxStream; -var LZWStream = coreStream.LZWStream; -var NullStream = coreStream.NullStream; -var PredictorStream = coreStream.PredictorStream; -var RunLengthStream = coreStream.RunLengthStream; - -var EOF = {}; - -function isEOF(v) { - return (v === EOF); -} - -var MAX_LENGTH_TO_CACHE = 1000; - -var Parser = (function ParserClosure() { - function Parser(lexer, allowStreams, xref) { - this.lexer = lexer; - this.allowStreams = allowStreams; - this.xref = xref; - this.imageCache = {}; - this.refill(); - } - - Parser.prototype = { - refill: function Parser_refill() { - this.buf1 = this.lexer.getObj(); - this.buf2 = this.lexer.getObj(); - }, - shift: function Parser_shift() { - if (isCmd(this.buf2, 'ID')) { - this.buf1 = this.buf2; - this.buf2 = null; - } else { - this.buf1 = this.buf2; - this.buf2 = this.lexer.getObj(); - } - }, - tryShift: function Parser_tryShift() { - try { - this.shift(); - return true; - } catch (e) { - if (e instanceof MissingDataException) { - throw e; - } - // Upon failure, the caller should reset this.lexer.pos to a known good - // state and call this.shift() twice to reset the buffers. - return false; - } - }, - getObj: function Parser_getObj(cipherTransform) { - var buf1 = this.buf1; - this.shift(); - - if (buf1 instanceof Cmd) { - switch (buf1.cmd) { - case 'BI': // inline image - return this.makeInlineImage(cipherTransform); - case '[': // array - var array = []; - while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) { - array.push(this.getObj(cipherTransform)); - } - if (isEOF(this.buf1)) { - error('End of file inside array'); - } - this.shift(); - return array; - case '<<': // dictionary or stream - var dict = new Dict(this.xref); - while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) { - if (!isName(this.buf1)) { - info('Malformed dictionary: key must be a name object'); - this.shift(); - continue; - } - - var key = this.buf1.name; - this.shift(); - if (isEOF(this.buf1)) { - break; - } - dict.set(key, this.getObj(cipherTransform)); - } - if (isEOF(this.buf1)) { - error('End of file inside dictionary'); - } - - // Stream objects are not allowed inside content streams or - // object streams. - if (isCmd(this.buf2, 'stream')) { - return (this.allowStreams ? - this.makeStream(dict, cipherTransform) : dict); - } - this.shift(); - return dict; - default: // simple object - return buf1; - } - } - - if (isInt(buf1)) { // indirect reference or integer - var num = buf1; - if (isInt(this.buf1) && isCmd(this.buf2, 'R')) { - var ref = new Ref(num, this.buf1); - this.shift(); - this.shift(); - return ref; - } - return num; - } - - if (isString(buf1)) { // string - var str = buf1; - if (cipherTransform) { - str = cipherTransform.decryptString(str); - } - return str; - } - - // simple object - return buf1; - }, - /** - * Find the end of the stream by searching for the /EI\s/. - * @returns {number} The inline stream length. - */ - findDefaultInlineStreamEnd: - function Parser_findDefaultInlineStreamEnd(stream) { - var E = 0x45, I = 0x49, SPACE = 0x20, LF = 0xA, CR = 0xD; - var startPos = stream.pos, state = 0, ch, i, n, followingBytes; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = (ch === E) ? 1 : 0; - } else if (state === 1) { - state = (ch === I) ? 2 : 0; - } else { - assert(state === 2); - if (ch === SPACE || ch === LF || ch === CR) { - // Let's check the next five bytes are ASCII... just be sure. - n = 5; - followingBytes = stream.peekBytes(n); - for (i = 0; i < n; i++) { - ch = followingBytes[i]; - if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) { - // Not a LF, CR, SPACE or any visible ASCII character, i.e. - // it's binary stuff. Resetting the state. - state = 0; - break; - } - } - if (state === 2) { - break; // Finished! - } - } else { - state = 0; - } - } - } - return ((stream.pos - 4) - startPos); - }, - /** - * Find the EOI (end-of-image) marker 0xFFD9 of the stream. - * @returns {number} The inline stream length. - */ - findDCTDecodeInlineStreamEnd: - function Parser_findDCTDecodeInlineStreamEnd(stream) { - var startPos = stream.pos, foundEOI = false, b, markerLength, length; - while ((b = stream.getByte()) !== -1) { - if (b !== 0xFF) { // Not a valid marker. - continue; - } - switch (stream.getByte()) { - case 0x00: // Byte stuffing. - // 0xFF00 appears to be a very common byte sequence in JPEG images. - break; - - case 0xFF: // Fill byte. - // Avoid skipping a valid marker, resetting the stream position. - stream.skip(-1); - break; - - case 0xD9: // EOI - foundEOI = true; - break; - - case 0xC0: // SOF0 - case 0xC1: // SOF1 - case 0xC2: // SOF2 - case 0xC3: // SOF3 - - case 0xC5: // SOF5 - case 0xC6: // SOF6 - case 0xC7: // SOF7 - - case 0xC9: // SOF9 - case 0xCA: // SOF10 - case 0xCB: // SOF11 - - case 0xCD: // SOF13 - case 0xCE: // SOF14 - case 0xCF: // SOF15 - - case 0xC4: // DHT - case 0xCC: // DAC - - case 0xDA: // SOS - case 0xDB: // DQT - case 0xDC: // DNL - case 0xDD: // DRI - case 0xDE: // DHP - case 0xDF: // EXP - - case 0xE0: // APP0 - case 0xE1: // APP1 - case 0xE2: // APP2 - case 0xE3: // APP3 - case 0xE4: // APP4 - case 0xE5: // APP5 - case 0xE6: // APP6 - case 0xE7: // APP7 - case 0xE8: // APP8 - case 0xE9: // APP9 - case 0xEA: // APP10 - case 0xEB: // APP11 - case 0xEC: // APP12 - case 0xED: // APP13 - case 0xEE: // APP14 - case 0xEF: // APP15 - - case 0xFE: // COM - // The marker should be followed by the length of the segment. - markerLength = stream.getUint16(); - if (markerLength > 2) { - // |markerLength| contains the byte length of the marker segment, - // including its own length (2 bytes) and excluding the marker. - stream.skip(markerLength - 2); // Jump to the next marker. - } else { - // The marker length is invalid, resetting the stream position. - stream.skip(-2); - } - break; - } - if (foundEOI) { - break; - } - } - length = stream.pos - startPos; - if (b === -1) { - warn('Inline DCTDecode image stream: ' + - 'EOI marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Find the EOD (end-of-data) marker '~>' (i.e. TILDE + GT) of the stream. - * @returns {number} The inline stream length. - */ - findASCII85DecodeInlineStreamEnd: - function Parser_findASCII85DecodeInlineStreamEnd(stream) { - var TILDE = 0x7E, GT = 0x3E; - var startPos = stream.pos, ch, length; - while ((ch = stream.getByte()) !== -1) { - if (ch === TILDE && stream.peekByte() === GT) { - stream.skip(); - break; - } - } - length = stream.pos - startPos; - if (ch === -1) { - warn('Inline ASCII85Decode image stream: ' + - 'EOD marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Find the EOD (end-of-data) marker '>' (i.e. GT) of the stream. - * @returns {number} The inline stream length. - */ - findASCIIHexDecodeInlineStreamEnd: - function Parser_findASCIIHexDecodeInlineStreamEnd(stream) { - var GT = 0x3E; - var startPos = stream.pos, ch, length; - while ((ch = stream.getByte()) !== -1) { - if (ch === GT) { - break; - } - } - length = stream.pos - startPos; - if (ch === -1) { - warn('Inline ASCIIHexDecode image stream: ' + - 'EOD marker not found, searching for /EI/ instead.'); - stream.skip(-length); // Reset the stream position. - return this.findDefaultInlineStreamEnd(stream); - } - this.inlineStreamSkipEI(stream); - return length; - }, - /** - * Skip over the /EI/ for streams where we search for an EOD marker. - */ - inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) { - var E = 0x45, I = 0x49; - var state = 0, ch; - while ((ch = stream.getByte()) !== -1) { - if (state === 0) { - state = (ch === E) ? 1 : 0; - } else if (state === 1) { - state = (ch === I) ? 2 : 0; - } else if (state === 2) { - break; - } - } - }, - makeInlineImage: function Parser_makeInlineImage(cipherTransform) { - var lexer = this.lexer; - var stream = lexer.stream; - - // Parse dictionary. - var dict = new Dict(this.xref); - while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) { - if (!isName(this.buf1)) { - error('Dictionary key must be a name object'); - } - var key = this.buf1.name; - this.shift(); - if (isEOF(this.buf1)) { - break; - } - dict.set(key, this.getObj(cipherTransform)); - } - - // Extract the name of the first (i.e. the current) image filter. - var filter = dict.get('Filter', 'F'), filterName; - if (isName(filter)) { - filterName = filter.name; - } else if (isArray(filter) && isName(filter[0])) { - filterName = filter[0].name; - } - - // Parse image stream. - var startPos = stream.pos, length, i, ii; - if (filterName === 'DCTDecode' || filterName === 'DCT') { - length = this.findDCTDecodeInlineStreamEnd(stream); - } else if (filterName === 'ASCII85Decide' || filterName === 'A85') { - length = this.findASCII85DecodeInlineStreamEnd(stream); - } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') { - length = this.findASCIIHexDecodeInlineStreamEnd(stream); - } else { - length = this.findDefaultInlineStreamEnd(stream); - } - var imageStream = stream.makeSubStream(startPos, length, dict); - - // Cache all images below the MAX_LENGTH_TO_CACHE threshold by their - // adler32 checksum. - var adler32; - if (length < MAX_LENGTH_TO_CACHE) { - var imageBytes = imageStream.getBytes(); - imageStream.reset(); - - var a = 1; - var b = 0; - for (i = 0, ii = imageBytes.length; i < ii; ++i) { - // No modulo required in the loop if imageBytes.length < 5552. - a += imageBytes[i] & 0xff; - b += a; - } - adler32 = ((b % 65521) << 16) | (a % 65521); - - if (this.imageCache.adler32 === adler32) { - this.buf2 = Cmd.get('EI'); - this.shift(); - - this.imageCache[adler32].reset(); - return this.imageCache[adler32]; - } - } - - if (cipherTransform) { - imageStream = cipherTransform.createStream(imageStream, length); - } - - imageStream = this.filter(imageStream, dict, length); - imageStream.dict = dict; - if (adler32 !== undefined) { - imageStream.cacheKey = 'inline_' + length + '_' + adler32; - this.imageCache[adler32] = imageStream; - } - - this.buf2 = Cmd.get('EI'); - this.shift(); - - return imageStream; - }, - makeStream: function Parser_makeStream(dict, cipherTransform) { - var lexer = this.lexer; - var stream = lexer.stream; - - // get stream start position - lexer.skipToNextLine(); - var pos = stream.pos - 1; - - // get length - var length = dict.get('Length'); - if (!isInt(length)) { - info('Bad ' + length + ' attribute in stream'); - length = 0; - } - - // skip over the stream data - stream.pos = pos + length; - lexer.nextChar(); - - // Shift '>>' and check whether the new object marks the end of the stream - if (this.tryShift() && isCmd(this.buf2, 'endstream')) { - this.shift(); // 'stream' - } else { - // bad stream length, scanning for endstream - stream.pos = pos; - var SCAN_BLOCK_SIZE = 2048; - var ENDSTREAM_SIGNATURE_LENGTH = 9; - var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6D]; - var skipped = 0, found = false, i, j; - while (stream.pos < stream.end) { - var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE); - var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH; - if (scanLength <= 0) { - break; - } - found = false; - i = 0; - while (i < scanLength) { - j = 0; - while (j < ENDSTREAM_SIGNATURE_LENGTH && - scanBytes[i + j] === ENDSTREAM_SIGNATURE[j]) { - j++; - } - if (j >= ENDSTREAM_SIGNATURE_LENGTH) { - found = true; - break; - } - i++; - } - if (found) { - skipped += i; - stream.pos += i; - break; - } - skipped += scanLength; - stream.pos += scanLength; - } - if (!found) { - error('Missing endstream'); - } - length = skipped; - - lexer.nextChar(); - this.shift(); - this.shift(); - } - this.shift(); // 'endstream' - - stream = stream.makeSubStream(pos, length, dict); - if (cipherTransform) { - stream = cipherTransform.createStream(stream, length); - } - stream = this.filter(stream, dict, length); - stream.dict = dict; - return stream; - }, - filter: function Parser_filter(stream, dict, length) { - var filter = dict.get('Filter', 'F'); - var params = dict.get('DecodeParms', 'DP'); - if (isName(filter)) { - return this.makeFilter(stream, filter.name, length, params); - } - - var maybeLength = length; - if (isArray(filter)) { - var filterArray = filter; - var paramsArray = params; - for (var i = 0, ii = filterArray.length; i < ii; ++i) { - filter = filterArray[i]; - if (!isName(filter)) { - error('Bad filter name: ' + filter); - } - - params = null; - if (isArray(paramsArray) && (i in paramsArray)) { - params = paramsArray[i]; - } - stream = this.makeFilter(stream, filter.name, maybeLength, params); - // after the first stream the length variable is invalid - maybeLength = null; - } - } - return stream; - }, - makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) { - if (stream.dict.get('Length') === 0 && !maybeLength) { - warn('Empty "' + name + '" stream.'); - return new NullStream(stream); - } - try { - if (params && this.xref) { - params = this.xref.fetchIfRef(params); - } - var xrefStreamStats = this.xref.stats.streamTypes; - if (name === 'FlateDecode' || name === 'Fl') { - xrefStreamStats[StreamType.FLATE] = true; - if (params) { - return new PredictorStream(new FlateStream(stream, maybeLength), - maybeLength, params); - } - return new FlateStream(stream, maybeLength); - } - if (name === 'LZWDecode' || name === 'LZW') { - xrefStreamStats[StreamType.LZW] = true; - var earlyChange = 1; - if (params) { - if (params.has('EarlyChange')) { - earlyChange = params.get('EarlyChange'); - } - return new PredictorStream( - new LZWStream(stream, maybeLength, earlyChange), - maybeLength, params); - } - return new LZWStream(stream, maybeLength, earlyChange); - } - if (name === 'DCTDecode' || name === 'DCT') { - xrefStreamStats[StreamType.DCT] = true; - return new JpegStream(stream, maybeLength, stream.dict, this.xref); - } - if (name === 'JPXDecode' || name === 'JPX') { - xrefStreamStats[StreamType.JPX] = true; - return new JpxStream(stream, maybeLength, stream.dict); - } - if (name === 'ASCII85Decode' || name === 'A85') { - xrefStreamStats[StreamType.A85] = true; - return new Ascii85Stream(stream, maybeLength); - } - if (name === 'ASCIIHexDecode' || name === 'AHx') { - xrefStreamStats[StreamType.AHX] = true; - return new AsciiHexStream(stream, maybeLength); - } - if (name === 'CCITTFaxDecode' || name === 'CCF') { - xrefStreamStats[StreamType.CCF] = true; - return new CCITTFaxStream(stream, maybeLength, params); - } - if (name === 'RunLengthDecode' || name === 'RL') { - xrefStreamStats[StreamType.RL] = true; - return new RunLengthStream(stream, maybeLength); - } - if (name === 'JBIG2Decode') { - xrefStreamStats[StreamType.JBIG] = true; - return new Jbig2Stream(stream, maybeLength, stream.dict); - } - warn('filter "' + name + '" not supported yet'); - return stream; - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Invalid stream: \"' + ex + '\"'); - return new NullStream(stream); - } - } - }; - - return Parser; -})(); - -var Lexer = (function LexerClosure() { - function Lexer(stream, knownCommands) { - this.stream = stream; - this.nextChar(); - - // While lexing, we build up many strings one char at a time. Using += for - // this can result in lots of garbage strings. It's better to build an - // array of single-char strings and then join() them together at the end. - // And reusing a single array (i.e. |this.strBuf|) over and over for this - // purpose uses less memory than using a new array for each string. - this.strBuf = []; - - // The PDFs might have "glued" commands with other commands, operands or - // literals, e.g. "q1". The knownCommands is a dictionary of the valid - // commands and their prefixes. The prefixes are built the following way: - // if there a command that is a prefix of the other valid command or - // literal (e.g. 'f' and 'false') the following prefixes must be included, - // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no - // other commands or literals as a prefix. The knowCommands is optional. - this.knownCommands = knownCommands; - } - - Lexer.isSpace = function Lexer_isSpace(ch) { - // Space is one of the following characters: SPACE, TAB, CR or LF. - return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A); - }; - - // A '1' in this array means the character is white space. A '1' or - // '2' means the character ends a name or command. - var specialChars = [ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x - 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx - ]; - - function toHexDigit(ch) { - if (ch >= 0x30 && ch <= 0x39) { // '0'-'9' - return ch & 0x0F; - } - if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) { - // 'A'-'F', 'a'-'f' - return (ch & 0x0F) + 9; - } - return -1; - } - - Lexer.prototype = { - nextChar: function Lexer_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - peekChar: function Lexer_peekChar() { - return this.stream.peekByte(); - }, - getNumber: function Lexer_getNumber() { - var ch = this.currentChar; - var eNotation = false; - var divideBy = 0; // different from 0 if it's a floating point value - var sign = 1; - - if (ch === 0x2D) { // '-' - sign = -1; - ch = this.nextChar(); - - if (ch === 0x2D) { // '-' - // Ignore double negative (this is consistent with Adobe Reader). - ch = this.nextChar(); - } - } else if (ch === 0x2B) { // '+' - ch = this.nextChar(); - } - if (ch === 0x2E) { // '.' - divideBy = 10; - ch = this.nextChar(); - } - if (ch < 0x30 || ch > 0x39) { // '0' - '9' - error('Invalid number: ' + String.fromCharCode(ch)); - return 0; - } - - var baseValue = ch - 0x30; // '0' - var powerValue = 0; - var powerValueSign = 1; - - while ((ch = this.nextChar()) >= 0) { - if (0x30 <= ch && ch <= 0x39) { // '0' - '9' - var currentDigit = ch - 0x30; // '0' - if (eNotation) { // We are after an 'e' or 'E' - powerValue = powerValue * 10 + currentDigit; - } else { - if (divideBy !== 0) { // We are after a point - divideBy *= 10; - } - baseValue = baseValue * 10 + currentDigit; - } - } else if (ch === 0x2E) { // '.' - if (divideBy === 0) { - divideBy = 1; - } else { - // A number can have only one '.' - break; - } - } else if (ch === 0x2D) { // '-' - // ignore minus signs in the middle of numbers to match - // Adobe's behavior - warn('Badly formated number'); - } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e' - // 'E' can be either a scientific notation or the beginning of a new - // operator - ch = this.peekChar(); - if (ch === 0x2B || ch === 0x2D) { // '+', '-' - powerValueSign = (ch === 0x2D) ? -1 : 1; - this.nextChar(); // Consume the sign character - } else if (ch < 0x30 || ch > 0x39) { // '0' - '9' - // The 'E' must be the beginning of a new operator - break; - } - eNotation = true; - } else { - // the last character doesn't belong to us - break; - } - } - - if (divideBy !== 0) { - baseValue /= divideBy; - } - if (eNotation) { - baseValue *= Math.pow(10, powerValueSign * powerValue); - } - return sign * baseValue; - }, - getString: function Lexer_getString() { - var numParen = 1; - var done = false; - var strBuf = this.strBuf; - strBuf.length = 0; - - var ch = this.nextChar(); - while (true) { - var charBuffered = false; - switch (ch | 0) { - case -1: - warn('Unterminated string'); - done = true; - break; - case 0x28: // '(' - ++numParen; - strBuf.push('('); - break; - case 0x29: // ')' - if (--numParen === 0) { - this.nextChar(); // consume strings ')' - done = true; - } else { - strBuf.push(')'); - } - break; - case 0x5C: // '\\' - ch = this.nextChar(); - switch (ch) { - case -1: - warn('Unterminated string'); - done = true; - break; - case 0x6E: // 'n' - strBuf.push('\n'); - break; - case 0x72: // 'r' - strBuf.push('\r'); - break; - case 0x74: // 't' - strBuf.push('\t'); - break; - case 0x62: // 'b' - strBuf.push('\b'); - break; - case 0x66: // 'f' - strBuf.push('\f'); - break; - case 0x5C: // '\' - case 0x28: // '(' - case 0x29: // ')' - strBuf.push(String.fromCharCode(ch)); - break; - case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3' - case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7' - var x = ch & 0x0F; - ch = this.nextChar(); - charBuffered = true; - if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' - x = (x << 3) + (ch & 0x0F); - ch = this.nextChar(); - if (ch >= 0x30 && ch <= 0x37) { // '0'-'7' - charBuffered = false; - x = (x << 3) + (ch & 0x0F); - } - } - strBuf.push(String.fromCharCode(x)); - break; - case 0x0D: // CR - if (this.peekChar() === 0x0A) { // LF - this.nextChar(); - } - break; - case 0x0A: // LF - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - break; - default: - strBuf.push(String.fromCharCode(ch)); - break; - } - if (done) { - break; - } - if (!charBuffered) { - ch = this.nextChar(); - } - } - return strBuf.join(''); - }, - getName: function Lexer_getName() { - var ch, previousCh; - var strBuf = this.strBuf; - strBuf.length = 0; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - if (ch === 0x23) { // '#' - ch = this.nextChar(); - if (specialChars[ch]) { - warn('Lexer_getName: ' + - 'NUMBER SIGN (#) should be followed by a hexadecimal number.'); - strBuf.push('#'); - break; - } - var x = toHexDigit(ch); - if (x !== -1) { - previousCh = ch; - ch = this.nextChar(); - var x2 = toHexDigit(ch); - if (x2 === -1) { - warn('Lexer_getName: Illegal digit (' + - String.fromCharCode(ch) +') in hexadecimal number.'); - strBuf.push('#', String.fromCharCode(previousCh)); - if (specialChars[ch]) { - break; - } - strBuf.push(String.fromCharCode(ch)); - continue; - } - strBuf.push(String.fromCharCode((x << 4) | x2)); - } else { - strBuf.push('#', String.fromCharCode(ch)); - } - } else { - strBuf.push(String.fromCharCode(ch)); - } - } - if (strBuf.length > 127) { - warn('name token is longer than allowed by the spec: ' + strBuf.length); - } - return Name.get(strBuf.join('')); - }, - getHexString: function Lexer_getHexString() { - var strBuf = this.strBuf; - strBuf.length = 0; - var ch = this.currentChar; - var isFirstHex = true; - var firstDigit; - var secondDigit; - while (true) { - if (ch < 0) { - warn('Unterminated hex string'); - break; - } else if (ch === 0x3E) { // '>' - this.nextChar(); - break; - } else if (specialChars[ch] === 1) { - ch = this.nextChar(); - continue; - } else { - if (isFirstHex) { - firstDigit = toHexDigit(ch); - if (firstDigit === -1) { - warn('Ignoring invalid character "' + ch + '" in hex string'); - ch = this.nextChar(); - continue; - } - } else { - secondDigit = toHexDigit(ch); - if (secondDigit === -1) { - warn('Ignoring invalid character "' + ch + '" in hex string'); - ch = this.nextChar(); - continue; - } - strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit)); - } - isFirstHex = !isFirstHex; - ch = this.nextChar(); - } - } - return strBuf.join(''); - }, - getObj: function Lexer_getObj() { - // skip whitespace and comments - var comment = false; - var ch = this.currentChar; - while (true) { - if (ch < 0) { - return EOF; - } - if (comment) { - if (ch === 0x0A || ch === 0x0D) { // LF, CR - comment = false; - } - } else if (ch === 0x25) { // '%' - comment = true; - } else if (specialChars[ch] !== 1) { - break; - } - ch = this.nextChar(); - } - - // start reading token - switch (ch | 0) { - case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4' - case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9' - case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.' - return this.getNumber(); - case 0x28: // '(' - return this.getString(); - case 0x2F: // '/' - return this.getName(); - // array punctuation - case 0x5B: // '[' - this.nextChar(); - return Cmd.get('['); - case 0x5D: // ']' - this.nextChar(); - return Cmd.get(']'); - // hex string or dict punctuation - case 0x3C: // '<' - ch = this.nextChar(); - if (ch === 0x3C) { - // dict punctuation - this.nextChar(); - return Cmd.get('<<'); - } - return this.getHexString(); - // dict punctuation - case 0x3E: // '>' - ch = this.nextChar(); - if (ch === 0x3E) { - this.nextChar(); - return Cmd.get('>>'); - } - return Cmd.get('>'); - case 0x7B: // '{' - this.nextChar(); - return Cmd.get('{'); - case 0x7D: // '}' - this.nextChar(); - return Cmd.get('}'); - case 0x29: // ')' - error('Illegal character: ' + ch); - break; - } - - // command - var str = String.fromCharCode(ch); - var knownCommands = this.knownCommands; - var knownCommandFound = knownCommands && knownCommands[str] !== undefined; - while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) { - // stop if known command is found and next character does not make - // the str a command - var possibleCommand = str + String.fromCharCode(ch); - if (knownCommandFound && knownCommands[possibleCommand] === undefined) { - break; - } - if (str.length === 128) { - error('Command token too long: ' + str.length); - } - str = possibleCommand; - knownCommandFound = knownCommands && knownCommands[str] !== undefined; - } - if (str === 'true') { - return true; - } - if (str === 'false') { - return false; - } - if (str === 'null') { - return null; - } - return Cmd.get(str); - }, - skipToNextLine: function Lexer_skipToNextLine() { - var ch = this.currentChar; - while (ch >= 0) { - if (ch === 0x0D) { // CR - ch = this.nextChar(); - if (ch === 0x0A) { // LF - this.nextChar(); - } - break; - } else if (ch === 0x0A) { // LF - this.nextChar(); - break; - } - ch = this.nextChar(); - } - } - }; - - return Lexer; -})(); - -var Linearization = { - create: function LinearizationCreate(stream) { - function getInt(name, allowZeroValue) { - var obj = linDict.get(name); - if (isInt(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) { - return obj; - } - throw new Error('The "' + name + '" parameter in the linearization ' + - 'dictionary is invalid.'); - } - function getHints() { - var hints = linDict.get('H'), hintsLength, item; - if (isArray(hints) && - ((hintsLength = hints.length) === 2 || hintsLength === 4)) { - for (var index = 0; index < hintsLength; index++) { - if (!(isInt(item = hints[index]) && item > 0)) { - throw new Error('Hint (' + index + - ') in the linearization dictionary is invalid.'); - } - } - return hints; - } - throw new Error('Hint array in the linearization dictionary is invalid.'); - } - var parser = new Parser(new Lexer(stream), false, null); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - var linDict = parser.getObj(); - var obj, length; - if (!(isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && isDict(linDict) && - isNum(obj = linDict.get('Linearized')) && obj > 0)) { - return null; // No valid linearization dictionary found. - } else if ((length = getInt('L')) !== stream.length) { - throw new Error('The "L" parameter in the linearization dictionary ' + - 'does not equal the stream length.'); - } - return { - length: length, - hints: getHints(), - objectNumberFirst: getInt('O'), - endFirst: getInt('E'), - numPages: getInt('N'), - mainXRefEntriesOffset: getInt('T'), - pageFirst: (linDict.has('P') ? getInt('P', true) : 0) - }; - } -}; - -exports.EOF = EOF; -exports.Lexer = Lexer; -exports.Linearization = Linearization; -exports.Parser = Parser; -exports.isEOF = isEOF; - -// TODO refactor to remove dependency on stream.js -coreStream._setCoreParser(exports); -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreCMap = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser) { - -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var isInt = sharedUtil.isInt; -var isString = sharedUtil.isString; -var warn = sharedUtil.warn; -var isName = corePrimitives.isName; -var isCmd = corePrimitives.isCmd; -var isStream = corePrimitives.isStream; -var StringStream = coreStream.StringStream; -var Lexer = coreParser.Lexer; -var isEOF = coreParser.isEOF; - -var BUILT_IN_CMAPS = [ -// << Start unicode maps. -'Adobe-GB1-UCS2', -'Adobe-CNS1-UCS2', -'Adobe-Japan1-UCS2', -'Adobe-Korea1-UCS2', -// >> End unicode maps. -'78-EUC-H', -'78-EUC-V', -'78-H', -'78-RKSJ-H', -'78-RKSJ-V', -'78-V', -'78ms-RKSJ-H', -'78ms-RKSJ-V', -'83pv-RKSJ-H', -'90ms-RKSJ-H', -'90ms-RKSJ-V', -'90msp-RKSJ-H', -'90msp-RKSJ-V', -'90pv-RKSJ-H', -'90pv-RKSJ-V', -'Add-H', -'Add-RKSJ-H', -'Add-RKSJ-V', -'Add-V', -'Adobe-CNS1-0', -'Adobe-CNS1-1', -'Adobe-CNS1-2', -'Adobe-CNS1-3', -'Adobe-CNS1-4', -'Adobe-CNS1-5', -'Adobe-CNS1-6', -'Adobe-GB1-0', -'Adobe-GB1-1', -'Adobe-GB1-2', -'Adobe-GB1-3', -'Adobe-GB1-4', -'Adobe-GB1-5', -'Adobe-Japan1-0', -'Adobe-Japan1-1', -'Adobe-Japan1-2', -'Adobe-Japan1-3', -'Adobe-Japan1-4', -'Adobe-Japan1-5', -'Adobe-Japan1-6', -'Adobe-Korea1-0', -'Adobe-Korea1-1', -'Adobe-Korea1-2', -'B5-H', -'B5-V', -'B5pc-H', -'B5pc-V', -'CNS-EUC-H', -'CNS-EUC-V', -'CNS1-H', -'CNS1-V', -'CNS2-H', -'CNS2-V', -'ETHK-B5-H', -'ETHK-B5-V', -'ETen-B5-H', -'ETen-B5-V', -'ETenms-B5-H', -'ETenms-B5-V', -'EUC-H', -'EUC-V', -'Ext-H', -'Ext-RKSJ-H', -'Ext-RKSJ-V', -'Ext-V', -'GB-EUC-H', -'GB-EUC-V', -'GB-H', -'GB-V', -'GBK-EUC-H', -'GBK-EUC-V', -'GBK2K-H', -'GBK2K-V', -'GBKp-EUC-H', -'GBKp-EUC-V', -'GBT-EUC-H', -'GBT-EUC-V', -'GBT-H', -'GBT-V', -'GBTpc-EUC-H', -'GBTpc-EUC-V', -'GBpc-EUC-H', -'GBpc-EUC-V', -'H', -'HKdla-B5-H', -'HKdla-B5-V', -'HKdlb-B5-H', -'HKdlb-B5-V', -'HKgccs-B5-H', -'HKgccs-B5-V', -'HKm314-B5-H', -'HKm314-B5-V', -'HKm471-B5-H', -'HKm471-B5-V', -'HKscs-B5-H', -'HKscs-B5-V', -'Hankaku', -'Hiragana', -'KSC-EUC-H', -'KSC-EUC-V', -'KSC-H', -'KSC-Johab-H', -'KSC-Johab-V', -'KSC-V', -'KSCms-UHC-H', -'KSCms-UHC-HW-H', -'KSCms-UHC-HW-V', -'KSCms-UHC-V', -'KSCpc-EUC-H', -'KSCpc-EUC-V', -'Katakana', -'NWP-H', -'NWP-V', -'RKSJ-H', -'RKSJ-V', -'Roman', -'UniCNS-UCS2-H', -'UniCNS-UCS2-V', -'UniCNS-UTF16-H', -'UniCNS-UTF16-V', -'UniCNS-UTF32-H', -'UniCNS-UTF32-V', -'UniCNS-UTF8-H', -'UniCNS-UTF8-V', -'UniGB-UCS2-H', -'UniGB-UCS2-V', -'UniGB-UTF16-H', -'UniGB-UTF16-V', -'UniGB-UTF32-H', -'UniGB-UTF32-V', -'UniGB-UTF8-H', -'UniGB-UTF8-V', -'UniJIS-UCS2-H', -'UniJIS-UCS2-HW-H', -'UniJIS-UCS2-HW-V', -'UniJIS-UCS2-V', -'UniJIS-UTF16-H', -'UniJIS-UTF16-V', -'UniJIS-UTF32-H', -'UniJIS-UTF32-V', -'UniJIS-UTF8-H', -'UniJIS-UTF8-V', -'UniJIS2004-UTF16-H', -'UniJIS2004-UTF16-V', -'UniJIS2004-UTF32-H', -'UniJIS2004-UTF32-V', -'UniJIS2004-UTF8-H', -'UniJIS2004-UTF8-V', -'UniJISPro-UCS2-HW-V', -'UniJISPro-UCS2-V', -'UniJISPro-UTF8-V', -'UniJISX0213-UTF32-H', -'UniJISX0213-UTF32-V', -'UniJISX02132004-UTF32-H', -'UniJISX02132004-UTF32-V', -'UniKS-UCS2-H', -'UniKS-UCS2-V', -'UniKS-UTF16-H', -'UniKS-UTF16-V', -'UniKS-UTF32-H', -'UniKS-UTF32-V', -'UniKS-UTF8-H', -'UniKS-UTF8-V', -'V', -'WP-Symbol']; - -// CMap, not to be confused with TrueType's cmap. -var CMap = (function CMapClosure() { - function CMap(builtInCMap) { - // Codespace ranges are stored as follows: - // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]] - // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...] - this.codespaceRanges = [[], [], [], []]; - this.numCodespaceRanges = 0; - // Map entries have one of two forms. - // - cid chars are 16-bit unsigned integers, stored as integers. - // - bf chars are variable-length byte sequences, stored as strings, with - // one byte per character. - this._map = []; - this.name = ''; - this.vertical = false; - this.useCMap = null; - this.builtInCMap = builtInCMap; - } - CMap.prototype = { - addCodespaceRange: function(n, low, high) { - this.codespaceRanges[n - 1].push(low, high); - this.numCodespaceRanges++; - }, - - mapCidRange: function(low, high, dstLow) { - while (low <= high) { - this._map[low++] = dstLow++; - } - }, - - mapBfRange: function(low, high, dstLow) { - var lastByte = dstLow.length - 1; - while (low <= high) { - this._map[low++] = dstLow; - // Only the last byte has to be incremented. - dstLow = dstLow.substr(0, lastByte) + - String.fromCharCode(dstLow.charCodeAt(lastByte) + 1); - } - }, - - mapBfRangeToArray: function(low, high, array) { - var i = 0, ii = array.length; - while (low <= high && i < ii) { - this._map[low] = array[i++]; - ++low; - } - }, - - // This is used for both bf and cid chars. - mapOne: function(src, dst) { - this._map[src] = dst; - }, - - lookup: function(code) { - return this._map[code]; - }, - - contains: function(code) { - return this._map[code] !== undefined; - }, - - forEach: function(callback) { - // Most maps have fewer than 65536 entries, and for those we use normal - // array iteration. But really sparse tables are possible -- e.g. with - // indices in the *billions*. For such tables we use for..in, which isn't - // ideal because it stringifies the indices for all present elements, but - // it does avoid iterating over every undefined entry. - var map = this._map; - var length = map.length; - var i; - if (length <= 0x10000) { - for (i = 0; i < length; i++) { - if (map[i] !== undefined) { - callback(i, map[i]); - } - } - } else { - for (i in this._map) { - callback(i, map[i]); - } - } - }, - - charCodeOf: function(value) { - return this._map.indexOf(value); - }, - - getMap: function() { - return this._map; - }, - - readCharCode: function(str, offset, out) { - var c = 0; - var codespaceRanges = this.codespaceRanges; - var codespaceRangesLen = this.codespaceRanges.length; - // 9.7.6.2 CMap Mapping - // The code length is at most 4. - for (var n = 0; n < codespaceRangesLen; n++) { - c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0; - // Check each codespace range to see if it falls within. - var codespaceRange = codespaceRanges[n]; - for (var k = 0, kk = codespaceRange.length; k < kk;) { - var low = codespaceRange[k++]; - var high = codespaceRange[k++]; - if (c >= low && c <= high) { - out.charcode = c; - out.length = n + 1; - return; - } - } - } - out.charcode = 0; - out.length = 1; - }, - - get length() { - return this._map.length; - }, - - get isIdentityCMap() { - if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) { - return false; - } - if (this._map.length !== 0x10000) { - return false; - } - for (var i = 0; i < 0x10000; i++) { - if (this._map[i] !== i) { - return false; - } - } - return true; - } - }; - return CMap; -})(); - -// A special case of CMap, where the _map array implicitly has a length of -// 65536 and each element is equal to its index. -var IdentityCMap = (function IdentityCMapClosure() { - function IdentityCMap(vertical, n) { - CMap.call(this); - this.vertical = vertical; - this.addCodespaceRange(n, 0, 0xffff); - } - Util.inherit(IdentityCMap, CMap, {}); - - IdentityCMap.prototype = { - addCodespaceRange: CMap.prototype.addCodespaceRange, - - mapCidRange: function(low, high, dstLow) { - error('should not call mapCidRange'); - }, - - mapBfRange: function(low, high, dstLow) { - error('should not call mapBfRange'); - }, - - mapBfRangeToArray: function(low, high, array) { - error('should not call mapBfRangeToArray'); - }, - - mapOne: function(src, dst) { - error('should not call mapCidOne'); - }, - - lookup: function(code) { - return (isInt(code) && code <= 0xffff) ? code : undefined; - }, - - contains: function(code) { - return isInt(code) && code <= 0xffff; - }, - - forEach: function(callback) { - for (var i = 0; i <= 0xffff; i++) { - callback(i, i); - } - }, - - charCodeOf: function(value) { - return (isInt(value) && value <= 0xffff) ? value : -1; - }, - - getMap: function() { - // Sometimes identity maps must be instantiated, but it's rare. - var map = new Array(0x10000); - for (var i = 0; i <= 0xffff; i++) { - map[i] = i; - } - return map; - }, - - readCharCode: CMap.prototype.readCharCode, - - get length() { - return 0x10000; - }, - - get isIdentityCMap() { - error('should not access .isIdentityCMap'); - } - }; - - return IdentityCMap; -})(); - -var BinaryCMapReader = (function BinaryCMapReaderClosure() { - function fetchBinaryData(url) { - var nonBinaryRequest = PDFJS.disableWorker; - var request = new XMLHttpRequest(); - request.open('GET', url, false); - if (!nonBinaryRequest) { - try { - request.responseType = 'arraybuffer'; - nonBinaryRequest = request.responseType !== 'arraybuffer'; - } catch (e) { - nonBinaryRequest = true; - } - } - if (nonBinaryRequest && request.overrideMimeType) { - request.overrideMimeType('text/plain; charset=x-user-defined'); - } - request.send(null); - if (nonBinaryRequest ? !request.responseText : !request.response) { - error('Unable to get binary cMap at: ' + url); - } - if (nonBinaryRequest) { - var data = Array.prototype.map.call(request.responseText, function (ch) { - return ch.charCodeAt(0) & 255; - }); - return new Uint8Array(data); - } - return new Uint8Array(request.response); - } - - function hexToInt(a, size) { - var n = 0; - for (var i = 0; i <= size; i++) { - n = (n << 8) | a[i]; - } - return n >>> 0; - } - - function hexToStr(a, size) { - // This code is hot. Special-case some common values to avoid creating an - // object with subarray(). - if (size === 1) { - return String.fromCharCode(a[0], a[1]); - } - if (size === 3) { - return String.fromCharCode(a[0], a[1], a[2], a[3]); - } - return String.fromCharCode.apply(null, a.subarray(0, size + 1)); - } - - function addHex(a, b, size) { - var c = 0; - for (var i = size; i >= 0; i--) { - c += a[i] + b[i]; - a[i] = c & 255; - c >>= 8; - } - } - - function incHex(a, size) { - var c = 1; - for (var i = size; i >= 0 && c > 0; i--) { - c += a[i]; - a[i] = c & 255; - c >>= 8; - } - } - - var MAX_NUM_SIZE = 16; - var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8) - - function BinaryCMapStream(data) { - this.buffer = data; - this.pos = 0; - this.end = data.length; - this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE); - } - - BinaryCMapStream.prototype = { - readByte: function () { - if (this.pos >= this.end) { - return -1; - } - return this.buffer[this.pos++]; - }, - readNumber: function () { - var n = 0; - var last; - do { - var b = this.readByte(); - if (b < 0) { - error('unexpected EOF in bcmap'); - } - last = !(b & 0x80); - n = (n << 7) | (b & 0x7F); - } while (!last); - return n; - }, - readSigned: function () { - var n = this.readNumber(); - return (n & 1) ? ~(n >>> 1) : n >>> 1; - }, - readHex: function (num, size) { - num.set(this.buffer.subarray(this.pos, - this.pos + size + 1)); - this.pos += size + 1; - }, - readHexNumber: function (num, size) { - var last; - var stack = this.tmpBuf, sp = 0; - do { - var b = this.readByte(); - if (b < 0) { - error('unexpected EOF in bcmap'); - } - last = !(b & 0x80); - stack[sp++] = b & 0x7F; - } while (!last); - var i = size, buffer = 0, bufferSize = 0; - while (i >= 0) { - while (bufferSize < 8 && stack.length > 0) { - buffer = (stack[--sp] << bufferSize) | buffer; - bufferSize += 7; - } - num[i] = buffer & 255; - i--; - buffer >>= 8; - bufferSize -= 8; - } - }, - readHexSigned: function (num, size) { - this.readHexNumber(num, size); - var sign = num[size] & 1 ? 255 : 0; - var c = 0; - for (var i = 0; i <= size; i++) { - c = ((c & 1) << 8) | num[i]; - num[i] = (c >> 1) ^ sign; - } - }, - readString: function () { - var len = this.readNumber(); - var s = ''; - for (var i = 0; i < len; i++) { - s += String.fromCharCode(this.readNumber()); - } - return s; - } - }; - - function processBinaryCMap(url, cMap, extend) { - var data = fetchBinaryData(url); - var stream = new BinaryCMapStream(data); - - var header = stream.readByte(); - cMap.vertical = !!(header & 1); - - var useCMap = null; - var start = new Uint8Array(MAX_NUM_SIZE); - var end = new Uint8Array(MAX_NUM_SIZE); - var char = new Uint8Array(MAX_NUM_SIZE); - var charCode = new Uint8Array(MAX_NUM_SIZE); - var tmp = new Uint8Array(MAX_NUM_SIZE); - var code; - - var b; - while ((b = stream.readByte()) >= 0) { - var type = b >> 5; - if (type === 7) { // metadata, e.g. comment or usecmap - switch (b & 0x1F) { - case 0: - stream.readString(); // skipping comment - break; - case 1: - useCMap = stream.readString(); - break; - } - continue; - } - var sequence = !!(b & 0x10); - var dataSize = b & 15; - - assert(dataSize + 1 <= MAX_NUM_SIZE); - - var ucs2DataSize = 1; - var subitemsCount = stream.readNumber(); - var i; - switch (type) { - case 0: // codespacerange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), - hexToInt(end, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), - hexToInt(end, dataSize)); - } - break; - case 1: // notdefrange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - // undefined range, skipping - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - // nop - } - break; - case 2: // cidchar - stream.readHex(char, dataSize); - code = stream.readNumber(); - cMap.mapOne(hexToInt(char, dataSize), code); - for (i = 1; i < subitemsCount; i++) { - incHex(char, dataSize); - if (!sequence) { - stream.readHexNumber(tmp, dataSize); - addHex(char, tmp, dataSize); - } - code = stream.readSigned() + (code + 1); - cMap.mapOne(hexToInt(char, dataSize), code); - } - break; - case 3: // cidrange - stream.readHex(start, dataSize); - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), - code); - for (i = 1; i < subitemsCount; i++) { - incHex(end, dataSize); - if (!sequence) { - stream.readHexNumber(start, dataSize); - addHex(start, end, dataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, dataSize); - addHex(end, start, dataSize); - code = stream.readNumber(); - cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), - code); - } - break; - case 4: // bfchar - stream.readHex(char, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), - hexToStr(charCode, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(char, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(tmp, ucs2DataSize); - addHex(char, tmp, ucs2DataSize); - } - incHex(charCode, dataSize); - stream.readHexSigned(tmp, dataSize); - addHex(charCode, tmp, dataSize); - cMap.mapOne(hexToInt(char, ucs2DataSize), - hexToStr(charCode, dataSize)); - } - break; - case 5: // bfrange - stream.readHex(start, ucs2DataSize); - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), - hexToInt(end, ucs2DataSize), - hexToStr(charCode, dataSize)); - for (i = 1; i < subitemsCount; i++) { - incHex(end, ucs2DataSize); - if (!sequence) { - stream.readHexNumber(start, ucs2DataSize); - addHex(start, end, ucs2DataSize); - } else { - start.set(end); - } - stream.readHexNumber(end, ucs2DataSize); - addHex(end, start, ucs2DataSize); - stream.readHex(charCode, dataSize); - cMap.mapBfRange(hexToInt(start, ucs2DataSize), - hexToInt(end, ucs2DataSize), - hexToStr(charCode, dataSize)); - } - break; - default: - error('Unknown type: ' + type); - break; - } - } - - if (useCMap) { - extend(useCMap); - } - return cMap; - } - - function BinaryCMapReader() {} - - BinaryCMapReader.prototype = { - read: processBinaryCMap - }; - - return BinaryCMapReader; -})(); - -var CMapFactory = (function CMapFactoryClosure() { - function strToInt(str) { - var a = 0; - for (var i = 0; i < str.length; i++) { - a = (a << 8) | str.charCodeAt(i); - } - return a >>> 0; - } - - function expectString(obj) { - if (!isString(obj)) { - error('Malformed CMap: expected string.'); - } - } - - function expectInt(obj) { - if (!isInt(obj)) { - error('Malformed CMap: expected int.'); - } - } - - function parseBfChar(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endbfchar')) { - return; - } - expectString(obj); - var src = strToInt(obj); - obj = lexer.getObj(); - // TODO are /dstName used? - expectString(obj); - var dst = obj; - cMap.mapOne(src, dst); - } - } - - function parseBfRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endbfrange')) { - return; - } - expectString(obj); - var low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - var high = strToInt(obj); - obj = lexer.getObj(); - if (isInt(obj) || isString(obj)) { - var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj; - cMap.mapBfRange(low, high, dstLow); - } else if (isCmd(obj, '[')) { - obj = lexer.getObj(); - var array = []; - while (!isCmd(obj, ']') && !isEOF(obj)) { - array.push(obj); - obj = lexer.getObj(); - } - cMap.mapBfRangeToArray(low, high, array); - } else { - break; - } - } - error('Invalid bf range.'); - } - - function parseCidChar(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcidchar')) { - return; - } - expectString(obj); - var src = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - var dst = obj; - cMap.mapOne(src, dst); - } - } - - function parseCidRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcidrange')) { - return; - } - expectString(obj); - var low = strToInt(obj); - obj = lexer.getObj(); - expectString(obj); - var high = strToInt(obj); - obj = lexer.getObj(); - expectInt(obj); - var dstLow = obj; - cMap.mapCidRange(low, high, dstLow); - } - } - - function parseCodespaceRange(cMap, lexer) { - while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } - if (isCmd(obj, 'endcodespacerange')) { - return; - } - if (!isString(obj)) { - break; - } - var low = strToInt(obj); - obj = lexer.getObj(); - if (!isString(obj)) { - break; - } - var high = strToInt(obj); - cMap.addCodespaceRange(obj.length, low, high); - } - error('Invalid codespace range.'); - } - - function parseWMode(cMap, lexer) { - var obj = lexer.getObj(); - if (isInt(obj)) { - cMap.vertical = !!obj; - } - } - - function parseCMapName(cMap, lexer) { - var obj = lexer.getObj(); - if (isName(obj) && isString(obj.name)) { - cMap.name = obj.name; - } - } - - function parseCMap(cMap, lexer, builtInCMapParams, useCMap) { - var previous; - var embededUseCMap; - objLoop: while (true) { - var obj = lexer.getObj(); - if (isEOF(obj)) { - break; - } else if (isName(obj)) { - if (obj.name === 'WMode') { - parseWMode(cMap, lexer); - } else if (obj.name === 'CMapName') { - parseCMapName(cMap, lexer); - } - previous = obj; - } else if (isCmd(obj)) { - switch (obj.cmd) { - case 'endcmap': - break objLoop; - case 'usecmap': - if (isName(previous)) { - embededUseCMap = previous.name; - } - break; - case 'begincodespacerange': - parseCodespaceRange(cMap, lexer); - break; - case 'beginbfchar': - parseBfChar(cMap, lexer); - break; - case 'begincidchar': - parseCidChar(cMap, lexer); - break; - case 'beginbfrange': - parseBfRange(cMap, lexer); - break; - case 'begincidrange': - parseCidRange(cMap, lexer); - break; - } - } - } - - if (!useCMap && embededUseCMap) { - // Load the usecmap definition from the file only if there wasn't one - // specified. - useCMap = embededUseCMap; - } - if (useCMap) { - extendCMap(cMap, builtInCMapParams, useCMap); - } - } - - function extendCMap(cMap, builtInCMapParams, useCMap) { - cMap.useCMap = createBuiltInCMap(useCMap, builtInCMapParams); - // If there aren't any code space ranges defined clone all the parent ones - // into this cMap. - if (cMap.numCodespaceRanges === 0) { - var useCodespaceRanges = cMap.useCMap.codespaceRanges; - for (var i = 0; i < useCodespaceRanges.length; i++) { - cMap.codespaceRanges[i] = useCodespaceRanges[i].slice(); - } - cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges; - } - // Merge the map into the current one, making sure not to override - // any previously defined entries. - cMap.useCMap.forEach(function(key, value) { - if (!cMap.contains(key)) { - cMap.mapOne(key, cMap.useCMap.lookup(key)); - } - }); - } - - function parseBinaryCMap(name, builtInCMapParams) { - var url = builtInCMapParams.url + name + '.bcmap'; - var cMap = new CMap(true); - new BinaryCMapReader().read(url, cMap, function (useCMap) { - extendCMap(cMap, builtInCMapParams, useCMap); - }); - return cMap; - } - - function createBuiltInCMap(name, builtInCMapParams) { - if (name === 'Identity-H') { - return new IdentityCMap(false, 2); - } else if (name === 'Identity-V') { - return new IdentityCMap(true, 2); - } - if (BUILT_IN_CMAPS.indexOf(name) === -1) { - error('Unknown cMap name: ' + name); - } - assert(builtInCMapParams, 'built-in cMap parameters are not provided'); - - if (builtInCMapParams.packed) { - return parseBinaryCMap(name, builtInCMapParams); - } - - var request = new XMLHttpRequest(); - var url = builtInCMapParams.url + name; - request.open('GET', url, false); - request.send(null); - if (!request.responseText) { - error('Unable to get cMap at: ' + url); - } - var cMap = new CMap(true); - var lexer = new Lexer(new StringStream(request.responseText)); - parseCMap(cMap, lexer, builtInCMapParams, null); - return cMap; - } - - return { - create: function (encoding, builtInCMapParams, useCMap) { - if (isName(encoding)) { - return createBuiltInCMap(encoding.name, builtInCMapParams); - } else if (isStream(encoding)) { - var cMap = new CMap(); - var lexer = new Lexer(encoding); - try { - parseCMap(cMap, lexer, builtInCMapParams, useCMap); - } catch (e) { - warn('Invalid CMap data. ' + e); - } - if (cMap.isIdentityCMap) { - return createBuiltInCMap(cMap.name, builtInCMapParams); - } - return cMap; - } - error('Encoding required.'); - } - }; -})(); - -exports.CMap = CMap; -exports.CMapFactory = CMapFactory; -exports.IdentityCMap = IdentityCMap; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreObj = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreCrypto, root.pdfjsCoreParser, - root.pdfjsCoreChunkedStream); - } -}(this, function (exports, sharedUtil, corePrimitives, coreCrypto, coreParser, - coreChunkedStream) { - -var InvalidPDFException = sharedUtil.InvalidPDFException; -var MissingDataException = sharedUtil.MissingDataException; -var XRefParseException = sharedUtil.XRefParseException; -var assert = sharedUtil.assert; -var bytesToString = sharedUtil.bytesToString; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isString = sharedUtil.isString; -var shadow = sharedUtil.shadow; -var stringToPDFString = sharedUtil.stringToPDFString; -var stringToUTF8String = sharedUtil.stringToUTF8String; -var warn = sharedUtil.warn; -var isValidUrl = sharedUtil.isValidUrl; -var Util = sharedUtil.Util; -var Ref = corePrimitives.Ref; -var RefSet = corePrimitives.RefSet; -var RefSetCache = corePrimitives.RefSetCache; -var isName = corePrimitives.isName; -var isCmd = corePrimitives.isCmd; -var isDict = corePrimitives.isDict; -var isRef = corePrimitives.isRef; -var isStream = corePrimitives.isStream; -var CipherTransformFactory = coreCrypto.CipherTransformFactory; -var Lexer = coreParser.Lexer; -var Parser = coreParser.Parser; -var ChunkedStream = coreChunkedStream.ChunkedStream; - -var Catalog = (function CatalogClosure() { - function Catalog(pdfManager, xref, pageFactory) { - this.pdfManager = pdfManager; - this.xref = xref; - this.catDict = xref.getCatalogObj(); - this.fontCache = new RefSetCache(); - assert(isDict(this.catDict), - 'catalog object is not a dictionary'); - - // TODO refactor to move getPage() to the PDFDocument. - this.pageFactory = pageFactory; - this.pagePromises = []; - } - - Catalog.prototype = { - get metadata() { - var streamRef = this.catDict.getRaw('Metadata'); - if (!isRef(streamRef)) { - return shadow(this, 'metadata', null); - } - - var encryptMetadata = (!this.xref.encrypt ? false : - this.xref.encrypt.encryptMetadata); - - var stream = this.xref.fetch(streamRef, !encryptMetadata); - var metadata; - if (stream && isDict(stream.dict)) { - var type = stream.dict.get('Type'); - var subtype = stream.dict.get('Subtype'); - - if (isName(type) && isName(subtype) && - type.name === 'Metadata' && subtype.name === 'XML') { - // XXX: This should examine the charset the XML document defines, - // however since there are currently no real means to decode - // arbitrary charsets, let's just hope that the author of the PDF - // was reasonable enough to stick with the XML default charset, - // which is UTF-8. - try { - metadata = stringToUTF8String(bytesToString(stream.getBytes())); - } catch (e) { - info('Skipping invalid metadata.'); - } - } - } - - return shadow(this, 'metadata', metadata); - }, - get toplevelPagesDict() { - var pagesObj = this.catDict.get('Pages'); - assert(isDict(pagesObj), 'invalid top-level pages dictionary'); - // shadow the prototype getter - return shadow(this, 'toplevelPagesDict', pagesObj); - }, - get documentOutline() { - var obj = null; - try { - obj = this.readDocumentOutline(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Unable to read document outline'); - } - return shadow(this, 'documentOutline', obj); - }, - readDocumentOutline: function Catalog_readDocumentOutline() { - var xref = this.xref; - var obj = this.catDict.get('Outlines'); - var root = { items: [] }; - if (isDict(obj)) { - obj = obj.getRaw('First'); - var processed = new RefSet(); - if (isRef(obj)) { - var queue = [{obj: obj, parent: root}]; - // to avoid recursion keeping track of the items - // in the processed dictionary - processed.put(obj); - while (queue.length > 0) { - var i = queue.shift(); - var outlineDict = xref.fetchIfRef(i.obj); - if (outlineDict === null) { - continue; - } - if (!outlineDict.has('Title')) { - error('Invalid outline item'); - } - var actionDict = outlineDict.get('A'), dest = null, url = null; - if (actionDict) { - var destEntry = actionDict.get('D'); - if (destEntry) { - dest = destEntry; - } else { - var uriEntry = actionDict.get('URI'); - if (isString(uriEntry) && isValidUrl(uriEntry, false)) { - url = uriEntry; - } - } - } else if (outlineDict.has('Dest')) { - dest = outlineDict.getRaw('Dest'); - if (isName(dest)) { - dest = dest.name; - } - } - var title = outlineDict.get('Title'); - var outlineItem = { - dest: dest, - url: url, - title: stringToPDFString(title), - color: outlineDict.get('C') || [0, 0, 0], - count: outlineDict.get('Count'), - bold: !!(outlineDict.get('F') & 2), - italic: !!(outlineDict.get('F') & 1), - items: [] - }; - i.parent.items.push(outlineItem); - obj = outlineDict.getRaw('First'); - if (isRef(obj) && !processed.has(obj)) { - queue.push({obj: obj, parent: outlineItem}); - processed.put(obj); - } - obj = outlineDict.getRaw('Next'); - if (isRef(obj) && !processed.has(obj)) { - queue.push({obj: obj, parent: i.parent}); - processed.put(obj); - } - } - } - } - return (root.items.length > 0 ? root.items : null); - }, - get numPages() { - var obj = this.toplevelPagesDict.get('Count'); - assert( - isInt(obj), - 'page count in top level pages object is not an integer' - ); - // shadow the prototype getter - return shadow(this, 'num', obj); - }, - get destinations() { - function fetchDestination(dest) { - return isDict(dest) ? dest.get('D') : dest; - } - - var xref = this.xref; - var dests = {}, nameTreeRef, nameDictionaryRef; - var obj = this.catDict.get('Names'); - if (obj && obj.has('Dests')) { - nameTreeRef = obj.getRaw('Dests'); - } else if (this.catDict.has('Dests')) { - nameDictionaryRef = this.catDict.get('Dests'); - } - - if (nameDictionaryRef) { - // reading simple destination dictionary - obj = nameDictionaryRef; - obj.forEach(function catalogForEach(key, value) { - if (!value) { - return; - } - dests[key] = fetchDestination(value); - }); - } - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - var names = nameTree.getAll(); - for (var name in names) { - if (!names.hasOwnProperty(name)) { - continue; - } - dests[name] = fetchDestination(names[name]); - } - } - return shadow(this, 'destinations', dests); - }, - getDestination: function Catalog_getDestination(destinationId) { - function fetchDestination(dest) { - return isDict(dest) ? dest.get('D') : dest; - } - - var xref = this.xref; - var dest = null, nameTreeRef, nameDictionaryRef; - var obj = this.catDict.get('Names'); - if (obj && obj.has('Dests')) { - nameTreeRef = obj.getRaw('Dests'); - } else if (this.catDict.has('Dests')) { - nameDictionaryRef = this.catDict.get('Dests'); - } - - if (nameDictionaryRef) { // Simple destination dictionary. - var value = nameDictionaryRef.get(destinationId); - if (value) { - dest = fetchDestination(value); - } - } - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - dest = fetchDestination(nameTree.get(destinationId)); - } - return dest; - }, - - get pageLabels() { - var obj = null; - try { - obj = this.readPageLabels(); - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - warn('Unable to read page labels.'); - } - return shadow(this, 'pageLabels', obj); - }, - readPageLabels: function Catalog_readPageLabels() { - var obj = this.catDict.getRaw('PageLabels'); - if (!obj) { - return null; - } - var pageLabels = new Array(this.numPages); - var style = null; - var prefix = ''; - var start = 1; - - var numberTree = new NumberTree(obj, this.xref); - var nums = numberTree.getAll(); - var currentLabel = '', currentIndex = 1; - - for (var i = 0, ii = this.numPages; i < ii; i++) { - if (nums.hasOwnProperty(i)) { - var labelDict = nums[i]; - assert(isDict(labelDict), 'The PageLabel is not a dictionary.'); - - var type = labelDict.get('Type'); - assert(!type || (isName(type) && type.name === 'PageLabel'), - 'Invalid type in PageLabel dictionary.'); - - var s = labelDict.get('S'); - assert(!s || isName(s), 'Invalid style in PageLabel dictionary.'); - style = (s ? s.name : null); - - prefix = labelDict.get('P') || ''; - assert(isString(prefix), 'Invalid prefix in PageLabel dictionary.'); - - start = labelDict.get('St') || 1; - assert(isInt(start), 'Invalid start in PageLabel dictionary.'); - currentIndex = start; - } - - switch (style) { - case 'D': - currentLabel = currentIndex; - break; - case 'R': - case 'r': - currentLabel = Util.toRoman(currentIndex, style === 'r'); - break; - case 'A': - case 'a': - var LIMIT = 26; // Use only the characters A--Z, or a--z. - var A_UPPER_CASE = 0x41, A_LOWER_CASE = 0x61; - - var baseCharCode = (style === 'a' ? A_LOWER_CASE : A_UPPER_CASE); - var letterIndex = currentIndex - 1; - var character = String.fromCharCode(baseCharCode + - (letterIndex % LIMIT)); - var charBuf = []; - for (var j = 0, jj = (letterIndex / LIMIT) | 0; j <= jj; j++) { - charBuf.push(character); - } - currentLabel = charBuf.join(''); - break; - default: - assert(!style, - 'Invalid style "' + style + '" in PageLabel dictionary.'); - } - pageLabels[i] = prefix + currentLabel; - - currentLabel = ''; - currentIndex++; - } - return pageLabels; - }, - - get attachments() { - var xref = this.xref; - var attachments = null, nameTreeRef; - var obj = this.catDict.get('Names'); - if (obj) { - nameTreeRef = obj.getRaw('EmbeddedFiles'); - } - - if (nameTreeRef) { - var nameTree = new NameTree(nameTreeRef, xref); - var names = nameTree.getAll(); - for (var name in names) { - if (!names.hasOwnProperty(name)) { - continue; - } - var fs = new FileSpec(names[name], xref); - if (!attachments) { - attachments = {}; - } - attachments[stringToPDFString(name)] = fs.serializable; - } - } - return shadow(this, 'attachments', attachments); - }, - get javaScript() { - var xref = this.xref; - var obj = this.catDict.get('Names'); - - var javaScript = []; - function appendIfJavaScriptDict(jsDict) { - var type = jsDict.get('S'); - if (!isName(type) || type.name !== 'JavaScript') { - return; - } - var js = jsDict.get('JS'); - if (isStream(js)) { - js = bytesToString(js.getBytes()); - } else if (!isString(js)) { - return; - } - javaScript.push(stringToPDFString(js)); - } - if (obj && obj.has('JavaScript')) { - var nameTree = new NameTree(obj.getRaw('JavaScript'), xref); - var names = nameTree.getAll(); - for (var name in names) { - if (!names.hasOwnProperty(name)) { - continue; - } - // We don't really use the JavaScript right now. This code is - // defensive so we don't cause errors on document load. - var jsDict = names[name]; - if (isDict(jsDict)) { - appendIfJavaScriptDict(jsDict); - } - } - } - - // Append OpenAction actions to javaScript array - var openactionDict = this.catDict.get('OpenAction'); - if (isDict(openactionDict, 'Action')) { - var actionType = openactionDict.get('S'); - if (isName(actionType) && actionType.name === 'Named') { - // The named Print action is not a part of the PDF 1.7 specification, - // but is supported by many PDF readers/writers (including Adobe's). - var action = openactionDict.get('N'); - if (isName(action) && action.name === 'Print') { - javaScript.push('print({});'); - } - } else { - appendIfJavaScriptDict(openactionDict); - } - } - - return shadow(this, 'javaScript', javaScript); - }, - - cleanup: function Catalog_cleanup() { - var promises = []; - this.fontCache.forEach(function (promise) { - promises.push(promise); - }); - return Promise.all(promises).then(function (translatedFonts) { - for (var i = 0, ii = translatedFonts.length; i < ii; i++) { - var font = translatedFonts[i].dict; - delete font.translated; - } - this.fontCache.clear(); - }.bind(this)); - }, - - getPage: function Catalog_getPage(pageIndex) { - if (!(pageIndex in this.pagePromises)) { - this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then( - function (a) { - var dict = a[0]; - var ref = a[1]; - return this.pageFactory.createPage(pageIndex, dict, ref, - this.fontCache); - }.bind(this) - ); - } - return this.pagePromises[pageIndex]; - }, - - getPageDict: function Catalog_getPageDict(pageIndex) { - var capability = createPromiseCapability(); - var nodesToVisit = [this.catDict.getRaw('Pages')]; - var currentPageIndex = 0; - var xref = this.xref; - var checkAllKids = false; - - function next() { - while (nodesToVisit.length) { - var currentNode = nodesToVisit.pop(); - - if (isRef(currentNode)) { - xref.fetchAsync(currentNode).then(function (obj) { - if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { - if (pageIndex === currentPageIndex) { - capability.resolve([obj, currentNode]); - } else { - currentPageIndex++; - next(); - } - return; - } - nodesToVisit.push(obj); - next(); - }, capability.reject); - return; - } - - // Must be a child page dictionary. - assert( - isDict(currentNode), - 'page dictionary kid reference points to wrong type of object' - ); - var count = currentNode.get('Count'); - // If the current node doesn't have any children, avoid getting stuck - // in an empty node further down in the tree (see issue5644.pdf). - if (count === 0) { - checkAllKids = true; - } - // Skip nodes where the page can't be. - if (currentPageIndex + count <= pageIndex) { - currentPageIndex += count; - continue; - } - - var kids = currentNode.get('Kids'); - assert(isArray(kids), 'page dictionary kids object is not an array'); - if (!checkAllKids && count === kids.length) { - // Nodes that don't have the page have been skipped and this is the - // bottom of the tree which means the page requested must be a - // descendant of this pages node. Ideally we would just resolve the - // promise with the page ref here, but there is the case where more - // pages nodes could link to single a page (see issue 3666 pdf). To - // handle this push it back on the queue so if it is a pages node it - // will be descended into. - nodesToVisit = [kids[pageIndex - currentPageIndex]]; - currentPageIndex = pageIndex; - continue; - } else { - for (var last = kids.length - 1; last >= 0; last--) { - nodesToVisit.push(kids[last]); - } - } - } - capability.reject('Page index ' + pageIndex + ' not found.'); - } - next(); - return capability.promise; - }, - - getPageIndex: function Catalog_getPageIndex(ref) { - // The page tree nodes have the count of all the leaves below them. To get - // how many pages are before we just have to walk up the tree and keep - // adding the count of siblings to the left of the node. - var xref = this.xref; - function pagesBeforeRef(kidRef) { - var total = 0; - var parentRef; - return xref.fetchAsync(kidRef).then(function (node) { - if (!node) { - return null; - } - parentRef = node.getRaw('Parent'); - return node.getAsync('Parent'); - }).then(function (parent) { - if (!parent) { - return null; - } - return parent.getAsync('Kids'); - }).then(function (kids) { - if (!kids) { - return null; - } - var kidPromises = []; - var found = false; - for (var i = 0; i < kids.length; i++) { - var kid = kids[i]; - assert(isRef(kid), 'kids must be a ref'); - if (kid.num === kidRef.num) { - found = true; - break; - } - kidPromises.push(xref.fetchAsync(kid).then(function (kid) { - if (kid.has('Count')) { - var count = kid.get('Count'); - total += count; - } else { // page leaf node - total++; - } - })); - } - if (!found) { - error('kid ref not found in parents kids'); - } - return Promise.all(kidPromises).then(function () { - return [total, parentRef]; - }); - }); - } - - var total = 0; - function next(ref) { - return pagesBeforeRef(ref).then(function (args) { - if (!args) { - return total; - } - var count = args[0]; - var parentRef = args[1]; - total += count; - return next(parentRef); - }); - } - - return next(ref); - } - }; - - return Catalog; -})(); - -var XRef = (function XRefClosure() { - function XRef(stream, password) { - this.stream = stream; - this.entries = []; - this.xrefstms = {}; - // prepare the XRef cache - this.cache = []; - this.password = password; - this.stats = { - streamTypes: [], - fontTypes: [] - }; - } - - XRef.prototype = { - setStartXRef: function XRef_setStartXRef(startXRef) { - // Store the starting positions of xref tables as we process them - // so we can recover from missing data errors - this.startXRefQueue = [startXRef]; - }, - - parse: function XRef_parse(recoveryMode) { - var trailerDict; - if (!recoveryMode) { - trailerDict = this.readXRef(); - } else { - warn('Indexing all PDF objects'); - trailerDict = this.indexObjects(); - } - trailerDict.assignXref(this); - this.trailer = trailerDict; - var encrypt = trailerDict.get('Encrypt'); - if (encrypt) { - var ids = trailerDict.get('ID'); - var fileId = (ids && ids.length) ? ids[0] : ''; - this.encrypt = new CipherTransformFactory(encrypt, fileId, - this.password); - } - - // get the root dictionary (catalog) object - if (!(this.root = trailerDict.get('Root'))) { - error('Invalid root reference'); - } - }, - - processXRefTable: function XRef_processXRefTable(parser) { - if (!('tableState' in this)) { - // Stores state of the table as we process it so we can resume - // from middle of table in case of missing data error - this.tableState = { - entryNum: 0, - streamPos: parser.lexer.stream.pos, - parserBuf1: parser.buf1, - parserBuf2: parser.buf2 - }; - } - - var obj = this.readXRefTable(parser); - - // Sanity check - if (!isCmd(obj, 'trailer')) { - error('Invalid XRef table: could not find trailer dictionary'); - } - // Read trailer dictionary, e.g. - // trailer - // << /Size 22 - // /Root 20R - // /Info 10R - // /ID [ <81b14aafa313db63dbd6f981e49f94f4> ] - // >> - // The parser goes through the entire stream << ... >> and provides - // a getter interface for the key-value table - var dict = parser.getObj(); - - // The pdflib PDF generator can generate a nested trailer dictionary - if (!isDict(dict) && dict.dict) { - dict = dict.dict; - } - if (!isDict(dict)) { - error('Invalid XRef table: could not parse trailer dictionary'); - } - delete this.tableState; - - return dict; - }, - - readXRefTable: function XRef_readXRefTable(parser) { - // Example of cross-reference table: - // xref - // 0 1 <-- subsection header (first obj #, obj count) - // 0000000000 65535 f <-- actual object (offset, generation #, f/n) - // 23 2 <-- subsection header ... and so on ... - // 0000025518 00002 n - // 0000025635 00000 n - // trailer - // ... - - var stream = parser.lexer.stream; - var tableState = this.tableState; - stream.pos = tableState.streamPos; - parser.buf1 = tableState.parserBuf1; - parser.buf2 = tableState.parserBuf2; - - // Outer loop is over subsection headers - var obj; - - while (true) { - if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) { - if (isCmd(obj = parser.getObj(), 'trailer')) { - break; - } - tableState.firstEntryNum = obj; - tableState.entryCount = parser.getObj(); - } - - var first = tableState.firstEntryNum; - var count = tableState.entryCount; - if (!isInt(first) || !isInt(count)) { - error('Invalid XRef table: wrong types in subsection header'); - } - // Inner loop is over objects themselves - for (var i = tableState.entryNum; i < count; i++) { - tableState.streamPos = stream.pos; - tableState.entryNum = i; - tableState.parserBuf1 = parser.buf1; - tableState.parserBuf2 = parser.buf2; - - var entry = {}; - entry.offset = parser.getObj(); - entry.gen = parser.getObj(); - var type = parser.getObj(); - - if (isCmd(type, 'f')) { - entry.free = true; - } else if (isCmd(type, 'n')) { - entry.uncompressed = true; - } - - // Validate entry obj - if (!isInt(entry.offset) || !isInt(entry.gen) || - !(entry.free || entry.uncompressed)) { - error('Invalid entry in XRef subsection: ' + first + ', ' + count); - } - - if (!this.entries[i + first]) { - this.entries[i + first] = entry; - } - } - - tableState.entryNum = 0; - tableState.streamPos = stream.pos; - tableState.parserBuf1 = parser.buf1; - tableState.parserBuf2 = parser.buf2; - delete tableState.firstEntryNum; - delete tableState.entryCount; - } - - // Per issue 3248: hp scanners generate bad XRef - if (first === 1 && this.entries[1] && this.entries[1].free) { - // shifting the entries - this.entries.shift(); - } - - // Sanity check: as per spec, first object must be free - if (this.entries[0] && !this.entries[0].free) { - error('Invalid XRef table: unexpected first object'); - } - return obj; - }, - - processXRefStream: function XRef_processXRefStream(stream) { - if (!('streamState' in this)) { - // Stores state of the stream as we process it so we can resume - // from middle of stream in case of missing data error - var streamParameters = stream.dict; - var byteWidths = streamParameters.get('W'); - var range = streamParameters.get('Index'); - if (!range) { - range = [0, streamParameters.get('Size')]; - } - - this.streamState = { - entryRanges: range, - byteWidths: byteWidths, - entryNum: 0, - streamPos: stream.pos - }; - } - this.readXRefStream(stream); - delete this.streamState; - - return stream.dict; - }, - - readXRefStream: function XRef_readXRefStream(stream) { - var i, j; - var streamState = this.streamState; - stream.pos = streamState.streamPos; - - var byteWidths = streamState.byteWidths; - var typeFieldWidth = byteWidths[0]; - var offsetFieldWidth = byteWidths[1]; - var generationFieldWidth = byteWidths[2]; - - var entryRanges = streamState.entryRanges; - while (entryRanges.length > 0) { - var first = entryRanges[0]; - var n = entryRanges[1]; - - if (!isInt(first) || !isInt(n)) { - error('Invalid XRef range fields: ' + first + ', ' + n); - } - if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) || - !isInt(generationFieldWidth)) { - error('Invalid XRef entry fields length: ' + first + ', ' + n); - } - for (i = streamState.entryNum; i < n; ++i) { - streamState.entryNum = i; - streamState.streamPos = stream.pos; - - var type = 0, offset = 0, generation = 0; - for (j = 0; j < typeFieldWidth; ++j) { - type = (type << 8) | stream.getByte(); - } - // if type field is absent, its default value is 1 - if (typeFieldWidth === 0) { - type = 1; - } - for (j = 0; j < offsetFieldWidth; ++j) { - offset = (offset << 8) | stream.getByte(); - } - for (j = 0; j < generationFieldWidth; ++j) { - generation = (generation << 8) | stream.getByte(); - } - var entry = {}; - entry.offset = offset; - entry.gen = generation; - switch (type) { - case 0: - entry.free = true; - break; - case 1: - entry.uncompressed = true; - break; - case 2: - break; - default: - error('Invalid XRef entry type: ' + type); - } - if (!this.entries[first + i]) { - this.entries[first + i] = entry; - } - } - - streamState.entryNum = 0; - streamState.streamPos = stream.pos; - entryRanges.splice(0, 2); - } - }, - - indexObjects: function XRef_indexObjects() { - // Simple scan through the PDF content to find objects, - // trailers and XRef streams. - var TAB = 0x9, LF = 0xA, CR = 0xD, SPACE = 0x20; - var PERCENT = 0x25, LT = 0x3C; - - function readToken(data, offset) { - var token = '', ch = data[offset]; - while (ch !== LF && ch !== CR && ch !== LT) { - if (++offset >= data.length) { - break; - } - token += String.fromCharCode(ch); - ch = data[offset]; - } - return token; - } - function skipUntil(data, offset, what) { - var length = what.length, dataLength = data.length; - var skipped = 0; - // finding byte sequence - while (offset < dataLength) { - var i = 0; - while (i < length && data[offset + i] === what[i]) { - ++i; - } - if (i >= length) { - break; // sequence found - } - offset++; - skipped++; - } - return skipped; - } - var objRegExp = /^(\d+)\s+(\d+)\s+obj\b/; - var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); - var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, - 101, 102]); - var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]); - var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); - - // Clear out any existing entries, since they may be bogus. - this.entries.length = 0; - - var stream = this.stream; - stream.pos = 0; - var buffer = stream.getBytes(); - var position = stream.start, length = buffer.length; - var trailers = [], xrefStms = []; - while (position < length) { - var ch = buffer[position]; - if (ch === TAB || ch === LF || ch === CR || ch === SPACE) { - ++position; - continue; - } - if (ch === PERCENT) { // %-comment - do { - ++position; - if (position >= length) { - break; - } - ch = buffer[position]; - } while (ch !== LF && ch !== CR); - continue; - } - var token = readToken(buffer, position); - var m; - if (token.indexOf('xref') === 0 && - (token.length === 4 || /\s/.test(token[4]))) { - position += skipUntil(buffer, position, trailerBytes); - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else if ((m = objRegExp.exec(token))) { - if (typeof this.entries[m[1]] === 'undefined') { - this.entries[m[1]] = { - offset: position - stream.start, - gen: m[2] | 0, - uncompressed: true - }; - } - var contentLength = skipUntil(buffer, position, endobjBytes) + 7; - var content = buffer.subarray(position, position + contentLength); - - // checking XRef stream suspect - // (it shall have '/XRef' and next char is not a letter) - var xrefTagOffset = skipUntil(content, 0, xrefBytes); - if (xrefTagOffset < contentLength && - content[xrefTagOffset + 5] < 64) { - xrefStms.push(position - stream.start); - this.xrefstms[position - stream.start] = 1; // Avoid recursion - } - - position += contentLength; - } else if (token.indexOf('trailer') === 0 && - (token.length === 7 || /\s/.test(token[7]))) { - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else { - position += token.length + 1; - } - } - // reading XRef streams - var i, ii; - for (i = 0, ii = xrefStms.length; i < ii; ++i) { - this.startXRefQueue.push(xrefStms[i]); - this.readXRef(/* recoveryMode */ true); - } - // finding main trailer - var dict; - for (i = 0, ii = trailers.length; i < ii; ++i) { - stream.pos = trailers[i]; - var parser = new Parser(new Lexer(stream), true, this); - var obj = parser.getObj(); - if (!isCmd(obj, 'trailer')) { - continue; - } - // read the trailer dictionary - if (!isDict(dict = parser.getObj())) { - continue; - } - // taking the first one with 'ID' - if (dict.has('ID')) { - return dict; - } - } - // no tailer with 'ID', taking last one (if exists) - if (dict) { - return dict; - } - // nothing helps - // calling error() would reject worker with an UnknownErrorException. - throw new InvalidPDFException('Invalid PDF structure'); - }, - - readXRef: function XRef_readXRef(recoveryMode) { - var stream = this.stream; - - try { - while (this.startXRefQueue.length) { - var startXRef = this.startXRefQueue[0]; - - stream.pos = startXRef + stream.start; - - var parser = new Parser(new Lexer(stream), true, this); - var obj = parser.getObj(); - var dict; - - // Get dictionary - if (isCmd(obj, 'xref')) { - // Parse end-of-file XRef - dict = this.processXRefTable(parser); - if (!this.topDict) { - this.topDict = dict; - } - - // Recursively get other XRefs 'XRefStm', if any - obj = dict.get('XRefStm'); - if (isInt(obj)) { - var pos = obj; - // ignore previously loaded xref streams - // (possible infinite recursion) - if (!(pos in this.xrefstms)) { - this.xrefstms[pos] = 1; - this.startXRefQueue.push(pos); - } - } - } else if (isInt(obj)) { - // Parse in-stream XRef - if (!isInt(parser.getObj()) || - !isCmd(parser.getObj(), 'obj') || - !isStream(obj = parser.getObj())) { - error('Invalid XRef stream'); - } - dict = this.processXRefStream(obj); - if (!this.topDict) { - this.topDict = dict; - } - if (!dict) { - error('Failed to read XRef stream'); - } - } else { - error('Invalid XRef stream header'); - } - - // Recursively get previous dictionary, if any - obj = dict.get('Prev'); - if (isInt(obj)) { - this.startXRefQueue.push(obj); - } else if (isRef(obj)) { - // The spec says Prev must not be a reference, i.e. "/Prev NNN" - // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R" - this.startXRefQueue.push(obj.num); - } - - this.startXRefQueue.shift(); - } - - return this.topDict; - } catch (e) { - if (e instanceof MissingDataException) { - throw e; - } - info('(while reading XRef): ' + e); - } - - if (recoveryMode) { - return; - } - throw new XRefParseException(); - }, - - getEntry: function XRef_getEntry(i) { - var xrefEntry = this.entries[i]; - if (xrefEntry && !xrefEntry.free && xrefEntry.offset) { - return xrefEntry; - } - return null; - }, - - fetchIfRef: function XRef_fetchIfRef(obj) { - if (!isRef(obj)) { - return obj; - } - return this.fetch(obj); - }, - - fetch: function XRef_fetch(ref, suppressEncryption) { - assert(isRef(ref), 'ref object is not a reference'); - var num = ref.num; - if (num in this.cache) { - var cacheEntry = this.cache[num]; - return cacheEntry; - } - - var xrefEntry = this.getEntry(num); - - // the referenced entry can be free - if (xrefEntry === null) { - return (this.cache[num] = null); - } - - if (xrefEntry.uncompressed) { - xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption); - } else { - xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption); - } - if (isDict(xrefEntry)){ - xrefEntry.objId = ref.toString(); - } else if (isStream(xrefEntry)) { - xrefEntry.dict.objId = ref.toString(); - } - return xrefEntry; - }, - - fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, - suppressEncryption) { - var gen = ref.gen; - var num = ref.num; - if (xrefEntry.gen !== gen) { - error('inconsistent generation in XRef'); - } - var stream = this.stream.makeSubStream(xrefEntry.offset + - this.stream.start); - var parser = new Parser(new Lexer(stream), true, this); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - if (!isInt(obj1) || parseInt(obj1, 10) !== num || - !isInt(obj2) || parseInt(obj2, 10) !== gen || - !isCmd(obj3)) { - error('bad XRef entry'); - } - if (!isCmd(obj3, 'obj')) { - // some bad PDFs use "obj1234" and really mean 1234 - if (obj3.cmd.indexOf('obj') === 0) { - num = parseInt(obj3.cmd.substring(3), 10); - if (!isNaN(num)) { - return num; - } - } - error('bad XRef entry'); - } - if (this.encrypt && !suppressEncryption) { - xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen)); - } else { - xrefEntry = parser.getObj(); - } - if (!isStream(xrefEntry)) { - this.cache[num] = xrefEntry; - } - return xrefEntry; - }, - - fetchCompressed: function XRef_fetchCompressed(xrefEntry, - suppressEncryption) { - var tableOffset = xrefEntry.offset; - var stream = this.fetch(new Ref(tableOffset, 0)); - if (!isStream(stream)) { - error('bad ObjStm stream'); - } - var first = stream.dict.get('First'); - var n = stream.dict.get('N'); - if (!isInt(first) || !isInt(n)) { - error('invalid first and n parameters for ObjStm stream'); - } - var parser = new Parser(new Lexer(stream), false, this); - parser.allowStreams = true; - var i, entries = [], num, nums = []; - // read the object numbers to populate cache - for (i = 0; i < n; ++i) { - num = parser.getObj(); - if (!isInt(num)) { - error('invalid object number in the ObjStm stream: ' + num); - } - nums.push(num); - var offset = parser.getObj(); - if (!isInt(offset)) { - error('invalid object offset in the ObjStm stream: ' + offset); - } - } - // read stream objects for cache - for (i = 0; i < n; ++i) { - entries.push(parser.getObj()); - num = nums[i]; - var entry = this.entries[num]; - if (entry && entry.offset === tableOffset && entry.gen === i) { - this.cache[num] = entries[i]; - } - } - xrefEntry = entries[xrefEntry.gen]; - if (xrefEntry === undefined) { - error('bad XRef entry for compressed object'); - } - return xrefEntry; - }, - - fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) { - if (!isRef(obj)) { - return Promise.resolve(obj); - } - return this.fetchAsync(obj); - }, - - fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) { - var streamManager = this.stream.manager; - var xref = this; - return new Promise(function tryFetch(resolve, reject) { - try { - resolve(xref.fetch(ref, suppressEncryption)); - } catch (e) { - if (e instanceof MissingDataException) { - streamManager.requestRange(e.begin, e.end).then(function () { - tryFetch(resolve, reject); - }, reject); - return; - } - reject(e); - } - }); - }, - - getCatalogObj: function XRef_getCatalogObj() { - return this.root; - } - }; - - return XRef; -})(); - -/** - * A NameTree/NumberTree is like a Dict but has some advantageous properties, - * see the specification (7.9.6 and 7.9.7) for additional details. - * TODO: implement all the Dict functions and make this more efficient. - */ -var NameOrNumberTree = (function NameOrNumberTreeClosure() { - function NameOrNumberTree(root, xref) { - throw new Error('Cannot initialize NameOrNumberTree.'); - } - - NameOrNumberTree.prototype = { - getAll: function NameOrNumberTree_getAll() { - var dict = {}; - if (!this.root) { - return dict; - } - var xref = this.xref; - // Reading Name/Number tree. - var processed = new RefSet(); - processed.put(this.root); - var queue = [this.root]; - while (queue.length > 0) { - var i, n; - var obj = xref.fetchIfRef(queue.shift()); - if (!isDict(obj)) { - continue; - } - if (obj.has('Kids')) { - var kids = obj.get('Kids'); - for (i = 0, n = kids.length; i < n; i++) { - var kid = kids[i]; - assert(!processed.has(kid), - 'Duplicate entry in "' + this._type + '" tree.'); - queue.push(kid); - processed.put(kid); - } - continue; - } - var entries = obj.get(this._type); - if (isArray(entries)) { - for (i = 0, n = entries.length; i < n; i += 2) { - dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]); - } - } - } - return dict; - }, - - get: function NameOrNumberTree_get(key) { - if (!this.root) { - return null; - } - - var xref = this.xref; - var kidsOrEntries = xref.fetchIfRef(this.root); - var loopCount = 0; - var MAX_LEVELS = 10; - var l, r, m; - - // Perform a binary search to quickly find the entry that - // contains the key we are looking for. - while (kidsOrEntries.has('Kids')) { - if (++loopCount > MAX_LEVELS) { - warn('Search depth limit reached for "' + this._type + '" tree.'); - return null; - } - - var kids = kidsOrEntries.get('Kids'); - if (!isArray(kids)) { - return null; - } - - l = 0; - r = kids.length - 1; - while (l <= r) { - m = (l + r) >> 1; - var kid = xref.fetchIfRef(kids[m]); - var limits = kid.get('Limits'); - - if (key < xref.fetchIfRef(limits[0])) { - r = m - 1; - } else if (key > xref.fetchIfRef(limits[1])) { - l = m + 1; - } else { - kidsOrEntries = xref.fetchIfRef(kids[m]); - break; - } - } - if (l > r) { - return null; - } - } - - // If we get here, then we have found the right entry. Now go through the - // entries in the dictionary until we find the key we're looking for. - var entries = kidsOrEntries.get(this._type); - if (isArray(entries)) { - // Perform a binary search to reduce the lookup time. - l = 0; - r = entries.length - 2; - while (l <= r) { - // Check only even indices (0, 2, 4, ...) because the - // odd indices contain the actual data. - m = (l + r) & ~1; - var currentKey = xref.fetchIfRef(entries[m]); - if (key < currentKey) { - r = m - 2; - } else if (key > currentKey) { - l = m + 2; - } else { - return xref.fetchIfRef(entries[m + 1]); - } - } - } - return null; - } - }; - return NameOrNumberTree; -})(); - -var NameTree = (function NameTreeClosure() { - function NameTree(root, xref) { - this.root = root; - this.xref = xref; - this._type = 'Names'; - } - - Util.inherit(NameTree, NameOrNumberTree, {}); - - return NameTree; -})(); - -var NumberTree = (function NumberTreeClosure() { - function NumberTree(root, xref) { - this.root = root; - this.xref = xref; - this._type = 'Nums'; - } - - Util.inherit(NumberTree, NameOrNumberTree, {}); - - return NumberTree; -})(); - -/** - * "A PDF file can refer to the contents of another file by using a File - * Specification (PDF 1.1)", see the spec (7.11) for more details. - * NOTE: Only embedded files are supported (as part of the attachments support) - * TODO: support the 'URL' file system (with caching if !/V), portable - * collections attributes and related files (/RF) - */ -var FileSpec = (function FileSpecClosure() { - function FileSpec(root, xref) { - if (!root || !isDict(root)) { - return; - } - this.xref = xref; - this.root = root; - if (root.has('FS')) { - this.fs = root.get('FS'); - } - this.description = root.has('Desc') ? - stringToPDFString(root.get('Desc')) : - ''; - if (root.has('RF')) { - warn('Related file specifications are not supported'); - } - this.contentAvailable = true; - if (!root.has('EF')) { - this.contentAvailable = false; - warn('Non-embedded file specifications are not supported'); - } - } - - function pickPlatformItem(dict) { - // Look for the filename in this order: - // UF, F, Unix, Mac, DOS - if (dict.has('UF')) { - return dict.get('UF'); - } else if (dict.has('F')) { - return dict.get('F'); - } else if (dict.has('Unix')) { - return dict.get('Unix'); - } else if (dict.has('Mac')) { - return dict.get('Mac'); - } else if (dict.has('DOS')) { - return dict.get('DOS'); - } else { - return null; - } - } - - FileSpec.prototype = { - get filename() { - if (!this._filename && this.root) { - var filename = pickPlatformItem(this.root) || 'unnamed'; - this._filename = stringToPDFString(filename). - replace(/\\\\/g, '\\'). - replace(/\\\//g, '/'). - replace(/\\/g, '/'); - } - return this._filename; - }, - get content() { - if (!this.contentAvailable) { - return null; - } - if (!this.contentRef && this.root) { - this.contentRef = pickPlatformItem(this.root.get('EF')); - } - var content = null; - if (this.contentRef) { - var xref = this.xref; - var fileObj = xref.fetchIfRef(this.contentRef); - if (fileObj && isStream(fileObj)) { - content = fileObj.getBytes(); - } else { - warn('Embedded file specification points to non-existing/invalid ' + - 'content'); - } - } else { - warn('Embedded file specification does not have a content'); - } - return content; - }, - get serializable() { - return { - filename: this.filename, - content: this.content - }; - } - }; - return FileSpec; -})(); - -/** - * A helper for loading missing data in object graphs. It traverses the graph - * depth first and queues up any objects that have missing data. Once it has - * has traversed as many objects that are available it attempts to bundle the - * missing data requests and then resume from the nodes that weren't ready. - * - * NOTE: It provides protection from circular references by keeping track of - * of loaded references. However, you must be careful not to load any graphs - * that have references to the catalog or other pages since that will cause the - * entire PDF document object graph to be traversed. - */ -var ObjectLoader = (function() { - function mayHaveChildren(value) { - return isRef(value) || isDict(value) || isArray(value) || isStream(value); - } - - function addChildren(node, nodesToVisit) { - var value; - if (isDict(node) || isStream(node)) { - var map; - if (isDict(node)) { - map = node.map; - } else { - map = node.dict.map; - } - for (var key in map) { - value = map[key]; - if (mayHaveChildren(value)) { - nodesToVisit.push(value); - } - } - } else if (isArray(node)) { - for (var i = 0, ii = node.length; i < ii; i++) { - value = node[i]; - if (mayHaveChildren(value)) { - nodesToVisit.push(value); - } - } - } - } - - function ObjectLoader(obj, keys, xref) { - this.obj = obj; - this.keys = keys; - this.xref = xref; - this.refSet = null; - this.capability = null; - } - - ObjectLoader.prototype = { - load: function ObjectLoader_load() { - var keys = this.keys; - this.capability = createPromiseCapability(); - // Don't walk the graph if all the data is already loaded. - if (!(this.xref.stream instanceof ChunkedStream) || - this.xref.stream.getMissingChunks().length === 0) { - this.capability.resolve(); - return this.capability.promise; - } - - this.refSet = new RefSet(); - // Setup the initial nodes to visit. - var nodesToVisit = []; - for (var i = 0; i < keys.length; i++) { - nodesToVisit.push(this.obj[keys[i]]); - } - - this._walk(nodesToVisit); - return this.capability.promise; - }, - - _walk: function ObjectLoader_walk(nodesToVisit) { - var nodesToRevisit = []; - var pendingRequests = []; - // DFS walk of the object graph. - while (nodesToVisit.length) { - var currentNode = nodesToVisit.pop(); - - // Only references or chunked streams can cause missing data exceptions. - if (isRef(currentNode)) { - // Skip nodes that have already been visited. - if (this.refSet.has(currentNode)) { - continue; - } - try { - var ref = currentNode; - this.refSet.put(ref); - currentNode = this.xref.fetch(currentNode); - } catch (e) { - if (!(e instanceof MissingDataException)) { - throw e; - } - nodesToRevisit.push(currentNode); - pendingRequests.push({ begin: e.begin, end: e.end }); - } - } - if (currentNode && currentNode.getBaseStreams) { - var baseStreams = currentNode.getBaseStreams(); - var foundMissingData = false; - for (var i = 0; i < baseStreams.length; i++) { - var stream = baseStreams[i]; - if (stream.getMissingChunks && stream.getMissingChunks().length) { - foundMissingData = true; - pendingRequests.push({ - begin: stream.start, - end: stream.end - }); - } - } - if (foundMissingData) { - nodesToRevisit.push(currentNode); - } - } - - addChildren(currentNode, nodesToVisit); - } - - if (pendingRequests.length) { - this.xref.stream.manager.requestRanges(pendingRequests).then( - function pendingRequestCallback() { - nodesToVisit = nodesToRevisit; - for (var i = 0; i < nodesToRevisit.length; i++) { - var node = nodesToRevisit[i]; - // Remove any reference nodes from the currrent refset so they - // aren't skipped when we revist them. - if (isRef(node)) { - this.refSet.remove(node); - } - } - this._walk(nodesToVisit); - }.bind(this), this.capability.reject); - return; - } - // Everything is loaded. - this.refSet = null; - this.capability.resolve(); - } - }; - - return ObjectLoader; -})(); - -exports.Catalog = Catalog; -exports.ObjectLoader = ObjectLoader; -exports.XRef = XRef; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePsParser = {}), root.pdfjsSharedUtil, - root.pdfjsCoreParser); - } -}(this, function (exports, sharedUtil, coreParser) { - -var error = sharedUtil.error; -var EOF = coreParser.EOF; -var Lexer = coreParser.Lexer; - -var PostScriptParser = (function PostScriptParserClosure() { - function PostScriptParser(lexer) { - this.lexer = lexer; - this.operators = []; - this.token = null; - this.prev = null; - } - PostScriptParser.prototype = { - nextToken: function PostScriptParser_nextToken() { - this.prev = this.token; - this.token = this.lexer.getToken(); - }, - accept: function PostScriptParser_accept(type) { - if (this.token.type === type) { - this.nextToken(); - return true; - } - return false; - }, - expect: function PostScriptParser_expect(type) { - if (this.accept(type)) { - return true; - } - error('Unexpected symbol: found ' + this.token.type + ' expected ' + - type + '.'); - }, - parse: function PostScriptParser_parse() { - this.nextToken(); - this.expect(PostScriptTokenTypes.LBRACE); - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - return this.operators; - }, - parseBlock: function PostScriptParser_parseBlock() { - while (true) { - if (this.accept(PostScriptTokenTypes.NUMBER)) { - this.operators.push(this.prev.value); - } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { - this.operators.push(this.prev.value); - } else if (this.accept(PostScriptTokenTypes.LBRACE)) { - this.parseCondition(); - } else { - return; - } - } - }, - parseCondition: function PostScriptParser_parseCondition() { - // Add two place holders that will be updated later - var conditionLocation = this.operators.length; - this.operators.push(null, null); - - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - if (this.accept(PostScriptTokenTypes.IF)) { - // The true block is right after the 'if' so it just falls through on - // true else it jumps and skips the true block. - this.operators[conditionLocation] = this.operators.length; - this.operators[conditionLocation + 1] = 'jz'; - } else if (this.accept(PostScriptTokenTypes.LBRACE)) { - var jumpLocation = this.operators.length; - this.operators.push(null, null); - var endOfTrue = this.operators.length; - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - this.expect(PostScriptTokenTypes.IFELSE); - // The jump is added at the end of the true block to skip the false - // block. - this.operators[jumpLocation] = this.operators.length; - this.operators[jumpLocation + 1] = 'j'; - - this.operators[conditionLocation] = endOfTrue; - this.operators[conditionLocation + 1] = 'jz'; - } else { - error('PS Function: error parsing conditional.'); - } - } - }; - return PostScriptParser; -})(); - -var PostScriptTokenTypes = { - LBRACE: 0, - RBRACE: 1, - NUMBER: 2, - OPERATOR: 3, - IF: 4, - IFELSE: 5 -}; - -var PostScriptToken = (function PostScriptTokenClosure() { - function PostScriptToken(type, value) { - this.type = type; - this.value = value; - } - - var opCache = {}; - - PostScriptToken.getOperator = function PostScriptToken_getOperator(op) { - var opValue = opCache[op]; - if (opValue) { - return opValue; - } - return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); - }; - - PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE, - '{'); - PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE, - '}'); - PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF'); - PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE, - 'IFELSE'); - return PostScriptToken; -})(); - -var PostScriptLexer = (function PostScriptLexerClosure() { - function PostScriptLexer(stream) { - this.stream = stream; - this.nextChar(); - - this.strBuf = []; - } - PostScriptLexer.prototype = { - nextChar: function PostScriptLexer_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - getToken: function PostScriptLexer_getToken() { - var comment = false; - var ch = this.currentChar; - - // skip comments - while (true) { - if (ch < 0) { - return EOF; - } - - if (comment) { - if (ch === 0x0A || ch === 0x0D) { - comment = false; - } - } else if (ch === 0x25) { // '%' - comment = true; - } else if (!Lexer.isSpace(ch)) { - break; - } - ch = this.nextChar(); - } - switch (ch | 0) { - case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4' - case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9' - case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.' - return new PostScriptToken(PostScriptTokenTypes.NUMBER, - this.getNumber()); - case 0x7B: // '{' - this.nextChar(); - return PostScriptToken.LBRACE; - case 0x7D: // '}' - this.nextChar(); - return PostScriptToken.RBRACE; - } - // operator - var strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - - while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z' - ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) { - strBuf.push(String.fromCharCode(ch)); - } - var str = strBuf.join(''); - switch (str.toLowerCase()) { - case 'if': - return PostScriptToken.IF; - case 'ifelse': - return PostScriptToken.IFELSE; - default: - return PostScriptToken.getOperator(str); - } - }, - getNumber: function PostScriptLexer_getNumber() { - var ch = this.currentChar; - var strBuf = this.strBuf; - strBuf.length = 0; - strBuf[0] = String.fromCharCode(ch); - - while ((ch = this.nextChar()) >= 0) { - if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9' - ch === 0x2D || ch === 0x2E) { // '-', '.' - strBuf.push(String.fromCharCode(ch)); - } else { - break; - } - } - var value = parseFloat(strBuf.join('')); - if (isNaN(value)) { - error('Invalid floating point number: ' + value); - } - return value; - } - }; - return PostScriptLexer; -})(); - -exports.PostScriptLexer = PostScriptLexer; -exports.PostScriptParser = PostScriptParser; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreFonts = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser, - root.pdfjsCoreCMap, root.pdfjsCoreGlyphList, root.pdfjsCoreCharsets, - root.pdfjsCoreFontRenderer); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser, - coreCMap, coreGlyphList, coreCharsets, coreFontRenderer) { - -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; -var FontType = sharedUtil.FontType; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var bytesToString = sharedUtil.bytesToString; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isNum = sharedUtil.isNum; -var readUint32 = sharedUtil.readUint32; -var shadow = sharedUtil.shadow; -var stringToBytes = sharedUtil.stringToBytes; -var string32 = sharedUtil.string32; -var warn = sharedUtil.warn; -var Name = corePrimitives.Name; -var Stream = coreStream.Stream; -var Lexer = coreParser.Lexer; -var CMapFactory = coreCMap.CMapFactory; -var IdentityCMap = coreCMap.IdentityCMap; -var GlyphsUnicode = coreGlyphList.GlyphsUnicode; -var DingbatsGlyphsUnicode = coreGlyphList.DingbatsGlyphsUnicode; -var ISOAdobeCharset = coreCharsets.ISOAdobeCharset; -var ExpertCharset = coreCharsets.ExpertCharset; -var ExpertSubsetCharset = coreCharsets.ExpertSubsetCharset; -var FontRendererFactory = coreFontRenderer.FontRendererFactory; - -// Unicode Private Use Area -var PRIVATE_USE_OFFSET_START = 0xE000; -var PRIVATE_USE_OFFSET_END = 0xF8FF; -var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false; - -// PDF Glyph Space Units are one Thousandth of a TextSpace Unit -// except for Type 3 fonts -var PDF_GLYPH_SPACE_UNITS = 1000; - -// Hinting is currently disabled due to unknown problems on windows -// in tracemonkey and various other pdfs with type1 fonts. -var HINTING_ENABLED = false; - -// Accented charactars are not displayed properly on windows, using this flag -// to control analysis of seac charstrings. -var SEAC_ANALYSIS_ENABLED = false; - -// Maximum subroutine call depth of type 2 chartrings. Matches OTS. -var MAX_SUBR_NESTING = 10; - -var FontFlags = { - FixedPitch: 1, - Serif: 2, - Symbolic: 4, - Script: 8, - Nonsymbolic: 32, - Italic: 64, - AllCap: 65536, - SmallCap: 131072, - ForceBold: 262144 -}; - -var Encodings = { - ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', - 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', - 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', - 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', - 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', - 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', - 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', - 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', - 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', - 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', - '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', - 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', - 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', - 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', - 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', - 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', - 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', - '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', - 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', - 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', - 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', - 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', - 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', - 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', - 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', - 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', - 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', - 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', - 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', - 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', - 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', - 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', - 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', - 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', - 'Ydieresissmall'], - MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', - 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', - 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', - 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', - 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', - 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', - 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', - 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', - 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', - 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', - 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', - 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', - 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', - 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', - 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '', - 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', - 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', - 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', - 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', - 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', - 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', - 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', - 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', - 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', - 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', - 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', - 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', - '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', - 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', - 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', - 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', - 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', - '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', - 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', - 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'], - MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', - 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', - 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', - 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', - 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', - 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', - 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', - 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', - 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', - 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', - 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', - 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', - 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', - 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', - 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', - 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', - 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', - 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', - 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', - 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', - 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', - 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', - 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', - 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', - 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', - 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', - 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', - 'ogonek', 'caron'], - StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', - 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', - 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', - 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', - 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', - 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', - 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', - 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', - 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', - 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', - 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', - 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', - 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', - 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', - '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', - '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', - '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'], - WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', - 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', - 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', - 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', - 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', - 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', - 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', - 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', - 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', - 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', - 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', - 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling', - 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', - 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', - 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', - 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', - 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', - 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', - 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', - 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', - 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', - 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', - 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', - 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', - 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', - 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', - 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', - 'ydieresis'], - SymbolSetEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', - 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', - 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', - 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', - 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', - 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', - 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', - 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', - 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', - 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', - 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', - 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', - 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', - 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', - 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', - 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', - 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', - 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', - 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', - 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', - 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', - 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', - 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', - 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', - 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', - 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', - 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', - 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', - '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', - 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', - 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', - 'bracerightbt'], - ZapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', - 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', - 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', - 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', - 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', - 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', - 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', - 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', - 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', - 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', - 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', - 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', - 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', - 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', - 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', - 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', - 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', - 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', - 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', - 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', - 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191'] -}; - -/** - * Hold a map of decoded fonts and of the standard fourteen Type1 - * fonts and their acronyms. - */ -var stdFontMap = { - 'ArialNarrow': 'Helvetica', - 'ArialNarrow-Bold': 'Helvetica-Bold', - 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique', - 'ArialNarrow-Italic': 'Helvetica-Oblique', - 'ArialBlack': 'Helvetica', - 'ArialBlack-Bold': 'Helvetica-Bold', - 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique', - 'ArialBlack-Italic': 'Helvetica-Oblique', - 'Arial': 'Helvetica', - 'Arial-Bold': 'Helvetica-Bold', - 'Arial-BoldItalic': 'Helvetica-BoldOblique', - 'Arial-Italic': 'Helvetica-Oblique', - 'Arial-BoldItalicMT': 'Helvetica-BoldOblique', - 'Arial-BoldMT': 'Helvetica-Bold', - 'Arial-ItalicMT': 'Helvetica-Oblique', - 'ArialMT': 'Helvetica', - 'Courier-Bold': 'Courier-Bold', - 'Courier-BoldItalic': 'Courier-BoldOblique', - 'Courier-Italic': 'Courier-Oblique', - 'CourierNew': 'Courier', - 'CourierNew-Bold': 'Courier-Bold', - 'CourierNew-BoldItalic': 'Courier-BoldOblique', - 'CourierNew-Italic': 'Courier-Oblique', - 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique', - 'CourierNewPS-BoldMT': 'Courier-Bold', - 'CourierNewPS-ItalicMT': 'Courier-Oblique', - 'CourierNewPSMT': 'Courier', - 'Helvetica': 'Helvetica', - 'Helvetica-Bold': 'Helvetica-Bold', - 'Helvetica-BoldItalic': 'Helvetica-BoldOblique', - 'Helvetica-BoldOblique': 'Helvetica-BoldOblique', - 'Helvetica-Italic': 'Helvetica-Oblique', - 'Helvetica-Oblique':'Helvetica-Oblique', - 'Symbol-Bold': 'Symbol', - 'Symbol-BoldItalic': 'Symbol', - 'Symbol-Italic': 'Symbol', - 'TimesNewRoman': 'Times-Roman', - 'TimesNewRoman-Bold': 'Times-Bold', - 'TimesNewRoman-BoldItalic': 'Times-BoldItalic', - 'TimesNewRoman-Italic': 'Times-Italic', - 'TimesNewRomanPS': 'Times-Roman', - 'TimesNewRomanPS-Bold': 'Times-Bold', - 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldMT': 'Times-Bold', - 'TimesNewRomanPS-Italic': 'Times-Italic', - 'TimesNewRomanPS-ItalicMT': 'Times-Italic', - 'TimesNewRomanPSMT': 'Times-Roman', - 'TimesNewRomanPSMT-Bold': 'Times-Bold', - 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPSMT-Italic': 'Times-Italic' -}; - -/** - * Holds the map of the non-standard fonts that might be included as a standard - * fonts without glyph data. - */ -var nonStdFontMap = { - 'CenturyGothic': 'Helvetica', - 'CenturyGothic-Bold': 'Helvetica-Bold', - 'CenturyGothic-BoldItalic': 'Helvetica-BoldOblique', - 'CenturyGothic-Italic': 'Helvetica-Oblique', - 'ComicSansMS': 'Comic Sans MS', - 'ComicSansMS-Bold': 'Comic Sans MS-Bold', - 'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic', - 'ComicSansMS-Italic': 'Comic Sans MS-Italic', - 'LucidaConsole': 'Courier', - 'LucidaConsole-Bold': 'Courier-Bold', - 'LucidaConsole-BoldItalic': 'Courier-BoldOblique', - 'LucidaConsole-Italic': 'Courier-Oblique', - 'MS-Gothic': 'MS Gothic', - 'MS-Gothic-Bold': 'MS Gothic-Bold', - 'MS-Gothic-BoldItalic': 'MS Gothic-BoldItalic', - 'MS-Gothic-Italic': 'MS Gothic-Italic', - 'MS-Mincho': 'MS Mincho', - 'MS-Mincho-Bold': 'MS Mincho-Bold', - 'MS-Mincho-BoldItalic': 'MS Mincho-BoldItalic', - 'MS-Mincho-Italic': 'MS Mincho-Italic', - 'MS-PGothic': 'MS PGothic', - 'MS-PGothic-Bold': 'MS PGothic-Bold', - 'MS-PGothic-BoldItalic': 'MS PGothic-BoldItalic', - 'MS-PGothic-Italic': 'MS PGothic-Italic', - 'MS-PMincho': 'MS PMincho', - 'MS-PMincho-Bold': 'MS PMincho-Bold', - 'MS-PMincho-BoldItalic': 'MS PMincho-BoldItalic', - 'MS-PMincho-Italic': 'MS PMincho-Italic', - 'Wingdings': 'ZapfDingbats' -}; - -var serifFonts = { - 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true, - 'Aldus': true, 'Alexandria': true, 'Algerian': true, - 'American Typewriter': true, 'Antiqua': true, 'Apex': true, - 'Arno': true, 'Aster': true, 'Aurora': true, - 'Baskerville': true, 'Bell': true, 'Bembo': true, - 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true, - 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true, - 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true, - 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true, - 'Calvert': true, 'Capitals': true, 'Cambria': true, - 'Cartier': true, 'Caslon': true, 'Catull': true, - 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true, - 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true, - 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true, - 'Cochin': true, 'Colonna': true, 'Computer Modern': true, - 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true, - 'Corona': true, 'Ecotype': true, 'Egyptienne': true, - 'Elephant': true, 'Excelsior': true, 'Fairfield': true, - 'FF Scala': true, 'Folkard': true, 'Footlight': true, - 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true, - 'Gentium': true, 'Georgia': true, 'Gloucester': true, - 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true, - 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true, - 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true, - 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true, - 'Ionic No. 5': true, 'Janson': true, 'Joanna': true, - 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true, - 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true, - 'Lucida Bright': true, 'Melior': true, 'Memphis': true, - 'Miller': true, 'Minion': true, 'Modern': true, - 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true, - 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true, - 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true, - 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true, - 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true, - 'Requiem': true, 'Rockwell': true, 'Roman': true, - 'Rotis Serif': true, 'Sabon': true, 'Scala': true, - 'Seagull': true, 'Sistina': true, 'Souvenir': true, - 'STIX': true, 'Stone Informal': true, 'Stone Serif': true, - 'Sylfaen': true, 'Times': true, 'Trajan': true, - 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true, - 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true, - 'Versailles': true, 'Wanted': true, 'Weiss': true, - 'Wide Latin': true, 'Windsor': true, 'XITS': true -}; - -var symbolsFonts = { - 'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true -}; - -// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID fonts -// but does not embed the CID to GID mapping. The mapping is incomplete for all -// glyphs, but common for some set of the standard fonts. -var GlyphMapForStandardFonts = { - '2': 10, '3': 32, '4': 33, '5': 34, '6': 35, '7': 36, '8': 37, '9': 38, - '10': 39, '11': 40, '12': 41, '13': 42, '14': 43, '15': 44, '16': 45, - '17': 46, '18': 47, '19': 48, '20': 49, '21': 50, '22': 51, '23': 52, - '24': 53, '25': 54, '26': 55, '27': 56, '28': 57, '29': 58, '30': 894, - '31': 60, '32': 61, '33': 62, '34': 63, '35': 64, '36': 65, '37': 66, - '38': 67, '39': 68, '40': 69, '41': 70, '42': 71, '43': 72, '44': 73, - '45': 74, '46': 75, '47': 76, '48': 77, '49': 78, '50': 79, '51': 80, - '52': 81, '53': 82, '54': 83, '55': 84, '56': 85, '57': 86, '58': 87, - '59': 88, '60': 89, '61': 90, '62': 91, '63': 92, '64': 93, '65': 94, - '66': 95, '67': 96, '68': 97, '69': 98, '70': 99, '71': 100, '72': 101, - '73': 102, '74': 103, '75': 104, '76': 105, '77': 106, '78': 107, '79': 108, - '80': 109, '81': 110, '82': 111, '83': 112, '84': 113, '85': 114, '86': 115, - '87': 116, '88': 117, '89': 118, '90': 119, '91': 120, '92': 121, '93': 122, - '94': 123, '95': 124, '96': 125, '97': 126, '98': 196, '99': 197, '100': 199, - '101': 201, '102': 209, '103': 214, '104': 220, '105': 225, '106': 224, - '107': 226, '108': 228, '109': 227, '110': 229, '111': 231, '112': 233, - '113': 232, '114': 234, '115': 235, '116': 237, '117': 236, '118': 238, - '119': 239, '120': 241, '121': 243, '122': 242, '123': 244, '124': 246, - '125': 245, '126': 250, '127': 249, '128': 251, '129': 252, '130': 8224, - '131': 176, '132': 162, '133': 163, '134': 167, '135': 8226, '136': 182, - '137': 223, '138': 174, '139': 169, '140': 8482, '141': 180, '142': 168, - '143': 8800, '144': 198, '145': 216, '146': 8734, '147': 177, '148': 8804, - '149': 8805, '150': 165, '151': 181, '152': 8706, '153': 8721, '154': 8719, - '156': 8747, '157': 170, '158': 186, '159': 8486, '160': 230, '161': 248, - '162': 191, '163': 161, '164': 172, '165': 8730, '166': 402, '167': 8776, - '168': 8710, '169': 171, '170': 187, '171': 8230, '210': 218, '223': 711, - '224': 321, '225': 322, '227': 353, '229': 382, '234': 253, '252': 263, - '253': 268, '254': 269, '258': 258, '260': 260, '261': 261, '265': 280, - '266': 281, '268': 283, '269': 313, '275': 323, '276': 324, '278': 328, - '284': 345, '285': 346, '286': 347, '292': 367, '295': 377, '296': 378, - '298': 380, '305': 963, - '306': 964, '307': 966, '308': 8215, '309': 8252, '310': 8319, '311': 8359, - '312': 8592, '313': 8593, '337': 9552, '493': 1039, '494': 1040, '705': 1524, - '706': 8362, '710': 64288, '711': 64298, '759': 1617, '761': 1776, - '763': 1778, '775': 1652, '777': 1764, '778': 1780, '779': 1781, '780': 1782, - '782': 771, '783': 64726, '786': 8363, '788': 8532, '790': 768, '791': 769, - '792': 768, '795': 803, '797': 64336, '798': 64337, '799': 64342, - '800': 64343, '801': 64344, '802': 64345, '803': 64362, '804': 64363, - '805': 64364, '2424': 7821, '2425': 7822, '2426': 7823, '2427': 7824, - '2428': 7825, '2429': 7826, '2430': 7827, '2433': 7682, '2678': 8045, - '2679': 8046, '2830': 1552, '2838': 686, '2840': 751, '2842': 753, - '2843': 754, '2844': 755, '2846': 757, '2856': 767, '2857': 848, '2858': 849, - '2862': 853, '2863': 854, '2864': 855, '2865': 861, '2866': 862, '2906': 7460, - '2908': 7462, '2909': 7463, '2910': 7464, '2912': 7466, '2913': 7467, - '2914': 7468, '2916': 7470, '2917': 7471, '2918': 7472, '2920': 7474, - '2921': 7475, '2922': 7476, '2924': 7478, '2925': 7479, '2926': 7480, - '2928': 7482, '2929': 7483, '2930': 7484, '2932': 7486, '2933': 7487, - '2934': 7488, '2936': 7490, '2937': 7491, '2938': 7492, '2940': 7494, - '2941': 7495, '2942': 7496, '2944': 7498, '2946': 7500, '2948': 7502, - '2950': 7504, '2951': 7505, '2952': 7506, '2954': 7508, '2955': 7509, - '2956': 7510, '2958': 7512, '2959': 7513, '2960': 7514, '2962': 7516, - '2963': 7517, '2964': 7518, '2966': 7520, '2967': 7521, '2968': 7522, - '2970': 7524, '2971': 7525, '2972': 7526, '2974': 7528, '2975': 7529, - '2976': 7530, '2978': 1537, '2979': 1538, '2980': 1539, '2982': 1549, - '2983': 1551, '2984': 1552, '2986': 1554, '2987': 1555, '2988': 1556, - '2990': 1623, '2991': 1624, '2995': 1775, '2999': 1791, '3002': 64290, - '3003': 64291, '3004': 64292, '3006': 64294, '3007': 64295, '3008': 64296, - '3011': 1900, '3014': 8223, '3015': 8244, '3017': 7532, '3018': 7533, - '3019': 7534, '3075': 7590, '3076': 7591, '3079': 7594, '3080': 7595, - '3083': 7598, '3084': 7599, '3087': 7602, '3088': 7603, '3091': 7606, - '3092': 7607, '3095': 7610, '3096': 7611, '3099': 7614, '3100': 7615, - '3103': 7618, '3104': 7619, '3107': 8337, '3108': 8338, '3116': 1884, - '3119': 1885, '3120': 1885, '3123': 1886, '3124': 1886, '3127': 1887, - '3128': 1887, '3131': 1888, '3132': 1888, '3135': 1889, '3136': 1889, - '3139': 1890, '3140': 1890, '3143': 1891, '3144': 1891, '3147': 1892, - '3148': 1892, '3153': 580, '3154': 581, '3157': 584, '3158': 585, '3161': 588, - '3162': 589, '3165': 891, '3166': 892, '3169': 1274, '3170': 1275, - '3173': 1278, '3174': 1279, '3181': 7622, '3182': 7623, '3282': 11799, - '3316': 578, '3379': 42785, '3393': 1159, '3416': 8377 -}; - -// The glyph map for ArialBlack differs slightly from the glyph map used for -// other well-known standard fonts. Hence we use this (incomplete) CID to GID -// mapping to adjust the glyph map for non-embedded ArialBlack fonts. -var SupplementalGlyphMapForArialBlack = { - '227': 322, '264': 261, '291': 346, -}; - -// Some characters, e.g. copyrightserif, are mapped to the private use area and -// might not be displayed using standard fonts. Mapping/hacking well-known chars -// to the similar equivalents in the normal characters range. -var SpecialPUASymbols = { - '63721': 0x00A9, // copyrightsans (0xF8E9) => copyright - '63193': 0x00A9, // copyrightserif (0xF6D9) => copyright - '63720': 0x00AE, // registersans (0xF8E8) => registered - '63194': 0x00AE, // registerserif (0xF6DA) => registered - '63722': 0x2122, // trademarksans (0xF8EA) => trademark - '63195': 0x2122, // trademarkserif (0xF6DB) => trademark - '63729': 0x23A7, // bracelefttp (0xF8F1) - '63730': 0x23A8, // braceleftmid (0xF8F2) - '63731': 0x23A9, // braceleftbt (0xF8F3) - '63740': 0x23AB, // bracerighttp (0xF8FC) - '63741': 0x23AC, // bracerightmid (0xF8FD) - '63742': 0x23AD, // bracerightbt (0xF8FE) - '63726': 0x23A1, // bracketlefttp (0xF8EE) - '63727': 0x23A2, // bracketleftex (0xF8EF) - '63728': 0x23A3, // bracketleftbt (0xF8F0) - '63737': 0x23A4, // bracketrighttp (0xF8F9) - '63738': 0x23A5, // bracketrightex (0xF8FA) - '63739': 0x23A6, // bracketrightbt (0xF8FB) - '63723': 0x239B, // parenlefttp (0xF8EB) - '63724': 0x239C, // parenleftex (0xF8EC) - '63725': 0x239D, // parenleftbt (0xF8ED) - '63734': 0x239E, // parenrighttp (0xF8F6) - '63735': 0x239F, // parenrightex (0xF8F7) - '63736': 0x23A0, // parenrightbt (0xF8F8) -}; -function mapSpecialUnicodeValues(code) { - if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block. - return 0; - } else if (code >= 0xF600 && code <= 0xF8FF) { - return (SpecialPUASymbols[code] || code); - } - return code; -} - -var UnicodeRanges = [ - { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin - { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement - { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A - { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B - { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions - { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters - { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks - { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic - { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic - { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic - { 'begin': 0x0530, 'end': 0x058F }, // Armenian - { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew - { 'begin': 0xA500, 'end': 0xA63F }, // Vai - { 'begin': 0x0600, 'end': 0x06FF }, // Arabic - { 'begin': 0x07C0, 'end': 0x07FF }, // NKo - { 'begin': 0x0900, 'end': 0x097F }, // Devanagari - { 'begin': 0x0980, 'end': 0x09FF }, // Bengali - { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi - { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati - { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya - { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil - { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu - { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada - { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam - { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai - { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao - { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian - { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese - { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo - { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional - { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended - { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation - { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts - { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol - { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols - { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols - { 'begin': 0x2150, 'end': 0x218F }, // Number Forms - { 'begin': 0x2190, 'end': 0x21FF }, // Arrows - { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators - { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical - { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures - { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition - { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics - { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing - { 'begin': 0x2580, 'end': 0x259F }, // Block Elements - { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes - { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols - { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats - { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation - { 'begin': 0x3040, 'end': 0x309F }, // Hiragana - { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana - { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo - { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo - { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa - { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months - { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility - { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables - { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 * - { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia - { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs - { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0) - { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes - { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms - { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A - { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks - { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms - { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants - { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B - { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms - { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials - { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan - { 'begin': 0x0700, 'end': 0x074F }, // Syriac - { 'begin': 0x0780, 'end': 0x07BF }, // Thaana - { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala - { 'begin': 0x1000, 'end': 0x109F }, // Myanmar - { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic - { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee - { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics - { 'begin': 0x1680, 'end': 0x169F }, // Ogham - { 'begin': 0x16A0, 'end': 0x16FF }, // Runic - { 'begin': 0x1780, 'end': 0x17FF }, // Khmer - { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian - { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns - { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables - { 'begin': 0x1700, 'end': 0x171F }, // Tagalog - { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic - { 'begin': 0x10330, 'end': 0x1034F }, // Gothic - { 'begin': 0x10400, 'end': 0x1044F }, // Deseret - { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols - { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols - { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15) - { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors - { 'begin': 0xE0000, 'end': 0xE007F }, // Tags - { 'begin': 0x1900, 'end': 0x194F }, // Limbu - { 'begin': 0x1950, 'end': 0x197F }, // Tai Le - { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue - { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese - { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic - { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh - { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols - { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri - { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary - { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers - { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic - { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian - { 'begin': 0x10450, 'end': 0x1047F }, // Shavian - { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya - { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary - { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi - { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols - { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform - { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals - { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese - { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha - { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki - { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra - { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li - { 'begin': 0xA930, 'end': 0xA95F }, // Rejang - { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham - { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols - { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc - { 'begin': 0x102A0, 'end': 0x102DF }, // Carian - { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles -]; - -var MacStandardGlyphOrdering = [ - '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', - 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', - 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', - 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', - 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', - 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', - 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', - 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', - 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', - 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', - 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', - 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', - 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', - 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', - 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', - 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', - 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', - 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', - 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', - 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', - 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', - 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', - 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', - 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', - 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', - 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', - 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', - 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', - 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', - 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', - 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', - 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', - 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', - 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', - 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat']; - -function getUnicodeRangeFor(value) { - for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) { - var range = UnicodeRanges[i]; - if (value >= range.begin && value < range.end) { - return i; - } - } - return -1; -} - -function isRTLRangeFor(value) { - var range = UnicodeRanges[13]; - if (value >= range.begin && value < range.end) { - return true; - } - range = UnicodeRanges[11]; - if (value >= range.begin && value < range.end) { - return true; - } - return false; -} - -// The normalization table is obtained by filtering the Unicode characters -// database with entries. -var NormalizedUnicodes = { - '\u00A8': '\u0020\u0308', - '\u00AF': '\u0020\u0304', - '\u00B4': '\u0020\u0301', - '\u00B5': '\u03BC', - '\u00B8': '\u0020\u0327', - '\u0132': '\u0049\u004A', - '\u0133': '\u0069\u006A', - '\u013F': '\u004C\u00B7', - '\u0140': '\u006C\u00B7', - '\u0149': '\u02BC\u006E', - '\u017F': '\u0073', - '\u01C4': '\u0044\u017D', - '\u01C5': '\u0044\u017E', - '\u01C6': '\u0064\u017E', - '\u01C7': '\u004C\u004A', - '\u01C8': '\u004C\u006A', - '\u01C9': '\u006C\u006A', - '\u01CA': '\u004E\u004A', - '\u01CB': '\u004E\u006A', - '\u01CC': '\u006E\u006A', - '\u01F1': '\u0044\u005A', - '\u01F2': '\u0044\u007A', - '\u01F3': '\u0064\u007A', - '\u02D8': '\u0020\u0306', - '\u02D9': '\u0020\u0307', - '\u02DA': '\u0020\u030A', - '\u02DB': '\u0020\u0328', - '\u02DC': '\u0020\u0303', - '\u02DD': '\u0020\u030B', - '\u037A': '\u0020\u0345', - '\u0384': '\u0020\u0301', - '\u03D0': '\u03B2', - '\u03D1': '\u03B8', - '\u03D2': '\u03A5', - '\u03D5': '\u03C6', - '\u03D6': '\u03C0', - '\u03F0': '\u03BA', - '\u03F1': '\u03C1', - '\u03F2': '\u03C2', - '\u03F4': '\u0398', - '\u03F5': '\u03B5', - '\u03F9': '\u03A3', - '\u0587': '\u0565\u0582', - '\u0675': '\u0627\u0674', - '\u0676': '\u0648\u0674', - '\u0677': '\u06C7\u0674', - '\u0678': '\u064A\u0674', - '\u0E33': '\u0E4D\u0E32', - '\u0EB3': '\u0ECD\u0EB2', - '\u0EDC': '\u0EAB\u0E99', - '\u0EDD': '\u0EAB\u0EA1', - '\u0F77': '\u0FB2\u0F81', - '\u0F79': '\u0FB3\u0F81', - '\u1E9A': '\u0061\u02BE', - '\u1FBD': '\u0020\u0313', - '\u1FBF': '\u0020\u0313', - '\u1FC0': '\u0020\u0342', - '\u1FFE': '\u0020\u0314', - '\u2002': '\u0020', - '\u2003': '\u0020', - '\u2004': '\u0020', - '\u2005': '\u0020', - '\u2006': '\u0020', - '\u2008': '\u0020', - '\u2009': '\u0020', - '\u200A': '\u0020', - '\u2017': '\u0020\u0333', - '\u2024': '\u002E', - '\u2025': '\u002E\u002E', - '\u2026': '\u002E\u002E\u002E', - '\u2033': '\u2032\u2032', - '\u2034': '\u2032\u2032\u2032', - '\u2036': '\u2035\u2035', - '\u2037': '\u2035\u2035\u2035', - '\u203C': '\u0021\u0021', - '\u203E': '\u0020\u0305', - '\u2047': '\u003F\u003F', - '\u2048': '\u003F\u0021', - '\u2049': '\u0021\u003F', - '\u2057': '\u2032\u2032\u2032\u2032', - '\u205F': '\u0020', - '\u20A8': '\u0052\u0073', - '\u2100': '\u0061\u002F\u0063', - '\u2101': '\u0061\u002F\u0073', - '\u2103': '\u00B0\u0043', - '\u2105': '\u0063\u002F\u006F', - '\u2106': '\u0063\u002F\u0075', - '\u2107': '\u0190', - '\u2109': '\u00B0\u0046', - '\u2116': '\u004E\u006F', - '\u2121': '\u0054\u0045\u004C', - '\u2135': '\u05D0', - '\u2136': '\u05D1', - '\u2137': '\u05D2', - '\u2138': '\u05D3', - '\u213B': '\u0046\u0041\u0058', - '\u2160': '\u0049', - '\u2161': '\u0049\u0049', - '\u2162': '\u0049\u0049\u0049', - '\u2163': '\u0049\u0056', - '\u2164': '\u0056', - '\u2165': '\u0056\u0049', - '\u2166': '\u0056\u0049\u0049', - '\u2167': '\u0056\u0049\u0049\u0049', - '\u2168': '\u0049\u0058', - '\u2169': '\u0058', - '\u216A': '\u0058\u0049', - '\u216B': '\u0058\u0049\u0049', - '\u216C': '\u004C', - '\u216D': '\u0043', - '\u216E': '\u0044', - '\u216F': '\u004D', - '\u2170': '\u0069', - '\u2171': '\u0069\u0069', - '\u2172': '\u0069\u0069\u0069', - '\u2173': '\u0069\u0076', - '\u2174': '\u0076', - '\u2175': '\u0076\u0069', - '\u2176': '\u0076\u0069\u0069', - '\u2177': '\u0076\u0069\u0069\u0069', - '\u2178': '\u0069\u0078', - '\u2179': '\u0078', - '\u217A': '\u0078\u0069', - '\u217B': '\u0078\u0069\u0069', - '\u217C': '\u006C', - '\u217D': '\u0063', - '\u217E': '\u0064', - '\u217F': '\u006D', - '\u222C': '\u222B\u222B', - '\u222D': '\u222B\u222B\u222B', - '\u222F': '\u222E\u222E', - '\u2230': '\u222E\u222E\u222E', - '\u2474': '\u0028\u0031\u0029', - '\u2475': '\u0028\u0032\u0029', - '\u2476': '\u0028\u0033\u0029', - '\u2477': '\u0028\u0034\u0029', - '\u2478': '\u0028\u0035\u0029', - '\u2479': '\u0028\u0036\u0029', - '\u247A': '\u0028\u0037\u0029', - '\u247B': '\u0028\u0038\u0029', - '\u247C': '\u0028\u0039\u0029', - '\u247D': '\u0028\u0031\u0030\u0029', - '\u247E': '\u0028\u0031\u0031\u0029', - '\u247F': '\u0028\u0031\u0032\u0029', - '\u2480': '\u0028\u0031\u0033\u0029', - '\u2481': '\u0028\u0031\u0034\u0029', - '\u2482': '\u0028\u0031\u0035\u0029', - '\u2483': '\u0028\u0031\u0036\u0029', - '\u2484': '\u0028\u0031\u0037\u0029', - '\u2485': '\u0028\u0031\u0038\u0029', - '\u2486': '\u0028\u0031\u0039\u0029', - '\u2487': '\u0028\u0032\u0030\u0029', - '\u2488': '\u0031\u002E', - '\u2489': '\u0032\u002E', - '\u248A': '\u0033\u002E', - '\u248B': '\u0034\u002E', - '\u248C': '\u0035\u002E', - '\u248D': '\u0036\u002E', - '\u248E': '\u0037\u002E', - '\u248F': '\u0038\u002E', - '\u2490': '\u0039\u002E', - '\u2491': '\u0031\u0030\u002E', - '\u2492': '\u0031\u0031\u002E', - '\u2493': '\u0031\u0032\u002E', - '\u2494': '\u0031\u0033\u002E', - '\u2495': '\u0031\u0034\u002E', - '\u2496': '\u0031\u0035\u002E', - '\u2497': '\u0031\u0036\u002E', - '\u2498': '\u0031\u0037\u002E', - '\u2499': '\u0031\u0038\u002E', - '\u249A': '\u0031\u0039\u002E', - '\u249B': '\u0032\u0030\u002E', - '\u249C': '\u0028\u0061\u0029', - '\u249D': '\u0028\u0062\u0029', - '\u249E': '\u0028\u0063\u0029', - '\u249F': '\u0028\u0064\u0029', - '\u24A0': '\u0028\u0065\u0029', - '\u24A1': '\u0028\u0066\u0029', - '\u24A2': '\u0028\u0067\u0029', - '\u24A3': '\u0028\u0068\u0029', - '\u24A4': '\u0028\u0069\u0029', - '\u24A5': '\u0028\u006A\u0029', - '\u24A6': '\u0028\u006B\u0029', - '\u24A7': '\u0028\u006C\u0029', - '\u24A8': '\u0028\u006D\u0029', - '\u24A9': '\u0028\u006E\u0029', - '\u24AA': '\u0028\u006F\u0029', - '\u24AB': '\u0028\u0070\u0029', - '\u24AC': '\u0028\u0071\u0029', - '\u24AD': '\u0028\u0072\u0029', - '\u24AE': '\u0028\u0073\u0029', - '\u24AF': '\u0028\u0074\u0029', - '\u24B0': '\u0028\u0075\u0029', - '\u24B1': '\u0028\u0076\u0029', - '\u24B2': '\u0028\u0077\u0029', - '\u24B3': '\u0028\u0078\u0029', - '\u24B4': '\u0028\u0079\u0029', - '\u24B5': '\u0028\u007A\u0029', - '\u2A0C': '\u222B\u222B\u222B\u222B', - '\u2A74': '\u003A\u003A\u003D', - '\u2A75': '\u003D\u003D', - '\u2A76': '\u003D\u003D\u003D', - '\u2E9F': '\u6BCD', - '\u2EF3': '\u9F9F', - '\u2F00': '\u4E00', - '\u2F01': '\u4E28', - '\u2F02': '\u4E36', - '\u2F03': '\u4E3F', - '\u2F04': '\u4E59', - '\u2F05': '\u4E85', - '\u2F06': '\u4E8C', - '\u2F07': '\u4EA0', - '\u2F08': '\u4EBA', - '\u2F09': '\u513F', - '\u2F0A': '\u5165', - '\u2F0B': '\u516B', - '\u2F0C': '\u5182', - '\u2F0D': '\u5196', - '\u2F0E': '\u51AB', - '\u2F0F': '\u51E0', - '\u2F10': '\u51F5', - '\u2F11': '\u5200', - '\u2F12': '\u529B', - '\u2F13': '\u52F9', - '\u2F14': '\u5315', - '\u2F15': '\u531A', - '\u2F16': '\u5338', - '\u2F17': '\u5341', - '\u2F18': '\u535C', - '\u2F19': '\u5369', - '\u2F1A': '\u5382', - '\u2F1B': '\u53B6', - '\u2F1C': '\u53C8', - '\u2F1D': '\u53E3', - '\u2F1E': '\u56D7', - '\u2F1F': '\u571F', - '\u2F20': '\u58EB', - '\u2F21': '\u5902', - '\u2F22': '\u590A', - '\u2F23': '\u5915', - '\u2F24': '\u5927', - '\u2F25': '\u5973', - '\u2F26': '\u5B50', - '\u2F27': '\u5B80', - '\u2F28': '\u5BF8', - '\u2F29': '\u5C0F', - '\u2F2A': '\u5C22', - '\u2F2B': '\u5C38', - '\u2F2C': '\u5C6E', - '\u2F2D': '\u5C71', - '\u2F2E': '\u5DDB', - '\u2F2F': '\u5DE5', - '\u2F30': '\u5DF1', - '\u2F31': '\u5DFE', - '\u2F32': '\u5E72', - '\u2F33': '\u5E7A', - '\u2F34': '\u5E7F', - '\u2F35': '\u5EF4', - '\u2F36': '\u5EFE', - '\u2F37': '\u5F0B', - '\u2F38': '\u5F13', - '\u2F39': '\u5F50', - '\u2F3A': '\u5F61', - '\u2F3B': '\u5F73', - '\u2F3C': '\u5FC3', - '\u2F3D': '\u6208', - '\u2F3E': '\u6236', - '\u2F3F': '\u624B', - '\u2F40': '\u652F', - '\u2F41': '\u6534', - '\u2F42': '\u6587', - '\u2F43': '\u6597', - '\u2F44': '\u65A4', - '\u2F45': '\u65B9', - '\u2F46': '\u65E0', - '\u2F47': '\u65E5', - '\u2F48': '\u66F0', - '\u2F49': '\u6708', - '\u2F4A': '\u6728', - '\u2F4B': '\u6B20', - '\u2F4C': '\u6B62', - '\u2F4D': '\u6B79', - '\u2F4E': '\u6BB3', - '\u2F4F': '\u6BCB', - '\u2F50': '\u6BD4', - '\u2F51': '\u6BDB', - '\u2F52': '\u6C0F', - '\u2F53': '\u6C14', - '\u2F54': '\u6C34', - '\u2F55': '\u706B', - '\u2F56': '\u722A', - '\u2F57': '\u7236', - '\u2F58': '\u723B', - '\u2F59': '\u723F', - '\u2F5A': '\u7247', - '\u2F5B': '\u7259', - '\u2F5C': '\u725B', - '\u2F5D': '\u72AC', - '\u2F5E': '\u7384', - '\u2F5F': '\u7389', - '\u2F60': '\u74DC', - '\u2F61': '\u74E6', - '\u2F62': '\u7518', - '\u2F63': '\u751F', - '\u2F64': '\u7528', - '\u2F65': '\u7530', - '\u2F66': '\u758B', - '\u2F67': '\u7592', - '\u2F68': '\u7676', - '\u2F69': '\u767D', - '\u2F6A': '\u76AE', - '\u2F6B': '\u76BF', - '\u2F6C': '\u76EE', - '\u2F6D': '\u77DB', - '\u2F6E': '\u77E2', - '\u2F6F': '\u77F3', - '\u2F70': '\u793A', - '\u2F71': '\u79B8', - '\u2F72': '\u79BE', - '\u2F73': '\u7A74', - '\u2F74': '\u7ACB', - '\u2F75': '\u7AF9', - '\u2F76': '\u7C73', - '\u2F77': '\u7CF8', - '\u2F78': '\u7F36', - '\u2F79': '\u7F51', - '\u2F7A': '\u7F8A', - '\u2F7B': '\u7FBD', - '\u2F7C': '\u8001', - '\u2F7D': '\u800C', - '\u2F7E': '\u8012', - '\u2F7F': '\u8033', - '\u2F80': '\u807F', - '\u2F81': '\u8089', - '\u2F82': '\u81E3', - '\u2F83': '\u81EA', - '\u2F84': '\u81F3', - '\u2F85': '\u81FC', - '\u2F86': '\u820C', - '\u2F87': '\u821B', - '\u2F88': '\u821F', - '\u2F89': '\u826E', - '\u2F8A': '\u8272', - '\u2F8B': '\u8278', - '\u2F8C': '\u864D', - '\u2F8D': '\u866B', - '\u2F8E': '\u8840', - '\u2F8F': '\u884C', - '\u2F90': '\u8863', - '\u2F91': '\u897E', - '\u2F92': '\u898B', - '\u2F93': '\u89D2', - '\u2F94': '\u8A00', - '\u2F95': '\u8C37', - '\u2F96': '\u8C46', - '\u2F97': '\u8C55', - '\u2F98': '\u8C78', - '\u2F99': '\u8C9D', - '\u2F9A': '\u8D64', - '\u2F9B': '\u8D70', - '\u2F9C': '\u8DB3', - '\u2F9D': '\u8EAB', - '\u2F9E': '\u8ECA', - '\u2F9F': '\u8F9B', - '\u2FA0': '\u8FB0', - '\u2FA1': '\u8FB5', - '\u2FA2': '\u9091', - '\u2FA3': '\u9149', - '\u2FA4': '\u91C6', - '\u2FA5': '\u91CC', - '\u2FA6': '\u91D1', - '\u2FA7': '\u9577', - '\u2FA8': '\u9580', - '\u2FA9': '\u961C', - '\u2FAA': '\u96B6', - '\u2FAB': '\u96B9', - '\u2FAC': '\u96E8', - '\u2FAD': '\u9751', - '\u2FAE': '\u975E', - '\u2FAF': '\u9762', - '\u2FB0': '\u9769', - '\u2FB1': '\u97CB', - '\u2FB2': '\u97ED', - '\u2FB3': '\u97F3', - '\u2FB4': '\u9801', - '\u2FB5': '\u98A8', - '\u2FB6': '\u98DB', - '\u2FB7': '\u98DF', - '\u2FB8': '\u9996', - '\u2FB9': '\u9999', - '\u2FBA': '\u99AC', - '\u2FBB': '\u9AA8', - '\u2FBC': '\u9AD8', - '\u2FBD': '\u9ADF', - '\u2FBE': '\u9B25', - '\u2FBF': '\u9B2F', - '\u2FC0': '\u9B32', - '\u2FC1': '\u9B3C', - '\u2FC2': '\u9B5A', - '\u2FC3': '\u9CE5', - '\u2FC4': '\u9E75', - '\u2FC5': '\u9E7F', - '\u2FC6': '\u9EA5', - '\u2FC7': '\u9EBB', - '\u2FC8': '\u9EC3', - '\u2FC9': '\u9ECD', - '\u2FCA': '\u9ED1', - '\u2FCB': '\u9EF9', - '\u2FCC': '\u9EFD', - '\u2FCD': '\u9F0E', - '\u2FCE': '\u9F13', - '\u2FCF': '\u9F20', - '\u2FD0': '\u9F3B', - '\u2FD1': '\u9F4A', - '\u2FD2': '\u9F52', - '\u2FD3': '\u9F8D', - '\u2FD4': '\u9F9C', - '\u2FD5': '\u9FA0', - '\u3036': '\u3012', - '\u3038': '\u5341', - '\u3039': '\u5344', - '\u303A': '\u5345', - '\u309B': '\u0020\u3099', - '\u309C': '\u0020\u309A', - '\u3131': '\u1100', - '\u3132': '\u1101', - '\u3133': '\u11AA', - '\u3134': '\u1102', - '\u3135': '\u11AC', - '\u3136': '\u11AD', - '\u3137': '\u1103', - '\u3138': '\u1104', - '\u3139': '\u1105', - '\u313A': '\u11B0', - '\u313B': '\u11B1', - '\u313C': '\u11B2', - '\u313D': '\u11B3', - '\u313E': '\u11B4', - '\u313F': '\u11B5', - '\u3140': '\u111A', - '\u3141': '\u1106', - '\u3142': '\u1107', - '\u3143': '\u1108', - '\u3144': '\u1121', - '\u3145': '\u1109', - '\u3146': '\u110A', - '\u3147': '\u110B', - '\u3148': '\u110C', - '\u3149': '\u110D', - '\u314A': '\u110E', - '\u314B': '\u110F', - '\u314C': '\u1110', - '\u314D': '\u1111', - '\u314E': '\u1112', - '\u314F': '\u1161', - '\u3150': '\u1162', - '\u3151': '\u1163', - '\u3152': '\u1164', - '\u3153': '\u1165', - '\u3154': '\u1166', - '\u3155': '\u1167', - '\u3156': '\u1168', - '\u3157': '\u1169', - '\u3158': '\u116A', - '\u3159': '\u116B', - '\u315A': '\u116C', - '\u315B': '\u116D', - '\u315C': '\u116E', - '\u315D': '\u116F', - '\u315E': '\u1170', - '\u315F': '\u1171', - '\u3160': '\u1172', - '\u3161': '\u1173', - '\u3162': '\u1174', - '\u3163': '\u1175', - '\u3164': '\u1160', - '\u3165': '\u1114', - '\u3166': '\u1115', - '\u3167': '\u11C7', - '\u3168': '\u11C8', - '\u3169': '\u11CC', - '\u316A': '\u11CE', - '\u316B': '\u11D3', - '\u316C': '\u11D7', - '\u316D': '\u11D9', - '\u316E': '\u111C', - '\u316F': '\u11DD', - '\u3170': '\u11DF', - '\u3171': '\u111D', - '\u3172': '\u111E', - '\u3173': '\u1120', - '\u3174': '\u1122', - '\u3175': '\u1123', - '\u3176': '\u1127', - '\u3177': '\u1129', - '\u3178': '\u112B', - '\u3179': '\u112C', - '\u317A': '\u112D', - '\u317B': '\u112E', - '\u317C': '\u112F', - '\u317D': '\u1132', - '\u317E': '\u1136', - '\u317F': '\u1140', - '\u3180': '\u1147', - '\u3181': '\u114C', - '\u3182': '\u11F1', - '\u3183': '\u11F2', - '\u3184': '\u1157', - '\u3185': '\u1158', - '\u3186': '\u1159', - '\u3187': '\u1184', - '\u3188': '\u1185', - '\u3189': '\u1188', - '\u318A': '\u1191', - '\u318B': '\u1192', - '\u318C': '\u1194', - '\u318D': '\u119E', - '\u318E': '\u11A1', - '\u3200': '\u0028\u1100\u0029', - '\u3201': '\u0028\u1102\u0029', - '\u3202': '\u0028\u1103\u0029', - '\u3203': '\u0028\u1105\u0029', - '\u3204': '\u0028\u1106\u0029', - '\u3205': '\u0028\u1107\u0029', - '\u3206': '\u0028\u1109\u0029', - '\u3207': '\u0028\u110B\u0029', - '\u3208': '\u0028\u110C\u0029', - '\u3209': '\u0028\u110E\u0029', - '\u320A': '\u0028\u110F\u0029', - '\u320B': '\u0028\u1110\u0029', - '\u320C': '\u0028\u1111\u0029', - '\u320D': '\u0028\u1112\u0029', - '\u320E': '\u0028\u1100\u1161\u0029', - '\u320F': '\u0028\u1102\u1161\u0029', - '\u3210': '\u0028\u1103\u1161\u0029', - '\u3211': '\u0028\u1105\u1161\u0029', - '\u3212': '\u0028\u1106\u1161\u0029', - '\u3213': '\u0028\u1107\u1161\u0029', - '\u3214': '\u0028\u1109\u1161\u0029', - '\u3215': '\u0028\u110B\u1161\u0029', - '\u3216': '\u0028\u110C\u1161\u0029', - '\u3217': '\u0028\u110E\u1161\u0029', - '\u3218': '\u0028\u110F\u1161\u0029', - '\u3219': '\u0028\u1110\u1161\u0029', - '\u321A': '\u0028\u1111\u1161\u0029', - '\u321B': '\u0028\u1112\u1161\u0029', - '\u321C': '\u0028\u110C\u116E\u0029', - '\u321D': '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029', - '\u321E': '\u0028\u110B\u1169\u1112\u116E\u0029', - '\u3220': '\u0028\u4E00\u0029', - '\u3221': '\u0028\u4E8C\u0029', - '\u3222': '\u0028\u4E09\u0029', - '\u3223': '\u0028\u56DB\u0029', - '\u3224': '\u0028\u4E94\u0029', - '\u3225': '\u0028\u516D\u0029', - '\u3226': '\u0028\u4E03\u0029', - '\u3227': '\u0028\u516B\u0029', - '\u3228': '\u0028\u4E5D\u0029', - '\u3229': '\u0028\u5341\u0029', - '\u322A': '\u0028\u6708\u0029', - '\u322B': '\u0028\u706B\u0029', - '\u322C': '\u0028\u6C34\u0029', - '\u322D': '\u0028\u6728\u0029', - '\u322E': '\u0028\u91D1\u0029', - '\u322F': '\u0028\u571F\u0029', - '\u3230': '\u0028\u65E5\u0029', - '\u3231': '\u0028\u682A\u0029', - '\u3232': '\u0028\u6709\u0029', - '\u3233': '\u0028\u793E\u0029', - '\u3234': '\u0028\u540D\u0029', - '\u3235': '\u0028\u7279\u0029', - '\u3236': '\u0028\u8CA1\u0029', - '\u3237': '\u0028\u795D\u0029', - '\u3238': '\u0028\u52B4\u0029', - '\u3239': '\u0028\u4EE3\u0029', - '\u323A': '\u0028\u547C\u0029', - '\u323B': '\u0028\u5B66\u0029', - '\u323C': '\u0028\u76E3\u0029', - '\u323D': '\u0028\u4F01\u0029', - '\u323E': '\u0028\u8CC7\u0029', - '\u323F': '\u0028\u5354\u0029', - '\u3240': '\u0028\u796D\u0029', - '\u3241': '\u0028\u4F11\u0029', - '\u3242': '\u0028\u81EA\u0029', - '\u3243': '\u0028\u81F3\u0029', - '\u32C0': '\u0031\u6708', - '\u32C1': '\u0032\u6708', - '\u32C2': '\u0033\u6708', - '\u32C3': '\u0034\u6708', - '\u32C4': '\u0035\u6708', - '\u32C5': '\u0036\u6708', - '\u32C6': '\u0037\u6708', - '\u32C7': '\u0038\u6708', - '\u32C8': '\u0039\u6708', - '\u32C9': '\u0031\u0030\u6708', - '\u32CA': '\u0031\u0031\u6708', - '\u32CB': '\u0031\u0032\u6708', - '\u3358': '\u0030\u70B9', - '\u3359': '\u0031\u70B9', - '\u335A': '\u0032\u70B9', - '\u335B': '\u0033\u70B9', - '\u335C': '\u0034\u70B9', - '\u335D': '\u0035\u70B9', - '\u335E': '\u0036\u70B9', - '\u335F': '\u0037\u70B9', - '\u3360': '\u0038\u70B9', - '\u3361': '\u0039\u70B9', - '\u3362': '\u0031\u0030\u70B9', - '\u3363': '\u0031\u0031\u70B9', - '\u3364': '\u0031\u0032\u70B9', - '\u3365': '\u0031\u0033\u70B9', - '\u3366': '\u0031\u0034\u70B9', - '\u3367': '\u0031\u0035\u70B9', - '\u3368': '\u0031\u0036\u70B9', - '\u3369': '\u0031\u0037\u70B9', - '\u336A': '\u0031\u0038\u70B9', - '\u336B': '\u0031\u0039\u70B9', - '\u336C': '\u0032\u0030\u70B9', - '\u336D': '\u0032\u0031\u70B9', - '\u336E': '\u0032\u0032\u70B9', - '\u336F': '\u0032\u0033\u70B9', - '\u3370': '\u0032\u0034\u70B9', - '\u33E0': '\u0031\u65E5', - '\u33E1': '\u0032\u65E5', - '\u33E2': '\u0033\u65E5', - '\u33E3': '\u0034\u65E5', - '\u33E4': '\u0035\u65E5', - '\u33E5': '\u0036\u65E5', - '\u33E6': '\u0037\u65E5', - '\u33E7': '\u0038\u65E5', - '\u33E8': '\u0039\u65E5', - '\u33E9': '\u0031\u0030\u65E5', - '\u33EA': '\u0031\u0031\u65E5', - '\u33EB': '\u0031\u0032\u65E5', - '\u33EC': '\u0031\u0033\u65E5', - '\u33ED': '\u0031\u0034\u65E5', - '\u33EE': '\u0031\u0035\u65E5', - '\u33EF': '\u0031\u0036\u65E5', - '\u33F0': '\u0031\u0037\u65E5', - '\u33F1': '\u0031\u0038\u65E5', - '\u33F2': '\u0031\u0039\u65E5', - '\u33F3': '\u0032\u0030\u65E5', - '\u33F4': '\u0032\u0031\u65E5', - '\u33F5': '\u0032\u0032\u65E5', - '\u33F6': '\u0032\u0033\u65E5', - '\u33F7': '\u0032\u0034\u65E5', - '\u33F8': '\u0032\u0035\u65E5', - '\u33F9': '\u0032\u0036\u65E5', - '\u33FA': '\u0032\u0037\u65E5', - '\u33FB': '\u0032\u0038\u65E5', - '\u33FC': '\u0032\u0039\u65E5', - '\u33FD': '\u0033\u0030\u65E5', - '\u33FE': '\u0033\u0031\u65E5', - '\uFB00': '\u0066\u0066', - '\uFB01': '\u0066\u0069', - '\uFB02': '\u0066\u006C', - '\uFB03': '\u0066\u0066\u0069', - '\uFB04': '\u0066\u0066\u006C', - '\uFB05': '\u017F\u0074', - '\uFB06': '\u0073\u0074', - '\uFB13': '\u0574\u0576', - '\uFB14': '\u0574\u0565', - '\uFB15': '\u0574\u056B', - '\uFB16': '\u057E\u0576', - '\uFB17': '\u0574\u056D', - '\uFB4F': '\u05D0\u05DC', - '\uFB50': '\u0671', - '\uFB51': '\u0671', - '\uFB52': '\u067B', - '\uFB53': '\u067B', - '\uFB54': '\u067B', - '\uFB55': '\u067B', - '\uFB56': '\u067E', - '\uFB57': '\u067E', - '\uFB58': '\u067E', - '\uFB59': '\u067E', - '\uFB5A': '\u0680', - '\uFB5B': '\u0680', - '\uFB5C': '\u0680', - '\uFB5D': '\u0680', - '\uFB5E': '\u067A', - '\uFB5F': '\u067A', - '\uFB60': '\u067A', - '\uFB61': '\u067A', - '\uFB62': '\u067F', - '\uFB63': '\u067F', - '\uFB64': '\u067F', - '\uFB65': '\u067F', - '\uFB66': '\u0679', - '\uFB67': '\u0679', - '\uFB68': '\u0679', - '\uFB69': '\u0679', - '\uFB6A': '\u06A4', - '\uFB6B': '\u06A4', - '\uFB6C': '\u06A4', - '\uFB6D': '\u06A4', - '\uFB6E': '\u06A6', - '\uFB6F': '\u06A6', - '\uFB70': '\u06A6', - '\uFB71': '\u06A6', - '\uFB72': '\u0684', - '\uFB73': '\u0684', - '\uFB74': '\u0684', - '\uFB75': '\u0684', - '\uFB76': '\u0683', - '\uFB77': '\u0683', - '\uFB78': '\u0683', - '\uFB79': '\u0683', - '\uFB7A': '\u0686', - '\uFB7B': '\u0686', - '\uFB7C': '\u0686', - '\uFB7D': '\u0686', - '\uFB7E': '\u0687', - '\uFB7F': '\u0687', - '\uFB80': '\u0687', - '\uFB81': '\u0687', - '\uFB82': '\u068D', - '\uFB83': '\u068D', - '\uFB84': '\u068C', - '\uFB85': '\u068C', - '\uFB86': '\u068E', - '\uFB87': '\u068E', - '\uFB88': '\u0688', - '\uFB89': '\u0688', - '\uFB8A': '\u0698', - '\uFB8B': '\u0698', - '\uFB8C': '\u0691', - '\uFB8D': '\u0691', - '\uFB8E': '\u06A9', - '\uFB8F': '\u06A9', - '\uFB90': '\u06A9', - '\uFB91': '\u06A9', - '\uFB92': '\u06AF', - '\uFB93': '\u06AF', - '\uFB94': '\u06AF', - '\uFB95': '\u06AF', - '\uFB96': '\u06B3', - '\uFB97': '\u06B3', - '\uFB98': '\u06B3', - '\uFB99': '\u06B3', - '\uFB9A': '\u06B1', - '\uFB9B': '\u06B1', - '\uFB9C': '\u06B1', - '\uFB9D': '\u06B1', - '\uFB9E': '\u06BA', - '\uFB9F': '\u06BA', - '\uFBA0': '\u06BB', - '\uFBA1': '\u06BB', - '\uFBA2': '\u06BB', - '\uFBA3': '\u06BB', - '\uFBA4': '\u06C0', - '\uFBA5': '\u06C0', - '\uFBA6': '\u06C1', - '\uFBA7': '\u06C1', - '\uFBA8': '\u06C1', - '\uFBA9': '\u06C1', - '\uFBAA': '\u06BE', - '\uFBAB': '\u06BE', - '\uFBAC': '\u06BE', - '\uFBAD': '\u06BE', - '\uFBAE': '\u06D2', - '\uFBAF': '\u06D2', - '\uFBB0': '\u06D3', - '\uFBB1': '\u06D3', - '\uFBD3': '\u06AD', - '\uFBD4': '\u06AD', - '\uFBD5': '\u06AD', - '\uFBD6': '\u06AD', - '\uFBD7': '\u06C7', - '\uFBD8': '\u06C7', - '\uFBD9': '\u06C6', - '\uFBDA': '\u06C6', - '\uFBDB': '\u06C8', - '\uFBDC': '\u06C8', - '\uFBDD': '\u0677', - '\uFBDE': '\u06CB', - '\uFBDF': '\u06CB', - '\uFBE0': '\u06C5', - '\uFBE1': '\u06C5', - '\uFBE2': '\u06C9', - '\uFBE3': '\u06C9', - '\uFBE4': '\u06D0', - '\uFBE5': '\u06D0', - '\uFBE6': '\u06D0', - '\uFBE7': '\u06D0', - '\uFBE8': '\u0649', - '\uFBE9': '\u0649', - '\uFBEA': '\u0626\u0627', - '\uFBEB': '\u0626\u0627', - '\uFBEC': '\u0626\u06D5', - '\uFBED': '\u0626\u06D5', - '\uFBEE': '\u0626\u0648', - '\uFBEF': '\u0626\u0648', - '\uFBF0': '\u0626\u06C7', - '\uFBF1': '\u0626\u06C7', - '\uFBF2': '\u0626\u06C6', - '\uFBF3': '\u0626\u06C6', - '\uFBF4': '\u0626\u06C8', - '\uFBF5': '\u0626\u06C8', - '\uFBF6': '\u0626\u06D0', - '\uFBF7': '\u0626\u06D0', - '\uFBF8': '\u0626\u06D0', - '\uFBF9': '\u0626\u0649', - '\uFBFA': '\u0626\u0649', - '\uFBFB': '\u0626\u0649', - '\uFBFC': '\u06CC', - '\uFBFD': '\u06CC', - '\uFBFE': '\u06CC', - '\uFBFF': '\u06CC', - '\uFC00': '\u0626\u062C', - '\uFC01': '\u0626\u062D', - '\uFC02': '\u0626\u0645', - '\uFC03': '\u0626\u0649', - '\uFC04': '\u0626\u064A', - '\uFC05': '\u0628\u062C', - '\uFC06': '\u0628\u062D', - '\uFC07': '\u0628\u062E', - '\uFC08': '\u0628\u0645', - '\uFC09': '\u0628\u0649', - '\uFC0A': '\u0628\u064A', - '\uFC0B': '\u062A\u062C', - '\uFC0C': '\u062A\u062D', - '\uFC0D': '\u062A\u062E', - '\uFC0E': '\u062A\u0645', - '\uFC0F': '\u062A\u0649', - '\uFC10': '\u062A\u064A', - '\uFC11': '\u062B\u062C', - '\uFC12': '\u062B\u0645', - '\uFC13': '\u062B\u0649', - '\uFC14': '\u062B\u064A', - '\uFC15': '\u062C\u062D', - '\uFC16': '\u062C\u0645', - '\uFC17': '\u062D\u062C', - '\uFC18': '\u062D\u0645', - '\uFC19': '\u062E\u062C', - '\uFC1A': '\u062E\u062D', - '\uFC1B': '\u062E\u0645', - '\uFC1C': '\u0633\u062C', - '\uFC1D': '\u0633\u062D', - '\uFC1E': '\u0633\u062E', - '\uFC1F': '\u0633\u0645', - '\uFC20': '\u0635\u062D', - '\uFC21': '\u0635\u0645', - '\uFC22': '\u0636\u062C', - '\uFC23': '\u0636\u062D', - '\uFC24': '\u0636\u062E', - '\uFC25': '\u0636\u0645', - '\uFC26': '\u0637\u062D', - '\uFC27': '\u0637\u0645', - '\uFC28': '\u0638\u0645', - '\uFC29': '\u0639\u062C', - '\uFC2A': '\u0639\u0645', - '\uFC2B': '\u063A\u062C', - '\uFC2C': '\u063A\u0645', - '\uFC2D': '\u0641\u062C', - '\uFC2E': '\u0641\u062D', - '\uFC2F': '\u0641\u062E', - '\uFC30': '\u0641\u0645', - '\uFC31': '\u0641\u0649', - '\uFC32': '\u0641\u064A', - '\uFC33': '\u0642\u062D', - '\uFC34': '\u0642\u0645', - '\uFC35': '\u0642\u0649', - '\uFC36': '\u0642\u064A', - '\uFC37': '\u0643\u0627', - '\uFC38': '\u0643\u062C', - '\uFC39': '\u0643\u062D', - '\uFC3A': '\u0643\u062E', - '\uFC3B': '\u0643\u0644', - '\uFC3C': '\u0643\u0645', - '\uFC3D': '\u0643\u0649', - '\uFC3E': '\u0643\u064A', - '\uFC3F': '\u0644\u062C', - '\uFC40': '\u0644\u062D', - '\uFC41': '\u0644\u062E', - '\uFC42': '\u0644\u0645', - '\uFC43': '\u0644\u0649', - '\uFC44': '\u0644\u064A', - '\uFC45': '\u0645\u062C', - '\uFC46': '\u0645\u062D', - '\uFC47': '\u0645\u062E', - '\uFC48': '\u0645\u0645', - '\uFC49': '\u0645\u0649', - '\uFC4A': '\u0645\u064A', - '\uFC4B': '\u0646\u062C', - '\uFC4C': '\u0646\u062D', - '\uFC4D': '\u0646\u062E', - '\uFC4E': '\u0646\u0645', - '\uFC4F': '\u0646\u0649', - '\uFC50': '\u0646\u064A', - '\uFC51': '\u0647\u062C', - '\uFC52': '\u0647\u0645', - '\uFC53': '\u0647\u0649', - '\uFC54': '\u0647\u064A', - '\uFC55': '\u064A\u062C', - '\uFC56': '\u064A\u062D', - '\uFC57': '\u064A\u062E', - '\uFC58': '\u064A\u0645', - '\uFC59': '\u064A\u0649', - '\uFC5A': '\u064A\u064A', - '\uFC5B': '\u0630\u0670', - '\uFC5C': '\u0631\u0670', - '\uFC5D': '\u0649\u0670', - '\uFC5E': '\u0020\u064C\u0651', - '\uFC5F': '\u0020\u064D\u0651', - '\uFC60': '\u0020\u064E\u0651', - '\uFC61': '\u0020\u064F\u0651', - '\uFC62': '\u0020\u0650\u0651', - '\uFC63': '\u0020\u0651\u0670', - '\uFC64': '\u0626\u0631', - '\uFC65': '\u0626\u0632', - '\uFC66': '\u0626\u0645', - '\uFC67': '\u0626\u0646', - '\uFC68': '\u0626\u0649', - '\uFC69': '\u0626\u064A', - '\uFC6A': '\u0628\u0631', - '\uFC6B': '\u0628\u0632', - '\uFC6C': '\u0628\u0645', - '\uFC6D': '\u0628\u0646', - '\uFC6E': '\u0628\u0649', - '\uFC6F': '\u0628\u064A', - '\uFC70': '\u062A\u0631', - '\uFC71': '\u062A\u0632', - '\uFC72': '\u062A\u0645', - '\uFC73': '\u062A\u0646', - '\uFC74': '\u062A\u0649', - '\uFC75': '\u062A\u064A', - '\uFC76': '\u062B\u0631', - '\uFC77': '\u062B\u0632', - '\uFC78': '\u062B\u0645', - '\uFC79': '\u062B\u0646', - '\uFC7A': '\u062B\u0649', - '\uFC7B': '\u062B\u064A', - '\uFC7C': '\u0641\u0649', - '\uFC7D': '\u0641\u064A', - '\uFC7E': '\u0642\u0649', - '\uFC7F': '\u0642\u064A', - '\uFC80': '\u0643\u0627', - '\uFC81': '\u0643\u0644', - '\uFC82': '\u0643\u0645', - '\uFC83': '\u0643\u0649', - '\uFC84': '\u0643\u064A', - '\uFC85': '\u0644\u0645', - '\uFC86': '\u0644\u0649', - '\uFC87': '\u0644\u064A', - '\uFC88': '\u0645\u0627', - '\uFC89': '\u0645\u0645', - '\uFC8A': '\u0646\u0631', - '\uFC8B': '\u0646\u0632', - '\uFC8C': '\u0646\u0645', - '\uFC8D': '\u0646\u0646', - '\uFC8E': '\u0646\u0649', - '\uFC8F': '\u0646\u064A', - '\uFC90': '\u0649\u0670', - '\uFC91': '\u064A\u0631', - '\uFC92': '\u064A\u0632', - '\uFC93': '\u064A\u0645', - '\uFC94': '\u064A\u0646', - '\uFC95': '\u064A\u0649', - '\uFC96': '\u064A\u064A', - '\uFC97': '\u0626\u062C', - '\uFC98': '\u0626\u062D', - '\uFC99': '\u0626\u062E', - '\uFC9A': '\u0626\u0645', - '\uFC9B': '\u0626\u0647', - '\uFC9C': '\u0628\u062C', - '\uFC9D': '\u0628\u062D', - '\uFC9E': '\u0628\u062E', - '\uFC9F': '\u0628\u0645', - '\uFCA0': '\u0628\u0647', - '\uFCA1': '\u062A\u062C', - '\uFCA2': '\u062A\u062D', - '\uFCA3': '\u062A\u062E', - '\uFCA4': '\u062A\u0645', - '\uFCA5': '\u062A\u0647', - '\uFCA6': '\u062B\u0645', - '\uFCA7': '\u062C\u062D', - '\uFCA8': '\u062C\u0645', - '\uFCA9': '\u062D\u062C', - '\uFCAA': '\u062D\u0645', - '\uFCAB': '\u062E\u062C', - '\uFCAC': '\u062E\u0645', - '\uFCAD': '\u0633\u062C', - '\uFCAE': '\u0633\u062D', - '\uFCAF': '\u0633\u062E', - '\uFCB0': '\u0633\u0645', - '\uFCB1': '\u0635\u062D', - '\uFCB2': '\u0635\u062E', - '\uFCB3': '\u0635\u0645', - '\uFCB4': '\u0636\u062C', - '\uFCB5': '\u0636\u062D', - '\uFCB6': '\u0636\u062E', - '\uFCB7': '\u0636\u0645', - '\uFCB8': '\u0637\u062D', - '\uFCB9': '\u0638\u0645', - '\uFCBA': '\u0639\u062C', - '\uFCBB': '\u0639\u0645', - '\uFCBC': '\u063A\u062C', - '\uFCBD': '\u063A\u0645', - '\uFCBE': '\u0641\u062C', - '\uFCBF': '\u0641\u062D', - '\uFCC0': '\u0641\u062E', - '\uFCC1': '\u0641\u0645', - '\uFCC2': '\u0642\u062D', - '\uFCC3': '\u0642\u0645', - '\uFCC4': '\u0643\u062C', - '\uFCC5': '\u0643\u062D', - '\uFCC6': '\u0643\u062E', - '\uFCC7': '\u0643\u0644', - '\uFCC8': '\u0643\u0645', - '\uFCC9': '\u0644\u062C', - '\uFCCA': '\u0644\u062D', - '\uFCCB': '\u0644\u062E', - '\uFCCC': '\u0644\u0645', - '\uFCCD': '\u0644\u0647', - '\uFCCE': '\u0645\u062C', - '\uFCCF': '\u0645\u062D', - '\uFCD0': '\u0645\u062E', - '\uFCD1': '\u0645\u0645', - '\uFCD2': '\u0646\u062C', - '\uFCD3': '\u0646\u062D', - '\uFCD4': '\u0646\u062E', - '\uFCD5': '\u0646\u0645', - '\uFCD6': '\u0646\u0647', - '\uFCD7': '\u0647\u062C', - '\uFCD8': '\u0647\u0645', - '\uFCD9': '\u0647\u0670', - '\uFCDA': '\u064A\u062C', - '\uFCDB': '\u064A\u062D', - '\uFCDC': '\u064A\u062E', - '\uFCDD': '\u064A\u0645', - '\uFCDE': '\u064A\u0647', - '\uFCDF': '\u0626\u0645', - '\uFCE0': '\u0626\u0647', - '\uFCE1': '\u0628\u0645', - '\uFCE2': '\u0628\u0647', - '\uFCE3': '\u062A\u0645', - '\uFCE4': '\u062A\u0647', - '\uFCE5': '\u062B\u0645', - '\uFCE6': '\u062B\u0647', - '\uFCE7': '\u0633\u0645', - '\uFCE8': '\u0633\u0647', - '\uFCE9': '\u0634\u0645', - '\uFCEA': '\u0634\u0647', - '\uFCEB': '\u0643\u0644', - '\uFCEC': '\u0643\u0645', - '\uFCED': '\u0644\u0645', - '\uFCEE': '\u0646\u0645', - '\uFCEF': '\u0646\u0647', - '\uFCF0': '\u064A\u0645', - '\uFCF1': '\u064A\u0647', - '\uFCF2': '\u0640\u064E\u0651', - '\uFCF3': '\u0640\u064F\u0651', - '\uFCF4': '\u0640\u0650\u0651', - '\uFCF5': '\u0637\u0649', - '\uFCF6': '\u0637\u064A', - '\uFCF7': '\u0639\u0649', - '\uFCF8': '\u0639\u064A', - '\uFCF9': '\u063A\u0649', - '\uFCFA': '\u063A\u064A', - '\uFCFB': '\u0633\u0649', - '\uFCFC': '\u0633\u064A', - '\uFCFD': '\u0634\u0649', - '\uFCFE': '\u0634\u064A', - '\uFCFF': '\u062D\u0649', - '\uFD00': '\u062D\u064A', - '\uFD01': '\u062C\u0649', - '\uFD02': '\u062C\u064A', - '\uFD03': '\u062E\u0649', - '\uFD04': '\u062E\u064A', - '\uFD05': '\u0635\u0649', - '\uFD06': '\u0635\u064A', - '\uFD07': '\u0636\u0649', - '\uFD08': '\u0636\u064A', - '\uFD09': '\u0634\u062C', - '\uFD0A': '\u0634\u062D', - '\uFD0B': '\u0634\u062E', - '\uFD0C': '\u0634\u0645', - '\uFD0D': '\u0634\u0631', - '\uFD0E': '\u0633\u0631', - '\uFD0F': '\u0635\u0631', - '\uFD10': '\u0636\u0631', - '\uFD11': '\u0637\u0649', - '\uFD12': '\u0637\u064A', - '\uFD13': '\u0639\u0649', - '\uFD14': '\u0639\u064A', - '\uFD15': '\u063A\u0649', - '\uFD16': '\u063A\u064A', - '\uFD17': '\u0633\u0649', - '\uFD18': '\u0633\u064A', - '\uFD19': '\u0634\u0649', - '\uFD1A': '\u0634\u064A', - '\uFD1B': '\u062D\u0649', - '\uFD1C': '\u062D\u064A', - '\uFD1D': '\u062C\u0649', - '\uFD1E': '\u062C\u064A', - '\uFD1F': '\u062E\u0649', - '\uFD20': '\u062E\u064A', - '\uFD21': '\u0635\u0649', - '\uFD22': '\u0635\u064A', - '\uFD23': '\u0636\u0649', - '\uFD24': '\u0636\u064A', - '\uFD25': '\u0634\u062C', - '\uFD26': '\u0634\u062D', - '\uFD27': '\u0634\u062E', - '\uFD28': '\u0634\u0645', - '\uFD29': '\u0634\u0631', - '\uFD2A': '\u0633\u0631', - '\uFD2B': '\u0635\u0631', - '\uFD2C': '\u0636\u0631', - '\uFD2D': '\u0634\u062C', - '\uFD2E': '\u0634\u062D', - '\uFD2F': '\u0634\u062E', - '\uFD30': '\u0634\u0645', - '\uFD31': '\u0633\u0647', - '\uFD32': '\u0634\u0647', - '\uFD33': '\u0637\u0645', - '\uFD34': '\u0633\u062C', - '\uFD35': '\u0633\u062D', - '\uFD36': '\u0633\u062E', - '\uFD37': '\u0634\u062C', - '\uFD38': '\u0634\u062D', - '\uFD39': '\u0634\u062E', - '\uFD3A': '\u0637\u0645', - '\uFD3B': '\u0638\u0645', - '\uFD3C': '\u0627\u064B', - '\uFD3D': '\u0627\u064B', - '\uFD50': '\u062A\u062C\u0645', - '\uFD51': '\u062A\u062D\u062C', - '\uFD52': '\u062A\u062D\u062C', - '\uFD53': '\u062A\u062D\u0645', - '\uFD54': '\u062A\u062E\u0645', - '\uFD55': '\u062A\u0645\u062C', - '\uFD56': '\u062A\u0645\u062D', - '\uFD57': '\u062A\u0645\u062E', - '\uFD58': '\u062C\u0645\u062D', - '\uFD59': '\u062C\u0645\u062D', - '\uFD5A': '\u062D\u0645\u064A', - '\uFD5B': '\u062D\u0645\u0649', - '\uFD5C': '\u0633\u062D\u062C', - '\uFD5D': '\u0633\u062C\u062D', - '\uFD5E': '\u0633\u062C\u0649', - '\uFD5F': '\u0633\u0645\u062D', - '\uFD60': '\u0633\u0645\u062D', - '\uFD61': '\u0633\u0645\u062C', - '\uFD62': '\u0633\u0645\u0645', - '\uFD63': '\u0633\u0645\u0645', - '\uFD64': '\u0635\u062D\u062D', - '\uFD65': '\u0635\u062D\u062D', - '\uFD66': '\u0635\u0645\u0645', - '\uFD67': '\u0634\u062D\u0645', - '\uFD68': '\u0634\u062D\u0645', - '\uFD69': '\u0634\u062C\u064A', - '\uFD6A': '\u0634\u0645\u062E', - '\uFD6B': '\u0634\u0645\u062E', - '\uFD6C': '\u0634\u0645\u0645', - '\uFD6D': '\u0634\u0645\u0645', - '\uFD6E': '\u0636\u062D\u0649', - '\uFD6F': '\u0636\u062E\u0645', - '\uFD70': '\u0636\u062E\u0645', - '\uFD71': '\u0637\u0645\u062D', - '\uFD72': '\u0637\u0645\u062D', - '\uFD73': '\u0637\u0645\u0645', - '\uFD74': '\u0637\u0645\u064A', - '\uFD75': '\u0639\u062C\u0645', - '\uFD76': '\u0639\u0645\u0645', - '\uFD77': '\u0639\u0645\u0645', - '\uFD78': '\u0639\u0645\u0649', - '\uFD79': '\u063A\u0645\u0645', - '\uFD7A': '\u063A\u0645\u064A', - '\uFD7B': '\u063A\u0645\u0649', - '\uFD7C': '\u0641\u062E\u0645', - '\uFD7D': '\u0641\u062E\u0645', - '\uFD7E': '\u0642\u0645\u062D', - '\uFD7F': '\u0642\u0645\u0645', - '\uFD80': '\u0644\u062D\u0645', - '\uFD81': '\u0644\u062D\u064A', - '\uFD82': '\u0644\u062D\u0649', - '\uFD83': '\u0644\u062C\u062C', - '\uFD84': '\u0644\u062C\u062C', - '\uFD85': '\u0644\u062E\u0645', - '\uFD86': '\u0644\u062E\u0645', - '\uFD87': '\u0644\u0645\u062D', - '\uFD88': '\u0644\u0645\u062D', - '\uFD89': '\u0645\u062D\u062C', - '\uFD8A': '\u0645\u062D\u0645', - '\uFD8B': '\u0645\u062D\u064A', - '\uFD8C': '\u0645\u062C\u062D', - '\uFD8D': '\u0645\u062C\u0645', - '\uFD8E': '\u0645\u062E\u062C', - '\uFD8F': '\u0645\u062E\u0645', - '\uFD92': '\u0645\u062C\u062E', - '\uFD93': '\u0647\u0645\u062C', - '\uFD94': '\u0647\u0645\u0645', - '\uFD95': '\u0646\u062D\u0645', - '\uFD96': '\u0646\u062D\u0649', - '\uFD97': '\u0646\u062C\u0645', - '\uFD98': '\u0646\u062C\u0645', - '\uFD99': '\u0646\u062C\u0649', - '\uFD9A': '\u0646\u0645\u064A', - '\uFD9B': '\u0646\u0645\u0649', - '\uFD9C': '\u064A\u0645\u0645', - '\uFD9D': '\u064A\u0645\u0645', - '\uFD9E': '\u0628\u062E\u064A', - '\uFD9F': '\u062A\u062C\u064A', - '\uFDA0': '\u062A\u062C\u0649', - '\uFDA1': '\u062A\u062E\u064A', - '\uFDA2': '\u062A\u062E\u0649', - '\uFDA3': '\u062A\u0645\u064A', - '\uFDA4': '\u062A\u0645\u0649', - '\uFDA5': '\u062C\u0645\u064A', - '\uFDA6': '\u062C\u062D\u0649', - '\uFDA7': '\u062C\u0645\u0649', - '\uFDA8': '\u0633\u062E\u0649', - '\uFDA9': '\u0635\u062D\u064A', - '\uFDAA': '\u0634\u062D\u064A', - '\uFDAB': '\u0636\u062D\u064A', - '\uFDAC': '\u0644\u062C\u064A', - '\uFDAD': '\u0644\u0645\u064A', - '\uFDAE': '\u064A\u062D\u064A', - '\uFDAF': '\u064A\u062C\u064A', - '\uFDB0': '\u064A\u0645\u064A', - '\uFDB1': '\u0645\u0645\u064A', - '\uFDB2': '\u0642\u0645\u064A', - '\uFDB3': '\u0646\u062D\u064A', - '\uFDB4': '\u0642\u0645\u062D', - '\uFDB5': '\u0644\u062D\u0645', - '\uFDB6': '\u0639\u0645\u064A', - '\uFDB7': '\u0643\u0645\u064A', - '\uFDB8': '\u0646\u062C\u062D', - '\uFDB9': '\u0645\u062E\u064A', - '\uFDBA': '\u0644\u062C\u0645', - '\uFDBB': '\u0643\u0645\u0645', - '\uFDBC': '\u0644\u062C\u0645', - '\uFDBD': '\u0646\u062C\u062D', - '\uFDBE': '\u062C\u062D\u064A', - '\uFDBF': '\u062D\u062C\u064A', - '\uFDC0': '\u0645\u062C\u064A', - '\uFDC1': '\u0641\u0645\u064A', - '\uFDC2': '\u0628\u062D\u064A', - '\uFDC3': '\u0643\u0645\u0645', - '\uFDC4': '\u0639\u062C\u0645', - '\uFDC5': '\u0635\u0645\u0645', - '\uFDC6': '\u0633\u062E\u064A', - '\uFDC7': '\u0646\u062C\u064A', - '\uFE49': '\u203E', - '\uFE4A': '\u203E', - '\uFE4B': '\u203E', - '\uFE4C': '\u203E', - '\uFE4D': '\u005F', - '\uFE4E': '\u005F', - '\uFE4F': '\u005F', - '\uFE80': '\u0621', - '\uFE81': '\u0622', - '\uFE82': '\u0622', - '\uFE83': '\u0623', - '\uFE84': '\u0623', - '\uFE85': '\u0624', - '\uFE86': '\u0624', - '\uFE87': '\u0625', - '\uFE88': '\u0625', - '\uFE89': '\u0626', - '\uFE8A': '\u0626', - '\uFE8B': '\u0626', - '\uFE8C': '\u0626', - '\uFE8D': '\u0627', - '\uFE8E': '\u0627', - '\uFE8F': '\u0628', - '\uFE90': '\u0628', - '\uFE91': '\u0628', - '\uFE92': '\u0628', - '\uFE93': '\u0629', - '\uFE94': '\u0629', - '\uFE95': '\u062A', - '\uFE96': '\u062A', - '\uFE97': '\u062A', - '\uFE98': '\u062A', - '\uFE99': '\u062B', - '\uFE9A': '\u062B', - '\uFE9B': '\u062B', - '\uFE9C': '\u062B', - '\uFE9D': '\u062C', - '\uFE9E': '\u062C', - '\uFE9F': '\u062C', - '\uFEA0': '\u062C', - '\uFEA1': '\u062D', - '\uFEA2': '\u062D', - '\uFEA3': '\u062D', - '\uFEA4': '\u062D', - '\uFEA5': '\u062E', - '\uFEA6': '\u062E', - '\uFEA7': '\u062E', - '\uFEA8': '\u062E', - '\uFEA9': '\u062F', - '\uFEAA': '\u062F', - '\uFEAB': '\u0630', - '\uFEAC': '\u0630', - '\uFEAD': '\u0631', - '\uFEAE': '\u0631', - '\uFEAF': '\u0632', - '\uFEB0': '\u0632', - '\uFEB1': '\u0633', - '\uFEB2': '\u0633', - '\uFEB3': '\u0633', - '\uFEB4': '\u0633', - '\uFEB5': '\u0634', - '\uFEB6': '\u0634', - '\uFEB7': '\u0634', - '\uFEB8': '\u0634', - '\uFEB9': '\u0635', - '\uFEBA': '\u0635', - '\uFEBB': '\u0635', - '\uFEBC': '\u0635', - '\uFEBD': '\u0636', - '\uFEBE': '\u0636', - '\uFEBF': '\u0636', - '\uFEC0': '\u0636', - '\uFEC1': '\u0637', - '\uFEC2': '\u0637', - '\uFEC3': '\u0637', - '\uFEC4': '\u0637', - '\uFEC5': '\u0638', - '\uFEC6': '\u0638', - '\uFEC7': '\u0638', - '\uFEC8': '\u0638', - '\uFEC9': '\u0639', - '\uFECA': '\u0639', - '\uFECB': '\u0639', - '\uFECC': '\u0639', - '\uFECD': '\u063A', - '\uFECE': '\u063A', - '\uFECF': '\u063A', - '\uFED0': '\u063A', - '\uFED1': '\u0641', - '\uFED2': '\u0641', - '\uFED3': '\u0641', - '\uFED4': '\u0641', - '\uFED5': '\u0642', - '\uFED6': '\u0642', - '\uFED7': '\u0642', - '\uFED8': '\u0642', - '\uFED9': '\u0643', - '\uFEDA': '\u0643', - '\uFEDB': '\u0643', - '\uFEDC': '\u0643', - '\uFEDD': '\u0644', - '\uFEDE': '\u0644', - '\uFEDF': '\u0644', - '\uFEE0': '\u0644', - '\uFEE1': '\u0645', - '\uFEE2': '\u0645', - '\uFEE3': '\u0645', - '\uFEE4': '\u0645', - '\uFEE5': '\u0646', - '\uFEE6': '\u0646', - '\uFEE7': '\u0646', - '\uFEE8': '\u0646', - '\uFEE9': '\u0647', - '\uFEEA': '\u0647', - '\uFEEB': '\u0647', - '\uFEEC': '\u0647', - '\uFEED': '\u0648', - '\uFEEE': '\u0648', - '\uFEEF': '\u0649', - '\uFEF0': '\u0649', - '\uFEF1': '\u064A', - '\uFEF2': '\u064A', - '\uFEF3': '\u064A', - '\uFEF4': '\u064A', - '\uFEF5': '\u0644\u0622', - '\uFEF6': '\u0644\u0622', - '\uFEF7': '\u0644\u0623', - '\uFEF8': '\u0644\u0623', - '\uFEF9': '\u0644\u0625', - '\uFEFA': '\u0644\u0625', - '\uFEFB': '\u0644\u0627', - '\uFEFC': '\u0644\u0627' -}; - -function reverseIfRtl(chars) { - var charsLength = chars.length; - //reverse an arabic ligature - if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) { - return chars; - } - var s = ''; - for (var ii = charsLength - 1; ii >= 0; ii--) { - s += chars[ii]; - } - return s; -} - -function adjustWidths(properties) { - if (!properties.fontMatrix) { - return; - } - if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) { - return; - } - // adjusting width to fontMatrix scale - var scale = 0.001 / properties.fontMatrix[0]; - var glyphsWidths = properties.widths; - for (var glyph in glyphsWidths) { - glyphsWidths[glyph] *= scale; - } - properties.defaultWidth *= scale; -} - -function getFontType(type, subtype) { - switch (type) { - case 'Type1': - return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1; - case 'CIDFontType0': - return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C : - FontType.CIDFONTTYPE0; - case 'OpenType': - return FontType.OPENTYPE; - case 'TrueType': - return FontType.TRUETYPE; - case 'CIDFontType2': - return FontType.CIDFONTTYPE2; - case 'MMType1': - return FontType.MMTYPE1; - case 'Type0': - return FontType.TYPE0; - default: - return FontType.UNKNOWN; - } -} - -var Glyph = (function GlyphClosure() { - function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, - isSpace) { - this.fontChar = fontChar; - this.unicode = unicode; - this.accent = accent; - this.width = width; - this.vmetric = vmetric; - this.operatorListId = operatorListId; - this.isSpace = isSpace; - } - - Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width, - vmetric, operatorListId, isSpace) { - return this.fontChar === fontChar && - this.unicode === unicode && - this.accent === accent && - this.width === width && - this.vmetric === vmetric && - this.operatorListId === operatorListId && - this.isSpace === isSpace; - }; - - return Glyph; -})(); - -var ToUnicodeMap = (function ToUnicodeMapClosure() { - function ToUnicodeMap(cmap) { - // The elements of this._map can be integers or strings, depending on how - // |cmap| was created. - this._map = cmap; - } - - ToUnicodeMap.prototype = { - get length() { - return this._map.length; - }, - - forEach: function(callback) { - for (var charCode in this._map) { - callback(charCode, this._map[charCode].charCodeAt(0)); - } - }, - - has: function(i) { - return this._map[i] !== undefined; - }, - - get: function(i) { - return this._map[i]; - }, - - charCodeOf: function(v) { - return this._map.indexOf(v); - } - }; - - return ToUnicodeMap; -})(); - -var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() { - function IdentityToUnicodeMap(firstChar, lastChar) { - this.firstChar = firstChar; - this.lastChar = lastChar; - } - - IdentityToUnicodeMap.prototype = { - get length() { - return (this.lastChar + 1) - this.firstChar; - }, - - forEach: function (callback) { - for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) { - callback(i, i); - } - }, - - has: function (i) { - return this.firstChar <= i && i <= this.lastChar; - }, - - get: function (i) { - if (this.firstChar <= i && i <= this.lastChar) { - return String.fromCharCode(i); - } - return undefined; - }, - - charCodeOf: function (v) { - return (isInt(v) && v >= this.firstChar && v <= this.lastChar) ? v : -1; - } - }; - - return IdentityToUnicodeMap; -})(); - -var OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() { - function writeInt16(dest, offset, num) { - dest[offset] = (num >> 8) & 0xFF; - dest[offset + 1] = num & 0xFF; - } - - function writeInt32(dest, offset, num) { - dest[offset] = (num >> 24) & 0xFF; - dest[offset + 1] = (num >> 16) & 0xFF; - dest[offset + 2] = (num >> 8) & 0xFF; - dest[offset + 3] = num & 0xFF; - } - - function writeData(dest, offset, data) { - var i, ii; - if (data instanceof Uint8Array) { - dest.set(data, offset); - } else if (typeof data === 'string') { - for (i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data.charCodeAt(i) & 0xFF; - } - } else { - // treating everything else as array - for (i = 0, ii = data.length; i < ii; i++) { - dest[offset++] = data[i] & 0xFF; - } - } - } - - function OpenTypeFileBuilder(sfnt) { - this.sfnt = sfnt; - this.tables = Object.create(null); - } - - OpenTypeFileBuilder.getSearchParams = - function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) { - var maxPower2 = 1, log2 = 0; - while ((maxPower2 ^ entriesCount) > maxPower2) { - maxPower2 <<= 1; - log2++; - } - var searchRange = maxPower2 * entrySize; - return { - range: searchRange, - entry: log2, - rangeShift: entrySize * entriesCount - searchRange - }; - }; - - var OTF_HEADER_SIZE = 12; - var OTF_TABLE_ENTRY_SIZE = 16; - - OpenTypeFileBuilder.prototype = { - toArray: function OpenTypeFileBuilder_toArray() { - var sfnt = this.sfnt; - - // Tables needs to be written by ascendant alphabetic order - var tables = this.tables; - var tablesNames = Object.keys(tables); - tablesNames.sort(); - var numTables = tablesNames.length; - - var i, j, jj, table, tableName; - // layout the tables data - var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE; - var tableOffsets = [offset]; - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - var paddedLength = ((table.length + 3) & ~3) >>> 0; - offset += paddedLength; - tableOffsets.push(offset); - } - - var file = new Uint8Array(offset); - // write the table data first (mostly for checksum) - for (i = 0; i < numTables; i++) { - table = tables[tablesNames[i]]; - writeData(file, tableOffsets[i], table); - } - - // sfnt version (4 bytes) - if (sfnt === 'true') { - // Windows hates the Mac TrueType sfnt version number - sfnt = string32(0x00010000); - } - file[0] = sfnt.charCodeAt(0) & 0xFF; - file[1] = sfnt.charCodeAt(1) & 0xFF; - file[2] = sfnt.charCodeAt(2) & 0xFF; - file[3] = sfnt.charCodeAt(3) & 0xFF; - - // numTables (2 bytes) - writeInt16(file, 4, numTables); - - var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16); - - // searchRange (2 bytes) - writeInt16(file, 6, searchParams.range); - // entrySelector (2 bytes) - writeInt16(file, 8, searchParams.entry); - // rangeShift (2 bytes) - writeInt16(file, 10, searchParams.rangeShift); - - offset = OTF_HEADER_SIZE; - // writing table entries - for (i = 0; i < numTables; i++) { - tableName = tablesNames[i]; - file[offset] = tableName.charCodeAt(0) & 0xFF; - file[offset + 1] = tableName.charCodeAt(1) & 0xFF; - file[offset + 2] = tableName.charCodeAt(2) & 0xFF; - file[offset + 3] = tableName.charCodeAt(3) & 0xFF; - - // checksum - var checksum = 0; - for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) { - var quad = (file[j] << 24) + (file[j + 1] << 16) + - (file[j + 2] << 8) + file[j + 3]; - checksum = (checksum + quad) | 0; - } - writeInt32(file, offset + 4, checksum); - - // offset - writeInt32(file, offset + 8, tableOffsets[i]); - // length - writeInt32(file, offset + 12, tables[tableName].length); - - offset += OTF_TABLE_ENTRY_SIZE; - } - return file; - }, - - addTable: function OpenTypeFileBuilder_addTable(tag, data) { - if (tag in this.tables) { - throw new Error('Table ' + tag + ' already exists'); - } - this.tables[tag] = data; - } - }; - - return OpenTypeFileBuilder; -})(); - -// Problematic Unicode characters in the fonts that needs to be moved to avoid -// issues when they are painted on the canvas, e.g. complex-script shaping or -// control/whitespace characters. The ranges are listed in pairs: the first item -// is a code of the first problematic code, the second one is the next -// non-problematic code. The ranges must be in sorted order. -var ProblematicCharRanges = new Int32Array([ - // Control characters. - 0x0000, 0x0020, - 0x007F, 0x00A1, - 0x00AD, 0x00AE, - // Chars that is used in complex-script shaping. - 0x0600, 0x0780, - 0x08A0, 0x10A0, - 0x1780, 0x1800, - // General punctuation chars. - 0x2000, 0x2010, - 0x2011, 0x2012, - 0x2028, 0x2030, - 0x205F, 0x2070, - 0x25CC, 0x25CD, - // Chars that is used in complex-script shaping. - 0xAA60, 0xAA80, - // Specials Unicode block. - 0xFFF0, 0x10000 -]); - -/** - * 'Font' is the class the outside world should use, it encapsulate all the font - * decoding logics whatever type it is (assuming the font type is supported). - * - * For example to read a Type1 font and to attach it to the document: - * var type1Font = new Font("MyFontName", binaryFile, propertiesObject); - * type1Font.bind(); - */ -var Font = (function FontClosure() { - function Font(name, file, properties) { - var charCode, glyphName, fontChar; - - this.name = name; - this.loadedName = properties.loadedName; - this.isType3Font = properties.isType3Font; - this.sizes = []; - - this.glyphCache = {}; - - var names = name.split('+'); - names = names.length > 1 ? names[1] : names[0]; - names = names.split(/[-,_]/g)[0]; - this.isSerifFont = !!(properties.flags & FontFlags.Serif); - this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); - this.isMonospace = !!(properties.flags & FontFlags.FixedPitch); - - var type = properties.type; - var subtype = properties.subtype; - this.type = type; - - this.fallbackName = (this.isMonospace ? 'monospace' : - (this.isSerifFont ? 'serif' : 'sans-serif')); - - this.differences = properties.differences; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.composite = properties.composite; - this.wideChars = properties.wideChars; - this.cMap = properties.cMap; - this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS; - this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS; - this.fontMatrix = properties.fontMatrix; - this.bbox = properties.bbox; - - this.toUnicode = properties.toUnicode = this.buildToUnicode(properties); - - this.toFontChar = []; - - if (properties.type === 'Type3') { - for (charCode = 0; charCode < 256; charCode++) { - this.toFontChar[charCode] = (this.differences[charCode] || - properties.defaultEncoding[charCode]); - } - this.fontType = FontType.TYPE3; - return; - } - - this.cidEncoding = properties.cidEncoding; - this.vertical = properties.vertical; - if (this.vertical) { - this.vmetrics = properties.vmetrics; - this.defaultVMetrics = properties.defaultVMetrics; - } - - if (!file || file.isEmpty) { - if (file) { - // Some bad PDF generators will include empty font files, - // attempting to recover by assuming that no file exists. - warn('Font file is empty in "' + name + '" (' + this.loadedName + ')'); - } - - this.missingFile = true; - // The file data is not specified. Trying to fix the font name - // to be used with the canvas.font. - var fontName = name.replace(/[,_]/g, '-'); - var isStandardFont = !!stdFontMap[fontName] || - !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]); - fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; - - this.bold = (fontName.search(/bold/gi) !== -1); - this.italic = ((fontName.search(/oblique/gi) !== -1) || - (fontName.search(/italic/gi) !== -1)); - - // Use 'name' instead of 'fontName' here because the original - // name ArialBlack for example will be replaced by Helvetica. - this.black = (name.search(/Black/g) !== -1); - - // if at least one width is present, remeasure all chars when exists - this.remeasure = Object.keys(this.widths).length > 0; - if (isStandardFont && type === 'CIDFontType2' && - properties.cidEncoding.indexOf('Identity-') === 0) { - // Standard fonts might be embedded as CID font without glyph mapping. - // Building one based on GlyphMapForStandardFonts. - var map = []; - for (charCode in GlyphMapForStandardFonts) { - map[+charCode] = GlyphMapForStandardFonts[charCode]; - } - if (/ArialBlack/i.test(name)) { - for (charCode in SupplementalGlyphMapForArialBlack) { - map[+charCode] = SupplementalGlyphMapForArialBlack[charCode]; - } - } - var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap; - if (!isIdentityUnicode) { - this.toUnicode.forEach(function(charCode, unicodeCharCode) { - map[+charCode] = unicodeCharCode; - }); - } - this.toFontChar = map; - this.toUnicode = new ToUnicodeMap(map); - } else if (/Symbol/i.test(fontName)) { - var symbols = Encodings.SymbolSetEncoding; - for (charCode in symbols) { - fontChar = GlyphsUnicode[symbols[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - for (charCode in properties.differences) { - fontChar = GlyphsUnicode[properties.differences[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - } else if (/Dingbats/i.test(fontName)) { - if (/Wingdings/i.test(name)) { - warn('Wingdings font without embedded font file, ' + - 'falling back to the ZapfDingbats encoding.'); - } - var dingbats = Encodings.ZapfDingbatsEncoding; - for (charCode in dingbats) { - fontChar = DingbatsGlyphsUnicode[dingbats[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - for (charCode in properties.differences) { - fontChar = DingbatsGlyphsUnicode[properties.differences[charCode]]; - if (!fontChar) { - continue; - } - this.toFontChar[charCode] = fontChar; - } - } else if (isStandardFont) { - this.toFontChar = []; - for (charCode in properties.defaultEncoding) { - glyphName = (properties.differences[charCode] || - properties.defaultEncoding[charCode]); - this.toFontChar[charCode] = GlyphsUnicode[glyphName]; - } - } else { - var unicodeCharCode, notCidFont = (type.indexOf('CIDFontType') === -1); - this.toUnicode.forEach(function(charCode, unicodeCharCode) { - if (notCidFont) { - glyphName = (properties.differences[charCode] || - properties.defaultEncoding[charCode]); - unicodeCharCode = (GlyphsUnicode[glyphName] || unicodeCharCode); - } - this.toFontChar[charCode] = unicodeCharCode; - }.bind(this)); - } - this.loadedName = fontName.split('-')[0]; - this.loading = false; - this.fontType = getFontType(type, subtype); - return; - } - - // Some fonts might use wrong font types for Type1C or CIDFontType0C - if (subtype === 'Type1C' && (type !== 'Type1' && type !== 'MMType1')) { - // Some TrueType fonts by mistake claim Type1C - if (isTrueTypeFile(file)) { - subtype = 'TrueType'; - } else { - type = 'Type1'; - } - } - if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') { - type = 'CIDFontType0'; - } - if (subtype === 'OpenType') { - type = 'OpenType'; - } - // Some CIDFontType0C fonts by mistake claim CIDFontType0. - if (type === 'CIDFontType0') { - if (isType1File(file)) { - subtype = 'CIDFontType0'; - } else if (isOpenTypeFile(file)) { - // Sometimes the type/subtype can be a complete lie (see issue6782.pdf). - type = subtype = 'OpenType'; - } else { - subtype = 'CIDFontType0C'; - } - } - - var data; - switch (type) { - case 'MMType1': - info('MMType1 font (' + name + '), falling back to Type1.'); - /* falls through */ - case 'Type1': - case 'CIDFontType0': - this.mimetype = 'font/opentype'; - - var cff = (subtype === 'Type1C' || subtype === 'CIDFontType0C') ? - new CFFFont(file, properties) : new Type1Font(name, file, properties); - - adjustWidths(properties); - - // Wrap the CFF data inside an OTF font file - data = this.convert(name, cff, properties); - break; - - case 'OpenType': - case 'TrueType': - case 'CIDFontType2': - this.mimetype = 'font/opentype'; - - // Repair the TrueType file. It is can be damaged in the point of - // view of the sanitizer - data = this.checkAndRepair(name, file, properties); - if (this.isOpenType) { - adjustWidths(properties); - - type = 'OpenType'; - } - break; - - default: - error('Font ' + type + ' is not supported'); - break; - } - - this.data = data; - this.fontType = getFontType(type, subtype); - - // Transfer some properties again that could change during font conversion - this.fontMatrix = properties.fontMatrix; - this.widths = properties.widths; - this.defaultWidth = properties.defaultWidth; - this.encoding = properties.baseEncoding; - this.seacMap = properties.seacMap; - - this.loading = true; - } - - Font.getFontID = (function () { - var ID = 1; - return function Font_getFontID() { - return String(ID++); - }; - })(); - - function int16(b0, b1) { - return (b0 << 8) + b1; - } - - function int32(b0, b1, b2, b3) { - return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3; - } - - function string16(value) { - return String.fromCharCode((value >> 8) & 0xff, value & 0xff); - } - - function safeString16(value) { - // clamp value to the 16-bit int range - value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value)); - return String.fromCharCode((value >> 8) & 0xff, value & 0xff); - } - - function isTrueTypeFile(file) { - var header = file.peekBytes(4); - return readUint32(header, 0) === 0x00010000; - } - - function isOpenTypeFile(file) { - var header = file.peekBytes(4); - return bytesToString(header) === 'OTTO'; - } - - function isType1File(file) { - var header = file.peekBytes(2); - // All Type1 font programs must begin with the comment '%!' (0x25 + 0x21). - if (header[0] === 0x25 && header[1] === 0x21) { - return true; - } - // ... obviously some fonts violate that part of the specification, - // please refer to the comment in |Type1Font| below. - if (header[0] === 0x80 && header[1] === 0x01) { // pfb file header. - return true; - } - return false; - } - - /** - * Helper function for |adjustMapping|. - * @return {boolean} - */ - function isProblematicUnicodeLocation(code) { - // Using binary search to find a range start. - var i = 0, j = ProblematicCharRanges.length - 1; - while (i < j) { - var c = (i + j + 1) >> 1; - if (code < ProblematicCharRanges[c]) { - j = c - 1; - } else { - i = c; - } - } - // Even index means code in problematic range. - return !(i & 1); - } - - /** - * Rebuilds the char code to glyph ID map by trying to replace the char codes - * with their unicode value. It also moves char codes that are in known - * problematic locations. - * @return {Object} Two properties: - * 'toFontChar' - maps original char codes(the value that will be read - * from commands such as show text) to the char codes that will be used in the - * font that we build - * 'charCodeToGlyphId' - maps the new font char codes to glyph ids - */ - function adjustMapping(charCodeToGlyphId, properties) { - var toUnicode = properties.toUnicode; - var isSymbolic = !!(properties.flags & FontFlags.Symbolic); - var isIdentityUnicode = - properties.toUnicode instanceof IdentityToUnicodeMap; - var newMap = Object.create(null); - var toFontChar = []; - var usedFontCharCodes = []; - var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START; - for (var originalCharCode in charCodeToGlyphId) { - originalCharCode |= 0; - var glyphId = charCodeToGlyphId[originalCharCode]; - var fontCharCode = originalCharCode; - // First try to map the value to a unicode position if a non identity map - // was created. - if (!isIdentityUnicode && toUnicode.has(originalCharCode)) { - var unicode = toUnicode.get(fontCharCode); - // TODO: Try to map ligatures to the correct spot. - if (unicode.length === 1) { - fontCharCode = unicode.charCodeAt(0); - } - } - // Try to move control characters, special characters and already mapped - // characters to the private use area since they will not be drawn by - // canvas if left in their current position. Also, move characters if the - // font was symbolic and there is only an identity unicode map since the - // characters probably aren't in the correct position (fixes an issue - // with firefox and thuluthfont). - if ((usedFontCharCodes[fontCharCode] !== undefined || - isProblematicUnicodeLocation(fontCharCode) || - (isSymbolic && isIdentityUnicode)) && - nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { // Room left. - // Loop to try and find a free spot in the private use area. - do { - fontCharCode = nextAvailableFontCharCode++; - - if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) { - fontCharCode = 0xF020; - nextAvailableFontCharCode = fontCharCode + 1; - } - - } while (usedFontCharCodes[fontCharCode] !== undefined && - nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END); - } - - newMap[fontCharCode] = glyphId; - toFontChar[originalCharCode] = fontCharCode; - usedFontCharCodes[fontCharCode] = true; - } - return { - toFontChar: toFontChar, - charCodeToGlyphId: newMap, - nextAvailableFontCharCode: nextAvailableFontCharCode - }; - } - - function getRanges(glyphs, numGlyphs) { - // Array.sort() sorts by characters, not numerically, so convert to an - // array of characters. - var codes = []; - for (var charCode in glyphs) { - // Remove an invalid glyph ID mappings to make OTS happy. - if (glyphs[charCode] >= numGlyphs) { - continue; - } - codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] }); - } - codes.sort(function fontGetRangesSort(a, b) { - return a.fontCharCode - b.fontCharCode; - }); - - // Split the sorted codes into ranges. - var ranges = []; - var length = codes.length; - for (var n = 0; n < length; ) { - var start = codes[n].fontCharCode; - var codeIndices = [codes[n].glyphId]; - ++n; - var end = start; - while (n < length && end + 1 === codes[n].fontCharCode) { - codeIndices.push(codes[n].glyphId); - ++end; - ++n; - if (end === 0xFFFF) { - break; - } - } - ranges.push([start, end, codeIndices]); - } - - return ranges; - } - - function createCmapTable(glyphs, numGlyphs) { - var ranges = getRanges(glyphs, numGlyphs); - var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1; - var cmap = '\x00\x00' + // version - string16(numTables) + // numTables - '\x00\x03' + // platformID - '\x00\x01' + // encodingID - string32(4 + numTables * 8); // start of the table record - - var i, ii, j, jj; - for (i = ranges.length - 1; i >= 0; --i) { - if (ranges[i][0] <= 0xFFFF) { break; } - } - var bmpLength = i + 1; - - if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) { - ranges[i][1] = 0xFFFE; - } - var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0; - var segCount = bmpLength + trailingRangesCount; - var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2); - - // Fill up the 4 parallel arrays describing the segments. - var startCount = ''; - var endCount = ''; - var idDeltas = ''; - var idRangeOffsets = ''; - var glyphsIds = ''; - var bias = 0; - - var range, start, end, codes; - for (i = 0, ii = bmpLength; i < ii; i++) { - range = ranges[i]; - start = range[0]; - end = range[1]; - startCount += string16(start); - endCount += string16(end); - codes = range[2]; - var contiguous = true; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - contiguous = false; - break; - } - } - if (!contiguous) { - var offset = (segCount - i) * 2 + bias * 2; - bias += (end - start + 1); - - idDeltas += string16(0); - idRangeOffsets += string16(offset); - - for (j = 0, jj = codes.length; j < jj; ++j) { - glyphsIds += string16(codes[j]); - } - } else { - var startCode = codes[0]; - - idDeltas += string16((startCode - start) & 0xFFFF); - idRangeOffsets += string16(0); - } - } - - if (trailingRangesCount > 0) { - endCount += '\xFF\xFF'; - startCount += '\xFF\xFF'; - idDeltas += '\x00\x01'; - idRangeOffsets += '\x00\x00'; - } - - var format314 = '\x00\x00' + // language - string16(2 * segCount) + - string16(searchParams.range) + - string16(searchParams.entry) + - string16(searchParams.rangeShift) + - endCount + '\x00\x00' + startCount + - idDeltas + idRangeOffsets + glyphsIds; - - var format31012 = ''; - var header31012 = ''; - if (numTables > 1) { - cmap += '\x00\x03' + // platformID - '\x00\x0A' + // encodingID - string32(4 + numTables * 8 + - 4 + format314.length); // start of the table record - format31012 = ''; - for (i = 0, ii = ranges.length; i < ii; i++) { - range = ranges[i]; - start = range[0]; - codes = range[2]; - var code = codes[0]; - for (j = 1, jj = codes.length; j < jj; ++j) { - if (codes[j] !== codes[j - 1] + 1) { - end = range[0] + j - 1; - format31012 += string32(start) + // startCharCode - string32(end) + // endCharCode - string32(code); // startGlyphID - start = end + 1; - code = codes[j]; - } - } - format31012 += string32(start) + // startCharCode - string32(range[1]) + // endCharCode - string32(code); // startGlyphID - } - header31012 = '\x00\x0C' + // format - '\x00\x00' + // reserved - string32(format31012.length + 16) + // length - '\x00\x00\x00\x00' + // language - string32(format31012.length / 12); // nGroups - } - - return cmap + '\x00\x04' + // format - string16(format314.length + 4) + // length - format314 + header31012 + format31012; - } - - function validateOS2Table(os2) { - var stream = new Stream(os2.data); - var version = stream.getUint16(); - // TODO verify all OS/2 tables fields, but currently we validate only those - // that give us issues - stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges - var selection = stream.getUint16(); - if (version < 4 && (selection & 0x0300)) { - return false; - } - var firstChar = stream.getUint16(); - var lastChar = stream.getUint16(); - if (firstChar > lastChar) { - return false; - } - stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap - var usWinAscent = stream.getUint16(); - if (usWinAscent === 0) { // makes font unreadable by windows - return false; - } - - // OS/2 appears to be valid, resetting some fields - os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0 - return true; - } - - function createOS2Table(properties, charstrings, override) { - override = override || { - unitsPerEm: 0, - yMax: 0, - yMin: 0, - ascent: 0, - descent: 0 - }; - - var ulUnicodeRange1 = 0; - var ulUnicodeRange2 = 0; - var ulUnicodeRange3 = 0; - var ulUnicodeRange4 = 0; - - var firstCharIndex = null; - var lastCharIndex = 0; - - if (charstrings) { - for (var code in charstrings) { - code |= 0; - if (firstCharIndex > code || !firstCharIndex) { - firstCharIndex = code; - } - if (lastCharIndex < code) { - lastCharIndex = code; - } - - var position = getUnicodeRangeFor(code); - if (position < 32) { - ulUnicodeRange1 |= 1 << position; - } else if (position < 64) { - ulUnicodeRange2 |= 1 << position - 32; - } else if (position < 96) { - ulUnicodeRange3 |= 1 << position - 64; - } else if (position < 123) { - ulUnicodeRange4 |= 1 << position - 96; - } else { - error('Unicode ranges Bits > 123 are reserved for internal usage'); - } - } - } else { - // TODO - firstCharIndex = 0; - lastCharIndex = 255; - } - - var bbox = properties.bbox || [0, 0, 0, 0]; - var unitsPerEm = (override.unitsPerEm || - 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]); - - // if the font units differ to the PDF glyph space units - // then scale up the values - var scale = (properties.ascentScaled ? 1.0 : - unitsPerEm / PDF_GLYPH_SPACE_UNITS); - - var typoAscent = (override.ascent || - Math.round(scale * (properties.ascent || bbox[3]))); - var typoDescent = (override.descent || - Math.round(scale * (properties.descent || bbox[1]))); - if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) { - typoDescent = -typoDescent; // fixing incorrect descent - } - var winAscent = override.yMax || typoAscent; - var winDescent = -override.yMin || -typoDescent; - - return '\x00\x03' + // version - '\x02\x24' + // xAvgCharWidth - '\x01\xF4' + // usWeightClass - '\x00\x05' + // usWidthClass - '\x00\x00' + // fstype (0 to let the font loads via font-face on IE) - '\x02\x8A' + // ySubscriptXSize - '\x02\xBB' + // ySubscriptYSize - '\x00\x00' + // ySubscriptXOffset - '\x00\x8C' + // ySubscriptYOffset - '\x02\x8A' + // ySuperScriptXSize - '\x02\xBB' + // ySuperScriptYSize - '\x00\x00' + // ySuperScriptXOffset - '\x01\xDF' + // ySuperScriptYOffset - '\x00\x31' + // yStrikeOutSize - '\x01\x02' + // yStrikeOutPosition - '\x00\x00' + // sFamilyClass - '\x00\x00\x06' + - String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + - '\x00\x00\x00\x00\x00\x00' + // Panose - string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31) - string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63) - string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95) - string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127) - '\x2A\x32\x31\x2A' + // achVendID - string16(properties.italicAngle ? 1 : 0) + // fsSelection - string16(firstCharIndex || - properties.firstChar) + // usFirstCharIndex - string16(lastCharIndex || properties.lastChar) + // usLastCharIndex - string16(typoAscent) + // sTypoAscender - string16(typoDescent) + // sTypoDescender - '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value) - string16(winAscent) + // usWinAscent - string16(winDescent) + // usWinDescent - '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31) - '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63) - string16(properties.xHeight) + // sxHeight - string16(properties.capHeight) + // sCapHeight - string16(0) + // usDefaultChar - string16(firstCharIndex || properties.firstChar) + // usBreakChar - '\x00\x03'; // usMaxContext - } - - function createPostTable(properties) { - var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16))); - return ('\x00\x03\x00\x00' + // Version number - string32(angle) + // italicAngle - '\x00\x00' + // underlinePosition - '\x00\x00' + // underlineThickness - string32(properties.fixedPitch) + // isFixedPitch - '\x00\x00\x00\x00' + // minMemType42 - '\x00\x00\x00\x00' + // maxMemType42 - '\x00\x00\x00\x00' + // minMemType1 - '\x00\x00\x00\x00'); // maxMemType1 - } - - function createNameTable(name, proto) { - if (!proto) { - proto = [[], []]; // no strings and unicode strings - } - - var strings = [ - proto[0][0] || 'Original licence', // 0.Copyright - proto[0][1] || name, // 1.Font family - proto[0][2] || 'Unknown', // 2.Font subfamily (font weight) - proto[0][3] || 'uniqueID', // 3.Unique ID - proto[0][4] || name, // 4.Full font name - proto[0][5] || 'Version 0.11', // 5.Version - proto[0][6] || '', // 6.Postscript name - proto[0][7] || 'Unknown', // 7.Trademark - proto[0][8] || 'Unknown', // 8.Manufacturer - proto[0][9] || 'Unknown' // 9.Designer - ]; - - // Mac want 1-byte per character strings while Windows want - // 2-bytes per character, so duplicate the names table - var stringsUnicode = []; - var i, ii, j, jj, str; - for (i = 0, ii = strings.length; i < ii; i++) { - str = proto[1][i] || strings[i]; - - var strBufUnicode = []; - for (j = 0, jj = str.length; j < jj; j++) { - strBufUnicode.push(string16(str.charCodeAt(j))); - } - stringsUnicode.push(strBufUnicode.join('')); - } - - var names = [strings, stringsUnicode]; - var platforms = ['\x00\x01', '\x00\x03']; - var encodings = ['\x00\x00', '\x00\x01']; - var languages = ['\x00\x00', '\x04\x09']; - - var namesRecordCount = strings.length * platforms.length; - var nameTable = - '\x00\x00' + // format - string16(namesRecordCount) + // Number of names Record - string16(namesRecordCount * 12 + 6); // Storage - - // Build the name records field - var strOffset = 0; - for (i = 0, ii = platforms.length; i < ii; i++) { - var strs = names[i]; - for (j = 0, jj = strs.length; j < jj; j++) { - str = strs[j]; - var nameRecord = - platforms[i] + // platform ID - encodings[i] + // encoding ID - languages[i] + // language ID - string16(j) + // name ID - string16(str.length) + - string16(strOffset); - nameTable += nameRecord; - strOffset += str.length; - } - } - - nameTable += strings.join('') + stringsUnicode.join(''); - return nameTable; - } - - Font.prototype = { - name: null, - font: null, - mimetype: null, - encoding: null, - get renderer() { - var renderer = FontRendererFactory.create(this); - return shadow(this, 'renderer', renderer); - }, - - exportData: function Font_exportData() { - var data = {}; - for (var i in this) { - if (this.hasOwnProperty(i)) { - data[i] = this[i]; - } - } - return data; - }, - - checkAndRepair: function Font_checkAndRepair(name, font, properties) { - function readTableEntry(file) { - var tag = bytesToString(file.getBytes(4)); - - var checksum = file.getInt32(); - var offset = file.getInt32() >>> 0; - var length = file.getInt32() >>> 0; - - // Read the table associated data - var previousPosition = file.pos; - file.pos = file.start ? file.start : 0; - file.skip(offset); - var data = file.getBytes(length); - file.pos = previousPosition; - - if (tag === 'head') { - // clearing checksum adjustment - data[8] = data[9] = data[10] = data[11] = 0; - data[17] |= 0x20; //Set font optimized for cleartype flag - } - - return { - tag: tag, - checksum: checksum, - length: length, - offset: offset, - data: data - }; - } - - function readOpenTypeHeader(ttf) { - return { - version: bytesToString(ttf.getBytes(4)), - numTables: ttf.getUint16(), - searchRange: ttf.getUint16(), - entrySelector: ttf.getUint16(), - rangeShift: ttf.getUint16() - }; - } - - /** - * Read the appropriate subtable from the cmap according to 9.6.6.4 from - * PDF spec - */ - function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) { - if (!cmap) { - warn('No cmap table available.'); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - var segment; - var start = (font.start ? font.start : 0) + cmap.offset; - font.pos = start; - - var version = font.getUint16(); - var numTables = font.getUint16(); - - var potentialTable; - var canBreak = false; - // There's an order of preference in terms of which cmap subtable to - // use: - // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table - // - symbolic fonts the preference is a 3,0 table then a 1,0 table - // The following takes advantage of the fact that the tables are sorted - // to work. - for (var i = 0; i < numTables; i++) { - var platformId = font.getUint16(); - var encodingId = font.getUint16(); - var offset = font.getInt32() >>> 0; - var useTable = false; - - if (platformId === 0 && encodingId === 0) { - useTable = true; - // Continue the loop since there still may be a higher priority - // table. - } else if (platformId === 1 && encodingId === 0) { - useTable = true; - // Continue the loop since there still may be a higher priority - // table. - } else if (platformId === 3 && encodingId === 1 && - ((!isSymbolicFont && hasEncoding) || !potentialTable)) { - useTable = true; - if (!isSymbolicFont) { - canBreak = true; - } - } else if (isSymbolicFont && platformId === 3 && encodingId === 0) { - useTable = true; - canBreak = true; - } - - if (useTable) { - potentialTable = { - platformId: platformId, - encodingId: encodingId, - offset: offset - }; - } - if (canBreak) { - break; - } - } - - if (potentialTable) { - font.pos = start + potentialTable.offset; - } - if (!potentialTable || font.peekByte() === -1) { - warn('Could not find a preferred cmap table.'); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - - var format = font.getUint16(); - var length = font.getUint16(); - var language = font.getUint16(); - - var hasShortCmap = false; - var mappings = []; - var j, glyphId; - - // TODO(mack): refactor this cmap subtable reading logic out - if (format === 0) { - for (j = 0; j < 256; j++) { - var index = font.getByte(); - if (!index) { - continue; - } - mappings.push({ - charCode: j, - glyphId: index - }); - } - hasShortCmap = true; - } else if (format === 4) { - // re-creating the table in format 4 since the encoding - // might be changed - var segCount = (font.getUint16() >> 1); - font.getBytes(6); // skipping range fields - var segIndex, segments = []; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments.push({ end: font.getUint16() }); - } - font.getUint16(); - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].start = font.getUint16(); - } - - for (segIndex = 0; segIndex < segCount; segIndex++) { - segments[segIndex].delta = font.getUint16(); - } - - var offsetsCount = 0; - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - var rangeOffset = font.getUint16(); - if (!rangeOffset) { - segment.offsetIndex = -1; - continue; - } - - var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); - segment.offsetIndex = offsetIndex; - offsetsCount = Math.max(offsetsCount, offsetIndex + - segment.end - segment.start + 1); - } - - var offsets = []; - for (j = 0; j < offsetsCount; j++) { - offsets.push(font.getUint16()); - } - - for (segIndex = 0; segIndex < segCount; segIndex++) { - segment = segments[segIndex]; - start = segment.start; - var end = segment.end; - var delta = segment.delta; - offsetIndex = segment.offsetIndex; - - for (j = start; j <= end; j++) { - if (j === 0xFFFF) { - continue; - } - - glyphId = (offsetIndex < 0 ? - j : offsets[offsetIndex + j - start]); - glyphId = (glyphId + delta) & 0xFFFF; - if (glyphId === 0) { - continue; - } - mappings.push({ - charCode: j, - glyphId: glyphId - }); - } - } - } else if (format === 6) { - // Format 6 is a 2-bytes dense mapping, which means the font data - // lives glue together even if they are pretty far in the unicode - // table. (This looks weird, so I can have missed something), this - // works on Linux but seems to fails on Mac so let's rewrite the - // cmap table to a 3-1-4 style - var firstCode = font.getUint16(); - var entryCount = font.getUint16(); - - for (j = 0; j < entryCount; j++) { - glyphId = font.getUint16(); - var charCode = firstCode + j; - - mappings.push({ - charCode: charCode, - glyphId: glyphId - }); - } - } else { - warn('cmap table has unsupported format: ' + format); - return { - platformId: -1, - encodingId: -1, - mappings: [], - hasShortCmap: false - }; - } - - // removing duplicate entries - mappings.sort(function (a, b) { - return a.charCode - b.charCode; - }); - for (i = 1; i < mappings.length; i++) { - if (mappings[i - 1].charCode === mappings[i].charCode) { - mappings.splice(i, 1); - i--; - } - } - - return { - platformId: potentialTable.platformId, - encodingId: potentialTable.encodingId, - mappings: mappings, - hasShortCmap: hasShortCmap - }; - } - - function sanitizeMetrics(font, header, metrics, numGlyphs) { - if (!header) { - if (metrics) { - metrics.data = null; - } - return; - } - - font.pos = (font.start ? font.start : 0) + header.offset; - font.pos += header.length - 2; - var numOfMetrics = font.getUint16(); - - if (numOfMetrics > numGlyphs) { - info('The numOfMetrics (' + numOfMetrics + ') should not be ' + - 'greater than the numGlyphs (' + numGlyphs + ')'); - // Reduce numOfMetrics if it is greater than numGlyphs - numOfMetrics = numGlyphs; - header.data[34] = (numOfMetrics & 0xff00) >> 8; - header.data[35] = numOfMetrics & 0x00ff; - } - - var numOfSidebearings = numGlyphs - numOfMetrics; - var numMissing = numOfSidebearings - - ((metrics.length - numOfMetrics * 4) >> 1); - - if (numMissing > 0) { - // For each missing glyph, we set both the width and lsb to 0 (zero). - // Since we need to add two properties for each glyph, this explains - // the use of |numMissing * 2| when initializing the typed array. - var entries = new Uint8Array(metrics.length + numMissing * 2); - entries.set(metrics.data); - metrics.data = entries; - } - } - - function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, - hintsValid) { - if (sourceEnd - sourceStart <= 12) { - // glyph with data less than 12 is invalid one - return 0; - } - var glyf = source.subarray(sourceStart, sourceEnd); - var contoursCount = (glyf[0] << 8) | glyf[1]; - if (contoursCount & 0x8000) { - // complex glyph, writing as is - dest.set(glyf, destStart); - return glyf.length; - } - - var i, j = 10, flagsCount = 0; - for (i = 0; i < contoursCount; i++) { - var endPoint = (glyf[j] << 8) | glyf[j + 1]; - flagsCount = endPoint + 1; - j += 2; - } - // skipping instructions - var instructionsStart = j; - var instructionsLength = (glyf[j] << 8) | glyf[j + 1]; - j += 2 + instructionsLength; - var instructionsEnd = j; - // validating flags - var coordinatesLength = 0; - for (i = 0; i < flagsCount; i++) { - var flag = glyf[j++]; - if (flag & 0xC0) { - // reserved flags must be zero, cleaning up - glyf[j - 1] = flag & 0x3F; - } - var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) + - ((flag & 4) ? 1 : (flag & 32) ? 0 : 2); - coordinatesLength += xyLength; - if (flag & 8) { - var repeat = glyf[j++]; - i += repeat; - coordinatesLength += repeat * xyLength; - } - } - // glyph without coordinates will be rejected - if (coordinatesLength === 0) { - return 0; - } - var glyphDataLength = j + coordinatesLength; - if (glyphDataLength > glyf.length) { - // not enough data for coordinates - return 0; - } - if (!hintsValid && instructionsLength > 0) { - dest.set(glyf.subarray(0, instructionsStart), destStart); - dest.set([0, 0], destStart + instructionsStart); - dest.set(glyf.subarray(instructionsEnd, glyphDataLength), - destStart + instructionsStart + 2); - glyphDataLength -= instructionsLength; - if (glyf.length - glyphDataLength > 3) { - glyphDataLength = (glyphDataLength + 3) & ~3; - } - return glyphDataLength; - } - if (glyf.length - glyphDataLength > 3) { - // truncating and aligning to 4 bytes the long glyph data - glyphDataLength = (glyphDataLength + 3) & ~3; - dest.set(glyf.subarray(0, glyphDataLength), destStart); - return glyphDataLength; - } - // glyph data is fine - dest.set(glyf, destStart); - return glyf.length; - } - - function sanitizeHead(head, numGlyphs, locaLength) { - var data = head.data; - - // Validate version: - // Should always be 0x00010000 - var version = int32(data[0], data[1], data[2], data[3]); - if (version >> 16 !== 1) { - info('Attempting to fix invalid version in head table: ' + version); - data[0] = 0; - data[1] = 1; - data[2] = 0; - data[3] = 0; - } - - var indexToLocFormat = int16(data[50], data[51]); - if (indexToLocFormat < 0 || indexToLocFormat > 1) { - info('Attempting to fix invalid indexToLocFormat in head table: ' + - indexToLocFormat); - - // The value of indexToLocFormat should be 0 if the loca table - // consists of short offsets, and should be 1 if the loca table - // consists of long offsets. - // - // The number of entries in the loca table should be numGlyphs + 1. - // - // Using this information, we can work backwards to deduce if the - // size of each offset in the loca table, and thus figure out the - // appropriate value for indexToLocFormat. - - var numGlyphsPlusOne = numGlyphs + 1; - if (locaLength === numGlyphsPlusOne << 1) { - // 0x0000 indicates the loca table consists of short offsets - data[50] = 0; - data[51] = 0; - } else if (locaLength === numGlyphsPlusOne << 2) { - // 0x0001 indicates the loca table consists of long offsets - data[50] = 0; - data[51] = 1; - } else { - warn('Could not fix indexToLocFormat: ' + indexToLocFormat); - } - } - } - - function sanitizeGlyphLocations(loca, glyf, numGlyphs, - isGlyphLocationsLong, hintsValid, - dupFirstEntry) { - var itemSize, itemDecode, itemEncode; - if (isGlyphLocationsLong) { - itemSize = 4; - itemDecode = function fontItemDecodeLong(data, offset) { - return (data[offset] << 24) | (data[offset + 1] << 16) | - (data[offset + 2] << 8) | data[offset + 3]; - }; - itemEncode = function fontItemEncodeLong(data, offset, value) { - data[offset] = (value >>> 24) & 0xFF; - data[offset + 1] = (value >> 16) & 0xFF; - data[offset + 2] = (value >> 8) & 0xFF; - data[offset + 3] = value & 0xFF; - }; - } else { - itemSize = 2; - itemDecode = function fontItemDecode(data, offset) { - return (data[offset] << 9) | (data[offset + 1] << 1); - }; - itemEncode = function fontItemEncode(data, offset, value) { - data[offset] = (value >> 9) & 0xFF; - data[offset + 1] = (value >> 1) & 0xFF; - }; - } - var locaData = loca.data; - var locaDataSize = itemSize * (1 + numGlyphs); - // is loca.data too short or long? - if (locaData.length !== locaDataSize) { - locaData = new Uint8Array(locaDataSize); - locaData.set(loca.data.subarray(0, locaDataSize)); - loca.data = locaData; - } - // removing the invalid glyphs - var oldGlyfData = glyf.data; - var oldGlyfDataLength = oldGlyfData.length; - var newGlyfData = new Uint8Array(oldGlyfDataLength); - var startOffset = itemDecode(locaData, 0); - var writeOffset = 0; - var missingGlyphData = {}; - itemEncode(locaData, 0, writeOffset); - var i, j; - for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - var endOffset = itemDecode(locaData, j); - if (endOffset > oldGlyfDataLength && - ((oldGlyfDataLength + 3) & ~3) === endOffset) { - // Aspose breaks fonts by aligning the glyphs to the qword, but not - // the glyf table size, which makes last glyph out of range. - endOffset = oldGlyfDataLength; - } - if (endOffset > oldGlyfDataLength) { - // glyph end offset points outside glyf data, rejecting the glyph - itemEncode(locaData, j, writeOffset); - startOffset = endOffset; - continue; - } - - if (startOffset === endOffset) { - missingGlyphData[i] = true; - } - - var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, - newGlyfData, writeOffset, hintsValid); - writeOffset += newLength; - itemEncode(locaData, j, writeOffset); - startOffset = endOffset; - } - - if (writeOffset === 0) { - // glyf table cannot be empty -- redoing the glyf and loca tables - // to have single glyph with one point - var simpleGlyph = new Uint8Array( - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); - for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { - itemEncode(locaData, j, simpleGlyph.length); - } - glyf.data = simpleGlyph; - return missingGlyphData; - } - - if (dupFirstEntry) { - var firstEntryLength = itemDecode(locaData, itemSize); - if (newGlyfData.length > firstEntryLength + writeOffset) { - glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset); - } else { - glyf.data = new Uint8Array(firstEntryLength + writeOffset); - glyf.data.set(newGlyfData.subarray(0, writeOffset)); - } - glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset); - itemEncode(loca.data, locaData.length - itemSize, - writeOffset + firstEntryLength); - } else { - glyf.data = newGlyfData.subarray(0, writeOffset); - } - return missingGlyphData; - } - - function readPostScriptTable(post, properties, maxpNumGlyphs) { - var start = (font.start ? font.start : 0) + post.offset; - font.pos = start; - - var length = post.length, end = start + length; - var version = font.getInt32(); - // skip rest to the tables - font.getBytes(28); - - var glyphNames; - var valid = true; - var i; - - switch (version) { - case 0x00010000: - glyphNames = MacStandardGlyphOrdering; - break; - case 0x00020000: - var numGlyphs = font.getUint16(); - if (numGlyphs !== maxpNumGlyphs) { - valid = false; - break; - } - var glyphNameIndexes = []; - for (i = 0; i < numGlyphs; ++i) { - var index = font.getUint16(); - if (index >= 32768) { - valid = false; - break; - } - glyphNameIndexes.push(index); - } - if (!valid) { - break; - } - var customNames = []; - var strBuf = []; - while (font.pos < end) { - var stringLength = font.getByte(); - strBuf.length = stringLength; - for (i = 0; i < stringLength; ++i) { - strBuf[i] = String.fromCharCode(font.getByte()); - } - customNames.push(strBuf.join('')); - } - glyphNames = []; - for (i = 0; i < numGlyphs; ++i) { - var j = glyphNameIndexes[i]; - if (j < 258) { - glyphNames.push(MacStandardGlyphOrdering[j]); - continue; - } - glyphNames.push(customNames[j - 258]); - } - break; - case 0x00030000: - break; - default: - warn('Unknown/unsupported post table version ' + version); - valid = false; - if (properties.defaultEncoding) { - glyphNames = properties.defaultEncoding; - } - break; - } - properties.glyphNames = glyphNames; - return valid; - } - - function readNameTable(nameTable) { - var start = (font.start ? font.start : 0) + nameTable.offset; - font.pos = start; - - var names = [[], []]; - var length = nameTable.length, end = start + length; - var format = font.getUint16(); - var FORMAT_0_HEADER_LENGTH = 6; - if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) { - // unsupported name table format or table "too" small - return names; - } - var numRecords = font.getUint16(); - var stringsStart = font.getUint16(); - var records = []; - var NAME_RECORD_LENGTH = 12; - var i, ii; - - for (i = 0; i < numRecords && - font.pos + NAME_RECORD_LENGTH <= end; i++) { - var r = { - platform: font.getUint16(), - encoding: font.getUint16(), - language: font.getUint16(), - name: font.getUint16(), - length: font.getUint16(), - offset: font.getUint16() - }; - // using only Macintosh and Windows platform/encoding names - if ((r.platform === 1 && r.encoding === 0 && r.language === 0) || - (r.platform === 3 && r.encoding === 1 && r.language === 0x409)) { - records.push(r); - } - } - for (i = 0, ii = records.length; i < ii; i++) { - var record = records[i]; - var pos = start + stringsStart + record.offset; - if (pos + record.length > end) { - continue; // outside of name table, ignoring - } - font.pos = pos; - var nameIndex = record.name; - if (record.encoding) { - // unicode - var str = ''; - for (var j = 0, jj = record.length; j < jj; j += 2) { - str += String.fromCharCode(font.getUint16()); - } - names[1][nameIndex] = str; - } else { - names[0][nameIndex] = bytesToString(font.getBytes(record.length)); - } - } - return names; - } - - var TTOpsStackDeltas = [ - 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, - -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, - 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, - 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, - 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, - -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, - -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, - -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2]; - // 0xC0-DF == -1 and 0xE0-FF == -2 - - function sanitizeTTProgram(table, ttContext) { - var data = table.data; - var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0; - var stack = []; - var callstack = []; - var functionsCalled = []; - var tooComplexToFollowFunctions = - ttContext.tooComplexToFollowFunctions; - var inFDEF = false, ifLevel = 0, inELSE = 0; - for (var ii = data.length; i < ii;) { - var op = data[i++]; - // The TrueType instruction set docs can be found at - // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html - if (op === 0x40) { // NPUSHB - pushes n bytes - n = data[i++]; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if (op === 0x41) { // NPUSHW - pushes n words - n = data[i++]; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push((b << 8) | data[i++]); - } - } - } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes - n = op - 0xB0 + 1; - if (inFDEF || inELSE) { - i += n; - } else { - for (j = 0; j < n; j++) { - stack.push(data[i++]); - } - } - } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words - n = op - 0xB8 + 1; - if (inFDEF || inELSE) { - i += n * 2; - } else { - for (j = 0; j < n; j++) { - b = data[i++]; - stack.push((b << 8) | data[i++]); - } - } - } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL - if (!inFDEF && !inELSE) { - // collecting inforamtion about which functions are used - funcId = stack[stack.length - 1]; - ttContext.functionsUsed[funcId] = true; - if (funcId in ttContext.functionsStackDeltas) { - stack.length += ttContext.functionsStackDeltas[funcId]; - } else if (funcId in ttContext.functionsDefined && - functionsCalled.indexOf(funcId) < 0) { - callstack.push({data: data, i: i, stackTop: stack.length - 1}); - functionsCalled.push(funcId); - pc = ttContext.functionsDefined[funcId]; - if (!pc) { - warn('TT: CALL non-existent function'); - ttContext.hintsValid = false; - return; - } - data = pc.data; - i = pc.i; - } - } - } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF - if (inFDEF || inELSE) { - warn('TT: nested FDEFs not allowed'); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - // collecting inforamtion about which functions are defined - lastDeff = i; - funcId = stack.pop(); - ttContext.functionsDefined[funcId] = {data: data, i: i}; - } else if (op === 0x2D) { // ENDF - end of function - if (inFDEF) { - inFDEF = false; - lastEndf = i; - } else { - pc = callstack.pop(); - if (!pc) { - warn('TT: ENDF bad stack'); - ttContext.hintsValid = false; - return; - } - funcId = functionsCalled.pop(); - data = pc.data; - i = pc.i; - ttContext.functionsStackDeltas[funcId] = - stack.length - pc.stackTop; - } - } else if (op === 0x89) { // IDEF - instruction definition - if (inFDEF || inELSE) { - warn('TT: nested IDEFs not allowed'); - tooComplexToFollowFunctions = true; - } - inFDEF = true; - // recording it as a function to track ENDF - lastDeff = i; - } else if (op === 0x58) { // IF - ++ifLevel; - } else if (op === 0x1B) { // ELSE - inELSE = ifLevel; - } else if (op === 0x59) { // EIF - if (inELSE === ifLevel) { - inELSE = 0; - } - --ifLevel; - } else if (op === 0x1C) { // JMPR - if (!inFDEF && !inELSE) { - var offset = stack[stack.length - 1]; - // only jumping forward to prevent infinite loop - if (offset > 0) { - i += offset - 1; - } - } - } - // Adjusting stack not extactly, but just enough to get function id - if (!inFDEF && !inELSE) { - var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : - op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0; - if (op >= 0x71 && op <= 0x75) { - n = stack.pop(); - if (n === n) { - stackDelta = -n * 2; - } - } - while (stackDelta < 0 && stack.length > 0) { - stack.pop(); - stackDelta++; - } - while (stackDelta > 0) { - stack.push(NaN); // pushing any number into stack - stackDelta--; - } - } - } - ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions; - var content = [data]; - if (i > data.length) { - content.push(new Uint8Array(i - data.length)); - } - if (lastDeff > lastEndf) { - warn('TT: complementing a missing function tail'); - // new function definition started, but not finished - // complete function by [CLEAR, ENDF] - content.push(new Uint8Array([0x22, 0x2D])); - } - foldTTTable(table, content); - } - - function checkInvalidFunctions(ttContext, maxFunctionDefs) { - if (ttContext.tooComplexToFollowFunctions) { - return; - } - if (ttContext.functionsDefined.length > maxFunctionDefs) { - warn('TT: more functions defined than expected'); - ttContext.hintsValid = false; - return; - } - for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) { - if (j > maxFunctionDefs) { - warn('TT: invalid function id: ' + j); - ttContext.hintsValid = false; - return; - } - if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) { - warn('TT: undefined function: ' + j); - ttContext.hintsValid = false; - return; - } - } - } - - function foldTTTable(table, content) { - if (content.length > 1) { - // concatenating the content items - var newLength = 0; - var j, jj; - for (j = 0, jj = content.length; j < jj; j++) { - newLength += content[j].length; - } - newLength = (newLength + 3) & ~3; - var result = new Uint8Array(newLength); - var pos = 0; - for (j = 0, jj = content.length; j < jj; j++) { - result.set(content[j], pos); - pos += content[j].length; - } - table.data = result; - table.length = newLength; - } - } - - function sanitizeTTPrograms(fpgm, prep, cvt) { - var ttContext = { - functionsDefined: [], - functionsUsed: [], - functionsStackDeltas: [], - tooComplexToFollowFunctions: false, - hintsValid: true - }; - if (fpgm) { - sanitizeTTProgram(fpgm, ttContext); - } - if (prep) { - sanitizeTTProgram(prep, ttContext); - } - if (fpgm) { - checkInvalidFunctions(ttContext, maxFunctionDefs); - } - if (cvt && (cvt.length & 1)) { - var cvtData = new Uint8Array(cvt.length + 1); - cvtData.set(cvt.data); - cvt.data = cvtData; - } - return ttContext.hintsValid; - } - - // The following steps modify the original font data, making copy - font = new Stream(new Uint8Array(font.getBytes())); - - var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp', - 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF ']; - - var header = readOpenTypeHeader(font); - var numTables = header.numTables; - var cff, cffFile; - - var tables = { 'OS/2': null, cmap: null, head: null, hhea: null, - hmtx: null, maxp: null, name: null, post: null }; - var table; - for (var i = 0; i < numTables; i++) { - table = readTableEntry(font); - if (VALID_TABLES.indexOf(table.tag) < 0) { - continue; // skipping table if it's not a required or optional table - } - if (table.length === 0) { - continue; // skipping empty tables - } - tables[table.tag] = table; - } - - var isTrueType = !tables['CFF ']; - if (!isTrueType) { - // OpenType font - if ((header.version === 'OTTO' && properties.type !== 'CIDFontType2') || - !tables.head || !tables.hhea || !tables.maxp || !tables.post) { - // no major tables: throwing everything at CFFFont - cffFile = new Stream(tables['CFF '].data); - cff = new CFFFont(cffFile, properties); - - adjustWidths(properties); - - return this.convert(name, cff, properties); - } - - delete tables.glyf; - delete tables.loca; - delete tables.fpgm; - delete tables.prep; - delete tables['cvt ']; - this.isOpenType = true; - } else { - if (!tables.loca) { - error('Required "loca" table is not found'); - } - if (!tables.glyf) { - warn('Required "glyf" table is not found -- trying to recover.'); - // Note: We use `sanitizeGlyphLocations` to add dummy glyf data below. - tables.glyf = { - tag: 'glyf', - data: new Uint8Array(0), - }; - } - this.isOpenType = false; - } - - if (!tables.maxp) { - error('Required "maxp" table is not found'); - } - - font.pos = (font.start || 0) + tables.maxp.offset; - var version = font.getInt32(); - var numGlyphs = font.getUint16(); - var maxFunctionDefs = 0; - if (version >= 0x00010000 && tables.maxp.length >= 22) { - // maxZones can be invalid - font.pos += 8; - var maxZones = font.getUint16(); - if (maxZones > 2) { // reset to 2 if font has invalid maxZones - tables.maxp.data[14] = 0; - tables.maxp.data[15] = 2; - } - font.pos += 4; - maxFunctionDefs = font.getUint16(); - } - - var dupFirstEntry = false; - if (properties.type === 'CIDFontType2' && properties.toUnicode && - properties.toUnicode.get(0) > '\u0000') { - // oracle's defect (see 3427), duplicating first entry - dupFirstEntry = true; - numGlyphs++; - tables.maxp.data[4] = numGlyphs >> 8; - tables.maxp.data[5] = numGlyphs & 255; - } - - var hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep, - tables['cvt '], maxFunctionDefs); - if (!hintsValid) { - delete tables.fpgm; - delete tables.prep; - delete tables['cvt ']; - } - - // Ensure the hmtx table contains the advance width and - // sidebearings information for numGlyphs in the maxp table - sanitizeMetrics(font, tables.hhea, tables.hmtx, numGlyphs); - - if (!tables.head) { - error('Required "head" table is not found'); - } - - sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0); - - var missingGlyphs = {}; - if (isTrueType) { - var isGlyphLocationsLong = int16(tables.head.data[50], - tables.head.data[51]); - missingGlyphs = sanitizeGlyphLocations(tables.loca, tables.glyf, - numGlyphs, isGlyphLocationsLong, - hintsValid, dupFirstEntry); - } - - if (!tables.hhea) { - error('Required "hhea" table is not found'); - } - - // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth - // Sometimes it's 0. That needs to be fixed - if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) { - tables.hhea.data[10] = 0xFF; - tables.hhea.data[11] = 0xFF; - } - - // Extract some more font properties from the OpenType head and - // hhea tables; yMin and descent value are always negative. - var metricsOverride = { - unitsPerEm: int16(tables.head.data[18], tables.head.data[19]), - yMax: int16(tables.head.data[42], tables.head.data[43]), - yMin: int16(tables.head.data[38], tables.head.data[39]) - 0x10000, - ascent: int16(tables.hhea.data[4], tables.hhea.data[5]), - descent: int16(tables.hhea.data[6], tables.hhea.data[7]) - 0x10000 - }; - - // PDF FontDescriptor metrics lie -- using data from actual font. - this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm; - this.descent = metricsOverride.descent / metricsOverride.unitsPerEm; - - // The 'post' table has glyphs names. - if (tables.post) { - var valid = readPostScriptTable(tables.post, properties, numGlyphs); - if (!valid) { - tables.post = null; - } - } - - var charCodeToGlyphId = [], charCode; - var toUnicode = properties.toUnicode, widths = properties.widths; - var skipToUnicode = (toUnicode instanceof IdentityToUnicodeMap || - toUnicode.length === 0x10000); - - // Helper function to try to skip mapping of empty glyphs. - // Note: In some cases, just relying on the glyph data doesn't work, - // hence we also use a few heuristics to fix various PDF files. - function hasGlyph(glyphId, charCode, widthCode) { - if (!missingGlyphs[glyphId]) { - return true; - } - if (!skipToUnicode && charCode >= 0 && toUnicode.has(charCode)) { - return true; - } - if (widths && widthCode >= 0 && isNum(widths[widthCode])) { - return true; - } - return false; - } - - if (properties.type === 'CIDFontType2') { - var cidToGidMap = properties.cidToGidMap || []; - var isCidToGidMapEmpty = cidToGidMap.length === 0; - - properties.cMap.forEach(function(charCode, cid) { - assert(cid <= 0xffff, 'Max size of CID is 65,535'); - var glyphId = -1; - if (isCidToGidMapEmpty) { - glyphId = charCode; - } else if (cidToGidMap[cid] !== undefined) { - glyphId = cidToGidMap[cid]; - } - - if (glyphId >= 0 && glyphId < numGlyphs && - hasGlyph(glyphId, charCode, cid)) { - charCodeToGlyphId[charCode] = glyphId; - } - }); - if (dupFirstEntry) { - charCodeToGlyphId[0] = numGlyphs - 1; - } - } else { - // Most of the following logic in this code branch is based on the - // 9.6.6.4 of the PDF spec. - var hasEncoding = - properties.differences.length > 0 || !!properties.baseEncodingName; - var cmapTable = - readCmapTable(tables.cmap, font, this.isSymbolicFont, hasEncoding); - var cmapPlatformId = cmapTable.platformId; - var cmapEncodingId = cmapTable.encodingId; - var cmapMappings = cmapTable.mappings; - var cmapMappingsLength = cmapMappings.length; - - // The spec seems to imply that if the font is symbolic the encoding - // should be ignored, this doesn't appear to work for 'preistabelle.pdf' - // where the the font is symbolic and it has an encoding. - if (hasEncoding && - (cmapPlatformId === 3 && cmapEncodingId === 1 || - cmapPlatformId === 1 && cmapEncodingId === 0) || - (cmapPlatformId === -1 && cmapEncodingId === -1 && // Temporary hack - !!Encodings[properties.baseEncodingName])) { // Temporary hack - // When no preferred cmap table was found and |baseEncodingName| is - // one of the predefined encodings, we seem to obtain a better - // |charCodeToGlyphId| map from the code below (fixes bug 1057544). - // TODO: Note that this is a hack which should be removed as soon as - // we have proper support for more exotic cmap tables. - - var baseEncoding = []; - if (properties.baseEncodingName === 'MacRomanEncoding' || - properties.baseEncodingName === 'WinAnsiEncoding') { - baseEncoding = Encodings[properties.baseEncodingName]; - } - for (charCode = 0; charCode < 256; charCode++) { - var glyphName; - if (this.differences && charCode in this.differences) { - glyphName = this.differences[charCode]; - } else if (charCode in baseEncoding && - baseEncoding[charCode] !== '') { - glyphName = baseEncoding[charCode]; - } else { - glyphName = Encodings.StandardEncoding[charCode]; - } - if (!glyphName) { - continue; - } - var unicodeOrCharCode, isUnicode = false; - if (cmapPlatformId === 3 && cmapEncodingId === 1) { - unicodeOrCharCode = GlyphsUnicode[glyphName]; - isUnicode = true; - } else if (cmapPlatformId === 1 && cmapEncodingId === 0) { - // TODO: the encoding needs to be updated with mac os table. - unicodeOrCharCode = Encodings.MacRomanEncoding.indexOf(glyphName); - } - - var found = false; - for (i = 0; i < cmapMappingsLength; ++i) { - if (cmapMappings[i].charCode !== unicodeOrCharCode) { - continue; - } - var code = isUnicode ? charCode : unicodeOrCharCode; - if (hasGlyph(cmapMappings[i].glyphId, code, -1)) { - charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; - found = true; - break; - } - } - if (!found && properties.glyphNames) { - // Try to map using the post table. - var glyphId = properties.glyphNames.indexOf(glyphName); - if (glyphId > 0 && hasGlyph(glyphId, -1, -1)) { - charCodeToGlyphId[charCode] = glyphId; - found = true; - } - } - if (!found) { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } else if (cmapPlatformId === 0 && cmapEncodingId === 0) { - // Default Unicode semantics, use the charcodes as is. - for (i = 0; i < cmapMappingsLength; ++i) { - charCodeToGlyphId[cmapMappings[i].charCode] = - cmapMappings[i].glyphId; - } - } else { - // For (3, 0) cmap tables: - // The charcode key being stored in charCodeToGlyphId is the lower - // byte of the two-byte charcodes of the cmap table since according to - // the spec: 'each byte from the string shall be prepended with the - // high byte of the range [of charcodes in the cmap table], to form - // a two-byte character, which shall be used to select the - // associated glyph description from the subtable'. - // - // For (1, 0) cmap tables: - // 'single bytes from the string shall be used to look up the - // associated glyph descriptions from the subtable'. This means - // charcodes in the cmap will be single bytes, so no-op since - // glyph.charCode & 0xFF === glyph.charCode - for (i = 0; i < cmapMappingsLength; ++i) { - charCode = cmapMappings[i].charCode & 0xFF; - charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; - } - } - } - - if (charCodeToGlyphId.length === 0) { - // defines at least one glyph - charCodeToGlyphId[0] = 0; - } - - // Converting glyphs and ids into font's cmap table - var newMapping = adjustMapping(charCodeToGlyphId, properties); - this.toFontChar = newMapping.toFontChar; - tables.cmap = { - tag: 'cmap', - data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphs) - }; - - if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) { - tables['OS/2'] = { - tag: 'OS/2', - data: createOS2Table(properties, newMapping.charCodeToGlyphId, - metricsOverride) - }; - } - - // Rewrite the 'post' table if needed - if (!tables.post) { - tables.post = { - tag: 'post', - data: createPostTable(properties) - }; - } - - if (!isTrueType) { - try { - // Trying to repair CFF file - cffFile = new Stream(tables['CFF '].data); - var parser = new CFFParser(cffFile, properties); - cff = parser.parse(); - var compiler = new CFFCompiler(cff); - tables['CFF '].data = compiler.compile(); - } catch (e) { - warn('Failed to compile font ' + properties.loadedName); - } - } - - // Re-creating 'name' table - if (!tables.name) { - tables.name = { - tag: 'name', - data: createNameTable(this.name) - }; - } else { - // ... using existing 'name' table as prototype - var namePrototype = readNameTable(tables.name); - tables.name.data = createNameTable(name, namePrototype); - } - - var builder = new OpenTypeFileBuilder(header.version); - for (var tableTag in tables) { - builder.addTable(tableTag, tables[tableTag].data); - } - return builder.toArray(); - }, - - convert: function Font_convert(fontName, font, properties) { - // TODO: Check the charstring widths to determine this. - properties.fixedPitch = false; - - var mapping = font.getGlyphMapping(properties); - var newMapping = adjustMapping(mapping, properties); - this.toFontChar = newMapping.toFontChar; - var numGlyphs = font.numGlyphs; - - function getCharCodes(charCodeToGlyphId, glyphId) { - var charCodes = null; - for (var charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - if (!charCodes) { - charCodes = []; - } - charCodes.push(charCode | 0); - } - } - return charCodes; - } - - function createCharCode(charCodeToGlyphId, glyphId) { - for (var charCode in charCodeToGlyphId) { - if (glyphId === charCodeToGlyphId[charCode]) { - return charCode | 0; - } - } - newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = - glyphId; - return newMapping.nextAvailableFontCharCode++; - } - - var seacs = font.seacs; - if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) { - var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX; - var charset = font.getCharset(); - var seacMap = Object.create(null); - for (var glyphId in seacs) { - glyphId |= 0; - var seac = seacs[glyphId]; - var baseGlyphName = Encodings.StandardEncoding[seac[2]]; - var accentGlyphName = Encodings.StandardEncoding[seac[3]]; - var baseGlyphId = charset.indexOf(baseGlyphName); - var accentGlyphId = charset.indexOf(accentGlyphName); - if (baseGlyphId < 0 || accentGlyphId < 0) { - continue; - } - var accentOffset = { - x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4], - y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5] - }; - - var charCodes = getCharCodes(mapping, glyphId); - if (!charCodes) { - // There's no point in mapping it if the char code was never mapped - // to begin with. - continue; - } - for (var i = 0, ii = charCodes.length; i < ii; i++) { - var charCode = charCodes[i]; - // Find a fontCharCode that maps to the base and accent glyphs. - // If one doesn't exists, create it. - var charCodeToGlyphId = newMapping.charCodeToGlyphId; - var baseFontCharCode = createCharCode(charCodeToGlyphId, - baseGlyphId); - var accentFontCharCode = createCharCode(charCodeToGlyphId, - accentGlyphId); - seacMap[charCode] = { - baseFontCharCode: baseFontCharCode, - accentFontCharCode: accentFontCharCode, - accentOffset: accentOffset - }; - } - } - properties.seacMap = seacMap; - } - - var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]; - - var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F'); - // PostScript Font Program - builder.addTable('CFF ', font.data); - // OS/2 and Windows Specific metrics - builder.addTable('OS/2', createOS2Table(properties, - newMapping.charCodeToGlyphId)); - // Character to glyphs mapping - builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, - numGlyphs)); - // Font header - builder.addTable('head', - '\x00\x01\x00\x00' + // Version number - '\x00\x00\x10\x00' + // fontRevision - '\x00\x00\x00\x00' + // checksumAdjustement - '\x5F\x0F\x3C\xF5' + // magicNumber - '\x00\x00' + // Flags - safeString16(unitsPerEm) + // unitsPerEM - '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date - '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date - '\x00\x00' + // xMin - safeString16(properties.descent) + // yMin - '\x0F\xFF' + // xMax - safeString16(properties.ascent) + // yMax - string16(properties.italicAngle ? 2 : 0) + // macStyle - '\x00\x11' + // lowestRecPPEM - '\x00\x00' + // fontDirectionHint - '\x00\x00' + // indexToLocFormat - '\x00\x00'); // glyphDataFormat - - // Horizontal header - builder.addTable('hhea', - '\x00\x01\x00\x00' + // Version number - safeString16(properties.ascent) + // Typographic Ascent - safeString16(properties.descent) + // Typographic Descent - '\x00\x00' + // Line Gap - '\xFF\xFF' + // advanceWidthMax - '\x00\x00' + // minLeftSidebearing - '\x00\x00' + // minRightSidebearing - '\x00\x00' + // xMaxExtent - safeString16(properties.capHeight) + // caretSlopeRise - safeString16(Math.tan(properties.italicAngle) * - properties.xHeight) + // caretSlopeRun - '\x00\x00' + // caretOffset - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // -reserved- - '\x00\x00' + // metricDataFormat - string16(numGlyphs)); // Number of HMetrics - - // Horizontal metrics - builder.addTable('hmtx', (function fontFieldsHmtx() { - var charstrings = font.charstrings; - var cffWidths = font.cff ? font.cff.widths : null; - var hmtx = '\x00\x00\x00\x00'; // Fake .notdef - for (var i = 1, ii = numGlyphs; i < ii; i++) { - var width = 0; - if (charstrings) { - var charstring = charstrings[i - 1]; - width = 'width' in charstring ? charstring.width : 0; - } else if (cffWidths) { - width = Math.ceil(cffWidths[i] || 0); - } - hmtx += string16(width) + string16(0); - } - return hmtx; - })()); - - // Maximum profile - builder.addTable('maxp', - '\x00\x00\x50\x00' + // Version number - string16(numGlyphs)); // Num of glyphs - - // Naming tables - builder.addTable('name', createNameTable(fontName)); - - // PostScript informations - builder.addTable('post', createPostTable(properties)); - - return builder.toArray(); - }, - - /** - * Builds a char code to unicode map based on section 9.10 of the spec. - * @param {Object} properties Font properties object. - * @return {Object} A ToUnicodeMap object. - */ - buildToUnicode: function Font_buildToUnicode(properties) { - // Section 9.10.2 Mapping Character Codes to Unicode Values - if (properties.toUnicode && properties.toUnicode.length !== 0) { - return properties.toUnicode; - } - // According to the spec if the font is a simple font we should only map - // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or - // the differences array only contains adobe standard or symbol set names, - // in pratice it seems better to always try to create a toUnicode - // map based of the default encoding. - var toUnicode, charcode; - if (!properties.composite /* is simple font */) { - toUnicode = []; - var encoding = properties.defaultEncoding.slice(); - var baseEncodingName = properties.baseEncodingName; - // Merge in the differences array. - var differences = properties.differences; - for (charcode in differences) { - encoding[charcode] = differences[charcode]; - } - for (charcode in encoding) { - // a) Map the character code to a character name. - var glyphName = encoding[charcode]; - // b) Look up the character name in the Adobe Glyph List (see the - // Bibliography) to obtain the corresponding Unicode value. - if (glyphName === '') { - continue; - } else if (GlyphsUnicode[glyphName] === undefined) { - // (undocumented) c) Few heuristics to recognize unknown glyphs - // NOTE: Adobe Reader does not do this step, but OSX Preview does - var code = 0; - switch (glyphName[0]) { - case 'G': // Gxx glyph - if (glyphName.length === 3) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'g': // g00xx glyph - if (glyphName.length === 5) { - code = parseInt(glyphName.substr(1), 16); - } - break; - case 'C': // Cddd glyph - case 'c': // cddd glyph - if (glyphName.length >= 3) { - code = +glyphName.substr(1); - } - break; - } - if (code) { - // If |baseEncodingName| is one the predefined encodings, - // and |code| equals |charcode|, using the glyph defined in the - // baseEncoding seems to yield a better |toUnicode| mapping - // (fixes issue 5070). - if (baseEncodingName && code === +charcode) { - var baseEncoding = Encodings[baseEncodingName]; - if (baseEncoding && (glyphName = baseEncoding[charcode])) { - toUnicode[charcode] = - String.fromCharCode(GlyphsUnicode[glyphName]); - continue; - } - } - toUnicode[charcode] = String.fromCharCode(code); - } - continue; - } - toUnicode[charcode] = String.fromCharCode(GlyphsUnicode[glyphName]); - } - return new ToUnicodeMap(toUnicode); - } - // If the font is a composite font that uses one of the predefined CMaps - // listed in Table 118 (except Identity–H and Identity–V) or whose - // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or - // Adobe-Korea1 character collection: - if (properties.composite && ( - (properties.cMap.builtInCMap && - !(properties.cMap instanceof IdentityCMap)) || - (properties.cidSystemInfo.registry === 'Adobe' && - (properties.cidSystemInfo.ordering === 'GB1' || - properties.cidSystemInfo.ordering === 'CNS1' || - properties.cidSystemInfo.ordering === 'Japan1' || - properties.cidSystemInfo.ordering === 'Korea1')))) { - // Then: - // a) Map the character code to a character identifier (CID) according - // to the font’s CMap. - // b) Obtain the registry and ordering of the character collection used - // by the font’s CMap (for example, Adobe and Japan1) from its - // CIDSystemInfo dictionary. - var registry = properties.cidSystemInfo.registry; - var ordering = properties.cidSystemInfo.ordering; - // c) Construct a second CMap name by concatenating the registry and - // ordering obtained in step (b) in the format registry–ordering–UCS2 - // (for example, Adobe–Japan1–UCS2). - var ucs2CMapName = new Name(registry + '-' + ordering + '-UCS2'); - // d) Obtain the CMap with the name constructed in step (c) (available - // from the ASN Web site; see the Bibliography). - var ucs2CMap = CMapFactory.create(ucs2CMapName, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - var cMap = properties.cMap; - toUnicode = []; - cMap.forEach(function(charcode, cid) { - assert(cid <= 0xffff, 'Max size of CID is 65,535'); - // e) Map the CID obtained in step (a) according to the CMap obtained - // in step (d), producing a Unicode value. - var ucs2 = ucs2CMap.lookup(cid); - if (ucs2) { - toUnicode[charcode] = - String.fromCharCode((ucs2.charCodeAt(0) << 8) + - ucs2.charCodeAt(1)); - } - }); - return new ToUnicodeMap(toUnicode); - } - - // The viewer's choice, just use an identity map. - return new IdentityToUnicodeMap(properties.firstChar, - properties.lastChar); - }, - - get spaceWidth() { - if ('_shadowWidth' in this) { - return this._shadowWidth; - } - - // trying to estimate space character width - var possibleSpaceReplacements = ['space', 'minus', 'one', 'i']; - var width; - for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) { - var glyphName = possibleSpaceReplacements[i]; - // if possible, getting width by glyph name - if (glyphName in this.widths) { - width = this.widths[glyphName]; - break; - } - var glyphUnicode = GlyphsUnicode[glyphName]; - // finding the charcode via unicodeToCID map - var charcode = 0; - if (this.composite) { - if (this.cMap.contains(glyphUnicode)) { - charcode = this.cMap.lookup(glyphUnicode); - } - } - // ... via toUnicode map - if (!charcode && this.toUnicode) { - charcode = this.toUnicode.charCodeOf(glyphUnicode); - } - // setting it to unicode if negative or undefined - if (charcode <= 0) { - charcode = glyphUnicode; - } - // trying to get width via charcode - width = this.widths[charcode]; - if (width) { - break; // the non-zero width found - } - } - width = width || this.defaultWidth; - // Do not shadow the property here. See discussion: - // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280 - this._shadowWidth = width; - return width; - }, - - charToGlyph: function Font_charToGlyph(charcode, isSpace) { - var fontCharCode, width, operatorListId; - - var widthCode = charcode; - if (this.cMap && this.cMap.contains(charcode)) { - widthCode = this.cMap.lookup(charcode); - } - width = this.widths[widthCode]; - width = isNum(width) ? width : this.defaultWidth; - var vmetric = this.vmetrics && this.vmetrics[widthCode]; - - var unicode = this.toUnicode.get(charcode) || charcode; - if (typeof unicode === 'number') { - unicode = String.fromCharCode(unicode); - } - - // First try the toFontChar map, if it's not there then try falling - // back to the char code. - fontCharCode = this.toFontChar[charcode] || charcode; - if (this.missingFile) { - fontCharCode = mapSpecialUnicodeValues(fontCharCode); - } - - if (this.isType3Font) { - // Font char code in this case is actually a glyph name. - operatorListId = fontCharCode; - } - - var accent = null; - if (this.seacMap && this.seacMap[charcode]) { - var seac = this.seacMap[charcode]; - fontCharCode = seac.baseFontCharCode; - accent = { - fontChar: String.fromCharCode(seac.accentFontCharCode), - offset: seac.accentOffset - }; - } - - var fontChar = String.fromCharCode(fontCharCode); - - var glyph = this.glyphCache[charcode]; - if (!glyph || - !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace)) { - glyph = new Glyph(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace); - this.glyphCache[charcode] = glyph; - } - return glyph; - }, - - charsToGlyphs: function Font_charsToGlyphs(chars) { - var charsCache = this.charsCache; - var glyphs, glyph, charcode; - - // if we translated this string before, just grab it from the cache - if (charsCache) { - glyphs = charsCache[chars]; - if (glyphs) { - return glyphs; - } - } - - // lazily create the translation cache - if (!charsCache) { - charsCache = this.charsCache = Object.create(null); - } - - glyphs = []; - var charsCacheKey = chars; - var i = 0, ii; - - if (this.cMap) { - // composite fonts have multi-byte strings convert the string from - // single-byte to multi-byte - var c = {}; - while (i < chars.length) { - this.cMap.readCharCode(chars, i, c); - charcode = c.charcode; - var length = c.length; - i += length; - // Space is char with code 0x20 and length 1 in multiple-byte codes. - var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20; - glyph = this.charToGlyph(charcode, isSpace); - glyphs.push(glyph); - } - } else { - for (i = 0, ii = chars.length; i < ii; ++i) { - charcode = chars.charCodeAt(i); - glyph = this.charToGlyph(charcode, charcode === 0x20); - glyphs.push(glyph); - } - } - - // Enter the translated string into the cache - return (charsCache[charsCacheKey] = glyphs); - } - }; - - return Font; -})(); - -var ErrorFont = (function ErrorFontClosure() { - function ErrorFont(error) { - this.error = error; - this.loadedName = 'g_font_error'; - this.loading = false; - } - - ErrorFont.prototype = { - charsToGlyphs: function ErrorFont_charsToGlyphs() { - return []; - }, - exportData: function ErrorFont_exportData() { - return {error: this.error}; - } - }; - - return ErrorFont; -})(); - -/** - * Shared logic for building a char code to glyph id mapping for Type1 and - * simple CFF fonts. See section 9.6.6.2 of the spec. - * @param {Object} properties Font properties object. - * @param {Object} builtInEncoding The encoding contained within the actual font - * data. - * @param {Array} Array of glyph names where the index is the glyph ID. - * @returns {Object} A char code to glyph ID map. - */ -function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) { - var charCodeToGlyphId = Object.create(null); - var glyphId, charCode, baseEncoding; - - if (properties.baseEncodingName) { - // If a valid base encoding name was used, the mapping is initialized with - // that. - baseEncoding = Encodings[properties.baseEncodingName]; - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } else if (!!(properties.flags & FontFlags.Symbolic)) { - // For a symbolic font the encoding should be the fonts built-in - // encoding. - for (charCode in builtInEncoding) { - charCodeToGlyphId[charCode] = builtInEncoding[charCode]; - } - } else { - // For non-symbolic fonts that don't have a base encoding the standard - // encoding should be used. - baseEncoding = Encodings.StandardEncoding; - for (charCode = 0; charCode < baseEncoding.length; charCode++) { - glyphId = glyphNames.indexOf(baseEncoding[charCode]); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - - // Lastly, merge in the differences. - var differences = properties.differences; - if (differences) { - for (charCode in differences) { - var glyphName = differences[charCode]; - glyphId = glyphNames.indexOf(glyphName); - if (glyphId >= 0) { - charCodeToGlyphId[charCode] = glyphId; - } else { - charCodeToGlyphId[charCode] = 0; // notdef - } - } - } - return charCodeToGlyphId; -} - -/* - * CharStrings are encoded following the the CharString Encoding sequence - * describe in Chapter 6 of the "Adobe Type1 Font Format" specification. - * The value in a byte indicates a command, a number, or subsequent bytes - * that are to be interpreted in a special way. - * - * CharString Number Encoding: - * A CharString byte containing the values from 32 through 255 inclusive - * indicate an integer. These values are decoded in four ranges. - * - * 1. A CharString byte containing a value, v, between 32 and 246 inclusive, - * indicate the integer v - 139. Thus, the integer values from -107 through - * 107 inclusive may be encoded in single byte. - * - * 2. A CharString byte containing a value, v, between 247 and 250 inclusive, - * indicates an integer involving the next byte, w, according to the formula: - * [(v - 247) x 256] + w + 108 - * - * 3. A CharString byte containing a value, v, between 251 and 254 inclusive, - * indicates an integer involving the next byte, w, according to the formula: - * -[(v - 251) * 256] - w - 108 - * - * 4. A CharString containing the value 255 indicates that the next 4 bytes - * are a two complement signed integer. The first of these bytes contains the - * highest order bits, the second byte contains the next higher order bits - * and the fourth byte contain the lowest order bits. - * - * - * CharString Command Encoding: - * CharStrings commands are encoded in 1 or 2 bytes. - * - * Single byte commands are encoded in 1 byte that contains a value between - * 0 and 31 inclusive. - * If a command byte contains the value 12, then the value in the next byte - * indicates a command. This "escape" mechanism allows many extra commands - * to be encoded and this encoding technique helps to minimize the length of - * the charStrings. - */ -var Type1CharString = (function Type1CharStringClosure() { - var COMMAND_MAP = { - 'hstem': [1], - 'vstem': [3], - 'vmoveto': [4], - 'rlineto': [5], - 'hlineto': [6], - 'vlineto': [7], - 'rrcurveto': [8], - 'callsubr': [10], - 'flex': [12, 35], - 'drop' : [12, 18], - 'endchar': [14], - 'rmoveto': [21], - 'hmoveto': [22], - 'vhcurveto': [30], - 'hvcurveto': [31] - }; - - function Type1CharString() { - this.width = 0; - this.lsb = 0; - this.flexing = false; - this.output = []; - this.stack = []; - } - - Type1CharString.prototype = { - convert: function Type1CharString_convert(encoded, subrs) { - var count = encoded.length; - var error = false; - var wx, sbx, subrNumber; - for (var i = 0; i < count; i++) { - var value = encoded[i]; - if (value < 32) { - if (value === 12) { - value = (value << 8) + encoded[++i]; - } - switch (value) { - case 1: // hstem - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case 3: // vstem - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case 4: // vmoveto - if (this.flexing) { - if (this.stack.length < 1) { - error = true; - break; - } - // Add the dx for flex and but also swap the values so they are - // the right order. - var dy = this.stack.pop(); - this.stack.push(0, dy); - break; - } - error = this.executeCommand(1, COMMAND_MAP.vmoveto); - break; - case 5: // rlineto - error = this.executeCommand(2, COMMAND_MAP.rlineto); - break; - case 6: // hlineto - error = this.executeCommand(1, COMMAND_MAP.hlineto); - break; - case 7: // vlineto - error = this.executeCommand(1, COMMAND_MAP.vlineto); - break; - case 8: // rrcurveto - error = this.executeCommand(6, COMMAND_MAP.rrcurveto); - break; - case 9: // closepath - // closepath is a Type1 command that does not take argument and is - // useless in Type2 and it can simply be ignored. - this.stack = []; - break; - case 10: // callsubr - if (this.stack.length < 1) { - error = true; - break; - } - subrNumber = this.stack.pop(); - error = this.convert(subrs[subrNumber], subrs); - break; - case 11: // return - return error; - case 13: // hsbw - if (this.stack.length < 2) { - error = true; - break; - } - // To convert to type2 we have to move the width value to the - // first part of the charstring and then use hmoveto with lsb. - wx = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx); - error = this.executeCommand(2, COMMAND_MAP.hmoveto); - break; - case 14: // endchar - this.output.push(COMMAND_MAP.endchar[0]); - break; - case 21: // rmoveto - if (this.flexing) { - break; - } - error = this.executeCommand(2, COMMAND_MAP.rmoveto); - break; - case 22: // hmoveto - if (this.flexing) { - // Add the dy for flex. - this.stack.push(0); - break; - } - error = this.executeCommand(1, COMMAND_MAP.hmoveto); - break; - case 30: // vhcurveto - error = this.executeCommand(4, COMMAND_MAP.vhcurveto); - break; - case 31: // hvcurveto - error = this.executeCommand(4, COMMAND_MAP.hvcurveto); - break; - case (12 << 8) + 0: // dotsection - // dotsection is a Type1 command to specify some hinting feature - // for dots that do not take a parameter and it can safely be - // ignored for Type2. - this.stack = []; - break; - case (12 << 8) + 1: // vstem3 - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - // [vh]stem3 are Type1 only and Type2 supports [vh]stem with - // multiple parameters, so instead of returning [vh]stem3 take a - // shortcut and return [vhstem] instead. - error = this.executeCommand(2, COMMAND_MAP.vstem); - break; - case (12 << 8) + 2: // hstem3 - if (!HINTING_ENABLED) { - this.stack = []; - break; - } - // See vstem3. - error = this.executeCommand(2, COMMAND_MAP.hstem); - break; - case (12 << 8) + 6: // seac - // seac is like type 2's special endchar but it doesn't use the - // first argument asb, so remove it. - if (SEAC_ANALYSIS_ENABLED) { - this.seac = this.stack.splice(-4, 4); - error = this.executeCommand(0, COMMAND_MAP.endchar); - } else { - error = this.executeCommand(4, COMMAND_MAP.endchar); - } - break; - case (12 << 8) + 7: // sbw - if (this.stack.length < 4) { - error = true; - break; - } - // To convert to type2 we have to move the width value to the - // first part of the charstring and then use rmoveto with - // (dx, dy). The height argument will not be used for vmtx and - // vhea tables reconstruction -- ignoring it. - var wy = this.stack.pop(); - wx = this.stack.pop(); - var sby = this.stack.pop(); - sbx = this.stack.pop(); - this.lsb = sbx; - this.width = wx; - this.stack.push(wx, sbx, sby); - error = this.executeCommand(3, COMMAND_MAP.rmoveto); - break; - case (12 << 8) + 12: // div - if (this.stack.length < 2) { - error = true; - break; - } - var num2 = this.stack.pop(); - var num1 = this.stack.pop(); - this.stack.push(num1 / num2); - break; - case (12 << 8) + 16: // callothersubr - if (this.stack.length < 2) { - error = true; - break; - } - subrNumber = this.stack.pop(); - var numArgs = this.stack.pop(); - if (subrNumber === 0 && numArgs === 3) { - var flexArgs = this.stack.splice(this.stack.length - 17, 17); - this.stack.push( - flexArgs[2] + flexArgs[0], // bcp1x + rpx - flexArgs[3] + flexArgs[1], // bcp1y + rpy - flexArgs[4], // bcp2x - flexArgs[5], // bcp2y - flexArgs[6], // p2x - flexArgs[7], // p2y - flexArgs[8], // bcp3x - flexArgs[9], // bcp3y - flexArgs[10], // bcp4x - flexArgs[11], // bcp4y - flexArgs[12], // p3x - flexArgs[13], // p3y - flexArgs[14] // flexDepth - // 15 = finalx unused by flex - // 16 = finaly unused by flex - ); - error = this.executeCommand(13, COMMAND_MAP.flex, true); - this.flexing = false; - this.stack.push(flexArgs[15], flexArgs[16]); - } else if (subrNumber === 1 && numArgs === 0) { - this.flexing = true; - } - break; - case (12 << 8) + 17: // pop - // Ignore this since it is only used with othersubr. - break; - case (12 << 8) + 33: // setcurrentpoint - // Ignore for now. - this.stack = []; - break; - default: - warn('Unknown type 1 charstring command of "' + value + '"'); - break; - } - if (error) { - break; - } - continue; - } else if (value <= 246) { - value = value - 139; - } else if (value <= 250) { - value = ((value - 247) * 256) + encoded[++i] + 108; - } else if (value <= 254) { - value = -((value - 251) * 256) - encoded[++i] - 108; - } else { - value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | - (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0; - } - this.stack.push(value); - } - return error; - }, - - executeCommand: function(howManyArgs, command, keepStack) { - var stackLength = this.stack.length; - if (howManyArgs > stackLength) { - return true; - } - var start = stackLength - howManyArgs; - for (var i = start; i < stackLength; i++) { - var value = this.stack[i]; - if (value === (value | 0)) { // int - this.output.push(28, (value >> 8) & 0xff, value & 0xff); - } else { // fixed point - value = (65536 * value) | 0; - this.output.push(255, - (value >> 24) & 0xFF, - (value >> 16) & 0xFF, - (value >> 8) & 0xFF, - value & 0xFF); - } - } - this.output.push.apply(this.output, command); - if (keepStack) { - this.stack.splice(start, howManyArgs); - } else { - this.stack.length = 0; - } - return false; - } - }; - - return Type1CharString; -})(); - -/* - * Type1Parser encapsulate the needed code for parsing a Type1 font - * program. Some of its logic depends on the Type2 charstrings - * structure. - * Note: this doesn't really parse the font since that would require evaluation - * of PostScript, but it is possible in most cases to extract what we need - * without a full parse. - */ -var Type1Parser = (function Type1ParserClosure() { - /* - * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence - * of Plaintext Bytes. The function took a key as a parameter which can be - * for decrypting the eexec block of for decoding charStrings. - */ - var EEXEC_ENCRYPT_KEY = 55665; - var CHAR_STRS_ENCRYPT_KEY = 4330; - - function isHexDigit(code) { - return code >= 48 && code <= 57 || // '0'-'9' - code >= 65 && code <= 70 || // 'A'-'F' - code >= 97 && code <= 102; // 'a'-'f' - } - - function decrypt(data, key, discardNumber) { - var r = key | 0, c1 = 52845, c2 = 22719; - var count = data.length; - var decrypted = new Uint8Array(count); - for (var i = 0; i < count; i++) { - var value = data[i]; - decrypted[i] = value ^ (r >> 8); - r = ((value + r) * c1 + c2) & ((1 << 16) - 1); - } - return Array.prototype.slice.call(decrypted, discardNumber); - } - - function decryptAscii(data, key, discardNumber) { - var r = key | 0, c1 = 52845, c2 = 22719; - var count = data.length, maybeLength = count >>> 1; - var decrypted = new Uint8Array(maybeLength); - var i, j; - for (i = 0, j = 0; i < count; i++) { - var digit1 = data[i]; - if (!isHexDigit(digit1)) { - continue; - } - i++; - var digit2; - while (i < count && !isHexDigit(digit2 = data[i])) { - i++; - } - if (i < count) { - var value = parseInt(String.fromCharCode(digit1, digit2), 16); - decrypted[j++] = value ^ (r >> 8); - r = ((value + r) * c1 + c2) & ((1 << 16) - 1); - } - } - return Array.prototype.slice.call(decrypted, discardNumber, j); - } - - function isSpecial(c) { - return c === 0x2F || // '/' - c === 0x5B || c === 0x5D || // '[', ']' - c === 0x7B || c === 0x7D || // '{', '}' - c === 0x28 || c === 0x29; // '(', ')' - } - - function Type1Parser(stream, encrypted) { - if (encrypted) { - var data = stream.getBytes(); - var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && - isHexDigit(data[2]) && isHexDigit(data[3])); - stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : - decryptAscii(data, EEXEC_ENCRYPT_KEY, 4)); - } - this.stream = stream; - this.nextChar(); - } - - Type1Parser.prototype = { - readNumberArray: function Type1Parser_readNumberArray() { - this.getToken(); // read '[' or '{' (arrays can start with either) - var array = []; - while (true) { - var token = this.getToken(); - if (token === null || token === ']' || token === '}') { - break; - } - array.push(parseFloat(token || 0)); - } - return array; - }, - - readNumber: function Type1Parser_readNumber() { - var token = this.getToken(); - return parseFloat(token || 0); - }, - - readInt: function Type1Parser_readInt() { - // Use '| 0' to prevent setting a double into length such as the double - // does not flow into the loop variable. - var token = this.getToken(); - return parseInt(token || 0, 10) | 0; - }, - - readBoolean: function Type1Parser_readBoolean() { - var token = this.getToken(); - - // Use 1 and 0 since that's what type2 charstrings use. - return token === 'true' ? 1 : 0; - }, - - nextChar : function Type1_nextChar() { - return (this.currentChar = this.stream.getByte()); - }, - - getToken: function Type1Parser_getToken() { - // Eat whitespace and comments. - var comment = false; - var ch = this.currentChar; - while (true) { - if (ch === -1) { - return null; - } - - if (comment) { - if (ch === 0x0A || ch === 0x0D) { - comment = false; - } - } else if (ch === 0x25) { // '%' - comment = true; - } else if (!Lexer.isSpace(ch)) { - break; - } - ch = this.nextChar(); - } - if (isSpecial(ch)) { - this.nextChar(); - return String.fromCharCode(ch); - } - var token = ''; - do { - token += String.fromCharCode(ch); - ch = this.nextChar(); - } while (ch >= 0 && !Lexer.isSpace(ch) && !isSpecial(ch)); - return token; - }, - - /* - * Returns an object containing a Subrs array and a CharStrings - * array extracted from and eexec encrypted block of data - */ - extractFontProgram: function Type1Parser_extractFontProgram() { - var stream = this.stream; - - var subrs = [], charstrings = []; - var program = { - subrs: [], - charstrings: [], - properties: { - 'privateData': { - 'lenIV': 4 - } - } - }; - var token, length, data, lenIV, encoded; - while ((token = this.getToken()) !== null) { - if (token !== '/') { - continue; - } - token = this.getToken(); - switch (token) { - case 'CharStrings': - // The number immediately following CharStrings must be greater or - // equal to the number of CharStrings. - this.getToken(); - this.getToken(); // read in 'dict' - this.getToken(); // read in 'dup' - this.getToken(); // read in 'begin' - while(true) { - token = this.getToken(); - if (token === null || token === 'end') { - break; - } - - if (token !== '/') { - continue; - } - var glyph = this.getToken(); - length = this.readInt(); - this.getToken(); // read in 'RD' or '-|' - data = stream.makeSubStream(stream.pos, length); - lenIV = program.properties.privateData['lenIV']; - encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); - // Skip past the required space and binary data. - stream.skip(length); - this.nextChar(); - token = this.getToken(); // read in 'ND' or '|-' - if (token === 'noaccess') { - this.getToken(); // read in 'def' - } - charstrings.push({ - glyph: glyph, - encoded: encoded - }); - } - break; - case 'Subrs': - var num = this.readInt(); - this.getToken(); // read in 'array' - while ((token = this.getToken()) === 'dup') { - var index = this.readInt(); - length = this.readInt(); - this.getToken(); // read in 'RD' or '-|' - data = stream.makeSubStream(stream.pos, length); - lenIV = program.properties.privateData['lenIV']; - encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV); - // Skip past the required space and binary data. - stream.skip(length); - this.nextChar(); - token = this.getToken(); // read in 'NP' or '|' - if (token === 'noaccess') { - this.getToken(); // read in 'put' - } - subrs[index] = encoded; - } - break; - case 'BlueValues': - case 'OtherBlues': - case 'FamilyBlues': - case 'FamilyOtherBlues': - var blueArray = this.readNumberArray(); - // *Blue* values may contain invalid data: disables reading of - // those values when hinting is disabled. - if (blueArray.length > 0 && (blueArray.length % 2) === 0 && - HINTING_ENABLED) { - program.properties.privateData[token] = blueArray; - } - break; - case 'StemSnapH': - case 'StemSnapV': - program.properties.privateData[token] = this.readNumberArray(); - break; - case 'StdHW': - case 'StdVW': - program.properties.privateData[token] = - this.readNumberArray()[0]; - break; - case 'BlueShift': - case 'lenIV': - case 'BlueFuzz': - case 'BlueScale': - case 'LanguageGroup': - case 'ExpansionFactor': - program.properties.privateData[token] = this.readNumber(); - break; - case 'ForceBold': - program.properties.privateData[token] = this.readBoolean(); - break; - } - } - - for (var i = 0; i < charstrings.length; i++) { - glyph = charstrings[i].glyph; - encoded = charstrings[i].encoded; - var charString = new Type1CharString(); - var error = charString.convert(encoded, subrs); - var output = charString.output; - if (error) { - // It seems when FreeType encounters an error while evaluating a glyph - // that it completely ignores the glyph so we'll mimic that behaviour - // here and put an endchar to make the validator happy. - output = [14]; - } - program.charstrings.push({ - glyphName: glyph, - charstring: output, - width: charString.width, - lsb: charString.lsb, - seac: charString.seac - }); - } - - return program; - }, - - extractFontHeader: function Type1Parser_extractFontHeader(properties) { - var token; - while ((token = this.getToken()) !== null) { - if (token !== '/') { - continue; - } - token = this.getToken(); - switch (token) { - case 'FontMatrix': - var matrix = this.readNumberArray(); - properties.fontMatrix = matrix; - break; - case 'Encoding': - var encodingArg = this.getToken(); - var encoding; - if (!/^\d+$/.test(encodingArg)) { - // encoding name is specified - encoding = Encodings[encodingArg]; - } else { - encoding = []; - var size = parseInt(encodingArg, 10) | 0; - this.getToken(); // read in 'array' - - for (var j = 0; j < size; j++) { - token = this.getToken(); - // skipping till first dup or def (e.g. ignoring for statement) - while (token !== 'dup' && token !== 'def') { - token = this.getToken(); - if (token === null) { - return; // invalid header - } - } - if (token === 'def') { - break; // read all array data - } - var index = this.readInt(); - this.getToken(); // read in '/' - var glyph = this.getToken(); - encoding[index] = glyph; - this.getToken(); // read the in 'put' - } - } - properties.builtInEncoding = encoding; - break; - case 'FontBBox': - var fontBBox = this.readNumberArray(); - // adjusting ascent/descent - properties.ascent = fontBBox[3]; - properties.descent = fontBBox[1]; - properties.ascentScaled = true; - break; - } - } - } - }; - - return Type1Parser; -})(); - -/** - * The CFF class takes a Type1 file and wrap it into a - * 'Compact Font Format' which itself embed Type2 charstrings. - */ -var CFFStandardStrings = [ - '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', - 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', - 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', - 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', - 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', - 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', - 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', - 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', - 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', - 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', - 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', - 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', - 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', - 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', - 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', - 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', - 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', - 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', - 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', - 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', - 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', - 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', - 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', - 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', - 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', - 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', - 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', - 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', - 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall', - 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', - 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', - 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', - 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', - 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', - 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', - 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', - 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', - 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', - 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', - 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', - 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', - 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', - 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', - 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', - 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', - 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth', - 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', - 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', - 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', - 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', - 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', - 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', - 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', - 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', - 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', - 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', - 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', - 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', - 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', - 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', - 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold' -]; - -// Type1Font is also a CIDFontType0. -var Type1Font = function Type1Font(name, file, properties) { - // Some bad generators embed pfb file as is, we have to strip 6-byte headers. - // Also, length1 and length2 might be off by 6 bytes as well. - // http://www.math.ubc.ca/~cass/piscript/type1.pdf - var PFB_HEADER_SIZE = 6; - var headerBlockLength = properties.length1; - var eexecBlockLength = properties.length2; - var pfbHeader = file.peekBytes(PFB_HEADER_SIZE); - var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01; - if (pfbHeaderPresent) { - file.skip(PFB_HEADER_SIZE); - headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | - (pfbHeader[3] << 8) | pfbHeader[2]; - } - - // Get the data block containing glyphs and subrs informations - var headerBlock = new Stream(file.getBytes(headerBlockLength)); - var headerBlockParser = new Type1Parser(headerBlock); - headerBlockParser.extractFontHeader(properties); - - if (pfbHeaderPresent) { - pfbHeader = file.getBytes(PFB_HEADER_SIZE); - eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) | - (pfbHeader[3] << 8) | pfbHeader[2]; - } - - // Decrypt the data blocks and retrieve it's content - var eexecBlock = new Stream(file.getBytes(eexecBlockLength)); - var eexecBlockParser = new Type1Parser(eexecBlock, true); - var data = eexecBlockParser.extractFontProgram(); - for (var info in data.properties) { - properties[info] = data.properties[info]; - } - - var charstrings = data.charstrings; - var type2Charstrings = this.getType2Charstrings(charstrings); - var subrs = this.getType2Subrs(data.subrs); - - this.charstrings = charstrings; - this.data = this.wrap(name, type2Charstrings, this.charstrings, - subrs, properties); - this.seacs = this.getSeacs(data.charstrings); -}; - -Type1Font.prototype = { - get numGlyphs() { - return this.charstrings.length + 1; - }, - - getCharset: function Type1Font_getCharset() { - var charset = ['.notdef']; - var charstrings = this.charstrings; - for (var glyphId = 0; glyphId < charstrings.length; glyphId++) { - charset.push(charstrings[glyphId].glyphName); - } - return charset; - }, - - getGlyphMapping: function Type1Font_getGlyphMapping(properties) { - var charstrings = this.charstrings; - var glyphNames = ['.notdef'], glyphId; - for (glyphId = 0; glyphId < charstrings.length; glyphId++) { - glyphNames.push(charstrings[glyphId].glyphName); - } - var encoding = properties.builtInEncoding; - if (encoding) { - var builtInEncoding = {}; - for (var charCode in encoding) { - glyphId = glyphNames.indexOf(encoding[charCode]); - if (glyphId >= 0) { - builtInEncoding[charCode] = glyphId; - } - } - } - - return type1FontGlyphMapping(properties, builtInEncoding, glyphNames); - }, - - getSeacs: function Type1Font_getSeacs(charstrings) { - var i, ii; - var seacMap = []; - for (i = 0, ii = charstrings.length; i < ii; i++) { - var charstring = charstrings[i]; - if (charstring.seac) { - // Offset by 1 for .notdef - seacMap[i + 1] = charstring.seac; - } - } - return seacMap; - }, - - getType2Charstrings: function Type1Font_getType2Charstrings( - type1Charstrings) { - var type2Charstrings = []; - for (var i = 0, ii = type1Charstrings.length; i < ii; i++) { - type2Charstrings.push(type1Charstrings[i].charstring); - } - return type2Charstrings; - }, - - getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) { - var bias = 0; - var count = type1Subrs.length; - if (count < 1133) { - bias = 107; - } else if (count < 33769) { - bias = 1131; - } else { - bias = 32768; - } - - // Add a bunch of empty subrs to deal with the Type2 bias - var type2Subrs = []; - var i; - for (i = 0; i < bias; i++) { - type2Subrs.push([0x0B]); - } - - for (i = 0; i < count; i++) { - type2Subrs.push(type1Subrs[i]); - } - - return type2Subrs; - }, - - wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) { - var cff = new CFF(); - cff.header = new CFFHeader(1, 0, 4, 4); - - cff.names = [name]; - - var topDict = new CFFTopDict(); - // CFF strings IDs 0...390 are predefined names, so refering - // to entries in our own String INDEX starts at SID 391. - topDict.setByName('version', 391); - topDict.setByName('Notice', 392); - topDict.setByName('FullName', 393); - topDict.setByName('FamilyName', 394); - topDict.setByName('Weight', 395); - topDict.setByName('Encoding', null); // placeholder - topDict.setByName('FontMatrix', properties.fontMatrix); - topDict.setByName('FontBBox', properties.bbox); - topDict.setByName('charset', null); // placeholder - topDict.setByName('CharStrings', null); // placeholder - topDict.setByName('Private', null); // placeholder - cff.topDict = topDict; - - var strings = new CFFStrings(); - strings.add('Version 0.11'); // Version - strings.add('See original notice'); // Notice - strings.add(name); // FullName - strings.add(name); // FamilyName - strings.add('Medium'); // Weight - cff.strings = strings; - - cff.globalSubrIndex = new CFFIndex(); - - var count = glyphs.length; - var charsetArray = [0]; - var i, ii; - for (i = 0; i < count; i++) { - var index = CFFStandardStrings.indexOf(charstrings[i].glyphName); - // TODO: Insert the string and correctly map it. Previously it was - // thought mapping names that aren't in the standard strings to .notdef - // was fine, however in issue818 when mapping them all to .notdef the - // adieresis glyph no longer worked. - if (index === -1) { - index = 0; - } - charsetArray.push((index >> 8) & 0xff, index & 0xff); - } - cff.charset = new CFFCharset(false, 0, [], charsetArray); - - var charStringsIndex = new CFFIndex(); - charStringsIndex.add([0x8B, 0x0E]); // .notdef - for (i = 0; i < count; i++) { - charStringsIndex.add(glyphs[i]); - } - cff.charStrings = charStringsIndex; - - var privateDict = new CFFPrivateDict(); - privateDict.setByName('Subrs', null); // placeholder - var fields = [ - 'BlueValues', - 'OtherBlues', - 'FamilyBlues', - 'FamilyOtherBlues', - 'StemSnapH', - 'StemSnapV', - 'BlueShift', - 'BlueFuzz', - 'BlueScale', - 'LanguageGroup', - 'ExpansionFactor', - 'ForceBold', - 'StdHW', - 'StdVW' - ]; - for (i = 0, ii = fields.length; i < ii; i++) { - var field = fields[i]; - if (!properties.privateData.hasOwnProperty(field)) { - continue; - } - var value = properties.privateData[field]; - if (isArray(value)) { - // All of the private dictionary array data in CFF must be stored as - // "delta-encoded" numbers. - for (var j = value.length - 1; j > 0; j--) { - value[j] -= value[j - 1]; // ... difference from previous value - } - } - privateDict.setByName(field, value); - } - cff.topDict.privateDict = privateDict; - - var subrIndex = new CFFIndex(); - for (i = 0, ii = subrs.length; i < ii; i++) { - subrIndex.add(subrs[i]); - } - privateDict.subrsIndex = subrIndex; - - var compiler = new CFFCompiler(cff); - return compiler.compile(); - } -}; - -var CFFFont = (function CFFFontClosure() { - function CFFFont(file, properties) { - this.properties = properties; - - var parser = new CFFParser(file, properties); - this.cff = parser.parse(); - var compiler = new CFFCompiler(this.cff); - this.seacs = this.cff.seacs; - try { - this.data = compiler.compile(); - } catch (e) { - warn('Failed to compile font ' + properties.loadedName); - // There may have just been an issue with the compiler, set the data - // anyway and hope the font loaded. - this.data = file; - } - } - - CFFFont.prototype = { - get numGlyphs() { - return this.cff.charStrings.count; - }, - getCharset: function CFFFont_getCharset() { - return this.cff.charset.charset; - }, - getGlyphMapping: function CFFFont_getGlyphMapping() { - var cff = this.cff; - var properties = this.properties; - var charsets = cff.charset.charset; - var charCodeToGlyphId; - var glyphId; - - if (properties.composite) { - charCodeToGlyphId = Object.create(null); - if (cff.isCIDFont) { - // If the font is actually a CID font then we should use the charset - // to map CIDs to GIDs. - for (glyphId = 0; glyphId < charsets.length; glyphId++) { - var cid = charsets[glyphId]; - var charCode = properties.cMap.charCodeOf(cid); - charCodeToGlyphId[charCode] = glyphId; - } - } else { - // If it is NOT actually a CID font then CIDs should be mapped - // directly to GIDs. - for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) { - charCodeToGlyphId[glyphId] = glyphId; - } - } - return charCodeToGlyphId; - } - - var encoding = cff.encoding ? cff.encoding.encoding : null; - charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets); - return charCodeToGlyphId; - } - }; - - return CFFFont; -})(); - -var CFFParser = (function CFFParserClosure() { - var CharstringValidationData = [ - null, - { id: 'hstem', min: 2, stackClearing: true, stem: true }, - null, - { id: 'vstem', min: 2, stackClearing: true, stem: true }, - { id: 'vmoveto', min: 1, stackClearing: true }, - { id: 'rlineto', min: 2, resetStack: true }, - { id: 'hlineto', min: 1, resetStack: true }, - { id: 'vlineto', min: 1, resetStack: true }, - { id: 'rrcurveto', min: 6, resetStack: true }, - null, - { id: 'callsubr', min: 1, undefStack: true }, - { id: 'return', min: 0, undefStack: true }, - null, // 12 - null, - { id: 'endchar', min: 0, stackClearing: true }, - null, - null, - null, - { id: 'hstemhm', min: 2, stackClearing: true, stem: true }, - { id: 'hintmask', min: 0, stackClearing: true }, - { id: 'cntrmask', min: 0, stackClearing: true }, - { id: 'rmoveto', min: 2, stackClearing: true }, - { id: 'hmoveto', min: 1, stackClearing: true }, - { id: 'vstemhm', min: 2, stackClearing: true, stem: true }, - { id: 'rcurveline', min: 8, resetStack: true }, - { id: 'rlinecurve', min: 8, resetStack: true }, - { id: 'vvcurveto', min: 4, resetStack: true }, - { id: 'hhcurveto', min: 4, resetStack: true }, - null, // shortint - { id: 'callgsubr', min: 1, undefStack: true }, - { id: 'vhcurveto', min: 4, resetStack: true }, - { id: 'hvcurveto', min: 4, resetStack: true } - ]; - var CharstringValidationData12 = [ - null, - null, - null, - { id: 'and', min: 2, stackDelta: -1 }, - { id: 'or', min: 2, stackDelta: -1 }, - { id: 'not', min: 1, stackDelta: 0 }, - null, - null, - null, - { id: 'abs', min: 1, stackDelta: 0 }, - { id: 'add', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] + stack[index - 1]; - } - }, - { id: 'sub', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] - stack[index - 1]; - } - }, - { id: 'div', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] / stack[index - 1]; - } - }, - null, - { id: 'neg', min: 1, stackDelta: 0, - stackFn: function stack_div(stack, index) { - stack[index - 1] = -stack[index - 1]; - } - }, - { id: 'eq', min: 2, stackDelta: -1 }, - null, - null, - { id: 'drop', min: 1, stackDelta: -1 }, - null, - { id: 'put', min: 2, stackDelta: -2 }, - { id: 'get', min: 1, stackDelta: 0 }, - { id: 'ifelse', min: 4, stackDelta: -3 }, - { id: 'random', min: 0, stackDelta: 1 }, - { id: 'mul', min: 2, stackDelta: -1, - stackFn: function stack_div(stack, index) { - stack[index - 2] = stack[index - 2] * stack[index - 1]; - } - }, - null, - { id: 'sqrt', min: 1, stackDelta: 0 }, - { id: 'dup', min: 1, stackDelta: 1 }, - { id: 'exch', min: 2, stackDelta: 0 }, - { id: 'index', min: 2, stackDelta: 0 }, - { id: 'roll', min: 3, stackDelta: -2 }, - null, - null, - null, - { id: 'hflex', min: 7, resetStack: true }, - { id: 'flex', min: 13, resetStack: true }, - { id: 'hflex1', min: 9, resetStack: true }, - { id: 'flex1', min: 11, resetStack: true } - ]; - - function CFFParser(file, properties) { - this.bytes = file.getBytes(); - this.properties = properties; - } - CFFParser.prototype = { - parse: function CFFParser_parse() { - var properties = this.properties; - var cff = new CFF(); - this.cff = cff; - - // The first five sections must be in order, all the others are reached - // via offsets contained in one of the below. - var header = this.parseHeader(); - var nameIndex = this.parseIndex(header.endPos); - var topDictIndex = this.parseIndex(nameIndex.endPos); - var stringIndex = this.parseIndex(topDictIndex.endPos); - var globalSubrIndex = this.parseIndex(stringIndex.endPos); - - var topDictParsed = this.parseDict(topDictIndex.obj.get(0)); - var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); - - cff.header = header.obj; - cff.names = this.parseNameIndex(nameIndex.obj); - cff.strings = this.parseStringIndex(stringIndex.obj); - cff.topDict = topDict; - cff.globalSubrIndex = globalSubrIndex.obj; - - this.parsePrivateDict(cff.topDict); - - cff.isCIDFont = topDict.hasName('ROS'); - - var charStringOffset = topDict.getByName('CharStrings'); - var charStringIndex = this.parseIndex(charStringOffset).obj; - - var fontMatrix = topDict.getByName('FontMatrix'); - if (fontMatrix) { - properties.fontMatrix = fontMatrix; - } - - var fontBBox = topDict.getByName('FontBBox'); - if (fontBBox) { - // adjusting ascent/descent - properties.ascent = fontBBox[3]; - properties.descent = fontBBox[1]; - properties.ascentScaled = true; - } - - var charset, encoding; - if (cff.isCIDFont) { - var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj; - for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) { - var dictRaw = fdArrayIndex.get(i); - var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), - cff.strings); - this.parsePrivateDict(fontDict); - cff.fdArray.push(fontDict); - } - // cid fonts don't have an encoding - encoding = null; - charset = this.parseCharsets(topDict.getByName('charset'), - charStringIndex.count, cff.strings, true); - cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), - charStringIndex.count); - } else { - charset = this.parseCharsets(topDict.getByName('charset'), - charStringIndex.count, cff.strings, false); - encoding = this.parseEncoding(topDict.getByName('Encoding'), - properties, - cff.strings, charset.charset); - } - - cff.charset = charset; - cff.encoding = encoding; - - var charStringsAndSeacs = this.parseCharStrings( - charStringIndex, - topDict.privateDict.subrsIndex, - globalSubrIndex.obj, - cff.fdSelect, - cff.fdArray); - cff.charStrings = charStringsAndSeacs.charStrings; - cff.seacs = charStringsAndSeacs.seacs; - cff.widths = charStringsAndSeacs.widths; - - return cff; - }, - parseHeader: function CFFParser_parseHeader() { - var bytes = this.bytes; - var bytesLength = bytes.length; - var offset = 0; - - // Prevent an infinite loop, by checking that the offset is within the - // bounds of the bytes array. Necessary in empty, or invalid, font files. - while (offset < bytesLength && bytes[offset] !== 1) { - ++offset; - } - if (offset >= bytesLength) { - error('Invalid CFF header'); - } else if (offset !== 0) { - info('cff data is shifted'); - bytes = bytes.subarray(offset); - this.bytes = bytes; - } - var major = bytes[0]; - var minor = bytes[1]; - var hdrSize = bytes[2]; - var offSize = bytes[3]; - var header = new CFFHeader(major, minor, hdrSize, offSize); - return { obj: header, endPos: hdrSize }; - }, - parseDict: function CFFParser_parseDict(dict) { - var pos = 0; - - function parseOperand() { - var value = dict[pos++]; - if (value === 30) { - return parseFloatOperand(pos); - } else if (value === 28) { - value = dict[pos++]; - value = ((value << 24) | (dict[pos++] << 16)) >> 16; - return value; - } else if (value === 29) { - value = dict[pos++]; - value = (value << 8) | dict[pos++]; - value = (value << 8) | dict[pos++]; - value = (value << 8) | dict[pos++]; - return value; - } else if (value >= 32 && value <= 246) { - return value - 139; - } else if (value >= 247 && value <= 250) { - return ((value - 247) * 256) + dict[pos++] + 108; - } else if (value >= 251 && value <= 254) { - return -((value - 251) * 256) - dict[pos++] - 108; - } else { - error('255 is not a valid DICT command'); - } - return -1; - } - - function parseFloatOperand() { - var str = ''; - var eof = 15; - var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', - '9', '.', 'E', 'E-', null, '-']; - var length = dict.length; - while (pos < length) { - var b = dict[pos++]; - var b1 = b >> 4; - var b2 = b & 15; - - if (b1 === eof) { - break; - } - str += lookup[b1]; - - if (b2 === eof) { - break; - } - str += lookup[b2]; - } - return parseFloat(str); - } - - var operands = []; - var entries = []; - - pos = 0; - var end = dict.length; - while (pos < end) { - var b = dict[pos]; - if (b <= 21) { - if (b === 12) { - b = (b << 8) | dict[++pos]; - } - entries.push([b, operands]); - operands = []; - ++pos; - } else { - operands.push(parseOperand()); - } - } - return entries; - }, - parseIndex: function CFFParser_parseIndex(pos) { - var cffIndex = new CFFIndex(); - var bytes = this.bytes; - var count = (bytes[pos++] << 8) | bytes[pos++]; - var offsets = []; - var end = pos; - var i, ii; - - if (count !== 0) { - var offsetSize = bytes[pos++]; - // add 1 for offset to determine size of last object - var startPos = pos + ((count + 1) * offsetSize) - 1; - - for (i = 0, ii = count + 1; i < ii; ++i) { - var offset = 0; - for (var j = 0; j < offsetSize; ++j) { - offset <<= 8; - offset += bytes[pos++]; - } - offsets.push(startPos + offset); - } - end = offsets[count]; - } - for (i = 0, ii = offsets.length - 1; i < ii; ++i) { - var offsetStart = offsets[i]; - var offsetEnd = offsets[i + 1]; - cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); - } - return {obj: cffIndex, endPos: end}; - }, - parseNameIndex: function CFFParser_parseNameIndex(index) { - var names = []; - for (var i = 0, ii = index.count; i < ii; ++i) { - var name = index.get(i); - // OTS doesn't allow names to be over 127 characters. - var length = Math.min(name.length, 127); - var data = []; - // OTS also only permits certain characters in the name. - for (var j = 0; j < length; ++j) { - var c = name[j]; - if (j === 0 && c === 0) { - data[j] = c; - continue; - } - if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ || - c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ || - c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ || - c === 47 /* / */ || c === 37 /* % */ || c === 35 /* # */) { - data[j] = 95; - continue; - } - data[j] = c; - } - names.push(bytesToString(data)); - } - return names; - }, - parseStringIndex: function CFFParser_parseStringIndex(index) { - var strings = new CFFStrings(); - for (var i = 0, ii = index.count; i < ii; ++i) { - var data = index.get(i); - strings.add(bytesToString(data)); - } - return strings; - }, - createDict: function CFFParser_createDict(Type, dict, strings) { - var cffDict = new Type(strings); - for (var i = 0, ii = dict.length; i < ii; ++i) { - var pair = dict[i]; - var key = pair[0]; - var value = pair[1]; - cffDict.setByKey(key, value); - } - return cffDict; - }, - parseCharString: function CFFParser_parseCharString(state, data, - localSubrIndex, - globalSubrIndex) { - if (state.callDepth > MAX_SUBR_NESTING) { - return false; - } - var stackSize = state.stackSize; - var stack = state.stack; - - var length = data.length; - - for (var j = 0; j < length;) { - var value = data[j++]; - var validationCommand = null; - if (value === 12) { - var q = data[j++]; - if (q === 0) { - // The CFF specification state that the 'dotsection' command - // (12, 0) is deprecated and treated as a no-op, but all Type2 - // charstrings processors should support them. Unfortunately - // the font sanitizer don't. As a workaround the sequence (12, 0) - // is replaced by a useless (0, hmoveto). - data[j - 2] = 139; - data[j - 1] = 22; - stackSize = 0; - } else { - validationCommand = CharstringValidationData12[q]; - } - } else if (value === 28) { // number (16 bit) - stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16; - j += 2; - stackSize++; - } else if (value === 14) { - if (stackSize >= 4) { - stackSize -= 4; - if (SEAC_ANALYSIS_ENABLED) { - state.seac = stack.slice(stackSize, stackSize + 4); - return false; - } - } - validationCommand = CharstringValidationData[value]; - } else if (value >= 32 && value <= 246) { // number - stack[stackSize] = value - 139; - stackSize++; - } else if (value >= 247 && value <= 254) { // number (+1 bytes) - stack[stackSize] = (value < 251 ? - ((value - 247) << 8) + data[j] + 108 : - -((value - 251) << 8) - data[j] - 108); - j++; - stackSize++; - } else if (value === 255) { // number (32 bit) - stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) | - (data[j + 2] << 8) | data[j + 3]) / 65536; - j += 4; - stackSize++; - } else if (value === 19 || value === 20) { - state.hints += stackSize >> 1; - // skipping right amount of hints flag data - j += (state.hints + 7) >> 3; - stackSize %= 2; - validationCommand = CharstringValidationData[value]; - } else if (value === 10 || value === 29) { - var subrsIndex; - if (value === 10) { - subrsIndex = localSubrIndex; - } else { - subrsIndex = globalSubrIndex; - } - if (!subrsIndex) { - validationCommand = CharstringValidationData[value]; - warn('Missing subrsIndex for ' + validationCommand.id); - return false; - } - var bias = 32768; - if (subrsIndex.count < 1240) { - bias = 107; - } else if (subrsIndex.count < 33900) { - bias = 1131; - } - var subrNumber = stack[--stackSize] + bias; - if (subrNumber < 0 || subrNumber >= subrsIndex.count) { - validationCommand = CharstringValidationData[value]; - warn('Out of bounds subrIndex for ' + validationCommand.id); - return false; - } - state.stackSize = stackSize; - state.callDepth++; - var valid = this.parseCharString(state, subrsIndex.get(subrNumber), - localSubrIndex, globalSubrIndex); - if (!valid) { - return false; - } - state.callDepth--; - stackSize = state.stackSize; - continue; - } else if (value === 11) { - state.stackSize = stackSize; - return true; - } else { - validationCommand = CharstringValidationData[value]; - } - if (validationCommand) { - if (validationCommand.stem) { - state.hints += stackSize >> 1; - } - if ('min' in validationCommand) { - if (!state.undefStack && stackSize < validationCommand.min) { - warn('Not enough parameters for ' + validationCommand.id + - '; actual: ' + stackSize + - ', expected: ' + validationCommand.min); - return false; - } - } - if (state.firstStackClearing && validationCommand.stackClearing) { - state.firstStackClearing = false; - // the optional character width can be found before the first - // stack-clearing command arguments - stackSize -= validationCommand.min; - if (stackSize >= 2 && validationCommand.stem) { - // there are even amount of arguments for stem commands - stackSize %= 2; - } else if (stackSize > 1) { - warn('Found too many parameters for stack-clearing command'); - } - if (stackSize > 0 && stack[stackSize - 1] >= 0) { - state.width = stack[stackSize - 1]; - } - } - if ('stackDelta' in validationCommand) { - if ('stackFn' in validationCommand) { - validationCommand.stackFn(stack, stackSize); - } - stackSize += validationCommand.stackDelta; - } else if (validationCommand.stackClearing) { - stackSize = 0; - } else if (validationCommand.resetStack) { - stackSize = 0; - state.undefStack = false; - } else if (validationCommand.undefStack) { - stackSize = 0; - state.undefStack = true; - state.firstStackClearing = false; - } - } - } - state.stackSize = stackSize; - return true; - }, - parseCharStrings: function CFFParser_parseCharStrings(charStrings, - localSubrIndex, - globalSubrIndex, - fdSelect, - fdArray) { - var seacs = []; - var widths = []; - var count = charStrings.count; - for (var i = 0; i < count; i++) { - var charstring = charStrings.get(i); - var state = { - callDepth: 0, - stackSize: 0, - stack: [], - undefStack: true, - hints: 0, - firstStackClearing: true, - seac: null, - width: null - }; - var valid = true; - var localSubrToUse = null; - if (fdSelect && fdArray.length) { - var fdIndex = fdSelect.getFDIndex(i); - if (fdIndex === -1) { - warn('Glyph index is not in fd select.'); - valid = false; - } - if (fdIndex >= fdArray.length) { - warn('Invalid fd index for glyph index.'); - valid = false; - } - if (valid) { - localSubrToUse = fdArray[fdIndex].privateDict.subrsIndex; - } - } else if (localSubrIndex) { - localSubrToUse = localSubrIndex; - } - if (valid) { - valid = this.parseCharString(state, charstring, localSubrToUse, - globalSubrIndex); - } - if (state.width !== null) { - widths[i] = state.width; - } - if (state.seac !== null) { - seacs[i] = state.seac; - } - if (!valid) { - // resetting invalid charstring to single 'endchar' - charStrings.set(i, new Uint8Array([14])); - } - } - return { charStrings: charStrings, seacs: seacs, widths: widths }; - }, - emptyPrivateDictionary: - function CFFParser_emptyPrivateDictionary(parentDict) { - var privateDict = this.createDict(CFFPrivateDict, [], - parentDict.strings); - parentDict.setByKey(18, [0, 0]); - parentDict.privateDict = privateDict; - }, - parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) { - // no private dict, do nothing - if (!parentDict.hasName('Private')) { - this.emptyPrivateDictionary(parentDict); - return; - } - var privateOffset = parentDict.getByName('Private'); - // make sure the params are formatted correctly - if (!isArray(privateOffset) || privateOffset.length !== 2) { - parentDict.removeByName('Private'); - return; - } - var size = privateOffset[0]; - var offset = privateOffset[1]; - // remove empty dicts or ones that refer to invalid location - if (size === 0 || offset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - - var privateDictEnd = offset + size; - var dictData = this.bytes.subarray(offset, privateDictEnd); - var dict = this.parseDict(dictData); - var privateDict = this.createDict(CFFPrivateDict, dict, - parentDict.strings); - parentDict.privateDict = privateDict; - - // Parse the Subrs index also since it's relative to the private dict. - if (!privateDict.getByName('Subrs')) { - return; - } - var subrsOffset = privateDict.getByName('Subrs'); - var relativeOffset = offset + subrsOffset; - // Validate the offset. - if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { - this.emptyPrivateDictionary(parentDict); - return; - } - var subrsIndex = this.parseIndex(relativeOffset); - privateDict.subrsIndex = subrsIndex.obj; - }, - parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) { - if (pos === 0) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, - ISOAdobeCharset); - } else if (pos === 1) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, - ExpertCharset); - } else if (pos === 2) { - return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, - ExpertSubsetCharset); - } - - var bytes = this.bytes; - var start = pos; - var format = bytes[pos++]; - var charset = ['.notdef']; - var id, count, i; - - // subtract 1 for the .notdef glyph - length -= 1; - - switch (format) { - case 0: - for (i = 0; i < length; i++) { - id = (bytes[pos++] << 8) | bytes[pos++]; - charset.push(cid ? id : strings.get(id)); - } - break; - case 1: - while (charset.length <= length) { - id = (bytes[pos++] << 8) | bytes[pos++]; - count = bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - case 2: - while (charset.length <= length) { - id = (bytes[pos++] << 8) | bytes[pos++]; - count = (bytes[pos++] << 8) | bytes[pos++]; - for (i = 0; i <= count; i++) { - charset.push(cid ? id++ : strings.get(id++)); - } - } - break; - default: - error('Unknown charset format'); - } - // Raw won't be needed if we actually compile the charset. - var end = pos; - var raw = bytes.subarray(start, end); - - return new CFFCharset(false, format, charset, raw); - }, - parseEncoding: function CFFParser_parseEncoding(pos, - properties, - strings, - charset) { - var encoding = {}; - var bytes = this.bytes; - var predefined = false; - var hasSupplement = false; - var format, i, ii; - var raw = null; - - function readSupplement() { - var supplementsCount = bytes[pos++]; - for (i = 0; i < supplementsCount; i++) { - var code = bytes[pos++]; - var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); - encoding[code] = charset.indexOf(strings.get(sid)); - } - } - - if (pos === 0 || pos === 1) { - predefined = true; - format = pos; - var baseEncoding = pos ? Encodings.ExpertEncoding : - Encodings.StandardEncoding; - for (i = 0, ii = charset.length; i < ii; i++) { - var index = baseEncoding.indexOf(charset[i]); - if (index !== -1) { - encoding[index] = i; - } - } - } else { - var dataStart = pos; - format = bytes[pos++]; - switch (format & 0x7f) { - case 0: - var glyphsCount = bytes[pos++]; - for (i = 1; i <= glyphsCount; i++) { - encoding[bytes[pos++]] = i; - } - break; - - case 1: - var rangesCount = bytes[pos++]; - var gid = 1; - for (i = 0; i < rangesCount; i++) { - var start = bytes[pos++]; - var left = bytes[pos++]; - for (var j = start; j <= start + left; j++) { - encoding[j] = gid++; - } - } - break; - - default: - error('Unknow encoding format: ' + format + ' in CFF'); - break; - } - var dataEnd = pos; - if (format & 0x80) { - // The font sanitizer does not support CFF encoding with a - // supplement, since the encoding is not really used to map - // between gid to glyph, let's overwrite what is declared in - // the top dictionary to let the sanitizer think the font use - // StandardEncoding, that's a lie but that's ok. - bytes[dataStart] &= 0x7f; - readSupplement(); - hasSupplement = true; - } - raw = bytes.subarray(dataStart, dataEnd); - } - format = format & 0x7f; - return new CFFEncoding(predefined, format, encoding, raw); - }, - parseFDSelect: function CFFParser_parseFDSelect(pos, length) { - var start = pos; - var bytes = this.bytes; - var format = bytes[pos++]; - var fdSelect = []; - var i; - - switch (format) { - case 0: - for (i = 0; i < length; ++i) { - var id = bytes[pos++]; - fdSelect.push(id); - } - break; - case 3: - var rangesCount = (bytes[pos++] << 8) | bytes[pos++]; - for (i = 0; i < rangesCount; ++i) { - var first = (bytes[pos++] << 8) | bytes[pos++]; - var fdIndex = bytes[pos++]; - var next = (bytes[pos] << 8) | bytes[pos + 1]; - for (var j = first; j < next; ++j) { - fdSelect.push(fdIndex); - } - } - // Advance past the sentinel(next). - pos += 2; - break; - default: - error('Unknown fdselect format ' + format); - break; - } - var end = pos; - return new CFFFDSelect(fdSelect, bytes.subarray(start, end)); - } - }; - return CFFParser; -})(); - -// Compact Font Format -var CFF = (function CFFClosure() { - function CFF() { - this.header = null; - this.names = []; - this.topDict = null; - this.strings = new CFFStrings(); - this.globalSubrIndex = null; - - // The following could really be per font, but since we only have one font - // store them here. - this.encoding = null; - this.charset = null; - this.charStrings = null; - this.fdArray = []; - this.fdSelect = null; - - this.isCIDFont = false; - } - return CFF; -})(); - -var CFFHeader = (function CFFHeaderClosure() { - function CFFHeader(major, minor, hdrSize, offSize) { - this.major = major; - this.minor = minor; - this.hdrSize = hdrSize; - this.offSize = offSize; - } - return CFFHeader; -})(); - -var CFFStrings = (function CFFStringsClosure() { - function CFFStrings() { - this.strings = []; - } - CFFStrings.prototype = { - get: function CFFStrings_get(index) { - if (index >= 0 && index <= 390) { - return CFFStandardStrings[index]; - } - if (index - 391 <= this.strings.length) { - return this.strings[index - 391]; - } - return CFFStandardStrings[0]; - }, - add: function CFFStrings_add(value) { - this.strings.push(value); - }, - get count() { - return this.strings.length; - } - }; - return CFFStrings; -})(); - -var CFFIndex = (function CFFIndexClosure() { - function CFFIndex() { - this.objects = []; - this.length = 0; - } - CFFIndex.prototype = { - add: function CFFIndex_add(data) { - this.length += data.length; - this.objects.push(data); - }, - set: function CFFIndex_set(index, data) { - this.length += data.length - this.objects[index].length; - this.objects[index] = data; - }, - get: function CFFIndex_get(index) { - return this.objects[index]; - }, - get count() { - return this.objects.length; - } - }; - return CFFIndex; -})(); - -var CFFDict = (function CFFDictClosure() { - function CFFDict(tables, strings) { - this.keyToNameMap = tables.keyToNameMap; - this.nameToKeyMap = tables.nameToKeyMap; - this.defaults = tables.defaults; - this.types = tables.types; - this.opcodes = tables.opcodes; - this.order = tables.order; - this.strings = strings; - this.values = {}; - } - CFFDict.prototype = { - // value should always be an array - setByKey: function CFFDict_setByKey(key, value) { - if (!(key in this.keyToNameMap)) { - return false; - } - // ignore empty values - if (value.length === 0) { - return true; - } - var type = this.types[key]; - // remove the array wrapping these types of values - if (type === 'num' || type === 'sid' || type === 'offset') { - value = value[0]; - } - this.values[key] = value; - return true; - }, - setByName: function CFFDict_setByName(name, value) { - if (!(name in this.nameToKeyMap)) { - error('Invalid dictionary name "' + name + '"'); - } - this.values[this.nameToKeyMap[name]] = value; - }, - hasName: function CFFDict_hasName(name) { - return this.nameToKeyMap[name] in this.values; - }, - getByName: function CFFDict_getByName(name) { - if (!(name in this.nameToKeyMap)) { - error('Invalid dictionary name "' + name + '"'); - } - var key = this.nameToKeyMap[name]; - if (!(key in this.values)) { - return this.defaults[key]; - } - return this.values[key]; - }, - removeByName: function CFFDict_removeByName(name) { - delete this.values[this.nameToKeyMap[name]]; - } - }; - CFFDict.createTables = function CFFDict_createTables(layout) { - var tables = { - keyToNameMap: {}, - nameToKeyMap: {}, - defaults: {}, - types: {}, - opcodes: {}, - order: [] - }; - for (var i = 0, ii = layout.length; i < ii; ++i) { - var entry = layout[i]; - var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; - tables.keyToNameMap[key] = entry[1]; - tables.nameToKeyMap[entry[1]] = key; - tables.types[key] = entry[2]; - tables.defaults[key] = entry[3]; - tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]]; - tables.order.push(key); - } - return tables; - }; - return CFFDict; -})(); - -var CFFTopDict = (function CFFTopDictClosure() { - var layout = [ - [[12, 30], 'ROS', ['sid', 'sid', 'num'], null], - [[12, 20], 'SyntheticBase', 'num', null], - [0, 'version', 'sid', null], - [1, 'Notice', 'sid', null], - [[12, 0], 'Copyright', 'sid', null], - [2, 'FullName', 'sid', null], - [3, 'FamilyName', 'sid', null], - [4, 'Weight', 'sid', null], - [[12, 1], 'isFixedPitch', 'num', 0], - [[12, 2], 'ItalicAngle', 'num', 0], - [[12, 3], 'UnderlinePosition', 'num', -100], - [[12, 4], 'UnderlineThickness', 'num', 50], - [[12, 5], 'PaintType', 'num', 0], - [[12, 6], 'CharstringType', 'num', 2], - [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], - [0.001, 0, 0, 0.001, 0, 0]], - [13, 'UniqueID', 'num', null], - [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], - [[12, 8], 'StrokeWidth', 'num', 0], - [14, 'XUID', 'array', null], - [15, 'charset', 'offset', 0], - [16, 'Encoding', 'offset', 0], - [17, 'CharStrings', 'offset', 0], - [18, 'Private', ['offset', 'offset'], null], - [[12, 21], 'PostScript', 'sid', null], - [[12, 22], 'BaseFontName', 'sid', null], - [[12, 23], 'BaseFontBlend', 'delta', null], - [[12, 31], 'CIDFontVersion', 'num', 0], - [[12, 32], 'CIDFontRevision', 'num', 0], - [[12, 33], 'CIDFontType', 'num', 0], - [[12, 34], 'CIDCount', 'num', 8720], - [[12, 35], 'UIDBase', 'num', null], - // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes - // before FDArray. - [[12, 37], 'FDSelect', 'offset', null], - [[12, 36], 'FDArray', 'offset', null], - [[12, 38], 'FontName', 'sid', null] - ]; - var tables = null; - function CFFTopDict(strings) { - if (tables === null) { - tables = CFFDict.createTables(layout); - } - CFFDict.call(this, tables, strings); - this.privateDict = null; - } - CFFTopDict.prototype = Object.create(CFFDict.prototype); - return CFFTopDict; -})(); - -var CFFPrivateDict = (function CFFPrivateDictClosure() { - var layout = [ - [6, 'BlueValues', 'delta', null], - [7, 'OtherBlues', 'delta', null], - [8, 'FamilyBlues', 'delta', null], - [9, 'FamilyOtherBlues', 'delta', null], - [[12, 9], 'BlueScale', 'num', 0.039625], - [[12, 10], 'BlueShift', 'num', 7], - [[12, 11], 'BlueFuzz', 'num', 1], - [10, 'StdHW', 'num', null], - [11, 'StdVW', 'num', null], - [[12, 12], 'StemSnapH', 'delta', null], - [[12, 13], 'StemSnapV', 'delta', null], - [[12, 14], 'ForceBold', 'num', 0], - [[12, 17], 'LanguageGroup', 'num', 0], - [[12, 18], 'ExpansionFactor', 'num', 0.06], - [[12, 19], 'initialRandomSeed', 'num', 0], - [20, 'defaultWidthX', 'num', 0], - [21, 'nominalWidthX', 'num', 0], - [19, 'Subrs', 'offset', null] - ]; - var tables = null; - function CFFPrivateDict(strings) { - if (tables === null) { - tables = CFFDict.createTables(layout); - } - CFFDict.call(this, tables, strings); - this.subrsIndex = null; - } - CFFPrivateDict.prototype = Object.create(CFFDict.prototype); - return CFFPrivateDict; -})(); - -var CFFCharsetPredefinedTypes = { - ISO_ADOBE: 0, - EXPERT: 1, - EXPERT_SUBSET: 2 -}; -var CFFCharset = (function CFFCharsetClosure() { - function CFFCharset(predefined, format, charset, raw) { - this.predefined = predefined; - this.format = format; - this.charset = charset; - this.raw = raw; - } - return CFFCharset; -})(); - -var CFFEncoding = (function CFFEncodingClosure() { - function CFFEncoding(predefined, format, encoding, raw) { - this.predefined = predefined; - this.format = format; - this.encoding = encoding; - this.raw = raw; - } - return CFFEncoding; -})(); - -var CFFFDSelect = (function CFFFDSelectClosure() { - function CFFFDSelect(fdSelect, raw) { - this.fdSelect = fdSelect; - this.raw = raw; - } - CFFFDSelect.prototype = { - getFDIndex: function CFFFDSelect_get(glyphIndex) { - if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) { - return -1; - } - return this.fdSelect[glyphIndex]; - } - }; - return CFFFDSelect; -})(); - -// Helper class to keep track of where an offset is within the data and helps -// filling in that offset once it's known. -var CFFOffsetTracker = (function CFFOffsetTrackerClosure() { - function CFFOffsetTracker() { - this.offsets = {}; - } - CFFOffsetTracker.prototype = { - isTracking: function CFFOffsetTracker_isTracking(key) { - return key in this.offsets; - }, - track: function CFFOffsetTracker_track(key, location) { - if (key in this.offsets) { - error('Already tracking location of ' + key); - } - this.offsets[key] = location; - }, - offset: function CFFOffsetTracker_offset(value) { - for (var key in this.offsets) { - this.offsets[key] += value; - } - }, - setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, - values, - output) { - if (!(key in this.offsets)) { - error('Not tracking location of ' + key); - } - var data = output.data; - var dataOffset = this.offsets[key]; - var size = 5; - for (var i = 0, ii = values.length; i < ii; ++i) { - var offset0 = i * size + dataOffset; - var offset1 = offset0 + 1; - var offset2 = offset0 + 2; - var offset3 = offset0 + 3; - var offset4 = offset0 + 4; - // It's easy to screw up offsets so perform this sanity check. - if (data[offset0] !== 0x1d || data[offset1] !== 0 || - data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) { - error('writing to an offset that is not empty'); - } - var value = values[i]; - data[offset0] = 0x1d; - data[offset1] = (value >> 24) & 0xFF; - data[offset2] = (value >> 16) & 0xFF; - data[offset3] = (value >> 8) & 0xFF; - data[offset4] = value & 0xFF; - } - } - }; - return CFFOffsetTracker; -})(); - -// Takes a CFF and converts it to the binary representation. -var CFFCompiler = (function CFFCompilerClosure() { - function CFFCompiler(cff) { - this.cff = cff; - } - CFFCompiler.prototype = { - compile: function CFFCompiler_compile() { - var cff = this.cff; - var output = { - data: [], - length: 0, - add: function CFFCompiler_add(data) { - this.data = this.data.concat(data); - this.length = this.data.length; - } - }; - - // Compile the five entries that must be in order. - var header = this.compileHeader(cff.header); - output.add(header); - - var nameIndex = this.compileNameIndex(cff.names); - output.add(nameIndex); - - if (cff.isCIDFont) { - // The spec is unclear on how font matrices should relate to each other - // when there is one in the main top dict and the sub top dicts. - // Windows handles this differently than linux and osx so we have to - // normalize to work on all. - // Rules based off of some mailing list discussions: - // - If main font has a matrix and subfont doesn't, use the main matrix. - // - If no main font matrix and there is a subfont matrix, use the - // subfont matrix. - // - If both have matrices, concat together. - // - If neither have matrices, use default. - // To make this work on all platforms we move the top matrix into each - // sub top dict and concat if necessary. - if (cff.topDict.hasName('FontMatrix')) { - var base = cff.topDict.getByName('FontMatrix'); - cff.topDict.removeByName('FontMatrix'); - for (var i = 0, ii = cff.fdArray.length; i < ii; i++) { - var subDict = cff.fdArray[i]; - var matrix = base.slice(0); - if (subDict.hasName('FontMatrix')) { - matrix = Util.transform(matrix, subDict.getByName('FontMatrix')); - } - subDict.setByName('FontMatrix', matrix); - } - } - } - - var compiled = this.compileTopDicts([cff.topDict], - output.length, - cff.isCIDFont); - output.add(compiled.output); - var topDictTracker = compiled.trackers[0]; - - var stringIndex = this.compileStringIndex(cff.strings.strings); - output.add(stringIndex); - - var globalSubrIndex = this.compileIndex(cff.globalSubrIndex); - output.add(globalSubrIndex); - - // Now start on the other entries that have no specfic order. - if (cff.encoding && cff.topDict.hasName('Encoding')) { - if (cff.encoding.predefined) { - topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], - output); - } else { - var encoding = this.compileEncoding(cff.encoding); - topDictTracker.setEntryLocation('Encoding', [output.length], output); - output.add(encoding); - } - } - - if (cff.charset && cff.topDict.hasName('charset')) { - if (cff.charset.predefined) { - topDictTracker.setEntryLocation('charset', [cff.charset.format], - output); - } else { - var charset = this.compileCharset(cff.charset); - topDictTracker.setEntryLocation('charset', [output.length], output); - output.add(charset); - } - } - - var charStrings = this.compileCharStrings(cff.charStrings); - topDictTracker.setEntryLocation('CharStrings', [output.length], output); - output.add(charStrings); - - if (cff.isCIDFont) { - // For some reason FDSelect must be in front of FDArray on windows. OSX - // and linux don't seem to care. - topDictTracker.setEntryLocation('FDSelect', [output.length], output); - var fdSelect = this.compileFDSelect(cff.fdSelect.raw); - output.add(fdSelect); - // It is unclear if the sub font dictionary can have CID related - // dictionary keys, but the sanitizer doesn't like them so remove them. - compiled = this.compileTopDicts(cff.fdArray, output.length, true); - topDictTracker.setEntryLocation('FDArray', [output.length], output); - output.add(compiled.output); - var fontDictTrackers = compiled.trackers; - - this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); - } - - this.compilePrivateDicts([cff.topDict], [topDictTracker], output); - - // If the font data ends with INDEX whose object data is zero-length, - // the sanitizer will bail out. Add a dummy byte to avoid that. - output.add([0]); - - return output.data; - }, - encodeNumber: function CFFCompiler_encodeNumber(value) { - if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { // isInt - return this.encodeInteger(value); - } else { - return this.encodeFloat(value); - } - }, - encodeFloat: function CFFCompiler_encodeFloat(num) { - var value = num.toString(); - - // rounding inaccurate doubles - var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value); - if (m) { - var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length)); - value = (Math.round(num * epsilon) / epsilon).toString(); - } - - var nibbles = ''; - var i, ii; - for (i = 0, ii = value.length; i < ii; ++i) { - var a = value[i]; - if (a === 'e') { - nibbles += value[++i] === '-' ? 'c' : 'b'; - } else if (a === '.') { - nibbles += 'a'; - } else if (a === '-') { - nibbles += 'e'; - } else { - nibbles += a; - } - } - nibbles += (nibbles.length & 1) ? 'f' : 'ff'; - var out = [30]; - for (i = 0, ii = nibbles.length; i < ii; i += 2) { - out.push(parseInt(nibbles.substr(i, 2), 16)); - } - return out; - }, - encodeInteger: function CFFCompiler_encodeInteger(value) { - var code; - if (value >= -107 && value <= 107) { - code = [value + 139]; - } else if (value >= 108 && value <= 1131) { - value = [value - 108]; - code = [(value >> 8) + 247, value & 0xFF]; - } else if (value >= -1131 && value <= -108) { - value = -value - 108; - code = [(value >> 8) + 251, value & 0xFF]; - } else if (value >= -32768 && value <= 32767) { - code = [0x1c, (value >> 8) & 0xFF, value & 0xFF]; - } else { - code = [0x1d, - (value >> 24) & 0xFF, - (value >> 16) & 0xFF, - (value >> 8) & 0xFF, - value & 0xFF]; - } - return code; - }, - compileHeader: function CFFCompiler_compileHeader(header) { - return [ - header.major, - header.minor, - header.hdrSize, - header.offSize - ]; - }, - compileNameIndex: function CFFCompiler_compileNameIndex(names) { - var nameIndex = new CFFIndex(); - for (var i = 0, ii = names.length; i < ii; ++i) { - nameIndex.add(stringToBytes(names[i])); - } - return this.compileIndex(nameIndex); - }, - compileTopDicts: function CFFCompiler_compileTopDicts(dicts, - length, - removeCidKeys) { - var fontDictTrackers = []; - var fdArrayIndex = new CFFIndex(); - for (var i = 0, ii = dicts.length; i < ii; ++i) { - var fontDict = dicts[i]; - if (removeCidKeys) { - fontDict.removeByName('CIDFontVersion'); - fontDict.removeByName('CIDFontRevision'); - fontDict.removeByName('CIDFontType'); - fontDict.removeByName('CIDCount'); - fontDict.removeByName('UIDBase'); - } - var fontDictTracker = new CFFOffsetTracker(); - var fontDictData = this.compileDict(fontDict, fontDictTracker); - fontDictTrackers.push(fontDictTracker); - fdArrayIndex.add(fontDictData); - fontDictTracker.offset(length); - } - fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); - return { - trackers: fontDictTrackers, - output: fdArrayIndex - }; - }, - compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, - trackers, - output) { - for (var i = 0, ii = dicts.length; i < ii; ++i) { - var fontDict = dicts[i]; - assert(fontDict.privateDict && fontDict.hasName('Private'), - 'There must be an private dictionary.'); - var privateDict = fontDict.privateDict; - var privateDictTracker = new CFFOffsetTracker(); - var privateDictData = this.compileDict(privateDict, privateDictTracker); - - var outputLength = output.length; - privateDictTracker.offset(outputLength); - if (!privateDictData.length) { - // The private dictionary was empty, set the output length to zero to - // ensure the offset length isn't out of bounds in the eyes of the - // sanitizer. - outputLength = 0; - } - - trackers[i].setEntryLocation('Private', - [privateDictData.length, outputLength], - output); - output.add(privateDictData); - - if (privateDict.subrsIndex && privateDict.hasName('Subrs')) { - var subrs = this.compileIndex(privateDict.subrsIndex); - privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], - output); - output.add(subrs); - } - } - }, - compileDict: function CFFCompiler_compileDict(dict, offsetTracker) { - var out = []; - // The dictionary keys must be in a certain order. - var order = dict.order; - for (var i = 0; i < order.length; ++i) { - var key = order[i]; - if (!(key in dict.values)) { - continue; - } - var values = dict.values[key]; - var types = dict.types[key]; - if (!isArray(types)) { - types = [types]; - } - if (!isArray(values)) { - values = [values]; - } - - // Remove any empty dict values. - if (values.length === 0) { - continue; - } - - for (var j = 0, jj = types.length; j < jj; ++j) { - var type = types[j]; - var value = values[j]; - switch (type) { - case 'num': - case 'sid': - out = out.concat(this.encodeNumber(value)); - break; - case 'offset': - // For offsets we just insert a 32bit integer so we don't have to - // deal with figuring out the length of the offset when it gets - // replaced later on by the compiler. - var name = dict.keyToNameMap[key]; - // Some offsets have the offset and the length, so just record the - // position of the first one. - if (!offsetTracker.isTracking(name)) { - offsetTracker.track(name, out.length); - } - out = out.concat([0x1d, 0, 0, 0, 0]); - break; - case 'array': - case 'delta': - out = out.concat(this.encodeNumber(value)); - for (var k = 1, kk = values.length; k < kk; ++k) { - out = out.concat(this.encodeNumber(values[k])); - } - break; - default: - error('Unknown data type of ' + type); - break; - } - } - out = out.concat(dict.opcodes[key]); - } - return out; - }, - compileStringIndex: function CFFCompiler_compileStringIndex(strings) { - var stringIndex = new CFFIndex(); - for (var i = 0, ii = strings.length; i < ii; ++i) { - stringIndex.add(stringToBytes(strings[i])); - } - return this.compileIndex(stringIndex); - }, - compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() { - var globalSubrIndex = this.cff.globalSubrIndex; - this.out.writeByteArray(this.compileIndex(globalSubrIndex)); - }, - compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) { - return this.compileIndex(charStrings); - }, - compileCharset: function CFFCompiler_compileCharset(charset) { - return this.compileTypedArray(charset.raw); - }, - compileEncoding: function CFFCompiler_compileEncoding(encoding) { - return this.compileTypedArray(encoding.raw); - }, - compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) { - return this.compileTypedArray(fdSelect); - }, - compileTypedArray: function CFFCompiler_compileTypedArray(data) { - var out = []; - for (var i = 0, ii = data.length; i < ii; ++i) { - out[i] = data[i]; - } - return out; - }, - compileIndex: function CFFCompiler_compileIndex(index, trackers) { - trackers = trackers || []; - var objects = index.objects; - // First 2 bytes contains the number of objects contained into this index - var count = objects.length; - - // If there is no object, just create an index. This technically - // should just be [0, 0] but OTS has an issue with that. - if (count === 0) { - return [0, 0, 0]; - } - - var data = [(count >> 8) & 0xFF, count & 0xff]; - - var lastOffset = 1, i; - for (i = 0; i < count; ++i) { - lastOffset += objects[i].length; - } - - var offsetSize; - if (lastOffset < 0x100) { - offsetSize = 1; - } else if (lastOffset < 0x10000) { - offsetSize = 2; - } else if (lastOffset < 0x1000000) { - offsetSize = 3; - } else { - offsetSize = 4; - } - - // Next byte contains the offset size use to reference object in the file - data.push(offsetSize); - - // Add another offset after this one because we need a new offset - var relativeOffset = 1; - for (i = 0; i < count + 1; i++) { - if (offsetSize === 1) { - data.push(relativeOffset & 0xFF); - } else if (offsetSize === 2) { - data.push((relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } else if (offsetSize === 3) { - data.push((relativeOffset >> 16) & 0xFF, - (relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } else { - data.push((relativeOffset >>> 24) & 0xFF, - (relativeOffset >> 16) & 0xFF, - (relativeOffset >> 8) & 0xFF, - relativeOffset & 0xFF); - } - - if (objects[i]) { - relativeOffset += objects[i].length; - } - } - - for (i = 0; i < count; i++) { - // Notify the tracker where the object will be offset in the data. - if (trackers[i]) { - trackers[i].offset(data.length); - } - for (var j = 0, jj = objects[i].length; j < jj; j++) { - data.push(objects[i][j]); - } - } - return data; - } - }; - return CFFCompiler; -})(); - -function _enableSeacAnalysis(enabled) { - exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED = enabled; -} - -// Workaround for seac on Windows. -(function checkSeacSupport() { - if (typeof navigator !== 'undefined' && /Windows/.test(navigator.userAgent)) { - SEAC_ANALYSIS_ENABLED = true; - } -})(); - -// Workaround for Private Use Area characters in Chrome on Windows -// http://code.google.com/p/chromium/issues/detail?id=122465 -// https://github.com/mozilla/pdf.js/issues/1689 -(function checkChromeWindows() { - if (typeof navigator !== 'undefined' && - /Windows.*Chrome/.test(navigator.userAgent)) { - SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true; - } -})(); - -exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED; -exports.CFFCompiler = CFFCompiler; -exports.CFFIndex = CFFIndex; -exports.CFFParser = CFFParser; -exports.CFFStrings = CFFStrings; -exports.Encodings = Encodings; -exports.ErrorFont = ErrorFont; -exports.FontFlags = FontFlags; -exports.Font = Font; -exports.IdentityToUnicodeMap = IdentityToUnicodeMap; -exports.NormalizedUnicodes = NormalizedUnicodes; -exports.ToUnicodeMap = ToUnicodeMap; -exports.Type1Parser = Type1Parser; -exports.getFontType = getFontType; -exports.reverseIfRtl = reverseIfRtl; -exports.serifFonts = serifFonts; -exports.symbolsFonts = symbolsFonts; -exports.stdFontMap = stdFontMap; -exports._enableSeacAnalysis = _enableSeacAnalysis; - -// TODO refactor to remove cyclic dependency on font_renderer.js -coreFontRenderer._setCoreFonts(exports); -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreFunction = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCorePsParser); - } -}(this, function (exports, sharedUtil, corePrimitives, corePsParser) { - -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isBool = sharedUtil.isBool; -var isDict = corePrimitives.isDict; -var isStream = corePrimitives.isStream; -var PostScriptLexer = corePsParser.PostScriptLexer; -var PostScriptParser = corePsParser.PostScriptParser; - -var PDFFunction = (function PDFFunctionClosure() { - var CONSTRUCT_SAMPLED = 0; - var CONSTRUCT_INTERPOLATED = 2; - var CONSTRUCT_STICHED = 3; - var CONSTRUCT_POSTSCRIPT = 4; - - return { - getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps, - str) { - var i, ii; - var length = 1; - for (i = 0, ii = size.length; i < ii; i++) { - length *= size[i]; - } - length *= outputSize; - - var array = new Array(length); - var codeSize = 0; - var codeBuf = 0; - // 32 is a valid bps so shifting won't work - var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1); - - var strBytes = str.getBytes((length * bps + 7) / 8); - var strIdx = 0; - for (i = 0; i < length; i++) { - while (codeSize < bps) { - codeBuf <<= 8; - codeBuf |= strBytes[strIdx++]; - codeSize += 8; - } - codeSize -= bps; - array[i] = (codeBuf >> codeSize) * sampleMul; - codeBuf &= (1 << codeSize) - 1; - } - return array; - }, - - getIR: function PDFFunction_getIR(xref, fn) { - var dict = fn.dict; - if (!dict) { - dict = fn; - } - - var types = [this.constructSampled, - null, - this.constructInterpolated, - this.constructStiched, - this.constructPostScript]; - - var typeNum = dict.get('FunctionType'); - var typeFn = types[typeNum]; - if (!typeFn) { - error('Unknown type of function'); - } - - return typeFn.call(this, fn, dict, xref); - }, - - fromIR: function PDFFunction_fromIR(IR) { - var type = IR[0]; - switch (type) { - case CONSTRUCT_SAMPLED: - return this.constructSampledFromIR(IR); - case CONSTRUCT_INTERPOLATED: - return this.constructInterpolatedFromIR(IR); - case CONSTRUCT_STICHED: - return this.constructStichedFromIR(IR); - //case CONSTRUCT_POSTSCRIPT: - default: - return this.constructPostScriptFromIR(IR); - } - }, - - parse: function PDFFunction_parse(xref, fn) { - var IR = this.getIR(xref, fn); - return this.fromIR(IR); - }, - - parseArray: function PDFFunction_parseArray(xref, fnObj) { - if (!isArray(fnObj)) { - // not an array -- parsing as regular function - return this.parse(xref, fnObj); - } - - var fnArray = []; - for (var j = 0, jj = fnObj.length; j < jj; j++) { - var obj = xref.fetchIfRef(fnObj[j]); - fnArray.push(PDFFunction.parse(xref, obj)); - } - return function (src, srcOffset, dest, destOffset) { - for (var i = 0, ii = fnArray.length; i < ii; i++) { - fnArray[i](src, srcOffset, dest, destOffset + i); - } - }; - }, - - constructSampled: function PDFFunction_constructSampled(str, dict) { - function toMultiArray(arr) { - var inputLength = arr.length; - var out = []; - var index = 0; - for (var i = 0; i < inputLength; i += 2) { - out[index] = [arr[i], arr[i + 1]]; - ++index; - } - return out; - } - var domain = dict.get('Domain'); - var range = dict.get('Range'); - - if (!domain || !range) { - error('No domain or range'); - } - - var inputSize = domain.length / 2; - var outputSize = range.length / 2; - - domain = toMultiArray(domain); - range = toMultiArray(range); - - var size = dict.get('Size'); - var bps = dict.get('BitsPerSample'); - var order = dict.get('Order') || 1; - if (order !== 1) { - // No description how cubic spline interpolation works in PDF32000:2008 - // As in poppler, ignoring order, linear interpolation may work as good - info('No support for cubic spline interpolation: ' + order); - } - - var encode = dict.get('Encode'); - if (!encode) { - encode = []; - for (var i = 0; i < inputSize; ++i) { - encode.push(0); - encode.push(size[i] - 1); - } - } - encode = toMultiArray(encode); - - var decode = dict.get('Decode'); - if (!decode) { - decode = range; - } else { - decode = toMultiArray(decode); - } - - var samples = this.getSampleArray(size, outputSize, bps, str); - - return [ - CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, - outputSize, Math.pow(2, bps) - 1, range - ]; - }, - - constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) { - // See chapter 3, page 109 of the PDF reference - function interpolate(x, xmin, xmax, ymin, ymax) { - return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin))); - } - - return function constructSampledFromIRResult(src, srcOffset, - dest, destOffset) { - // See chapter 3, page 110 of the PDF reference. - var m = IR[1]; - var domain = IR[2]; - var encode = IR[3]; - var decode = IR[4]; - var samples = IR[5]; - var size = IR[6]; - var n = IR[7]; - //var mask = IR[8]; - var range = IR[9]; - - // Building the cube vertices: its part and sample index - // http://rjwagner49.com/Mathematics/Interpolation.pdf - var cubeVertices = 1 << m; - var cubeN = new Float64Array(cubeVertices); - var cubeVertex = new Uint32Array(cubeVertices); - var i, j; - for (j = 0; j < cubeVertices; j++) { - cubeN[j] = 1; - } - - var k = n, pos = 1; - // Map x_i to y_j for 0 <= i < m using the sampled function. - for (i = 0; i < m; ++i) { - // x_i' = min(max(x_i, Domain_2i), Domain_2i+1) - var domain_2i = domain[i][0]; - var domain_2i_1 = domain[i][1]; - var xi = Math.min(Math.max(src[srcOffset +i], domain_2i), - domain_2i_1); - - // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1, - // Encode_2i, Encode_2i+1) - var e = interpolate(xi, domain_2i, domain_2i_1, - encode[i][0], encode[i][1]); - - // e_i' = min(max(e_i, 0), Size_i - 1) - var size_i = size[i]; - e = Math.min(Math.max(e, 0), size_i - 1); - - // Adjusting the cube: N and vertex sample index - var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1; - var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0); - var n1 = e - e0; // (e - e0) / (e1 - e0); - var offset0 = e0 * k; - var offset1 = offset0 + k; // e1 * k - for (j = 0; j < cubeVertices; j++) { - if (j & pos) { - cubeN[j] *= n1; - cubeVertex[j] += offset1; - } else { - cubeN[j] *= n0; - cubeVertex[j] += offset0; - } - } - - k *= size_i; - pos <<= 1; - } - - for (j = 0; j < n; ++j) { - // Sum all cube vertices' samples portions - var rj = 0; - for (i = 0; i < cubeVertices; i++) { - rj += samples[cubeVertex[i] + j] * cubeN[i]; - } - - // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1, - // Decode_2j, Decode_2j+1) - rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); - - // y_j = min(max(r_j, range_2j), range_2j+1) - dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), - range[j][1]); - } - }; - }, - - constructInterpolated: function PDFFunction_constructInterpolated(str, - dict) { - var c0 = dict.get('C0') || [0]; - var c1 = dict.get('C1') || [1]; - var n = dict.get('N'); - - if (!isArray(c0) || !isArray(c1)) { - error('Illegal dictionary for interpolated function'); - } - - var length = c0.length; - var diff = []; - for (var i = 0; i < length; ++i) { - diff.push(c1[i] - c0[i]); - } - - return [CONSTRUCT_INTERPOLATED, c0, diff, n]; - }, - - constructInterpolatedFromIR: - function PDFFunction_constructInterpolatedFromIR(IR) { - var c0 = IR[1]; - var diff = IR[2]; - var n = IR[3]; - - var length = diff.length; - - return function constructInterpolatedFromIRResult(src, srcOffset, - dest, destOffset) { - var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n); - - for (var j = 0; j < length; ++j) { - dest[destOffset + j] = c0[j] + (x * diff[j]); - } - }; - }, - - constructStiched: function PDFFunction_constructStiched(fn, dict, xref) { - var domain = dict.get('Domain'); - - if (!domain) { - error('No domain'); - } - - var inputSize = domain.length / 2; - if (inputSize !== 1) { - error('Bad domain for stiched function'); - } - - var fnRefs = dict.get('Functions'); - var fns = []; - for (var i = 0, ii = fnRefs.length; i < ii; ++i) { - fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i]))); - } - - var bounds = dict.get('Bounds'); - var encode = dict.get('Encode'); - - return [CONSTRUCT_STICHED, domain, bounds, encode, fns]; - }, - - constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) { - var domain = IR[1]; - var bounds = IR[2]; - var encode = IR[3]; - var fnsIR = IR[4]; - var fns = []; - var tmpBuf = new Float32Array(1); - - for (var i = 0, ii = fnsIR.length; i < ii; i++) { - fns.push(PDFFunction.fromIR(fnsIR[i])); - } - - return function constructStichedFromIRResult(src, srcOffset, - dest, destOffset) { - var clip = function constructStichedFromIRClip(v, min, max) { - if (v > max) { - v = max; - } else if (v < min) { - v = min; - } - return v; - }; - - // clip to domain - var v = clip(src[srcOffset], domain[0], domain[1]); - // calulate which bound the value is in - for (var i = 0, ii = bounds.length; i < ii; ++i) { - if (v < bounds[i]) { - break; - } - } - - // encode value into domain of function - var dmin = domain[0]; - if (i > 0) { - dmin = bounds[i - 1]; - } - var dmax = domain[1]; - if (i < bounds.length) { - dmax = bounds[i]; - } - - var rmin = encode[2 * i]; - var rmax = encode[2 * i + 1]; - - // Prevent the value from becoming NaN as a result - // of division by zero (fixes issue6113.pdf). - tmpBuf[0] = dmin === dmax ? rmin : - rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); - - // call the appropriate function - fns[i](tmpBuf, 0, dest, destOffset); - }; - }, - - constructPostScript: function PDFFunction_constructPostScript(fn, dict, - xref) { - var domain = dict.get('Domain'); - var range = dict.get('Range'); - - if (!domain) { - error('No domain.'); - } - - if (!range) { - error('No range.'); - } - - var lexer = new PostScriptLexer(fn); - var parser = new PostScriptParser(lexer); - var code = parser.parse(); - - return [CONSTRUCT_POSTSCRIPT, domain, range, code]; - }, - - constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR( - IR) { - var domain = IR[1]; - var range = IR[2]; - var code = IR[3]; - - var compiled = (new PostScriptCompiler()).compile(code, domain, range); - if (compiled) { - // Compiled function consists of simple expressions such as addition, - // subtraction, Math.max, and also contains 'var' and 'return' - // statements. See the generation in the PostScriptCompiler below. - /*jshint -W054 */ - return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled); - } - - info('Unable to compile PS function'); - - var numOutputs = range.length >> 1; - var numInputs = domain.length >> 1; - var evaluator = new PostScriptEvaluator(code); - // Cache the values for a big speed up, the cache size is limited though - // since the number of possible values can be huge from a PS function. - var cache = {}; - // The MAX_CACHE_SIZE is set to ~4x the maximum number of distinct values - // seen in our tests. - var MAX_CACHE_SIZE = 2048 * 4; - var cache_available = MAX_CACHE_SIZE; - var tmpBuf = new Float32Array(numInputs); - - return function constructPostScriptFromIRResult(src, srcOffset, - dest, destOffset) { - var i, value; - var key = ''; - var input = tmpBuf; - for (i = 0; i < numInputs; i++) { - value = src[srcOffset + i]; - input[i] = value; - key += value + '_'; - } - - var cachedValue = cache[key]; - if (cachedValue !== undefined) { - dest.set(cachedValue, destOffset); - return; - } - - var output = new Float32Array(numOutputs); - var stack = evaluator.execute(input); - var stackIndex = stack.length - numOutputs; - for (i = 0; i < numOutputs; i++) { - value = stack[stackIndex + i]; - var bound = range[i * 2]; - if (value < bound) { - value = bound; - } else { - bound = range[i * 2 +1]; - if (value > bound) { - value = bound; - } - } - output[i] = value; - } - if (cache_available > 0) { - cache_available--; - cache[key] = output; - } - dest.set(output, destOffset); - }; - } - }; -})(); - -function isPDFFunction(v) { - var fnDict; - if (typeof v !== 'object') { - return false; - } else if (isDict(v)) { - fnDict = v; - } else if (isStream(v)) { - fnDict = v.dict; - } else { - return false; - } - return fnDict.has('FunctionType'); -} - -var PostScriptStack = (function PostScriptStackClosure() { - var MAX_STACK_SIZE = 100; - function PostScriptStack(initialStack) { - this.stack = !initialStack ? [] : - Array.prototype.slice.call(initialStack, 0); - } - - PostScriptStack.prototype = { - push: function PostScriptStack_push(value) { - if (this.stack.length >= MAX_STACK_SIZE) { - error('PostScript function stack overflow.'); - } - this.stack.push(value); - }, - pop: function PostScriptStack_pop() { - if (this.stack.length <= 0) { - error('PostScript function stack underflow.'); - } - return this.stack.pop(); - }, - copy: function PostScriptStack_copy(n) { - if (this.stack.length + n >= MAX_STACK_SIZE) { - error('PostScript function stack overflow.'); - } - var stack = this.stack; - for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) { - stack.push(stack[i]); - } - }, - index: function PostScriptStack_index(n) { - this.push(this.stack[this.stack.length - n - 1]); - }, - // rotate the last n stack elements p times - roll: function PostScriptStack_roll(n, p) { - var stack = this.stack; - var l = stack.length - n; - var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t; - for (i = l, j = r; i < j; i++, j--) { - t = stack[i]; stack[i] = stack[j]; stack[j] = t; - } - for (i = l, j = c - 1; i < j; i++, j--) { - t = stack[i]; stack[i] = stack[j]; stack[j] = t; - } - for (i = c, j = r; i < j; i++, j--) { - t = stack[i]; stack[i] = stack[j]; stack[j] = t; - } - } - }; - return PostScriptStack; -})(); -var PostScriptEvaluator = (function PostScriptEvaluatorClosure() { - function PostScriptEvaluator(operators) { - this.operators = operators; - } - PostScriptEvaluator.prototype = { - execute: function PostScriptEvaluator_execute(initialStack) { - var stack = new PostScriptStack(initialStack); - var counter = 0; - var operators = this.operators; - var length = operators.length; - var operator, a, b; - while (counter < length) { - operator = operators[counter++]; - if (typeof operator === 'number') { - // Operator is really an operand and should be pushed to the stack. - stack.push(operator); - continue; - } - switch (operator) { - // non standard ps operators - case 'jz': // jump if false - b = stack.pop(); - a = stack.pop(); - if (!a) { - counter = b; - } - break; - case 'j': // jump - a = stack.pop(); - counter = a; - break; - - // all ps operators in alphabetical order (excluding if/ifelse) - case 'abs': - a = stack.pop(); - stack.push(Math.abs(a)); - break; - case 'add': - b = stack.pop(); - a = stack.pop(); - stack.push(a + b); - break; - case 'and': - b = stack.pop(); - a = stack.pop(); - if (isBool(a) && isBool(b)) { - stack.push(a && b); - } else { - stack.push(a & b); - } - break; - case 'atan': - a = stack.pop(); - stack.push(Math.atan(a)); - break; - case 'bitshift': - b = stack.pop(); - a = stack.pop(); - if (a > 0) { - stack.push(a << b); - } else { - stack.push(a >> b); - } - break; - case 'ceiling': - a = stack.pop(); - stack.push(Math.ceil(a)); - break; - case 'copy': - a = stack.pop(); - stack.copy(a); - break; - case 'cos': - a = stack.pop(); - stack.push(Math.cos(a)); - break; - case 'cvi': - a = stack.pop() | 0; - stack.push(a); - break; - case 'cvr': - // noop - break; - case 'div': - b = stack.pop(); - a = stack.pop(); - stack.push(a / b); - break; - case 'dup': - stack.copy(1); - break; - case 'eq': - b = stack.pop(); - a = stack.pop(); - stack.push(a === b); - break; - case 'exch': - stack.roll(2, 1); - break; - case 'exp': - b = stack.pop(); - a = stack.pop(); - stack.push(Math.pow(a, b)); - break; - case 'false': - stack.push(false); - break; - case 'floor': - a = stack.pop(); - stack.push(Math.floor(a)); - break; - case 'ge': - b = stack.pop(); - a = stack.pop(); - stack.push(a >= b); - break; - case 'gt': - b = stack.pop(); - a = stack.pop(); - stack.push(a > b); - break; - case 'idiv': - b = stack.pop(); - a = stack.pop(); - stack.push((a / b) | 0); - break; - case 'index': - a = stack.pop(); - stack.index(a); - break; - case 'le': - b = stack.pop(); - a = stack.pop(); - stack.push(a <= b); - break; - case 'ln': - a = stack.pop(); - stack.push(Math.log(a)); - break; - case 'log': - a = stack.pop(); - stack.push(Math.log(a) / Math.LN10); - break; - case 'lt': - b = stack.pop(); - a = stack.pop(); - stack.push(a < b); - break; - case 'mod': - b = stack.pop(); - a = stack.pop(); - stack.push(a % b); - break; - case 'mul': - b = stack.pop(); - a = stack.pop(); - stack.push(a * b); - break; - case 'ne': - b = stack.pop(); - a = stack.pop(); - stack.push(a !== b); - break; - case 'neg': - a = stack.pop(); - stack.push(-a); - break; - case 'not': - a = stack.pop(); - if (isBool(a)) { - stack.push(!a); - } else { - stack.push(~a); - } - break; - case 'or': - b = stack.pop(); - a = stack.pop(); - if (isBool(a) && isBool(b)) { - stack.push(a || b); - } else { - stack.push(a | b); - } - break; - case 'pop': - stack.pop(); - break; - case 'roll': - b = stack.pop(); - a = stack.pop(); - stack.roll(a, b); - break; - case 'round': - a = stack.pop(); - stack.push(Math.round(a)); - break; - case 'sin': - a = stack.pop(); - stack.push(Math.sin(a)); - break; - case 'sqrt': - a = stack.pop(); - stack.push(Math.sqrt(a)); - break; - case 'sub': - b = stack.pop(); - a = stack.pop(); - stack.push(a - b); - break; - case 'true': - stack.push(true); - break; - case 'truncate': - a = stack.pop(); - a = a < 0 ? Math.ceil(a) : Math.floor(a); - stack.push(a); - break; - case 'xor': - b = stack.pop(); - a = stack.pop(); - if (isBool(a) && isBool(b)) { - stack.push(a !== b); - } else { - stack.push(a ^ b); - } - break; - default: - error('Unknown operator ' + operator); - break; - } - } - return stack.stack; - } - }; - return PostScriptEvaluator; -})(); - -// Most of the PDFs functions consist of simple operations such as: -// roll, exch, sub, cvr, pop, index, dup, mul, if, gt, add. -// -// We can compile most of such programs, and at the same moment, we can -// optimize some expressions using basic math properties. Keeping track of -// min/max values will allow us to avoid extra Math.min/Math.max calls. -var PostScriptCompiler = (function PostScriptCompilerClosure() { - function AstNode(type) { - this.type = type; - } - AstNode.prototype.visit = function (visitor) { - throw new Error('abstract method'); - }; - - function AstArgument(index, min, max) { - AstNode.call(this, 'args'); - this.index = index; - this.min = min; - this.max = max; - } - AstArgument.prototype = Object.create(AstNode.prototype); - AstArgument.prototype.visit = function (visitor) { - visitor.visitArgument(this); - }; - - function AstLiteral(number) { - AstNode.call(this, 'literal'); - this.number = number; - this.min = number; - this.max = number; - } - AstLiteral.prototype = Object.create(AstNode.prototype); - AstLiteral.prototype.visit = function (visitor) { - visitor.visitLiteral(this); - }; - - function AstBinaryOperation(op, arg1, arg2, min, max) { - AstNode.call(this, 'binary'); - this.op = op; - this.arg1 = arg1; - this.arg2 = arg2; - this.min = min; - this.max = max; - } - AstBinaryOperation.prototype = Object.create(AstNode.prototype); - AstBinaryOperation.prototype.visit = function (visitor) { - visitor.visitBinaryOperation(this); - }; - - function AstMin(arg, max) { - AstNode.call(this, 'max'); - this.arg = arg; - this.min = arg.min; - this.max = max; - } - AstMin.prototype = Object.create(AstNode.prototype); - AstMin.prototype.visit = function (visitor) { - visitor.visitMin(this); - }; - - function AstVariable(index, min, max) { - AstNode.call(this, 'var'); - this.index = index; - this.min = min; - this.max = max; - } - AstVariable.prototype = Object.create(AstNode.prototype); - AstVariable.prototype.visit = function (visitor) { - visitor.visitVariable(this); - }; - - function AstVariableDefinition(variable, arg) { - AstNode.call(this, 'definition'); - this.variable = variable; - this.arg = arg; - } - AstVariableDefinition.prototype = Object.create(AstNode.prototype); - AstVariableDefinition.prototype.visit = function (visitor) { - visitor.visitVariableDefinition(this); - }; - - function ExpressionBuilderVisitor() { - this.parts = []; - } - ExpressionBuilderVisitor.prototype = { - visitArgument: function (arg) { - this.parts.push('Math.max(', arg.min, ', Math.min(', - arg.max, ', src[srcOffset + ', arg.index, ']))'); - }, - visitVariable: function (variable) { - this.parts.push('v', variable.index); - }, - visitLiteral: function (literal) { - this.parts.push(literal.number); - }, - visitBinaryOperation: function (operation) { - this.parts.push('('); - operation.arg1.visit(this); - this.parts.push(' ', operation.op, ' '); - operation.arg2.visit(this); - this.parts.push(')'); - }, - visitVariableDefinition: function (definition) { - this.parts.push('var '); - definition.variable.visit(this); - this.parts.push(' = '); - definition.arg.visit(this); - this.parts.push(';'); - }, - visitMin: function (max) { - this.parts.push('Math.min('); - max.arg.visit(this); - this.parts.push(', ', max.max, ')'); - }, - toString: function () { - return this.parts.join(''); - } - }; - - function buildAddOperation(num1, num2) { - if (num2.type === 'literal' && num2.number === 0) { - // optimization: second operand is 0 - return num1; - } - if (num1.type === 'literal' && num1.number === 0) { - // optimization: first operand is 0 - return num2; - } - if (num2.type === 'literal' && num1.type === 'literal') { - // optimization: operands operand are literals - return new AstLiteral(num1.number + num2.number); - } - return new AstBinaryOperation('+', num1, num2, - num1.min + num2.min, num1.max + num2.max); - } - - function buildMulOperation(num1, num2) { - if (num2.type === 'literal') { - // optimization: second operands is a literal... - if (num2.number === 0) { - return new AstLiteral(0); // and it's 0 - } else if (num2.number === 1) { - return num1; // and it's 1 - } else if (num1.type === 'literal') { - // ... and first operands is a literal too - return new AstLiteral(num1.number * num2.number); - } - } - if (num1.type === 'literal') { - // optimization: first operands is a literal... - if (num1.number === 0) { - return new AstLiteral(0); // and it's 0 - } else if (num1.number === 1) { - return num2; // and it's 1 - } - } - var min = Math.min(num1.min * num2.min, num1.min * num2.max, - num1.max * num2.min, num1.max * num2.max); - var max = Math.max(num1.min * num2.min, num1.min * num2.max, - num1.max * num2.min, num1.max * num2.max); - return new AstBinaryOperation('*', num1, num2, min, max); - } - - function buildSubOperation(num1, num2) { - if (num2.type === 'literal') { - // optimization: second operands is a literal... - if (num2.number === 0) { - return num1; // ... and it's 0 - } else if (num1.type === 'literal') { - // ... and first operands is a literal too - return new AstLiteral(num1.number - num2.number); - } - } - if (num2.type === 'binary' && num2.op === '-' && - num1.type === 'literal' && num1.number === 1 && - num2.arg1.type === 'literal' && num2.arg1.number === 1) { - // optimization for case: 1 - (1 - x) - return num2.arg2; - } - return new AstBinaryOperation('-', num1, num2, - num1.min - num2.max, num1.max - num2.min); - } - - function buildMinOperation(num1, max) { - if (num1.min >= max) { - // optimization: num1 min value is not less than required max - return new AstLiteral(max); // just returning max - } else if (num1.max <= max) { - // optimization: num1 max value is not greater than required max - return num1; // just returning an argument - } - return new AstMin(num1, max); - } - - function PostScriptCompiler() {} - PostScriptCompiler.prototype = { - compile: function PostScriptCompiler_compile(code, domain, range) { - var stack = []; - var i, ii; - var instructions = []; - var inputSize = domain.length >> 1, outputSize = range.length >> 1; - var lastRegister = 0; - var n, j; - var num1, num2, ast1, ast2, tmpVar, item; - for (i = 0; i < inputSize; i++) { - stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1])); - } - - for (i = 0, ii = code.length; i < ii; i++) { - item = code[i]; - if (typeof item === 'number') { - stack.push(new AstLiteral(item)); - continue; - } - - switch (item) { - case 'add': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildAddOperation(num1, num2)); - break; - case 'cvr': - if (stack.length < 1) { - return null; - } - break; - case 'mul': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildMulOperation(num1, num2)); - break; - case 'sub': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - stack.push(buildSubOperation(num1, num2)); - break; - case 'exch': - if (stack.length < 2) { - return null; - } - ast1 = stack.pop(); ast2 = stack.pop(); - stack.push(ast1, ast2); - break; - case 'pop': - if (stack.length < 1) { - return null; - } - stack.pop(); - break; - case 'index': - if (stack.length < 1) { - return null; - } - num1 = stack.pop(); - if (num1.type !== 'literal') { - return null; - } - n = num1.number; - if (n < 0 || (n|0) !== n || stack.length < n) { - return null; - } - ast1 = stack[stack.length - n - 1]; - if (ast1.type === 'literal' || ast1.type === 'var') { - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - n - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case 'dup': - if (stack.length < 1) { - return null; - } - if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && - code[i + 3] === i + 7 && code[i + 4] === 'jz' && - code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) { - // special case of the commands sequence for the min operation - num1 = stack.pop(); - stack.push(buildMinOperation(num1, code[i + 1])); - i += 6; - break; - } - ast1 = stack[stack.length - 1]; - if (ast1.type === 'literal' || ast1.type === 'var') { - // we don't have to save into intermediate variable a literal or - // variable. - stack.push(ast1); - break; - } - tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max); - stack[stack.length - 1] = tmpVar; - stack.push(tmpVar); - instructions.push(new AstVariableDefinition(tmpVar, ast1)); - break; - case 'roll': - if (stack.length < 2) { - return null; - } - num2 = stack.pop(); - num1 = stack.pop(); - if (num2.type !== 'literal' || num1.type !== 'literal') { - // both roll operands must be numbers - return null; - } - j = num2.number; - n = num1.number; - if (n <= 0 || (n|0) !== n || (j|0) !== j || stack.length < n) { - // ... and integers - return null; - } - j = ((j % n) + n) % n; - if (j === 0) { - break; // just skipping -- there are nothing to rotate - } - Array.prototype.push.apply(stack, - stack.splice(stack.length - n, n - j)); - break; - default: - return null; // unsupported operator - } - } - - if (stack.length !== outputSize) { - return null; - } - - var result = []; - instructions.forEach(function (instruction) { - var statementBuilder = new ExpressionBuilderVisitor(); - instruction.visit(statementBuilder); - result.push(statementBuilder.toString()); - }); - stack.forEach(function (expr, i) { - var statementBuilder = new ExpressionBuilderVisitor(); - expr.visit(statementBuilder); - var min = range[i * 2], max = range[i * 2 + 1]; - var out = [statementBuilder.toString()]; - if (min > expr.min) { - out.unshift('Math.max(', min, ', '); - out.push(')'); - } - if (max < expr.max) { - out.unshift('Math.min(', max, ', '); - out.push(')'); - } - out.unshift('dest[destOffset + ', i, '] = '); - out.push(';'); - result.push(out.join('')); - }); - return result.join('\n'); - } - }; - - return PostScriptCompiler; -})(); - -exports.isPDFFunction = isPDFFunction; -exports.PDFFunction = PDFFunction; -exports.PostScriptEvaluator = PostScriptEvaluator; -exports.PostScriptCompiler = PostScriptCompiler; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreColorSpace = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreFunction, root.pdfjsCoreStream); - } -}(this, function (exports, sharedUtil, corePrimitives, coreFunction, - coreStream) { - -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isString = sharedUtil.isString; -var shadow = sharedUtil.shadow; -var warn = sharedUtil.warn; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isStream = corePrimitives.isStream; -var PDFFunction = coreFunction.PDFFunction; - -var coreImage; // see _setCoreImage below -var PDFImage; // = coreImage.PDFImage; - -var ColorSpace = (function ColorSpaceClosure() { - // Constructor should define this.numComps, this.defaultColor, this.name - function ColorSpace() { - error('should not call ColorSpace constructor'); - } - - ColorSpace.prototype = { - /** - * Converts the color value to the RGB color. The color components are - * located in the src array starting from the srcOffset. Returns the array - * of the rgb components, each value ranging from [0,255]. - */ - getRgb: function ColorSpace_getRgb(src, srcOffset) { - var rgb = new Uint8Array(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; - }, - /** - * Converts the color value to the RGB color, similar to the getRgb method. - * The result placed into the dest array starting from the destOffset. - */ - getRgbItem: function ColorSpace_getRgbItem(src, srcOffset, - dest, destOffset) { - error('Should not call ColorSpace.getRgbItem'); - }, - /** - * Converts the specified number of the color values to the RGB colors. - * The colors are located in the src array starting from the srcOffset. - * The result is placed into the dest array starting from the destOffset. - * The src array items shall be in [0,2^bits) range, the dest array items - * will be in [0,255] range. alpha01 indicates how many alpha components - * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA - * array). - */ - getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - error('Should not call ColorSpace.getRgbBuffer'); - }, - /** - * Determines the number of bytes required to store the result of the - * conversion done by the getRgbBuffer method. As in getRgbBuffer, - * |alpha01| is either 0 (RGB output) or 1 (RGBA output). - */ - getOutputLength: function ColorSpace_getOutputLength(inputLength, - alpha01) { - error('Should not call ColorSpace.getOutputLength'); - }, - /** - * Returns true if source data will be equal the result/output data. - */ - isPassthrough: function ColorSpace_isPassthrough(bits) { - return false; - }, - /** - * Fills in the RGB colors in the destination buffer. alpha01 indicates - * how many alpha components there are in the dest array; it will be either - * 0 (RGB array) or 1 (RGBA array). - */ - fillRgb: function ColorSpace_fillRgb(dest, originalWidth, - originalHeight, width, height, - actualHeight, bpc, comps, alpha01) { - var count = originalWidth * originalHeight; - var rgbBuf = null; - var numComponentColors = 1 << bpc; - var needsResizing = originalHeight !== height || originalWidth !== width; - var i, ii; - - if (this.isPassthrough(bpc)) { - rgbBuf = comps; - } else if (this.numComps === 1 && count > numComponentColors && - this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') { - // Optimization: create a color map when there is just one component and - // we are converting more colors than the size of the color map. We - // don't build the map if the colorspace is gray or rgb since those - // methods are faster than building a map. This mainly offers big speed - // ups for indexed and alternate colorspaces. - // - // TODO it may be worth while to cache the color map. While running - // testing I never hit a cache so I will leave that out for now (perhaps - // we are reparsing colorspaces too much?). - var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : - new Uint16Array(numComponentColors); - var key; - for (i = 0; i < numComponentColors; i++) { - allColors[i] = i; - } - var colorMap = new Uint8Array(numComponentColors * 3); - this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, - /* alpha01 = */ 0); - - var destPos, rgbPos; - if (!needsResizing) { - // Fill in the RGB values directly into |dest|. - destPos = 0; - for (i = 0; i < count; ++i) { - key = comps[i] * 3; - dest[destPos++] = colorMap[key]; - dest[destPos++] = colorMap[key + 1]; - dest[destPos++] = colorMap[key + 2]; - destPos += alpha01; - } - } else { - rgbBuf = new Uint8Array(count * 3); - rgbPos = 0; - for (i = 0; i < count; ++i) { - key = comps[i] * 3; - rgbBuf[rgbPos++] = colorMap[key]; - rgbBuf[rgbPos++] = colorMap[key + 1]; - rgbBuf[rgbPos++] = colorMap[key + 2]; - } - } - } else { - if (!needsResizing) { - // Fill in the RGB values directly into |dest|. - this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, - alpha01); - } else { - rgbBuf = new Uint8Array(count * 3); - this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, - /* alpha01 = */ 0); - } - } - - if (rgbBuf) { - if (needsResizing) { - PDFImage.resize(rgbBuf, bpc, 3, originalWidth, originalHeight, width, - height, dest, alpha01); - } else { - rgbPos = 0; - destPos = 0; - for (i = 0, ii = width * actualHeight; i < ii; i++) { - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - dest[destPos++] = rgbBuf[rgbPos++]; - destPos += alpha01; - } - } - } - }, - /** - * True if the colorspace has components in the default range of [0, 1]. - * This should be true for all colorspaces except for lab color spaces - * which are [0,100], [-128, 127], [-128, 127]. - */ - usesZeroToOneRange: true - }; - - ColorSpace.parse = function ColorSpace_parse(cs, xref, res) { - var IR = ColorSpace.parseToIR(cs, xref, res); - if (IR instanceof AlternateCS) { - return IR; - } - return ColorSpace.fromIR(IR); - }; - - ColorSpace.fromIR = function ColorSpace_fromIR(IR) { - var name = isArray(IR) ? IR[0] : IR; - var whitePoint, blackPoint, gamma; - - switch (name) { - case 'DeviceGrayCS': - return this.singletons.gray; - case 'DeviceRgbCS': - return this.singletons.rgb; - case 'DeviceCmykCS': - return this.singletons.cmyk; - case 'CalGrayCS': - whitePoint = IR[1].WhitePoint; - blackPoint = IR[1].BlackPoint; - gamma = IR[1].Gamma; - return new CalGrayCS(whitePoint, blackPoint, gamma); - case 'CalRGBCS': - whitePoint = IR[1].WhitePoint; - blackPoint = IR[1].BlackPoint; - gamma = IR[1].Gamma; - var matrix = IR[1].Matrix; - return new CalRGBCS(whitePoint, blackPoint, gamma, matrix); - case 'PatternCS': - var basePatternCS = IR[1]; - if (basePatternCS) { - basePatternCS = ColorSpace.fromIR(basePatternCS); - } - return new PatternCS(basePatternCS); - case 'IndexedCS': - var baseIndexedCS = IR[1]; - var hiVal = IR[2]; - var lookup = IR[3]; - return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup); - case 'AlternateCS': - var numComps = IR[1]; - var alt = IR[2]; - var tintFnIR = IR[3]; - - return new AlternateCS(numComps, ColorSpace.fromIR(alt), - PDFFunction.fromIR(tintFnIR)); - case 'LabCS': - whitePoint = IR[1].WhitePoint; - blackPoint = IR[1].BlackPoint; - var range = IR[1].Range; - return new LabCS(whitePoint, blackPoint, range); - default: - error('Unknown name ' + name); - } - return null; - }; - - ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) { - if (isName(cs)) { - var colorSpaces = res.get('ColorSpace'); - if (isDict(colorSpaces)) { - var refcs = colorSpaces.get(cs.name); - if (refcs) { - cs = refcs; - } - } - } - - cs = xref.fetchIfRef(cs); - var mode; - - if (isName(cs)) { - mode = cs.name; - this.mode = mode; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'Pattern': - return ['PatternCS', null]; - default: - error('unrecognized colorspace ' + mode); - } - } else if (isArray(cs)) { - mode = xref.fetchIfRef(cs[0]).name; - this.mode = mode; - var numComps, params, alt; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'CalGray': - params = xref.fetchIfRef(cs[1]).getAll(); - return ['CalGrayCS', params]; - case 'CalRGB': - params = xref.fetchIfRef(cs[1]).getAll(); - return ['CalRGBCS', params]; - case 'ICCBased': - var stream = xref.fetchIfRef(cs[1]); - var dict = stream.dict; - numComps = dict.get('N'); - alt = dict.get('Alternate'); - if (alt) { - var altIR = ColorSpace.parseToIR(alt, xref, res); - // Parse the /Alternate CS to ensure that the number of components - // are correct, and also (indirectly) that it is not a PatternCS. - var altCS = ColorSpace.fromIR(altIR); - if (altCS.numComps === numComps) { - return altIR; - } - warn('ICCBased color space: Ignoring incorrect /Alternate entry.'); - } - if (numComps === 1) { - return 'DeviceGrayCS'; - } else if (numComps === 3) { - return 'DeviceRgbCS'; - } else if (numComps === 4) { - return 'DeviceCmykCS'; - } - break; - case 'Pattern': - var basePatternCS = cs[1] || null; - if (basePatternCS) { - basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res); - } - return ['PatternCS', basePatternCS]; - case 'Indexed': - case 'I': - var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res); - var hiVal = xref.fetchIfRef(cs[2]) + 1; - var lookup = xref.fetchIfRef(cs[3]); - if (isStream(lookup)) { - lookup = lookup.getBytes(); - } - return ['IndexedCS', baseIndexedCS, hiVal, lookup]; - case 'Separation': - case 'DeviceN': - var name = xref.fetchIfRef(cs[1]); - numComps = 1; - if (isName(name)) { - numComps = 1; - } else if (isArray(name)) { - numComps = name.length; - } - alt = ColorSpace.parseToIR(cs[2], xref, res); - var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3])); - return ['AlternateCS', numComps, alt, tintFnIR]; - case 'Lab': - params = xref.fetchIfRef(cs[1]).getAll(); - return ['LabCS', params]; - default: - error('unimplemented color space object "' + mode + '"'); - } - } else { - error('unrecognized color space object: "' + cs + '"'); - } - return null; - }; - /** - * Checks if a decode map matches the default decode map for a color space. - * This handles the general decode maps where there are two values per - * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color. - * This does not handle Lab, Indexed, or Pattern decode maps since they are - * slightly different. - * @param {Array} decode Decode map (usually from an image). - * @param {Number} n Number of components the color space has. - */ - ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) { - if (!isArray(decode)) { - return true; - } - - if (n * 2 !== decode.length) { - warn('The decode map is not the correct length'); - return true; - } - for (var i = 0, ii = decode.length; i < ii; i += 2) { - if (decode[i] !== 0 || decode[i + 1] !== 1) { - return false; - } - } - return true; - }; - - ColorSpace.singletons = { - get gray() { - return shadow(this, 'gray', new DeviceGrayCS()); - }, - get rgb() { - return shadow(this, 'rgb', new DeviceRgbCS()); - }, - get cmyk() { - return shadow(this, 'cmyk', new DeviceCmykCS()); - } - }; - - return ColorSpace; -})(); - -/** - * Alternate color space handles both Separation and DeviceN color spaces. A - * Separation color space is actually just a DeviceN with one color component. - * Both color spaces use a tinting function to convert colors to a base color - * space. - */ -var AlternateCS = (function AlternateCSClosure() { - function AlternateCS(numComps, base, tintFn) { - this.name = 'Alternate'; - this.numComps = numComps; - this.defaultColor = new Float32Array(numComps); - for (var i = 0; i < numComps; ++i) { - this.defaultColor[i] = 1; - } - this.base = base; - this.tintFn = tintFn; - this.tmpBuf = new Float32Array(base.numComps); - } - - AlternateCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function AlternateCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var tmpBuf = this.tmpBuf; - this.tintFn(src, srcOffset, tmpBuf, 0); - this.base.getRgbItem(tmpBuf, 0, dest, destOffset); - }, - getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var tintFn = this.tintFn; - var base = this.base; - var scale = 1 / ((1 << bits) - 1); - var baseNumComps = base.numComps; - var usesZeroToOneRange = base.usesZeroToOneRange; - var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && - alpha01 === 0; - var pos = isPassthrough ? destOffset : 0; - var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count); - var numComps = this.numComps; - - var scaled = new Float32Array(numComps); - var tinted = new Float32Array(baseNumComps); - var i, j; - if (usesZeroToOneRange) { - for (i = 0; i < count; i++) { - for (j = 0; j < numComps; j++) { - scaled[j] = src[srcOffset++] * scale; - } - tintFn(scaled, 0, tinted, 0); - for (j = 0; j < baseNumComps; j++) { - baseBuf[pos++] = tinted[j] * 255; - } - } - } else { - for (i = 0; i < count; i++) { - for (j = 0; j < numComps; j++) { - scaled[j] = src[srcOffset++] * scale; - } - tintFn(scaled, 0, tinted, 0); - base.getRgbItem(tinted, 0, baseBuf, pos); - pos += baseNumComps; - } - } - if (!isPassthrough) { - base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01); - } - }, - getOutputLength: function AlternateCS_getOutputLength(inputLength, - alpha01) { - return this.base.getOutputLength(inputLength * - this.base.numComps / this.numComps, - alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - - return AlternateCS; -})(); - -var PatternCS = (function PatternCSClosure() { - function PatternCS(baseCS) { - this.name = 'Pattern'; - this.base = baseCS; - } - PatternCS.prototype = {}; - - return PatternCS; -})(); - -var IndexedCS = (function IndexedCSClosure() { - function IndexedCS(base, highVal, lookup) { - this.name = 'Indexed'; - this.numComps = 1; - this.defaultColor = new Uint8Array([0]); - this.base = base; - this.highVal = highVal; - - var baseNumComps = base.numComps; - var length = baseNumComps * highVal; - var lookupArray; - - if (isStream(lookup)) { - lookupArray = new Uint8Array(length); - var bytes = lookup.getBytes(length); - lookupArray.set(bytes); - } else if (isString(lookup)) { - lookupArray = new Uint8Array(length); - for (var i = 0; i < length; ++i) { - lookupArray[i] = lookup.charCodeAt(i); - } - } else if (lookup instanceof Uint8Array || lookup instanceof Array) { - lookupArray = lookup; - } else { - error('Unrecognized lookup table: ' + lookup); - } - this.lookup = lookupArray; - } - - IndexedCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function IndexedCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var numComps = this.base.numComps; - var start = src[srcOffset] * numComps; - this.base.getRgbItem(this.lookup, start, dest, destOffset); - }, - getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var base = this.base; - var numComps = base.numComps; - var outputDelta = base.getOutputLength(numComps, alpha01); - var lookup = this.lookup; - - for (var i = 0; i < count; ++i) { - var lookupPos = src[srcOffset++] * numComps; - base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01); - destOffset += outputDelta; - } - }, - getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) { - return this.base.getOutputLength(inputLength * this.base.numComps, - alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) { - // indexed color maps shouldn't be changed - return true; - }, - usesZeroToOneRange: true - }; - return IndexedCS; -})(); - -var DeviceGrayCS = (function DeviceGrayCSClosure() { - function DeviceGrayCS() { - this.name = 'DeviceGray'; - this.numComps = 1; - this.defaultColor = new Float32Array([0]); - } - - DeviceGrayCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var c = (src[srcOffset] * 255) | 0; - c = c < 0 ? 0 : c > 255 ? 255 : c; - dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c; - }, - getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; - for (var i = 0; i < count; ++i) { - var c = (scale * src[j++]) | 0; - dest[q++] = c; - dest[q++] = c; - dest[q++] = c; - q += alpha01; - } - }, - getOutputLength: function DeviceGrayCS_getOutputLength(inputLength, - alpha01) { - return inputLength * (3 + alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return DeviceGrayCS; -})(); - -var DeviceRgbCS = (function DeviceRgbCSClosure() { - function DeviceRgbCS() { - this.name = 'DeviceRGB'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); - } - DeviceRgbCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset, - dest, destOffset) { - var r = (src[srcOffset] * 255) | 0; - var g = (src[srcOffset + 1] * 255) | 0; - var b = (src[srcOffset + 2] * 255) | 0; - dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r; - dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g; - dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b; - }, - getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - if (bits === 8 && alpha01 === 0) { - dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset); - return; - } - var scale = 255 / ((1 << bits) - 1); - var j = srcOffset, q = destOffset; - for (var i = 0; i < count; ++i) { - dest[q++] = (scale * src[j++]) | 0; - dest[q++] = (scale * src[j++]) | 0; - dest[q++] = (scale * src[j++]) | 0; - q += alpha01; - } - }, - getOutputLength: function DeviceRgbCS_getOutputLength(inputLength, - alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: function DeviceRgbCS_isPassthrough(bits) { - return bits === 8; - }, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return DeviceRgbCS; -})(); - -var DeviceCmykCS = (function DeviceCmykCSClosure() { - // The coefficients below was found using numerical analysis: the method of - // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors, - // where color_value is the tabular value from the table of sampled RGB colors - // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding - // CMYK color conversion using the estimation below: - // f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255 - function convertToRgb(src, srcOffset, srcScale, dest, destOffset) { - var c = src[srcOffset + 0] * srcScale; - var m = src[srcOffset + 1] * srcScale; - var y = src[srcOffset + 2] * srcScale; - var k = src[srcOffset + 3] * srcScale; - - var r = - (c * (-4.387332384609988 * c + 54.48615194189176 * m + - 18.82290502165302 * y + 212.25662451639585 * k + - -285.2331026137004) + - m * (1.7149763477362134 * m - 5.6096736904047315 * y + - -17.873870861415444 * k - 5.497006427196366) + - y * (-2.5217340131683033 * y - 21.248923337353073 * k + - 17.5119270841813) + - k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0; - var g = - (c * (8.841041422036149 * c + 60.118027045597366 * m + - 6.871425592049007 * y + 31.159100130055922 * k + - -79.2970844816548) + - m * (-15.310361306967817 * m + 17.575251261109482 * y + - 131.35250912493976 * k - 190.9453302588951) + - y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + - k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0; - var b = - (c * (0.8842522430003296 * c + 8.078677503112928 * m + - 30.89978309703729 * y - 0.23883238689178934 * k + - -14.183576799673286) + - m * (10.49593273432072 * m + 63.02378494754052 * y + - 50.606957656360734 * k - 112.23884253719248) + - y * (0.03296041114873217 * y + 115.60384449646641 * k + - -193.58209356861505) + - k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0; - - dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r; - dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g; - dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b; - } - - function DeviceCmykCS() { - this.name = 'DeviceCMYK'; - this.numComps = 4; - this.defaultColor = new Float32Array([0, 0, 0, 1]); - } - DeviceCmykCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(src, srcOffset, 1, dest, destOffset); - }, - getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - for (var i = 0; i < count; i++) { - convertToRgb(src, srcOffset, scale, dest, destOffset); - srcOffset += 4; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function DeviceCmykCS_getOutputLength(inputLength, - alpha01) { - return (inputLength / 4 * (3 + alpha01)) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - - return DeviceCmykCS; -})(); - -// -// CalGrayCS: Based on "PDF Reference, Sixth Ed", p.245 -// -var CalGrayCS = (function CalGrayCSClosure() { - function CalGrayCS(whitePoint, blackPoint, gamma) { - this.name = 'CalGray'; - this.numComps = 1; - this.defaultColor = new Float32Array([0]); - - if (!whitePoint) { - error('WhitePoint missing - required for color space CalGray'); - } - blackPoint = blackPoint || [0, 0, 0]; - gamma = gamma || 1; - - // Translate arguments to spec variables. - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - this.G = gamma; - - // Validate variables as per spec. - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - error('Invalid WhitePoint components for ' + this.name + - ', no fallback available'); - } - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint for ' + this.name + ', falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) { - warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB + - ', ZB: ' + this.ZB + ', only default values are supported.'); - } - - if (this.G < 1) { - info('Invalid Gamma: ' + this.G + ' for ' + this.name + - ', falling back to default'); - this.G = 1; - } - } - - function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { - // A represents a gray component of a calibrated gray space. - // A <---> AG in the spec - var A = src[srcOffset] * scale; - var AG = Math.pow(A, cs.G); - - // Computes L as per spec. ( = cs.YW * AG ) - // Except if other than default BlackPoint values are used. - var L = cs.YW * AG; - // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4. - // Convert values to rgb range [0, 255]. - var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0; - dest[destOffset] = val; - dest[destOffset + 1] = val; - dest[destOffset + 2] = val; - } - - CalGrayCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 1; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) { - return inputLength * (3 + alpha01); - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalGrayCS; -})(); - -// -// CalRGBCS: Based on "PDF Reference, Sixth Ed", p.247 -// -var CalRGBCS = (function CalRGBCSClosure() { - - // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these - // matrices. - var BRADFORD_SCALE_MATRIX = new Float32Array([ - 0.8951, 0.2664, -0.1614, - -0.7502, 1.7135, 0.0367, - 0.0389, -0.0685, 1.0296]); - - var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([ - 0.9869929, -0.1470543, 0.1599627, - 0.4323053, 0.5183603, 0.0492912, - -0.0085287, 0.0400428, 0.9684867]); - - // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html. - var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([ - 3.2404542, -1.5371385, -0.4985314, - -0.9692660, 1.8760108, 0.0415560, - 0.0556434, -0.2040259, 1.0572252]); - - var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]); - - var tempNormalizeMatrix = new Float32Array(3); - var tempConvertMatrix1 = new Float32Array(3); - var tempConvertMatrix2 = new Float32Array(3); - - var DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0; - - function CalRGBCS(whitePoint, blackPoint, gamma, matrix) { - this.name = 'CalRGB'; - this.numComps = 3; - this.defaultColor = new Float32Array(3); - - if (!whitePoint) { - error('WhitePoint missing - required for color space CalRGB'); - } - blackPoint = blackPoint || new Float32Array(3); - gamma = gamma || new Float32Array([1, 1, 1]); - matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); - - // Translate arguments to spec variables. - var XW = whitePoint[0]; - var YW = whitePoint[1]; - var ZW = whitePoint[2]; - this.whitePoint = whitePoint; - - var XB = blackPoint[0]; - var YB = blackPoint[1]; - var ZB = blackPoint[2]; - this.blackPoint = blackPoint; - - this.GR = gamma[0]; - this.GG = gamma[1]; - this.GB = gamma[2]; - - this.MXA = matrix[0]; - this.MYA = matrix[1]; - this.MZA = matrix[2]; - this.MXB = matrix[3]; - this.MYB = matrix[4]; - this.MZB = matrix[5]; - this.MXC = matrix[6]; - this.MYC = matrix[7]; - this.MZC = matrix[8]; - - // Validate variables as per spec. - if (XW < 0 || ZW < 0 || YW !== 1) { - error('Invalid WhitePoint components for ' + this.name + - ', no fallback available'); - } - - if (XB < 0 || YB < 0 || ZB < 0) { - info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB + - ', ' + ZB + '], falling back to default'); - this.blackPoint = new Float32Array(3); - } - - if (this.GR < 0 || this.GG < 0 || this.GB < 0) { - info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB + - '] for ' + this.name + ', falling back to default'); - this.GR = this.GG = this.GB = 1; - } - - if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 || - this.MXB < 0 || this.MYB < 0 || this.MZB < 0 || - this.MXC < 0 || this.MYC < 0 || this.MZC < 0) { - info('Invalid Matrix for ' + this.name + ' [' + - this.MXA + ', ' + this.MYA + ', ' + this.MZA + - this.MXB + ', ' + this.MYB + ', ' + this.MZB + - this.MXC + ', ' + this.MYC + ', ' + this.MZC + - '], falling back to default'); - this.MXA = this.MYB = this.MZC = 1; - this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0; - } - } - - function matrixProduct(a, b, result) { - result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; - result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2]; - result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2]; - } - - function convertToFlat(sourceWhitePoint, LMS, result) { - result[0] = LMS[0] * 1 / sourceWhitePoint[0]; - result[1] = LMS[1] * 1 / sourceWhitePoint[1]; - result[2] = LMS[2] * 1 / sourceWhitePoint[2]; - } - - function convertToD65(sourceWhitePoint, LMS, result) { - var D65X = 0.95047; - var D65Y = 1; - var D65Z = 1.08883; - - result[0] = LMS[0] * D65X / sourceWhitePoint[0]; - result[1] = LMS[1] * D65Y / sourceWhitePoint[1]; - result[2] = LMS[2] * D65Z / sourceWhitePoint[2]; - } - - function sRGBTransferFunction(color) { - // See http://en.wikipedia.org/wiki/SRGB. - if (color <= 0.0031308){ - return adjustToRange(0, 1, 12.92 * color); - } - - return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055); - } - - function adjustToRange(min, max, value) { - return Math.max(min, Math.min(max, value)); - } - - function decodeL(L) { - if (L < 0) { - return -decodeL(-L); - } - - if (L > 8.0) { - return Math.pow(((L + 16) / 116), 3); - } - - return L * DECODE_L_CONSTANT; - } - - function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) { - - // In case the blackPoint is already the default blackPoint then there is - // no need to do compensation. - if (sourceBlackPoint[0] === 0 && - sourceBlackPoint[1] === 0 && - sourceBlackPoint[2] === 0) { - result[0] = XYZ_Flat[0]; - result[1] = XYZ_Flat[1]; - result[2] = XYZ_Flat[2]; - return; - } - - // For the blackPoint calculation details, please see - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - // The destination blackPoint is the default blackPoint [0, 0, 0]. - var zeroDecodeL = decodeL(0); - - var X_DST = zeroDecodeL; - var X_SRC = decodeL(sourceBlackPoint[0]); - - var Y_DST = zeroDecodeL; - var Y_SRC = decodeL(sourceBlackPoint[1]); - - var Z_DST = zeroDecodeL; - var Z_SRC = decodeL(sourceBlackPoint[2]); - - var X_Scale = (1 - X_DST) / (1 - X_SRC); - var X_Offset = 1 - X_Scale; - - var Y_Scale = (1 - Y_DST) / (1 - Y_SRC); - var Y_Offset = 1 - Y_Scale; - - var Z_Scale = (1 - Z_DST) / (1 - Z_SRC); - var Z_Offset = 1 - Z_Scale; - - result[0] = XYZ_Flat[0] * X_Scale + X_Offset; - result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset; - result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset; - } - - function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) { - - // In case the whitePoint is already flat then there is no need to do - // normalization. - if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) { - result[0] = XYZ_In[0]; - result[1] = XYZ_In[1]; - result[2] = XYZ_In[2]; - return; - } - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_Flat = tempNormalizeMatrix; - convertToFlat(sourceWhitePoint, LMS, LMS_Flat); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result); - } - - function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) { - - var LMS = result; - matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS); - - var LMS_D65 = tempNormalizeMatrix; - convertToD65(sourceWhitePoint, LMS, LMS_D65); - - matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result); - } - - function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) { - // A, B and C represent a red, green and blue components of a calibrated - // rgb space. - var A = adjustToRange(0, 1, src[srcOffset] * scale); - var B = adjustToRange(0, 1, src[srcOffset + 1] * scale); - var C = adjustToRange(0, 1, src[srcOffset + 2] * scale); - - // A <---> AGR in the spec - // B <---> BGG in the spec - // C <---> CGB in the spec - var AGR = Math.pow(A, cs.GR); - var BGG = Math.pow(B, cs.GG); - var CGB = Math.pow(C, cs.GB); - - // Computes intermediate variables L, M, N as per spec. - // To decode X, Y, Z values map L, M, N directly to them. - var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB; - var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB; - var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB; - - // The following calculations are based on this document: - // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/ - // AdobeBPC.pdf. - var XYZ = tempConvertMatrix1; - XYZ[0] = X; - XYZ[1] = Y; - XYZ[2] = Z; - var XYZ_Flat = tempConvertMatrix2; - - normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat); - - var XYZ_Black = tempConvertMatrix1; - compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black); - - var XYZ_D65 = tempConvertMatrix2; - normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65); - - var SRGB = tempConvertMatrix1; - matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB); - - var sR = sRGBTransferFunction(SRGB[0]); - var sG = sRGBTransferFunction(SRGB[1]); - var sB = sRGBTransferFunction(SRGB[2]); - - // Convert the values to rgb range [0, 255]. - dest[destOffset] = Math.round(sR * 255); - dest[destOffset + 1] = Math.round(sG * 255); - dest[destOffset + 2] = Math.round(sB * 255); - } - - CalRGBCS.prototype = { - getRgb: function CalRGBCS_getRgb(src, srcOffset) { - var rgb = new Uint8Array(3); - this.getRgbItem(src, srcOffset, rgb, 0); - return rgb; - }, - getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset, - dest, destOffset) { - convertToRgb(this, src, srcOffset, dest, destOffset, 1); - }, - getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var scale = 1 / ((1 << bits) - 1); - - for (var i = 0; i < count; ++i) { - convertToRgb(this, src, srcOffset, dest, destOffset, scale); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - }, - usesZeroToOneRange: true - }; - return CalRGBCS; -})(); - -// -// LabCS: Based on "PDF Reference, Sixth Ed", p.250 -// -var LabCS = (function LabCSClosure() { - function LabCS(whitePoint, blackPoint, range) { - this.name = 'Lab'; - this.numComps = 3; - this.defaultColor = new Float32Array([0, 0, 0]); - - if (!whitePoint) { - error('WhitePoint missing - required for color space Lab'); - } - blackPoint = blackPoint || [0, 0, 0]; - range = range || [-100, 100, -100, 100]; - - // Translate args to spec variables - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - this.amin = range[0]; - this.amax = range[1]; - this.bmin = range[2]; - this.bmax = range[3]; - - // These are here just for completeness - the spec doesn't offer any - // formulas that use BlackPoint in Lab - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - // Validate vars as per spec - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) { - error('Invalid WhitePoint components, no fallback available'); - } - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint, falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.amin > this.amax || this.bmin > this.bmax) { - info('Invalid Range, falling back to defaults'); - this.amin = -100; - this.amax = 100; - this.bmin = -100; - this.bmax = 100; - } - } - - // Function g(x) from spec - function fn_g(x) { - if (x >= 6 / 29) { - return x * x * x; - } else { - return (108 / 841) * (x - 4 / 29); - } - } - - function decode(value, high1, low2, high2) { - return low2 + (value) * (high2 - low2) / (high1); - } - - // If decoding is needed maxVal should be 2^bits per component - 1. - function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) { - // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax] - // not the usual [0, 1]. If a command like setFillColor is used the src - // values will already be within the correct range. However, if we are - // converting an image we have to map the values to the correct range given - // above. - // Ls,as,bs <---> L*,a*,b* in the spec - var Ls = src[srcOffset]; - var as = src[srcOffset + 1]; - var bs = src[srcOffset + 2]; - if (maxVal !== false) { - Ls = decode(Ls, maxVal, 0, 100); - as = decode(as, maxVal, cs.amin, cs.amax); - bs = decode(bs, maxVal, cs.bmin, cs.bmax); - } - - // Adjust limits of 'as' and 'bs' - as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as; - bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs; - - // Computes intermediate variables X,Y,Z as per spec - var M = (Ls + 16) / 116; - var L = M + (as / 500); - var N = M - (bs / 200); - - var X = cs.XW * fn_g(L); - var Y = cs.YW * fn_g(M); - var Z = cs.ZW * fn_g(N); - - var r, g, b; - // Using different conversions for D50 and D65 white points, - // per http://www.color.org/srgb.pdf - if (cs.ZW < 1) { - // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249) - r = X * 3.1339 + Y * -1.6170 + Z * -0.4906; - g = X * -0.9785 + Y * 1.9160 + Z * 0.0333; - b = X * 0.0720 + Y * -0.2290 + Z * 1.4057; - } else { - // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888) - r = X * 3.2406 + Y * -1.5372 + Z * -0.4986; - g = X * -0.9689 + Y * 1.8758 + Z * 0.0415; - b = X * 0.0557 + Y * -0.2040 + Z * 1.0570; - } - // clamp color values to [0,1] range then convert to [0,255] range. - dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0; - dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0; - dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0; - } - - LabCS.prototype = { - getRgb: ColorSpace.prototype.getRgb, - getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) { - convertToRgb(this, src, srcOffset, false, dest, destOffset); - }, - getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count, - dest, destOffset, bits, - alpha01) { - var maxVal = (1 << bits) - 1; - for (var i = 0; i < count; i++) { - convertToRgb(this, src, srcOffset, maxVal, dest, destOffset); - srcOffset += 3; - destOffset += 3 + alpha01; - } - }, - getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) { - return (inputLength * (3 + alpha01) / 3) | 0; - }, - isPassthrough: ColorSpace.prototype.isPassthrough, - fillRgb: ColorSpace.prototype.fillRgb, - isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { - // XXX: Decoding is handled with the lab conversion because of the strange - // ranges that are used. - return true; - }, - usesZeroToOneRange: false - }; - return LabCS; -})(); - -// TODO refactor to remove dependency on image.js -function _setCoreImage(coreImage_) { - coreImage = coreImage_; - PDFImage = coreImage_.PDFImage; -} -exports._setCoreImage = _setCoreImage; - -exports.ColorSpace = ColorSpace; - -// TODO refactor to remove dependency on colorspace.js -coreStream._setCoreColorSpace(exports); -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreImage = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreColorSpace, root.pdfjsCoreStream, - root.pdfjsCoreJpx); - } -}(this, function (exports, sharedUtil, corePrimitives, coreColorSpace, - coreStream, coreJpx) { - -var ImageKind = sharedUtil.ImageKind; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var warn = sharedUtil.warn; -var Name = corePrimitives.Name; -var isStream = corePrimitives.isStream; -var ColorSpace = coreColorSpace.ColorSpace; -var DecodeStream = coreStream.DecodeStream; -var Stream = coreStream.Stream; -var JpegStream = coreStream.JpegStream; -var JpxImage = coreJpx.JpxImage; - -var PDFImage = (function PDFImageClosure() { - /** - * Decode the image in the main thread if it supported. Resovles the promise - * when the image data is ready. - */ - function handleImageData(handler, xref, res, image) { - if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) { - // For natively supported jpegs send them to the main thread for decoding. - var dict = image.dict; - var colorSpace = dict.get('ColorSpace', 'CS'); - colorSpace = ColorSpace.parse(colorSpace, xref, res); - var numComps = colorSpace.numComps; - var decodePromise = handler.sendWithPromise('JpegDecode', - [image.getIR(), numComps]); - return decodePromise.then(function (message) { - var data = message.data; - return new Stream(data, 0, data.length, image.dict); - }); - } else { - return Promise.resolve(image); - } - } - - /** - * Decode and clamp a value. The formula is different from the spec because we - * don't decode to float range [0,1], we decode it in the [0,max] range. - */ - function decodeAndClamp(value, addend, coefficient, max) { - value = addend + value * coefficient; - // Clamp the value to the range - return (value < 0 ? 0 : (value > max ? max : value)); - } - - function PDFImage(xref, res, image, inline, smask, mask, isMask) { - this.image = image; - var dict = image.dict; - if (dict.has('Filter')) { - var filter = dict.get('Filter').name; - if (filter === 'JPXDecode') { - var jpxImage = new JpxImage(); - jpxImage.parseImageProperties(image.stream); - image.stream.reset(); - image.bitsPerComponent = jpxImage.bitsPerComponent; - image.numComps = jpxImage.componentsCount; - } else if (filter === 'JBIG2Decode') { - image.bitsPerComponent = 1; - image.numComps = 1; - } - } - // TODO cache rendered images? - - this.width = dict.get('Width', 'W'); - this.height = dict.get('Height', 'H'); - - if (this.width < 1 || this.height < 1) { - error('Invalid image width: ' + this.width + ' or height: ' + - this.height); - } - - this.interpolate = dict.get('Interpolate', 'I') || false; - this.imageMask = dict.get('ImageMask', 'IM') || false; - this.matte = dict.get('Matte') || false; - - var bitsPerComponent = image.bitsPerComponent; - if (!bitsPerComponent) { - bitsPerComponent = dict.get('BitsPerComponent', 'BPC'); - if (!bitsPerComponent) { - if (this.imageMask) { - bitsPerComponent = 1; - } else { - error('Bits per component missing in image: ' + this.imageMask); - } - } - } - this.bpc = bitsPerComponent; - - if (!this.imageMask) { - var colorSpace = dict.get('ColorSpace', 'CS'); - if (!colorSpace) { - info('JPX images (which do not require color spaces)'); - switch (image.numComps) { - case 1: - colorSpace = Name.get('DeviceGray'); - break; - case 3: - colorSpace = Name.get('DeviceRGB'); - break; - case 4: - colorSpace = Name.get('DeviceCMYK'); - break; - default: - error('JPX images with ' + this.numComps + - ' color components not supported.'); - } - } - this.colorSpace = ColorSpace.parse(colorSpace, xref, res); - this.numComps = this.colorSpace.numComps; - } - - this.decode = dict.get('Decode', 'D'); - this.needsDecode = false; - if (this.decode && - ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) || - (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) { - this.needsDecode = true; - // Do some preprocessing to avoid more math. - var max = (1 << bitsPerComponent) - 1; - this.decodeCoefficients = []; - this.decodeAddends = []; - for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) { - var dmin = this.decode[i]; - var dmax = this.decode[i + 1]; - this.decodeCoefficients[j] = dmax - dmin; - this.decodeAddends[j] = max * dmin; - } - } - - if (smask) { - this.smask = new PDFImage(xref, res, smask, false); - } else if (mask) { - if (isStream(mask)) { - var maskDict = mask.dict, imageMask = maskDict.get('ImageMask', 'IM'); - if (!imageMask) { - warn('Ignoring /Mask in image without /ImageMask.'); - } else { - this.mask = new PDFImage(xref, res, mask, false, null, null, true); - } - } else { - // Color key mask (just an array). - this.mask = mask; - } - } - } - /** - * Handles processing of image data and returns the Promise that is resolved - * with a PDFImage when the image is ready to be used. - */ - PDFImage.buildImage = function PDFImage_buildImage(handler, xref, - res, image, inline) { - var imagePromise = handleImageData(handler, xref, res, image); - var smaskPromise; - var maskPromise; - - var smask = image.dict.get('SMask'); - var mask = image.dict.get('Mask'); - - if (smask) { - smaskPromise = handleImageData(handler, xref, res, smask); - maskPromise = Promise.resolve(null); - } else { - smaskPromise = Promise.resolve(null); - if (mask) { - if (isStream(mask)) { - maskPromise = handleImageData(handler, xref, res, mask); - } else if (isArray(mask)) { - maskPromise = Promise.resolve(mask); - } else { - warn('Unsupported mask format.'); - maskPromise = Promise.resolve(null); - } - } else { - maskPromise = Promise.resolve(null); - } - } - return Promise.all([imagePromise, smaskPromise, maskPromise]).then( - function(results) { - var imageData = results[0]; - var smaskData = results[1]; - var maskData = results[2]; - return new PDFImage(xref, res, imageData, inline, smaskData, maskData); - }); - }; - - /** - * Resize an image using the nearest neighbor algorithm. Currently only - * supports one and three component images. - * @param {TypedArray} pixels The original image with one component. - * @param {Number} bpc Number of bits per component. - * @param {Number} components Number of color components, 1 or 3 is supported. - * @param {Number} w1 Original width. - * @param {Number} h1 Original height. - * @param {Number} w2 New width. - * @param {Number} h2 New height. - * @param {TypedArray} dest (Optional) The destination buffer. - * @param {Number} alpha01 (Optional) Size reserved for the alpha channel. - * @return {TypedArray} Resized image data. - */ - PDFImage.resize = function PDFImage_resize(pixels, bpc, components, - w1, h1, w2, h2, dest, alpha01) { - - if (components !== 1 && components !== 3) { - error('Unsupported component count for resizing.'); - } - - var length = w2 * h2 * components; - var temp = dest ? dest : (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var xRatio = w1 / w2; - var yRatio = h1 / h2; - var i, j, py, newIndex = 0, oldIndex; - var xScaled = new Uint16Array(w2); - var w1Scanline = w1 * components; - if (alpha01 !== 1) { - alpha01 = 0; - } - - for (j = 0; j < w2; j++) { - xScaled[j] = Math.floor(j * xRatio) * components; - } - - if (components === 1) { - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - temp[newIndex++] = pixels[oldIndex]; - } - } - } else if (components === 3) { - for (i = 0; i < h2; i++) { - py = Math.floor(i * yRatio) * w1Scanline; - for (j = 0; j < w2; j++) { - oldIndex = py + xScaled[j]; - temp[newIndex++] = pixels[oldIndex++]; - temp[newIndex++] = pixels[oldIndex++]; - temp[newIndex++] = pixels[oldIndex++]; - newIndex += alpha01; - } - } - } - return temp; - }; - - PDFImage.createMask = - function PDFImage_createMask(imgArray, width, height, - imageIsFromDecodeStream, inverseDecode) { - - // |imgArray| might not contain full data for every pixel of the mask, so - // we need to distinguish between |computedLength| and |actualLength|. - // In particular, if inverseDecode is true, then the array we return must - // have a length of |computedLength|. - - var computedLength = ((width + 7) >> 3) * height; - var actualLength = imgArray.byteLength; - var haveFullData = computedLength === actualLength; - var data, i; - - if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) { - // imgArray came from a DecodeStream and its data is in an appropriate - // form, so we can just transfer it. - data = imgArray; - } else if (!inverseDecode) { - data = new Uint8Array(actualLength); - data.set(imgArray); - } else { - data = new Uint8Array(computedLength); - data.set(imgArray); - for (i = actualLength; i < computedLength; i++) { - data[i] = 0xff; - } - } - - // If necessary, invert the original mask data (but not any extra we might - // have added above). It's safe to modify the array -- whether it's the - // original or a copy, we're about to transfer it anyway, so nothing else - // in this thread can be relying on its contents. - if (inverseDecode) { - for (i = 0; i < actualLength; i++) { - data[i] = ~data[i]; - } - } - - return {data: data, width: width, height: height}; - }; - - PDFImage.prototype = { - get drawWidth() { - return Math.max(this.width, - this.smask && this.smask.width || 0, - this.mask && this.mask.width || 0); - }, - - get drawHeight() { - return Math.max(this.height, - this.smask && this.smask.height || 0, - this.mask && this.mask.height || 0); - }, - - decodeBuffer: function PDFImage_decodeBuffer(buffer) { - var bpc = this.bpc; - var numComps = this.numComps; - - var decodeAddends = this.decodeAddends; - var decodeCoefficients = this.decodeCoefficients; - var max = (1 << bpc) - 1; - var i, ii; - - if (bpc === 1) { - // If the buffer needed decode that means it just needs to be inverted. - for (i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] = +!(buffer[i]); - } - return; - } - var index = 0; - for (i = 0, ii = this.width * this.height; i < ii; i++) { - for (var j = 0; j < numComps; j++) { - buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], - decodeCoefficients[j], max); - index++; - } - } - }, - - getComponents: function PDFImage_getComponents(buffer) { - var bpc = this.bpc; - - // This image doesn't require any extra work. - if (bpc === 8) { - return buffer; - } - - var width = this.width; - var height = this.height; - var numComps = this.numComps; - - var length = width * height * numComps; - var bufferPos = 0; - var output = (bpc <= 8 ? new Uint8Array(length) : - (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length))); - var rowComps = width * numComps; - - var max = (1 << bpc) - 1; - var i = 0, ii, buf; - - if (bpc === 1) { - // Optimization for reading 1 bpc images. - var mask, loop1End, loop2End; - for (var j = 0; j < height; j++) { - loop1End = i + (rowComps & ~7); - loop2End = i + rowComps; - - // unroll loop for all full bytes - while (i < loop1End) { - buf = buffer[bufferPos++]; - output[i] = (buf >> 7) & 1; - output[i + 1] = (buf >> 6) & 1; - output[i + 2] = (buf >> 5) & 1; - output[i + 3] = (buf >> 4) & 1; - output[i + 4] = (buf >> 3) & 1; - output[i + 5] = (buf >> 2) & 1; - output[i + 6] = (buf >> 1) & 1; - output[i + 7] = buf & 1; - i += 8; - } - - // handle remaing bits - if (i < loop2End) { - buf = buffer[bufferPos++]; - mask = 128; - while (i < loop2End) { - output[i++] = +!!(buf & mask); - mask >>= 1; - } - } - } - } else { - // The general case that handles all other bpc values. - var bits = 0; - buf = 0; - for (i = 0, ii = length; i < ii; ++i) { - if (i % rowComps === 0) { - buf = 0; - bits = 0; - } - - while (bits < bpc) { - buf = (buf << 8) | buffer[bufferPos++]; - bits += 8; - } - - var remainingBits = bits - bpc; - var value = buf >> remainingBits; - output[i] = (value < 0 ? 0 : (value > max ? max : value)); - buf = buf & ((1 << remainingBits) - 1); - bits = remainingBits; - } - } - return output; - }, - - fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height, - actualHeight, image) { - var smask = this.smask; - var mask = this.mask; - var alphaBuf, sw, sh, i, ii, j; - - if (smask) { - sw = smask.width; - sh = smask.height; - alphaBuf = new Uint8Array(sw * sh); - smask.fillGrayBuffer(alphaBuf); - if (sw !== width || sh !== height) { - alphaBuf = PDFImage.resize(alphaBuf, smask.bpc, 1, sw, sh, width, - height); - } - } else if (mask) { - if (mask instanceof PDFImage) { - sw = mask.width; - sh = mask.height; - alphaBuf = new Uint8Array(sw * sh); - mask.numComps = 1; - mask.fillGrayBuffer(alphaBuf); - - // Need to invert values in rgbaBuf - for (i = 0, ii = sw * sh; i < ii; ++i) { - alphaBuf[i] = 255 - alphaBuf[i]; - } - - if (sw !== width || sh !== height) { - alphaBuf = PDFImage.resize(alphaBuf, mask.bpc, 1, sw, sh, width, - height); - } - } else if (isArray(mask)) { - // Color key mask: if any of the compontents are outside the range - // then they should be painted. - alphaBuf = new Uint8Array(width * height); - var numComps = this.numComps; - for (i = 0, ii = width * height; i < ii; ++i) { - var opacity = 0; - var imageOffset = i * numComps; - for (j = 0; j < numComps; ++j) { - var color = image[imageOffset + j]; - var maskOffset = j * 2; - if (color < mask[maskOffset] || color > mask[maskOffset + 1]) { - opacity = 255; - break; - } - } - alphaBuf[i] = opacity; - } - } else { - error('Unknown mask format.'); - } - } - - if (alphaBuf) { - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = alphaBuf[i]; - } - } else { - // No mask. - for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) { - rgbaBuf[j] = 255; - } - } - }, - - undoPreblend: function PDFImage_undoPreblend(buffer, width, height) { - var matte = this.smask && this.smask.matte; - if (!matte) { - return; - } - var matteRgb = this.colorSpace.getRgb(matte, 0); - var matteR = matteRgb[0]; - var matteG = matteRgb[1]; - var matteB = matteRgb[2]; - var length = width * height * 4; - var r, g, b; - for (var i = 0; i < length; i += 4) { - var alpha = buffer[i + 3]; - if (alpha === 0) { - // according formula we have to get Infinity in all components - // making it white (typical paper color) should be okay - buffer[i] = 255; - buffer[i + 1] = 255; - buffer[i + 2] = 255; - continue; - } - var k = 255 / alpha; - r = (buffer[i] - matteR) * k + matteR; - g = (buffer[i + 1] - matteG) * k + matteG; - b = (buffer[i + 2] - matteB) * k + matteB; - buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0; - buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0; - buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0; - } - }, - - createImageData: function PDFImage_createImageData(forceRGBA) { - var drawWidth = this.drawWidth; - var drawHeight = this.drawHeight; - var imgData = { // other fields are filled in below - width: drawWidth, - height: drawHeight - }; - - var numComps = this.numComps; - var originalWidth = this.width; - var originalHeight = this.height; - var bpc = this.bpc; - - // Rows start at byte boundary. - var rowBytes = (originalWidth * numComps * bpc + 7) >> 3; - var imgArray; - - if (!forceRGBA) { - // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image - // without any complications, we pass a same-sized copy to the main - // thread rather than expanding by 32x to RGBA form. This saves *lots* - // of memory for many scanned documents. It's also much faster. - // - // Similarly, if it is a 24-bit-per pixel RGB image without any - // complications, we avoid expanding by 1.333x to RGBA form. - var kind; - if (this.colorSpace.name === 'DeviceGray' && bpc === 1) { - kind = ImageKind.GRAYSCALE_1BPP; - } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && - !this.needsDecode) { - kind = ImageKind.RGB_24BPP; - } - if (kind && !this.smask && !this.mask && - drawWidth === originalWidth && drawHeight === originalHeight) { - imgData.kind = kind; - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // If imgArray came from a DecodeStream, we're safe to transfer it - // (and thus neuter it) because it will constitute the entire - // DecodeStream's data. But if it came from a Stream, we need to - // copy it because it'll only be a portion of the Stream's data, and - // the rest will be read later on. - if (this.image instanceof DecodeStream) { - imgData.data = imgArray; - } else { - var newArray = new Uint8Array(imgArray.length); - newArray.set(imgArray); - imgData.data = newArray; - } - if (this.needsDecode) { - // Invert the buffer (which must be grayscale if we reached here). - assert(kind === ImageKind.GRAYSCALE_1BPP); - var buffer = imgData.data; - for (var i = 0, ii = buffer.length; i < ii; i++) { - buffer[i] ^= 0xff; - } - } - return imgData; - } - if (this.image instanceof JpegStream && !this.smask && !this.mask && - (this.colorSpace.name === 'DeviceGray' || - this.colorSpace.name === 'DeviceRGB' || - this.colorSpace.name === 'DeviceCMYK')) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = this.getImageBytes(originalHeight * rowBytes, - drawWidth, drawHeight, true); - return imgData; - } - } - - imgArray = this.getImageBytes(originalHeight * rowBytes); - // imgArray can be incomplete (e.g. after CCITT fax encoding). - var actualHeight = 0 | (imgArray.length / rowBytes * - drawHeight / originalHeight); - - var comps = this.getComponents(imgArray); - - // If opacity data is present, use RGBA_32BPP form. Otherwise, use the - // more compact RGB_24BPP form if allowable. - var alpha01, maybeUndoPreblend; - if (!forceRGBA && !this.smask && !this.mask) { - imgData.kind = ImageKind.RGB_24BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 3); - alpha01 = 0; - maybeUndoPreblend = false; - } else { - imgData.kind = ImageKind.RGBA_32BPP; - imgData.data = new Uint8Array(drawWidth * drawHeight * 4); - alpha01 = 1; - maybeUndoPreblend = true; - - // Color key masking (opacity) must be performed before decoding. - this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, - comps); - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, - drawWidth, drawHeight, actualHeight, bpc, comps, - alpha01); - if (maybeUndoPreblend) { - this.undoPreblend(imgData.data, drawWidth, actualHeight); - } - - return imgData; - }, - - fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) { - var numComps = this.numComps; - if (numComps !== 1) { - error('Reading gray scale from a color image: ' + numComps); - } - - var width = this.width; - var height = this.height; - var bpc = this.bpc; - - // rows start at byte boundary - var rowBytes = (width * numComps * bpc + 7) >> 3; - var imgArray = this.getImageBytes(height * rowBytes); - - var comps = this.getComponents(imgArray); - var i, length; - - if (bpc === 1) { - // inline decoding (= inversion) for 1 bpc images - length = width * height; - if (this.needsDecode) { - // invert and scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (comps[i] - 1) & 255; - } - } else { - // scale to {0, 255} - for (i = 0; i < length; ++i) { - buffer[i] = (-comps[i]) & 255; - } - } - return; - } - - if (this.needsDecode) { - this.decodeBuffer(comps); - } - length = width * height; - // we aren't using a colorspace so we need to scale the value - var scale = 255 / ((1 << bpc) - 1); - for (i = 0; i < length; ++i) { - buffer[i] = (scale * comps[i]) | 0; - } - }, - - getImageBytes: function PDFImage_getImageBytes(length, - drawWidth, drawHeight, - forceRGB) { - this.image.reset(); - this.image.drawWidth = drawWidth || this.width; - this.image.drawHeight = drawHeight || this.height; - this.image.forceRGB = !!forceRGB; - return this.image.getBytes(length); - } - }; - return PDFImage; -})(); - -exports.PDFImage = PDFImage; - -// TODO refactor to remove dependency on colorspace.js -coreColorSpace._setCoreImage(exports); -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePattern = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreFunction, - root.pdfjsCoreColorSpace); - } -}(this, function (exports, sharedUtil, corePrimitives, coreFunction, - coreColorSpace) { - -var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; -var MissingDataException = sharedUtil.MissingDataException; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var warn = sharedUtil.warn; -var isStream = corePrimitives.isStream; -var PDFFunction = coreFunction.PDFFunction; -var ColorSpace = coreColorSpace.ColorSpace; - -var ShadingType = { - FUNCTION_BASED: 1, - AXIAL: 2, - RADIAL: 3, - FREE_FORM_MESH: 4, - LATTICE_FORM_MESH: 5, - COONS_PATCH_MESH: 6, - TENSOR_PATCH_MESH: 7 -}; - -var Pattern = (function PatternClosure() { - // Constructor should define this.getPattern - function Pattern() { - error('should not call Pattern constructor'); - } - - Pattern.prototype = { - // Input: current Canvas context - // Output: the appropriate fillStyle or strokeStyle - getPattern: function Pattern_getPattern(ctx) { - error('Should not call Pattern.getStyle: ' + ctx); - } - }; - - Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, - res, handler) { - - var dict = isStream(shading) ? shading.dict : shading; - var type = dict.get('ShadingType'); - - try { - switch (type) { - case ShadingType.AXIAL: - case ShadingType.RADIAL: - // Both radial and axial shadings are handled by RadialAxial shading. - return new Shadings.RadialAxial(dict, matrix, xref, res); - case ShadingType.FREE_FORM_MESH: - case ShadingType.LATTICE_FORM_MESH: - case ShadingType.COONS_PATCH_MESH: - case ShadingType.TENSOR_PATCH_MESH: - return new Shadings.Mesh(shading, matrix, xref, res); - default: - throw new Error('Unsupported ShadingType: ' + type); - } - } catch (ex) { - if (ex instanceof MissingDataException) { - throw ex; - } - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.shadingPattern}); - warn(ex); - return new Shadings.Dummy(); - } - }; - return Pattern; -})(); - -var Shadings = {}; - -// A small number to offset the first/last color stops so we can insert ones to -// support extend. Number.MIN_VALUE is too small and breaks the extend. -Shadings.SMALL_NUMBER = 1e-6; - -// Radial and axial shading have very similar implementations -// If needed, the implementations can be broken into two classes -Shadings.RadialAxial = (function RadialAxialClosure() { - function RadialAxial(dict, matrix, xref, res) { - this.matrix = matrix; - this.coordsArr = dict.get('Coords'); - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - - var t0 = 0.0, t1 = 1.0; - if (dict.has('Domain')) { - var domainArr = dict.get('Domain'); - t0 = domainArr[0]; - t1 = domainArr[1]; - } - - var extendStart = false, extendEnd = false; - if (dict.has('Extend')) { - var extendArr = dict.get('Extend'); - extendStart = extendArr[0]; - extendEnd = extendArr[1]; - } - - if (this.shadingType === ShadingType.RADIAL && - (!extendStart || !extendEnd)) { - // Radial gradient only currently works if either circle is fully within - // the other circle. - var x1 = this.coordsArr[0]; - var y1 = this.coordsArr[1]; - var r1 = this.coordsArr[2]; - var x2 = this.coordsArr[3]; - var y2 = this.coordsArr[4]; - var r2 = this.coordsArr[5]; - var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); - if (r1 <= r2 + distance && - r2 <= r1 + distance) { - warn('Unsupported radial gradient.'); - } - } - - this.extendStart = extendStart; - this.extendEnd = extendEnd; - - var fnObj = dict.get('Function'); - var fn = PDFFunction.parseArray(xref, fnObj); - - // 10 samples seems good enough for now, but probably won't work - // if there are sharp color changes. Ideally, we would implement - // the spec faithfully and add lossless optimizations. - var diff = t1 - t0; - var step = diff / 10; - - var colorStops = this.colorStops = []; - - // Protect against bad domains so we don't end up in an infinte loop below. - if (t0 >= t1 || step <= 0) { - // Acrobat doesn't seem to handle these cases so we'll ignore for - // now. - info('Bad shading domain.'); - return; - } - - var color = new Float32Array(cs.numComps), ratio = new Float32Array(1); - var rgbColor; - for (var i = t0; i <= t1; i += step) { - ratio[0] = i; - fn(ratio, 0, color, 0); - rgbColor = cs.getRgb(color, 0); - var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - colorStops.push([(i - t0) / diff, cssColor]); - } - - var background = 'transparent'; - if (dict.has('Background')) { - rgbColor = cs.getRgb(dict.get('Background'), 0); - background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - } - - if (!extendStart) { - // Insert a color stop at the front and offset the first real color stop - // so it doesn't conflict with the one we insert. - colorStops.unshift([0, background]); - colorStops[1][0] += Shadings.SMALL_NUMBER; - } - if (!extendEnd) { - // Same idea as above in extendStart but for the end. - colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER; - colorStops.push([1, background]); - } - - this.colorStops = colorStops; - } - - RadialAxial.prototype = { - getIR: function RadialAxial_getIR() { - var coordsArr = this.coordsArr; - var shadingType = this.shadingType; - var type, p0, p1, r0, r1; - if (shadingType === ShadingType.AXIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[2], coordsArr[3]]; - r0 = null; - r1 = null; - type = 'axial'; - } else if (shadingType === ShadingType.RADIAL) { - p0 = [coordsArr[0], coordsArr[1]]; - p1 = [coordsArr[3], coordsArr[4]]; - r0 = coordsArr[2]; - r1 = coordsArr[5]; - type = 'radial'; - } else { - error('getPattern type unknown: ' + shadingType); - } - - var matrix = this.matrix; - if (matrix) { - p0 = Util.applyTransform(p0, matrix); - p1 = Util.applyTransform(p1, matrix); - if (shadingType === ShadingType.RADIAL) { - var scale = Util.singularValueDecompose2dScale(matrix); - r0 *= scale[0]; - r1 *= scale[1]; - } - } - - return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1]; - } - }; - - return RadialAxial; -})(); - -// All mesh shading. For now, they will be presented as set of the triangles -// to be drawn on the canvas and rgb color for each vertex. -Shadings.Mesh = (function MeshClosure() { - function MeshStreamReader(stream, context) { - this.stream = stream; - this.context = context; - this.buffer = 0; - this.bufferLength = 0; - - var numComps = context.numComps; - this.tmpCompsBuf = new Float32Array(numComps); - var csNumComps = context.colorSpace.numComps; - this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : - this.tmpCompsBuf; - } - MeshStreamReader.prototype = { - get hasData() { - if (this.stream.end) { - return this.stream.pos < this.stream.end; - } - if (this.bufferLength > 0) { - return true; - } - var nextByte = this.stream.getByte(); - if (nextByte < 0) { - return false; - } - this.buffer = nextByte; - this.bufferLength = 8; - return true; - }, - readBits: function MeshStreamReader_readBits(n) { - var buffer = this.buffer; - var bufferLength = this.bufferLength; - if (n === 32) { - if (bufferLength === 0) { - return ((this.stream.getByte() << 24) | - (this.stream.getByte() << 16) | (this.stream.getByte() << 8) | - this.stream.getByte()) >>> 0; - } - buffer = (buffer << 24) | (this.stream.getByte() << 16) | - (this.stream.getByte() << 8) | this.stream.getByte(); - var nextByte = this.stream.getByte(); - this.buffer = nextByte & ((1 << bufferLength) - 1); - return ((buffer << (8 - bufferLength)) | - ((nextByte & 0xFF) >> bufferLength)) >>> 0; - } - if (n === 8 && bufferLength === 0) { - return this.stream.getByte(); - } - while (bufferLength < n) { - buffer = (buffer << 8) | this.stream.getByte(); - bufferLength += 8; - } - bufferLength -= n; - this.bufferLength = bufferLength; - this.buffer = buffer & ((1 << bufferLength) - 1); - return buffer >> bufferLength; - }, - align: function MeshStreamReader_align() { - this.buffer = 0; - this.bufferLength = 0; - }, - readFlag: function MeshStreamReader_readFlag() { - return this.readBits(this.context.bitsPerFlag); - }, - readCoordinate: function MeshStreamReader_readCoordinate() { - var bitsPerCoordinate = this.context.bitsPerCoordinate; - var xi = this.readBits(bitsPerCoordinate); - var yi = this.readBits(bitsPerCoordinate); - var decode = this.context.decode; - var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - return [ - xi * scale * (decode[1] - decode[0]) + decode[0], - yi * scale * (decode[3] - decode[2]) + decode[2] - ]; - }, - readComponents: function MeshStreamReader_readComponents() { - var numComps = this.context.numComps; - var bitsPerComponent = this.context.bitsPerComponent; - var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : - 2.3283064365386963e-10; // 2 ^ -32 - var decode = this.context.decode; - var components = this.tmpCompsBuf; - for (var i = 0, j = 4; i < numComps; i++, j += 2) { - var ci = this.readBits(bitsPerComponent); - components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j]; - } - var color = this.tmpCsCompsBuf; - if (this.context.colorFn) { - this.context.colorFn(components, 0, color, 0); - } - return this.context.colorSpace.getRgb(color, 0); - } - }; - - function decodeType4Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var operators = []; - var ps = []; // not maintaining cs since that will match ps - var verticesLeft = 0; // assuming we have all data to start a new triangle - while (reader.hasData) { - var f = reader.readFlag(); - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - if (verticesLeft === 0) { // ignoring flags if we started a triangle - assert(0 <= f && f <= 2, 'Unknown type4 flag'); - switch (f) { - case 0: - verticesLeft = 3; - break; - case 1: - ps.push(ps[ps.length - 2], ps[ps.length - 1]); - verticesLeft = 1; - break; - case 2: - ps.push(ps[ps.length - 3], ps[ps.length - 1]); - verticesLeft = 1; - break; - } - operators.push(f); - } - ps.push(coords.length); - coords.push(coord); - colors.push(color); - verticesLeft--; - - reader.align(); - } - mesh.figures.push({ - type: 'triangles', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - }); - } - - function decodeType5Shading(mesh, reader, verticesPerRow) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = []; // not maintaining cs since that will match ps - while (reader.hasData) { - var coord = reader.readCoordinate(); - var color = reader.readComponents(); - ps.push(coords.length); - coords.push(coord); - colors.push(color); - } - mesh.figures.push({ - type: 'lattice', - coords: new Int32Array(ps), - colors: new Int32Array(ps), - verticesPerRow: verticesPerRow - }); - } - - var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3; - var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20; - - var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds - - var getB = (function getBClosure() { - function buildB(count) { - var lut = []; - for (var i = 0; i <= count; i++) { - var t = i / count, t_ = 1 - t; - lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, - 3 * t * t * t_, t * t * t])); - } - return lut; - } - var cache = []; - return function getB(count) { - if (!cache[count]) { - cache[count] = buildB(count); - } - return cache[count]; - }; - })(); - - function buildFigureFromPatch(mesh, index) { - var figure = mesh.figures[index]; - assert(figure.type === 'patch', 'Unexpected patch mesh figure'); - - var coords = mesh.coords, colors = mesh.colors; - var pi = figure.coords; - var ci = figure.colors; - - var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], - coords[pi[12]][0], coords[pi[15]][0]); - var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], - coords[pi[12]][1], coords[pi[15]][1]); - var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / - (mesh.bounds[2] - mesh.bounds[0])); - splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy)); - var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / - (mesh.bounds[3] - mesh.bounds[1])); - splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, - Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy)); - - var verticesPerRow = splitXBy + 1; - var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow); - var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow); - var k = 0; - var cl = new Uint8Array(3), cr = new Uint8Array(3); - var c0 = colors[ci[0]], c1 = colors[ci[1]], - c2 = colors[ci[2]], c3 = colors[ci[3]]; - var bRow = getB(splitYBy), bCol = getB(splitXBy); - for (var row = 0; row <= splitYBy; row++) { - cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0; - cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0; - cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0; - - cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0; - cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0; - cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0; - - for (var col = 0; col <= splitXBy; col++, k++) { - if ((row === 0 || row === splitYBy) && - (col === 0 || col === splitXBy)) { - continue; - } - var x = 0, y = 0; - var q = 0; - for (var i = 0; i <= 3; i++) { - for (var j = 0; j <= 3; j++, q++) { - var m = bRow[row][i] * bCol[col][j]; - x += coords[pi[q]][0] * m; - y += coords[pi[q]][1] * m; - } - } - figureCoords[k] = coords.length; - coords.push([x, y]); - figureColors[k] = colors.length; - var newColor = new Uint8Array(3); - newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0; - newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0; - newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0; - colors.push(newColor); - } - } - figureCoords[0] = pi[0]; - figureColors[0] = ci[0]; - figureCoords[splitXBy] = pi[3]; - figureColors[splitXBy] = ci[1]; - figureCoords[verticesPerRow * splitYBy] = pi[12]; - figureColors[verticesPerRow * splitYBy] = ci[2]; - figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15]; - figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3]; - - mesh.figures[index] = { - type: 'lattice', - coords: figureCoords, - colors: figureColors, - verticesPerRow: verticesPerRow - }; - } - - function decodeType6Shading(mesh, reader) { - // A special case of Type 7. The p11, p12, p21, p22 automatically filled - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type6 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 7; - ps[ 4] = pi + 1; /* calculated below */ ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = tmp2; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 3; - ps[ 4] = ps[2]; /* calculated below */ ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - // set p11, p12, p21, p22 - ps[5] = coords.length; - coords.push([ - (-4 * coords[ps[0]][0] - coords[ps[15]][0] + - 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, - (-4 * coords[ps[0]][1] - coords[ps[15]][1] + - 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9 - ]); - ps[6] = coords.length; - coords.push([ - (-4 * coords[ps[3]][0] - coords[ps[12]][0] + - 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, - (-4 * coords[ps[3]][1] - coords[ps[12]][1] + - 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9 - ]); - ps[9] = coords.length; - coords.push([ - (-4 * coords[ps[12]][0] - coords[ps[3]][0] + - 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + - 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, - (-4 * coords[ps[12]][1] - coords[ps[3]][1] + - 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + - 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9 - ]); - ps[10] = coords.length; - coords.push([ - (-4 * coords[ps[15]][0] - coords[ps[0]][0] + - 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + - 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, - (-4 * coords[ps[15]][1] - coords[ps[0]][1] + - 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + - 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9 - ]); - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function decodeType7Shading(mesh, reader) { - var coords = mesh.coords; - var colors = mesh.colors; - var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33 - var cs = new Int32Array(4); // c00, c30, c03, c33 - while (reader.hasData) { - var f = reader.readFlag(); - assert(0 <= f && f <= 3, 'Unknown type7 flag'); - var i, ii; - var pi = coords.length; - for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) { - coords.push(reader.readCoordinate()); - } - var ci = colors.length; - for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) { - colors.push(reader.readComponents()); - } - var tmp1, tmp2, tmp3, tmp4; - switch (f) { - case 0: - ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6; - ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7; - ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8; - ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9; - cs[2] = ci + 1; cs[3] = ci + 2; - cs[0] = ci; cs[1] = ci + 3; - break; - case 1: - tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15]; - ps[12] = tmp4; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = tmp3; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[2]; tmp2 = cs[3]; - cs[2] = tmp2; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 2: - tmp1 = ps[15]; - tmp2 = ps[11]; - ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[7]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = tmp2; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = tmp1; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - tmp1 = cs[3]; - cs[2] = cs[1]; cs[3] = ci; - cs[0] = tmp1; cs[1] = ci + 1; - break; - case 3: - ps[12] = ps[0]; ps[13] = pi + 0; ps[14] = pi + 1; ps[15] = pi + 2; - ps[ 8] = ps[1]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3; - ps[ 4] = ps[2]; ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4; - ps[ 0] = ps[3]; ps[ 1] = pi + 7; ps[ 2] = pi + 6; ps[ 3] = pi + 5; - cs[2] = cs[0]; cs[3] = ci; - cs[0] = cs[1]; cs[1] = ci + 1; - break; - } - mesh.figures.push({ - type: 'patch', - coords: new Int32Array(ps), // making copies of ps and cs - colors: new Int32Array(cs) - }); - } - } - - function updateBounds(mesh) { - var minX = mesh.coords[0][0], minY = mesh.coords[0][1], - maxX = minX, maxY = minY; - for (var i = 1, ii = mesh.coords.length; i < ii; i++) { - var x = mesh.coords[i][0], y = mesh.coords[i][1]; - minX = minX > x ? x : minX; - minY = minY > y ? y : minY; - maxX = maxX < x ? x : maxX; - maxY = maxY < y ? y : maxY; - } - mesh.bounds = [minX, minY, maxX, maxY]; - } - - function packData(mesh) { - var i, ii, j, jj; - - var coords = mesh.coords; - var coordsPacked = new Float32Array(coords.length * 2); - for (i = 0, j = 0, ii = coords.length; i < ii; i++) { - var xy = coords[i]; - coordsPacked[j++] = xy[0]; - coordsPacked[j++] = xy[1]; - } - mesh.coords = coordsPacked; - - var colors = mesh.colors; - var colorsPacked = new Uint8Array(colors.length * 3); - for (i = 0, j = 0, ii = colors.length; i < ii; i++) { - var c = colors[i]; - colorsPacked[j++] = c[0]; - colorsPacked[j++] = c[1]; - colorsPacked[j++] = c[2]; - } - mesh.colors = colorsPacked; - - var figures = mesh.figures; - for (i = 0, ii = figures.length; i < ii; i++) { - var figure = figures[i], ps = figure.coords, cs = figure.colors; - for (j = 0, jj = ps.length; j < jj; j++) { - ps[j] *= 2; - cs[j] *= 3; - } - } - } - - function Mesh(stream, matrix, xref, res) { - assert(isStream(stream), 'Mesh data is not a stream'); - var dict = stream.dict; - this.matrix = matrix; - this.shadingType = dict.get('ShadingType'); - this.type = 'Pattern'; - this.bbox = dict.get('BBox'); - var cs = dict.get('ColorSpace', 'CS'); - cs = ColorSpace.parse(cs, xref, res); - this.cs = cs; - this.background = dict.has('Background') ? - cs.getRgb(dict.get('Background'), 0) : null; - - var fnObj = dict.get('Function'); - var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null; - - this.coords = []; - this.colors = []; - this.figures = []; - - var decodeContext = { - bitsPerCoordinate: dict.get('BitsPerCoordinate'), - bitsPerComponent: dict.get('BitsPerComponent'), - bitsPerFlag: dict.get('BitsPerFlag'), - decode: dict.get('Decode'), - colorFn: fn, - colorSpace: cs, - numComps: fn ? 1 : cs.numComps - }; - var reader = new MeshStreamReader(stream, decodeContext); - - var patchMesh = false; - switch (this.shadingType) { - case ShadingType.FREE_FORM_MESH: - decodeType4Shading(this, reader); - break; - case ShadingType.LATTICE_FORM_MESH: - var verticesPerRow = dict.get('VerticesPerRow') | 0; - assert(verticesPerRow >= 2, 'Invalid VerticesPerRow'); - decodeType5Shading(this, reader, verticesPerRow); - break; - case ShadingType.COONS_PATCH_MESH: - decodeType6Shading(this, reader); - patchMesh = true; - break; - case ShadingType.TENSOR_PATCH_MESH: - decodeType7Shading(this, reader); - patchMesh = true; - break; - default: - error('Unsupported mesh type.'); - break; - } - - if (patchMesh) { - // dirty bounds calculation for determining, how dense shall be triangles - updateBounds(this); - for (var i = 0, ii = this.figures.length; i < ii; i++) { - buildFigureFromPatch(this, i); - } - } - // calculate bounds - updateBounds(this); - - packData(this); - } - - Mesh.prototype = { - getIR: function Mesh_getIR() { - return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, - this.bounds, this.matrix, this.bbox, this.background]; - } - }; - - return Mesh; -})(); - -Shadings.Dummy = (function DummyClosure() { - function Dummy() { - this.type = 'Pattern'; - } - - Dummy.prototype = { - getIR: function Dummy_getIR() { - return ['Dummy']; - } - }; - return Dummy; -})(); - -function getTilingPatternIR(operatorList, dict, args) { - var matrix = dict.get('Matrix'); - var bbox = dict.get('BBox'); - var xstep = dict.get('XStep'); - var ystep = dict.get('YStep'); - var paintType = dict.get('PaintType'); - var tilingType = dict.get('TilingType'); - - return [ - 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, - paintType, tilingType - ]; -} - -exports.Pattern = Pattern; -exports.getTilingPatternIR = getTilingPatternIR; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreEvaluator = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreParser, - root.pdfjsCoreImage, root.pdfjsCoreColorSpace, root.pdfjsCoreMurmurHash3, - root.pdfjsCoreFonts, root.pdfjsCoreFunction, root.pdfjsCorePattern, - root.pdfjsCoreCMap, root.pdfjsCoreMetrics, root.pdfjsCoreBidi); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, coreParser, - coreImage, coreColorSpace, coreMurmurHash3, coreFonts, - coreFunction, corePattern, coreCMap, coreMetrics, coreBidi) { - -var FONT_IDENTITY_MATRIX = sharedUtil.FONT_IDENTITY_MATRIX; -var IDENTITY_MATRIX = sharedUtil.IDENTITY_MATRIX; -var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; -var ImageKind = sharedUtil.ImageKind; -var OPS = sharedUtil.OPS; -var TextRenderingMode = sharedUtil.TextRenderingMode; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isNum = sharedUtil.isNum; -var isString = sharedUtil.isString; -var warn = sharedUtil.warn; -var Dict = corePrimitives.Dict; -var Name = corePrimitives.Name; -var isCmd = corePrimitives.isCmd; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isRef = corePrimitives.isRef; -var isStream = corePrimitives.isStream; -var DecodeStream = coreStream.DecodeStream; -var JpegStream = coreStream.JpegStream; -var Lexer = coreParser.Lexer; -var Parser = coreParser.Parser; -var isEOF = coreParser.isEOF; -var PDFImage = coreImage.PDFImage; -var ColorSpace = coreColorSpace.ColorSpace; -var MurmurHash3_64 = coreMurmurHash3.MurmurHash3_64; -var Encodings = coreFonts.Encodings; -var ErrorFont = coreFonts.ErrorFont; -var FontFlags = coreFonts.FontFlags; -var Font = coreFonts.Font; -var IdentityToUnicodeMap = coreFonts.IdentityToUnicodeMap; -var NormalizedUnicodes = coreFonts.NormalizedUnicodes; -var ToUnicodeMap = coreFonts.ToUnicodeMap; -var getFontType = coreFonts.getFontType; -var reverseIfRtl = coreFonts.reverseIfRtl; -var serifFonts = coreFonts.serifFonts; -var symbolsFonts = coreFonts.symbolsFonts; -var stdFontMap = coreFonts.stdFontMap; -var isPDFFunction = coreFunction.isPDFFunction; -var PDFFunction = coreFunction.PDFFunction; -var Pattern = corePattern.Pattern; -var getTilingPatternIR = corePattern.getTilingPatternIR; -var CMapFactory = coreCMap.CMapFactory; -var IdentityCMap = coreCMap.IdentityCMap; -var Metrics = coreMetrics.Metrics; -var bidi = coreBidi.bidi; - -var PartialEvaluator = (function PartialEvaluatorClosure() { - function PartialEvaluator(pdfManager, xref, handler, pageIndex, - uniquePrefix, idCounters, fontCache) { - this.pdfManager = pdfManager; - this.xref = xref; - this.handler = handler; - this.pageIndex = pageIndex; - this.uniquePrefix = uniquePrefix; - this.idCounters = idCounters; - this.fontCache = fontCache; - } - - // Trying to minimize Date.now() usage and check every 100 time - var TIME_SLOT_DURATION_MS = 20; - var CHECK_TIME_EVERY = 100; - function TimeSlotManager() { - this.reset(); - } - TimeSlotManager.prototype = { - check: function TimeSlotManager_check() { - if (++this.checked < CHECK_TIME_EVERY) { - return false; - } - this.checked = 0; - return this.endTime <= Date.now(); - }, - reset: function TimeSlotManager_reset() { - this.endTime = Date.now() + TIME_SLOT_DURATION_MS; - this.checked = 0; - } - }; - - var deferred = Promise.resolve(); - - var TILING_PATTERN = 1, SHADING_PATTERN = 2; - - PartialEvaluator.prototype = { - hasBlendModes: function PartialEvaluator_hasBlendModes(resources) { - if (!isDict(resources)) { - return false; - } - - var processed = Object.create(null); - if (resources.objId) { - processed[resources.objId] = true; - } - - var nodes = [resources]; - while (nodes.length) { - var key; - var node = nodes.shift(); - // First check the current resources for blend modes. - var graphicStates = node.get('ExtGState'); - if (isDict(graphicStates)) { - graphicStates = graphicStates.getAll(); - for (key in graphicStates) { - var graphicState = graphicStates[key]; - var bm = graphicState['BM']; - if (isName(bm) && bm.name !== 'Normal') { - return true; - } - } - } - // Descend into the XObjects to look for more resources and blend modes. - var xObjects = node.get('XObject'); - if (!isDict(xObjects)) { - continue; - } - xObjects = xObjects.getAll(); - for (key in xObjects) { - var xObject = xObjects[key]; - if (!isStream(xObject)) { - continue; - } - if (xObject.dict.objId) { - if (processed[xObject.dict.objId]) { - // stream has objId and is processed already - continue; - } - processed[xObject.dict.objId] = true; - } - var xResources = xObject.dict.get('Resources'); - // Checking objId to detect an infinite loop. - if (isDict(xResources) && - (!xResources.objId || !processed[xResources.objId])) { - nodes.push(xResources); - if (xResources.objId) { - processed[xResources.objId] = true; - } - } - } - } - return false; - }, - - buildFormXObject: function PartialEvaluator_buildFormXObject(resources, - xobj, smask, - operatorList, - task, - initialState) { - var matrix = xobj.dict.getArray('Matrix'); - var bbox = xobj.dict.getArray('BBox'); - var group = xobj.dict.get('Group'); - if (group) { - var groupOptions = { - matrix: matrix, - bbox: bbox, - smask: smask, - isolated: false, - knockout: false - }; - - var groupSubtype = group.get('S'); - var colorSpace; - if (isName(groupSubtype) && groupSubtype.name === 'Transparency') { - groupOptions.isolated = (group.get('I') || false); - groupOptions.knockout = (group.get('K') || false); - colorSpace = (group.has('CS') ? - ColorSpace.parse(group.get('CS'), this.xref, resources) : null); - } - - if (smask && smask.backdrop) { - colorSpace = colorSpace || ColorSpace.singletons.rgb; - smask.backdrop = colorSpace.getRgb(smask.backdrop, 0); - } - - operatorList.addOp(OPS.beginGroup, [groupOptions]); - } - - operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]); - - return this.getOperatorList(xobj, task, - (xobj.dict.get('Resources') || resources), operatorList, initialState). - then(function () { - operatorList.addOp(OPS.paintFormXObjectEnd, []); - - if (group) { - operatorList.addOp(OPS.endGroup, [groupOptions]); - } - }); - }, - - buildPaintImageXObject: - function PartialEvaluator_buildPaintImageXObject(resources, image, - inline, operatorList, - cacheKey, imageCache) { - var self = this; - var dict = image.dict; - var w = dict.get('Width', 'W'); - var h = dict.get('Height', 'H'); - - if (!(w && isNum(w)) || !(h && isNum(h))) { - warn('Image dimensions are missing, or not numbers.'); - return; - } - if (PDFJS.maxImageSize !== -1 && w * h > PDFJS.maxImageSize) { - warn('Image exceeded maximum allowed size and was removed.'); - return; - } - - var imageMask = (dict.get('ImageMask', 'IM') || false); - var imgData, args; - if (imageMask) { - // This depends on a tmpCanvas being filled with the - // current fillStyle, such that processing the pixel - // data can't be done here. Instead of creating a - // complete PDFImage, only read the information needed - // for later. - - var width = dict.get('Width', 'W'); - var height = dict.get('Height', 'H'); - var bitStrideLength = (width + 7) >> 3; - var imgArray = image.getBytes(bitStrideLength * height); - var decode = dict.get('Decode', 'D'); - var inverseDecode = (!!decode && decode[0] > 0); - - imgData = PDFImage.createMask(imgArray, width, height, - image instanceof DecodeStream, - inverseDecode); - imgData.cached = true; - args = [imgData]; - operatorList.addOp(OPS.paintImageMaskXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageMaskXObject, - args: args - }; - } - return; - } - - var softMask = (dict.get('SMask', 'SM') || false); - var mask = (dict.get('Mask') || false); - - var SMALL_IMAGE_DIMENSIONS = 200; - // Inlining small images into the queue as RGB data - if (inline && !softMask && !mask && !(image instanceof JpegStream) && - (w + h) < SMALL_IMAGE_DIMENSIONS) { - var imageObj = new PDFImage(this.xref, resources, image, - inline, null, null); - // We force the use of RGBA_32BPP images here, because we can't handle - // any other kind. - imgData = imageObj.createImageData(/* forceRGBA = */ true); - operatorList.addOp(OPS.paintInlineImageXObject, [imgData]); - return; - } - - // If there is no imageMask, create the PDFImage and a lot - // of image processing can be done here. - var uniquePrefix = (this.uniquePrefix || ''); - var objId = 'img_' + uniquePrefix + (++this.idCounters.obj); - operatorList.addDependency(objId); - args = [objId, w, h]; - - if (!softMask && !mask && image instanceof JpegStream && - image.isNativelySupported(this.xref, resources)) { - // These JPEGs don't need any more processing so we can just send it. - operatorList.addOp(OPS.paintJpegXObject, args); - this.handler.send('obj', - [objId, this.pageIndex, 'JpegStream', image.getIR()]); - return; - } - - PDFImage.buildImage(self.handler, self.xref, resources, image, inline). - then(function(imageObj) { - var imgData = imageObj.createImageData(/* forceRGBA = */ false); - self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData], - [imgData.data.buffer]); - }).then(undefined, function (reason) { - warn('Unable to decode image: ' + reason); - self.handler.send('obj', [objId, self.pageIndex, 'Image', null]); - }); - - operatorList.addOp(OPS.paintImageXObject, args); - if (cacheKey) { - imageCache[cacheKey] = { - fn: OPS.paintImageXObject, - args: args - }; - } - }, - - handleSMask: function PartialEvaluator_handleSmask(smask, resources, - operatorList, task, - stateManager) { - var smaskContent = smask.get('G'); - var smaskOptions = { - subtype: smask.get('S').name, - backdrop: smask.get('BC') - }; - - // The SMask might have a alpha/luminosity value transfer function -- - // we will build a map of integer values in range 0..255 to be fast. - var transferObj = smask.get('TR'); - if (isPDFFunction(transferObj)) { - var transferFn = PDFFunction.parse(this.xref, transferObj); - var transferMap = new Uint8Array(256); - var tmp = new Float32Array(1); - for (var i = 0; i < 255; i++) { - tmp[0] = i / 255; - transferFn(tmp, 0, tmp, 0); - transferMap[i] = (tmp[0] * 255) | 0; - } - smaskOptions.transferMap = transferMap; - } - - return this.buildFormXObject(resources, smaskContent, smaskOptions, - operatorList, task, stateManager.state.clone()); - }, - - handleTilingType: - function PartialEvaluator_handleTilingType(fn, args, resources, - pattern, patternDict, - operatorList, task) { - // Create an IR of the pattern code. - var tilingOpList = new OperatorList(); - // Merge the available resources, to prevent issues when the patternDict - // is missing some /Resources entries (fixes issue6541.pdf). - var resourcesArray = [patternDict.get('Resources'), resources]; - var patternResources = Dict.merge(this.xref, resourcesArray); - - return this.getOperatorList(pattern, task, patternResources, - tilingOpList).then(function () { - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - operatorList.addDependencies(tilingOpList.dependencies); - operatorList.addOp(fn, getTilingPatternIR({ - fnArray: tilingOpList.fnArray, - argsArray: tilingOpList.argsArray - }, patternDict, args)); - }); - }, - - handleSetFont: - function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, - operatorList, task, state) { - // TODO(mack): Not needed? - var fontName; - if (fontArgs) { - fontArgs = fontArgs.slice(); - fontName = fontArgs[0].name; - } - - var self = this; - return this.loadFont(fontName, fontRef, this.xref, resources).then( - function (translated) { - if (!translated.font.isType3Font) { - return translated; - } - return translated.loadType3Data(self, resources, operatorList, task). - then(function () { - return translated; - }, function (reason) { - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - return new TranslatedFont('g_font_error', - new ErrorFont('Type3 font load error: ' + reason), translated.font); - }); - }).then(function (translated) { - state.font = translated.font; - translated.send(self.handler); - return translated.loadedName; - }); - }, - - handleText: function PartialEvaluator_handleText(chars, state) { - var font = state.font; - var glyphs = font.charsToGlyphs(chars); - var isAddToPathSet = !!(state.textRenderingMode & - TextRenderingMode.ADD_TO_PATH_FLAG); - if (font.data && (isAddToPathSet || PDFJS.disableFontFace)) { - var buildPath = function (fontChar) { - if (!font.renderer.hasBuiltPath(fontChar)) { - var path = font.renderer.getPathJs(fontChar); - this.handler.send('commonobj', [ - font.loadedName + '_path_' + fontChar, - 'FontPath', - path - ]); - } - }.bind(this); - - for (var i = 0, ii = glyphs.length; i < ii; i++) { - var glyph = glyphs[i]; - buildPath(glyph.fontChar); - - // If the glyph has an accent we need to build a path for its - // fontChar too, otherwise CanvasGraphics_paintChar will fail. - var accent = glyph.accent; - if (accent && accent.fontChar) { - buildPath(accent.fontChar); - } - } - } - - return glyphs; - }, - - setGState: function PartialEvaluator_setGState(resources, gState, - operatorList, task, - xref, stateManager) { - // This array holds the converted/processed state data. - var gStateObj = []; - var gStateMap = gState.map; - var self = this; - var promise = Promise.resolve(); - for (var key in gStateMap) { - var value = gStateMap[key]; - switch (key) { - case 'Type': - break; - case 'LW': - case 'LC': - case 'LJ': - case 'ML': - case 'D': - case 'RI': - case 'FL': - case 'CA': - case 'ca': - gStateObj.push([key, value]); - break; - case 'Font': - promise = promise.then(function () { - return self.handleSetFont(resources, null, value[0], operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - gStateObj.push([key, [loadedName, value[1]]]); - }); - }); - break; - case 'BM': - gStateObj.push([key, value]); - break; - case 'SMask': - if (isName(value) && value.name === 'None') { - gStateObj.push([key, false]); - break; - } - var dict = xref.fetchIfRef(value); - if (isDict(dict)) { - promise = promise.then(function () { - return self.handleSMask(dict, resources, operatorList, - task, stateManager); - }); - gStateObj.push([key, true]); - } else { - warn('Unsupported SMask type'); - } - - break; - // Only generate info log messages for the following since - // they are unlikely to have a big impact on the rendering. - case 'OP': - case 'op': - case 'OPM': - case 'BG': - case 'BG2': - case 'UCR': - case 'UCR2': - case 'TR': - case 'TR2': - case 'HT': - case 'SM': - case 'SA': - case 'AIS': - case 'TK': - // TODO implement these operators. - info('graphic state operator ' + key); - break; - default: - info('Unknown graphic state operator ' + key); - break; - } - } - return promise.then(function () { - if (gStateObj.length >= 0) { - operatorList.addOp(OPS.setGState, [gStateObj]); - } - }); - }, - - loadFont: function PartialEvaluator_loadFont(fontName, font, xref, - resources) { - - function errorFont() { - return Promise.resolve(new TranslatedFont('g_font_error', - new ErrorFont('Font ' + fontName + ' is not available'), font)); - } - var fontRef; - if (font) { // Loading by ref. - assert(isRef(font)); - fontRef = font; - } else { // Loading by name. - var fontRes = resources.get('Font'); - if (fontRes) { - fontRef = fontRes.getRaw(fontName); - } else { - warn('fontRes not available'); - return errorFont(); - } - } - if (!fontRef) { - warn('fontRef not available'); - return errorFont(); - } - - if (this.fontCache.has(fontRef)) { - return this.fontCache.get(fontRef); - } - - font = xref.fetchIfRef(fontRef); - if (!isDict(font)) { - return errorFont(); - } - - // We are holding font.translated references just for fontRef that are not - // dictionaries (Dict). See explanation below. - if (font.translated) { - return font.translated; - } - - var fontCapability = createPromiseCapability(); - - var preEvaluatedFont = this.preEvaluateFont(font, xref); - var descriptor = preEvaluatedFont.descriptor; - var fontID = fontRef.num + '_' + fontRef.gen; - if (isDict(descriptor)) { - if (!descriptor.fontAliases) { - descriptor.fontAliases = Object.create(null); - } - - var fontAliases = descriptor.fontAliases; - var hash = preEvaluatedFont.hash; - if (fontAliases[hash]) { - var aliasFontRef = fontAliases[hash].aliasRef; - if (aliasFontRef && this.fontCache.has(aliasFontRef)) { - this.fontCache.putAlias(fontRef, aliasFontRef); - return this.fontCache.get(fontRef); - } - } - - if (!fontAliases[hash]) { - fontAliases[hash] = { - fontID: Font.getFontID() - }; - } - - fontAliases[hash].aliasRef = fontRef; - fontID = fontAliases[hash].fontID; - } - - // Workaround for bad PDF generators that don't reference fonts - // properly, i.e. by not using an object identifier. - // Check if the fontRef is a Dict (as opposed to a standard object), - // in which case we don't cache the font and instead reference it by - // fontName in font.loadedName below. - var fontRefIsDict = isDict(fontRef); - if (!fontRefIsDict) { - this.fontCache.put(fontRef, fontCapability.promise); - } - - // Keep track of each font we translated so the caller can - // load them asynchronously before calling display on a page. - font.loadedName = 'g_' + this.pdfManager.docId + '_f' + (fontRefIsDict ? - fontName.replace(/\W/g, '') : fontID); - - font.translated = fontCapability.promise; - - // TODO move promises into translate font - var translatedPromise; - try { - translatedPromise = Promise.resolve( - this.translateFont(preEvaluatedFont, xref)); - } catch (e) { - translatedPromise = Promise.reject(e); - } - - var self = this; - translatedPromise.then(function (translatedFont) { - if (translatedFont.fontType !== undefined) { - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[translatedFont.fontType] = true; - } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - translatedFont, font)); - }, function (reason) { - // TODO fontCapability.reject? - // Error in the font data -- sending unsupported feature notification. - self.handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.font}); - - try { - // error, but it's still nice to have font type reported - var descriptor = preEvaluatedFont.descriptor; - var fontFile3 = descriptor && descriptor.get('FontFile3'); - var subtype = fontFile3 && fontFile3.get('Subtype'); - var fontType = getFontType(preEvaluatedFont.type, - subtype && subtype.name); - var xrefFontStats = xref.stats.fontTypes; - xrefFontStats[fontType] = true; - } catch (ex) { } - - fontCapability.resolve(new TranslatedFont(font.loadedName, - new ErrorFont(reason instanceof Error ? reason.message : reason), - font)); - }); - return fontCapability.promise; - }, - - buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) { - var lastIndex = operatorList.length - 1; - if (!args) { - args = []; - } - if (lastIndex < 0 || - operatorList.fnArray[lastIndex] !== OPS.constructPath) { - operatorList.addOp(OPS.constructPath, [[fn], args]); - } else { - var opArgs = operatorList.argsArray[lastIndex]; - opArgs[0].push(fn); - Array.prototype.push.apply(opArgs[1], args); - } - }, - - handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, - cs, patterns, resources, task, xref) { - // compile tiling patterns - var patternName = args[args.length - 1]; - // SCN/scn applies patterns along with normal colors - var pattern; - if (isName(patternName) && - (pattern = patterns.get(patternName.name))) { - var dict = (isStream(pattern) ? pattern.dict : pattern); - var typeNum = dict.get('PatternType'); - - if (typeNum === TILING_PATTERN) { - var color = cs.base ? cs.base.getRgb(args, 0) : null; - return this.handleTilingType(fn, color, resources, pattern, - dict, operatorList, task); - } else if (typeNum === SHADING_PATTERN) { - var shading = dict.get('Shading'); - var matrix = dict.get('Matrix'); - pattern = Pattern.parseShading(shading, matrix, xref, resources, - this.handler); - operatorList.addOp(fn, pattern.getIR()); - return Promise.resolve(); - } else { - return Promise.reject('Unknown PatternType: ' + typeNum); - } - } - // TODO shall we fail here? - operatorList.addOp(fn, args); - return Promise.resolve(); - }, - - getOperatorList: function PartialEvaluator_getOperatorList(stream, - task, - resources, - operatorList, - initialState) { - - var self = this; - var xref = this.xref; - var imageCache = {}; - - assert(operatorList); - - resources = (resources || Dict.empty); - var xobjs = (resources.get('XObject') || Dict.empty); - var patterns = (resources.get('Pattern') || Dict.empty); - var stateManager = new StateManager(initialState || new EvalState()); - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function next(resolve, reject) { - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, i, ii, cs; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are used beyond this loop, so we - // cannot reuse the same array on each iteration. Therefore we pass - // in |null| as the initial value (see the comment on - // EvaluatorPreprocessor_read() for why). - operation.args = null; - if (!(preprocessor.read(operation))) { - break; - } - var args = operation.args; - var fn = operation.fn; - - switch (fn | 0) { - case OPS.paintXObject: - if (args[0].code) { - break; - } - // eagerly compile XForm objects - var name = args[0].name; - if (!name) { - warn('XObject must be referred to by name.'); - continue; - } - if (imageCache[name] !== undefined) { - operatorList.addOp(imageCache[name].fn, imageCache[name].args); - args = null; - continue; - } - - var xobj = xobjs.get(name); - if (xobj) { - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), - 'XObject should have a Name subtype'); - - if (type.name === 'Form') { - stateManager.save(); - return self.buildFormXObject(resources, xobj, null, - operatorList, task, - stateManager.state.clone()). - then(function () { - stateManager.restore(); - next(resolve, reject); - }, reject); - } else if (type.name === 'Image') { - self.buildPaintImageXObject(resources, xobj, false, - operatorList, name, imageCache); - args = null; - continue; - } else if (type.name === 'PS') { - // PostScript XObjects are unused when viewing documents. - // See section 4.7.1 of Adobe's PDF reference. - info('Ignored XObject subtype PS'); - continue; - } else { - error('Unhandled XObject subtype ' + type.name); - } - } - break; - case OPS.setFont: - var fontSize = args[1]; - // eagerly collect all fonts - return self.handleSetFont(resources, args, null, operatorList, - task, stateManager.state). - then(function (loadedName) { - operatorList.addDependency(loadedName); - operatorList.addOp(OPS.setFont, [loadedName, fontSize]); - next(resolve, reject); - }, reject); - case OPS.endInlineImage: - var cacheKey = args[0].cacheKey; - if (cacheKey) { - var cacheEntry = imageCache[cacheKey]; - if (cacheEntry !== undefined) { - operatorList.addOp(cacheEntry.fn, cacheEntry.args); - args = null; - continue; - } - } - self.buildPaintImageXObject(resources, args[0], true, - operatorList, cacheKey, imageCache); - args = null; - continue; - case OPS.showText: - args[0] = self.handleText(args[0], stateManager.state); - break; - case OPS.showSpacedText: - var arr = args[0]; - var combinedGlyphs = []; - var arrLength = arr.length; - var state = stateManager.state; - for (i = 0; i < arrLength; ++i) { - var arrItem = arr[i]; - if (isString(arrItem)) { - Array.prototype.push.apply(combinedGlyphs, - self.handleText(arrItem, state)); - } else if (isNum(arrItem)) { - combinedGlyphs.push(arrItem); - } - } - args[0] = combinedGlyphs; - fn = OPS.showText; - break; - case OPS.nextLineShowText: - operatorList.addOp(OPS.nextLine); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.nextLineSetSpacingShowText: - operatorList.addOp(OPS.nextLine); - operatorList.addOp(OPS.setWordSpacing, [args.shift()]); - operatorList.addOp(OPS.setCharSpacing, [args.shift()]); - args[0] = self.handleText(args[0], stateManager.state); - fn = OPS.showText; - break; - case OPS.setTextRenderingMode: - stateManager.state.textRenderingMode = args[0]; - break; - - case OPS.setFillColorSpace: - stateManager.state.fillColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setStrokeColorSpace: - stateManager.state.strokeColorSpace = - ColorSpace.parse(args[0], xref, resources); - continue; - case OPS.setFillColor: - cs = stateManager.state.fillColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColor: - cs = stateManager.state.strokeColorSpace; - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillGray: - stateManager.state.fillColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeGray: - stateManager.state.strokeColorSpace = ColorSpace.singletons.gray; - args = ColorSpace.singletons.gray.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillCMYKColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeCMYKColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk; - args = ColorSpace.singletons.cmyk.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - case OPS.setFillRGBColor: - stateManager.state.fillColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setStrokeRGBColor: - stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb; - args = ColorSpace.singletons.rgb.getRgb(args, 0); - break; - case OPS.setFillColorN: - cs = stateManager.state.fillColorSpace; - if (cs.name === 'Pattern') { - return self.handleColorN(operatorList, OPS.setFillColorN, - args, cs, patterns, resources, task, xref).then(function() { - next(resolve, reject); - }, reject); - } - args = cs.getRgb(args, 0); - fn = OPS.setFillRGBColor; - break; - case OPS.setStrokeColorN: - cs = stateManager.state.strokeColorSpace; - if (cs.name === 'Pattern') { - return self.handleColorN(operatorList, OPS.setStrokeColorN, - args, cs, patterns, resources, task, xref).then(function() { - next(resolve, reject); - }, reject); - } - args = cs.getRgb(args, 0); - fn = OPS.setStrokeRGBColor; - break; - - case OPS.shadingFill: - var shadingRes = resources.get('Shading'); - if (!shadingRes) { - error('No shading resource found'); - } - - var shading = shadingRes.get(args[0].name); - if (!shading) { - error('No shading object found'); - } - - var shadingFill = Pattern.parseShading(shading, null, xref, - resources, self.handler); - var patternIR = shadingFill.getIR(); - args = [patternIR]; - fn = OPS.shadingFill; - break; - case OPS.setGState: - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) { - break; - } - - var gState = extGState.get(dictName.name); - return self.setGState(resources, gState, operatorList, task, - xref, stateManager).then(function() { - next(resolve, reject); - }, reject); - case OPS.moveTo: - case OPS.lineTo: - case OPS.curveTo: - case OPS.curveTo2: - case OPS.curveTo3: - case OPS.closePath: - self.buildPath(operatorList, fn, args); - continue; - case OPS.rectangle: - self.buildPath(operatorList, fn, args); - continue; - case OPS.markPoint: - case OPS.markPointProps: - case OPS.beginMarkedContent: - case OPS.beginMarkedContentProps: - case OPS.endMarkedContent: - case OPS.beginCompat: - case OPS.endCompat: - // Ignore operators where the corresponding handlers are known to - // be no-op in CanvasGraphics (display/canvas.js). This prevents - // serialization errors and is also a bit more efficient. - // We could also try to serialize all objects in a general way, - // e.g. as done in https://github.com/mozilla/pdf.js/pull/6266, - // but doing so is meaningless without knowing the semantics. - continue; - default: - // Note: Let's hope that the ignored operator does not have any - // non-serializable arguments, otherwise postMessage will throw - // "An object could not be cloned.". - } - operatorList.addOp(fn, args); - } - if (stop) { - deferred.then(function () { - next(resolve, reject); - }, reject); - return; - } - // Some PDFs don't close all restores inside object/form. - // Closing those for them. - for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) { - operatorList.addOp(OPS.restore, []); - } - resolve(); - }); - }, - - getTextContent: - function PartialEvaluator_getTextContent(stream, task, resources, - stateManager, - normalizeWhitespace) { - - stateManager = (stateManager || new StateManager(new TextState())); - - var WhitespaceRegexp = /\s/g; - - var textContent = { - items: [], - styles: Object.create(null) - }; - var textContentItem = { - initialized: false, - str: [], - width: 0, - height: 0, - vertical: false, - lastAdvanceWidth: 0, - lastAdvanceHeight: 0, - textAdvanceScale: 0, - spaceWidth: 0, - fakeSpaceMin: Infinity, - fakeMultiSpaceMin: Infinity, - fakeMultiSpaceMax: -0, - textRunBreakAllowed: false, - transform: null, - fontName: null - }; - var SPACE_FACTOR = 0.3; - var MULTI_SPACE_FACTOR = 1.5; - var MULTI_SPACE_FACTOR_MAX = 4; - - var self = this; - var xref = this.xref; - - resources = (xref.fetchIfRef(resources) || Dict.empty); - - // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd. - var xobjs = null; - var xobjsCache = {}; - - var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager); - - var textState; - - function ensureTextContentItem() { - if (textContentItem.initialized) { - return textContentItem; - } - var font = textState.font; - if (!(font.loadedName in textContent.styles)) { - textContent.styles[font.loadedName] = { - fontFamily: font.fallbackName, - ascent: font.ascent, - descent: font.descent, - vertical: font.vertical - }; - } - textContentItem.fontName = font.loadedName; - - // 9.4.4 Text Space Details - var tsm = [textState.fontSize * textState.textHScale, 0, - 0, textState.fontSize, - 0, textState.textRise]; - - if (font.isType3Font && - textState.fontMatrix !== FONT_IDENTITY_MATRIX && - textState.fontSize === 1) { - var glyphHeight = font.bbox[3] - font.bbox[1]; - if (glyphHeight > 0) { - glyphHeight = glyphHeight * textState.fontMatrix[3]; - tsm[3] *= glyphHeight; - } - } - - var trm = Util.transform(textState.ctm, - Util.transform(textState.textMatrix, tsm)); - textContentItem.transform = trm; - if (!font.vertical) { - textContentItem.width = 0; - textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]); - textContentItem.vertical = false; - } else { - textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]); - textContentItem.height = 0; - textContentItem.vertical = true; - } - - var a = textState.textLineMatrix[0]; - var b = textState.textLineMatrix[1]; - var scaleLineX = Math.sqrt(a * a + b * b); - a = textState.ctm[0]; - b = textState.ctm[1]; - var scaleCtmX = Math.sqrt(a * a + b * b); - textContentItem.textAdvanceScale = scaleCtmX * scaleLineX; - textContentItem.lastAdvanceWidth = 0; - textContentItem.lastAdvanceHeight = 0; - - var spaceWidth = font.spaceWidth / 1000 * textState.fontSize; - if (spaceWidth) { - textContentItem.spaceWidth = spaceWidth; - textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR; - textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR; - textContentItem.fakeMultiSpaceMax = - spaceWidth * MULTI_SPACE_FACTOR_MAX; - // It's okay for monospace fonts to fake as much space as needed. - textContentItem.textRunBreakAllowed = !font.isMonospace; - } else { - textContentItem.spaceWidth = 0; - textContentItem.fakeSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMin = Infinity; - textContentItem.fakeMultiSpaceMax = 0; - textContentItem.textRunBreakAllowed = false; - } - - - textContentItem.initialized = true; - return textContentItem; - } - - function replaceWhitespace(str) { - // Replaces all whitespaces with standard spaces (0x20), to avoid - // alignment issues between the textLayer and the canvas if the text - // contains e.g. tabs (fixes issue6612.pdf). - var i = 0, ii = str.length, code; - while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) { - i++; - } - return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str); - } - - function runBidiTransform(textChunk) { - var str = textChunk.str.join(''); - var bidiResult = PDFJS.bidi(str, -1, textChunk.vertical); - return { - str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) : - bidiResult.str), - dir: bidiResult.dir, - width: textChunk.width, - height: textChunk.height, - transform: textChunk.transform, - fontName: textChunk.fontName - }; - } - - function handleSetFont(fontName, fontRef) { - return self.loadFont(fontName, fontRef, xref, resources). - then(function (translated) { - textState.font = translated.font; - textState.fontMatrix = translated.font.fontMatrix || - FONT_IDENTITY_MATRIX; - }); - } - - function buildTextContentItem(chars) { - var font = textState.font; - var textChunk = ensureTextContentItem(); - var width = 0; - var height = 0; - var glyphs = font.charsToGlyphs(chars); - var defaultVMetrics = font.defaultVMetrics; - for (var i = 0; i < glyphs.length; i++) { - var glyph = glyphs[i]; - var vMetricX = null; - var vMetricY = null; - var glyphWidth = null; - if (font.vertical) { - if (glyph.vmetric) { - glyphWidth = glyph.vmetric[0]; - vMetricX = glyph.vmetric[1]; - vMetricY = glyph.vmetric[2]; - } else { - glyphWidth = glyph.width; - vMetricX = glyph.width * 0.5; - vMetricY = defaultVMetrics[2]; - } - } else { - glyphWidth = glyph.width; - } - - var glyphUnicode = glyph.unicode; - if (NormalizedUnicodes[glyphUnicode] !== undefined) { - glyphUnicode = NormalizedUnicodes[glyphUnicode]; - } - glyphUnicode = reverseIfRtl(glyphUnicode); - - // The following will calculate the x and y of the individual glyphs. - // if (font.vertical) { - // tsm[4] -= vMetricX * Math.abs(textState.fontSize) * - // textState.fontMatrix[0]; - // tsm[5] -= vMetricY * textState.fontSize * - // textState.fontMatrix[0]; - // } - // var trm = Util.transform(textState.textMatrix, tsm); - // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm); - // var x = pt[0]; - // var y = pt[1]; - - var charSpacing = textState.charSpacing; - if (glyph.isSpace) { - var wordSpacing = textState.wordSpacing; - charSpacing += wordSpacing; - if (wordSpacing > 0) { - addFakeSpaces(wordSpacing, textChunk.str); - } - } - - var tx = 0; - var ty = 0; - if (!font.vertical) { - var w0 = glyphWidth * textState.fontMatrix[0]; - tx = (w0 * textState.fontSize + charSpacing) * - textState.textHScale; - width += tx; - } else { - var w1 = glyphWidth * textState.fontMatrix[0]; - ty = w1 * textState.fontSize + charSpacing; - height += ty; - } - textState.translateTextMatrix(tx, ty); - - textChunk.str.push(glyphUnicode); - } - - if (!font.vertical) { - textChunk.lastAdvanceWidth = width; - textChunk.width += width * textChunk.textAdvanceScale; - } else { - textChunk.lastAdvanceHeight = height; - textChunk.height += Math.abs(height * textChunk.textAdvanceScale); - } - - return textChunk; - } - - function addFakeSpaces(width, strBuf) { - if (width < textContentItem.fakeSpaceMin) { - return; - } - if (width < textContentItem.fakeMultiSpaceMin) { - strBuf.push(' '); - return; - } - var fakeSpaces = Math.round(width / textContentItem.spaceWidth); - while (fakeSpaces-- > 0) { - strBuf.push(' '); - } - } - - function flushTextContentItem() { - if (!textContentItem.initialized) { - return; - } - textContent.items.push(runBidiTransform(textContentItem)); - - textContentItem.initialized = false; - textContentItem.str.length = 0; - } - - var timeSlotManager = new TimeSlotManager(); - - return new Promise(function next(resolve, reject) { - task.ensureNotTerminated(); - timeSlotManager.reset(); - var stop, operation = {}, args = []; - while (!(stop = timeSlotManager.check())) { - // The arguments parsed by read() are not used beyond this loop, so - // we can reuse the same array on every iteration, thus avoiding - // unnecessary allocations. - args.length = 0; - operation.args = args; - if (!(preprocessor.read(operation))) { - break; - } - textState = stateManager.state; - var fn = operation.fn; - args = operation.args; - var advance; - - switch (fn | 0) { - case OPS.setFont: - flushTextContentItem(); - textState.fontSize = args[1]; - return handleSetFont(args[0].name).then(function() { - next(resolve, reject); - }, reject); - case OPS.setTextRise: - flushTextContentItem(); - textState.textRise = args[0]; - break; - case OPS.setHScale: - flushTextContentItem(); - textState.textHScale = args[0] / 100; - break; - case OPS.setLeading: - flushTextContentItem(); - textState.leading = args[0]; - break; - case OPS.moveText: - // Optimization to treat same line movement as advance - var isSameTextLine = !textState.font ? false : - ((textState.font.vertical ? args[0] : args[1]) === 0); - advance = args[0] - args[1]; - if (isSameTextLine && textContentItem.initialized && - advance > 0 && - advance <= textContentItem.fakeMultiSpaceMax) { - textState.translateTextLineMatrix(args[0], args[1]); - textContentItem.width += - (args[0] - textContentItem.lastAdvanceWidth); - textContentItem.height += - (args[1] - textContentItem.lastAdvanceHeight); - var diff = (args[0] - textContentItem.lastAdvanceWidth) - - (args[1] - textContentItem.lastAdvanceHeight); - addFakeSpaces(diff, textContentItem.str); - break; - } - - flushTextContentItem(); - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.setLeadingMoveText: - flushTextContentItem(); - textState.leading = -args[1]; - textState.translateTextLineMatrix(args[0], args[1]); - textState.textMatrix = textState.textLineMatrix.slice(); - break; - case OPS.nextLine: - flushTextContentItem(); - textState.carriageReturn(); - break; - case OPS.setTextMatrix: - flushTextContentItem(); - textState.setTextMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - textState.setTextLineMatrix(args[0], args[1], args[2], args[3], - args[4], args[5]); - break; - case OPS.setCharSpacing: - textState.charSpacing = args[0]; - break; - case OPS.setWordSpacing: - textState.wordSpacing = args[0]; - break; - case OPS.beginText: - flushTextContentItem(); - textState.textMatrix = IDENTITY_MATRIX.slice(); - textState.textLineMatrix = IDENTITY_MATRIX.slice(); - break; - case OPS.showSpacedText: - var items = args[0]; - var offset; - for (var j = 0, jj = items.length; j < jj; j++) { - if (typeof items[j] === 'string') { - buildTextContentItem(items[j]); - } else { - ensureTextContentItem(); - - // PDF Specification 5.3.2 states: - // The number is expressed in thousandths of a unit of text - // space. - // This amount is subtracted from the current horizontal or - // vertical coordinate, depending on the writing mode. - // In the default coordinate system, a positive adjustment - // has the effect of moving the next glyph painted either to - // the left or down by the given amount. - advance = items[j] * textState.fontSize / 1000; - var breakTextRun = false; - if (textState.font.vertical) { - offset = advance * - (textState.textHScale * textState.textMatrix[2] + - textState.textMatrix[3]); - textState.translateTextMatrix(0, advance); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be added to height to paint down. - textContentItem.height += offset; - } - } else { - advance = -advance; - offset = advance * ( - textState.textHScale * textState.textMatrix[0] + - textState.textMatrix[1]); - textState.translateTextMatrix(advance, 0); - breakTextRun = textContentItem.textRunBreakAllowed && - advance > textContentItem.fakeMultiSpaceMax; - if (!breakTextRun) { - // Value needs to be subtracted from width to paint left. - textContentItem.width += offset; - } - } - if (breakTextRun) { - flushTextContentItem(); - } else if (advance > 0) { - addFakeSpaces(advance, textContentItem.str); - } - } - } - break; - case OPS.showText: - buildTextContentItem(args[0]); - break; - case OPS.nextLineShowText: - flushTextContentItem(); - textState.carriageReturn(); - buildTextContentItem(args[0]); - break; - case OPS.nextLineSetSpacingShowText: - flushTextContentItem(); - textState.wordSpacing = args[0]; - textState.charSpacing = args[1]; - textState.carriageReturn(); - buildTextContentItem(args[2]); - break; - case OPS.paintXObject: - flushTextContentItem(); - if (args[0].code) { - break; - } - - if (!xobjs) { - xobjs = (resources.get('XObject') || Dict.empty); - } - - var name = args[0].name; - if (xobjsCache.key === name) { - if (xobjsCache.texts) { - Util.appendToArray(textContent.items, xobjsCache.texts.items); - Util.extendObj(textContent.styles, xobjsCache.texts.styles); - } - break; - } - - var xobj = xobjs.get(name); - if (!xobj) { - break; - } - assert(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assert(isName(type), - 'XObject should have a Name subtype'); - - if ('Form' !== type.name) { - xobjsCache.key = name; - xobjsCache.texts = null; - break; - } - - stateManager.save(); - var matrix = xobj.dict.get('Matrix'); - if (isArray(matrix) && matrix.length === 6) { - stateManager.transform(matrix); - } - - return self.getTextContent(xobj, task, - xobj.dict.get('Resources') || resources, stateManager, - normalizeWhitespace).then(function (formTextContent) { - Util.appendToArray(textContent.items, formTextContent.items); - Util.extendObj(textContent.styles, formTextContent.styles); - stateManager.restore(); - - xobjsCache.key = name; - xobjsCache.texts = formTextContent; - - next(resolve, reject); - }, reject); - case OPS.setGState: - flushTextContentItem(); - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) { - break; - } - - var gsStateMap = extGState.get(dictName.name); - var gsStateFont = null; - for (var key in gsStateMap) { - if (key === 'Font') { - assert(!gsStateFont); - gsStateFont = gsStateMap[key]; - } - } - if (gsStateFont) { - textState.fontSize = gsStateFont[1]; - return handleSetFont(gsStateFont[0]).then(function() { - next(resolve, reject); - }, reject); - } - break; - } // switch - } // while - if (stop) { - deferred.then(function () { - next(resolve, reject); - }, reject); - return; - } - flushTextContentItem(); - resolve(textContent); - }); - }, - - extractDataStructures: function - partialEvaluatorExtractDataStructures(dict, baseDict, - xref, properties) { - // 9.10.2 - var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode')); - if (toUnicode) { - properties.toUnicode = this.readToUnicode(toUnicode); - } - if (properties.composite) { - // CIDSystemInfo helps to match CID to glyphs - var cidSystemInfo = dict.get('CIDSystemInfo'); - if (isDict(cidSystemInfo)) { - properties.cidSystemInfo = { - registry: cidSystemInfo.get('Registry'), - ordering: cidSystemInfo.get('Ordering'), - supplement: cidSystemInfo.get('Supplement') - }; - } - - var cidToGidMap = dict.get('CIDToGIDMap'); - if (isStream(cidToGidMap)) { - properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); - } - } - - // Based on 9.6.6 of the spec the encoding can come from multiple places - // and depends on the font type. The base encoding and differences are - // read here, but the encoding that is actually used is chosen during - // glyph mapping in the font. - // TODO: Loading the built in encoding in the font would allow the - // differences to be merged in here not require us to hold on to it. - var differences = []; - var baseEncodingName = null; - var encoding; - if (dict.has('Encoding')) { - encoding = dict.get('Encoding'); - if (isDict(encoding)) { - baseEncodingName = encoding.get('BaseEncoding'); - baseEncodingName = (isName(baseEncodingName) ? - baseEncodingName.name : null); - // Load the differences between the base and original - if (encoding.has('Differences')) { - var diffEncoding = encoding.get('Differences'); - var index = 0; - for (var j = 0, jj = diffEncoding.length; j < jj; j++) { - var data = diffEncoding[j]; - if (isNum(data)) { - index = data; - } else if (isName(data)) { - differences[index++] = data.name; - } else if (isRef(data)) { - diffEncoding[j--] = xref.fetch(data); - continue; - } else { - error('Invalid entry in \'Differences\' array: ' + data); - } - } - } - } else if (isName(encoding)) { - baseEncodingName = encoding.name; - } else { - error('Encoding is not a Name nor a Dict'); - } - // According to table 114 if the encoding is a named encoding it must be - // one of these predefined encodings. - if ((baseEncodingName !== 'MacRomanEncoding' && - baseEncodingName !== 'MacExpertEncoding' && - baseEncodingName !== 'WinAnsiEncoding')) { - baseEncodingName = null; - } - } - - if (baseEncodingName) { - properties.defaultEncoding = Encodings[baseEncodingName].slice(); - } else { - encoding = (properties.type === 'TrueType' ? - Encodings.WinAnsiEncoding : Encodings.StandardEncoding); - // The Symbolic attribute can be misused for regular fonts - // Heuristic: we have to check if the font is a standard one also - if (!!(properties.flags & FontFlags.Symbolic)) { - encoding = Encodings.MacRomanEncoding; - if (!properties.file) { - if (/Symbol/i.test(properties.name)) { - encoding = Encodings.SymbolSetEncoding; - } else if (/Dingbats/i.test(properties.name)) { - encoding = Encodings.ZapfDingbatsEncoding; - } - } - } - properties.defaultEncoding = encoding; - } - - properties.differences = differences; - properties.baseEncodingName = baseEncodingName; - properties.dict = dict; - }, - - readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) { - var cmap, cmapObj = toUnicode; - if (isName(cmapObj)) { - cmap = CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - return new ToUnicodeMap(cmap.getMap()); - } else if (isStream(cmapObj)) { - cmap = CMapFactory.create(cmapObj, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - if (cmap instanceof IdentityCMap) { - return new IdentityToUnicodeMap(0, 0xFFFF); - } - var map = new Array(cmap.length); - // Convert UTF-16BE - // NOTE: cmap can be a sparse array, so use forEach instead of for(;;) - // to iterate over all keys. - cmap.forEach(function(charCode, token) { - var str = []; - for (var k = 0; k < token.length; k += 2) { - var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF - str.push(w1); - continue; - } - k += 2; - var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1); - str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000); - } - map[charCode] = String.fromCharCode.apply(String, str); - }); - return new ToUnicodeMap(map); - } - return null; - }, - - readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { - // Extract the encoding from the CIDToGIDMap - var glyphsData = cidToGidStream.getBytes(); - - // Set encoding 0 to later verify the font has an encoding - var result = []; - for (var j = 0, jj = glyphsData.length; j < jj; j++) { - var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; - if (glyphID === 0) { - continue; - } - var code = j >> 1; - result[code] = glyphID; - } - return result; - }, - - extractWidths: function PartialEvaluator_extractWidths(dict, xref, - descriptor, - properties) { - var glyphsWidths = []; - var defaultWidth = 0; - var glyphsVMetrics = []; - var defaultVMetrics; - var i, ii, j, jj, start, code, widths; - if (properties.composite) { - defaultWidth = dict.get('DW') || 1000; - - widths = dict.get('W'); - if (widths) { - for (i = 0, ii = widths.length; i < ii; i++) { - start = widths[i++]; - code = xref.fetchIfRef(widths[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsWidths[start++] = code[j]; - } - } else { - var width = widths[++i]; - for (j = start; j <= code; j++) { - glyphsWidths[j] = width; - } - } - } - } - - if (properties.vertical) { - var vmetrics = (dict.get('DW2') || [880, -1000]); - defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]]; - vmetrics = dict.get('W2'); - if (vmetrics) { - for (i = 0, ii = vmetrics.length; i < ii; i++) { - start = vmetrics[i++]; - code = xref.fetchIfRef(vmetrics[i]); - if (isArray(code)) { - for (j = 0, jj = code.length; j < jj; j++) { - glyphsVMetrics[start++] = [code[j++], code[j++], code[j]]; - } - } else { - var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]]; - for (j = start; j <= code; j++) { - glyphsVMetrics[j] = vmetric; - } - } - } - } - } - } else { - var firstChar = properties.firstChar; - widths = dict.get('Widths'); - if (widths) { - j = firstChar; - for (i = 0, ii = widths.length; i < ii; i++) { - glyphsWidths[j++] = widths[i]; - } - defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0); - } else { - // Trying get the BaseFont metrics (see comment above). - var baseFontName = dict.get('BaseFont'); - if (isName(baseFontName)) { - var metrics = this.getBaseFontMetrics(baseFontName.name); - - glyphsWidths = this.buildCharCodeToWidth(metrics.widths, - properties); - defaultWidth = metrics.defaultWidth; - } - } - } - - // Heuristic: detection of monospace font by checking all non-zero widths - var isMonospace = true; - var firstWidth = defaultWidth; - for (var glyph in glyphsWidths) { - var glyphWidth = glyphsWidths[glyph]; - if (!glyphWidth) { - continue; - } - if (!firstWidth) { - firstWidth = glyphWidth; - continue; - } - if (firstWidth !== glyphWidth) { - isMonospace = false; - break; - } - } - if (isMonospace) { - properties.flags |= FontFlags.FixedPitch; - } - - properties.defaultWidth = defaultWidth; - properties.widths = glyphsWidths; - properties.defaultVMetrics = defaultVMetrics; - properties.vmetrics = glyphsVMetrics; - }, - - isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) { - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - return (fontNameWoStyle in serifFonts) || - (fontNameWoStyle.search(/serif/gi) !== -1); - }, - - getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { - var defaultWidth = 0; - var widths = []; - var monospace = false; - var lookupName = (stdFontMap[name] || name); - - if (!(lookupName in Metrics)) { - // Use default fonts for looking up font metrics if the passed - // font is not a base font - if (this.isSerifFont(name)) { - lookupName = 'Times-Roman'; - } else { - lookupName = 'Helvetica'; - } - } - var glyphWidths = Metrics[lookupName]; - - if (isNum(glyphWidths)) { - defaultWidth = glyphWidths; - monospace = true; - } else { - widths = glyphWidths; - } - - return { - defaultWidth: defaultWidth, - monospace: monospace, - widths: widths - }; - }, - - buildCharCodeToWidth: - function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, - properties) { - var widths = Object.create(null); - var differences = properties.differences; - var encoding = properties.defaultEncoding; - for (var charCode = 0; charCode < 256; charCode++) { - if (charCode in differences && - widthsByGlyphName[differences[charCode]]) { - widths[charCode] = widthsByGlyphName[differences[charCode]]; - continue; - } - if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) { - widths[charCode] = widthsByGlyphName[encoding[charCode]]; - continue; - } - } - return widths; - }, - - preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) { - var baseDict = dict; - var type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - - var composite = false; - var uint8array; - if (type.name === 'Type0') { - // If font is a composite - // - get the descendant font - // - set the type according to the descendant font - // - get the FontDescriptor from the descendant font - var df = dict.get('DescendantFonts'); - if (!df) { - error('Descendant fonts are not specified'); - } - dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df); - - type = dict.get('Subtype'); - assert(isName(type), 'invalid font Subtype'); - composite = true; - } - - var descriptor = dict.get('FontDescriptor'); - if (descriptor) { - var hash = new MurmurHash3_64(); - var encoding = baseDict.getRaw('Encoding'); - if (isName(encoding)) { - hash.update(encoding.name); - } else if (isRef(encoding)) { - hash.update(encoding.num + '_' + encoding.gen); - } else if (isDict(encoding)) { - var keys = encoding.getKeys(); - for (var i = 0, ii = keys.length; i < ii; i++) { - var entry = encoding.getRaw(keys[i]); - if (isName(entry)) { - hash.update(entry.name); - } else if (isRef(entry)) { - hash.update(entry.num + '_' + entry.gen); - } else if (isArray(entry)) { // 'Differences' entry. - // Ideally we should check the contents of the array, but to avoid - // parsing it here and then again in |extractDataStructures|, - // we only use the array length for now (fixes bug1157493.pdf). - hash.update(entry.length.toString()); - } - } - } - - var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode'); - if (isStream(toUnicode)) { - var stream = toUnicode.str || toUnicode; - uint8array = stream.buffer ? - new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : - new Uint8Array(stream.bytes.buffer, - stream.start, stream.end - stream.start); - hash.update(uint8array); - - } else if (isName(toUnicode)) { - hash.update(toUnicode.name); - } - - var widths = dict.get('Widths') || baseDict.get('Widths'); - if (widths) { - uint8array = new Uint8Array(new Uint32Array(widths).buffer); - hash.update(uint8array); - } - } - - return { - descriptor: descriptor, - dict: dict, - baseDict: baseDict, - composite: composite, - type: type.name, - hash: hash ? hash.hexdigest() : '' - }; - }, - - translateFont: function PartialEvaluator_translateFont(preEvaluatedFont, - xref) { - var baseDict = preEvaluatedFont.baseDict; - var dict = preEvaluatedFont.dict; - var composite = preEvaluatedFont.composite; - var descriptor = preEvaluatedFont.descriptor; - var type = preEvaluatedFont.type; - var maxCharIndex = (composite ? 0xFFFF : 0xFF); - var properties; - - if (!descriptor) { - if (type === 'Type3') { - // FontDescriptor is only required for Type3 fonts when the document - // is a tagged pdf. Create a barbebones one to get by. - descriptor = new Dict(null); - descriptor.set('FontName', Name.get(type)); - descriptor.set('FontBBox', dict.get('FontBBox')); - } else { - // Before PDF 1.5 if the font was one of the base 14 fonts, having a - // FontDescriptor was not required. - // This case is here for compatibility. - var baseFontName = dict.get('BaseFont'); - if (!isName(baseFontName)) { - error('Base font is not specified'); - } - - // Using base font name as a font name. - baseFontName = baseFontName.name.replace(/[,_]/g, '-'); - var metrics = this.getBaseFontMetrics(baseFontName); - - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - var flags = - (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) | - (metrics.monospace ? FontFlags.FixedPitch : 0) | - (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic : - FontFlags.Nonsymbolic); - - properties = { - type: type, - name: baseFontName, - widths: metrics.widths, - defaultWidth: metrics.defaultWidth, - flags: flags, - firstChar: 0, - lastChar: maxCharIndex - }; - this.extractDataStructures(dict, dict, xref, properties); - properties.widths = this.buildCharCodeToWidth(metrics.widths, - properties); - return new Font(baseFontName, null, properties); - } - } - - // According to the spec if 'FontDescriptor' is declared, 'FirstChar', - // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem - // to ignore this rule when a variant of a standart font is used. - // TODO Fill the width array depending on which of the base font this is - // a variant. - var firstChar = (dict.get('FirstChar') || 0); - var lastChar = (dict.get('LastChar') || maxCharIndex); - - var fontName = descriptor.get('FontName'); - var baseFont = dict.get('BaseFont'); - // Some bad PDFs have a string as the font name. - if (isString(fontName)) { - fontName = Name.get(fontName); - } - if (isString(baseFont)) { - baseFont = Name.get(baseFont); - } - - if (type !== 'Type3') { - var fontNameStr = fontName && fontName.name; - var baseFontStr = baseFont && baseFont.name; - if (fontNameStr !== baseFontStr) { - info('The FontDescriptor\'s FontName is "' + fontNameStr + - '" but should be the same as the Font\'s BaseFont "' + - baseFontStr + '"'); - // Workaround for cases where e.g. fontNameStr = 'Arial' and - // baseFontStr = 'Arial,Bold' (needed when no font file is embedded). - if (fontNameStr && baseFontStr && - baseFontStr.indexOf(fontNameStr) === 0) { - fontName = baseFont; - } - } - } - fontName = (fontName || baseFont); - - assert(isName(fontName), 'invalid font name'); - - var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3'); - if (fontFile) { - if (fontFile.dict) { - var subtype = fontFile.dict.get('Subtype'); - if (subtype) { - subtype = subtype.name; - } - var length1 = fontFile.dict.get('Length1'); - var length2 = fontFile.dict.get('Length2'); - } - } - - properties = { - type: type, - name: fontName.name, - subtype: subtype, - file: fontFile, - length1: length1, - length2: length2, - loadedName: baseDict.loadedName, - composite: composite, - wideChars: composite, - fixedPitch: false, - fontMatrix: (dict.get('FontMatrix') || FONT_IDENTITY_MATRIX), - firstChar: firstChar || 0, - lastChar: (lastChar || maxCharIndex), - bbox: descriptor.get('FontBBox'), - ascent: descriptor.get('Ascent'), - descent: descriptor.get('Descent'), - xHeight: descriptor.get('XHeight'), - capHeight: descriptor.get('CapHeight'), - flags: descriptor.get('Flags'), - italicAngle: descriptor.get('ItalicAngle'), - coded: false - }; - - if (composite) { - var cidEncoding = baseDict.get('Encoding'); - if (isName(cidEncoding)) { - properties.cidEncoding = cidEncoding.name; - } - properties.cMap = CMapFactory.create(cidEncoding, - { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null); - properties.vertical = properties.cMap.vertical; - } - this.extractDataStructures(dict, baseDict, xref, properties); - this.extractWidths(dict, xref, descriptor, properties); - - if (type === 'Type3') { - properties.isType3Font = true; - } - - return new Font(fontName.name, fontFile, properties); - } - }; - - return PartialEvaluator; -})(); - -var TranslatedFont = (function TranslatedFontClosure() { - function TranslatedFont(loadedName, font, dict) { - this.loadedName = loadedName; - this.font = font; - this.dict = dict; - this.type3Loaded = null; - this.sent = false; - } - TranslatedFont.prototype = { - send: function (handler) { - if (this.sent) { - return; - } - var fontData = this.font.exportData(); - handler.send('commonobj', [ - this.loadedName, - 'Font', - fontData - ]); - this.sent = true; - }, - loadType3Data: function (evaluator, resources, parentOperatorList, task) { - assert(this.font.isType3Font); - - if (this.type3Loaded) { - return this.type3Loaded; - } - - var translatedFont = this.font; - var loadCharProcsPromise = Promise.resolve(); - var charProcs = this.dict.get('CharProcs').getAll(); - var fontResources = this.dict.get('Resources') || resources; - var charProcKeys = Object.keys(charProcs); - var charProcOperatorList = {}; - for (var i = 0, n = charProcKeys.length; i < n; ++i) { - loadCharProcsPromise = loadCharProcsPromise.then(function (key) { - var glyphStream = charProcs[key]; - var operatorList = new OperatorList(); - return evaluator.getOperatorList(glyphStream, task, fontResources, - operatorList).then(function () { - charProcOperatorList[key] = operatorList.getIR(); - - // Add the dependencies to the parent operator list so they are - // resolved before sub operator list is executed synchronously. - parentOperatorList.addDependencies(operatorList.dependencies); - }, function (reason) { - warn('Type3 font resource \"' + key + '\" is not available'); - var operatorList = new OperatorList(); - charProcOperatorList[key] = operatorList.getIR(); - }); - }.bind(this, charProcKeys[i])); - } - this.type3Loaded = loadCharProcsPromise.then(function () { - translatedFont.charProcOperatorList = charProcOperatorList; - }); - return this.type3Loaded; - } - }; - return TranslatedFont; -})(); - -var OperatorList = (function OperatorListClosure() { - var CHUNK_SIZE = 1000; - var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size - - function getTransfers(queue) { - var transfers = []; - var fnArray = queue.fnArray, argsArray = queue.argsArray; - for (var i = 0, ii = queue.length; i < ii; i++) { - switch (fnArray[i]) { - case OPS.paintInlineImageXObject: - case OPS.paintInlineImageXObjectGroup: - case OPS.paintImageMaskXObject: - var arg = argsArray[i][0]; // first param in imgData - if (!arg.cached) { - transfers.push(arg.data.buffer); - } - break; - } - } - return transfers; - } - - function OperatorList(intent, messageHandler, pageIndex) { - this.messageHandler = messageHandler; - this.fnArray = []; - this.argsArray = []; - this.dependencies = {}; - this._totalLength = 0; - this.pageIndex = pageIndex; - this.intent = intent; - } - - OperatorList.prototype = { - get length() { - return this.argsArray.length; - }, - - /** - * @returns {number} The total length of the entire operator list, - * since `this.length === 0` after flushing. - */ - get totalLength() { - return (this._totalLength + this.length); - }, - - addOp: function(fn, args) { - this.fnArray.push(fn); - this.argsArray.push(args); - if (this.messageHandler) { - if (this.fnArray.length >= CHUNK_SIZE) { - this.flush(); - } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT && - (fn === OPS.restore || fn === OPS.endText)) { - // heuristic to flush on boundary of restore or endText - this.flush(); - } - } - }, - - addDependency: function(dependency) { - if (dependency in this.dependencies) { - return; - } - this.dependencies[dependency] = true; - this.addOp(OPS.dependency, [dependency]); - }, - - addDependencies: function(dependencies) { - for (var key in dependencies) { - this.addDependency(key); - } - }, - - addOpList: function(opList) { - Util.extendObj(this.dependencies, opList.dependencies); - for (var i = 0, ii = opList.length; i < ii; i++) { - this.addOp(opList.fnArray[i], opList.argsArray[i]); - } - }, - - getIR: function() { - return { - fnArray: this.fnArray, - argsArray: this.argsArray, - length: this.length - }; - }, - - flush: function(lastChunk) { - if (this.intent !== 'oplist') { - new QueueOptimizer().optimize(this); - } - var transfers = getTransfers(this); - var length = this.length; - this._totalLength += length; - - this.messageHandler.send('RenderPageChunk', { - operatorList: { - fnArray: this.fnArray, - argsArray: this.argsArray, - lastChunk: lastChunk, - length: length - }, - pageIndex: this.pageIndex, - intent: this.intent - }, transfers); - this.dependencies = {}; - this.fnArray.length = 0; - this.argsArray.length = 0; - } - }; - - return OperatorList; -})(); - -var StateManager = (function StateManagerClosure() { - function StateManager(initialState) { - this.state = initialState; - this.stateStack = []; - } - StateManager.prototype = { - save: function () { - var old = this.state; - this.stateStack.push(this.state); - this.state = old.clone(); - }, - restore: function () { - var prev = this.stateStack.pop(); - if (prev) { - this.state = prev; - } - }, - transform: function (args) { - this.state.ctm = Util.transform(this.state.ctm, args); - } - }; - return StateManager; -})(); - -var TextState = (function TextStateClosure() { - function TextState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.fontSize = 0; - this.font = null; - this.fontMatrix = FONT_IDENTITY_MATRIX; - this.textMatrix = IDENTITY_MATRIX.slice(); - this.textLineMatrix = IDENTITY_MATRIX.slice(); - this.charSpacing = 0; - this.wordSpacing = 0; - this.leading = 0; - this.textHScale = 1; - this.textRise = 0; - } - - TextState.prototype = { - setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) { - var m = this.textLineMatrix; - m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f; - }, - translateTextMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - translateTextLineMatrix: function TextState_translateTextMatrix(x, y) { - var m = this.textLineMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - }, - calcRenderMatrix: function TextState_calcRendeMatrix(ctm) { - // 9.4.4 Text Space Details - var tsm = [this.fontSize * this.textHScale, 0, - 0, this.fontSize, - 0, this.textRise]; - return Util.transform(ctm, Util.transform(this.textMatrix, tsm)); - }, - carriageReturn: function TextState_carriageReturn() { - this.translateTextLineMatrix(0, -this.leading); - this.textMatrix = this.textLineMatrix.slice(); - }, - clone: function TextState_clone() { - var clone = Object.create(this); - clone.textMatrix = this.textMatrix.slice(); - clone.textLineMatrix = this.textLineMatrix.slice(); - clone.fontMatrix = this.fontMatrix.slice(); - return clone; - } - }; - return TextState; -})(); - -var EvalState = (function EvalStateClosure() { - function EvalState() { - this.ctm = new Float32Array(IDENTITY_MATRIX); - this.font = null; - this.textRenderingMode = TextRenderingMode.FILL; - this.fillColorSpace = ColorSpace.singletons.gray; - this.strokeColorSpace = ColorSpace.singletons.gray; - } - EvalState.prototype = { - clone: function CanvasExtraState_clone() { - return Object.create(this); - }, - }; - return EvalState; -})(); - -var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { - // Specifies properties for each command - // - // If variableArgs === true: [0, `numArgs`] expected - // If variableArgs === false: exactly `numArgs` expected - var OP_MAP = { - // Graphic state - w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false }, - J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false }, - j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false }, - M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false }, - d: { id: OPS.setDash, numArgs: 2, variableArgs: false }, - ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false }, - i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false }, - gs: { id: OPS.setGState, numArgs: 1, variableArgs: false }, - q: { id: OPS.save, numArgs: 0, variableArgs: false }, - Q: { id: OPS.restore, numArgs: 0, variableArgs: false }, - cm: { id: OPS.transform, numArgs: 6, variableArgs: false }, - - // Path - m: { id: OPS.moveTo, numArgs: 2, variableArgs: false }, - l: { id: OPS.lineTo, numArgs: 2, variableArgs: false }, - c: { id: OPS.curveTo, numArgs: 6, variableArgs: false }, - v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false }, - y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false }, - h: { id: OPS.closePath, numArgs: 0, variableArgs: false }, - re: { id: OPS.rectangle, numArgs: 4, variableArgs: false }, - S: { id: OPS.stroke, numArgs: 0, variableArgs: false }, - s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false }, - f: { id: OPS.fill, numArgs: 0, variableArgs: false }, - F: { id: OPS.fill, numArgs: 0, variableArgs: false }, - 'f*': { id: OPS.eoFill, numArgs: 0, variableArgs: false }, - B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false }, - 'B*': { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false }, - b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false }, - 'b*': { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false }, - n: { id: OPS.endPath, numArgs: 0, variableArgs: false }, - - // Clipping - W: { id: OPS.clip, numArgs: 0, variableArgs: false }, - 'W*': { id: OPS.eoClip, numArgs: 0, variableArgs: false }, - - // Text - BT: { id: OPS.beginText, numArgs: 0, variableArgs: false }, - ET: { id: OPS.endText, numArgs: 0, variableArgs: false }, - Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false }, - Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false }, - Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false }, - TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false }, - Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false }, - Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false }, - Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false }, - Td: { id: OPS.moveText, numArgs: 2, variableArgs: false }, - TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false }, - Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false }, - 'T*': { id: OPS.nextLine, numArgs: 0, variableArgs: false }, - Tj: { id: OPS.showText, numArgs: 1, variableArgs: false }, - TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false }, - '\'': { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false }, - '"': { id: OPS.nextLineSetSpacingShowText, numArgs: 3, - variableArgs: false }, - - // Type3 fonts - d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false }, - d1: { id: OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: false }, - - // Color - CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false }, - cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false }, - SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true }, - SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true }, - sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true }, - scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true }, - G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false }, - g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false }, - RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false }, - rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false }, - K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false }, - k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false }, - - // Shading - sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false }, - - // Images - BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false }, - ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false }, - EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false }, - - // XObjects - Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false }, - MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false }, - DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false }, - BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false }, - BDC: { id: OPS.beginMarkedContentProps, numArgs: 2, - variableArgs: false }, - EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false }, - - // Compatibility - BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false }, - EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false }, - - // (reserved partial commands for the lexer) - BM: null, - BD: null, - 'true': null, - fa: null, - fal: null, - fals: null, - 'false': null, - nu: null, - nul: null, - 'null': null - }; - - function EvaluatorPreprocessor(stream, xref, stateManager) { - // TODO(mduan): pass array of knownCommands rather than OP_MAP - // dictionary - this.parser = new Parser(new Lexer(stream, OP_MAP), false, xref); - this.stateManager = stateManager; - this.nonProcessedArgs = []; - } - - EvaluatorPreprocessor.prototype = { - get savedStatesDepth() { - return this.stateManager.stateStack.length; - }, - - // |operation| is an object with two fields: - // - // - |fn| is an out param. - // - // - |args| is an inout param. On entry, it should have one of two values. - // - // - An empty array. This indicates that the caller is providing the - // array in which the args will be stored in. The caller should use - // this value if it can reuse a single array for each call to read(). - // - // - |null|. This indicates that the caller needs this function to create - // the array in which any args are stored in. If there are zero args, - // this function will leave |operation.args| as |null| (thus avoiding - // allocations that would occur if we used an empty array to represent - // zero arguments). Otherwise, it will replace |null| with a new array - // containing the arguments. The caller should use this value if it - // cannot reuse an array for each call to read(). - // - // These two modes are present because this function is very hot and so - // avoiding allocations where possible is worthwhile. - // - read: function EvaluatorPreprocessor_read(operation) { - var args = operation.args; - while (true) { - var obj = this.parser.getObj(); - if (isCmd(obj)) { - var cmd = obj.cmd; - // Check that the command is valid - var opSpec = OP_MAP[cmd]; - if (!opSpec) { - warn('Unknown command "' + cmd + '"'); - continue; - } - - var fn = opSpec.id; - var numArgs = opSpec.numArgs; - var argsLength = args !== null ? args.length : 0; - - if (!opSpec.variableArgs) { - // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf - if (argsLength !== numArgs) { - var nonProcessedArgs = this.nonProcessedArgs; - while (argsLength > numArgs) { - nonProcessedArgs.push(args.shift()); - argsLength--; - } - while (argsLength < numArgs && nonProcessedArgs.length !== 0) { - if (!args) { - args = []; - } - args.unshift(nonProcessedArgs.pop()); - argsLength++; - } - } - - if (argsLength < numArgs) { - // If we receive too few args, it's not possible to possible - // to execute the command, so skip the command - info('Command ' + fn + ': because expected ' + - numArgs + ' args, but received ' + argsLength + - ' args; skipping'); - args = null; - continue; - } - } else if (argsLength > numArgs) { - info('Command ' + fn + ': expected [0,' + numArgs + - '] args, but received ' + argsLength + ' args'); - } - - // TODO figure out how to type-check vararg functions - this.preprocessCommand(fn, args); - - operation.fn = fn; - operation.args = args; - return true; - } else { - if (isEOF(obj)) { - return false; // no more commands - } - // argument - if (obj !== null) { - if (!args) { - args = []; - } - args.push((obj instanceof Dict ? obj.getAll() : obj)); - assert(args.length <= 33, 'Too many arguments'); - } - } - } - }, - - preprocessCommand: - function EvaluatorPreprocessor_preprocessCommand(fn, args) { - switch (fn | 0) { - case OPS.save: - this.stateManager.save(); - break; - case OPS.restore: - this.stateManager.restore(); - break; - case OPS.transform: - this.stateManager.transform(args); - break; - } - } - }; - return EvaluatorPreprocessor; -})(); - -var QueueOptimizer = (function QueueOptimizerClosure() { - function addState(parentState, pattern, fn) { - var state = parentState; - for (var i = 0, ii = pattern.length - 1; i < ii; i++) { - var item = pattern[i]; - state = (state[item] || (state[item] = [])); - } - state[pattern[pattern.length - 1]] = fn; - } - - function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray) { - // Handles special case of mainly LaTeX documents which use image masks to - // draw lines with the current fill style. - // 'count' groups of (save, transform, paintImageMaskXObject, restore)+ - // have been found at iFirstSave. - var iFirstPIMXO = iFirstSave + 2; - for (var i = 0; i < count; i++) { - var arg = argsArray[iFirstPIMXO + 4 * i]; - var imageMask = arg.length === 1 && arg[0]; - if (imageMask && imageMask.width === 1 && imageMask.height === 1 && - (!imageMask.data.length || - (imageMask.data.length === 1 && imageMask.data[0] === 0))) { - fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask; - continue; - } - break; - } - return count - i; - } - - var InitialState = []; - - // This replaces (save, transform, paintInlineImageXObject, restore)+ - // sequences with one |paintInlineImageXObjectGroup| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore], - function foundInlineImageGroup(context) { - var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10; - var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200; - var MAX_WIDTH = 1000; - var IMAGE_PADDING = 1; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIIXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintInlineImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, - MAX_IMAGES_IN_INLINE_IMAGES_BLOCK); - if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) { - return i; - } - - // assuming that heights of those image is too small (~1 pixel) - // packing as much as possible by lines - var maxX = 0; - var map = [], maxLineHeight = 0; - var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING; - var q; - for (q = 0; q < count; q++) { - var transform = argsArray[iFirstTransform + (q << 2)]; - var img = argsArray[iFirstPIIXO + (q << 2)][0]; - if (currentX + img.width > MAX_WIDTH) { - // starting new line - maxX = Math.max(maxX, currentX); - currentY += maxLineHeight + 2 * IMAGE_PADDING; - currentX = 0; - maxLineHeight = 0; - } - map.push({ - transform: transform, - x: currentX, y: currentY, - w: img.width, h: img.height - }); - currentX += img.width + 2 * IMAGE_PADDING; - maxLineHeight = Math.max(maxLineHeight, img.height); - } - var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING; - var imgHeight = currentY + maxLineHeight + IMAGE_PADDING; - var imgData = new Uint8Array(imgWidth * imgHeight * 4); - var imgRowSize = imgWidth << 2; - for (q = 0; q < count; q++) { - var data = argsArray[iFirstPIIXO + (q << 2)][0].data; - // Copy image by lines and extends pixels into padding. - var rowSize = map[q].w << 2; - var dataOffset = 0; - var offset = (map[q].x + map[q].y * imgWidth) << 2; - imgData.set(data.subarray(0, rowSize), offset - imgRowSize); - for (var k = 0, kk = map[q].h; k < kk; k++) { - imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset); - dataOffset += rowSize; - offset += imgRowSize; - } - imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset); - while (offset >= 0) { - data[offset - 4] = data[offset]; - data[offset - 3] = data[offset + 1]; - data[offset - 2] = data[offset + 2]; - data[offset - 1] = data[offset + 3]; - data[offset + rowSize] = data[offset + rowSize - 4]; - data[offset + rowSize + 1] = data[offset + rowSize - 3]; - data[offset + rowSize + 2] = data[offset + rowSize - 2]; - data[offset + rowSize + 3] = data[offset + rowSize - 1]; - offset -= imgRowSize; - } - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup); - argsArray.splice(iFirstSave, count * 4, - [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP, - data: imgData }, map]); - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageMaskXObject, restore)+ - // sequences with one |paintImageMaskXObjectGroup| or one - // |paintImageMaskXObjectRepeat| operation. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore], - function foundImageMaskGroup(context) { - var MIN_IMAGES_IN_MASKS_BLOCK = 10; - var MAX_IMAGES_IN_MASKS_BLOCK = 100; - var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIMXO = curr - 1; - - // Look for the quartets. - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageMaskXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = (i - iFirstSave) / 4; - count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, - argsArray); - if (count < MIN_IMAGES_IN_MASKS_BLOCK) { - return i; - } - - var q; - var isSameImage = false; - var iTransform, transformArgs; - var firstPIMXOArg0 = argsArray[iFirstPIMXO][0]; - if (argsArray[iFirstTransform][1] === 0 && - argsArray[iFirstTransform][2] === 0) { - isSameImage = true; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - iTransform = iFirstTransform + 4; - var iPIMXO = iFirstPIMXO + 4; - for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) { - transformArgs = argsArray[iTransform]; - if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || - transformArgs[0] !== firstTransformArg0 || - transformArgs[1] !== 0 || - transformArgs[2] !== 0 || - transformArgs[3] !== firstTransformArg3) { - if (q < MIN_IMAGES_IN_MASKS_BLOCK) { - isSameImage = false; - } else { - count = q; - } - break; // different image or transform - } - } - } - - if (isSameImage) { - count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK); - var positions = new Float32Array(count * 2); - iTransform = iFirstTransform; - for (q = 0; q < count; q++, iTransform += 4) { - transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, - [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]); - } else { - count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK); - var images = []; - for (q = 0; q < count; q++) { - transformArgs = argsArray[iFirstTransform + (q << 2)]; - var maskParams = argsArray[iFirstPIMXO + (q << 2)][0]; - images.push({ data: maskParams.data, width: maskParams.width, - height: maskParams.height, - transform: transformArgs }); - } - - // Replace queue items. - fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup); - argsArray.splice(iFirstSave, count * 4, [images]); - } - - return iFirstSave + 1; - }); - - // This replaces (save, transform, paintImageXObject, restore)+ sequences - // with one paintImageXObjectRepeat operation, if the |transform| and - // |paintImageXObjectRepeat| ops are appropriate. - addState(InitialState, - [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore], - function (context) { - var MIN_IMAGES_IN_BLOCK = 3; - var MAX_IMAGES_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstSave = curr - 3; - var iFirstTransform = curr - 2; - var iFirstPIXO = curr - 1; - var iFirstRestore = curr; - - if (argsArray[iFirstTransform][1] !== 0 || - argsArray[iFirstTransform][2] !== 0) { - return iFirstRestore + 1; // transform has the wrong form - } - - // Look for the quartets. - var firstPIXOArg0 = argsArray[iFirstPIXO][0]; - var firstTransformArg0 = argsArray[iFirstTransform][0]; - var firstTransformArg3 = argsArray[iFirstTransform][3]; - var i = iFirstSave + 4; - var ii = fnArray.length; - while (i + 3 < ii) { - if (fnArray[i] !== OPS.save || - fnArray[i + 1] !== OPS.transform || - fnArray[i + 2] !== OPS.paintImageXObject || - fnArray[i + 3] !== OPS.restore) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstTransformArg0 || - argsArray[i + 1][1] !== 0 || - argsArray[i + 1][2] !== 0 || - argsArray[i + 1][3] !== firstTransformArg3) { - break; // transforms don't match - } - if (argsArray[i + 2][0] !== firstPIXOArg0) { - break; // images don't match - } - i += 4; - } - - // At this point, i is the index of the first op past the last valid - // quartet. - var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK); - if (count < MIN_IMAGES_IN_BLOCK) { - return i; - } - - // Extract the (x,y) positions from all of the matching transforms. - var positions = new Float32Array(count * 2); - var iTransform = iFirstTransform; - for (var q = 0; q < count; q++, iTransform += 4) { - var transformArgs = argsArray[iTransform]; - positions[(q << 1)] = transformArgs[4]; - positions[(q << 1) + 1] = transformArgs[5]; - } - - // Replace queue items. - var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, - positions]; - fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat); - argsArray.splice(iFirstSave, count * 4, args); - - return iFirstSave + 1; - }); - - // This replaces (beginText, setFont, setTextMatrix, showText, endText)+ - // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+ - // sequences, if the font for each one is the same. - addState(InitialState, - [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText], - function (context) { - var MIN_CHARS_IN_BLOCK = 3; - var MAX_CHARS_IN_BLOCK = 1000; - - var fnArray = context.fnArray, argsArray = context.argsArray; - var curr = context.iCurr; - var iFirstBeginText = curr - 4; - var iFirstSetFont = curr - 3; - var iFirstSetTextMatrix = curr - 2; - var iFirstShowText = curr - 1; - var iFirstEndText = curr; - - // Look for the quintets. - var firstSetFontArg0 = argsArray[iFirstSetFont][0]; - var firstSetFontArg1 = argsArray[iFirstSetFont][1]; - var i = iFirstBeginText + 5; - var ii = fnArray.length; - while (i + 4 < ii) { - if (fnArray[i] !== OPS.beginText || - fnArray[i + 1] !== OPS.setFont || - fnArray[i + 2] !== OPS.setTextMatrix || - fnArray[i + 3] !== OPS.showText || - fnArray[i + 4] !== OPS.endText) { - break; // ops don't match - } - if (argsArray[i + 1][0] !== firstSetFontArg0 || - argsArray[i + 1][1] !== firstSetFontArg1) { - break; // fonts don't match - } - i += 5; - } - - // At this point, i is the index of the first op past the last valid - // quintet. - var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK); - if (count < MIN_CHARS_IN_BLOCK) { - return i; - } - - // If the preceding quintet is (, setFont, setTextMatrix, - // showText, endText), include that as well. (E.g. might be - // |dependency|.) - var iFirst = iFirstBeginText; - if (iFirstBeginText >= 4 && - fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && - fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && - fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && - fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && - argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && - argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) { - count++; - iFirst -= 5; - } - - // Remove (endText, beginText, setFont) trios. - var iEndText = iFirst + 4; - for (var q = 1; q < count; q++) { - fnArray.splice(iEndText, 3); - argsArray.splice(iEndText, 3); - iEndText += 2; - } - - return iEndText + 1; - }); - - function QueueOptimizer() {} - - QueueOptimizer.prototype = { - optimize: function QueueOptimizer_optimize(queue) { - var fnArray = queue.fnArray, argsArray = queue.argsArray; - var context = { - iCurr: 0, - fnArray: fnArray, - argsArray: argsArray - }; - var state; - var i = 0, ii = fnArray.length; - while (i < ii) { - state = (state || InitialState)[fnArray[i]]; - if (typeof state === 'function') { // we found some handler - context.iCurr = i; - // state() returns the index of the first non-matching op (if we - // didn't match) or the first op past the modified ops (if we did - // match and replace). - i = state(context); - state = undefined; // reset the state machine - ii = context.fnArray.length; - } else { - i++; - } - } - } - }; - return QueueOptimizer; -})(); - -exports.OperatorList = OperatorList; -exports.PartialEvaluator = PartialEvaluator; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreAnnotation = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, root.pdfjsCoreColorSpace, - root.pdfjsCoreObj, root.pdfjsCoreEvaluator); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, - coreColorSpace, coreObj, coreEvaluator) { - -var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType; -var AnnotationFlag = sharedUtil.AnnotationFlag; -var AnnotationType = sharedUtil.AnnotationType; -var OPS = sharedUtil.OPS; -var Util = sharedUtil.Util; -var isArray = sharedUtil.isArray; -var isInt = sharedUtil.isInt; -var isValidUrl = sharedUtil.isValidUrl; -var stringToBytes = sharedUtil.stringToBytes; -var stringToPDFString = sharedUtil.stringToPDFString; -var stringToUTF8String = sharedUtil.stringToUTF8String; -var warn = sharedUtil.warn; -var Dict = corePrimitives.Dict; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var Stream = coreStream.Stream; -var ColorSpace = coreColorSpace.ColorSpace; -var ObjectLoader = coreObj.ObjectLoader; -var OperatorList = coreEvaluator.OperatorList; - -/** - * @class - * @alias AnnotationFactory - */ -function AnnotationFactory() {} -AnnotationFactory.prototype = /** @lends AnnotationFactory.prototype */ { - /** - * @param {XRef} xref - * @param {Object} ref - * @returns {Annotation} - */ - create: function AnnotationFactory_create(xref, ref) { - var dict = xref.fetchIfRef(ref); - if (!isDict(dict)) { - return; - } - - // Determine the annotation's subtype. - var subtype = dict.get('Subtype'); - subtype = isName(subtype) ? subtype.name : ''; - - // Return the right annotation object based on the subtype and field type. - var parameters = { - dict: dict, - ref: ref - }; - - switch (subtype) { - case 'Link': - return new LinkAnnotation(parameters); - - case 'Text': - return new TextAnnotation(parameters); - - case 'Widget': - var fieldType = Util.getInheritableProperty(dict, 'FT'); - if (isName(fieldType) && fieldType.name === 'Tx') { - return new TextWidgetAnnotation(parameters); - } - return new WidgetAnnotation(parameters); - - case 'Popup': - return new PopupAnnotation(parameters); - - case 'Highlight': - return new HighlightAnnotation(parameters); - - case 'Underline': - return new UnderlineAnnotation(parameters); - - case 'Squiggly': - return new SquigglyAnnotation(parameters); - - case 'StrikeOut': - return new StrikeOutAnnotation(parameters); - - default: - warn('Unimplemented annotation type "' + subtype + '", ' + - 'falling back to base annotation'); - return new Annotation(parameters); - } - } -}; - -var Annotation = (function AnnotationClosure() { - // 12.5.5: Algorithm: Appearance streams - function getTransformMatrix(rect, bbox, matrix) { - var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix); - var minX = bounds[0]; - var minY = bounds[1]; - var maxX = bounds[2]; - var maxY = bounds[3]; - - if (minX === maxX || minY === maxY) { - // From real-life file, bbox was [0, 0, 0, 0]. In this case, - // just apply the transform for rect - return [1, 0, 0, 1, rect[0], rect[1]]; - } - - var xRatio = (rect[2] - rect[0]) / (maxX - minX); - var yRatio = (rect[3] - rect[1]) / (maxY - minY); - return [ - xRatio, - 0, - 0, - yRatio, - rect[0] - minX * xRatio, - rect[1] - minY * yRatio - ]; - } - - function getDefaultAppearance(dict) { - var appearanceState = dict.get('AP'); - if (!isDict(appearanceState)) { - return; - } - - var appearance; - var appearances = appearanceState.get('N'); - if (isDict(appearances)) { - var as = dict.get('AS'); - if (as && appearances.has(as.name)) { - appearance = appearances.get(as.name); - } - } else { - appearance = appearances; - } - return appearance; - } - - function Annotation(params) { - var dict = params.dict; - - this.setFlags(dict.get('F')); - this.setRectangle(dict.get('Rect')); - this.setColor(dict.get('C')); - this.setBorderStyle(dict); - this.appearance = getDefaultAppearance(dict); - - // Expose public properties using a data object. - this.data = {}; - this.data.id = params.ref.toString(); - this.data.subtype = dict.get('Subtype').name; - this.data.annotationFlags = this.flags; - this.data.rect = this.rectangle; - this.data.color = this.color; - this.data.borderStyle = this.borderStyle; - this.data.hasAppearance = !!this.appearance; - } - - Annotation.prototype = { - /** - * @return {boolean} - */ - get viewable() { - if (this.flags) { - return !this.hasFlag(AnnotationFlag.INVISIBLE) && - !this.hasFlag(AnnotationFlag.HIDDEN) && - !this.hasFlag(AnnotationFlag.NOVIEW); - } - return true; - }, - - /** - * @return {boolean} - */ - get printable() { - if (this.flags) { - return this.hasFlag(AnnotationFlag.PRINT) && - !this.hasFlag(AnnotationFlag.INVISIBLE) && - !this.hasFlag(AnnotationFlag.HIDDEN); - } - return false; - }, - - /** - * Set the flags. - * - * @public - * @memberof Annotation - * @param {number} flags - Unsigned 32-bit integer specifying annotation - * characteristics - * @see {@link shared/util.js} - */ - setFlags: function Annotation_setFlags(flags) { - if (isInt(flags)) { - this.flags = flags; - } else { - this.flags = 0; - } - }, - - /** - * Check if a provided flag is set. - * - * @public - * @memberof Annotation - * @param {number} flag - Hexadecimal representation for an annotation - * characteristic - * @return {boolean} - * @see {@link shared/util.js} - */ - hasFlag: function Annotation_hasFlag(flag) { - if (this.flags) { - return (this.flags & flag) > 0; - } - return false; - }, - - /** - * Set the rectangle. - * - * @public - * @memberof Annotation - * @param {Array} rectangle - The rectangle array with exactly four entries - */ - setRectangle: function Annotation_setRectangle(rectangle) { - if (isArray(rectangle) && rectangle.length === 4) { - this.rectangle = Util.normalizeRect(rectangle); - } else { - this.rectangle = [0, 0, 0, 0]; - } - }, - - /** - * Set the color and take care of color space conversion. - * - * @public - * @memberof Annotation - * @param {Array} color - The color array containing either 0 - * (transparent), 1 (grayscale), 3 (RGB) or - * 4 (CMYK) elements - */ - setColor: function Annotation_setColor(color) { - var rgbColor = new Uint8Array(3); // Black in RGB color space (default) - if (!isArray(color)) { - this.color = rgbColor; - return; - } - - switch (color.length) { - case 0: // Transparent, which we indicate with a null value - this.color = null; - break; - - case 1: // Convert grayscale to RGB - ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 3: // Convert RGB percentages to RGB - ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - case 4: // Convert CMYK to RGB - ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0); - this.color = rgbColor; - break; - - default: - this.color = rgbColor; - break; - } - }, - - /** - * Set the border style (as AnnotationBorderStyle object). - * - * @public - * @memberof Annotation - * @param {Dict} borderStyle - The border style dictionary - */ - setBorderStyle: function Annotation_setBorderStyle(borderStyle) { - this.borderStyle = new AnnotationBorderStyle(); - if (!isDict(borderStyle)) { - return; - } - if (borderStyle.has('BS')) { - var dict = borderStyle.get('BS'); - var dictType; - - if (!dict.has('Type') || (isName(dictType = dict.get('Type')) && - dictType.name === 'Border')) { - this.borderStyle.setWidth(dict.get('W')); - this.borderStyle.setStyle(dict.get('S')); - this.borderStyle.setDashArray(dict.get('D')); - } - } else if (borderStyle.has('Border')) { - var array = borderStyle.get('Border'); - if (isArray(array) && array.length >= 3) { - this.borderStyle.setHorizontalCornerRadius(array[0]); - this.borderStyle.setVerticalCornerRadius(array[1]); - this.borderStyle.setWidth(array[2]); - - if (array.length === 4) { // Dash array available - this.borderStyle.setDashArray(array[3]); - } - } - } else { - // There are no border entries in the dictionary. According to the - // specification, we should draw a solid border of width 1 in that - // case, but Adobe Reader did not implement that part of the - // specification and instead draws no border at all, so we do the same. - // See also https://github.com/mozilla/pdf.js/issues/6179. - this.borderStyle.setWidth(0); - } - }, - - loadResources: function Annotation_loadResources(keys) { - return new Promise(function (resolve, reject) { - this.appearance.dict.getAsync('Resources').then(function (resources) { - if (!resources) { - resolve(); - return; - } - var objectLoader = new ObjectLoader(resources.map, - keys, - resources.xref); - objectLoader.load().then(function() { - resolve(resources); - }, reject); - }, reject); - }.bind(this)); - }, - - getOperatorList: function Annotation_getOperatorList(evaluator, task) { - if (!this.appearance) { - return Promise.resolve(new OperatorList()); - } - - var data = this.data; - var appearanceDict = this.appearance.dict; - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'ColorSpace', - 'Pattern', - 'Shading', - 'XObject', - 'Font' - // ProcSet - // Properties - ]); - var bbox = appearanceDict.get('BBox') || [0, 0, 1, 1]; - var matrix = appearanceDict.get('Matrix') || [1, 0, 0, 1, 0 ,0]; - var transform = getTransformMatrix(data.rect, bbox, matrix); - var self = this; - - return resourcesPromise.then(function(resources) { - var opList = new OperatorList(); - opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]); - return evaluator.getOperatorList(self.appearance, task, - resources, opList). - then(function () { - opList.addOp(OPS.endAnnotation, []); - self.appearance.reset(); - return opList; - }); - }); - } - }; - - Annotation.appendToOperatorList = function Annotation_appendToOperatorList( - annotations, opList, partialEvaluator, task, intent) { - var annotationPromises = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if ((intent === 'display' && annotations[i].viewable) || - (intent === 'print' && annotations[i].printable)) { - annotationPromises.push( - annotations[i].getOperatorList(partialEvaluator, task)); - } - } - return Promise.all(annotationPromises).then(function(operatorLists) { - opList.addOp(OPS.beginAnnotations, []); - for (var i = 0, n = operatorLists.length; i < n; ++i) { - opList.addOpList(operatorLists[i]); - } - opList.addOp(OPS.endAnnotations, []); - }); - }; - - return Annotation; -})(); - -/** - * Contains all data regarding an annotation's border style. - * - * @class - */ -var AnnotationBorderStyle = (function AnnotationBorderStyleClosure() { - /** - * @constructor - * @private - */ - function AnnotationBorderStyle() { - this.width = 1; - this.style = AnnotationBorderStyleType.SOLID; - this.dashArray = [3]; - this.horizontalCornerRadius = 0; - this.verticalCornerRadius = 0; - } - - AnnotationBorderStyle.prototype = { - /** - * Set the width. - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} width - The width - */ - setWidth: function AnnotationBorderStyle_setWidth(width) { - if (width === (width | 0)) { - this.width = width; - } - }, - - /** - * Set the style. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Object} style - The style object - * @see {@link shared/util.js} - */ - setStyle: function AnnotationBorderStyle_setStyle(style) { - if (!style) { - return; - } - switch (style.name) { - case 'S': - this.style = AnnotationBorderStyleType.SOLID; - break; - - case 'D': - this.style = AnnotationBorderStyleType.DASHED; - break; - - case 'B': - this.style = AnnotationBorderStyleType.BEVELED; - break; - - case 'I': - this.style = AnnotationBorderStyleType.INSET; - break; - - case 'U': - this.style = AnnotationBorderStyleType.UNDERLINE; - break; - - default: - break; - } - }, - - /** - * Set the dash array. - * - * @public - * @memberof AnnotationBorderStyle - * @param {Array} dashArray - The dash array with at least one element - */ - setDashArray: function AnnotationBorderStyle_setDashArray(dashArray) { - // We validate the dash array, but we do not use it because CSS does not - // allow us to change spacing of dashes. For more information, visit - // http://www.w3.org/TR/css3-background/#the-border-style. - if (isArray(dashArray) && dashArray.length > 0) { - // According to the PDF specification: the elements in a dashArray - // shall be numbers that are nonnegative and not all equal to zero. - var isValid = true; - var allZeros = true; - for (var i = 0, len = dashArray.length; i < len; i++) { - var element = dashArray[i]; - var validNumber = (+element >= 0); - if (!validNumber) { - isValid = false; - break; - } else if (element > 0) { - allZeros = false; - } - } - if (isValid && !allZeros) { - this.dashArray = dashArray; - } else { - this.width = 0; // Adobe behavior when the array is invalid. - } - } else if (dashArray) { - this.width = 0; // Adobe behavior when the array is invalid. - } - }, - - /** - * Set the horizontal corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The horizontal corner radius - */ - setHorizontalCornerRadius: - function AnnotationBorderStyle_setHorizontalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.horizontalCornerRadius = radius; - } - }, - - /** - * Set the vertical corner radius (from a Border dictionary). - * - * @public - * @memberof AnnotationBorderStyle - * @param {integer} radius - The vertical corner radius - */ - setVerticalCornerRadius: - function AnnotationBorderStyle_setVerticalCornerRadius(radius) { - if (radius === (radius | 0)) { - this.verticalCornerRadius = radius; - } - } - }; - - return AnnotationBorderStyle; -})(); - -var WidgetAnnotation = (function WidgetAnnotationClosure() { - function WidgetAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - - data.annotationType = AnnotationType.WIDGET; - data.fieldValue = stringToPDFString( - Util.getInheritableProperty(dict, 'V') || ''); - data.alternativeText = stringToPDFString(dict.get('TU') || ''); - data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || ''; - var fieldType = Util.getInheritableProperty(dict, 'FT'); - data.fieldType = isName(fieldType) ? fieldType.name : ''; - data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0; - this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty; - - // Hide unsupported Widget signatures. - if (data.fieldType === 'Sig') { - warn('unimplemented annotation type: Widget signature'); - this.setFlags(AnnotationFlag.HIDDEN); - } - - // Building the full field name by collecting the field and - // its ancestors 'T' data and joining them using '.'. - var fieldName = []; - var namedItem = dict; - var ref = params.ref; - while (namedItem) { - var parent = namedItem.get('Parent'); - var parentRef = namedItem.getRaw('Parent'); - var name = namedItem.get('T'); - if (name) { - fieldName.unshift(stringToPDFString(name)); - } else if (parent && ref) { - // The field name is absent, that means more than one field - // with the same name may exist. Replacing the empty name - // with the '`' plus index in the parent's 'Kids' array. - // This is not in the PDF spec but necessary to id the - // the input controls. - var kids = parent.get('Kids'); - var j, jj; - for (j = 0, jj = kids.length; j < jj; j++) { - var kidRef = kids[j]; - if (kidRef.num === ref.num && kidRef.gen === ref.gen) { - break; - } - } - fieldName.unshift('`' + j); - } - namedItem = parent; - ref = parentRef; - } - data.fullName = fieldName.join('.'); - } - - Util.inherit(WidgetAnnotation, Annotation, {}); - - return WidgetAnnotation; -})(); - -var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() { - function TextWidgetAnnotation(params) { - WidgetAnnotation.call(this, params); - - this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q'); - this.data.hasHtml = !this.data.hasAppearance && !!this.data.fieldValue; - } - - Util.inherit(TextWidgetAnnotation, WidgetAnnotation, { - getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator, - task) { - if (this.appearance) { - return Annotation.prototype.getOperatorList.call(this, evaluator, task); - } - - var opList = new OperatorList(); - var data = this.data; - - // Even if there is an appearance stream, ignore it. This is the - // behaviour used by Adobe Reader. - if (!data.defaultAppearance) { - return Promise.resolve(opList); - } - - var stream = new Stream(stringToBytes(data.defaultAppearance)); - return evaluator.getOperatorList(stream, task, - this.fieldResources, opList). - then(function () { - return opList; - }); - } - }); - - return TextWidgetAnnotation; -})(); - -var TextAnnotation = (function TextAnnotationClosure() { - var DEFAULT_ICON_SIZE = 22; // px - - function TextAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.TEXT; - this.data.hasHtml = true; - - var dict = parameters.dict; - if (this.data.hasAppearance) { - this.data.name = 'NoIcon'; - } else { - this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE; - this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE; - this.data.name = dict.has('Name') ? dict.get('Name').name : 'Note'; - } - - if (!dict.has('C')) { - // Fall back to the default background color. - this.data.color = null; - } - - this.data.hasPopup = dict.has('Popup'); - if (!this.data.hasPopup) { - // There is no associated Popup annotation, so the Text annotation - // must create its own popup. - this.data.title = stringToPDFString(dict.get('T') || ''); - this.data.contents = stringToPDFString(dict.get('Contents') || ''); - this.data.hasHtml = (this.data.title || this.data.contents); - } - } - - Util.inherit(TextAnnotation, Annotation, {}); - - return TextAnnotation; -})(); - -var LinkAnnotation = (function LinkAnnotationClosure() { - function LinkAnnotation(params) { - Annotation.call(this, params); - - var dict = params.dict; - var data = this.data; - data.annotationType = AnnotationType.LINK; - data.hasHtml = true; - - var action = dict.get('A'); - if (action && isDict(action)) { - var linkType = action.get('S').name; - if (linkType === 'URI') { - var url = action.get('URI'); - if (isName(url)) { - // Some bad PDFs do not put parentheses around relative URLs. - url = '/' + url.name; - } else if (url) { - url = addDefaultProtocolToUrl(url); - } - // TODO: pdf spec mentions urls can be relative to a Base - // entry in the dictionary. - if (!isValidUrl(url, false)) { - url = ''; - } - // According to ISO 32000-1:2008, section 12.6.4.7, - // URI should to be encoded in 7-bit ASCII. - // Some bad PDFs may have URIs in UTF-8 encoding, see Bugzilla 1122280. - try { - data.url = stringToUTF8String(url); - } catch (e) { - // Fall back to a simple copy. - data.url = url; - } - } else if (linkType === 'GoTo') { - data.dest = action.get('D'); - } else if (linkType === 'GoToR') { - var urlDict = action.get('F'); - if (isDict(urlDict)) { - // We assume that the 'url' is a Filspec dictionary - // and fetch the url without checking any further - url = urlDict.get('F') || ''; - } - - // TODO: pdf reference says that GoToR - // can also have 'NewWindow' attribute - if (!isValidUrl(url, false)) { - url = ''; - } - data.url = url; - data.dest = action.get('D'); - } else if (linkType === 'Named') { - data.action = action.get('N').name; - } else { - warn('unrecognized link type: ' + linkType); - } - } else if (dict.has('Dest')) { - // simple destination link - var dest = dict.get('Dest'); - data.dest = isName(dest) ? dest.name : dest; - } - } - - // Lets URLs beginning with 'www.' default to using the 'http://' protocol. - function addDefaultProtocolToUrl(url) { - if (url && url.indexOf('www.') === 0) { - return ('http://' + url); - } - return url; - } - - Util.inherit(LinkAnnotation, Annotation, {}); - - return LinkAnnotation; -})(); - -var PopupAnnotation = (function PopupAnnotationClosure() { - function PopupAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.POPUP; - - var dict = parameters.dict; - var parentItem = dict.get('Parent'); - if (!parentItem) { - warn('Popup annotation has a missing or invalid parent annotation.'); - return; - } - - this.data.parentId = dict.getRaw('Parent').toString(); - this.data.title = stringToPDFString(parentItem.get('T') || ''); - this.data.contents = stringToPDFString(parentItem.get('Contents') || ''); - - if (!parentItem.has('C')) { - // Fall back to the default background color. - this.data.color = null; - } else { - this.setColor(parentItem.get('C')); - this.data.color = this.color; - } - - this.data.hasHtml = (this.data.title || this.data.contents); - } - - Util.inherit(PopupAnnotation, Annotation, {}); - - return PopupAnnotation; -})(); - -var HighlightAnnotation = (function HighlightAnnotationClosure() { - function HighlightAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.HIGHLIGHT; - this.data.hasHtml = true; - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(HighlightAnnotation, Annotation, {}); - - return HighlightAnnotation; -})(); - -var UnderlineAnnotation = (function UnderlineAnnotationClosure() { - function UnderlineAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.UNDERLINE; - this.data.hasHtml = true; - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(UnderlineAnnotation, Annotation, {}); - - return UnderlineAnnotation; -})(); - -var SquigglyAnnotation = (function SquigglyAnnotationClosure() { - function SquigglyAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.SQUIGGLY; - this.data.hasHtml = true; - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(SquigglyAnnotation, Annotation, {}); - - return SquigglyAnnotation; -})(); - -var StrikeOutAnnotation = (function StrikeOutAnnotationClosure() { - function StrikeOutAnnotation(parameters) { - Annotation.call(this, parameters); - - this.data.annotationType = AnnotationType.STRIKEOUT; - this.data.hasHtml = true; - - // PDF viewers completely ignore any border styles. - this.data.borderStyle.setWidth(0); - } - - Util.inherit(StrikeOutAnnotation, Annotation, {}); - - return StrikeOutAnnotation; -})(); - -exports.Annotation = Annotation; -exports.AnnotationBorderStyle = AnnotationBorderStyle; -exports.AnnotationFactory = AnnotationFactory; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreDocument = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCoreStream, - root.pdfjsCoreObj, root.pdfjsCoreParser, root.pdfjsCoreCrypto, - root.pdfjsCoreEvaluator, root.pdfjsCoreAnnotation); - } -}(this, function (exports, sharedUtil, corePrimitives, coreStream, coreObj, - coreParser, coreCrypto, coreEvaluator, coreAnnotation) { - -var MissingDataException = sharedUtil.MissingDataException; -var Util = sharedUtil.Util; -var assert = sharedUtil.assert; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isArray = sharedUtil.isArray; -var isArrayBuffer = sharedUtil.isArrayBuffer; -var isString = sharedUtil.isString; -var shadow = sharedUtil.shadow; -var stringToBytes = sharedUtil.stringToBytes; -var stringToPDFString = sharedUtil.stringToPDFString; -var warn = sharedUtil.warn; -var Dict = corePrimitives.Dict; -var isDict = corePrimitives.isDict; -var isName = corePrimitives.isName; -var isStream = corePrimitives.isStream; -var NullStream = coreStream.NullStream; -var Stream = coreStream.Stream; -var StreamsSequenceStream = coreStream.StreamsSequenceStream; -var Catalog = coreObj.Catalog; -var ObjectLoader = coreObj.ObjectLoader; -var XRef = coreObj.XRef; -var Lexer = coreParser.Lexer; -var Linearization = coreParser.Linearization; -var calculateMD5 = coreCrypto.calculateMD5; -var OperatorList = coreEvaluator.OperatorList; -var PartialEvaluator = coreEvaluator.PartialEvaluator; -var Annotation = coreAnnotation.Annotation; -var AnnotationFactory = coreAnnotation.AnnotationFactory; - -var Page = (function PageClosure() { - - var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792]; - - function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) { - this.pdfManager = pdfManager; - this.pageIndex = pageIndex; - this.pageDict = pageDict; - this.xref = xref; - this.ref = ref; - this.fontCache = fontCache; - this.idCounters = { - obj: 0 - }; - this.resourcesPromise = null; - } - - Page.prototype = { - getPageProp: function Page_getPageProp(key) { - return this.pageDict.get(key); - }, - - getInheritedPageProp: function Page_getInheritedPageProp(key) { - var dict = this.pageDict, valueArray = null, loopCount = 0; - var MAX_LOOP_COUNT = 100; - // Always walk up the entire parent chain, to be able to find - // e.g. \Resources placed on multiple levels of the tree. - while (dict) { - var value = dict.get(key); - if (value) { - if (!valueArray) { - valueArray = []; - } - valueArray.push(value); - } - if (++loopCount > MAX_LOOP_COUNT) { - warn('Page_getInheritedPageProp: maximum loop count exceeded.'); - break; - } - dict = dict.get('Parent'); - } - if (!valueArray) { - return Dict.empty; - } - if (valueArray.length === 1 || !isDict(valueArray[0]) || - loopCount > MAX_LOOP_COUNT) { - return valueArray[0]; - } - return Dict.merge(this.xref, valueArray); - }, - - get content() { - return this.getPageProp('Contents'); - }, - - get resources() { - // For robustness: The spec states that a \Resources entry has to be - // present, but can be empty. Some document omit it still, in this case - // we return an empty dictionary. - return shadow(this, 'resources', this.getInheritedPageProp('Resources')); - }, - - get mediaBox() { - var obj = this.getInheritedPageProp('MediaBox'); - // Reset invalid media box to letter size. - if (!isArray(obj) || obj.length !== 4) { - obj = LETTER_SIZE_MEDIABOX; - } - return shadow(this, 'mediaBox', obj); - }, - - get view() { - var mediaBox = this.mediaBox; - var cropBox = this.getInheritedPageProp('CropBox'); - if (!isArray(cropBox) || cropBox.length !== 4) { - return shadow(this, 'view', mediaBox); - } - - // From the spec, 6th ed., p.963: - // "The crop, bleed, trim, and art boxes should not ordinarily - // extend beyond the boundaries of the media box. If they do, they are - // effectively reduced to their intersection with the media box." - cropBox = Util.intersect(cropBox, mediaBox); - if (!cropBox) { - return shadow(this, 'view', mediaBox); - } - return shadow(this, 'view', cropBox); - }, - - get rotate() { - var rotate = this.getInheritedPageProp('Rotate') || 0; - // Normalize rotation so it's a multiple of 90 and between 0 and 270 - if (rotate % 90 !== 0) { - rotate = 0; - } else if (rotate >= 360) { - rotate = rotate % 360; - } else if (rotate < 0) { - // The spec doesn't cover negatives, assume its counterclockwise - // rotation. The following is the other implementation of modulo. - rotate = ((rotate % 360) + 360) % 360; - } - return shadow(this, 'rotate', rotate); - }, - - getContentStream: function Page_getContentStream() { - var content = this.content; - var stream; - if (isArray(content)) { - // fetching items - var xref = this.xref; - var i, n = content.length; - var streams = []; - for (i = 0; i < n; ++i) { - streams.push(xref.fetchIfRef(content[i])); - } - stream = new StreamsSequenceStream(streams); - } else if (isStream(content)) { - stream = content; - } else { - // replacing non-existent page content with empty one - stream = new NullStream(); - } - return stream; - }, - - loadResources: function Page_loadResources(keys) { - if (!this.resourcesPromise) { - // TODO: add async getInheritedPageProp and remove this. - this.resourcesPromise = this.pdfManager.ensure(this, 'resources'); - } - return this.resourcesPromise.then(function resourceSuccess() { - var objectLoader = new ObjectLoader(this.resources.map, - keys, - this.xref); - return objectLoader.load(); - }.bind(this)); - }, - - getOperatorList: function Page_getOperatorList(handler, task, intent) { - var self = this; - - var pdfManager = this.pdfManager; - var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', - []); - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'ColorSpace', - 'Pattern', - 'Shading', - 'XObject', - 'Font' - // ProcSet - // Properties - ]); - - var partialEvaluator = new PartialEvaluator(pdfManager, this.xref, - handler, this.pageIndex, - 'p' + this.pageIndex + '_', - this.idCounters, - this.fontCache); - - var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]); - var pageListPromise = dataPromises.then(function(data) { - var contentStream = data[0]; - var opList = new OperatorList(intent, handler, self.pageIndex); - - handler.send('StartRenderPage', { - transparency: partialEvaluator.hasBlendModes(self.resources), - pageIndex: self.pageIndex, - intent: intent - }); - return partialEvaluator.getOperatorList(contentStream, task, - self.resources, opList).then(function () { - return opList; - }); - }); - - var annotationsPromise = pdfManager.ensure(this, 'annotations'); - return Promise.all([pageListPromise, annotationsPromise]).then( - function(datas) { - var pageOpList = datas[0]; - var annotations = datas[1]; - - if (annotations.length === 0) { - pageOpList.flush(true); - return pageOpList; - } - - var annotationsReadyPromise = Annotation.appendToOperatorList( - annotations, pageOpList, partialEvaluator, task, intent); - return annotationsReadyPromise.then(function () { - pageOpList.flush(true); - return pageOpList; - }); - }); - }, - - extractTextContent: function Page_extractTextContent(task, - normalizeWhitespace) { - var handler = { - on: function nullHandlerOn() {}, - send: function nullHandlerSend() {} - }; - - var self = this; - - var pdfManager = this.pdfManager; - var contentStreamPromise = pdfManager.ensure(this, 'getContentStream', - []); - - var resourcesPromise = this.loadResources([ - 'ExtGState', - 'XObject', - 'Font' - ]); - - var dataPromises = Promise.all([contentStreamPromise, - resourcesPromise]); - return dataPromises.then(function(data) { - var contentStream = data[0]; - var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, - handler, self.pageIndex, - 'p' + self.pageIndex + '_', - self.idCounters, - self.fontCache); - - return partialEvaluator.getTextContent(contentStream, - task, - self.resources, - /* stateManager = */ null, - normalizeWhitespace); - }); - }, - - getAnnotationsData: function Page_getAnnotationsData(intent) { - var annotations = this.annotations; - var annotationsData = []; - for (var i = 0, n = annotations.length; i < n; ++i) { - if (intent) { - if (!(intent === 'display' && annotations[i].viewable) && - !(intent === 'print' && annotations[i].printable)) { - continue; - } - } - annotationsData.push(annotations[i].data); - } - return annotationsData; - }, - - get annotations() { - var annotations = []; - var annotationRefs = this.getInheritedPageProp('Annots') || []; - var annotationFactory = new AnnotationFactory(); - for (var i = 0, n = annotationRefs.length; i < n; ++i) { - var annotationRef = annotationRefs[i]; - var annotation = annotationFactory.create(this.xref, annotationRef); - if (annotation) { - annotations.push(annotation); - } - } - return shadow(this, 'annotations', annotations); - } - }; - - return Page; -})(); - -/** - * The `PDFDocument` holds all the data of the PDF file. Compared to the - * `PDFDoc`, this one doesn't have any job management code. - * Right now there exists one PDFDocument on the main thread + one object - * for each worker. If there is no worker support enabled, there are two - * `PDFDocument` objects on the main thread created. - */ -var PDFDocument = (function PDFDocumentClosure() { - var FINGERPRINT_FIRST_BYTES = 1024; - var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + - '\x00\x00\x00\x00\x00\x00\x00\x00\x00'; - - function PDFDocument(pdfManager, arg, password) { - if (isStream(arg)) { - init.call(this, pdfManager, arg, password); - } else if (isArrayBuffer(arg)) { - init.call(this, pdfManager, new Stream(arg), password); - } else { - error('PDFDocument: Unknown argument type'); - } - } - - function init(pdfManager, stream, password) { - assert(stream.length > 0, 'stream must have data'); - this.pdfManager = pdfManager; - this.stream = stream; - var xref = new XRef(this.stream, password, pdfManager); - this.xref = xref; - } - - function find(stream, needle, limit, backwards) { - var pos = stream.pos; - var end = stream.end; - var strBuf = []; - if (pos + limit > end) { - limit = end - pos; - } - for (var n = 0; n < limit; ++n) { - strBuf.push(String.fromCharCode(stream.getByte())); - } - var str = strBuf.join(''); - stream.pos = pos; - var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle); - if (index === -1) { - return false; /* not found */ - } - stream.pos += index; - return true; /* found */ - } - - var DocumentInfoValidators = { - get entries() { - // Lazily build this since all the validation functions below are not - // defined until after this file loads. - return shadow(this, 'entries', { - Title: isString, - Author: isString, - Subject: isString, - Keywords: isString, - Creator: isString, - Producer: isString, - CreationDate: isString, - ModDate: isString, - Trapped: isName - }); - } - }; - - PDFDocument.prototype = { - parse: function PDFDocument_parse(recoveryMode) { - this.setup(recoveryMode); - var version = this.catalog.catDict.get('Version'); - if (isName(version)) { - this.pdfFormatVersion = version.name; - } - try { - // checking if AcroForm is present - this.acroForm = this.catalog.catDict.get('AcroForm'); - if (this.acroForm) { - this.xfa = this.acroForm.get('XFA'); - var fields = this.acroForm.get('Fields'); - if ((!fields || !isArray(fields) || fields.length === 0) && - !this.xfa) { - // no fields and no XFA -- not a form (?) - this.acroForm = null; - } - } - } catch (ex) { - info('Something wrong with AcroForm entry'); - this.acroForm = null; - } - }, - - get linearization() { - var linearization = null; - if (this.stream.length) { - try { - linearization = Linearization.create(this.stream); - } catch (err) { - if (err instanceof MissingDataException) { - throw err; - } - info(err); - } - } - // shadow the prototype getter with a data property - return shadow(this, 'linearization', linearization); - }, - get startXRef() { - var stream = this.stream; - var startXRef = 0; - var linearization = this.linearization; - if (linearization) { - // Find end of first obj. - stream.reset(); - if (find(stream, 'endobj', 1024)) { - startXRef = stream.pos + 6; - } - } else { - // Find startxref by jumping backward from the end of the file. - var step = 1024; - var found = false, pos = stream.end; - while (!found && pos > 0) { - pos -= step - 'startxref'.length; - if (pos < 0) { - pos = 0; - } - stream.pos = pos; - found = find(stream, 'startxref', step, true); - } - if (found) { - stream.skip(9); - var ch; - do { - ch = stream.getByte(); - } while (Lexer.isSpace(ch)); - var str = ''; - while (ch >= 0x20 && ch <= 0x39) { // < '9' - str += String.fromCharCode(ch); - ch = stream.getByte(); - } - startXRef = parseInt(str, 10); - if (isNaN(startXRef)) { - startXRef = 0; - } - } - } - // shadow the prototype getter with a data property - return shadow(this, 'startXRef', startXRef); - }, - get mainXRefEntriesOffset() { - var mainXRefEntriesOffset = 0; - var linearization = this.linearization; - if (linearization) { - mainXRefEntriesOffset = linearization.mainXRefEntriesOffset; - } - // shadow the prototype getter with a data property - return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset); - }, - // Find the header, remove leading garbage and setup the stream - // starting from the header. - checkHeader: function PDFDocument_checkHeader() { - var stream = this.stream; - stream.reset(); - if (find(stream, '%PDF-', 1024)) { - // Found the header, trim off any garbage before it. - stream.moveStart(); - // Reading file format version - var MAX_VERSION_LENGTH = 12; - var version = '', ch; - while ((ch = stream.getByte()) > 0x20) { // SPACE - if (version.length >= MAX_VERSION_LENGTH) { - break; - } - version += String.fromCharCode(ch); - } - if (!this.pdfFormatVersion) { - // removing "%PDF-"-prefix - this.pdfFormatVersion = version.substring(5); - } - return; - } - // May not be a PDF file, continue anyway. - }, - parseStartXRef: function PDFDocument_parseStartXRef() { - var startXRef = this.startXRef; - this.xref.setStartXRef(startXRef); - }, - setup: function PDFDocument_setup(recoveryMode) { - this.xref.parse(recoveryMode); - var self = this; - var pageFactory = { - createPage: function (pageIndex, dict, ref, fontCache) { - return new Page(self.pdfManager, self.xref, pageIndex, dict, ref, - fontCache); - } - }; - this.catalog = new Catalog(this.pdfManager, this.xref, pageFactory); - }, - get numPages() { - var linearization = this.linearization; - var num = linearization ? linearization.numPages : this.catalog.numPages; - // shadow the prototype getter - return shadow(this, 'numPages', num); - }, - get documentInfo() { - var docInfo = { - PDFFormatVersion: this.pdfFormatVersion, - IsAcroFormPresent: !!this.acroForm, - IsXFAPresent: !!this.xfa - }; - var infoDict; - try { - infoDict = this.xref.trailer.get('Info'); - } catch (err) { - info('The document information dictionary is invalid.'); - } - if (infoDict) { - var validEntries = DocumentInfoValidators.entries; - // Only fill the document info with valid entries from the spec. - for (var key in validEntries) { - if (infoDict.has(key)) { - var value = infoDict.get(key); - // Make sure the value conforms to the spec. - if (validEntries[key](value)) { - docInfo[key] = (typeof value !== 'string' ? - value : stringToPDFString(value)); - } else { - info('Bad value in document info for "' + key + '"'); - } - } - } - } - return shadow(this, 'documentInfo', docInfo); - }, - get fingerprint() { - var xref = this.xref, hash, fileID = ''; - var idArray = xref.trailer.get('ID'); - - if (idArray && isArray(idArray) && idArray[0] && isString(idArray[0]) && - idArray[0] !== EMPTY_FINGERPRINT) { - hash = stringToBytes(idArray[0]); - } else { - if (this.stream.ensureRange) { - this.stream.ensureRange(0, - Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end)); - } - hash = calculateMD5(this.stream.bytes.subarray(0, - FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES); - } - - for (var i = 0, n = hash.length; i < n; i++) { - var hex = hash[i].toString(16); - fileID += hex.length === 1 ? '0' + hex : hex; - } - - return shadow(this, 'fingerprint', fileID); - }, - - getPage: function PDFDocument_getPage(pageIndex) { - return this.catalog.getPage(pageIndex); - }, - - cleanup: function PDFDocument_cleanup() { - return this.catalog.cleanup(); - } - }; - - return PDFDocument; -})(); - -exports.Page = Page; -exports.PDFDocument = PDFDocument; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCorePdfManager = {}), root.pdfjsSharedUtil, - root.pdfjsCoreStream, root.pdfjsCoreChunkedStream, - root.pdfjsCoreDocument); - } -}(this, function (exports, sharedUtil, coreStream, coreChunkedStream, - coreDocument) { - -var NotImplementedException = sharedUtil.NotImplementedException; -var MissingDataException = sharedUtil.MissingDataException; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var Util = sharedUtil.Util; -var Stream = coreStream.Stream; -var ChunkedStreamManager = coreChunkedStream.ChunkedStreamManager; -var PDFDocument = coreDocument.PDFDocument; - -var BasePdfManager = (function BasePdfManagerClosure() { - function BasePdfManager() { - throw new Error('Cannot initialize BaseManagerManager'); - } - - BasePdfManager.prototype = { - get docId() { - return this._docId; - }, - - onLoadedStream: function BasePdfManager_onLoadedStream() { - throw new NotImplementedException(); - }, - - ensureDoc: function BasePdfManager_ensureDoc(prop, args) { - return this.ensure(this.pdfDocument, prop, args); - }, - - ensureXRef: function BasePdfManager_ensureXRef(prop, args) { - return this.ensure(this.pdfDocument.xref, prop, args); - }, - - ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) { - return this.ensure(this.pdfDocument.catalog, prop, args); - }, - - getPage: function BasePdfManager_getPage(pageIndex) { - return this.pdfDocument.getPage(pageIndex); - }, - - cleanup: function BasePdfManager_cleanup() { - return this.pdfDocument.cleanup(); - }, - - ensure: function BasePdfManager_ensure(obj, prop, args) { - return new NotImplementedException(); - }, - - requestRange: function BasePdfManager_requestRange(begin, end) { - return new NotImplementedException(); - }, - - requestLoadedStream: function BasePdfManager_requestLoadedStream() { - return new NotImplementedException(); - }, - - sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) { - return new NotImplementedException(); - }, - - updatePassword: function BasePdfManager_updatePassword(password) { - this.pdfDocument.xref.password = this.password = password; - if (this._passwordChangedCapability) { - this._passwordChangedCapability.resolve(); - } - }, - - passwordChanged: function BasePdfManager_passwordChanged() { - this._passwordChangedCapability = createPromiseCapability(); - return this._passwordChangedCapability.promise; - }, - - terminate: function BasePdfManager_terminate() { - return new NotImplementedException(); - } - }; - - return BasePdfManager; -})(); - -var LocalPdfManager = (function LocalPdfManagerClosure() { - function LocalPdfManager(docId, data, password) { - this._docId = docId; - var stream = new Stream(data); - this.pdfDocument = new PDFDocument(this, stream, password); - this._loadedStreamCapability = createPromiseCapability(); - this._loadedStreamCapability.resolve(stream); - } - - Util.inherit(LocalPdfManager, BasePdfManager, { - ensure: function LocalPdfManager_ensure(obj, prop, args) { - return new Promise(function (resolve, reject) { - try { - var value = obj[prop]; - var result; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch (e) { - reject(e); - } - }); - }, - - requestRange: function LocalPdfManager_requestRange(begin, end) { - return Promise.resolve(); - }, - - requestLoadedStream: function LocalPdfManager_requestLoadedStream() { - return; - }, - - onLoadedStream: function LocalPdfManager_onLoadedStream() { - return this._loadedStreamCapability.promise; - }, - - terminate: function LocalPdfManager_terminate() { - return; - } - }); - - return LocalPdfManager; -})(); - -var NetworkPdfManager = (function NetworkPdfManagerClosure() { - function NetworkPdfManager(docId, args, msgHandler) { - this._docId = docId; - this.msgHandler = msgHandler; - - var params = { - msgHandler: msgHandler, - httpHeaders: args.httpHeaders, - withCredentials: args.withCredentials, - chunkedViewerLoading: args.chunkedViewerLoading, - disableAutoFetch: args.disableAutoFetch, - initialData: args.initialData - }; - this.streamManager = new ChunkedStreamManager(args.length, - args.rangeChunkSize, - args.url, params); - this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(), - args.password); - } - - Util.inherit(NetworkPdfManager, BasePdfManager, { - ensure: function NetworkPdfManager_ensure(obj, prop, args) { - var pdfManager = this; - - return new Promise(function (resolve, reject) { - function ensureHelper() { - try { - var result; - var value = obj[prop]; - if (typeof value === 'function') { - result = value.apply(obj, args); - } else { - result = value; - } - resolve(result); - } catch(e) { - if (!(e instanceof MissingDataException)) { - reject(e); - return; - } - pdfManager.streamManager.requestRange(e.begin, e.end). - then(ensureHelper, reject); - } - } - - ensureHelper(); - }); - }, - - requestRange: function NetworkPdfManager_requestRange(begin, end) { - return this.streamManager.requestRange(begin, end); - }, - - requestLoadedStream: function NetworkPdfManager_requestLoadedStream() { - this.streamManager.requestAllChunks(); - }, - - sendProgressiveData: - function NetworkPdfManager_sendProgressiveData(chunk) { - this.streamManager.onReceiveData({ chunk: chunk }); - }, - - onLoadedStream: function NetworkPdfManager_onLoadedStream() { - return this.streamManager.onLoadedStream(); - }, - - terminate: function NetworkPdfManager_terminate() { - this.streamManager.abort(); - } - }); - - return NetworkPdfManager; -})(); - -exports.LocalPdfManager = LocalPdfManager; -exports.NetworkPdfManager = NetworkPdfManager; -})); - - -(function (root, factory) { - { - factory((root.pdfjsCoreWorker = {}), root.pdfjsSharedUtil, - root.pdfjsCorePrimitives, root.pdfjsCorePdfManager, - root.pdfjsSharedGlobal); - } -}(this, function (exports, sharedUtil, corePrimitives, corePdfManager, - sharedGlobal) { - -var UNSUPPORTED_FEATURES = sharedUtil.UNSUPPORTED_FEATURES; -var InvalidPDFException = sharedUtil.InvalidPDFException; -var MessageHandler = sharedUtil.MessageHandler; -var MissingPDFException = sharedUtil.MissingPDFException; -var UnexpectedResponseException = sharedUtil.UnexpectedResponseException; -var PasswordException = sharedUtil.PasswordException; -var PasswordResponses = sharedUtil.PasswordResponses; -var UnknownErrorException = sharedUtil.UnknownErrorException; -var XRefParseException = sharedUtil.XRefParseException; -var createPromiseCapability = sharedUtil.createPromiseCapability; -var error = sharedUtil.error; -var info = sharedUtil.info; -var isInt = sharedUtil.isInt; -var warn = sharedUtil.warn; -var Ref = corePrimitives.Ref; -var LocalPdfManager = corePdfManager.LocalPdfManager; -var NetworkPdfManager = corePdfManager.NetworkPdfManager; -var globalScope = sharedGlobal.globalScope; -var PDFJS = sharedGlobal.PDFJS; - -var WorkerTask = (function WorkerTaskClosure() { - function WorkerTask(name) { - this.name = name; - this.terminated = false; - this._capability = createPromiseCapability(); - } - - WorkerTask.prototype = { - get finished() { - return this._capability.promise; - }, - - finish: function () { - this._capability.resolve(); - }, - - terminate: function () { - this.terminated = true; - }, - - ensureNotTerminated: function () { - if (this.terminated) { - throw new Error('Worker task was terminated'); - } - } - }; - - return WorkerTask; -})(); - -var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { - setup: function wphSetup(handler, port) { - var testMessageProcessed = false; - handler.on('test', function wphSetupTest(data) { - if (testMessageProcessed) { - return; // we already processed 'test' message once - } - testMessageProcessed = true; - - // check if Uint8Array can be sent to worker - if (!(data instanceof Uint8Array)) { - handler.send('test', 'main', false); - return; - } - // making sure postMessage transfers are working - var supportTransfers = data[0] === 255; - handler.postMessageTransfers = supportTransfers; - // check if the response property is supported by xhr - var xhr = new XMLHttpRequest(); - var responseExists = 'response' in xhr; - // check if the property is actually implemented - try { - var dummy = xhr.responseType; - } catch (e) { - responseExists = false; - } - if (!responseExists) { - handler.send('test', false); - return; - } - handler.send('test', { - supportTypedArray: true, - supportTransfers: supportTransfers - }); - }); - - handler.on('GetDocRequest', function wphSetupDoc(data) { - return WorkerMessageHandler.createDocumentHandler(data, port); - }); - }, - createDocumentHandler: function wphCreateDocumentHandler(docParams, port) { - // This context is actually holds references on pdfManager and handler, - // until the latter is destroyed. - var pdfManager; - var terminated = false; - var cancelXHRs = null; - var WorkerTasks = []; - - var docId = docParams.docId; - var workerHandlerName = docParams.docId + '_worker'; - var handler = new MessageHandler(workerHandlerName, docId, port); - - function ensureNotTerminated() { - if (terminated) { - throw new Error('Worker was terminated'); - } - } - - function startWorkerTask(task) { - WorkerTasks.push(task); - } - - function finishWorkerTask(task) { - task.finish(); - var i = WorkerTasks.indexOf(task); - WorkerTasks.splice(i, 1); - } - - function loadDocument(recoveryMode) { - var loadDocumentCapability = createPromiseCapability(); - - var parseSuccess = function parseSuccess() { - var numPagesPromise = pdfManager.ensureDoc('numPages'); - var fingerprintPromise = pdfManager.ensureDoc('fingerprint'); - var encryptedPromise = pdfManager.ensureXRef('encrypt'); - Promise.all([numPagesPromise, fingerprintPromise, - encryptedPromise]).then(function onDocReady(results) { - var doc = { - numPages: results[0], - fingerprint: results[1], - encrypted: !!results[2], - }; - loadDocumentCapability.resolve(doc); - }, - parseFailure); - }; - - var parseFailure = function parseFailure(e) { - loadDocumentCapability.reject(e); - }; - - pdfManager.ensureDoc('checkHeader', []).then(function() { - pdfManager.ensureDoc('parseStartXRef', []).then(function() { - pdfManager.ensureDoc('parse', [recoveryMode]).then( - parseSuccess, parseFailure); - }, parseFailure); - }, parseFailure); - - return loadDocumentCapability.promise; - } - - function getPdfManager(data) { - var pdfManagerCapability = createPromiseCapability(); - var pdfManager; - - var source = data.source; - var disableRange = data.disableRange; - if (source.data) { - try { - pdfManager = new LocalPdfManager(docId, source.data, source.password); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - return pdfManagerCapability.promise; - } else if (source.chunkedViewerLoading) { - try { - pdfManager = new NetworkPdfManager(docId, source, handler); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - return pdfManagerCapability.promise; - } - - var networkManager = new NetworkManager(source.url, { - httpHeaders: source.httpHeaders, - withCredentials: source.withCredentials - }); - var cachedChunks = []; - var fullRequestXhrId = networkManager.requestFull({ - onHeadersReceived: function onHeadersReceived() { - if (disableRange) { - return; - } - - var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId); - if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') { - return; - } - - var contentEncoding = - fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity'; - if (contentEncoding !== 'identity') { - return; - } - - var length = fullRequestXhr.getResponseHeader('Content-Length'); - length = parseInt(length, 10); - if (!isInt(length)) { - return; - } - source.length = length; - if (length <= 2 * source.rangeChunkSize) { - // The file size is smaller than the size of two chunks, so it does - // not make any sense to abort the request and retry with a range - // request. - return; - } - - if (networkManager.isStreamingRequest(fullRequestXhrId)) { - // We can continue fetching when progressive loading is enabled, - // and we don't need the autoFetch feature. - source.disableAutoFetch = true; - } else { - // NOTE: by cancelling the full request, and then issuing range - // requests, there will be an issue for sites where you can only - // request the pdf once. However, if this is the case, then the - // server should not be returning that it can support range - // requests. - networkManager.abortRequest(fullRequestXhrId); - } - - try { - pdfManager = new NetworkPdfManager(docId, source, handler); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - cancelXHRs = null; - }, - - onProgressiveData: source.disableStream ? null : - function onProgressiveData(chunk) { - if (!pdfManager) { - cachedChunks.push(chunk); - return; - } - pdfManager.sendProgressiveData(chunk); - }, - - onDone: function onDone(args) { - if (pdfManager) { - return; // already processed - } - - var pdfFile; - if (args === null) { - // TODO add some streaming manager, e.g. for unknown length files. - // The data was returned in the onProgressiveData, combining... - var pdfFileLength = 0, pos = 0; - cachedChunks.forEach(function (chunk) { - pdfFileLength += chunk.byteLength; - }); - if (source.length && pdfFileLength !== source.length) { - warn('reported HTTP length is different from actual'); - } - var pdfFileArray = new Uint8Array(pdfFileLength); - cachedChunks.forEach(function (chunk) { - pdfFileArray.set(new Uint8Array(chunk), pos); - pos += chunk.byteLength; - }); - pdfFile = pdfFileArray.buffer; - } else { - pdfFile = args.chunk; - } - - // the data is array, instantiating directly from it - try { - pdfManager = new LocalPdfManager(docId, pdfFile, source.password); - pdfManagerCapability.resolve(pdfManager); - } catch (ex) { - pdfManagerCapability.reject(ex); - } - cancelXHRs = null; - }, - - onError: function onError(status) { - var exception; - if (status === 404 || status === 0 && /^file:/.test(source.url)) { - exception = new MissingPDFException('Missing PDF "' + - source.url + '".'); - handler.send('MissingPDF', exception); - } else { - exception = new UnexpectedResponseException( - 'Unexpected server response (' + status + - ') while retrieving PDF "' + source.url + '".', status); - handler.send('UnexpectedResponse', exception); - } - cancelXHRs = null; - }, - - onProgress: function onProgress(evt) { - handler.send('DocProgress', { - loaded: evt.loaded, - total: evt.lengthComputable ? evt.total : source.length - }); - } - }); - - cancelXHRs = function () { - networkManager.abortRequest(fullRequestXhrId); - }; - - return pdfManagerCapability.promise; - } - - var setupDoc = function(data) { - var onSuccess = function(doc) { - ensureNotTerminated(); - handler.send('GetDoc', { pdfInfo: doc }); - }; - - var onFailure = function(e) { - if (e instanceof PasswordException) { - if (e.code === PasswordResponses.NEED_PASSWORD) { - handler.send('NeedPassword', e); - } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) { - handler.send('IncorrectPassword', e); - } - } else if (e instanceof InvalidPDFException) { - handler.send('InvalidPDF', e); - } else if (e instanceof MissingPDFException) { - handler.send('MissingPDF', e); - } else if (e instanceof UnexpectedResponseException) { - handler.send('UnexpectedResponse', e); - } else { - handler.send('UnknownError', - new UnknownErrorException(e.message, e.toString())); - } - }; - - ensureNotTerminated(); - - PDFJS.maxImageSize = data.maxImageSize === undefined ? - -1 : data.maxImageSize; - PDFJS.disableFontFace = data.disableFontFace; - PDFJS.disableCreateObjectURL = data.disableCreateObjectURL; - PDFJS.verbosity = data.verbosity; - PDFJS.cMapUrl = data.cMapUrl === undefined ? - null : data.cMapUrl; - PDFJS.cMapPacked = data.cMapPacked === true; - - getPdfManager(data).then(function (newPdfManager) { - if (terminated) { - // We were in a process of setting up the manager, but it got - // terminated in the middle. - newPdfManager.terminate(); - throw new Error('Worker was terminated'); - } - - pdfManager = newPdfManager; - handler.send('PDFManagerReady', null); - pdfManager.onLoadedStream().then(function(stream) { - handler.send('DataLoaded', { length: stream.bytes.byteLength }); - }); - }).then(function pdfManagerReady() { - ensureNotTerminated(); - - loadDocument(false).then(onSuccess, function loadFailure(ex) { - ensureNotTerminated(); - - // Try again with recoveryMode == true - if (!(ex instanceof XRefParseException)) { - if (ex instanceof PasswordException) { - // after password exception prepare to receive a new password - // to repeat loading - pdfManager.passwordChanged().then(pdfManagerReady); - } - - onFailure(ex); - return; - } - - pdfManager.requestLoadedStream(); - pdfManager.onLoadedStream().then(function() { - ensureNotTerminated(); - - loadDocument(true).then(onSuccess, onFailure); - }); - }, onFailure); - }, onFailure); - }; - - handler.on('GetPage', function wphSetupGetPage(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - var rotatePromise = pdfManager.ensure(page, 'rotate'); - var refPromise = pdfManager.ensure(page, 'ref'); - var viewPromise = pdfManager.ensure(page, 'view'); - - return Promise.all([rotatePromise, refPromise, viewPromise]).then( - function(results) { - return { - rotate: results[0], - ref: results[1], - view: results[2] - }; - }); - }); - }); - - handler.on('GetPageIndex', function wphSetupGetPageIndex(data) { - var ref = new Ref(data.ref.num, data.ref.gen); - var catalog = pdfManager.pdfDocument.catalog; - return catalog.getPageIndex(ref); - }); - - handler.on('GetDestinations', - function wphSetupGetDestinations(data) { - return pdfManager.ensureCatalog('destinations'); - } - ); - - handler.on('GetDestination', - function wphSetupGetDestination(data) { - return pdfManager.ensureCatalog('getDestination', [data.id]); - } - ); - - handler.on('GetPageLabels', - function wphSetupGetPageLabels(data) { - return pdfManager.ensureCatalog('pageLabels'); - } - ); - - handler.on('GetAttachments', - function wphSetupGetAttachments(data) { - return pdfManager.ensureCatalog('attachments'); - } - ); - - handler.on('GetJavaScript', - function wphSetupGetJavaScript(data) { - return pdfManager.ensureCatalog('javaScript'); - } - ); - - handler.on('GetOutline', - function wphSetupGetOutline(data) { - return pdfManager.ensureCatalog('documentOutline'); - } - ); - - handler.on('GetMetadata', - function wphSetupGetMetadata(data) { - return Promise.all([pdfManager.ensureDoc('documentInfo'), - pdfManager.ensureCatalog('metadata')]); - } - ); - - handler.on('GetData', function wphSetupGetData(data) { - pdfManager.requestLoadedStream(); - return pdfManager.onLoadedStream().then(function(stream) { - return stream.bytes; - }); - }); - - handler.on('GetStats', - function wphSetupGetStats(data) { - return pdfManager.pdfDocument.xref.stats; - } - ); - - handler.on('UpdatePassword', function wphSetupUpdatePassword(data) { - pdfManager.updatePassword(data); - }); - - handler.on('GetAnnotations', function wphSetupGetAnnotations(data) { - return pdfManager.getPage(data.pageIndex).then(function(page) { - return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]); - }); - }); - - handler.on('RenderPageRequest', function wphSetupRenderPage(data) { - var pageIndex = data.pageIndex; - pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('RenderPageRequest: page ' + pageIndex); - startWorkerTask(task); - - var pageNum = pageIndex + 1; - var start = Date.now(); - // Pre compile the pdf page and fetch the fonts/images. - page.getOperatorList(handler, task, data.intent).then( - function(operatorList) { - finishWorkerTask(task); - - info('page=' + pageNum + ' - getOperatorList: time=' + - (Date.now() - start) + 'ms, len=' + operatorList.totalLength); - }, function(e) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - - // For compatibility with older behavior, generating unknown - // unsupported feature notification on errors. - handler.send('UnsupportedFeature', - {featureId: UNSUPPORTED_FEATURES.unknown}); - - var minimumStackMessage = - 'worker.js: while trying to getPage() and getOperatorList()'; - - var wrappedException; - - // Turn the error into an obj that can be serialized - if (typeof e === 'string') { - wrappedException = { - message: e, - stack: minimumStackMessage - }; - } else if (typeof e === 'object') { - wrappedException = { - message: e.message || e.toString(), - stack: e.stack || minimumStackMessage - }; - } else { - wrappedException = { - message: 'Unknown exception type: ' + (typeof e), - stack: minimumStackMessage - }; - } - - handler.send('PageError', { - pageNum: pageNum, - error: wrappedException, - intent: data.intent - }); - }); - }); - }, this); - - handler.on('GetTextContent', function wphExtractText(data) { - var pageIndex = data.pageIndex; - var normalizeWhitespace = data.normalizeWhitespace; - return pdfManager.getPage(pageIndex).then(function(page) { - var task = new WorkerTask('GetTextContent: page ' + pageIndex); - startWorkerTask(task); - var pageNum = pageIndex + 1; - var start = Date.now(); - return page.extractTextContent(task, normalizeWhitespace).then( - function(textContent) { - finishWorkerTask(task); - info('text indexing: page=' + pageNum + ' - time=' + - (Date.now() - start) + 'ms'); - return textContent; - }, function (reason) { - finishWorkerTask(task); - if (task.terminated) { - return; // ignoring errors from the terminated thread - } - throw reason; - }); - }); - }); - - handler.on('Cleanup', function wphCleanup(data) { - return pdfManager.cleanup(); - }); - - handler.on('Terminate', function wphTerminate(data) { - terminated = true; - if (pdfManager) { - pdfManager.terminate(); - pdfManager = null; - } - if (cancelXHRs) { - cancelXHRs(); - } - - var waitOn = []; - WorkerTasks.forEach(function (task) { - waitOn.push(task.finished); - task.terminate(); - }); - - return Promise.all(waitOn).then(function () { - // Notice that even if we destroying handler, resolved response promise - // must be sent back. - handler.destroy(); - handler = null; - }); - }); - - handler.on('Ready', function wphReady(data) { - setupDoc(docParams); - docParams = null; // we don't need docParams anymore -- saving memory. - }); - return workerHandlerName; - } -}; - -function initializeWorker() { - if (!('console' in globalScope)) { - var consoleTimer = {}; - - var workerConsole = { - log: function log() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_log', - data: args - }); - }, - - error: function error() { - var args = Array.prototype.slice.call(arguments); - globalScope.postMessage({ - targetName: 'main', - action: 'console_error', - data: args - }); - throw 'pdf.js execution error'; - }, - - time: function time(name) { - consoleTimer[name] = Date.now(); - }, - - timeEnd: function timeEnd(name) { - var time = consoleTimer[name]; - if (!time) { - error('Unknown timer name ' + name); - } - this.log('Timer:', name, Date.now() - time); - } - }; - - globalScope.console = workerConsole; - } - - var handler = new MessageHandler('worker', 'main', self); - WorkerMessageHandler.setup(handler, self); - handler.send('ready', null); -} - -// Worker thread (and not node.js)? -if (typeof window === 'undefined' && - !(typeof module !== 'undefined' && module.require)) { - initializeWorker(); -} - -exports.WorkerTask = WorkerTask; -exports.WorkerMessageHandler = WorkerMessageHandler; -})); - - - }).call(pdfjsLibs); - - exports.PDFJS = pdfjsLibs.pdfjsSharedGlobal.PDFJS; - -})); - - diff --git a/public/plugins/pdfjs-1.4.20/web/compatibility.js b/public/plugins/pdfjs-1.4.20/web/compatibility.js deleted file mode 100644 index 1119a27..0000000 --- a/public/plugins/pdfjs-1.4.20/web/compatibility.js +++ /dev/null @@ -1,593 +0,0 @@ -/* Copyright 2012 Mozilla Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* globals VBArray, PDFJS */ - -'use strict'; - -// Initializing PDFJS global object here, it case if we need to change/disable -// some PDF.js features, e.g. range requests -if (typeof PDFJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).PDFJS = {}; -} - -// Checking if the typed arrays are supported -// Support: iOS<6.0 (subarray), IE<10, Android<4.0 -(function checkTypedArrayCompatibility() { - if (typeof Uint8Array !== 'undefined') { - // Support: iOS<6.0 - if (typeof Uint8Array.prototype.subarray === 'undefined') { - Uint8Array.prototype.subarray = function subarray(start, end) { - return new Uint8Array(this.slice(start, end)); - }; - Float32Array.prototype.subarray = function subarray(start, end) { - return new Float32Array(this.slice(start, end)); - }; - } - - // Support: Android<4.1 - if (typeof Float64Array === 'undefined') { - window.Float64Array = Float32Array; - } - return; - } - - function subarray(start, end) { - return new TypedArray(this.slice(start, end)); - } - - function setArrayOffset(array, offset) { - if (arguments.length < 2) { - offset = 0; - } - for (var i = 0, n = array.length; i < n; ++i, ++offset) { - this[offset] = array[i] & 0xFF; - } - } - - function TypedArray(arg1) { - var result, i, n; - if (typeof arg1 === 'number') { - result = []; - for (i = 0; i < arg1; ++i) { - result[i] = 0; - } - } else if ('slice' in arg1) { - result = arg1.slice(0); - } else { - result = []; - for (i = 0, n = arg1.length; i < n; ++i) { - result[i] = arg1[i]; - } - } - - result.subarray = subarray; - result.buffer = result; - result.byteLength = result.length; - result.set = setArrayOffset; - - if (typeof arg1 === 'object' && arg1.buffer) { - result.buffer = arg1.buffer; - } - return result; - } - - window.Uint8Array = TypedArray; - window.Int8Array = TypedArray; - - // we don't need support for set, byteLength for 32-bit array - // so we can use the TypedArray as well - window.Uint32Array = TypedArray; - window.Int32Array = TypedArray; - window.Uint16Array = TypedArray; - window.Float32Array = TypedArray; - window.Float64Array = TypedArray; -})(); - -// URL = URL || webkitURL -// Support: Safari<7, Android 4.2+ -(function normalizeURLObject() { - if (!window.URL) { - window.URL = window.webkitURL; - } -})(); - -// Object.defineProperty()? -// Support: Android<4.0, Safari<5.1 -(function checkObjectDefinePropertyCompatibility() { - if (typeof Object.defineProperty !== 'undefined') { - var definePropertyPossible = true; - try { - // some browsers (e.g. safari) cannot use defineProperty() on DOM objects - // and thus the native version is not sufficient - Object.defineProperty(new Image(), 'id', { value: 'test' }); - // ... another test for android gb browser for non-DOM objects - var Test = function Test() {}; - Test.prototype = { get id() { } }; - Object.defineProperty(new Test(), 'id', - { value: '', configurable: true, enumerable: true, writable: false }); - } catch (e) { - definePropertyPossible = false; - } - if (definePropertyPossible) { - return; - } - } - - Object.defineProperty = function objectDefineProperty(obj, name, def) { - delete obj[name]; - if ('get' in def) { - obj.__defineGetter__(name, def['get']); - } - if ('set' in def) { - obj.__defineSetter__(name, def['set']); - } - if ('value' in def) { - obj.__defineSetter__(name, function objectDefinePropertySetter(value) { - this.__defineGetter__(name, function objectDefinePropertyGetter() { - return value; - }); - return value; - }); - obj[name] = def.value; - } - }; -})(); - - -// No XMLHttpRequest#response? -// Support: IE<11, Android <4.0 -(function checkXMLHttpRequestResponseCompatibility() { - var xhrPrototype = XMLHttpRequest.prototype; - var xhr = new XMLHttpRequest(); - if (!('overrideMimeType' in xhr)) { - // IE10 might have response, but not overrideMimeType - // Support: IE10 - Object.defineProperty(xhrPrototype, 'overrideMimeType', { - value: function xmlHttpRequestOverrideMimeType(mimeType) {} - }); - } - if ('responseType' in xhr) { - return; - } - - // The worker will be using XHR, so we can save time and disable worker. - PDFJS.disableWorker = true; - - Object.defineProperty(xhrPrototype, 'responseType', { - get: function xmlHttpRequestGetResponseType() { - return this._responseType || 'text'; - }, - set: function xmlHttpRequestSetResponseType(value) { - if (value === 'text' || value === 'arraybuffer') { - this._responseType = value; - if (value === 'arraybuffer' && - typeof this.overrideMimeType === 'function') { - this.overrideMimeType('text/plain; charset=x-user-defined'); - } - } - } - }); - - // Support: IE9 - if (typeof VBArray !== 'undefined') { - Object.defineProperty(xhrPrototype, 'response', { - get: function xmlHttpRequestResponseGet() { - if (this.responseType === 'arraybuffer') { - return new Uint8Array(new VBArray(this.responseBody).toArray()); - } else { - return this.responseText; - } - } - }); - return; - } - - Object.defineProperty(xhrPrototype, 'response', { - get: function xmlHttpRequestResponseGet() { - if (this.responseType !== 'arraybuffer') { - return this.responseText; - } - var text = this.responseText; - var i, n = text.length; - var result = new Uint8Array(n); - for (i = 0; i < n; ++i) { - result[i] = text.charCodeAt(i) & 0xFF; - } - return result.buffer; - } - }); -})(); - -// window.btoa (base64 encode function) ? -// Support: IE<10 -(function checkWindowBtoaCompatibility() { - if ('btoa' in window) { - return; - } - - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - window.btoa = function windowBtoa(chars) { - var buffer = ''; - var i, n; - for (i = 0, n = chars.length; i < n; i += 3) { - var b1 = chars.charCodeAt(i) & 0xFF; - var b2 = chars.charCodeAt(i + 1) & 0xFF; - var b3 = chars.charCodeAt(i + 2) & 0xFF; - var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); - var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; - var d4 = i + 2 < n ? (b3 & 0x3F) : 64; - buffer += (digits.charAt(d1) + digits.charAt(d2) + - digits.charAt(d3) + digits.charAt(d4)); - } - return buffer; - }; -})(); - -// window.atob (base64 encode function)? -// Support: IE<10 -(function checkWindowAtobCompatibility() { - if ('atob' in window) { - return; - } - - // https://github.com/davidchambers/Base64.js - var digits = - 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - window.atob = function (input) { - input = input.replace(/=+$/, ''); - if (input.length % 4 === 1) { - throw new Error('bad atob input'); - } - for ( - // initialize result and counters - var bc = 0, bs, buffer, idx = 0, output = ''; - // get next character - buffer = input.charAt(idx++); - // character found in table? - // initialize bit storage and add its ascii value - ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, - // and if not first of each 4 characters, - // convert the first 8 bits to one ascii character - bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 - ) { - // try to find character in table (0-63, not found => -1) - buffer = digits.indexOf(buffer); - } - return output; - }; -})(); - -// Function.prototype.bind? -// Support: Android<4.0, iOS<6.0 -(function checkFunctionPrototypeBindCompatibility() { - if (typeof Function.prototype.bind !== 'undefined') { - return; - } - - Function.prototype.bind = function functionPrototypeBind(obj) { - var fn = this, headArgs = Array.prototype.slice.call(arguments, 1); - var bound = function functionPrototypeBindBound() { - var args = headArgs.concat(Array.prototype.slice.call(arguments)); - return fn.apply(obj, args); - }; - return bound; - }; -})(); - -// HTMLElement dataset property -// Support: IE<11, Safari<5.1, Android<4.0 -(function checkDatasetProperty() { - var div = document.createElement('div'); - if ('dataset' in div) { - return; // dataset property exists - } - - Object.defineProperty(HTMLElement.prototype, 'dataset', { - get: function() { - if (this._dataset) { - return this._dataset; - } - - var dataset = {}; - for (var j = 0, jj = this.attributes.length; j < jj; j++) { - var attribute = this.attributes[j]; - if (attribute.name.substring(0, 5) !== 'data-') { - continue; - } - var key = attribute.name.substring(5).replace(/\-([a-z])/g, - function(all, ch) { - return ch.toUpperCase(); - }); - dataset[key] = attribute.value; - } - - Object.defineProperty(this, '_dataset', { - value: dataset, - writable: false, - enumerable: false - }); - return dataset; - }, - enumerable: true - }); -})(); - -// HTMLElement classList property -// Support: IE<10, Android<4.0, iOS<5.0 -(function checkClassListProperty() { - var div = document.createElement('div'); - if ('classList' in div) { - return; // classList property exists - } - - function changeList(element, itemName, add, remove) { - var s = element.className || ''; - var list = s.split(/\s+/g); - if (list[0] === '') { - list.shift(); - } - var index = list.indexOf(itemName); - if (index < 0 && add) { - list.push(itemName); - } - if (index >= 0 && remove) { - list.splice(index, 1); - } - element.className = list.join(' '); - return (index >= 0); - } - - var classListPrototype = { - add: function(name) { - changeList(this.element, name, true, false); - }, - contains: function(name) { - return changeList(this.element, name, false, false); - }, - remove: function(name) { - changeList(this.element, name, false, true); - }, - toggle: function(name) { - changeList(this.element, name, true, true); - } - }; - - Object.defineProperty(HTMLElement.prototype, 'classList', { - get: function() { - if (this._classList) { - return this._classList; - } - - var classList = Object.create(classListPrototype, { - element: { - value: this, - writable: false, - enumerable: true - } - }); - Object.defineProperty(this, '_classList', { - value: classList, - writable: false, - enumerable: false - }); - return classList; - }, - enumerable: true - }); -})(); - -// Check console compatibility -// In older IE versions the console object is not available -// unless console is open. -// Support: IE<10 -(function checkConsoleCompatibility() { - if (!('console' in window)) { - window.console = { - log: function() {}, - error: function() {}, - warn: function() {} - }; - } else if (!('bind' in console.log)) { - // native functions in IE9 might not have bind - console.log = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.log); - console.error = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.error); - console.warn = (function(fn) { - return function(msg) { return fn(msg); }; - })(console.warn); - } -})(); - -// Check onclick compatibility in Opera -// Support: Opera<15 -(function checkOnClickCompatibility() { - // workaround for reported Opera bug DSK-354448: - // onclick fires on disabled buttons with opaque content - function ignoreIfTargetDisabled(event) { - if (isDisabled(event.target)) { - event.stopPropagation(); - } - } - function isDisabled(node) { - return node.disabled || (node.parentNode && isDisabled(node.parentNode)); - } - if (navigator.userAgent.indexOf('Opera') !== -1) { - // use browser detection since we cannot feature-check this bug - document.addEventListener('click', ignoreIfTargetDisabled, true); - } -})(); - -// Checks if possible to use URL.createObjectURL() -// Support: IE -(function checkOnBlobSupport() { - // sometimes IE loosing the data created with createObjectURL(), see #3977 - if (navigator.userAgent.indexOf('Trident') >= 0) { - PDFJS.disableCreateObjectURL = true; - } -})(); - -// Checks if navigator.language is supported -(function checkNavigatorLanguage() { - if ('language' in navigator) { - return; - } - PDFJS.locale = navigator.userLanguage || 'en-US'; -})(); - -(function checkRangeRequests() { - // Safari has issues with cached range requests see: - // https://github.com/mozilla/pdf.js/issues/3260 - // Last tested with version 6.0.4. - // Support: Safari 6.0+ - var isSafari = Object.prototype.toString.call( - window.HTMLElement).indexOf('Constructor') > 0; - - // Older versions of Android (pre 3.0) has issues with range requests, see: - // https://github.com/mozilla/pdf.js/issues/3381. - // Make sure that we only match webkit-based Android browsers, - // since Firefox/Fennec works as expected. - // Support: Android<3.0 - var regex = /Android\s[0-2][^\d]/; - var isOldAndroid = regex.test(navigator.userAgent); - - // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318 - var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent); - - if (isSafari || isOldAndroid || isChromeWithRangeBug) { - PDFJS.disableRange = true; - PDFJS.disableStream = true; - } -})(); - -// Check if the browser supports manipulation of the history. -// Support: IE<10, Android<4.2 -(function checkHistoryManipulation() { - // Android 2.x has so buggy pushState support that it was removed in - // Android 3.0 and restored as late as in Android 4.2. - // Support: Android 2.x - if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) { - PDFJS.disableHistory = true; - } -})(); - -// Support: IE<11, Chrome<21, Android<4.4, Safari<6 -(function checkSetPresenceInImageData() { - // IE < 11 will use window.CanvasPixelArray which lacks set function. - if (window.CanvasPixelArray) { - if (typeof window.CanvasPixelArray.prototype.set !== 'function') { - window.CanvasPixelArray.prototype.set = function(arr) { - for (var i = 0, ii = this.length; i < ii; i++) { - this[i] = arr[i]; - } - }; - } - } else { - // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. - // Because we cannot feature detect it, we rely on user agent parsing. - var polyfill = false, versionMatch; - if (navigator.userAgent.indexOf('Chrom') >= 0) { - versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); - // Chrome < 21 lacks the set function. - polyfill = versionMatch && parseInt(versionMatch[2]) < 21; - } else if (navigator.userAgent.indexOf('Android') >= 0) { - // Android < 4.4 lacks the set function. - // Android >= 4.4 will contain Chrome in the user agent, - // thus pass the Chrome check above and not reach this block. - polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent); - } else if (navigator.userAgent.indexOf('Safari') >= 0) { - versionMatch = navigator.userAgent. - match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); - // Safari < 6 lacks the set function. - polyfill = versionMatch && parseInt(versionMatch[1]) < 6; - } - - if (polyfill) { - var contextPrototype = window.CanvasRenderingContext2D.prototype; - var createImageData = contextPrototype.createImageData; - contextPrototype.createImageData = function(w, h) { - var imageData = createImageData.call(this, w, h); - imageData.data.set = function(arr) { - for (var i = 0, ii = this.length; i < ii; i++) { - this[i] = arr[i]; - } - }; - return imageData; - }; - // this closure will be kept referenced, so clear its vars - contextPrototype = null; - } - } -})(); - -// Support: IE<10, Android<4.0, iOS -(function checkRequestAnimationFrame() { - function fakeRequestAnimationFrame(callback) { - window.setTimeout(callback, 20); - } - - var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); - if (isIOS) { - // requestAnimationFrame on iOS is broken, replacing with fake one. - window.requestAnimationFrame = fakeRequestAnimationFrame; - return; - } - if ('requestAnimationFrame' in window) { - return; - } - window.requestAnimationFrame = - window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || - fakeRequestAnimationFrame; -})(); - -(function checkCanvasSizeLimitation() { - var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); - var isAndroid = /Android/g.test(navigator.userAgent); - if (isIOS || isAndroid) { - // 5MP - PDFJS.maxCanvasPixels = 5242880; - } -})(); - -// Disable fullscreen support for certain problematic configurations. -// Support: IE11+ (when embedded). -(function checkFullscreenSupport() { - var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 && - window.parent !== window); - if (isEmbeddedIE) { - PDFJS.disableFullscreen = true; - } -})(); - -// Provides document.currentScript support -// Support: IE, Chrome<29. -(function checkCurrentScript() { - if ('currentScript' in document) { - return; - } - Object.defineProperty(document, 'currentScript', { - get: function () { - var scripts = document.getElementsByTagName('script'); - return scripts[scripts.length - 1]; - }, - enumerable: true, - configurable: true - }); -})(); diff --git a/public/plugins/pdfjs-1.4.20/web/debugger.js b/public/plugins/pdfjs-1.4.20/web/debugger.js deleted file mode 100644 index 9c35b63..0000000 --- a/public/plugins/pdfjs-1.4.20/web/debugger.js +++ /dev/null @@ -1,618 +0,0 @@ -/* Copyright 2012 Mozilla Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* globals PDFJS */ - -'use strict'; - -var FontInspector = (function FontInspectorClosure() { - var fonts; - var active = false; - var fontAttribute = 'data-font-name'; - function removeSelection() { - var divs = document.querySelectorAll('div[' + fontAttribute + ']'); - for (var i = 0, ii = divs.length; i < ii; ++i) { - var div = divs[i]; - div.className = ''; - } - } - function resetSelection() { - var divs = document.querySelectorAll('div[' + fontAttribute + ']'); - for (var i = 0, ii = divs.length; i < ii; ++i) { - var div = divs[i]; - div.className = 'debuggerHideText'; - } - } - function selectFont(fontName, show) { - var divs = document.querySelectorAll('div[' + fontAttribute + '=' + - fontName + ']'); - for (var i = 0, ii = divs.length; i < ii; ++i) { - var div = divs[i]; - div.className = show ? 'debuggerShowText' : 'debuggerHideText'; - } - } - function textLayerClick(e) { - if (!e.target.dataset.fontName || - e.target.tagName.toUpperCase() !== 'DIV') { - return; - } - var fontName = e.target.dataset.fontName; - var selects = document.getElementsByTagName('input'); - for (var i = 0; i < selects.length; ++i) { - var select = selects[i]; - if (select.dataset.fontName !== fontName) { - continue; - } - select.checked = !select.checked; - selectFont(fontName, select.checked); - select.scrollIntoView(); - } - } - return { - // Properties/functions needed by PDFBug. - id: 'FontInspector', - name: 'Font Inspector', - panel: null, - manager: null, - init: function init() { - var panel = this.panel; - panel.setAttribute('style', 'padding: 5px;'); - var tmp = document.createElement('button'); - tmp.addEventListener('click', resetSelection); - tmp.textContent = 'Refresh'; - panel.appendChild(tmp); - - fonts = document.createElement('div'); - panel.appendChild(fonts); - }, - cleanup: function cleanup() { - fonts.textContent = ''; - }, - enabled: false, - get active() { - return active; - }, - set active(value) { - active = value; - if (active) { - document.body.addEventListener('click', textLayerClick, true); - resetSelection(); - } else { - document.body.removeEventListener('click', textLayerClick, true); - removeSelection(); - } - }, - // FontInspector specific functions. - fontAdded: function fontAdded(fontObj, url) { - function properties(obj, list) { - var moreInfo = document.createElement('table'); - for (var i = 0; i < list.length; i++) { - var tr = document.createElement('tr'); - var td1 = document.createElement('td'); - td1.textContent = list[i]; - tr.appendChild(td1); - var td2 = document.createElement('td'); - td2.textContent = obj[list[i]].toString(); - tr.appendChild(td2); - moreInfo.appendChild(tr); - } - return moreInfo; - } - var moreInfo = properties(fontObj, ['name', 'type']); - var fontName = fontObj.loadedName; - var font = document.createElement('div'); - var name = document.createElement('span'); - name.textContent = fontName; - var download = document.createElement('a'); - if (url) { - url = /url\(['"]?([^\)"']+)/.exec(url); - download.href = url[1]; - } else if (fontObj.data) { - url = URL.createObjectURL(new Blob([fontObj.data], { - type: fontObj.mimeType - })); - download.href = url; - } - download.textContent = 'Download'; - var logIt = document.createElement('a'); - logIt.href = ''; - logIt.textContent = 'Log'; - logIt.addEventListener('click', function(event) { - event.preventDefault(); - console.log(fontObj); - }); - var select = document.createElement('input'); - select.setAttribute('type', 'checkbox'); - select.dataset.fontName = fontName; - select.addEventListener('click', (function(select, fontName) { - return (function() { - selectFont(fontName, select.checked); - }); - })(select, fontName)); - font.appendChild(select); - font.appendChild(name); - font.appendChild(document.createTextNode(' ')); - font.appendChild(download); - font.appendChild(document.createTextNode(' ')); - font.appendChild(logIt); - font.appendChild(moreInfo); - fonts.appendChild(font); - // Somewhat of a hack, should probably add a hook for when the text layer - // is done rendering. - setTimeout(function() { - if (this.active) { - resetSelection(); - } - }.bind(this), 2000); - } - }; -})(); - -// Manages all the page steppers. -var StepperManager = (function StepperManagerClosure() { - var steppers = []; - var stepperDiv = null; - var stepperControls = null; - var stepperChooser = null; - var breakPoints = {}; - return { - // Properties/functions needed by PDFBug. - id: 'Stepper', - name: 'Stepper', - panel: null, - manager: null, - init: function init() { - var self = this; - this.panel.setAttribute('style', 'padding: 5px;'); - stepperControls = document.createElement('div'); - stepperChooser = document.createElement('select'); - stepperChooser.addEventListener('change', function(event) { - self.selectStepper(this.value); - }); - stepperControls.appendChild(stepperChooser); - stepperDiv = document.createElement('div'); - this.panel.appendChild(stepperControls); - this.panel.appendChild(stepperDiv); - if (sessionStorage.getItem('pdfjsBreakPoints')) { - breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints')); - } - }, - cleanup: function cleanup() { - stepperChooser.textContent = ''; - stepperDiv.textContent = ''; - steppers = []; - }, - enabled: false, - active: false, - // Stepper specific functions. - create: function create(pageIndex) { - var debug = document.createElement('div'); - debug.id = 'stepper' + pageIndex; - debug.setAttribute('hidden', true); - debug.className = 'stepper'; - stepperDiv.appendChild(debug); - var b = document.createElement('option'); - b.textContent = 'Page ' + (pageIndex + 1); - b.value = pageIndex; - stepperChooser.appendChild(b); - var initBreakPoints = breakPoints[pageIndex] || []; - var stepper = new Stepper(debug, pageIndex, initBreakPoints); - steppers.push(stepper); - if (steppers.length === 1) { - this.selectStepper(pageIndex, false); - } - return stepper; - }, - selectStepper: function selectStepper(pageIndex, selectPanel) { - var i; - pageIndex = pageIndex | 0; - if (selectPanel) { - this.manager.selectPanel(this); - } - for (i = 0; i < steppers.length; ++i) { - var stepper = steppers[i]; - if (stepper.pageIndex === pageIndex) { - stepper.panel.removeAttribute('hidden'); - } else { - stepper.panel.setAttribute('hidden', true); - } - } - var options = stepperChooser.options; - for (i = 0; i < options.length; ++i) { - var option = options[i]; - option.selected = (option.value | 0) === pageIndex; - } - }, - saveBreakPoints: function saveBreakPoints(pageIndex, bps) { - breakPoints[pageIndex] = bps; - sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints)); - } - }; -})(); - -// The stepper for each page's IRQueue. -var Stepper = (function StepperClosure() { - // Shorter way to create element and optionally set textContent. - function c(tag, textContent) { - var d = document.createElement(tag); - if (textContent) { - d.textContent = textContent; - } - return d; - } - - var opMap = null; - - function simplifyArgs(args) { - if (typeof args === 'string') { - var MAX_STRING_LENGTH = 75; - return args.length <= MAX_STRING_LENGTH ? args : - args.substr(0, MAX_STRING_LENGTH) + '...'; - } - if (typeof args !== 'object' || args === null) { - return args; - } - if ('length' in args) { // array - var simpleArgs = [], i, ii; - var MAX_ITEMS = 10; - for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) { - simpleArgs.push(simplifyArgs(args[i])); - } - if (i < args.length) { - simpleArgs.push('...'); - } - return simpleArgs; - } - var simpleObj = {}; - for (var key in args) { - simpleObj[key] = simplifyArgs(args[key]); - } - return simpleObj; - } - - function Stepper(panel, pageIndex, initialBreakPoints) { - this.panel = panel; - this.breakPoint = 0; - this.nextBreakPoint = null; - this.pageIndex = pageIndex; - this.breakPoints = initialBreakPoints; - this.currentIdx = -1; - this.operatorListIdx = 0; - } - Stepper.prototype = { - init: function init() { - var panel = this.panel; - var content = c('div', 'c=continue, s=step'); - var table = c('table'); - content.appendChild(table); - table.cellSpacing = 0; - var headerRow = c('tr'); - table.appendChild(headerRow); - headerRow.appendChild(c('th', 'Break')); - headerRow.appendChild(c('th', 'Idx')); - headerRow.appendChild(c('th', 'fn')); - headerRow.appendChild(c('th', 'args')); - panel.appendChild(content); - this.table = table; - if (!opMap) { - opMap = Object.create(null); - for (var key in PDFJS.OPS) { - opMap[PDFJS.OPS[key]] = key; - } - } - }, - updateOperatorList: function updateOperatorList(operatorList) { - var self = this; - - function cboxOnClick() { - var x = +this.dataset.idx; - if (this.checked) { - self.breakPoints.push(x); - } else { - self.breakPoints.splice(self.breakPoints.indexOf(x), 1); - } - StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints); - } - - var MAX_OPERATORS_COUNT = 15000; - if (this.operatorListIdx > MAX_OPERATORS_COUNT) { - return; - } - - var chunk = document.createDocumentFragment(); - var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT, - operatorList.fnArray.length); - for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) { - var line = c('tr'); - line.className = 'line'; - line.dataset.idx = i; - chunk.appendChild(line); - var checked = this.breakPoints.indexOf(i) !== -1; - var args = operatorList.argsArray[i] || []; - - var breakCell = c('td'); - var cbox = c('input'); - cbox.type = 'checkbox'; - cbox.className = 'points'; - cbox.checked = checked; - cbox.dataset.idx = i; - cbox.onclick = cboxOnClick; - - breakCell.appendChild(cbox); - line.appendChild(breakCell); - line.appendChild(c('td', i.toString())); - var fn = opMap[operatorList.fnArray[i]]; - var decArgs = args; - if (fn === 'showText') { - var glyphs = args[0]; - var newArgs = []; - var str = []; - for (var j = 0; j < glyphs.length; j++) { - var glyph = glyphs[j]; - if (typeof glyph === 'object' && glyph !== null) { - str.push(glyph.fontChar); - } else { - if (str.length > 0) { - newArgs.push(str.join('')); - str = []; - } - newArgs.push(glyph); // null or number - } - } - if (str.length > 0) { - newArgs.push(str.join('')); - } - decArgs = [newArgs]; - } - line.appendChild(c('td', fn)); - line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs)))); - } - if (operatorsToDisplay < operatorList.fnArray.length) { - line = c('tr'); - var lastCell = c('td', '...'); - lastCell.colspan = 4; - chunk.appendChild(lastCell); - } - this.operatorListIdx = operatorList.fnArray.length; - this.table.appendChild(chunk); - }, - getNextBreakPoint: function getNextBreakPoint() { - this.breakPoints.sort(function(a, b) { return a - b; }); - for (var i = 0; i < this.breakPoints.length; i++) { - if (this.breakPoints[i] > this.currentIdx) { - return this.breakPoints[i]; - } - } - return null; - }, - breakIt: function breakIt(idx, callback) { - StepperManager.selectStepper(this.pageIndex, true); - var self = this; - var dom = document; - self.currentIdx = idx; - var listener = function(e) { - switch (e.keyCode) { - case 83: // step - dom.removeEventListener('keydown', listener, false); - self.nextBreakPoint = self.currentIdx + 1; - self.goTo(-1); - callback(); - break; - case 67: // continue - dom.removeEventListener('keydown', listener, false); - var breakPoint = self.getNextBreakPoint(); - self.nextBreakPoint = breakPoint; - self.goTo(-1); - callback(); - break; - } - }; - dom.addEventListener('keydown', listener, false); - self.goTo(idx); - }, - goTo: function goTo(idx) { - var allRows = this.panel.getElementsByClassName('line'); - for (var x = 0, xx = allRows.length; x < xx; ++x) { - var row = allRows[x]; - if ((row.dataset.idx | 0) === idx) { - row.style.backgroundColor = 'rgb(251,250,207)'; - row.scrollIntoView(); - } else { - row.style.backgroundColor = null; - } - } - } - }; - return Stepper; -})(); - -var Stats = (function Stats() { - var stats = []; - function clear(node) { - while (node.hasChildNodes()) { - node.removeChild(node.lastChild); - } - } - function getStatIndex(pageNumber) { - for (var i = 0, ii = stats.length; i < ii; ++i) { - if (stats[i].pageNumber === pageNumber) { - return i; - } - } - return false; - } - return { - // Properties/functions needed by PDFBug. - id: 'Stats', - name: 'Stats', - panel: null, - manager: null, - init: function init() { - this.panel.setAttribute('style', 'padding: 5px;'); - PDFJS.enableStats = true; - }, - enabled: false, - active: false, - // Stats specific functions. - add: function(pageNumber, stat) { - if (!stat) { - return; - } - var statsIndex = getStatIndex(pageNumber); - if (statsIndex !== false) { - var b = stats[statsIndex]; - this.panel.removeChild(b.div); - stats.splice(statsIndex, 1); - } - var wrapper = document.createElement('div'); - wrapper.className = 'stats'; - var title = document.createElement('div'); - title.className = 'title'; - title.textContent = 'Page: ' + pageNumber; - var statsDiv = document.createElement('div'); - statsDiv.textContent = stat.toString(); - wrapper.appendChild(title); - wrapper.appendChild(statsDiv); - stats.push({ pageNumber: pageNumber, div: wrapper }); - stats.sort(function(a, b) { return a.pageNumber - b.pageNumber; }); - clear(this.panel); - for (var i = 0, ii = stats.length; i < ii; ++i) { - this.panel.appendChild(stats[i].div); - } - }, - cleanup: function () { - stats = []; - clear(this.panel); - } - }; -})(); - -// Manages all the debugging tools. -var PDFBug = (function PDFBugClosure() { - var panelWidth = 300; - var buttons = []; - var activePanel = null; - - return { - tools: [ - FontInspector, - StepperManager, - Stats - ], - enable: function(ids) { - var all = false, tools = this.tools; - if (ids.length === 1 && ids[0] === 'all') { - all = true; - } - for (var i = 0; i < tools.length; ++i) { - var tool = tools[i]; - if (all || ids.indexOf(tool.id) !== -1) { - tool.enabled = true; - } - } - if (!all) { - // Sort the tools by the order they are enabled. - tools.sort(function(a, b) { - var indexA = ids.indexOf(a.id); - indexA = indexA < 0 ? tools.length : indexA; - var indexB = ids.indexOf(b.id); - indexB = indexB < 0 ? tools.length : indexB; - return indexA - indexB; - }); - } - }, - init: function init() { - /* - * Basic Layout: - * PDFBug - * Controls - * Panels - * Panel - * Panel - * ... - */ - var ui = document.createElement('div'); - ui.id = 'PDFBug'; - - var controls = document.createElement('div'); - controls.setAttribute('class', 'controls'); - ui.appendChild(controls); - - var panels = document.createElement('div'); - panels.setAttribute('class', 'panels'); - ui.appendChild(panels); - - var container = document.getElementById('viewerContainer'); - container.appendChild(ui); - container.style.right = panelWidth + 'px'; - - // Initialize all the debugging tools. - var tools = this.tools; - var self = this; - for (var i = 0; i < tools.length; ++i) { - var tool = tools[i]; - var panel = document.createElement('div'); - var panelButton = document.createElement('button'); - panelButton.textContent = tool.name; - panelButton.addEventListener('click', (function(selected) { - return function(event) { - event.preventDefault(); - self.selectPanel(selected); - }; - })(i)); - controls.appendChild(panelButton); - panels.appendChild(panel); - tool.panel = panel; - tool.manager = this; - if (tool.enabled) { - tool.init(); - } else { - panel.textContent = tool.name + ' is disabled. To enable add ' + - ' "' + tool.id + '" to the pdfBug parameter ' + - 'and refresh (seperate multiple by commas).'; - } - buttons.push(panelButton); - } - this.selectPanel(0); - }, - cleanup: function cleanup() { - for (var i = 0, ii = this.tools.length; i < ii; i++) { - if (this.tools[i].enabled) { - this.tools[i].cleanup(); - } - } - }, - selectPanel: function selectPanel(index) { - if (typeof index !== 'number') { - index = this.tools.indexOf(index); - } - if (index === activePanel) { - return; - } - activePanel = index; - var tools = this.tools; - for (var j = 0; j < tools.length; ++j) { - if (j === index) { - buttons[j].setAttribute('class', 'active'); - tools[j].active = true; - tools[j].panel.removeAttribute('hidden'); - } else { - buttons[j].setAttribute('class', ''); - tools[j].active = false; - tools[j].panel.setAttribute('hidden', 'true'); - } - } - } - }; -})(); diff --git a/public/plugins/pdfjs-1.4.20/web/images/annotation-check.svg b/public/plugins/pdfjs-1.4.20/web/images/annotation-check.svg deleted file mode 100644 index 71cd16d..0000000 --- a/public/plugins/pdfjs-1.4.20/web/images/annotation-check.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/public/plugins/pdfjs-1.4.20/web/images/annotation-comment.svg b/public/plugins/pdfjs-1.4.20/web/images/annotation-comment.svg deleted file mode 100644 index 86f1f17..0000000 --- a/public/plugins/pdfjs-1.4.20/web/images/annotation-comment.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/public/plugins/pdfjs-1.4.20/web/images/annotation-help.svg b/public/plugins/pdfjs-1.4.20/web/images/annotation-help.svg deleted file mode 100644 index 00938fe..0000000 --- a/public/plugins/pdfjs-1.4.20/web/images/annotation-help.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - diff --git a/public/plugins/pdfjs-1.4.20/web/images/annotation-insert.svg b/public/plugins/pdfjs-1.4.20/web/images/annotation-insert.svg deleted file mode 100644 index 519ef68..0000000 --- a/public/plugins/pdfjs-1.4.20/web/images/annotation-insert.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/public/plugins/pdfjs-1.4.20/web/images/annotation-key.svg b/public/plugins/pdfjs-1.4.20/web/images/annotation-key.svg deleted file mode 100644 index 8d09d53..0000000 --- a/public/plugins/pdfjs-1.4.20/web/images/annotation-key.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/public/plugins/pdfjs-1.4.20/web/images/annotation-newparagraph.svg b/public/plugins/pdfjs-1.4.20/web/images/annotation-newparagraph.svg deleted file mode 100644 index 38d2497..0000000 --- a/public/plugins/pdfjs-1.4.20/web/images/annotation-newparagraph.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/public/plugins/pdfjs-1.4.20/web/images/annotation-noicon.svg b/public/plugins/pdfjs-1.4.20/web/images/annotation-noicon.svg deleted file mode 100644 index c07d108..0000000 --- a/public/plugins/pdfjs-1.4.20/web/images/annotation-noicon.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/public/plugins/pdfjs-1.4.20/web/images/annotation-note.svg b/public/plugins/pdfjs-1.4.20/web/images/annotation-note.svg deleted file mode 100644 index 7017365..0000000 --- a/public/plugins/pdfjs-1.4.20/web/images/annotation-note.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - diff --git a/public/plugins/pdfjs-1.4.20/web/images/annotation-paragraph.svg b/public/plugins/pdfjs-1.4.20/web/images/annotation-paragraph.svg deleted file mode 100644 index 6ae5212..0000000 --- a/public/plugins/pdfjs-1.4.20/web/images/annotation-paragraph.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next-rtl.png b/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next-rtl.png deleted file mode 100644 index bef02743fc108697e14e0e5daab8181f7ef91dd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6`aE46Ln;`jUU1|(WFXM`uzZfwf<{~}+$G0pUl&6i=kdI{(<22WQ%mvv4FO#q)8O6mXr diff --git a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next-rtl@2x.png b/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next-rtl@2x.png deleted file mode 100644 index 1da6dc949cd6451c2d8ea39e1618d0323d2e1ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmV-00nh%4P)kdg0002@NklJ%mRW)o*bZ%{dl2K@N_?~eFJnrG5D`)>eWA=I9=*xrZ>GuI z4!;9U26Pv$_Z4XH%%iCpph2GpV-c{*6Zhs6SfR_EJq5;V+?sh4&K}p+ z6sU+@u52lw#15CH6i}kr=3>#xgHlS7GA$J0E366+j!0VQ&&@3-ef{(7H#?13Ev59AjB0000QONN1jjx$vyv5uZYI@G&FX~xujj12+YK~w v*fr|J-NDGo&9wKH*qTY?mdrSMOX2+jbf@g_m202_00000NkvXXu0mjfGEh>( diff --git a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next@2x.png b/public/plugins/pdfjs-1.4.20/web/images/findbarButton-next@2x.png deleted file mode 100644 index 0250307c0d10b0c0a38a8381361ec265ef3080c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmV+@0oVSCP)kdg0002*NklD^w4Rl6cnRtQcFE3nm0&QVWiRnO%{h3-*x?K4w z&|kYa uWt-+4V4d~Up94HjH;lQ?oa>Bv?A`$+U7<=?MIved0000QONN1jjx$vyv5uZYI@G&FX~xujj12+YK~w v*fr|J-NDGo&9wKH*qTY?mdrSMOX2+jbf@g_m202_00000NkvXXu0mjfGEh>( diff --git a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous-rtl@2x.png b/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous-rtl@2x.png deleted file mode 100644 index 0250307c0d10b0c0a38a8381361ec265ef3080c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmV+@0oVSCP)kdg0002*NklD^w4Rl6cnRtQcFE3nm0&QVWiRnO%{h3-*x?K4w z&|kYa uWt-+4V4d~Up94HjH;lQ?oa>Bv?A`$+U7<=?MIved0000fwf<{~}+$G0pUl&6i=kdI{(<22WQ%mvv4FO#q)8O6mXr diff --git a/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous@2x.png b/public/plugins/pdfjs-1.4.20/web/images/findbarButton-previous@2x.png deleted file mode 100644 index 1da6dc949cd6451c2d8ea39e1618d0323d2e1ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmV-00nh%4P)kdg0002@NklJ%mRW)o*bZ%{dl2K@N_?~eFJnrG5D`)>eWA=I9=*xrZ>GuI z4!;9U26Pv$_Z4XH%%iCpph2GpV-c{*6Zhs6SfR_EJq5;V+?sh4&K}p+ z6sU+@u52lw#15CH6i}kr=3>#xgHlS7GA$J0E366+j!0VQ&&@3-ef{(7H#?13Ev59AjB0000G{p)>hLyxD99 z76ej)=-vic0UL9~!GgO~9_MsOnufoUx`QHG)5E@a!o?nT8@#*2`fMlI9X~2&%Qwtd fAElzRww7{H`T9z)QIL|gUwP@h-(DMO`2YPI1=f8x diff --git a/public/plugins/pdfjs-1.4.20/web/images/grabbing.cur b/public/plugins/pdfjs-1.4.20/web/images/grabbing.cur deleted file mode 100644 index e0dfd04e4d3fcbaa6588c8cbb9e9065609bcb862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmZQzU}9ioP*7lC;0HnjMg|5k1_lNVAO;FCH~=vt5Q0Dhn8YOh|NoCEh)sn30RsaF z^8>N`2L=Xv5dHz=L$Uk|1_tQ_266z<4TQl5{{R0$_yG_fVE_NW0fd=>Y#@FBr9t9P K<`XsxO$7j30D*Y` diff --git a/public/plugins/pdfjs-1.4.20/web/images/loading-icon.gif b/public/plugins/pdfjs-1.4.20/web/images/loading-icon.gif deleted file mode 100644 index 1c72ebb554be018511ae972c3f2361dff02dce02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2545 zcma*pX;2es8VB%~zPr=ibVMCx-JQ^BhLDAsK)^**h(ZDp9YGuzZ%~j!}+w%FI;|aC7){7CdVvG)P{bng1y9Te*f}~*`1kQl$jwb z$tlW~rRS!X?#xfm_&6tTdp_`cjgYwbRFLNdoJCN$S-yhg`ZnC-yvedRSmOh%;Y`Gl6bY$Z-}#C=#F4%9!I1b zWQ~f+9P?;vhCxWwlwl=lrWG|7IYo;{jjmzJ5R9?f>n%-d@>kLINUc z4wM5dAO;kq<$}Dk{2-u0$I6@2N}&cUx9nmV1dYc8jfC}%=F9WCg^OQK9C6poh#2!A z3^EU*UFZvS^)?bu3T?J;@Ahb~%I?+@4!l5!*TjC}GIslNan-RCrrd~PdHYnNLJk+m&`$Y+NV(e>CCu%R#_8GqY4cv#j`#uRWdsg9DxWy(?oOvgCU}&@jy%c!H&-Q zqXJxajAtmQRoRa9V-RFXXh-bK*;Fum{BjpkYQGX~i@OZ^Dx0n&H}kvGKqQ?w(6iGXu_g08T|_hp#ZvFzIwKF*a=oMJ~3UGAjZ?g}GOxm44td zXoyYrU*I=y*vHv89hkYH(v5R#wc)BC3dZJKb3K)f>zaM3%JP(mpecViP0eKKYf3zy z->jx_mc?mCtPEvCQ?uppk?eLJt}_IR7giW%Jr)RyI!+E-voIs*lXI*z`GQc_&D#X( z{6G};HPYj6O|$lXxBJeDaweqa{4L=tOZCjTI^&UOxXg})LRG_cr^B9Rqt(i5ORbQX zq`_xCRsH>xEYY%&*Nyi#{S_JZNlTm#K56`RI%7^amom;*h90Si&g1CfaFV3D|a!`3Y-GKKbL*KSbl z>I96`TR@CqPJl(>QqB~RvK~-U)`e`l4LIqj+IU^~yyIe*|BRVB>4Bup%j{tLdKz4j zY^<8P8m~GRGz*yv0&-RJE+-keJ+%m3wNeopzsltWd->eWmBVwUr)pX` zK~CD<;~Z*Uy3W`3+MrEYxm5qYQ!z%YI;y7DTG`UVH0;@{M{!B&id_}3DBQ?zsotuR zEGLdRx25nLm%-wjlnEi;-aN_1S7???rO~WgA67jjr&(vRa3y$u#kqJbeKnw z{!T!1li9>M+sJ6AUe+*9d}2uGjhzd z|L1Rtp8uTGYyZoQ*`DS^m2dw-X{a)l+3m?ncvn^+O>)hdd3(hMtlhkRGns{<8c0I! zDDjpmwtj?@!6kA|iu3q+Ai;@JR+ zfk+ln&YFC{4bhK6IxVgLs4W%^8Lk`qzWU*L>yq0A3;l}{!wKZ!ue)C)SKI)9dl1hl zhIRLV@8E}rwvE{gX(}$f6x*k)_`*Ijt1=EU-Ls6-(phomeQBgtUs z5Xz~Cd*nE)Ac!0i4ep}Z1AugMB(&F?)#CU{Qc{Sp^vKsdL}vRB30H+Bbzrn`M##H3 z{W8dc_mDroEE+p8_}mnJtzZ4!RNe)zhB)Ds;S57nYSJxtek>^~&(7B+N5MPf2+2xx z5Dl&4X|c@f{Kd|z1r+N|$DmsoVp*3yOdxT^J^-VAk)Z@$4^XrPrFP-Co+MXZ+KJ(W z{JNYvraLLWA;&tRhIKOvhW|HC|L-dLvAUF(MG0(Nl?4tB{RzN7I(}Cb%hwN{crFC8 zji#aJElKvDFV+&VI1V?oUMA>*kto0^;3W8FQBSZ|{ z$v~TqE=(8DZa^i$^oht&h};P1N&wMXorKh*Z68gPV&ouy>%f36Oqkwemyeas$Qbz# zV?7Jy%o7KY6^I=P@eCji%W`o5sf(5hySYo9$l4e2`(hIV_?=H-#R6}0$WVA|*(K@3 z=5?@RlcLh(meW%A4)hGzcvEpm(_w?>zhL*i&s9$2>r zAtk{8Cia|+Y+V!uX9BtpXoF%lswuRKsM!pSs!?yhlCy!269K0|b M?FSZn2B>%I-}ej|s{jB1 diff --git a/public/plugins/pdfjs-1.4.20/web/images/loading-small.png b/public/plugins/pdfjs-1.4.20/web/images/loading-small.png deleted file mode 100644 index 8831a80588dcaffe9a0e075f3d00066faed3d482..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7402 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 diff --git a/public/plugins/pdfjs-1.4.20/web/images/loading-small@2x.png b/public/plugins/pdfjs-1.4.20/web/images/loading-small@2x.png deleted file mode 100644 index b25b4452aa1a52181c324020c39175e0f8f425a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16131 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 Hu0mjfs1U=| diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-firstPage.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-firstPage.png deleted file mode 100644 index e68846aa5f609f48e89b25692abdd85c2de7ecb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6sytmBLn;{eUNGc3kdg0002dNklu=O3C8jVap{PU;A41oOzOaJ;Key$ zQU*)*)D8A5V+RX%R3~;UVg_@zlxMcgLkF6gqD74k8E7`-9X9B`!HkM$kBXUZFs0+2AR>HC Q6951J07*qoM6N<$f&iRyUH||9 diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-handTool.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-handTool.png deleted file mode 100644 index cb85a841b18be0235fc6c6714223609e1097d1f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmV+|0n+}7P)J24O| z%QaP!}IU9e5CrM>v9W%fW1qojxzD%=Q00000NkvXXu0mjf%W{5L diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-handTool@2x.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-handTool@2x.png deleted file mode 100644 index 5c13f77ff003460753a39d9e406c0020231cabda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 583 zcmV-N0=WH&P)kdg0006GNklsDncb1tl(lO0{5H zQE6&xnvkURPmGNv7*b6L!Th=V`QF__%SrC--TQe6-{l_O7Xsbk5HrdU;SJOpV0KIxYb5^yMTWCRz8#4m*=<-RYnu#WwP~*n506n@GajHIFM;%}f zFY^Y^aW7$86$8At-QN{yj&9v@sxj9<1L$1g8gpFdYaS((q*!NG$}P*BQ`PAzs=(Gm zuGm&PFW5_{a(v>7UM*fj4M<$)vPc?t4M_V?iB(Vmj)#B6xFk|MFXcmJ%3gpyBWK$S zOgPLXDIdy{Wt3sfzR7D`46gK~gc4x?9LbFFLr|r0SztMRsut(_Uiii;Sc}-002ovPDHLkV1iPk2)h6P diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-lastPage.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-lastPage.png deleted file mode 100644 index be763e0c4a02cab5d7842c8999faade8c47059bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6$~;{hLn;{eb{X<9DT=r}_bOuI z*S;pAB4U5DMLQrPIWf`wN4P|1^q&c>d5`zJymvU>ZK0k3(_cShdv}w=iShns``k;6 z|9a2*kZNL>>-ng7x$0%-AZ2dv-evusD-M1!nVC^#Cw7NZpelLZ;<(0t-0Qey{BDRJ YJiB<=q@5ck0$sr1>FVdQ&MBb@0Mz?GUH||9 diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-lastPage@2x.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-lastPage@2x.png deleted file mode 100644 index 8570984f2d9952ebb8543a6c8bbca2408be3fe90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmV+v0qg#WP)kdg0002nNkl&Czfjc{g zj6%Epm%+!Y13m~u!|`;DXFGIF9(|doYCM^ve(0R2@MwmrSf3_JJZz&%)@Kv4!2LS1 zV0}4}<8B$5v%a3la66C8Hg!&j6gN{uYNm4{!PR#}Vyttbi*Y&9#dbQsBEkhDB5R!! zZ3qqBhHg41f;Mp0Iq}XP49B>3;NV a-`N}fhF>K<1*gRT0000IXDMlYJjH!bP6)MzmI9A`JeaMrW zP{;Eb78VxP+o^u+tz)%w>Y7tjQAHKiynbv>Q2u<>aK#ZG+*=LzzJU35q7H&2Nb8UG z4tHis9hc+YH714zU~vDD-l4 zafLJ>w7618y&iZMZti8jkXl?(NPqY>rLdN@q_C#sSI-x0yte^Yo}fkdg0007_Nklh8e7=r0Vcp)Y9Pr|5OlrS&sF1(Z=>P7`I$&2V#B8FQ@ z#xx11n2B@MtaN4N=HFayP|U&0*qP^fzdz3rbvx5{@V?*A7yO;ybIvoweHnhs|HM2| zKI2b<|A+)(s$d&GYW}mq85+9hKEosr^Z)ai~BEfeTNO#3*wjb*wP4^U`OFpp(!|`#~2s8 z`FYx|7Q`+s4a0>};|dO&@9pxBxm8wN7W`#thbT7CssC=I zTAKz9&;++jKrz^NzcAADM`@&iv`7W`N3qmw3RZ&e8hPgH3^G7Qpcx$&o`vOn_6(y+ zZas$_WXt7wl$(nFs}3E|%QjcV-;}eBGn_%TTz6djMaiyYk%erz{(qejCHZ9%NywHf z{V9J|qQg-{A#0$GFYt5L61R9<|A{{;zE^$lK~~|*404N++(Ztym|$2*&p8|pI3TP1 z`Lol$YO^mh!s0;lvGNuWs=UoKADO*y*%)pt=Qi+&XoY ztsnG;h7yz6Kt7lcW&?@I(9rw6m9415J&yxVq8aUYUbLfGo*u)4nY;A)5mO4m-#Y*R N002ovPDHLkV1o45W##|? diff --git a/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCw.png b/public/plugins/pdfjs-1.4.20/web/images/secondaryToolbarButton-rotateCw.png deleted file mode 100644 index e1c7598886bd49e194764015577b766aadd82288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmV-t0hs=YP)x?uT5p77|>RR|+!(Z0%SPBBerLNU!<(Nsaeb!tN(Ep1s3u|3Lqc zXA482_4)TIcUT&Mg&ka9PU%bJ(4vmb9tomENw9}a{m@cGL+1YGpu!Cenlx!}GpOuu z%G3xmxmwG;o&*28mt2*pekdg0007!Nkl7D_=c-w$rRM%>rppb3*+sVXe|le>e}?;(Er{M9e0<;c?0eV_qyI8^j_+&`1R|)U z;XGO}fI0Zt9GrYA<6DaHV~zRM1twVFK>**djW85SZR6yh2FUfJb!D6Sq1r_=#U#5b6Imp7B9ZQ6dlA8G-$eSq@9Y$Onc`L6}j4VAGA1e z1=skwPmHutJ|&xcR~vkBjDocAI6jNzhpOjziuITk{*=Ke2$x|I3s}%U+A3|7NKzG} zAk>06vGjn6XdlOMA5}2zo(U{7GxQ7|5$+DtKDyz>3|zQm6o@A`;T9ZPLCJCIg`0Wi>*q{U9GDRL?<%aEPKbabJ1?6A$s(GnBf}UMn8ID;D}MVOPR2!KxT(5{c95|#cUhyO zcqQP07oE6>JRD?syzAu0o}Dy0+GSP$>9RT+BSRRAndFjb%&=+RP43=DhB_K4i;_&1 zr8a2C%jAM~ORYRlKIV)PyKSob%7 diff --git a/public/plugins/pdfjs-1.4.20/web/images/shadow.png b/public/plugins/pdfjs-1.4.20/web/images/shadow.png deleted file mode 100644 index 31d3bdb14f1d67953d18dc04e73db834aaa200f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmV+-0p0$IP)5L}-Ge7Vw zOWG2)&d}h1b+I@j1OkzekdTy=l$Ms3mzRgb;fjiiN=iy9Dk^GfY8o0ENF-8AOACcU z>FVkl8ymx5FfCz<-2qY*d$iu^P{``3`7z~9%`S|#ZjEqD?L`+Rh&CSg%EiJ9B zt!-^>u~;k)hjVmvbaQiac6N4kb>-&f#^do`US1v^9^T&GzP`S}!NFl+VF3XFAt51t zettwEF+4n+LZL)PMn*?R(`dBh^H~uHNOM7py2y-6!=p(~~7x0I73J zk=^mRIQIJk&?-is?uIWh)sY)HG+e-Fe|Z`9)K4%rj;U_cSvmB=5YtQo(oA+;CU6jO z)R<$|BMsZ2#uGAo5*0yuX)RP99*b^u2U9UAKg9e}?QbeBrr!ZmVxmT^I(w#NAp0yJ z3gpG)vA7C?7k?G@bRH;hvH6-tF&|%ko<*;Wx@=7s!#Gc7js%h_l1haH!vuZgwR%XJ zAIO1&tV}$=@&y4>|3$(ru9knIu8wq22VJ6l!jl|Z-rng-E*su{Jo6fWq}m0oLnno8 z4@|CI*j`Xy1u=JlRj0G&lNyMNgQSO!3%WDIE7N~ z6^K9!yL@fakNp%IJY(Lt_s81lCn!QV0$x&}tgQQY{9@x;R@o?bkcrept_pBmuP9HX zf=P$H3jJ)mEsW(Y7T|DE4+(UsEsM!*NqZpz*{A5Lnd8bzhX`LEvHX`;`V5yeNCu)P zUPoqI-QR#s#(kD825KIitZMG%PV4j>7(5`~xs}Q!G|t?7Al~%zdMRVojvvdXex+<( zmg+Bl)U>5G8&Mn$KVg(z5Y@|tOuhgdU`#)XI}*~HIb&c z)X8rDqzZp$Yn`?MYD!`cPDH#EJPREP+$t`t&G?I<&NjQrXs3UGN?2&44H7n+UK)|- z+2HBd-u*GRi<9QAHq4@RmrIx#!`JG+Q!2_~Mscn*{noS`_x;NQ=%y*jD%6(aD zP)7ynHD_>Kj!W{!r9wE)RD(^=-EtpBpZ_MmdPLn? z|87d=iJcuL@}?u+RaaMI+Yeng$bo*#2DIlwQyM?ZysET47XYvCa#Jb`ReYlTC+gt` zJOm<2m>3Q(+zVPDW}+ZB z22lm8Mtz!78uzQi@JcW~dDBG-|741n)9sL<;t`6Z;WOeCUh3ec>NAi{9O~$Z%}C=0 z^wI~oX)pJ?NPS0t*()y%eX_f|86p(F7&9Fg-Fl25w2fifYVHbw7lJUr>rPD$hz$wj z73ghBFDYaD%P6ACx7xV#M=Wj8Y@&y&>f_i>7W@!W^csmr1f|CUZI6|nrZlzmeNWSq zb60O13c%Wb=MY2VL}QK%O;0r?+_#wGYsObRiX53)VhAPw;~{TOs-NoJorih7T@0$r zW1m9a7EeoeNs3jC73YD>+iaw@l~U9uwkjiKrT@hAP3jeIVO0^WJC9`Q=1|G;?+L%N z7x>BNs>Uk$zZGzfk{smo-ULWJaLnP*{Xc=YVEZdw&+0L?A_{<>8Oi=m@7)F>TiviT z#eIeCltY2nSPwds{yVS?KkiGV9#rq(PR{k)SivAM74I-#zlJUJU!onq!y9+Zie@^ykY8f_3WbV%HIaE zq3*^`5dH7BD&C*0N%0ok$SX3;M&yg9~cKNXUR74$Km2g(ux&*WyKTP}y|Ke^9u=3&Sm`oo0I&7-j6k*J$| zB=B)}yKlOR=&wyR)rAq6;Lkm+>^M=Bs`7U$)hhr-pB zSxZwlgz2_4@_KEeTBZc3FLOb?S2;ShWA@lJZ;G zOf_CnY`~#{A(OQGq4V2m%)h@)u^Rh)qz+v?(Dh2ds-Z7b&j$Y#=_wstAJb+6P>`r@ zC&wmf(&9(N1lOx)NNnJ2ha%+{%R*mSfX%?_vzAVlBEh)ivlH;!{GY}lb3@vFg^tHI buTQ~y@sPxsykY#=6am;+;LIB^-iiMKh=Eg; diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-bookmark.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-bookmark.png deleted file mode 100644 index a187be6c9ba78003d9d2013e4cdc1c7f73bb8949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6N28}V=>tyzpi1dq!_s#Y(o?Z6PqD=UotbK;z z+=pt1eY;;C=TG8Xk<7mK*`GaMCo^*7N1nAT`yj#0VsudA+GmM(2Yq*^+n%4r$i(=* XtGDvpiMgkM4q)(f^>bP0l+XkKeAzzU diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-bookmark@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-bookmark@2x.png deleted file mode 100644 index 4efbaa6758dce6ea82f9e03e81c0196cd806b266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmV+f0sH=mP)kdg0002XNkl|Mj3PYt*CIh*)L;+Ye)qJLer!U=dbLBLZSzSesM4tY9KKocB+w3G#Z zP#|$ck0S&$A%{+O@CHd@not;m^nk=r!lx-oOkfDo1ASdr=)nV-#q?0Gf`(oI0000< KMNUMnLSTYMTxkmc diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-download.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-download.png deleted file mode 100644 index eaab35f09e12fed1a285ca765b38846f84ebbb91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmV+e0sQ`nP)kdg0004SNkl) zyTrz@9NlC#^DUV~uyB6O#`Wc|{GJapsNf}n_~s#6@aR;~Ks|!^o;hKkb<`q>uf_@c ze2Ny_{735Rz+(^grfCv7@DMF@(?E&?)gFc+;s(Y=f4GnKw)K%<_IcMs6%8~k4%~hd z1#ZH&m*NR=jd9Z9?xHxKc#XI|a&$D7>pcNfCv2 z6(}mA@U8*{MHJpuAa5+piu*}@=C6x$-8&9=MtcJe#2}8pdIkrw28vjvgyHy0F}R~Z zCUA)rP9TO&f3a5-II~coM6B}%`OpmoPD3uR3@7y8J#|5W6U7S>1Ne&^?G!jBIjmz4 zBlw35uM~LQ#}Ub*j1tayY3;VeknSU$Z13T)Kdqf~GA)J#k0F^Bw@*|4^-q28r{Use T)~jCX00000NkvXXu0mjf;mWr^ diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-menuArrows.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-menuArrows.png deleted file mode 100644 index 306eb43b86861ffd83ab17541d64a4e8d240c86a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BQ!3HF6HKu+5QpTPxjv*44lM^HyKK%b*U#Aeq zu;`*{L_>wHfPM2NofDJ17YG^bX|d`%n5z@V{_rc;Tt)`NYtfrMyS6_7YG?3t^>bP0 Hl+XkKJQO0C diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-menuArrows@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-menuArrows@2x.png deleted file mode 100644 index f7570bc0d30db3dafe54aa7c1fe92367690f5046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^d_b(g!2%>Zo;S(>sd!Hp$B+ufWQooP^)>=V3JT0Z z$G`noR@ib>ZRMZ;zy7B?RLGuin*8K{y@Up1n}eABCY96wr#d)VuzZRTnDjQlktL_y z<57djB$XEmhvE+MurwWXw|F2ZV0`Mr1B0n74EE`D>#U8d6@XSTc)I$ztaD0e0s!v6 BGzG;VmC z;q~VKH(~JG$%=&H*l#BhBA@m%+@JRU8U%hjmgvvG%fOT9|Lqt|?CCOwE9L($f#A18 zKxs~}zd3BF({67qbqF`wWgvfL;hE+U&_WnNzfk1a( t2EvOl{_oukEDQ`x40a3-IG`;90|2DgL5N;Bd29dx002ovPDHLkV1nayd!_&Y diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-openFile@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-openFile@2x.png deleted file mode 100644 index 91ab76593eadd6280b2a554d8d3eb1430d7ef6ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmV+>0@?kEP)kdg0005)NklV8EdrV)CkilFRiwZGwaE58mndUOxVhkz-=YH-{A&5&o{d zns22dWrs@ZlkDB%fnWKmLb;Wa?OQuga#3zxZ}MmDC0|@s&JT+HXqXKe@Ow>O zxH{3h$him+5RYuj9yN~lP7jG!JjhF_%4%QAQk5*<6Jqsm?Kz+C$$K}&xzJc>>|@Nm zsKzm_h^c1H4jjOTZ(zSQ>)J$FIwS8?teL?fGyt^0A!|lm!cm zrf{tQ1#;(QSpf${lMm-1Pv*3|P{2Xa=o32VET52+0uG8MJ)VX%$q`vnz(LU@4ksYN zlb}3P@CY_uRWrYD9_C5zkwt}Z+X>H)v#KVxI|eagyX2`tMhu(u=AyNL7l4cY^~bW% oyZVDVb*O{JA&&H6n13-p0bKq8;5tc*kN^Mx07*qoM6N<$g1cw`kpKVy diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown-rtl.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown-rtl.png deleted file mode 100644 index 1957f79ab95a970cc93eaeadec532661c5a1ae55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmVkgj4Lv#w4(S5>&h#|Q|$T30}L=f&H#|39(FQ@U4`qXaxf1Bc1+XmFJ4%~M*)ck=@jF*AE z@OmCGUIsRTT4WE_AE@?zRCReJsxQhE$k7T*n^xpdHBOme(Nrc9n@SO5E{eDjb45p( sF&)`4S3;ynbtti233MRw&&qfF1f{Oim%bdkdg00041Nklk=KUzNjE&+Z(ng)kL^NUuQIUigABdoZ zjSq~+fdO@9zMHugg5R&b=MNYE`8du+Zn4FCK6*TGn{x~k1gJ8@hCRLGEpOaj+8e8g zB8)MpkFy_r`|-8kb8}@LQy6}n7&Pq1SAK);+5#pKbni>{+q`3FZOa;uPgpuN| s!;t41i6pD68cF@RkkFqi61Km+Pl0_ej2E!U-~a#s07*qoM6N<$f+7928vp6;%ZmspUL<91jYXM#X%ehtN;K207*qoM6N<$g5$DeH~;_u diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageDown@2x.png deleted file mode 100644 index 758c01d8364c5597d7e9ead825cf4e7754c8d929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 396 zcmV;70dxL|P)kdg0003~NkluFpq+}Hm0+F1Hup;*cG@Vugl*K#ZX`wwAsWOGa}fz> zkwzm~KZOBxbLOmLAviyn;=uQ(|M3vS0uJzqrx86=v5yr@f+Xsjpdf{JHeYJ!j=0AI zdMIPgH=xkW`qFa+9gXf=3-i7Kg{HTb-3Hnk9k+}r-+)2^XB#c8_HcDb96Kz|zFy%@ zr+?TdjvvNrduZwmN(16Fr=vAAblkd2oaVF}#;t%j0<#gojle8GW2g(H0CO!c4%7t3 zfvP|ZM9}o82$~*|&j5vrIb8luF-IZ#_Cih;7v`L-ntKx&oSShnYR(gBlz!%<)m)pf zQ#kWyr_@|dB;m;HB%5m!ww^R+i9!MvS4hZno`~brs}PswLc)&W1w*T#Q92I_?)jA__{b8r{ocmDkjB;))luQR&DQs#s?5{OcWsXDuPe zmo+wBW`Ex!Y-z#88@{DbU>|qCUYXlY&65@XZDezLlfot}w3kTg-zv6Kc{)$s27`wd tL8q?PzUn!-=+u@K&b74>{cp1VFo`V}NvvaB+5+?kgQu&X%Q~loCIFI;U?~6q diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp-rtl@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp-rtl@2x.png deleted file mode 100644 index a01b02380b90e5ab32727ac5460eca3108a8f1e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmV;G0c!qkdg00048Nklrkxqu zT8M?#!bm@}5SjL#xxE$==eN2ibN;KL|31hDNQNMj#dAQK=y(1Y5EDv)44Ux1HIb1A zxbp_wkVaG@>bwr8M;#f}fPp8}M8Vcj2^jETNAO_u3+Qn1AmKun1#~zl_u)W~3TUX} zUO^Qa7tmniPLU0*H;_gJx9U(qIvhx$jGJF7BlQ!YX-bCSn%DhRa1}MU;;H}2mpt`A ziKiME#syC?(4NFOPciVagfos`@JYn1UN>;cY3;X2BrFj7v{2+Y+YX6@#fO0+3LJCQ zBvH>3vz-&-ueoS%1%d+z!pldaMb1S zJy+Y=T^nDZ7)fV{#%PX`f<=ncJWbF5{oQ;4iDXE!#q;ab00000NkvXXu0mjfx2&{B diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-pageUp.png deleted file mode 100644 index fb9daa337656a75091ea00d4c5600ba4f557d834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmV4@1mz9~E$`$~;b_k}_F6G1q{7jr18lHWj_7~< wLcHP)kdg00046NklObOG9sOZQNBke(N5=mxxi_UHnda|*&J&5TH*h$u8)^QA!? z;xt&CUk(xa@IS{#Xz2Hu|6d*s2mgJH_rVY7C(gG%-^8f%*FGts5wO{2{YRVjxB;6j z)&{h^5?<#`RuxU!x&ey~Rs;=NIsuDymORvHjS85o@x@1treDBhm4y+iG`#`_%Y4>Q zrXd9kmiVNpL_-b4SmY!16&V{0L|Nd&m{h`q6-zeg7QAIlCLxaTHheG%?nYsXZ0`) zJwbTMNirjGFS)Go0!$`0KT}Lg+!F?+fC96-Tkl6a7i8QNLsCG2!2H_bPUYYu$y1&U xNi)wqhB>1K6qvvQRuRHFB2cYh4paDxeFMq5jmkNGJDLCh002ovPDHLkV1nI`spbFx diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-presentationMode.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-presentationMode.png deleted file mode 100644 index 3ac21244dff26830f46ec462f2dab36e1a18938c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmV-H0lxl;P)d-;VqjhMU0mZ4X2g!hLXQ*2lyD zAO1T4QSzVf-}e8HzMQ-~=l=t+g42^3RNS0C9Q=RpM>>fAJ?a1b&&NYN8B~EX5F3G* z)y-)~6N3zxFSVx?D9sL)fdf{kGziForAY+;dH)B&*)2a2N#7G$Xm3^>hP76r$iD7@qu}40l!X|5FfA2;Tt;<=`gB!NnK=_L!_3 TdOB@M00000NkvXXu0mjfBu|wT diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-presentationMode@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-presentationMode@2x.png deleted file mode 100644 index cada9e7918da28bdf84af38c354dbf1e1c6fe31a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 586 zcmV-Q0=4~#P)kdg0006JNkl6nm`NYOT@I1}o-1mKoVd&o&{7f+mN-&#|()Zx;dz{8H zjZ$((8_UU@2);#emg03$I7{)Q2)+sjYw5ZuyjRhz2zmk^;uiyU5k4mtKpo5NDq;oH3c;DYmG_Dw9@94#Qd!Np$MYD$j zPc4{FS9m_nZFoN1#o4faN{cjOD4v!1b8BVb^Z!9gw9*2_{C#gi$nn)e!f!}1hmw`k2Xb!g|HAo2t*7E*&>DgR^vZU zVV4ks^D731!9T-ielNTbGw_$axq|YpFKNTWBMo*4b40@@e=r<~g@MK&J_SO41MfMq z6K6!=^stS5fYisq7foRJTRX628(*Bq(yKr%dZE{WZ`;7vZJ2IZv$kcQLwS8}%Xy#f zfMcjMVUtA}0uh@ufx-#qxPlcm-vgSJD;yl)1oluX_K^Glse?0qV_8Mk00000NkvXX Hu0mjf@9=3h diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-print@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-print@2x.png deleted file mode 100644 index 53d18daf7825ae12d99406068073d16ab682737e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmV;>0WbcEP)kdg0004(Nkl|6%E6&Q zgKhE5R6HaVnnStjcWqH1ObaL>24WBUJ_Y#4uV1O`0z?e~qSOfwF1Pr+z z$Bpe>*voD2#tn`c<-UL;j`nO=$Qx_VPMhTiws^}Shpj6L11HP{ZY}JG58#d<-o%HwW2=;PUN2XFHukd_-`kI$Y@{*S`_h91y zIW}gls+39Ng#)bOp}H?Gw|H@Pf)(V=%H0Vs*gACdn;u{lW|A|ybdPtAQD7%+lCuPJ zNHpGOlkX&todVvkrYUPEpq8BS?cYmI7hZsM*cGhfU(HW?%hSMo{ZqpL0000YA diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-search.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-search.png deleted file mode 100644 index f9b75579b1e058baada95941a4a7ff0c80edb5cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmV-50m}Y~P)}CT$H)>Cl*KShVy4rnvP0Z8?}Z*4h&|1f^pNMc6--g9AMzMF;T^ zdxEUy+IsY03~>NTiO@2lBS(WyDLQStmhYno%7XP%~a zg|t=`Q(SSy6w-os!-I2sl2TAVdpUcr6!sO=uOix1Q2+A@lD3RUk?l9y00000NkvXX Hu0mjfGKYz; diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-search@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-search@2x.png deleted file mode 100644 index 456b133248fd5310857db3e2b174730f6488371b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 653 zcmV;80&@L{P)kdg00071Nkl{bbX%$pI4<4dGmxrK3y9C*x5W092iXDWyS$NGul86ip{iUm* zph&8bY4&exY`K>GnEG>Dd62o*(mD5i_k8$VY~O9Br=aKc@csAZc|K$K(~H}AmbW;? zMG@u@&$EhH4=lw&FBkZQF-Ap9o)(M%&-~tka$b|+DChG;`IX(=w(){a#`%8{F<#$j z!3oAVrx=lttE;Wi(dg)E3%QJl{>ms%ms(Jfo#2eJ;_GOI4YjBgwXk)xuK0A4^|Gqy zg0)keVT6&~w6g^ktS^hRB{!`y&ScJIkb$(>x10P=3G|{G`Bfe0)oE%dg%qUCmd7}) z3^)d0=5pwC)whaONSkH-{G>RoP849(sVpfg@*ia0@S_s8gi(M+r$*3#0co@3D5sRA zh9wlxpwskt8fi$I&Gs>uWY z?@M2Nt`6yC6T6=Kx^U>Q*>AFmU}|CQ^VA2Q+|HIZgo*jpkAZhSx|3}@2xVraKJvzU wce9NLp>&q3J+HiVD_f9=9_zn#f#kpM2NJQXccvwU^Z)<=07*qoM6N<$g7779MF0Q* diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png deleted file mode 100644 index 9d9bfa4f63d6a8ae5cbaafa2efadd2c16b48a3d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmV;(0XP1MP)kdg0004xNkl&Eo0wtSl_%_c@)#x6@Nc{?`phhD&@IIESE8yJl-K zSNKF1)hUn5sOZvq+E~U7KGIR4efOfQ^}884Zquc$Li5&n8S%Rr1@7~nmioPL?ToDQ zyBRA(nRhf*zjpbgtnj-TYr+Ig8tT{lh2v82yBQlog$4`i$IR)&lJ~nAn?g*Tx2iXJ zWWVJ6ZpK)6$s20w>%%>JCF}K+&F|>X@+#3QMD!p6D zD}Un9_eZ=yRl_vval1L7BzJJ%w+GCj;t)~vyE&jFTPl6N#|&!ruPuHz2b3(`y7R*w zDyWF(Z1=l4pkzsLTk9rI70-y-?RRDWXwkZ{`gNuh)5IL`x)Kb@EZ>3!A!A$=*8}1L$Je~+C1~_8?0000)($5yeRDdaQJ-M|4aWbecXOn@Guga;V=~b z@A-fE|GC#2l&u(8kl8S=_WnQr|Ky7m5@rlc$ZVK&-~ZG9k3Lz%WyHXU%!Wxf{y*{m t;LXXb20&>fHXkdg0004zNklungn#PzRCDDkC`n~n-$qc_|=6h2P`+3##e4qF2k^f~&;~by5E|5SX@g5gF zM(V@4qrL*vqBy9 zmb;|w9+AI3)?7ThQODDyXUp*o57Q zk<^j>?O9%<$}VJ!)rCGJIWh710VUKc_nfi8UFd6Wq&>}xNGDg=Rgg%$YmQ;9d&EnM z>U;L=QAvw#VE4vGm!-&}`ugz1AsMo}H!?0DWI=tocW|Gi?CyR7|OZx}=1^9!Vb3w=BGynhq07*qoM6N<$f>h_@ AZvX%Q diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle-rtl.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle-rtl.png deleted file mode 100644 index 6f85ec061ea167b1718d2865cfc1e53370f11b7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6R(QHNhEy=Fy|9t%kby|+!~K<= z=lYs7_Vv%s4-^nwVp00$&6?)LeSG^I3$L4YTv-}i{FpUUBct%;PlbZ%#R_fqh7bDx z-F*1OP);pG_ExTK`(Chn5R(EeH9pPAiYO~EVU zg;AX0YiF?m$$s9yK0f=U*jm^Eqt`WV2>kpZ@LOBJCk~ccO~LBz65exMPv3u}^Njbh X)s)<0)dyODZf5Xw^>bP0l+XkKTSZs> diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle-rtl@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-sidebarToggle-rtl@2x.png deleted file mode 100644 index 291e006797fc7f0e84d297e952630c719fe6eeab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmV-e0jK_nP)kdg0003WNklzGl0Qy}Zomti9P@(RHP^G#|@5~=y7$K!siiboRh zuIeZWmVB=G=|>dh^>JgTvTX_3{+V)mF&H3EjY7F_lyu+m(` z^5@!%E%1sIf<-iET7g&00wOY5YylCO%que#{I4g>zrp+oX2Hs@7Sy8){GqKd3+i8+ z(La(~<(6kl$Y?0+E!3g~6pVPYgsgOBL}3a(#z;E(drpoEc78P(r=PdlEn2u>S!eOM qa*)PSBkN>jxL^#qr<+KRA;34`pdw#DmQPIp0000%D&|RWz?R3S%8@5!h6F=s6G4bYqaW?MzjoCkpng6|s zXV#N@oaktrz{i#`@v)}nB&N==y>HnTvNCfR?M_V%Q~Gzyo8O~>Q6}#e!-ESy&GlaR zu`s+4fAKGyamxbfPlhLUim60w=5E=2>$USub|+s^j;X5ze{YfSp5y*9zfkTo Zkdg0003JNkl$GH;g-ye=E3m76~FBj%$^S3p8p9*q*pSbd*{>iVWHsKF0S;I z^gX4t*wuc`Tb2cq{&%P`@>A8<^(NL(>Ho}s&vtk+Fua<7E9$@Hp92jMpDMqu z1xm9(o%fjY|H;!pyNX@EE&si$I{ZV$w@o%SaA_c5db|2dDUjx3Fk~?LRQ7GXy(6+T z5KNBxck+Mrf8+l~|GU4fb8ui_Wk3UhZHZr2{6GKy)RPIe_L$OOB@D*mE*uUFn%Jcw efQf+-n=k;HAC|A!G+~AS0000kdg0009nNkl*n00Qixp6B9(Lgy*p~IIal_z=X^QudHJ1}^E~hK9-{v*5Qt#- z{wq$zD|}{GH?lE%s@NMj=*7nYb>AD_j2@`4U~2pZK7P|=?WfhWa$EeT3Rw9Hh&-bW zD8u?uo`(+us$E+sK$!9qNA}mjiannACYWKd9vtP?fqKUMeoc$2Ps8-R%me35Fq%um zp^WFkGEkSa*@?4|$HO?Jot$^0%Um2BA@|{OVft3P(}fdRlhI{Yy5}3w1-<2wgX227 z?aGN9-apEq*X6k926S2;hJ-VIjji%#jKd#?5Fy-oaTj42)FiKP!+Aa0Eky#q3WHrS z&iNu3zh*f&F2FF{d|@BC?nrFlJJD(?6nG9g?KO#UW1K5QhplRFIOFG`=iX%>pji{^ z-VU9qz`?m3bl9t%cmdjM&o@Skr{NqrIBnh`3UuYMd>h`IrNZi0&}Nq>jPnO*wLKH~ zS+sLaH;<5OCm;$f(3&M7;b%mwQCjRToVXM^TV?bJZ{;;N57Qi1KA+d1$#g#?oV*YX z-EUliW?Mx}6!~(QXyG-tk4@l2gQw8={YAt|@*=XGhvvcIU;I9_wsHr@N$8-ymqPR0 z)PAT6YQ-7ycHEmULEV%fa9{2on!Y?4<;}cGa-7_?FlM3wDoO0fsC+L}!%wjSVcZ=w z_B|H(320F-O(pjyfPNwBQ1@ub$S7d0{uVndbS$Y2pNj>aig$QhoIye4KGFhsC2Bjx zW8)cOX{s^be77=d(Hem_qP8@hf@#ta^+=)YOLlq^M9V0Q7Lo`l&_G$5;fb@TI)>MS z6_`FDJ1HzXuVtqxggl2h)K&r|mk+1y2_Ixa4TUU=Lg|m;m9}F@hFV^Mbk@$1Y+oMb zWvE9@)n9QTb16yvrKn-`XkbaxFs$HTmZbeH7wWfoU3q4&gqNcl)q|C~%exc)`0cLM xV0mA@ASQ16s;xe2X({Ue+?>6bs6%sUl z=5wmNX+x=cM?cG@Z*M=Wx3_WU$gY-DxaT(E)^*=hf#2W0ec7YVF<0AhkJ^MyIkdg0003|NklAE8oCqP6^J2Th#(YoIRh@jaAR$9RboY0TBz8UW*<_dt4i~Ob~DGonWs6N zDHmgSc1896;1BQmyd3=B*_8?FdJfKrFg8ajkxH`r#|ZrHE^89r%(@^&LP zaU~!CnZY3+ryJx4P}Ww4*H%5boJ10kK>!OHX7MpIn8%#kUo_liM?;42gn8)-kME$x z2MsMkajI;x=~Nv!fDG?7K@n$i6P3?9=x2F1U4N$!WpzoMSmnfG0tr9{|91dxvNb`P z@Pt@#g$O@Ts`FxkI-!h8tg$vKjo=3vo__&~$jeRS1pFY=P4m>Rm+nD{$E*W$KOT$2 zPbKiz-rYZ3=dFef!V_e{6&&9|na3K+gyQ5_WYNiu|AQk^Ne|QKRngBbo7l z(Z#9O-!Ih&DHL`j3;gi;Q|>%Z+C4MQ_`#CC(&&{H^BL7&PFp7vkdg0003JNkl4op8oHYTF~kcIgrY7-m_-=gLr9yLNJGQQw7)|`w#sbRZsr&`=k35ZXB7v& zrAY4&X89~W4uka=>r9+FQTkQ_0Xjv(1s6q9K=4z^2Y#M8=iEFR2+oy!;P`O)ls|M1 zIuQI&@&RmN2ixxJx2v>4V~zJtjVOI7`6Jp1XPnuIh2Wc#513n~OwGtZFjew_qkVIo zU$ytz5PVhoe+S{Q%8^qgO78)3#J^TUPB~o-R}j1l2nEaq#~hp3KyVxo3PjEPJUfe; z5d?1nLIL%=*r2h(o>L)8FG~K1Hs*i>8(RooD*3?jlzsNIZU(`=k`J^Rc{e+0HChnt dDXqo-;1^oHB*H?C%i{n5002ovPDHLkV1gg@i>m+t diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewThumbnail.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-viewThumbnail.png deleted file mode 100644 index 584ba55881f9a192ddea645d6d8525bab205e289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf68a!PbLn;`1FBoz$1@g2!+&O99 zf!$e4*(j56dDxhu@!aQ2zL__%gK{mTjH$a~4^&m3zt@ zUaiuXsMG0KBR${yp3FT-zMKuGw=rB1}fgF!j@Pa jH|k4Ui#=T&Ln;{WUfJl$U?_6@q5hFP1#Umq154)g5P7Bj9n-%)M8r~??+_T|q$+)-V kia5^-HX{oL#i@)8E52we&r^_U0~*cX>FVdQ&MBb@0BWi($p8QV diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomIn@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomIn@2x.png deleted file mode 100644 index d5d49d5ff107f01daa307bd0f89f98efc31eeec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4U>7Fi*Ar*|t5-bTK29GBH`OkMs z;LzH(r}lQj`-ICFx#MpBpCa|4zl7P1x1vYwH*5P29X)2dhZ~*=Z`AwIt>?Q+{9j-O zLo#EO)0^fl@rko%`Z-H3Q%PTTaY>Is!UArQV{B|y4S@^{cTUS(`F>5r0%#?Jr>mdK II;Vst0FRG1RsaA1 diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomOut.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomOut.png deleted file mode 100644 index 156c26b941c12a13130e7a7c181d13300a85de89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6mdKI;Vst01!SC>;M1& diff --git a/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomOut@2x.png b/public/plugins/pdfjs-1.4.20/web/images/toolbarButton-zoomOut@2x.png deleted file mode 100644 index 959e1919d5a7a83a9c319de4d65ddaf6dc6c2763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UCY~;iAr*|t5x6B zz{uFh!Ff-a?~&O9p+bS}jK@2hEqD_O6oi80fl3Ux7>c+~q0wld=oSO}#SkfJR9T^xl_H+M9WCik>lDyqr z82-2SpV<%Ov6p!Iy0YKrWaF2XJ+}I0Cs4@O)5S4_<9c#}1C#!gI3K5HU3*qk7JfP^ zDKY)8>!ogI{c{Zp9jCt>`hHZ5LtHJS<$+UcLsOsrwZ)u_tda3Y_T1=KVi6Oo2<%Hy cUbUNH=6`p$$8L6yfCe*oy85}Sb4q9e0CZwJr2qf` diff --git a/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed-rtl@2x.png b/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed-rtl@2x.png deleted file mode 100644 index 84279368d985d74ba324ea3433b08ea5974bcc62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mSkfJR9T^xl_H+M9WCik>lDyqr z82-2SpV<%Ov6p!Iy0YKrWaF2XJ+}I0Cr~Ka)5S4F<9u?$0p>W5{V$RatZw-0daHY} z{<#OiNxzd0cN;5o92e?flIcpA_8_oj153M7i1!AKLt9v!1$YfeZs0{*8S1d;7*d)WUfO=0=x|MWgTe~DWM4fAaX}J diff --git a/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed.png b/public/plugins/pdfjs-1.4.20/web/images/treeitem-collapsed.png deleted file mode 100644 index 06d4d3769672390920ddd9d423f52d7908fcfb36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>0wld=oSO}#+&x_!LpZJ{CnQuDzHAj@)~YCc zcJ!pUslH1WIk z$<$8#)-<<4$>7e1Lt^WdBv>MS0tC+_?dkdu(KF##vY``K|4|Ok95LarEgxHDk6!z_ xe}ZGN#WGb9Hnl@SJ`EdME-hi&#=_6Qka7RV*Qd`VTY>g4c)I$ztaD0e0sz~DGV1^U diff --git a/public/plugins/pdfjs-1.4.20/web/images/treeitem-expanded.png b/public/plugins/pdfjs-1.4.20/web/images/treeitem-expanded.png deleted file mode 100644 index c8d557351cd2fc80c3abd4b19e52924cd74780d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>0wld=oSO}#Ts&PILn;`P75MhNs4Zk;-DbE) zpt_L5GvPZo^g4)z4*}Q$iB}$ABb+ diff --git a/public/plugins/pdfjs-1.4.20/web/images/treeitem-expanded@2x.png b/public/plugins/pdfjs-1.4.20/web/images/treeitem-expanded@2x.png deleted file mode 100644 index 3b3b6103b356200d05caf7fa692cadf2c1e89043..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mialK%Ln;`P7Z_I div { - color: transparent; - position: absolute; - white-space: pre; - cursor: text; - -webkit-transform-origin: 0% 0%; - -moz-transform-origin: 0% 0%; - -o-transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - transform-origin: 0% 0%; -} - -.textLayer .highlight { - margin: -1px; - padding: 1px; - - background-color: rgb(180, 0, 170); - border-radius: 4px; -} - -.textLayer .highlight.begin { - border-radius: 4px 0px 0px 4px; -} - -.textLayer .highlight.end { - border-radius: 0px 4px 4px 0px; -} - -.textLayer .highlight.middle { - border-radius: 0px; -} - -.textLayer .highlight.selected { - background-color: rgb(0, 100, 0); -} - -.textLayer ::selection { background: rgb(0,0,255); } -.textLayer ::-moz-selection { background: rgb(0,0,255); } - -.textLayer .endOfContent { - display: block; - position: absolute; - left: 0px; - top: 100%; - right: 0px; - bottom: 0px; - z-index: -1; - cursor: default; - -webkit-user-select: none; - -ms-user-select: none; - -moz-user-select: none; -} - -.textLayer .endOfContent.active { - top: 0px; -} - - -.annotationLayer section { - position: absolute; -} - -.annotationLayer .linkAnnotation > a { - position: absolute; - font-size: 1em; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.annotationLayer .linkAnnotation > a /* -ms-a */ { - background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") 0 0 repeat; -} - -.annotationLayer .linkAnnotation > a:hover { - opacity: 0.2; - background: #ff0; - box-shadow: 0px 2px 10px #ff0; -} - -.annotationLayer .textAnnotation img { - position: absolute; - cursor: pointer; -} - -.annotationLayer .popupWrapper { - position: absolute; - width: 20em; -} - -.annotationLayer .popup { - position: absolute; - z-index: 200; - max-width: 20em; - background-color: #FFFF99; - box-shadow: 0px 2px 5px #333; - border-radius: 2px; - padding: 0.6em; - margin-left: 5px; - cursor: pointer; - word-wrap: break-word; -} - -.annotationLayer .popup h1 { - font-size: 1em; - border-bottom: 1px solid #000000; - padding-bottom: 0.2em; -} - -.annotationLayer .popup p { - padding-top: 0.2em; -} - -.annotationLayer .highlightAnnotation, -.annotationLayer .underlineAnnotation, -.annotationLayer .squigglyAnnotation, -.annotationLayer .strikeoutAnnotation { - cursor: pointer; -} - -.pdfViewer .canvasWrapper { - overflow: hidden; -} - -.pdfViewer .page { - direction: ltr; - width: 816px; - height: 1056px; - margin: 1px auto -8px auto; - position: relative; - overflow: visible; - border: 9px solid transparent; - background-clip: content-box; - border-image: url(images/shadow.png) 9 9 repeat; - background-color: white; -} - -.pdfViewer.removePageBorders .page { - margin: 0px auto 10px auto; - border: none; -} - -.pdfViewer .page canvas { - margin: 0; - display: block; -} - -.pdfViewer .page .loadingIcon { - position: absolute; - display: block; - left: 0; - top: 0; - right: 0; - bottom: 0; - background: url('images/loading-icon.gif') center no-repeat; -} - -.pdfPresentationMode:-webkit-full-screen .pdfViewer .page { - margin-bottom: 100%; - border: 0; -} - -.pdfPresentationMode:-moz-full-screen .pdfViewer .page { - margin-bottom: 100%; - border: 0; -} - -.pdfPresentationMode:-ms-fullscreen .pdfViewer .page { - margin-bottom: 100% !important; - border: 0; -} - -.pdfPresentationMode:fullscreen .pdfViewer .page { - margin-bottom: 100%; - border: 0; -} - -* { - padding: 0; - margin: 0; -} - -html { - height: 100%; - /* Font size is needed to make the activity bar the correct size. */ - font-size: 10px; -} - -body { - height: 100%; - background-color: #404040; - background-image: url(images/texture.png); -} - -body, -input, -button, -select { - font: message-box; - outline: none; -} - -.hidden { - display: none !important; -} -[hidden] { - display: none !important; -} - -#viewerContainer.pdfPresentationMode:-webkit-full-screen { - top: 0px; - border-top: 2px solid transparent; - background-color: #000; - width: 100%; - height: 100%; - overflow: hidden; - cursor: none; - -webkit-user-select: none; -} - -#viewerContainer.pdfPresentationMode:-moz-full-screen { - top: 0px; - border-top: 2px solid transparent; - background-color: #000; - width: 100%; - height: 100%; - overflow: hidden; - cursor: none; - -moz-user-select: none; -} - -#viewerContainer.pdfPresentationMode:-ms-fullscreen { - top: 0px !important; - border-top: 2px solid transparent; - width: 100%; - height: 100%; - overflow: hidden !important; - cursor: none; - -ms-user-select: none; -} - -#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop { - background-color: #000; -} - -#viewerContainer.pdfPresentationMode:fullscreen { - top: 0px; - border-top: 2px solid transparent; - background-color: #000; - width: 100%; - height: 100%; - overflow: hidden; - cursor: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; -} - -.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) { - display: none; -} - -.pdfPresentationMode:-moz-full-screen a:not(.internalLink) { - display: none; -} - -.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) { - display: none !important; -} - -.pdfPresentationMode:fullscreen a:not(.internalLink) { - display: none; -} - -.pdfPresentationMode:-webkit-full-screen .textLayer > div { - cursor: none; -} - -.pdfPresentationMode:-moz-full-screen .textLayer > div { - cursor: none; -} - -.pdfPresentationMode:-ms-fullscreen .textLayer > div { - cursor: none; -} - -.pdfPresentationMode:fullscreen .textLayer > div { - cursor: none; -} - -.pdfPresentationMode.pdfPresentationModeControls > *, -.pdfPresentationMode.pdfPresentationModeControls .textLayer > div { - cursor: default; -} - -/* outer/inner center provides horizontal center */ -.outerCenter { - pointer-events: none; - position: relative; -} -html[dir='ltr'] .outerCenter { - float: right; - right: 50%; -} -html[dir='rtl'] .outerCenter { - float: left; - left: 50%; -} -.innerCenter { - pointer-events: auto; - position: relative; -} -html[dir='ltr'] .innerCenter { - float: right; - right: -50%; -} -html[dir='rtl'] .innerCenter { - float: left; - left: -50%; -} - -#outerContainer { - width: 100%; - height: 100%; - position: relative; -} - -#sidebarContainer { - position: absolute; - top: 0; - bottom: 0; - width: 200px; - visibility: hidden; - -webkit-transition-duration: 200ms; - -webkit-transition-timing-function: ease; - transition-duration: 200ms; - transition-timing-function: ease; - -} -html[dir='ltr'] #sidebarContainer { - -webkit-transition-property: left; - transition-property: left; - left: -200px; -} -html[dir='rtl'] #sidebarContainer { - -webkit-transition-property: right; - transition-property: right; - right: -200px; -} - -#outerContainer.sidebarMoving > #sidebarContainer, -#outerContainer.sidebarOpen > #sidebarContainer { - visibility: visible; -} -html[dir='ltr'] #outerContainer.sidebarOpen > #sidebarContainer { - left: 0px; -} -html[dir='rtl'] #outerContainer.sidebarOpen > #sidebarContainer { - right: 0px; -} - -#mainContainer { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - min-width: 320px; - -webkit-transition-duration: 200ms; - -webkit-transition-timing-function: ease; - transition-duration: 200ms; - transition-timing-function: ease; -} -html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer { - -webkit-transition-property: left; - transition-property: left; - left: 200px; -} -html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer { - -webkit-transition-property: right; - transition-property: right; - right: 200px; -} - -#sidebarContent { - top: 32px; - bottom: 0; - overflow: auto; - -webkit-overflow-scrolling: touch; - position: absolute; - width: 200px; - background-color: hsla(0,0%,0%,.1); -} -html[dir='ltr'] #sidebarContent { - left: 0; - box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25); -} -html[dir='rtl'] #sidebarContent { - right: 0; - box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25); -} - -#viewerContainer { - overflow: auto; - -webkit-overflow-scrolling: touch; - position: absolute; - top: 32px; - right: 0; - bottom: 0; - left: 0; - outline: none; -} -html[dir='ltr'] #viewerContainer { - box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05); -} -html[dir='rtl'] #viewerContainer { - box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05); -} - -.toolbar { - position: relative; - left: 0; - right: 0; - z-index: 9999; - cursor: default; -} - -#toolbarContainer { - width: 100%; -} - -#toolbarSidebar { - width: 200px; - height: 32px; - background-color: #424242; /* fallback */ - background-image: url(images/texture.png), - linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); -} -html[dir='ltr'] #toolbarSidebar { - box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25), - inset 0 -1px 0 hsla(0,0%,100%,.05), - 0 1px 0 hsla(0,0%,0%,.15), - 0 0 1px hsla(0,0%,0%,.1); -} -html[dir='rtl'] #toolbarSidebar { - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25), - inset 0 1px 0 hsla(0,0%,100%,.05), - 0 1px 0 hsla(0,0%,0%,.15), - 0 0 1px hsla(0,0%,0%,.1); -} - -#toolbarContainer, .findbar, .secondaryToolbar { - position: relative; - height: 32px; - background-color: #474747; /* fallback */ - background-image: url(images/texture.png), - linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); -} -html[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar { - box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08), - inset 0 1px 1px hsla(0,0%,0%,.15), - inset 0 -1px 0 hsla(0,0%,100%,.05), - 0 1px 0 hsla(0,0%,0%,.15), - 0 1px 1px hsla(0,0%,0%,.1); -} -html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar { - box-shadow: inset -1px 0 0 hsla(0,0%,100%,.08), - inset 0 1px 1px hsla(0,0%,0%,.15), - inset 0 -1px 0 hsla(0,0%,100%,.05), - 0 1px 0 hsla(0,0%,0%,.15), - 0 1px 1px hsla(0,0%,0%,.1); -} - -#toolbarViewer { - height: 32px; -} - -#loadingBar { - position: relative; - width: 100%; - height: 4px; - background-color: #333; - border-bottom: 1px solid #333; -} - -#loadingBar .progress { - position: absolute; - top: 0; - left: 0; - width: 0%; - height: 100%; - background-color: #ddd; - overflow: hidden; - -webkit-transition: width 200ms; - transition: width 200ms; -} - -@-webkit-keyframes progressIndeterminate { - 0% { left: -142px; } - 100% { left: 0; } -} - -@keyframes progressIndeterminate { - 0% { left: -142px; } - 100% { left: 0; } -} - -#loadingBar .progress.indeterminate { - background-color: #999; - -webkit-transition: none; - transition: none; -} - -#loadingBar .progress.indeterminate .glimmer { - position: absolute; - top: 0; - left: 0; - height: 100%; - width: calc(100% + 150px); - - background: repeating-linear-gradient(135deg, - #bbb 0, #999 5px, - #999 45px, #ddd 55px, - #ddd 95px, #bbb 100px); - - -webkit-animation: progressIndeterminate 950ms linear infinite; - animation: progressIndeterminate 950ms linear infinite; -} - -.findbar, .secondaryToolbar { - top: 32px; - position: absolute; - z-index: 10000; - height: 32px; - - min-width: 16px; - padding: 0px 6px 0px 6px; - margin: 4px 2px 4px 2px; - color: hsl(0,0%,85%); - font-size: 12px; - line-height: 14px; - text-align: left; - cursor: default; -} - -html[dir='ltr'] .findbar { - left: 68px; -} - -html[dir='rtl'] .findbar { - right: 68px; -} - -.findbar label { - -webkit-user-select: none; - -moz-user-select: none; -} - -#findInput[data-status="pending"] { - background-image: url(images/loading-small.png); - background-repeat: no-repeat; - background-position: right; -} -html[dir='rtl'] #findInput[data-status="pending"] { - background-position: left; -} - -.secondaryToolbar { - padding: 6px; - height: auto; - z-index: 30000; -} -html[dir='ltr'] .secondaryToolbar { - right: 4px; -} -html[dir='rtl'] .secondaryToolbar { - left: 4px; -} - -#secondaryToolbarButtonContainer { - max-width: 200px; - max-height: 400px; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - margin-bottom: -4px; -} - -.doorHanger, -.doorHangerRight { - border: 1px solid hsla(0,0%,0%,.5); - border-radius: 2px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); -} -.doorHanger:after, .doorHanger:before, -.doorHangerRight:after, .doorHangerRight:before { - bottom: 100%; - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; - pointer-events: none; -} -.doorHanger:after, -.doorHangerRight:after { - border-bottom-color: hsla(0,0%,32%,.99); - border-width: 8px; -} -.doorHanger:before, -.doorHangerRight:before { - border-bottom-color: hsla(0,0%,0%,.5); - border-width: 9px; -} - -html[dir='ltr'] .doorHanger:after, -html[dir='rtl'] .doorHangerRight:after { - left: 13px; - margin-left: -8px; -} - -html[dir='ltr'] .doorHanger:before, -html[dir='rtl'] .doorHangerRight:before { - left: 13px; - margin-left: -9px; -} - -html[dir='rtl'] .doorHanger:after, -html[dir='ltr'] .doorHangerRight:after { - right: 13px; - margin-right: -8px; -} - -html[dir='rtl'] .doorHanger:before, -html[dir='ltr'] .doorHangerRight:before { - right: 13px; - margin-right: -9px; -} - -#findResultsCount { - background-color: hsl(0, 0%, 85%); - color: hsl(0, 0%, 32%); - text-align: center; - padding: 3px 4px; -} - -#findMsg { - font-style: italic; - color: #A6B7D0; -} - -#findInput.notFound { - background-color: rgb(255, 102, 102); -} - -html[dir='ltr'] #toolbarViewerLeft { - margin-left: -1px; -} -html[dir='rtl'] #toolbarViewerRight { - margin-right: -1px; -} - -html[dir='ltr'] #toolbarViewerLeft, -html[dir='rtl'] #toolbarViewerRight { - position: absolute; - top: 0; - left: 0; -} -html[dir='ltr'] #toolbarViewerRight, -html[dir='rtl'] #toolbarViewerLeft { - position: absolute; - top: 0; - right: 0; -} -html[dir='ltr'] #toolbarViewerLeft > *, -html[dir='ltr'] #toolbarViewerMiddle > *, -html[dir='ltr'] #toolbarViewerRight > *, -html[dir='ltr'] .findbar > * { - position: relative; - float: left; -} -html[dir='rtl'] #toolbarViewerLeft > *, -html[dir='rtl'] #toolbarViewerMiddle > *, -html[dir='rtl'] #toolbarViewerRight > *, -html[dir='rtl'] .findbar > * { - position: relative; - float: right; -} - -html[dir='ltr'] .splitToolbarButton { - margin: 3px 2px 4px 0; - display: inline-block; -} -html[dir='rtl'] .splitToolbarButton { - margin: 3px 0 4px 2px; - display: inline-block; -} -html[dir='ltr'] .splitToolbarButton > .toolbarButton { - border-radius: 0; - float: left; -} -html[dir='rtl'] .splitToolbarButton > .toolbarButton { - border-radius: 0; - float: right; -} - -.toolbarButton, -.secondaryToolbarButton, -.overlayButton { - border: 0 none; - background: none; - width: 32px; - height: 25px; -} - -.toolbarButton > span { - display: inline-block; - width: 0; - height: 0; - overflow: hidden; -} - -.toolbarButton[disabled], -.secondaryToolbarButton[disabled], -.overlayButton[disabled] { - opacity: .5; -} - -.toolbarButton.group { - margin-right: 0; -} - -.splitToolbarButton.toggled .toolbarButton { - margin: 0; -} - -.splitToolbarButton:hover > .toolbarButton, -.splitToolbarButton:focus > .toolbarButton, -.splitToolbarButton.toggled > .toolbarButton, -.toolbarButton.textButton { - background-color: hsla(0,0%,0%,.12); - background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); - background-clip: padding-box; - border: 1px solid hsla(0,0%,0%,.35); - border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); - box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, - 0 0 1px hsla(0,0%,100%,.15) inset, - 0 1px 0 hsla(0,0%,100%,.05); - -webkit-transition-property: background-color, border-color, box-shadow; - -webkit-transition-duration: 150ms; - -webkit-transition-timing-function: ease; - transition-property: background-color, border-color, box-shadow; - transition-duration: 150ms; - transition-timing-function: ease; - -} -.splitToolbarButton > .toolbarButton:hover, -.splitToolbarButton > .toolbarButton:focus, -.dropdownToolbarButton:hover, -.overlayButton:hover, -.overlayButton:focus, -.toolbarButton.textButton:hover, -.toolbarButton.textButton:focus { - background-color: hsla(0,0%,0%,.2); - box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, - 0 0 1px hsla(0,0%,100%,.15) inset, - 0 0 1px hsla(0,0%,0%,.05); - z-index: 199; -} -.splitToolbarButton > .toolbarButton { - position: relative; -} -html[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child, -html[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child { - position: relative; - margin: 0; - margin-right: -1px; - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; - border-right-color: transparent; -} -html[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child, -html[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child { - position: relative; - margin: 0; - margin-left: -1px; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; - border-left-color: transparent; -} -.splitToolbarButtonSeparator { - padding: 8px 0; - width: 1px; - background-color: hsla(0,0%,0%,.5); - z-index: 99; - box-shadow: 0 0 0 1px hsla(0,0%,100%,.08); - display: inline-block; - margin: 5px 0; -} -html[dir='ltr'] .splitToolbarButtonSeparator { - float: left; -} -html[dir='rtl'] .splitToolbarButtonSeparator { - float: right; -} -.splitToolbarButton:hover > .splitToolbarButtonSeparator, -.splitToolbarButton.toggled > .splitToolbarButtonSeparator { - padding: 12px 0; - margin: 1px 0; - box-shadow: 0 0 0 1px hsla(0,0%,100%,.03); - -webkit-transition-property: padding; - -webkit-transition-duration: 10ms; - -webkit-transition-timing-function: ease; - transition-property: padding; - transition-duration: 10ms; - transition-timing-function: ease; -} - -.toolbarButton, -.dropdownToolbarButton, -.secondaryToolbarButton, -.overlayButton { - min-width: 16px; - padding: 2px 6px 0; - border: 1px solid transparent; - border-radius: 2px; - color: hsla(0,0%,100%,.8); - font-size: 12px; - line-height: 14px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - /* Opera does not support user-select, use <... unselectable="on"> instead */ - cursor: default; - -webkit-transition-property: background-color, border-color, box-shadow; - -webkit-transition-duration: 150ms; - -webkit-transition-timing-function: ease; - transition-property: background-color, border-color, box-shadow; - transition-duration: 150ms; - transition-timing-function: ease; -} - -html[dir='ltr'] .toolbarButton, -html[dir='ltr'] .overlayButton, -html[dir='ltr'] .dropdownToolbarButton { - margin: 3px 2px 4px 0; -} -html[dir='rtl'] .toolbarButton, -html[dir='rtl'] .overlayButton, -html[dir='rtl'] .dropdownToolbarButton { - margin: 3px 0 4px 2px; -} - -.toolbarButton:hover, -.toolbarButton:focus, -.dropdownToolbarButton, -.overlayButton, -.secondaryToolbarButton:hover, -.secondaryToolbarButton:focus { - background-color: hsla(0,0%,0%,.12); - background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); - background-clip: padding-box; - border: 1px solid hsla(0,0%,0%,.35); - border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); - box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, - 0 0 1px hsla(0,0%,100%,.15) inset, - 0 1px 0 hsla(0,0%,100%,.05); -} - -.toolbarButton:hover:active, -.overlayButton:hover:active, -.dropdownToolbarButton:hover:active, -.secondaryToolbarButton:hover:active { - background-color: hsla(0,0%,0%,.2); - background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); - border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45); - box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, - 0 0 1px hsla(0,0%,0%,.2) inset, - 0 1px 0 hsla(0,0%,100%,.05); - -webkit-transition-property: background-color, border-color, box-shadow; - -webkit-transition-duration: 10ms; - -webkit-transition-timing-function: linear; - transition-property: background-color, border-color, box-shadow; - transition-duration: 10ms; - transition-timing-function: linear; -} - -.toolbarButton.toggled, -.splitToolbarButton.toggled > .toolbarButton.toggled, -.secondaryToolbarButton.toggled { - background-color: hsla(0,0%,0%,.3); - background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); - border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5); - box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, - 0 0 1px hsla(0,0%,0%,.2) inset, - 0 1px 0 hsla(0,0%,100%,.05); - -webkit-transition-property: background-color, border-color, box-shadow; - -webkit-transition-duration: 10ms; - -webkit-transition-timing-function: linear; - transition-property: background-color, border-color, box-shadow; - transition-duration: 10ms; - transition-timing-function: linear; -} - -.toolbarButton.toggled:hover:active, -.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active, -.secondaryToolbarButton.toggled:hover:active { - background-color: hsla(0,0%,0%,.4); - border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55); - box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset, - 0 0 1px hsla(0,0%,0%,.3) inset, - 0 1px 0 hsla(0,0%,100%,.05); -} - -.dropdownToolbarButton { - width: 120px; - max-width: 120px; - padding: 0; - overflow: hidden; - background: url(images/toolbarButton-menuArrows.png) no-repeat; -} -html[dir='ltr'] .dropdownToolbarButton { - background-position: 95%; -} -html[dir='rtl'] .dropdownToolbarButton { - background-position: 5%; -} - -.dropdownToolbarButton > select { - min-width: 140px; - font-size: 12px; - color: hsl(0,0%,95%); - margin: 0; - padding: 3px 2px 2px; - border: none; - background: rgba(0,0,0,0); /* Opera does not support 'transparent' -
    - -
    - -
    - - - - - - -
    - - - -
    -
    -
    -
    - -
    - -
    - -
    - -
    - - - -
    -
    - - - - - - - - - Current View - - -
    - - -
    -
    -
    -
    - -
    - -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - -
    -
    -
    - - - - - - - -
    - - - - - diff --git a/public/plugins/pdfjs-1.4.20/web/viewer.js b/public/plugins/pdfjs-1.4.20/web/viewer.js deleted file mode 100644 index 1fc9d7b..0000000 --- a/public/plugins/pdfjs-1.4.20/web/viewer.js +++ /dev/null @@ -1,7952 +0,0 @@ -/* Copyright 2012 Mozilla Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* globals PDFJS, PDFBug, FirefoxCom, Stats, ProgressBar, - DownloadManager, getFileName, getPDFFileNameFromURL, - PDFHistory, Preferences, SidebarView, ViewHistory, Stats, - PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar, - PasswordPrompt, PDFPresentationMode, PDFDocumentProperties, HandTool, - Promise, PDFLinkService, PDFOutlineView, PDFAttachmentView, - OverlayManager, PDFFindController, PDFFindBar, PDFViewer, - PDFRenderingQueue, PresentationModeState, parseQueryString, - RenderingStates, UNKNOWN_SCALE, DEFAULT_SCALE_VALUE, - IGNORE_CURRENT_POSITION_ON_ZOOM: true */ - -'use strict'; - -var DEFAULT_URL = 'compressed.tracemonkey-pldi-09.pdf'; -var DEFAULT_SCALE_DELTA = 1.1; -var MIN_SCALE = 0.25; -var MAX_SCALE = 10.0; -var SCALE_SELECT_CONTAINER_PADDING = 8; -var SCALE_SELECT_PADDING = 22; -var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading'; -var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; - -function configure(PDFJS) { - PDFJS.imageResourcesPath = './images/'; - PDFJS.workerSrc = '../build/pdf.worker.js'; -} - -var CSS_UNITS = 96.0 / 72.0; -var DEFAULT_SCALE_VALUE = 'auto'; -var DEFAULT_SCALE = 1.0; -var UNKNOWN_SCALE = 0; -var MAX_AUTO_SCALE = 1.25; -var SCROLLBAR_PADDING = 40; -var VERTICAL_PADDING = 5; - -function getFileName(url) { - var anchor = url.indexOf('#'); - var query = url.indexOf('?'); - var end = Math.min( - anchor > 0 ? anchor : url.length, - query > 0 ? query : url.length); - return url.substring(url.lastIndexOf('/', end) + 1, end); -} - -/** - * Returns scale factor for the canvas. It makes sense for the HiDPI displays. - * @return {Object} The object with horizontal (sx) and vertical (sy) - scales. The scaled property is set to false if scaling is - not required, true otherwise. - */ -function getOutputScale(ctx) { - var devicePixelRatio = window.devicePixelRatio || 1; - var backingStoreRatio = ctx.webkitBackingStorePixelRatio || - ctx.mozBackingStorePixelRatio || - ctx.msBackingStorePixelRatio || - ctx.oBackingStorePixelRatio || - ctx.backingStorePixelRatio || 1; - var pixelRatio = devicePixelRatio / backingStoreRatio; - return { - sx: pixelRatio, - sy: pixelRatio, - scaled: pixelRatio !== 1 - }; -} - -/** - * Scrolls specified element into view of its parent. - * @param {Object} element - The element to be visible. - * @param {Object} spot - An object with optional top and left properties, - * specifying the offset from the top left edge. - * @param {boolean} skipOverflowHiddenElements - Ignore elements that have - * the CSS rule `overflow: hidden;` set. The default is false. - */ -function scrollIntoView(element, spot, skipOverflowHiddenElements) { - // Assuming offsetParent is available (it's not available when viewer is in - // hidden iframe or object). We have to scroll: if the offsetParent is not set - // producing the error. See also animationStartedClosure. - var parent = element.offsetParent; - if (!parent) { - console.error('offsetParent is not set -- cannot scroll'); - return; - } - var checkOverflow = skipOverflowHiddenElements || false; - var offsetY = element.offsetTop + element.clientTop; - var offsetX = element.offsetLeft + element.clientLeft; - while (parent.clientHeight === parent.scrollHeight || - (checkOverflow && getComputedStyle(parent).overflow === 'hidden')) { - if (parent.dataset._scaleY) { - offsetY /= parent.dataset._scaleY; - offsetX /= parent.dataset._scaleX; - } - offsetY += parent.offsetTop; - offsetX += parent.offsetLeft; - parent = parent.offsetParent; - if (!parent) { - return; // no need to scroll - } - } - if (spot) { - if (spot.top !== undefined) { - offsetY += spot.top; - } - if (spot.left !== undefined) { - offsetX += spot.left; - parent.scrollLeft = offsetX; - } - } - parent.scrollTop = offsetY; -} - -/** - * Helper function to start monitoring the scroll event and converting them into - * PDF.js friendly one: with scroll debounce and scroll direction. - */ -function watchScroll(viewAreaElement, callback) { - var debounceScroll = function debounceScroll(evt) { - if (rAF) { - return; - } - // schedule an invocation of scroll for next animation frame. - rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { - rAF = null; - - var currentY = viewAreaElement.scrollTop; - var lastY = state.lastY; - if (currentY !== lastY) { - state.down = currentY > lastY; - } - state.lastY = currentY; - callback(state); - }); - }; - - var state = { - down: true, - lastY: viewAreaElement.scrollTop, - _eventHandler: debounceScroll - }; - - var rAF = null; - viewAreaElement.addEventListener('scroll', debounceScroll, true); - return state; -} - -/** - * Helper function to parse query string (e.g. ?param1=value&parm2=...). - */ -function parseQueryString(query) { - var parts = query.split('&'); - var params = {}; - for (var i = 0, ii = parts.length; i < ii; ++i) { - var param = parts[i].split('='); - var key = param[0].toLowerCase(); - var value = param.length > 1 ? param[1] : null; - params[decodeURIComponent(key)] = decodeURIComponent(value); - } - return params; -} - -/** - * Use binary search to find the index of the first item in a given array which - * passes a given condition. The items are expected to be sorted in the sense - * that if the condition is true for one item in the array, then it is also true - * for all following items. - * - * @returns {Number} Index of the first array element to pass the test, - * or |items.length| if no such element exists. - */ -function binarySearchFirstItem(items, condition) { - var minIndex = 0; - var maxIndex = items.length - 1; - - if (items.length === 0 || !condition(items[maxIndex])) { - return items.length; - } - if (condition(items[minIndex])) { - return minIndex; - } - - while (minIndex < maxIndex) { - var currentIndex = (minIndex + maxIndex) >> 1; - var currentItem = items[currentIndex]; - if (condition(currentItem)) { - maxIndex = currentIndex; - } else { - minIndex = currentIndex + 1; - } - } - return minIndex; /* === maxIndex */ -} - -/** - * Approximates float number as a fraction using Farey sequence (max order - * of 8). - * @param {number} x - Positive float number. - * @returns {Array} Estimated fraction: the first array item is a numerator, - * the second one is a denominator. - */ -function approximateFraction(x) { - // Fast paths for int numbers or their inversions. - if (Math.floor(x) === x) { - return [x, 1]; - } - var xinv = 1 / x; - var limit = 8; - if (xinv > limit) { - return [1, limit]; - } else if (Math.floor(xinv) === xinv) { - return [1, xinv]; - } - - var x_ = x > 1 ? xinv : x; - // a/b and c/d are neighbours in Farey sequence. - var a = 0, b = 1, c = 1, d = 1; - // Limiting search to order 8. - while (true) { - // Generating next term in sequence (order of q). - var p = a + c, q = b + d; - if (q > limit) { - break; - } - if (x_ <= p / q) { - c = p; d = q; - } else { - a = p; b = q; - } - } - // Select closest of the neighbours to x. - if (x_ - a / b < c / d - x_) { - return x_ === x ? [a, b] : [b, a]; - } else { - return x_ === x ? [c, d] : [d, c]; - } -} - -function roundToDivide(x, div) { - var r = x % div; - return r === 0 ? x : Math.round(x - r + div); -} - -/** - * Generic helper to find out what elements are visible within a scroll pane. - */ -function getVisibleElements(scrollEl, views, sortByVisibility) { - var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight; - var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth; - - function isElementBottomBelowViewTop(view) { - var element = view.div; - var elementBottom = - element.offsetTop + element.clientTop + element.clientHeight; - return elementBottom > top; - } - - var visible = [], view, element; - var currentHeight, viewHeight, hiddenHeight, percentHeight; - var currentWidth, viewWidth; - var firstVisibleElementInd = (views.length === 0) ? 0 : - binarySearchFirstItem(views, isElementBottomBelowViewTop); - - for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) { - view = views[i]; - element = view.div; - currentHeight = element.offsetTop + element.clientTop; - viewHeight = element.clientHeight; - - if (currentHeight > bottom) { - break; - } - - currentWidth = element.offsetLeft + element.clientLeft; - viewWidth = element.clientWidth; - if (currentWidth + viewWidth < left || currentWidth > right) { - continue; - } - hiddenHeight = Math.max(0, top - currentHeight) + - Math.max(0, currentHeight + viewHeight - bottom); - percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0; - - visible.push({ - id: view.id, - x: currentWidth, - y: currentHeight, - view: view, - percent: percentHeight - }); - } - - var first = visible[0]; - var last = visible[visible.length - 1]; - - if (sortByVisibility) { - visible.sort(function(a, b) { - var pc = a.percent - b.percent; - if (Math.abs(pc) > 0.001) { - return -pc; - } - return a.id - b.id; // ensure stability - }); - } - return {first: first, last: last, views: visible}; -} - -/** - * Event handler to suppress context menu. - */ -function noContextMenuHandler(e) { - e.preventDefault(); -} - -/** - * Returns the filename or guessed filename from the url (see issue 3455). - * url {String} The original PDF location. - * @return {String} Guessed PDF file name. - */ -function getPDFFileNameFromURL(url) { - var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; - // SCHEME HOST 1.PATH 2.QUERY 3.REF - // Pattern to get last matching NAME.pdf - var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i; - var splitURI = reURI.exec(url); - var suggestedFilename = reFilename.exec(splitURI[1]) || - reFilename.exec(splitURI[2]) || - reFilename.exec(splitURI[3]); - if (suggestedFilename) { - suggestedFilename = suggestedFilename[0]; - if (suggestedFilename.indexOf('%') !== -1) { - // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf - try { - suggestedFilename = - reFilename.exec(decodeURIComponent(suggestedFilename))[0]; - } catch(e) { // Possible (extremely rare) errors: - // URIError "Malformed URI", e.g. for "%AA.pdf" - // TypeError "null has no properties", e.g. for "%2F.pdf" - } - } - } - return suggestedFilename || 'document.pdf'; -} - -var ProgressBar = (function ProgressBarClosure() { - - function clamp(v, min, max) { - return Math.min(Math.max(v, min), max); - } - - function ProgressBar(id, opts) { - this.visible = true; - - // Fetch the sub-elements for later. - this.div = document.querySelector(id + ' .progress'); - - // Get the loading bar element, so it can be resized to fit the viewer. - this.bar = this.div.parentNode; - - // Get options, with sensible defaults. - this.height = opts.height || 100; - this.width = opts.width || 100; - this.units = opts.units || '%'; - - // Initialize heights. - this.div.style.height = this.height + this.units; - this.percent = 0; - } - - ProgressBar.prototype = { - - updateBar: function ProgressBar_updateBar() { - if (this._indeterminate) { - this.div.classList.add('indeterminate'); - this.div.style.width = this.width + this.units; - return; - } - - this.div.classList.remove('indeterminate'); - var progressSize = this.width * this._percent / 100; - this.div.style.width = progressSize + this.units; - }, - - get percent() { - return this._percent; - }, - - set percent(val) { - this._indeterminate = isNaN(val); - this._percent = clamp(val, 0, 100); - this.updateBar(); - }, - - setWidth: function ProgressBar_setWidth(viewer) { - if (viewer) { - var container = viewer.parentNode; - var scrollbarWidth = container.offsetWidth - viewer.offsetWidth; - if (scrollbarWidth > 0) { - this.bar.setAttribute('style', 'width: calc(100% - ' + - scrollbarWidth + 'px);'); - } - } - }, - - hide: function ProgressBar_hide() { - if (!this.visible) { - return; - } - this.visible = false; - this.bar.classList.add('hidden'); - document.body.classList.remove('loadingInProgress'); - }, - - show: function ProgressBar_show() { - if (this.visible) { - return; - } - this.visible = true; - document.body.classList.add('loadingInProgress'); - this.bar.classList.remove('hidden'); - } - }; - - return ProgressBar; -})(); - - - -var DEFAULT_PREFERENCES = { - showPreviousViewOnLoad: true, - defaultZoomValue: '', - sidebarViewOnLoad: 0, - enableHandToolOnLoad: false, - enableWebGL: false, - pdfBugEnabled: false, - disableRange: false, - disableStream: false, - disableAutoFetch: false, - disableFontFace: false, - disableTextLayer: false, - useOnlyCssZoom: false, - externalLinkTarget: 0, -}; - - -var SidebarView = { - NONE: 0, - THUMBS: 1, - OUTLINE: 2, - ATTACHMENTS: 3 -}; - -/** - * Preferences - Utility for storing persistent settings. - * Used for settings that should be applied to all opened documents, - * or every time the viewer is loaded. - */ -var Preferences = { - prefs: Object.create(DEFAULT_PREFERENCES), - isInitializedPromiseResolved: false, - initializedPromise: null, - - /** - * Initialize and fetch the current preference values from storage. - * @return {Promise} A promise that is resolved when the preferences - * have been initialized. - */ - initialize: function preferencesInitialize() { - return this.initializedPromise = - this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) { - this.isInitializedPromiseResolved = true; - if (prefObj) { - this.prefs = prefObj; - } - }.bind(this)); - }, - - /** - * Stub function for writing preferences to storage. - * NOTE: This should be overridden by a build-specific function defined below. - * @param {Object} prefObj The preferences that should be written to storage. - * @return {Promise} A promise that is resolved when the preference values - * have been written. - */ - _writeToStorage: function preferences_writeToStorage(prefObj) { - return Promise.resolve(); - }, - - /** - * Stub function for reading preferences from storage. - * NOTE: This should be overridden by a build-specific function defined below. - * @param {Object} prefObj The preferences that should be read from storage. - * @return {Promise} A promise that is resolved with an {Object} containing - * the preferences that have been read. - */ - _readFromStorage: function preferences_readFromStorage(prefObj) { - return Promise.resolve(); - }, - - /** - * Reset the preferences to their default values and update storage. - * @return {Promise} A promise that is resolved when the preference values - * have been reset. - */ - reset: function preferencesReset() { - return this.initializedPromise.then(function() { - this.prefs = Object.create(DEFAULT_PREFERENCES); - return this._writeToStorage(DEFAULT_PREFERENCES); - }.bind(this)); - }, - - /** - * Replace the current preference values with the ones from storage. - * @return {Promise} A promise that is resolved when the preference values - * have been updated. - */ - reload: function preferencesReload() { - return this.initializedPromise.then(function () { - this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) { - if (prefObj) { - this.prefs = prefObj; - } - }.bind(this)); - }.bind(this)); - }, - - /** - * Set the value of a preference. - * @param {string} name The name of the preference that should be changed. - * @param {boolean|number|string} value The new value of the preference. - * @return {Promise} A promise that is resolved when the value has been set, - * provided that the preference exists and the types match. - */ - set: function preferencesSet(name, value) { - return this.initializedPromise.then(function () { - if (DEFAULT_PREFERENCES[name] === undefined) { - throw new Error('preferencesSet: \'' + name + '\' is undefined.'); - } else if (value === undefined) { - throw new Error('preferencesSet: no value is specified.'); - } - var valueType = typeof value; - var defaultType = typeof DEFAULT_PREFERENCES[name]; - - if (valueType !== defaultType) { - if (valueType === 'number' && defaultType === 'string') { - value = value.toString(); - } else { - throw new Error('Preferences_set: \'' + value + '\' is a \"' + - valueType + '\", expected \"' + defaultType + '\".'); - } - } else { - if (valueType === 'number' && (value | 0) !== value) { - throw new Error('Preferences_set: \'' + value + - '\' must be an \"integer\".'); - } - } - this.prefs[name] = value; - return this._writeToStorage(this.prefs); - }.bind(this)); - }, - - /** - * Get the value of a preference. - * @param {string} name The name of the preference whose value is requested. - * @return {Promise} A promise that is resolved with a {boolean|number|string} - * containing the value of the preference. - */ - get: function preferencesGet(name) { - return this.initializedPromise.then(function () { - var defaultValue = DEFAULT_PREFERENCES[name]; - - if (defaultValue === undefined) { - throw new Error('preferencesGet: \'' + name + '\' is undefined.'); - } else { - var prefValue = this.prefs[name]; - - if (prefValue !== undefined) { - return prefValue; - } - } - return defaultValue; - }.bind(this)); - } -}; - - -Preferences._writeToStorage = function (prefObj) { - return new Promise(function (resolve) { - localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj)); - resolve(); - }); -}; - -Preferences._readFromStorage = function (prefObj) { - return new Promise(function (resolve) { - var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences')); - resolve(readPrefs); - }); -}; - - -(function mozPrintCallbackPolyfillClosure() { - if ('mozPrintCallback' in document.createElement('canvas')) { - return; - } - // Cause positive result on feature-detection: - HTMLCanvasElement.prototype.mozPrintCallback = undefined; - - var canvases; // During print task: non-live NodeList of elements - var index; // Index of element that is being processed - - var print = window.print; - window.print = function print() { - if (canvases) { - console.warn('Ignored window.print() because of a pending print job.'); - return; - } - try { - dispatchEvent('beforeprint'); - } finally { - canvases = document.querySelectorAll('canvas'); - index = -1; - next(); - } - }; - - function dispatchEvent(eventType) { - var event = document.createEvent('CustomEvent'); - event.initCustomEvent(eventType, false, false, 'custom'); - window.dispatchEvent(event); - } - - function next() { - if (!canvases) { - return; // Print task cancelled by user (state reset in abort()) - } - - renderProgress(); - if (++index < canvases.length) { - var canvas = canvases[index]; - if (typeof canvas.mozPrintCallback === 'function') { - canvas.mozPrintCallback({ - context: canvas.getContext('2d'), - abort: abort, - done: next - }); - } else { - next(); - } - } else { - renderProgress(); - print.call(window); - setTimeout(abort, 20); // Tidy-up - } - } - - function abort() { - if (canvases) { - canvases = null; - renderProgress(); - dispatchEvent('afterprint'); - } - } - - function renderProgress() { - var progressContainer = document.getElementById('mozPrintCallback-shim'); - if (canvases && canvases.length) { - var progress = Math.round(100 * index / canvases.length); - var progressBar = progressContainer.querySelector('progress'); - var progressPerc = progressContainer.querySelector('.relative-progress'); - progressBar.value = progress; - progressPerc.textContent = progress + '%'; - progressContainer.removeAttribute('hidden'); - progressContainer.onclick = abort; - } else { - progressContainer.setAttribute('hidden', ''); - } - } - - var hasAttachEvent = !!document.attachEvent; - - window.addEventListener('keydown', function(event) { - // Intercept Cmd/Ctrl + P in all browsers. - // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera - if (event.keyCode === 80/*P*/ && (event.ctrlKey || event.metaKey) && - !event.altKey && (!event.shiftKey || window.chrome || window.opera)) { - window.print(); - if (hasAttachEvent) { - // Only attachEvent can cancel Ctrl + P dialog in IE <=10 - // attachEvent is gone in IE11, so the dialog will re-appear in IE11. - return; - } - event.preventDefault(); - if (event.stopImmediatePropagation) { - event.stopImmediatePropagation(); - } else { - event.stopPropagation(); - } - return; - } - if (event.keyCode === 27 && canvases) { // Esc - abort(); - } - }, true); - if (hasAttachEvent) { - document.attachEvent('onkeydown', function(event) { - event = event || window.event; - if (event.keyCode === 80/*P*/ && event.ctrlKey) { - event.keyCode = 0; - return false; - } - }); - } - - if ('onbeforeprint' in window) { - // Do not propagate before/afterprint events when they are not triggered - // from within this polyfill. (FF/IE). - var stopPropagationIfNeeded = function(event) { - if (event.detail !== 'custom' && event.stopImmediatePropagation) { - event.stopImmediatePropagation(); - } - }; - window.addEventListener('beforeprint', stopPropagationIfNeeded, false); - window.addEventListener('afterprint', stopPropagationIfNeeded, false); - } -})(); - - - -var DownloadManager = (function DownloadManagerClosure() { - - function download(blobUrl, filename) { - var a = document.createElement('a'); - if (a.click) { - // Use a.click() if available. Otherwise, Chrome might show - // "Unsafe JavaScript attempt to initiate a navigation change - // for frame with URL" and not open the PDF at all. - // Supported by (not mentioned = untested): - // - Firefox 6 - 19 (4- does not support a.click, 5 ignores a.click) - // - Chrome 19 - 26 (18- does not support a.click) - // - Opera 9 - 12.15 - // - Internet Explorer 6 - 10 - // - Safari 6 (5.1- does not support a.click) - a.href = blobUrl; - a.target = '_parent'; - // Use a.download if available. This increases the likelihood that - // the file is downloaded instead of opened by another PDF plugin. - if ('download' in a) { - a.download = filename; - } - // must be in the document for IE and recent Firefox versions. - // (otherwise .click() is ignored) - (document.body || document.documentElement).appendChild(a); - a.click(); - a.parentNode.removeChild(a); - } else { - if (window.top === window && - blobUrl.split('#')[0] === window.location.href.split('#')[0]) { - // If _parent == self, then opening an identical URL with different - // location hash will only cause a navigation, not a download. - var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&'; - blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&'); - } - window.open(blobUrl, '_parent'); - } - } - - function DownloadManager() {} - - DownloadManager.prototype = { - downloadUrl: function DownloadManager_downloadUrl(url, filename) { - if (!PDFJS.isValidUrl(url, true)) { - return; // restricted/invalid URL - } - - download(url + '#pdfjs.action=download', filename); - }, - - downloadData: function DownloadManager_downloadData(data, filename, - contentType) { - if (navigator.msSaveBlob) { // IE10 and above - return navigator.msSaveBlob(new Blob([data], { type: contentType }), - filename); - } - - var blobUrl = PDFJS.createObjectURL(data, contentType); - download(blobUrl, filename); - }, - - download: function DownloadManager_download(blob, url, filename) { - if (!URL) { - // URL.createObjectURL is not supported - this.downloadUrl(url, filename); - return; - } - - if (navigator.msSaveBlob) { - // IE10 / IE11 - if (!navigator.msSaveBlob(blob, filename)) { - this.downloadUrl(url, filename); - } - return; - } - - var blobUrl = URL.createObjectURL(blob); - download(blobUrl, filename); - } - }; - - return DownloadManager; -})(); - - - - - -var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; - -/** - * View History - This is a utility for saving various view parameters for - * recently opened files. - * - * The way that the view parameters are stored depends on how PDF.js is built, - * for 'node make ' the following cases exist: - * - FIREFOX or MOZCENTRAL - uses sessionStorage. - * - GENERIC or CHROME - uses localStorage, if it is available. - */ -var ViewHistory = (function ViewHistoryClosure() { - function ViewHistory(fingerprint, cacheSize) { - this.fingerprint = fingerprint; - this.cacheSize = cacheSize || DEFAULT_VIEW_HISTORY_CACHE_SIZE; - this.isInitializedPromiseResolved = false; - this.initializedPromise = - this._readFromStorage().then(function (databaseStr) { - this.isInitializedPromiseResolved = true; - - var database = JSON.parse(databaseStr || '{}'); - if (!('files' in database)) { - database.files = []; - } - if (database.files.length >= this.cacheSize) { - database.files.shift(); - } - var index; - for (var i = 0, length = database.files.length; i < length; i++) { - var branch = database.files[i]; - if (branch.fingerprint === this.fingerprint) { - index = i; - break; - } - } - if (typeof index !== 'number') { - index = database.files.push({fingerprint: this.fingerprint}) - 1; - } - this.file = database.files[index]; - this.database = database; - }.bind(this)); - } - - ViewHistory.prototype = { - _writeToStorage: function ViewHistory_writeToStorage() { - return new Promise(function (resolve) { - var databaseStr = JSON.stringify(this.database); - - - localStorage.setItem('database', databaseStr); - resolve(); - }.bind(this)); - }, - - _readFromStorage: function ViewHistory_readFromStorage() { - return new Promise(function (resolve) { - - resolve(localStorage.getItem('database')); - }); - }, - - set: function ViewHistory_set(name, val) { - if (!this.isInitializedPromiseResolved) { - return; - } - this.file[name] = val; - return this._writeToStorage(); - }, - - setMultiple: function ViewHistory_setMultiple(properties) { - if (!this.isInitializedPromiseResolved) { - return; - } - for (var name in properties) { - this.file[name] = properties[name]; - } - return this._writeToStorage(); - }, - - get: function ViewHistory_get(name, defaultValue) { - if (!this.isInitializedPromiseResolved) { - return defaultValue; - } - return this.file[name] || defaultValue; - } - }; - - return ViewHistory; -})(); - - -/** - * Creates a "search bar" given a set of DOM elements that act as controls - * for searching or for setting search preferences in the UI. This object - * also sets up the appropriate events for the controls. Actual searching - * is done by PDFFindController. - */ -var PDFFindBar = (function PDFFindBarClosure() { - function PDFFindBar(options) { - this.opened = false; - this.bar = options.bar || null; - this.toggleButton = options.toggleButton || null; - this.findField = options.findField || null; - this.highlightAll = options.highlightAllCheckbox || null; - this.caseSensitive = options.caseSensitiveCheckbox || null; - this.findMsg = options.findMsg || null; - this.findResultsCount = options.findResultsCount || null; - this.findStatusIcon = options.findStatusIcon || null; - this.findPreviousButton = options.findPreviousButton || null; - this.findNextButton = options.findNextButton || null; - this.findController = options.findController || null; - - if (this.findController === null) { - throw new Error('PDFFindBar cannot be used without a ' + - 'PDFFindController instance.'); - } - - // Add event listeners to the DOM elements. - var self = this; - this.toggleButton.addEventListener('click', function() { - self.toggle(); - }); - - this.findField.addEventListener('input', function() { - self.dispatchEvent(''); - }); - - this.bar.addEventListener('keydown', function(evt) { - switch (evt.keyCode) { - case 13: // Enter - if (evt.target === self.findField) { - self.dispatchEvent('again', evt.shiftKey); - } - break; - case 27: // Escape - self.close(); - break; - } - }); - - this.findPreviousButton.addEventListener('click', function() { - self.dispatchEvent('again', true); - }); - - this.findNextButton.addEventListener('click', function() { - self.dispatchEvent('again', false); - }); - - this.highlightAll.addEventListener('click', function() { - self.dispatchEvent('highlightallchange'); - }); - - this.caseSensitive.addEventListener('click', function() { - self.dispatchEvent('casesensitivitychange'); - }); - } - - PDFFindBar.prototype = { - dispatchEvent: function PDFFindBar_dispatchEvent(type, findPrev) { - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('find' + type, true, true, { - query: this.findField.value, - caseSensitive: this.caseSensitive.checked, - highlightAll: this.highlightAll.checked, - findPrevious: findPrev - }); - return window.dispatchEvent(event); - }, - - updateUIState: - function PDFFindBar_updateUIState(state, previous, matchCount) { - var notFound = false; - var findMsg = ''; - var status = ''; - - switch (state) { - case FindStates.FIND_FOUND: - break; - - case FindStates.FIND_PENDING: - status = 'pending'; - break; - - case FindStates.FIND_NOTFOUND: - findMsg = 'Phrase not found'; - notFound = true; - break; - - case FindStates.FIND_WRAPPED: - if (previous) { - findMsg = 'Reached top of document, continued from bottom'; - } else { - findMsg = 'Reached end of document, continued from top'; - } - break; - } - - if (notFound) { - this.findField.classList.add('notFound'); - } else { - this.findField.classList.remove('notFound'); - } - - this.findField.setAttribute('data-status', status); - this.findMsg.textContent = findMsg; - - this.updateResultsCount(matchCount); - }, - - updateResultsCount: function(matchCount) { - if (!this.findResultsCount) { - return; // no UI control is provided - } - - // If there are no matches, hide the counter - if (!matchCount) { - this.findResultsCount.classList.add('hidden'); - return; - } - - // Create the match counter - this.findResultsCount.textContent = matchCount.toLocaleString(); - - // Show the counter - this.findResultsCount.classList.remove('hidden'); - }, - - open: function PDFFindBar_open() { - if (!this.opened) { - this.opened = true; - this.toggleButton.classList.add('toggled'); - this.bar.classList.remove('hidden'); - } - this.findField.select(); - this.findField.focus(); - }, - - close: function PDFFindBar_close() { - if (!this.opened) { - return; - } - this.opened = false; - this.toggleButton.classList.remove('toggled'); - this.bar.classList.add('hidden'); - this.findController.active = false; - }, - - toggle: function PDFFindBar_toggle() { - if (this.opened) { - this.close(); - } else { - this.open(); - } - } - }; - return PDFFindBar; -})(); - - -var FindStates = { - FIND_FOUND: 0, - FIND_NOTFOUND: 1, - FIND_WRAPPED: 2, - FIND_PENDING: 3 -}; - -var FIND_SCROLL_OFFSET_TOP = -50; -var FIND_SCROLL_OFFSET_LEFT = -400; - -/** - * Provides "search" or "find" functionality for the PDF. - * This object actually performs the search for a given string. - */ -var PDFFindController = (function PDFFindControllerClosure() { - function PDFFindController(options) { - this.startedTextExtraction = false; - this.extractTextPromises = []; - this.pendingFindMatches = {}; - this.active = false; // If active, find results will be highlighted. - this.pageContents = []; // Stores the text for each page. - this.pageMatches = []; - this.matchCount = 0; - this.selected = { // Currently selected match. - pageIdx: -1, - matchIdx: -1 - }; - this.offset = { // Where the find algorithm currently is in the document. - pageIdx: null, - matchIdx: null - }; - this.pagesToSearch = null; - this.resumePageIdx = null; - this.state = null; - this.dirtyMatch = false; - this.findTimeout = null; - this.pdfViewer = options.pdfViewer || null; - this.integratedFind = options.integratedFind || false; - this.charactersToNormalize = { - '\u2018': '\'', // Left single quotation mark - '\u2019': '\'', // Right single quotation mark - '\u201A': '\'', // Single low-9 quotation mark - '\u201B': '\'', // Single high-reversed-9 quotation mark - '\u201C': '"', // Left double quotation mark - '\u201D': '"', // Right double quotation mark - '\u201E': '"', // Double low-9 quotation mark - '\u201F': '"', // Double high-reversed-9 quotation mark - '\u00BC': '1/4', // Vulgar fraction one quarter - '\u00BD': '1/2', // Vulgar fraction one half - '\u00BE': '3/4', // Vulgar fraction three quarters - }; - this.findBar = options.findBar || null; - - // Compile the regular expression for text normalization once - var replace = Object.keys(this.charactersToNormalize).join(''); - this.normalizationRegex = new RegExp('[' + replace + ']', 'g'); - - var events = [ - 'find', - 'findagain', - 'findhighlightallchange', - 'findcasesensitivitychange' - ]; - - this.firstPagePromise = new Promise(function (resolve) { - this.resolveFirstPage = resolve; - }.bind(this)); - this.handleEvent = this.handleEvent.bind(this); - - for (var i = 0, len = events.length; i < len; i++) { - window.addEventListener(events[i], this.handleEvent); - } - } - - PDFFindController.prototype = { - setFindBar: function PDFFindController_setFindBar(findBar) { - this.findBar = findBar; - }, - - reset: function PDFFindController_reset() { - this.startedTextExtraction = false; - this.extractTextPromises = []; - this.active = false; - }, - - normalize: function PDFFindController_normalize(text) { - var self = this; - return text.replace(this.normalizationRegex, function (ch) { - return self.charactersToNormalize[ch]; - }); - }, - - calcFindMatch: function PDFFindController_calcFindMatch(pageIndex) { - var pageContent = this.normalize(this.pageContents[pageIndex]); - var query = this.normalize(this.state.query); - var caseSensitive = this.state.caseSensitive; - var queryLen = query.length; - - if (queryLen === 0) { - // Do nothing: the matches should be wiped out already. - return; - } - - if (!caseSensitive) { - pageContent = pageContent.toLowerCase(); - query = query.toLowerCase(); - } - - var matches = []; - var matchIdx = -queryLen; - while (true) { - matchIdx = pageContent.indexOf(query, matchIdx + queryLen); - if (matchIdx === -1) { - break; - } - matches.push(matchIdx); - } - this.pageMatches[pageIndex] = matches; - this.updatePage(pageIndex); - if (this.resumePageIdx === pageIndex) { - this.resumePageIdx = null; - this.nextPageMatch(); - } - - // Update the matches count - if (matches.length > 0) { - this.matchCount += matches.length; - this.updateUIResultsCount(); - } - }, - - extractText: function PDFFindController_extractText() { - if (this.startedTextExtraction) { - return; - } - this.startedTextExtraction = true; - - this.pageContents = []; - var extractTextPromisesResolves = []; - var numPages = this.pdfViewer.pagesCount; - for (var i = 0; i < numPages; i++) { - this.extractTextPromises.push(new Promise(function (resolve) { - extractTextPromisesResolves.push(resolve); - })); - } - - var self = this; - function extractPageText(pageIndex) { - self.pdfViewer.getPageTextContent(pageIndex).then( - function textContentResolved(textContent) { - var textItems = textContent.items; - var str = []; - - for (var i = 0, len = textItems.length; i < len; i++) { - str.push(textItems[i].str); - } - - // Store the pageContent as a string. - self.pageContents.push(str.join('')); - - extractTextPromisesResolves[pageIndex](pageIndex); - if ((pageIndex + 1) < self.pdfViewer.pagesCount) { - extractPageText(pageIndex + 1); - } - } - ); - } - extractPageText(0); - }, - - handleEvent: function PDFFindController_handleEvent(e) { - if (this.state === null || e.type !== 'findagain') { - this.dirtyMatch = true; - } - this.state = e.detail; - this.updateUIState(FindStates.FIND_PENDING); - - this.firstPagePromise.then(function() { - this.extractText(); - - clearTimeout(this.findTimeout); - if (e.type === 'find') { - // Only trigger the find action after 250ms of silence. - this.findTimeout = setTimeout(this.nextMatch.bind(this), 250); - } else { - this.nextMatch(); - } - }.bind(this)); - }, - - updatePage: function PDFFindController_updatePage(index) { - if (this.selected.pageIdx === index) { - // If the page is selected, scroll the page into view, which triggers - // rendering the page, which adds the textLayer. Once the textLayer is - // build, it will scroll onto the selected match. - this.pdfViewer.scrollPageIntoView(index + 1); - } - - var page = this.pdfViewer.getPageView(index); - if (page.textLayer) { - page.textLayer.updateMatches(); - } - }, - - nextMatch: function PDFFindController_nextMatch() { - var previous = this.state.findPrevious; - var currentPageIndex = this.pdfViewer.currentPageNumber - 1; - var numPages = this.pdfViewer.pagesCount; - - this.active = true; - - if (this.dirtyMatch) { - // Need to recalculate the matches, reset everything. - this.dirtyMatch = false; - this.selected.pageIdx = this.selected.matchIdx = -1; - this.offset.pageIdx = currentPageIndex; - this.offset.matchIdx = null; - this.hadMatch = false; - this.resumePageIdx = null; - this.pageMatches = []; - this.matchCount = 0; - var self = this; - - for (var i = 0; i < numPages; i++) { - // Wipe out any previous highlighted matches. - this.updatePage(i); - - // As soon as the text is extracted start finding the matches. - if (!(i in this.pendingFindMatches)) { - this.pendingFindMatches[i] = true; - this.extractTextPromises[i].then(function(pageIdx) { - delete self.pendingFindMatches[pageIdx]; - self.calcFindMatch(pageIdx); - }); - } - } - } - - // If there's no query there's no point in searching. - if (this.state.query === '') { - this.updateUIState(FindStates.FIND_FOUND); - return; - } - - // If we're waiting on a page, we return since we can't do anything else. - if (this.resumePageIdx) { - return; - } - - var offset = this.offset; - // Keep track of how many pages we should maximally iterate through. - this.pagesToSearch = numPages; - // If there's already a matchIdx that means we are iterating through a - // page's matches. - if (offset.matchIdx !== null) { - var numPageMatches = this.pageMatches[offset.pageIdx].length; - if ((!previous && offset.matchIdx + 1 < numPageMatches) || - (previous && offset.matchIdx > 0)) { - // The simple case; we just have advance the matchIdx to select - // the next match on the page. - this.hadMatch = true; - offset.matchIdx = (previous ? offset.matchIdx - 1 : - offset.matchIdx + 1); - this.updateMatch(true); - return; - } - // We went beyond the current page's matches, so we advance to - // the next page. - this.advanceOffsetPage(previous); - } - // Start searching through the page. - this.nextPageMatch(); - }, - - matchesReady: function PDFFindController_matchesReady(matches) { - var offset = this.offset; - var numMatches = matches.length; - var previous = this.state.findPrevious; - - if (numMatches) { - // There were matches for the page, so initialize the matchIdx. - this.hadMatch = true; - offset.matchIdx = (previous ? numMatches - 1 : 0); - this.updateMatch(true); - return true; - } else { - // No matches, so attempt to search the next page. - this.advanceOffsetPage(previous); - if (offset.wrapped) { - offset.matchIdx = null; - if (this.pagesToSearch < 0) { - // No point in wrapping again, there were no matches. - this.updateMatch(false); - // while matches were not found, searching for a page - // with matches should nevertheless halt. - return true; - } - } - // Matches were not found (and searching is not done). - return false; - } - }, - - /** - * The method is called back from the text layer when match presentation - * is updated. - * @param {number} pageIndex - page index. - * @param {number} index - match index. - * @param {Array} elements - text layer div elements array. - * @param {number} beginIdx - start index of the div array for the match. - * @param {number} endIdx - end index of the div array for the match. - */ - updateMatchPosition: function PDFFindController_updateMatchPosition( - pageIndex, index, elements, beginIdx, endIdx) { - if (this.selected.matchIdx === index && - this.selected.pageIdx === pageIndex) { - var spot = { - top: FIND_SCROLL_OFFSET_TOP, - left: FIND_SCROLL_OFFSET_LEFT - }; - scrollIntoView(elements[beginIdx], spot, - /* skipOverflowHiddenElements = */ true); - } - }, - - nextPageMatch: function PDFFindController_nextPageMatch() { - if (this.resumePageIdx !== null) { - console.error('There can only be one pending page.'); - } - do { - var pageIdx = this.offset.pageIdx; - var matches = this.pageMatches[pageIdx]; - if (!matches) { - // The matches don't exist yet for processing by "matchesReady", - // so set a resume point for when they do exist. - this.resumePageIdx = pageIdx; - break; - } - } while (!this.matchesReady(matches)); - }, - - advanceOffsetPage: function PDFFindController_advanceOffsetPage(previous) { - var offset = this.offset; - var numPages = this.extractTextPromises.length; - offset.pageIdx = (previous ? offset.pageIdx - 1 : offset.pageIdx + 1); - offset.matchIdx = null; - - this.pagesToSearch--; - - if (offset.pageIdx >= numPages || offset.pageIdx < 0) { - offset.pageIdx = (previous ? numPages - 1 : 0); - offset.wrapped = true; - } - }, - - updateMatch: function PDFFindController_updateMatch(found) { - var state = FindStates.FIND_NOTFOUND; - var wrapped = this.offset.wrapped; - this.offset.wrapped = false; - - if (found) { - var previousPage = this.selected.pageIdx; - this.selected.pageIdx = this.offset.pageIdx; - this.selected.matchIdx = this.offset.matchIdx; - state = (wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND); - // Update the currently selected page to wipe out any selected matches. - if (previousPage !== -1 && previousPage !== this.selected.pageIdx) { - this.updatePage(previousPage); - } - } - - this.updateUIState(state, this.state.findPrevious); - if (this.selected.pageIdx !== -1) { - this.updatePage(this.selected.pageIdx); - } - }, - - updateUIResultsCount: - function PDFFindController_updateUIResultsCount() { - if (this.findBar === null) { - throw new Error('PDFFindController is not initialized with a ' + - 'PDFFindBar instance.'); - } - this.findBar.updateResultsCount(this.matchCount); - }, - - updateUIState: function PDFFindController_updateUIState(state, previous) { - if (this.integratedFind) { - FirefoxCom.request('updateFindControlState', - { result: state, findPrevious: previous }); - return; - } - if (this.findBar === null) { - throw new Error('PDFFindController is not initialized with a ' + - 'PDFFindBar instance.'); - } - this.findBar.updateUIState(state, previous, this.matchCount); - } - }; - return PDFFindController; -})(); - - -/** - * Performs navigation functions inside PDF, such as opening specified page, - * or destination. - * @class - * @implements {IPDFLinkService} - */ -var PDFLinkService = (function () { - /** - * @constructs PDFLinkService - */ - function PDFLinkService() { - this.baseUrl = null; - this.pdfDocument = null; - this.pdfViewer = null; - this.pdfHistory = null; - - this._pagesRefCache = null; - } - - PDFLinkService.prototype = { - setDocument: function PDFLinkService_setDocument(pdfDocument, baseUrl) { - this.baseUrl = baseUrl; - this.pdfDocument = pdfDocument; - this._pagesRefCache = Object.create(null); - }, - - setViewer: function PDFLinkService_setViewer(pdfViewer) { - this.pdfViewer = pdfViewer; - }, - - setHistory: function PDFLinkService_setHistory(pdfHistory) { - this.pdfHistory = pdfHistory; - }, - - /** - * @returns {number} - */ - get pagesCount() { - return this.pdfDocument.numPages; - }, - - /** - * @returns {number} - */ - get page() { - return this.pdfViewer.currentPageNumber; - }, - - /** - * @param {number} value - */ - set page(value) { - this.pdfViewer.currentPageNumber = value; - }, - - /** - * @param dest - The PDF destination object. - */ - navigateTo: function PDFLinkService_navigateTo(dest) { - var destString = ''; - var self = this; - - var goToDestination = function(destRef) { - // dest array looks like that: - var pageNumber = destRef instanceof Object ? - self._pagesRefCache[destRef.num + ' ' + destRef.gen + ' R'] : - (destRef + 1); - if (pageNumber) { - if (pageNumber > self.pagesCount) { - pageNumber = self.pagesCount; - } - self.pdfViewer.scrollPageIntoView(pageNumber, dest); - - if (self.pdfHistory) { - // Update the browsing history. - self.pdfHistory.push({ - dest: dest, - hash: destString, - page: pageNumber - }); - } - } else { - self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) { - var pageNum = pageIndex + 1; - var cacheKey = destRef.num + ' ' + destRef.gen + ' R'; - self._pagesRefCache[cacheKey] = pageNum; - goToDestination(destRef); - }); - } - }; - - var destinationPromise; - if (typeof dest === 'string') { - destString = dest; - destinationPromise = this.pdfDocument.getDestination(dest); - } else { - destinationPromise = Promise.resolve(dest); - } - destinationPromise.then(function(destination) { - dest = destination; - if (!(destination instanceof Array)) { - return; // invalid destination - } - goToDestination(destination[0]); - }); - }, - - /** - * @param dest - The PDF destination object. - * @returns {string} The hyperlink to the PDF object. - */ - getDestinationHash: function PDFLinkService_getDestinationHash(dest) { - if (typeof dest === 'string') { - return this.getAnchorUrl('#' + escape(dest)); - } - if (dest instanceof Array) { - var destRef = dest[0]; // see navigateTo method for dest format - var pageNumber = destRef instanceof Object ? - this._pagesRefCache[destRef.num + ' ' + destRef.gen + ' R'] : - (destRef + 1); - if (pageNumber) { - var pdfOpenParams = this.getAnchorUrl('#page=' + pageNumber); - var destKind = dest[1]; - if (typeof destKind === 'object' && 'name' in destKind && - destKind.name === 'XYZ') { - var scale = (dest[4] || this.pdfViewer.currentScaleValue); - var scaleNumber = parseFloat(scale); - if (scaleNumber) { - scale = scaleNumber * 100; - } - pdfOpenParams += '&zoom=' + scale; - if (dest[2] || dest[3]) { - pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0); - } - } - return pdfOpenParams; - } - } - return this.getAnchorUrl(''); - }, - - /** - * Prefix the full url on anchor links to make sure that links are resolved - * relative to the current URL instead of the one defined in . - * @param {String} anchor The anchor hash, including the #. - * @returns {string} The hyperlink to the PDF object. - */ - getAnchorUrl: function PDFLinkService_getAnchorUrl(anchor) { - return (this.baseUrl || '') + anchor; - }, - - /** - * @param {string} hash - */ - setHash: function PDFLinkService_setHash(hash) { - if (hash.indexOf('=') >= 0) { - var params = parseQueryString(hash); - // borrowing syntax from "Parameters for Opening PDF Files" - if ('nameddest' in params) { - if (this.pdfHistory) { - this.pdfHistory.updateNextHashParam(params.nameddest); - } - this.navigateTo(params.nameddest); - return; - } - var pageNumber, dest; - if ('page' in params) { - pageNumber = (params.page | 0) || 1; - } - if ('zoom' in params) { - // Build the destination array. - var zoomArgs = params.zoom.split(','); // scale,left,top - var zoomArg = zoomArgs[0]; - var zoomArgNumber = parseFloat(zoomArg); - - if (zoomArg.indexOf('Fit') === -1) { - // If the zoomArg is a number, it has to get divided by 100. If it's - // a string, it should stay as it is. - dest = [null, { name: 'XYZ' }, - zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null, - zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null, - (zoomArgNumber ? zoomArgNumber / 100 : zoomArg)]; - } else { - if (zoomArg === 'Fit' || zoomArg === 'FitB') { - dest = [null, { name: zoomArg }]; - } else if ((zoomArg === 'FitH' || zoomArg === 'FitBH') || - (zoomArg === 'FitV' || zoomArg === 'FitBV')) { - dest = [null, { name: zoomArg }, - zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null]; - } else if (zoomArg === 'FitR') { - if (zoomArgs.length !== 5) { - console.error('PDFLinkService_setHash: ' + - 'Not enough parameters for \'FitR\'.'); - } else { - dest = [null, { name: zoomArg }, - (zoomArgs[1] | 0), (zoomArgs[2] | 0), - (zoomArgs[3] | 0), (zoomArgs[4] | 0)]; - } - } else { - console.error('PDFLinkService_setHash: \'' + zoomArg + - '\' is not a valid zoom value.'); - } - } - } - if (dest) { - this.pdfViewer.scrollPageIntoView(pageNumber || this.page, dest); - } else if (pageNumber) { - this.page = pageNumber; // simple page - } - if ('pagemode' in params) { - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('pagemode', true, true, { - mode: params.pagemode, - }); - this.pdfViewer.container.dispatchEvent(event); - } - } else if (/^\d+$/.test(hash)) { // page number - this.page = hash; - } else { // named destination - if (this.pdfHistory) { - this.pdfHistory.updateNextHashParam(unescape(hash)); - } - this.navigateTo(unescape(hash)); - } - }, - - /** - * @param {string} action - */ - executeNamedAction: function PDFLinkService_executeNamedAction(action) { - // See PDF reference, table 8.45 - Named action - switch (action) { - case 'GoBack': - if (this.pdfHistory) { - this.pdfHistory.back(); - } - break; - - case 'GoForward': - if (this.pdfHistory) { - this.pdfHistory.forward(); - } - break; - - case 'NextPage': - this.page++; - break; - - case 'PrevPage': - this.page--; - break; - - case 'LastPage': - this.page = this.pagesCount; - break; - - case 'FirstPage': - this.page = 1; - break; - - default: - break; // No action according to spec - } - - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('namedaction', true, true, { - action: action - }); - this.pdfViewer.container.dispatchEvent(event); - }, - - /** - * @param {number} pageNum - page number. - * @param {Object} pageRef - reference to the page. - */ - cachePageRef: function PDFLinkService_cachePageRef(pageNum, pageRef) { - var refStr = pageRef.num + ' ' + pageRef.gen + ' R'; - this._pagesRefCache[refStr] = pageNum; - } - }; - - return PDFLinkService; -})(); - - -var PDFHistory = (function () { - function PDFHistory(options) { - this.linkService = options.linkService; - - this.initialized = false; - this.initialDestination = null; - this.initialBookmark = null; - } - - PDFHistory.prototype = { - /** - * @param {string} fingerprint - * @param {IPDFLinkService} linkService - */ - initialize: function pdfHistoryInitialize(fingerprint) { - this.initialized = true; - this.reInitialized = false; - this.allowHashChange = true; - this.historyUnlocked = true; - this.isViewerInPresentationMode = false; - - this.previousHash = window.location.hash.substring(1); - this.currentBookmark = ''; - this.currentPage = 0; - this.updatePreviousBookmark = false; - this.previousBookmark = ''; - this.previousPage = 0; - this.nextHashParam = ''; - - this.fingerprint = fingerprint; - this.currentUid = this.uid = 0; - this.current = {}; - - var state = window.history.state; - if (this._isStateObjectDefined(state)) { - // This corresponds to navigating back to the document - // from another page in the browser history. - if (state.target.dest) { - this.initialDestination = state.target.dest; - } else { - this.initialBookmark = state.target.hash; - } - this.currentUid = state.uid; - this.uid = state.uid + 1; - this.current = state.target; - } else { - // This corresponds to the loading of a new document. - if (state && state.fingerprint && - this.fingerprint !== state.fingerprint) { - // Reinitialize the browsing history when a new document - // is opened in the web viewer. - this.reInitialized = true; - } - this._pushOrReplaceState({fingerprint: this.fingerprint}, true); - } - - var self = this; - window.addEventListener('popstate', function pdfHistoryPopstate(evt) { - if (!self.historyUnlocked) { - return; - } - if (evt.state) { - // Move back/forward in the history. - self._goTo(evt.state); - return; - } - - // If the state is not set, then the user tried to navigate to a - // different hash by manually editing the URL and pressing Enter, or by - // clicking on an in-page link (e.g. the "current view" link). - // Save the current view state to the browser history. - - // Note: In Firefox, history.null could also be null after an in-page - // navigation to the same URL, and without dispatching the popstate - // event: https://bugzilla.mozilla.org/show_bug.cgi?id=1183881 - - if (self.uid === 0) { - // Replace the previous state if it was not explicitly set. - var previousParams = (self.previousHash && self.currentBookmark && - self.previousHash !== self.currentBookmark) ? - {hash: self.currentBookmark, page: self.currentPage} : - {page: 1}; - replacePreviousHistoryState(previousParams, function() { - updateHistoryWithCurrentHash(); - }); - } else { - updateHistoryWithCurrentHash(); - } - }, false); - - - function updateHistoryWithCurrentHash() { - self.previousHash = window.location.hash.slice(1); - self._pushToHistory({hash: self.previousHash}, false, true); - self._updatePreviousBookmark(); - } - - function replacePreviousHistoryState(params, callback) { - // To modify the previous history entry, the following happens: - // 1. history.back() - // 2. _pushToHistory, which calls history.replaceState( ... ) - // 3. history.forward() - // Because a navigation via the history API does not immediately update - // the history state, the popstate event is used for synchronization. - self.historyUnlocked = false; - - // Suppress the hashchange event to avoid side effects caused by - // navigating back and forward. - self.allowHashChange = false; - window.addEventListener('popstate', rewriteHistoryAfterBack); - history.back(); - - function rewriteHistoryAfterBack() { - window.removeEventListener('popstate', rewriteHistoryAfterBack); - window.addEventListener('popstate', rewriteHistoryAfterForward); - self._pushToHistory(params, false, true); - history.forward(); - } - function rewriteHistoryAfterForward() { - window.removeEventListener('popstate', rewriteHistoryAfterForward); - self.allowHashChange = true; - self.historyUnlocked = true; - callback(); - } - } - - function pdfHistoryBeforeUnload() { - var previousParams = self._getPreviousParams(null, true); - if (previousParams) { - var replacePrevious = (!self.current.dest && - self.current.hash !== self.previousHash); - self._pushToHistory(previousParams, false, replacePrevious); - self._updatePreviousBookmark(); - } - // Remove the event listener when navigating away from the document, - // since 'beforeunload' prevents Firefox from caching the document. - window.removeEventListener('beforeunload', pdfHistoryBeforeUnload, - false); - } - - window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false); - - window.addEventListener('pageshow', function pdfHistoryPageShow(evt) { - // If the entire viewer (including the PDF file) is cached in - // the browser, we need to reattach the 'beforeunload' event listener - // since the 'DOMContentLoaded' event is not fired on 'pageshow'. - window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false); - }, false); - - window.addEventListener('presentationmodechanged', function(e) { - self.isViewerInPresentationMode = !!e.detail.active; - }); - }, - - clearHistoryState: function pdfHistory_clearHistoryState() { - this._pushOrReplaceState(null, true); - }, - - _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) { - return (state && state.uid >= 0 && - state.fingerprint && this.fingerprint === state.fingerprint && - state.target && state.target.hash) ? true : false; - }, - - _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj, - replace) { - if (replace) { - window.history.replaceState(stateObj, '', document.URL); - } else { - window.history.pushState(stateObj, '', document.URL); - } - }, - - get isHashChangeUnlocked() { - if (!this.initialized) { - return true; - } - return this.allowHashChange; - }, - - _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() { - if (this.updatePreviousBookmark && - this.currentBookmark && this.currentPage) { - this.previousBookmark = this.currentBookmark; - this.previousPage = this.currentPage; - this.updatePreviousBookmark = false; - } - }, - - updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark, - pageNum) { - if (this.initialized) { - this.currentBookmark = bookmark.substring(1); - this.currentPage = pageNum | 0; - this._updatePreviousBookmark(); - } - }, - - updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) { - if (this.initialized) { - this.nextHashParam = param; - } - }, - - push: function pdfHistoryPush(params, isInitialBookmark) { - if (!(this.initialized && this.historyUnlocked)) { - return; - } - if (params.dest && !params.hash) { - params.hash = (this.current.hash && this.current.dest && - this.current.dest === params.dest) ? - this.current.hash : - this.linkService.getDestinationHash(params.dest).split('#')[1]; - } - if (params.page) { - params.page |= 0; - } - if (isInitialBookmark) { - var target = window.history.state.target; - if (!target) { - // Invoked when the user specifies an initial bookmark, - // thus setting initialBookmark, when the document is loaded. - this._pushToHistory(params, false); - this.previousHash = window.location.hash.substring(1); - } - this.updatePreviousBookmark = this.nextHashParam ? false : true; - if (target) { - // If the current document is reloaded, - // avoid creating duplicate entries in the history. - this._updatePreviousBookmark(); - } - return; - } - if (this.nextHashParam) { - if (this.nextHashParam === params.hash) { - this.nextHashParam = null; - this.updatePreviousBookmark = true; - return; - } else { - this.nextHashParam = null; - } - } - - if (params.hash) { - if (this.current.hash) { - if (this.current.hash !== params.hash) { - this._pushToHistory(params, true); - } else { - if (!this.current.page && params.page) { - this._pushToHistory(params, false, true); - } - this.updatePreviousBookmark = true; - } - } else { - this._pushToHistory(params, true); - } - } else if (this.current.page && params.page && - this.current.page !== params.page) { - this._pushToHistory(params, true); - } - }, - - _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage, - beforeUnload) { - if (!(this.currentBookmark && this.currentPage)) { - return null; - } else if (this.updatePreviousBookmark) { - this.updatePreviousBookmark = false; - } - if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) { - // Prevent the history from getting stuck in the current state, - // effectively preventing the user from going back/forward in - // the history. - // - // This happens if the current position in the document didn't change - // when the history was previously updated. The reasons for this are - // either: - // 1. The current zoom value is such that the document does not need to, - // or cannot, be scrolled to display the destination. - // 2. The previous destination is broken, and doesn't actally point to a - // position within the document. - // (This is either due to a bad PDF generator, or the user making a - // mistake when entering a destination in the hash parameters.) - return null; - } - if ((!this.current.dest && !onlyCheckPage) || beforeUnload) { - if (this.previousBookmark === this.currentBookmark) { - return null; - } - } else if (this.current.page || onlyCheckPage) { - if (this.previousPage === this.currentPage) { - return null; - } - } else { - return null; - } - var params = {hash: this.currentBookmark, page: this.currentPage}; - if (this.isViewerInPresentationMode) { - params.hash = null; - } - return params; - }, - - _stateObj: function pdfHistory_stateObj(params) { - return {fingerprint: this.fingerprint, uid: this.uid, target: params}; - }, - - _pushToHistory: function pdfHistory_pushToHistory(params, - addPrevious, overwrite) { - if (!this.initialized) { - return; - } - if (!params.hash && params.page) { - params.hash = ('page=' + params.page); - } - if (addPrevious && !overwrite) { - var previousParams = this._getPreviousParams(); - if (previousParams) { - var replacePrevious = (!this.current.dest && - this.current.hash !== this.previousHash); - this._pushToHistory(previousParams, false, replacePrevious); - } - } - this._pushOrReplaceState(this._stateObj(params), - (overwrite || this.uid === 0)); - this.currentUid = this.uid++; - this.current = params; - this.updatePreviousBookmark = true; - }, - - _goTo: function pdfHistory_goTo(state) { - if (!(this.initialized && this.historyUnlocked && - this._isStateObjectDefined(state))) { - return; - } - if (!this.reInitialized && state.uid < this.currentUid) { - var previousParams = this._getPreviousParams(true); - if (previousParams) { - this._pushToHistory(this.current, false); - this._pushToHistory(previousParams, false); - this.currentUid = state.uid; - window.history.back(); - return; - } - } - this.historyUnlocked = false; - - if (state.target.dest) { - this.linkService.navigateTo(state.target.dest); - } else { - this.linkService.setHash(state.target.hash); - } - this.currentUid = state.uid; - if (state.uid > this.uid) { - this.uid = state.uid; - } - this.current = state.target; - this.updatePreviousBookmark = true; - - var currentHash = window.location.hash.substring(1); - if (this.previousHash !== currentHash) { - this.allowHashChange = false; - } - this.previousHash = currentHash; - - this.historyUnlocked = true; - }, - - back: function pdfHistoryBack() { - this.go(-1); - }, - - forward: function pdfHistoryForward() { - this.go(1); - }, - - go: function pdfHistoryGo(direction) { - if (this.initialized && this.historyUnlocked) { - var state = window.history.state; - if (direction === -1 && state && state.uid > 0) { - window.history.back(); - } else if (direction === 1 && state && state.uid < (this.uid - 1)) { - window.history.forward(); - } - } - } - }; - - return PDFHistory; -})(); - - -var SecondaryToolbar = { - opened: false, - previousContainerHeight: null, - newContainerHeight: null, - - initialize: function secondaryToolbarInitialize(options) { - this.toolbar = options.toolbar; - this.buttonContainer = this.toolbar.firstElementChild; - - // Define the toolbar buttons. - this.toggleButton = options.toggleButton; - this.presentationModeButton = options.presentationModeButton; - this.openFile = options.openFile; - this.print = options.print; - this.download = options.download; - this.viewBookmark = options.viewBookmark; - this.firstPage = options.firstPage; - this.lastPage = options.lastPage; - this.pageRotateCw = options.pageRotateCw; - this.pageRotateCcw = options.pageRotateCcw; - this.documentPropertiesButton = options.documentPropertiesButton; - - // Attach the event listeners. - var elements = [ - // Button to toggle the visibility of the secondary toolbar: - { element: this.toggleButton, handler: this.toggle }, - // All items within the secondary toolbar - // (except for toggleHandTool, hand_tool.js is responsible for it): - { element: this.presentationModeButton, - handler: this.presentationModeClick }, - { element: this.openFile, handler: this.openFileClick }, - { element: this.print, handler: this.printClick }, - { element: this.download, handler: this.downloadClick }, - { element: this.viewBookmark, handler: this.viewBookmarkClick }, - { element: this.firstPage, handler: this.firstPageClick }, - { element: this.lastPage, handler: this.lastPageClick }, - { element: this.pageRotateCw, handler: this.pageRotateCwClick }, - { element: this.pageRotateCcw, handler: this.pageRotateCcwClick }, - { element: this.documentPropertiesButton, - handler: this.documentPropertiesClick } - ]; - - for (var item in elements) { - var element = elements[item].element; - if (element) { - element.addEventListener('click', elements[item].handler.bind(this)); - } - } - }, - - // Event handling functions. - presentationModeClick: function secondaryToolbarPresentationModeClick(evt) { - PDFViewerApplication.requestPresentationMode(); - this.close(); - }, - - openFileClick: function secondaryToolbarOpenFileClick(evt) { - document.getElementById('fileInput').click(); - this.close(); - }, - - printClick: function secondaryToolbarPrintClick(evt) { - window.print(); - this.close(); - }, - - downloadClick: function secondaryToolbarDownloadClick(evt) { - PDFViewerApplication.download(); - this.close(); - }, - - viewBookmarkClick: function secondaryToolbarViewBookmarkClick(evt) { - this.close(); - }, - - firstPageClick: function secondaryToolbarFirstPageClick(evt) { - PDFViewerApplication.page = 1; - this.close(); - }, - - lastPageClick: function secondaryToolbarLastPageClick(evt) { - if (PDFViewerApplication.pdfDocument) { - PDFViewerApplication.page = PDFViewerApplication.pagesCount; - } - this.close(); - }, - - pageRotateCwClick: function secondaryToolbarPageRotateCwClick(evt) { - PDFViewerApplication.rotatePages(90); - }, - - pageRotateCcwClick: function secondaryToolbarPageRotateCcwClick(evt) { - PDFViewerApplication.rotatePages(-90); - }, - - documentPropertiesClick: function secondaryToolbarDocumentPropsClick(evt) { - PDFViewerApplication.pdfDocumentProperties.open(); - this.close(); - }, - - // Misc. functions for interacting with the toolbar. - setMaxHeight: function secondaryToolbarSetMaxHeight(container) { - if (!container || !this.buttonContainer) { - return; - } - this.newContainerHeight = container.clientHeight; - if (this.previousContainerHeight === this.newContainerHeight) { - return; - } - this.buttonContainer.setAttribute('style', - 'max-height: ' + (this.newContainerHeight - SCROLLBAR_PADDING) + 'px;'); - this.previousContainerHeight = this.newContainerHeight; - }, - - open: function secondaryToolbarOpen() { - if (this.opened) { - return; - } - this.opened = true; - this.toggleButton.classList.add('toggled'); - this.toolbar.classList.remove('hidden'); - }, - - close: function secondaryToolbarClose(target) { - if (!this.opened) { - return; - } else if (target && !this.toolbar.contains(target)) { - return; - } - this.opened = false; - this.toolbar.classList.add('hidden'); - this.toggleButton.classList.remove('toggled'); - }, - - toggle: function secondaryToolbarToggle() { - if (this.opened) { - this.close(); - } else { - this.open(); - } - } -}; - - -var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500; // in ms -var DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms -var ACTIVE_SELECTOR = 'pdfPresentationMode'; -var CONTROLS_SELECTOR = 'pdfPresentationModeControls'; - -/** - * @typedef {Object} PDFPresentationModeOptions - * @property {HTMLDivElement} container - The container for the viewer element. - * @property {HTMLDivElement} viewer - (optional) The viewer element. - * @property {PDFViewer} pdfViewer - The document viewer. - * @property {PDFThumbnailViewer} pdfThumbnailViewer - (optional) The thumbnail - * viewer. - * @property {Array} contextMenuItems - (optional) The menuitems that are added - * to the context menu in Presentation Mode. - */ - -/** - * @class - */ -var PDFPresentationMode = (function PDFPresentationModeClosure() { - /** - * @constructs PDFPresentationMode - * @param {PDFPresentationModeOptions} options - */ - function PDFPresentationMode(options) { - this.container = options.container; - this.viewer = options.viewer || options.container.firstElementChild; - this.pdfViewer = options.pdfViewer; - this.pdfThumbnailViewer = options.pdfThumbnailViewer || null; - var contextMenuItems = options.contextMenuItems || null; - - this.active = false; - this.args = null; - this.contextMenuOpen = false; - this.mouseScrollTimeStamp = 0; - this.mouseScrollDelta = 0; - - if (contextMenuItems) { - for (var i = 0, ii = contextMenuItems.length; i < ii; i++) { - var item = contextMenuItems[i]; - item.element.addEventListener('click', function (handler) { - this.contextMenuOpen = false; - handler(); - }.bind(this, item.handler)); - } - } - } - - PDFPresentationMode.prototype = { - /** - * Request the browser to enter fullscreen mode. - * @returns {boolean} Indicating if the request was successful. - */ - request: function PDFPresentationMode_request() { - if (this.switchInProgress || this.active || - !this.viewer.hasChildNodes()) { - return false; - } - this._addFullscreenChangeListeners(); - this._setSwitchInProgress(); - this._notifyStateChange(); - - if (this.container.requestFullscreen) { - this.container.requestFullscreen(); - } else if (this.container.mozRequestFullScreen) { - this.container.mozRequestFullScreen(); - } else if (this.container.webkitRequestFullscreen) { - this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); - } else if (this.container.msRequestFullscreen) { - this.container.msRequestFullscreen(); - } else { - return false; - } - - this.args = { - page: this.pdfViewer.currentPageNumber, - previousScale: this.pdfViewer.currentScaleValue, - }; - - return true; - }, - - /** - * Switches page when the user scrolls (using a scroll wheel or a touchpad) - * with large enough motion, to prevent accidental page switches. - * @param {number} delta - The delta value from the mouse event. - */ - mouseScroll: function PDFPresentationMode_mouseScroll(delta) { - if (!this.active) { - return; - } - var MOUSE_SCROLL_COOLDOWN_TIME = 50; - var PAGE_SWITCH_THRESHOLD = 120; - var PageSwitchDirection = { - UP: -1, - DOWN: 1 - }; - - var currentTime = (new Date()).getTime(); - var storedTime = this.mouseScrollTimeStamp; - - // If we've already switched page, avoid accidentally switching again. - if (currentTime > storedTime && - currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { - return; - } - // If the scroll direction changed, reset the accumulated scroll delta. - if ((this.mouseScrollDelta > 0 && delta < 0) || - (this.mouseScrollDelta < 0 && delta > 0)) { - this._resetMouseScrollState(); - } - this.mouseScrollDelta += delta; - - if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) { - var pageSwitchDirection = (this.mouseScrollDelta > 0) ? - PageSwitchDirection.UP : PageSwitchDirection.DOWN; - var page = this.pdfViewer.currentPageNumber; - this._resetMouseScrollState(); - - // If we're at the first/last page, we don't need to do anything. - if ((page === 1 && pageSwitchDirection === PageSwitchDirection.UP) || - (page === this.pdfViewer.pagesCount && - pageSwitchDirection === PageSwitchDirection.DOWN)) { - return; - } - this.pdfViewer.currentPageNumber = (page + pageSwitchDirection); - this.mouseScrollTimeStamp = currentTime; - } - }, - - get isFullscreen() { - return !!(document.fullscreenElement || - document.mozFullScreen || - document.webkitIsFullScreen || - document.msFullscreenElement); - }, - - /** - * @private - */ - _notifyStateChange: function PDFPresentationMode_notifyStateChange() { - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('presentationmodechanged', true, true, { - active: this.active, - switchInProgress: !!this.switchInProgress - }); - window.dispatchEvent(event); - }, - - /** - * Used to initialize a timeout when requesting Presentation Mode, - * i.e. when the browser is requested to enter fullscreen mode. - * This timeout is used to prevent the current page from being scrolled - * partially, or completely, out of view when entering Presentation Mode. - * NOTE: This issue seems limited to certain zoom levels (e.g. page-width). - * @private - */ - _setSwitchInProgress: function PDFPresentationMode_setSwitchInProgress() { - if (this.switchInProgress) { - clearTimeout(this.switchInProgress); - } - this.switchInProgress = setTimeout(function switchInProgressTimeout() { - this._removeFullscreenChangeListeners(); - delete this.switchInProgress; - this._notifyStateChange(); - }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS); - }, - - /** - * @private - */ - _resetSwitchInProgress: - function PDFPresentationMode_resetSwitchInProgress() { - if (this.switchInProgress) { - clearTimeout(this.switchInProgress); - delete this.switchInProgress; - } - }, - - /** - * @private - */ - _enter: function PDFPresentationMode_enter() { - this.active = true; - this._resetSwitchInProgress(); - this._notifyStateChange(); - this.container.classList.add(ACTIVE_SELECTOR); - - // Ensure that the correct page is scrolled into view when entering - // Presentation Mode, by waiting until fullscreen mode in enabled. - setTimeout(function enterPresentationModeTimeout() { - this.pdfViewer.currentPageNumber = this.args.page; - this.pdfViewer.currentScaleValue = 'page-fit'; - }.bind(this), 0); - - this._addWindowListeners(); - this._showControls(); - this.contextMenuOpen = false; - this.container.setAttribute('contextmenu', 'viewerContextMenu'); - - // Text selection is disabled in Presentation Mode, thus it's not possible - // for the user to deselect text that is selected (e.g. with "Select all") - // when entering Presentation Mode, hence we remove any active selection. - window.getSelection().removeAllRanges(); - }, - - /** - * @private - */ - _exit: function PDFPresentationMode_exit() { - var page = this.pdfViewer.currentPageNumber; - this.container.classList.remove(ACTIVE_SELECTOR); - - // Ensure that the correct page is scrolled into view when exiting - // Presentation Mode, by waiting until fullscreen mode is disabled. - setTimeout(function exitPresentationModeTimeout() { - this.active = false; - this._removeFullscreenChangeListeners(); - this._notifyStateChange(); - - this.pdfViewer.currentScaleValue = this.args.previousScale; - this.pdfViewer.currentPageNumber = page; - this.args = null; - }.bind(this), 0); - - this._removeWindowListeners(); - this._hideControls(); - this._resetMouseScrollState(); - this.container.removeAttribute('contextmenu'); - this.contextMenuOpen = false; - - if (this.pdfThumbnailViewer) { - this.pdfThumbnailViewer.ensureThumbnailVisible(page); - } - }, - - /** - * @private - */ - _mouseDown: function PDFPresentationMode_mouseDown(evt) { - if (this.contextMenuOpen) { - this.contextMenuOpen = false; - evt.preventDefault(); - return; - } - if (evt.button === 0) { - // Enable clicking of links in presentation mode. Please note: - // Only links pointing to destinations in the current PDF document work. - var isInternalLink = (evt.target.href && - evt.target.classList.contains('internalLink')); - if (!isInternalLink) { - // Unless an internal link was clicked, advance one page. - evt.preventDefault(); - this.pdfViewer.currentPageNumber += (evt.shiftKey ? -1 : 1); - } - } - }, - - /** - * @private - */ - _contextMenu: function PDFPresentationMode_contextMenu() { - this.contextMenuOpen = true; - }, - - /** - * @private - */ - _showControls: function PDFPresentationMode_showControls() { - if (this.controlsTimeout) { - clearTimeout(this.controlsTimeout); - } else { - this.container.classList.add(CONTROLS_SELECTOR); - } - this.controlsTimeout = setTimeout(function showControlsTimeout() { - this.container.classList.remove(CONTROLS_SELECTOR); - delete this.controlsTimeout; - }.bind(this), DELAY_BEFORE_HIDING_CONTROLS); - }, - - /** - * @private - */ - _hideControls: function PDFPresentationMode_hideControls() { - if (!this.controlsTimeout) { - return; - } - clearTimeout(this.controlsTimeout); - this.container.classList.remove(CONTROLS_SELECTOR); - delete this.controlsTimeout; - }, - - /** - * Resets the properties used for tracking mouse scrolling events. - * @private - */ - _resetMouseScrollState: - function PDFPresentationMode_resetMouseScrollState() { - this.mouseScrollTimeStamp = 0; - this.mouseScrollDelta = 0; - }, - - /** - * @private - */ - _addWindowListeners: function PDFPresentationMode_addWindowListeners() { - this.showControlsBind = this._showControls.bind(this); - this.mouseDownBind = this._mouseDown.bind(this); - this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this); - this.contextMenuBind = this._contextMenu.bind(this); - - window.addEventListener('mousemove', this.showControlsBind); - window.addEventListener('mousedown', this.mouseDownBind); - window.addEventListener('keydown', this.resetMouseScrollStateBind); - window.addEventListener('contextmenu', this.contextMenuBind); - }, - - /** - * @private - */ - _removeWindowListeners: - function PDFPresentationMode_removeWindowListeners() { - window.removeEventListener('mousemove', this.showControlsBind); - window.removeEventListener('mousedown', this.mouseDownBind); - window.removeEventListener('keydown', this.resetMouseScrollStateBind); - window.removeEventListener('contextmenu', this.contextMenuBind); - - delete this.showControlsBind; - delete this.mouseDownBind; - delete this.resetMouseScrollStateBind; - delete this.contextMenuBind; - }, - - /** - * @private - */ - _fullscreenChange: function PDFPresentationMode_fullscreenChange() { - if (this.isFullscreen) { - this._enter(); - } else { - this._exit(); - } - }, - - /** - * @private - */ - _addFullscreenChangeListeners: - function PDFPresentationMode_addFullscreenChangeListeners() { - this.fullscreenChangeBind = this._fullscreenChange.bind(this); - - window.addEventListener('fullscreenchange', this.fullscreenChangeBind); - window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind); - window.addEventListener('webkitfullscreenchange', - this.fullscreenChangeBind); - window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind); - }, - - /** - * @private - */ - _removeFullscreenChangeListeners: - function PDFPresentationMode_removeFullscreenChangeListeners() { - window.removeEventListener('fullscreenchange', this.fullscreenChangeBind); - window.removeEventListener('mozfullscreenchange', - this.fullscreenChangeBind); - window.removeEventListener('webkitfullscreenchange', - this.fullscreenChangeBind); - window.removeEventListener('MSFullscreenChange', - this.fullscreenChangeBind); - - delete this.fullscreenChangeBind; - } - }; - - return PDFPresentationMode; -})(); - - - -var GrabToPan = (function GrabToPanClosure() { - /** - * Construct a GrabToPan instance for a given HTML element. - * @param options.element {Element} - * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)` - * @param options.onActiveChanged {function(boolean)} optional. Called - * when grab-to-pan is (de)activated. The first argument is a boolean that - * shows whether grab-to-pan is activated. - */ - function GrabToPan(options) { - this.element = options.element; - this.document = options.element.ownerDocument; - if (typeof options.ignoreTarget === 'function') { - this.ignoreTarget = options.ignoreTarget; - } - this.onActiveChanged = options.onActiveChanged; - - // Bind the contexts to ensure that `this` always points to - // the GrabToPan instance. - this.activate = this.activate.bind(this); - this.deactivate = this.deactivate.bind(this); - this.toggle = this.toggle.bind(this); - this._onmousedown = this._onmousedown.bind(this); - this._onmousemove = this._onmousemove.bind(this); - this._endPan = this._endPan.bind(this); - - // This overlay will be inserted in the document when the mouse moves during - // a grab operation, to ensure that the cursor has the desired appearance. - var overlay = this.overlay = document.createElement('div'); - overlay.className = 'grab-to-pan-grabbing'; - } - GrabToPan.prototype = { - /** - * Class name of element which can be grabbed - */ - CSS_CLASS_GRAB: 'grab-to-pan-grab', - - /** - * Bind a mousedown event to the element to enable grab-detection. - */ - activate: function GrabToPan_activate() { - if (!this.active) { - this.active = true; - this.element.addEventListener('mousedown', this._onmousedown, true); - this.element.classList.add(this.CSS_CLASS_GRAB); - if (this.onActiveChanged) { - this.onActiveChanged(true); - } - } - }, - - /** - * Removes all events. Any pending pan session is immediately stopped. - */ - deactivate: function GrabToPan_deactivate() { - if (this.active) { - this.active = false; - this.element.removeEventListener('mousedown', this._onmousedown, true); - this._endPan(); - this.element.classList.remove(this.CSS_CLASS_GRAB); - if (this.onActiveChanged) { - this.onActiveChanged(false); - } - } - }, - - toggle: function GrabToPan_toggle() { - if (this.active) { - this.deactivate(); - } else { - this.activate(); - } - }, - - /** - * Whether to not pan if the target element is clicked. - * Override this method to change the default behaviour. - * - * @param node {Element} The target of the event - * @return {boolean} Whether to not react to the click event. - */ - ignoreTarget: function GrabToPan_ignoreTarget(node) { - // Use matchesSelector to check whether the clicked element - // is (a child of) an input element / link - return node[matchesSelector]( - 'a[href], a[href] *, input, textarea, button, button *, select, option' - ); - }, - - /** - * @private - */ - _onmousedown: function GrabToPan__onmousedown(event) { - if (event.button !== 0 || this.ignoreTarget(event.target)) { - return; - } - if (event.originalTarget) { - try { - /* jshint expr:true */ - event.originalTarget.tagName; - } catch (e) { - // Mozilla-specific: element is a scrollbar (XUL element) - return; - } - } - - this.scrollLeftStart = this.element.scrollLeft; - this.scrollTopStart = this.element.scrollTop; - this.clientXStart = event.clientX; - this.clientYStart = event.clientY; - this.document.addEventListener('mousemove', this._onmousemove, true); - this.document.addEventListener('mouseup', this._endPan, true); - // When a scroll event occurs before a mousemove, assume that the user - // dragged a scrollbar (necessary for Opera Presto, Safari and IE) - // (not needed for Chrome/Firefox) - this.element.addEventListener('scroll', this._endPan, true); - event.preventDefault(); - event.stopPropagation(); - this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING); - - var focusedElement = document.activeElement; - if (focusedElement && !focusedElement.contains(event.target)) { - focusedElement.blur(); - } - }, - - /** - * @private - */ - _onmousemove: function GrabToPan__onmousemove(event) { - this.element.removeEventListener('scroll', this._endPan, true); - if (isLeftMouseReleased(event)) { - this._endPan(); - return; - } - var xDiff = event.clientX - this.clientXStart; - var yDiff = event.clientY - this.clientYStart; - this.element.scrollTop = this.scrollTopStart - yDiff; - this.element.scrollLeft = this.scrollLeftStart - xDiff; - if (!this.overlay.parentNode) { - document.body.appendChild(this.overlay); - } - }, - - /** - * @private - */ - _endPan: function GrabToPan__endPan() { - this.element.removeEventListener('scroll', this._endPan, true); - this.document.removeEventListener('mousemove', this._onmousemove, true); - this.document.removeEventListener('mouseup', this._endPan, true); - if (this.overlay.parentNode) { - this.overlay.parentNode.removeChild(this.overlay); - } - } - }; - - // Get the correct (vendor-prefixed) name of the matches method. - var matchesSelector; - ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function(prefix) { - var name = prefix + 'atches'; - if (name in document.documentElement) { - matchesSelector = name; - } - name += 'Selector'; - if (name in document.documentElement) { - matchesSelector = name; - } - return matchesSelector; // If found, then truthy, and [].some() ends. - }); - - // Browser sniffing because it's impossible to feature-detect - // whether event.which for onmousemove is reliable - var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9; - var chrome = window.chrome; - var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app); - // ^ Chrome 15+ ^ Opera 15+ - var isSafari6plus = /Apple/.test(navigator.vendor) && - /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent); - - /** - * Whether the left mouse is not pressed. - * @param event {MouseEvent} - * @return {boolean} True if the left mouse button is not pressed. - * False if unsure or if the left mouse button is pressed. - */ - function isLeftMouseReleased(event) { - if ('buttons' in event && isNotIEorIsIE10plus) { - // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons - // Firefox 15+ - // Internet Explorer 10+ - return !(event.buttons | 1); - } - if (isChrome15OrOpera15plus || isSafari6plus) { - // Chrome 14+ - // Opera 15+ - // Safari 6.0+ - return event.which === 0; - } - } - - return GrabToPan; -})(); - -var HandTool = { - initialize: function handToolInitialize(options) { - var toggleHandTool = options.toggleHandTool; - this.handTool = new GrabToPan({ - element: options.container, - onActiveChanged: function(isActive) { - if (!toggleHandTool) { - return; - } - if (isActive) { - toggleHandTool.title = 'Disable hand tool'; - toggleHandTool.firstElementChild.textContent = 'Disable hand tool'; - } else { - toggleHandTool.title = 'Enable hand tool'; - toggleHandTool.firstElementChild.textContent = 'Enable hand tool'; - } - } - }); - if (toggleHandTool) { - toggleHandTool.addEventListener('click', this.toggle.bind(this), false); - - window.addEventListener('localized', function (evt) { - Preferences.get('enableHandToolOnLoad').then(function resolved(value) { - if (value) { - this.handTool.activate(); - } - }.bind(this), function rejected(reason) {}); - }.bind(this)); - - window.addEventListener('presentationmodechanged', function (evt) { - if (evt.detail.switchInProgress) { - return; - } - if (evt.detail.active) { - this.enterPresentationMode(); - } else { - this.exitPresentationMode(); - } - }.bind(this)); - } - }, - - toggle: function handToolToggle() { - this.handTool.toggle(); - SecondaryToolbar.close(); - }, - - enterPresentationMode: function handToolEnterPresentationMode() { - if (this.handTool.active) { - this.wasActive = true; - this.handTool.deactivate(); - } - }, - - exitPresentationMode: function handToolExitPresentationMode() { - if (this.wasActive) { - this.wasActive = null; - this.handTool.activate(); - } - } -}; - - -var OverlayManager = { - overlays: {}, - active: null, - - /** - * @param {string} name The name of the overlay that is registered. This must - * be equal to the ID of the overlay's DOM element. - * @param {function} callerCloseMethod (optional) The method that, if present, - * will call OverlayManager.close from the Object - * registering the overlay. Access to this method is - * necessary in order to run cleanup code when e.g. - * the overlay is force closed. The default is null. - * @param {boolean} canForceClose (optional) Indicates if opening the overlay - * will close an active overlay. The default is false. - * @returns {Promise} A promise that is resolved when the overlay has been - * registered. - */ - register: function overlayManagerRegister(name, - callerCloseMethod, canForceClose) { - return new Promise(function (resolve) { - var element, container; - if (!name || !(element = document.getElementById(name)) || - !(container = element.parentNode)) { - throw new Error('Not enough parameters.'); - } else if (this.overlays[name]) { - throw new Error('The overlay is already registered.'); - } - this.overlays[name] = { element: element, - container: container, - callerCloseMethod: (callerCloseMethod || null), - canForceClose: (canForceClose || false) }; - resolve(); - }.bind(this)); - }, - - /** - * @param {string} name The name of the overlay that is unregistered. - * @returns {Promise} A promise that is resolved when the overlay has been - * unregistered. - */ - unregister: function overlayManagerUnregister(name) { - return new Promise(function (resolve) { - if (!this.overlays[name]) { - throw new Error('The overlay does not exist.'); - } else if (this.active === name) { - throw new Error('The overlay cannot be removed while it is active.'); - } - delete this.overlays[name]; - - resolve(); - }.bind(this)); - }, - - /** - * @param {string} name The name of the overlay that should be opened. - * @returns {Promise} A promise that is resolved when the overlay has been - * opened. - */ - open: function overlayManagerOpen(name) { - return new Promise(function (resolve) { - if (!this.overlays[name]) { - throw new Error('The overlay does not exist.'); - } else if (this.active) { - if (this.overlays[name].canForceClose) { - this._closeThroughCaller(); - } else if (this.active === name) { - throw new Error('The overlay is already active.'); - } else { - throw new Error('Another overlay is currently active.'); - } - } - this.active = name; - this.overlays[this.active].element.classList.remove('hidden'); - this.overlays[this.active].container.classList.remove('hidden'); - - window.addEventListener('keydown', this._keyDown); - resolve(); - }.bind(this)); - }, - - /** - * @param {string} name The name of the overlay that should be closed. - * @returns {Promise} A promise that is resolved when the overlay has been - * closed. - */ - close: function overlayManagerClose(name) { - return new Promise(function (resolve) { - if (!this.overlays[name]) { - throw new Error('The overlay does not exist.'); - } else if (!this.active) { - throw new Error('The overlay is currently not active.'); - } else if (this.active !== name) { - throw new Error('Another overlay is currently active.'); - } - this.overlays[this.active].container.classList.add('hidden'); - this.overlays[this.active].element.classList.add('hidden'); - this.active = null; - - window.removeEventListener('keydown', this._keyDown); - resolve(); - }.bind(this)); - }, - - /** - * @private - */ - _keyDown: function overlayManager_keyDown(evt) { - var self = OverlayManager; - if (self.active && evt.keyCode === 27) { // Esc key. - self._closeThroughCaller(); - evt.preventDefault(); - } - }, - - /** - * @private - */ - _closeThroughCaller: function overlayManager_closeThroughCaller() { - if (this.overlays[this.active].callerCloseMethod) { - this.overlays[this.active].callerCloseMethod(); - } - if (this.active) { - this.close(this.active); - } - } -}; - - -var PasswordPrompt = { - overlayName: null, - updatePassword: null, - reason: null, - passwordField: null, - passwordText: null, - passwordSubmit: null, - passwordCancel: null, - - initialize: function secondaryToolbarInitialize(options) { - this.overlayName = options.overlayName; - this.passwordField = options.passwordField; - this.passwordText = options.passwordText; - this.passwordSubmit = options.passwordSubmit; - this.passwordCancel = options.passwordCancel; - - // Attach the event listeners. - this.passwordSubmit.addEventListener('click', - this.verifyPassword.bind(this)); - - this.passwordCancel.addEventListener('click', this.close.bind(this)); - - this.passwordField.addEventListener('keydown', function (e) { - if (e.keyCode === 13) { // Enter key - this.verifyPassword(); - } - }.bind(this)); - - OverlayManager.register(this.overlayName, this.close.bind(this), true); - }, - - open: function passwordPromptOpen() { - OverlayManager.open(this.overlayName).then(function () { - this.passwordField.type = 'password'; - this.passwordField.focus(); - - var promptString = 'Enter the password to open this PDF file.'; - - if (this.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD) { - promptString = 'Invalid password. Please try again.'; - } - - this.passwordText.textContent = promptString; - }.bind(this)); - }, - - close: function passwordPromptClose() { - OverlayManager.close(this.overlayName).then(function () { - this.passwordField.value = ''; - this.passwordField.type = ''; - }.bind(this)); - }, - - verifyPassword: function passwordPromptVerifyPassword() { - var password = this.passwordField.value; - if (password && password.length > 0) { - this.close(); - return this.updatePassword(password); - } - } -}; - - -/** - * @typedef {Object} PDFDocumentPropertiesOptions - * @property {string} overlayName - Name/identifier for the overlay. - * @property {Object} fields - Names and elements of the overlay's fields. - * @property {HTMLButtonElement} closeButton - Button for closing the overlay. - */ - -/** - * @class - */ -var PDFDocumentProperties = (function PDFDocumentPropertiesClosure() { - /** - * @constructs PDFDocumentProperties - * @param {PDFDocumentPropertiesOptions} options - */ - function PDFDocumentProperties(options) { - this.fields = options.fields; - this.overlayName = options.overlayName; - - this.rawFileSize = 0; - this.url = null; - this.pdfDocument = null; - - // Bind the event listener for the Close button. - if (options.closeButton) { - options.closeButton.addEventListener('click', this.close.bind(this)); - } - - this.dataAvailablePromise = new Promise(function (resolve) { - this.resolveDataAvailable = resolve; - }.bind(this)); - - OverlayManager.register(this.overlayName, this.close.bind(this)); - } - - PDFDocumentProperties.prototype = { - /** - * Open the document properties overlay. - */ - open: function PDFDocumentProperties_open() { - Promise.all([OverlayManager.open(this.overlayName), - this.dataAvailablePromise]).then(function () { - this._getProperties(); - }.bind(this)); - }, - - /** - * Close the document properties overlay. - */ - close: function PDFDocumentProperties_close() { - OverlayManager.close(this.overlayName); - }, - - /** - * Set the file size of the PDF document. This method is used to - * update the file size in the document properties overlay once it - * is known so we do not have to wait until the entire file is loaded. - * - * @param {number} fileSize - The file size of the PDF document. - */ - setFileSize: function PDFDocumentProperties_setFileSize(fileSize) { - if (fileSize > 0) { - this.rawFileSize = fileSize; - } - }, - - /** - * Set a reference to the PDF document and the URL in order - * to populate the overlay fields with the document properties. - * Note that the overlay will contain no information if this method - * is not called. - * - * @param {Object} pdfDocument - A reference to the PDF document. - * @param {string} url - The URL of the document. - */ - setDocumentAndUrl: - function PDFDocumentProperties_setDocumentAndUrl(pdfDocument, url) { - this.pdfDocument = pdfDocument; - this.url = url; - this.resolveDataAvailable(); - }, - - /** - * @private - */ - _getProperties: function PDFDocumentProperties_getProperties() { - if (!OverlayManager.active) { - // If the dialog was closed before dataAvailablePromise was resolved, - // don't bother updating the properties. - return; - } - // Get the file size (if it hasn't already been set). - this.pdfDocument.getDownloadInfo().then(function(data) { - if (data.length === this.rawFileSize) { - return; - } - this.setFileSize(data.length); - this._updateUI(this.fields['fileSize'], this._parseFileSize()); - }.bind(this)); - - // Get the document properties. - this.pdfDocument.getMetadata().then(function(data) { - var content = { - 'fileName': getPDFFileNameFromURL(this.url), - 'fileSize': this._parseFileSize(), - 'title': data.info.Title, - 'author': data.info.Author, - 'subject': data.info.Subject, - 'keywords': data.info.Keywords, - 'creationDate': this._parseDate(data.info.CreationDate), - 'modificationDate': this._parseDate(data.info.ModDate), - 'creator': data.info.Creator, - 'producer': data.info.Producer, - 'version': data.info.PDFFormatVersion, - 'pageCount': this.pdfDocument.numPages - }; - - // Show the properties in the dialog. - for (var identifier in content) { - this._updateUI(this.fields[identifier], content[identifier]); - } - }.bind(this)); - }, - - /** - * @private - */ - _updateUI: function PDFDocumentProperties_updateUI(field, content) { - if (field && content !== undefined && content !== '') { - field.textContent = content; - } - }, - - /** - * @private - */ - _parseFileSize: function PDFDocumentProperties_parseFileSize() { - var fileSize = this.rawFileSize, kb = fileSize / 1024; - if (!kb) { - return; - } else if (kb < 1024) { - return kb + ' KB ' + size_b + ' bytes'; - } else { - return (kb / 1024) + ' MB ' + size_b + ' bytes'; - } - }, - - /** - * @private - */ - _parseDate: function PDFDocumentProperties_parseDate(inputDate) { - // This is implemented according to the PDF specification, but note that - // Adobe Reader doesn't handle changing the date to universal time - // and doesn't use the user's time zone (they're effectively ignoring - // the HH' and mm' parts of the date string). - var dateToParse = inputDate; - if (dateToParse === undefined) { - return ''; - } - - // Remove the D: prefix if it is available. - if (dateToParse.substring(0,2) === 'D:') { - dateToParse = dateToParse.substring(2); - } - - // Get all elements from the PDF date string. - // JavaScript's Date object expects the month to be between - // 0 and 11 instead of 1 and 12, so we're correcting for this. - var year = parseInt(dateToParse.substring(0,4), 10); - var month = parseInt(dateToParse.substring(4,6), 10) - 1; - var day = parseInt(dateToParse.substring(6,8), 10); - var hours = parseInt(dateToParse.substring(8,10), 10); - var minutes = parseInt(dateToParse.substring(10,12), 10); - var seconds = parseInt(dateToParse.substring(12,14), 10); - var utRel = dateToParse.substring(14,15); - var offsetHours = parseInt(dateToParse.substring(15,17), 10); - var offsetMinutes = parseInt(dateToParse.substring(18,20), 10); - - // As per spec, utRel = 'Z' means equal to universal time. - // The other cases ('-' and '+') have to be handled here. - if (utRel === '-') { - hours += offsetHours; - minutes += offsetMinutes; - } else if (utRel === '+') { - hours -= offsetHours; - minutes -= offsetMinutes; - } - - // Return the new date format from the user's locale. - var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds)); - var dateString = date.toLocaleDateString(); - var timeString = date.toLocaleTimeString(); - return dateString + ', ' + timeString; - } - }; - - return PDFDocumentProperties; -})(); - - -var PresentationModeState = { - UNKNOWN: 0, - NORMAL: 1, - CHANGING: 2, - FULLSCREEN: 3, -}; - -var IGNORE_CURRENT_POSITION_ON_ZOOM = false; -var DEFAULT_CACHE_SIZE = 10; - - -var CLEANUP_TIMEOUT = 30000; - -var RenderingStates = { - INITIAL: 0, - RUNNING: 1, - PAUSED: 2, - FINISHED: 3 -}; - -/** - * Controls rendering of the views for pages and thumbnails. - * @class - */ -var PDFRenderingQueue = (function PDFRenderingQueueClosure() { - /** - * @constructs - */ - function PDFRenderingQueue() { - this.pdfViewer = null; - this.pdfThumbnailViewer = null; - this.onIdle = null; - - this.highestPriorityPage = null; - this.idleTimeout = null; - this.printing = false; - this.isThumbnailViewEnabled = false; - } - - PDFRenderingQueue.prototype = /** @lends PDFRenderingQueue.prototype */ { - /** - * @param {PDFViewer} pdfViewer - */ - setViewer: function PDFRenderingQueue_setViewer(pdfViewer) { - this.pdfViewer = pdfViewer; - }, - - /** - * @param {PDFThumbnailViewer} pdfThumbnailViewer - */ - setThumbnailViewer: - function PDFRenderingQueue_setThumbnailViewer(pdfThumbnailViewer) { - this.pdfThumbnailViewer = pdfThumbnailViewer; - }, - - /** - * @param {IRenderableView} view - * @returns {boolean} - */ - isHighestPriority: function PDFRenderingQueue_isHighestPriority(view) { - return this.highestPriorityPage === view.renderingId; - }, - - renderHighestPriority: function - PDFRenderingQueue_renderHighestPriority(currentlyVisiblePages) { - if (this.idleTimeout) { - clearTimeout(this.idleTimeout); - this.idleTimeout = null; - } - - // Pages have a higher priority than thumbnails, so check them first. - if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { - return; - } - // No pages needed rendering so check thumbnails. - if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) { - if (this.pdfThumbnailViewer.forceRendering()) { - return; - } - } - - if (this.printing) { - // If printing is currently ongoing do not reschedule cleanup. - return; - } - - if (this.onIdle) { - this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); - } - }, - - getHighestPriority: function - PDFRenderingQueue_getHighestPriority(visible, views, scrolledDown) { - // The state has changed figure out which page has the highest priority to - // render next (if any). - // Priority: - // 1 visible pages - // 2 if last scrolled down page after the visible pages - // 2 if last scrolled up page before the visible pages - var visibleViews = visible.views; - - var numVisible = visibleViews.length; - if (numVisible === 0) { - return false; - } - for (var i = 0; i < numVisible; ++i) { - var view = visibleViews[i].view; - if (!this.isViewFinished(view)) { - return view; - } - } - - // All the visible views have rendered, try to render next/previous pages. - if (scrolledDown) { - var nextPageIndex = visible.last.id; - // ID's start at 1 so no need to add 1. - if (views[nextPageIndex] && - !this.isViewFinished(views[nextPageIndex])) { - return views[nextPageIndex]; - } - } else { - var previousPageIndex = visible.first.id - 2; - if (views[previousPageIndex] && - !this.isViewFinished(views[previousPageIndex])) { - return views[previousPageIndex]; - } - } - // Everything that needs to be rendered has been. - return null; - }, - - /** - * @param {IRenderableView} view - * @returns {boolean} - */ - isViewFinished: function PDFRenderingQueue_isViewFinished(view) { - return view.renderingState === RenderingStates.FINISHED; - }, - - /** - * Render a page or thumbnail view. This calls the appropriate function - * based on the views state. If the view is already rendered it will return - * false. - * @param {IRenderableView} view - */ - renderView: function PDFRenderingQueue_renderView(view) { - var state = view.renderingState; - switch (state) { - case RenderingStates.FINISHED: - return false; - case RenderingStates.PAUSED: - this.highestPriorityPage = view.renderingId; - view.resume(); - break; - case RenderingStates.RUNNING: - this.highestPriorityPage = view.renderingId; - break; - case RenderingStates.INITIAL: - this.highestPriorityPage = view.renderingId; - var continueRendering = function () { - this.renderHighestPriority(); - }.bind(this); - view.draw().then(continueRendering, continueRendering); - break; - } - return true; - }, - }; - - return PDFRenderingQueue; -})(); - - -var TEXT_LAYER_RENDER_DELAY = 200; // ms - -/** - * @typedef {Object} PDFPageViewOptions - * @property {HTMLDivElement} container - The viewer element. - * @property {number} id - The page unique ID (normally its number). - * @property {number} scale - The page scale display. - * @property {PageViewport} defaultViewport - The page viewport. - * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. - * @property {IPDFTextLayerFactory} textLayerFactory - * @property {IPDFAnnotationLayerFactory} annotationLayerFactory - */ - -/** - * @class - * @implements {IRenderableView} - */ -var PDFPageView = (function PDFPageViewClosure() { - /** - * @constructs PDFPageView - * @param {PDFPageViewOptions} options - */ - function PDFPageView(options) { - var container = options.container; - var id = options.id; - var scale = options.scale; - var defaultViewport = options.defaultViewport; - var renderingQueue = options.renderingQueue; - var textLayerFactory = options.textLayerFactory; - var annotationLayerFactory = options.annotationLayerFactory; - - this.id = id; - this.renderingId = 'page' + id; - - this.rotation = 0; - this.scale = scale || DEFAULT_SCALE; - this.viewport = defaultViewport; - this.pdfPageRotate = defaultViewport.rotation; - this.hasRestrictedScaling = false; - - this.renderingQueue = renderingQueue; - this.textLayerFactory = textLayerFactory; - this.annotationLayerFactory = annotationLayerFactory; - - this.renderingState = RenderingStates.INITIAL; - this.resume = null; - - this.onBeforeDraw = null; - this.onAfterDraw = null; - - this.textLayer = null; - - this.zoomLayer = null; - - this.annotationLayer = null; - - var div = document.createElement('div'); - div.id = 'pageContainer' + this.id; - div.className = 'page'; - div.style.width = Math.floor(this.viewport.width) + 'px'; - div.style.height = Math.floor(this.viewport.height) + 'px'; - div.setAttribute('data-page-number', this.id); - this.div = div; - - container.appendChild(div); - } - - PDFPageView.prototype = { - setPdfPage: function PDFPageView_setPdfPage(pdfPage) { - this.pdfPage = pdfPage; - this.pdfPageRotate = pdfPage.rotate; - var totalRotation = (this.rotation + this.pdfPageRotate) % 360; - this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS, - totalRotation); - this.stats = pdfPage.stats; - this.reset(); - }, - - destroy: function PDFPageView_destroy() { - this.zoomLayer = null; - this.reset(); - if (this.pdfPage) { - this.pdfPage.cleanup(); - } - }, - - reset: function PDFPageView_reset(keepZoomLayer, keepAnnotations) { - if (this.renderTask) { - this.renderTask.cancel(); - } - this.resume = null; - this.renderingState = RenderingStates.INITIAL; - - var div = this.div; - div.style.width = Math.floor(this.viewport.width) + 'px'; - div.style.height = Math.floor(this.viewport.height) + 'px'; - - var childNodes = div.childNodes; - var currentZoomLayerNode = (keepZoomLayer && this.zoomLayer) || null; - var currentAnnotationNode = (keepAnnotations && this.annotationLayer && - this.annotationLayer.div) || null; - for (var i = childNodes.length - 1; i >= 0; i--) { - var node = childNodes[i]; - if (currentZoomLayerNode === node || currentAnnotationNode === node) { - continue; - } - div.removeChild(node); - } - div.removeAttribute('data-loaded'); - - if (currentAnnotationNode) { - // Hide annotationLayer until all elements are resized - // so they are not displayed on the already-resized page - this.annotationLayer.hide(); - } else { - this.annotationLayer = null; - } - - if (this.canvas && !currentZoomLayerNode) { - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - this.canvas.width = 0; - this.canvas.height = 0; - delete this.canvas; - } - - this.loadingIconDiv = document.createElement('div'); - this.loadingIconDiv.className = 'loadingIcon'; - div.appendChild(this.loadingIconDiv); - }, - - update: function PDFPageView_update(scale, rotation) { - this.scale = scale || this.scale; - - if (typeof rotation !== 'undefined') { - this.rotation = rotation; - } - - var totalRotation = (this.rotation + this.pdfPageRotate) % 360; - this.viewport = this.viewport.clone({ - scale: this.scale * CSS_UNITS, - rotation: totalRotation - }); - - var isScalingRestricted = false; - if (this.canvas && PDFJS.maxCanvasPixels > 0) { - var outputScale = this.outputScale; - var pixelsInViewport = this.viewport.width * this.viewport.height; - var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport); - if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) * - ((Math.floor(this.viewport.height) * outputScale.sy) | 0) > - PDFJS.maxCanvasPixels) { - isScalingRestricted = true; - } - } - - if (this.canvas) { - if (PDFJS.useOnlyCssZoom || - (this.hasRestrictedScaling && isScalingRestricted)) { - this.cssTransform(this.canvas, true); - - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('pagerendered', true, true, { - pageNumber: this.id, - cssTransform: true, - }); - this.div.dispatchEvent(event); - - return; - } - if (!this.zoomLayer) { - this.zoomLayer = this.canvas.parentNode; - this.zoomLayer.style.position = 'absolute'; - } - } - if (this.zoomLayer) { - this.cssTransform(this.zoomLayer.firstChild); - } - this.reset(/* keepZoomLayer = */ true, /* keepAnnotations = */ true); - }, - - /** - * Called when moved in the parent's container. - */ - updatePosition: function PDFPageView_updatePosition() { - if (this.textLayer) { - this.textLayer.render(TEXT_LAYER_RENDER_DELAY); - } - }, - - cssTransform: function PDFPageView_transform(canvas, redrawAnnotations) { - var CustomStyle = PDFJS.CustomStyle; - - // Scale canvas, canvas wrapper, and page container. - var width = this.viewport.width; - var height = this.viewport.height; - var div = this.div; - canvas.style.width = canvas.parentNode.style.width = div.style.width = - Math.floor(width) + 'px'; - canvas.style.height = canvas.parentNode.style.height = div.style.height = - Math.floor(height) + 'px'; - // The canvas may have been originally rotated, rotate relative to that. - var relativeRotation = this.viewport.rotation - canvas._viewport.rotation; - var absRotation = Math.abs(relativeRotation); - var scaleX = 1, scaleY = 1; - if (absRotation === 90 || absRotation === 270) { - // Scale x and y because of the rotation. - scaleX = height / width; - scaleY = width / height; - } - var cssTransform = 'rotate(' + relativeRotation + 'deg) ' + - 'scale(' + scaleX + ',' + scaleY + ')'; - CustomStyle.setProp('transform', canvas, cssTransform); - - if (this.textLayer) { - // Rotating the text layer is more complicated since the divs inside the - // the text layer are rotated. - // TODO: This could probably be simplified by drawing the text layer in - // one orientation then rotating overall. - var textLayerViewport = this.textLayer.viewport; - var textRelativeRotation = this.viewport.rotation - - textLayerViewport.rotation; - var textAbsRotation = Math.abs(textRelativeRotation); - var scale = width / textLayerViewport.width; - if (textAbsRotation === 90 || textAbsRotation === 270) { - scale = width / textLayerViewport.height; - } - var textLayerDiv = this.textLayer.textLayerDiv; - var transX, transY; - switch (textAbsRotation) { - case 0: - transX = transY = 0; - break; - case 90: - transX = 0; - transY = '-' + textLayerDiv.style.height; - break; - case 180: - transX = '-' + textLayerDiv.style.width; - transY = '-' + textLayerDiv.style.height; - break; - case 270: - transX = '-' + textLayerDiv.style.width; - transY = 0; - break; - default: - console.error('Bad rotation value.'); - break; - } - CustomStyle.setProp('transform', textLayerDiv, - 'rotate(' + textAbsRotation + 'deg) ' + - 'scale(' + scale + ', ' + scale + ') ' + - 'translate(' + transX + ', ' + transY + ')'); - CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%'); - } - - if (redrawAnnotations && this.annotationLayer) { - this.annotationLayer.render(this.viewport, 'display'); - } - }, - - get width() { - return this.viewport.width; - }, - - get height() { - return this.viewport.height; - }, - - getPagePoint: function PDFPageView_getPagePoint(x, y) { - return this.viewport.convertToPdfPoint(x, y); - }, - - draw: function PDFPageView_draw() { - if (this.renderingState !== RenderingStates.INITIAL) { - console.error('Must be in new state before drawing'); - } - - this.renderingState = RenderingStates.RUNNING; - - var pdfPage = this.pdfPage; - var viewport = this.viewport; - var div = this.div; - // Wrap the canvas so if it has a css transform for highdpi the overflow - // will be hidden in FF. - var canvasWrapper = document.createElement('div'); - canvasWrapper.style.width = div.style.width; - canvasWrapper.style.height = div.style.height; - canvasWrapper.classList.add('canvasWrapper'); - - var canvas = document.createElement('canvas'); - canvas.id = 'page' + this.id; - // Keep the canvas hidden until the first draw callback, or until drawing - // is complete when `!this.renderingQueue`, to prevent black flickering. - canvas.setAttribute('hidden', 'hidden'); - var isCanvasHidden = true; - - canvasWrapper.appendChild(canvas); - if (this.annotationLayer && this.annotationLayer.div) { - // annotationLayer needs to stay on top - div.insertBefore(canvasWrapper, this.annotationLayer.div); - } else { - div.appendChild(canvasWrapper); - } - this.canvas = canvas; - - canvas.mozOpaque = true; - var ctx = canvas.getContext('2d', {alpha: false}); - var outputScale = getOutputScale(ctx); - this.outputScale = outputScale; - - if (PDFJS.useOnlyCssZoom) { - var actualSizeViewport = viewport.clone({scale: CSS_UNITS}); - // Use a scale that will make the canvas be the original intended size - // of the page. - outputScale.sx *= actualSizeViewport.width / viewport.width; - outputScale.sy *= actualSizeViewport.height / viewport.height; - outputScale.scaled = true; - } - - if (PDFJS.maxCanvasPixels > 0) { - var pixelsInViewport = viewport.width * viewport.height; - var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport); - if (outputScale.sx > maxScale || outputScale.sy > maxScale) { - outputScale.sx = maxScale; - outputScale.sy = maxScale; - outputScale.scaled = true; - this.hasRestrictedScaling = true; - } else { - this.hasRestrictedScaling = false; - } - } - - var sfx = approximateFraction(outputScale.sx); - var sfy = approximateFraction(outputScale.sy); - canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]); - canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]); - canvas.style.width = roundToDivide(viewport.width, sfx[1]) + 'px'; - canvas.style.height = roundToDivide(viewport.height, sfy[1]) + 'px'; - // Add the viewport so it's known what it was originally drawn with. - canvas._viewport = viewport; - - var textLayerDiv = null; - var textLayer = null; - if (this.textLayerFactory) { - textLayerDiv = document.createElement('div'); - textLayerDiv.className = 'textLayer'; - textLayerDiv.style.width = canvasWrapper.style.width; - textLayerDiv.style.height = canvasWrapper.style.height; - if (this.annotationLayer && this.annotationLayer.div) { - // annotationLayer needs to stay on top - div.insertBefore(textLayerDiv, this.annotationLayer.div); - } else { - div.appendChild(textLayerDiv); - } - - textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, - this.id - 1, - this.viewport); - } - this.textLayer = textLayer; - - var resolveRenderPromise, rejectRenderPromise; - var promise = new Promise(function (resolve, reject) { - resolveRenderPromise = resolve; - rejectRenderPromise = reject; - }); - - // Rendering area - - var self = this; - function pageViewDrawCallback(error) { - // The renderTask may have been replaced by a new one, so only remove - // the reference to the renderTask if it matches the one that is - // triggering this callback. - if (renderTask === self.renderTask) { - self.renderTask = null; - } - - if (error === 'cancelled') { - rejectRenderPromise(error); - return; - } - - self.renderingState = RenderingStates.FINISHED; - - if (isCanvasHidden) { - self.canvas.removeAttribute('hidden'); - isCanvasHidden = false; - } - - if (self.loadingIconDiv) { - div.removeChild(self.loadingIconDiv); - delete self.loadingIconDiv; - } - - if (self.zoomLayer) { - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - var zoomLayerCanvas = self.zoomLayer.firstChild; - zoomLayerCanvas.width = 0; - zoomLayerCanvas.height = 0; - - div.removeChild(self.zoomLayer); - self.zoomLayer = null; - } - - self.error = error; - self.stats = pdfPage.stats; - if (self.onAfterDraw) { - self.onAfterDraw(); - } - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('pagerendered', true, true, { - pageNumber: self.id, - cssTransform: false, - }); - div.dispatchEvent(event); - // This custom event is deprecated, and will be removed in the future, - // please use the |pagerendered| event instead. - var deprecatedEvent = document.createEvent('CustomEvent'); - deprecatedEvent.initCustomEvent('pagerender', true, true, { - pageNumber: pdfPage.pageNumber - }); - div.dispatchEvent(deprecatedEvent); - - if (!error) { - resolveRenderPromise(undefined); - } else { - rejectRenderPromise(error); - } - } - - var renderContinueCallback = null; - if (this.renderingQueue) { - renderContinueCallback = function renderContinueCallback(cont) { - if (!self.renderingQueue.isHighestPriority(self)) { - self.renderingState = RenderingStates.PAUSED; - self.resume = function resumeCallback() { - self.renderingState = RenderingStates.RUNNING; - cont(); - }; - return; - } - if (isCanvasHidden) { - self.canvas.removeAttribute('hidden'); - isCanvasHidden = false; - } - cont(); - }; - } - - var transform = !outputScale.scaled ? null : - [outputScale.sx, 0, 0, outputScale.sy, 0, 0]; - var renderContext = { - canvasContext: ctx, - transform: transform, - viewport: this.viewport, - // intent: 'default', // === 'display' - }; - var renderTask = this.renderTask = this.pdfPage.render(renderContext); - renderTask.onContinue = renderContinueCallback; - - this.renderTask.promise.then( - function pdfPageRenderCallback() { - pageViewDrawCallback(null); - if (textLayer) { - self.pdfPage.getTextContent({ normalizeWhitespace: true }).then( - function textContentResolved(textContent) { - textLayer.setTextContent(textContent); - textLayer.render(TEXT_LAYER_RENDER_DELAY); - } - ); - } - }, - function pdfPageRenderError(error) { - pageViewDrawCallback(error); - } - ); - - if (this.annotationLayerFactory) { - if (!this.annotationLayer) { - this.annotationLayer = this.annotationLayerFactory. - createAnnotationLayerBuilder(div, this.pdfPage); - } - this.annotationLayer.render(this.viewport, 'display'); - } - div.setAttribute('data-loaded', true); - - if (self.onBeforeDraw) { - self.onBeforeDraw(); - } - return promise; - }, - - beforePrint: function PDFPageView_beforePrint() { - var CustomStyle = PDFJS.CustomStyle; - var pdfPage = this.pdfPage; - - var viewport = pdfPage.getViewport(1); - // Use the same hack we use for high dpi displays for printing to get - // better output until bug 811002 is fixed in FF. - var PRINT_OUTPUT_SCALE = 2; - var canvas = document.createElement('canvas'); - - // The logical size of the canvas. - canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE; - canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE; - - // The rendered size of the canvas, relative to the size of canvasWrapper. - canvas.style.width = (PRINT_OUTPUT_SCALE * 100) + '%'; - canvas.style.height = (PRINT_OUTPUT_SCALE * 100) + '%'; - - var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' + - (1 / PRINT_OUTPUT_SCALE) + ')'; - CustomStyle.setProp('transform' , canvas, cssScale); - CustomStyle.setProp('transformOrigin' , canvas, '0% 0%'); - - var printContainer = document.getElementById('printContainer'); - var canvasWrapper = document.createElement('div'); - canvasWrapper.style.width = viewport.width + 'pt'; - canvasWrapper.style.height = viewport.height + 'pt'; - canvasWrapper.appendChild(canvas); - printContainer.appendChild(canvasWrapper); - - canvas.mozPrintCallback = function(obj) { - var ctx = obj.context; - - ctx.save(); - ctx.fillStyle = 'rgb(255, 255, 255)'; - ctx.fillRect(0, 0, canvas.width, canvas.height); - ctx.restore(); - // Used by the mozCurrentTransform polyfill in src/display/canvas.js. - ctx._transformMatrix = - [PRINT_OUTPUT_SCALE, 0, 0, PRINT_OUTPUT_SCALE, 0, 0]; - ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE); - - var renderContext = { - canvasContext: ctx, - viewport: viewport, - intent: 'print' - }; - - pdfPage.render(renderContext).promise.then(function() { - // Tell the printEngine that rendering this canvas/page has finished. - obj.done(); - }, function(error) { - console.error(error); - // Tell the printEngine that rendering this canvas/page has failed. - // This will make the print proces stop. - if ('abort' in obj) { - obj.abort(); - } else { - obj.done(); - } - }); - }; - }, - }; - - return PDFPageView; -})(); - - -/** - * @typedef {Object} TextLayerBuilderOptions - * @property {HTMLDivElement} textLayerDiv - The text layer container. - * @property {number} pageIndex - The page index. - * @property {PageViewport} viewport - The viewport of the text layer. - * @property {PDFFindController} findController - */ - -/** - * TextLayerBuilder provides text-selection functionality for the PDF. - * It does this by creating overlay divs over the PDF text. These divs - * contain text that matches the PDF text they are overlaying. This object - * also provides a way to highlight text that is being searched for. - * @class - */ -var TextLayerBuilder = (function TextLayerBuilderClosure() { - function TextLayerBuilder(options) { - this.textLayerDiv = options.textLayerDiv; - this.renderingDone = false; - this.divContentDone = false; - this.pageIdx = options.pageIndex; - this.pageNumber = this.pageIdx + 1; - this.matches = []; - this.viewport = options.viewport; - this.textDivs = []; - this.findController = options.findController || null; - this.textLayerRenderTask = null; - this._bindMouse(); - } - - TextLayerBuilder.prototype = { - _finishRendering: function TextLayerBuilder_finishRendering() { - this.renderingDone = true; - - var endOfContent = document.createElement('div'); - endOfContent.className = 'endOfContent'; - this.textLayerDiv.appendChild(endOfContent); - - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('textlayerrendered', true, true, { - pageNumber: this.pageNumber - }); - this.textLayerDiv.dispatchEvent(event); - }, - - /** - * Renders the text layer. - * @param {number} timeout (optional) if specified, the rendering waits - * for specified amount of ms. - */ - render: function TextLayerBuilder_render(timeout) { - if (!this.divContentDone || this.renderingDone) { - return; - } - - if (this.textLayerRenderTask) { - this.textLayerRenderTask.cancel(); - this.textLayerRenderTask = null; - } - - this.textDivs = []; - var textLayerFrag = document.createDocumentFragment(); - this.textLayerRenderTask = PDFJS.renderTextLayer({ - textContent: this.textContent, - container: textLayerFrag, - viewport: this.viewport, - textDivs: this.textDivs, - timeout: timeout - }); - this.textLayerRenderTask.promise.then(function () { - this.textLayerDiv.appendChild(textLayerFrag); - this._finishRendering(); - this.updateMatches(); - }.bind(this), function (reason) { - // canceled or failed to render text layer -- skipping errors - }); - }, - - setTextContent: function TextLayerBuilder_setTextContent(textContent) { - if (this.textLayerRenderTask) { - this.textLayerRenderTask.cancel(); - this.textLayerRenderTask = null; - } - this.textContent = textContent; - this.divContentDone = true; - }, - - convertMatches: function TextLayerBuilder_convertMatches(matches) { - var i = 0; - var iIndex = 0; - var bidiTexts = this.textContent.items; - var end = bidiTexts.length - 1; - var queryLen = (this.findController === null ? - 0 : this.findController.state.query.length); - var ret = []; - - for (var m = 0, len = matches.length; m < len; m++) { - // Calculate the start position. - var matchIdx = matches[m]; - - // Loop over the divIdxs. - while (i !== end && matchIdx >= (iIndex + bidiTexts[i].str.length)) { - iIndex += bidiTexts[i].str.length; - i++; - } - - if (i === bidiTexts.length) { - console.error('Could not find a matching mapping'); - } - - var match = { - begin: { - divIdx: i, - offset: matchIdx - iIndex - } - }; - - // Calculate the end position. - matchIdx += queryLen; - - // Somewhat the same array as above, but use > instead of >= to get - // the end position right. - while (i !== end && matchIdx > (iIndex + bidiTexts[i].str.length)) { - iIndex += bidiTexts[i].str.length; - i++; - } - - match.end = { - divIdx: i, - offset: matchIdx - iIndex - }; - ret.push(match); - } - - return ret; - }, - - renderMatches: function TextLayerBuilder_renderMatches(matches) { - // Early exit if there is nothing to render. - if (matches.length === 0) { - return; - } - - var bidiTexts = this.textContent.items; - var textDivs = this.textDivs; - var prevEnd = null; - var pageIdx = this.pageIdx; - var isSelectedPage = (this.findController === null ? - false : (pageIdx === this.findController.selected.pageIdx)); - var selectedMatchIdx = (this.findController === null ? - -1 : this.findController.selected.matchIdx); - var highlightAll = (this.findController === null ? - false : this.findController.state.highlightAll); - var infinity = { - divIdx: -1, - offset: undefined - }; - - function beginText(begin, className) { - var divIdx = begin.divIdx; - textDivs[divIdx].textContent = ''; - appendTextToDiv(divIdx, 0, begin.offset, className); - } - - function appendTextToDiv(divIdx, fromOffset, toOffset, className) { - var div = textDivs[divIdx]; - var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset); - var node = document.createTextNode(content); - if (className) { - var span = document.createElement('span'); - span.className = className; - span.appendChild(node); - div.appendChild(span); - return; - } - div.appendChild(node); - } - - var i0 = selectedMatchIdx, i1 = i0 + 1; - if (highlightAll) { - i0 = 0; - i1 = matches.length; - } else if (!isSelectedPage) { - // Not highlighting all and this isn't the selected page, so do nothing. - return; - } - - for (var i = i0; i < i1; i++) { - var match = matches[i]; - var begin = match.begin; - var end = match.end; - var isSelected = (isSelectedPage && i === selectedMatchIdx); - var highlightSuffix = (isSelected ? ' selected' : ''); - - if (this.findController) { - this.findController.updateMatchPosition(pageIdx, i, textDivs, - begin.divIdx, end.divIdx); - } - - // Match inside new div. - if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { - // If there was a previous div, then add the text at the end. - if (prevEnd !== null) { - appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); - } - // Clear the divs and set the content until the starting point. - beginText(begin); - } else { - appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); - } - - if (begin.divIdx === end.divIdx) { - appendTextToDiv(begin.divIdx, begin.offset, end.offset, - 'highlight' + highlightSuffix); - } else { - appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, - 'highlight begin' + highlightSuffix); - for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { - textDivs[n0].className = 'highlight middle' + highlightSuffix; - } - beginText(end, 'highlight end' + highlightSuffix); - } - prevEnd = end; - } - - if (prevEnd) { - appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); - } - }, - - updateMatches: function TextLayerBuilder_updateMatches() { - // Only show matches when all rendering is done. - if (!this.renderingDone) { - return; - } - - // Clear all matches. - var matches = this.matches; - var textDivs = this.textDivs; - var bidiTexts = this.textContent.items; - var clearedUntilDivIdx = -1; - - // Clear all current matches. - for (var i = 0, len = matches.length; i < len; i++) { - var match = matches[i]; - var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); - for (var n = begin, end = match.end.divIdx; n <= end; n++) { - var div = textDivs[n]; - div.textContent = bidiTexts[n].str; - div.className = ''; - } - clearedUntilDivIdx = match.end.divIdx + 1; - } - - if (this.findController === null || !this.findController.active) { - return; - } - - // Convert the matches on the page controller into the match format - // used for the textLayer. - this.matches = this.convertMatches(this.findController === null ? - [] : (this.findController.pageMatches[this.pageIdx] || [])); - this.renderMatches(this.matches); - }, - - /** - * Fixes text selection: adds additional div where mouse was clicked. - * This reduces flickering of the content if mouse slowly dragged down/up. - * @private - */ - _bindMouse: function TextLayerBuilder_bindMouse() { - var div = this.textLayerDiv; - div.addEventListener('mousedown', function (e) { - var end = div.querySelector('.endOfContent'); - if (!end) { - return; - } - // On non-Firefox browsers, the selection will feel better if the height - // of the endOfContent div will be adjusted to start at mouse click - // location -- this will avoid flickering when selections moves up. - // However it does not work when selection started on empty space. - var adjustTop = e.target !== div; - adjustTop = adjustTop && window.getComputedStyle(end). - getPropertyValue('-moz-user-select') !== 'none'; - if (adjustTop) { - var divBounds = div.getBoundingClientRect(); - var r = Math.max(0, (e.pageY - divBounds.top) / divBounds.height); - end.style.top = (r * 100).toFixed(2) + '%'; - } - end.classList.add('active'); - }); - div.addEventListener('mouseup', function (e) { - var end = div.querySelector('.endOfContent'); - if (!end) { - return; - } - end.style.top = ''; - end.classList.remove('active'); - }); - }, - }; - return TextLayerBuilder; -})(); - -/** - * @constructor - * @implements IPDFTextLayerFactory - */ -function DefaultTextLayerFactory() {} -DefaultTextLayerFactory.prototype = { - /** - * @param {HTMLDivElement} textLayerDiv - * @param {number} pageIndex - * @param {PageViewport} viewport - * @returns {TextLayerBuilder} - */ - createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) { - return new TextLayerBuilder({ - textLayerDiv: textLayerDiv, - pageIndex: pageIndex, - viewport: viewport - }); - } -}; - - -/** - * @typedef {Object} AnnotationLayerBuilderOptions - * @property {HTMLDivElement} pageDiv - * @property {PDFPage} pdfPage - * @property {IPDFLinkService} linkService - */ - -/** - * @class - */ -var AnnotationLayerBuilder = (function AnnotationLayerBuilderClosure() { - /** - * @param {AnnotationLayerBuilderOptions} options - * @constructs AnnotationLayerBuilder - */ - function AnnotationLayerBuilder(options) { - this.pageDiv = options.pageDiv; - this.pdfPage = options.pdfPage; - this.linkService = options.linkService; - - this.div = null; - } - - AnnotationLayerBuilder.prototype = - /** @lends AnnotationLayerBuilder.prototype */ { - - /** - * @param {PageViewport} viewport - * @param {string} intent (default value is 'display') - */ - render: function AnnotationLayerBuilder_render(viewport, intent) { - var self = this; - var parameters = { - intent: (intent === undefined ? 'display' : intent), - }; - - this.pdfPage.getAnnotations(parameters).then(function (annotations) { - viewport = viewport.clone({ dontFlip: true }); - parameters = { - viewport: viewport, - div: self.div, - annotations: annotations, - page: self.pdfPage, - linkService: self.linkService - }; - - if (self.div) { - // If an annotationLayer already exists, refresh its children's - // transformation matrices. - PDFJS.AnnotationLayer.update(parameters); - } else { - // Create an annotation layer div and render the annotations - // if there is at least one annotation. - if (annotations.length === 0) { - return; - } - - self.div = document.createElement('div'); - self.div.className = 'annotationLayer'; - self.pageDiv.appendChild(self.div); - parameters.div = self.div; - - PDFJS.AnnotationLayer.render(parameters); - } - }); - }, - - hide: function AnnotationLayerBuilder_hide() { - if (!this.div) { - return; - } - this.div.setAttribute('hidden', 'true'); - } - }; - - return AnnotationLayerBuilder; -})(); - -/** - * @constructor - * @implements IPDFAnnotationLayerFactory - */ -function DefaultAnnotationLayerFactory() {} -DefaultAnnotationLayerFactory.prototype = { - /** - * @param {HTMLDivElement} pageDiv - * @param {PDFPage} pdfPage - * @returns {AnnotationLayerBuilder} - */ - createAnnotationLayerBuilder: function (pageDiv, pdfPage) { - return new AnnotationLayerBuilder({ - pageDiv: pageDiv, - pdfPage: pdfPage, - linkService: new SimpleLinkService(), - }); - } -}; - - -/** - * @typedef {Object} PDFViewerOptions - * @property {HTMLDivElement} container - The container for the viewer element. - * @property {HTMLDivElement} viewer - (optional) The viewer element. - * @property {IPDFLinkService} linkService - The navigation/linking service. - * @property {PDFRenderingQueue} renderingQueue - (optional) The rendering - * queue object. - * @property {boolean} removePageBorders - (optional) Removes the border shadow - * around the pages. The default is false. - */ - -/** - * Simple viewer control to display PDF content/pages. - * @class - * @implements {IRenderableView} - */ -var PDFViewer = (function pdfViewer() { - function PDFPageViewBuffer(size) { - var data = []; - this.push = function cachePush(view) { - var i = data.indexOf(view); - if (i >= 0) { - data.splice(i, 1); - } - data.push(view); - if (data.length > size) { - data.shift().destroy(); - } - }; - this.resize = function (newSize) { - size = newSize; - while (data.length > size) { - data.shift().destroy(); - } - }; - } - - function isSameScale(oldScale, newScale) { - if (newScale === oldScale) { - return true; - } - if (Math.abs(newScale - oldScale) < 1e-15) { - // Prevent unnecessary re-rendering of all pages when the scale - // changes only because of limited numerical precision. - return true; - } - return false; - } - - /** - * @constructs PDFViewer - * @param {PDFViewerOptions} options - */ - function PDFViewer(options) { - this.container = options.container; - this.viewer = options.viewer || options.container.firstElementChild; - this.linkService = options.linkService || new SimpleLinkService(); - this.removePageBorders = options.removePageBorders || false; - - this.defaultRenderingQueue = !options.renderingQueue; - if (this.defaultRenderingQueue) { - // Custom rendering queue is not specified, using default one - this.renderingQueue = new PDFRenderingQueue(); - this.renderingQueue.setViewer(this); - } else { - this.renderingQueue = options.renderingQueue; - } - - this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this)); - this.updateInProgress = false; - this.presentationModeState = PresentationModeState.UNKNOWN; - this._resetView(); - - if (this.removePageBorders) { - this.viewer.classList.add('removePageBorders'); - } - } - - PDFViewer.prototype = /** @lends PDFViewer.prototype */{ - get pagesCount() { - return this._pages.length; - }, - - getPageView: function (index) { - return this._pages[index]; - }, - - get currentPageNumber() { - return this._currentPageNumber; - }, - - set currentPageNumber(val) { - if (!this.pdfDocument) { - this._currentPageNumber = val; - return; - } - - var event = document.createEvent('UIEvents'); - event.initUIEvent('pagechange', true, true, window, 0); - event.updateInProgress = this.updateInProgress; - - if (!(0 < val && val <= this.pagesCount)) { - event.pageNumber = this._currentPageNumber; - event.previousPageNumber = val; - this.container.dispatchEvent(event); - return; - } - - event.previousPageNumber = this._currentPageNumber; - this._currentPageNumber = val; - event.pageNumber = val; - this.container.dispatchEvent(event); - - // Check if the caller is `PDFViewer_update`, to avoid breaking scrolling. - if (this.updateInProgress) { - return; - } - this.scrollPageIntoView(val); - }, - - /** - * @returns {number} - */ - get currentScale() { - return this._currentScale !== UNKNOWN_SCALE ? this._currentScale : - DEFAULT_SCALE; - }, - - /** - * @param {number} val - Scale of the pages in percents. - */ - set currentScale(val) { - if (isNaN(val)) { - throw new Error('Invalid numeric scale'); - } - if (!this.pdfDocument) { - this._currentScale = val; - this._currentScaleValue = val !== UNKNOWN_SCALE ? val.toString() : null; - return; - } - this._setScale(val, false); - }, - - /** - * @returns {string} - */ - get currentScaleValue() { - return this._currentScaleValue; - }, - - /** - * @param val - The scale of the pages (in percent or predefined value). - */ - set currentScaleValue(val) { - if (!this.pdfDocument) { - this._currentScale = isNaN(val) ? UNKNOWN_SCALE : val; - this._currentScaleValue = val; - return; - } - this._setScale(val, false); - }, - - /** - * @returns {number} - */ - get pagesRotation() { - return this._pagesRotation; - }, - - /** - * @param {number} rotation - The rotation of the pages (0, 90, 180, 270). - */ - set pagesRotation(rotation) { - this._pagesRotation = rotation; - - for (var i = 0, l = this._pages.length; i < l; i++) { - var pageView = this._pages[i]; - pageView.update(pageView.scale, rotation); - } - - this._setScale(this._currentScaleValue, true); - - if (this.defaultRenderingQueue) { - this.update(); - } - }, - - /** - * @param pdfDocument {PDFDocument} - */ - setDocument: function (pdfDocument) { - if (this.pdfDocument) { - this._resetView(); - } - - this.pdfDocument = pdfDocument; - if (!pdfDocument) { - return; - } - - var pagesCount = pdfDocument.numPages; - var self = this; - - var resolvePagesPromise; - var pagesPromise = new Promise(function (resolve) { - resolvePagesPromise = resolve; - }); - this.pagesPromise = pagesPromise; - pagesPromise.then(function () { - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('pagesloaded', true, true, { - pagesCount: pagesCount - }); - self.container.dispatchEvent(event); - }); - - var isOnePageRenderedResolved = false; - var resolveOnePageRendered = null; - var onePageRendered = new Promise(function (resolve) { - resolveOnePageRendered = resolve; - }); - this.onePageRendered = onePageRendered; - - var bindOnAfterAndBeforeDraw = function (pageView) { - pageView.onBeforeDraw = function pdfViewLoadOnBeforeDraw() { - // Add the page to the buffer at the start of drawing. That way it can - // be evicted from the buffer and destroyed even if we pause its - // rendering. - self._buffer.push(this); - }; - // when page is painted, using the image as thumbnail base - pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() { - if (!isOnePageRenderedResolved) { - isOnePageRenderedResolved = true; - resolveOnePageRendered(); - } - }; - }; - - var firstPagePromise = pdfDocument.getPage(1); - this.firstPagePromise = firstPagePromise; - - // Fetch a single page so we can get a viewport that will be the default - // viewport for all pages - return firstPagePromise.then(function(pdfPage) { - var scale = this.currentScale; - var viewport = pdfPage.getViewport(scale * CSS_UNITS); - for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { - var textLayerFactory = null; - if (!PDFJS.disableTextLayer) { - textLayerFactory = this; - } - var pageView = new PDFPageView({ - container: this.viewer, - id: pageNum, - scale: scale, - defaultViewport: viewport.clone(), - renderingQueue: this.renderingQueue, - textLayerFactory: textLayerFactory, - annotationLayerFactory: this - }); - bindOnAfterAndBeforeDraw(pageView); - this._pages.push(pageView); - } - - var linkService = this.linkService; - - // Fetch all the pages since the viewport is needed before printing - // starts to create the correct size canvas. Wait until one page is - // rendered so we don't tie up too many resources early on. - onePageRendered.then(function () { - if (!PDFJS.disableAutoFetch) { - var getPagesLeft = pagesCount; - for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { - pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) { - var pageView = self._pages[pageNum - 1]; - if (!pageView.pdfPage) { - pageView.setPdfPage(pdfPage); - } - linkService.cachePageRef(pageNum, pdfPage.ref); - getPagesLeft--; - if (!getPagesLeft) { - resolvePagesPromise(); - } - }.bind(null, pageNum)); - } - } else { - // XXX: Printing is semi-broken with auto fetch disabled. - resolvePagesPromise(); - } - }); - - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('pagesinit', true, true, null); - self.container.dispatchEvent(event); - - if (this.defaultRenderingQueue) { - this.update(); - } - - if (this.findController) { - this.findController.resolveFirstPage(); - } - }.bind(this)); - }, - - _resetView: function () { - this._pages = []; - this._currentPageNumber = 1; - this._currentScale = UNKNOWN_SCALE; - this._currentScaleValue = null; - this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); - this._location = null; - this._pagesRotation = 0; - this._pagesRequests = []; - - var container = this.viewer; - while (container.hasChildNodes()) { - container.removeChild(container.lastChild); - } - }, - - _scrollUpdate: function PDFViewer_scrollUpdate() { - if (this.pagesCount === 0) { - return; - } - this.update(); - for (var i = 0, ii = this._pages.length; i < ii; i++) { - this._pages[i].updatePosition(); - } - }, - - _setScaleDispatchEvent: function pdfViewer_setScaleDispatchEvent( - newScale, newValue, preset) { - var event = document.createEvent('UIEvents'); - event.initUIEvent('scalechange', true, true, window, 0); - event.scale = newScale; - if (preset) { - event.presetValue = newValue; - } - this.container.dispatchEvent(event); - }, - - _setScaleUpdatePages: function pdfViewer_setScaleUpdatePages( - newScale, newValue, noScroll, preset) { - this._currentScaleValue = newValue; - - if (isSameScale(this._currentScale, newScale)) { - if (preset) { - this._setScaleDispatchEvent(newScale, newValue, true); - } - return; - } - - for (var i = 0, ii = this._pages.length; i < ii; i++) { - this._pages[i].update(newScale); - } - this._currentScale = newScale; - - if (!noScroll) { - var page = this._currentPageNumber, dest; - if (this._location && !IGNORE_CURRENT_POSITION_ON_ZOOM && - !(this.isInPresentationMode || this.isChangingPresentationMode)) { - page = this._location.pageNumber; - dest = [null, { name: 'XYZ' }, this._location.left, - this._location.top, null]; - } - this.scrollPageIntoView(page, dest); - } - - this._setScaleDispatchEvent(newScale, newValue, preset); - - if (this.defaultRenderingQueue) { - this.update(); - } - }, - - _setScale: function pdfViewer_setScale(value, noScroll) { - var scale = parseFloat(value); - - if (scale > 0) { - this._setScaleUpdatePages(scale, value, noScroll, false); - } else { - var currentPage = this._pages[this._currentPageNumber - 1]; - if (!currentPage) { - return; - } - var hPadding = (this.isInPresentationMode || this.removePageBorders) ? - 0 : SCROLLBAR_PADDING; - var vPadding = (this.isInPresentationMode || this.removePageBorders) ? - 0 : VERTICAL_PADDING; - var pageWidthScale = (this.container.clientWidth - hPadding) / - currentPage.width * currentPage.scale; - var pageHeightScale = (this.container.clientHeight - vPadding) / - currentPage.height * currentPage.scale; - switch (value) { - case 'page-actual': - scale = 1; - break; - case 'page-width': - scale = pageWidthScale; - break; - case 'page-height': - scale = pageHeightScale; - break; - case 'page-fit': - scale = Math.min(pageWidthScale, pageHeightScale); - break; - case 'auto': - var isLandscape = (currentPage.width > currentPage.height); - // For pages in landscape mode, fit the page height to the viewer - // *unless* the page would thus become too wide to fit horizontally. - var horizontalScale = isLandscape ? - Math.min(pageHeightScale, pageWidthScale) : pageWidthScale; - scale = Math.min(MAX_AUTO_SCALE, horizontalScale); - break; - default: - console.error('pdfViewSetScale: \'' + value + - '\' is an unknown zoom value.'); - return; - } - this._setScaleUpdatePages(scale, value, noScroll, true); - } - }, - - /** - * Scrolls page into view. - * @param {number} pageNumber - * @param {Array} dest - (optional) original PDF destination array: - * - */ - scrollPageIntoView: function PDFViewer_scrollPageIntoView(pageNumber, - dest) { - if (!this.pdfDocument) { - return; - } - - var pageView = this._pages[pageNumber - 1]; - - if (this.isInPresentationMode) { - if (this._currentPageNumber !== pageView.id) { - // Avoid breaking getVisiblePages in presentation mode. - this.currentPageNumber = pageView.id; - return; - } - dest = null; - // Fixes the case when PDF has different page sizes. - this._setScale(this._currentScaleValue, true); - } - if (!dest) { - scrollIntoView(pageView.div); - return; - } - - var x = 0, y = 0; - var width = 0, height = 0, widthScale, heightScale; - var changeOrientation = (pageView.rotation % 180 === 0 ? false : true); - var pageWidth = (changeOrientation ? pageView.height : pageView.width) / - pageView.scale / CSS_UNITS; - var pageHeight = (changeOrientation ? pageView.width : pageView.height) / - pageView.scale / CSS_UNITS; - var scale = 0; - switch (dest[1].name) { - case 'XYZ': - x = dest[2]; - y = dest[3]; - scale = dest[4]; - // If x and/or y coordinates are not supplied, default to - // _top_ left of the page (not the obvious bottom left, - // since aligning the bottom of the intended page with the - // top of the window is rarely helpful). - x = x !== null ? x : 0; - y = y !== null ? y : pageHeight; - break; - case 'Fit': - case 'FitB': - scale = 'page-fit'; - break; - case 'FitH': - case 'FitBH': - y = dest[2]; - scale = 'page-width'; - // According to the PDF spec, section 12.3.2.2, a `null` value in the - // parameter should maintain the position relative to the new page. - if (y === null && this._location) { - x = this._location.left; - y = this._location.top; - } - break; - case 'FitV': - case 'FitBV': - x = dest[2]; - width = pageWidth; - height = pageHeight; - scale = 'page-height'; - break; - case 'FitR': - x = dest[2]; - y = dest[3]; - width = dest[4] - x; - height = dest[5] - y; - var hPadding = this.removePageBorders ? 0 : SCROLLBAR_PADDING; - var vPadding = this.removePageBorders ? 0 : VERTICAL_PADDING; - - widthScale = (this.container.clientWidth - hPadding) / - width / CSS_UNITS; - heightScale = (this.container.clientHeight - vPadding) / - height / CSS_UNITS; - scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); - break; - default: - return; - } - - if (scale && scale !== this._currentScale) { - this.currentScaleValue = scale; - } else if (this._currentScale === UNKNOWN_SCALE) { - this.currentScaleValue = DEFAULT_SCALE_VALUE; - } - - if (scale === 'page-fit' && !dest[4]) { - scrollIntoView(pageView.div); - return; - } - - var boundingRect = [ - pageView.viewport.convertToViewportPoint(x, y), - pageView.viewport.convertToViewportPoint(x + width, y + height) - ]; - var left = Math.min(boundingRect[0][0], boundingRect[1][0]); - var top = Math.min(boundingRect[0][1], boundingRect[1][1]); - - scrollIntoView(pageView.div, { left: left, top: top }); - }, - - _updateLocation: function (firstPage) { - var currentScale = this._currentScale; - var currentScaleValue = this._currentScaleValue; - var normalizedScaleValue = - parseFloat(currentScaleValue) === currentScale ? - Math.round(currentScale * 10000) / 100 : currentScaleValue; - - var pageNumber = firstPage.id; - var pdfOpenParams = '#page=' + pageNumber; - pdfOpenParams += '&zoom=' + normalizedScaleValue; - var currentPageView = this._pages[pageNumber - 1]; - var container = this.container; - var topLeft = currentPageView.getPagePoint( - (container.scrollLeft - firstPage.x), - (container.scrollTop - firstPage.y)); - var intLeft = Math.round(topLeft[0]); - var intTop = Math.round(topLeft[1]); - pdfOpenParams += ',' + intLeft + ',' + intTop; - - this._location = { - pageNumber: pageNumber, - scale: normalizedScaleValue, - top: intTop, - left: intLeft, - pdfOpenParams: pdfOpenParams - }; - }, - - update: function PDFViewer_update() { - var visible = this._getVisiblePages(); - var visiblePages = visible.views; - if (visiblePages.length === 0) { - return; - } - - this.updateInProgress = true; - - var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, - 2 * visiblePages.length + 1); - this._buffer.resize(suggestedCacheSize); - - this.renderingQueue.renderHighestPriority(visible); - - var currentId = this._currentPageNumber; - var firstPage = visible.first; - - for (var i = 0, ii = visiblePages.length, stillFullyVisible = false; - i < ii; ++i) { - var page = visiblePages[i]; - - if (page.percent < 100) { - break; - } - if (page.id === currentId) { - stillFullyVisible = true; - break; - } - } - - if (!stillFullyVisible) { - currentId = visiblePages[0].id; - } - - if (!this.isInPresentationMode) { - this.currentPageNumber = currentId; - } - - this._updateLocation(firstPage); - - this.updateInProgress = false; - - var event = document.createEvent('UIEvents'); - event.initUIEvent('updateviewarea', true, true, window, 0); - event.location = this._location; - this.container.dispatchEvent(event); - }, - - containsElement: function (element) { - return this.container.contains(element); - }, - - focus: function () { - this.container.focus(); - }, - - get isInPresentationMode() { - return this.presentationModeState === PresentationModeState.FULLSCREEN; - }, - - get isChangingPresentationMode() { - return this.presentationModeState === PresentationModeState.CHANGING; - }, - - get isHorizontalScrollbarEnabled() { - return (this.isInPresentationMode ? - false : (this.container.scrollWidth > this.container.clientWidth)); - }, - - _getVisiblePages: function () { - if (!this.isInPresentationMode) { - return getVisibleElements(this.container, this._pages, true); - } else { - // The algorithm in getVisibleElements doesn't work in all browsers and - // configurations when presentation mode is active. - var visible = []; - var currentPage = this._pages[this._currentPageNumber - 1]; - visible.push({ id: currentPage.id, view: currentPage }); - return { first: currentPage, last: currentPage, views: visible }; - } - }, - - cleanup: function () { - for (var i = 0, ii = this._pages.length; i < ii; i++) { - if (this._pages[i] && - this._pages[i].renderingState !== RenderingStates.FINISHED) { - this._pages[i].reset(); - } - } - }, - - /** - * @param {PDFPageView} pageView - * @returns {PDFPage} - * @private - */ - _ensurePdfPageLoaded: function (pageView) { - if (pageView.pdfPage) { - return Promise.resolve(pageView.pdfPage); - } - var pageNumber = pageView.id; - if (this._pagesRequests[pageNumber]) { - return this._pagesRequests[pageNumber]; - } - var promise = this.pdfDocument.getPage(pageNumber).then( - function (pdfPage) { - pageView.setPdfPage(pdfPage); - this._pagesRequests[pageNumber] = null; - return pdfPage; - }.bind(this)); - this._pagesRequests[pageNumber] = promise; - return promise; - }, - - forceRendering: function (currentlyVisiblePages) { - var visiblePages = currentlyVisiblePages || this._getVisiblePages(); - var pageView = this.renderingQueue.getHighestPriority(visiblePages, - this._pages, - this.scroll.down); - if (pageView) { - this._ensurePdfPageLoaded(pageView).then(function () { - this.renderingQueue.renderView(pageView); - }.bind(this)); - return true; - } - return false; - }, - - getPageTextContent: function (pageIndex) { - return this.pdfDocument.getPage(pageIndex + 1).then(function (page) { - return page.getTextContent({ normalizeWhitespace: true }); - }); - }, - - /** - * @param {HTMLDivElement} textLayerDiv - * @param {number} pageIndex - * @param {PageViewport} viewport - * @returns {TextLayerBuilder} - */ - createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) { - return new TextLayerBuilder({ - textLayerDiv: textLayerDiv, - pageIndex: pageIndex, - viewport: viewport, - findController: this.isInPresentationMode ? null : this.findController - }); - }, - - /** - * @param {HTMLDivElement} pageDiv - * @param {PDFPage} pdfPage - * @returns {AnnotationLayerBuilder} - */ - createAnnotationLayerBuilder: function (pageDiv, pdfPage) { - return new AnnotationLayerBuilder({ - pageDiv: pageDiv, - pdfPage: pdfPage, - linkService: this.linkService - }); - }, - - setFindController: function (findController) { - this.findController = findController; - }, - }; - - return PDFViewer; -})(); - -var SimpleLinkService = (function SimpleLinkServiceClosure() { - function SimpleLinkService() {} - - SimpleLinkService.prototype = { - /** - * @returns {number} - */ - get page() { - return 0; - }, - /** - * @param {number} value - */ - set page(value) {}, - /** - * @param dest - The PDF destination object. - */ - navigateTo: function (dest) {}, - /** - * @param dest - The PDF destination object. - * @returns {string} The hyperlink to the PDF object. - */ - getDestinationHash: function (dest) { - return '#'; - }, - /** - * @param hash - The PDF parameters/hash. - * @returns {string} The hyperlink to the PDF object. - */ - getAnchorUrl: function (hash) { - return '#'; - }, - /** - * @param {string} hash - */ - setHash: function (hash) {}, - /** - * @param {string} action - */ - executeNamedAction: function (action) {}, - /** - * @param {number} pageNum - page number. - * @param {Object} pageRef - reference to the page. - */ - cachePageRef: function (pageNum, pageRef) {} - }; - return SimpleLinkService; -})(); - - -var THUMBNAIL_SCROLL_MARGIN = -19; - - -var THUMBNAIL_WIDTH = 98; // px -var THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // px - -/** - * @typedef {Object} PDFThumbnailViewOptions - * @property {HTMLDivElement} container - The viewer element. - * @property {number} id - The thumbnail's unique ID (normally its number). - * @property {PageViewport} defaultViewport - The page viewport. - * @property {IPDFLinkService} linkService - The navigation/linking service. - * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. - */ - -/** - * @class - * @implements {IRenderableView} - */ -var PDFThumbnailView = (function PDFThumbnailViewClosure() { - function getTempCanvas(width, height) { - var tempCanvas = PDFThumbnailView.tempImageCache; - if (!tempCanvas) { - tempCanvas = document.createElement('canvas'); - PDFThumbnailView.tempImageCache = tempCanvas; - } - tempCanvas.width = width; - tempCanvas.height = height; - - // Since this is a temporary canvas, we need to fill the canvas with a white - // background ourselves. |_getPageDrawContext| uses CSS rules for this. - tempCanvas.mozOpaque = true; - var ctx = tempCanvas.getContext('2d', {alpha: false}); - ctx.save(); - ctx.fillStyle = 'rgb(255, 255, 255)'; - ctx.fillRect(0, 0, width, height); - ctx.restore(); - return tempCanvas; - } - - /** - * @constructs PDFThumbnailView - * @param {PDFThumbnailViewOptions} options - */ - function PDFThumbnailView(options) { - var container = options.container; - var id = options.id; - var defaultViewport = options.defaultViewport; - var linkService = options.linkService; - var renderingQueue = options.renderingQueue; - - this.id = id; - this.renderingId = 'thumbnail' + id; - - this.pdfPage = null; - this.rotation = 0; - this.viewport = defaultViewport; - this.pdfPageRotate = defaultViewport.rotation; - - this.linkService = linkService; - this.renderingQueue = renderingQueue; - - this.hasImage = false; - this.resume = null; - this.renderingState = RenderingStates.INITIAL; - - this.pageWidth = this.viewport.width; - this.pageHeight = this.viewport.height; - this.pageRatio = this.pageWidth / this.pageHeight; - - this.canvasWidth = THUMBNAIL_WIDTH; - this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0; - this.scale = this.canvasWidth / this.pageWidth; - - var anchor = document.createElement('a'); - anchor.href = linkService.getAnchorUrl('#page=' + id); - anchor.title = 'Page ' + id; - anchor.onclick = function stopNavigation() { - linkService.page = id; - return false; - }; - - var div = document.createElement('div'); - div.id = 'thumbnailContainer' + id; - div.className = 'thumbnail'; - this.div = div; - - if (id === 1) { - // Highlight the thumbnail of the first page when no page number is - // specified (or exists in cache) when the document is loaded. - div.classList.add('selected'); - } - - var ring = document.createElement('div'); - ring.className = 'thumbnailSelectionRing'; - var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH; - ring.style.width = this.canvasWidth + borderAdjustment + 'px'; - ring.style.height = this.canvasHeight + borderAdjustment + 'px'; - this.ring = ring; - - div.appendChild(ring); - anchor.appendChild(div); - container.appendChild(anchor); - } - - PDFThumbnailView.prototype = { - setPdfPage: function PDFThumbnailView_setPdfPage(pdfPage) { - this.pdfPage = pdfPage; - this.pdfPageRotate = pdfPage.rotate; - var totalRotation = (this.rotation + this.pdfPageRotate) % 360; - this.viewport = pdfPage.getViewport(1, totalRotation); - this.reset(); - }, - - reset: function PDFThumbnailView_reset() { - if (this.renderTask) { - this.renderTask.cancel(); - } - this.hasImage = false; - this.resume = null; - this.renderingState = RenderingStates.INITIAL; - - this.pageWidth = this.viewport.width; - this.pageHeight = this.viewport.height; - this.pageRatio = this.pageWidth / this.pageHeight; - - this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0; - this.scale = (this.canvasWidth / this.pageWidth); - - this.div.removeAttribute('data-loaded'); - var ring = this.ring; - var childNodes = ring.childNodes; - for (var i = childNodes.length - 1; i >= 0; i--) { - ring.removeChild(childNodes[i]); - } - var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH; - ring.style.width = this.canvasWidth + borderAdjustment + 'px'; - ring.style.height = this.canvasHeight + borderAdjustment + 'px'; - - if (this.canvas) { - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - this.canvas.width = 0; - this.canvas.height = 0; - delete this.canvas; - } - if (this.image) { - this.image.removeAttribute('src'); - delete this.image; - } - }, - - update: function PDFThumbnailView_update(rotation) { - if (typeof rotation !== 'undefined') { - this.rotation = rotation; - } - var totalRotation = (this.rotation + this.pdfPageRotate) % 360; - this.viewport = this.viewport.clone({ - scale: 1, - rotation: totalRotation - }); - this.reset(); - }, - - /** - * @private - */ - _getPageDrawContext: - function PDFThumbnailView_getPageDrawContext(noCtxScale) { - var canvas = document.createElement('canvas'); - this.canvas = canvas; - - canvas.mozOpaque = true; - var ctx = canvas.getContext('2d', {alpha: false}); - var outputScale = getOutputScale(ctx); - - canvas.width = (this.canvasWidth * outputScale.sx) | 0; - canvas.height = (this.canvasHeight * outputScale.sy) | 0; - canvas.style.width = this.canvasWidth + 'px'; - canvas.style.height = this.canvasHeight + 'px'; - - if (!noCtxScale && outputScale.scaled) { - ctx.scale(outputScale.sx, outputScale.sy); - } - - var image = document.createElement('img'); - this.image = image; - - image.id = this.renderingId; - image.className = 'thumbnailImage'; - image.setAttribute('aria-label', 'Thumbnail of Page ' + this.id); - - image.style.width = canvas.style.width; - image.style.height = canvas.style.height; - - return ctx; - }, - - /** - * @private - */ - _convertCanvasToImage: function PDFThumbnailView_convertCanvasToImage() { - if (!this.canvas) { - return; - } - this.image.src = this.canvas.toDataURL(); - - this.div.setAttribute('data-loaded', true); - this.ring.appendChild(this.image); - - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - this.canvas.width = 0; - this.canvas.height = 0; - delete this.canvas; - }, - - draw: function PDFThumbnailView_draw() { - if (this.renderingState !== RenderingStates.INITIAL) { - console.error('Must be in new state before drawing'); - } - if (this.hasImage) { - return Promise.resolve(undefined); - } - this.hasImage = true; - this.renderingState = RenderingStates.RUNNING; - - var resolveRenderPromise, rejectRenderPromise; - var promise = new Promise(function (resolve, reject) { - resolveRenderPromise = resolve; - rejectRenderPromise = reject; - }); - - var self = this; - function thumbnailDrawCallback(error) { - // The renderTask may have been replaced by a new one, so only remove - // the reference to the renderTask if it matches the one that is - // triggering this callback. - if (renderTask === self.renderTask) { - self.renderTask = null; - } - if (error === 'cancelled') { - rejectRenderPromise(error); - return; - } - self.renderingState = RenderingStates.FINISHED; - self._convertCanvasToImage(); - - if (!error) { - resolveRenderPromise(undefined); - } else { - rejectRenderPromise(error); - } - } - - var ctx = this._getPageDrawContext(); - var drawViewport = this.viewport.clone({ scale: this.scale }); - var renderContinueCallback = function renderContinueCallback(cont) { - if (!self.renderingQueue.isHighestPriority(self)) { - self.renderingState = RenderingStates.PAUSED; - self.resume = function resumeCallback() { - self.renderingState = RenderingStates.RUNNING; - cont(); - }; - return; - } - cont(); - }; - - var renderContext = { - canvasContext: ctx, - viewport: drawViewport - }; - var renderTask = this.renderTask = this.pdfPage.render(renderContext); - renderTask.onContinue = renderContinueCallback; - - renderTask.promise.then( - function pdfPageRenderCallback() { - thumbnailDrawCallback(null); - }, - function pdfPageRenderError(error) { - thumbnailDrawCallback(error); - } - ); - return promise; - }, - - setImage: function PDFThumbnailView_setImage(pageView) { - var img = pageView.canvas; - if (this.hasImage || !img) { - return; - } - if (!this.pdfPage) { - this.setPdfPage(pageView.pdfPage); - } - this.hasImage = true; - this.renderingState = RenderingStates.FINISHED; - - var ctx = this._getPageDrawContext(true); - var canvas = ctx.canvas; - - if (img.width <= 2 * canvas.width) { - ctx.drawImage(img, 0, 0, img.width, img.height, - 0, 0, canvas.width, canvas.height); - this._convertCanvasToImage(); - return; - } - // drawImage does an awful job of rescaling the image, doing it gradually. - var MAX_NUM_SCALING_STEPS = 3; - var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS; - var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS; - var reducedImage = getTempCanvas(reducedWidth, reducedHeight); - var reducedImageCtx = reducedImage.getContext('2d'); - - while (reducedWidth > img.width || reducedHeight > img.height) { - reducedWidth >>= 1; - reducedHeight >>= 1; - } - reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, - 0, 0, reducedWidth, reducedHeight); - while (reducedWidth > 2 * canvas.width) { - reducedImageCtx.drawImage(reducedImage, - 0, 0, reducedWidth, reducedHeight, - 0, 0, reducedWidth >> 1, reducedHeight >> 1); - reducedWidth >>= 1; - reducedHeight >>= 1; - } - ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, - 0, 0, canvas.width, canvas.height); - this._convertCanvasToImage(); - } - }; - - return PDFThumbnailView; -})(); - -PDFThumbnailView.tempImageCache = null; - - -/** - * @typedef {Object} PDFThumbnailViewerOptions - * @property {HTMLDivElement} container - The container for the thumbnail - * elements. - * @property {IPDFLinkService} linkService - The navigation/linking service. - * @property {PDFRenderingQueue} renderingQueue - The rendering queue object. - */ - -/** - * Simple viewer control to display thumbnails for pages. - * @class - * @implements {IRenderableView} - */ -var PDFThumbnailViewer = (function PDFThumbnailViewerClosure() { - /** - * @constructs PDFThumbnailViewer - * @param {PDFThumbnailViewerOptions} options - */ - function PDFThumbnailViewer(options) { - this.container = options.container; - this.renderingQueue = options.renderingQueue; - this.linkService = options.linkService; - - this.scroll = watchScroll(this.container, this._scrollUpdated.bind(this)); - this._resetView(); - } - - PDFThumbnailViewer.prototype = { - /** - * @private - */ - _scrollUpdated: function PDFThumbnailViewer_scrollUpdated() { - this.renderingQueue.renderHighestPriority(); - }, - - getThumbnail: function PDFThumbnailViewer_getThumbnail(index) { - return this.thumbnails[index]; - }, - - /** - * @private - */ - _getVisibleThumbs: function PDFThumbnailViewer_getVisibleThumbs() { - return getVisibleElements(this.container, this.thumbnails); - }, - - scrollThumbnailIntoView: - function PDFThumbnailViewer_scrollThumbnailIntoView(page) { - var selected = document.querySelector('.thumbnail.selected'); - if (selected) { - selected.classList.remove('selected'); - } - var thumbnail = document.getElementById('thumbnailContainer' + page); - if (thumbnail) { - thumbnail.classList.add('selected'); - } - var visibleThumbs = this._getVisibleThumbs(); - var numVisibleThumbs = visibleThumbs.views.length; - - // If the thumbnail isn't currently visible, scroll it into view. - if (numVisibleThumbs > 0) { - var first = visibleThumbs.first.id; - // Account for only one thumbnail being visible. - var last = (numVisibleThumbs > 1 ? visibleThumbs.last.id : first); - if (page <= first || page >= last) { - scrollIntoView(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN }); - } - } - }, - - get pagesRotation() { - return this._pagesRotation; - }, - - set pagesRotation(rotation) { - this._pagesRotation = rotation; - for (var i = 0, l = this.thumbnails.length; i < l; i++) { - var thumb = this.thumbnails[i]; - thumb.update(rotation); - } - }, - - cleanup: function PDFThumbnailViewer_cleanup() { - var tempCanvas = PDFThumbnailView.tempImageCache; - if (tempCanvas) { - // Zeroing the width and height causes Firefox to release graphics - // resources immediately, which can greatly reduce memory consumption. - tempCanvas.width = 0; - tempCanvas.height = 0; - } - PDFThumbnailView.tempImageCache = null; - }, - - /** - * @private - */ - _resetView: function PDFThumbnailViewer_resetView() { - this.thumbnails = []; - this._pagesRotation = 0; - this._pagesRequests = []; - }, - - setDocument: function PDFThumbnailViewer_setDocument(pdfDocument) { - if (this.pdfDocument) { - // cleanup of the elements and views - var thumbsView = this.container; - while (thumbsView.hasChildNodes()) { - thumbsView.removeChild(thumbsView.lastChild); - } - this._resetView(); - } - - this.pdfDocument = pdfDocument; - if (!pdfDocument) { - return Promise.resolve(); - } - - return pdfDocument.getPage(1).then(function (firstPage) { - var pagesCount = pdfDocument.numPages; - var viewport = firstPage.getViewport(1.0); - for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { - var thumbnail = new PDFThumbnailView({ - container: this.container, - id: pageNum, - defaultViewport: viewport.clone(), - linkService: this.linkService, - renderingQueue: this.renderingQueue - }); - this.thumbnails.push(thumbnail); - } - }.bind(this)); - }, - - /** - * @param {PDFPageView} pageView - * @returns {PDFPage} - * @private - */ - _ensurePdfPageLoaded: - function PDFThumbnailViewer_ensurePdfPageLoaded(thumbView) { - if (thumbView.pdfPage) { - return Promise.resolve(thumbView.pdfPage); - } - var pageNumber = thumbView.id; - if (this._pagesRequests[pageNumber]) { - return this._pagesRequests[pageNumber]; - } - var promise = this.pdfDocument.getPage(pageNumber).then( - function (pdfPage) { - thumbView.setPdfPage(pdfPage); - this._pagesRequests[pageNumber] = null; - return pdfPage; - }.bind(this)); - this._pagesRequests[pageNumber] = promise; - return promise; - }, - - ensureThumbnailVisible: - function PDFThumbnailViewer_ensureThumbnailVisible(page) { - // Ensure that the thumbnail of the current page is visible - // when switching from another view. - scrollIntoView(document.getElementById('thumbnailContainer' + page)); - }, - - forceRendering: function () { - var visibleThumbs = this._getVisibleThumbs(); - var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, - this.thumbnails, - this.scroll.down); - if (thumbView) { - this._ensurePdfPageLoaded(thumbView).then(function () { - this.renderingQueue.renderView(thumbView); - }.bind(this)); - return true; - } - return false; - } - }; - - return PDFThumbnailViewer; -})(); - - -/** - * @typedef {Object} PDFOutlineViewOptions - * @property {HTMLDivElement} container - The viewer element. - * @property {Array} outline - An array of outline objects. - * @property {IPDFLinkService} linkService - The navigation/linking service. - */ - -/** - * @class - */ -var PDFOutlineView = (function PDFOutlineViewClosure() { - /** - * @constructs PDFOutlineView - * @param {PDFOutlineViewOptions} options - */ - function PDFOutlineView(options) { - this.container = options.container; - this.outline = options.outline; - this.linkService = options.linkService; - this.lastToggleIsShow = true; - } - - PDFOutlineView.prototype = { - reset: function PDFOutlineView_reset() { - var container = this.container; - while (container.firstChild) { - container.removeChild(container.firstChild); - } - this.lastToggleIsShow = true; - }, - - /** - * @private - */ - _dispatchEvent: function PDFOutlineView_dispatchEvent(outlineCount) { - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('outlineloaded', true, true, { - outlineCount: outlineCount - }); - this.container.dispatchEvent(event); - }, - - /** - * @private - */ - _bindLink: function PDFOutlineView_bindLink(element, item) { - if (item.url) { - PDFJS.addLinkAttributes(element, { url: item.url }); - return; - } - var linkService = this.linkService; - element.href = linkService.getDestinationHash(item.dest); - element.onclick = function goToDestination(e) { - linkService.navigateTo(item.dest); - return false; - }; - }, - - /** - * Prepend a button before an outline item which allows the user to toggle - * the visibility of all outline items at that level. - * - * @private - */ - _addToggleButton: function PDFOutlineView_addToggleButton(div) { - var toggler = document.createElement('div'); - toggler.className = 'outlineItemToggler'; - toggler.onclick = function(event) { - event.stopPropagation(); - toggler.classList.toggle('outlineItemsHidden'); - - if (event.shiftKey) { - var shouldShowAll = !toggler.classList.contains('outlineItemsHidden'); - this._toggleOutlineItem(div, shouldShowAll); - } - }.bind(this); - div.insertBefore(toggler, div.firstChild); - }, - - /** - * Toggle the visibility of the subtree of an outline item. - * - * @param {Element} root - the root of the outline (sub)tree. - * @param {boolean} state - whether to show the outline (sub)tree. If false, - * the outline subtree rooted at |root| will be collapsed. - * - * @private - */ - _toggleOutlineItem: function PDFOutlineView_toggleOutlineItem(root, show) { - this.lastToggleIsShow = show; - var togglers = root.querySelectorAll('.outlineItemToggler'); - for (var i = 0, ii = togglers.length; i < ii; ++i) { - togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden'); - } - }, - - /** - * Collapse or expand all subtrees of the outline. - */ - toggleOutlineTree: function PDFOutlineView_toggleOutlineTree() { - this._toggleOutlineItem(this.container, !this.lastToggleIsShow); - }, - - render: function PDFOutlineView_render() { - var outline = this.outline; - var outlineCount = 0; - - this.reset(); - - if (!outline) { - this._dispatchEvent(outlineCount); - return; - } - - var fragment = document.createDocumentFragment(); - var queue = [{ parent: fragment, items: this.outline }]; - var hasAnyNesting = false; - while (queue.length > 0) { - var levelData = queue.shift(); - for (var i = 0, len = levelData.items.length; i < len; i++) { - var item = levelData.items[i]; - var div = document.createElement('div'); - div.className = 'outlineItem'; - var element = document.createElement('a'); - this._bindLink(element, item); - element.textContent = PDFJS.removeNullCharacters(item.title); - div.appendChild(element); - - if (item.items.length > 0) { - hasAnyNesting = true; - this._addToggleButton(div); - - var itemsDiv = document.createElement('div'); - itemsDiv.className = 'outlineItems'; - div.appendChild(itemsDiv); - queue.push({ parent: itemsDiv, items: item.items }); - } - - levelData.parent.appendChild(div); - outlineCount++; - } - } - if (hasAnyNesting) { - this.container.classList.add('outlineWithDeepNesting'); - } - - this.container.appendChild(fragment); - - this._dispatchEvent(outlineCount); - } - }; - - return PDFOutlineView; -})(); - - -/** - * @typedef {Object} PDFAttachmentViewOptions - * @property {HTMLDivElement} container - The viewer element. - * @property {Array} attachments - An array of attachment objects. - * @property {DownloadManager} downloadManager - The download manager. - */ - -/** - * @class - */ -var PDFAttachmentView = (function PDFAttachmentViewClosure() { - /** - * @constructs PDFAttachmentView - * @param {PDFAttachmentViewOptions} options - */ - function PDFAttachmentView(options) { - this.container = options.container; - this.attachments = options.attachments; - this.downloadManager = options.downloadManager; - } - - PDFAttachmentView.prototype = { - reset: function PDFAttachmentView_reset() { - var container = this.container; - while (container.firstChild) { - container.removeChild(container.firstChild); - } - }, - - /** - * @private - */ - _dispatchEvent: function PDFAttachmentView_dispatchEvent(attachmentsCount) { - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('attachmentsloaded', true, true, { - attachmentsCount: attachmentsCount - }); - this.container.dispatchEvent(event); - }, - - /** - * @private - */ - _bindLink: function PDFAttachmentView_bindLink(button, content, filename) { - button.onclick = function downloadFile(e) { - this.downloadManager.downloadData(content, filename, ''); - return false; - }.bind(this); - }, - - render: function PDFAttachmentView_render() { - var attachments = this.attachments; - var attachmentsCount = 0; - - this.reset(); - - if (!attachments) { - this._dispatchEvent(attachmentsCount); - return; - } - - var names = Object.keys(attachments).sort(function(a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()); - }); - attachmentsCount = names.length; - - for (var i = 0; i < attachmentsCount; i++) { - var item = attachments[names[i]]; - var filename = getFileName(item.filename); - var div = document.createElement('div'); - div.className = 'attachmentsItem'; - var button = document.createElement('button'); - this._bindLink(button, item.content, filename); - button.textContent = PDFJS.removeNullCharacters(filename); - div.appendChild(button); - this.container.appendChild(div); - } - - this._dispatchEvent(attachmentsCount); - } - }; - - return PDFAttachmentView; -})(); - - -var PDFViewerApplication = { - initialBookmark: document.location.hash.substring(1), - initialDestination: null, - initialized: false, - fellback: false, - pdfDocument: null, - pdfLoadingTask: null, - sidebarOpen: false, - printing: false, - /** @type {PDFViewer} */ - pdfViewer: null, - /** @type {PDFThumbnailViewer} */ - pdfThumbnailViewer: null, - /** @type {PDFRenderingQueue} */ - pdfRenderingQueue: null, - /** @type {PDFPresentationMode} */ - pdfPresentationMode: null, - /** @type {PDFDocumentProperties} */ - pdfDocumentProperties: null, - /** @type {PDFLinkService} */ - pdfLinkService: null, - /** @type {PDFHistory} */ - pdfHistory: null, - pageRotation: 0, - isInitialViewSet: false, - animationStartedPromise: null, - preferenceSidebarViewOnLoad: SidebarView.NONE, - preferencePdfBugEnabled: false, - preferenceShowPreviousViewOnLoad: true, - preferenceDefaultZoomValue: '', - isViewerEmbedded: (window.parent !== window), - url: '', - - // called once when the document is loaded - initialize: function pdfViewInitialize() { - var pdfRenderingQueue = new PDFRenderingQueue(); - pdfRenderingQueue.onIdle = this.cleanup.bind(this); - this.pdfRenderingQueue = pdfRenderingQueue; - - var pdfLinkService = new PDFLinkService(); - this.pdfLinkService = pdfLinkService; - - var container = document.getElementById('viewerContainer'); - var viewer = document.getElementById('viewer'); - this.pdfViewer = new PDFViewer({ - container: container, - viewer: viewer, - renderingQueue: pdfRenderingQueue, - linkService: pdfLinkService - }); - pdfRenderingQueue.setViewer(this.pdfViewer); - pdfLinkService.setViewer(this.pdfViewer); - - var thumbnailContainer = document.getElementById('thumbnailView'); - this.pdfThumbnailViewer = new PDFThumbnailViewer({ - container: thumbnailContainer, - renderingQueue: pdfRenderingQueue, - linkService: pdfLinkService - }); - pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); - - Preferences.initialize(); - - this.pdfHistory = new PDFHistory({ - linkService: pdfLinkService - }); - pdfLinkService.setHistory(this.pdfHistory); - - this.findController = new PDFFindController({ - pdfViewer: this.pdfViewer, - integratedFind: this.supportsIntegratedFind - }); - this.pdfViewer.setFindController(this.findController); - - this.findBar = new PDFFindBar({ - bar: document.getElementById('findbar'), - toggleButton: document.getElementById('viewFind'), - findField: document.getElementById('findInput'), - highlightAllCheckbox: document.getElementById('findHighlightAll'), - caseSensitiveCheckbox: document.getElementById('findMatchCase'), - findMsg: document.getElementById('findMsg'), - findResultsCount: document.getElementById('findResultsCount'), - findStatusIcon: document.getElementById('findStatusIcon'), - findPreviousButton: document.getElementById('findPrevious'), - findNextButton: document.getElementById('findNext'), - findController: this.findController - }); - - this.findController.setFindBar(this.findBar); - - HandTool.initialize({ - container: container, - toggleHandTool: document.getElementById('toggleHandTool') - }); - - this.pdfDocumentProperties = new PDFDocumentProperties({ - overlayName: 'documentPropertiesOverlay', - closeButton: document.getElementById('documentPropertiesClose'), - fields: { - 'fileName': document.getElementById('fileNameField'), - 'fileSize': document.getElementById('fileSizeField'), - 'title': document.getElementById('titleField'), - 'author': document.getElementById('authorField'), - 'subject': document.getElementById('subjectField'), - 'keywords': document.getElementById('keywordsField'), - 'creationDate': document.getElementById('creationDateField'), - 'modificationDate': document.getElementById('modificationDateField'), - 'creator': document.getElementById('creatorField'), - 'producer': document.getElementById('producerField'), - 'version': document.getElementById('versionField'), - 'pageCount': document.getElementById('pageCountField') - } - }); - - SecondaryToolbar.initialize({ - toolbar: document.getElementById('secondaryToolbar'), - toggleButton: document.getElementById('secondaryToolbarToggle'), - presentationModeButton: - document.getElementById('secondaryPresentationMode'), - openFile: document.getElementById('secondaryOpenFile'), - print: document.getElementById('secondaryPrint'), - download: document.getElementById('secondaryDownload'), - viewBookmark: document.getElementById('secondaryViewBookmark'), - firstPage: document.getElementById('firstPage'), - lastPage: document.getElementById('lastPage'), - pageRotateCw: document.getElementById('pageRotateCw'), - pageRotateCcw: document.getElementById('pageRotateCcw'), - documentPropertiesButton: document.getElementById('documentProperties') - }); - - if (this.supportsFullscreen) { - var toolbar = SecondaryToolbar; - this.pdfPresentationMode = new PDFPresentationMode({ - container: container, - viewer: viewer, - pdfViewer: this.pdfViewer, - pdfThumbnailViewer: this.pdfThumbnailViewer, - contextMenuItems: [ - { element: document.getElementById('contextFirstPage'), - handler: toolbar.firstPageClick.bind(toolbar) }, - { element: document.getElementById('contextLastPage'), - handler: toolbar.lastPageClick.bind(toolbar) }, - { element: document.getElementById('contextPageRotateCw'), - handler: toolbar.pageRotateCwClick.bind(toolbar) }, - { element: document.getElementById('contextPageRotateCcw'), - handler: toolbar.pageRotateCcwClick.bind(toolbar) } - ] - }); - } - - PasswordPrompt.initialize({ - overlayName: 'passwordOverlay', - passwordField: document.getElementById('password'), - passwordText: document.getElementById('passwordText'), - passwordSubmit: document.getElementById('passwordSubmit'), - passwordCancel: document.getElementById('passwordCancel') - }); - - var self = this; - var initializedPromise = Promise.all([ - Preferences.get('enableWebGL').then(function resolved(value) { - PDFJS.disableWebGL = !value; - }), - Preferences.get('sidebarViewOnLoad').then(function resolved(value) { - self.preferenceSidebarViewOnLoad = value; - }), - Preferences.get('pdfBugEnabled').then(function resolved(value) { - self.preferencePdfBugEnabled = value; - }), - Preferences.get('showPreviousViewOnLoad').then(function resolved(value) { - self.preferenceShowPreviousViewOnLoad = value; - }), - Preferences.get('defaultZoomValue').then(function resolved(value) { - self.preferenceDefaultZoomValue = value; - }), - Preferences.get('disableTextLayer').then(function resolved(value) { - if (PDFJS.disableTextLayer === true) { - return; - } - PDFJS.disableTextLayer = value; - }), - Preferences.get('disableRange').then(function resolved(value) { - if (PDFJS.disableRange === true) { - return; - } - PDFJS.disableRange = value; - }), - Preferences.get('disableStream').then(function resolved(value) { - if (PDFJS.disableStream === true) { - return; - } - PDFJS.disableStream = value; - }), - Preferences.get('disableAutoFetch').then(function resolved(value) { - PDFJS.disableAutoFetch = value; - }), - Preferences.get('disableFontFace').then(function resolved(value) { - if (PDFJS.disableFontFace === true) { - return; - } - PDFJS.disableFontFace = value; - }), - Preferences.get('useOnlyCssZoom').then(function resolved(value) { - PDFJS.useOnlyCssZoom = value; - }), - Preferences.get('externalLinkTarget').then(function resolved(value) { - if (PDFJS.isExternalLinkTargetSet()) { - return; - } - PDFJS.externalLinkTarget = value; - }), - // TODO move more preferences and other async stuff here - ]).catch(function (reason) { }); - - return initializedPromise.then(function () { - if (self.isViewerEmbedded && !PDFJS.isExternalLinkTargetSet()) { - // Prevent external links from "replacing" the viewer, - // when it's embedded in e.g. an iframe or an object. - PDFJS.externalLinkTarget = PDFJS.LinkTarget.TOP; - } - - self.initialized = true; - }); - }, - - zoomIn: function pdfViewZoomIn(ticks) { - var newScale = this.pdfViewer.currentScale; - do { - newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2); - newScale = Math.ceil(newScale * 10) / 10; - newScale = Math.min(MAX_SCALE, newScale); - } while (--ticks > 0 && newScale < MAX_SCALE); - this.pdfViewer.currentScaleValue = newScale; - }, - - zoomOut: function pdfViewZoomOut(ticks) { - var newScale = this.pdfViewer.currentScale; - do { - newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2); - newScale = Math.floor(newScale * 10) / 10; - newScale = Math.max(MIN_SCALE, newScale); - } while (--ticks > 0 && newScale > MIN_SCALE); - this.pdfViewer.currentScaleValue = newScale; - }, - - get pagesCount() { - return this.pdfDocument.numPages; - }, - - set page(val) { - this.pdfLinkService.page = val; - }, - - get page() { // TODO remove - return this.pdfLinkService.page; - }, - - get supportsPrinting() { - var canvas = document.createElement('canvas'); - var value = 'mozPrintCallback' in canvas; - - return PDFJS.shadow(this, 'supportsPrinting', value); - }, - - get supportsFullscreen() { - var doc = document.documentElement; - var support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || - doc.webkitRequestFullScreen || doc.msRequestFullscreen); - - if (document.fullscreenEnabled === false || - document.mozFullScreenEnabled === false || - document.webkitFullscreenEnabled === false || - document.msFullscreenEnabled === false) { - support = false; - } - if (support && PDFJS.disableFullscreen === true) { - support = false; - } - - return PDFJS.shadow(this, 'supportsFullscreen', support); - }, - - get supportsIntegratedFind() { - var support = false; - - return PDFJS.shadow(this, 'supportsIntegratedFind', support); - }, - - get supportsDocumentFonts() { - var support = true; - - return PDFJS.shadow(this, 'supportsDocumentFonts', support); - }, - - get supportsDocumentColors() { - var support = true; - - return PDFJS.shadow(this, 'supportsDocumentColors', support); - }, - - get loadingBar() { - var bar = new ProgressBar('#loadingBar', {}); - - return PDFJS.shadow(this, 'loadingBar', bar); - }, - - get supportedMouseWheelZoomModifierKeys() { - var support = { - ctrlKey: true, - metaKey: true, - }; - - return PDFJS.shadow(this, 'supportedMouseWheelZoomModifierKeys', support); - }, - - - setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) { - this.url = url; - try { - this.setTitle(decodeURIComponent(getFileName(url)) || url); - } catch (e) { - // decodeURIComponent may throw URIError, - // fall back to using the unprocessed url in that case - this.setTitle(url); - } - }, - - setTitle: function pdfViewSetTitle(title) { - if (this.isViewerEmbedded) { - // Embedded PDF viewers should not be changing their parent page's title. - return; - } - document.title = title; - }, - - /** - * Closes opened PDF document. - * @returns {Promise} - Returns the promise, which is resolved when all - * destruction is completed. - */ - close: function pdfViewClose() { - var errorWrapper = document.getElementById('errorWrapper'); - errorWrapper.setAttribute('hidden', 'true'); - - if (!this.pdfLoadingTask) { - return Promise.resolve(); - } - - var promise = this.pdfLoadingTask.destroy(); - this.pdfLoadingTask = null; - - if (this.pdfDocument) { - this.pdfDocument = null; - - this.pdfThumbnailViewer.setDocument(null); - this.pdfViewer.setDocument(null); - this.pdfLinkService.setDocument(null, null); - } - - if (typeof PDFBug !== 'undefined') { - PDFBug.cleanup(); - } - return promise; - }, - - /** - * Opens PDF document specified by URL or array with additional arguments. - * @param {string|TypedArray|ArrayBuffer} file - PDF location or binary data. - * @param {Object} args - (optional) Additional arguments for the getDocument - * call, e.g. HTTP headers ('httpHeaders') or - * alternative data transport ('range'). - * @returns {Promise} - Returns the promise, which is resolved when document - * is opened. - */ - open: function pdfViewOpen(file, args) { - var scale = 0; - if (arguments.length > 2 || typeof args === 'number') { - console.warn('Call of open() with obsolete signature.'); - if (typeof args === 'number') { - scale = args; // scale argument was found - } - args = arguments[4] || null; - if (arguments[3] && typeof arguments[3] === 'object') { - // The pdfDataRangeTransport argument is present. - args = Object.create(args); - args.range = arguments[3]; - } - if (typeof arguments[2] === 'string') { - // The password argument is present. - args = Object.create(args); - args.password = arguments[2]; - } - } - - if (this.pdfLoadingTask) { - // We need to destroy already opened document. - return this.close().then(function () { - // Reload the preferences if a document was previously opened. - Preferences.reload(); - // ... and repeat the open() call. - return this.open(file, args); - }.bind(this)); - } - - var parameters = Object.create(null); - if (typeof file === 'string') { // URL - this.setTitleUsingUrl(file); - parameters.url = file; - } else if (file && 'byteLength' in file) { // ArrayBuffer - parameters.data = file; - } else if (file.url && file.originalUrl) { - this.setTitleUsingUrl(file.originalUrl); - parameters.url = file.url; - } - if (args) { - for (var prop in args) { - parameters[prop] = args[prop]; - } - } - - var self = this; - self.downloadComplete = false; - - var loadingTask = PDFJS.getDocument(parameters); - this.pdfLoadingTask = loadingTask; - - loadingTask.onPassword = function passwordNeeded(updatePassword, reason) { - PasswordPrompt.updatePassword = updatePassword; - PasswordPrompt.reason = reason; - PasswordPrompt.open(); - }; - - loadingTask.onProgress = function getDocumentProgress(progressData) { - self.progress(progressData.loaded / progressData.total); - }; - - // Listen for unsupported features to trigger the fallback UI. - loadingTask.onUnsupportedFeature = this.fallback.bind(this); - - var result = loadingTask.promise.then( - function getDocumentCallback(pdfDocument) { - self.load(pdfDocument, scale); - }, - function getDocumentError(exception) { - var message = exception && exception.message; - var loadingErrorMessage = 'An error occurred while loading the PDF.'; - - if (exception instanceof PDFJS.InvalidPDFException) { - // change error message also for other builds - loadingErrorMessage = 'Invalid or corrupted PDF file.'; - } else if (exception instanceof PDFJS.MissingPDFException) { - // special message for missing PDF's - loadingErrorMessage = 'Missing PDF file.'; - } else if (exception instanceof PDFJS.UnexpectedResponseException) { - loadingErrorMessage = 'Unexpected server response.'; - } - - var moreInfo = { - message: message - }; - self.error(loadingErrorMessage, moreInfo); - - throw new Error(loadingErrorMessage); - } - ); - - if (args && args.length) { - PDFViewerApplication.pdfDocumentProperties.setFileSize(args.length); - } - return result; - }, - - download: function pdfViewDownload() { - function downloadByUrl() { - downloadManager.downloadUrl(url, filename); - } - - var url = this.url.split('#')[0]; - var filename = getPDFFileNameFromURL(url); - var downloadManager = new DownloadManager(); - downloadManager.onerror = function (err) { - // This error won't really be helpful because it's likely the - // fallback won't work either (or is already open). - PDFViewerApplication.error('PDF failed to download.'); - }; - - if (!this.pdfDocument) { // the PDF is not ready yet - downloadByUrl(); - return; - } - - if (!this.downloadComplete) { // the PDF is still downloading - downloadByUrl(); - return; - } - - this.pdfDocument.getData().then( - function getDataSuccess(data) { - var blob = PDFJS.createBlob(data, 'application/pdf'); - downloadManager.download(blob, url, filename); - }, - downloadByUrl // Error occurred try downloading with just the url. - ).then(null, downloadByUrl); - }, - - fallback: function pdfViewFallback(featureId) { - }, - - /** - * Show the error box. - * @param {String} message A message that is human readable. - * @param {Object} moreInfo (optional) Further information about the error - * that is more technical. Should have a 'message' - * and optionally a 'stack' property. - */ - error: function pdfViewError(message, moreInfo) { - var moreInfoText = 'PDF.js v' + (PDFJS.version || '?') + '(build: ' + (PDFJS.build || '?') + ')\n'; - if (moreInfo) { - moreInfoText += 'Message: ' + moreInfo.message - if (moreInfo.stack) { - moreInfoText += '\nStack: ' + moreInfo.stack; - } else { - if (moreInfo.filename) { - moreInfoText += '\nFile: ' + moreInfo.filename; - } - if (moreInfo.lineNumber) { - moreInfoText += '\nLine: ' + moreInfo.lineNumber; - } - } - } - - var errorWrapper = document.getElementById('errorWrapper'); - errorWrapper.removeAttribute('hidden'); - - var errorMessage = document.getElementById('errorMessage'); - errorMessage.textContent = message; - - var closeButton = document.getElementById('errorClose'); - closeButton.onclick = function() { - errorWrapper.setAttribute('hidden', 'true'); - }; - - var errorMoreInfo = document.getElementById('errorMoreInfo'); - var moreInfoButton = document.getElementById('errorShowMore'); - var lessInfoButton = document.getElementById('errorShowLess'); - moreInfoButton.onclick = function() { - errorMoreInfo.removeAttribute('hidden'); - moreInfoButton.setAttribute('hidden', 'true'); - lessInfoButton.removeAttribute('hidden'); - errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px'; - }; - lessInfoButton.onclick = function() { - errorMoreInfo.setAttribute('hidden', 'true'); - moreInfoButton.removeAttribute('hidden'); - lessInfoButton.setAttribute('hidden', 'true'); - }; - moreInfoButton.oncontextmenu = noContextMenuHandler; - lessInfoButton.oncontextmenu = noContextMenuHandler; - closeButton.oncontextmenu = noContextMenuHandler; - moreInfoButton.removeAttribute('hidden'); - lessInfoButton.setAttribute('hidden', 'true'); - errorMoreInfo.value = moreInfoText; - }, - - progress: function pdfViewProgress(level) { - var percent = Math.round(level * 100); - // When we transition from full request to range requests, it's possible - // that we discard some of the loaded data. This can cause the loading - // bar to move backwards. So prevent this by only updating the bar if it - // increases. - if (percent > this.loadingBar.percent || isNaN(percent)) { - this.loadingBar.percent = percent; - - // When disableAutoFetch is enabled, it's not uncommon for the entire file - // to never be fetched (depends on e.g. the file structure). In this case - // the loading bar will not be completely filled, nor will it be hidden. - // To prevent displaying a partially filled loading bar permanently, we - // hide it when no data has been loaded during a certain amount of time. - if (PDFJS.disableAutoFetch && percent) { - if (this.disableAutoFetchLoadingBarTimeout) { - clearTimeout(this.disableAutoFetchLoadingBarTimeout); - this.disableAutoFetchLoadingBarTimeout = null; - } - this.loadingBar.show(); - - this.disableAutoFetchLoadingBarTimeout = setTimeout(function () { - this.loadingBar.hide(); - this.disableAutoFetchLoadingBarTimeout = null; - }.bind(this), DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT); - } - } - }, - - load: function pdfViewLoad(pdfDocument, scale) { - var self = this; - scale = scale || UNKNOWN_SCALE; - - this.findController.reset(); - - this.pdfDocument = pdfDocument; - - this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url); - - var downloadedPromise = pdfDocument.getDownloadInfo().then(function() { - self.downloadComplete = true; - self.loadingBar.hide(); - }); - - var pagesCount = pdfDocument.numPages; - document.getElementById('numPages').textContent = 'of ' + pagesCount; - document.getElementById('pageNumber').max = pagesCount; - - var id = this.documentFingerprint = pdfDocument.fingerprint; - var store = this.store = new ViewHistory(id); - - var baseDocumentUrl = null; - this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl); - - var pdfViewer = this.pdfViewer; - pdfViewer.currentScale = scale; - pdfViewer.setDocument(pdfDocument); - var firstPagePromise = pdfViewer.firstPagePromise; - var pagesPromise = pdfViewer.pagesPromise; - var onePageRendered = pdfViewer.onePageRendered; - - this.pageRotation = 0; - this.isInitialViewSet = false; - - this.pdfThumbnailViewer.setDocument(pdfDocument); - - firstPagePromise.then(function(pdfPage) { - downloadedPromise.then(function () { - var event = document.createEvent('CustomEvent'); - event.initCustomEvent('documentload', true, true, {}); - window.dispatchEvent(event); - }); - - self.loadingBar.setWidth(document.getElementById('viewer')); - - if (!PDFJS.disableHistory && !self.isViewerEmbedded) { - // The browsing history is only enabled when the viewer is standalone, - // i.e. not when it is embedded in a web page. - if (!self.preferenceShowPreviousViewOnLoad) { - self.pdfHistory.clearHistoryState(); - } - self.pdfHistory.initialize(self.documentFingerprint); - - if (self.pdfHistory.initialDestination) { - self.initialDestination = self.pdfHistory.initialDestination; - } else if (self.pdfHistory.initialBookmark) { - self.initialBookmark = self.pdfHistory.initialBookmark; - } - } - - var initialParams = { - destination: self.initialDestination, - bookmark: self.initialBookmark, - hash: null, - }; - - store.initializedPromise.then(function resolved() { - var storedHash = null; - if (self.preferenceShowPreviousViewOnLoad && - store.get('exists', false)) { - var pageNum = store.get('page', '1'); - var zoom = self.preferenceDefaultZoomValue || - store.get('zoom', DEFAULT_SCALE_VALUE); - var left = store.get('scrollLeft', '0'); - var top = store.get('scrollTop', '0'); - - storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' + - left + ',' + top; - } else if (self.preferenceDefaultZoomValue) { - storedHash = 'page=1&zoom=' + self.preferenceDefaultZoomValue; - } - self.setInitialView(storedHash, scale); - - initialParams.hash = storedHash; - - // Make all navigation keys work on document load, - // unless the viewer is embedded in a web page. - if (!self.isViewerEmbedded) { - self.pdfViewer.focus(); - } - }, function rejected(reason) { - console.error(reason); - self.setInitialView(null, scale); - }); - - // For documents with different page sizes, - // ensure that the correct location becomes visible on load. - pagesPromise.then(function resolved() { - if (!initialParams.destination && !initialParams.bookmark && - !initialParams.hash) { - return; - } - if (self.hasEqualPageSizes) { - return; - } - self.initialDestination = initialParams.destination; - self.initialBookmark = initialParams.bookmark; - - self.pdfViewer.currentScaleValue = self.pdfViewer.currentScaleValue; - self.setInitialView(initialParams.hash, scale); - }); - }); - - pagesPromise.then(function() { - if (self.supportsPrinting) { - pdfDocument.getJavaScript().then(function(javaScript) { - if (javaScript.length) { - console.warn('Warning: JavaScript is not supported'); - self.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript); - } - // Hack to support auto printing. - var regex = /\bprint\s*\(/; - for (var i = 0, ii = javaScript.length; i < ii; i++) { - var js = javaScript[i]; - if (js && regex.test(js)) { - setTimeout(function() { - window.print(); - }); - return; - } - } - }); - } - }); - - // outline depends on pagesRefMap - var promises = [pagesPromise, this.animationStartedPromise]; - Promise.all(promises).then(function() { - pdfDocument.getOutline().then(function(outline) { - var container = document.getElementById('outlineView'); - self.outline = new PDFOutlineView({ - container: container, - outline: outline, - linkService: self.pdfLinkService - }); - self.outline.render(); - document.getElementById('viewOutline').disabled = !outline; - - if (!outline && !container.classList.contains('hidden')) { - self.switchSidebarView('thumbs'); - } - if (outline && - self.preferenceSidebarViewOnLoad === SidebarView.OUTLINE) { - self.switchSidebarView('outline', true); - } - }); - pdfDocument.getAttachments().then(function(attachments) { - var container = document.getElementById('attachmentsView'); - self.attachments = new PDFAttachmentView({ - container: container, - attachments: attachments, - downloadManager: new DownloadManager() - }); - self.attachments.render(); - document.getElementById('viewAttachments').disabled = !attachments; - - if (!attachments && !container.classList.contains('hidden')) { - self.switchSidebarView('thumbs'); - } - if (attachments && - self.preferenceSidebarViewOnLoad === SidebarView.ATTACHMENTS) { - self.switchSidebarView('attachments', true); - } - }); - }); - - if (self.preferenceSidebarViewOnLoad === SidebarView.THUMBS) { - Promise.all([firstPagePromise, onePageRendered]).then(function () { - self.switchSidebarView('thumbs', true); - }); - } - - pdfDocument.getMetadata().then(function(data) { - var info = data.info, metadata = data.metadata; - self.documentInfo = info; - self.metadata = metadata; - - // Provides some basic debug information - console.log('PDF ' + pdfDocument.fingerprint + ' [' + - info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + - ' / ' + (info.Creator || '-').trim() + ']' + - ' (PDF.js: ' + (PDFJS.version || '-') + - (!PDFJS.disableWebGL ? ' [WebGL]' : '') + ')'); - - var pdfTitle; - if (metadata && metadata.has('dc:title')) { - var title = metadata.get('dc:title'); - // Ghostscript sometimes return 'Untitled', sets the title to 'Untitled' - if (title !== 'Untitled') { - pdfTitle = title; - } - } - - if (!pdfTitle && info && info['Title']) { - pdfTitle = info['Title']; - } - - if (pdfTitle) { - self.setTitle(pdfTitle + ' - ' + document.title); - } - - if (info.IsAcroFormPresent) { - console.warn('Warning: AcroForm/XFA is not supported'); - self.fallback(PDFJS.UNSUPPORTED_FEATURES.forms); - } - - }); - }, - - setInitialView: function pdfViewSetInitialView(storedHash, scale) { - this.isInitialViewSet = true; - - // When opening a new file, when one is already loaded in the viewer, - // ensure that the 'pageNumber' element displays the correct value. - document.getElementById('pageNumber').value = - this.pdfViewer.currentPageNumber; - - if (this.initialDestination) { - this.pdfLinkService.navigateTo(this.initialDestination); - this.initialDestination = null; - } else if (this.initialBookmark) { - this.pdfLinkService.setHash(this.initialBookmark); - this.pdfHistory.push({ hash: this.initialBookmark }, true); - this.initialBookmark = null; - } else if (storedHash) { - this.pdfLinkService.setHash(storedHash); - } else if (scale) { - this.pdfViewer.currentScaleValue = scale; - this.page = 1; - } - - if (!this.pdfViewer.currentScaleValue) { - // Scale was not initialized: invalid bookmark or scale was not specified. - // Setting the default one. - this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; - } - }, - - cleanup: function pdfViewCleanup() { - if (!this.pdfDocument) { - return; // run cleanup when document is loaded - } - this.pdfViewer.cleanup(); - this.pdfThumbnailViewer.cleanup(); - this.pdfDocument.cleanup(); - }, - - forceRendering: function pdfViewForceRendering() { - this.pdfRenderingQueue.printing = this.printing; - this.pdfRenderingQueue.isThumbnailViewEnabled = this.sidebarOpen; - this.pdfRenderingQueue.renderHighestPriority(); - }, - - refreshThumbnailViewer: function pdfViewRefreshThumbnailViewer() { - var pdfViewer = this.pdfViewer; - var thumbnailViewer = this.pdfThumbnailViewer; - - // set thumbnail images of rendered pages - var pagesCount = pdfViewer.pagesCount; - for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) { - var pageView = pdfViewer.getPageView(pageIndex); - if (pageView && pageView.renderingState === RenderingStates.FINISHED) { - var thumbnailView = thumbnailViewer.getThumbnail(pageIndex); - thumbnailView.setImage(pageView); - } - } - - thumbnailViewer.scrollThumbnailIntoView(this.page); - }, - - switchSidebarView: function pdfViewSwitchSidebarView(view, openSidebar) { - if (openSidebar && !this.sidebarOpen) { - document.getElementById('sidebarToggle').click(); - } - var thumbsView = document.getElementById('thumbnailView'); - var outlineView = document.getElementById('outlineView'); - var attachmentsView = document.getElementById('attachmentsView'); - - var thumbsButton = document.getElementById('viewThumbnail'); - var outlineButton = document.getElementById('viewOutline'); - var attachmentsButton = document.getElementById('viewAttachments'); - - switch (view) { - case 'thumbs': - var wasAnotherViewVisible = thumbsView.classList.contains('hidden'); - - thumbsButton.classList.add('toggled'); - outlineButton.classList.remove('toggled'); - attachmentsButton.classList.remove('toggled'); - thumbsView.classList.remove('hidden'); - outlineView.classList.add('hidden'); - attachmentsView.classList.add('hidden'); - - this.forceRendering(); - - if (wasAnotherViewVisible) { - this.pdfThumbnailViewer.ensureThumbnailVisible(this.page); - } - break; - - case 'outline': - if (outlineButton.disabled) { - return; - } - thumbsButton.classList.remove('toggled'); - outlineButton.classList.add('toggled'); - attachmentsButton.classList.remove('toggled'); - thumbsView.classList.add('hidden'); - outlineView.classList.remove('hidden'); - attachmentsView.classList.add('hidden'); - break; - - case 'attachments': - if (attachmentsButton.disabled) { - return; - } - thumbsButton.classList.remove('toggled'); - outlineButton.classList.remove('toggled'); - attachmentsButton.classList.add('toggled'); - thumbsView.classList.add('hidden'); - outlineView.classList.add('hidden'); - attachmentsView.classList.remove('hidden'); - break; - } - }, - - beforePrint: function pdfViewSetupBeforePrint() { - if (!this.supportsPrinting) { - var printMessage = 'Warning: Printing is not fully supported by this browser.'; - this.error(printMessage); - return; - } - - var alertNotReady = false; - var i, ii; - if (!this.pdfDocument || !this.pagesCount) { - alertNotReady = true; - } else { - for (i = 0, ii = this.pagesCount; i < ii; ++i) { - if (!this.pdfViewer.getPageView(i).pdfPage) { - alertNotReady = true; - break; - } - } - } - if (alertNotReady) { - var notReadyMessage = 'Warning: The PDF is not fully loaded for printing.'; - window.alert(notReadyMessage); - return; - } - - this.printing = true; - this.forceRendering(); - - var body = document.querySelector('body'); - body.setAttribute('data-mozPrintCallback', true); - - if (!this.hasEqualPageSizes) { - console.warn('Not all pages have the same size. The printed result ' + - 'may be incorrect!'); - } - - // Insert a @page + size rule to make sure that the page size is correctly - // set. Note that we assume that all pages have the same size, because - // variable-size pages are not supported yet (at least in Chrome & Firefox). - // TODO(robwu): Use named pages when size calculation bugs get resolved - // (e.g. https://crbug.com/355116) AND when support for named pages is - // added (http://www.w3.org/TR/css3-page/#using-named-pages). - // In browsers where @page + size is not supported (such as Firefox, - // https://bugzil.la/851441), the next stylesheet will be ignored and the - // user has to select the correct paper size in the UI if wanted. - this.pageStyleSheet = document.createElement('style'); - var pageSize = this.pdfViewer.getPageView(0).pdfPage.getViewport(1); - this.pageStyleSheet.textContent = - // "size: " is what we need. But also add "A4" because - // Firefox incorrectly reports support for the other value. - '@supports ((size:A4) and (size:1pt 1pt)) {' + - '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' + - // The canvas and each ancestor node must have a height of 100% to make - // sure that each canvas is printed on exactly one page. - '#printContainer {height:100%}' + - '#printContainer > div {width:100% !important;height:100% !important;}' + - '}'; - body.appendChild(this.pageStyleSheet); - - for (i = 0, ii = this.pagesCount; i < ii; ++i) { - this.pdfViewer.getPageView(i).beforePrint(); - } - - }, - - // Whether all pages of the PDF have the same width and height. - get hasEqualPageSizes() { - var firstPage = this.pdfViewer.getPageView(0); - for (var i = 1, ii = this.pagesCount; i < ii; ++i) { - var pageView = this.pdfViewer.getPageView(i); - if (pageView.width !== firstPage.width || - pageView.height !== firstPage.height) { - return false; - } - } - return true; - }, - - afterPrint: function pdfViewSetupAfterPrint() { - var div = document.getElementById('printContainer'); - while (div.hasChildNodes()) { - div.removeChild(div.lastChild); - } - - if (this.pageStyleSheet && this.pageStyleSheet.parentNode) { - this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet); - this.pageStyleSheet = null; - } - - this.printing = false; - this.forceRendering(); - }, - - rotatePages: function pdfViewRotatePages(delta) { - var pageNumber = this.page; - this.pageRotation = (this.pageRotation + 360 + delta) % 360; - this.pdfViewer.pagesRotation = this.pageRotation; - this.pdfThumbnailViewer.pagesRotation = this.pageRotation; - - this.forceRendering(); - - this.pdfViewer.scrollPageIntoView(pageNumber); - }, - - requestPresentationMode: function pdfViewRequestPresentationMode() { - if (!this.pdfPresentationMode) { - return; - } - this.pdfPresentationMode.request(); - }, - - /** - * @param {number} delta - The delta value from the mouse event. - */ - scrollPresentationMode: function pdfViewScrollPresentationMode(delta) { - if (!this.pdfPresentationMode) { - return; - } - this.pdfPresentationMode.mouseScroll(delta); - } -}; -window.PDFView = PDFViewerApplication; // obsolete name, using it as an alias - - -var HOSTED_VIEWER_ORIGINS = ['null', - 'http://mozilla.github.io', 'https://mozilla.github.io']; -function validateFileURL(file) { - try { - var viewerOrigin = new URL(window.location.href).origin || 'null'; - if (HOSTED_VIEWER_ORIGINS.indexOf(viewerOrigin) >= 0) { - // Hosted or local viewer, allow for any file locations - return; - } - var fileOrigin = new URL(file, window.location.href).origin; - // Removing of the following line will not guarantee that the viewer will - // start accepting URLs from foreign origin -- CORS headers on the remote - // server must be properly configured. - if (fileOrigin !== viewerOrigin) { - throw new Error('file origin does not match viewer\'s'); - } - } catch (e) { - var message = e && e.message; - var loadingErrorMessage = 'An error occurred while loading the PDF.'; - - var moreInfo = { - message: message - }; - PDFViewerApplication.error(loadingErrorMessage, moreInfo); - throw e; - } -} - -function webViewerLoad(evt) { - configure(PDFJS); - PDFViewerApplication.initialize().then(webViewerInitialized); -} - -function webViewerInitialized() { - var queryString = document.location.search.substring(1); - var params = parseQueryString(queryString); - var file = 'file' in params ? params.file : DEFAULT_URL; - validateFileURL(file); - - var fileInput = document.createElement('input'); - fileInput.id = 'fileInput'; - fileInput.className = 'fileInput'; - fileInput.setAttribute('type', 'file'); - fileInput.oncontextmenu = noContextMenuHandler; - document.body.appendChild(fileInput); - - if (!window.File || !window.FileReader || !window.FileList || !window.Blob) { - document.getElementById('openFile').setAttribute('hidden', 'true'); - document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true'); - } else { - document.getElementById('fileInput').value = null; - } - - var locale = PDFJS.locale || navigator.language; - - if (PDFViewerApplication.preferencePdfBugEnabled) { - // Special debugging flags in the hash section of the URL. - var hash = document.location.hash.substring(1); - var hashParams = parseQueryString(hash); - - if ('disableworker' in hashParams) { - PDFJS.disableWorker = (hashParams['disableworker'] === 'true'); - } - if ('disablerange' in hashParams) { - PDFJS.disableRange = (hashParams['disablerange'] === 'true'); - } - if ('disablestream' in hashParams) { - PDFJS.disableStream = (hashParams['disablestream'] === 'true'); - } - if ('disableautofetch' in hashParams) { - PDFJS.disableAutoFetch = (hashParams['disableautofetch'] === 'true'); - } - if ('disablefontface' in hashParams) { - PDFJS.disableFontFace = (hashParams['disablefontface'] === 'true'); - } - if ('disablehistory' in hashParams) { - PDFJS.disableHistory = (hashParams['disablehistory'] === 'true'); - } - if ('webgl' in hashParams) { - PDFJS.disableWebGL = (hashParams['webgl'] !== 'true'); - } - if ('useonlycsszoom' in hashParams) { - PDFJS.useOnlyCssZoom = (hashParams['useonlycsszoom'] === 'true'); - } - if ('verbosity' in hashParams) { - PDFJS.verbosity = hashParams['verbosity'] | 0; - } - if ('ignorecurrentpositiononzoom' in hashParams) { - IGNORE_CURRENT_POSITION_ON_ZOOM = - (hashParams['ignorecurrentpositiononzoom'] === 'true'); - } - if ('locale' in hashParams) { - locale = hashParams['locale']; - } - if ('textlayer' in hashParams) { - switch (hashParams['textlayer']) { - case 'off': - PDFJS.disableTextLayer = true; - break; - case 'visible': - case 'shadow': - case 'hover': - var viewer = document.getElementById('viewer'); - viewer.classList.add('textLayer-' + hashParams['textlayer']); - break; - } - } - if ('pdfbug' in hashParams) { - PDFJS.pdfBug = true; - var pdfBug = hashParams['pdfbug']; - var enabled = pdfBug.split(','); - PDFBug.enable(enabled); - PDFBug.init(); - } - } - - if (!PDFViewerApplication.supportsPrinting) { - document.getElementById('print').classList.add('hidden'); - document.getElementById('secondaryPrint').classList.add('hidden'); - } - - if (!PDFViewerApplication.supportsFullscreen) { - document.getElementById('presentationMode').classList.add('hidden'); - document.getElementById('secondaryPresentationMode'). - classList.add('hidden'); - } - - if (PDFViewerApplication.supportsIntegratedFind) { - document.getElementById('viewFind').classList.add('hidden'); - } - - // Suppress context menus for some controls - document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler; - - var mainContainer = document.getElementById('mainContainer'); - var outerContainer = document.getElementById('outerContainer'); - mainContainer.addEventListener('transitionend', function(e) { - if (e.target === mainContainer) { - var event = document.createEvent('UIEvents'); - event.initUIEvent('resize', false, false, window, 0); - window.dispatchEvent(event); - outerContainer.classList.remove('sidebarMoving'); - } - }, true); - - document.getElementById('sidebarToggle').addEventListener('click', - function() { - this.classList.toggle('toggled'); - outerContainer.classList.add('sidebarMoving'); - outerContainer.classList.toggle('sidebarOpen'); - PDFViewerApplication.sidebarOpen = - outerContainer.classList.contains('sidebarOpen'); - if (PDFViewerApplication.sidebarOpen) { - PDFViewerApplication.refreshThumbnailViewer(); - } - PDFViewerApplication.forceRendering(); - }); - - document.getElementById('viewThumbnail').addEventListener('click', - function() { - PDFViewerApplication.switchSidebarView('thumbs'); - }); - - document.getElementById('viewOutline').addEventListener('click', - function() { - PDFViewerApplication.switchSidebarView('outline'); - }); - - document.getElementById('viewOutline').addEventListener('dblclick', - function() { - PDFViewerApplication.outline.toggleOutlineTree(); - }); - - document.getElementById('viewAttachments').addEventListener('click', - function() { - PDFViewerApplication.switchSidebarView('attachments'); - }); - - document.getElementById('previous').addEventListener('click', - function() { - PDFViewerApplication.page--; - }); - - document.getElementById('next').addEventListener('click', - function() { - PDFViewerApplication.page++; - }); - - document.getElementById('zoomIn').addEventListener('click', - function() { - PDFViewerApplication.zoomIn(); - }); - - document.getElementById('zoomOut').addEventListener('click', - function() { - PDFViewerApplication.zoomOut(); - }); - - document.getElementById('pageNumber').addEventListener('click', function() { - this.select(); - }); - - document.getElementById('pageNumber').addEventListener('change', function() { - // Handle the user inputting a floating point number. - PDFViewerApplication.page = (this.value | 0); - - if (this.value !== (this.value | 0).toString()) { - this.value = PDFViewerApplication.page; - } - }); - - document.getElementById('scaleSelect').addEventListener('change', function() { - if (this.value === 'custom') { - return; - } - PDFViewerApplication.pdfViewer.currentScaleValue = this.value; - }); - - document.getElementById('presentationMode').addEventListener('click', - SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar)); - - document.getElementById('openFile').addEventListener('click', - SecondaryToolbar.openFileClick.bind(SecondaryToolbar)); - - document.getElementById('print').addEventListener('click', - SecondaryToolbar.printClick.bind(SecondaryToolbar)); - - document.getElementById('download').addEventListener('click', - SecondaryToolbar.downloadClick.bind(SecondaryToolbar)); - - - if (file && file.lastIndexOf('file:', 0) === 0) { - // file:-scheme. Load the contents in the main thread because QtWebKit - // cannot load file:-URLs in a Web Worker. file:-URLs are usually loaded - // very quickly, so there is no need to set up progress event listeners. - PDFViewerApplication.setTitleUsingUrl(file); - var xhr = new XMLHttpRequest(); - xhr.onload = function() { - PDFViewerApplication.open(new Uint8Array(xhr.response)); - }; - try { - xhr.open('GET', file); - xhr.responseType = 'arraybuffer'; - xhr.send(); - } catch (e) { - PDFViewerApplication.error('An error occurred while loading the PDF.', e); - } - return; - } - - if (file) { - PDFViewerApplication.open(file); - } -} - -document.addEventListener('DOMContentLoaded', webViewerLoad, true); - -document.addEventListener('pagerendered', function (e) { - var pageNumber = e.detail.pageNumber; - var pageIndex = pageNumber - 1; - var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex); - - if (PDFViewerApplication.sidebarOpen) { - var thumbnailView = PDFViewerApplication.pdfThumbnailViewer. - getThumbnail(pageIndex); - thumbnailView.setImage(pageView); - } - - if (PDFJS.pdfBug && Stats.enabled && pageView.stats) { - Stats.add(pageNumber, pageView.stats); - } - - if (pageView.error) { - PDFViewerApplication.error('An error occurred while rendering the page.', pageView.error); - } - - // If the page is still visible when it has finished rendering, - // ensure that the page number input loading indicator is hidden. - if (pageNumber === PDFViewerApplication.page) { - var pageNumberInput = document.getElementById('pageNumber'); - pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR); - } - -}, true); - -document.addEventListener('textlayerrendered', function (e) { - var pageIndex = e.detail.pageNumber - 1; - var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex); - -}, true); - -document.addEventListener('pagemode', function (evt) { - if (!PDFViewerApplication.initialized) { - return; - } - // Handle the 'pagemode' hash parameter, see also `PDFLinkService_setHash`. - var mode = evt.detail.mode; - switch (mode) { - case 'bookmarks': - // Note: Our code calls this property 'outline', even though the - // Open Parameter specification calls it 'bookmarks'. - mode = 'outline'; - /* falls through */ - case 'thumbs': - case 'attachments': - PDFViewerApplication.switchSidebarView(mode, true); - break; - case 'none': - if (PDFViewerApplication.sidebarOpen) { - document.getElementById('sidebarToggle').click(); - } - break; - } -}, true); - -document.addEventListener('namedaction', function (e) { - if (!PDFViewerApplication.initialized) { - return; - } - // Processing couple of named actions that might be useful. - // See also PDFLinkService.executeNamedAction - var action = e.detail.action; - switch (action) { - case 'GoToPage': - document.getElementById('pageNumber').focus(); - break; - - case 'Find': - if (!PDFViewerApplication.supportsIntegratedFind) { - PDFViewerApplication.findBar.toggle(); - } - break; - } -}, true); - -window.addEventListener('presentationmodechanged', function (e) { - var active = e.detail.active; - var switchInProgress = e.detail.switchInProgress; - PDFViewerApplication.pdfViewer.presentationModeState = - switchInProgress ? PresentationModeState.CHANGING : - active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL; -}); - -window.addEventListener('updateviewarea', function (evt) { - if (!PDFViewerApplication.initialized) { - return; - } - var location = evt.location; - - PDFViewerApplication.store.initializedPromise.then(function() { - PDFViewerApplication.store.setMultiple({ - 'exists': true, - 'page': location.pageNumber, - 'zoom': location.scale, - 'scrollLeft': location.left, - 'scrollTop': location.top - }).catch(function() { - // unable to write to storage - }); - }); - var href = - PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams); - document.getElementById('viewBookmark').href = href; - document.getElementById('secondaryViewBookmark').href = href; - - // Update the current bookmark in the browsing history. - PDFViewerApplication.pdfHistory.updateCurrentBookmark(location.pdfOpenParams, - location.pageNumber); - - // Show/hide the loading indicator in the page number input element. - var pageNumberInput = document.getElementById('pageNumber'); - var currentPage = - PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1); - - if (currentPage.renderingState === RenderingStates.FINISHED) { - pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR); - } else { - pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR); - } -}, true); - -window.addEventListener('resize', function webViewerResize(evt) { - if (PDFViewerApplication.initialized) { - var currentScaleValue = PDFViewerApplication.pdfViewer.currentScaleValue; - if (currentScaleValue === 'auto' || - currentScaleValue === 'page-fit' || - currentScaleValue === 'page-width') { - // Note: the scale is constant for 'page-actual'. - PDFViewerApplication.pdfViewer.currentScaleValue = currentScaleValue; - } else if (!currentScaleValue) { - // Normally this shouldn't happen, but if the scale wasn't initialized - // we set it to the default value in order to prevent any issues. - // (E.g. the document being rendered with the wrong scale on load.) - PDFViewerApplication.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; - } - PDFViewerApplication.pdfViewer.update(); - } - - // Set the 'max-height' CSS property of the secondary toolbar. - SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer')); -}); - -window.addEventListener('hashchange', function webViewerHashchange(evt) { - if (PDFViewerApplication.pdfHistory.isHashChangeUnlocked) { - var hash = document.location.hash.substring(1); - if (!hash) { - return; - } - if (!PDFViewerApplication.isInitialViewSet) { - PDFViewerApplication.initialBookmark = hash; - } else { - PDFViewerApplication.pdfLinkService.setHash(hash); - } - } -}); - -window.addEventListener('change', function webViewerChange(evt) { - var files = evt.target.files; - if (!files || files.length === 0) { - return; - } - var file = files[0]; - - if (!PDFJS.disableCreateObjectURL && - typeof URL !== 'undefined' && URL.createObjectURL) { - PDFViewerApplication.open(URL.createObjectURL(file)); - } else { - // Read the local file into a Uint8Array. - var fileReader = new FileReader(); - fileReader.onload = function webViewerChangeFileReaderOnload(evt) { - var buffer = evt.target.result; - var uint8Array = new Uint8Array(buffer); - PDFViewerApplication.open(uint8Array); - }; - fileReader.readAsArrayBuffer(file); - } - - PDFViewerApplication.setTitleUsingUrl(file.name); - - // URL does not reflect proper document location - hiding some icons. - document.getElementById('viewBookmark').setAttribute('hidden', 'true'); - document.getElementById('secondaryViewBookmark'). - setAttribute('hidden', 'true'); - document.getElementById('download').setAttribute('hidden', 'true'); - document.getElementById('secondaryDownload').setAttribute('hidden', 'true'); -}, true); - -function selectScaleOption(value) { - var options = document.getElementById('scaleSelect').options; - var predefinedValueFound = false; - for (var i = 0, ii = options.length; i < ii; i++) { - var option = options[i]; - if (option.value !== value) { - option.selected = false; - continue; - } - option.selected = true; - predefinedValueFound = true; - } - return predefinedValueFound; -} - -window.addEventListener('localized', function localized(evt) { -// document.getElementsByTagName('html')[0].dir = mozL10n.getDirection(); - - PDFViewerApplication.animationStartedPromise.then(function() { - // Adjust the width of the zoom box to fit the content. - // Note: If the window is narrow enough that the zoom box is not visible, - // we temporarily show it to be able to adjust its width. - var container = document.getElementById('scaleSelectContainer'); - if (container.clientWidth === 0) { - container.setAttribute('style', 'display: inherit;'); - } - if (container.clientWidth > 0) { - var select = document.getElementById('scaleSelect'); - select.setAttribute('style', 'min-width: inherit;'); - var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING; - select.setAttribute('style', 'min-width: ' + - (width + SCALE_SELECT_PADDING) + 'px;'); - container.setAttribute('style', 'min-width: ' + width + 'px; ' + - 'max-width: ' + width + 'px;'); - } - - // Set the 'max-height' CSS property of the secondary toolbar. - SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer')); - }); -}, true); - -window.addEventListener('scalechange', function scalechange(evt) { - document.getElementById('zoomOut').disabled = (evt.scale === MIN_SCALE); - document.getElementById('zoomIn').disabled = (evt.scale === MAX_SCALE); - - // Update the 'scaleSelect' DOM element. - var predefinedValueFound = selectScaleOption(evt.presetValue || - '' + evt.scale); - if (!predefinedValueFound) { - var customScaleOption = document.getElementById('customScaleOption'); - var customScale = Math.round(evt.scale * 10000) / 100; - customScaleOption.textContent = customScale + '%'; - customScaleOption.selected = true; - } - if (!PDFViewerApplication.initialized) { - return; - } - PDFViewerApplication.pdfViewer.update(); -}, true); - -window.addEventListener('pagechange', function pagechange(evt) { - var page = evt.pageNumber; - if (evt.previousPageNumber !== page) { - document.getElementById('pageNumber').value = page; - if (PDFViewerApplication.sidebarOpen) { - PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page); - } - } - var numPages = PDFViewerApplication.pagesCount; - - document.getElementById('previous').disabled = (page <= 1); - document.getElementById('next').disabled = (page >= numPages); - - document.getElementById('firstPage').disabled = (page <= 1); - document.getElementById('lastPage').disabled = (page >= numPages); - - // we need to update stats - if (PDFJS.pdfBug && Stats.enabled) { - var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1); - if (pageView.stats) { - Stats.add(page, pageView.stats); - } - } -}, true); - -function handleMouseWheel(evt) { - var MOUSE_WHEEL_DELTA_FACTOR = 40; - var ticks = (evt.type === 'DOMMouseScroll') ? -evt.detail : - evt.wheelDelta / MOUSE_WHEEL_DELTA_FACTOR; - var direction = (ticks < 0) ? 'zoomOut' : 'zoomIn'; - - var pdfViewer = PDFViewerApplication.pdfViewer; - if (pdfViewer.isInPresentationMode) { - evt.preventDefault(); - PDFViewerApplication.scrollPresentationMode(ticks * - MOUSE_WHEEL_DELTA_FACTOR); - } else if (evt.ctrlKey || evt.metaKey) { - var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys; - if ((evt.ctrlKey && !support.ctrlKey) || - (evt.metaKey && !support.metaKey)) { - return; - } - // Only zoom the pages, not the entire viewer. - evt.preventDefault(); - - var previousScale = pdfViewer.currentScale; - - PDFViewerApplication[direction](Math.abs(ticks)); - - var currentScale = pdfViewer.currentScale; - if (previousScale !== currentScale) { - // After scaling the page via zoomIn/zoomOut, the position of the upper- - // left corner is restored. When the mouse wheel is used, the position - // under the cursor should be restored instead. - var scaleCorrectionFactor = currentScale / previousScale - 1; - var rect = pdfViewer.container.getBoundingClientRect(); - var dx = evt.clientX - rect.left; - var dy = evt.clientY - rect.top; - pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor; - pdfViewer.container.scrollTop += dy * scaleCorrectionFactor; - } - } -} - -window.addEventListener('DOMMouseScroll', handleMouseWheel); -window.addEventListener('mousewheel', handleMouseWheel); - -window.addEventListener('click', function click(evt) { - if (SecondaryToolbar.opened && - PDFViewerApplication.pdfViewer.containsElement(evt.target)) { - SecondaryToolbar.close(); - } -}, false); - -window.addEventListener('keydown', function keydown(evt) { - if (OverlayManager.active) { - return; - } - - var handled = false; - var cmd = (evt.ctrlKey ? 1 : 0) | - (evt.altKey ? 2 : 0) | - (evt.shiftKey ? 4 : 0) | - (evt.metaKey ? 8 : 0); - - var pdfViewer = PDFViewerApplication.pdfViewer; - var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode; - - // First, handle the key bindings that are independent whether an input - // control is selected or not. - if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { - // either CTRL or META key with optional SHIFT. - switch (evt.keyCode) { - case 70: // f - if (!PDFViewerApplication.supportsIntegratedFind) { - PDFViewerApplication.findBar.open(); - handled = true; - } - break; - case 71: // g - if (!PDFViewerApplication.supportsIntegratedFind) { - PDFViewerApplication.findBar.dispatchEvent('again', - cmd === 5 || cmd === 12); - handled = true; - } - break; - case 61: // FF/Mac '=' - case 107: // FF '+' and '=' - case 187: // Chrome '+' - case 171: // FF with German keyboard - if (!isViewerInPresentationMode) { - PDFViewerApplication.zoomIn(); - } - handled = true; - break; - case 173: // FF/Mac '-' - case 109: // FF '-' - case 189: // Chrome '-' - if (!isViewerInPresentationMode) { - PDFViewerApplication.zoomOut(); - } - handled = true; - break; - case 48: // '0' - case 96: // '0' on Numpad of Swedish keyboard - if (!isViewerInPresentationMode) { - // keeping it unhandled (to restore page zoom to 100%) - setTimeout(function () { - // ... and resetting the scale after browser adjusts its scale - pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; - }); - handled = false; - } - break; - } - } - - // CTRL or META without shift - if (cmd === 1 || cmd === 8) { - switch (evt.keyCode) { - case 83: // s - PDFViewerApplication.download(); - handled = true; - break; - } - } - - // CTRL+ALT or Option+Command - if (cmd === 3 || cmd === 10) { - switch (evt.keyCode) { - case 80: // p - PDFViewerApplication.requestPresentationMode(); - handled = true; - break; - case 71: // g - // focuses input#pageNumber field - document.getElementById('pageNumber').select(); - handled = true; - break; - } - } - - if (handled) { - evt.preventDefault(); - return; - } - - // Some shortcuts should not get handled if a control/input element - // is selected. - var curElement = document.activeElement || document.querySelector(':focus'); - var curElementTagName = curElement && curElement.tagName.toUpperCase(); - if (curElementTagName === 'INPUT' || - curElementTagName === 'TEXTAREA' || - curElementTagName === 'SELECT') { - // Make sure that the secondary toolbar is closed when Escape is pressed. - if (evt.keyCode !== 27) { // 'Esc' - return; - } - } - var ensureViewerFocused = false; - - if (cmd === 0) { // no control key pressed at all. - switch (evt.keyCode) { - case 38: // up arrow - case 33: // pg up - case 8: // backspace - if (!isViewerInPresentationMode && - pdfViewer.currentScaleValue !== 'page-fit') { - break; - } - /* in presentation mode */ - /* falls through */ - case 37: // left arrow - // horizontal scrolling using arrow keys - if (pdfViewer.isHorizontalScrollbarEnabled) { - break; - } - /* falls through */ - case 75: // 'k' - case 80: // 'p' - PDFViewerApplication.page--; - handled = true; - break; - case 27: // esc key - if (SecondaryToolbar.opened) { - SecondaryToolbar.close(); - handled = true; - } - if (!PDFViewerApplication.supportsIntegratedFind && - PDFViewerApplication.findBar.opened) { - PDFViewerApplication.findBar.close(); - handled = true; - } - break; - case 40: // down arrow - case 34: // pg down - case 32: // spacebar - if (!isViewerInPresentationMode && - pdfViewer.currentScaleValue !== 'page-fit') { - break; - } - /* falls through */ - case 39: // right arrow - // horizontal scrolling using arrow keys - if (pdfViewer.isHorizontalScrollbarEnabled) { - break; - } - /* falls through */ - case 74: // 'j' - case 78: // 'n' - PDFViewerApplication.page++; - handled = true; - break; - - case 36: // home - if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { - PDFViewerApplication.page = 1; - handled = true; - ensureViewerFocused = true; - } - break; - case 35: // end - if (isViewerInPresentationMode || (PDFViewerApplication.pdfDocument && - PDFViewerApplication.page < PDFViewerApplication.pagesCount)) { - PDFViewerApplication.page = PDFViewerApplication.pagesCount; - handled = true; - ensureViewerFocused = true; - } - break; - - case 72: // 'h' - if (!isViewerInPresentationMode) { - HandTool.toggle(); - } - break; - case 82: // 'r' - PDFViewerApplication.rotatePages(90); - break; - } - } - - if (cmd === 4) { // shift-key - switch (evt.keyCode) { - case 32: // spacebar - if (!isViewerInPresentationMode && - pdfViewer.currentScaleValue !== 'page-fit') { - break; - } - PDFViewerApplication.page--; - handled = true; - break; - - case 82: // 'r' - PDFViewerApplication.rotatePages(-90); - break; - } - } - - if (!handled && !isViewerInPresentationMode) { - // 33=Page Up 34=Page Down 35=End 36=Home - // 37=Left 38=Up 39=Right 40=Down - // 32=Spacebar - if ((evt.keyCode >= 33 && evt.keyCode <= 40) || - (evt.keyCode === 32 && curElementTagName !== 'BUTTON')) { - ensureViewerFocused = true; - } - } - - if (cmd === 2) { // alt-key - switch (evt.keyCode) { - case 37: // left arrow - if (isViewerInPresentationMode) { - PDFViewerApplication.pdfHistory.back(); - handled = true; - } - break; - case 39: // right arrow - if (isViewerInPresentationMode) { - PDFViewerApplication.pdfHistory.forward(); - handled = true; - } - break; - } - } - - if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { - // The page container is not focused, but a page navigation key has been - // pressed. Change the focus to the viewer container to make sure that - // navigation by keyboard works as expected. - pdfViewer.focus(); - } - - if (handled) { - evt.preventDefault(); - } -}); - -window.addEventListener('beforeprint', function beforePrint(evt) { - PDFViewerApplication.beforePrint(); -}); - -window.addEventListener('afterprint', function afterPrint(evt) { - PDFViewerApplication.afterPrint(); -}); - -(function animationStartedClosure() { - // The offsetParent is not set until the pdf.js iframe or object is visible. - // Waiting for first animation. - PDFViewerApplication.animationStartedPromise = new Promise( - function (resolve) { - window.requestAnimationFrame(resolve); - }); -})(); - diff --git a/public/plugins/simplemde-1.10.1/simplemde.min.css b/public/plugins/simplemde-1.10.1/simplemde.min.css deleted file mode 100644 index bc07d43..0000000 --- a/public/plugins/simplemde-1.10.1/simplemde.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/** - * simplemde v1.10.1 - * Copyright Next Step Webs, Inc. - * @link https://github.com/NextStepWebs/simplemde-markdown-editor - * @license MIT - */ -.CodeMirror{color:#000}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important;-webkit-user-select:none;-moz-user-select:none;user-select:none}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror,.CodeMirror-scroll{min-height:300px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected,.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror{height:auto;border:1px solid #ddd;border-bottom-left-radius:4px;border-bottom-right-radius:4px;padding:10px;font:inherit;z-index:1}.CodeMirror-fullscreen{background:#fff;position:fixed!important;top:50px;left:0;right:0;bottom:0;height:auto;z-index:9}.CodeMirror-sided{width:50%!important}.editor-toolbar{position:relative;opacity:.6;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;padding:0 10px;border-top:1px solid #bbb;border-left:1px solid #bbb;border-right:1px solid #bbb;border-top-left-radius:4px;border-top-right-radius:4px}.editor-toolbar:after,.editor-toolbar:before{display:block;content:' ';height:1px}.editor-toolbar:before{margin-bottom:8px}.editor-toolbar:after{margin-top:8px}.editor-toolbar:hover,.editor-wrapper input.title:focus,.editor-wrapper input.title:hover{opacity:.8}.editor-toolbar.fullscreen{width:100%;height:50px;overflow-x:auto;overflow-y:hidden;white-space:nowrap;padding-top:10px;padding-bottom:10px;box-sizing:border-box;background:#fff;border:0;position:fixed;top:0;left:0;opacity:1;z-index:9}.editor-toolbar.fullscreen::before{width:20px;height:50px;background:-moz-linear-gradient(left,rgba(255,255,255,1) 0,rgba(255,255,255,0) 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,1)),color-stop(100%,rgba(255,255,255,0)));background:-webkit-linear-gradient(left,rgba(255,255,255,1) 0,rgba(255,255,255,0) 100%);background:-o-linear-gradient(left,rgba(255,255,255,1) 0,rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left,rgba(255,255,255,1) 0,rgba(255,255,255,0) 100%);background:linear-gradient(to right,rgba(255,255,255,1) 0,rgba(255,255,255,0) 100%);position:fixed;top:0;left:0;margin:0;padding:0}.editor-toolbar.fullscreen::after{width:20px;height:50px;background:-moz-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,1) 100%);background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),color-stop(100%,rgba(255,255,255,1)));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,1) 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,1) 100%);background:-ms-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,1) 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,1) 100%);position:fixed;top:0;right:0;margin:0;padding:0}.editor-toolbar a{display:inline-block;text-align:center;text-decoration:none!important;color:#2c3e50!important;width:30px;height:30px;margin:0;border:1px solid transparent;border-radius:3px;cursor:pointer}.editor-toolbar a.active,.editor-toolbar a:hover{background:#fcfcfc;border-color:#95a5a6}.editor-toolbar a:before{line-height:30px}.editor-toolbar i.separator{display:inline-block;width:0;border-left:1px solid #d9d9d9;border-right:1px solid #fff;color:transparent;text-indent:-10px;margin:0 6px}.editor-toolbar a.fa-header-x:after{font-family:Arial,"Helvetica Neue",Helvetica,sans-serif;font-size:65%;vertical-align:text-bottom;position:relative;top:2px}.editor-toolbar a.fa-header-1:after{content:"1"}.editor-toolbar a.fa-header-2:after{content:"2"}.editor-toolbar a.fa-header-3:after{content:"3"}.editor-toolbar a.fa-header-bigger:after{content:"▲"}.editor-toolbar a.fa-header-smaller:after{content:"▼"}.editor-toolbar.disabled-for-preview a:not(.no-disable){pointer-events:none;background:#fff;border-color:transparent;text-shadow:inherit}@media only screen and (max-width:700px){.editor-toolbar a.no-mobile{display:none}}.editor-statusbar{padding:8px 10px;font-size:12px;color:#959694;text-align:right}.editor-statusbar span{display:inline-block;min-width:4em;margin-left:1em}.editor-preview,.editor-preview-side{padding:10px;background:#fafafa;overflow:auto;display:none;box-sizing:border-box}.editor-statusbar .lines:before{content:'lines: '}.editor-statusbar .words:before{content:'words: '}.editor-statusbar .characters:before{content:'characters: '}.editor-preview{position:absolute;width:100%;height:100%;top:0;left:0;z-index:7}.editor-preview-side{position:fixed;bottom:0;width:50%;top:50px;right:0;z-index:9;border:1px solid #ddd}.editor-preview-active,.editor-preview-active-side{display:block}.editor-preview-side>p,.editor-preview>p{margin-top:0}.editor-preview pre,.editor-preview-side pre{background:#eee;margin-bottom:10px}.editor-preview table td,.editor-preview table th,.editor-preview-side table td,.editor-preview-side table th{border:1px solid #ddd;padding:5px}.CodeMirror .CodeMirror-code .cm-tag{color:#63a35c}.CodeMirror .CodeMirror-code .cm-attribute{color:#795da3}.CodeMirror .CodeMirror-code .cm-string{color:#183691}.CodeMirror .CodeMirror-selected{background:#d9d9d9}.CodeMirror .CodeMirror-code .cm-header-1{font-size:200%;line-height:200%}.CodeMirror .CodeMirror-code .cm-header-2{font-size:160%;line-height:160%}.CodeMirror .CodeMirror-code .cm-header-3{font-size:125%;line-height:125%}.CodeMirror .CodeMirror-code .cm-header-4{font-size:110%;line-height:110%}.CodeMirror .CodeMirror-code .cm-comment{background:rgba(0,0,0,.05);border-radius:2px}.CodeMirror .CodeMirror-code .cm-link{color:#7f8c8d}.CodeMirror .CodeMirror-code .cm-url{color:#aab2b3}.CodeMirror .CodeMirror-code .cm-strikethrough{text-decoration:line-through}.CodeMirror .CodeMirror-placeholder{opacity:.5}.CodeMirror .cm-spell-error:not(.cm-url):not(.cm-comment):not(.cm-tag):not(.cm-word){background:rgba(255,0,0,.15)} \ No newline at end of file diff --git a/public/plugins/simplemde-1.10.1/simplemde.min.js b/public/plugins/simplemde-1.10.1/simplemde.min.js deleted file mode 100644 index 89bee7f..0000000 --- a/public/plugins/simplemde-1.10.1/simplemde.min.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * simplemde v1.10.1 - * Copyright Next Step Webs, Inc. - * @link https://github.com/NextStepWebs/simplemde-markdown-editor - * @license MIT - */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.SimpleMDE=e()}}(function(){var e;return function t(e,n,r){function i(l,a){if(!n[l]){if(!e[l]){var s="function"==typeof require&&require;if(!a&&s)return s(l,!0);if(o)return o(l,!0);var c=new Error("Cannot find module '"+l+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[l]={exports:{}};e[l][0].call(u.exports,function(t){var n=e[l][1][t];return i(n?n:t)},u,u.exports,t,e,n,r)}return n[l].exports}for(var o="function"==typeof require&&require,l=0;lo;o++)for(var a=this.compoundRules[o],s=0,c=a.length;c>s;s++)this.compoundRuleCodes[a[s]]=[];"ONLYINCOMPOUND"in this.flags&&(this.compoundRuleCodes[this.flags.ONLYINCOMPOUND]=[]),this.dictionaryTable=this._parseDIC(n);for(var o in this.compoundRuleCodes)0==this.compoundRuleCodes[o].length&&delete this.compoundRuleCodes[o];for(var o=0,l=this.compoundRules.length;l>o;o++){for(var u=this.compoundRules[o],d="",s=0,c=u.length;c>s;s++){var h=u[s];d+=h in this.compoundRuleCodes?"("+this.compoundRuleCodes[h].join("|")+")":h}this.compoundRules[o]=new RegExp(d,"i")}}return this};o.prototype={load:function(e){for(var t in e)this[t]=e[t];return this},_readFile:function(e,t){t||(t="ISO8859-1");var n=new XMLHttpRequest;return n.open("GET",e,!1),n.overrideMimeType&&n.overrideMimeType("text/plain; charset="+t),n.send(null),n.responseText},_parseAFF:function(e){var t={};e=this._removeAffixComments(e);for(var n=e.split("\n"),r=0,i=n.length;i>r;r++){var o=n[r],l=o.split(/\s+/),a=l[0];if("PFX"==a||"SFX"==a){for(var s=l[1],c=l[2],u=parseInt(l[3],10),d=[],h=r+1,f=r+1+u;f>h;h++){var o=n[h],p=o.split(/\s+/),m=p[2],g=p[3].split("/"),v=g[0];"0"===v&&(v="");var y=this.parseRuleCodes(g[1]),x=p[4],b={};b.add=v,y.length>0&&(b.continuationClasses=y),"."!==x&&("SFX"===a?b.match=new RegExp(x+"$"):b.match=new RegExp("^"+x)),"0"!=m&&("SFX"===a?b.remove=new RegExp(m+"$"):b.remove=m),d.push(b)}t[s]={type:a,combineable:"Y"==c,entries:d},r+=u}else if("COMPOUNDRULE"===a){for(var u=parseInt(l[1],10),h=r+1,f=r+1+u;f>h;h++){var o=n[h],p=o.split(/\s+/);this.compoundRules.push(p[1])}r+=u}else if("REP"===a){var p=o.split(/\s+/);3===p.length&&this.replacementTable.push([p[1],p[2]])}else this.flags[a]=l[1]}return t},_removeAffixComments:function(e){return e=e.replace(/#.*$/gm,""),e=e.replace(/^\s\s*/m,"").replace(/\s\s*$/m,""),e=e.replace(/\n{2,}/g,"\n"),e=e.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},_parseDIC:function(e){function t(e,t){e in r&&"object"==typeof r[e]||(r[e]=[]),r[e].push(t)}e=this._removeDicComments(e);for(var n=e.split("\n"),r={},i=1,o=n.length;o>i;i++){var l=n[i],a=l.split("/",2),s=a[0];if(a.length>1){var c=this.parseRuleCodes(a[1]);"NEEDAFFIX"in this.flags&&-1!=c.indexOf(this.flags.NEEDAFFIX)||t(s,c);for(var u=0,d=c.length;d>u;u++){var h=c[u],f=this.rules[h];if(f)for(var p=this._applyRule(s,f),m=0,g=p.length;g>m;m++){var v=p[m];if(t(v,[]),f.combineable)for(var y=u+1;d>y;y++){var x=c[y],b=this.rules[x];if(b&&b.combineable&&f.type!=b.type)for(var w=this._applyRule(v,b),k=0,C=w.length;C>k;k++){var S=w[k];t(S,[])}}}h in this.compoundRuleCodes&&this.compoundRuleCodes[h].push(s)}}else t(s.trim(),[])}return r},_removeDicComments:function(e){return e=e.replace(/^\t.*$/gm,"")},parseRuleCodes:function(e){if(!e)return[];if(!("FLAG"in this.flags))return e.split("");if("long"===this.flags.FLAG){for(var t=[],n=0,r=e.length;r>n;n+=2)t.push(e.substr(n,2));return t}return"num"===this.flags.FLAG?textCode.split(","):void 0},_applyRule:function(e,t){for(var n=t.entries,r=[],i=0,o=n.length;o>i;i++){var l=n[i];if(!l.match||e.match(l.match)){var a=e;if(l.remove&&(a=a.replace(l.remove,"")),"SFX"===t.type?a+=l.add:a=l.add+a,r.push(a),"continuationClasses"in l)for(var s=0,c=l.continuationClasses.length;c>s;s++){var u=this.rules[l.continuationClasses[s]];u&&(r=r.concat(this._applyRule(a,u)))}}}return r},check:function(e){var t=e.replace(/^\s\s*/,"").replace(/\s\s*$/,"");if(this.checkExact(t))return!0;if(t.toUpperCase()===t){var n=t[0]+t.substring(1).toLowerCase();if(this.hasFlag(n,"KEEPCASE"))return!1;if(this.checkExact(n))return!0}var r=t.toLowerCase();if(r!==t){if(this.hasFlag(r,"KEEPCASE"))return!1;if(this.checkExact(r))return!0}return!1},checkExact:function(e){var t=this.dictionaryTable[e];if("undefined"==typeof t){if("COMPOUNDMIN"in this.flags&&e.length>=this.flags.COMPOUNDMIN)for(var n=0,r=this.compoundRules.length;r>n;n++)if(e.match(this.compoundRules[n]))return!0;return!1}for(var n=0,r=t.length;r>n;n++)if(!this.hasFlag(e,"ONLYINCOMPOUND",t[n]))return!0;return!1},hasFlag:function(e,t,n){if(t in this.flags){if("undefined"==typeof n)var n=Array.prototype.concat.apply([],this.dictionaryTable[e]);if(n&&-1!==n.indexOf(this.flags[t]))return!0}return!1},alphabet:"",suggest:function(e,t){function n(e){for(var t=[],n=0,r=e.length;r>n;n++){for(var i=e[n],o=[],l=0,a=i.length+1;a>l;l++)o.push([i.substring(0,l),i.substring(l,i.length)]);for(var s=[],l=0,a=o.length;a>l;l++){var u=o[l];u[1]&&s.push(u[0]+u[1].substring(1))}for(var d=[],l=0,a=o.length;a>l;l++){var u=o[l];u[1].length>1&&d.push(u[0]+u[1][1]+u[1][0]+u[1].substring(2))}for(var h=[],l=0,a=o.length;a>l;l++){var u=o[l];if(u[1])for(var f=0,p=c.alphabet.length;p>f;f++)h.push(u[0]+c.alphabet[f]+u[1].substring(1))}for(var m=[],l=0,a=o.length;a>l;l++){var u=o[l];if(u[1])for(var f=0,p=c.alphabet.length;p>f;f++)h.push(u[0]+c.alphabet[f]+u[1])}t=t.concat(s),t=t.concat(d),t=t.concat(h),t=t.concat(m)}return t}function r(e){for(var t=[],n=0;nu;u++)a[u]in s?s[a[u]]+=1:s[a[u]]=1;var h=[];for(var u in s)h.push([u,s[u]]);h.sort(i).reverse();for(var f=[],u=0,d=Math.min(t,h.length);d>u;u++)c.hasFlag(h[u][0],"NOSUGGEST")||f.push(h[u][0]);return f}if(t||(t=5),this.check(e))return[];for(var o=0,l=this.replacementTable.length;l>o;o++){var a=this.replacementTable[o];if(-1!==e.indexOf(a[0])){var s=e.replace(a[0],a[1]);if(this.check(s))return[s]}}var c=this;return c.alphabet="abcdefghijklmnopqrstuvwxyz",i(e)}},i("undefined"!=typeof o?o:window.Typo)}).call(e,void 0,void 0,void 0,void 0,function(e){t.exports=e})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],3:[function(t,n,r){!function(i){"object"==typeof r&&"object"==typeof n?i(t("../../lib/codemirror")):"function"==typeof e&&e.amd?e(["../../lib/codemirror"],i):i(CodeMirror)}(function(e){"use strict";function t(e){var t=e.getWrapperElement();e.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:t.style.width,height:t.style.height},t.style.width="",t.style.height="auto",t.className+=" CodeMirror-fullscreen",document.documentElement.style.overflow="hidden",e.refresh()}function n(e){var t=e.getWrapperElement();t.className=t.className.replace(/\s*CodeMirror-fullscreen\b/,""),document.documentElement.style.overflow="";var n=e.state.fullScreenRestore;t.style.width=n.width,t.style.height=n.height,window.scrollTo(n.scrollLeft,n.scrollTop),e.refresh()}e.defineOption("fullScreen",!1,function(r,i,o){o==e.Init&&(o=!1),!o!=!i&&(i?t(r):n(r))})})},{"../../lib/codemirror":7}],4:[function(t,n,r){!function(i){"object"==typeof r&&"object"==typeof n?i(t("../../lib/codemirror")):"function"==typeof e&&e.amd?e(["../../lib/codemirror"],i):i(CodeMirror)}(function(e){function t(e){e.state.placeholder&&(e.state.placeholder.parentNode.removeChild(e.state.placeholder),e.state.placeholder=null)}function n(e){t(e);var n=e.state.placeholder=document.createElement("pre");n.style.cssText="height: 0; overflow: visible",n.className="CodeMirror-placeholder";var r=e.getOption("placeholder");"string"==typeof r&&(r=document.createTextNode(r)),n.appendChild(r),e.display.lineSpace.insertBefore(n,e.display.lineSpace.firstChild)}function r(e){o(e)&&n(e)}function i(e){var r=e.getWrapperElement(),i=o(e);r.className=r.className.replace(" CodeMirror-empty","")+(i?" CodeMirror-empty":""),i?n(e):t(e)}function o(e){return 1===e.lineCount()&&""===e.getLine(0)}e.defineOption("placeholder","",function(n,o,l){var a=l&&l!=e.Init;if(o&&!a)n.on("blur",r),n.on("change",i),n.on("swapDoc",i),i(n);else if(!o&&a){n.off("blur",r),n.off("change",i),n.off("swapDoc",i),t(n);var s=n.getWrapperElement();s.className=s.className.replace(" CodeMirror-empty","")}o&&!n.hasFocus()&&r(n)})})},{"../../lib/codemirror":7}],5:[function(t,n,r){!function(i){"object"==typeof r&&"object"==typeof n?i(t("../../lib/codemirror")):"function"==typeof e&&e.amd?e(["../../lib/codemirror"],i):i(CodeMirror)}(function(e){"use strict";var t=/^(\s*)(>[> ]*|[*+-]\s|(\d+)([.)]))(\s*)/,n=/^(\s*)(>[> ]*|[*+-]|(\d+)[.)])(\s*)$/,r=/[*+-]\s/;e.commands.newlineAndIndentContinueMarkdownList=function(i){if(i.getOption("disableInput"))return e.Pass;for(var o=i.listSelections(),l=[],a=0;a")>=0?f[2]:parseInt(f[3],10)+1+f[4];l[a]="\n"+p+g+m}}i.replaceSelections(l)}})},{"../../lib/codemirror":7}],6:[function(t,n,r){!function(i){"object"==typeof r&&"object"==typeof n?i(t("../../lib/codemirror")):"function"==typeof e&&e.amd?e(["../../lib/codemirror"],i):i(CodeMirror)}(function(e){"use strict";e.overlayMode=function(t,n,r){return{startState:function(){return{base:e.startState(t),overlay:e.startState(n),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(r){return{base:e.copyState(t,r.base),overlay:e.copyState(n,r.overlay),basePos:r.basePos,baseCur:null,overlayPos:r.overlayPos,overlayCur:null}},token:function(e,i){return(e!=i.streamSeen||Math.min(i.basePos,i.overlayPos)bo&&setTimeout(function(){s.display.input.reset(!0)},20),_t(this),Xi(),bt(this),this.curOp.forceUpdate=!0,Yr(this,i),r.autofocus&&!Ao||s.hasFocus()?setTimeout(zi(vn,this),20):yn(this);for(var u in el)el.hasOwnProperty(u)&&el[u](this,r[u],tl);k(this),r.finishInit&&r.finishInit(this);for(var d=0;dbo&&(r.gutters.style.zIndex=-1,r.scroller.style.paddingRight=0),wo||go&&Ao||(r.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(r.wrapper):e(r.wrapper)),r.viewFrom=r.viewTo=t.first,r.reportedViewFrom=r.reportedViewTo=t.first,r.view=[],r.renderedView=null,r.externalMeasured=null,r.viewOffset=0,r.lastWrapHeight=r.lastWrapWidth=0,r.updateLineNumbers=null,r.nativeBarWidth=r.barHeight=r.barWidth=0,r.scrollbarsClipped=!1,r.lineNumWidth=r.lineNumInnerWidth=r.lineNumChars=null,r.alignWidgets=!1,r.cachedCharWidth=r.cachedTextHeight=r.cachedPaddingH=null,r.maxLine=null,r.maxLineLength=0,r.maxLineChanged=!1,r.wheelDX=r.wheelDY=r.wheelStartX=r.wheelStartY=null,r.shift=!1,r.selForContextMenu=null,r.activeTouch=null,n.init(r)}function n(t){t.doc.mode=e.getMode(t.options,t.doc.modeOption),r(t)}function r(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.frontier=e.doc.first,Re(e,100),e.state.modeGen++,e.curOp&&Dt(e)}function i(e){e.options.lineWrapping?(Zl(e.display.wrapper,"CodeMirror-wrap"),e.display.sizer.style.minWidth="",e.display.sizerWidth=null):(Yl(e.display.wrapper,"CodeMirror-wrap"),h(e)),l(e),Dt(e),at(e),setTimeout(function(){y(e)},100)}function o(e){var t=yt(e.display),n=e.options.lineWrapping,r=n&&Math.max(5,e.display.scroller.clientWidth/xt(e.display)-3);return function(i){if(kr(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;lt.maxLineLength&&(t.maxLineLength=n,t.maxLine=e)})}function f(e){var t=Ii(e.gutters,"CodeMirror-linenumbers");-1==t&&e.lineNumbers?e.gutters=e.gutters.concat(["CodeMirror-linenumbers"]):t>-1&&!e.lineNumbers&&(e.gutters=e.gutters.slice(0),e.gutters.splice(t,1))}function p(e){var t=e.display,n=t.gutters.offsetWidth,r=Math.round(e.doc.height+Ue(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?n:0,docHeight:r,scrollHeight:r+$e(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:n}}function m(e,t,n){this.cm=n;var r=this.vert=_i("div",[_i("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),i=this.horiz=_i("div",[_i("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");e(r),e(i),Al(r,"scroll",function(){r.clientHeight&&t(r.scrollTop,"vertical")}),Al(i,"scroll",function(){i.clientWidth&&t(i.scrollLeft,"horizontal")}),this.checkedZeroWidth=!1,xo&&8>bo&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}function g(){}function v(t){t.display.scrollbars&&(t.display.scrollbars.clear(),t.display.scrollbars.addClass&&Yl(t.display.wrapper,t.display.scrollbars.addClass)),t.display.scrollbars=new e.scrollbarModel[t.options.scrollbarStyle](function(e){t.display.wrapper.insertBefore(e,t.display.scrollbarFiller),Al(e,"mousedown",function(){t.state.focused&&setTimeout(function(){t.display.input.focus()},0)}),e.setAttribute("cm-not-content","true")},function(e,n){"horizontal"==n?on(t,e):rn(t,e)},t),t.display.scrollbars.addClass&&Zl(t.display.wrapper,t.display.scrollbars.addClass)}function y(e,t){t||(t=p(e));var n=e.display.barWidth,r=e.display.barHeight;x(e,t);for(var i=0;4>i&&n!=e.display.barWidth||r!=e.display.barHeight;i++)n!=e.display.barWidth&&e.options.lineWrapping&&H(e),x(e,p(e)),n=e.display.barWidth,r=e.display.barHeight}function x(e,t){var n=e.display,r=n.scrollbars.update(t);n.sizer.style.paddingRight=(n.barWidth=r.right)+"px",n.sizer.style.paddingBottom=(n.barHeight=r.bottom)+"px",n.heightForcer.style.borderBottom=r.bottom+"px solid transparent",r.right&&r.bottom?(n.scrollbarFiller.style.display="block",n.scrollbarFiller.style.height=r.bottom+"px",n.scrollbarFiller.style.width=r.right+"px"):n.scrollbarFiller.style.display="",r.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(n.gutterFiller.style.display="block",n.gutterFiller.style.height=r.bottom+"px",n.gutterFiller.style.width=t.gutterWidth+"px"):n.gutterFiller.style.display=""}function b(e,t,n){var r=n&&null!=n.top?Math.max(0,n.top):e.scroller.scrollTop;r=Math.floor(r-qe(e));var i=n&&null!=n.bottom?n.bottom:r+e.wrapper.clientHeight,o=ni(t,r),l=ni(t,i);if(n&&n.ensure){var a=n.ensure.from.line,s=n.ensure.to.line;o>a?(o=a,l=ni(t,ri(Zr(t,a))+e.wrapper.clientHeight)):Math.min(s,t.lastLine())>=l&&(o=ni(t,ri(Zr(t,s))-e.wrapper.clientHeight),l=s)}return{from:o,to:Math.max(l,o+1)}}function w(e){var t=e.display,n=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var r=S(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=r+"px",l=0;l=n.viewFrom&&t.visible.to<=n.viewTo&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo)&&n.renderedView==n.view&&0==jt(e))return!1;k(e)&&(Ft(e),t.dims=I(e));var i=r.first+r.size,o=Math.max(t.visible.from-e.options.viewportMargin,r.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);n.viewFroml&&n.viewTo-l<20&&(l=Math.min(i,n.viewTo)),Po&&(o=br(e.doc,o),l=wr(e.doc,l));var a=o!=n.viewFrom||l!=n.viewTo||n.lastWrapHeight!=t.wrapperHeight||n.lastWrapWidth!=t.wrapperWidth;Bt(e,o,l),n.viewOffset=ri(Zr(e.doc,n.viewFrom)),e.display.mover.style.top=n.viewOffset+"px";var s=jt(e);if(!a&&0==s&&!t.force&&n.renderedView==n.view&&(null==n.updateLineNumbers||n.updateLineNumbers>=n.viewTo))return!1;var c=Gi();return s>4&&(n.lineDiv.style.display="none"),E(e,n.updateLineNumbers,t.dims),s>4&&(n.lineDiv.style.display=""),n.renderedView=n.view,c&&Gi()!=c&&c.offsetHeight&&c.focus(),qi(n.cursorDiv),qi(n.selectionDiv),n.gutters.style.height=n.sizer.style.minHeight=0,a&&(n.lastWrapHeight=t.wrapperHeight,n.lastWrapWidth=t.wrapperWidth,Re(e,400)),n.updateLineNumbers=null,!0}function N(e,t){for(var n=t.viewport,r=!0;(r&&e.options.lineWrapping&&t.oldDisplayWidth!=Ve(e)||(n&&null!=n.top&&(n={top:Math.min(e.doc.height+Ue(e.display)-Ke(e),n.top)}),t.visible=b(e.display,e.doc,n),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&M(e,t);r=!1){H(e);var i=p(e);Ee(e),O(e,i),y(e,i)}t.signal(e,"update",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,"viewportChange",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function A(e,t){var n=new L(e,t);if(M(e,n)){H(e),N(e,n);var r=p(e);Ee(e),O(e,r),y(e,r),n.finish()}}function O(e,t){e.display.sizer.style.minHeight=t.docHeight+"px",e.display.heightForcer.style.top=t.docHeight+"px",e.display.gutters.style.height=Math.max(t.docHeight+e.display.barHeight+$e(e),t.clientHeight)+"px"}function H(e){for(var t=e.display,n=t.lineDiv.offsetTop,r=0;rbo){var l=o.node.offsetTop+o.node.offsetHeight;i=l-n,n=l}else{var a=o.node.getBoundingClientRect();i=a.bottom-a.top}var s=o.line.height-i;if(2>i&&(i=yt(t)),(s>.001||-.001>s)&&(ei(o.line,i),W(o.line),o.rest))for(var c=0;c=t&&d.lineNumber;d.changes&&(Ii(d.changes,"gutter")>-1&&(h=!1),D(e,d,c,n)),h&&(qi(d.lineNumber),d.lineNumber.appendChild(document.createTextNode(C(e.options,c)))),a=d.node.nextSibling}else{var f=q(e,d,c,n);l.insertBefore(f,a)}c+=d.size}for(;a;)a=r(a)}function D(e,t,n,r){for(var i=0;ibo&&(e.node.style.zIndex=2)),e.node}function F(e){var t=e.bgClass?e.bgClass+" "+(e.line.bgClass||""):e.line.bgClass;if(t&&(t+=" CodeMirror-linebackground"),e.background)t?e.background.className=t:(e.background.parentNode.removeChild(e.background),e.background=null);else if(t){var n=P(e);e.background=n.insertBefore(_i("div",null,t),n.firstChild)}}function z(e,t){var n=e.display.externalMeasured;return n&&n.line==t.line?(e.display.externalMeasured=null,t.measure=n.measure,n.built):zr(e,t)}function R(e,t){var n=t.text.className,r=z(e,t);t.text==t.node&&(t.node=r.pre),t.text.parentNode.replaceChild(r.pre,t.text),t.text=r.pre,r.bgClass!=t.bgClass||r.textClass!=t.textClass?(t.bgClass=r.bgClass,t.textClass=r.textClass,B(t)):n&&(t.text.className=n)}function B(e){F(e),e.line.wrapClass?P(e).className=e.line.wrapClass:e.node!=e.text&&(e.node.className="");var t=e.textClass?e.textClass+" "+(e.line.textClass||""):e.line.textClass;e.text.className=t||""}function j(e,t,n,r){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass){var i=P(t);t.gutterBackground=_i("div",null,"CodeMirror-gutter-background "+t.line.gutterClass,"left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px; width: "+r.gutterTotalWidth+"px"),i.insertBefore(t.gutterBackground,t.text)}var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var i=P(t),l=t.gutter=_i("div",null,"CodeMirror-gutter-wrapper","left: "+(e.options.fixedGutter?r.fixedPos:-r.gutterTotalWidth)+"px");if(e.display.input.setUneditable(l),i.insertBefore(l,t.text),t.line.gutterClass&&(l.className+=" "+t.line.gutterClass),!e.options.lineNumbers||o&&o["CodeMirror-linenumbers"]||(t.lineNumber=l.appendChild(_i("div",C(e.options,n),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+r.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+e.display.lineNumInnerWidth+"px"))),o)for(var a=0;a1)if(Ro&&Ro.join("\n")==t){if(r.ranges.length%Ro.length==0){s=[];for(var c=0;c=0;c--){var u=r.ranges[c],d=u.from(),h=u.to();u.empty()&&(n&&n>0?d=Fo(d.line,d.ch-n):e.state.overwrite&&!l&&(h=Fo(h.line,Math.min(Zr(o,h.line).text.length,h.ch+Wi(a).length))));var f=e.curOp.updateInput,p={from:d,to:h,text:s?s[c%s.length]:a,origin:i||(l?"paste":e.state.cutIncoming?"cut":"+input")};Tn(e.doc,p),Si(e,"inputRead",e,p)}t&&!l&&J(e,t),zn(e),e.curOp.updateInput=f,e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=!1}function Q(e,t){var n=e.clipboardData&&e.clipboardData.getData("text/plain");return n?(e.preventDefault(),t.isReadOnly()||t.options.disableInput||At(t,function(){Z(t,n,0,null,"paste")}),!0):void 0}function J(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var n=e.doc.sel,r=n.ranges.length-1;r>=0;r--){var i=n.ranges[r];if(!(i.head.ch>100||r&&n.ranges[r-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var a=0;a-1){l=Bn(e,i.head.line,"smart");break}}else o.electricInput&&o.electricInput.test(Zr(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=Bn(e,i.head.line,"smart"));l&&Si(e,"electricInput",e,i.head.line)}}}function ee(e){for(var t=[],n=[],r=0;ri?c.map:u[i],l=0;li?e.line:e.rest[i]),d=o[l]+r;return(0>r||a!=t)&&(d=o[l+(r?1:0)]),Fo(s,d)}}}var i=e.text.firstChild,o=!1;if(!t||!Vl(i,t))return le(Fo(ti(e.line),0),!0);if(t==i&&(o=!0,t=i.childNodes[n],n=0,!t)){var l=e.rest?Wi(e.rest):e.line;return le(Fo(ti(l),l.text.length),o)}var a=3==t.nodeType?t:null,s=t;for(a||1!=t.childNodes.length||3!=t.firstChild.nodeType||(a=t.firstChild,n&&(n=a.nodeValue.length));s.parentNode!=i;)s=s.parentNode;var c=e.measure,u=c.maps,d=r(a,s,n);if(d)return le(d,o);for(var h=s.nextSibling,f=a?a.nodeValue.length-n:0;h;h=h.nextSibling){if(d=r(h,h.firstChild,0))return le(Fo(d.line,d.ch-f),o);f+=h.textContent.length}for(var p=s.previousSibling,f=n;p;p=p.previousSibling){if(d=r(p,p.firstChild,-1))return le(Fo(d.line,d.ch+f),o);f+=h.textContent.length}}function ce(e,t,n,r,i){function o(e){return function(t){return t.id==e}}function l(t){if(1==t.nodeType){var n=t.getAttribute("cm-text");if(null!=n)return""==n&&(n=t.textContent.replace(/\u200b/g,"")),void(a+=n);var u,d=t.getAttribute("cm-marker");if(d){var h=e.findMarks(Fo(r,0),Fo(i+1,0),o(+d));return void(h.length&&(u=h[0].find())&&(a+=Qr(e.doc,u.from,u.to).join(c)))}if("false"==t.getAttribute("contenteditable"))return;for(var f=0;f=0){var l=X(o.from(),i.from()),a=K(o.to(),i.to()),s=o.empty()?i.from()==i.head:o.from()==o.head;t>=r&&--t,e.splice(--r,2,new de(s?a:l,s?l:a))}}return new ue(e,t)}function fe(e,t){return new ue([new de(e,t||e)],0)}function pe(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function me(e,t){if(t.linen?Fo(n,Zr(e,n).text.length):ge(t,Zr(e,t.line).text.length)}function ge(e,t){var n=e.ch;return null==n||n>t?Fo(e.line,t):0>n?Fo(e.line,0):e}function ve(e,t){return t>=e.first&&t=t.ch:a.to>t.ch))){if(i&&(Wl(s,"beforeCursorEnter"),s.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!s.atomic)continue;if(n){var c,u=s.find(0>r?1:-1);if((0>r?s.inclusiveRight:s.inclusiveLeft)&&(u=Ie(e,u,-r,u&&u.line==t.line?o:null)),u&&u.line==t.line&&(c=zo(u,n))&&(0>r?0>c:c>0))return He(e,u,t,r,i)}var d=s.find(0>r?-1:1);return(0>r?s.inclusiveLeft:s.inclusiveRight)&&(d=Ie(e,d,r,d.line==t.line?o:null)),d?He(e,d,t,r,i):null}}return t}function We(e,t,n,r,i){var o=r||1,l=He(e,t,n,o,i)||!i&&He(e,t,n,o,!0)||He(e,t,n,-o,i)||!i&&He(e,t,n,-o,!0);return l?l:(e.cantEdit=!0,Fo(e.first,0))}function Ie(e,t,n,r){return 0>n&&0==t.ch?t.line>e.first?me(e,Fo(t.line-1)):null:n>0&&t.ch==(r||Zr(e,t.line)).text.length?t.line=e.display.viewTo||a.to().linet&&(t=0),t=Math.round(t),r=Math.round(r),a.appendChild(_i("div",null,"CodeMirror-selected","position: absolute; left: "+e+"px; top: "+t+"px; width: "+(null==n?u-e:n)+"px; height: "+(r-t)+"px"))}function i(t,n,i){function o(n,r){return ht(e,Fo(t,n),"div",d,r)}var a,s,d=Zr(l,t),h=d.text.length;return eo(ii(d),n||0,null==i?h:i,function(e,t,l){var d,f,p,m=o(e,"left");if(e==t)d=m,f=p=m.left;else{if(d=o(t-1,"right"),"rtl"==l){var g=m;m=d,d=g}f=m.left,p=d.right}null==n&&0==e&&(f=c),d.top-m.top>3&&(r(f,m.top,null,m.bottom),f=c,m.bottoms.bottom||d.bottom==s.bottom&&d.right>s.right)&&(s=d),c+1>f&&(f=c),r(f,d.top,p-f,d.bottom)}),{start:a,end:s}}var o=e.display,l=e.doc,a=document.createDocumentFragment(),s=Ge(e.display),c=s.left,u=Math.max(o.sizerWidth,Ve(e)-o.sizer.offsetLeft)-s.right,d=t.from(),h=t.to();if(d.line==h.line)i(d.line,d.ch,h.ch);else{var f=Zr(l,d.line),p=Zr(l,h.line),m=yr(f)==yr(p),g=i(d.line,d.ch,m?f.text.length+1:null).end,v=i(h.line,m?0:null,h.ch).start;m&&(g.top0?t.blinker=setInterval(function(){t.cursorDiv.style.visibility=(n=!n)?"":"hidden"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility="hidden")}}function Re(e,t){e.doc.mode.startState&&e.doc.frontier=e.display.viewTo)){var n=+new Date+e.options.workTime,r=al(t.mode,_e(e,t.frontier)),i=[];t.iter(t.frontier,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(t.frontier>=e.display.viewFrom){var l=o.styles,a=o.text.length>e.options.maxHighlightLength,s=Er(e,o,a?al(t.mode,r):r,!0);o.styles=s.styles;var c=o.styleClasses,u=s.classes;u?o.styleClasses=u:c&&(o.styleClasses=null);for(var d=!l||l.length!=o.styles.length||c!=u&&(!c||!u||c.bgClass!=u.bgClass||c.textClass!=u.textClass),h=0;!d&&hn?(Re(e,e.options.workDelay),!0):void 0}),i.length&&At(e,function(){for(var t=0;tl;--a){if(a<=o.first)return o.first;var s=Zr(o,a-1);if(s.stateAfter&&(!n||a<=o.frontier))return a;var c=Rl(s.text,null,e.options.tabSize);(null==i||r>c)&&(i=a-1,r=c)}return i}function _e(e,t,n){var r=e.doc,i=e.display;if(!r.mode.startState)return!0;var o=je(e,t,n),l=o>r.first&&Zr(r,o-1).stateAfter;return l=l?al(r.mode,l):sl(r.mode),r.iter(o,t,function(n){Pr(e,n.text,l);var a=o==t-1||o%5==0||o>=i.viewFrom&&o2&&o.push((s.bottom+c.top)/2-n.top)}}o.push(n.bottom-n.top)}}function Ye(e,t,n){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var r=0;rn)return{map:e.measure.maps[r],cache:e.measure.caches[r],before:!0}}function Ze(e,t){t=yr(t);var n=ti(t),r=e.display.externalMeasured=new It(e.doc,t,n);r.lineN=n;var i=r.built=zr(e,r);return r.text=i.pre,Ui(e.display.lineMeasure,i.pre),r}function Qe(e,t,n,r){return tt(e,et(e,t),n,r)}function Je(e,t){if(t>=e.display.viewFrom&&t=n.lineN&&tt?(i=0,o=1,l="left"):c>t?(i=t-s,o=i+1):(a==e.length-3||t==c&&e[a+3]>t)&&(o=c-s,i=o-1,t>=c&&(l="right")),null!=i){if(r=e[a+2],s==c&&n==(r.insertLeft?"left":"right")&&(l=n),"left"==n&&0==i)for(;a&&e[a-2]==e[a-3]&&e[a-1].insertLeft;)r=e[(a-=3)+2],l="left";if("right"==n&&i==c-s)for(;au;u++){for(;a&&ji(t.line.text.charAt(o.coverStart+a));)--a;for(;o.coverStart+sbo&&0==a&&s==o.coverEnd-o.coverStart)i=l.parentNode.getBoundingClientRect();else if(xo&&e.options.lineWrapping){var d=ql(l,a,s).getClientRects();i=d.length?d["right"==r?d.length-1:0]:qo}else i=ql(l,a,s).getBoundingClientRect()||qo;if(i.left||i.right||0==a)break;s=a,a-=1,c="right"}xo&&11>bo&&(i=it(e.display.measure,i))}else{a>0&&(c=r="right");var d;i=e.options.lineWrapping&&(d=l.getClientRects()).length>1?d["right"==r?d.length-1:0]:l.getBoundingClientRect()}if(xo&&9>bo&&!a&&(!i||!i.left&&!i.right)){var h=l.parentNode.getClientRects()[0];i=h?{left:h.left,right:h.left+xt(e.display),top:h.top,bottom:h.bottom}:qo}for(var f=i.top-t.rect.top,p=i.bottom-t.rect.top,m=(f+p)/2,g=t.view.measure.heights,u=0;un.from?l(e-1):l(e,r)}r=r||Zr(e.doc,t.line),i||(i=et(e,r));var s=ii(r),c=t.ch;if(!s)return l(c);var u=co(s,c),d=a(c,u);return null!=oa&&(d.other=a(c,oa)),d}function pt(e,t){var n=0,t=me(e.doc,t);e.options.lineWrapping||(n=xt(e.display)*t.ch);var r=Zr(e.doc,t.line),i=ri(r)+qe(e.display);return{left:n,right:n,top:i,bottom:i+r.height}}function mt(e,t,n,r){var i=Fo(e,t);return i.xRel=r,n&&(i.outside=!0),i}function gt(e,t,n){var r=e.doc;if(n+=e.display.viewOffset,0>n)return mt(r.first,0,!0,-1);var i=ni(r,n),o=r.first+r.size-1;if(i>o)return mt(r.first+r.size-1,Zr(r,o).text.length,!0,1);0>t&&(t=0);for(var l=Zr(r,i);;){var a=vt(e,l,i,t,n),s=gr(l),c=s&&s.find(0,!0);if(!s||!(a.ch>c.from.ch||a.ch==c.from.ch&&a.xRel>0))return a;i=ti(l=c.to.line)}}function vt(e,t,n,r,i){function o(r){var i=ft(e,Fo(n,r),"line",t,c);return a=!0,l>i.bottom?i.left-s:lg)return mt(n,f,v,1);for(;;){if(u?f==h||f==ho(t,h,1):1>=f-h){for(var y=p>r||g-r>=r-p?h:f,x=r-(y==h?p:g);ji(t.text.charAt(y));)++y;var b=mt(n,y,y==h?m:v,-1>x?-1:x>1?1:0);return b}var w=Math.ceil(d/2),k=h+w;if(u){k=h;for(var C=0;w>C;++C)k=ho(t,k,1)}var S=o(k);S>r?(f=k,g=S,(v=a)&&(g+=1e3),d=w):(h=k,p=S,m=a,d-=w)}}function yt(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Bo){Bo=_i("pre");for(var t=0;49>t;++t)Bo.appendChild(document.createTextNode("x")),Bo.appendChild(_i("br"));Bo.appendChild(document.createTextNode("x"))}Ui(e.measure,Bo);var n=Bo.offsetHeight/50;return n>3&&(e.cachedTextHeight=n),qi(e.measure),n||1}function xt(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=_i("span","xxxxxxxxxx"),n=_i("pre",[t]);Ui(e.measure,n);var r=t.getBoundingClientRect(),i=(r.right-r.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function bt(e){e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Go},Uo?Uo.ops.push(e.curOp):e.curOp.ownsGroup=Uo={ops:[e.curOp],delayedCallbacks:[]}}function wt(e){var t=e.delayedCallbacks,n=0;do{for(;n=n.viewTo)||n.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new L(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Lt(e){e.updatedDisplay=e.mustUpdate&&M(e.cm,e.update)}function Tt(e){var t=e.cm,n=t.display;e.updatedDisplay&&H(t),e.barMeasure=p(t),n.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Qe(t,n.maxLine,n.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(n.scroller.clientWidth,n.sizer.offsetLeft+e.adjustWidthTo+$e(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,n.sizer.offsetLeft+e.adjustWidthTo-Ve(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=n.input.prepareSelection())}function Mt(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLefto;o=r){var l=new It(e.doc,Zr(e.doc,o),o);r=o+l.size,i.push(l)}return i}function Dt(e,t,n,r){null==t&&(t=e.doc.first),null==n&&(n=e.doc.first+e.doc.size),r||(r=0);var i=e.display;if(r&&nt)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Po&&br(e.doc,t)i.viewFrom?Ft(e):(i.viewFrom+=r,i.viewTo+=r);else if(t<=i.viewFrom&&n>=i.viewTo)Ft(e);else if(t<=i.viewFrom){var o=Rt(e,n,n+r,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=r):Ft(e)}else if(n>=i.viewTo){var o=Rt(e,t,t,-1);o?(i.view=i.view.slice(0,o.index),i.viewTo=o.lineN):Ft(e)}else{var l=Rt(e,t,t,-1),a=Rt(e,n,n+r,1);l&&a?(i.view=i.view.slice(0,l.index).concat(Et(e,l.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=r):Ft(e)}var s=i.externalMeasured;s&&(n=i.lineN&&t=r.viewTo)){var o=r.view[zt(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==Ii(l,n)&&l.push(n)}}}function Ft(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function zt(e,t){if(t>=e.display.viewTo)return null;if(t-=e.display.viewFrom,0>t)return null;for(var n=e.display.view,r=0;rt)return r}function Rt(e,t,n,r){var i,o=zt(e,t),l=e.display.view;if(!Po||n==e.doc.first+e.doc.size)return{index:o,lineN:n};for(var a=0,s=e.display.viewFrom;o>a;a++)s+=l[a].size;if(s!=t){if(r>0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,n+=i}for(;br(e.doc,n)!=n;){if(o==(0>r?0:l.length-1))return null;n+=r*l[o-(0>r?1:0)].size,o+=r}return{index:o,lineN:n}}function Bt(e,t,n){var r=e.display,i=r.view;0==i.length||t>=r.viewTo||n<=r.viewFrom?(r.view=Et(e,t,n),r.viewFrom=t):(r.viewFrom>t?r.view=Et(e,t,r.viewFrom).concat(r.view):r.viewFromn&&(r.view=r.view.slice(0,zt(e,n)))),r.viewTo=n}function jt(e){for(var t=e.display.view,n=0,r=0;r400}var i=e.display;Al(i.scroller,"mousedown",Ot(e,Vt)),xo&&11>bo?Al(i.scroller,"dblclick",Ot(e,function(t){if(!Ti(e,t)){var n=$t(e,t);if(n&&!Qt(e,t)&&!Gt(e.display,t)){Tl(t);var r=e.findWordAt(n);be(e.doc,r.anchor,r.head)}}})):Al(i.scroller,"dblclick",function(t){Ti(e,t)||Tl(t)}),Eo||Al(i.scroller,"contextmenu",function(t){xn(e,t)});var o,l={end:0};Al(i.scroller,"touchstart",function(t){if(!Ti(e,t)&&!n(t)){clearTimeout(o);var r=+new Date;i.activeTouch={start:r,moved:!1,prev:r-l.end<=300?l:null},1==t.touches.length&&(i.activeTouch.left=t.touches[0].pageX,i.activeTouch.top=t.touches[0].pageY)}}),Al(i.scroller,"touchmove",function(){i.activeTouch&&(i.activeTouch.moved=!0)}),Al(i.scroller,"touchend",function(n){var o=i.activeTouch;if(o&&!Gt(i,n)&&null!=o.left&&!o.moved&&new Date-o.start<300){var l,a=e.coordsChar(i.activeTouch,"page");l=!o.prev||r(o,o.prev)?new de(a,a):!o.prev.prev||r(o,o.prev.prev)?e.findWordAt(a):new de(Fo(a.line,0),me(e.doc,Fo(a.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),Tl(n)}t()}),Al(i.scroller,"touchcancel",t),Al(i.scroller,"scroll",function(){i.scroller.clientHeight&&(rn(e,i.scroller.scrollTop),on(e,i.scroller.scrollLeft,!0),Wl(e,"scroll",e))}),Al(i.scroller,"mousewheel",function(t){ln(e,t)}),Al(i.scroller,"DOMMouseScroll",function(t){ln(e,t)}),Al(i.wrapper,"scroll",function(){i.wrapper.scrollTop=i.wrapper.scrollLeft=0}),i.dragFunctions={enter:function(t){Ti(e,t)||Nl(t)},over:function(t){Ti(e,t)||(tn(e,t),Nl(t))},start:function(t){en(e,t)},drop:Ot(e,Jt),leave:function(){nn(e)}};var a=i.input.getField();Al(a,"keyup",function(t){pn.call(e,t)}),Al(a,"keydown",Ot(e,hn)),Al(a,"keypress",Ot(e,mn)),Al(a,"focus",zi(vn,e)),Al(a,"blur",zi(yn,e))}function qt(t,n,r){var i=r&&r!=e.Init;if(!n!=!i){var o=t.display.dragFunctions,l=n?Al:Hl;l(t.display.scroller,"dragstart",o.start),l(t.display.scroller,"dragenter",o.enter),l(t.display.scroller,"dragover",o.over),l(t.display.scroller,"dragleave",o.leave),l(t.display.scroller,"drop",o.drop)}}function Ut(e){var t=e.display;t.lastWrapHeight==t.wrapper.clientHeight&&t.lastWrapWidth==t.wrapper.clientWidth||(t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize())}function Gt(e,t){for(var n=wi(t);n!=e.wrapper;n=n.parentNode)if(!n||1==n.nodeType&&"true"==n.getAttribute("cm-ignore-events")||n.parentNode==e.sizer&&n!=e.mover)return!0}function $t(e,t,n,r){var i=e.display;if(!n&&"true"==wi(t).getAttribute("cm-not-content"))return null;var o,l,a=i.lineSpace.getBoundingClientRect();try{o=t.clientX-a.left,l=t.clientY-a.top}catch(t){return null}var s,c=gt(e,o,l);if(r&&1==c.xRel&&(s=Zr(e.doc,c.line).text).length==c.ch){var u=Rl(s,s.length,e.options.tabSize)-s.length;c=Fo(c.line,Math.max(0,Math.round((o-Ge(e.display).left)/xt(e.display))-u))}return c}function Vt(e){var t=this,n=t.display;if(!(Ti(t,e)||n.activeTouch&&n.input.supportsTouch())){if(n.shift=e.shiftKey,Gt(n,e))return void(wo||(n.scroller.draggable=!1,setTimeout(function(){n.scroller.draggable=!0},100)));if(!Qt(t,e)){var r=$t(t,e);switch(window.focus(),ki(e)){case 1:t.state.selectingText?t.state.selectingText(e):r?Kt(t,e,r):wi(e)==n.scroller&&Tl(e);break;case 2:wo&&(t.state.lastMiddleDown=+new Date),r&&be(t.doc,r),setTimeout(function(){n.input.focus()},20),Tl(e);break;case 3:Eo?xn(t,e):gn(t)}}}}function Kt(e,t,n){xo?setTimeout(zi(Y,e),0):e.curOp.focus=Gi();var r,i=+new Date;_o&&_o.time>i-400&&0==zo(_o.pos,n)?r="triple":jo&&jo.time>i-400&&0==zo(jo.pos,n)?(r="double",_o={time:i,pos:n}):(r="single",jo={time:i,pos:n});var o,l=e.doc.sel,a=Oo?t.metaKey:t.ctrlKey;e.options.dragDrop&&Jl&&!e.isReadOnly()&&"single"==r&&(o=l.contains(n))>-1&&(zo((o=l.ranges[o]).from(),n)<0||n.xRel>0)&&(zo(o.to(),n)>0||n.xRel<0)?Xt(e,t,n,a):Yt(e,t,n,r,a)}function Xt(e,t,n,r){var i=e.display,o=+new Date,l=Ot(e,function(a){wo&&(i.scroller.draggable=!1),e.state.draggingText=!1,Hl(document,"mouseup",l),Hl(i.scroller,"drop",l),Math.abs(t.clientX-a.clientX)+Math.abs(t.clientY-a.clientY)<10&&(Tl(a),!r&&+new Date-200=p;p++){var v=Zr(c,p).text,y=Bl(v,s,o);s==f?i.push(new de(Fo(p,y),Fo(p,y))):v.length>y&&i.push(new de(Fo(p,y),Fo(p,Bl(v,f,o))))}i.length||i.push(new de(n,n)),Te(c,he(h.ranges.slice(0,d).concat(i),d),{origin:"*mouse",scroll:!1}),e.scrollIntoView(t)}else{var x=u,b=x.anchor,w=t;if("single"!=r){if("double"==r)var k=e.findWordAt(t);else var k=new de(Fo(t.line,0),me(c,Fo(t.line+1,0)));zo(k.anchor,b)>0?(w=k.head,b=X(x.from(),k.anchor)):(w=k.anchor,b=K(x.to(),k.head))}var i=h.ranges.slice(0);i[d]=new de(me(c,b),w),Te(c,he(i,d),Fl)}}function l(t){var n=++y,i=$t(e,t,!0,"rect"==r);if(i)if(0!=zo(i,g)){e.curOp.focus=Gi(),o(i);var a=b(s,c);(i.line>=a.to||i.linev.bottom?20:0;u&&setTimeout(Ot(e,function(){y==n&&(s.scroller.scrollTop+=u,l(t))}),50)}}function a(t){e.state.selectingText=!1,y=1/0,Tl(t),s.input.focus(),Hl(document,"mousemove",x),Hl(document,"mouseup",w),c.history.lastSelOrigin=null}var s=e.display,c=e.doc;Tl(t);var u,d,h=c.sel,f=h.ranges;if(i&&!t.shiftKey?(d=c.sel.contains(n),u=d>-1?f[d]:new de(n,n)):(u=c.sel.primary(),d=c.sel.primIndex),t.altKey)r="rect",i||(u=new de(n,n)),n=$t(e,t,!0,!0),d=-1;else if("double"==r){var p=e.findWordAt(n);u=e.display.shift||c.extend?xe(c,u,p.anchor,p.head):p}else if("triple"==r){var m=new de(Fo(n.line,0),me(c,Fo(n.line+1,0)));u=e.display.shift||c.extend?xe(c,u,m.anchor,m.head):m}else u=xe(c,u,n);i?-1==d?(d=f.length,Te(c,he(f.concat([u]),d),{scroll:!1,origin:"*mouse"})):f.length>1&&f[d].empty()&&"single"==r&&!t.shiftKey?(Te(c,he(f.slice(0,d).concat(f.slice(d+1)),0),{scroll:!1,origin:"*mouse"}),h=c.sel):ke(c,d,u,Fl):(d=0,Te(c,new ue([u],0),Fl),h=c.sel);var g=n,v=s.wrapper.getBoundingClientRect(),y=0,x=Ot(e,function(e){ki(e)?l(e):a(e)}),w=Ot(e,a);e.state.selectingText=w,Al(document,"mousemove",x),Al(document,"mouseup",w)}function Zt(e,t,n,r){try{var i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;r&&Tl(t);var l=e.display,a=l.lineDiv.getBoundingClientRect(); -if(o>a.bottom||!Ni(e,n))return bi(t);o-=a.top-l.viewOffset;for(var s=0;s=i){var u=ni(e.doc,o),d=e.options.gutters[s];return Wl(e,n,e,u,d,t),bi(t)}}}function Qt(e,t){return Zt(e,t,"gutterClick",!0)}function Jt(e){var t=this;if(nn(t),!Ti(t,e)&&!Gt(t.display,e)){Tl(e),xo&&($o=+new Date);var n=$t(t,e,!0),r=e.dataTransfer.files;if(n&&!t.isReadOnly())if(r&&r.length&&window.FileReader&&window.File)for(var i=r.length,o=Array(i),l=0,a=function(e,r){if(!t.options.allowDropFileTypes||-1!=Ii(t.options.allowDropFileTypes,e.type)){var a=new FileReader;a.onload=Ot(t,function(){var e=a.result;if(/[\x00-\x08\x0e-\x1f]{2}/.test(e)&&(e=""),o[r]=e,++l==i){n=me(t.doc,n);var s={from:n,to:n,text:t.doc.splitLines(o.join(t.doc.lineSeparator())),origin:"paste"};Tn(t.doc,s),Le(t.doc,fe(n,Qo(s)))}}),a.readAsText(e)}},s=0;i>s;++s)a(r[s],s);else{if(t.state.draggingText&&t.doc.sel.contains(n)>-1)return t.state.draggingText(e),void setTimeout(function(){t.display.input.focus()},20);try{var o=e.dataTransfer.getData("Text");if(o){if(t.state.draggingText&&!(Oo?e.altKey:e.ctrlKey))var c=t.listSelections();if(Me(t.doc,fe(n,n)),c)for(var s=0;sl.clientWidth,s=l.scrollHeight>l.clientHeight;if(r&&a||i&&s){if(i&&Oo&&wo)e:for(var c=t.target,u=o.view;c!=l;c=c.parentNode)for(var d=0;dh?f=Math.max(0,f+h-50):p=Math.min(e.doc.height,p+h+50),A(e,{top:f,bottom:p})}20>Vo&&(null==o.wheelStartX?(o.wheelStartX=l.scrollLeft,o.wheelStartY=l.scrollTop,o.wheelDX=r,o.wheelDY=i,setTimeout(function(){if(null!=o.wheelStartX){var e=l.scrollLeft-o.wheelStartX,t=l.scrollTop-o.wheelStartY,n=t&&o.wheelDY&&t/o.wheelDY||e&&o.wheelDX&&e/o.wheelDX;o.wheelStartX=o.wheelStartY=null,n&&(Ko=(Ko*Vo+n)/(Vo+1),++Vo)}},200)):(o.wheelDX+=r,o.wheelDY+=i))}}function an(e,t,n){if("string"==typeof t&&(t=cl[t],!t))return!1;e.display.input.ensurePolled();var r=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n&&(e.display.shift=!1),i=t(e)!=Dl}finally{e.display.shift=r,e.state.suppressEdits=!1}return i}function sn(e,t,n){for(var r=0;rbo&&27==e.keyCode&&(e.returnValue=!1);var n=e.keyCode;t.display.shift=16==n||e.shiftKey;var r=un(t,e);So&&(Zo=r?n:null,!r&&88==n&&!na&&(Oo?e.metaKey:e.ctrlKey)&&t.replaceSelection("",null,"cut")),18!=n||/\bCodeMirror-crosshair\b/.test(t.display.lineDiv.className)||fn(t)}}function fn(e){function t(e){18!=e.keyCode&&e.altKey||(Yl(n,"CodeMirror-crosshair"),Hl(document,"keyup",t),Hl(document,"mouseover",t))}var n=e.display.lineDiv;Zl(n,"CodeMirror-crosshair"),Al(document,"keyup",t),Al(document,"mouseover",t)}function pn(e){16==e.keyCode&&(this.doc.sel.shift=!1),Ti(this,e)}function mn(e){var t=this;if(!(Gt(t.display,e)||Ti(t,e)||e.ctrlKey&&!e.altKey||Oo&&e.metaKey)){var n=e.keyCode,r=e.charCode;if(So&&n==Zo)return Zo=null,void Tl(e);if(!So||e.which&&!(e.which<10)||!un(t,e)){var i=String.fromCharCode(null==r?n:r);dn(t,e,i)||t.display.input.onKeyPress(e)}}}function gn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,yn(e))},100)}function vn(e){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),"nocursor"!=e.options.readOnly&&(e.state.focused||(Wl(e,"focus",e),e.state.focused=!0,Zl(e.display.wrapper,"CodeMirror-focused"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),wo&&setTimeout(function(){e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),ze(e))}function yn(e){e.state.delayingBlurEvent||(e.state.focused&&(Wl(e,"blur",e),e.state.focused=!1,Yl(e.display.wrapper,"CodeMirror-focused")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function xn(e,t){Gt(e.display,t)||bn(e,t)||Ti(e,t,"contextmenu")||e.display.input.onContextMenu(t)}function bn(e,t){return Ni(e,"gutterContextMenu")?Zt(e,t,"gutterContextMenu",!1):!1}function wn(e,t){if(zo(e,t.from)<0)return e;if(zo(e,t.to)<=0)return Qo(t);var n=e.line+t.text.length-(t.to.line-t.from.line)-1,r=e.ch;return e.line==t.to.line&&(r+=Qo(t).ch-t.to.ch),Fo(n,r)}function kn(e,t){for(var n=[],r=0;r=0;--i)Mn(e,{from:r[i].from,to:r[i].to,text:i?[""]:t.text});else Mn(e,t)}}function Mn(e,t){if(1!=t.text.length||""!=t.text[0]||0!=zo(t.from,t.to)){var n=kn(e,t);ci(e,t,n,e.cm?e.cm.curOp.id:NaN),On(e,t,n,or(e,t));var r=[];Xr(e,function(e,n){n||-1!=Ii(r,e.history)||(xi(e.history,t),r.push(e.history)),On(e,t,null,or(e,t))})}}function Nn(e,t,n){if(!e.cm||!e.cm.state.suppressEdits){for(var r,i=e.history,o=e.sel,l="undo"==t?i.done:i.undone,a="undo"==t?i.undone:i.done,s=0;s=0;--s){var d=r.changes[s];if(d.origin=t,u&&!Ln(e,d,!1))return void(l.length=0);c.push(li(e,d));var h=s?kn(e,d):Wi(l);On(e,d,h,ar(e,d)),!s&&e.cm&&e.cm.scrollIntoView({from:d.from,to:Qo(d)});var f=[];Xr(e,function(e,t){t||-1!=Ii(f,e.history)||(xi(e.history,d),f.push(e.history)),On(e,d,null,ar(e,d))})}}}}function An(e,t){if(0!=t&&(e.first+=t,e.sel=new ue(Ei(e.sel.ranges,function(e){return new de(Fo(e.anchor.line+t,e.anchor.ch),Fo(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){Dt(e.cm,e.first,e.first-t,t);for(var n=e.cm.display,r=n.viewFrom;re.lastLine())){if(t.from.lineo&&(t={from:t.from,to:Fo(o,Zr(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Qr(e,t.from,t.to),n||(n=kn(e,t)),e.cm?Hn(e.cm,t,r):$r(e,t,r),Me(e,n,Pl)}}function Hn(e,t,n){var r=e.doc,i=e.display,l=t.from,a=t.to,s=!1,c=l.line;e.options.lineWrapping||(c=ti(yr(Zr(r,l.line))),r.iter(c,a.line+1,function(e){return e==i.maxLine?(s=!0,!0):void 0})),r.sel.contains(t.from,t.to)>-1&&Mi(e),$r(r,t,n,o(e)),e.options.lineWrapping||(r.iter(c,l.line+t.text.length,function(e){var t=d(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0)),r.frontier=Math.min(r.frontier,l.line),Re(e,400);var u=t.text.length-(a.line-l.line)-1;t.full?Dt(e):l.line!=a.line||1!=t.text.length||Gr(e.doc,t)?Dt(e,l.line,a.line+1,u):Pt(e,l.line,"text");var h=Ni(e,"changes"),f=Ni(e,"change");if(f||h){var p={from:l,to:a,text:t.text,removed:t.removed,origin:t.origin};f&&Si(e,"change",e,p),h&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(p)}e.display.selForContextMenu=null}function Wn(e,t,n,r,i){if(r||(r=n),zo(r,n)<0){var o=r;r=n,n=o}"string"==typeof t&&(t=e.splitLines(t)),Tn(e,{from:n,to:r,text:t,origin:i})}function In(e,t){if(!Ti(e,"scrollCursorIntoView")){var n=e.display,r=n.sizer.getBoundingClientRect(),i=null;if(t.top+r.top<0?i=!0:t.bottom+r.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!Mo){var o=_i("div","​",null,"position: absolute; top: "+(t.top-n.viewOffset-qe(e.display))+"px; height: "+(t.bottom-t.top+$e(e)+n.barHeight)+"px; left: "+t.left+"px; width: 2px;");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}function En(e,t,n,r){null==r&&(r=0);for(var i=0;5>i;i++){var o=!1,l=ft(e,t),a=n&&n!=t?ft(e,n):l,s=Pn(e,Math.min(l.left,a.left),Math.min(l.top,a.top)-r,Math.max(l.left,a.left),Math.max(l.bottom,a.bottom)+r),c=e.doc.scrollTop,u=e.doc.scrollLeft;if(null!=s.scrollTop&&(rn(e,s.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(o=!0)),null!=s.scrollLeft&&(on(e,s.scrollLeft),Math.abs(e.doc.scrollLeft-u)>1&&(o=!0)),!o)break}return l}function Dn(e,t,n,r,i){var o=Pn(e,t,n,r,i);null!=o.scrollTop&&rn(e,o.scrollTop),null!=o.scrollLeft&&on(e,o.scrollLeft)}function Pn(e,t,n,r,i){var o=e.display,l=yt(e.display);0>n&&(n=0);var a=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:o.scroller.scrollTop,s=Ke(e),c={};i-n>s&&(i=n+s);var u=e.doc.height+Ue(o),d=l>n,h=i>u-l;if(a>n)c.scrollTop=d?0:n;else if(i>a+s){var f=Math.min(n,(h?u:i)-s);f!=a&&(c.scrollTop=f)}var p=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:o.scroller.scrollLeft,m=Ve(e)-(e.options.fixedGutter?o.gutters.offsetWidth:0),g=r-t>m;return g&&(r=t+m),10>t?c.scrollLeft=0:p>t?c.scrollLeft=Math.max(0,t-(g?0:10)):r>m+p-3&&(c.scrollLeft=r+(g?0:10)-m),c}function Fn(e,t,n){null==t&&null==n||Rn(e),null!=t&&(e.curOp.scrollLeft=(null==e.curOp.scrollLeft?e.doc.scrollLeft:e.curOp.scrollLeft)+t),null!=n&&(e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+n)}function zn(e){Rn(e);var t=e.getCursor(),n=t,r=t;e.options.lineWrapping||(n=t.ch?Fo(t.line,t.ch-1):t,r=Fo(t.line,t.ch+1)),e.curOp.scrollToPos={from:n,to:r,margin:e.options.cursorScrollMargin,isCursor:!0}}function Rn(e){var t=e.curOp.scrollToPos;if(t){e.curOp.scrollToPos=null;var n=pt(e,t.from),r=pt(e,t.to),i=Pn(e,Math.min(n.left,r.left),Math.min(n.top,r.top)-t.margin,Math.max(n.right,r.right),Math.max(n.bottom,r.bottom)+t.margin);e.scrollTo(i.scrollLeft,i.scrollTop)}}function Bn(e,t,n,r){var i,o=e.doc;null==n&&(n="add"),"smart"==n&&(o.mode.indent?i=_e(e,t):n="prev");var l=e.options.tabSize,a=Zr(o,t),s=Rl(a.text,null,l);a.stateAfter&&(a.stateAfter=null);var c,u=a.text.match(/^\s*/)[0];if(r||/\S/.test(a.text)){if("smart"==n&&(c=o.mode.indent(i,a.text.slice(u.length),a.text),c==Dl||c>150)){if(!r)return;n="prev"}}else c=0,n="not";"prev"==n?c=t>o.first?Rl(Zr(o,t-1).text,null,l):0:"add"==n?c=s+e.options.indentUnit:"subtract"==n?c=s-e.options.indentUnit:"number"==typeof n&&(c=s+n),c=Math.max(0,c);var d="",h=0;if(e.options.indentWithTabs)for(var f=Math.floor(c/l);f;--f)h+=l,d+=" ";if(c>h&&(d+=Hi(c-h)),d!=u)return Wn(o,d,Fo(t,0),Fo(t,u.length),"+input"),a.stateAfter=null,!0;for(var f=0;f=0;t--)Wn(e.doc,"",r[t].from,r[t].to,"+delete");zn(e)})}function qn(e,t,n,r,i){function o(){var t=a+n;return t=e.first+e.size?!1:(a=t,u=Zr(e,t))}function l(e){var t=(i?ho:fo)(u,s,n,!0);if(null==t){if(e||!o())return!1;s=i?(0>n?io:ro)(u):0>n?u.text.length:0}else s=t;return!0}var a=t.line,s=t.ch,c=n,u=Zr(e,a);if("char"==r)l();else if("column"==r)l(!0);else if("word"==r||"group"==r)for(var d=null,h="group"==r,f=e.cm&&e.cm.getHelper(t,"wordChars"),p=!0;!(0>n)||l(!p);p=!1){var m=u.text.charAt(s)||"\n",g=Ri(m,f)?"w":h&&"\n"==m?"n":!h||/\s/.test(m)?null:"p";if(!h||p||g||(g="s"),d&&d!=g){0>n&&(n=1,l());break}if(g&&(d=g),n>0&&!l(!p))break}var v=We(e,Fo(a,s),t,c,!0);return zo(t,v)||(v.hitSide=!0),v}function Un(e,t,n,r){var i,o=e.doc,l=t.left;if("page"==r){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);i=t.top+n*(a-(0>n?1.5:.5)*yt(e.display))}else"line"==r&&(i=n>0?t.bottom+3:t.top-3);for(;;){var s=gt(e,l,i);if(!s.outside)break;if(0>n?0>=i:i>=o.height){s.hitSide=!0;break}i+=5*n}return s}function Gn(t,n,r,i){e.defaults[t]=n,r&&(el[t]=i?function(e,t,n){n!=tl&&r(e,t,n)}:r)}function $n(e){for(var t,n,r,i,o=e.split(/-(?!$)/),e=o[o.length-1],l=0;l0||0==l&&o.clearWhenEmpty!==!1)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=_i("span",[o.replacedWith],"CodeMirror-widget"),r.handleMouseEvents||o.widgetNode.setAttribute("cm-ignore-events","true"),r.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(vr(e,t.line,t,n,o)||t.line!=n.line&&vr(e,n.line,t,n,o))throw new Error("Inserting collapsed marker partially overlapping an existing one");Po=!0}o.addToHistory&&ci(e,{from:t,to:n,origin:"markText"},e.sel,NaN);var a,s=t.line,c=e.cm;if(e.iter(s,n.line+1,function(e){c&&o.collapsed&&!c.options.lineWrapping&&yr(e)==c.display.maxLine&&(a=!0),o.collapsed&&s!=t.line&&ei(e,0),nr(e,new Jn(o,s==t.line?t.ch:null,s==n.line?n.ch:null)),++s}),o.collapsed&&e.iter(t.line,n.line+1,function(t){kr(e,t)&&ei(t,0)}),o.clearOnEnter&&Al(o,"beforeCursorEnter",function(){o.clear()}),o.readOnly&&(Do=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++ml,o.atomic=!0),c){if(a&&(c.curOp.updateMaxLine=!0),o.collapsed)Dt(c,t.line,n.line+1);else if(o.className||o.title||o.startStyle||o.endStyle||o.css)for(var u=t.line;u<=n.line;u++)Pt(c,u,"text");o.atomic&&Ae(c.doc),Si(c,"markerAdded",c,o)}return o}function Xn(e,t,n,r,i){r=Fi(r),r.shared=!1;var o=[Kn(e,t,n,r,i)],l=o[0],a=r.widgetNode;return Xr(e,function(e){a&&(r.widgetNode=a.cloneNode(!0)),o.push(Kn(e,me(e,t),me(e,n),r,i));for(var s=0;s=t:o.to>t);(r||(r=[])).push(new Jn(l,o.from,s?null:o.to))}}return r}function ir(e,t,n){if(e)for(var r,i=0;i=t:o.to>t);if(a||o.from==t&&"bookmark"==l.type&&(!n||o.marker.insertLeft)){var s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from0&&a)for(var d=0;dd;++d)p.push(m);p.push(s)}return p}function lr(e){for(var t=0;t0)){var u=[s,1],d=zo(c.from,a.from),h=zo(c.to,a.to);(0>d||!l.inclusiveLeft&&!d)&&u.push({from:c.from,to:a.from}),(h>0||!l.inclusiveRight&&!h)&&u.push({from:a.to,to:c.to}),i.splice.apply(i,u),s+=u.length-1}}return i}function cr(e){var t=e.markedSpans;if(t){for(var n=0;n=0&&0>=d||0>=u&&d>=0)&&(0>=u&&(zo(c.to,n)>0||s.marker.inclusiveRight&&i.inclusiveLeft)||u>=0&&(zo(c.from,r)<0||s.marker.inclusiveLeft&&i.inclusiveRight)))return!0}}}function yr(e){for(var t;t=mr(e);)e=t.find(-1,!0).line;return e}function xr(e){for(var t,n;t=gr(e);)e=t.find(1,!0).line,(n||(n=[])).push(e);return n}function br(e,t){var n=Zr(e,t),r=yr(n);return n==r?t:ti(r)}function wr(e,t){if(t>e.lastLine())return t;var n,r=Zr(e,t);if(!kr(e,r))return t;for(;n=gr(r);)r=n.find(1,!0).line;return ti(r)+1}function kr(e,t){var n=Po&&t.markedSpans;if(n)for(var r,i=0;io;o++){i&&(i[0]=e.innerMode(t,r).mode);var l=t.token(n,r);if(n.pos>n.start)return l}throw new Error("Mode "+t.name+" failed to advance stream.")}function Wr(e,t,n,r){function i(e){return{start:d.start,end:d.pos,string:d.current(),type:o||null,state:e?al(l.mode,u):u}}var o,l=e.doc,a=l.mode;t=me(l,t);var s,c=Zr(l,t.line),u=_e(e,t.line,n),d=new pl(c.text,e.options.tabSize);for(r&&(s=[]);(r||d.pose.options.maxHighlightLength?(a=!1,l&&Pr(e,t,r,d.pos),d.pos=t.length,s=null):s=Ar(Hr(n,d,r,h),o),h){var f=h[0].name;f&&(s="m-"+(s?f+" "+s:f))}if(!a||u!=s){for(;cc;){var r=i[s];r>e&&i.splice(s,1,e,i[s+1],r),s+=2,c=Math.min(e,r)}if(t)if(a.opaque)i.splice(n,s-n,e,"cm-overlay "+t),s=n+2;else for(;s>n;n+=2){var o=i[n+1];i[n+1]=(o?o+" ":"")+"cm-overlay "+t}},o)}return{styles:i,classes:o.bgClass||o.textClass?o:null}}function Dr(e,t,n){if(!t.styles||t.styles[0]!=e.state.modeGen){var r=_e(e,ti(t)),i=Er(e,t,t.text.length>e.options.maxHighlightLength?al(e.doc.mode,r):r);t.stateAfter=r,t.styles=i.styles,i.classes?t.styleClasses=i.classes:t.styleClasses&&(t.styleClasses=null),n===e.doc.frontier&&e.doc.frontier++}return t.styles}function Pr(e,t,n,r){var i=e.doc.mode,o=new pl(t,e.options.tabSize);for(o.start=o.pos=r||0,""==t&&Or(i,n);!o.eol();)Hr(i,o,n),o.start=o.pos}function Fr(e,t){if(!e||/^\s*$/.test(e))return null;var n=t.addModeClass?wl:bl;return n[e]||(n[e]=e.replace(/\S+/g,"cm-$&"))}function zr(e,t){var n=_i("span",null,null,wo?"padding-right: .1px":null),r={pre:_i("pre",[n],"CodeMirror-line"),content:n,col:0,pos:0,cm:e,splitSpaces:(xo||wo)&&e.getOption("lineWrapping")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o,l=i?t.rest[i-1]:t.line;r.pos=0,r.addToken=Br,Qi(e.display.measure)&&(o=ii(l))&&(r.addToken=_r(r.addToken,o)),r.map=[];var a=t!=e.display.externalMeasured&&ti(l);Ur(l,r,Dr(e,l,a)),l.styleClasses&&(l.styleClasses.bgClass&&(r.bgClass=Vi(l.styleClasses.bgClass,r.bgClass||"")),l.styleClasses.textClass&&(r.textClass=Vi(l.styleClasses.textClass,r.textClass||""))),0==r.map.length&&r.map.push(0,0,r.content.appendChild(Zi(e.display.measure))),0==i?(t.measure.map=r.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(r.map),(t.measure.caches||(t.measure.caches=[])).push({}))}return wo&&/\bcm-tab\b/.test(r.content.lastChild.className)&&(r.content.className="cm-tab-wrap-hack"),Wl(e,"renderLine",e,t.line,r.pre),r.pre.className&&(r.textClass=Vi(r.pre.className,r.textClass||"")),r}function Rr(e){var t=_i("span","•","cm-invalidchar");return t.title="\\u"+e.charCodeAt(0).toString(16),t.setAttribute("aria-label",t.title),t}function Br(e,t,n,r,i,o,l){if(t){var a=e.splitSpaces?t.replace(/ {3,}/g,jr):t,s=e.cm.state.specialChars,c=!1;if(s.test(t))for(var u=document.createDocumentFragment(),d=0;;){s.lastIndex=d;var h=s.exec(t),f=h?h.index-d:t.length-d;if(f){var p=document.createTextNode(a.slice(d,d+f));xo&&9>bo?u.appendChild(_i("span",[p])):u.appendChild(p),e.map.push(e.pos,e.pos+f,p),e.col+=f,e.pos+=f}if(!h)break;if(d+=f+1," "==h[0]){var m=e.cm.options.tabSize,g=m-e.col%m,p=u.appendChild(_i("span",Hi(g),"cm-tab"));p.setAttribute("role","presentation"),p.setAttribute("cm-text"," "),e.col+=g}else if("\r"==h[0]||"\n"==h[0]){var p=u.appendChild(_i("span","\r"==h[0]?"␍":"␤","cm-invalidchar"));p.setAttribute("cm-text",h[0]),e.col+=1}else{var p=e.cm.options.specialCharPlaceholder(h[0]);p.setAttribute("cm-text",h[0]),xo&&9>bo?u.appendChild(_i("span",[p])):u.appendChild(p),e.col+=1}e.map.push(e.pos,e.pos+1,p),e.pos++}else{e.col+=t.length;var u=document.createTextNode(a);e.map.push(e.pos,e.pos+t.length,u),xo&&9>bo&&(c=!0),e.pos+=t.length}if(n||r||i||c||l){var v=n||"";r&&(v+=r),i&&(v+=i);var y=_i("span",[u],v,l);return o&&(y.title=o),e.content.appendChild(y)}e.content.appendChild(u)}}function jr(e){for(var t=" ",n=0;nc&&h.from<=c)break}if(h.to>=u)return e(n,r,i,o,l,a,s);e(n,r.slice(0,h.to-c),i,o,null,a,s),o=null,r=r.slice(h.to-c),c=h.to}}}function qr(e,t,n,r){var i=!r&&n.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!r&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement("span"))),i.setAttribute("cm-marker",n.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t}function Ur(e,t,n){var r=e.markedSpans,i=e.text,o=0;if(r)for(var l,a,s,c,u,d,h,f=i.length,p=0,m=1,g="",v=0;;){if(v==p){s=c=u=d=a="",h=null,v=1/0;for(var y,x=[],b=0;bp||k.collapsed&&w.to==p&&w.from==p)?(null!=w.to&&w.to!=p&&v>w.to&&(v=w.to,c=""),k.className&&(s+=" "+k.className),k.css&&(a=(a?a+";":"")+k.css),k.startStyle&&w.from==p&&(u+=" "+k.startStyle),k.endStyle&&w.to==v&&(y||(y=[])).push(k.endStyle,w.to),k.title&&!d&&(d=k.title),k.collapsed&&(!h||fr(h.marker,k)<0)&&(h=w)):w.from>p&&v>w.from&&(v=w.from)}if(y)for(var b=0;b=f)break;for(var C=Math.min(f,v);;){if(g){var S=p+g.length;if(!h){var L=S>C?g.slice(0,C-p):g;t.addToken(t,L,l?l+s:s,u,p+L.length==v?c:"",d,a)}if(S>=C){g=g.slice(C-p),p=C;break}p=S,u=""}g=i.slice(o,o=n[m++]),l=Fr(n[m++],t.cm.options)}}else for(var m=1;mn;++n)o.push(new xl(c[n],i(n),r));return o}var a=t.from,s=t.to,c=t.text,u=Zr(e,a.line),d=Zr(e,s.line),h=Wi(c),f=i(c.length-1),p=s.line-a.line;if(t.full)e.insert(0,l(0,c.length)),e.remove(c.length,e.size-c.length);else if(Gr(e,t)){var m=l(0,c.length-1);o(d,d.text,f),p&&e.remove(a.line,p),m.length&&e.insert(a.line,m)}else if(u==d)if(1==c.length)o(u,u.text.slice(0,a.ch)+h+u.text.slice(s.ch),f);else{var m=l(1,c.length-1);m.push(new xl(h+u.text.slice(s.ch),f,r)),o(u,u.text.slice(0,a.ch)+c[0],i(0)),e.insert(a.line+1,m)}else if(1==c.length)o(u,u.text.slice(0,a.ch)+c[0]+d.text.slice(s.ch),i(0)),e.remove(a.line+1,p);else{o(u,u.text.slice(0,a.ch)+c[0],i(0)),o(d,h+d.text.slice(s.ch),f);var m=l(1,c.length-1);p>1&&e.remove(a.line+1,p-1),e.insert(a.line+1,m)}Si(e,"change",e,t)}function Vr(e){this.lines=e,this.parent=null;for(var t=0,n=0;tt||t>=e.size)throw new Error("There is no line "+(t+e.first)+" in the document.");for(var n=e;!n.lines;)for(var r=0;;++r){var i=n.children[r],o=i.chunkSize();if(o>t){n=i;break}t-=o}return n.lines[t]}function Qr(e,t,n){var r=[],i=t.line;return e.iter(t.line,n.line+1,function(e){var o=e.text;i==n.line&&(o=o.slice(0,n.ch)),i==t.line&&(o=o.slice(t.ch)),r.push(o),++i}),r}function Jr(e,t,n){var r=[];return e.iter(t,n,function(e){r.push(e.text)}),r}function ei(e,t){var n=t-e.height;if(n)for(var r=e;r;r=r.parent)r.height+=n}function ti(e){if(null==e.parent)return null;for(var t=e.parent,n=Ii(t.lines,e),r=t.parent;r;t=r,r=r.parent)for(var i=0;r.children[i]!=t;++i)n+=r.children[i].chunkSize();return n+t.first}function ni(e,t){var n=e.first;e:do{for(var r=0;rt){e=i;continue e}t-=o,n+=i.chunkSize()}return n}while(!e.lines);for(var r=0;rt)break;t-=a}return n+r}function ri(e){e=yr(e);for(var t=0,n=e.parent,r=0;r1&&!e.done[e.done.length-2].ranges?(e.done.pop(),Wi(e.done)):void 0}function ci(e,t,n,r){var i=e.history;i.undone.length=0;var o,l=+new Date;if((i.lastOp==r||i.lastOrigin==t.origin&&t.origin&&("+"==t.origin.charAt(0)&&e.cm&&i.lastModTime>l-e.cm.options.historyEventDelay||"*"==t.origin.charAt(0)))&&(o=si(i,i.lastOp==r))){var a=Wi(o.changes);0==zo(t.from,t.to)&&0==zo(t.from,a.to)?a.to=Qo(t):o.changes.push(li(e,t))}else{var s=Wi(i.done);for(s&&s.ranges||hi(e.sel,i.done),o={changes:[li(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(n),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=l,i.lastOp=i.lastSelOp=r,i.lastOrigin=i.lastSelOrigin=t.origin,a||Wl(e,"historyAdded")}function ui(e,t,n,r){var i=t.charAt(0);return"*"==i||"+"==i&&n.ranges.length==r.ranges.length&&n.somethingSelected()==r.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}function di(e,t,n,r){var i=e.history,o=r&&r.origin;n==i.lastSelOp||o&&i.lastSelOrigin==o&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==o||ui(e,o,Wi(i.done),t))?i.done[i.done.length-1]=t:hi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=o,i.lastSelOp=n,r&&r.clearRedo!==!1&&ai(i.undone)}function hi(e,t){var n=Wi(t);n&&n.ranges&&n.equals(e)||t.push(e)}function fi(e,t,n,r){var i=t["spans_"+e.id],o=0;e.iter(Math.max(e.first,n),Math.min(e.first+e.size,r),function(n){n.markedSpans&&((i||(i=t["spans_"+e.id]={}))[o]=n.markedSpans),++o})}function pi(e){if(!e)return null;for(var t,n=0;n-1&&(Wi(a)[d]=u[d],delete u[d])}}}return i}function vi(e,t,n,r){n0?r.slice():Ol:r||Ol}function Si(e,t){function n(e){return function(){e.apply(null,o)}}var r=Ci(e,t,!1);if(r.length){var i,o=Array.prototype.slice.call(arguments,2);Uo?i=Uo.delayedCallbacks:Il?i=Il:(i=Il=[],setTimeout(Li,0));for(var l=0;l0}function Ai(e){e.prototype.on=function(e,t){Al(this,e,t)},e.prototype.off=function(e,t){Hl(this,e,t)}}function Oi(){this.id=null}function Hi(e){for(;jl.length<=e;)jl.push(Wi(jl)+" ");return jl[e]}function Wi(e){return e[e.length-1]}function Ii(e,t){for(var n=0;n-1&&Gl(e)?!0:t.test(e):Gl(e)}function Bi(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}function ji(e){return e.charCodeAt(0)>=768&&$l.test(e)}function _i(e,t,n,r){var i=document.createElement(e);if(n&&(i.className=n),r&&(i.style.cssText=r),"string"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o0;--t)e.removeChild(e.firstChild);return e}function Ui(e,t){return qi(e).appendChild(t)}function Gi(){for(var e=document.activeElement;e&&e.root&&e.root.activeElement;)e=e.root.activeElement;return e}function $i(e){return new RegExp("(^|\\s)"+e+"(?:$|\\s)\\s*")}function Vi(e,t){for(var n=e.split(" "),r=0;r2&&!(xo&&8>bo))}var n=Kl?_i("span","​"):_i("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");return n.setAttribute("cm-text",""),n}function Qi(e){if(null!=Xl)return Xl;var t=Ui(e,document.createTextNode("AخA")),n=ql(t,0,1).getBoundingClientRect();if(!n||n.left==n.right)return!1;var r=ql(t,1,2).getBoundingClientRect();return Xl=r.right-n.right<3}function Ji(e){if(null!=ra)return ra;var t=Ui(e,_i("span","x")),n=t.getBoundingClientRect(),r=ql(t,0,1).getBoundingClientRect();return ra=Math.abs(n.left-r.left)>1}function eo(e,t,n,r){if(!e)return r(t,n,"ltr");for(var i=!1,o=0;ot||t==n&&l.to==t)&&(r(Math.max(l.from,t),Math.min(l.to,n),1==l.level?"rtl":"ltr"),i=!0)}i||r(t,n,"ltr")}function to(e){return e.level%2?e.to:e.from}function no(e){return e.level%2?e.from:e.to}function ro(e){var t=ii(e);return t?to(t[0]):0}function io(e){var t=ii(e);return t?no(Wi(t)):e.text.length}function oo(e,t){var n=Zr(e.doc,t),r=yr(n);r!=n&&(t=ti(r));var i=ii(r),o=i?i[0].level%2?io(r):ro(r):0;return Fo(t,o)}function lo(e,t){for(var n,r=Zr(e.doc,t);n=gr(r);)r=n.find(1,!0).line,t=null;var i=ii(r),o=i?i[0].level%2?ro(r):io(r):r.text.length;return Fo(null==t?ti(r):t,o)}function ao(e,t){var n=oo(e,t.line),r=Zr(e.doc,n.line),i=ii(r);if(!i||0==i[0].level){var o=Math.max(0,r.text.search(/\S/)),l=t.line==n.line&&t.ch<=o&&t.ch;return Fo(n.line,l?0:o)}return n}function so(e,t,n){var r=e[0].level;return t==r?!0:n==r?!1:n>t}function co(e,t){oa=null;for(var n,r=0;rt)return r;if(i.from==t||i.to==t){if(null!=n)return so(e,i.level,e[n].level)?(i.from!=i.to&&(oa=n),r):(i.from!=i.to&&(oa=r),n);n=r}}return n}function uo(e,t,n,r){if(!r)return t+n;do t+=n;while(t>0&&ji(e.text.charAt(t)));return t}function ho(e,t,n,r){var i=ii(e);if(!i)return fo(e,t,n,r);for(var o=co(i,t),l=i[o],a=uo(e,t,l.level%2?-n:n,r);;){if(a>l.from&&a0==l.level%2?l.to:l.from);if(l=i[o+=n],!l)return null;a=n>0==l.level%2?uo(e,l.to,-1,r):uo(e,l.from,1,r)}}function fo(e,t,n,r){var i=t+n;if(r)for(;i>0&&ji(e.text.charAt(i));)i+=n;return 0>i||i>e.text.length?null:i}var po=navigator.userAgent,mo=navigator.platform,go=/gecko\/\d/i.test(po),vo=/MSIE \d/.test(po),yo=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(po),xo=vo||yo,bo=xo&&(vo?document.documentMode||6:yo[1]),wo=/WebKit\//.test(po),ko=wo&&/Qt\/\d+\.\d+/.test(po),Co=/Chrome\//.test(po),So=/Opera\//.test(po),Lo=/Apple Computer/.test(navigator.vendor),To=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(po),Mo=/PhantomJS/.test(po),No=/AppleWebKit/.test(po)&&/Mobile\/\w+/.test(po),Ao=No||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(po),Oo=No||/Mac/.test(mo),Ho=/win/i.test(mo),Wo=So&&po.match(/Version\/(\d*\.\d*)/);Wo&&(Wo=Number(Wo[1])),Wo&&Wo>=15&&(So=!1,wo=!0);var Io=Oo&&(ko||So&&(null==Wo||12.11>Wo)),Eo=go||xo&&bo>=9,Do=!1,Po=!1;m.prototype=Fi({update:function(e){var t=e.scrollWidth>e.clientWidth+1,n=e.scrollHeight>e.clientHeight+1,r=e.nativeBarWidth;if(n){this.vert.style.display="block",this.vert.style.bottom=t?r+"px":"0";var i=e.viewHeight-(t?r:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(t){this.horiz.style.display="block",this.horiz.style.right=n?r+"px":"0",this.horiz.style.left=e.barLeft+"px";var o=e.viewWidth-e.barLeft-(n?r:0);this.horiz.firstChild.style.width=e.scrollWidth-e.clientWidth+o+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==r&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:n?r:0,bottom:t?r:0}},setScrollLeft:function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz)},setScrollTop:function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert)},zeroWidthHack:function(){var e=Oo&&!To?"12px":"18px";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents="none",this.disableHoriz=new Oi,this.disableVert=new Oi},enableZeroWidthBar:function(e,t){function n(){var r=e.getBoundingClientRect(),i=document.elementFromPoint(r.left+1,r.bottom-1);i!=e?e.style.pointerEvents="none":t.set(1e3,n)}e.style.pointerEvents="auto",t.set(1e3,n)},clear:function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)}},m.prototype),g.prototype=Fi({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},g.prototype),e.scrollbarModel={"native":m,"null":g},L.prototype.signal=function(e,t){Ni(e,t)&&this.events.push(arguments)},L.prototype.finish=function(){for(var e=0;e=9&&n.hasSelection&&(n.hasSelection=null),n.poll()}),Al(o,"paste",function(e){Ti(r,e)||Q(e,r)||(r.state.pasteIncoming=!0,n.fastPoll())}),Al(o,"cut",t),Al(o,"copy",t),Al(e.scroller,"paste",function(t){Gt(e,t)||Ti(r,t)||(r.state.pasteIncoming=!0,n.focus())}),Al(e.lineSpace,"selectstart",function(t){Gt(e,t)||Tl(t)}),Al(o,"compositionstart",function(){var e=r.getCursor("from");n.composing&&n.composing.range.clear(),n.composing={start:e,range:r.markText(e,r.getCursor("to"),{className:"CodeMirror-composing"})}}),Al(o,"compositionend",function(){n.composing&&(n.poll(),n.composing.range.clear(),n.composing=null)})},prepareSelection:function(){var e=this.cm,t=e.display,n=e.doc,r=De(e);if(e.options.moveInputWithCursor){var i=ft(e,n.sel.primary().head,"div"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();r.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),r.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return r},showSelection:function(e){var t=this.cm,n=t.display;Ui(n.cursorDiv,e.cursors),Ui(n.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+"px",this.wrapper.style.left=e.teLeft+"px")},reset:function(e){if(!this.contextMenuPending){var t,n,r=this.cm,i=r.doc;if(r.somethingSelected()){this.prevInput="";var o=i.sel.primary();t=na&&(o.to().line-o.from().line>100||(n=r.getSelection()).length>1e3);var l=t?"-":n||r.getSelection();this.textarea.value=l,r.state.focused&&_l(this.textarea),xo&&bo>=9&&(this.hasSelection=l)}else e||(this.prevInput=this.textarea.value="",xo&&bo>=9&&(this.hasSelection=null));this.inaccurateSelection=t}},getField:function(){return this.textarea},supportsTouch:function(){return!1},focus:function(){if("nocursor"!=this.cm.options.readOnly&&(!Ao||Gi()!=this.textarea))try{this.textarea.focus()}catch(e){}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var e=this;e.pollingFast||e.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},fastPoll:function(){function e(){var r=n.poll();r||t?(n.pollingFast=!1,n.slowPoll()):(t=!0,n.polling.set(60,e))}var t=!1,n=this;n.pollingFast=!0,n.polling.set(20,e)},poll:function(){var e=this.cm,t=this.textarea,n=this.prevInput;if(this.contextMenuPending||!e.state.focused||ta(t)&&!n&&!this.composing||e.isReadOnly()||e.options.disableInput||e.state.keySeq)return!1;var r=t.value;if(r==n&&!e.somethingSelected())return!1;if(xo&&bo>=9&&this.hasSelection===r||Oo&&/[\uf700-\uf7ff]/.test(r))return e.display.input.reset(),!1;if(e.doc.sel==e.display.selForContextMenu){var i=r.charCodeAt(0);if(8203!=i||n||(n="​"),8666==i)return this.reset(),this.cm.execCommand("undo")}for(var o=0,l=Math.min(n.length,r.length);l>o&&n.charCodeAt(o)==r.charCodeAt(o);)++o;var a=this;return At(e,function(){Z(e,r.slice(o),n.length-o,null,a.composing?"*compose":null),r.length>1e3||r.indexOf("\n")>-1?t.value=a.prevInput="":a.prevInput=r,a.composing&&(a.composing.range.clear(),a.composing.range=e.markText(a.composing.start,e.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},ensurePolled:function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},onKeyPress:function(){xo&&bo>=9&&(this.hasSelection=null),this.fastPoll()},onContextMenu:function(e){function t(){if(null!=l.selectionStart){var e=i.somethingSelected(),t="​"+(e?l.value:"");l.value="⇚",l.value=t,r.prevInput=e?"":"​",l.selectionStart=1,l.selectionEnd=t.length,o.selForContextMenu=i.doc.sel}}function n(){if(r.contextMenuPending=!1,r.wrapper.style.cssText=d,l.style.cssText=u,xo&&9>bo&&o.scrollbars.setScrollTop(o.scroller.scrollTop=s),null!=l.selectionStart){(!xo||xo&&9>bo)&&t();var e=0,n=function(){o.selForContextMenu==i.doc.sel&&0==l.selectionStart&&l.selectionEnd>0&&"​"==r.prevInput?Ot(i,cl.selectAll)(i):e++<10?o.detectingSelectAll=setTimeout(n,500):o.input.reset()};o.detectingSelectAll=setTimeout(n,200)}}var r=this,i=r.cm,o=i.display,l=r.textarea,a=$t(i,e),s=o.scroller.scrollTop;if(a&&!So){var c=i.options.resetSelectionOnContextMenu;c&&-1==i.doc.sel.contains(a)&&Ot(i,Te)(i.doc,fe(a),Pl);var u=l.style.cssText,d=r.wrapper.style.cssText;r.wrapper.style.cssText="position: absolute";var h=r.wrapper.getBoundingClientRect();if(l.style.cssText="position: absolute; width: 30px; height: 30px; top: "+(e.clientY-h.top-5)+"px; left: "+(e.clientX-h.left-5)+"px; z-index: 1000; background: "+(xo?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",wo)var f=window.scrollY;if(o.input.focus(),wo&&window.scrollTo(null,f),o.input.reset(),i.somethingSelected()||(l.value=r.prevInput=" "),r.contextMenuPending=!0,o.selForContextMenu=i.doc.sel,clearTimeout(o.detectingSelectAll),xo&&bo>=9&&t(),Eo){Nl(e);var p=function(){Hl(window,"mouseup",p),setTimeout(n,20)};Al(window,"mouseup",p)}else setTimeout(n,50)}},readOnlyChanged:function(e){e||this.reset()},setUneditable:Di,needsContentAttribute:!1},ne.prototype),ie.prototype=Fi({init:function(e){function t(e){if(!Ti(r,e)){if(r.somethingSelected())Ro=r.getSelections(),"cut"==e.type&&r.replaceSelection("",null,"cut");else{if(!r.options.lineWiseCopyCut)return;var t=ee(r);Ro=t.text,"cut"==e.type&&r.operation(function(){r.setSelections(t.ranges,0,Pl),r.replaceSelection("",null,"cut")})}if(e.clipboardData&&!No)e.preventDefault(),e.clipboardData.clearData(),e.clipboardData.setData("text/plain",Ro.join("\n"));else{var n=re(),i=n.firstChild;r.display.lineSpace.insertBefore(n,r.display.lineSpace.firstChild),i.value=Ro.join("\n");var o=document.activeElement;_l(i),setTimeout(function(){r.display.lineSpace.removeChild(n),o.focus()},50)}}}var n=this,r=n.cm,i=n.div=e.lineDiv;te(i),Al(i,"paste",function(e){Ti(r,e)||Q(e,r)}),Al(i,"compositionstart",function(e){var t=e.data;if(n.composing={sel:r.doc.sel,data:t,startData:t},t){var i=r.doc.sel.primary(),o=r.getLine(i.head.line),l=o.indexOf(t,Math.max(0,i.head.ch-t.length));l>-1&&l<=i.head.ch&&(n.composing.sel=fe(Fo(i.head.line,l),Fo(i.head.line,l+t.length)))}}),Al(i,"compositionupdate",function(e){n.composing.data=e.data}),Al(i,"compositionend",function(e){var t=n.composing;t&&(e.data==t.startData||/\u200b/.test(e.data)||(t.data=e.data),setTimeout(function(){t.handled||n.applyComposition(t),n.composing==t&&(n.composing=null)},50))}),Al(i,"touchstart",function(){n.forceCompositionEnd()}),Al(i,"input",function(){n.composing||!r.isReadOnly()&&n.pollContent()||At(n.cm,function(){Dt(r)})}),Al(i,"copy",t),Al(i,"cut",t)},prepareSelection:function(){var e=De(this.cm,!1);return e.focus=this.cm.state.focused,e},showSelection:function(e){e&&this.cm.display.view.length&&(e.focus&&this.showPrimarySelection(),this.showMultipleSelections(e))},showPrimarySelection:function(){var e=window.getSelection(),t=this.cm.doc.sel.primary(),n=ae(this.cm,e.anchorNode,e.anchorOffset),r=ae(this.cm,e.focusNode,e.focusOffset);if(!n||n.bad||!r||r.bad||0!=zo(X(n,r),t.from())||0!=zo(K(n,r),t.to())){var i=oe(this.cm,t.from()),o=oe(this.cm,t.to());if(i||o){var l=this.cm.display.view,a=e.rangeCount&&e.getRangeAt(0);if(i){if(!o){var s=l[l.length-1].measure,c=s.maps?s.maps[s.maps.length-1]:s.map;o={node:c[c.length-1],offset:c[c.length-2]-c[c.length-3]}}}else i={node:l[0].measure.map[2],offset:0};try{var u=ql(i.node,i.offset,o.offset,o.node)}catch(d){}u&&(!go&&this.cm.state.focused?(e.collapse(i.node,i.offset),u.collapsed||e.addRange(u)):(e.removeAllRanges(),e.addRange(u)),a&&null==e.anchorNode?e.addRange(a):go&&this.startGracePeriod()),this.rememberSelection()}}},startGracePeriod:function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){e.cm.curOp.selectionChanged=!0})},20)},showMultipleSelections:function(e){Ui(this.cm.display.cursorDiv,e.cursors),Ui(this.cm.display.selectionDiv,e.selection)},rememberSelection:function(){var e=window.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},selectionInEditor:function(){var e=window.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return Vl(this.div,t)},focus:function(){"nocursor"!=this.cm.options.readOnly&&this.div.focus()},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return!0},receivedFocus:function(){function e(){t.cm.state.focused&&(t.pollSelection(),t.polling.set(t.cm.options.pollInterval,e))}var t=this;this.selectionInEditor()?this.pollSelection():At(this.cm,function(){t.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,e)},selectionChanged:function(){var e=window.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var e=window.getSelection(),t=this.cm;this.rememberSelection();var n=ae(t,e.anchorNode,e.anchorOffset),r=ae(t,e.focusNode,e.focusOffset);n&&r&&At(t,function(){Te(t.doc,fe(n,r),Pl),(n.bad||r.bad)&&(t.curOp.selectionChanged=!0)})}},pollContent:function(){var e=this.cm,t=e.display,n=e.doc.sel.primary(),r=n.from(),i=n.to();if(r.linet.viewTo-1)return!1;var o;if(r.line==t.viewFrom||0==(o=zt(e,r.line)))var l=ti(t.view[0].line),a=t.view[0].node;else var l=ti(t.view[o].line),a=t.view[o-1].node.nextSibling;var s=zt(e,i.line);if(s==t.view.length-1)var c=t.viewTo-1,u=t.lineDiv.lastChild;else var c=ti(t.view[s+1].line)-1,u=t.view[s+1].node.previousSibling;for(var d=e.doc.splitLines(ce(e,a,u,l,c)),h=Qr(e.doc,Fo(l,0),Fo(c,Zr(e.doc,c).text.length));d.length>1&&h.length>1;)if(Wi(d)==Wi(h))d.pop(),h.pop(),c--;else{if(d[0]!=h[0])break;d.shift(),h.shift(),l++}for(var f=0,p=0,m=d[0],g=h[0],v=Math.min(m.length,g.length);v>f&&m.charCodeAt(f)==g.charCodeAt(f);)++f;for(var y=Wi(d),x=Wi(h),b=Math.min(y.length-(1==d.length?f:0),x.length-(1==h.length?f:0));b>p&&y.charCodeAt(y.length-p-1)==x.charCodeAt(x.length-p-1);)++p;d[d.length-1]=y.slice(0,y.length-p),d[0]=d[0].slice(f);var w=Fo(l,f),k=Fo(c,h.length?Wi(h).length-p:0);return d.length>1||d[0]||zo(w,k)?(Wn(e.doc,d,w,k,"+input"),!0):void 0},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){this.composing&&!this.composing.handled&&(this.applyComposition(this.composing),this.composing.handled=!0,this.div.blur(),this.div.focus())},applyComposition:function(e){this.cm.isReadOnly()?Ot(this.cm,Dt)(this.cm):e.data&&e.data!=e.startData&&Ot(this.cm,Z)(this.cm,e.data,0,e.sel)},setUneditable:function(e){e.contentEditable="false"},onKeyPress:function(e){e.preventDefault(),this.cm.isReadOnly()||Ot(this.cm,Z)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0)},readOnlyChanged:function(e){this.div.contentEditable=String("nocursor"!=e)},onContextMenu:Di,resetPosition:Di,needsContentAttribute:!0},ie.prototype),e.inputStyles={textarea:ne,contenteditable:ie},ue.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t=0&&zo(e,r.to())<=0)return n}return-1}},de.prototype={from:function(){return X(this.anchor,this.head)},to:function(){return K(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var Bo,jo,_o,qo={left:0,right:0,top:0,bottom:0},Uo=null,Go=0,$o=0,Vo=0,Ko=null;xo?Ko=-.53:go?Ko=15:Co?Ko=-.7:Lo&&(Ko=-1/3);var Xo=function(e){var t=e.wheelDeltaX,n=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==n&&e.detail&&e.axis==e.VERTICAL_AXIS?n=e.detail:null==n&&(n=e.wheelDelta),{x:t,y:n}};e.wheelEventPixels=function(e){var t=Xo(e);return t.x*=Ko,t.y*=Ko,t};var Yo=new Oi,Zo=null,Qo=e.changeEnd=function(e){return e.text?Fo(e.from.line+e.text.length-1,Wi(e.text).length+(1==e.text.length?e.from.ch:0)):e.to};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,t){var n=this.options,r=n[e];n[e]==t&&"mode"!=e||(n[e]=t,el.hasOwnProperty(e)&&Ot(this,el[e])(this,t,r))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?"push":"unshift"](Vn(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,n=0;nn&&(Bn(this,i.head.line,e,!0),n=i.head.line,r==this.doc.sel.primIndex&&zn(this));else{var o=i.from(),l=i.to(),a=Math.max(n,o.line);n=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1;for(var s=a;n>s;++s)Bn(this,s,e);var c=this.doc.sel.ranges;0==o.ch&&t.length==c.length&&c[r].from().ch>0&&ke(this.doc,r,new de(o,c[r].to()),Pl)}}}),getTokenAt:function(e,t){return Wr(this,e,t)},getLineTokens:function(e,t){return Wr(this,Fo(e),t,!0)},getTokenTypeAt:function(e){e=me(this.doc,e);var t,n=Dr(this,Zr(this.doc,e.line)),r=0,i=(n.length-1)/2,o=e.ch;if(0==o)t=n[2];else for(;;){var l=r+i>>1;if((l?n[2*l-1]:0)>=o)i=l;else{if(!(n[2*l+1]a?t:0==a?null:t.slice(0,a-1)},getModeAt:function(t){var n=this.doc.mode;return n.innerMode?e.innerMode(n,this.getTokenAt(t).state).mode:n},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=[];if(!ll.hasOwnProperty(t))return n;var r=ll[t],i=this.getModeAt(e);if("string"==typeof i[t])r[i[t]]&&n.push(r[i[t]]);else if(i[t])for(var o=0;oi&&(e=i,r=!0),n=Zr(this.doc,e)}else n=e;return ut(this,n,{top:0,left:0},t||"page").top+(r?this.doc.height-ri(n):0)},defaultTextHeight:function(){return yt(this.display)},defaultCharWidth:function(){return xt(this.display)},setGutterMarker:Ht(function(e,t,n){return jn(this.doc,e,"gutter",function(e){var r=e.gutterMarkers||(e.gutterMarkers={});return r[t]=n,!n&&Bi(r)&&(e.gutterMarkers=null),!0})}),clearGutter:Ht(function(e){var t=this,n=t.doc,r=n.first;n.iter(function(n){n.gutterMarkers&&n.gutterMarkers[e]&&(n.gutterMarkers[e]=null,Pt(t,r,"gutter"),Bi(n.gutterMarkers)&&(n.gutterMarkers=null)),++r})}),lineInfo:function(e){if("number"==typeof e){if(!ve(this.doc,e))return null;var t=e;if(e=Zr(this.doc,e),!e)return null}else{var t=ti(e);if(null==t)return null}return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,n,r,i){var o=this.display;e=ft(this,me(this.doc,e));var l=e.bottom,a=e.left;if(t.style.position="absolute",t.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(t),o.sizer.appendChild(t),"over"==r)l=e.top;else if("above"==r||"near"==r){var s=Math.max(o.wrapper.clientHeight,this.doc.height),c=Math.max(o.sizer.clientWidth,o.lineSpace.clientWidth);("above"==r||e.bottom+t.offsetHeight>s)&&e.top>t.offsetHeight?l=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=s&&(l=e.bottom),a+t.offsetWidth>c&&(a=c-t.offsetWidth)}t.style.top=l+"px",t.style.left=t.style.right="","right"==i?(a=o.sizer.clientWidth-t.offsetWidth,t.style.right="0px"):("left"==i?a=0:"middle"==i&&(a=(o.sizer.clientWidth-t.offsetWidth)/2),t.style.left=a+"px"),n&&Dn(this,a,l,a+t.offsetWidth,l+t.offsetHeight)},triggerOnKeyDown:Ht(hn),triggerOnKeyPress:Ht(mn),triggerOnKeyUp:pn,execCommand:function(e){return cl.hasOwnProperty(e)?cl[e].call(null,this):void 0},triggerElectric:Ht(function(e){J(this,e)}),findPosH:function(e,t,n,r){var i=1;0>t&&(i=-1,t=-t);for(var o=0,l=me(this.doc,e);t>o&&(l=qn(this.doc,l,i,n,r),!l.hitSide);++o);return l},moveH:Ht(function(e,t){var n=this;n.extendSelectionsBy(function(r){return n.display.shift||n.doc.extend||r.empty()?qn(n.doc,r.head,e,t,n.options.rtlMoveVisually):0>e?r.from():r.to(); -},zl)}),deleteH:Ht(function(e,t){var n=this.doc.sel,r=this.doc;n.somethingSelected()?r.replaceSelection("",null,"+delete"):_n(this,function(n){var i=qn(r,n.head,e,t,!1);return 0>e?{from:i,to:n.head}:{from:n.head,to:i}})}),findPosV:function(e,t,n,r){var i=1,o=r;0>t&&(i=-1,t=-t);for(var l=0,a=me(this.doc,e);t>l;++l){var s=ft(this,a,"div");if(null==o?o=s.left:s.left=o,a=Un(this,s,i,n),a.hitSide)break}return a},moveV:Ht(function(e,t){var n=this,r=this.doc,i=[],o=!n.display.shift&&!r.extend&&r.sel.somethingSelected();if(r.extendSelectionsBy(function(l){if(o)return 0>e?l.from():l.to();var a=ft(n,l.head,"div");null!=l.goalColumn&&(a.left=l.goalColumn),i.push(a.left);var s=Un(n,a,e,t);return"page"==t&&l==r.sel.primary()&&Fn(n,null,ht(n,s,"div").top-a.top),s},zl),i.length)for(var l=0;l0&&a(n.charAt(r-1));)--r;for(;i.5)&&l(this),Wl(this,"refresh",this)}),swapDoc:Ht(function(e){var t=this.doc;return t.cm=null,Yr(this,e),at(this),this.display.input.reset(),this.scrollTo(e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,Si(this,"swapDoc",this,t),t}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Ai(e);var Jo=e.defaults={},el=e.optionHandlers={},tl=e.Init={toString:function(){return"CodeMirror.Init"}};Gn("value","",function(e,t){e.setValue(t)},!0),Gn("mode",null,function(e,t){e.doc.modeOption=t,n(e)},!0),Gn("indentUnit",2,n,!0),Gn("indentWithTabs",!1),Gn("smartIndent",!0),Gn("tabSize",4,function(e){r(e),at(e),Dt(e)},!0),Gn("lineSeparator",null,function(e,t){if(e.doc.lineSep=t,t){var n=[],r=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,n.push(Fo(r,o))}r++});for(var i=n.length-1;i>=0;i--)Wn(e.doc,t,n[i],Fo(n[i].line,n[i].ch+t.length))}}),Gn("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(t,n,r){t.state.specialChars=new RegExp(n.source+(n.test(" ")?"":"| "),"g"),r!=e.Init&&t.refresh()}),Gn("specialCharPlaceholder",Rr,function(e){e.refresh()},!0),Gn("electricChars",!0),Gn("inputStyle",Ao?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Gn("rtlMoveVisually",!Ho),Gn("wholeLineUpdateBefore",!0),Gn("theme","default",function(e){a(e),s(e)},!0),Gn("keyMap","default",function(t,n,r){var i=Vn(n),o=r!=e.Init&&Vn(r);o&&o.detach&&o.detach(t,i),i.attach&&i.attach(t,o||null)}),Gn("extraKeys",null),Gn("lineWrapping",!1,i,!0),Gn("gutters",[],function(e){f(e.options),s(e)},!0),Gn("fixedGutter",!0,function(e,t){e.display.gutters.style.left=t?S(e.display)+"px":"0",e.refresh()},!0),Gn("coverGutterNextToScrollbar",!1,function(e){y(e)},!0),Gn("scrollbarStyle","native",function(e){v(e),y(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),Gn("lineNumbers",!1,function(e){f(e.options),s(e)},!0),Gn("firstLineNumber",1,s,!0),Gn("lineNumberFormatter",function(e){return e},s,!0),Gn("showCursorWhenSelecting",!1,Ee,!0),Gn("resetSelectionOnContextMenu",!0),Gn("lineWiseCopyCut",!0),Gn("readOnly",!1,function(e,t){"nocursor"==t?(yn(e),e.display.input.blur(),e.display.disabled=!0):e.display.disabled=!1,e.display.input.readOnlyChanged(t)}),Gn("disableInput",!1,function(e,t){t||e.display.input.reset()},!0),Gn("dragDrop",!0,qt),Gn("allowDropFileTypes",null),Gn("cursorBlinkRate",530),Gn("cursorScrollMargin",0),Gn("cursorHeight",1,Ee,!0),Gn("singleCursorHeightPerLine",!0,Ee,!0),Gn("workTime",100),Gn("workDelay",100),Gn("flattenSpans",!0,r,!0),Gn("addModeClass",!1,r,!0),Gn("pollInterval",100),Gn("undoDepth",200,function(e,t){e.doc.history.undoDepth=t}),Gn("historyEventDelay",1250),Gn("viewportMargin",10,function(e){e.refresh()},!0),Gn("maxHighlightLength",1e4,r,!0),Gn("moveInputWithCursor",!0,function(e,t){t||e.display.input.resetPosition()}),Gn("tabindex",null,function(e,t){e.display.input.getField().tabIndex=t||""}),Gn("autofocus",null);var nl=e.modes={},rl=e.mimeModes={};e.defineMode=function(t,n){e.defaults.mode||"null"==t||(e.defaults.mode=t),arguments.length>2&&(n.dependencies=Array.prototype.slice.call(arguments,2)),nl[t]=n},e.defineMIME=function(e,t){rl[e]=t},e.resolveMode=function(t){if("string"==typeof t&&rl.hasOwnProperty(t))t=rl[t];else if(t&&"string"==typeof t.name&&rl.hasOwnProperty(t.name)){var n=rl[t.name];"string"==typeof n&&(n={name:n}),t=Pi(n,t),t.name=n.name}else if("string"==typeof t&&/^[\w\-]+\/[\w\-]+\+xml$/.test(t))return e.resolveMode("application/xml");return"string"==typeof t?{name:t}:t||{name:"null"}},e.getMode=function(t,n){var n=e.resolveMode(n),r=nl[n.name];if(!r)return e.getMode(t,"text/plain");var i=r(t,n);if(il.hasOwnProperty(n.name)){var o=il[n.name];for(var l in o)o.hasOwnProperty(l)&&(i.hasOwnProperty(l)&&(i["_"+l]=i[l]),i[l]=o[l])}if(i.name=n.name,n.helperType&&(i.helperType=n.helperType),n.modeProps)for(var l in n.modeProps)i[l]=n.modeProps[l];return i},e.defineMode("null",function(){return{token:function(e){e.skipToEnd()}}}),e.defineMIME("text/plain","null");var il=e.modeExtensions={};e.extendMode=function(e,t){var n=il.hasOwnProperty(e)?il[e]:il[e]={};Fi(t,n)},e.defineExtension=function(t,n){e.prototype[t]=n},e.defineDocExtension=function(e,t){Cl.prototype[e]=t},e.defineOption=Gn;var ol=[];e.defineInitHook=function(e){ol.push(e)};var ll=e.helpers={};e.registerHelper=function(t,n,r){ll.hasOwnProperty(t)||(ll[t]=e[t]={_global:[]}),ll[t][n]=r},e.registerGlobalHelper=function(t,n,r,i){e.registerHelper(t,n,i),ll[t]._global.push({pred:r,val:i})};var al=e.copyState=function(e,t){if(t===!0)return t;if(e.copyState)return e.copyState(t);var n={};for(var r in t){var i=t[r];i instanceof Array&&(i=i.concat([])),n[r]=i}return n},sl=e.startState=function(e,t,n){return e.startState?e.startState(t,n):!0};e.innerMode=function(e,t){for(;e.innerMode;){var n=e.innerMode(t);if(!n||n.mode==e)break;t=n.state,e=n.mode}return n||{mode:e,state:t}};var cl=e.commands={selectAll:function(e){e.setSelection(Fo(e.firstLine(),0),Fo(e.lastLine()),Pl)},singleSelection:function(e){e.setSelection(e.getCursor("anchor"),e.getCursor("head"),Pl)},killLine:function(e){_n(e,function(t){if(t.empty()){var n=Zr(e.doc,t.head.line).text.length;return t.head.ch==n&&t.head.line0)i=new Fo(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),Fo(i.line,i.ch-2),i,"+transpose");else if(i.line>e.doc.first){var l=Zr(e.doc,i.line-1).text;l&&e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),Fo(i.line-1,l.length-1),Fo(i.line,1),"+transpose")}n.push(new de(i,i))}e.setSelections(n)})},newlineAndIndent:function(e){At(e,function(){for(var t=e.listSelections().length,n=0;t>n;n++){var r=e.listSelections()[n];e.replaceRange(e.doc.lineSeparator(),r.anchor,r.head,"+input"),e.indentLine(r.from().line+1,null,!0)}zn(e)})},toggleOverwrite:function(e){e.toggleOverwrite()}},ul=e.keyMap={};ul.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},ul.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},ul.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},ul.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},ul["default"]=Oo?ul.macDefault:ul.pcDefault,e.normalizeKeyMap=function(e){var t={};for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];if(/^(name|fallthrough|(de|at)tach)$/.test(n))continue;if("..."==r){delete e[n];continue}for(var i=Ei(n.split(" "),$n),o=0;o=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){return this.post},eatSpace:function(){for(var e=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},skipToEnd:function(){this.pos=this.string.length},skipTo:function(e){var t=this.string.indexOf(e,this.pos);return t>-1?(this.pos=t,!0):void 0},backUp:function(e){this.pos-=e},column:function(){return this.lastColumnPos0?null:(r&&t!==!1&&(this.pos+=r[0].length),r)}var i=function(e){return n?e.toLowerCase():e},o=this.string.substr(this.pos,e.length);return i(o)==i(e)?(t!==!1&&(this.pos+=e.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}}};var ml=0,gl=e.TextMarker=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++ml};Ai(gl),gl.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&bt(e),Ni(this,"clear")){var n=this.find();n&&Si(this,"clear",n.from,n.to)}for(var r=null,i=null,o=0;oe.display.maxLineLength&&(e.display.maxLine=s,e.display.maxLineLength=c,e.display.maxLineChanged=!0)}null!=r&&e&&this.collapsed&&Dt(e,r,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&Ae(e.doc)),e&&Si(e,"markerCleared",e,this),t&&kt(e),this.parent&&this.parent.clear()}},gl.prototype.find=function(e,t){null==e&&"bookmark"==this.type&&(e=1);for(var n,r,i=0;in;++n){var i=this.lines[n];this.height-=i.height,Nr(i),Si(i,"delete")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,n){this.height+=n,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var r=0;re;++e)if(n(this.lines[e]))return!0}},Kr.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var n=0;ne){var o=Math.min(t,i-e),l=r.height;if(r.removeInner(e,o),this.height-=l-r.height,i==o&&(this.children.splice(n--,1),r.parent=null),0==(t-=o))break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof Vr))){var a=[];this.collapse(a),this.children=[new Vr(a)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t=e){if(i.insertInner(e,t,n),i.lines&&i.lines.length>50){for(;i.lines.length>50;){var l=i.lines.splice(i.lines.length-25,25),a=new Vr(l);i.height-=a.height,this.children.splice(r+1,0,a),a.parent=this}this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t=e.children.splice(e.children.length-5,5),n=new Kr(t);if(e.parent){e.size-=n.size,e.height-=n.height;var r=Ii(e.parent.children,e);e.parent.children.splice(r+1,0,n)}else{var i=new Kr(e.children);i.parent=e,e.children=[i,n],e=i}n.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()}},iterN:function(e,t,n){for(var r=0;re){var l=Math.min(t,o-e);if(i.iterN(e,l,n))return!0;if(0==(t-=l))break;e=0}else e-=o}}};var kl=0,Cl=e.Doc=function(e,t,n,r){if(!(this instanceof Cl))return new Cl(e,t,n,r);null==n&&(n=0),Kr.call(this,[new Vr([new xl("",null)])]),this.first=n,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.frontier=n;var i=Fo(n,0);this.sel=fe(i),this.history=new oi(null),this.id=++kl,this.modeOption=t,this.lineSep=r,this.extend=!1,"string"==typeof e&&(e=this.splitLines(e)),$r(this,{from:i,to:i,text:e}),Te(this,fe(i),Pl)};Cl.prototype=Pi(Kr.prototype,{constructor:Cl,iter:function(e,t,n){n?this.iterN(e-this.first,t-e,n):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var n=0,r=0;r=0;o--)Tn(this,r[o]);a?Le(this,a):this.cm&&zn(this.cm)}),undo:Wt(function(){Nn(this,"undo")}),redo:Wt(function(){Nn(this,"redo")}),undoSelection:Wt(function(){Nn(this,"undo",!0)}),redoSelection:Wt(function(){Nn(this,"redo",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,n=0,r=0;r=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,n){e=me(this,e),t=me(this,t);var r=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var a=0;as.to||null==s.from&&i!=e.line||null!=s.from&&i==t.line&&s.from>t.ch||n&&!n(s.marker)||r.push(s.marker.parent||s.marker)}++i}),r},getAllMarks:function(){var e=[];return this.iter(function(t){var n=t.markedSpans;if(n)for(var r=0;re?(t=e,!0):(e-=i,void++n)}),me(this,Fo(n,t))},indexFromPos:function(e){e=me(this,e);var t=e.ch;return e.linet&&(t=e.from),null!=e.to&&e.toa||a>=t)return l+(t-o);l+=a-o,l+=n-l%n,o=a+1}},Bl=e.findColumn=function(e,t,n){for(var r=0,i=0;;){var o=e.indexOf(" ",r);-1==o&&(o=e.length);var l=o-r;if(o==e.length||i+l>=t)return r+Math.min(l,t-i);if(i+=o-r,i+=n-i%n,r=o+1,i>=t)return r}},jl=[""],_l=function(e){e.select()};No?_l=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:xo&&(_l=function(e){try{e.select()}catch(t){}});var ql,Ul=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,Gl=e.isWordChar=function(e){return/\w/.test(e)||e>"€"&&(e.toUpperCase()!=e.toLowerCase()||Ul.test(e))},$l=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;ql=document.createRange?function(e,t,n,r){var i=document.createRange();return i.setEnd(r||e,n),i.setStart(e,t),i}:function(e,t,n){var r=document.body.createTextRange();try{r.moveToElementText(e.parentNode)}catch(i){return r}return r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",t),r};var Vl=e.contains=function(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do if(11==t.nodeType&&(t=t.host),t==e)return!0;while(t=t.parentNode)};xo&&11>bo&&(Gi=function(){try{return document.activeElement}catch(e){return document.body}});var Kl,Xl,Yl=e.rmClass=function(e,t){var n=e.className,r=$i(t).exec(n);if(r){var i=n.slice(r.index+r[0].length);e.className=n.slice(0,r.index)+(i?r[1]+i:"")}},Zl=e.addClass=function(e,t){var n=e.className;$i(t).test(n)||(e.className+=(n?" ":"")+t)},Ql=!1,Jl=function(){if(xo&&9>bo)return!1;var e=_i("div");return"draggable"in e||"dragDrop"in e}(),ea=e.splitLines=3!="\n\nb".split(/\n/).length?function(e){for(var t=0,n=[],r=e.length;r>=t;){var i=e.indexOf("\n",t);-1==i&&(i=e.length);var o=e.slice(t,"\r"==e.charAt(i-1)?i-1:i),l=o.indexOf("\r");-1!=l?(n.push(o.slice(0,l)),t+=l+1):(n.push(o),t=i+1)}return n}:function(e){return e.split(/\r\n?|\n/)},ta=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(t){return!1}}:function(e){try{var t=e.ownerDocument.selection.createRange()}catch(n){}return t&&t.parentElement()==e?0!=t.compareEndPoints("StartToEnd",t):!1},na=function(){var e=_i("div");return"oncopy"in e?!0:(e.setAttribute("oncopy","return;"),"function"==typeof e.oncopy)}(),ra=null,ia=e.keyNames={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",106:"*",107:"=",109:"-",110:".",111:"/",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};!function(){for(var e=0;10>e;e++)ia[e+48]=ia[e+96]=String(e);for(var e=65;90>=e;e++)ia[e]=String.fromCharCode(e);for(var e=1;12>=e;e++)ia[e+111]=ia[e+63235]="F"+e}();var oa,la=function(){function e(e){return 247>=e?n.charAt(e):e>=1424&&1524>=e?"R":e>=1536&&1773>=e?r.charAt(e-1536):e>=1774&&2220>=e?"r":e>=8192&&8203>=e?"w":8204==e?"b":"L"}function t(e,t,n){this.level=e,this.from=t,this.to=n}var n="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",r="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",i=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,o=/[stwN]/,l=/[LRr]/,a=/[Lb1n]/,s=/[1n]/,c="L";return function(n){if(!i.test(n))return!1;for(var r,u=n.length,d=[],h=0;u>h;++h)d.push(r=e(n.charCodeAt(h)));for(var h=0,f=c;u>h;++h){var r=d[h];"m"==r?d[h]=f:f=r}for(var h=0,p=c;u>h;++h){var r=d[h];"1"==r&&"r"==p?d[h]="n":l.test(r)&&(p=r,"r"==r&&(d[h]="R"))}for(var h=1,f=d[0];u-1>h;++h){var r=d[h];"+"==r&&"1"==f&&"1"==d[h+1]?d[h]="1":","!=r||f!=d[h+1]||"1"!=f&&"n"!=f||(d[h]=f),f=r}for(var h=0;u>h;++h){var r=d[h];if(","==r)d[h]="N";else if("%"==r){for(var m=h+1;u>m&&"%"==d[m];++m);for(var g=h&&"!"==d[h-1]||u>m&&"1"==d[m]?"1":"N",v=h;m>v;++v)d[v]=g;h=m-1}}for(var h=0,p=c;u>h;++h){var r=d[h];"L"==p&&"1"==r?d[h]="L":l.test(r)&&(p=r)}for(var h=0;u>h;++h)if(o.test(d[h])){for(var m=h+1;u>m&&o.test(d[m]);++m);for(var y="L"==(h?d[h-1]:c),x="L"==(u>m?d[m]:c),g=y||x?"L":"R",v=h;m>v;++v)d[v]=g;h=m-1}for(var b,w=[],h=0;u>h;)if(a.test(d[h])){var k=h;for(++h;u>h&&a.test(d[h]);++h);w.push(new t(0,k,h))}else{var C=h,S=w.length;for(++h;u>h&&"L"!=d[h];++h);for(var v=C;h>v;)if(s.test(d[v])){v>C&&w.splice(S,0,new t(1,C,v));var L=v;for(++v;h>v&&s.test(d[v]);++v);w.splice(S,0,new t(2,L,v)),C=v}else++v;h>C&&w.splice(S,0,new t(1,C,h))}return 1==w[0].level&&(b=n.match(/^\s+/))&&(w[0].from=b[0].length,w.unshift(new t(0,0,b[0].length))),1==Wi(w).level&&(b=n.match(/\s+$/))&&(Wi(w).to-=b[0].length,w.push(new t(0,u-b[0].length,u))),2==w[0].level&&w.unshift(new t(1,w[0].to,w[0].to)),w[0].level!=Wi(w).level&&w.push(new t(w[0].level,u,u)),w}}();return e.version="5.12.1",e})},{}],8:[function(t,n,r){!function(i){"object"==typeof r&&"object"==typeof n?i(t("../../lib/codemirror"),t("../markdown/markdown"),t("../../addon/mode/overlay")):"function"==typeof e&&e.amd?e(["../../lib/codemirror","../markdown/markdown","../../addon/mode/overlay"],i):i(CodeMirror)}(function(e){"use strict";var t=/^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\.beep|\.lwz|\.xpc|\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\.beeps?|xmpp|xri|ymsgr|z39\.50[rs]?):(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]|\([^\s()<>]*\))+(?:\([^\s()<>]*\)|[^\s`*!()\[\]{};:'".,<>?«»“”‘’]))/i;e.defineMode("gfm",function(n,r){function i(e){return e.code=!1,null}var o=0,l={startState:function(){return{code:!1,codeBlock:!1,ateSpace:!1}},copyState:function(e){return{code:e.code,codeBlock:e.codeBlock,ateSpace:e.ateSpace}},token:function(e,n){if(n.combineTokens=null,n.codeBlock)return e.match(/^```+/)?(n.codeBlock=!1,null):(e.skipToEnd(),null);if(e.sol()&&(n.code=!1),e.sol()&&e.match(/^```+/))return e.skipToEnd(),n.codeBlock=!0,null;if("`"===e.peek()){e.next();var i=e.pos;e.eatWhile("`");var l=1+e.pos-i;return n.code?l===o&&(n.code=!1):(o=l,n.code=!0),null}if(n.code)return e.next(),null;if(e.eatSpace())return n.ateSpace=!0,null;if((e.sol()||n.ateSpace)&&(n.ateSpace=!1,r.gitHubSpice!==!1)){if(e.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+@)?(?:[a-f0-9]{7,40}\b)/))return n.combineTokens=!0,"link";if(e.match(/^(?:[a-zA-Z0-9\-_]+\/)?(?:[a-zA-Z0-9\-_]+)?#[0-9]+\b/))return n.combineTokens=!0,"link"}return e.match(t)&&"]("!=e.string.slice(e.start-2,e.start)&&(0==e.start||/\W/.test(e.string.charAt(e.start-1)))?(n.combineTokens=!0,"link"):(e.next(),null)},blankLine:i},a={underscoresBreakWords:!1,taskLists:!0,fencedCodeBlocks:"```",strikethrough:!0};for(var s in r)a[s]=r[s];return a.name="markdown",e.overlayMode(e.getMode(n,a),l)},"markdown"),e.defineMIME("text/x-gfm","gfm")})},{"../../addon/mode/overlay":6,"../../lib/codemirror":7,"../markdown/markdown":9}],9:[function(t,n,r){!function(i){"object"==typeof r&&"object"==typeof n?i(t("../../lib/codemirror"),t("../xml/xml"),t("../meta")):"function"==typeof e&&e.amd?e(["../../lib/codemirror","../xml/xml","../meta"],i):i(CodeMirror)}(function(e){"use strict";e.defineMode("markdown",function(t,n){function r(n){if(e.findModeByName){var r=e.findModeByName(n);r&&(n=r.mime||r.mimes[0])}var i=e.getMode(t,n);return"null"==i.name?null:i}function i(e,t,n){return t.f=t.inline=n,n(e,t)}function o(e,t,n){return t.f=t.block=n,n(e,t)}function l(e){return!e||!/\S/.test(e.string)}function a(e){return e.linkTitle=!1,e.em=!1,e.strong=!1,e.strikethrough=!1,e.quote=0,e.indentedCode=!1,C&&e.f==c&&(e.f=p,e.block=s),e.trailingSpace=0,e.trailingSpaceNewLine=!1,e.prevLine=e.thisLine,e.thisLine=null,null}function s(e,t){var o=e.sol(),a=t.list!==!1,s=t.indentedCode;t.indentedCode=!1,a&&(t.indentationDiff>=0?(t.indentationDiff<4&&(t.indentation-=t.indentationDiff),t.list=null):t.indentation>0?t.list=null:t.list=!1);var c=null;if(t.indentationDiff>=4)return e.skipToEnd(),s||l(t.prevLine)?(t.indentation-=4,t.indentedCode=!0,S.code):null;if(e.eatSpace())return null;if((c=e.match(O))&&c[1].length<=6)return t.header=c[1].length,n.highlightFormatting&&(t.formatting="header"),t.f=t.inline,h(t);if(!(l(t.prevLine)||t.quote||a||s)&&(c=e.match(H)))return t.header="="==c[0].charAt(0)?1:2,n.highlightFormatting&&(t.formatting="header"),t.f=t.inline,h(t);if(e.eat(">"))return t.quote=o?1:t.quote+1,n.highlightFormatting&&(t.formatting="quote"),e.eatSpace(),h(t);if("["===e.peek())return i(e,t,y);if(e.match(T,!0))return t.hr=!0,S.hr;if((l(t.prevLine)||a)&&(e.match(M,!1)||e.match(N,!1))){var d=null;for(e.match(M,!0)?d="ul":(e.match(N,!0),d="ol"),t.indentation=e.column()+e.current().length,t.list=!0;t.listStack&&e.column()")>-1)&&(n.f=p,n.block=s,n.htmlState=null)}return r}function u(e,t){return t.fencedChars&&e.match(t.fencedChars,!1)?(t.localMode=t.localState=null,t.f=t.block=d,null):t.localMode?t.localMode.token(e,t.localState):(e.skipToEnd(),S.code)}function d(e,t){e.match(t.fencedChars),t.block=s,t.f=p,t.fencedChars=null,n.highlightFormatting&&(t.formatting="code-block"),t.code=1;var r=h(t);return t.code=0,r}function h(e){var t=[];if(e.formatting){t.push(S.formatting),"string"==typeof e.formatting&&(e.formatting=[e.formatting]);for(var r=0;r=e.quote?t.push(S.formatting+"-"+e.formatting[r]+"-"+e.quote):t.push("error"))}if(e.taskOpen)return t.push("meta"),t.length?t.join(" "):null;if(e.taskClosed)return t.push("property"),t.length?t.join(" "):null;if(e.linkHref?t.push(S.linkHref,"url"):(e.strong&&t.push(S.strong),e.em&&t.push(S.em),e.strikethrough&&t.push(S.strikethrough),e.linkText&&t.push(S.linkText),e.code&&t.push(S.code)),e.header&&t.push(S.header,S.header+"-"+e.header),e.quote&&(t.push(S.quote),!n.maxBlockquoteDepth||n.maxBlockquoteDepth>=e.quote?t.push(S.quote+"-"+e.quote):t.push(S.quote+"-"+n.maxBlockquoteDepth)),e.list!==!1){var i=(e.listStack.length-1)%3;i?1===i?t.push(S.list2):t.push(S.list3):t.push(S.list1)}return e.trailingSpaceNewLine?t.push("trailing-space-new-line"):e.trailingSpace&&t.push("trailing-space-"+(e.trailingSpace%2?"a":"b")),t.length?t.join(" "):null}function f(e,t){return e.match(W,!0)?h(t):void 0}function p(t,r){var i=r.text(t,r);if("undefined"!=typeof i)return i;if(r.list)return r.list=null,h(r);if(r.taskList){var l="x"!==t.match(A,!0)[1];return l?r.taskOpen=!0:r.taskClosed=!0,n.highlightFormatting&&(r.formatting="task"),r.taskList=!1,h(r)}if(r.taskOpen=!1,r.taskClosed=!1,r.header&&t.match(/^#+$/,!0))return n.highlightFormatting&&(r.formatting="header"),h(r);var a=t.sol(),s=t.next();if(r.linkTitle){r.linkTitle=!1;var u=s;"("===s&&(u=")"),u=(u+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1");var d="^\\s*(?:[^"+u+"\\\\]+|\\\\\\\\|\\\\.)"+u;if(t.match(new RegExp(d),!0))return S.linkHref}if("`"===s){var f=r.formatting;n.highlightFormatting&&(r.formatting="code"),t.eatWhile("`");var p=t.current().length;if(0==r.code)return r.code=p,h(r);if(p==r.code){var v=h(r);return r.code=0,v}return r.formatting=f,h(r)}if(r.code)return h(r);if("\\"===s&&(t.next(),n.highlightFormatting)){var y=h(r),x=S.formatting+"-escape";return y?y+" "+x:x}if("!"===s&&t.match(/\[[^\]]*\] ?(?:\(|\[)/,!1))return t.match(/\[[^\]]*\]/),r.inline=r.f=g,S.image;if("["===s&&t.match(/.*\](\(.*\)| ?\[.*\])/,!1))return r.linkText=!0,n.highlightFormatting&&(r.formatting="link"),h(r);if("]"===s&&r.linkText&&t.match(/\(.*\)| ?\[.*\]/,!1)){n.highlightFormatting&&(r.formatting="link");var y=h(r);return r.linkText=!1,r.inline=r.f=g,y}if("<"===s&&t.match(/^(https?|ftps?):\/\/(?:[^\\>]|\\.)+>/,!1)){r.f=r.inline=m,n.highlightFormatting&&(r.formatting="link");var y=h(r);return y?y+=" ":y="",y+S.linkInline}if("<"===s&&t.match(/^[^> \\]+@(?:[^\\>]|\\.)+>/,!1)){r.f=r.inline=m,n.highlightFormatting&&(r.formatting="link");var y=h(r);return y?y+=" ":y="",y+S.linkEmail}if("<"===s&&t.match(/^(!--|\w)/,!1)){var b=t.string.indexOf(">",t.pos);if(-1!=b){var w=t.string.substring(t.start,b);/markdown\s*=\s*('|"){0,1}1('|"){0,1}/.test(w)&&(r.md_inside=!0)}return t.backUp(1),r.htmlState=e.startState(k),o(t,r,c)}if("<"===s&&t.match(/^\/\w*?>/))return r.md_inside=!1,"tag";var C=!1;if(!n.underscoresBreakWords&&"_"===s&&"_"!==t.peek()&&t.match(/(\w)/,!1)){var L=t.pos-2;if(L>=0){var T=t.string.charAt(L);"_"!==T&&T.match(/(\w)/,!1)&&(C=!0)}}if("*"===s||"_"===s&&!C)if(a&&" "===t.peek());else{if(r.strong===s&&t.eat(s)){n.highlightFormatting&&(r.formatting="strong");var v=h(r);return r.strong=!1,v}if(!r.strong&&t.eat(s))return r.strong=s,n.highlightFormatting&&(r.formatting="strong"),h(r);if(r.em===s){n.highlightFormatting&&(r.formatting="em");var v=h(r);return r.em=!1,v}if(!r.em)return r.em=s,n.highlightFormatting&&(r.formatting="em"),h(r)}else if(" "===s&&(t.eat("*")||t.eat("_"))){if(" "===t.peek())return h(r);t.backUp(1)}if(n.strikethrough)if("~"===s&&t.eatWhile(s)){if(r.strikethrough){n.highlightFormatting&&(r.formatting="strikethrough");var v=h(r);return r.strikethrough=!1,v}if(t.match(/^[^\s]/,!1))return r.strikethrough=!0,n.highlightFormatting&&(r.formatting="strikethrough"),h(r)}else if(" "===s&&t.match(/^~~/,!0)){if(" "===t.peek())return h(r);t.backUp(2)}return" "===s&&(t.match(/ +$/,!1)?r.trailingSpace++:r.trailingSpace&&(r.trailingSpaceNewLine=!0)),h(r)}function m(e,t){var r=e.next();if(">"===r){t.f=t.inline=p,n.highlightFormatting&&(t.formatting="link");var i=h(t);return i?i+=" ":i="",i+S.linkInline}return e.match(/^[^>]+/,!0),S.linkInline}function g(e,t){if(e.eatSpace())return null;var r=e.next();return"("===r||"["===r?(t.f=t.inline=v("("===r?")":"]"),n.highlightFormatting&&(t.formatting="link-string"),t.linkHref=!0,h(t)):"error"}function v(e){return function(t,r){var i=t.next();if(i===e){r.f=r.inline=p,n.highlightFormatting&&(r.formatting="link-string");var o=h(r);return r.linkHref=!1,o}return t.match(w(e),!0)&&t.backUp(1),r.linkHref=!0,h(r)}}function y(e,t){return e.match(/^([^\]\\]|\\.)*\]:/,!1)?(t.f=x,e.next(),n.highlightFormatting&&(t.formatting="link"),t.linkText=!0,h(t)):i(e,t,p)}function x(e,t){if(e.match(/^\]:/,!0)){t.f=t.inline=b,n.highlightFormatting&&(t.formatting="link");var r=h(t);return t.linkText=!1,r}return e.match(/^([^\]\\]|\\.)+/,!0),S.linkText}function b(e,t){return e.eatSpace()?null:(e.match(/^[^\s]+/,!0),void 0===e.peek()?t.linkTitle=!0:e.match(/^(?:\s+(?:"(?:[^"\\]|\\\\|\\.)+"|'(?:[^'\\]|\\\\|\\.)+'|\((?:[^)\\]|\\\\|\\.)+\)))?/,!0),t.f=t.inline=p,S.linkHref+" url")}function w(e){return E[e]||(e=(e+"").replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),E[e]=new RegExp("^(?:[^\\\\]|\\\\.)*?("+e+")")),E[e]}var k=e.getMode(t,"text/html"),C="null"==k.name;void 0===n.highlightFormatting&&(n.highlightFormatting=!1),void 0===n.maxBlockquoteDepth&&(n.maxBlockquoteDepth=0),void 0===n.underscoresBreakWords&&(n.underscoresBreakWords=!0),void 0===n.taskLists&&(n.taskLists=!1),void 0===n.strikethrough&&(n.strikethrough=!1),void 0===n.tokenTypeOverrides&&(n.tokenTypeOverrides={});var S={header:"header",code:"comment",quote:"quote",list1:"variable-2",list2:"variable-3",list3:"keyword",hr:"hr",image:"tag",formatting:"formatting",linkInline:"link",linkEmail:"link",linkText:"link",linkHref:"string",em:"em",strong:"strong",strikethrough:"strikethrough"};for(var L in S)S.hasOwnProperty(L)&&n.tokenTypeOverrides[L]&&(S[L]=n.tokenTypeOverrides[L]);var T=/^([*\-_])(?:\s*\1){2,}\s*$/,M=/^[*\-+]\s+/,N=/^[0-9]+([.)])\s+/,A=/^\[(x| )\](?=\s)/,O=n.allowAtxHeaderWithoutSpace?/^(#+)/:/^(#+)(?: |$)/,H=/^ *(?:\={1,}|-{1,})\s*$/,W=/^[^#!\[\]*_\\<>` "'(~]+/,I=new RegExp("^("+(n.fencedCodeBlocks===!0?"~~~+|```+":n.fencedCodeBlocks)+")[ \\t]*([\\w+#]*)"),E=[],D={startState:function(){return{f:s,prevLine:null,thisLine:null,block:s,htmlState:null,indentation:0,inline:p,text:f,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,code:0,em:!1,strong:!1,header:0,hr:!1,taskList:!1,list:!1,listStack:[],quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1,fencedChars:null}},copyState:function(t){return{f:t.f,prevLine:t.prevLine,thisLine:t.thisLine,block:t.block,htmlState:t.htmlState&&e.copyState(k,t.htmlState),indentation:t.indentation,localMode:t.localMode,localState:t.localMode?e.copyState(t.localMode,t.localState):null,inline:t.inline,text:t.text,formatting:!1,linkTitle:t.linkTitle,code:t.code,em:t.em,strong:t.strong,strikethrough:t.strikethrough,header:t.header,hr:t.hr,taskList:t.taskList,list:t.list,listStack:t.listStack.slice(0),quote:t.quote,indentedCode:t.indentedCode,trailingSpace:t.trailingSpace,trailingSpaceNewLine:t.trailingSpaceNewLine,md_inside:t.md_inside,fencedChars:t.fencedChars}},token:function(e,t){if(t.formatting=!1,e!=t.thisLine){var n=t.header||t.hr;if(t.header=0,t.hr=!1,e.match(/^\s*$/,!0)||n){if(a(t),!n)return null;t.prevLine=null}t.prevLine=t.thisLine,t.thisLine=e,t.taskList=!1,t.trailingSpace=0,t.trailingSpaceNewLine=!1,t.f=t.block;var r=e.match(/^\s*/,!0)[0].replace(/\t/g," ").length;if(t.indentationDiff=Math.min(r-t.indentation,4),t.indentation=t.indentation+t.indentationDiff,r>0)return null}return t.f(e,t)},innerMode:function(e){return e.block==c?{state:e.htmlState,mode:k}:e.localState?{state:e.localState,mode:e.localMode}:{state:e,mode:D}},blankLine:a,getType:h,fold:"markdown"};return D},"xml"),e.defineMIME("text/x-markdown","markdown")})},{"../../lib/codemirror":7,"../meta":10,"../xml/xml":11}],10:[function(t,n,r){!function(i){"object"==typeof r&&"object"==typeof n?i(t("../lib/codemirror")):"function"==typeof e&&e.amd?e(["../lib/codemirror"],i):i(CodeMirror)}(function(e){"use strict";e.modeInfo=[{name:"APL",mime:"text/apl",mode:"apl",ext:["dyalog","apl"]},{name:"PGP",mimes:["application/pgp","application/pgp-keys","application/pgp-signature"],mode:"asciiarmor",ext:["pgp"]},{name:"ASN.1",mime:"text/x-ttcn-asn",mode:"asn.1",ext:["asn","asn1"]},{name:"Asterisk",mime:"text/x-asterisk",mode:"asterisk",file:/^extensions\.conf$/i},{name:"Brainfuck",mime:"text/x-brainfuck",mode:"brainfuck",ext:["b","bf"]},{name:"C",mime:"text/x-csrc",mode:"clike",ext:["c","h"]},{name:"C++",mime:"text/x-c++src",mode:"clike",ext:["cpp","c++","cc","cxx","hpp","h++","hh","hxx"],alias:["cpp"]},{name:"Cobol",mime:"text/x-cobol",mode:"cobol",ext:["cob","cpy"]},{name:"C#",mime:"text/x-csharp",mode:"clike",ext:["cs"],alias:["csharp"]},{name:"Clojure",mime:"text/x-clojure",mode:"clojure",ext:["clj","cljc","cljx"]},{name:"ClojureScript",mime:"text/x-clojurescript",mode:"clojure",ext:["cljs"]},{name:"Closure Stylesheets (GSS)",mime:"text/x-gss",mode:"css",ext:["gss"]},{name:"CMake",mime:"text/x-cmake",mode:"cmake",ext:["cmake","cmake.in"],file:/^CMakeLists.txt$/},{name:"CoffeeScript",mime:"text/x-coffeescript",mode:"coffeescript",ext:["coffee"],alias:["coffee","coffee-script"]},{name:"Common Lisp",mime:"text/x-common-lisp",mode:"commonlisp",ext:["cl","lisp","el"],alias:["lisp"]},{name:"Cypher",mime:"application/x-cypher-query",mode:"cypher",ext:["cyp","cypher"]},{name:"Cython",mime:"text/x-cython",mode:"python",ext:["pyx","pxd","pxi"]},{name:"Crystal",mime:"text/x-crystal",mode:"crystal",ext:["cr"]},{name:"CSS",mime:"text/css",mode:"css",ext:["css"]},{name:"CQL",mime:"text/x-cassandra",mode:"sql",ext:["cql"]},{name:"D",mime:"text/x-d",mode:"d",ext:["d"]},{name:"Dart",mimes:["application/dart","text/x-dart"],mode:"dart",ext:["dart"]},{name:"diff",mime:"text/x-diff",mode:"diff",ext:["diff","patch"]},{name:"Django",mime:"text/x-django",mode:"django"},{name:"Dockerfile",mime:"text/x-dockerfile",mode:"dockerfile",file:/^Dockerfile$/},{name:"DTD",mime:"application/xml-dtd",mode:"dtd",ext:["dtd"]},{name:"Dylan",mime:"text/x-dylan",mode:"dylan",ext:["dylan","dyl","intr"]},{name:"EBNF",mime:"text/x-ebnf",mode:"ebnf"},{name:"ECL",mime:"text/x-ecl",mode:"ecl",ext:["ecl"]},{name:"edn",mime:"application/edn",mode:"clojure",ext:["edn"]},{name:"Eiffel",mime:"text/x-eiffel",mode:"eiffel",ext:["e"]},{name:"Elm",mime:"text/x-elm",mode:"elm",ext:["elm"]},{name:"Embedded Javascript",mime:"application/x-ejs",mode:"htmlembedded",ext:["ejs"]},{name:"Embedded Ruby",mime:"application/x-erb",mode:"htmlembedded",ext:["erb"]},{name:"Erlang",mime:"text/x-erlang",mode:"erlang",ext:["erl"]},{name:"Factor",mime:"text/x-factor",mode:"factor",ext:["factor"]},{name:"FCL",mime:"text/x-fcl",mode:"fcl"},{name:"Forth",mime:"text/x-forth",mode:"forth",ext:["forth","fth","4th"]},{name:"Fortran",mime:"text/x-fortran",mode:"fortran",ext:["f","for","f77","f90"]},{name:"F#",mime:"text/x-fsharp",mode:"mllike",ext:["fs"],alias:["fsharp"]},{name:"Gas",mime:"text/x-gas",mode:"gas",ext:["s"]},{name:"Gherkin",mime:"text/x-feature",mode:"gherkin",ext:["feature"]},{name:"GitHub Flavored Markdown",mime:"text/x-gfm",mode:"gfm",file:/^(readme|contributing|history).md$/i},{name:"Go",mime:"text/x-go",mode:"go",ext:["go"]},{name:"Groovy",mime:"text/x-groovy",mode:"groovy",ext:["groovy","gradle"]},{name:"HAML",mime:"text/x-haml",mode:"haml",ext:["haml"]},{name:"Haskell",mime:"text/x-haskell",mode:"haskell",ext:["hs"]},{name:"Haskell (Literate)",mime:"text/x-literate-haskell",mode:"haskell-literate",ext:["lhs"]},{name:"Haxe",mime:"text/x-haxe",mode:"haxe",ext:["hx"]},{name:"HXML",mime:"text/x-hxml",mode:"haxe",ext:["hxml"]},{name:"ASP.NET",mime:"application/x-aspx",mode:"htmlembedded",ext:["aspx"],alias:["asp","aspx"]},{name:"HTML",mime:"text/html",mode:"htmlmixed",ext:["html","htm"],alias:["xhtml"]},{name:"HTTP",mime:"message/http",mode:"http"},{name:"IDL",mime:"text/x-idl",mode:"idl",ext:["pro"]},{name:"Jade",mime:"text/x-jade",mode:"jade",ext:["jade"]},{name:"Java",mime:"text/x-java",mode:"clike",ext:["java"]},{name:"Java Server Pages",mime:"application/x-jsp",mode:"htmlembedded",ext:["jsp"],alias:["jsp"]},{name:"JavaScript",mimes:["text/javascript","text/ecmascript","application/javascript","application/x-javascript","application/ecmascript"],mode:"javascript",ext:["js"],alias:["ecmascript","js","node"]},{name:"JSON",mimes:["application/json","application/x-json"],mode:"javascript",ext:["json","map"],alias:["json5"]},{name:"JSON-LD",mime:"application/ld+json",mode:"javascript",ext:["jsonld"],alias:["jsonld"]},{name:"JSX",mime:"text/jsx",mode:"jsx",ext:["jsx"]},{name:"Jinja2",mime:"null",mode:"jinja2"},{name:"Julia",mime:"text/x-julia",mode:"julia",ext:["jl"]},{name:"Kotlin",mime:"text/x-kotlin",mode:"clike",ext:["kt"]},{name:"LESS",mime:"text/x-less",mode:"css",ext:["less"]},{name:"LiveScript",mime:"text/x-livescript",mode:"livescript",ext:["ls"],alias:["ls"]},{name:"Lua",mime:"text/x-lua",mode:"lua",ext:["lua"]},{name:"Markdown",mime:"text/x-markdown",mode:"markdown",ext:["markdown","md","mkd"]},{name:"mIRC",mime:"text/mirc",mode:"mirc"},{name:"MariaDB SQL",mime:"text/x-mariadb",mode:"sql"},{name:"Mathematica",mime:"text/x-mathematica",mode:"mathematica",ext:["m","nb"]},{name:"Modelica",mime:"text/x-modelica",mode:"modelica",ext:["mo"]},{name:"MUMPS",mime:"text/x-mumps",mode:"mumps",ext:["mps"]},{name:"MS SQL",mime:"text/x-mssql",mode:"sql"},{name:"MySQL",mime:"text/x-mysql",mode:"sql"},{name:"Nginx",mime:"text/x-nginx-conf",mode:"nginx",file:/nginx.*\.conf$/i},{name:"NSIS",mime:"text/x-nsis",mode:"nsis",ext:["nsh","nsi"]},{name:"NTriples",mime:"text/n-triples",mode:"ntriples",ext:["nt"]},{name:"Objective C",mime:"text/x-objectivec",mode:"clike",ext:["m","mm"]},{name:"OCaml",mime:"text/x-ocaml",mode:"mllike",ext:["ml","mli","mll","mly"]},{name:"Octave",mime:"text/x-octave",mode:"octave",ext:["m"]},{name:"Oz",mime:"text/x-oz",mode:"oz",ext:["oz"]},{name:"Pascal",mime:"text/x-pascal",mode:"pascal",ext:["p","pas"]},{name:"PEG.js",mime:"null",mode:"pegjs",ext:["jsonld"]},{name:"Perl",mime:"text/x-perl",mode:"perl",ext:["pl","pm"]},{name:"PHP",mime:"application/x-httpd-php",mode:"php",ext:["php","php3","php4","php5","phtml"]},{name:"Pig",mime:"text/x-pig",mode:"pig",ext:["pig"]},{name:"Plain Text",mime:"text/plain",mode:"null",ext:["txt","text","conf","def","list","log"]},{name:"PLSQL",mime:"text/x-plsql",mode:"sql",ext:["pls"]},{name:"Properties files",mime:"text/x-properties",mode:"properties",ext:["properties","ini","in"],alias:["ini","properties"]},{name:"ProtoBuf",mime:"text/x-protobuf",mode:"protobuf",ext:["proto"]},{name:"Python",mime:"text/x-python",mode:"python",ext:["py","pyw"]},{name:"Puppet",mime:"text/x-puppet",mode:"puppet",ext:["pp"]},{name:"Q",mime:"text/x-q",mode:"q",ext:["q"]},{name:"R",mime:"text/x-rsrc",mode:"r",ext:["r"],alias:["rscript"]},{name:"reStructuredText",mime:"text/x-rst",mode:"rst",ext:["rst"],alias:["rst"]},{name:"RPM Changes",mime:"text/x-rpm-changes",mode:"rpm"},{name:"RPM Spec",mime:"text/x-rpm-spec",mode:"rpm",ext:["spec"]},{name:"Ruby",mime:"text/x-ruby",mode:"ruby",ext:["rb"],alias:["jruby","macruby","rake","rb","rbx"]},{name:"Rust",mime:"text/x-rustsrc",mode:"rust",ext:["rs"]},{name:"Sass",mime:"text/x-sass",mode:"sass",ext:["sass"]},{name:"Scala",mime:"text/x-scala",mode:"clike",ext:["scala"]},{name:"Scheme",mime:"text/x-scheme",mode:"scheme",ext:["scm","ss"]},{name:"SCSS",mime:"text/x-scss",mode:"css",ext:["scss"]},{name:"Shell",mime:"text/x-sh",mode:"shell",ext:["sh","ksh","bash"],alias:["bash","sh","zsh"],file:/^PKGBUILD$/},{name:"Sieve",mime:"application/sieve",mode:"sieve",ext:["siv","sieve"]},{name:"Slim",mimes:["text/x-slim","application/x-slim"],mode:"slim",ext:["slim"]},{name:"Smalltalk",mime:"text/x-stsrc",mode:"smalltalk",ext:["st"]},{name:"Smarty",mime:"text/x-smarty",mode:"smarty",ext:["tpl"]},{name:"Solr",mime:"text/x-solr",mode:"solr"},{name:"Soy",mime:"text/x-soy",mode:"soy",ext:["soy"],alias:["closure template"]},{name:"SPARQL",mime:"application/sparql-query",mode:"sparql",ext:["rq","sparql"],alias:["sparul"]},{name:"Spreadsheet",mime:"text/x-spreadsheet",mode:"spreadsheet",alias:["excel","formula"]},{name:"SQL",mime:"text/x-sql",mode:"sql",ext:["sql"]},{name:"Squirrel",mime:"text/x-squirrel",mode:"clike",ext:["nut"]},{name:"Swift",mime:"text/x-swift",mode:"swift",ext:["swift"]},{name:"sTeX",mime:"text/x-stex",mode:"stex"},{name:"LaTeX",mime:"text/x-latex",mode:"stex",ext:["text","ltx"],alias:["tex"]},{name:"SystemVerilog",mime:"text/x-systemverilog",mode:"verilog",ext:["v"]},{name:"Tcl",mime:"text/x-tcl",mode:"tcl",ext:["tcl"]},{name:"Textile",mime:"text/x-textile",mode:"textile",ext:["textile"]},{name:"TiddlyWiki ",mime:"text/x-tiddlywiki",mode:"tiddlywiki"},{name:"Tiki wiki",mime:"text/tiki",mode:"tiki"},{name:"TOML",mime:"text/x-toml",mode:"toml",ext:["toml"]},{name:"Tornado",mime:"text/x-tornado",mode:"tornado"},{name:"troff",mime:"text/troff",mode:"troff",ext:["1","2","3","4","5","6","7","8","9"]},{name:"TTCN",mime:"text/x-ttcn",mode:"ttcn",ext:["ttcn","ttcn3","ttcnpp"]},{name:"TTCN_CFG",mime:"text/x-ttcn-cfg",mode:"ttcn-cfg",ext:["cfg"]},{name:"Turtle",mime:"text/turtle",mode:"turtle",ext:["ttl"]},{name:"TypeScript",mime:"application/typescript",mode:"javascript",ext:["ts"],alias:["ts"]},{name:"Twig",mime:"text/x-twig",mode:"twig"},{name:"VB.NET",mime:"text/x-vb",mode:"vb",ext:["vb"]},{name:"VBScript",mime:"text/vbscript",mode:"vbscript",ext:["vbs"]},{name:"Velocity",mime:"text/velocity",mode:"velocity",ext:["vtl"]},{name:"Verilog",mime:"text/x-verilog",mode:"verilog", -ext:["v"]},{name:"VHDL",mime:"text/x-vhdl",mode:"vhdl",ext:["vhd","vhdl"]},{name:"XML",mimes:["application/xml","text/xml"],mode:"xml",ext:["xml","xsl","xsd"],alias:["rss","wsdl","xsd"]},{name:"XQuery",mime:"application/xquery",mode:"xquery",ext:["xy","xquery"]},{name:"YAML",mime:"text/x-yaml",mode:"yaml",ext:["yaml","yml"],alias:["yml"]},{name:"Z80",mime:"text/x-z80",mode:"z80",ext:["z80"]},{name:"mscgen",mime:"text/x-mscgen",mode:"mscgen",ext:["mscgen","mscin","msc"]},{name:"xu",mime:"text/x-xu",mode:"mscgen",ext:["xu"]},{name:"msgenny",mime:"text/x-msgenny",mode:"mscgen",ext:["msgenny"]}];for(var t=0;t-1&&t.substring(i+1,t.length);return o?e.findModeByExtension(o):void 0},e.findModeByName=function(t){t=t.toLowerCase();for(var n=0;n")):null:e.match("--")?n(s("comment","-->")):e.match("DOCTYPE",!0,!0)?(e.eatWhile(/[\w\._\-]/),n(c(1))):null:e.eat("?")?(e.eatWhile(/[\w\._\-]/),t.tokenize=s("meta","?>"),"meta"):(T=e.eat("/")?"closeTag":"openTag",t.tokenize=l,"tag bracket");if("&"==r){var i;return i=e.eat("#")?e.eat("x")?e.eatWhile(/[a-fA-F\d]/)&&e.eat(";"):e.eatWhile(/[\d]/)&&e.eat(";"):e.eatWhile(/[\w\.\-:]/)&&e.eat(";"),i?"atom":"error"}return e.eatWhile(/[^&<]/),null}function l(e,t){var n=e.next();if(">"==n||"/"==n&&e.eat(">"))return t.tokenize=o,T=">"==n?"endTag":"selfcloseTag","tag bracket";if("="==n)return T="equals",null;if("<"==n){t.tokenize=o,t.state=f,t.tagName=t.tagStart=null;var r=t.tokenize(e,t);return r?r+" tag error":"tag error"}return/[\'\"]/.test(n)?(t.tokenize=a(n),t.stringStartCol=e.column(),t.tokenize(e,t)):(e.match(/^[^\s\u00a0=<>\"\']*[^\s\u00a0=<>\"\'\/]/),"word")}function a(e){var t=function(t,n){for(;!t.eol();)if(t.next()==e){n.tokenize=l;break}return"string"};return t.isInAttribute=!0,t}function s(e,t){return function(n,r){for(;!n.eol();){if(n.match(t)){r.tokenize=o;break}n.next()}return e}}function c(e){return function(t,n){for(var r;null!=(r=t.next());){if("<"==r)return n.tokenize=c(e+1),n.tokenize(t,n);if(">"==r){if(1==e){n.tokenize=o;break}return n.tokenize=c(e-1),n.tokenize(t,n)}}return"meta"}}function u(e,t,n){this.prev=e.context,this.tagName=t,this.indent=e.indented,this.startOfLine=n,(C.doNotIndent.hasOwnProperty(t)||e.context&&e.context.noIndent)&&(this.noIndent=!0)}function d(e){e.context&&(e.context=e.context.prev)}function h(e,t){for(var n;;){if(!e.context)return;if(n=e.context.tagName,!C.contextGrabbers.hasOwnProperty(n)||!C.contextGrabbers[n].hasOwnProperty(t))return;d(e)}}function f(e,t,n){return"openTag"==e?(n.tagStart=t.column(),p):"closeTag"==e?m:f}function p(e,t,n){return"word"==e?(n.tagName=t.current(),M="tag",y):(M="error",p)}function m(e,t,n){if("word"==e){var r=t.current();return n.context&&n.context.tagName!=r&&C.implicitlyClosed.hasOwnProperty(n.context.tagName)&&d(n),n.context&&n.context.tagName==r||C.matchClosing===!1?(M="tag",g):(M="tag error",v)}return M="error",v}function g(e,t,n){return"endTag"!=e?(M="error",g):(d(n),f)}function v(e,t,n){return M="error",g(e,t,n)}function y(e,t,n){if("word"==e)return M="attribute",x;if("endTag"==e||"selfcloseTag"==e){var r=n.tagName,i=n.tagStart;return n.tagName=n.tagStart=null,"selfcloseTag"==e||C.autoSelfClosers.hasOwnProperty(r)?h(n,r):(h(n,r),n.context=new u(n,r,i==n.indented)),f}return M="error",y}function x(e,t,n){return"equals"==e?b:(C.allowMissing||(M="error"),y(e,t,n))}function b(e,t,n){return"string"==e?w:"word"==e&&C.allowUnquoted?(M="string",y):(M="error",y(e,t,n))}function w(e,t,n){return"string"==e?w:y(e,t,n)}var k=r.indentUnit,C={},S=i.htmlMode?t:n;for(var L in S)C[L]=S[L];for(var L in i)C[L]=i[L];var T,M;return o.isInText=!0,{startState:function(e){var t={tokenize:o,state:f,indented:e||0,tagName:null,tagStart:null,context:null};return null!=e&&(t.baseIndent=e),t},token:function(e,t){if(!t.tagName&&e.sol()&&(t.indented=e.indentation()),e.eatSpace())return null;T=null;var n=t.tokenize(e,t);return(n||T)&&"comment"!=n&&(M=null,t.state=t.state(T||n,e,t),M&&(n="error"==M?n+" error":M)),n},indent:function(t,n,r){var i=t.context;if(t.tokenize.isInAttribute)return t.tagStart==t.indented?t.stringStartCol+1:t.indented+k;if(i&&i.noIndent)return e.Pass;if(t.tokenize!=l&&t.tokenize!=o)return r?r.match(/^(\s*)/)[0].length:0;if(t.tagName)return C.multilineTagIndentPastTag!==!1?t.tagStart+t.tagName.length+2:t.tagStart+k*(C.multilineTagIndentFactor||1);if(C.alignCDATA&&/$/,blockCommentStart:"",configuration:C.htmlMode?"html":"xml",helperType:C.htmlMode?"html":"xml",skipAttribute:function(e){e.state==b&&(e.state=y)}}}),e.defineMIME("text/xml","xml"),e.defineMIME("application/xml","xml"),e.mimeModes.hasOwnProperty("text/html")||e.defineMIME("text/html",{name:"xml",htmlMode:!0})})},{"../../lib/codemirror":7}],12:[function(t,n,r){(function(t){(function(){function t(e){this.tokens=[],this.tokens.links={},this.options=e||h.defaults,this.rules=f.normal,this.options.gfm&&(this.options.tables?this.rules=f.tables:this.rules=f.gfm)}function i(e,t){if(this.options=t||h.defaults,this.links=e,this.rules=p.normal,this.renderer=this.options.renderer||new o,this.renderer.options=this.options,!this.links)throw new Error("Tokens array requires a `links` property.");this.options.gfm?this.options.breaks?this.rules=p.breaks:this.rules=p.gfm:this.options.pedantic&&(this.rules=p.pedantic)}function o(e){this.options=e||{}}function l(e){this.tokens=[],this.token=null,this.options=e||h.defaults,this.options.renderer=this.options.renderer||new o,this.renderer=this.options.renderer,this.renderer.options=this.options}function a(e,t){return e.replace(t?/&/g:/&(?!#?\w+;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function s(e){return e.replace(/&([#\w]+);/g,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function c(e,t){return e=e.source,t=t||"",function n(r,i){return r?(i=i.source||i,i=i.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(r,i),n):new RegExp(e,t)}}function u(){}function d(e){for(var t,n,r=1;rAn error occured:

    "+a(u.message+"",!0)+"
    ";throw u}}var f={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:u,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:u,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:u,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};f.bullet=/(?:[*+-]|\d+\.)/,f.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,f.item=c(f.item,"gm")(/bull/g,f.bullet)(),f.list=c(f.list)(/bull/g,f.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+f.def.source+")")(),f.blockquote=c(f.blockquote)("def",f.def)(),f._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",f.html=c(f.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,f._tag)(),f.paragraph=c(f.paragraph)("hr",f.hr)("heading",f.heading)("lheading",f.lheading)("blockquote",f.blockquote)("tag","<"+f._tag)("def",f.def)(),f.normal=d({},f),f.gfm=d({},f.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),f.gfm.paragraph=c(f.paragraph)("(?!","(?!"+f.gfm.fences.source.replace("\\1","\\2")+"|"+f.list.source.replace("\\1","\\3")+"|")(),f.tables=d({},f.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),t.rules=f,t.lex=function(e,n){var r=new t(n);return r.lex(e)},t.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},t.prototype.token=function(e,t,n){for(var r,i,o,l,a,s,c,u,d,e=e.replace(/^ +$/gm,"");e;)if((o=this.rules.newline.exec(e))&&(e=e.substring(o[0].length),o[0].length>1&&this.tokens.push({type:"space"})),o=this.rules.code.exec(e))e=e.substring(o[0].length),o=o[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?o:o.replace(/\n+$/,"")});else if(o=this.rules.fences.exec(e))e=e.substring(o[0].length),this.tokens.push({type:"code",lang:o[2],text:o[3]||""});else if(o=this.rules.heading.exec(e))e=e.substring(o[0].length),this.tokens.push({type:"heading",depth:o[1].length,text:o[2]});else if(t&&(o=this.rules.nptable.exec(e))){for(e=e.substring(o[0].length),s={type:"table",header:o[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:o[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:o[3].replace(/\n$/,"").split("\n")},u=0;u ?/gm,""),this.token(o,t,!0),this.tokens.push({type:"blockquote_end"});else if(o=this.rules.list.exec(e)){for(e=e.substring(o[0].length),l=o[2],this.tokens.push({type:"list_start",ordered:l.length>1}),o=o[0].match(this.rules.item),r=!1,d=o.length,u=0;d>u;u++)s=o[u],c=s.length,s=s.replace(/^ *([*+-]|\d+\.) +/,""),~s.indexOf("\n ")&&(c-=s.length,s=this.options.pedantic?s.replace(/^ {1,4}/gm,""):s.replace(new RegExp("^ {1,"+c+"}","gm"),"")),this.options.smartLists&&u!==d-1&&(a=f.bullet.exec(o[u+1])[0],l===a||l.length>1&&a.length>1||(e=o.slice(u+1).join("\n")+e,u=d-1)),i=r||/\n\n(?!\s*$)/.test(s),u!==d-1&&(r="\n"===s.charAt(s.length-1),i||(i=r)),this.tokens.push({type:i?"loose_item_start":"list_item_start"}),this.token(s,!1,n),this.tokens.push({type:"list_item_end"});this.tokens.push({type:"list_end"})}else if(o=this.rules.html.exec(e))e=e.substring(o[0].length),this.tokens.push({type:this.options.sanitize?"paragraph":"html",pre:!this.options.sanitizer&&("pre"===o[1]||"script"===o[1]||"style"===o[1]),text:o[0]});else if(!n&&t&&(o=this.rules.def.exec(e)))e=e.substring(o[0].length),this.tokens.links[o[1].toLowerCase()]={href:o[2],title:o[3]};else if(t&&(o=this.rules.table.exec(e))){for(e=e.substring(o[0].length),s={type:"table",header:o[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:o[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:o[3].replace(/(?: *\| *)?\n$/,"").split("\n")},u=0;u])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:u,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:u,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/,p.link=c(p.link)("inside",p._inside)("href",p._href)(),p.reflink=c(p.reflink)("inside",p._inside)(),p.normal=d({},p),p.pedantic=d({},p.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),p.gfm=d({},p.normal,{escape:c(p.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:c(p.text)("]|","~]|")("|","|https?://|")()}),p.breaks=d({},p.gfm,{br:c(p.br)("{2,}","*")(),text:c(p.gfm.text)("{2,}","*")()}),i.rules=p,i.output=function(e,t,n){var r=new i(t,n);return r.output(e)},i.prototype.output=function(e){for(var t,n,r,i,o="";e;)if(i=this.rules.escape.exec(e))e=e.substring(i[0].length),o+=i[1];else if(i=this.rules.autolink.exec(e))e=e.substring(i[0].length),"@"===i[2]?(n=":"===i[1].charAt(6)?this.mangle(i[1].substring(7)):this.mangle(i[1]),r=this.mangle("mailto:")+n):(n=a(i[1]),r=n),o+=this.renderer.link(r,null,n);else if(this.inLink||!(i=this.rules.url.exec(e))){if(i=this.rules.tag.exec(e))!this.inLink&&/^
    /i.test(i[0])&&(this.inLink=!1),e=e.substring(i[0].length),o+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(i[0]):a(i[0]):i[0];else if(i=this.rules.link.exec(e))e=e.substring(i[0].length),this.inLink=!0,o+=this.outputLink(i,{href:i[2],title:i[3]}),this.inLink=!1;else if((i=this.rules.reflink.exec(e))||(i=this.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){o+=i[0].charAt(0),e=i[0].substring(1)+e;continue}this.inLink=!0,o+=this.outputLink(i,t),this.inLink=!1}else if(i=this.rules.strong.exec(e))e=e.substring(i[0].length),o+=this.renderer.strong(this.output(i[2]||i[1]));else if(i=this.rules.em.exec(e))e=e.substring(i[0].length),o+=this.renderer.em(this.output(i[2]||i[1]));else if(i=this.rules.code.exec(e))e=e.substring(i[0].length),o+=this.renderer.codespan(a(i[2],!0));else if(i=this.rules.br.exec(e))e=e.substring(i[0].length),o+=this.renderer.br();else if(i=this.rules.del.exec(e))e=e.substring(i[0].length),o+=this.renderer.del(this.output(i[1]));else if(i=this.rules.text.exec(e))e=e.substring(i[0].length),o+=this.renderer.text(a(this.smartypants(i[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else e=e.substring(i[0].length),n=a(i[1]),r=n,o+=this.renderer.link(r,null,n);return o},i.prototype.outputLink=function(e,t){var n=a(t.href),r=t.title?a(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,a(e[1]))},i.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},i.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,i=0;r>i;i++)t=e.charCodeAt(i),Math.random()>.5&&(t="x"+t.toString(16)),n+="&#"+t+";";return n},o.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?'
    '+(n?e:a(e,!0))+"\n
    \n":"
    "+(n?e:a(e,!0))+"\n
    "},o.prototype.blockquote=function(e){return"
    \n"+e+"
    \n"},o.prototype.html=function(e){return e},o.prototype.heading=function(e,t,n){return"'+e+"\n"},o.prototype.hr=function(){return this.options.xhtml?"
    \n":"
    \n"},o.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+"\n"},o.prototype.listitem=function(e){return"
  • "+e+"
  • \n"},o.prototype.paragraph=function(e){return"

    "+e+"

    \n"},o.prototype.table=function(e,t){return"\n\n"+e+"\n\n"+t+"\n
    \n"},o.prototype.tablerow=function(e){return"\n"+e+"\n"},o.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return r+e+"\n"},o.prototype.strong=function(e){return""+e+""},o.prototype.em=function(e){return""+e+""},o.prototype.codespan=function(e){return""+e+""},o.prototype.br=function(){return this.options.xhtml?"
    ":"
    "},o.prototype.del=function(e){return""+e+""},o.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(s(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(i){return""}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:"))return""}var o='
    "},o.prototype.image=function(e,t,n){var r=''+n+'":">"},o.prototype.text=function(e){return e},l.parse=function(e,t,n){var r=new l(t,n);return r.parse(e)},l.prototype.parse=function(e){this.inline=new i(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},l.prototype.next=function(){return this.token=this.tokens.pop()},l.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},l.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},l.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,i,o="",l="";for(n="",e=0;e=0&&(f=c.getLineHandle(o),!t(f));o--);var v,y,x,b,w=c.getTokenAt({line:o,ch:1}),k=n(w).fencedChars;t(c.getLineHandle(u.line))?(v="",y=u.line):t(c.getLineHandle(u.line-1))?(v="",y=u.line-1):(v=k+"\n",y=u.line),t(c.getLineHandle(d.line))?(x="",b=d.line,0===d.ch&&(b+=1)):0!==d.ch&&t(c.getLineHandle(d.line+1))?(x="",b=d.line+1):(x=k+"\n",b=d.line+1),0===d.ch&&(b-=1),c.operation(function(){c.replaceRange(x,{line:b,ch:0},{line:b+(x?0:1),ch:0}),c.replaceRange(v,{line:y,ch:0},{line:y+(v?0:1),ch:0})}),c.setSelection({line:y+(v?1:0),ch:0},{line:b+(v?1:-1),ch:0}),c.focus()}else{var C=u.line;if(t(c.getLineHandle(u.line))&&("fenced"===r(c,u.line+1)?(o=u.line,C=u.line+1):(l=u.line,C=u.line-1)),void 0===o)for(o=C;o>=0&&(f=c.getLineHandle(o),!t(f));o--);if(void 0===l)for(a=c.lineCount(),l=C;a>l&&(f=c.getLineHandle(l),!t(f));l++);c.operation(function(){c.replaceRange("",{line:o,ch:0},{line:o+1,ch:0}),c.replaceRange("",{line:l-1,ch:0},{line:l,ch:0})}),c.focus()}else if("indented"===p){if(u.line!==d.line||u.ch!==d.ch)o=u.line,l=d.line,0===d.ch&&l--;else{for(o=u.line;o>=0;o--)if(f=c.getLineHandle(o),!f.text.match(/^\s*$/)&&"indented"!==r(c,o,f)){o+=1;break}for(a=c.lineCount(),l=u.line;a>l;l++)if(f=c.getLineHandle(l),!f.text.match(/^\s*$/)&&"indented"!==r(c,l,f)){l-=1;break}}var S=c.getLineHandle(l+1),L=S&&c.getTokenAt({line:l+1,ch:S.text.length-1}),T=L&&n(L).indentedCode;T&&c.replaceRange("\n",{line:l+1,ch:0});for(var M=o;l>=M;M++)c.indentLine(M,"subtract");c.focus()}else{var N=u.line===d.line&&u.ch===d.ch&&0===u.ch,A=u.line!==d.line;N||A?i(c,u,d,s):O(c,!1,["`","`"])}}function f(e){var t=e.codemirror;W(t,"quote")}function p(e){var t=e.codemirror;H(t,"smaller")}function m(e){var t=e.codemirror;H(t,"bigger")}function g(e){var t=e.codemirror;H(t,void 0,1)}function v(e){var t=e.codemirror;H(t,void 0,2)}function y(e){var t=e.codemirror;H(t,void 0,3)}function x(e){var t=e.codemirror;W(t,"unordered-list")}function b(e){var t=e.codemirror;W(t,"ordered-list")}function w(e){var t=e.codemirror;E(t)}function k(e){var t=e.codemirror,n=a(t),r=e.options,i="http://";return r.promptURLs&&(i=prompt(r.promptTexts.link),!i)?!1:void O(t,n.link,r.insertTexts.link,i)}function C(e){var t=e.codemirror,n=a(t),r=e.options,i="http://";return r.promptURLs&&(i=prompt(r.promptTexts.image),!i)?!1:void O(t,n.image,r.insertTexts.image,i)}function S(e){var t=e.codemirror,n=a(t),r=e.options;O(t,n.table,r.insertTexts.table)}function L(e){var t=e.codemirror,n=a(t),r=e.options;O(t,n.image,r.insertTexts.horizontalRule)}function T(e){var t=e.codemirror;t.undo(),t.focus()}function M(e){var t=e.codemirror;t.redo(),t.focus()}function N(e){var t=e.codemirror,n=t.getWrapperElement(),r=n.nextSibling,i=e.toolbarElements["side-by-side"],o=!1;/editor-preview-active-side/.test(r.className)?(r.className=r.className.replace(/\s*editor-preview-active-side\s*/g,""),i.className=i.className.replace(/\s*active\s*/g,""),n.className=n.className.replace(/\s*CodeMirror-sided\s*/g," ")):(setTimeout(function(){t.getOption("fullScreen")||s(e),r.className+=" editor-preview-active-side"},1),i.className+=" active",n.className+=" CodeMirror-sided",o=!0);var l=n.lastChild;if(/editor-preview-active/.test(l.className)){l.className=l.className.replace(/\s*editor-preview-active\s*/g,"");var a=e.toolbarElements.preview,c=n.previousSibling;a.className=a.className.replace(/\s*active\s*/g,""),c.className=c.className.replace(/\s*disabled-for-preview*/g,"")}var u=function(){r.innerHTML=e.options.previewRender(e.value(),r)};t.sideBySideRenderingFunction||(t.sideBySideRenderingFunction=u),o?(r.innerHTML=e.options.previewRender(e.value(),r),t.on("update",t.sideBySideRenderingFunction)):t.off("update",t.sideBySideRenderingFunction)}function A(e){var t=e.codemirror,n=t.getWrapperElement(),r=n.previousSibling,i=e.options.toolbar?e.toolbarElements.preview:!1,o=n.lastChild;o&&/editor-preview/.test(o.className)||(o=document.createElement("div"),o.className="editor-preview",n.appendChild(o)),/editor-preview-active/.test(o.className)?(o.className=o.className.replace(/\s*editor-preview-active\s*/g,""),i&&(i.className=i.className.replace(/\s*active\s*/g,""),r.className=r.className.replace(/\s*disabled-for-preview*/g,""))):(setTimeout(function(){o.className+=" editor-preview-active"},1),i&&(i.className+=" active",r.className+=" disabled-for-preview")),o.innerHTML=e.options.previewRender(e.value(),o);var l=t.getWrapperElement().nextSibling;/editor-preview-active-side/.test(l.className)&&N(e)}function O(e,t,n,r){if(!/editor-preview-active/.test(e.getWrapperElement().lastChild.className)){var i,o=n[0],l=n[1],a=e.getCursor("start"),s=e.getCursor("end");r&&(l=l.replace("#url#",r)),t?(i=e.getLine(a.line),o=i.slice(0,a.ch),l=i.slice(a.ch),e.replaceRange(o+l,{line:a.line,ch:0})):(i=e.getSelection(),e.replaceSelection(o+i+l),a.ch+=o.length,a!==s&&(s.ch+=o.length)),e.setSelection(a,s),e.focus()}}function H(e,t,n){if(!/editor-preview-active/.test(e.getWrapperElement().lastChild.className)){ -for(var r=e.getCursor("start"),i=e.getCursor("end"),o=r.line;o<=i.line;o++)!function(r){var i=e.getLine(r),o=i.search(/[^#]/);i=void 0!==t?0>=o?"bigger"==t?"###### "+i:"# "+i:6==o&&"smaller"==t?i.substr(7):1==o&&"bigger"==t?i.substr(2):"bigger"==t?i.substr(1):"#"+i:1==n?0>=o?"# "+i:o==n?i.substr(o+1):"# "+i.substr(o+1):2==n?0>=o?"## "+i:o==n?i.substr(o+1):"## "+i.substr(o+1):0>=o?"### "+i:o==n?i.substr(o+1):"### "+i.substr(o+1),e.replaceRange(i,{line:r,ch:0},{line:r,ch:99999999999999})}(o);e.focus()}}function W(e,t){if(!/editor-preview-active/.test(e.getWrapperElement().lastChild.className)){for(var n=a(e),r=e.getCursor("start"),i=e.getCursor("end"),o={quote:/^(\s*)\>\s+/,"unordered-list":/^(\s*)(\*|\-|\+)\s+/,"ordered-list":/^(\s*)\d+\.\s+/},l={quote:"> ","unordered-list":"* ","ordered-list":"1. "},s=r.line;s<=i.line;s++)!function(r){var i=e.getLine(r);i=n[t]?i.replace(o[t],"$1"):l[t]+i,e.replaceRange(i,{line:r,ch:0},{line:r,ch:99999999999999})}(s);e.focus()}}function I(e,t,n,r){if(!/editor-preview-active/.test(e.codemirror.getWrapperElement().lastChild.className)){r="undefined"==typeof r?n:r;var i,o=e.codemirror,l=a(o),s=n,c=r,u=o.getCursor("start"),d=o.getCursor("end");l[t]?(i=o.getLine(u.line),s=i.slice(0,u.ch),c=i.slice(u.ch),"bold"==t?(s=s.replace(/(\*\*|__)(?![\s\S]*(\*\*|__))/,""),c=c.replace(/(\*\*|__)/,"")):"italic"==t?(s=s.replace(/(\*|_)(?![\s\S]*(\*|_))/,""),c=c.replace(/(\*|_)/,"")):"strikethrough"==t&&(s=s.replace(/(\*\*|~~)(?![\s\S]*(\*\*|~~))/,""),c=c.replace(/(\*\*|~~)/,"")),o.replaceRange(s+c,{line:u.line,ch:0},{line:u.line,ch:99999999999999}),"bold"==t||"strikethrough"==t?(u.ch-=2,u!==d&&(d.ch-=2)):"italic"==t&&(u.ch-=1,u!==d&&(d.ch-=1))):(i=o.getSelection(),"bold"==t?(i=i.split("**").join(""),i=i.split("__").join("")):"italic"==t?(i=i.split("*").join(""),i=i.split("_").join("")):"strikethrough"==t&&(i=i.split("~~").join("")),o.replaceSelection(s+i+c),u.ch+=n.length,d.ch=u.ch+i.length),o.setSelection(u,d),o.focus()}}function E(e){if(!/editor-preview-active/.test(e.getWrapperElement().lastChild.className))for(var t,n=e.getCursor("start"),r=e.getCursor("end"),i=n.line;i<=r.line;i++)t=e.getLine(i),t=t.replace(/^[ ]*([# ]+|\*|\-|[> ]+|[0-9]+(.|\)))[ ]*/,""),e.replaceRange(t,{line:i,ch:0},{line:i,ch:99999999999999})}function D(e,t){for(var n in t)t.hasOwnProperty(n)&&(t[n]instanceof Array?e[n]=t[n].concat(e[n]instanceof Array?e[n]:[]):null!==t[n]&&"object"==typeof t[n]&&t[n].constructor===Object?e[n]=D(e[n]||{},t[n]):e[n]=t[n]);return e}function P(e){for(var t=1;t=19968?n[i].length:1;return r}function z(e){e=e||{},e.parent=this;var t=!0;if(e.autoDownloadFontAwesome===!1&&(t=!1),e.autoDownloadFontAwesome!==!0)for(var n=document.styleSheets,r=0;r-1&&(t=!1);if(t){var i=document.createElement("link");i.rel="stylesheet",i.href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css",document.getElementsByTagName("head")[0].appendChild(i)}if(e.element)this.element=e.element;else if(null===e.element)return void console.log("SimpleMDE: Error. No element was found.");if(void 0===e.toolbar){e.toolbar=[];for(var o in K)K.hasOwnProperty(o)&&(-1!=o.indexOf("separator-")&&e.toolbar.push("|"),(K[o]["default"]===!0||e.showIcons&&e.showIcons.constructor===Array&&-1!=e.showIcons.indexOf(o))&&e.toolbar.push(o))}e.hasOwnProperty("status")||(e.status=["autosave","lines","words","cursor"]),e.previewRender||(e.previewRender=function(e){return this.parent.markdown(e)}),e.parsingConfig=P({highlightFormatting:!0},e.parsingConfig||{}),e.insertTexts=P({},X,e.insertTexts||{}),e.promptTexts=Y,e.blockStyles=P({},Z,e.blockStyles||{}),e.shortcuts=P({},U,e.shortcuts||{}),void 0!=e.autosave&&void 0!=e.autosave.unique_id&&""!=e.autosave.unique_id&&(e.autosave.uniqueId=e.autosave.unique_id),this.options=e,this.render(),!e.initialValue||this.options.autosave&&this.options.autosave.foundSavedValue===!0||this.value(e.initialValue)}function R(){if("object"!=typeof localStorage)return!1;try{localStorage.setItem("smde_localStorage",1),localStorage.removeItem("smde_localStorage")}catch(e){return!1}return!0}var B=e("codemirror");e("codemirror/addon/edit/continuelist.js"),e("./codemirror/tablist"),e("codemirror/addon/display/fullscreen.js"),e("codemirror/mode/markdown/markdown.js"),e("codemirror/addon/mode/overlay.js"),e("codemirror/addon/display/placeholder.js"),e("codemirror/mode/gfm/gfm.js"),e("codemirror/mode/xml/xml.js"),e("spell-checker");var j=e("marked"),_=/Mac/.test(navigator.platform),q={toggleBold:c,toggleItalic:u,drawLink:k,toggleHeadingSmaller:p,toggleHeadingBigger:m,drawImage:C,toggleBlockquote:f,toggleOrderedList:b,toggleUnorderedList:x,toggleCodeBlock:h,togglePreview:A,toggleStrikethrough:d,toggleHeading1:g,toggleHeading2:v,toggleHeading3:y,cleanBlock:w,drawTable:S,drawHorizontalRule:L,undo:T,redo:M,toggleSideBySide:N,toggleFullScreen:s},U={toggleBold:"Cmd-B",toggleItalic:"Cmd-I",drawLink:"Cmd-K",toggleHeadingSmaller:"Cmd-H",toggleHeadingBigger:"Shift-Cmd-H",cleanBlock:"Cmd-E",drawImage:"Cmd-Alt-I",toggleBlockquote:"Cmd-'",toggleOrderedList:"Cmd-Alt-L",toggleUnorderedList:"Cmd-L",toggleCodeBlock:"Cmd-Alt-C",togglePreview:"Cmd-P",toggleSideBySide:"F9",toggleFullScreen:"F11"},G=function(e){for(var t in q)if(q[t]===e)return t;return null},$=function(){var e=!1;return function(t){(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))&&(e=!0)}(navigator.userAgent||navigator.vendor||window.opera),e},V="",K={bold:{name:"bold",action:c,className:"fa fa-bold",title:"Bold","default":!0},italic:{name:"italic",action:u,className:"fa fa-italic",title:"Italic","default":!0},strikethrough:{name:"strikethrough",action:d,className:"fa fa-strikethrough",title:"Strikethrough"},heading:{name:"heading",action:p,className:"fa fa-header",title:"Heading","default":!0},"heading-smaller":{name:"heading-smaller",action:p,className:"fa fa-header fa-header-x fa-header-smaller",title:"Smaller Heading"},"heading-bigger":{name:"heading-bigger",action:m,className:"fa fa-header fa-header-x fa-header-bigger",title:"Bigger Heading"},"heading-1":{name:"heading-1",action:g,className:"fa fa-header fa-header-x fa-header-1",title:"Big Heading"},"heading-2":{name:"heading-2",action:v,className:"fa fa-header fa-header-x fa-header-2",title:"Medium Heading"},"heading-3":{name:"heading-3",action:y,className:"fa fa-header fa-header-x fa-header-3",title:"Small Heading"},"separator-1":{name:"separator-1"},code:{name:"code",action:h,className:"fa fa-code",title:"Code"},quote:{name:"quote",action:f,className:"fa fa-quote-left",title:"Quote","default":!0},"unordered-list":{name:"unordered-list",action:x,className:"fa fa-list-ul",title:"Generic List","default":!0},"ordered-list":{name:"ordered-list",action:b,className:"fa fa-list-ol",title:"Numbered List","default":!0},"clean-block":{name:"clean-block",action:w,className:"fa fa-eraser fa-clean-block",title:"Clean block"},"separator-2":{name:"separator-2"},link:{name:"link",action:k,className:"fa fa-link",title:"Create Link","default":!0},image:{name:"image",action:C,className:"fa fa-picture-o",title:"Insert Image","default":!0},table:{name:"table",action:S,className:"fa fa-table",title:"Insert Table"},"horizontal-rule":{name:"horizontal-rule",action:L,className:"fa fa-minus",title:"Insert Horizontal Line"},"separator-3":{name:"separator-3"},preview:{name:"preview",action:A,className:"fa fa-eye no-disable",title:"Toggle Preview","default":!0},"side-by-side":{name:"side-by-side",action:N,className:"fa fa-columns no-disable no-mobile",title:"Toggle Side by Side","default":!0},fullscreen:{name:"fullscreen",action:s,className:"fa fa-arrows-alt no-disable no-mobile",title:"Toggle Fullscreen","default":!0},"separator-4":{name:"separator-4"},guide:{name:"guide",action:"https://simplemde.com/markdown-guide",className:"fa fa-question-circle",title:"Markdown Guide","default":!0},"separator-5":{name:"separator-5"},undo:{name:"undo",action:T,className:"fa fa-undo no-disable",title:"Undo"},redo:{name:"redo",action:M,className:"fa fa-repeat no-disable",title:"Redo"}},X={link:["[","](#url#)"],image:["![","](#url#)"],table:["","\n\n| Column 1 | Column 2 | Column 3 |\n| -------- | -------- | -------- |\n| Text | Text | Text |\n\n"],horizontalRule:["","\n\n-----\n\n"]},Y={link:"URL for the link:",image:"URL of the image:"},Z={bold:"**",code:"```",italic:"*"};z.prototype.markdown=function(e){if(j){var t={};return this.options&&this.options.renderingConfig&&this.options.renderingConfig.singleLineBreaks===!1?t.breaks=!1:t.breaks=!0,this.options&&this.options.renderingConfig&&this.options.renderingConfig.codeSyntaxHighlighting===!0&&window.hljs&&(t.highlight=function(e){return window.hljs.highlightAuto(e).value}),j.setOptions(t),j(e)}},z.prototype.render=function(e){if(e||(e=this.element||document.getElementsByTagName("textarea")[0]),!this._rendered||this._rendered!==e){this.element=e;var t=this.options,n=this,i={};for(var o in t.shortcuts)null!==t.shortcuts[o]&&null!==q[o]&&!function(e){i[r(t.shortcuts[e])]=function(){q[e](n)}}(o);i.Enter="newlineAndIndentContinueMarkdownList",i.Tab="tabAndIndentMarkdownList",i["Shift-Tab"]="shiftTabAndUnindentMarkdownList",i.Esc=function(e){e.getOption("fullScreen")&&s(n)},document.addEventListener("keydown",function(e){e=e||window.event,27==e.keyCode&&n.codemirror.getOption("fullScreen")&&s(n)},!1);var l,a;if(t.spellChecker!==!1?(l="spell-checker",a=t.parsingConfig,a.name="gfm",a.gitHubSpice=!1):(l=t.parsingConfig,l.name="gfm",l.gitHubSpice=!1),this.codemirror=B.fromTextArea(e,{mode:l,backdrop:a,theme:"paper",tabSize:void 0!=t.tabSize?t.tabSize:2,indentUnit:void 0!=t.tabSize?t.tabSize:2,indentWithTabs:t.indentWithTabs!==!1,lineNumbers:!1,autofocus:t.autofocus===!0,extraKeys:i,lineWrapping:t.lineWrapping!==!1,allowDropFileTypes:["text/plain"],placeholder:t.placeholder||e.getAttribute("placeholder")||""}),t.forceSync===!0){var c=this.codemirror;c.on("change",function(){c.save()})}this.gui={},t.toolbar!==!1&&(this.gui.toolbar=this.createToolbar()),t.status!==!1&&(this.gui.statusbar=this.createStatusbar()),void 0!=t.autosave&&t.autosave.enabled===!0&&this.autosave(),this.gui.sideBySide=this.createSideBySide(),this._rendered=this.element}},z.prototype.autosave=function(){if(R()){var e=this;if(void 0==this.options.autosave.uniqueId||""==this.options.autosave.uniqueId)return void console.log("SimpleMDE: You must set a uniqueId to use the autosave feature");null!=e.element.form&&void 0!=e.element.form&&e.element.form.addEventListener("submit",function(){localStorage.removeItem("smde_"+e.options.autosave.uniqueId)}),this.options.autosave.loaded!==!0&&("string"==typeof localStorage.getItem("smde_"+this.options.autosave.uniqueId)&&""!=localStorage.getItem("smde_"+this.options.autosave.uniqueId)&&(this.codemirror.setValue(localStorage.getItem("smde_"+this.options.autosave.uniqueId)),this.options.autosave.foundSavedValue=!0),this.options.autosave.loaded=!0),localStorage.setItem("smde_"+this.options.autosave.uniqueId,e.value());var t=document.getElementById("autosaved");if(null!=t&&void 0!=t&&""!=t){var n=new Date,r=n.getHours(),i=n.getMinutes(),o="am",l=r;l>=12&&(l=r-12,o="pm"),0==l&&(l=12),i=10>i?"0"+i:i,t.innerHTML="Autosaved: "+l+":"+i+" "+o}this.autosaveTimeoutId=setTimeout(function(){e.autosave()},this.options.autosave.delay||1e4)}else console.log("SimpleMDE: localStorage not available, cannot autosave")},z.prototype.clearAutosavedValue=function(){if(R()){if(void 0==this.options.autosave||void 0==this.options.autosave.uniqueId||""==this.options.autosave.uniqueId)return void console.log("SimpleMDE: You must set a uniqueId to clear the autosave value");localStorage.removeItem("smde_"+this.options.autosave.uniqueId)}else console.log("SimpleMDE: localStorage not available, cannot autosave")},z.prototype.createSideBySide=function(){var e=this.codemirror,t=e.getWrapperElement(),n=t.nextSibling;n&&/editor-preview-side/.test(n.className)||(n=document.createElement("div"),n.className="editor-preview-side",t.parentNode.insertBefore(n,t.nextSibling));var r=!1,i=!1;return e.on("scroll",function(e){if(r)return void(r=!1);i=!0;var t=e.getScrollInfo().height-e.getScrollInfo().clientHeight,o=parseFloat(e.getScrollInfo().top)/t,l=(n.scrollHeight-n.clientHeight)*o;n.scrollTop=l}),n.onscroll=function(){if(i)return void(i=!1);r=!0;var t=n.scrollHeight-n.clientHeight,o=parseFloat(n.scrollTop)/t,l=(e.getScrollInfo().height-e.getScrollInfo().clientHeight)*o;e.scrollTo(0,l)},n},z.prototype.createToolbar=function(e){if(e=e||this.options.toolbar,e&&0!==e.length){var t;for(t=0;t
  • Links, Language bindings, Engine bindings
  • Tips
  • -
  • Bezier widget (by @r-lyeh)#786
  • +
  • Bezier widget (by @r-lyeh) https://github.com/ocornut/imgui/issues/786
  • `, // wine-staging wiki home extract: special wiki syntax, images diff --git a/routers/api/v1/misc/version.go b/routers/api/v1/misc/version.go index 92950c1..1780398 100644 --- a/routers/api/v1/misc/version.go +++ b/routers/api/v1/misc/version.go @@ -12,5 +12,17 @@ import ( // Version shows the version of the Gitea server func Version(ctx *context.APIContext) { + // swagger:route GET /version miscellaneous getVersion + // + // Return Gitea running version. + // + // This show current running Gitea application version. + // + // Produces: + // - application/json + // + // Responses: + // 200: ServerVersion + ctx.JSON(200, &gitea.ServerVersion{Version: setting.AppVer}) } diff --git a/routers/api/v1/org/hook.go b/routers/api/v1/org/hook.go index 3a0b74a..d8a4c45 100644 --- a/routers/api/v1/org/hook.go +++ b/routers/api/v1/org/hook.go @@ -15,6 +15,15 @@ import ( // ListHooks list an organziation's webhooks func ListHooks(ctx *context.APIContext) { + // swagger:route GET /orgs/{orgname}/hooks organization orgListHooks + // + // Produces: + // - application/json + // + // Responses: + // 200: HookList + // 500: error + org := ctx.Org.Organization orgHooks, err := models.GetWebhooksByOrgID(org.ID) if err != nil { @@ -30,6 +39,16 @@ func ListHooks(ctx *context.APIContext) { // GetHook get an organization's hook by id func GetHook(ctx *context.APIContext) { + // swagger:route GET /orgs/{orgname}/hooks/{id} organization orgGetHook + // + // Produces: + // - application/json + // + // Responses: + // 200: Hook + // 404: notFound + // 500: error + org := ctx.Org.Organization hookID := ctx.ParamsInt64(":id") hook, err := utils.GetOrgHook(ctx, org.ID, hookID) @@ -41,6 +60,19 @@ func GetHook(ctx *context.APIContext) { // CreateHook create a hook for an organization func CreateHook(ctx *context.APIContext, form api.CreateHookOption) { + // swagger:route POST /orgs/{orgname}/hooks/ organization orgCreateHook + // + // Consumes: + // - application/json + // + // Produces: + // - application/json + // + // Responses: + // 201: Hook + // 422: validationError + // 500: error + if !utils.CheckCreateHookOption(ctx, &form) { return } @@ -49,12 +81,36 @@ func CreateHook(ctx *context.APIContext, form api.CreateHookOption) { // EditHook modify a hook of a repository func EditHook(ctx *context.APIContext, form api.EditHookOption) { + // swagger:route PATCH /orgs/{orgname}/hooks/{id} organization orgEditHook + // + // Consumes: + // - application/json + // + // Produces: + // - application/json + // + // Responses: + // 200: Hook + // 422: validationError + // 404: notFound + // 500: error + hookID := ctx.ParamsInt64(":id") utils.EditOrgHook(ctx, &form, hookID) } // DeleteHook delete a hook of an organization func DeleteHook(ctx *context.APIContext) { + // swagger:route DELETE /orgs/{orgname}/hooks/{id} organization orgDeleteHook + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 404: notFound + // 500: error + org := ctx.Org.Organization hookID := ctx.ParamsInt64(":id") if err := models.DeleteWebhookByOrgID(org.ID, hookID); err != nil { diff --git a/routers/api/v1/org/member.go b/routers/api/v1/org/member.go index b6b111b..3495370 100644 --- a/routers/api/v1/org/member.go +++ b/routers/api/v1/org/member.go @@ -53,37 +53,79 @@ func listMembers(ctx *context.APIContext, publicOnly bool) { // ListMembers list an organization's members func ListMembers(ctx *context.APIContext) { - listMembers(ctx, !ctx.Org.Organization.IsOrgMember(ctx.User.ID)) + // swagger:route GET /orgs/{orgname}/members organization orgListMembers + // + // Produces: + // - application/json + // + // Responses: + // 200: UserList + // 500: error + + publicOnly := ctx.User == nil || !ctx.Org.Organization.IsOrgMember(ctx.User.ID) + listMembers(ctx, publicOnly) } // ListPublicMembers list an organization's public members func ListPublicMembers(ctx *context.APIContext) { + // swagger:route GET /orgs/{orgname}/public_members organization orgListPublicMembers + // + // Produces: + // - application/json + // + // Responses: + // 200: UserList + // 500: error + listMembers(ctx, true) } // IsMember check if a user is a member of an organization func IsMember(ctx *context.APIContext) { - org := ctx.Org.Organization - requester := ctx.User + // swagger:route GET /orgs/{orgname}/members/{username} organization orgIsMember + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 302: redirect + // 404: notFound + userToCheck := user.GetUserByParams(ctx) - if org.IsOrgMember(requester.ID) { - if org.IsOrgMember(userToCheck.ID) { + if ctx.Written() { + return + } + if ctx.User != nil && ctx.Org.Organization.IsOrgMember(ctx.User.ID) { + if ctx.Org.Organization.IsOrgMember(userToCheck.ID) { ctx.Status(204) } else { ctx.Status(404) } - } else if requester.ID == userToCheck.ID { + } else if ctx.User != nil && ctx.User.ID == userToCheck.ID { ctx.Status(404) } else { redirectURL := fmt.Sprintf("%sapi/v1/orgs/%s/public_members/%s", - setting.AppURL, org.Name, userToCheck.Name) + setting.AppURL, ctx.Org.Organization.Name, userToCheck.Name) ctx.Redirect(redirectURL, 302) } } // IsPublicMember check if a user is a public member of an organization func IsPublicMember(ctx *context.APIContext) { + // swagger:route GET /orgs/{orgname}/public_members/{username} organization orgIsPublicMember + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 404: notFound + userToCheck := user.GetUserByParams(ctx) + if ctx.Written() { + return + } if userToCheck.IsPublicMember(ctx.Org.Organization.ID) { ctx.Status(204) } else { @@ -93,7 +135,20 @@ func IsPublicMember(ctx *context.APIContext) { // PublicizeMember make a member's membership public func PublicizeMember(ctx *context.APIContext) { + // swagger:route PUT /orgs/{orgname}/public_members/{username} organization orgPublicizeMember + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 403: forbidden + // 500: error + userToPublicize := user.GetUserByParams(ctx) + if ctx.Written() { + return + } if userToPublicize.ID != ctx.User.ID { ctx.Error(403, "", "Cannot publicize another member") return @@ -108,7 +163,20 @@ func PublicizeMember(ctx *context.APIContext) { // ConcealMember make a member's membership not public func ConcealMember(ctx *context.APIContext) { + // swagger:route DELETE /orgs/{orgname}/public_members/{username} organization orgConcealMember + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 403: forbidden + // 500: error + userToConceal := user.GetUserByParams(ctx) + if ctx.Written() { + return + } if userToConceal.ID != ctx.User.ID { ctx.Error(403, "", "Cannot conceal another member") return @@ -123,9 +191,20 @@ func ConcealMember(ctx *context.APIContext) { // DeleteMember remove a member from an organization func DeleteMember(ctx *context.APIContext) { - org := ctx.Org.Organization - memberID := user.GetUserByParams(ctx).ID - if err := org.RemoveMember(memberID); err != nil { + // swagger:route DELETE /orgs/{orgname}/members/{username} organization orgDeleteMember + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 500: error + + member := user.GetUserByParams(ctx) + if ctx.Written() { + return + } + if err := ctx.Org.Organization.RemoveMember(member.ID); err != nil { ctx.Error(500, "RemoveMember", err) } ctx.Status(204) diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go index e4a36b9..ec55b9e 100644 --- a/routers/api/v1/org/org.go +++ b/routers/api/v1/org/org.go @@ -56,7 +56,7 @@ func Edit(ctx *context.APIContext, form api.EditOrgOption) { org.Description = form.Description org.Website = form.Website org.Location = form.Location - if err := models.UpdateUser(org); err != nil { + if err := models.UpdateUserCols(org, "full_name", "description", "website", "location"); err != nil { ctx.Error(500, "UpdateUser", err) return } diff --git a/routers/api/v1/org/team.go b/routers/api/v1/org/team.go index f9d9339..dbd6ccc 100644 --- a/routers/api/v1/org/team.go +++ b/routers/api/v1/org/team.go @@ -131,7 +131,7 @@ func GetTeamRepos(ctx *context.APIContext) { } repos := make([]*api.Repository, len(team.Repos)) for i, repo := range team.Repos { - access, err := models.AccessLevel(ctx.User, repo) + access, err := models.AccessLevel(ctx.User.ID, repo) if err != nil { ctx.Error(500, "GetTeamRepos", err) return @@ -161,7 +161,7 @@ func AddTeamRepository(ctx *context.APIContext) { if ctx.Written() { return } - if access, err := models.AccessLevel(ctx.User, repo); err != nil { + if access, err := models.AccessLevel(ctx.User.ID, repo); err != nil { ctx.Error(500, "AccessLevel", err) return } else if access < models.AccessModeAdmin { @@ -181,7 +181,7 @@ func RemoveTeamRepository(ctx *context.APIContext) { if ctx.Written() { return } - if access, err := models.AccessLevel(ctx.User, repo); err != nil { + if access, err := models.AccessLevel(ctx.User.ID, repo); err != nil { ctx.Error(500, "AccessLevel", err) return } else if access < models.AccessModeAdmin { diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 3c73ae6..aed630f 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -7,6 +7,7 @@ package repo import ( api "code.gitea.io/sdk/gitea" + "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/routers/api/v1/convert" ) @@ -14,9 +15,20 @@ import ( // GetBranch get a branch of a repository // see https://github.com/gogits/go-gogs-client/wiki/Repositories#get-branch func GetBranch(ctx *context.APIContext) { - branch, err := ctx.Repo.Repository.GetBranch(ctx.Params(":branchname")) + if ctx.Repo.TreePath != "" { + // if TreePath != "", then URL contained extra slashes + // (i.e. "master/subbranch" instead of "master"), so branch does + // not exist + ctx.Status(404) + return + } + branch, err := ctx.Repo.Repository.GetBranch(ctx.Repo.BranchName) if err != nil { - ctx.Error(500, "GetBranch", err) + if models.IsErrBranchNotExist(err) { + ctx.Error(404, "GetBranch", err) + } else { + ctx.Error(500, "GetBranch", err) + } return } diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index 16a31f9..9d12a6e 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -20,6 +20,11 @@ func GetRawFile(ctx *context.APIContext) { return } + if ctx.Repo.Repository.IsBare { + ctx.Status(404) + return + } + blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreePath) if err != nil { if git.IsErrNotExist(err) { diff --git a/routers/api/v1/repo/fork.go b/routers/api/v1/repo/fork.go index e8f57ac..e4f4500 100644 --- a/routers/api/v1/repo/fork.go +++ b/routers/api/v1/repo/fork.go @@ -9,10 +9,20 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/routers/api/v1/utils" ) // ListForks list a repository's forks func ListForks(ctx *context.APIContext) { + // swagger:route GET /repos/{owner}/{repo}/forks repository listForks + // + // Produces: + // - application/json + // + // Responses: + // 200: RepositoryList + // 500: error + forks, err := ctx.Repo.Repository.GetForks() if err != nil { ctx.Error(500, "GetForks", err) @@ -20,7 +30,7 @@ func ListForks(ctx *context.APIContext) { } apiForks := make([]*api.Repository, len(forks)) for i, fork := range forks { - access, err := models.AccessLevel(ctx.User, fork) + access, err := models.AccessLevel(utils.UserID(ctx), fork) if err != nil { ctx.Error(500, "AccessLevel", err) return @@ -32,6 +42,17 @@ func ListForks(ctx *context.APIContext) { // CreateFork create a fork of a repo func CreateFork(ctx *context.APIContext, form api.CreateForkOption) { + // swagger:route POST /repos/{owner}/{repo}/forks repository createFork + // + // Produces: + // - application/json + // + // Responses: + // 202: Repository + // 403: forbidden + // 422: validationError + // 500: error + repo := ctx.Repo.Repository var forker *models.User // user/org that will own the fork if form.Organization == nil { @@ -39,7 +60,7 @@ func CreateFork(ctx *context.APIContext, form api.CreateForkOption) { } else { org, err := models.GetOrgByName(*form.Organization) if err != nil { - if err == models.ErrOrgNotExist { + if models.IsErrOrgNotExist(err) { ctx.Error(422, "", err) } else { ctx.Error(500, "GetOrgByName", err) diff --git a/routers/api/v1/repo/hook.go b/routers/api/v1/repo/hook.go index 2e3b655..72dfeff 100644 --- a/routers/api/v1/repo/hook.go +++ b/routers/api/v1/repo/hook.go @@ -14,8 +14,16 @@ import ( ) // ListHooks list all hooks of a repository -// see https://github.com/gogits/go-gogs-client/wiki/Repositories#list-hooks func ListHooks(ctx *context.APIContext) { + // swagger:route GET /repos/{username}/{reponame}/hooks repository repoListHooks + // + // Produces: + // - application/json + // + // Responses: + // 200: HookList + // 500: error + hooks, err := models.GetWebhooksByRepoID(ctx.Repo.Repository.ID) if err != nil { ctx.Error(500, "GetWebhooksByRepoID", err) @@ -41,8 +49,20 @@ func GetHook(ctx *context.APIContext) { } // CreateHook create a hook for a repository -// see https://github.com/gogits/go-gogs-client/wiki/Repositories#create-a-hook func CreateHook(ctx *context.APIContext, form api.CreateHookOption) { + // swagger:route POST /repos/{username}/{reponame}/hooks repository repoCreateHook + // + // Consumes: + // - application/json + // + // Produces: + // - application/json + // + // Responses: + // 200: Hook + // 422: validationError + // 500: error + if !utils.CheckCreateHookOption(ctx, &form) { return } @@ -50,14 +70,33 @@ func CreateHook(ctx *context.APIContext, form api.CreateHookOption) { } // EditHook modify a hook of a repository -// see https://github.com/gogits/go-gogs-client/wiki/Repositories#edit-a-hook func EditHook(ctx *context.APIContext, form api.EditHookOption) { + // swagger:route PATCH /repos/{username}/{reponame}/hooks/{id} repository repoEditHook + // + // Produces: + // - application/json + // + // Responses: + // 200: Hook + // 422: validationError + // 500: error + hookID := ctx.ParamsInt64(":id") utils.EditRepoHook(ctx, &form, hookID) } // DeleteHook delete a hook of a repository func DeleteHook(ctx *context.APIContext) { + // swagger:route DELETE /repos/{username}/{reponame}/hooks/{id} repository repoDeleteHook + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 404: notFound + // 500: error + if err := models.DeleteWebhookByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")); err != nil { if models.IsErrWebhookNotExist(err) { ctx.Status(404) diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index 9afde1f..9f51022 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -18,27 +18,26 @@ import ( // ListIssues list the issues of a repository func ListIssues(ctx *context.APIContext) { - isClosed := ctx.Query("state") == "closed" - issueOpts := models.IssuesOptions{ - RepoID: ctx.Repo.Repository.ID, - Page: ctx.QueryInt("page"), - IsClosed: util.OptionalBoolOf(isClosed), + var isClosed util.OptionalBool + switch ctx.Query("state") { + case "closed": + isClosed = util.OptionalBoolTrue + case "all": + isClosed = util.OptionalBoolNone + default: + isClosed = util.OptionalBoolFalse } - issues, err := models.Issues(&issueOpts) + issues, err := models.Issues(&models.IssuesOptions{ + RepoID: ctx.Repo.Repository.ID, + Page: ctx.QueryInt("page"), + PageSize: setting.UI.IssuePagingNum, + IsClosed: isClosed, + }) if err != nil { ctx.Error(500, "Issues", err) return } - if ctx.Query("state") == "all" { - issueOpts.IsClosed = util.OptionalBoolOf(!isClosed) - tempIssues, err := models.Issues(&issueOpts) - if err != nil { - ctx.Error(500, "Issues", err) - return - } - issues = append(issues, tempIssues...) - } err = models.IssueList(issues).LoadAttributes() if err != nil { diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go index 13e3ec6..b57511a 100644 --- a/routers/api/v1/repo/issue_comment.go +++ b/routers/api/v1/repo/issue_comment.go @@ -27,7 +27,11 @@ func ListIssueComments(ctx *context.APIContext) { return } - comments, err := models.GetCommentsByIssueIDSince(issue.ID, since.Unix()) + comments, err := models.FindComments(models.FindCommentsOptions{ + IssueID: issue.ID, + Since: since.Unix(), + Type: models.CommentTypeComment, + }) if err != nil { ctx.Error(500, "GetCommentsByIssueIDSince", err) return @@ -47,7 +51,11 @@ func ListRepoIssueComments(ctx *context.APIContext) { since, _ = time.Parse(time.RFC3339, ctx.Query("since")) } - comments, err := models.GetCommentsByRepoIDSince(ctx.Repo.Repository.ID, since.Unix()) + comments, err := models.FindComments(models.FindCommentsOptions{ + RepoID: ctx.Repo.Repository.ID, + Since: since.Unix(), + Type: models.CommentTypeComment, + }) if err != nil { ctx.Error(500, "GetCommentsByRepoIDSince", err) return diff --git a/routers/api/v1/repo/issue_label.go b/routers/api/v1/repo/issue_label.go index d94d666..2eec743 100644 --- a/routers/api/v1/repo/issue_label.go +++ b/routers/api/v1/repo/issue_label.go @@ -66,7 +66,7 @@ func AddIssueLabels(ctx *context.APIContext, form api.IssueLabelsOption) { apiLabels := make([]*api.Label, len(labels)) for i := range labels { - apiLabels[i] = issue.Labels[i].APIFormat() + apiLabels[i] = labels[i].APIFormat() } ctx.JSON(200, &apiLabels) } @@ -142,7 +142,7 @@ func ReplaceIssueLabels(ctx *context.APIContext, form api.IssueLabelsOption) { apiLabels := make([]*api.Label, len(labels)) for i := range labels { - apiLabels[i] = issue.Labels[i].APIFormat() + apiLabels[i] = labels[i].APIFormat() } ctx.JSON(200, &apiLabels) } diff --git a/routers/api/v1/repo/label.go b/routers/api/v1/repo/label.go index c22db51..c932fb1 100644 --- a/routers/api/v1/repo/label.go +++ b/routers/api/v1/repo/label.go @@ -64,7 +64,7 @@ func CreateLabel(ctx *context.APIContext, form api.CreateLabelOption) { Color: form.Color, RepoID: ctx.Repo.Repository.ID, } - if err := models.NewLabels(label); err != nil { + if err := models.NewLabel(label); err != nil { ctx.Error(500, "NewLabel", err) return } diff --git a/routers/api/v1/repo/release.go b/routers/api/v1/repo/release.go index 7dacb80..78289a6 100644 --- a/routers/api/v1/repo/release.go +++ b/routers/api/v1/repo/release.go @@ -5,8 +5,6 @@ package repo import ( - "strings" - api "code.gitea.io/sdk/gitea" "code.gitea.io/gitea/models" @@ -34,22 +32,16 @@ func GetRelease(ctx *context.APIContext) { // ListReleases list a repository's releases func ListReleases(ctx *context.APIContext) { - releases, err := models.GetReleasesByRepoID(ctx.Repo.Repository.ID, 1, 2147483647) + releases, err := models.GetReleasesByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{ + IncludeDrafts: ctx.Repo.AccessMode >= models.AccessModeWrite, + IncludeTags: false, + }, 1, 2147483647) if err != nil { ctx.Error(500, "GetReleasesByRepoID", err) return } rels := make([]*api.Release, len(releases)) - access, err := models.AccessLevel(ctx.User, ctx.Repo.Repository) - if err != nil { - ctx.Error(500, "AccessLevel", err) - return - } for i, release := range releases { - if release.IsDraft && access < models.AccessModeWrite { - // hide drafts from users without push access - continue - } if err := release.LoadAttributes(); err != nil { ctx.Error(500, "LoadAttributes", err) return @@ -69,43 +61,49 @@ func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) { ctx.Status(404) return } - tag, err := ctx.Repo.GitRepo.GetTag(form.TagName) + rel, err := models.GetRelease(ctx.Repo.Repository.ID, form.TagName) if err != nil { - ctx.Error(500, "GetTag", err) - return - } - commit, err := tag.Commit() - if err != nil { - ctx.Error(500, "Commit", err) - return - } - commitsCount, err := commit.CommitsCount() - if err != nil { - ctx.Error(500, "CommitsCount", err) - return - } - rel := &models.Release{ - RepoID: ctx.Repo.Repository.ID, - PublisherID: ctx.User.ID, - Publisher: ctx.User, - TagName: form.TagName, - LowerTagName: strings.ToLower(form.TagName), - Target: form.Target, - Title: form.Title, - Sha1: commit.ID.String(), - NumCommits: commitsCount, - Note: form.Note, - IsDraft: form.IsDraft, - IsPrerelease: form.IsPrerelease, - CreatedUnix: commit.Author.When.Unix(), - } - if err := models.CreateRelease(ctx.Repo.GitRepo, rel, nil); err != nil { - if models.IsErrReleaseAlreadyExist(err) { - ctx.Status(409) - } else { - ctx.Error(500, "CreateRelease", err) + if !models.IsErrReleaseNotExist(err) { + ctx.Handle(500, "GetRelease", err) + return + } + rel = &models.Release{ + RepoID: ctx.Repo.Repository.ID, + PublisherID: ctx.User.ID, + Publisher: ctx.User, + TagName: form.TagName, + Target: form.Target, + Title: form.Title, + Note: form.Note, + IsDraft: form.IsDraft, + IsPrerelease: form.IsPrerelease, + IsTag: false, + } + if err := models.CreateRelease(ctx.Repo.GitRepo, rel, nil); err != nil { + if models.IsErrReleaseAlreadyExist(err) { + ctx.Status(409) + } else { + ctx.Error(500, "CreateRelease", err) + } + return + } + } else { + if !rel.IsTag { + ctx.Status(409) + return + } + + rel.Title = form.Title + rel.Note = form.Note + rel.IsDraft = form.IsDraft + rel.IsPrerelease = form.IsPrerelease + rel.PublisherID = ctx.User.ID + rel.IsTag = false + + if err = models.UpdateRelease(ctx.Repo.GitRepo, rel, nil); err != nil { + ctx.Handle(500, "UpdateRelease", err) + return } - return } ctx.JSON(201, rel.APIFormat()) } @@ -118,11 +116,12 @@ func EditRelease(ctx *context.APIContext, form api.EditReleaseOption) { } id := ctx.ParamsInt64(":id") rel, err := models.GetReleaseByID(id) - if err != nil { + if err != nil && !models.IsErrReleaseNotExist(err) { ctx.Error(500, "GetReleaseByID", err) return } - if rel.RepoID != ctx.Repo.Repository.ID { + if err != nil && models.IsErrReleaseNotExist(err) || + rel.IsTag || rel.RepoID != ctx.Repo.Repository.ID { ctx.Status(404) return } @@ -169,12 +168,13 @@ func DeleteRelease(ctx *context.APIContext) { return } id := ctx.ParamsInt64(":id") - release, err := models.GetReleaseByID(id) - if err != nil { + rel, err := models.GetReleaseByID(id) + if err != nil && !models.IsErrReleaseNotExist(err) { ctx.Error(500, "GetReleaseByID", err) return } - if release.RepoID != ctx.Repo.Repository.ID { + if err != nil && models.IsErrReleaseNotExist(err) || + rel.IsTag || rel.RepoID != ctx.Repo.Repository.ID { ctx.Status(404) return } diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index a432466..305daa0 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -5,6 +5,7 @@ package repo import ( + "fmt" "strings" api "code.gitea.io/sdk/gitea" @@ -18,66 +19,87 @@ import ( ) // Search repositories via options -// see https://github.com/gogits/go-gogs-client/wiki/Repositories#search-repositories func Search(ctx *context.APIContext) { + // swagger:route GET /repos/search repository repoSearch + // + // Produces: + // - application/json + // + // Responses: + // 200: SearchResults + // 500: SearchError + opts := &models.SearchRepoOptions{ Keyword: strings.Trim(ctx.Query("q"), " "), OwnerID: ctx.QueryInt64("uid"), PageSize: convert.ToCorrectPageSize(ctx.QueryInt("limit")), } + if ctx.User != nil && ctx.User.ID == opts.OwnerID { + opts.Searcher = ctx.User + } // Check visibility. if ctx.IsSigned && opts.OwnerID > 0 { if ctx.User.ID == opts.OwnerID { opts.Private = true + opts.Collaborate = true } else { u, err := models.GetUserByID(opts.OwnerID) if err != nil { - ctx.JSON(500, map[string]interface{}{ - "ok": false, - "error": err.Error(), + ctx.JSON(500, api.SearchError{ + OK: false, + Error: err.Error(), }) return } if u.IsOrganization() && u.IsOwnedBy(ctx.User.ID) { opts.Private = true } - // FIXME: how about collaborators? + + if !u.IsOrganization() { + opts.Collaborate = true + } } } repos, count, err := models.SearchRepositoryByName(opts) if err != nil { - ctx.JSON(500, map[string]interface{}{ - "ok": false, - "error": err.Error(), + ctx.JSON(500, api.SearchError{ + OK: false, + Error: err.Error(), }) return } + var userID int64 + if ctx.IsSigned { + userID = ctx.User.ID + } + results := make([]*api.Repository, len(repos)) for i, repo := range repos { if err = repo.GetOwner(); err != nil { - ctx.JSON(500, map[string]interface{}{ - "ok": false, - "error": err.Error(), + ctx.JSON(500, api.SearchError{ + OK: false, + Error: err.Error(), }) return } - accessMode, err := models.AccessLevel(ctx.User, repo) + accessMode, err := models.AccessLevel(userID, repo) if err != nil { - ctx.JSON(500, map[string]interface{}{ - "ok": false, - "error": err.Error(), + ctx.JSON(500, api.SearchError{ + OK: false, + Error: err.Error(), }) } results[i] = repo.APIFormat(accessMode) } ctx.SetLinkHeader(int(count), setting.API.MaxResponseItems) - ctx.JSON(200, map[string]interface{}{ - "ok": true, - "data": results, + ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", count)) + ctx.JSON(200, api.SearchResults{ + OK: true, + Data: results, }) } @@ -112,8 +134,21 @@ func CreateUserRepo(ctx *context.APIContext, owner *models.User, opt api.CreateR } // Create one repository of mine -// see https://github.com/gogits/go-gogs-client/wiki/Repositories#create func Create(ctx *context.APIContext, opt api.CreateRepoOption) { + // swagger:route POST /user/repos repository user createCurrentUserRepo + // + // Consumes: + // - application/json + // + // Produces: + // - application/json + // + // Responses: + // 201: Repository + // 403: forbidden + // 422: validationError + // 500: error + // Shouldn't reach this condition, but just in case. if ctx.User.IsOrganization() { ctx.Error(422, "", "not allowed creating repository for organization") @@ -124,9 +159,23 @@ func Create(ctx *context.APIContext, opt api.CreateRepoOption) { // CreateOrgRepo create one repository of the organization func CreateOrgRepo(ctx *context.APIContext, opt api.CreateRepoOption) { + // swagger:route POST /org/{org}/repos organization createOrgRepo + // + // Consumes: + // - application/json + // + // Produces: + // - application/json + // + // Responses: + // 201: Repository + // 422: validationError + // 403: forbidden + // 500: error + org, err := models.GetOrgByName(ctx.Params(":org")) if err != nil { - if models.IsErrUserNotExist(err) { + if models.IsErrOrgNotExist(err) { ctx.Error(422, "", err) } else { ctx.Error(500, "GetOrgByName", err) @@ -142,8 +191,20 @@ func CreateOrgRepo(ctx *context.APIContext, opt api.CreateRepoOption) { } // Migrate migrate remote git repository to gitea -// see https://github.com/gogits/go-gogs-client/wiki/Repositories#migrate func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) { + // swagger:route POST /repos/migrate repository repoMigrate + // + // Consumes: + // - application/json + // + // Produces: + // - application/json + // + // Responses: + // 201: Repository + // 422: validationError + // 500: error + ctxUser := ctx.User // Not equal means context user is an organization, // or is another user/organization if current user is admin. @@ -215,19 +276,30 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) { } // Get one repository -// see https://github.com/gogits/go-gogs-client/wiki/Repositories#get func Get(ctx *context.APIContext) { - repo := ctx.Repo.Repository - access, err := models.AccessLevel(ctx.User, repo) - if err != nil { - ctx.Error(500, "GetRepository", err) - return - } - ctx.JSON(200, repo.APIFormat(access)) + // swagger:route GET /repos/{username}/{reponame} repository repoGet + // + // Produces: + // - application/json + // + // Responses: + // 200: Repository + // 500: error + + ctx.JSON(200, ctx.Repo.Repository.APIFormat(ctx.Repo.AccessMode)) } // GetByID returns a single Repository func GetByID(ctx *context.APIContext) { + // swagger:route GET /repositories/{id} repository repoGetByID + // + // Produces: + // - application/json + // + // Responses: + // 200: Repository + // 500: error + repo, err := models.GetRepositoryByID(ctx.ParamsInt64(":id")) if err != nil { if models.IsErrRepoNotExist(err) { @@ -238,17 +310,29 @@ func GetByID(ctx *context.APIContext) { return } - access, err := models.AccessLevel(ctx.User, repo) + access, err := models.AccessLevel(ctx.User.ID, repo) if err != nil { - ctx.Error(500, "GetRepositoryByID", err) + ctx.Error(500, "AccessLevel", err) + return + } else if access < models.AccessModeRead { + ctx.Status(404) return } ctx.JSON(200, repo.APIFormat(access)) } // Delete one repository -// see https://github.com/gogits/go-gogs-client/wiki/Repositories#delete func Delete(ctx *context.APIContext) { + // swagger:route DELETE /repos/{username}/{reponame} repository repoDelete + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 403: forbidden + // 500: error + if !ctx.Repo.IsAdmin() { ctx.Error(403, "", "Must have admin rights") return @@ -269,3 +353,24 @@ func Delete(ctx *context.APIContext) { log.Trace("Repository deleted: %s/%s", owner.Name, repo.Name) ctx.Status(204) } + +// MirrorSync adds a mirrored repository to the sync queue +func MirrorSync(ctx *context.APIContext) { + // swagger:route POST /repos/{username}/{reponame}/mirror-sync repository repoMirrorSync + // + // Produces: + // - application/json + // + // Responses: + // 200: empty + // 403: forbidden + + repo := ctx.Repo.Repository + + if !ctx.Repo.IsWriter() { + ctx.Error(403, "MirrorSync", "Must have write access") + } + + go models.MirrorQueue.Add(repo.ID) + ctx.Status(200) +} diff --git a/routers/api/v1/repo/status.go b/routers/api/v1/repo/status.go new file mode 100644 index 0000000..e4cc20a --- /dev/null +++ b/routers/api/v1/repo/status.go @@ -0,0 +1,122 @@ +// Copyright 2017 Gitea. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package repo + +import ( + "fmt" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" + api "code.gitea.io/sdk/gitea" +) + +// NewCommitStatus creates a new CommitStatus +func NewCommitStatus(ctx *context.APIContext, form api.CreateStatusOption) { + sha := ctx.Params("sha") + if len(sha) == 0 { + sha = ctx.Params("ref") + } + if len(sha) == 0 { + ctx.Error(400, "ref/sha not given", nil) + return + } + status := &models.CommitStatus{ + State: models.CommitStatusState(form.State), + TargetURL: form.TargetURL, + Description: form.Description, + Context: form.Context, + } + if err := models.NewCommitStatus(ctx.Repo.Repository, ctx.User, sha, status); err != nil { + ctx.Error(500, "NewCommitStatus", err) + return + } + + newStatus, err := models.GetCommitStatus(ctx.Repo.Repository, sha, status) + if err != nil { + ctx.Error(500, "GetCommitStatus", err) + return + } + ctx.JSON(201, newStatus.APIFormat()) +} + +// GetCommitStatuses returns all statuses for any given commit hash +func GetCommitStatuses(ctx *context.APIContext) { + sha := ctx.Params("sha") + if len(sha) == 0 { + sha = ctx.Params("ref") + } + if len(sha) == 0 { + ctx.Error(400, "ref/sha not given", nil) + return + } + repo := ctx.Repo.Repository + + page := ctx.ParamsInt("page") + + statuses, err := models.GetCommitStatuses(repo, sha, page) + if err != nil { + ctx.Error(500, "GetCommitStatuses", fmt.Errorf("GetCommitStatuses[%s, %s, %d]: %v", repo.FullName(), sha, page, err)) + } + + apiStatuses := make([]*api.Status, 0, len(statuses)) + for _, status := range statuses { + apiStatuses = append(apiStatuses, status.APIFormat()) + } + + ctx.JSON(200, apiStatuses) +} + +type combinedCommitStatus struct { + State models.CommitStatusState `json:"state"` + SHA string `json:"sha"` + TotalCount int `json:"total_count"` + Statuses []*api.Status `json:"statuses"` + Repo *api.Repository `json:"repository"` + CommitURL string `json:"commit_url"` + URL string `json:"url"` +} + +// GetCombinedCommitStatus returns the combined status for any given commit hash +func GetCombinedCommitStatus(ctx *context.APIContext) { + sha := ctx.Params("sha") + if len(sha) == 0 { + sha = ctx.Params("ref") + } + if len(sha) == 0 { + ctx.Error(400, "ref/sha not given", nil) + return + } + repo := ctx.Repo.Repository + + page := ctx.ParamsInt("page") + + statuses, err := models.GetLatestCommitStatus(repo, sha, page) + if err != nil { + ctx.Error(500, "GetLatestCommitStatus", fmt.Errorf("GetLatestCommitStatus[%s, %s, %d]: %v", repo.FullName(), sha, page, err)) + return + } + + if len(statuses) == 0 { + ctx.Status(200) + return + } + + retStatus := &combinedCommitStatus{ + SHA: sha, + TotalCount: len(statuses), + Repo: repo.APIFormat(ctx.Repo.AccessMode), + URL: "", + } + + retStatus.Statuses = make([]*api.Status, 0, len(statuses)) + for _, status := range statuses { + retStatus.Statuses = append(retStatus.Statuses, status.APIFormat()) + if status.State.IsWorseThan(retStatus.State) { + retStatus.State = status.State + } + } + + ctx.JSON(200, retStatus) +} diff --git a/routers/api/v1/user/app.go b/routers/api/v1/user/app.go index 6d5a271..1d722e3 100644 --- a/routers/api/v1/user/app.go +++ b/routers/api/v1/user/app.go @@ -12,8 +12,16 @@ import ( ) // ListAccessTokens list all the access tokens -// see https://github.com/gogits/go-gogs-client/wiki/Users#list-access-tokens-for-a-user func ListAccessTokens(ctx *context.APIContext) { + // swagger:route GET /users/{username}/tokens user userGetTokens + // + // Produces: + // - application/json + // + // Responses: + // 200: AccessTokenList + // 500: error + tokens, err := models.ListAccessTokens(ctx.User.ID) if err != nil { ctx.Error(500, "ListAccessTokens", err) @@ -31,8 +39,19 @@ func ListAccessTokens(ctx *context.APIContext) { } // CreateAccessToken create access tokens -// see https://github.com/gogits/go-gogs-client/wiki/Users#create-a-access-token func CreateAccessToken(ctx *context.APIContext, form api.CreateAccessTokenOption) { + // swagger:route POST /users/{username} /tokens user userCreateToken + // + // Consumes: + // - application/json + // + // Produces: + // - application/json + // + // Responses: + // 200: AccessToken + // 500: error + t := &models.AccessToken{ UID: ctx.User.ID, Name: form.Name, diff --git a/routers/api/v1/user/follower.go b/routers/api/v1/user/follower.go index ff043c9..55a0b03 100644 --- a/routers/api/v1/user/follower.go +++ b/routers/api/v1/user/follower.go @@ -30,12 +30,29 @@ func listUserFollowers(ctx *context.APIContext, u *models.User) { // ListMyFollowers list all my followers func ListMyFollowers(ctx *context.APIContext) { + // swagger:route GET /user/followers user userCurrentListFollowers + // + // Produces: + // - application/json + // + // Responses: + // 200: UserList + // 500: error + listUserFollowers(ctx, ctx.User) } // ListFollowers list user's followers -// see https://github.com/gogits/go-gogs-client/wiki/Users-Followers#list-followers-of-a-user func ListFollowers(ctx *context.APIContext) { + // swagger:route GET /users/:username/followers user userListFollowers + // + // Produces: + // - application/json + // + // Responses: + // 200: UserList + // 500: error + u := GetUserByParams(ctx) if ctx.Written() { return @@ -54,12 +71,29 @@ func listUserFollowing(ctx *context.APIContext, u *models.User) { // ListMyFollowing list all my followings func ListMyFollowing(ctx *context.APIContext) { + // swagger:route GET /user/following user userCurrentListFollowing + // + // Produces: + // - application/json + // + // Responses: + // 200: UserList + // 500: error + listUserFollowing(ctx, ctx.User) } // ListFollowing list user's followings -// see https://github.com/gogits/go-gogs-client/wiki/Users-Followers#list-users-followed-by-another-user func ListFollowing(ctx *context.APIContext) { + // swagger:route GET /users/{username}/following user userListFollowing + // + // Produces: + // - application/json + // + // Responses: + // 200: UserList + // 500: error + u := GetUserByParams(ctx) if ctx.Written() { return @@ -76,8 +110,13 @@ func checkUserFollowing(ctx *context.APIContext, u *models.User, followID int64) } // CheckMyFollowing check if the repo is followed by me -// see https://github.com/gogits/go-gogs-client/wiki/Users-Followers#check-if-you-are-following-a-user func CheckMyFollowing(ctx *context.APIContext) { + // swagger:route GET /user/following/{username} user userCurrentCheckFollowing + // + // Responses: + // 204: empty + // 404: notFound + target := GetUserByParams(ctx) if ctx.Written() { return @@ -86,8 +125,13 @@ func CheckMyFollowing(ctx *context.APIContext) { } // CheckFollowing check if the repo is followed by user -// see https://github.com/gogits/go-gogs-client/wiki/Users-Followers#check-if-one-user-follows-another func CheckFollowing(ctx *context.APIContext) { + // swagger:route GET /users/{username}/following/:target user userCheckFollowing + // + // Responses: + // 204: empty + // 404: notFound + u := GetUserByParams(ctx) if ctx.Written() { return @@ -100,8 +144,13 @@ func CheckFollowing(ctx *context.APIContext) { } // Follow follow one repository -// see https://github.com/gogits/go-gogs-client/wiki/Users-Followers#follow-a-user func Follow(ctx *context.APIContext) { + // swagger:route PUT /user/following/{username} user userCurrentPutFollow + // + // Responses: + // 204: empty + // 500: error + target := GetUserByParams(ctx) if ctx.Written() { return @@ -114,8 +163,13 @@ func Follow(ctx *context.APIContext) { } // Unfollow unfollow one repository -// see https://github.com/gogits/go-gogs-client/wiki/Users-Followers#unfollow-a-user func Unfollow(ctx *context.APIContext) { + // swagger:route DELETE /user/following/{username} user userCurrentDeleteFollow + // + // Responses: + // 204: empty + // 500: error + target := GetUserByParams(ctx) if ctx.Written() { return diff --git a/routers/api/v1/user/gpg_key.go b/routers/api/v1/user/gpg_key.go new file mode 100644 index 0000000..96ff6e8 --- /dev/null +++ b/routers/api/v1/user/gpg_key.go @@ -0,0 +1,153 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package user + +import ( + api "code.gitea.io/sdk/gitea" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/routers/api/v1/convert" +) + +func composePublicGPGKeysAPILink() string { + return setting.AppURL + "api/v1/user/gpg_keys/" +} + +func listGPGKeys(ctx *context.APIContext, uid int64) { + keys, err := models.ListGPGKeys(uid) + if err != nil { + ctx.Error(500, "ListGPGKeys", err) + return + } + + apiKeys := make([]*api.GPGKey, len(keys)) + for i := range keys { + apiKeys[i] = convert.ToGPGKey(keys[i]) + } + + ctx.JSON(200, &apiKeys) +} + +//ListGPGKeys get the GPG key list of a user +func ListGPGKeys(ctx *context.APIContext) { + // swagger:route GET /users/{username}/gpg_keys user userListGPGKeys + // + // Produces: + // - application/json + // + // Responses: + // 200: GPGKeyList + // 500: error + + user := GetUserByParams(ctx) + if ctx.Written() { + return + } + listGPGKeys(ctx, user.ID) +} + +//ListMyGPGKeys get the GPG key list of the logged user +func ListMyGPGKeys(ctx *context.APIContext) { + // swagger:route GET /user/gpg_keys user userCurrentListGPGKeys + // + // Produces: + // - application/json + // + // Responses: + // 200: GPGKeyList + // 500: error + + listGPGKeys(ctx, ctx.User.ID) +} + +//GetGPGKey get the GPG key based on a id +func GetGPGKey(ctx *context.APIContext) { + // swagger:route GET /user/gpg_keys/{id} user userCurrentGetGPGKey + // + // Produces: + // - application/json + // + // Responses: + // 200: GPGKey + // 404: notFound + // 500: error + + key, err := models.GetGPGKeyByID(ctx.ParamsInt64(":id")) + if err != nil { + if models.IsErrGPGKeyNotExist(err) { + ctx.Status(404) + } else { + ctx.Error(500, "GetGPGKeyByID", err) + } + return + } + ctx.JSON(200, convert.ToGPGKey(key)) +} + +// CreateUserGPGKey creates new GPG key to given user by ID. +func CreateUserGPGKey(ctx *context.APIContext, form api.CreateGPGKeyOption, uid int64) { + key, err := models.AddGPGKey(uid, form.ArmoredKey) + if err != nil { + HandleAddGPGKeyError(ctx, err) + return + } + ctx.JSON(201, convert.ToGPGKey(key)) +} + +//CreateGPGKey associate a GPG key to the current user +func CreateGPGKey(ctx *context.APIContext, form api.CreateGPGKeyOption) { + // swagger:route POST /user/gpg_keys user userCurrentPostGPGKey + // + // Consumes: + // - application/json + // + // Produces: + // - application/json + // + // Responses: + // 201: GPGKey + // 422: validationError + // 500: error + + CreateUserGPGKey(ctx, form, ctx.User.ID) +} + +//DeleteGPGKey remove a GPG key associated to the current user +func DeleteGPGKey(ctx *context.APIContext) { + // swagger:route DELETE /user/gpg_keys/{id} user userCurrentDeleteGPGKey + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 403: forbidden + // 500: error + + if err := models.DeleteGPGKey(ctx.User, ctx.ParamsInt64(":id")); err != nil { + if models.IsErrGPGKeyAccessDenied(err) { + ctx.Error(403, "", "You do not have access to this key") + } else { + ctx.Error(500, "DeleteGPGKey", err) + } + return + } + + ctx.Status(204) +} + +// HandleAddGPGKeyError handle add GPGKey error +func HandleAddGPGKeyError(ctx *context.APIContext, err error) { + switch { + case models.IsErrGPGKeyAccessDenied(err): + ctx.Error(422, "", "You do not have access to this gpg key") + case models.IsErrGPGKeyIDAlreadyUsed(err): + ctx.Error(422, "", "A key with the same keyid is already in database") + default: + ctx.Error(500, "AddGPGKey", err) + } +} diff --git a/routers/api/v1/user/key.go b/routers/api/v1/user/key.go index 39a045d..1772ef4 100644 --- a/routers/api/v1/user/key.go +++ b/routers/api/v1/user/key.go @@ -54,14 +54,30 @@ func listPublicKeys(ctx *context.APIContext, uid int64) { } // ListMyPublicKeys list all my public keys -// see https://github.com/gogits/go-gogs-client/wiki/Users-Public-Keys#list-your-public-keys func ListMyPublicKeys(ctx *context.APIContext) { + // swagger:route GET /user/keys user userCurrentListKeys + // + // Produces: + // - application/json + // + // Responses: + // 200: PublicKeyList + // 500: error + listPublicKeys(ctx, ctx.User.ID) } // ListPublicKeys list all user's public keys -// see https://github.com/gogits/go-gogs-client/wiki/Users-Public-Keys#list-public-keys-for-a-user func ListPublicKeys(ctx *context.APIContext) { + // swagger:route GET /users/{username}/keys user userListKeys + // + // Produces: + // - application/json + // + // Responses: + // 200: PublicKeyList + // 500: error + user := GetUserByParams(ctx) if ctx.Written() { return @@ -70,8 +86,17 @@ func ListPublicKeys(ctx *context.APIContext) { } // GetPublicKey get one public key -// see https://github.com/gogits/go-gogs-client/wiki/Users-Public-Keys#get-a-single-public-key func GetPublicKey(ctx *context.APIContext) { + // swagger:route GET /user/keys/{id} user userCurrentGetKey + // + // Produces: + // - application/json + // + // Responses: + // 200: PublicKey + // 404: notFound + // 500: error + key, err := models.GetPublicKeyByID(ctx.ParamsInt64(":id")) if err != nil { if models.IsErrKeyNotExist(err) { @@ -104,14 +129,35 @@ func CreateUserPublicKey(ctx *context.APIContext, form api.CreateKeyOption, uid } // CreatePublicKey create one public key for me -// see https://github.com/gogits/go-gogs-client/wiki/Users-Public-Keys#create-a-public-key func CreatePublicKey(ctx *context.APIContext, form api.CreateKeyOption) { + // swagger:route POST /user/keys user userCurrentPostKey + // + // Consumes: + // - application/json + // + // Produces: + // - application/json + // + // Responses: + // 201: PublicKey + // 422: validationError + // 500: error + CreateUserPublicKey(ctx, form, ctx.User.ID) } // DeletePublicKey delete one public key of mine -// see https://github.com/gogits/go-gogs-client/wiki/Users-Public-Keys#delete-a-public-key func DeletePublicKey(ctx *context.APIContext) { + // swagger:route DELETE /user/keys/{id} user userCurrentDeleteKey + // + // Produces: + // - application/json + // + // Responses: + // 204: empty + // 403: forbidden + // 500: error + if err := models.DeletePublicKey(ctx.User, ctx.ParamsInt64(":id")); err != nil { if models.IsErrKeyAccessDenied(err) { ctx.Error(403, "", "You do not have access to this key") diff --git a/routers/api/v1/user/repo.go b/routers/api/v1/user/repo.go index 8b7ee92..f119632 100644 --- a/routers/api/v1/user/repo.go +++ b/routers/api/v1/user/repo.go @@ -1,3 +1,7 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + package user import ( @@ -8,31 +12,39 @@ import ( // listUserRepos - List the repositories owned by the given user. func listUserRepos(ctx *context.APIContext, u *models.User) { - userID := u.ID - showPrivateRepos := (ctx.User.ID == userID || ctx.User.IsAdmin) && ctx.IsSigned - ownRepos, err := models.GetUserRepositories(userID, showPrivateRepos, 1, u.NumRepos, "") + showPrivateRepos := ctx.IsSigned && (ctx.User.ID == u.ID || ctx.User.IsAdmin) + repos, err := models.GetUserRepositories(u.ID, showPrivateRepos, 1, u.NumRepos, "") if err != nil { ctx.Error(500, "GetUserRepositories", err) return } - accessibleRepos, err := getAccessibleRepos(ctx) - if err != nil { - ctx.Error(500, "GetAccessibleRepos", err) + apiRepos := make([]*api.Repository, len(repos)) + var ctxUserID int64 + if ctx.User != nil { + ctxUserID = ctx.User.ID } - apiRepos := make([]*api.Repository, len(ownRepos)+len(accessibleRepos)) - // Set owned repositories. - for i := range ownRepos { - apiRepos[i] = ownRepos[i].APIFormat(models.AccessModeOwner) - } - // Set repositories user has access to. - for i := 0; i < len(accessibleRepos); i++ { - apiRepos[i+len(ownRepos)] = accessibleRepos[i] + for i := range repos { + access, err := models.AccessLevel(ctxUserID, repos[i]) + if err != nil { + ctx.Error(500, "AccessLevel", err) + return + } + apiRepos[i] = repos[i].APIFormat(access) } ctx.JSON(200, &apiRepos) } -// ListUserRepos - list the repos owned and accessible by the given user. +// ListUserRepos - list the repos owned by the given user. func ListUserRepos(ctx *context.APIContext) { + // swagger:route GET /users/{username}/repos user userListRepos + // + // Produces: + // - application/json + // + // Responses: + // 200: RepositoryList + // 500: error + user := GetUserByParams(ctx) if ctx.Written() { return @@ -40,23 +52,49 @@ func ListUserRepos(ctx *context.APIContext) { listUserRepos(ctx, user) } -// ListMyRepos - list the repositories owned by you. -// see https://github.com/gogits/go-gogs-client/wiki/Repositories#list-your-repositories +// ListMyRepos - list the repositories you own or have access to. func ListMyRepos(ctx *context.APIContext) { - listUserRepos(ctx, ctx.User) -} - -// getAccessibleRepos - Get the repositories a user has access to. -func getAccessibleRepos(ctx *context.APIContext) ([]*api.Repository, error) { - accessibleRepos, err := ctx.User.GetRepositoryAccesses() + // swagger:route GET /user/repos user userCurrentListRepos + // + // Produces: + // - application/json + // + // Responses: + // 200: RepositoryList + // 500: error + ownRepos, err := models.GetUserRepositories(ctx.User.ID, true, 1, ctx.User.NumRepos, "") if err != nil { - return nil, err + ctx.Error(500, "GetUserRepositories", err) + return } - i := 0 - repos := make([]*api.Repository, len(accessibleRepos)) - for repo, access := range accessibleRepos { - repos[i] = repo.APIFormat(access) + accessibleReposMap, err := ctx.User.GetRepositoryAccesses() + if err != nil { + ctx.Error(500, "GetRepositoryAccesses", err) + return + } + + apiRepos := make([]*api.Repository, len(ownRepos)+len(accessibleReposMap)) + for i := range ownRepos { + apiRepos[i] = ownRepos[i].APIFormat(models.AccessModeOwner) + } + i := len(ownRepos) + for repo, access := range accessibleReposMap { + apiRepos[i] = repo.APIFormat(access) i++ } - return repos, nil + ctx.JSON(200, &apiRepos) +} + +// ListOrgRepos - list the repositories of an organization. +func ListOrgRepos(ctx *context.APIContext) { + // swagger:route GET /orgs/{orgname}/repos organization orgListRepos + // + // Produces: + // - application/json + // + // Responses: + // 200: RepositoryList + // 500: error + + listUserRepos(ctx, ctx.Org.Organization) } diff --git a/routers/api/v1/user/star.go b/routers/api/v1/user/star.go index 0937fd1..6f943a2 100644 --- a/routers/api/v1/user/star.go +++ b/routers/api/v1/user/star.go @@ -18,13 +18,10 @@ func getStarredRepos(userID int64, private bool) ([]*api.Repository, error) { if err != nil { return nil, err } - user, err := models.GetUserByID(userID) - if err != nil { - return nil, err - } + repos := make([]*api.Repository, len(starredRepos)) for i, starred := range starredRepos { - access, err := models.AccessLevel(user, starred) + access, err := models.AccessLevel(userID, starred) if err != nil { return nil, err } @@ -36,6 +33,15 @@ func getStarredRepos(userID int64, private bool) ([]*api.Repository, error) { // GetStarredRepos returns the repos that the user specified by the APIContext // has starred func GetStarredRepos(ctx *context.APIContext) { + // swagger:route GET /users/{username}/starred user userListStarred + // + // Produces: + // - application/json + // + // Responses: + // 200: RepositoryList + // 500: error + user := GetUserByParams(ctx) private := user.ID == ctx.User.ID repos, err := getStarredRepos(user.ID, private) @@ -47,6 +53,15 @@ func GetStarredRepos(ctx *context.APIContext) { // GetMyStarredRepos returns the repos that the authenticated user has starred func GetMyStarredRepos(ctx *context.APIContext) { + // swagger:route GET /user/starred user userCurrentListStarred + // + // Produces: + // - application/json + // + // Responses: + // 200: RepositoryList + // 500: error + repos, err := getStarredRepos(ctx.User.ID, true) if err != nil { ctx.Error(500, "getStarredRepos", err) @@ -56,6 +71,12 @@ func GetMyStarredRepos(ctx *context.APIContext) { // IsStarring returns whether the authenticated is starring the repo func IsStarring(ctx *context.APIContext) { + // swagger:route GET /user/starred/{username}/{reponame} user userCurrentCheckStarring + // + // Responses: + // 204: empty + // 404: notFound + if models.IsStaring(ctx.User.ID, ctx.Repo.Repository.ID) { ctx.Status(204) } else { @@ -65,6 +86,12 @@ func IsStarring(ctx *context.APIContext) { // Star the repo specified in the APIContext, as the authenticated user func Star(ctx *context.APIContext) { + // swagger:route PUT /user/starred/{username}/{reponame} user userCurrentPutStar + // + // Responses: + // 204: empty + // 500: error + err := models.StarRepo(ctx.User.ID, ctx.Repo.Repository.ID, true) if err != nil { ctx.Error(500, "StarRepo", err) @@ -75,6 +102,12 @@ func Star(ctx *context.APIContext) { // Unstar the repo specified in the APIContext, as the authenticated user func Unstar(ctx *context.APIContext) { + // swagger:route DELETE /user/starred/{username}/{reponame} user userCurrentDeleteStar + // + // Responses: + // 204: empty + // 500: error + err := models.StarRepo(ctx.User.ID, ctx.Repo.Repository.ID, false) if err != nil { ctx.Error(500, "StarRepo", err) diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index de99fad..0ab6eaf 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -17,6 +17,15 @@ import ( // Search search users func Search(ctx *context.APIContext) { + // swagger:route GET /users/search user userSearch + // + // Produces: + // - application/json + // + // Responses: + // 200: UserList + // 500: error + opts := &models.SearchUserOptions{ Keyword: strings.Trim(ctx.Query("q"), " "), Type: models.UserTypeIndividual, @@ -56,6 +65,16 @@ func Search(ctx *context.APIContext) { // GetInfo get user's information func GetInfo(ctx *context.APIContext) { + // swagger:route GET /users/{username} user userGet + // + // Produces: + // - application/json + // + // Responses: + // 200: User + // 404: notFound + // 500: error + u, err := models.GetUserByName(ctx.Params(":username")) if err != nil { if models.IsErrUserNotExist(err) { @@ -75,5 +94,13 @@ func GetInfo(ctx *context.APIContext) { // GetAuthenticatedUser get curent user's information func GetAuthenticatedUser(ctx *context.APIContext) { + // swagger:route GET /user user userGetCurrent + // + // Produces: + // - application/json + // + // Responses: + // 200: User + ctx.JSON(200, ctx.User.APIFormat()) } diff --git a/routers/api/v1/user/watch.go b/routers/api/v1/user/watch.go index 6a9ad67..18628c9 100644 --- a/routers/api/v1/user/watch.go +++ b/routers/api/v1/user/watch.go @@ -5,8 +5,6 @@ package user import ( - "time" - api "code.gitea.io/sdk/gitea" "code.gitea.io/gitea/models" @@ -14,16 +12,6 @@ import ( "code.gitea.io/gitea/modules/setting" ) -// WatchInfo contains information about a watched repository -type WatchInfo struct { - Subscribed bool `json:"subscribed"` - Ignored bool `json:"ignored"` - Reason interface{} `json:"reason"` - CreatedAt time.Time `json:"created_at"` - URL string `json:"url"` - RepositoryURL string `json:"repository_url"` -} - // getWatchedRepos returns the repos that the user with the specified userID is // watching func getWatchedRepos(userID int64, private bool) ([]*api.Repository, error) { @@ -31,14 +19,10 @@ func getWatchedRepos(userID int64, private bool) ([]*api.Repository, error) { if err != nil { return nil, err } - user, err := models.GetUserByID(userID) - if err != nil { - return nil, err - } repos := make([]*api.Repository, len(watchedRepos)) for i, watched := range watchedRepos { - access, err := models.AccessLevel(user, watched) + access, err := models.AccessLevel(userID, watched) if err != nil { return nil, err } @@ -49,6 +33,15 @@ func getWatchedRepos(userID int64, private bool) ([]*api.Repository, error) { // GetWatchedRepos returns the repos that the user specified in ctx is watching func GetWatchedRepos(ctx *context.APIContext) { + // swagger:route GET /users/{username}/subscriptions user userListSubscriptions + // + // Produces: + // - application/json + // + // Responses: + // 200: RepositoryList + // 500: error + user := GetUserByParams(ctx) private := user.ID == ctx.User.ID repos, err := getWatchedRepos(user.ID, private) @@ -60,6 +53,15 @@ func GetWatchedRepos(ctx *context.APIContext) { // GetMyWatchedRepos returns the repos that the authenticated user is watching func GetMyWatchedRepos(ctx *context.APIContext) { + // swagger:route GET /user/subscriptions user userCurrentListSubscriptions + // + // Produces: + // - application/json + // + // Responses: + // 200: RepositoryList + // 500: error + repos, err := getWatchedRepos(ctx.User.ID, true) if err != nil { ctx.Error(500, "getWatchedRepos", err) @@ -70,8 +72,14 @@ func GetMyWatchedRepos(ctx *context.APIContext) { // IsWatching returns whether the authenticated user is watching the repo // specified in ctx func IsWatching(ctx *context.APIContext) { + // swagger:route GET /repos/{username}/{reponame}/subscription repository userCurrentCheckSubscription + // + // Responses: + // 200: WatchInfo + // 404: notFound + if models.IsWatching(ctx.User.ID, ctx.Repo.Repository.ID) { - ctx.JSON(200, WatchInfo{ + ctx.JSON(200, api.WatchInfo{ Subscribed: true, Ignored: false, Reason: nil, @@ -86,12 +94,18 @@ func IsWatching(ctx *context.APIContext) { // Watch the repo specified in ctx, as the authenticated user func Watch(ctx *context.APIContext) { + // swagger:route PUT /repos/{username}/{reponame}/subscription repository userCurrentPutSubscription + // + // Responses: + // 200: WatchInfo + // 500: error + err := models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, true) if err != nil { ctx.Error(500, "WatchRepo", err) return } - ctx.JSON(200, WatchInfo{ + ctx.JSON(200, api.WatchInfo{ Subscribed: true, Ignored: false, Reason: nil, @@ -104,6 +118,12 @@ func Watch(ctx *context.APIContext) { // Unwatch the repo specified in ctx, as the authenticated user func Unwatch(ctx *context.APIContext) { + // swagger:route DELETE /repos/{username}/{reponame}/subscription repository userCurrentDeleteSubscription + // + // Responses: + // 204: empty + // 500: error + err := models.WatchRepo(ctx.User.ID, ctx.Repo.Repository.ID, false) if err != nil { ctx.Error(500, "UnwatchRepo", err) diff --git a/routers/api/v1/utils/utils.go b/routers/api/v1/utils/utils.go new file mode 100644 index 0000000..f7c2b22 --- /dev/null +++ b/routers/api/v1/utils/utils.go @@ -0,0 +1,15 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package utils + +import "code.gitea.io/gitea/modules/context" + +// UserID user ID of authenticated user, or 0 if not authenticated +func UserID(ctx *context.APIContext) int64 { + if ctx.User == nil { + return 0 + } + return ctx.User.ID +} diff --git a/routers/dev/template.go b/routers/dev/template.go index fae85a3..ad0d2c1 100644 --- a/routers/dev/template.go +++ b/routers/dev/template.go @@ -18,8 +18,8 @@ func TemplatePreview(ctx *context.Context) { ctx.Data["AppVer"] = setting.AppVer ctx.Data["AppUrl"] = setting.AppURL ctx.Data["Code"] = "2014031910370000009fff6782aadb2162b4a997acb69d4400888e0b9274657374" - ctx.Data["ActiveCodeLives"] = setting.Service.ActiveCodeLives / 60 - ctx.Data["ResetPwdCodeLives"] = setting.Service.ResetPwdCodeLives / 60 + ctx.Data["ActiveCodeLives"] = base.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale.Language()) + ctx.Data["ResetPwdCodeLives"] = base.MinutesToFriendly(setting.Service.ResetPwdCodeLives, ctx.Locale.Language()) ctx.Data["CurDbValue"] = "" ctx.HTML(200, base.TplName(ctx.Params("*"))) diff --git a/routers/home.go b/routers/home.go index 9fa565b..16d0720 100644 --- a/routers/home.go +++ b/routers/home.go @@ -20,6 +20,8 @@ import ( const ( // tplHome home page template tplHome base.TplName = "home" + // tplSwagger swagger page template + tplSwagger base.TplName = "swagger" // tplExploreRepos explore repositories page template tplExploreRepos base.TplName = "explore/repos" // tplExploreUsers explore users page template @@ -51,6 +53,11 @@ func Home(ctx *context.Context) { ctx.HTML(200, tplHome) } +// Swagger render swagger-ui page +func Swagger(ctx *context.Context) { + ctx.HTML(200, tplSwagger) +} + // RepoSearchOptions when calling search repositories type RepoSearchOptions struct { Ranger func(*models.SearchRepoOptions) (models.RepositoryList, int64, error) @@ -94,6 +101,10 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { orderBy = "name DESC" case "alphabetically": orderBy = "name ASC" + case "reversesize": + orderBy = "size DESC" + case "size": + orderBy = "size ASC" default: orderBy = "created_unix DESC" } @@ -101,11 +112,12 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { keyword := strings.Trim(ctx.Query("q"), " ") if len(keyword) == 0 { repos, count, err = opts.Ranger(&models.SearchRepoOptions{ - Page: page, - PageSize: opts.PageSize, - Searcher: ctx.User, - OrderBy: orderBy, - Private: opts.Private, + Page: page, + PageSize: opts.PageSize, + Searcher: ctx.User, + OrderBy: orderBy, + Private: opts.Private, + Collaborate: true, }) if err != nil { ctx.Handle(500, "opts.Ranger", err) @@ -114,12 +126,13 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { } else { if isKeywordValid(keyword) { repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ - Keyword: keyword, - OrderBy: orderBy, - Private: opts.Private, - Page: page, - PageSize: opts.PageSize, - Searcher: ctx.User, + Keyword: keyword, + OrderBy: orderBy, + Private: opts.Private, + Page: page, + PageSize: opts.PageSize, + Searcher: ctx.User, + Collaborate: true, }) if err != nil { ctx.Handle(500, "SearchRepositoryByName", err) diff --git a/routers/init.go b/routers/init.go index dec7f18..bd46abd 100644 --- a/routers/init.go +++ b/routers/init.go @@ -10,6 +10,7 @@ import ( "code.gitea.io/git" "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/migrations" "code.gitea.io/gitea/modules/cron" "code.gitea.io/gitea/modules/highlight" "code.gitea.io/gitea/modules/indexer" @@ -49,8 +50,9 @@ func GlobalInit() { if setting.InstallLock { highlight.NewContext() + markdown.InitMarkdown() markdown.NewSanitizer() - if err := models.NewEngine(); err != nil { + if err := models.NewEngine(migrations.Migrate); err != nil { log.Fatal(4, "Failed to initialize ORM engine: %v", err) } models.HasEngine = true diff --git a/routers/install.go b/routers/install.go index b4df536..08f5d80 100644 --- a/routers/install.go +++ b/routers/install.go @@ -81,7 +81,7 @@ func Install(ctx *context.Context) { form.RepoRootPath = setting.RepoRootPath form.LFSRootPath = setting.LFS.ContentPath - // Note(unknwon): it's hard for Windows users change a running user, + // Note(unknown): it's hard for Windows users change a running user, // so just use current one if config says default. if setting.IsWindows && setting.RunUser == "git" { form.RunUser = user.CurrentUsername() @@ -108,10 +108,13 @@ func Install(ctx *context.Context) { form.OfflineMode = setting.OfflineMode form.DisableGravatar = setting.DisableGravatar form.EnableFederatedAvatar = setting.EnableFederatedAvatar + form.EnableOpenIDSignIn = true + form.EnableOpenIDSignUp = true form.DisableRegistration = setting.Service.DisableRegistration form.EnableCaptcha = setting.Service.EnableCaptcha form.RequireSignInView = setting.Service.RequireSignInView form.DefaultKeepEmailPrivate = setting.Service.DefaultKeepEmailPrivate + form.DefaultAllowCreateOrganization = setting.Service.DefaultAllowCreateOrganization form.NoReplyAddress = setting.Service.NoReplyAddress auth.AssignForm(form, ctx.Data) @@ -257,6 +260,7 @@ func InstallPost(ctx *context.Context, form auth.InstallForm) { cfg.Section("repository").Key("ROOT").SetValue(form.RepoRootPath) cfg.Section("").Key("RUN_USER").SetValue(form.RunUser) cfg.Section("server").Key("SSH_DOMAIN").SetValue(form.Domain) + cfg.Section("server").Key("DOMAIN").SetValue(form.Domain) cfg.Section("server").Key("HTTP_PORT").SetValue(form.HTTPPort) cfg.Section("server").Key("ROOT_URL").SetValue(form.AppURL) @@ -290,10 +294,13 @@ func InstallPost(ctx *context.Context, form auth.InstallForm) { cfg.Section("server").Key("OFFLINE_MODE").SetValue(com.ToStr(form.OfflineMode)) cfg.Section("picture").Key("DISABLE_GRAVATAR").SetValue(com.ToStr(form.DisableGravatar)) cfg.Section("picture").Key("ENABLE_FEDERATED_AVATAR").SetValue(com.ToStr(form.EnableFederatedAvatar)) + cfg.Section("openid").Key("ENABLE_OPENID_SIGNIN").SetValue(com.ToStr(form.EnableOpenIDSignIn)) + cfg.Section("openid").Key("ENABLE_OPENID_SIGNUP").SetValue(com.ToStr(form.EnableOpenIDSignUp)) cfg.Section("service").Key("DISABLE_REGISTRATION").SetValue(com.ToStr(form.DisableRegistration)) cfg.Section("service").Key("ENABLE_CAPTCHA").SetValue(com.ToStr(form.EnableCaptcha)) cfg.Section("service").Key("REQUIRE_SIGNIN_VIEW").SetValue(com.ToStr(form.RequireSignInView)) cfg.Section("service").Key("DEFAULT_KEEP_EMAIL_PRIVATE").SetValue(com.ToStr(form.DefaultKeepEmailPrivate)) + cfg.Section("service").Key("DEFAULT_ALLOW_CREATE_ORGANIZATION").SetValue(com.ToStr(form.DefaultAllowCreateOrganization)) cfg.Section("service").Key("NO_REPLY_ADDRESS").SetValue(com.ToStr(form.NoReplyAddress)) cfg.Section("").Key("RUN_MODE").SetValue("prod") diff --git a/routers/org/members.go b/routers/org/members.go index 70e4161..1b74b5f 100644 --- a/routers/org/members.go +++ b/routers/org/members.go @@ -114,6 +114,12 @@ func Invitation(ctx *context.Context) { return } + if u.IsOrganization() { + ctx.Flash.Error(ctx.Tr("form.cannot_invite_org_to_org")) + ctx.Redirect(ctx.Org.OrgLink + "/invitations/new") + return + } + if err = org.AddMember(u.ID); err != nil { ctx.Handle(500, " AddMember", err) return diff --git a/routers/org/teams.go b/routers/org/teams.go index cbf7f19..1ac4bff 100644 --- a/routers/org/teams.go +++ b/routers/org/teams.go @@ -88,6 +88,12 @@ func TeamsAction(ctx *context.Context) { return } + if u.IsOrganization() { + ctx.Flash.Error(ctx.Tr("form.cannot_add_org_to_team")) + ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName) + return + } + err = ctx.Org.Team.AddMember(u.ID) page = "team" } @@ -156,6 +162,7 @@ func NewTeam(ctx *context.Context) { ctx.Data["PageIsOrgTeams"] = true ctx.Data["PageIsOrgTeamsNew"] = true ctx.Data["Team"] = &models.Team{} + ctx.Data["Units"] = models.Units ctx.HTML(200, tplTeamNew) } @@ -164,6 +171,7 @@ func NewTeamPost(ctx *context.Context, form auth.CreateTeamForm) { ctx.Data["Title"] = ctx.Org.Organization.FullName ctx.Data["PageIsOrgTeams"] = true ctx.Data["PageIsOrgTeamsNew"] = true + ctx.Data["Units"] = models.Units t := &models.Team{ OrgID: ctx.Org.Organization.ID, @@ -171,6 +179,10 @@ func NewTeamPost(ctx *context.Context, form auth.CreateTeamForm) { Description: form.Description, Authorize: models.ParseAccessMode(form.Permission), } + if t.Authorize < models.AccessModeAdmin { + t.UnitTypes = form.Units + } + ctx.Data["Team"] = t if ctx.HasError() { @@ -178,6 +190,11 @@ func NewTeamPost(ctx *context.Context, form auth.CreateTeamForm) { return } + if t.Authorize < models.AccessModeAdmin && len(form.Units) == 0 { + ctx.RenderWithErr(ctx.Tr("form.team_no_units_error"), tplTeamNew, &form) + return + } + if err := models.NewTeam(t); err != nil { ctx.Data["Err_TeamName"] = true switch { @@ -220,6 +237,7 @@ func EditTeam(ctx *context.Context) { ctx.Data["PageIsOrgTeams"] = true ctx.Data["team_name"] = ctx.Org.Team.Name ctx.Data["desc"] = ctx.Org.Team.Description + ctx.Data["Units"] = models.Units ctx.HTML(200, tplTeamNew) } @@ -229,27 +247,12 @@ func EditTeamPost(ctx *context.Context, form auth.CreateTeamForm) { ctx.Data["Title"] = ctx.Org.Organization.FullName ctx.Data["PageIsOrgTeams"] = true ctx.Data["Team"] = t - - if ctx.HasError() { - ctx.HTML(200, tplTeamNew) - return - } + ctx.Data["Units"] = models.Units isAuthChanged := false if !t.IsOwnerTeam() { // Validate permission level. - var auth models.AccessMode - switch form.Permission { - case "read": - auth = models.AccessModeRead - case "write": - auth = models.AccessModeWrite - case "admin": - auth = models.AccessModeAdmin - default: - ctx.Error(401) - return - } + auth := models.ParseAccessMode(form.Permission) t.Name = form.TeamName if t.Authorize != auth { @@ -258,6 +261,22 @@ func EditTeamPost(ctx *context.Context, form auth.CreateTeamForm) { } } t.Description = form.Description + if t.Authorize < models.AccessModeAdmin { + t.UnitTypes = form.Units + } else { + t.UnitTypes = nil + } + + if ctx.HasError() { + ctx.HTML(200, tplTeamNew) + return + } + + if t.Authorize < models.AccessModeAdmin && len(form.Units) == 0 { + ctx.RenderWithErr(ctx.Tr("form.team_no_units_error"), tplTeamNew, &form) + return + } + if err := models.UpdateTeam(t, isAuthChanged); err != nil { ctx.Data["Err_TeamName"] = true switch { diff --git a/routers/private/branch.go b/routers/private/branch.go new file mode 100644 index 0000000..e3c6ba7 --- /dev/null +++ b/routers/private/branch.go @@ -0,0 +1,25 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package private + +import ( + "code.gitea.io/gitea/models" + + macaron "gopkg.in/macaron.v1" +) + +// GetProtectedBranchBy get protected branch information +func GetProtectedBranchBy(ctx *macaron.Context) { + repoID := ctx.ParamsInt64(":id") + branchName := ctx.Params("*") + protectBranch, err := models.GetProtectedBranchBy(repoID, branchName) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + ctx.JSON(200, protectBranch) +} diff --git a/routers/private/internal.go b/routers/private/internal.go new file mode 100644 index 0000000..3e72332 --- /dev/null +++ b/routers/private/internal.go @@ -0,0 +1,47 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +// Package private includes all internal routes. The package name internal is ideal but Golang is not allowed, so we use private as package name instead. +package private + +import ( + "strings" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/setting" + + macaron "gopkg.in/macaron.v1" +) + +// CheckInternalToken check internal token is set +func CheckInternalToken(ctx *macaron.Context) { + tokens := ctx.Req.Header.Get("Authorization") + fields := strings.Fields(tokens) + if len(fields) != 2 || fields[0] != "Bearer" || fields[1] != setting.InternalToken { + ctx.Error(403) + } +} + +// UpdatePublicKey update publick key updates +func UpdatePublicKey(ctx *macaron.Context) { + keyID := ctx.ParamsInt64(":id") + if err := models.UpdatePublicKeyUpdated(keyID); err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + + ctx.PlainText(200, []byte("success")) +} + +// RegisterRoutes registers all internal APIs routes to web application. +// These APIs will be invoked by internal commands for example `gitea serv` and etc. +func RegisterRoutes(m *macaron.Macaron) { + m.Group("/", func() { + m.Post("/ssh/:id/update", UpdatePublicKey) + m.Post("/push/update", PushUpdate) + m.Get("/branch/:id/*", GetProtectedBranchBy) + }, CheckInternalToken) +} diff --git a/routers/private/push_update.go b/routers/private/push_update.go new file mode 100644 index 0000000..988d273 --- /dev/null +++ b/routers/private/push_update.go @@ -0,0 +1,47 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package private + +import ( + "encoding/json" + "strings" + + "code.gitea.io/git" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + + macaron "gopkg.in/macaron.v1" +) + +// PushUpdate update public key updates +func PushUpdate(ctx *macaron.Context) { + var opt models.PushUpdateOptions + if err := json.NewDecoder(ctx.Req.Request.Body).Decode(&opt); err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + + branch := strings.TrimPrefix(opt.RefFullName, git.BranchPrefix) + if len(branch) == 0 || opt.PusherID <= 0 { + ctx.Error(404) + log.Trace("PushUpdate: branch or secret is empty, or pusher ID is not valid") + return + } + + err := models.PushUpdate(branch, opt) + if err != nil { + if models.IsErrUserNotExist(err) { + ctx.Error(404) + } else { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + } + return + } + ctx.Status(202) +} diff --git a/routers/repo/branch.go b/routers/repo/branch.go index d040f2a..fcb6efd 100644 --- a/routers/repo/branch.go +++ b/routers/repo/branch.go @@ -5,11 +5,8 @@ package repo import ( - "code.gitea.io/git" - "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" - "code.gitea.io/gitea/modules/log" ) const ( @@ -33,59 +30,3 @@ func Branches(ctx *context.Context) { ctx.Data["Branches"] = brs ctx.HTML(200, tplBranch) } - -// DeleteBranchPost responses for delete merged branch -func DeleteBranchPost(ctx *context.Context) { - branchName := ctx.Params(":name") - commitID := ctx.Query("commit") - - defer func() { - redirectTo := ctx.Query("redirect_to") - if len(redirectTo) == 0 { - redirectTo = ctx.Repo.RepoLink - } - - ctx.JSON(200, map[string]interface{}{ - "redirect": redirectTo, - }) - }() - - fullBranchName := ctx.Repo.Owner.Name + "/" + branchName - - if !ctx.Repo.GitRepo.IsBranchExist(branchName) || branchName == "master" { - ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) - return - } - - if len(commitID) > 0 { - branchCommitID, err := ctx.Repo.GitRepo.GetBranchCommitID(branchName) - if err != nil { - log.Error(4, "GetBranchCommitID: %v", err) - return - } - - if branchCommitID != commitID { - ctx.Flash.Error(ctx.Tr("repo.branch.delete_branch_has_new_commits", fullBranchName)) - return - } - } - - if err := ctx.Repo.GitRepo.DeleteBranch(branchName, git.DeleteBranchOptions{ - Force: true, - }); err != nil { - log.Error(4, "DeleteBranch: %v", err) - ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) - return - } - - issueID := ctx.QueryInt64("issue_id") - if issueID > 0 { - if err := models.AddDeletePRBranchComment(ctx.User, ctx.Repo.Repository, issueID, branchName); err != nil { - log.Error(4, "DeleteBranch: %v", err) - ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) - return - } - } - - ctx.Flash.Success(ctx.Tr("repo.branch.deletion_success", fullBranchName)) -} diff --git a/routers/repo/commit.go b/routers/repo/commit.go index 7f4457c..1835e47 100644 --- a/routers/repo/commit.go +++ b/routers/repo/commit.go @@ -47,6 +47,10 @@ func renderIssueLinks(oldCommits *list.List, repoLink string) *list.List { // Commits render branch's commits func Commits(ctx *context.Context) { ctx.Data["PageIsCommits"] = true + if ctx.Repo.Commit == nil { + ctx.Handle(404, "Commit not found", nil) + return + } commitsCount, err := ctx.Repo.Commit.CommitsCount() if err != nil { @@ -68,6 +72,8 @@ func Commits(ctx *context.Context) { } commits = renderIssueLinks(commits, ctx.Repo.RepoLink) commits = models.ValidateCommitsWithEmails(commits) + commits = models.ParseCommitsWithSignature(commits) + commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository) ctx.Data["Commits"] = commits ctx.Data["Username"] = ctx.Repo.Owner.Name @@ -121,6 +127,8 @@ func SearchCommits(ctx *context.Context) { } commits = renderIssueLinks(commits, ctx.Repo.RepoLink) commits = models.ValidateCommitsWithEmails(commits) + commits = models.ParseCommitsWithSignature(commits) + commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository) ctx.Data["Commits"] = commits ctx.Data["Keyword"] = keyword @@ -167,6 +175,8 @@ func FileHistory(ctx *context.Context) { } commits = renderIssueLinks(commits, ctx.Repo.RepoLink) commits = models.ValidateCommitsWithEmails(commits) + commits = models.ParseCommitsWithSignature(commits) + commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository) ctx.Data["Commits"] = commits ctx.Data["Username"] = ctx.Repo.Owner.Name @@ -222,6 +232,7 @@ func Diff(ctx *context.Context) { ctx.Data["IsImageFile"] = commit.IsImageFile ctx.Data["Title"] = commit.Summary() + " · " + base.ShortSha(commitID) ctx.Data["Commit"] = commit + ctx.Data["Verification"] = models.ParseCommitWithSignature(commit) ctx.Data["Author"] = models.ValidateCommitWithEmail(commit) ctx.Data["Diff"] = diff ctx.Data["Parents"] = parents @@ -276,6 +287,8 @@ func CompareDiff(ctx *context.Context) { return } commits = models.ValidateCommitsWithEmails(commits) + commits = models.ParseCommitsWithSignature(commits) + commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository) ctx.Data["CommitRepoLink"] = ctx.Repo.RepoLink ctx.Data["Commits"] = commits diff --git a/routers/repo/download.go b/routers/repo/download.go index 85e9fc6..78c6088 100644 --- a/routers/repo/download.go +++ b/routers/repo/download.go @@ -7,6 +7,7 @@ package repo import ( "fmt" "io" + "path" "strings" "code.gitea.io/git" @@ -19,11 +20,12 @@ import ( func ServeData(ctx *context.Context, name string, reader io.Reader) error { buf := make([]byte, 1024) n, _ := reader.Read(buf) - if n > 0 { + if n >= 0 { buf = buf[:n] } ctx.Resp.Header().Set("Cache-Control", "public,max-age=86400") + name = path.Base(name) // Google Chrome dislike commas in filenames, so let's change it to a space name = strings.Replace(name, ",", " ", -1) diff --git a/routers/repo/editor.go b/routers/repo/editor.go index 0c42204..bb04753 100644 --- a/routers/repo/editor.go +++ b/routers/repo/editor.go @@ -26,18 +26,43 @@ const ( tplEditDiffPreview base.TplName = "repo/editor/diff_preview" tplDeleteFile base.TplName = "repo/editor/delete" tplUploadFile base.TplName = "repo/editor/upload" + + frmCommitChoiceDirect string = "direct" + frmCommitChoiceNewBranch string = "commit-to-new-branch" ) +func renderCommitRights(ctx *context.Context) bool { + canCommit, err := ctx.Repo.CanCommitToBranch() + if err != nil { + log.Error(4, "CanCommitToBranch: %v", err) + } + ctx.Data["CanCommitToBranch"] = canCommit + return canCommit +} + +// getParentTreeFields returns list of parent tree names and corresponding tree paths +// based on given tree path. +func getParentTreeFields(treePath string) (treeNames []string, treePaths []string) { + if len(treePath) == 0 { + return treeNames, treePaths + } + + treeNames = strings.Split(treePath, "/") + treePaths = make([]string, len(treeNames)) + for i := range treeNames { + treePaths[i] = strings.Join(treeNames[:i+1], "/") + } + return treeNames, treePaths +} + func editFile(ctx *context.Context, isNewFile bool) { ctx.Data["PageIsEdit"] = true ctx.Data["IsNewFile"] = isNewFile ctx.Data["RequireHighlightJS"] = true ctx.Data["RequireSimpleMDE"] = true + canCommit := renderCommitRights(ctx) - var treeNames []string - if len(ctx.Repo.TreePath) > 0 { - treeNames = strings.Split(ctx.Repo.TreePath, "/") - } + treeNames, treePaths := getParentTreeFields(ctx.Repo.TreePath) if !isNewFile { entry, err := ctx.Repo.Commit.GetTreeEntryByPath(ctx.Repo.TreePath) @@ -87,10 +112,15 @@ func editFile(ctx *context.Context, isNewFile bool) { } ctx.Data["TreeNames"] = treeNames + ctx.Data["TreePaths"] = treePaths ctx.Data["BranchLink"] = ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchName ctx.Data["commit_summary"] = "" ctx.Data["commit_message"] = "" - ctx.Data["commit_choice"] = "direct" + if canCommit { + ctx.Data["commit_choice"] = frmCommitChoiceDirect + } else { + ctx.Data["commit_choice"] = frmCommitChoiceNewBranch + } ctx.Data["new_branch_name"] = "" ctx.Data["last_commit"] = ctx.Repo.Commit.ID ctx.Data["MarkdownFileExts"] = strings.Join(setting.Markdown.FileExtensions, ",") @@ -116,6 +146,7 @@ func editFilePost(ctx *context.Context, form auth.EditRepoFileForm, isNewFile bo ctx.Data["IsNewFile"] = isNewFile ctx.Data["RequireHighlightJS"] = true ctx.Data["RequireSimpleMDE"] = true + canCommit := renderCommitRights(ctx) oldBranchName := ctx.Repo.BranchName branchName := oldBranchName @@ -123,19 +154,16 @@ func editFilePost(ctx *context.Context, form auth.EditRepoFileForm, isNewFile bo lastCommit := form.LastCommit form.LastCommit = ctx.Repo.Commit.ID.String() - if form.CommitChoice == "commit-to-new-branch" { + if form.CommitChoice == frmCommitChoiceNewBranch { branchName = form.NewBranchName } form.TreePath = strings.Trim(form.TreePath, " /") - - var treeNames []string - if len(form.TreePath) > 0 { - treeNames = strings.Split(form.TreePath, "/") - } + treeNames, treePaths := getParentTreeFields(form.TreePath) ctx.Data["TreePath"] = form.TreePath ctx.Data["TreeNames"] = treeNames + ctx.Data["TreePaths"] = treePaths ctx.Data["BranchLink"] = ctx.Repo.RepoLink + "/src/" + branchName ctx.Data["FileContent"] = form.Content ctx.Data["commit_summary"] = form.CommitSummary @@ -164,6 +192,11 @@ func editFilePost(ctx *context.Context, form auth.EditRepoFileForm, isNewFile bo ctx.RenderWithErr(ctx.Tr("repo.editor.branch_already_exists", branchName), tplEditFile, &form) return } + } else if !canCommit { + ctx.Data["Err_NewBranchName"] = true + ctx.Data["commit_choice"] = frmCommitChoiceNewBranch + ctx.RenderWithErr(ctx.Tr("repo.editor.cannot_commit_to_protected_branch", branchName), tplEditFile, &form) + return } var newTreePath string @@ -317,10 +350,17 @@ func DeleteFile(ctx *context.Context) { ctx.Data["PageIsDelete"] = true ctx.Data["BranchLink"] = ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchName ctx.Data["TreePath"] = ctx.Repo.TreePath + canCommit := renderCommitRights(ctx) + ctx.Data["commit_summary"] = "" ctx.Data["commit_message"] = "" - ctx.Data["commit_choice"] = "direct" + if canCommit { + ctx.Data["commit_choice"] = frmCommitChoiceDirect + } else { + ctx.Data["commit_choice"] = frmCommitChoiceNewBranch + } ctx.Data["new_branch_name"] = "" + ctx.HTML(200, tplDeleteFile) } @@ -329,11 +369,12 @@ func DeleteFilePost(ctx *context.Context, form auth.DeleteRepoFileForm) { ctx.Data["PageIsDelete"] = true ctx.Data["BranchLink"] = ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchName ctx.Data["TreePath"] = ctx.Repo.TreePath + canCommit := renderCommitRights(ctx) oldBranchName := ctx.Repo.BranchName branchName := oldBranchName - if form.CommitChoice == "commit-to-new-branch" { + if form.CommitChoice == frmCommitChoiceNewBranch { branchName = form.NewBranchName } ctx.Data["commit_summary"] = form.CommitSummary @@ -352,6 +393,11 @@ func DeleteFilePost(ctx *context.Context, form auth.DeleteRepoFileForm) { ctx.RenderWithErr(ctx.Tr("repo.editor.branch_already_exists", branchName), tplDeleteFile, &form) return } + } else if !canCommit { + ctx.Data["Err_NewBranchName"] = true + ctx.Data["commit_choice"] = frmCommitChoiceNewBranch + ctx.RenderWithErr(ctx.Tr("repo.editor.cannot_commit_to_protected_branch", branchName), tplDeleteFile, &form) + return } message := strings.TrimSpace(form.CommitSummary) @@ -390,18 +436,24 @@ func renderUploadSettings(ctx *context.Context) { func UploadFile(ctx *context.Context) { ctx.Data["PageIsUpload"] = true renderUploadSettings(ctx) + canCommit := renderCommitRights(ctx) - // We must at least have one element for user to input. - treeNames := []string{""} - if len(ctx.Repo.TreePath) > 0 { - treeNames = strings.Split(ctx.Repo.TreePath, "/") + treeNames, treePaths := getParentTreeFields(ctx.Repo.TreePath) + if len(treeNames) == 0 { + // We must at least have one element for user to input. + treeNames = []string{""} } ctx.Data["TreeNames"] = treeNames + ctx.Data["TreePaths"] = treePaths ctx.Data["BranchLink"] = ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchName ctx.Data["commit_summary"] = "" ctx.Data["commit_message"] = "" - ctx.Data["commit_choice"] = "direct" + if canCommit { + ctx.Data["commit_choice"] = frmCommitChoiceDirect + } else { + ctx.Data["commit_choice"] = frmCommitChoiceNewBranch + } ctx.Data["new_branch_name"] = "" ctx.HTML(200, tplUploadFile) @@ -411,24 +463,25 @@ func UploadFile(ctx *context.Context) { func UploadFilePost(ctx *context.Context, form auth.UploadRepoFileForm) { ctx.Data["PageIsUpload"] = true renderUploadSettings(ctx) + canCommit := renderCommitRights(ctx) oldBranchName := ctx.Repo.BranchName branchName := oldBranchName - if form.CommitChoice == "commit-to-new-branch" { + if form.CommitChoice == frmCommitChoiceNewBranch { branchName = form.NewBranchName } form.TreePath = strings.Trim(form.TreePath, " /") - - // We must at least have one element for user to input. - treeNames := []string{""} - if len(form.TreePath) > 0 { - treeNames = strings.Split(form.TreePath, "/") + treeNames, treePaths := getParentTreeFields(form.TreePath) + if len(treeNames) == 0 { + // We must at least have one element for user to input. + treeNames = []string{""} } ctx.Data["TreePath"] = form.TreePath ctx.Data["TreeNames"] = treeNames + ctx.Data["TreePaths"] = treePaths ctx.Data["BranchLink"] = ctx.Repo.RepoLink + "/src/" + branchName ctx.Data["commit_summary"] = form.CommitSummary ctx.Data["commit_message"] = form.CommitMessage @@ -446,6 +499,11 @@ func UploadFilePost(ctx *context.Context, form auth.UploadRepoFileForm) { ctx.RenderWithErr(ctx.Tr("repo.editor.branch_already_exists", branchName), tplUploadFile, &form) return } + } else if !canCommit { + ctx.Data["Err_NewBranchName"] = true + ctx.Data["commit_choice"] = frmCommitChoiceNewBranch + ctx.RenderWithErr(ctx.Tr("repo.editor.cannot_commit_to_protected_branch", branchName), tplUploadFile, &form) + return } var newTreePath string diff --git a/routers/repo/http.go b/routers/repo/http.go index dc29651..cac1ec3 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -29,6 +29,11 @@ func HTTP(ctx *context.Context) { username := ctx.Params(":username") reponame := strings.TrimSuffix(ctx.Params(":reponame"), ".git") + if ctx.Query("go-get") == "1" { + context.EarlyResponseForGoGetMeta(ctx) + return + } + var isPull bool service := ctx.Query("service") if service == "git-receive-pack" || @@ -52,8 +57,10 @@ func HTTP(ctx *context.Context) { } isWiki := false + var unitType = models.UnitTypeCode if strings.HasSuffix(reponame, ".wiki") { isWiki = true + unitType = models.UnitTypeWiki reponame = reponame[:len(reponame)-5] } @@ -129,36 +136,76 @@ func HTTP(ctx *context.Context) { ctx.Handle(http.StatusInternalServerError, "UserSignIn error: %v", err) return } + } - // Assume username now is a token. - token, err := models.GetAccessTokenBySHA(authUsername) + if authUser == nil { + isUsernameToken := len(authPasswd) == 0 || authPasswd == "x-oauth-basic" + + // Assume username is token + authToken := authUsername + + if !isUsernameToken { + // Assume password is token + authToken = authPasswd + + authUser, err = models.GetUserByName(authUsername) + if err != nil { + if models.IsErrUserNotExist(err) { + ctx.HandleText(http.StatusUnauthorized, "invalid credentials") + } else { + ctx.Handle(http.StatusInternalServerError, "GetUserByName", err) + } + return + } + } + + // Assume password is a token. + token, err := models.GetAccessTokenBySHA(authToken) if err != nil { if models.IsErrAccessTokenNotExist(err) || models.IsErrAccessTokenEmpty(err) { - ctx.HandleText(http.StatusUnauthorized, "invalid token") + ctx.HandleText(http.StatusUnauthorized, "invalid credentials") } else { ctx.Handle(http.StatusInternalServerError, "GetAccessTokenBySha", err) } return } + + if isUsernameToken { + authUser, err = models.GetUserByID(token.UID) + if err != nil { + ctx.Handle(http.StatusInternalServerError, "GetUserByID", err) + return + } + } else if authUser.ID != token.UID { + ctx.HandleText(http.StatusUnauthorized, "invalid credentials") + return + } + token.Updated = time.Now() if err = models.UpdateAccessToken(token); err != nil { ctx.Handle(http.StatusInternalServerError, "UpdateAccessToken", err) } - authUser, err = models.GetUserByID(token.UID) - if err != nil { - ctx.Handle(http.StatusInternalServerError, "GetUserByID", err) + } else { + _, err = models.GetTwoFactorByUID(authUser.ID) + + if err == nil { + // TODO: This response should be changed to "invalid credentials" for security reasons once the expectation behind it (creating an app token to authenticate) is properly documented + ctx.HandleText(http.StatusUnauthorized, "Users with two-factor authentication enabled cannot perform HTTP/HTTPS operations via plain username and password. Please create and use a personal access token on the user settings page") + return + } else if !models.IsErrTwoFactorNotEnrolled(err) { + ctx.Handle(http.StatusInternalServerError, "IsErrTwoFactorNotEnrolled", err) return } } if !isPublicPull { - has, err := models.HasAccess(authUser, repo, accessMode) + has, err := models.HasAccess(authUser.ID, repo, accessMode) if err != nil { ctx.Handle(http.StatusInternalServerError, "HasAccess", err) return } else if !has { if accessMode == models.AccessModeRead { - has, err = models.HasAccess(authUser, repo, models.AccessModeWrite) + has, err = models.HasAccess(authUser.ID, repo, models.AccessModeWrite) if err != nil { ctx.Handle(http.StatusInternalServerError, "HasAccess2", err) return @@ -179,10 +226,15 @@ func HTTP(ctx *context.Context) { } } + if !repo.CheckUnitUser(authUser.ID, authUser.IsAdmin, unitType) { + ctx.HandleText(http.StatusForbidden, fmt.Sprintf("User %s does not have allowed access to repository %s 's code", + authUser.Name, repo.RepoPath())) + return + } + environ = []string{ models.EnvRepoUsername + "=" + username, models.EnvRepoName + "=" + reponame, - models.EnvRepoUserSalt + "=" + repoUser.Salt, models.EnvPusherName + "=" + authUser.Name, models.EnvPusherID + fmt.Sprintf("=%d", authUser.ID), models.ProtectedBranchRepoID + fmt.Sprintf("=%d", repo.ID), @@ -349,7 +401,6 @@ func serviceRPC(h serviceHandler, service string) { cmd.Stderr = &stderr if err := cmd.Run(); err != nil { log.GitLogger.Error(2, "fail to serve RPC(%s): %v - %v", service, err, stderr) - h.w.WriteHeader(http.StatusInternalServerError) return } } diff --git a/routers/repo/issue.go b/routers/repo/issue.go index a06f21b..2c9f2f8 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -10,6 +10,7 @@ import ( "fmt" "io" "io/ioutil" + "strconv" "strings" "time" @@ -58,8 +59,8 @@ var ( // MustEnableIssues check if repository enable internal issues func MustEnableIssues(ctx *context.Context) { - if !ctx.Repo.Repository.EnableUnit(models.UnitTypeIssues) && - !ctx.Repo.Repository.EnableUnit(models.UnitTypeExternalTracker) { + if !ctx.Repo.Repository.UnitEnabled(models.UnitTypeIssues) && + !ctx.Repo.Repository.UnitEnabled(models.UnitTypeExternalTracker) { ctx.Handle(404, "MustEnableIssues", nil) return } @@ -119,6 +120,15 @@ func Issues(ctx *context.Context) { forceEmpty bool ) + if ctx.IsSigned { + switch viewType { + case "created_by": + posterID = ctx.User.ID + case "mentioned": + mentionedID = ctx.User.ID + } + } + repo := ctx.Repo.Repository selectLabels := ctx.Query("labels") milestoneID := ctx.QueryInt64("milestone") @@ -149,11 +159,12 @@ func Issues(ctx *context.Context) { MilestoneID: milestoneID, AssigneeID: assigneeID, MentionedID: mentionedID, + PosterID: posterID, IsPull: isPullList, IssueIDs: issueIDs, }) if err != nil { - ctx.Error(500, "GetSearchIssueStats") + ctx.Handle(500, "GetIssueStats", err) return } } @@ -182,6 +193,7 @@ func Issues(ctx *context.Context) { MentionedID: mentionedID, MilestoneID: milestoneID, Page: pager.Current(), + PageSize: setting.UI.IssuePagingNum, IsClosed: util.OptionalBoolOf(isShowClosed), IsPull: util.OptionalBoolOf(isPullList), Labels: selectLabels, @@ -464,6 +476,24 @@ func ViewIssue(ctx *context.Context) { } ctx.Data["Title"] = fmt.Sprintf("#%d - %s", issue.Index, issue.Title) + var iw *models.IssueWatch + var exists bool + if ctx.User != nil { + iw, exists, err = models.GetIssueWatch(ctx.User.ID, issue.ID) + if err != nil { + ctx.Handle(500, "GetIssueWatch", err) + return + } + if !exists { + iw = &models.IssueWatch{ + UserID: ctx.User.ID, + IssueID: issue.ID, + IsWatching: models.IsWatching(ctx.User.ID, ctx.Repo.Repository.ID), + } + } + } + ctx.Data["IssueWatch"] = iw + // Make sure type and URL matches. if ctx.Params(":type") == "issues" && issue.IsPull { ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(issue.Index)) @@ -596,6 +626,16 @@ func ViewIssue(ctx *context.Context) { ctx.Handle(500, "LoadMilestone", err) return } + ghostMilestone := &models.Milestone{ + ID: -1, + Name: ctx.Tr("repo.issues.deleted_milestone"), + } + if comment.OldMilestoneID > 0 && comment.OldMilestone == nil { + comment.OldMilestone = ghostMilestone + } + if comment.MilestoneID > 0 && comment.Milestone == nil { + comment.Milestone = ghostMilestone + } } else if comment.Type == models.CommentTypeAssignees { if err = comment.LoadAssignees(); err != nil { ctx.Handle(500, "LoadAssignees", err) @@ -608,19 +648,21 @@ func ViewIssue(ctx *context.Context) { pull := issue.PullRequest canDelete := false - if ctx.IsSigned && pull.HeadBranch != "master" { + if ctx.IsSigned { if err := pull.GetHeadRepo(); err != nil { log.Error(4, "GetHeadRepo: %v", err) - } else if ctx.User.IsWriterOfRepo(pull.HeadRepo) { - canDelete = true - deleteBranchURL := pull.HeadRepo.Link() + "/branches/" + pull.HeadBranch + "/delete" - ctx.Data["DeleteBranchLink"] = fmt.Sprintf("%s?commit=%s&redirect_to=%s&issue_id=%d", - deleteBranchURL, pull.MergedCommitID, ctx.Data["Link"], issue.ID) - + } else if pull.HeadRepo != nil && pull.HeadBranch != pull.HeadRepo.DefaultBranch && ctx.User.IsWriterOfRepo(pull.HeadRepo) { + // Check if branch is not protected + if protected, err := pull.HeadRepo.IsProtectedBranch(pull.HeadBranch); err != nil { + log.Error(4, "IsProtectedBranch: %v", err) + } else if !protected { + canDelete = true + ctx.Data["DeleteBranchLink"] = ctx.Repo.RepoLink + "/pulls/" + com.ToStr(issue.Index) + "/cleanup" + } } } - ctx.Data["IsPullBranchDeletable"] = canDelete && git.IsBranchExist(pull.HeadRepo.RepoPath(), pull.HeadBranch) + ctx.Data["IsPullBranchDeletable"] = canDelete && pull.HeadRepo != nil && git.IsBranchExist(pull.HeadRepo.RepoPath(), pull.HeadBranch) } ctx.Data["Participants"] = participants @@ -634,16 +676,56 @@ func ViewIssue(ctx *context.Context) { func getActionIssue(ctx *context.Context) *models.Issue { issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) if err != nil { - if models.IsErrIssueNotExist(err) { - ctx.Error(404, "GetIssueByIndex") - } else { - ctx.Handle(500, "GetIssueByIndex", err) - } + ctx.NotFoundOrServerError("GetIssueByIndex", models.IsErrIssueNotExist, err) + return nil + } + if issue.IsPull && !ctx.Repo.Repository.UnitEnabled(models.UnitTypePullRequests) || + !issue.IsPull && !ctx.Repo.Repository.UnitEnabled(models.UnitTypeIssues) { + ctx.Handle(404, "IssueOrPullRequestUnitNotAllowed", nil) + return nil + } + if err = issue.LoadAttributes(); err != nil { + ctx.Handle(500, "LoadAttributes", nil) return nil } return issue } +func getActionIssues(ctx *context.Context) []*models.Issue { + commaSeparatedIssueIDs := ctx.Query("issue_ids") + if len(commaSeparatedIssueIDs) == 0 { + return nil + } + issueIDs := make([]int64, 0, 10) + for _, stringIssueID := range strings.Split(commaSeparatedIssueIDs, ",") { + issueID, err := strconv.ParseInt(stringIssueID, 10, 64) + if err != nil { + ctx.Handle(500, "ParseInt", err) + return nil + } + issueIDs = append(issueIDs, issueID) + } + issues, err := models.GetIssuesByIDs(issueIDs) + if err != nil { + ctx.Handle(500, "GetIssuesByIDs", err) + return nil + } + // Check access rights for all issues + issueUnitEnabled := ctx.Repo.Repository.UnitEnabled(models.UnitTypeIssues) + prUnitEnabled := ctx.Repo.Repository.UnitEnabled(models.UnitTypePullRequests) + for _, issue := range issues { + if issue.IsPull && !prUnitEnabled || !issue.IsPull && !issueUnitEnabled { + ctx.Handle(404, "IssueOrPullRequestUnitNotAllowed", nil) + return nil + } + if err = issue.LoadAttributes(); err != nil { + ctx.Handle(500, "LoadAttributes", nil) + return nil + } + } + return issues +} + // UpdateIssueTitle change issue's title func UpdateIssueTitle(ctx *context.Context) { issue := getActionIssue(ctx) @@ -697,25 +779,22 @@ func UpdateIssueContent(ctx *context.Context) { // UpdateIssueMilestone change issue's milestone func UpdateIssueMilestone(ctx *context.Context) { - issue := getActionIssue(ctx) + issues := getActionIssues(ctx) if ctx.Written() { return } - oldMilestoneID := issue.MilestoneID milestoneID := ctx.QueryInt64("id") - if oldMilestoneID == milestoneID { - ctx.JSON(200, map[string]interface{}{ - "ok": true, - }) - return - } - - // Not check for invalid milestone id and give responsibility to owners. - issue.MilestoneID = milestoneID - if err := models.ChangeMilestoneAssign(issue, ctx.User, oldMilestoneID); err != nil { - ctx.Handle(500, "ChangeMilestoneAssign", err) - return + for _, issue := range issues { + oldMilestoneID := issue.MilestoneID + if oldMilestoneID == milestoneID { + continue + } + issue.MilestoneID = milestoneID + if err := models.ChangeMilestoneAssign(issue, ctx.User, oldMilestoneID); err != nil { + ctx.Handle(500, "ChangeMilestoneAssign", err) + return + } } ctx.JSON(200, map[string]interface{}{ @@ -725,24 +804,53 @@ func UpdateIssueMilestone(ctx *context.Context) { // UpdateIssueAssignee change issue's assignee func UpdateIssueAssignee(ctx *context.Context) { - issue := getActionIssue(ctx) + issues := getActionIssues(ctx) if ctx.Written() { return } assigneeID := ctx.QueryInt64("id") - if issue.AssigneeID == assigneeID { - ctx.JSON(200, map[string]interface{}{ - "ok": true, - }) + for _, issue := range issues { + if issue.AssigneeID == assigneeID { + continue + } + if err := issue.ChangeAssignee(ctx.User, assigneeID); err != nil { + ctx.Handle(500, "ChangeAssignee", err) + return + } + } + ctx.JSON(200, map[string]interface{}{ + "ok": true, + }) +} + +// UpdateIssueStatus change issue's status +func UpdateIssueStatus(ctx *context.Context) { + issues := getActionIssues(ctx) + if ctx.Written() { return } - if err := issue.ChangeAssignee(ctx.User, assigneeID); err != nil { - ctx.Handle(500, "ChangeAssignee", err) - return + var isClosed bool + switch action := ctx.Query("action"); action { + case "open": + isClosed = false + case "close": + isClosed = true + default: + log.Warn("Unrecognized action: %s", action) } + if _, err := models.IssueList(issues).LoadRepositories(); err != nil { + ctx.Handle(500, "LoadRepositories", err) + return + } + for _, issue := range issues { + if err := issue.ChangeStatus(ctx.User, issue.Repo, isClosed); err != nil { + ctx.Handle(500, "ChangeStatus", err) + return + } + } ctx.JSON(200, map[string]interface{}{ "ok": true, }) @@ -750,9 +858,8 @@ func UpdateIssueAssignee(ctx *context.Context) { // NewComment create a comment for issue func NewComment(ctx *context.Context, form auth.CreateCommentForm) { - issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) - if err != nil { - ctx.NotFoundOrServerError("GetIssueByIndex", models.IsErrIssueNotExist, err) + issue := getActionIssue(ctx) + if ctx.Written() { return } @@ -779,7 +886,7 @@ func NewComment(ctx *context.Context, form auth.CreateCommentForm) { if form.Status == "reopen" && issue.IsPull { pull := issue.PullRequest - pr, err = models.GetUnmergedPullRequest(pull.HeadRepoID, pull.BaseRepoID, pull.HeadBranch, pull.BaseBranch) + pr, err := models.GetUnmergedPullRequest(pull.HeadRepoID, pull.BaseRepoID, pull.HeadBranch, pull.BaseBranch) if err != nil { if !models.IsErrPullRequestNotExist(err) { ctx.Handle(500, "GetUnmergedPullRequest", err) @@ -801,7 +908,7 @@ func NewComment(ctx *context.Context, form auth.CreateCommentForm) { if pr != nil { ctx.Flash.Info(ctx.Tr("repo.pulls.open_unmerged_pull_exists", pr.Index)) } else { - if err = issue.ChangeStatus(ctx.User, ctx.Repo.Repository, form.Status == "close"); err != nil { + if err := issue.ChangeStatus(ctx.User, ctx.Repo.Repository, form.Status == "close"); err != nil { log.Error(4, "ChangeStatus: %v", err) } else { log.Trace("Issue [%d] status changed to closed: %v", issue.ID, issue.IsClosed) @@ -828,7 +935,7 @@ func NewComment(ctx *context.Context, form auth.CreateCommentForm) { return } - comment, err = models.CreateIssueComment(ctx.User, ctx.Repo.Repository, issue, form.Content, attachments) + comment, err := models.CreateIssueComment(ctx.User, ctx.Repo.Repository, issue, form.Content, attachments) if err != nil { ctx.Handle(500, "CreateIssueComment", err) return diff --git a/routers/repo/issue_label.go b/routers/repo/issue_label.go index 6792947..9b4da4b 100644 --- a/routers/repo/issue_label.go +++ b/routers/repo/issue_label.go @@ -9,6 +9,7 @@ import ( "code.gitea.io/gitea/modules/auth" "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" ) const ( @@ -84,7 +85,7 @@ func NewLabel(ctx *context.Context, form auth.CreateLabelForm) { Name: form.Title, Color: form.Color, } - if err := models.NewLabels(l); err != nil { + if err := models.NewLabel(l); err != nil { ctx.Handle(500, "NewLabel", err) return } @@ -129,18 +130,20 @@ func DeleteLabel(ctx *context.Context) { // UpdateIssueLabel change issue's labels func UpdateIssueLabel(ctx *context.Context) { - issue := getActionIssue(ctx) + issues := getActionIssues(ctx) if ctx.Written() { return } - if ctx.Query("action") == "clear" { - if err := issue.ClearLabels(ctx.User); err != nil { - ctx.Handle(500, "ClearLabels", err) - return + switch action := ctx.Query("action"); action { + case "clear": + for _, issue := range issues { + if err := issue.ClearLabels(ctx.User); err != nil { + ctx.Handle(500, "ClearLabels", err) + return + } } - } else { - isAttach := ctx.Query("action") == "attach" + case "attach", "detach", "toggle": label, err := models.GetLabelByID(ctx.QueryInt64("id")) if err != nil { if models.IsErrLabelNotExist(err) { @@ -151,17 +154,40 @@ func UpdateIssueLabel(ctx *context.Context) { return } - if isAttach && !issue.HasLabel(label.ID) { - if err = issue.AddLabel(ctx.User, label); err != nil { - ctx.Handle(500, "AddLabel", err) - return + if action == "toggle" { + anyHaveLabel := false + for _, issue := range issues { + if issue.HasLabel(label.ID) { + anyHaveLabel = true + break + } } - } else if !isAttach && issue.HasLabel(label.ID) { - if err = issue.RemoveLabel(ctx.User, label); err != nil { - ctx.Handle(500, "RemoveLabel", err) - return + if anyHaveLabel { + action = "detach" + } else { + action = "attach" } } + + if action == "attach" { + for _, issue := range issues { + if err = issue.AddLabel(ctx.User, label); err != nil { + ctx.Handle(500, "AddLabel", err) + return + } + } + } else { + for _, issue := range issues { + if err = issue.RemoveLabel(ctx.User, label); err != nil { + ctx.Handle(500, "RemoveLabel", err) + return + } + } + } + default: + log.Warn("Unrecognized action: %s", action) + ctx.Error(500) + return } ctx.JSON(200, map[string]interface{}{ diff --git a/routers/repo/issue_watch.go b/routers/repo/issue_watch.go new file mode 100644 index 0000000..3ed1165 --- /dev/null +++ b/routers/repo/issue_watch.go @@ -0,0 +1,36 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package repo + +import ( + "fmt" + "net/http" + "strconv" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" +) + +// IssueWatch sets issue watching +func IssueWatch(c *context.Context) { + watch, err := strconv.ParseBool(c.Req.PostForm.Get("watch")) + if err != nil { + c.Handle(http.StatusInternalServerError, "watch is not bool", err) + return + } + + issue := getActionIssue(c) + if c.Written() { + return + } + + if err := models.CreateOrUpdateIssueWatch(c.User.ID, issue.ID, watch); err != nil { + c.Handle(http.StatusInternalServerError, "CreateOrUpdateIssueWatch", err) + return + } + + url := fmt.Sprintf("%s/issues/%d", c.Repo.RepoLink, issue.Index) + c.Redirect(url, http.StatusSeeOther) +} diff --git a/routers/repo/pull.go b/routers/repo/pull.go index 3629c13..9d48929 100644 --- a/routers/repo/pull.go +++ b/routers/repo/pull.go @@ -61,6 +61,8 @@ func getForkRepository(ctx *context.Context) *models.Repository { ctx.Data["repo_name"] = forkRepo.Name ctx.Data["description"] = forkRepo.Description ctx.Data["IsPrivate"] = forkRepo.IsPrivate + canForkToUser := forkRepo.OwnerID != ctx.User.ID && !ctx.User.HasForkedRepo(forkRepo.ID) + ctx.Data["CanForkToUser"] = canForkToUser if err = forkRepo.GetOwner(); err != nil { ctx.Handle(500, "GetOwner", err) @@ -69,11 +71,23 @@ func getForkRepository(ctx *context.Context) *models.Repository { ctx.Data["ForkFrom"] = forkRepo.Owner.Name + "/" + forkRepo.Name ctx.Data["ForkFromOwnerID"] = forkRepo.Owner.ID - if err := ctx.User.GetOrganizations(true); err != nil { - ctx.Handle(500, "GetOrganizations", err) + if err := ctx.User.GetOwnedOrganizations(); err != nil { + ctx.Handle(500, "GetOwnedOrganizations", err) return nil } - ctx.Data["Orgs"] = ctx.User.Orgs + var orgs []*models.User + for _, org := range ctx.User.OwnedOrgs { + if forkRepo.OwnerID != org.ID && !org.HasForkedRepo(forkRepo.ID) { + orgs = append(orgs, org) + } + } + ctx.Data["Orgs"] = orgs + + if canForkToUser { + ctx.Data["ContextUser"] = ctx.User + } else if len(orgs) > 0 { + ctx.Data["ContextUser"] = orgs[0] + } return forkRepo } @@ -87,7 +101,6 @@ func Fork(ctx *context.Context) { return } - ctx.Data["ContextUser"] = ctx.User ctx.HTML(200, tplFork) } @@ -95,15 +108,16 @@ func Fork(ctx *context.Context) { func ForkPost(ctx *context.Context, form auth.CreateRepoForm) { ctx.Data["Title"] = ctx.Tr("new_fork") + ctxUser := checkContextUser(ctx, form.UID) + if ctx.Written() { + return + } + forkRepo := getForkRepository(ctx) if ctx.Written() { return } - ctxUser := checkContextUser(ctx, form.UID) - if ctx.Written() { - return - } ctx.Data["ContextUser"] = ctxUser if ctx.HasError() { @@ -111,6 +125,12 @@ func ForkPost(ctx *context.Context, form auth.CreateRepoForm) { return } + repo, has := models.HasForkedRepo(ctxUser.ID, forkRepo.ID) + if has { + ctx.Redirect(setting.AppSubURL + "/" + ctxUser.Name + "/" + repo.Name) + return + } + // Check ownership of organization. if ctxUser.IsOrganization() { if !ctxUser.IsOwnedBy(ctx.User.ID) { @@ -256,8 +276,6 @@ func ViewPullCommits(ctx *context.Context) { return } pull := issue.PullRequest - ctx.Data["Username"] = pull.HeadUserName - ctx.Data["Reponame"] = pull.HeadRepo.Name var commits *list.List if pull.HasMerged { @@ -265,6 +283,9 @@ func ViewPullCommits(ctx *context.Context) { if ctx.Written() { return } + ctx.Data["Username"] = ctx.Repo.Owner.Name + ctx.Data["Reponame"] = ctx.Repo.Repository.Name + startCommit, err := ctx.Repo.GitRepo.GetCommit(pull.MergeBase) if err != nil { ctx.Handle(500, "Repo.GitRepo.GetCommit", err) @@ -280,7 +301,6 @@ func ViewPullCommits(ctx *context.Context) { ctx.Handle(500, "Repo.GitRepo.CommitsBetween", err) return } - } else { prInfo := PrepareViewPullInfo(ctx, issue) if ctx.Written() { @@ -289,10 +309,14 @@ func ViewPullCommits(ctx *context.Context) { ctx.Handle(404, "ViewPullCommits", nil) return } + ctx.Data["Username"] = pull.HeadUserName + ctx.Data["Reponame"] = pull.HeadRepo.Name commits = prInfo.Commits } commits = models.ValidateCommitsWithEmails(commits) + commits = models.ParseCommitsWithSignature(commits) + commits = models.ParseCommitsWithStatus(commits, ctx.Repo.Repository) ctx.Data["Commits"] = commits ctx.Data["CommitCount"] = commits.Len() @@ -317,6 +341,7 @@ func ViewPullFiles(ctx *context.Context) { gitRepo *git.Repository ) + var headTarget string if pull.HasMerged { PrepareMergedViewPullInfo(ctx, issue) if ctx.Written() { @@ -327,6 +352,10 @@ func ViewPullFiles(ctx *context.Context) { startCommitID = pull.MergeBase endCommitID = pull.MergedCommitID gitRepo = ctx.Repo.GitRepo + + headTarget = path.Join(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) + ctx.Data["Username"] = ctx.Repo.Owner.Name + ctx.Data["Reponame"] = ctx.Repo.Repository.Name } else { prInfo := PrepareViewPullInfo(ctx, issue) if ctx.Written() { @@ -354,6 +383,10 @@ func ViewPullFiles(ctx *context.Context) { startCommitID = prInfo.MergeBase endCommitID = headCommitID gitRepo = headGitRepo + + headTarget = path.Join(pull.HeadUserName, pull.HeadRepo.Name) + ctx.Data["Username"] = pull.HeadUserName + ctx.Data["Reponame"] = pull.HeadRepo.Name } diff, err := models.GetDiffRange(diffRepoPath, @@ -372,9 +405,6 @@ func ViewPullFiles(ctx *context.Context) { return } - headTarget := path.Join(pull.HeadUserName, pull.HeadRepo.Name) - ctx.Data["Username"] = pull.HeadUserName - ctx.Data["Reponame"] = pull.HeadRepo.Name ctx.Data["IsImageFile"] = commit.IsImageFile ctx.Data["SourcePath"] = setting.AppSubURL + "/" + path.Join(headTarget, "src", endCommitID) ctx.Data["BeforeSourcePath"] = setting.AppSubURL + "/" + path.Join(headTarget, "src", startCommitID) @@ -576,6 +606,8 @@ func PrepareCompareDiff( } prInfo.Commits = models.ValidateCommitsWithEmails(prInfo.Commits) + prInfo.Commits = models.ParseCommitsWithSignature(prInfo.Commits) + prInfo.Commits = models.ParseCommitsWithStatus(prInfo.Commits, headRepo) ctx.Data["Commits"] = prInfo.Commits ctx.Data["CommitCount"] = prInfo.Commits.Len() ctx.Data["Username"] = headUser.Name @@ -753,3 +785,130 @@ func TriggerTask(ctx *context.Context) { go models.AddTestPullRequestTask(pusher, repo.ID, branch, true) ctx.Status(202) } + +// CleanUpPullRequest responses for delete merged branch when PR has been merged +func CleanUpPullRequest(ctx *context.Context) { + issue := checkPullInfo(ctx) + if ctx.Written() { + return + } + + pr, err := models.GetPullRequestByIssueID(issue.ID) + if err != nil { + if models.IsErrPullRequestNotExist(err) { + ctx.Handle(404, "GetPullRequestByIssueID", nil) + } else { + ctx.Handle(500, "GetPullRequestByIssueID", err) + } + return + } + + // Allow cleanup only for merged PR + if !pr.HasMerged { + ctx.Handle(404, "CleanUpPullRequest", nil) + return + } + + if err = pr.GetHeadRepo(); err != nil { + ctx.Handle(500, "GetHeadRepo", err) + return + } else if pr.HeadRepo == nil { + // Forked repository has already been deleted + ctx.Handle(404, "CleanUpPullRequest", nil) + return + } else if pr.GetBaseRepo(); err != nil { + ctx.Handle(500, "GetBaseRepo", err) + return + } else if pr.HeadRepo.GetOwner(); err != nil { + ctx.Handle(500, "HeadRepo.GetOwner", err) + return + } + + if !ctx.User.IsWriterOfRepo(pr.HeadRepo) { + ctx.Handle(403, "CleanUpPullRequest", nil) + return + } + + fullBranchName := pr.HeadRepo.Owner.Name + "/" + pr.HeadBranch + + gitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) + if err != nil { + ctx.Handle(500, fmt.Sprintf("OpenRepository[%s]", pr.HeadRepo.RepoPath()), err) + return + } + + gitBaseRepo, err := git.OpenRepository(pr.BaseRepo.RepoPath()) + if err != nil { + ctx.Handle(500, fmt.Sprintf("OpenRepository[%s]", pr.BaseRepo.RepoPath()), err) + return + } + + defer func() { + ctx.JSON(200, map[string]interface{}{ + "redirect": pr.BaseRepo.Link() + "/pulls/" + com.ToStr(issue.Index), + }) + }() + + if pr.HeadBranch == pr.HeadRepo.DefaultBranch || !gitRepo.IsBranchExist(pr.HeadBranch) { + ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) + return + } + + // Check if branch is not protected + if protected, err := pr.HeadRepo.IsProtectedBranch(pr.HeadBranch); err != nil || protected { + if err != nil { + log.Error(4, "HeadRepo.IsProtectedBranch: %v", err) + } + ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) + return + } + + // Check if branch has no new commits + if len(pr.MergedCommitID) > 0 { + branchCommitID, err := gitRepo.GetBranchCommitID(pr.HeadBranch) + if err != nil { + log.Error(4, "GetBranchCommitID: %v", err) + ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) + return + } + + commit, err := gitBaseRepo.GetCommit(pr.MergedCommitID) + if err != nil { + log.Error(4, "GetCommit: %v", err) + ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) + return + } + + isParent := false + for i := 0; i < commit.ParentCount(); i++ { + if parent, err := commit.Parent(i); err != nil { + log.Error(4, "Parent: %v", err) + ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) + return + } else if parent.ID.String() == branchCommitID { + isParent = true + break + } + } + + if !isParent { + ctx.Flash.Error(ctx.Tr("repo.branch.delete_branch_has_new_commits", fullBranchName)) + return + } + } + + if err := gitRepo.DeleteBranch(pr.HeadBranch, git.DeleteBranchOptions{ + Force: true, + }); err != nil { + log.Error(4, "DeleteBranch: %v", err) + ctx.Flash.Error(ctx.Tr("repo.branch.deletion_failed", fullBranchName)) + return + } + + if err := models.AddDeletePRBranchComment(ctx.User, pr.BaseRepo, issue.ID, pr.HeadBranch); err != nil { + // Do not fail here as branch has already been deleted + log.Error(4, "DeleteBranch: %v", err) + } + + ctx.Flash.Success(ctx.Tr("repo.branch.deletion_success", fullBranchName)) +} diff --git a/routers/repo/release.go b/routers/repo/release.go index 47dba81..fe68f1b 100644 --- a/routers/repo/release.go +++ b/routers/repo/release.go @@ -5,10 +5,8 @@ package repo import ( - "errors" "fmt" - "code.gitea.io/git" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/auth" "code.gitea.io/gitea/modules/base" @@ -16,6 +14,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/markdown" "code.gitea.io/gitea/modules/setting" + "github.com/Unknwon/paginater" ) @@ -66,37 +65,20 @@ func Releases(ctx *context.Context) { limit = 10 } - rawTags, err := ctx.Repo.GitRepo.GetTagInfos(git.TagOption{}) + opts := models.FindReleasesOptions{ + IncludeDrafts: ctx.Repo.IsWriter(), + IncludeTags: true, + } + + releases, err := models.GetReleasesByRepoID(ctx.Repo.Repository.ID, opts, page, limit) if err != nil { - ctx.Handle(500, "GetTags", err) + ctx.Handle(500, "GetReleasesByRepoID", err) return } - if len(rawTags) == 0 { - ctx.HTML(200, tplReleases) - return - } - - if len(rawTags) <= (page-1)*limit { - ctx.Handle(500, "Releases", errors.New("no more pages")) - return - } - - var tags []*git.Tag - if page*limit > len(rawTags) { - tags = rawTags[(page-1)*limit:] - } else { - tags = rawTags[(page-1)*limit : page*limit] - } - - var tagNames []string - for _, t := range tags { - tagNames = append(tagNames, t.Name) - } - - releases, err := models.GetReleasesByRepoIDAndNames(ctx.Repo.Repository.ID, tagNames) + count, err := models.GetReleaseCountByRepoID(ctx.Repo.Repository.ID, opts) if err != nil { - ctx.Handle(500, "GetReleasesByRepoIDAndNames", err) + ctx.Handle(500, "GetReleaseCountByRepoID", err) return } @@ -106,61 +88,37 @@ func Releases(ctx *context.Context) { return } - // Temproray cache commits count of used branches to speed up. + // Temporary cache commits count of used branches to speed up. countCache := make(map[string]int64) - var cacheUsers = make(map[int64]*models.User) + cacheUsers := make(map[int64]*models.User) + if ctx.User != nil { + cacheUsers[ctx.User.ID] = ctx.User + } var ok bool - releaseTags := make([]*models.Release, len(tags)) - for i, rawTag := range tags { - for _, r := range releases { - if r.IsDraft && !ctx.Repo.IsOwner() { - continue - } - if r.TagName == rawTag.Name { - if r.Publisher, ok = cacheUsers[r.PublisherID]; !ok { - r.Publisher, err = models.GetUserByID(r.PublisherID) - if err != nil { - if models.IsErrUserNotExist(err) { - r.Publisher = models.NewGhostUser() - } else { - ctx.Handle(500, "GetUserByID", err) - return - } - } - cacheUsers[r.PublisherID] = r.Publisher - } - if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil { - ctx.Handle(500, "calReleaseNumCommitsBehind", err) + for _, r := range releases { + if r.Publisher, ok = cacheUsers[r.PublisherID]; !ok { + r.Publisher, err = models.GetUserByID(r.PublisherID) + if err != nil { + if models.IsErrUserNotExist(err) { + r.Publisher = models.NewGhostUser() + } else { + ctx.Handle(500, "GetUserByID", err) return } - - r.Note = markdown.RenderString(r.Note, ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas()) - releaseTags[i] = r - break } + cacheUsers[r.PublisherID] = r.Publisher } - - if releaseTags[i] == nil { - releaseTags[i] = &models.Release{ - Title: rawTag.Name, - TagName: rawTag.Name, - Sha1: rawTag.Object.String(), - Note: rawTag.Message, - } - - releaseTags[i].NumCommits, err = git.CommitsCount(ctx.Repo.GitRepo.Path, rawTag.Object.String()) - if err != nil { - ctx.Handle(500, "CommitsCount", err) - return - } - releaseTags[i].NumCommitsBehind = ctx.Repo.CommitsCount - releaseTags[i].NumCommits + if err := calReleaseNumCommitsBehind(ctx.Repo, r, countCache); err != nil { + ctx.Handle(500, "calReleaseNumCommitsBehind", err) + return } + r.Note = markdown.RenderString(r.Note, ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas()) } - pager := paginater.New(len(rawTags), limit, page, 5) + pager := paginater.New(int(count), limit, page, 5) ctx.Data["Page"] = pager - ctx.Data["Releases"] = releaseTags + ctx.Data["Releases"] = releases ctx.HTML(200, tplReleases) } @@ -188,57 +146,61 @@ func NewReleasePost(ctx *context.Context, form auth.NewReleaseForm) { return } - var tagCreatedUnix int64 - tag, err := ctx.Repo.GitRepo.GetTag(form.TagName) - if err == nil { - commit, err := tag.Commit() - if err == nil { - tagCreatedUnix = commit.Author.When.Unix() - } - } - - commit, err := ctx.Repo.GitRepo.GetBranchCommit(form.Target) - if err != nil { - ctx.Handle(500, "GetBranchCommit", err) - return - } - - commitsCount, err := commit.CommitsCount() - if err != nil { - ctx.Handle(500, "CommitsCount", err) - return - } - - rel := &models.Release{ - RepoID: ctx.Repo.Repository.ID, - PublisherID: ctx.User.ID, - Title: form.Title, - TagName: form.TagName, - Target: form.Target, - Sha1: commit.ID.String(), - NumCommits: commitsCount, - Note: form.Content, - IsDraft: len(form.Draft) > 0, - IsPrerelease: form.Prerelease, - CreatedUnix: tagCreatedUnix, - } - var attachmentUUIDs []string if setting.AttachmentEnabled { attachmentUUIDs = form.Files } - if err = models.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil { - ctx.Data["Err_TagName"] = true - switch { - case models.IsErrReleaseAlreadyExist(err): - ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_already_exist"), tplReleaseNew, &form) - case models.IsErrInvalidTagName(err): - ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_invalid"), tplReleaseNew, &form) - default: - ctx.Handle(500, "CreateRelease", err) + rel, err := models.GetRelease(ctx.Repo.Repository.ID, form.TagName) + if err != nil { + if !models.IsErrReleaseNotExist(err) { + ctx.Handle(500, "GetRelease", err) + return + } + + rel := &models.Release{ + RepoID: ctx.Repo.Repository.ID, + PublisherID: ctx.User.ID, + Title: form.Title, + TagName: form.TagName, + Target: form.Target, + Note: form.Content, + IsDraft: len(form.Draft) > 0, + IsPrerelease: form.Prerelease, + IsTag: false, + } + + if err = models.CreateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil { + ctx.Data["Err_TagName"] = true + switch { + case models.IsErrReleaseAlreadyExist(err): + ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_already_exist"), tplReleaseNew, &form) + case models.IsErrInvalidTagName(err): + ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_invalid"), tplReleaseNew, &form) + default: + ctx.Handle(500, "CreateRelease", err) + } + return + } + } else { + if !rel.IsTag { + ctx.Data["Err_TagName"] = true + ctx.RenderWithErr(ctx.Tr("repo.release.tag_name_already_exist"), tplReleaseNew, &form) + return + } + + rel.Title = form.Title + rel.Note = form.Content + rel.IsDraft = len(form.Draft) > 0 + rel.IsPrerelease = form.Prerelease + rel.PublisherID = ctx.User.ID + rel.IsTag = false + + if err = models.UpdateRelease(ctx.Repo.GitRepo, rel, attachmentUUIDs); err != nil { + ctx.Data["Err_TagName"] = true + ctx.Handle(500, "UpdateRelease", err) + return } - return } log.Trace("Release created: %s/%s:%s", ctx.User.LowerName, ctx.Repo.Repository.Name, form.TagName) @@ -289,6 +251,10 @@ func EditReleasePost(ctx *context.Context, form auth.EditReleaseForm) { } return } + if rel.IsTag { + ctx.Handle(404, "GetRelease", err) + return + } ctx.Data["tag_name"] = rel.TagName ctx.Data["tag_target"] = rel.Target ctx.Data["title"] = rel.Title @@ -318,8 +284,7 @@ func EditReleasePost(ctx *context.Context, form auth.EditReleaseForm) { // DeleteRelease delete a release func DeleteRelease(ctx *context.Context) { - delTag := ctx.QueryBool("delTag") - if err := models.DeleteReleaseByID(ctx.QueryInt64("id"), ctx.User, delTag); err != nil { + if err := models.DeleteReleaseByID(ctx.QueryInt64("id"), ctx.User, true); err != nil { ctx.Flash.Error("DeleteReleaseByID: " + err.Error()) } else { ctx.Flash.Success(ctx.Tr("repo.release.deletion_success")) diff --git a/routers/repo/repo.go b/routers/repo/repo.go index fa111d5..5fcbb84 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -67,6 +67,10 @@ func checkContextUser(ctx *context.Context, uid int64) *models.User { // Create render creating repository page func Create(ctx *context.Context) { + if !ctx.User.CanCreateRepo() { + ctx.RenderWithErr(ctx.Tr("repo.form.reach_limit_of_creation", ctx.User.MaxCreationLimit()), tplCreate, nil) + } + ctx.Data["Title"] = ctx.Tr("new_repo") // Give default value for template to render. @@ -89,7 +93,7 @@ func Create(ctx *context.Context) { func handleCreateError(ctx *context.Context, owner *models.User, err error, name string, tpl base.TplName, form interface{}) { switch { case models.IsErrReachLimitOfRepo(err): - ctx.RenderWithErr(ctx.Tr("repo.form.reach_limit_of_creation", owner.RepoCreationNum()), tpl, form) + ctx.RenderWithErr(ctx.Tr("repo.form.reach_limit_of_creation", owner.MaxCreationLimit()), tpl, form) case models.IsErrRepoAlreadyExist(err): ctx.Data["Err_RepoName"] = true ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), tpl, form) @@ -153,6 +157,7 @@ func Migrate(ctx *context.Context) { ctx.Data["private"] = ctx.User.LastRepoVisibility ctx.Data["IsForcedPrivate"] = setting.Repository.ForcePrivate ctx.Data["mirror"] = ctx.Query("mirror") == "1" + ctx.Data["LFSActive"] = setting.LFS.StartServer ctxUser := checkContextUser(ctx, ctx.QueryInt64("org")) if ctx.Written() { diff --git a/routers/repo/setting.go b/routers/repo/setting.go index fb6d68a..924d25f 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -111,12 +111,15 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { return } - if form.Interval > 0 { + interval, err := time.ParseDuration(form.Interval) + if err != nil || interval < setting.Mirror.MinInterval { + ctx.RenderWithErr(ctx.Tr("repo.mirror_interval_invalid"), tplSettingsOptions, &form) + } else { ctx.Repo.Mirror.EnablePrune = form.EnablePrune - ctx.Repo.Mirror.Interval = form.Interval - ctx.Repo.Mirror.NextUpdate = time.Now().Add(time.Duration(form.Interval) * time.Hour) + ctx.Repo.Mirror.Interval = interval + ctx.Repo.Mirror.NextUpdate = time.Now().Add(interval) if err := models.UpdateMirror(ctx.Repo.Mirror); err != nil { - ctx.Handle(500, "UpdateMirror", err) + ctx.RenderWithErr(ctx.Tr("repo.mirror_interval_invalid"), tplSettingsOptions, &form) return } } @@ -477,9 +480,11 @@ func ProtectedBranchPost(ctx *context.Context) { return } - branch := strings.ToLower(ctx.Query("branch")) - if ctx.Repo.GitRepo.IsBranchExist(branch) && - repo.DefaultBranch != branch { + branch := ctx.Query("branch") + if !ctx.Repo.GitRepo.IsBranchExist(branch) { + ctx.Status(404) + return + } else if repo.DefaultBranch != branch { repo.DefaultBranch = branch if err := ctx.Repo.GitRepo.SetDefaultBranch(branch); err != nil { if !git.IsErrUnsupportedVersion(err) { @@ -515,7 +520,7 @@ func ProtectedBranchPost(ctx *context.Context) { canPush := ctx.QueryBool("canPush") - if canPush { + if !canPush { if err := ctx.Repo.Repository.AddProtectedBranch(branchName, canPush); err != nil { ctx.Flash.Error(ctx.Tr("repo.settings.add_protected_branch_failed", branchName)) ctx.JSON(200, map[string]string{ @@ -661,7 +666,7 @@ func DeployKeys(ctx *context.Context) { } // DeployKeysPost response for adding a deploy key of a repository -func DeployKeysPost(ctx *context.Context, form auth.AddSSHKeyForm) { +func DeployKeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys") ctx.Data["PageIsSettingsKeys"] = true diff --git a/routers/repo/view.go b/routers/repo/view.go index 5f9d78a..3d5b189 100644 --- a/routers/repo/view.go +++ b/routers/repo/view.go @@ -21,13 +21,14 @@ import ( "code.gitea.io/gitea/modules/highlight" "code.gitea.io/gitea/modules/lfs" "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/markdown" + "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/templates" "github.com/Unknwon/paginater" ) const ( + tplRepoBARE base.TplName = "repo/bare" tplRepoHome base.TplName = "repo/home" tplWatchers base.TplName = "repo/watchers" tplForks base.TplName = "repo/forks" @@ -55,13 +56,19 @@ func renderDirectory(ctx *context.Context, treeLink string) { var readmeFile *git.Blob for _, entry := range entries { - if entry.IsDir() || !markdown.IsReadmeFile(entry.Name()) { + if entry.IsDir() { + continue + } + + tp, ok := markup.ReadmeFileType(entry.Name()) + if !ok { continue } - // TODO: collect all possible README files and show with priority. readmeFile = entry.Blob() - break + if tp != "" { + break + } } if readmeFile != nil { @@ -86,17 +93,12 @@ func renderDirectory(ctx *context.Context, treeLink string) { if isTextFile { d, _ := ioutil.ReadAll(dataRc) buf = append(buf, d...) - switch { - case markdown.IsMarkdownFile(readmeFile.Name()): - ctx.Data["IsMarkdown"] = true - buf = markdown.Render(buf, treeLink, ctx.Repo.Repository.ComposeMetas()) - default: - // FIXME This is the only way to show non-markdown files - // instead of a broken "View Raw" link - ctx.Data["IsMarkdown"] = true - buf = bytes.Replace(buf, []byte("\n"), []byte(`
    `), -1) + ctx.Data["IsRenderedHTML"] = true + if markup.Type(readmeFile.Name()) != "" { + ctx.Data["FileContent"] = string(markup.Render(readmeFile.Name(), buf, treeLink, ctx.Repo.Repository.ComposeMetas())) + } else { + ctx.Data["FileContent"] = string(bytes.Replace(buf, []byte("\n"), []byte(`
    `), -1)) } - ctx.Data["FileContent"] = string(buf) } } @@ -111,6 +113,7 @@ func renderDirectory(ctx *context.Context, treeLink string) { } } ctx.Data["LatestCommit"] = latestCommit + ctx.Data["LatestCommitVerification"] = models.ParseCommitWithSignature(latestCommit) ctx.Data["LatestCommitUser"] = models.ValidateCommitWithEmail(latestCommit) // Check permission to add or upload new file. @@ -181,13 +184,14 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st d, _ := ioutil.ReadAll(dataRc) buf = append(buf, d...) - isMarkdown := markdown.IsMarkdownFile(blob.Name()) - ctx.Data["IsMarkdown"] = isMarkdown - - readmeExist := isMarkdown || markdown.IsReadmeFile(blob.Name()) + readmeExist := markup.IsReadmeFile(blob.Name()) ctx.Data["ReadmeExist"] = readmeExist - if readmeExist && isMarkdown { - ctx.Data["FileContent"] = string(markdown.Render(buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas())) + if markup.Type(blob.Name()) != "" { + ctx.Data["IsRenderedHTML"] = true + ctx.Data["FileContent"] = string(markup.Render(blob.Name(), buf, path.Dir(treeLink), ctx.Repo.Repository.ComposeMetas())) + } else if readmeExist { + ctx.Data["IsRenderedHTML"] = true + ctx.Data["FileContent"] = string(bytes.Replace(buf, []byte("\n"), []byte(`
    `), -1)) } else { // Building code view blocks with line number on server side. var fileContent string @@ -203,7 +207,11 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st var output bytes.Buffer lines := strings.Split(fileContent, "\n") for index, line := range lines { - output.WriteString(fmt.Sprintf(`
  • %s
  • `, index+1, index+1, gotemplate.HTMLEscapeString(line)) + "\n") + line = gotemplate.HTMLEscapeString(line) + if index != len(lines)-1 { + line += "\n" + } + output.WriteString(fmt.Sprintf(`
  • %s
  • `, index+1, index+1, line)) } ctx.Data["FileContent"] = gotemplate.HTML(output.String()) @@ -243,12 +251,37 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st // Home render repository home page func Home(ctx *context.Context) { + if len(ctx.Repo.Repository.Units) > 0 { + tp := ctx.Repo.Repository.Units[0].Type + if tp == models.UnitTypeCode { + renderCode(ctx) + return + } + + unit, ok := models.Units[tp] + if ok { + ctx.Redirect(setting.AppSubURL + fmt.Sprintf("/%s%s", + ctx.Repo.Repository.FullName(), unit.URI)) + return + } + } + + ctx.Handle(404, "Home", fmt.Errorf(ctx.Tr("units.error.no_unit_allowed_repo"))) +} + +func renderCode(ctx *context.Context) { + ctx.Data["PageIsViewCode"] = true + + if ctx.Repo.Repository.IsBare { + ctx.HTML(200, tplRepoBARE) + return + } + title := ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name if len(ctx.Repo.Repository.Description) > 0 { title += ": " + ctx.Repo.Repository.Description } ctx.Data["Title"] = title - ctx.Data["PageIsViewCode"] = true ctx.Data["RequireHighlightJS"] = true branchLink := ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchName diff --git a/routers/repo/webhook.go b/routers/repo/webhook.go index 754cf16..bcc3297 100644 --- a/routers/repo/webhook.go +++ b/routers/repo/webhook.go @@ -1,4 +1,5 @@ // Copyright 2015 The Gogs Authors. All rights reserved. +// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -120,6 +121,53 @@ func ParseHookEvent(form auth.WebhookForm) *models.HookEvent { // WebHooksNewPost response for creating webhook func WebHooksNewPost(ctx *context.Context, form auth.NewWebhookForm) { + ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") + ctx.Data["PageIsSettingsHooks"] = true + ctx.Data["PageIsSettingsHooksNew"] = true + ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}} + ctx.Data["HookType"] = "gitea" + + orCtx, err := getOrgRepoCtx(ctx) + if err != nil { + ctx.Handle(500, "getOrgRepoCtx", err) + return + } + ctx.Data["BaseLink"] = orCtx.Link + + if ctx.HasError() { + ctx.HTML(200, orCtx.NewTemplate) + return + } + + contentType := models.ContentTypeJSON + if models.HookContentType(form.ContentType) == models.ContentTypeForm { + contentType = models.ContentTypeForm + } + + w := &models.Webhook{ + RepoID: orCtx.RepoID, + URL: form.PayloadURL, + ContentType: contentType, + Secret: form.Secret, + HookEvent: ParseHookEvent(form.WebhookForm), + IsActive: form.Active, + HookTaskType: models.GITEA, + OrgID: orCtx.OrgID, + } + if err := w.UpdateEvent(); err != nil { + ctx.Handle(500, "UpdateEvent", err) + return + } else if err := models.CreateWebhook(w); err != nil { + ctx.Handle(500, "CreateWebhook", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.add_hook_success")) + ctx.Redirect(orCtx.Link + "/settings/hooks") +} + +// GogsHooksNewPost response for creating webhook +func GogsHooksNewPost(ctx *context.Context, form auth.NewGogshookForm) { ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") ctx.Data["PageIsSettingsHooks"] = true ctx.Data["PageIsSettingsHooksNew"] = true @@ -150,7 +198,7 @@ func WebHooksNewPost(ctx *context.Context, form auth.NewWebhookForm) { Secret: form.Secret, HookEvent: ParseHookEvent(form.WebhookForm), IsActive: form.Active, - HookTaskType: models.GOGS, + HookTaskType: models.GITEA, OrgID: orCtx.OrgID, } if err := w.UpdateEvent(); err != nil { @@ -245,8 +293,10 @@ func checkWebhook(ctx *context.Context) (*orgRepoCtx, *models.Webhook) { case models.SLACK: ctx.Data["SlackHook"] = w.GetSlackHook() ctx.Data["HookType"] = "slack" - default: + case models.GOGS: ctx.Data["HookType"] = "gogs" + default: + ctx.Data["HookType"] = "gitea" } ctx.Data["History"], err = w.History(1) @@ -310,6 +360,45 @@ func WebHooksEditPost(ctx *context.Context, form auth.NewWebhookForm) { ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, w.ID)) } +// GogsHooksEditPost response for editing gogs hook +func GogsHooksEditPost(ctx *context.Context, form auth.NewGogshookForm) { + ctx.Data["Title"] = ctx.Tr("repo.settings.update_webhook") + ctx.Data["PageIsSettingsHooks"] = true + ctx.Data["PageIsSettingsHooksEdit"] = true + + orCtx, w := checkWebhook(ctx) + if ctx.Written() { + return + } + ctx.Data["Webhook"] = w + + if ctx.HasError() { + ctx.HTML(200, orCtx.NewTemplate) + return + } + + contentType := models.ContentTypeJSON + if models.HookContentType(form.ContentType) == models.ContentTypeForm { + contentType = models.ContentTypeForm + } + + w.URL = form.PayloadURL + w.ContentType = contentType + w.Secret = form.Secret + w.HookEvent = ParseHookEvent(form.WebhookForm) + w.IsActive = form.Active + if err := w.UpdateEvent(); err != nil { + ctx.Handle(500, "UpdateEvent", err) + return + } else if err := models.UpdateWebhook(w); err != nil { + ctx.Handle(500, "GogsHooksEditPost", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success")) + ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, w.ID)) +} + // SlackHooksEditPost response for editing slack hook func SlackHooksEditPost(ctx *context.Context, form auth.NewSlackHookForm) { ctx.Data["Title"] = ctx.Tr("repo.settings") diff --git a/routers/repo/wiki.go b/routers/repo/wiki.go index c1c05d3..2a73fdc 100644 --- a/routers/repo/wiki.go +++ b/routers/repo/wiki.go @@ -19,6 +19,7 @@ import ( "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/markdown" + "code.gitea.io/gitea/modules/markup" ) const ( @@ -30,8 +31,8 @@ const ( // MustEnableWiki check if wiki is enabled, if external then redirect func MustEnableWiki(ctx *context.Context) { - if !ctx.Repo.Repository.EnableUnit(models.UnitTypeWiki) && - !ctx.Repo.Repository.EnableUnit(models.UnitTypeExternalWiki) { + if !ctx.Repo.Repository.UnitEnabled(models.UnitTypeWiki) && + !ctx.Repo.Repository.UnitEnabled(models.UnitTypeExternalWiki) { ctx.Handle(404, "MustEnableWiki", nil) return } @@ -322,7 +323,7 @@ func Wiki(ctx *context.Context) { } ename := entry.Name() - if !markdown.IsMarkdownFile(ename) { + if markup.Type(ename) != markdown.MarkupName { ext := strings.ToUpper(filepath.Ext(ename)) ctx.Data["FormatWarning"] = fmt.Sprintf("%s rendering is not supported at the moment. Rendered as Markdown.", ext) } diff --git a/routers/routes/routes.go b/routers/routes/routes.go new file mode 100644 index 0000000..6771578 --- /dev/null +++ b/routers/routes/routes.go @@ -0,0 +1,676 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package routes + +import ( + "os" + "path" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/auth" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/lfs" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/options" + "code.gitea.io/gitea/modules/public" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/templates" + "code.gitea.io/gitea/modules/validation" + "code.gitea.io/gitea/routers" + "code.gitea.io/gitea/routers/admin" + apiv1 "code.gitea.io/gitea/routers/api/v1" + "code.gitea.io/gitea/routers/dev" + "code.gitea.io/gitea/routers/org" + "code.gitea.io/gitea/routers/private" + "code.gitea.io/gitea/routers/repo" + "code.gitea.io/gitea/routers/user" + + "github.com/go-macaron/binding" + "github.com/go-macaron/cache" + "github.com/go-macaron/captcha" + "github.com/go-macaron/csrf" + "github.com/go-macaron/gzip" + "github.com/go-macaron/i18n" + "github.com/go-macaron/session" + "github.com/go-macaron/toolbox" + "gopkg.in/macaron.v1" +) + +// NewMacaron initializes Macaron instance. +func NewMacaron() *macaron.Macaron { + m := macaron.New() + if !setting.DisableRouterLog { + m.Use(macaron.Logger()) + } + m.Use(macaron.Recovery()) + if setting.EnableGzip { + m.Use(gzip.Gziper()) + } + if setting.Protocol == setting.FCGI { + m.SetURLPrefix(setting.AppSubURL) + } + m.Use(public.Custom( + &public.Options{ + SkipLogging: setting.DisableRouterLog, + }, + )) + m.Use(public.Static( + &public.Options{ + Directory: path.Join(setting.StaticRootPath, "public"), + SkipLogging: setting.DisableRouterLog, + }, + )) + m.Use(macaron.Static( + setting.AvatarUploadPath, + macaron.StaticOptions{ + Prefix: "avatars", + SkipLogging: setting.DisableRouterLog, + ETag: true, + }, + )) + + m.Use(templates.Renderer()) + models.InitMailRender(templates.Mailer()) + + localeNames, err := options.Dir("locale") + + if err != nil { + log.Fatal(4, "Failed to list locale files: %v", err) + } + + localFiles := make(map[string][]byte) + + for _, name := range localeNames { + localFiles[name], err = options.Locale(name) + + if err != nil { + log.Fatal(4, "Failed to load %s locale file. %v", name, err) + } + } + + m.Use(i18n.I18n(i18n.Options{ + SubURL: setting.AppSubURL, + Files: localFiles, + Langs: setting.Langs, + Names: setting.Names, + DefaultLang: "en-US", + Redirect: true, + })) + m.Use(cache.Cacher(cache.Options{ + Adapter: setting.CacheAdapter, + AdapterConfig: setting.CacheConn, + Interval: setting.CacheInterval, + })) + m.Use(captcha.Captchaer(captcha.Options{ + SubURL: setting.AppSubURL, + })) + m.Use(session.Sessioner(setting.SessionConfig)) + m.Use(csrf.Csrfer(csrf.Options{ + Secret: setting.SecretKey, + Cookie: setting.CSRFCookieName, + SetCookie: true, + Header: "X-Csrf-Token", + CookiePath: setting.AppSubURL, + })) + m.Use(toolbox.Toolboxer(m, toolbox.Options{ + HealthCheckFuncs: []*toolbox.HealthCheckFuncDesc{ + { + Desc: "Database connection", + Func: models.Ping, + }, + }, + })) + m.Use(context.Contexter()) + return m +} + +// RegisterRoutes routes routes to Macaron +func RegisterRoutes(m *macaron.Macaron) { + reqSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: true}) + ignSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: setting.Service.RequireSignInView}) + ignSignInAndCsrf := context.Toggle(&context.ToggleOptions{DisableCSRF: true}) + reqSignOut := context.Toggle(&context.ToggleOptions{SignOutRequired: true}) + + bindIgnErr := binding.BindIgnErr + validation.AddBindingRules() + + openIDSignInEnabled := func(ctx *context.Context) { + if !setting.Service.EnableOpenIDSignIn { + ctx.Error(403) + return + } + } + + openIDSignUpEnabled := func(ctx *context.Context) { + if !setting.Service.EnableOpenIDSignUp { + ctx.Error(403) + return + } + } + + m.Use(user.GetNotificationCount) + + // FIXME: not all routes need go through same middlewares. + // Especially some AJAX requests, we can reduce middleware number to improve performance. + // Routers. + // for health check + m.Head("/", func() string { + return "" + }) + m.Get("/", ignSignIn, routers.Home) + m.Get("/swagger", ignSignIn, routers.Swagger) + m.Group("/explore", func() { + m.Get("", func(ctx *context.Context) { + ctx.Redirect(setting.AppSubURL + "/explore/repos") + }) + m.Get("/repos", routers.ExploreRepos) + m.Get("/users", routers.ExploreUsers) + m.Get("/organizations", routers.ExploreOrganizations) + }, ignSignIn) + m.Combo("/install", routers.InstallInit).Get(routers.Install). + Post(bindIgnErr(auth.InstallForm{}), routers.InstallPost) + m.Get("/^:type(issues|pulls)$", reqSignIn, user.Issues) + + // ***** START: User ***** + m.Group("/user", func() { + m.Get("/login", user.SignIn) + m.Post("/login", bindIgnErr(auth.SignInForm{}), user.SignInPost) + m.Group("", func() { + m.Combo("/login/openid"). + Get(user.SignInOpenID). + Post(bindIgnErr(auth.SignInOpenIDForm{}), user.SignInOpenIDPost) + }, openIDSignInEnabled) + m.Group("/openid", func() { + m.Combo("/connect"). + Get(user.ConnectOpenID). + Post(bindIgnErr(auth.ConnectOpenIDForm{}), user.ConnectOpenIDPost) + m.Group("/register", func() { + m.Combo(""). + Get(user.RegisterOpenID, openIDSignUpEnabled). + Post(bindIgnErr(auth.SignUpOpenIDForm{}), user.RegisterOpenIDPost) + }, openIDSignUpEnabled) + }, openIDSignInEnabled) + m.Get("/sign_up", user.SignUp) + m.Post("/sign_up", bindIgnErr(auth.RegisterForm{}), user.SignUpPost) + m.Get("/reset_password", user.ResetPasswd) + m.Post("/reset_password", user.ResetPasswdPost) + m.Group("/oauth2", func() { + m.Get("/:provider", user.SignInOAuth) + m.Get("/:provider/callback", user.SignInOAuthCallback) + }) + m.Get("/link_account", user.LinkAccount) + m.Post("/link_account_signin", bindIgnErr(auth.SignInForm{}), user.LinkAccountPostSignIn) + m.Post("/link_account_signup", bindIgnErr(auth.RegisterForm{}), user.LinkAccountPostRegister) + m.Group("/two_factor", func() { + m.Get("", user.TwoFactor) + m.Post("", bindIgnErr(auth.TwoFactorAuthForm{}), user.TwoFactorPost) + m.Get("/scratch", user.TwoFactorScratch) + m.Post("/scratch", bindIgnErr(auth.TwoFactorScratchAuthForm{}), user.TwoFactorScratchPost) + }) + }, reqSignOut) + + m.Group("/user/settings", func() { + m.Get("", user.Settings) + m.Post("", bindIgnErr(auth.UpdateProfileForm{}), user.SettingsPost) + m.Combo("/avatar").Get(user.SettingsAvatar). + Post(binding.MultipartForm(auth.AvatarForm{}), user.SettingsAvatarPost) + m.Post("/avatar/delete", user.SettingsDeleteAvatar) + m.Combo("/email").Get(user.SettingsEmails). + Post(bindIgnErr(auth.AddEmailForm{}), user.SettingsEmailPost) + m.Post("/email/delete", user.DeleteEmail) + m.Get("/password", user.SettingsPassword) + m.Post("/password", bindIgnErr(auth.ChangePasswordForm{}), user.SettingsPasswordPost) + m.Group("/openid", func() { + m.Combo("").Get(user.SettingsOpenID). + Post(bindIgnErr(auth.AddOpenIDForm{}), user.SettingsOpenIDPost) + m.Post("/delete", user.DeleteOpenID) + m.Post("/toggle_visibility", user.ToggleOpenIDVisibility) + }, openIDSignInEnabled) + m.Combo("/keys").Get(user.SettingsKeys). + Post(bindIgnErr(auth.AddKeyForm{}), user.SettingsKeysPost) + m.Post("/keys/delete", user.DeleteKey) + m.Combo("/applications").Get(user.SettingsApplications). + Post(bindIgnErr(auth.NewAccessTokenForm{}), user.SettingsApplicationsPost) + m.Post("/applications/delete", user.SettingsDeleteApplication) + m.Route("/delete", "GET,POST", user.SettingsDelete) + m.Combo("/account_link").Get(user.SettingsAccountLinks).Post(user.SettingsDeleteAccountLink) + m.Get("/organization", user.SettingsOrganization) + m.Group("/two_factor", func() { + m.Get("", user.SettingsTwoFactor) + m.Post("/regenerate_scratch", user.SettingsTwoFactorRegenerateScratch) + m.Post("/disable", user.SettingsTwoFactorDisable) + m.Get("/enroll", user.SettingsTwoFactorEnroll) + m.Post("/enroll", bindIgnErr(auth.TwoFactorAuthForm{}), user.SettingsTwoFactorEnrollPost) + }) + }, reqSignIn, func(ctx *context.Context) { + ctx.Data["PageIsUserSettings"] = true + }) + + m.Group("/user", func() { + // r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds) + m.Any("/activate", user.Activate) + m.Any("/activate_email", user.ActivateEmail) + m.Get("/email2user", user.Email2User) + m.Get("/forgot_password", user.ForgotPasswd) + m.Post("/forgot_password", user.ForgotPasswdPost) + m.Get("/logout", user.SignOut) + }) + // ***** END: User ***** + + adminReq := context.Toggle(&context.ToggleOptions{SignInRequired: true, AdminRequired: true}) + + // ***** START: Admin ***** + m.Group("/admin", func() { + m.Get("", adminReq, admin.Dashboard) + m.Get("/config", admin.Config) + m.Post("/config/test_mail", admin.SendTestMail) + m.Get("/monitor", admin.Monitor) + + m.Group("/users", func() { + m.Get("", admin.Users) + m.Combo("/new").Get(admin.NewUser).Post(bindIgnErr(auth.AdminCreateUserForm{}), admin.NewUserPost) + m.Combo("/:userid").Get(admin.EditUser).Post(bindIgnErr(auth.AdminEditUserForm{}), admin.EditUserPost) + m.Post("/:userid/delete", admin.DeleteUser) + }) + + m.Group("/orgs", func() { + m.Get("", admin.Organizations) + }) + + m.Group("/repos", func() { + m.Get("", admin.Repos) + m.Post("/delete", admin.DeleteRepo) + }) + + m.Group("/auths", func() { + m.Get("", admin.Authentications) + m.Combo("/new").Get(admin.NewAuthSource).Post(bindIgnErr(auth.AuthenticationForm{}), admin.NewAuthSourcePost) + m.Combo("/:authid").Get(admin.EditAuthSource). + Post(bindIgnErr(auth.AuthenticationForm{}), admin.EditAuthSourcePost) + m.Post("/:authid/delete", admin.DeleteAuthSource) + }) + + m.Group("/notices", func() { + m.Get("", admin.Notices) + m.Post("/delete", admin.DeleteNotices) + m.Get("/empty", admin.EmptyNotices) + }) + }, adminReq) + // ***** END: Admin ***** + + m.Group("", func() { + m.Group("/:username", func() { + m.Get("", user.Profile) + m.Get("/followers", user.Followers) + m.Get("/following", user.Following) + }) + + m.Get("/attachments/:uuid", func(ctx *context.Context) { + attach, err := models.GetAttachmentByUUID(ctx.Params(":uuid")) + if err != nil { + if models.IsErrAttachmentNotExist(err) { + ctx.Error(404) + } else { + ctx.Handle(500, "GetAttachmentByUUID", err) + } + return + } + + fr, err := os.Open(attach.LocalPath()) + if err != nil { + ctx.Handle(500, "Open", err) + return + } + defer fr.Close() + + if err := attach.IncreaseDownloadCount(); err != nil { + ctx.Handle(500, "Update", err) + return + } + + if err = repo.ServeData(ctx, attach.Name, fr); err != nil { + ctx.Handle(500, "ServeData", err) + return + } + }) + m.Post("/attachments", repo.UploadAttachment) + }, ignSignIn) + + m.Group("/:username", func() { + m.Get("/action/:action", user.Action) + }, reqSignIn) + + if macaron.Env == macaron.DEV { + m.Get("/template/*", dev.TemplatePreview) + } + + reqRepoAdmin := context.RequireRepoAdmin() + reqRepoWriter := context.RequireRepoWriter() + + // ***** START: Organization ***** + m.Group("/org", func() { + m.Group("", func() { + m.Get("/create", org.Create) + m.Post("/create", bindIgnErr(auth.CreateOrgForm{}), org.CreatePost) + }, func(ctx *context.Context) { + if !ctx.User.CanCreateOrganization() { + ctx.NotFound() + } + }) + + m.Group("/:org", func() { + m.Get("/dashboard", user.Dashboard) + m.Get("/^:type(issues|pulls)$", user.Issues) + m.Get("/members", org.Members) + m.Get("/members/action/:action", org.MembersAction) + + m.Get("/teams", org.Teams) + }, context.OrgAssignment(true)) + + m.Group("/:org", func() { + m.Get("/teams/:team", org.TeamMembers) + m.Get("/teams/:team/repositories", org.TeamRepositories) + m.Route("/teams/:team/action/:action", "GET,POST", org.TeamsAction) + m.Route("/teams/:team/action/repo/:action", "GET,POST", org.TeamsRepoAction) + }, context.OrgAssignment(true, false, true)) + + m.Group("/:org", func() { + m.Get("/teams/new", org.NewTeam) + m.Post("/teams/new", bindIgnErr(auth.CreateTeamForm{}), org.NewTeamPost) + m.Get("/teams/:team/edit", org.EditTeam) + m.Post("/teams/:team/edit", bindIgnErr(auth.CreateTeamForm{}), org.EditTeamPost) + m.Post("/teams/:team/delete", org.DeleteTeam) + + m.Group("/settings", func() { + m.Combo("").Get(org.Settings). + Post(bindIgnErr(auth.UpdateOrgSettingForm{}), org.SettingsPost) + m.Post("/avatar", binding.MultipartForm(auth.AvatarForm{}), org.SettingsAvatar) + m.Post("/avatar/delete", org.SettingsDeleteAvatar) + + m.Group("/hooks", func() { + m.Get("", org.Webhooks) + m.Post("/delete", org.DeleteWebhook) + m.Get("/:type/new", repo.WebhooksNew) + m.Post("/gitea/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) + m.Post("/gogs/new", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksNewPost) + m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) + m.Get("/:id", repo.WebHooksEdit) + m.Post("/gitea/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) + m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksEditPost) + m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) + }) + + m.Route("/delete", "GET,POST", org.SettingsDelete) + }) + + m.Route("/invitations/new", "GET,POST", org.Invitation) + }, context.OrgAssignment(true, true)) + }, reqSignIn) + // ***** END: Organization ***** + + // ***** START: Repository ***** + m.Group("/repo", func() { + m.Get("/create", repo.Create) + m.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost) + m.Get("/migrate", repo.Migrate) + m.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost) + m.Group("/fork", func() { + m.Combo("/:repoid").Get(repo.Fork). + Post(bindIgnErr(auth.CreateRepoForm{}), repo.ForkPost) + }, context.RepoIDAssignment(), context.UnitTypes(), context.LoadRepoUnits(), context.CheckUnit(models.UnitTypeCode)) + }, reqSignIn) + + m.Group("/:username/:reponame", func() { + m.Group("/settings", func() { + m.Combo("").Get(repo.Settings). + Post(bindIgnErr(auth.RepoSettingForm{}), repo.SettingsPost) + m.Group("/collaboration", func() { + m.Combo("").Get(repo.Collaboration).Post(repo.CollaborationPost) + m.Post("/access_mode", repo.ChangeCollaborationAccessMode) + m.Post("/delete", repo.DeleteCollaboration) + }) + m.Group("/branches", func() { + m.Combo("").Get(repo.ProtectedBranch).Post(repo.ProtectedBranchPost) + m.Post("/can_push", repo.ChangeProtectedBranch) + m.Post("/delete", repo.DeleteProtectedBranch) + }, repo.MustBeNotBare) + + m.Group("/hooks", func() { + m.Get("", repo.Webhooks) + m.Post("/delete", repo.DeleteWebhook) + m.Get("/:type/new", repo.WebhooksNew) + m.Post("/gitea/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) + m.Post("/gogs/new", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksNewPost) + m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) + m.Get("/:id", repo.WebHooksEdit) + m.Post("/:id/test", repo.TestWebhook) + m.Post("/gitea/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) + m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksNewPost) + m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) + + m.Group("/git", func() { + m.Get("", repo.GitHooks) + m.Combo("/:name").Get(repo.GitHooksEdit). + Post(repo.GitHooksEditPost) + }, context.GitHookService()) + }) + + m.Group("/keys", func() { + m.Combo("").Get(repo.DeployKeys). + Post(bindIgnErr(auth.AddKeyForm{}), repo.DeployKeysPost) + m.Post("/delete", repo.DeleteDeployKey) + }) + + }, func(ctx *context.Context) { + ctx.Data["PageIsSettings"] = true + }) + }, reqSignIn, context.RepoAssignment(), reqRepoAdmin, context.UnitTypes(), context.LoadRepoUnits(), context.RepoRef()) + + m.Get("/:username/:reponame/action/:action", reqSignIn, context.RepoAssignment(), repo.Action) + + m.Group("/:username/:reponame", func() { + m.Group("/issues", func() { + m.Combo("/new", repo.MustEnableIssues).Get(context.RepoRef(), repo.NewIssue). + Post(bindIgnErr(auth.CreateIssueForm{}), repo.NewIssuePost) + }, context.CheckUnit(models.UnitTypeIssues)) + // FIXME: should use different URLs but mostly same logic for comments of issue and pull reuqest. + // So they can apply their own enable/disable logic on routers. + m.Group("/issues", func() { + m.Group("/:index", func() { + m.Post("/title", repo.UpdateIssueTitle) + m.Post("/content", repo.UpdateIssueContent) + m.Post("/watch", repo.IssueWatch) + m.Combo("/comments").Post(bindIgnErr(auth.CreateCommentForm{}), repo.NewComment) + }) + + m.Post("/labels", reqRepoWriter, repo.UpdateIssueLabel) + m.Post("/milestone", reqRepoWriter, repo.UpdateIssueMilestone) + m.Post("/assignee", reqRepoWriter, repo.UpdateIssueAssignee) + m.Post("/status", reqRepoWriter, repo.UpdateIssueStatus) + }) + m.Group("/comments/:id", func() { + m.Post("", repo.UpdateCommentContent) + m.Post("/delete", repo.DeleteComment) + }, context.CheckAnyUnit(models.UnitTypeIssues, models.UnitTypePullRequests)) + m.Group("/labels", func() { + m.Post("/new", bindIgnErr(auth.CreateLabelForm{}), repo.NewLabel) + m.Post("/edit", bindIgnErr(auth.CreateLabelForm{}), repo.UpdateLabel) + m.Post("/delete", repo.DeleteLabel) + m.Post("/initialize", bindIgnErr(auth.InitializeLabelsForm{}), repo.InitializeLabels) + }, reqRepoWriter, context.RepoRef(), context.CheckAnyUnit(models.UnitTypeIssues, models.UnitTypePullRequests)) + m.Group("/milestones", func() { + m.Combo("/new").Get(repo.NewMilestone). + Post(bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost) + m.Get("/:id/edit", repo.EditMilestone) + m.Post("/:id/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.EditMilestonePost) + m.Get("/:id/:action", repo.ChangeMilestonStatus) + m.Post("/delete", repo.DeleteMilestone) + }, reqRepoWriter, context.RepoRef(), context.CheckAnyUnit(models.UnitTypeIssues, models.UnitTypePullRequests)) + + m.Combo("/compare/*", repo.MustAllowPulls, repo.SetEditorconfigIfExists). + Get(repo.CompareAndPullRequest). + Post(bindIgnErr(auth.CreateIssueForm{}), repo.CompareAndPullRequestPost) + + m.Group("", func() { + m.Combo("/_edit/*").Get(repo.EditFile). + Post(bindIgnErr(auth.EditRepoFileForm{}), repo.EditFilePost) + m.Combo("/_new/*").Get(repo.NewFile). + Post(bindIgnErr(auth.EditRepoFileForm{}), repo.NewFilePost) + m.Post("/_preview/*", bindIgnErr(auth.EditPreviewDiffForm{}), repo.DiffPreviewPost) + m.Combo("/_delete/*").Get(repo.DeleteFile). + Post(bindIgnErr(auth.DeleteRepoFileForm{}), repo.DeleteFilePost) + + m.Group("", func() { + m.Combo("/_upload/*").Get(repo.UploadFile). + Post(bindIgnErr(auth.UploadRepoFileForm{}), repo.UploadFilePost) + m.Post("/upload-file", repo.UploadFileToServer) + m.Post("/upload-remove", bindIgnErr(auth.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer) + }, func(ctx *context.Context) { + if !setting.Repository.Upload.Enabled { + ctx.Handle(404, "", nil) + return + } + }) + }, repo.MustBeNotBare, reqRepoWriter, context.RepoRef(), func(ctx *context.Context) { + if !ctx.Repo.Repository.CanEnableEditor() || ctx.Repo.IsViewCommit { + ctx.Handle(404, "", nil) + return + } + }) + }, reqSignIn, context.RepoAssignment(), context.UnitTypes(), context.LoadRepoUnits()) + + // Releases + m.Group("/:username/:reponame", func() { + m.Group("/releases", func() { + m.Get("/", repo.MustBeNotBare, repo.Releases) + }, repo.MustBeNotBare, context.RepoRef()) + m.Group("/releases", func() { + m.Get("/new", repo.NewRelease) + m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost) + m.Post("/delete", repo.DeleteRelease) + }, reqSignIn, repo.MustBeNotBare, reqRepoWriter, context.RepoRef()) + m.Group("/releases", func() { + m.Get("/edit/*", repo.EditRelease) + m.Post("/edit/*", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost) + }, reqSignIn, repo.MustBeNotBare, reqRepoWriter, func(ctx *context.Context) { + var err error + ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch) + if err != nil { + ctx.Handle(500, "GetBranchCommit", err) + return + } + ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount() + if err != nil { + ctx.Handle(500, "CommitsCount", err) + return + } + ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount + }) + }, context.RepoAssignment(), context.UnitTypes(), context.LoadRepoUnits(), context.CheckUnit(models.UnitTypeReleases)) + + m.Group("/:username/:reponame", func() { + m.Group("", func() { + m.Get("/^:type(issues|pulls)$", repo.RetrieveLabels, repo.Issues) + m.Get("/^:type(issues|pulls)$/:index", repo.ViewIssue) + m.Get("/labels/", context.CheckAnyUnit(models.UnitTypeIssues, models.UnitTypePullRequests), repo.RetrieveLabels, repo.Labels) + m.Get("/milestones", context.CheckAnyUnit(models.UnitTypeIssues, models.UnitTypePullRequests), repo.Milestones) + }, context.RepoRef()) + + m.Group("/wiki", func() { + m.Get("/?:page", repo.Wiki) + m.Get("/_pages", repo.WikiPages) + + m.Group("", func() { + m.Combo("/_new").Get(repo.NewWiki). + Post(bindIgnErr(auth.NewWikiForm{}), repo.NewWikiPost) + m.Combo("/:page/_edit").Get(repo.EditWiki). + Post(bindIgnErr(auth.NewWikiForm{}), repo.EditWikiPost) + m.Post("/:page/delete", repo.DeleteWikiPagePost) + }, reqSignIn, reqRepoWriter) + }, repo.MustEnableWiki, context.RepoRef(), context.CheckUnit(models.UnitTypeWiki)) + + m.Group("/wiki", func() { + m.Get("/raw/*", repo.WikiRaw) + m.Get("/*", repo.WikiRaw) + }, repo.MustEnableWiki, context.CheckUnit(models.UnitTypeWiki), context.CheckUnit(models.UnitTypeWiki)) + + m.Get("/archive/*", repo.MustBeNotBare, repo.Download, context.CheckUnit(models.UnitTypeCode)) + + m.Group("/pulls/:index", func() { + m.Get("/commits", context.RepoRef(), repo.ViewPullCommits) + m.Get("/files", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.ViewPullFiles) + m.Post("/merge", reqRepoWriter, repo.MergePullRequest) + m.Post("/cleanup", context.RepoRef(), repo.CleanUpPullRequest) + }, repo.MustAllowPulls, context.CheckUnit(models.UnitTypePullRequests)) + + m.Group("", func() { + m.Get("/raw/*", repo.SingleDownload) + m.Get("/commits/*", repo.RefCommits) + m.Get("/graph", repo.Graph) + m.Get("/commit/:sha([a-f0-9]{7,40})$", repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.Diff) + }, repo.MustBeNotBare, context.RepoRef(), context.CheckUnit(models.UnitTypeCode)) + + m.Group("", func() { + m.Get("/src/*", repo.SetEditorconfigIfExists, repo.Home) + m.Get("/forks", repo.Forks) + }, context.RepoRef(), context.CheckUnit(models.UnitTypeCode)) + m.Get("/commit/:sha([a-f0-9]{7,40})\\.:ext(patch|diff)", repo.MustBeNotBare, repo.RawDiff, context.CheckUnit(models.UnitTypeCode)) + + m.Get("/compare/:before([a-z0-9]{40})\\.\\.\\.:after([a-z0-9]{40})", repo.SetEditorconfigIfExists, + repo.SetDiffViewStyle, repo.MustBeNotBare, repo.CompareDiff, context.CheckUnit(models.UnitTypeCode)) + }, ignSignIn, context.RepoAssignment(), context.UnitTypes(), context.LoadRepoUnits()) + m.Group("/:username/:reponame", func() { + m.Get("/stars", repo.Stars) + m.Get("/watchers", repo.Watchers) + }, ignSignIn, context.RepoAssignment(), context.RepoRef(), context.UnitTypes(), context.LoadRepoUnits()) + + m.Group("/:username", func() { + m.Group("/:reponame", func() { + m.Get("", repo.SetEditorconfigIfExists, repo.Home) + m.Get("\\.git$", repo.SetEditorconfigIfExists, repo.Home) + }, ignSignIn, context.RepoAssignment(), context.RepoRef(), context.UnitTypes(), context.LoadRepoUnits()) + + m.Group("/:reponame", func() { + m.Group("/info/lfs", func() { + m.Post("/objects/batch", lfs.BatchHandler) + m.Get("/objects/:oid/:filename", lfs.ObjectOidHandler) + m.Any("/objects/:oid", lfs.ObjectOidHandler) + m.Post("/objects", lfs.PostHandler) + m.Any("/*", func(ctx *context.Context) { + ctx.Handle(404, "", nil) + }) + }, ignSignInAndCsrf) + m.Any("/*", ignSignInAndCsrf, repo.HTTP) + m.Head("/tasks/trigger", repo.TriggerTask) + }) + }) + // ***** END: Repository ***** + + m.Group("/notifications", func() { + m.Get("", user.Notifications) + m.Post("/status", user.NotificationStatusPost) + }, reqSignIn) + + m.Group("/api", func() { + apiv1.RegisterRoutes(m) + }, ignSignIn) + + m.Group("/api/internal", func() { + // package name internal is ideal but Golang is not allowed, so we use private as package name. + private.RegisterRoutes(m) + }) + + // robots.txt + m.Get("/robots.txt", func(ctx *context.Context) { + if setting.HasRobotsTxt { + ctx.ServeFileContent(path.Join(setting.CustomPath, "robots.txt")) + } else { + ctx.Handle(404, "", nil) + } + }) + + // Not found handler. + m.NotFound(routers.NotFound) +} diff --git a/routers/user/auth.go b/routers/user/auth.go index ed8aac0..b2caba0 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -114,12 +114,17 @@ func SignIn(ctx *context.Context) { return } - oauth2Providers, err := models.GetActiveOAuth2Providers() + orderedOAuth2Names, oauth2Providers, err := models.GetActiveOAuth2Providers() if err != nil { ctx.Handle(500, "UserSignIn", err) return } + ctx.Data["OrderedOAuth2Names"] = orderedOAuth2Names ctx.Data["OAuth2Providers"] = oauth2Providers + ctx.Data["Title"] = ctx.Tr("sign_in") + ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login" + ctx.Data["PageIsSignIn"] = true + ctx.Data["PageIsLogin"] = true ctx.HTML(200, tplSignIn) } @@ -128,12 +133,17 @@ func SignIn(ctx *context.Context) { func SignInPost(ctx *context.Context, form auth.SignInForm) { ctx.Data["Title"] = ctx.Tr("sign_in") - oauth2Providers, err := models.GetActiveOAuth2Providers() + orderedOAuth2Names, oauth2Providers, err := models.GetActiveOAuth2Providers() if err != nil { ctx.Handle(500, "UserSignIn", err) return } + ctx.Data["OrderedOAuth2Names"] = orderedOAuth2Names ctx.Data["OAuth2Providers"] = oauth2Providers + ctx.Data["Title"] = ctx.Tr("sign_in") + ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login" + ctx.Data["PageIsSignIn"] = true + ctx.Data["PageIsLogin"] = true if ctx.HasError() { ctx.HTML(200, tplSignIn) @@ -316,6 +326,10 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR setting.CookieRememberName, u.Name, days, setting.AppSubURL) } + ctx.Session.Delete("openid_verified_uri") + ctx.Session.Delete("openid_signin_remember") + ctx.Session.Delete("openid_determined_email") + ctx.Session.Delete("openid_determined_username") ctx.Session.Delete("twofaUid") ctx.Session.Delete("twofaRemember") ctx.Session.Set("uid", u.ID) @@ -326,8 +340,8 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR // Register last login u.SetLastLogin() - if err := models.UpdateUser(u); err != nil { - ctx.Handle(500, "UpdateUser", err) + if err := models.UpdateUserCols(u, "last_login_unix"); err != nil { + ctx.Handle(500, "UpdateUserCols", err) return } @@ -416,8 +430,8 @@ func handleOAuth2SignIn(u *models.User, gothUser goth.User, ctx *context.Context // Register last login u.SetLastLogin() - if err := models.UpdateUser(u); err != nil { - ctx.Handle(500, "UpdateUser", err) + if err := models.UpdateUserCols(u, "last_login_unix"); err != nil { + ctx.Handle(500, "UpdateUserCols", err) return } @@ -652,7 +666,8 @@ func LinkAccountPostRegister(ctx *context.Context, cpt *captcha.Captcha, form au if models.CountUsers() == 1 { u.IsAdmin = true u.IsActive = true - if err := models.UpdateUser(u); err != nil { + u.SetLastLogin() + if err := models.UpdateUserCols(u, "is_admin", "is_active", "last_login_unix"); err != nil { ctx.Handle(500, "UpdateUser", err) return } @@ -663,7 +678,7 @@ func LinkAccountPostRegister(ctx *context.Context, cpt *captcha.Captcha, form au models.SendActivateAccountMail(ctx.Context, u) ctx.Data["IsSendRegisterMail"] = true ctx.Data["Email"] = u.Email - ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60 + ctx.Data["ActiveCodeLives"] = base.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale.Language()) ctx.HTML(200, TplActivate) if err := ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil { @@ -692,6 +707,8 @@ func SignOut(ctx *context.Context) { func SignUp(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("sign_up") + ctx.Data["SignUpLink"] = setting.AppSubURL + "/user/sign_up" + ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration @@ -703,6 +720,8 @@ func SignUp(ctx *context.Context) { func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterForm) { ctx.Data["Title"] = ctx.Tr("sign_up") + ctx.Data["SignUpLink"] = setting.AppSubURL + "/user/sign_up" + ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha if setting.Service.DisableRegistration { @@ -763,7 +782,8 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo if models.CountUsers() == 1 { u.IsAdmin = true u.IsActive = true - if err := models.UpdateUser(u); err != nil { + u.SetLastLogin() + if err := models.UpdateUserCols(u, "is_admin", "is_active", "last_login_unix"); err != nil { ctx.Handle(500, "UpdateUser", err) return } @@ -774,7 +794,7 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo models.SendActivateAccountMail(ctx.Context, u) ctx.Data["IsSendRegisterMail"] = true ctx.Data["Email"] = u.Email - ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60 + ctx.Data["ActiveCodeLives"] = base.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale.Language()) ctx.HTML(200, TplActivate) if err := ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil { @@ -800,7 +820,7 @@ func Activate(ctx *context.Context) { if ctx.Cache.IsExist("MailResendLimit_" + ctx.User.LowerName) { ctx.Data["ResendLimited"] = true } else { - ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60 + ctx.Data["ActiveCodeLives"] = base.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale.Language()) models.SendActivateAccountMail(ctx.Context, ctx.User) if err := ctx.Cache.Put("MailResendLimit_"+ctx.User.LowerName, ctx.User.LowerName, 180); err != nil { @@ -822,7 +842,7 @@ func Activate(ctx *context.Context) { ctx.Handle(500, "UpdateUser", err) return } - if err := models.UpdateUser(user); err != nil { + if err := models.UpdateUserCols(user, "is_active", "rands"); err != nil { if models.IsErrUserNotExist(err) { ctx.Error(404) } else { @@ -864,7 +884,7 @@ func ActivateEmail(ctx *context.Context) { // ForgotPasswd render the forget pasword page func ForgotPasswd(ctx *context.Context) { - ctx.Data["Title"] = ctx.Tr("auth.forgot_password") + ctx.Data["Title"] = ctx.Tr("auth.forgot_password_title") if setting.MailService == nil { ctx.Data["IsResetDisable"] = true @@ -872,13 +892,16 @@ func ForgotPasswd(ctx *context.Context) { return } + email := ctx.Query("email") + ctx.Data["Email"] = email + ctx.Data["IsResetRequest"] = true ctx.HTML(200, tplForgotPassword) } // ForgotPasswdPost response for forget password request func ForgotPasswdPost(ctx *context.Context) { - ctx.Data["Title"] = ctx.Tr("auth.forgot_password") + ctx.Data["Title"] = ctx.Tr("auth.forgot_password_title") if setting.MailService == nil { ctx.Handle(403, "ForgotPasswdPost", nil) @@ -892,7 +915,7 @@ func ForgotPasswdPost(ctx *context.Context) { u, err := models.GetUserByEmail(email) if err != nil { if models.IsErrUserNotExist(err) { - ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60 + ctx.Data["ResetPwdCodeLives"] = base.MinutesToFriendly(setting.Service.ResetPwdCodeLives, ctx.Locale.Language()) ctx.Data["IsResetSent"] = true ctx.HTML(200, tplForgotPassword) return @@ -919,7 +942,7 @@ func ForgotPasswdPost(ctx *context.Context) { log.Error(4, "Set cache(MailResendLimit) fail: %v", err) } - ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60 + ctx.Data["ResetPwdCodeLives"] = base.MinutesToFriendly(setting.Service.ResetPwdCodeLives, ctx.Locale.Language()) ctx.Data["IsResetSent"] = true ctx.HTML(200, tplForgotPassword) } @@ -970,7 +993,7 @@ func ResetPasswdPost(ctx *context.Context) { return } u.EncodePasswd() - if err := models.UpdateUser(u); err != nil { + if err := models.UpdateUserCols(u, "passwd", "rands", "salt"); err != nil { ctx.Handle(500, "UpdateUser", err) return } diff --git a/routers/user/auth_openid.go b/routers/user/auth_openid.go new file mode 100644 index 0000000..a512468 --- /dev/null +++ b/routers/user/auth_openid.go @@ -0,0 +1,424 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package user + +import ( + "fmt" + "net/url" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/auth" + "code.gitea.io/gitea/modules/auth/openid" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + + "github.com/go-macaron/captcha" +) + +const ( + tplSignInOpenID base.TplName = "user/auth/signin_openid" + tplConnectOID base.TplName = "user/auth/signup_openid_connect" + tplSignUpOID base.TplName = "user/auth/signup_openid_register" +) + +// SignInOpenID render sign in page +func SignInOpenID(ctx *context.Context) { + ctx.Data["Title"] = ctx.Tr("sign_in") + + if ctx.Query("openid.return_to") != "" { + signInOpenIDVerify(ctx) + return + } + + // Check auto-login. + isSucceed, err := AutoSignIn(ctx) + if err != nil { + ctx.Handle(500, "AutoSignIn", err) + return + } + + redirectTo := ctx.Query("redirect_to") + if len(redirectTo) > 0 { + ctx.SetCookie("redirect_to", redirectTo, 0, setting.AppSubURL) + } else { + redirectTo, _ = url.QueryUnescape(ctx.GetCookie("redirect_to")) + } + + if isSucceed { + if len(redirectTo) > 0 { + ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL) + ctx.Redirect(redirectTo) + } else { + ctx.Redirect(setting.AppSubURL + "/") + } + return + } + + ctx.Data["PageIsSignIn"] = true + ctx.Data["PageIsLoginOpenID"] = true + ctx.HTML(200, tplSignInOpenID) +} + +// Check if the given OpenID URI is allowed by blacklist/whitelist +func allowedOpenIDURI(uri string) (err error) { + + // In case a Whitelist is present, URI must be in it + // in order to be accepted + if len(setting.Service.OpenIDWhitelist) != 0 { + for _, pat := range setting.Service.OpenIDWhitelist { + if pat.MatchString(uri) { + return nil // pass + } + } + // must match one of this or be refused + return fmt.Errorf("URI not allowed by whitelist") + } + + // A blacklist match expliclty forbids + for _, pat := range setting.Service.OpenIDBlacklist { + if pat.MatchString(uri) { + return fmt.Errorf("URI forbidden by blacklist") + } + } + + return nil +} + +// SignInOpenIDPost response for openid sign in request +func SignInOpenIDPost(ctx *context.Context, form auth.SignInOpenIDForm) { + ctx.Data["Title"] = ctx.Tr("sign_in") + ctx.Data["PageIsSignIn"] = true + ctx.Data["PageIsLoginOpenID"] = true + + if ctx.HasError() { + ctx.HTML(200, tplSignInOpenID) + return + } + + id, err := openid.Normalize(form.Openid) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSignInOpenID, &form) + return + } + form.Openid = id + + log.Trace("OpenID uri: " + id) + + err = allowedOpenIDURI(id) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSignInOpenID, &form) + return + } + + redirectTo := setting.AppURL + "user/login/openid" + url, err := openid.RedirectURL(id, redirectTo, setting.AppURL) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSignInOpenID, &form) + return + } + + // Request optional nickname and email info + // NOTE: change to `openid.sreg.required` to require it + url += "&openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1" + url += "&openid.sreg.optional=nickname%2Cemail" + + log.Trace("Form-passed openid-remember: %s", form.Remember) + ctx.Session.Set("openid_signin_remember", form.Remember) + + ctx.Redirect(url) +} + +// signInOpenIDVerify handles response from OpenID provider +func signInOpenIDVerify(ctx *context.Context) { + + log.Trace("Incoming call to: " + ctx.Req.Request.URL.String()) + + fullURL := setting.AppURL + ctx.Req.Request.URL.String()[1:] + log.Trace("Full URL: " + fullURL) + + var id, err = openid.Verify(fullURL) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSignInOpenID, &auth.SignInOpenIDForm{ + Openid: id, + }) + return + } + + log.Trace("Verified ID: " + id) + + /* Now we should seek for the user and log him in, or prompt + * to register if not found */ + + u, _ := models.GetUserByOpenID(id) + if err != nil { + if !models.IsErrUserNotExist(err) { + ctx.RenderWithErr(err.Error(), tplSignInOpenID, &auth.SignInOpenIDForm{ + Openid: id, + }) + return + } + } + if u != nil { + log.Trace("User exists, logging in") + remember, _ := ctx.Session.Get("openid_signin_remember").(bool) + log.Trace("Session stored openid-remember: %s", remember) + handleSignIn(ctx, u, remember) + return + } + + log.Trace("User with openid " + id + " does not exist, should connect or register") + + parsedURL, err := url.Parse(fullURL) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSignInOpenID, &auth.SignInOpenIDForm{ + Openid: id, + }) + return + } + values, err := url.ParseQuery(parsedURL.RawQuery) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSignInOpenID, &auth.SignInOpenIDForm{ + Openid: id, + }) + return + } + email := values.Get("openid.sreg.email") + nickname := values.Get("openid.sreg.nickname") + + log.Trace("User has email=" + email + " and nickname=" + nickname) + + if email != "" { + u, _ = models.GetUserByEmail(email) + if err != nil { + if !models.IsErrUserNotExist(err) { + ctx.RenderWithErr(err.Error(), tplSignInOpenID, &auth.SignInOpenIDForm{ + Openid: id, + }) + return + } + } + if u != nil { + log.Trace("Local user " + u.LowerName + " has OpenID provided email " + email) + } + } + + if u == nil && nickname != "" { + u, _ = models.GetUserByName(nickname) + if err != nil { + if !models.IsErrUserNotExist(err) { + ctx.RenderWithErr(err.Error(), tplSignInOpenID, &auth.SignInOpenIDForm{ + Openid: id, + }) + return + } + } + if u != nil { + log.Trace("Local user " + u.LowerName + " has OpenID provided nickname " + nickname) + } + } + + ctx.Session.Set("openid_verified_uri", id) + + ctx.Session.Set("openid_determined_email", email) + + if u != nil { + nickname = u.LowerName + } + + ctx.Session.Set("openid_determined_username", nickname) + + if u != nil || !setting.Service.EnableOpenIDSignUp { + ctx.Redirect(setting.AppSubURL + "/user/openid/connect") + } else { + ctx.Redirect(setting.AppSubURL + "/user/openid/register") + } +} + +// ConnectOpenID shows a form to connect an OpenID URI to an existing account +func ConnectOpenID(ctx *context.Context) { + oid, _ := ctx.Session.Get("openid_verified_uri").(string) + if oid == "" { + ctx.Redirect(setting.AppSubURL + "/user/login/openid") + return + } + ctx.Data["Title"] = "OpenID connect" + ctx.Data["PageIsSignIn"] = true + ctx.Data["PageIsOpenIDConnect"] = true + ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp + ctx.Data["OpenID"] = oid + userName, _ := ctx.Session.Get("openid_determined_username").(string) + if userName != "" { + ctx.Data["user_name"] = userName + } + ctx.HTML(200, tplConnectOID) +} + +// ConnectOpenIDPost handles submission of a form to connect an OpenID URI to an existing account +func ConnectOpenIDPost(ctx *context.Context, form auth.ConnectOpenIDForm) { + + oid, _ := ctx.Session.Get("openid_verified_uri").(string) + if oid == "" { + ctx.Redirect(setting.AppSubURL + "/user/login/openid") + return + } + ctx.Data["Title"] = "OpenID connect" + ctx.Data["PageIsSignIn"] = true + ctx.Data["PageIsOpenIDConnect"] = true + ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp + ctx.Data["OpenID"] = oid + + u, err := models.UserSignIn(form.UserName, form.Password) + if err != nil { + if models.IsErrUserNotExist(err) { + ctx.RenderWithErr(ctx.Tr("form.username_password_incorrect"), tplConnectOID, &form) + } else { + ctx.Handle(500, "ConnectOpenIDPost", err) + } + return + } + + // add OpenID for the user + userOID := &models.UserOpenID{UID: u.ID, URI: oid} + if err = models.AddUserOpenID(userOID); err != nil { + if models.IsErrOpenIDAlreadyUsed(err) { + ctx.RenderWithErr(ctx.Tr("form.openid_been_used", oid), tplConnectOID, &form) + return + } + ctx.Handle(500, "AddUserOpenID", err) + return + } + + ctx.Flash.Success(ctx.Tr("settings.add_openid_success")) + + remember, _ := ctx.Session.Get("openid_signin_remember").(bool) + log.Trace("Session stored openid-remember: %s", remember) + handleSignIn(ctx, u, remember) +} + +// RegisterOpenID shows a form to create a new user authenticated via an OpenID URI +func RegisterOpenID(ctx *context.Context) { + oid, _ := ctx.Session.Get("openid_verified_uri").(string) + if oid == "" { + ctx.Redirect(setting.AppSubURL + "/user/login/openid") + return + } + ctx.Data["Title"] = "OpenID signup" + ctx.Data["PageIsSignIn"] = true + ctx.Data["PageIsOpenIDRegister"] = true + ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp + ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha + ctx.Data["OpenID"] = oid + userName, _ := ctx.Session.Get("openid_determined_username").(string) + if userName != "" { + ctx.Data["user_name"] = userName + } + email, _ := ctx.Session.Get("openid_determined_email").(string) + if email != "" { + ctx.Data["email"] = email + } + ctx.HTML(200, tplSignUpOID) +} + +// RegisterOpenIDPost handles submission of a form to create a new user authenticated via an OpenID URI +func RegisterOpenIDPost(ctx *context.Context, cpt *captcha.Captcha, form auth.SignUpOpenIDForm) { + oid, _ := ctx.Session.Get("openid_verified_uri").(string) + if oid == "" { + ctx.Redirect(setting.AppSubURL + "/user/login/openid") + return + } + + ctx.Data["Title"] = "OpenID signup" + ctx.Data["PageIsSignIn"] = true + ctx.Data["PageIsOpenIDRegister"] = true + ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp + ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha + ctx.Data["OpenID"] = oid + + if setting.Service.EnableCaptcha && !cpt.VerifyReq(ctx.Req) { + ctx.Data["Err_Captcha"] = true + ctx.RenderWithErr(ctx.Tr("form.captcha_incorrect"), tplSignUpOID, &form) + return + } + + len := setting.MinPasswordLength + if len < 256 { + len = 256 + } + password, err := base.GetRandomString(len) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSignUpOID, form) + return + } + + // TODO: abstract a finalizeSignUp function ? + u := &models.User{ + Name: form.UserName, + Email: form.Email, + Passwd: password, + IsActive: !setting.Service.RegisterEmailConfirm, + } + if err := models.CreateUser(u); err != nil { + switch { + case models.IsErrUserAlreadyExist(err): + ctx.Data["Err_UserName"] = true + ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), tplSignUpOID, &form) + case models.IsErrEmailAlreadyUsed(err): + ctx.Data["Err_Email"] = true + ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplSignUpOID, &form) + case models.IsErrNameReserved(err): + ctx.Data["Err_UserName"] = true + ctx.RenderWithErr(ctx.Tr("user.form.name_reserved", err.(models.ErrNameReserved).Name), tplSignUpOID, &form) + case models.IsErrNamePatternNotAllowed(err): + ctx.Data["Err_UserName"] = true + ctx.RenderWithErr(ctx.Tr("user.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), tplSignUpOID, &form) + default: + ctx.Handle(500, "CreateUser", err) + } + return + } + log.Trace("Account created: %s", u.Name) + + // add OpenID for the user + userOID := &models.UserOpenID{UID: u.ID, URI: oid} + if err = models.AddUserOpenID(userOID); err != nil { + if models.IsErrOpenIDAlreadyUsed(err) { + ctx.RenderWithErr(ctx.Tr("form.openid_been_used", oid), tplSignUpOID, &form) + return + } + ctx.Handle(500, "AddUserOpenID", err) + return + } + + // Auto-set admin for the only user. + if models.CountUsers() == 1 { + u.IsAdmin = true + u.IsActive = true + u.SetLastLogin() + if err := models.UpdateUserCols(u, "is_admin", "is_active", "last_login_unix"); err != nil { + ctx.Handle(500, "UpdateUser", err) + return + } + } + + // Send confirmation email, no need for social account. + if setting.Service.RegisterEmailConfirm && u.ID > 1 { + models.SendActivateAccountMail(ctx.Context, u) + ctx.Data["IsSendRegisterMail"] = true + ctx.Data["Email"] = u.Email + ctx.Data["ActiveCodeLives"] = base.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale.Language()) + ctx.HTML(200, TplActivate) + + if err := ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil { + log.Error(4, "Set cache(MailResendLimit) fail: %v", err) + } + return + } + + remember, _ := ctx.Session.Get("openid_signin_remember").(bool) + log.Trace("Session stored openid-remember: %s", remember) + handleSignIn(ctx, u, remember) +} diff --git a/routers/user/home.go b/routers/user/home.go index 868f984..c2c6a67 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -19,7 +19,7 @@ import ( ) const ( - tplDashborad base.TplName = "user/dashboard/dashboard" + tplDashboard base.TplName = "user/dashboard/dashboard" tplIssues base.TplName = "user/dashboard/issues" tplProfile base.TplName = "user/profile" tplOrgHome base.TplName = "org/home" @@ -53,40 +53,62 @@ func getDashboardContextUser(ctx *context.Context) *models.User { return ctxUser } -// retrieveFeeds loads feeds from database by given context user. -// The user could be organization so it is not always the logged in user, -// which is why we have to explicitly pass the context user ID. -func retrieveFeeds(ctx *context.Context, ctxUser *models.User, userID, offset int64, isProfile bool) { - actions, err := models.GetFeeds(ctxUser, userID, offset, isProfile) +// retrieveFeeds loads feeds for the specified user +func retrieveFeeds(ctx *context.Context, options models.GetFeedsOptions) { + actions, err := models.GetFeeds(options) if err != nil { ctx.Handle(500, "GetFeeds", err) return } - // Check access of private repositories. - feeds := make([]*models.Action, 0, len(actions)) - unameAvatars := map[string]string{ - ctxUser.Name: ctxUser.RelAvatarLink(), + userCache := map[int64]*models.User{options.RequestedUser.ID: options.RequestedUser} + if ctx.User != nil { + userCache[ctx.User.ID] = ctx.User } + repoCache := map[int64]*models.Repository{} for _, act := range actions { // Cache results to reduce queries. - _, ok := unameAvatars[act.ActUserName] + u, ok := userCache[act.ActUserID] if !ok { - u, err := models.GetUserByName(act.ActUserName) + u, err = models.GetUserByID(act.ActUserID) if err != nil { if models.IsErrUserNotExist(err) { continue } - ctx.Handle(500, "GetUserByName", err) + ctx.Handle(500, "GetUserByID", err) return } - unameAvatars[act.ActUserName] = u.RelAvatarLink() + userCache[act.ActUserID] = u } + act.ActUser = u - act.ActAvatar = unameAvatars[act.ActUserName] - feeds = append(feeds, act) + repo, ok := repoCache[act.RepoID] + if !ok { + repo, err = models.GetRepositoryByID(act.RepoID) + if err != nil { + if models.IsErrRepoNotExist(err) { + continue + } + ctx.Handle(500, "GetRepositoryByID", err) + return + } + } + act.Repo = repo + + repoOwner, ok := userCache[repo.OwnerID] + if !ok { + repoOwner, err = models.GetUserByID(repo.OwnerID) + if err != nil { + if models.IsErrUserNotExist(err) { + continue + } + ctx.Handle(500, "GetUserByID", err) + return + } + } + repo.Owner = repoOwner } - ctx.Data["Feeds"] = feeds + ctx.Data["Feeds"] = actions } // Dashboard render the dashborad page @@ -99,33 +121,16 @@ func Dashboard(ctx *context.Context) { ctx.Data["Title"] = ctxUser.DisplayName() + " - " + ctx.Tr("dashboard") ctx.Data["PageIsDashboard"] = true ctx.Data["PageIsNews"] = true - - // Only user can have collaborative repositories. - if !ctxUser.IsOrganization() { - collaborateRepos, err := ctx.User.GetAccessibleRepositories(setting.UI.User.RepoPagingNum) - if err != nil { - ctx.Handle(500, "GetAccessibleRepositories", err) - return - } else if err = models.RepositoryList(collaborateRepos).LoadAttributes(); err != nil { - ctx.Handle(500, "RepositoryList.LoadAttributes", err) - return - } - ctx.Data["CollaborativeRepos"] = collaborateRepos - } + ctx.Data["SearchLimit"] = setting.UI.User.RepoPagingNum var err error - var repos, mirrors []*models.Repository + var mirrors []*models.Repository if ctxUser.IsOrganization() { env, err := ctxUser.AccessibleReposEnv(ctx.User.ID) if err != nil { ctx.Handle(500, "AccessibleReposEnv", err) return } - repos, err = env.Repos(1, setting.UI.User.RepoPagingNum) - if err != nil { - ctx.Handle(500, "env.Repos", err) - return - } mirrors, err = env.MirrorRepos() if err != nil { @@ -133,19 +138,12 @@ func Dashboard(ctx *context.Context) { return } } else { - if err = ctxUser.GetRepositories(1, setting.UI.User.RepoPagingNum); err != nil { - ctx.Handle(500, "GetRepositories", err) - return - } - repos = ctxUser.Repos - mirrors, err = ctxUser.GetMirrorRepositories() if err != nil { ctx.Handle(500, "GetMirrorRepositories", err) return } } - ctx.Data["Repos"] = repos ctx.Data["MaxShowRepoNum"] = setting.UI.User.RepoPagingNum if err := models.MirrorRepositoryList(mirrors).LoadAttributes(); err != nil { @@ -155,11 +153,15 @@ func Dashboard(ctx *context.Context) { ctx.Data["MirrorCount"] = len(mirrors) ctx.Data["Mirrors"] = mirrors - retrieveFeeds(ctx, ctxUser, ctx.User.ID, 0, false) + retrieveFeeds(ctx, models.GetFeedsOptions{RequestedUser: ctxUser, + IncludePrivate: true, + OnlyPerformedBy: false, + IncludeDeleted: false, + }) if ctx.Written() { return } - ctx.HTML(200, tplDashborad) + ctx.HTML(200, tplDashboard) } // Issues render the user issues page @@ -238,94 +240,77 @@ func Issues(ctx *context.Context) { userRepoIDs = []int64{-1} } - var issues []*models.Issue - switch filterMode { - case models.FilterModeAll: - // Get all issues from repositories from this user. - issues, err = models.Issues(&models.IssuesOptions{ - RepoIDs: userRepoIDs, - RepoID: repoID, - Page: page, - IsClosed: util.OptionalBoolOf(isShowClosed), - IsPull: util.OptionalBoolOf(isPullList), - SortType: sortType, - }) - - case models.FilterModeAssign: - // Get all issues assigned to this user. - issues, err = models.Issues(&models.IssuesOptions{ - RepoID: repoID, - AssigneeID: ctxUser.ID, - Page: page, - IsClosed: util.OptionalBoolOf(isShowClosed), - IsPull: util.OptionalBoolOf(isPullList), - SortType: sortType, - }) - - case models.FilterModeCreate: - // Get all issues created by this user. - issues, err = models.Issues(&models.IssuesOptions{ - RepoID: repoID, - PosterID: ctxUser.ID, - Page: page, - IsClosed: util.OptionalBoolOf(isShowClosed), - IsPull: util.OptionalBoolOf(isPullList), - SortType: sortType, - }) - case models.FilterModeMention: - // Get all issues created by this user. - issues, err = models.Issues(&models.IssuesOptions{ - RepoID: repoID, - MentionedID: ctxUser.ID, - Page: page, - IsClosed: util.OptionalBoolOf(isShowClosed), - IsPull: util.OptionalBoolOf(isPullList), - SortType: sortType, - }) + opts := &models.IssuesOptions{ + RepoID: repoID, + IsClosed: util.OptionalBoolOf(isShowClosed), + IsPull: util.OptionalBoolOf(isPullList), + SortType: sortType, } + switch filterMode { + case models.FilterModeAll: + opts.RepoIDs = userRepoIDs + case models.FilterModeAssign: + opts.AssigneeID = ctxUser.ID + case models.FilterModeCreate: + opts.PosterID = ctxUser.ID + case models.FilterModeMention: + opts.MentionedID = ctxUser.ID + } + + counts, err := models.CountIssuesByRepo(opts) + if err != nil { + ctx.Handle(500, "CountIssuesByRepo", err) + return + } + + opts.Page = page + opts.PageSize = setting.UI.IssuePagingNum + issues, err := models.Issues(opts) if err != nil { ctx.Handle(500, "Issues", err) return } - showRepos, err := models.IssueList(issues).LoadRepositories() - if err != nil { - ctx.Handle(500, "LoadRepositories", fmt.Errorf("%v", err)) - return + showReposMap := make(map[int64]*models.Repository, len(counts)) + for repoID := range counts { + repo, err := models.GetRepositoryByID(repoID) + if err != nil { + ctx.Handle(500, "GetRepositoryByID", err) + return + } + showReposMap[repoID] = repo } if repoID > 0 { - var theRepo *models.Repository - for _, repo := range showRepos { - if repo.ID == repoID { - theRepo = repo - break - } - } - - if theRepo == nil { - theRepo, err = models.GetRepositoryByID(repoID) + if _, ok := showReposMap[repoID]; !ok { + repo, err := models.GetRepositoryByID(repoID) if err != nil { - ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[#%d]%v", repoID, err)) + ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[%d]%v", repoID, err)) return } - showRepos = append(showRepos, theRepo) + showReposMap[repoID] = repo } + repo := showReposMap[repoID] + // Check if user has access to given repository. - if !theRepo.IsOwnedBy(ctxUser.ID) && !theRepo.HasAccess(ctxUser) { - ctx.Handle(404, "Issues", fmt.Errorf("#%d", repoID)) + if !repo.IsOwnedBy(ctxUser.ID) && !repo.HasAccess(ctxUser) { + ctx.Status(404) return } } - err = models.RepositoryList(showRepos).LoadAttributes() - if err != nil { + showRepos := models.RepositoryListOfMap(showReposMap) + if err = showRepos.LoadAttributes(); err != nil { ctx.Handle(500, "LoadAttributes", fmt.Errorf("%v", err)) return } + for _, issue := range issues { + issue.Repo = showReposMap[issue.RepoID] + } + issueStats := models.GetUserIssueStats(repoID, ctxUser.ID, userRepoIDs, filterMode, isPullList) var total int @@ -337,6 +322,7 @@ func Issues(ctx *context.Context) { ctx.Data["Issues"] = issues ctx.Data["Repos"] = showRepos + ctx.Data["Counts"] = counts ctx.Data["Page"] = paginater.New(total, setting.UI.IssuePagingNum, page, 5) ctx.Data["IssueStats"] = issueStats ctx.Data["ViewType"] = viewType @@ -377,7 +363,7 @@ func showOrgProfile(ctx *context.Context) { } org := ctx.Org.Organization - ctx.Data["Title"] = org.FullName + ctx.Data["Title"] = org.DisplayName() page := ctx.QueryInt("page") if page <= 0 { diff --git a/routers/user/home_test.go b/routers/user/home_test.go new file mode 100644 index 0000000..beca936 --- /dev/null +++ b/routers/user/home_test.go @@ -0,0 +1,33 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package user + +import ( + "net/http" + "testing" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/test" + + "code.gitea.io/gitea/modules/setting" + "github.com/stretchr/testify/assert" +) + +func TestIssues(t *testing.T) { + setting.UI.IssuePagingNum = 1 + assert.NoError(t, models.LoadFixtures()) + + ctx := test.MockContext(t) + ctx.User = models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) + ctx.SetParams(":type", "issues") + ctx.Req.Form.Set("state", "closed") + Issues(ctx) + assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) + + assert.EqualValues(t, map[int64]int64{1: 1, 2: 1}, ctx.Data["Counts"]) + assert.EqualValues(t, true, ctx.Data["IsShowClosed"]) + assert.Len(t, ctx.Data["Issues"], 1) + assert.Len(t, ctx.Data["Repos"], 2) +} diff --git a/routers/user/main_test.go b/routers/user/main_test.go new file mode 100644 index 0000000..83c0c65 --- /dev/null +++ b/routers/user/main_test.go @@ -0,0 +1,33 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package user + +import ( + "fmt" + "os" + "path/filepath" + "testing" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/setting" + + _ "github.com/mattn/go-sqlite3" // for the test engine +) + +func TestMain(m *testing.M) { + if err := models.CreateTestEngine("../../models/fixtures/"); err != nil { + fmt.Printf("Error creating test engine: %v\n", err) + os.Exit(1) + } + + setting.AppURL = "https://try.gitea.io/" + setting.RunUser = "runuser" + setting.SSH.Port = 3000 + setting.SSH.Domain = "try.gitea.io" + setting.RepoRootPath = filepath.Join(os.TempDir(), "repos") + setting.AppDataPath = filepath.Join(os.TempDir(), "appdata") + + os.Exit(m.Run()) +} diff --git a/routers/user/profile.go b/routers/user/profile.go index 8958555..23f5057 100644 --- a/routers/user/profile.go +++ b/routers/user/profile.go @@ -75,9 +75,17 @@ func Profile(ctx *context.Context) { return } + // Show OpenID URIs + openIDs, err := models.GetUserOpenIDs(ctxUser.ID) + if err != nil { + ctx.Handle(500, "GetUserOpenIDs", err) + return + } + ctx.Data["Title"] = ctxUser.DisplayName() ctx.Data["PageIsUserProfile"] = true ctx.Data["Owner"] = ctxUser + ctx.Data["OpenIDs"] = openIDs showPrivate := ctx.IsSigned && (ctx.User.IsAdmin || ctx.User.ID == ctxUser.ID) orgs, err := models.GetOrgsByUserID(ctxUser.ID, showPrivate) @@ -130,7 +138,11 @@ func Profile(ctx *context.Context) { ctx.Data["Keyword"] = keyword switch tab { case "activity": - retrieveFeeds(ctx, ctxUser, -1, 0, !showPrivate) + retrieveFeeds(ctx, models.GetFeedsOptions{RequestedUser: ctxUser, + IncludePrivate: showPrivate, + OnlyPerformedBy: true, + IncludeDeleted: false, + }) if ctx.Written() { return } @@ -192,13 +204,14 @@ func Profile(ctx *context.Context) { ctx.Data["Total"] = total } else { repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ - Keyword: keyword, - OwnerID: ctxUser.ID, - OrderBy: orderBy, - Private: showPrivate, - Page: page, - IsProfile: true, - PageSize: setting.UI.User.RepoPagingNum, + Keyword: keyword, + OwnerID: ctxUser.ID, + OrderBy: orderBy, + Private: showPrivate, + Page: page, + IsProfile: true, + PageSize: setting.UI.User.RepoPagingNum, + Collaborate: true, }) if err != nil { ctx.Handle(500, "SearchRepositoryByName", err) @@ -211,6 +224,8 @@ func Profile(ctx *context.Context) { } } + ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail + ctx.HTML(200, tplProfile) } diff --git a/routers/user/setting.go b/routers/user/setting.go index 66ee680..b94f7df 100644 --- a/routers/user/setting.go +++ b/routers/user/setting.go @@ -32,12 +32,13 @@ const ( tplSettingsAvatar base.TplName = "user/settings/avatar" tplSettingsPassword base.TplName = "user/settings/password" tplSettingsEmails base.TplName = "user/settings/email" - tplSettingsSSHKeys base.TplName = "user/settings/sshkeys" + tplSettingsKeys base.TplName = "user/settings/keys" tplSettingsSocial base.TplName = "user/settings/social" tplSettingsApplications base.TplName = "user/settings/applications" tplSettingsTwofa base.TplName = "user/settings/twofa" tplSettingsTwofaEnroll base.TplName = "user/settings/twofa_enroll" tplSettingsAccountLink base.TplName = "user/settings/account_link" + tplSettingsOrganization base.TplName = "user/settings/organization" tplSettingsDelete base.TplName = "user/settings/delete" tplSecurity base.TplName = "user/security" ) @@ -155,7 +156,7 @@ func UpdateAvatarSetting(ctx *context.Context, form auth.AvatarForm, ctxUser *mo } } - if err := models.UpdateUser(ctxUser); err != nil { + if err := models.UpdateUserCols(ctxUser, "avatar", "avatar_email", "use_custom_avatar"); err != nil { return fmt.Errorf("UpdateUser: %v", err) } @@ -193,6 +194,7 @@ func SettingsDeleteAvatar(ctx *context.Context) { func SettingsPassword(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsPassword"] = true + ctx.Data["Email"] = ctx.User.Email ctx.HTML(200, tplSettingsPassword) } @@ -200,6 +202,7 @@ func SettingsPassword(ctx *context.Context) { func SettingsPasswordPost(ctx *context.Context, form auth.ChangePasswordForm) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsPassword"] = true + ctx.Data["PageIsSettingsDelete"] = true if ctx.HasError() { ctx.HTML(200, tplSettingsPassword) @@ -218,7 +221,7 @@ func SettingsPasswordPost(ctx *context.Context, form auth.ChangePasswordForm) { return } ctx.User.EncodePasswd() - if err := models.UpdateUser(ctx.User); err != nil { + if err := models.UpdateUserCols(ctx.User, "salt", "passwd"); err != nil { ctx.Handle(500, "UpdateUser", err) return } @@ -295,7 +298,7 @@ func SettingsEmailPost(ctx *context.Context, form auth.AddEmailForm) { if err := ctx.Cache.Put("MailResendLimit_"+ctx.User.LowerName, ctx.User.LowerName, 180); err != nil { log.Error(4, "Set cache(MailResendLimit) fail: %v", err) } - ctx.Flash.Info(ctx.Tr("settings.add_email_confirmation_sent", email.Email, setting.Service.ActiveCodeLives/60)) + ctx.Flash.Info(ctx.Tr("settings.add_email_confirmation_sent", email.Email, base.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale.Language()))) } else { ctx.Flash.Success(ctx.Tr("settings.add_email_success")) } @@ -318,10 +321,10 @@ func DeleteEmail(ctx *context.Context) { }) } -// SettingsSSHKeys render user's SSH public keys page -func SettingsSSHKeys(ctx *context.Context) { +// SettingsKeys render user's SSH/GPG public keys page +func SettingsKeys(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") - ctx.Data["PageIsSettingsSSHKeys"] = true + ctx.Data["PageIsSettingsKeys"] = true keys, err := models.ListPublicKeys(ctx.User.ID) if err != nil { @@ -330,13 +333,20 @@ func SettingsSSHKeys(ctx *context.Context) { } ctx.Data["Keys"] = keys - ctx.HTML(200, tplSettingsSSHKeys) + gpgkeys, err := models.ListGPGKeys(ctx.User.ID) + if err != nil { + ctx.Handle(500, "ListGPGKeys", err) + return + } + ctx.Data["GPGKeys"] = gpgkeys + + ctx.HTML(200, tplSettingsKeys) } -// SettingsSSHKeysPost response for change user's SSH keys -func SettingsSSHKeysPost(ctx *context.Context, form auth.AddSSHKeyForm) { +// SettingsKeysPost response for change user's SSH/GPG keys +func SettingsKeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Data["Title"] = ctx.Tr("settings") - ctx.Data["PageIsSettingsSSHKeys"] = true + ctx.Data["PageIsSettingsKeys"] = true keys, err := models.ListPublicKeys(ctx.User.ID) if err != nil { @@ -345,51 +355,97 @@ func SettingsSSHKeysPost(ctx *context.Context, form auth.AddSSHKeyForm) { } ctx.Data["Keys"] = keys + gpgkeys, err := models.ListGPGKeys(ctx.User.ID) + if err != nil { + ctx.Handle(500, "ListGPGKeys", err) + return + } + ctx.Data["GPGKeys"] = gpgkeys + if ctx.HasError() { - ctx.HTML(200, tplSettingsSSHKeys) + ctx.HTML(200, tplSettingsKeys) return } - - content, err := models.CheckPublicKeyString(form.Content) - if err != nil { - if models.IsErrKeyUnableVerify(err) { - ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) - } else { - ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) - ctx.Redirect(setting.AppSubURL + "/user/settings/ssh") + switch form.Type { + case "gpg": + key, err := models.AddGPGKey(ctx.User.ID, form.Content) + if err != nil { + ctx.Data["HasGPGError"] = true + switch { + case models.IsErrGPGKeyParsing(err): + ctx.Flash.Error(ctx.Tr("form.invalid_gpg_key", err.Error())) + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") + case models.IsErrGPGKeyIDAlreadyUsed(err): + ctx.Data["Err_Content"] = true + ctx.RenderWithErr(ctx.Tr("settings.gpg_key_id_used"), tplSettingsKeys, &form) + case models.IsErrGPGEmailNotFound(err): + ctx.Data["Err_Content"] = true + ctx.RenderWithErr(ctx.Tr("settings.gpg_key_email_not_found", err.(models.ErrGPGEmailNotFound).Email), tplSettingsKeys, &form) + default: + ctx.Handle(500, "AddPublicKey", err) + } return } - } - - if _, err = models.AddPublicKey(ctx.User.ID, form.Title, content); err != nil { - ctx.Data["HasError"] = true - switch { - case models.IsErrKeyAlreadyExist(err): - ctx.Data["Err_Content"] = true - ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplSettingsSSHKeys, &form) - case models.IsErrKeyNameAlreadyUsed(err): - ctx.Data["Err_Title"] = true - ctx.RenderWithErr(ctx.Tr("settings.ssh_key_name_used"), tplSettingsSSHKeys, &form) - default: - ctx.Handle(500, "AddPublicKey", err) + ctx.Flash.Success(ctx.Tr("settings.add_gpg_key_success", key.KeyID)) + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") + case "ssh": + content, err := models.CheckPublicKeyString(form.Content) + if err != nil { + if models.IsErrKeyUnableVerify(err) { + ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) + } else { + ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") + return + } } - return + + if _, err = models.AddPublicKey(ctx.User.ID, form.Title, content); err != nil { + ctx.Data["HasSSHError"] = true + switch { + case models.IsErrKeyAlreadyExist(err): + ctx.Data["Err_Content"] = true + ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplSettingsKeys, &form) + case models.IsErrKeyNameAlreadyUsed(err): + ctx.Data["Err_Title"] = true + ctx.RenderWithErr(ctx.Tr("settings.ssh_key_name_used"), tplSettingsKeys, &form) + default: + ctx.Handle(500, "AddPublicKey", err) + } + return + } + ctx.Flash.Success(ctx.Tr("settings.add_key_success", form.Title)) + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") + + default: + ctx.Flash.Warning("Function not implemented") + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") } - ctx.Flash.Success(ctx.Tr("settings.add_key_success", form.Title)) - ctx.Redirect(setting.AppSubURL + "/user/settings/ssh") } -// DeleteSSHKey response for delete user's SSH key -func DeleteSSHKey(ctx *context.Context) { - if err := models.DeletePublicKey(ctx.User, ctx.QueryInt64("id")); err != nil { - ctx.Flash.Error("DeletePublicKey: " + err.Error()) - } else { - ctx.Flash.Success(ctx.Tr("settings.ssh_key_deletion_success")) - } +// DeleteKey response for delete user's SSH/GPG key +func DeleteKey(ctx *context.Context) { + switch ctx.Query("type") { + case "gpg": + if err := models.DeleteGPGKey(ctx.User, ctx.QueryInt64("id")); err != nil { + ctx.Flash.Error("DeleteGPGKey: " + err.Error()) + } else { + ctx.Flash.Success(ctx.Tr("settings.gpg_key_deletion_success")) + } + case "ssh": + if err := models.DeletePublicKey(ctx.User, ctx.QueryInt64("id")); err != nil { + ctx.Flash.Error("DeletePublicKey: " + err.Error()) + } else { + ctx.Flash.Success(ctx.Tr("settings.ssh_key_deletion_success")) + } + default: + ctx.Flash.Warning("Function not implemented") + ctx.Redirect(setting.AppSubURL + "/user/settings/keys") + } ctx.JSON(200, map[string]interface{}{ - "redirect": setting.AppSubURL + "/user/settings/ssh", + "redirect": setting.AppSubURL + "/user/settings/keys", }) } @@ -433,7 +489,7 @@ func SettingsApplicationsPost(ctx *context.Context, form auth.NewAccessTokenForm return } - ctx.Flash.Success(ctx.Tr("settings.generate_token_succees")) + ctx.Flash.Success(ctx.Tr("settings.generate_token_success")) ctx.Flash.Info(t.Sha1) ctx.Redirect(setting.AppSubURL + "/user/settings/applications") @@ -527,7 +583,7 @@ func twofaGenerateSecretAndQr(ctx *context.Context) bool { if otpKey == nil { err = nil // clear the error, in case the URL was invalid otpKey, err = totp.Generate(totp.GenerateOpts{ - Issuer: setting.AppName, + Issuer: setting.AppName + " (" + strings.TrimRight(setting.AppURL, "/") + ")", AccountName: ctx.User.Name, }) if err != nil { @@ -684,6 +740,7 @@ func SettingsDeleteAccountLink(ctx *context.Context) { func SettingsDelete(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsDelete"] = true + ctx.Data["Email"] = ctx.User.Email if ctx.Req.Method == "POST" { if _, err := models.UserSignIn(ctx.User.Name, ctx.Query("password")); err != nil { @@ -715,3 +772,16 @@ func SettingsDelete(ctx *context.Context) { ctx.HTML(200, tplSettingsDelete) } + +// SettingsOrganization render all the organization of the user +func SettingsOrganization(ctx *context.Context) { + ctx.Data["Title"] = ctx.Tr("settings") + ctx.Data["PageIsSettingsOrganization"] = true + orgs, err := models.GetOrgsByUserID(ctx.User.ID, ctx.IsSigned) + if err != nil { + ctx.Handle(500, "GetOrgsByUserID", err) + return + } + ctx.Data["Orgs"] = orgs + ctx.HTML(200, tplSettingsOrganization) +} diff --git a/routers/user/setting_openid.go b/routers/user/setting_openid.go new file mode 100644 index 0000000..b39278d --- /dev/null +++ b/routers/user/setting_openid.go @@ -0,0 +1,155 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package user + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/auth" + "code.gitea.io/gitea/modules/auth/openid" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" +) + +const ( + tplSettingsOpenID base.TplName = "user/settings/openid" +) + +// SettingsOpenID renders change user's openid page +func SettingsOpenID(ctx *context.Context) { + ctx.Data["Title"] = ctx.Tr("settings") + ctx.Data["PageIsSettingsOpenID"] = true + + if ctx.Query("openid.return_to") != "" { + settingsOpenIDVerify(ctx) + return + } + + openid, err := models.GetUserOpenIDs(ctx.User.ID) + if err != nil { + ctx.Handle(500, "GetUserOpenIDs", err) + return + } + ctx.Data["OpenIDs"] = openid + + ctx.HTML(200, tplSettingsOpenID) +} + +// SettingsOpenIDPost response for change user's openid +func SettingsOpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) { + ctx.Data["Title"] = ctx.Tr("settings") + ctx.Data["PageIsSettingsOpenID"] = true + + if ctx.HasError() { + openid, err := models.GetUserOpenIDs(ctx.User.ID) + if err != nil { + ctx.Handle(500, "GetUserOpenIDs", err) + return + } + ctx.Data["OpenIDs"] = openid + ctx.HTML(200, tplSettingsOpenID) + return + } + + // WARNING: specifying a wrong OpenID here could lock + // a user out of her account, would be better to + // verify/confirm the new OpenID before storing it + + // Also, consider allowing for multiple OpenID URIs + + id, err := openid.Normalize(form.Openid) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSettingsOpenID, &form) + return + } + form.Openid = id + log.Trace("Normalized id: " + id) + + oids, err := models.GetUserOpenIDs(ctx.User.ID) + if err != nil { + ctx.Handle(500, "GetUserOpenIDs", err) + return + } + ctx.Data["OpenIDs"] = oids + + // Check that the OpenID is not already used + for _, obj := range oids { + if obj.URI == id { + ctx.RenderWithErr(ctx.Tr("form.openid_been_used", id), tplSettingsOpenID, &form) + return + } + } + + redirectTo := setting.AppURL + "user/settings/openid" + url, err := openid.RedirectURL(id, redirectTo, setting.AppURL) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSettingsOpenID, &form) + return + } + ctx.Redirect(url) +} + +func settingsOpenIDVerify(ctx *context.Context) { + log.Trace("Incoming call to: " + ctx.Req.Request.URL.String()) + + fullURL := setting.AppURL + ctx.Req.Request.URL.String()[1:] + log.Trace("Full URL: " + fullURL) + + oids, err := models.GetUserOpenIDs(ctx.User.ID) + if err != nil { + ctx.Handle(500, "GetUserOpenIDs", err) + return + } + ctx.Data["OpenIDs"] = oids + + id, err := openid.Verify(fullURL) + if err != nil { + ctx.RenderWithErr(err.Error(), tplSettingsOpenID, &auth.AddOpenIDForm{ + Openid: id, + }) + return + } + + log.Trace("Verified ID: " + id) + + oid := &models.UserOpenID{UID: ctx.User.ID, URI: id} + if err = models.AddUserOpenID(oid); err != nil { + if models.IsErrOpenIDAlreadyUsed(err) { + ctx.RenderWithErr(ctx.Tr("form.openid_been_used", id), tplSettingsOpenID, &auth.AddOpenIDForm{Openid: id}) + return + } + ctx.Handle(500, "AddUserOpenID", err) + return + } + log.Trace("Associated OpenID %s to user %s", id, ctx.User.Name) + ctx.Flash.Success(ctx.Tr("settings.add_openid_success")) + + ctx.Redirect(setting.AppSubURL + "/user/settings/openid") +} + +// DeleteOpenID response for delete user's openid +func DeleteOpenID(ctx *context.Context) { + if err := models.DeleteUserOpenID(&models.UserOpenID{ID: ctx.QueryInt64("id"), UID: ctx.User.ID}); err != nil { + ctx.Handle(500, "DeleteUserOpenID", err) + return + } + log.Trace("OpenID address deleted: %s", ctx.User.Name) + + ctx.Flash.Success(ctx.Tr("settings.openid_deletion_success")) + ctx.JSON(200, map[string]interface{}{ + "redirect": setting.AppSubURL + "/user/settings/openid", + }) +} + +// ToggleOpenIDVisibility response for toggle visibility of user's openid +func ToggleOpenIDVisibility(ctx *context.Context) { + if err := models.ToggleUserOpenIDVisibility(ctx.QueryInt64("id")); err != nil { + ctx.Handle(500, "ToggleUserOpenIDVisibility", err) + return + } + + ctx.Redirect(setting.AppSubURL + "/user/settings/openid") +} diff --git a/scripts/generate-gitignores.go b/scripts/generate-gitignores.go new file mode 100644 index 0000000..a169fc0 --- /dev/null +++ b/scripts/generate-gitignores.go @@ -0,0 +1,93 @@ +// +build ignore + +package main + +import ( + "archive/tar" + "compress/gzip" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "path" + "path/filepath" + "strings" +) + +func main() { + var ( + prefix = "gitea-gitignore" + url = "https://api.github.com/repos/github/gitignore/tarball" + destination = "" + ) + + flag.StringVar(&destination, "dest", "options/gitignore/", "destination for the gitignores") + flag.Parse() + + file, err := ioutil.TempFile(os.TempDir(), prefix) + + if err != nil { + log.Fatalf("Failed to create temp file. %s", err) + } + + defer os.Remove(file.Name()) + + resp, err := http.Get(url) + + if err != nil { + log.Fatalf("Failed to download archive. %s", err) + } + + defer resp.Body.Close() + + if _, err := io.Copy(file, resp.Body); err != nil { + log.Fatalf("Failed to copy archive to file. %s", err) + } + + if _, err := file.Seek(0, 0); err != nil { + log.Fatalf("Failed to reset seek on archive. %s", err) + } + + gz, err := gzip.NewReader(file) + + if err != nil { + log.Fatalf("Failed to gunzip the archive. %s", err) + } + + tr := tar.NewReader(gz) + + for { + hdr, err := tr.Next() + + if err == io.EOF { + break + } + + if err != nil { + log.Fatalf("Failed to iterate archive. %s", err) + } + + if filepath.Ext(hdr.Name) != ".gitignore" { + continue + } + + out, err := os.Create(path.Join(destination, strings.TrimSuffix(filepath.Base(hdr.Name), ".gitignore"))) + + if err != nil { + log.Fatalf("Failed to create new file. %s", err) + } + + defer out.Close() + + if _, err := io.Copy(out, tr); err != nil { + log.Fatalf("Failed to write new file. %s", err) + } else { + fmt.Printf("Written %s\n", out.Name()) + } + } + + fmt.Println("Done") +} diff --git a/scripts/generate-licenses.go b/scripts/generate-licenses.go new file mode 100644 index 0000000..03287d1 --- /dev/null +++ b/scripts/generate-licenses.go @@ -0,0 +1,101 @@ +// +build ignore + +package main + +import ( + "archive/tar" + "compress/gzip" + "flag" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "path" + "path/filepath" + "strings" +) + +func main() { + var ( + prefix = "gitea-licenses" + url = "https://api.github.com/repos/spdx/license-list/tarball" + destination = "" + ) + + flag.StringVar(&destination, "dest", "options/license/", "destination for the licenses") + flag.Parse() + + file, err := ioutil.TempFile(os.TempDir(), prefix) + + if err != nil { + log.Fatalf("Failed to create temp file. %s", err) + } + + defer os.Remove(file.Name()) + + resp, err := http.Get(url) + + if err != nil { + log.Fatalf("Failed to download archive. %s", err) + } + + defer resp.Body.Close() + + if _, err := io.Copy(file, resp.Body); err != nil { + log.Fatalf("Failed to copy archive to file. %s", err) + } + + if _, err := file.Seek(0, 0); err != nil { + log.Fatalf("Failed to reset seek on archive. %s", err) + } + + gz, err := gzip.NewReader(file) + + if err != nil { + log.Fatalf("Failed to gunzip the archive. %s", err) + } + + tr := tar.NewReader(gz) + + for { + hdr, err := tr.Next() + + if err == io.EOF { + break + } + + if err != nil { + log.Fatalf("Failed to iterate archive. %s", err) + } + + if filepath.Ext(hdr.Name) != ".txt" { + continue + } + + if strings.HasPrefix(filepath.Base(hdr.Name), "README") { + continue + } + + if strings.HasPrefix(filepath.Base(hdr.Name), "deprecated_") { + continue + } + + out, err := os.Create(path.Join(destination, strings.TrimSuffix(filepath.Base(hdr.Name), ".txt"))) + + if err != nil { + log.Fatalf("Failed to create new file. %s", err) + } + + defer out.Close() + + if _, err := io.Copy(out, tr); err != nil { + log.Fatalf("Failed to write new file. %s", err) + } else { + fmt.Printf("Written %s\n", out.Name()) + } + } + + fmt.Println("Done") +} diff --git a/templates/admin/auth/edit.tmpl b/templates/admin/auth/edit.tmpl index 84b62f6..e3048b2 100644 --- a/templates/admin/auth/edit.tmpl +++ b/templates/admin/auth/edit.tmpl @@ -1,199 +1,236 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.auths.edit"}} -

    -
    -
    - {{.CsrfTokenHtml}} - -
    - - - {{.Source.TypeName}} -
    -
    - - -
    - - - {{if or .Source.IsLDAP .Source.IsDLDAP}} - {{ $cfg:=.Source.LDAP }} -
    - - -
    -
    - - -
    -
    - - -
    - {{if .Source.IsLDAP}} -
    - - -
    - -
    - - -

    {{.i18n.Tr "admin.auths.bind_password_helper"}}

    -
    -
    - - -
    - {{end}} - {{if .Source.IsDLDAP}} -
    - - -
    - {{end}} -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    - {{if .Source.IsLDAP}} -
    -
    - - -
    -
    - {{end}} - {{end}} - - - {{if .Source.IsSMTP}} - {{ $cfg:=.Source.SMTP }} -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -

    {{.i18n.Tr "admin.auths.allowed_domains_helper"}}

    -
    - {{end}} - - - {{if .Source.IsPAM}} - {{ $cfg:=.Source.PAM }} -
    - - -
    - {{end}} - - - {{if .Source.IsOAuth2}} - {{ $cfg:=.Source.OAuth2 }} -
    - - -
    -
    - - -
    -
    - - -
    - {{end}} - -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - - -
    -
    - -
    - -
    {{.i18n.Tr "admin.auths.delete"}}
    -
    -
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.auths.edit"}} +

    +
    +
    + {{.CsrfTokenHtml}} + +
    + + + {{.Source.TypeName}}
    -
    +
    + + +
    + + + {{if or .Source.IsLDAP .Source.IsDLDAP}} + {{ $cfg:=.Source.LDAP }} +
    + + +
    +
    + + +
    +
    + + +
    + {{if .Source.IsLDAP}} +
    + + +
    + +
    + + +

    {{.i18n.Tr "admin.auths.bind_password_helper"}}

    +
    +
    + + +
    + {{end}} + {{if .Source.IsDLDAP}} +
    + + +
    + {{end}} +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + {{if .Source.IsLDAP}} +
    +
    + + +
    +
    + {{end}} + {{end}} + + + {{if .Source.IsSMTP}} + {{ $cfg:=.Source.SMTP }} +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +

    {{.i18n.Tr "admin.auths.allowed_domains_helper"}}

    +
    + {{end}} + + + {{if .Source.IsPAM}} + {{ $cfg:=.Source.PAM }} +
    + + +
    + {{end}} + + + {{if .Source.IsOAuth2}} + {{ $cfg:=.Source.OAuth2 }} +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + {{if .OAuth2DefaultCustomURLMappings}}{{range $key, $value := .OAuth2DefaultCustomURLMappings}} + + + + + {{end}}{{end}} + {{end}} + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + {{if .Source.IsLDAP}} +
    +
    + + +
    +
    + {{end}} +
    +
    + + +
    +
    + +
    + +
    {{.i18n.Tr "admin.auths.delete"}}
    +
    +
    diff --git a/templates/admin/auth/list.tmpl b/templates/admin/auth/list.tmpl index 58bdc66..4e8fb1e 100644 --- a/templates/admin/auth/list.tmpl +++ b/templates/admin/auth/list.tmpl @@ -1,45 +1,41 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.auths.auth_manage_panel"}} ({{.i18n.Tr "admin.total" .Total}}) - -

    -
    - - - - - - - - - - - - - - {{range .Sources}} - - - - - - - - - - {{end}} - -
    ID{{.i18n.Tr "admin.auths.name"}}{{.i18n.Tr "admin.auths.type"}}{{.i18n.Tr "admin.auths.enabled"}}{{.i18n.Tr "admin.auths.updated"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.users.edit"}}
    {{.ID}}{{.Name}}{{.TypeName}}{{DateFmtShort .Updated}}{{DateFmtShort .Created}}
    -
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.auths.auth_manage_panel"}} ({{.i18n.Tr "admin.total" .Total}}) + +

    +
    + + + + + + + + + + + + + + {{range .Sources}} + + + + + + + + + + {{end}} + +
    ID{{.i18n.Tr "admin.auths.name"}}{{.i18n.Tr "admin.auths.type"}}{{.i18n.Tr "admin.auths.enabled"}}{{.i18n.Tr "admin.auths.updated"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.users.edit"}}
    {{.ID}}{{.Name}}{{.TypeName}}{{DateFmtShort .Updated}}{{DateFmtShort .Created}}
    diff --git a/templates/admin/auth/new.tmpl b/templates/admin/auth/new.tmpl index 24257a1..46db82c 100644 --- a/templates/admin/auth/new.tmpl +++ b/templates/admin/auth/new.tmpl @@ -1,203 +1,113 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.auths.new"}} -

    -
    -
    - {{.CsrfTokenHtml}} - -
    - - + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.auths.new"}} +

    +
    + + {{.CsrfTokenHtml}} + +
    + + +
    +
    + +
    -

    - {{.i18n.Tr "admin.auths.tips"}} -

    -
    -
    GMail Settings:
    -

    Host: smtp.gmail.com, Port: 587, Enable TLS Encryption: true

    -
    OAuth GitHub:
    -

    {{.i18n.Tr "admin.auths.tip.github"}}

    + + {{ template "admin/auth/source/ldap" . }} + + + {{ template "admin/auth/source/smtp" . }} + + +
    + +
    + + + {{ template "admin/auth/source/oauth" . }} + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + +
    + +
    + +
    + +

    + {{.i18n.Tr "admin.auths.tips"}} +

    +
    +
    GMail Settings:
    +

    Host: smtp.gmail.com, Port: 587, Enable TLS Encryption: true

    + +
    {{.i18n.Tr "admin.auths.tips.oauth2.general"}}:
    +

    {{.i18n.Tr "admin.auths.tips.oauth2.general.tip"}}

    + +
    {{.i18n.Tr "admin.auths.tip.oauth2_provider"}}
    +
    +
  • Bitbucket
  • + {{.i18n.Tr "admin.auths.tip.bitbucket"}} +
  • Dropbox
  • + {{.i18n.Tr "admin.auths.tip.dropbox"}} +
  • Facebook
  • + {{.i18n.Tr "admin.auths.tip.facebook"}} +
  • GitHub
  • + {{.i18n.Tr "admin.auths.tip.github"}} +
  • GitLab
  • + {{.i18n.Tr "admin.auths.tip.gitlab"}} +
  • Google+
  • + {{.i18n.Tr "admin.auths.tip.google_plus"}} +
  • OpenID Connect
  • + {{.i18n.Tr "admin.auths.tip.openid_connect"}} +
  • Twitter
  • + {{.i18n.Tr "admin.auths.tip.twitter"}}
    diff --git a/templates/admin/auth/source/ldap.tmpl b/templates/admin/auth/source/ldap.tmpl new file mode 100644 index 0000000..2131950 --- /dev/null +++ b/templates/admin/auth/source/ldap.tmpl @@ -0,0 +1,65 @@ +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + + +

    {{.i18n.Tr "admin.auths.bind_password_helper"}}

    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    diff --git a/templates/admin/auth/source/oauth.tmpl b/templates/admin/auth/source/oauth.tmpl new file mode 100644 index 0000000..5d585c0 --- /dev/null +++ b/templates/admin/auth/source/oauth.tmpl @@ -0,0 +1,58 @@ +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + {{if .OAuth2DefaultCustomURLMappings}} + {{range $key, $value := .OAuth2DefaultCustomURLMappings}} + + + + + {{end}} + {{end}} +
    \ No newline at end of file diff --git a/templates/admin/auth/source/smtp.tmpl b/templates/admin/auth/source/smtp.tmpl new file mode 100644 index 0000000..d4c83c1 --- /dev/null +++ b/templates/admin/auth/source/smtp.tmpl @@ -0,0 +1,28 @@ +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +

    {{.i18n.Tr "admin.auths.allowed_domains_helper"}}

    +
    +
    diff --git a/templates/admin/base/search.tmpl b/templates/admin/base/search.tmpl index 9e450ee..5491d6b 100644 --- a/templates/admin/base/search.tmpl +++ b/templates/admin/base/search.tmpl @@ -12,6 +12,8 @@ {{.i18n.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}} {{.i18n.Tr "repo.issues.filter_sort.recentupdate"}} {{.i18n.Tr "repo.issues.filter_sort.leastupdate"}} + {{.i18n.Tr "repo.issues.label.filter_sort.by_size"}} + {{.i18n.Tr "repo.issues.label.filter_sort.reverse_by_size"}}
    diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl index d9403f4..f9038e1 100644 --- a/templates/admin/config.tmpl +++ b/templates/admin/config.tmpl @@ -1,280 +1,284 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.config.server_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.app_name"}}
    -
    {{AppName}}
    -
    {{.i18n.Tr "admin.config.app_ver"}}
    -
    {{AppVer}}{{AppBuiltWith}}
    -
    {{.i18n.Tr "admin.config.app_url"}}
    -
    {{.AppUrl}}
    -
    {{.i18n.Tr "admin.config.domain"}}
    -
    {{.Domain}}
    -
    {{.i18n.Tr "admin.config.offline_mode"}}
    -
    -
    {{.i18n.Tr "admin.config.disable_router_log"}}
    -
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.config.server_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.app_name"}}
    +
    {{AppName}}
    +
    {{.i18n.Tr "admin.config.app_ver"}}
    +
    {{AppVer}}{{AppBuiltWith}}
    +
    {{.i18n.Tr "admin.config.custom_conf"}}
    +
    {{.CustomConf}}
    +
    {{.i18n.Tr "admin.config.app_url"}}
    +
    {{.AppUrl}}
    +
    {{.i18n.Tr "admin.config.domain"}}
    +
    {{.Domain}}
    +
    {{.i18n.Tr "admin.config.offline_mode"}}
    +
    +
    {{.i18n.Tr "admin.config.disable_router_log"}}
    +
    -
    +
    -
    {{.i18n.Tr "admin.config.run_user"}}
    -
    {{.RunUser}}
    -
    {{.i18n.Tr "admin.config.run_mode"}}
    -
    {{.RunMode}}
    +
    {{.i18n.Tr "admin.config.run_user"}}
    +
    {{.RunUser}}
    +
    {{.i18n.Tr "admin.config.run_mode"}}
    +
    {{.RunMode}}
    -
    +
    -
    {{.i18n.Tr "admin.config.git_version"}}
    -
    {{.GitVersion}}
    +
    {{.i18n.Tr "admin.config.git_version"}}
    +
    {{.GitVersion}}
    -
    +
    -
    {{.i18n.Tr "admin.config.repo_root_path"}}
    -
    {{.RepoRootPath}}
    -
    {{.i18n.Tr "admin.config.static_file_root_path"}}
    -
    {{.StaticRootPath}}
    -
    {{.i18n.Tr "admin.config.log_file_root_path"}}
    -
    {{.LogRootPath}}
    -
    {{.i18n.Tr "admin.config.script_type"}}
    -
    {{.ScriptType}}
    -
    {{.i18n.Tr "admin.config.reverse_auth_user"}}
    -
    {{.ReverseProxyAuthUser}}
    -
    -
    +
    {{.i18n.Tr "admin.config.repo_root_path"}}
    +
    {{.RepoRootPath}}
    +
    {{.i18n.Tr "admin.config.static_file_root_path"}}
    +
    {{.StaticRootPath}}
    +
    {{.i18n.Tr "admin.config.log_file_root_path"}}
    +
    {{.LogRootPath}}
    +
    {{.i18n.Tr "admin.config.script_type"}}
    +
    {{.ScriptType}}
    +
    {{.i18n.Tr "admin.config.reverse_auth_user"}}
    +
    {{.ReverseProxyAuthUser}}
    +
    +
    -

    - {{.i18n.Tr "admin.config.ssh_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.ssh_enabled"}}
    -
    - {{if not .SSH.Disabled}} -
    {{.i18n.Tr "admin.config.ssh_start_builtin_server"}}
    -
    -
    {{.i18n.Tr "admin.config.ssh_domain"}}
    -
    {{.SSH.Domain}}
    -
    {{.i18n.Tr "admin.config.ssh_port"}}
    -
    {{.SSH.Port}}
    -
    {{.i18n.Tr "admin.config.ssh_listen_port"}}
    -
    {{.SSH.ListenPort}}
    +

    + {{.i18n.Tr "admin.config.ssh_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.ssh_enabled"}}
    +
    + {{if not .SSH.Disabled}} +
    {{.i18n.Tr "admin.config.ssh_start_builtin_server"}}
    +
    +
    {{.i18n.Tr "admin.config.ssh_domain"}}
    +
    {{.SSH.Domain}}
    +
    {{.i18n.Tr "admin.config.ssh_port"}}
    +
    {{.SSH.Port}}
    +
    {{.i18n.Tr "admin.config.ssh_listen_port"}}
    +
    {{.SSH.ListenPort}}
    - {{if not .SSH.StartBuiltinServer}} -
    {{.i18n.Tr "admin.config.ssh_root_path"}}
    -
    {{.SSH.RootPath}}
    -
    {{.i18n.Tr "admin.config.ssh_key_test_path"}}
    -
    {{.SSH.KeyTestPath}}
    -
    {{.i18n.Tr "admin.config.ssh_keygen_path"}}
    -
    {{.SSH.KeygenPath}}
    -
    {{.i18n.Tr "admin.config.ssh_minimum_key_size_check"}}
    -
    - {{if .SSH.MinimumKeySizeCheck}} -
    {{.i18n.Tr "admin.config.ssh_minimum_key_sizes"}}
    -
    {{.SSH.MinimumKeySizes}}
    - {{end}} - {{end}} + {{if not .SSH.StartBuiltinServer}} +
    {{.i18n.Tr "admin.config.ssh_root_path"}}
    +
    {{.SSH.RootPath}}
    +
    {{.i18n.Tr "admin.config.ssh_key_test_path"}}
    +
    {{.SSH.KeyTestPath}}
    +
    {{.i18n.Tr "admin.config.ssh_keygen_path"}}
    +
    {{.SSH.KeygenPath}}
    +
    {{.i18n.Tr "admin.config.ssh_minimum_key_size_check"}}
    +
    + {{if .SSH.MinimumKeySizeCheck}} +
    {{.i18n.Tr "admin.config.ssh_minimum_key_sizes"}}
    +
    {{.SSH.MinimumKeySizes}}
    {{end}} -
    -
    + {{end}} + {{end}} +
    +
    -

    - {{.i18n.Tr "admin.config.db_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.db_type"}}
    -
    {{.DbCfg.Type}}
    -
    {{.i18n.Tr "admin.config.db_host"}}
    -
    {{if .DbCfg.Host}}{{.DbCfg.Host}}{{else}}-{{end}}
    -
    {{.i18n.Tr "admin.config.db_name"}}
    -
    {{if .DbCfg.Name}}{{.DbCfg.Name}}{{else}}-{{end}}
    -
    {{.i18n.Tr "admin.config.db_user"}}
    -
    {{if .DbCfg.User}}{{.DbCfg.User}}{{else}}-{{end}}
    -
    {{.i18n.Tr "admin.config.db_ssl_mode"}}
    -
    {{.i18n.Tr "admin.config.db_ssl_mode_helper"}}
    -
    {{.i18n.Tr "admin.config.db_path"}}
    -
    {{if .DbCfg.Path}}{{.DbCfg.Path}}{{else}}-{{end}} {{.i18n.Tr "admin.config.db_path_helper"}}
    -
    -
    +

    + {{.i18n.Tr "admin.config.db_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.db_type"}}
    +
    {{.DbCfg.Type}}
    +
    {{.i18n.Tr "admin.config.db_host"}}
    +
    {{if .DbCfg.Host}}{{.DbCfg.Host}}{{else}}-{{end}}
    +
    {{.i18n.Tr "admin.config.db_name"}}
    +
    {{if .DbCfg.Name}}{{.DbCfg.Name}}{{else}}-{{end}}
    +
    {{.i18n.Tr "admin.config.db_user"}}
    +
    {{if .DbCfg.User}}{{.DbCfg.User}}{{else}}-{{end}}
    +
    {{.i18n.Tr "admin.config.db_ssl_mode"}}
    +
    {{.i18n.Tr "admin.config.db_ssl_mode_helper"}}
    +
    {{.i18n.Tr "admin.config.db_path"}}
    +
    {{if .DbCfg.Path}}{{.DbCfg.Path}}{{else}}-{{end}} {{.i18n.Tr "admin.config.db_path_helper"}}
    +
    +
    -

    - {{.i18n.Tr "admin.config.service_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.register_email_confirm"}}
    -
    -
    {{.i18n.Tr "admin.config.disable_register"}}
    -
    -
    {{.i18n.Tr "admin.config.show_registration_button"}}
    -
    -
    {{.i18n.Tr "admin.config.require_sign_in_view"}}
    -
    -
    {{.i18n.Tr "admin.config.mail_notify"}}
    -
    - {{/*
    {{.i18n.Tr "admin.config.disable_key_size_check"}}
    -
    */}} -
    {{.i18n.Tr "admin.config.enable_captcha"}}
    -
    -
    {{.i18n.Tr "admin.config.default_keep_email_private"}}
    -
    -
    {{.i18n.Tr "admin.config.no_reply_address"}}
    -
    {{if .Service.NoReplyAddress}}{{.Service.NoReplyAddress}}{{else}}-{{end}}
    -
    -
    {{.i18n.Tr "admin.config.active_code_lives"}}
    -
    {{.Service.ActiveCodeLives}} {{.i18n.Tr "tool.raw_minutes"}}
    -
    {{.i18n.Tr "admin.config.reset_password_code_lives"}}
    -
    {{.Service.ResetPwdCodeLives}} {{.i18n.Tr "tool.raw_minutes"}}
    -
    -
    +

    + {{.i18n.Tr "admin.config.service_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.register_email_confirm"}}
    +
    +
    {{.i18n.Tr "admin.config.disable_register"}}
    +
    +
    {{.i18n.Tr "admin.config.show_registration_button"}}
    +
    +
    {{.i18n.Tr "admin.config.enable_openid_signup"}}
    +
    +
    {{.i18n.Tr "admin.config.enable_openid_signin"}}
    +
    +
    {{.i18n.Tr "admin.config.require_sign_in_view"}}
    +
    +
    {{.i18n.Tr "admin.config.mail_notify"}}
    +
    + {{/*
    {{.i18n.Tr "admin.config.disable_key_size_check"}}
    +
    */}} +
    {{.i18n.Tr "admin.config.enable_captcha"}}
    +
    +
    {{.i18n.Tr "admin.config.default_keep_email_private"}}
    +
    +
    {{.i18n.Tr "admin.config.default_allow_create_organization"}}
    +
    +
    {{.i18n.Tr "admin.config.no_reply_address"}}
    +
    {{if .Service.NoReplyAddress}}{{.Service.NoReplyAddress}}{{else}}-{{end}}
    +
    +
    {{.i18n.Tr "admin.config.active_code_lives"}}
    +
    {{.Service.ActiveCodeLives}} {{.i18n.Tr "tool.raw_minutes"}}
    +
    {{.i18n.Tr "admin.config.reset_password_code_lives"}}
    +
    {{.Service.ResetPwdCodeLives}} {{.i18n.Tr "tool.raw_minutes"}}
    +
    +
    -

    - {{.i18n.Tr "admin.config.webhook_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.queue_length"}}
    -
    {{.Webhook.QueueLength}}
    -
    {{.i18n.Tr "admin.config.deliver_timeout"}}
    -
    {{.Webhook.DeliverTimeout}} {{.i18n.Tr "tool.raw_seconds"}}
    -
    {{.i18n.Tr "admin.config.skip_tls_verify"}}
    -
    -
    -
    +

    + {{.i18n.Tr "admin.config.webhook_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.queue_length"}}
    +
    {{.Webhook.QueueLength}}
    +
    {{.i18n.Tr "admin.config.deliver_timeout"}}
    +
    {{.Webhook.DeliverTimeout}} {{.i18n.Tr "tool.raw_seconds"}}
    +
    {{.i18n.Tr "admin.config.skip_tls_verify"}}
    +
    +
    +
    -

    - {{.i18n.Tr "admin.config.mailer_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.mailer_enabled"}}
    -
    - {{if .MailerEnabled}} -
    {{.i18n.Tr "admin.config.mailer_name"}}
    -
    {{.Mailer.Name}}
    -
    {{.i18n.Tr "admin.config.mailer_disable_helo"}}
    -
    -
    {{.i18n.Tr "admin.config.mailer_host"}}
    -
    {{.Mailer.Host}}
    -
    {{.i18n.Tr "admin.config.mailer_user"}}
    -
    {{if .Mailer.User}}{{.Mailer.User}}{{else}}(empty){{end}}

    -
    - {{.CsrfTokenHtml}} -
    -
    - -
    -
    - -
    - {{end}} -
    -
    +

    + {{.i18n.Tr "admin.config.mailer_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.mailer_enabled"}}
    +
    + {{if .MailerEnabled}} +
    {{.i18n.Tr "admin.config.mailer_name"}}
    +
    {{.Mailer.Name}}
    +
    {{.i18n.Tr "admin.config.mailer_disable_helo"}}
    +
    +
    {{.i18n.Tr "admin.config.mailer_host"}}
    +
    {{.Mailer.Host}}
    +
    {{.i18n.Tr "admin.config.mailer_user"}}
    +
    {{if .Mailer.User}}{{.Mailer.User}}{{else}}(empty){{end}}

    +
    + {{.CsrfTokenHtml}} +
    +
    + +
    +
    + +
    + {{end}} +
    +
    -

    - {{.i18n.Tr "admin.config.cache_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.cache_adapter"}}
    -
    {{.CacheAdapter}}
    -
    {{.i18n.Tr "admin.config.cache_interval"}}
    -
    {{.CacheInterval}} {{.i18n.Tr "tool.raw_seconds"}}
    - {{if .CacheConn}} -
    {{.i18n.Tr "admin.config.cache_conn"}}
    -
    {{.CacheConn}}
    - {{end}} -
    -
    +

    + {{.i18n.Tr "admin.config.cache_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.cache_adapter"}}
    +
    {{.CacheAdapter}}
    +
    {{.i18n.Tr "admin.config.cache_interval"}}
    +
    {{.CacheInterval}} {{.i18n.Tr "tool.raw_seconds"}}
    + {{if .CacheConn}} +
    {{.i18n.Tr "admin.config.cache_conn"}}
    +
    {{.CacheConn}}
    + {{end}} +
    +
    -

    - {{.i18n.Tr "admin.config.session_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.session_provider"}}
    -
    {{.SessionConfig.Provider}}
    -
    {{.i18n.Tr "admin.config.provider_config"}}
    -
    {{if .SessionConfig.ProviderConfig}}{{.SessionConfig.ProviderConfig}}{{else}}-{{end}}
    -
    {{.i18n.Tr "admin.config.cookie_name"}}
    -
    {{.SessionConfig.CookieName}}
    -
    {{.i18n.Tr "admin.config.gc_interval_time"}}
    -
    {{.SessionConfig.Gclifetime}} {{.i18n.Tr "tool.raw_seconds"}}
    -
    {{.i18n.Tr "admin.config.session_life_time"}}
    -
    {{.SessionConfig.Maxlifetime}} {{.i18n.Tr "tool.raw_seconds"}}
    -
    {{.i18n.Tr "admin.config.https_only"}}
    -
    -
    {{.i18n.Tr "admin.config.cookie_life_time"}}
    -
    {{.SessionConfig.CookieLifeTime}} {{.i18n.Tr "tool.raw_seconds"}}
    -
    -
    +

    + {{.i18n.Tr "admin.config.session_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.session_provider"}}
    +
    {{.SessionConfig.Provider}}
    +
    {{.i18n.Tr "admin.config.provider_config"}}
    +
    {{if .SessionConfig.ProviderConfig}}{{.SessionConfig.ProviderConfig}}{{else}}-{{end}}
    +
    {{.i18n.Tr "admin.config.cookie_name"}}
    +
    {{.SessionConfig.CookieName}}
    +
    {{.i18n.Tr "admin.config.gc_interval_time"}}
    +
    {{.SessionConfig.Gclifetime}} {{.i18n.Tr "tool.raw_seconds"}}
    +
    {{.i18n.Tr "admin.config.session_life_time"}}
    +
    {{.SessionConfig.Maxlifetime}} {{.i18n.Tr "tool.raw_seconds"}}
    +
    {{.i18n.Tr "admin.config.https_only"}}
    +
    +
    {{.i18n.Tr "admin.config.cookie_life_time"}}
    +
    {{.SessionConfig.CookieLifeTime}} {{.i18n.Tr "tool.raw_seconds"}}
    +
    +
    -

    - {{.i18n.Tr "admin.config.picture_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.disable_gravatar"}}
    -
    -
    -
    {{.i18n.Tr "admin.config.enable_federated_avatar"}}
    -
    -
    -
    +

    + {{.i18n.Tr "admin.config.picture_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.disable_gravatar"}}
    +
    +
    +
    {{.i18n.Tr "admin.config.enable_federated_avatar"}}
    +
    +
    +
    -

    - {{.i18n.Tr "admin.config.git_config"}} -

    -
    -
    -
    {{.i18n.Tr "admin.config.git_disable_diff_highlight"}}
    -
    -
    {{.i18n.Tr "admin.config.git_max_diff_lines"}}
    -
    {{.Git.MaxGitDiffLines}}
    -
    {{.i18n.Tr "admin.config.git_max_diff_line_characters"}}
    -
    {{.Git.MaxGitDiffLineCharacters}}
    -
    {{.i18n.Tr "admin.config.git_max_diff_files"}}
    -
    {{.Git.MaxGitDiffFiles}}
    -
    {{.i18n.Tr "admin.config.git_gc_args"}}
    -
    {{.Git.GCArgs}}
    -
    {{.i18n.Tr "admin.config.git_max_diff_lines"}}
    -
    {{.Git.MaxGitDiffLines}}
    -
    -
    {{.i18n.Tr "admin.config.git_migrate_timeout"}}
    -
    {{.Git.Timeout.Migrate}} {{.i18n.Tr "tool.raw_seconds"}}
    -
    {{.i18n.Tr "admin.config.git_mirror_timeout"}}
    -
    {{.Git.Timeout.Mirror}} {{.i18n.Tr "tool.raw_seconds"}}
    -
    {{.i18n.Tr "admin.config.git_clone_timeout"}}
    -
    {{.Git.Timeout.Clone}} {{.i18n.Tr "tool.raw_seconds"}}
    -
    {{.i18n.Tr "admin.config.git_pull_timeout"}}
    -
    {{.Git.Timeout.Pull}} {{.i18n.Tr "tool.raw_seconds"}}
    -
    {{.i18n.Tr "admin.config.git_gc_timeout"}}
    -
    {{.Git.Timeout.GC}} {{.i18n.Tr "tool.raw_seconds"}}
    -
    -
    +

    + {{.i18n.Tr "admin.config.git_config"}} +

    +
    +
    +
    {{.i18n.Tr "admin.config.git_disable_diff_highlight"}}
    +
    +
    {{.i18n.Tr "admin.config.git_max_diff_lines"}}
    +
    {{.Git.MaxGitDiffLines}}
    +
    {{.i18n.Tr "admin.config.git_max_diff_line_characters"}}
    +
    {{.Git.MaxGitDiffLineCharacters}}
    +
    {{.i18n.Tr "admin.config.git_max_diff_files"}}
    +
    {{.Git.MaxGitDiffFiles}}
    +
    {{.i18n.Tr "admin.config.git_gc_args"}}
    +
    {{.Git.GCArgs}}
    +
    {{.i18n.Tr "admin.config.git_max_diff_lines"}}
    +
    {{.Git.MaxGitDiffLines}}
    +
    +
    {{.i18n.Tr "admin.config.git_migrate_timeout"}}
    +
    {{.Git.Timeout.Migrate}} {{.i18n.Tr "tool.raw_seconds"}}
    +
    {{.i18n.Tr "admin.config.git_mirror_timeout"}}
    +
    {{.Git.Timeout.Mirror}} {{.i18n.Tr "tool.raw_seconds"}}
    +
    {{.i18n.Tr "admin.config.git_clone_timeout"}}
    +
    {{.Git.Timeout.Clone}} {{.i18n.Tr "tool.raw_seconds"}}
    +
    {{.i18n.Tr "admin.config.git_pull_timeout"}}
    +
    {{.Git.Timeout.Pull}} {{.i18n.Tr "tool.raw_seconds"}}
    +
    {{.i18n.Tr "admin.config.git_gc_timeout"}}
    +
    {{.Git.Timeout.GC}} {{.i18n.Tr "tool.raw_seconds"}}
    +
    +
    -

    - {{.i18n.Tr "admin.config.log_config"}} -

    -
    -
    - {{range .Loggers}} -
    {{$.i18n.Tr "admin.config.log_mode"}}
    -
    {{.Mode}}
    -
    {{$.i18n.Tr "admin.config.log_config"}}
    -
    {{.Config | JsonPrettyPrint}}
    - {{end}} -
    -
    -
    +

    + {{.i18n.Tr "admin.config.log_config"}} +

    +
    +
    + {{range .Loggers}} +
    {{$.i18n.Tr "admin.config.log_mode"}}
    +
    {{.Mode}}
    +
    {{$.i18n.Tr "admin.config.log_config"}}
    +
    {{.Config | JsonPrettyPrint}}
    + {{end}} +
    diff --git a/templates/admin/dashboard.tmpl b/templates/admin/dashboard.tmpl index acffdc4..23fc4a4 100644 --- a/templates/admin/dashboard.tmpl +++ b/templates/admin/dashboard.tmpl @@ -1,124 +1,124 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.dashboard.statistic"}} -

    -
    -

    - {{.i18n.Tr "admin.dashboard.statistic_info" .Stats.Counter.User .Stats.Counter.Org .Stats.Counter.PublicKey .Stats.Counter.Repo .Stats.Counter.Watch .Stats.Counter.Star .Stats.Counter.Action .Stats.Counter.Access .Stats.Counter.Issue .Stats.Counter.Comment .Stats.Counter.Oauth .Stats.Counter.Follow .Stats.Counter.Mirror .Stats.Counter.Release .Stats.Counter.LoginSource .Stats.Counter.Webhook .Stats.Counter.Milestone .Stats.Counter.Label .Stats.Counter.HookTask .Stats.Counter.Team .Stats.Counter.UpdateTask .Stats.Counter.Attachment | Str2html}} -

    -
    -

    - {{.i18n.Tr "admin.dashboard.operations"}} -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{.i18n.Tr "admin.dashboard.delete_inactivate_accounts"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.delete_repo_archives"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.delete_missing_repos"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.git_gc_repos"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.resync_all_sshkeys"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.resync_all_hooks"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.reinit_missing_repos"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    -
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.dashboard.statistic"}} +

    +
    +

    + {{.i18n.Tr "admin.dashboard.statistic_info" .Stats.Counter.User .Stats.Counter.Org .Stats.Counter.PublicKey .Stats.Counter.Repo .Stats.Counter.Watch .Stats.Counter.Star .Stats.Counter.Action .Stats.Counter.Access .Stats.Counter.Issue .Stats.Counter.Comment .Stats.Counter.Oauth .Stats.Counter.Follow .Stats.Counter.Mirror .Stats.Counter.Release .Stats.Counter.LoginSource .Stats.Counter.Webhook .Stats.Counter.Milestone .Stats.Counter.Label .Stats.Counter.HookTask .Stats.Counter.Team .Stats.Counter.UpdateTask .Stats.Counter.Attachment | Str2html}} +

    +
    +

    + {{.i18n.Tr "admin.dashboard.operations"}} +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {{.i18n.Tr "admin.dashboard.delete_inactivate_accounts"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.delete_repo_archives"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.delete_missing_repos"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.git_gc_repos"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.resync_all_sshkeys"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.resync_all_hooks"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.reinit_missing_repos"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    {{.i18n.Tr "admin.dashboard.sync_external_users"}} {{.i18n.Tr "admin.dashboard.operation_run"}}
    +
    -

    - {{.i18n.Tr "admin.dashboard.system_status"}} -

    -
    -
    -
    {{.i18n.Tr "admin.dashboard.server_uptime"}}
    -
    {{.SysStatus.Uptime}}
    -
    {{.i18n.Tr "admin.dashboard.current_goroutine"}}
    -
    {{.SysStatus.NumGoroutine}}
    -
    -
    {{.i18n.Tr "admin.dashboard.current_memory_usage"}}
    -
    {{.SysStatus.MemAllocated}}
    -
    {{.i18n.Tr "admin.dashboard.total_memory_allocated"}}
    -
    {{.SysStatus.MemTotal}}
    -
    {{.i18n.Tr "admin.dashboard.memory_obtained"}}
    -
    {{.SysStatus.MemSys}}
    -
    {{.i18n.Tr "admin.dashboard.pointer_lookup_times"}}
    -
    {{.SysStatus.Lookups}}
    -
    {{.i18n.Tr "admin.dashboard.memory_allocate_times"}}
    -
    {{.SysStatus.MemMallocs}}
    -
    {{.i18n.Tr "admin.dashboard.memory_free_times"}}
    -
    {{.SysStatus.MemFrees}}
    -
    -
    {{.i18n.Tr "admin.dashboard.current_heap_usage"}}
    -
    {{.SysStatus.HeapAlloc}}
    -
    {{.i18n.Tr "admin.dashboard.heap_memory_obtained"}}
    -
    {{.SysStatus.HeapSys}}
    -
    {{.i18n.Tr "admin.dashboard.heap_memory_idle"}}
    -
    {{.SysStatus.HeapIdle}}
    -
    {{.i18n.Tr "admin.dashboard.heap_memory_in_use"}}
    -
    {{.SysStatus.HeapInuse}}
    -
    {{.i18n.Tr "admin.dashboard.heap_memory_released"}}
    -
    {{.SysStatus.HeapReleased}}
    -
    {{.i18n.Tr "admin.dashboard.heap_objects"}}
    -
    {{.SysStatus.HeapObjects}}
    -
    -
    {{.i18n.Tr "admin.dashboard.bootstrap_stack_usage"}}
    -
    {{.SysStatus.StackInuse}}
    -
    {{.i18n.Tr "admin.dashboard.stack_memory_obtained"}}
    -
    {{.SysStatus.StackSys}}
    -
    {{.i18n.Tr "admin.dashboard.mspan_structures_usage"}}
    -
    {{.SysStatus.MSpanInuse}}
    -
    {{.i18n.Tr "admin.dashboard.mspan_structures_obtained"}}
    -
    {{.SysStatus.HeapSys}}
    -
    {{.i18n.Tr "admin.dashboard.mcache_structures_usage"}}
    -
    {{.SysStatus.MCacheInuse}}
    -
    {{.i18n.Tr "admin.dashboard.mcache_structures_obtained"}}
    -
    {{.SysStatus.MCacheSys}}
    -
    {{.i18n.Tr "admin.dashboard.profiling_bucket_hash_table_obtained"}}
    -
    {{.SysStatus.BuckHashSys}}
    -
    {{.i18n.Tr "admin.dashboard.gc_metadata_obtained"}}
    -
    {{.SysStatus.GCSys}}
    -
    {{.i18n.Tr "admin.dashboard.other_system_allocation_obtained"}}
    -
    {{.SysStatus.OtherSys}}
    -
    -
    {{.i18n.Tr "admin.dashboard.next_gc_recycle"}}
    -
    {{.SysStatus.NextGC}}
    -
    {{.i18n.Tr "admin.dashboard.last_gc_time"}}
    -
    {{.SysStatus.LastGC}}
    -
    {{.i18n.Tr "admin.dashboard.total_gc_pause"}}
    -
    {{.SysStatus.PauseTotalNs}}
    -
    {{.i18n.Tr "admin.dashboard.last_gc_pause"}}
    -
    {{.SysStatus.PauseNs}}
    -
    {{.i18n.Tr "admin.dashboard.gc_times"}}
    -
    {{.SysStatus.NumGC}}
    -
    -
    -
    +

    + {{.i18n.Tr "admin.dashboard.system_status"}} +

    +
    +
    +
    {{.i18n.Tr "admin.dashboard.server_uptime"}}
    +
    {{.SysStatus.Uptime}}
    +
    {{.i18n.Tr "admin.dashboard.current_goroutine"}}
    +
    {{.SysStatus.NumGoroutine}}
    +
    +
    {{.i18n.Tr "admin.dashboard.current_memory_usage"}}
    +
    {{.SysStatus.MemAllocated}}
    +
    {{.i18n.Tr "admin.dashboard.total_memory_allocated"}}
    +
    {{.SysStatus.MemTotal}}
    +
    {{.i18n.Tr "admin.dashboard.memory_obtained"}}
    +
    {{.SysStatus.MemSys}}
    +
    {{.i18n.Tr "admin.dashboard.pointer_lookup_times"}}
    +
    {{.SysStatus.Lookups}}
    +
    {{.i18n.Tr "admin.dashboard.memory_allocate_times"}}
    +
    {{.SysStatus.MemMallocs}}
    +
    {{.i18n.Tr "admin.dashboard.memory_free_times"}}
    +
    {{.SysStatus.MemFrees}}
    +
    +
    {{.i18n.Tr "admin.dashboard.current_heap_usage"}}
    +
    {{.SysStatus.HeapAlloc}}
    +
    {{.i18n.Tr "admin.dashboard.heap_memory_obtained"}}
    +
    {{.SysStatus.HeapSys}}
    +
    {{.i18n.Tr "admin.dashboard.heap_memory_idle"}}
    +
    {{.SysStatus.HeapIdle}}
    +
    {{.i18n.Tr "admin.dashboard.heap_memory_in_use"}}
    +
    {{.SysStatus.HeapInuse}}
    +
    {{.i18n.Tr "admin.dashboard.heap_memory_released"}}
    +
    {{.SysStatus.HeapReleased}}
    +
    {{.i18n.Tr "admin.dashboard.heap_objects"}}
    +
    {{.SysStatus.HeapObjects}}
    +
    +
    {{.i18n.Tr "admin.dashboard.bootstrap_stack_usage"}}
    +
    {{.SysStatus.StackInuse}}
    +
    {{.i18n.Tr "admin.dashboard.stack_memory_obtained"}}
    +
    {{.SysStatus.StackSys}}
    +
    {{.i18n.Tr "admin.dashboard.mspan_structures_usage"}}
    +
    {{.SysStatus.MSpanInuse}}
    +
    {{.i18n.Tr "admin.dashboard.mspan_structures_obtained"}}
    +
    {{.SysStatus.HeapSys}}
    +
    {{.i18n.Tr "admin.dashboard.mcache_structures_usage"}}
    +
    {{.SysStatus.MCacheInuse}}
    +
    {{.i18n.Tr "admin.dashboard.mcache_structures_obtained"}}
    +
    {{.SysStatus.MCacheSys}}
    +
    {{.i18n.Tr "admin.dashboard.profiling_bucket_hash_table_obtained"}}
    +
    {{.SysStatus.BuckHashSys}}
    +
    {{.i18n.Tr "admin.dashboard.gc_metadata_obtained"}}
    +
    {{.SysStatus.GCSys}}
    +
    {{.i18n.Tr "admin.dashboard.other_system_allocation_obtained"}}
    +
    {{.SysStatus.OtherSys}}
    +
    +
    {{.i18n.Tr "admin.dashboard.next_gc_recycle"}}
    +
    {{.SysStatus.NextGC}}
    +
    {{.i18n.Tr "admin.dashboard.last_gc_time"}}
    +
    {{.SysStatus.LastGC}}
    +
    {{.i18n.Tr "admin.dashboard.total_gc_pause"}}
    +
    {{.SysStatus.PauseTotalNs}}
    +
    {{.i18n.Tr "admin.dashboard.last_gc_pause"}}
    +
    {{.SysStatus.PauseNs}}
    +
    {{.i18n.Tr "admin.dashboard.gc_times"}}
    +
    {{.SysStatus.NumGC}}
    +
    diff --git a/templates/admin/monitor.tmpl b/templates/admin/monitor.tmpl index d74c885..6cc927d 100644 --- a/templates/admin/monitor.tmpl +++ b/templates/admin/monitor.tmpl @@ -1,64 +1,60 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.monitor.cron"}} -

    -
    - - - - - - - - - - - - {{range .Entries}} - - - - - - - - {{end}} - -
    {{.i18n.Tr "admin.monitor.name"}}{{.i18n.Tr "admin.monitor.schedule"}}{{.i18n.Tr "admin.monitor.next"}}{{.i18n.Tr "admin.monitor.previous"}}{{.i18n.Tr "admin.monitor.execute_times"}}
    {{.Description}}{{.Spec}}{{DateFmtLong .Next}}{{if gt .Prev.Year 1 }}{{DateFmtLong .Prev}}{{else}}N/A{{end}}{{.ExecTimes}}
    -
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.monitor.cron"}} +

    +
    + + + + + + + + + + + + {{range .Entries}} + + + + + + + + {{end}} + +
    {{.i18n.Tr "admin.monitor.name"}}{{.i18n.Tr "admin.monitor.schedule"}}{{.i18n.Tr "admin.monitor.next"}}{{.i18n.Tr "admin.monitor.previous"}}{{.i18n.Tr "admin.monitor.execute_times"}}
    {{.Description}}{{.Spec}}{{DateFmtLong .Next}}{{if gt .Prev.Year 1 }}{{DateFmtLong .Prev}}{{else}}N/A{{end}}{{.ExecTimes}}
    +
    -

    - {{.i18n.Tr "admin.monitor.process"}} -

    -
    - - - - - - - - - - - {{range .Processes}} - - - - - - - {{end}} - -
    Pid{{.i18n.Tr "admin.monitor.desc"}}{{.i18n.Tr "admin.monitor.start"}}{{.i18n.Tr "admin.monitor.execute_time"}}
    {{.PID}}{{.Description}}{{DateFmtLong .Start}}{{TimeSince .Start $.Lang}}
    -
    -
    +

    + {{.i18n.Tr "admin.monitor.process"}} +

    +
    + + + + + + + + + + + {{range .Processes}} + + + + + + + {{end}} + +
    Pid{{.i18n.Tr "admin.monitor.desc"}}{{.i18n.Tr "admin.monitor.start"}}{{.i18n.Tr "admin.monitor.execute_time"}}
    {{.PID}}{{.Description}}{{DateFmtLong .Start}}{{TimeSince .Start $.Lang}}
    diff --git a/templates/admin/navbar.tmpl b/templates/admin/navbar.tmpl index 9fa1721..c5ad124 100644 --- a/templates/admin/navbar.tmpl +++ b/templates/admin/navbar.tmpl @@ -1,29 +1,26 @@ - + \ No newline at end of file diff --git a/templates/admin/notice.tmpl b/templates/admin/notice.tmpl index 0af7713..49e760d 100644 --- a/templates/admin/notice.tmpl +++ b/templates/admin/notice.tmpl @@ -1,96 +1,92 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.notices.system_notice_list"}} ({{.i18n.Tr "admin.total" .Total}}) -

    -
    - - - - - - - - - - - - - {{range .Notices}} - - - - - - - - - {{end}} - - - - - - - -
    ID{{.i18n.Tr "admin.notices.type"}}{{.i18n.Tr "admin.notices.desc"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.notices.op"}}
    -
    - -
    -
    {{.ID}}{{$.i18n.Tr .TrStr}}{{SubStr .Description 0 120}}...{{DateFmtShort .Created}}
    - - -
    - {{.i18n.Tr "admin.notices.delete_selected"}} -
    -
    -
    - - {{with .Page}} - {{if gt .TotalPages 1}} - + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.notices.system_notice_list"}} ({{.i18n.Tr "admin.total" .Total}}) +

    +
    + + + + + + + + + + + + + {{range .Notices}} + + + + + + + + {{end}} - {{end}} - + + + + + + + +
    ID{{.i18n.Tr "admin.notices.type"}}{{.i18n.Tr "admin.notices.desc"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.notices.op"}}
    +
    + +
    +
    {{.ID}}{{$.i18n.Tr .TrStr}}{{SubStr .Description 0 120}}...{{DateFmtShort .Created}}
    + + +
    + {{.i18n.Tr "admin.notices.delete_selected"}} +
    +
    + + {{with .Page}} + {{if gt .TotalPages 1}} + + {{end}} + {{end}}
    diff --git a/templates/admin/org/list.tmpl b/templates/admin/org/list.tmpl index 244f915..362352b 100644 --- a/templates/admin/org/list.tmpl +++ b/templates/admin/org/list.tmpl @@ -1,48 +1,47 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.orgs.org_manage_panel"}} ({{.i18n.Tr "admin.total" .Total}}) -

    -
    - {{template "admin/base/search" .}} -
    -
    - - - - - - - - - - - - - - {{range .Users}} - - - - - - - - - - {{end}} - -
    ID{{.i18n.Tr "admin.orgs.name"}}{{.i18n.Tr "admin.orgs.teams"}}{{.i18n.Tr "admin.orgs.members"}}{{.i18n.Tr "admin.users.repos"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.users.edit"}}
    {{.ID}}{{.Name}}{{.NumTeams}}{{.NumMembers}}{{.NumRepos}}{{DateFmtShort .Created}}
    -
    - - {{template "base/paginate" .}} + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.orgs.org_manage_panel"}} ({{.i18n.Tr "admin.total" .Total}}) + +

    +
    + {{template "admin/base/search" .}}
    +
    + + + + + + + + + + + + + + {{range .Users}} + + + + + + + + + + {{end}} + +
    ID{{.i18n.Tr "admin.orgs.name"}}{{.i18n.Tr "admin.orgs.teams"}}{{.i18n.Tr "admin.orgs.members"}}{{.i18n.Tr "admin.users.repos"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.users.edit"}}
    {{.ID}}{{.Name}}{{.NumTeams}}{{.NumMembers}}{{.NumRepos}}{{DateFmtShort .Created}}
    +
    + + {{template "base/paginate" .}}
    {{template "base/footer" .}} diff --git a/templates/admin/repo/list.tmpl b/templates/admin/repo/list.tmpl index ccc958f..aeaecf8 100644 --- a/templates/admin/repo/list.tmpl +++ b/templates/admin/repo/list.tmpl @@ -1,52 +1,50 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.repos.repo_manage_panel"}} ({{.i18n.Tr "admin.total" .Total}}) -

    -
    - {{template "admin/base/search" .}} -
    -
    - - - - - - - - - - - - - - - - {{range .Repos}} - - - - - - - - - - - - {{end}} - -
    ID{{.i18n.Tr "admin.repos.owner"}}{{.i18n.Tr "admin.repos.name"}}{{.i18n.Tr "admin.repos.private"}}{{.i18n.Tr "admin.repos.watches"}}{{.i18n.Tr "admin.repos.stars"}}{{.i18n.Tr "admin.repos.issues"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.notices.op"}}
    {{.ID}}{{.Owner.Name}}{{.Name}}{{.NumWatches}}{{.NumStars}}{{.NumIssues}}{{DateFmtShort .Created}}
    -
    - - {{template "base/paginate" .}} -
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.repos.repo_manage_panel"}} ({{.i18n.Tr "admin.total" .Total}}) +

    +
    + {{template "admin/base/search" .}}
    +
    + + + + + + + + + + + + + + + + + {{range .Repos}} + + + + + + + + + + + + + {{end}} + +
    ID{{.i18n.Tr "admin.repos.owner"}}{{.i18n.Tr "admin.repos.name"}}{{.i18n.Tr "admin.repos.private"}}{{.i18n.Tr "admin.repos.watches"}}{{.i18n.Tr "admin.repos.stars"}}{{.i18n.Tr "admin.repos.issues"}}{{.i18n.Tr "admin.repos.size"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.notices.op"}}
    {{.ID}}{{.Owner.Name}}{{.Name}}{{.NumWatches}}{{.NumStars}}{{.NumIssues}}{{SizeFmt .Size}}{{DateFmtShort .Created}}
    +
    + + {{template "base/paginate" .}}
    diff --git a/templates/admin/user/edit.tmpl b/templates/admin/user/edit.tmpl index 7c97198..4feeef3 100644 --- a/templates/admin/user/edit.tmpl +++ b/templates/admin/user/edit.tmpl @@ -1,120 +1,116 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.users.edit_account"}} -

    -
    -
    - {{.CsrfTokenHtml}} -
    - - {{.User.Name}} -
    - -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    - -
    - - -

    {{.i18n.Tr "admin.users.password_helper"}}

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

    {{.i18n.Tr "admin.users.max_repo_creation_desc"}}

    -
    - -
    - -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - - -
    -
    -
    -
    - - -
    -
    - {{if not .DisableRegularOrgCreation}} -
    -
    - - -
    -
    - {{end}} - -
    - -
    - -
    {{.i18n.Tr "admin.users.delete_account"}}
    -
    -
    + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.users.edit_account"}} +

    +
    +
    + {{.CsrfTokenHtml}} +
    + + {{.User.Name}}
    -
    + +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + + +

    {{.i18n.Tr "admin.users.password_helper"}}

    +
    +
    + + +
    +
    + + +
    + +
    + +
    + + +

    {{.i18n.Tr "admin.users.max_repo_creation_desc"}}

    +
    + +
    + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    + {{if not .DisableRegularOrgCreation}} +
    +
    + + +
    +
    + {{end}} + +
    + +
    + +
    {{.i18n.Tr "admin.users.delete_account"}}
    +
    +
    diff --git a/templates/admin/user/list.tmpl b/templates/admin/user/list.tmpl index de361a2..7e06417 100644 --- a/templates/admin/user/list.tmpl +++ b/templates/admin/user/list.tmpl @@ -1,59 +1,55 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.users.user_manage_panel"}} ({{.i18n.Tr "admin.total" .Total}}) - -

    -
    - {{template "admin/base/search" .}} -
    -
    - - - - - - - - - - - - - - - - {{range .Users}} - - - - - - - - - {{if .LastLoginUnix}} - - {{else}} - - {{end}} - - - {{end}} - -
    ID{{.i18n.Tr "admin.users.name"}}{{.i18n.Tr "email"}}{{.i18n.Tr "admin.users.activated"}}{{.i18n.Tr "admin.users.admin"}}{{.i18n.Tr "admin.users.repos"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.users.last_login"}}{{.i18n.Tr "admin.users.edit"}}
    {{.ID}}{{.Name}}{{.NumRepos}}{{DateFmtShort .Created }}{{DateFmtShort .LastLogin }}{{$.i18n.Tr "admin.users.never_login"}}
    -
    - - {{template "base/paginate" .}} + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.users.user_manage_panel"}} ({{.i18n.Tr "admin.total" .Total}}) + +

    +
    + {{template "admin/base/search" .}}
    +
    + + + + + + + + + + + + + + + + {{range .Users}} + + + + + + + + + {{if .LastLoginUnix}} + + {{else}} + + {{end}} + + + {{end}} + +
    ID{{.i18n.Tr "admin.users.name"}}{{.i18n.Tr "email"}}{{.i18n.Tr "admin.users.activated"}}{{.i18n.Tr "admin.users.admin"}}{{.i18n.Tr "admin.users.repos"}}{{.i18n.Tr "admin.users.created"}}{{.i18n.Tr "admin.users.last_login"}}{{.i18n.Tr "admin.users.edit"}}
    {{.ID}}{{.Name}}{{.NumRepos}}{{DateFmtShort .Created }}{{DateFmtShort .LastLogin }}{{$.i18n.Tr "admin.users.never_login"}}
    +
    + + {{template "base/paginate" .}}
    {{template "base/footer" .}} diff --git a/templates/admin/user/new.tmpl b/templates/admin/user/new.tmpl index 9352eaa..14e1d74 100644 --- a/templates/admin/user/new.tmpl +++ b/templates/admin/user/new.tmpl @@ -1,65 +1,61 @@ {{template "base/head" .}}
    + {{template "admin/navbar" .}}
    -
    - {{template "admin/navbar" .}} -
    - {{template "base/alert" .}} -

    - {{.i18n.Tr "admin.users.new_account"}} -

    -
    -
    - {{.CsrfTokenHtml}} - -
    - - + {{template "base/alert" .}} +

    + {{.i18n.Tr "admin.users.new_account"}} +

    +
    + + {{.CsrfTokenHtml}} + +
    + +
    -
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    + + +
    + + + {{if .CanSendEmail}} +
    +
    + + +
    +
    + {{end}} + +
    + +
    +
    diff --git a/templates/base/footer.tmpl b/templates/base/footer.tmpl index 3b815e8..be1c28b 100644 --- a/templates/base/footer.tmpl +++ b/templates/base/footer.tmpl @@ -22,46 +22,49 @@ {{end}}
    + Javascript licenses + API {{.i18n.Tr "website"}} {{if (or .ShowFooterVersion .PageIsAdmin)}}{{GoVer}}{{end}}
    - - + + {{if .RequireSimpleMDE}} - - - + + + {{end}} {{if .RequireGitGraph}} - + {{end}} - - - - {{if .RequireHighlightJS}} - + {{end}} {{if .RequireMinicolors}} - + {{end}} {{if .RequireDatetimepicker}} - + {{end}} {{if .RequireDropzone}} - + {{end}} - - - + + + + + + + + - + \ No newline at end of file diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index f4b8833..edb7b20 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -5,49 +5,94 @@ {{if .Title}}{{.Title}} - {{end}}{{AppName}} - - - + + + + {{if .IsSigned}} + + {{end}} + {{if .ContextUser}} + + {{end}} + {{if .SearchLimit}} + + {{end}} {{if .GoGetImport}} {{end}} + + - - + + + {{if .RequireSimpleMDE}} - + {{end}} {{if .RequireGitGraph}} - + {{end}} - + {{if .RequireHighlightJS}} - + {{end}} {{if .RequireMinicolors}} - + {{end}} {{if .RequireDatetimepicker}} - + {{end}} {{if .RequireDropzone}} - + {{end}} - + + {{if .PageIsUserProfile}} @@ -68,7 +113,7 @@ - + {{end}} @@ -82,7 +127,7 @@

    - {{if not $file.IsRenamed}} + {{if ne $file.Type 4}} {{$isImage := (call $.IsImageFile $file.Name)}} {{if and $isImage}}
    diff --git a/templates/repo/diff/page.tmpl b/templates/repo/diff/page.tmpl index 90ee680..4ddf3ad 100644 --- a/templates/repo/diff/page.tmpl +++ b/templates/repo/diff/page.tmpl @@ -5,13 +5,13 @@ {{if .IsDiffCompare }} {{template "repo/commits_table" .}} {{else}} -
    +
    {{.i18n.Tr "repo.diff.browse_source"}} {{RenderCommitMessage true .Commit.Message $.RepoLink $.Repository.ComposeMetas}}
    -
    +
    {{if .Author}} {{if .Author.FullName}} @@ -41,6 +41,21 @@
    + {{if .Commit.Signature}} + {{if .Verification.Verified }} +
    + + {{.i18n.Tr "repo.commits.signed_by"}}: + {{.Commit.Committer.Name}} <{{.Commit.Committer.Email}}> + {{.i18n.Tr "repo.commits.gpg_key_id"}}: {{.Verification.SigningKey.KeyID}} +
    + {{else}} +
    + + {{.i18n.Tr .Verification.Reason}} +
    + {{end}} + {{end}} {{end}} {{template "repo/diff/box" .}} diff --git a/templates/repo/editor/commit_form.tmpl b/templates/repo/editor/commit_form.tmpl index 96b0dcb..43021ca 100644 --- a/templates/repo/editor/commit_form.tmpl +++ b/templates/repo/editor/commit_form.tmpl @@ -10,7 +10,7 @@
    -
    +
    \ No newline at end of file +
    diff --git a/templates/repo/editor/edit.tmpl b/templates/repo/editor/edit.tmpl index b189d4f..64b09c3 100644 --- a/templates/repo/editor/edit.tmpl +++ b/templates/repo/editor/edit.tmpl @@ -18,7 +18,7 @@ {{else}} - {{$v}} + {{$v}} {{end}} {{end}} {{.i18n.Tr "repo.editor.or"}} {{.i18n.Tr "repo.editor.cancel_lower"}} diff --git a/templates/repo/editor/upload.tmpl b/templates/repo/editor/upload.tmpl index e1192ef..23fdc8b 100644 --- a/templates/repo/editor/upload.tmpl +++ b/templates/repo/editor/upload.tmpl @@ -17,7 +17,7 @@ {{else}} - {{$v}} + {{$v}} {{end}} {{end}} {{.i18n.Tr "repo.editor.or"}} {{.i18n.Tr "repo.editor.cancel_lower"}} diff --git a/templates/repo/graph.tmpl b/templates/repo/graph.tmpl index 28d6a46..02ce3df 100644 --- a/templates/repo/graph.tmpl +++ b/templates/repo/graph.tmpl @@ -5,6 +5,7 @@
    +

    {{.i18n.Tr "repo.commit_graph"}}

      @@ -25,7 +26,7 @@ {{ .ShortRev}} {{.Branch}} - {{.Subject}} by + {{RenderCommitMessage false .Subject $.RepoLink $.Repository.ComposeMetas}} by {{.Author}} diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 24ddb46..1c1e1cb 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -14,16 +14,16 @@
    -
    - + -
    - + {{if .CanBeForked}} - {{end}} -{{if not (or .IsBareRepo .IsDiffCompare)}} +{{if not .IsDiffCompare}}
    -